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 CHANGED
@@ -1 +1 @@
1
- VERSION = '4.0.96'
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 uk_device_sessions_user_fingerprint (user_id, device_fingerprint),
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
- device_fingerprint = self._generate_device_fingerprint(full_device_info)
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mdbq
3
- Version: 4.0.96
3
+ Version: 4.0.97
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1,7 +1,7 @@
1
1
  mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
2
- mdbq/__version__.py,sha256=upYmcfx0UWjE76j0j97qCRGjDZGCKhrJ15LsMJQXb8E,18
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=R0qwedMEtJxbKcDUkl1ELl4lVTunFeiXsa_Xo3LHiQU,76455
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.96.dist-info/METADATA,sha256=XQFXH6TeJlSgpYJN7v8h_H0x0-qUJyh36kV-X4TzOBc,364
37
- mdbq-4.0.96.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
38
- mdbq-4.0.96.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
39
- mdbq-4.0.96.dist-info/RECORD,,
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