lesscode-flask 0.2.14__tar.gz → 0.2.15__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.
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/PKG-INFO +1 -1
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/__init__.py +1 -1
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/model/user_limit_policy.py +2 -2
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/setting/__init__.py +2 -1
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/fs_util.py +15 -15
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/limit/req/rate_limiter_handler.py +18 -5
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/limit/req_count/count_limiter_handler.py +15 -5
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask.egg-info/PKG-INFO +1 -1
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/README.md +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/app.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/db/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/db/datasource.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/db/executor.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/export_data/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/export_data/data_download_handler.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/log/access_log_handler.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/model/access_log.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/model/base_model.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/model/parameterized_query.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/model/resource_param_template.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/model/response_result.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/model/user.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/service/access_log_service.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/service/base_service.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/service/resource_param_template_service.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/setup/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/signals.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/static/swagger.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/decorator/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/decorator/cache.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/decorator/sql_injection.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/decorator/swagger.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/dify_utils.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/file/file_exporter.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/file/file_utils.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/helpers.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/limit/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/limit/limit_util.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/limit/req/redis_rate_limiter.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/limit/req_count/redis_count_limiter.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/oss/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/oss/aliyun_oss.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/oss/minio_oss.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/redis/redis_helper.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/request/request.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/swagger/swagger_template.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/swagger/swagger_util.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/task/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/task/task_helper.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/thread/thread_utils.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/wsgi.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask.egg-info/SOURCES.txt +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask.egg-info/dependency_links.txt +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask.egg-info/requires.txt +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask.egg-info/top_level.txt +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/query_runner/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/query_runner/clickhouse.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/query_runner/elasticsearch.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/query_runner/kingbase.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/query_runner/mysql.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/query_runner/pg.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/settings/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/settings/helpers.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/utils/__init__.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/redash/utils/requests_session.py +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/setup.cfg +0 -0
- {lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/setup.py +0 -0
|
@@ -11,8 +11,8 @@ class UserLimitPolicy():
|
|
|
11
11
|
policy_name: str= None,
|
|
12
12
|
client_id: str= None,
|
|
13
13
|
rate_limit_enable: int = 0,
|
|
14
|
-
rate_limit_window_sec: int =
|
|
15
|
-
rate_limit_rate: int =
|
|
14
|
+
rate_limit_window_sec: int = 1,
|
|
15
|
+
rate_limit_rate: int = 1,
|
|
16
16
|
rate_limit_burst: int = 0,
|
|
17
17
|
count_limit_enable: int = 0,
|
|
18
18
|
count_limit_window_sec: int = 43200,
|
|
@@ -122,7 +122,8 @@ class BaseConfig:
|
|
|
122
122
|
|
|
123
123
|
# 飞书 webhook URL 常量定义 用于向指定的飞书机器人发送消息的 webhook 地址
|
|
124
124
|
LIMIT_FS_WEBHOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/545140ef-8234-4167-9f0c-8ee72abae430"
|
|
125
|
-
|
|
125
|
+
# 在飞书运维聊天框中处理
|
|
126
|
+
FS_OAM_SERVICE_URL = "http://oam-service.internal:8080"
|
|
126
127
|
# sql 注入验证器开关
|
|
127
128
|
SQL_INJECTION_ENABLE = False
|
|
128
129
|
#
|
|
@@ -6,33 +6,33 @@ import requests
|
|
|
6
6
|
|
|
7
7
|
logger = logging.getLogger(__name__)
|
|
8
8
|
|
|
9
|
-
def fs_webhook(webhook_url:str,title:str,
|
|
9
|
+
def fs_webhook(webhook_url:str,title:str, fs_content:list):
|
|
10
10
|
"""
|
|
11
11
|
发送飞书 webhook 消息
|
|
12
12
|
|
|
13
13
|
参数:
|
|
14
14
|
webhook_url (str): 飞书 webhook 的 URL 地址
|
|
15
15
|
title (str): 消息的标题
|
|
16
|
-
|
|
16
|
+
fs_content (str or list): 消息内容,可以是字符串或字符串列表
|
|
17
17
|
|
|
18
18
|
返回值:
|
|
19
19
|
无返回值,直接发送 HTTP 请求
|
|
20
20
|
"""
|
|
21
21
|
headers = {'Content-Type': 'application/json;charset=utf-8'}
|
|
22
22
|
|
|
23
|
-
# 根据内容类型构建飞书消息格式
|
|
24
|
-
if isinstance(content, list):
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
else:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
23
|
+
# # 根据内容类型构建飞书消息格式
|
|
24
|
+
# if isinstance(content, list):
|
|
25
|
+
# fs_content = []
|
|
26
|
+
# for i in content:
|
|
27
|
+
# fs_content.append({
|
|
28
|
+
# "tag": "text",
|
|
29
|
+
# "text": f"{i}\n"
|
|
30
|
+
# })
|
|
31
|
+
# else:
|
|
32
|
+
# fs_content = [{
|
|
33
|
+
# "tag": "text",
|
|
34
|
+
# "text": f"{content}\n"
|
|
35
|
+
# }]
|
|
36
36
|
|
|
37
37
|
# 构造飞书消息的 JSON 结构
|
|
38
38
|
json_text = {
|
|
@@ -35,12 +35,25 @@ class RateLimitHandler:
|
|
|
35
35
|
content = []
|
|
36
36
|
current_user = flask_login.current_user
|
|
37
37
|
# 收集用户相关信息
|
|
38
|
-
content.append(f"用户名称:{current_user.display_name}")
|
|
38
|
+
content.append({"tag": "text","text": f"用户名称:{current_user.display_name}\n"})
|
|
39
39
|
phone_no = current_user.phone_no if current_user.phone_no is not None else "-"
|
|
40
|
-
content.append(f"手机号:{phone_no}")
|
|
41
|
-
content.append(f"用户IP:{request.remote_addr}")
|
|
42
|
-
content.append(f"资源地址:{request.url_rule.rule}")
|
|
40
|
+
content.append({"tag": "text","text": f"手机号:{phone_no}\n"})
|
|
41
|
+
content.append({"tag": "text","text": f"用户IP:{request.remote_addr}\n"})
|
|
42
|
+
content.append({"tag": "text","text": f"资源地址:{request.url_rule.rule}\n"})
|
|
43
|
+
token = request.headers.get("Authorization", "").replace("Bearer ", "")
|
|
44
|
+
if token:
|
|
45
|
+
FS_OAM_SERVICE_URL = current_app.config.get("FS_OAM_SERVICE_URL")
|
|
46
|
+
|
|
47
|
+
content.append({"tag": "text","text": f"运维处理:\n"})
|
|
48
|
+
lock_account_url = f"{FS_OAM_SERVICE_URL}/icp/authUser/lock_account?id={current_user.id}"
|
|
49
|
+
url = f"{FS_OAM_SERVICE_URL}/icp/oauth/logout_token?token={token}"
|
|
50
|
+
content.append({"tag": "a","text": "强制下线","href": f"{url}"})
|
|
51
|
+
content.append({"tag": "a", "text": " 禁止登录 ", "href": f"{lock_account_url}"})
|
|
52
|
+
ban_ip_url = f"{FS_OAM_SERVICE_URL}/icp/accessLog/ban_ip?ip={request.remote_addr}"
|
|
53
|
+
content.append({"tag": "a", "text": "封禁IP ", "href": f"{ban_ip_url}"})
|
|
43
54
|
|
|
44
55
|
# 发送飞书 webhook 告警
|
|
45
56
|
fs_webhook(limit_fs_webhook_url, "触发频率限流告警", content)
|
|
46
|
-
return ResponseResult.fail(status_code="403", http_code="403", message="请求过于频繁,请稍后再试!")
|
|
57
|
+
return ResponseResult.fail(status_code="403", http_code="403", message="请求过于频繁,请稍后再试!")
|
|
58
|
+
|
|
59
|
+
|
|
@@ -35,12 +35,22 @@ class CountLimitHandler:
|
|
|
35
35
|
content = []
|
|
36
36
|
current_user = flask_login.current_user
|
|
37
37
|
# 收集用户相关信息
|
|
38
|
-
|
|
38
|
+
current_user = flask_login.current_user
|
|
39
|
+
# 收集用户相关信息
|
|
40
|
+
content.append({"tag": "text","text": f"用户名称:{current_user.display_name}\n"})
|
|
39
41
|
phone_no = current_user.phone_no if current_user.phone_no is not None else "-"
|
|
40
|
-
content.append(f"手机号:{phone_no}")
|
|
41
|
-
content.append(f"用户IP:{request.remote_addr}")
|
|
42
|
-
content.append(f"资源地址:{request.url_rule.rule}")
|
|
43
|
-
|
|
42
|
+
content.append({"tag": "text","text": f"手机号:{phone_no}\n"})
|
|
43
|
+
content.append({"tag": "text","text": f"用户IP:{request.remote_addr}\n"})
|
|
44
|
+
content.append({"tag": "text","text": f"资源地址:{request.url_rule.rule}\n"})
|
|
45
|
+
token = request.headers.get("Authorization", "").replace("Bearer ", "")
|
|
46
|
+
if token:
|
|
47
|
+
content.append({"tag": "text","text": f"运维处理:\n"})
|
|
48
|
+
lock_account_url = f"http://127.0.0.1:8976/icp/authUser/lock_account?id={current_user.id}"
|
|
49
|
+
url = f"http://127.0.0.1:8976/icp/oauth/logout_token?token={token}"
|
|
50
|
+
content.append({"tag": "a","text": "强制下线","href": f"{url}"})
|
|
51
|
+
content.append({"tag": "a", "text": " 禁止登录 ", "href": f"{lock_account_url}"})
|
|
52
|
+
ban_ip_url = f"http://127.0.0.1:8976/icp/accessLog/ban_ip?ip={request.remote_addr}"
|
|
53
|
+
content.append({"tag": "a", "text": "封禁IP ", "href": f"{ban_ip_url}"})
|
|
44
54
|
# 发送飞书 webhook 告警
|
|
45
55
|
fs_webhook(limit_fs_webhook_url, "触发总量限流告警", content)
|
|
46
56
|
return ResponseResult.fail(status_code="403", http_code="403", message="请求过于频繁,请稍后再试!")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/export_data/data_download_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/model/resource_param_template.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/service/access_log_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/decorator/sql_injection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/json/NotSortJSONProvider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/limit/req/redis_rate_limiter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/swagger/swagger_template.py
RENAMED
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask/utils/swagger/swagger_util.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.14 → lesscode_flask-0.2.15}/lesscode_flask.egg-info/dependency_links.txt
RENAMED
|
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
|