修复限流器问题
This commit is contained in:
@@ -16,7 +16,7 @@ from io import BytesIO
|
||||
import base64 as b64
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Util.Padding import pad, unpad
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from fastapi import APIRouter, HTTPException, Request, Query
|
||||
from ...schemas import (
|
||||
HashRequest, Base64Request, URLRequest, AESRequest,
|
||||
JSONValidateRequest, JSONValidateResponse
|
||||
@@ -29,12 +29,13 @@ router = APIRouter(prefix="/api/v1", tags=["tools"])
|
||||
@router.get("/password/generate")
|
||||
@rate_limit(requests=50, period=60)
|
||||
async def generate_password(
|
||||
length: int = 12,
|
||||
upper: bool = True,
|
||||
lower: bool = True,
|
||||
digits: bool = True,
|
||||
symbols: bool = True,
|
||||
count: int = 1
|
||||
request: Request, # 添加 request 参数
|
||||
length: int = Query(12, ge=4, le=64),
|
||||
upper: bool = Query(True),
|
||||
lower: bool = Query(True),
|
||||
digits: bool = Query(True),
|
||||
symbols: bool = Query(True),
|
||||
count: int = Query(1, ge=1, le=10)
|
||||
):
|
||||
import random
|
||||
import string
|
||||
@@ -58,7 +59,11 @@ async def generate_password(
|
||||
# ========== 二维码 ==========
|
||||
@router.post("/qrcode/generate")
|
||||
@rate_limit(requests=30, period=60)
|
||||
async def generate_qrcode(content: str, size: int = 10):
|
||||
async def generate_qrcode(
|
||||
request: Request, # 添加 request 参数
|
||||
content: str,
|
||||
size: int = 10
|
||||
):
|
||||
if not content:
|
||||
raise HTTPException(status_code=400, detail="内容不能为空")
|
||||
|
||||
@@ -76,9 +81,12 @@ async def generate_qrcode(content: str, size: int = 10):
|
||||
# ========== 哈希 ==========
|
||||
@router.post("/crypto/hash")
|
||||
@rate_limit(requests=100, period=60)
|
||||
async def compute_hash(request: HashRequest):
|
||||
text = request.text.encode('utf-8')
|
||||
algo = request.algorithm.lower()
|
||||
async def compute_hash(
|
||||
request: Request, # 添加 request 参数
|
||||
req: HashRequest
|
||||
):
|
||||
text = req.text.encode('utf-8')
|
||||
algo = req.algorithm.lower()
|
||||
|
||||
if algo == "md5":
|
||||
result = hashlib.md5(text).hexdigest()
|
||||
@@ -96,61 +104,69 @@ async def compute_hash(request: HashRequest):
|
||||
# ========== Base64 ==========
|
||||
@router.post("/crypto/base64")
|
||||
@rate_limit(requests=100, period=60)
|
||||
async def base64_process(request: Base64Request):
|
||||
if request.action == "encode":
|
||||
result = base64.b64encode(request.text.encode('utf-8')).decode('utf-8')
|
||||
elif request.action == "decode":
|
||||
async def base64_process(
|
||||
request: Request, # 添加 request 参数
|
||||
req: Base64Request
|
||||
):
|
||||
if req.action == "encode":
|
||||
result = base64.b64encode(req.text.encode('utf-8')).decode('utf-8')
|
||||
elif req.action == "decode":
|
||||
try:
|
||||
result = base64.b64decode(request.text).decode('utf-8')
|
||||
result = base64.b64decode(req.text).decode('utf-8')
|
||||
except Exception:
|
||||
raise HTTPException(status_code=400, detail="Base64 解码失败")
|
||||
else:
|
||||
raise HTTPException(status_code=400, detail="无效的 action")
|
||||
|
||||
return {"action": request.action, "result": result}
|
||||
return {"action": req.action, "result": result}
|
||||
|
||||
# ========== URL 编解码 ==========
|
||||
@router.post("/crypto/url")
|
||||
@rate_limit(requests=100, period=60)
|
||||
async def url_process(request: URLRequest):
|
||||
if request.action == "encode":
|
||||
result = urllib.parse.quote(request.text, safe='')
|
||||
elif request.action == "decode":
|
||||
result = urllib.parse.unquote(request.text)
|
||||
async def url_process(
|
||||
request: Request, # 添加 request 参数
|
||||
req: URLRequest
|
||||
):
|
||||
if req.action == "encode":
|
||||
result = urllib.parse.quote(req.text, safe='')
|
||||
elif req.action == "decode":
|
||||
result = urllib.parse.unquote(req.text)
|
||||
else:
|
||||
raise HTTPException(status_code=400, detail="无效的 action")
|
||||
|
||||
return {"action": request.action, "result": result}
|
||||
return {"action": req.action, "result": result}
|
||||
|
||||
# ========== AES 加解密 ==========
|
||||
@router.post("/crypto/aes")
|
||||
@rate_limit(requests=50, period=60)
|
||||
async def aes_process(request: AESRequest):
|
||||
async def aes_process(
|
||||
request: Request, # 添加 request 参数
|
||||
req: AESRequest
|
||||
):
|
||||
try:
|
||||
key = request.key.encode('utf-8')
|
||||
key = req.key.encode('utf-8')
|
||||
mode_map = {"ECB": AES.MODE_ECB, "CBC": AES.MODE_CBC, "GCM": AES.MODE_GCM}
|
||||
mode = mode_map.get(request.mode)
|
||||
mode = mode_map.get(req.mode)
|
||||
|
||||
if not mode:
|
||||
raise HTTPException(status_code=400, detail="不支持的 AES 模式")
|
||||
|
||||
# 密钥长度处理
|
||||
if len(key) not in [16, 24, 32]:
|
||||
raise HTTPException(status_code=400, detail="密钥长度必须为 16/24/32 字节")
|
||||
|
||||
if request.action == "encrypt":
|
||||
cipher = AES.new(key, mode, iv=request.iv.encode('utf-8') if request.iv else None)
|
||||
if request.mode == "GCM":
|
||||
ciphertext = cipher.encrypt(request.text.encode('utf-8'))
|
||||
if req.action == "encrypt":
|
||||
cipher = AES.new(key, mode, iv=req.iv.encode('utf-8') if req.iv else None)
|
||||
if req.mode == "GCM":
|
||||
ciphertext = cipher.encrypt(req.text.encode('utf-8'))
|
||||
result = b64.b64encode(ciphertext).decode('utf-8')
|
||||
else:
|
||||
padded = pad(request.text.encode('utf-8'), AES.block_size)
|
||||
padded = pad(req.text.encode('utf-8'), AES.block_size)
|
||||
ciphertext = cipher.encrypt(padded)
|
||||
result = b64.b64encode(ciphertext).decode('utf-8')
|
||||
elif request.action == "decrypt":
|
||||
ciphertext = b64.b64decode(request.text)
|
||||
cipher = AES.new(key, mode, iv=request.iv.encode('utf-8') if request.iv else None)
|
||||
if request.mode == "GCM":
|
||||
elif req.action == "decrypt":
|
||||
ciphertext = b64.b64decode(req.text)
|
||||
cipher = AES.new(key, mode, iv=req.iv.encode('utf-8') if req.iv else None)
|
||||
if req.mode == "GCM":
|
||||
plaintext = cipher.decrypt(ciphertext).decode('utf-8')
|
||||
result = plaintext
|
||||
else:
|
||||
@@ -159,7 +175,7 @@ async def aes_process(request: AESRequest):
|
||||
else:
|
||||
raise HTTPException(status_code=400, detail="无效的 action")
|
||||
|
||||
return {"mode": request.mode, "action": request.action, "result": result}
|
||||
return {"mode": req.mode, "action": req.action, "result": result}
|
||||
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=400, detail=f"AES 操作失败: {str(e)}")
|
||||
@@ -167,9 +183,12 @@ async def aes_process(request: AESRequest):
|
||||
# ========== JSON 校验 ==========
|
||||
@router.post("/json/validate", response_model=JSONValidateResponse)
|
||||
@rate_limit(requests=100, period=60)
|
||||
async def validate_json(request: JSONValidateRequest):
|
||||
async def validate_json(
|
||||
request: Request, # 添加 request 参数
|
||||
req: JSONValidateRequest
|
||||
):
|
||||
try:
|
||||
parsed = json.loads(request.json_string)
|
||||
parsed = json.loads(req.json_string)
|
||||
formatted = json.dumps(parsed, indent=2, ensure_ascii=False)
|
||||
return JSONValidateResponse(valid=True, formatted=formatted)
|
||||
except json.JSONDecodeError as e:
|
||||
|
||||
Reference in New Issue
Block a user