mdbq 4.0.127__tar.gz → 4.0.129__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.
Potentially problematic release.
This version of mdbq might be problematic. Click here for more details.
- {mdbq-4.0.127 → mdbq-4.0.129}/PKG-INFO +1 -1
- mdbq-4.0.129/mdbq/__version__.py +1 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/auth/auth_backend.py +71 -2
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/auth/crypto.py +58 -16
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq.egg-info/PKG-INFO +1 -1
- mdbq-4.0.127/mdbq/__version__.py +0 -1
- {mdbq-4.0.127 → mdbq-4.0.129}/README.txt +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/auth/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/auth/rate_limiter.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/js/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/js/jc.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/log/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/log/mylogger.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/myconf/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/myconf/myconf.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/mysql/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/mysql/deduplicator.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/mysql/mysql.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/mysql/s_query.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/mysql/unique_.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/mysql/uploader.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/other/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/other/download_sku_picture.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/other/error_handler.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/other/otk.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/other/pov_city.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/other/ua_sj.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/pbix/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/redis/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/redis/getredis.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/redis/redis_cache.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/route/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/route/analytics.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/route/monitor.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/route/routes.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/selenium/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/selenium/get_driver.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq/spider/__init__.py +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq.egg-info/SOURCES.txt +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/setup.cfg +0 -0
- {mdbq-4.0.127 → mdbq-4.0.129}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VERSION = '4.0.129'
|
|
@@ -37,6 +37,75 @@ except ImportError:
|
|
|
37
37
|
request = None
|
|
38
38
|
|
|
39
39
|
|
|
40
|
+
# 角色权限配置
|
|
41
|
+
ROLE_PERMISSIONS = {
|
|
42
|
+
"super_admin": [
|
|
43
|
+
# 所有权限
|
|
44
|
+
"read", "write", "delete", "admin", "database",
|
|
45
|
+
"execute", "import", "export", "backup", "restore",
|
|
46
|
+
"create", "update", "publish", "moderate",
|
|
47
|
+
"configure", "settings", "maintenance",
|
|
48
|
+
"user_management", "role_management", "permission_management",
|
|
49
|
+
"view_logs", "view_analytics", "audit", "monitor",
|
|
50
|
+
"security_audit", "access_control",
|
|
51
|
+
"api_read", "api_write", "webhook", "integration",
|
|
52
|
+
"file_upload", "file_download", "file_manage",
|
|
53
|
+
"resource_quota", "storage_manage"
|
|
54
|
+
],
|
|
55
|
+
|
|
56
|
+
"admin": [
|
|
57
|
+
# 管理员权限(除了系统级配置)
|
|
58
|
+
"read", "write", "delete", "database",
|
|
59
|
+
"execute", "import", "export", "backup",
|
|
60
|
+
"create", "update", "publish", "moderate",
|
|
61
|
+
"user_management", "view_logs", "view_analytics",
|
|
62
|
+
"audit", "monitor", "api_read", "api_write",
|
|
63
|
+
"file_upload", "file_download", "file_manage"
|
|
64
|
+
],
|
|
65
|
+
|
|
66
|
+
"manager": [
|
|
67
|
+
# 经理权限
|
|
68
|
+
"read", "write", "database",
|
|
69
|
+
"create", "update", "publish", "moderate",
|
|
70
|
+
"import", "export", "view_analytics",
|
|
71
|
+
"api_read", "file_upload", "file_download"
|
|
72
|
+
],
|
|
73
|
+
|
|
74
|
+
"editor": [
|
|
75
|
+
# 编辑权限
|
|
76
|
+
"read", "write", "create", "update",
|
|
77
|
+
"file_upload", "file_download", "api_read"
|
|
78
|
+
],
|
|
79
|
+
|
|
80
|
+
"user": [
|
|
81
|
+
# 普通用户权限
|
|
82
|
+
"read", "write", "create", "update", "database",
|
|
83
|
+
"file_upload", "file_download", "api_read"
|
|
84
|
+
],
|
|
85
|
+
|
|
86
|
+
"vi_user": [
|
|
87
|
+
# 降级的用户权限
|
|
88
|
+
"read", "database",
|
|
89
|
+
"file_upload", "file_download", "api_read"
|
|
90
|
+
],
|
|
91
|
+
|
|
92
|
+
"viewer": [
|
|
93
|
+
# 只读权限
|
|
94
|
+
"read", "view_analytics", "file_download"
|
|
95
|
+
],
|
|
96
|
+
|
|
97
|
+
"api_user": [
|
|
98
|
+
# API专用用户
|
|
99
|
+
"api_read", "api_write", "read", "write"
|
|
100
|
+
],
|
|
101
|
+
|
|
102
|
+
"auditor": [
|
|
103
|
+
# 审计员权限
|
|
104
|
+
"read", "view_logs", "view_analytics", "audit", "monitor"
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
40
109
|
class StandaloneAuthManager:
|
|
41
110
|
"""独立的身份验证管理器"""
|
|
42
111
|
|
|
@@ -155,7 +224,7 @@ class StandaloneAuthManager:
|
|
|
155
224
|
password_hash VARCHAR(128) NOT NULL,
|
|
156
225
|
password_plain TEXT NOT NULL,
|
|
157
226
|
salt VARCHAR(64) NOT NULL,
|
|
158
|
-
role ENUM('admin', 'user', '
|
|
227
|
+
role ENUM('super_admin', 'admin', 'manager', 'editor', 'user', 'viewer', 'api_user', 'auditor') NOT NULL DEFAULT 'user',
|
|
159
228
|
permissions JSON DEFAULT (JSON_ARRAY()),
|
|
160
229
|
is_active TINYINT(1) NOT NULL DEFAULT 1,
|
|
161
230
|
created_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
@@ -429,7 +498,7 @@ class StandaloneAuthManager:
|
|
|
429
498
|
|
|
430
499
|
# 设置默认权限
|
|
431
500
|
if permissions is None:
|
|
432
|
-
permissions =
|
|
501
|
+
permissions = ROLE_PERMISSIONS.get(role, ['read'])
|
|
433
502
|
permissions_json = json.dumps(permissions)
|
|
434
503
|
|
|
435
504
|
# 创建新用户
|
|
@@ -118,7 +118,7 @@ class KeyManager:
|
|
|
118
118
|
return public_key_pem
|
|
119
119
|
|
|
120
120
|
except Exception as e:
|
|
121
|
-
self.logger.error(
|
|
121
|
+
self.logger.error("读取公钥失败", {'error': str(e)})
|
|
122
122
|
return None
|
|
123
123
|
|
|
124
124
|
def get_private_key(self) -> Optional[Any]:
|
|
@@ -154,7 +154,7 @@ class KeyManager:
|
|
|
154
154
|
return private_key
|
|
155
155
|
|
|
156
156
|
except Exception as e:
|
|
157
|
-
self.logger.error(
|
|
157
|
+
self.logger.error("读取私钥失败", {'error': str(e)})
|
|
158
158
|
return None
|
|
159
159
|
|
|
160
160
|
def clear_cache(self):
|
|
@@ -177,36 +177,59 @@ class CryptoService:
|
|
|
177
177
|
try:
|
|
178
178
|
# 解析加密数据
|
|
179
179
|
encrypted_data = json.loads(base64.b64decode(encrypted_token))
|
|
180
|
-
|
|
180
|
+
|
|
181
181
|
# 获取私钥
|
|
182
182
|
private_key = self.key_manager.get_private_key()
|
|
183
183
|
if not private_key:
|
|
184
|
+
self.logger.error("无法获取私钥")
|
|
184
185
|
return None
|
|
185
186
|
|
|
186
187
|
# 解密AES密钥
|
|
187
188
|
encrypted_aes_key = base64.b64decode(encrypted_data['key'])
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
189
|
+
|
|
190
|
+
# 使用SHA-512加密算法
|
|
191
|
+
try:
|
|
192
|
+
aes_key = private_key.decrypt(
|
|
193
|
+
encrypted_aes_key,
|
|
194
|
+
padding.OAEP(
|
|
195
|
+
mgf=padding.MGF1(algorithm=hashes.SHA512()),
|
|
196
|
+
algorithm=hashes.SHA512(),
|
|
197
|
+
label=None
|
|
198
|
+
)
|
|
194
199
|
)
|
|
195
|
-
|
|
200
|
+
except Exception as decrypt_error:
|
|
201
|
+
self.logger.error("RSA解密失败", {'error': str(decrypt_error)})
|
|
196
202
|
|
|
197
203
|
# 解密数据
|
|
198
204
|
iv = base64.b64decode(encrypted_data['iv'])
|
|
199
205
|
ciphertext = base64.b64decode(encrypted_data['ciphertext'])
|
|
200
206
|
|
|
201
|
-
|
|
202
|
-
|
|
207
|
+
# 检查是否有认证标签(AES-GCM需要)
|
|
208
|
+
if 'tag' in encrypted_data:
|
|
209
|
+
tag = base64.b64decode(encrypted_data['tag'])
|
|
210
|
+
# 将tag附加到密文末尾(AES-GCM标准做法)
|
|
211
|
+
ciphertext_with_tag = ciphertext + tag
|
|
212
|
+
else:
|
|
213
|
+
# 如果没有tag,假设密文已经包含tag
|
|
214
|
+
ciphertext_with_tag = ciphertext
|
|
215
|
+
|
|
216
|
+
try:
|
|
217
|
+
aesgcm = AESGCM(aes_key)
|
|
218
|
+
decrypted_data = aesgcm.decrypt(iv, ciphertext_with_tag, None)
|
|
219
|
+
except Exception as aes_error:
|
|
220
|
+
self.logger.error("AES-GCM解密失败", {'error': str(aes_error)})
|
|
221
|
+
return None
|
|
203
222
|
|
|
204
223
|
# 解析JSON
|
|
205
|
-
|
|
206
|
-
|
|
224
|
+
try:
|
|
225
|
+
payload = json.loads(decrypted_data.decode('utf-8'))
|
|
226
|
+
return payload
|
|
227
|
+
except json.JSONDecodeError as json_error:
|
|
228
|
+
self.logger.error("JSON解析失败", {'error': str(json_error)})
|
|
229
|
+
return None
|
|
207
230
|
|
|
208
231
|
except Exception as e:
|
|
209
|
-
self.logger.error(
|
|
232
|
+
self.logger.error("解密失败", {'error': str(e)})
|
|
210
233
|
return None
|
|
211
234
|
|
|
212
235
|
|
|
@@ -260,7 +283,7 @@ class Validator:
|
|
|
260
283
|
return True
|
|
261
284
|
|
|
262
285
|
except Exception as e:
|
|
263
|
-
self.logger.error(
|
|
286
|
+
self.logger.error("Nonce验证失败", {'error': str(e)})
|
|
264
287
|
return False
|
|
265
288
|
|
|
266
289
|
def validate(self, payload: Dict[str, Any]) -> bool:
|
|
@@ -362,6 +385,25 @@ class OptimizedCryptoManager:
|
|
|
362
385
|
"""
|
|
363
386
|
return self.crypto_service.decrypt_token(encrypted_token)
|
|
364
387
|
|
|
388
|
+
def validate_payload(self, payload: Dict[str, Any]) -> bool:
|
|
389
|
+
"""
|
|
390
|
+
验证解密后的载荷数据
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
payload: 解密后的载荷数据
|
|
394
|
+
|
|
395
|
+
Returns:
|
|
396
|
+
验证是否通过
|
|
397
|
+
"""
|
|
398
|
+
if not payload:
|
|
399
|
+
return False
|
|
400
|
+
|
|
401
|
+
try:
|
|
402
|
+
return self.validator.validate(payload)
|
|
403
|
+
except Exception as e:
|
|
404
|
+
self.logger.error("载荷验证异常", {'error': str(e)})
|
|
405
|
+
return False
|
|
406
|
+
|
|
365
407
|
def get_public_key(self) -> Optional[str]:
|
|
366
408
|
"""获取PEM格式的公钥字符串"""
|
|
367
409
|
return self.key_manager.get_public_key()
|
mdbq-4.0.127/mdbq/__version__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
VERSION = '4.0.127'
|
|
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
|