codosdk 1.0.28__tar.gz → 1.0.30__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codosdk-1.0.28 → codosdk-1.0.30}/PKG-INFO +1 -1
- {codosdk-1.0.28 → codosdk-1.0.30}/codosdk.egg-info/PKG-INFO +1 -1
- {codosdk-1.0.28 → codosdk-1.0.30}/setup.py +1 -1
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/apis/cmdb_apis.py +6 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/ldap.py +58 -4
- {codosdk-1.0.28 → codosdk-1.0.30}/LICENSE +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/README.md +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/codosdk.egg-info/SOURCES.txt +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/codosdk.egg-info/dependency_links.txt +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/codosdk.egg-info/requires.txt +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/codosdk.egg-info/top_level.txt +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/opssdk/__init__.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/opssdk/utils/__init__.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/pyproject.toml +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/setup.cfg +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/__init__.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/api_set.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/apis/__init__.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/apis/admin_apis.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/apis/agent_apis.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/apis/kerrigan_apis.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/apis/mgv4_apis.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/apis/notice_apis.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/apis/task_apis.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/application.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/base_handler.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/cache.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/cache_context.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/client.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/cloud/__init__.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/cloud/qcloud_api.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/cloud/ucloud_api.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/cloud_utils.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/configs.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/consts.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/crud_utils.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/db_context.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/error.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/fetch_coroutine.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/jwt_token.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/logger.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/model_utils.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/mqhelper.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/program.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/salt_api.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/sqlalchemy_pagination.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/tools.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/utils/__init__.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/utils/cc_crypto.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/utils/date_format.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/utils/pydantic_utils.py +0 -0
- {codosdk-1.0.28 → codosdk-1.0.30}/websdk2/web_logs.py +0 -0
|
@@ -9,7 +9,7 @@ desc : CODO SDK
|
|
|
9
9
|
import sys
|
|
10
10
|
from setuptools import setup, find_packages
|
|
11
11
|
|
|
12
|
-
VERSION = '1.0.
|
|
12
|
+
VERSION = '1.0.30'
|
|
13
13
|
|
|
14
14
|
if sys.version_info < (2, 7) or (3, 0) <= sys.version_info < (3, 6):
|
|
15
15
|
print('This program requires at least Python 2.7 or 3.6 to run.')
|
|
@@ -6,8 +6,11 @@ Author : shenshuo
|
|
|
6
6
|
Date : 2023/3/17
|
|
7
7
|
Desc : 对接LDAP登录认证
|
|
8
8
|
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
9
11
|
import json
|
|
10
|
-
from
|
|
12
|
+
from typing import Dict, Optional, Tuple, Union
|
|
13
|
+
from ldap3 import Server, Connection, SUBTREE, ALL_ATTRIBUTES
|
|
11
14
|
|
|
12
15
|
|
|
13
16
|
class LdapApi:
|
|
@@ -110,8 +113,59 @@ class LdapApi:
|
|
|
110
113
|
return False, None
|
|
111
114
|
|
|
112
115
|
|
|
116
|
+
class LdapApiV4:
|
|
117
|
+
def __init__(self, ldap_server_host: str, ldap_admin_dn: str, ldap_admin_password: str,
|
|
118
|
+
ldap_server_port: int = 389, ldap_use_ssl: Union[bool, str] = False):
|
|
119
|
+
self._ldap_admin_dn = ldap_admin_dn
|
|
120
|
+
self._ldap_admin_password = ldap_admin_password
|
|
121
|
+
self.ldap_server = Server(ldap_server_host, port=ldap_server_port,
|
|
122
|
+
use_ssl=str(ldap_use_ssl).lower() in {'y', 'yes', 'true'})
|
|
123
|
+
|
|
124
|
+
def test_server_connection(self) -> bool:
|
|
125
|
+
try:
|
|
126
|
+
with Connection(self.ldap_server, self._ldap_admin_dn, self._ldap_admin_password, auto_bind=True) as conn:
|
|
127
|
+
return conn.bound
|
|
128
|
+
except Exception as e:
|
|
129
|
+
logging.error(f"Server connection failed: {e}")
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
def ldap_auth(self, username: str, password: str, search_base: str,
|
|
133
|
+
attribute_map: Union[Dict[str, str], str, None] = None,
|
|
134
|
+
search_filter: str = 'cn') -> Tuple[bool, Optional[Dict]]:
|
|
135
|
+
if not self.test_server_connection():
|
|
136
|
+
return False, None
|
|
137
|
+
try:
|
|
138
|
+
with Connection(self.ldap_server, self._ldap_admin_dn, self._ldap_admin_password) as conn:
|
|
139
|
+
if not conn.search(search_base, f'({search_filter}={username})', SUBTREE, attributes=ALL_ATTRIBUTES):
|
|
140
|
+
return False, None
|
|
141
|
+
user_attrs, user_dn = conn.entries[0].entry_attributes_as_dict, conn.entries[0].entry_dn
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
with Connection(self.ldap_server, user=user_dn, password=password, auto_bind=True) as uc:
|
|
145
|
+
if not uc.bound:
|
|
146
|
+
return False, None
|
|
147
|
+
except Exception as e:
|
|
148
|
+
logging.error(f"User auth failed: {e}")
|
|
149
|
+
return False, None
|
|
150
|
+
|
|
151
|
+
final_attrs = user_attrs
|
|
152
|
+
if attribute_map:
|
|
153
|
+
if isinstance(attribute_map, str):
|
|
154
|
+
try:
|
|
155
|
+
attribute_map = json.loads(attribute_map)
|
|
156
|
+
except json.JSONDecodeError:
|
|
157
|
+
attribute_map = None
|
|
158
|
+
if isinstance(attribute_map, dict):
|
|
159
|
+
final_attrs = {k: (v[0] if isinstance(v := user_attrs.get(mv), list) else v)
|
|
160
|
+
for k, mv in attribute_map.items()}
|
|
161
|
+
return True, final_attrs
|
|
162
|
+
except Exception as e:
|
|
163
|
+
logging.error(f"Auth error: {e}")
|
|
164
|
+
return False, None
|
|
165
|
+
|
|
166
|
+
|
|
113
167
|
if __name__ == "__main__":
|
|
114
|
-
obj =
|
|
115
|
-
print(obj.
|
|
168
|
+
obj = LdapApiV4('172.16.0.102', 'cn=Manager,DC=sz,DC=com', '070068')
|
|
169
|
+
print(obj.test_server_connection())
|
|
116
170
|
print('____________')
|
|
117
|
-
print(obj.
|
|
171
|
+
print(obj.ldap_auth("yanghongfei", "123456", 'ou=opendevops,dc=sz,dc=com', 'cn'))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|