mdbq 4.0.96__py3-none-any.whl → 4.0.97__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mdbq might be problematic. Click here for more details.
- mdbq/__version__.py +1 -1
- mdbq/auth/auth_backend.py +22 -14
- {mdbq-4.0.96.dist-info → mdbq-4.0.97.dist-info}/METADATA +1 -1
- {mdbq-4.0.96.dist-info → mdbq-4.0.97.dist-info}/RECORD +6 -6
- {mdbq-4.0.96.dist-info → mdbq-4.0.97.dist-info}/WHEEL +0 -0
- {mdbq-4.0.96.dist-info → mdbq-4.0.97.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
VERSION = '4.0.
|
|
1
|
+
VERSION = '4.0.97'
|
mdbq/auth/auth_backend.py
CHANGED
|
@@ -223,6 +223,7 @@ class StandaloneAuthManager:
|
|
|
223
223
|
user_id BIGINT UNSIGNED NOT NULL,
|
|
224
224
|
device_id VARCHAR(255) CHARACTER SET ascii NOT NULL,
|
|
225
225
|
device_fingerprint VARCHAR(255) CHARACTER SET ascii NOT NULL,
|
|
226
|
+
login_domain VARCHAR(255) NOT NULL DEFAULT '' COMMENT '登录时的域名',
|
|
226
227
|
device_name VARCHAR(255) NOT NULL DEFAULT 'Unknown Device',
|
|
227
228
|
custom_name VARCHAR(255) DEFAULT NULL COMMENT '用户自定义设备名称',
|
|
228
229
|
device_type ENUM('mobile', 'desktop', 'tablet', 'unknown') NOT NULL DEFAULT 'unknown',
|
|
@@ -242,13 +243,15 @@ class StandaloneAuthManager:
|
|
|
242
243
|
trust_level ENUM('trusted', 'normal', 'suspicious') NOT NULL DEFAULT 'normal' COMMENT '设备信任级别',
|
|
243
244
|
|
|
244
245
|
UNIQUE KEY uk_device_sessions_device_id (device_id),
|
|
245
|
-
UNIQUE KEY
|
|
246
|
+
UNIQUE KEY uk_device_sessions_user_fingerprint_domain (user_id, device_fingerprint, login_domain),
|
|
246
247
|
KEY idx_device_sessions_user_id (user_id),
|
|
247
248
|
KEY idx_device_sessions_user_device (user_id, device_id),
|
|
248
249
|
KEY idx_device_sessions_last_activity (last_activity),
|
|
249
250
|
KEY idx_device_sessions_is_active (is_active),
|
|
250
251
|
KEY idx_device_sessions_fingerprint (device_fingerprint),
|
|
251
252
|
KEY idx_device_sessions_trust_level (trust_level),
|
|
253
|
+
KEY idx_device_sessions_login_domain (login_domain),
|
|
254
|
+
KEY idx_device_sessions_user_domain (user_id, login_domain),
|
|
252
255
|
|
|
253
256
|
CONSTRAINT fk_device_sessions_user_id
|
|
254
257
|
FOREIGN KEY (user_id)
|
|
@@ -621,7 +624,7 @@ class StandaloneAuthManager:
|
|
|
621
624
|
except jwt.InvalidTokenError:
|
|
622
625
|
return None
|
|
623
626
|
|
|
624
|
-
def create_or_update_device_session(self, user_id, ip_address, user_agent, device_info=None):
|
|
627
|
+
def create_or_update_device_session(self, user_id, ip_address, user_agent, device_info=None, login_domain=''):
|
|
625
628
|
"""创建或更新设备会话"""
|
|
626
629
|
# 解析用户代理获取基本信息
|
|
627
630
|
parsed_ua = self._parse_user_agent(user_agent)
|
|
@@ -634,7 +637,8 @@ class StandaloneAuthManager:
|
|
|
634
637
|
**(device_info or {})
|
|
635
638
|
}
|
|
636
639
|
|
|
637
|
-
|
|
640
|
+
# 生成包含域名的设备指纹
|
|
641
|
+
device_fingerprint = self._generate_device_fingerprint(full_device_info, login_domain)
|
|
638
642
|
device_id = secrets.token_urlsafe(32)
|
|
639
643
|
|
|
640
644
|
conn = self.pool.connection()
|
|
@@ -643,11 +647,11 @@ class StandaloneAuthManager:
|
|
|
643
647
|
try:
|
|
644
648
|
current_time_utc = datetime.now(timezone.utc)
|
|
645
649
|
|
|
646
|
-
#
|
|
650
|
+
# 检查设备是否已存在(包含域名匹配)
|
|
647
651
|
cursor.execute('''
|
|
648
652
|
SELECT id, device_id FROM device_sessions
|
|
649
|
-
WHERE user_id = %s AND device_fingerprint = %s AND is_active = 1
|
|
650
|
-
''', (user_id, device_fingerprint))
|
|
653
|
+
WHERE user_id = %s AND device_fingerprint = %s AND login_domain = %s AND is_active = 1
|
|
654
|
+
''', (user_id, device_fingerprint, login_domain))
|
|
651
655
|
|
|
652
656
|
existing_session = cursor.fetchone()
|
|
653
657
|
|
|
@@ -661,7 +665,7 @@ class StandaloneAuthManager:
|
|
|
661
665
|
SET current_ip = %s, user_agent = %s, last_activity = %s,
|
|
662
666
|
device_name = %s, device_type = %s, platform = %s, browser = %s,
|
|
663
667
|
browser_version = %s, screen_resolution = %s, timezone_offset = %s,
|
|
664
|
-
language = %s, hardware_concurrency = %s
|
|
668
|
+
language = %s, hardware_concurrency = %s, login_domain = %s
|
|
665
669
|
WHERE id = %s
|
|
666
670
|
''', (ip_address, user_agent, current_time_utc,
|
|
667
671
|
full_device_info.get('device_name', 'Unknown Device'),
|
|
@@ -673,6 +677,7 @@ class StandaloneAuthManager:
|
|
|
673
677
|
full_device_info.get('timezone_offset'),
|
|
674
678
|
full_device_info.get('language'),
|
|
675
679
|
full_device_info.get('hardware_concurrency'),
|
|
680
|
+
login_domain,
|
|
676
681
|
device_session_id))
|
|
677
682
|
else:
|
|
678
683
|
# 检查设备数量限制
|
|
@@ -699,11 +704,11 @@ class StandaloneAuthManager:
|
|
|
699
704
|
# 创建新设备会话
|
|
700
705
|
cursor.execute('''
|
|
701
706
|
INSERT INTO device_sessions (
|
|
702
|
-
user_id, device_id, device_fingerprint, device_name, device_type,
|
|
707
|
+
user_id, device_id, device_fingerprint, login_domain, device_name, device_type,
|
|
703
708
|
platform, browser, browser_version, screen_resolution, timezone_offset,
|
|
704
709
|
language, hardware_concurrency, current_ip, first_ip, user_agent, last_activity
|
|
705
|
-
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
|
|
706
|
-
''', (user_id, device_id, device_fingerprint,
|
|
710
|
+
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
|
|
711
|
+
''', (user_id, device_id, device_fingerprint, login_domain,
|
|
707
712
|
full_device_info.get('device_name', 'Unknown Device'),
|
|
708
713
|
full_device_info.get('device_type', 'unknown'),
|
|
709
714
|
full_device_info.get('platform'),
|
|
@@ -1253,9 +1258,9 @@ class StandaloneAuthManager:
|
|
|
1253
1258
|
WHERE id = %s
|
|
1254
1259
|
''', (device_session_id,))
|
|
1255
1260
|
|
|
1256
|
-
def _generate_device_fingerprint(self, device_info):
|
|
1261
|
+
def _generate_device_fingerprint(self, device_info, login_domain=''):
|
|
1257
1262
|
"""
|
|
1258
|
-
|
|
1263
|
+
生成稳定的设备指纹(包含登录域名)
|
|
1259
1264
|
|
|
1260
1265
|
Args:
|
|
1261
1266
|
device_info (dict): 设备信息
|
|
@@ -1265,8 +1270,9 @@ class StandaloneAuthManager:
|
|
|
1265
1270
|
- language: 浏览器语言
|
|
1266
1271
|
- hardware_concurrency: CPU核心数
|
|
1267
1272
|
- platform: 平台信息
|
|
1273
|
+
login_domain (str): 登录时的域名
|
|
1268
1274
|
"""
|
|
1269
|
-
#
|
|
1275
|
+
# 提取稳定的设备特征(包含登录域名)
|
|
1270
1276
|
stable_features = [
|
|
1271
1277
|
device_info.get('user_agent', ''),
|
|
1272
1278
|
device_info.get('screen_resolution', ''),
|
|
@@ -1274,6 +1280,7 @@ class StandaloneAuthManager:
|
|
|
1274
1280
|
device_info.get('language', ''),
|
|
1275
1281
|
str(device_info.get('hardware_concurrency', 0)),
|
|
1276
1282
|
device_info.get('platform', ''),
|
|
1283
|
+
login_domain or '', # 登录域名作为设备指纹的一部分
|
|
1277
1284
|
]
|
|
1278
1285
|
|
|
1279
1286
|
# 过滤空值并连接
|
|
@@ -1383,7 +1390,7 @@ class StandaloneAuthManager:
|
|
|
1383
1390
|
|
|
1384
1391
|
try:
|
|
1385
1392
|
cursor.execute('''
|
|
1386
|
-
SELECT device_id, device_fingerprint, device_name, custom_name, device_type,
|
|
1393
|
+
SELECT device_id, device_fingerprint, login_domain, device_name, custom_name, device_type,
|
|
1387
1394
|
platform, browser, browser_version, screen_resolution, timezone_offset,
|
|
1388
1395
|
language, hardware_concurrency, current_ip, first_ip,
|
|
1389
1396
|
last_activity, created_at, is_active, trust_level
|
|
@@ -1408,6 +1415,7 @@ class StandaloneAuthManager:
|
|
|
1408
1415
|
'device_id': device['device_id'],
|
|
1409
1416
|
'device_name': display_name,
|
|
1410
1417
|
'custom_name': device['custom_name'],
|
|
1418
|
+
'login_domain': device['login_domain'],
|
|
1411
1419
|
'device_type': device['device_type'],
|
|
1412
1420
|
'platform': device['platform'],
|
|
1413
1421
|
'browser': device['browser'],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
|
|
2
|
-
mdbq/__version__.py,sha256=
|
|
2
|
+
mdbq/__version__.py,sha256=Wugnfrfi17MIisDJ2bCMK15l65XkooAlWs6nIab3BTw,18
|
|
3
3
|
mdbq/auth/__init__.py,sha256=pnPMAt63sh1B6kEvmutUuro46zVf2v2YDAG7q-jV_To,24
|
|
4
|
-
mdbq/auth/auth_backend.py,sha256=
|
|
4
|
+
mdbq/auth/auth_backend.py,sha256=FYsBS2fvowfdfDkl4i2k64JwgN5PWOwVqNGjRoqtCLE,77215
|
|
5
5
|
mdbq/auth/rate_limiter.py,sha256=e7K8pMQlZ1vm1N-c0HBH8tbAwzcmXSRiAl81JNZ369g,26192
|
|
6
6
|
mdbq/js/__init__.py,sha256=hpMi3_ZKwIWkzc0LnKL-SY9AS-7PYFHq0izYTgEvxjc,30
|
|
7
7
|
mdbq/js/jc.py,sha256=FOc6HOOTJwnoZLZmgmaE1SQo9rUnVhXmefhKMD2MlDA,13229
|
|
@@ -33,7 +33,7 @@ mdbq/route/routes.py,sha256=QVGfTvDgu0CpcKCvk1ra74H8uojgqTLUav1fnVAqLEA,29433
|
|
|
33
33
|
mdbq/selenium/__init__.py,sha256=AKzeEceqZyvqn2dEDoJSzDQnbuENkJSHAlbHAD0u0ZI,10
|
|
34
34
|
mdbq/selenium/get_driver.py,sha256=1NTlVUE6QsyjTrVVVqTO2LOnYf578ccFWlWnvIXGtic,20903
|
|
35
35
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
|
36
|
-
mdbq-4.0.
|
|
37
|
-
mdbq-4.0.
|
|
38
|
-
mdbq-4.0.
|
|
39
|
-
mdbq-4.0.
|
|
36
|
+
mdbq-4.0.97.dist-info/METADATA,sha256=6P2tfV2sppjE7Y0niKXl1bqeYLa_bYfcLqhSMNr1ygg,364
|
|
37
|
+
mdbq-4.0.97.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
38
|
+
mdbq-4.0.97.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
|
39
|
+
mdbq-4.0.97.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|