This commit is contained in:
@@ -15,7 +15,7 @@ from django.conf import settings
|
||||
|
||||
from .es_client import get_user_by_username
|
||||
from .crypto import get_public_key_spki_b64, rsa_oaep_decrypt_b64, aes_gcm_decrypt_b64, verify_password, generate_rsa_private_pem_b64, public_spki_b64_from_private_pem_b64, rsa_oaep_decrypt_b64_with_private_pem
|
||||
from elastic.es_connect import get_registration_code, get_user_by_username as es_get_user_by_username, get_all_users as es_get_all_users, write_user_data, update_user_by_id, get_user_by_id
|
||||
from elastic.es_connect import get_registration_code, get_user_by_username as es_get_user_by_username, get_all_users as es_get_all_users, write_user_data, update_user_by_id, get_user_by_id, create_registration_code_manage_request, find_pending_registration_code_manage_request, list_registration_code_manage_requests, decide_registration_code_manage_request, get_registration_code_manage_request
|
||||
|
||||
|
||||
@require_http_methods(["GET"])
|
||||
@@ -259,6 +259,7 @@ def register_submit(request):
|
||||
"email": email,
|
||||
"key": (rc.get("keys") if rc else []) or [],
|
||||
"manage_key": (rc.get("manage_keys") if rc else []) or [],
|
||||
"registration_code": (rc.get("code") if rc else None),
|
||||
})
|
||||
if not ok:
|
||||
return JsonResponse({"ok": False, "message": "注册失败"}, status=500)
|
||||
@@ -269,6 +270,169 @@ def register_submit(request):
|
||||
pass
|
||||
return JsonResponse({"ok": True, "redirect_url": "/accounts/login/"})
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@csrf_protect
|
||||
def replace_registration_code_view(request):
|
||||
session_user_id = request.session.get("user_id")
|
||||
if session_user_id is None:
|
||||
return JsonResponse({"ok": False, "message": "未登录"}, status=401)
|
||||
try:
|
||||
payload = json.loads(request.body.decode("utf-8"))
|
||||
except json.JSONDecodeError:
|
||||
return HttpResponseBadRequest("Invalid JSON")
|
||||
code = (payload.get("code") or "").strip()
|
||||
if not code:
|
||||
return JsonResponse({"ok": False, "message": "请输入注册码"}, status=400)
|
||||
rc = get_registration_code(code)
|
||||
if not rc:
|
||||
return JsonResponse({"ok": False, "message": "注册码无效"}, status=400)
|
||||
try:
|
||||
exp = rc.get("expires_at")
|
||||
now = __import__("datetime").datetime.now(__import__("datetime").timezone.utc)
|
||||
if hasattr(exp, 'isoformat'):
|
||||
exp_dt = exp
|
||||
else:
|
||||
exp_dt = __import__("datetime").datetime.fromisoformat(str(exp))
|
||||
if exp_dt <= now:
|
||||
return JsonResponse({"ok": False, "message": "注册码已过期"}, status=400)
|
||||
except Exception:
|
||||
pass
|
||||
keys = list(rc.get("keys") or [])
|
||||
manage_keys = list(rc.get("manage_keys") or [])
|
||||
ok = update_user_by_id(session_user_id, key=keys, manage_key=manage_keys, registration_code=code)
|
||||
if not ok:
|
||||
return JsonResponse({"ok": False, "message": "替换失败"}, status=500)
|
||||
return JsonResponse({"ok": True})
|
||||
|
||||
@require_http_methods(["GET"])
|
||||
def registration_code_preview_view(request):
|
||||
session_user_id = request.session.get("user_id")
|
||||
if session_user_id is None:
|
||||
return JsonResponse({"ok": False, "message": "未登录"}, status=401)
|
||||
code = (request.GET.get("code") or "").strip()
|
||||
if not code:
|
||||
return JsonResponse({"ok": False, "message": "请输入注册码"}, status=400)
|
||||
rc = get_registration_code(code)
|
||||
if not rc:
|
||||
return JsonResponse({"ok": False, "message": "注册码无效"}, status=400)
|
||||
try:
|
||||
exp = rc.get("expires_at")
|
||||
now = __import__("datetime").datetime.now(__import__("datetime").timezone.utc)
|
||||
if hasattr(exp, 'isoformat'):
|
||||
exp_dt = exp
|
||||
else:
|
||||
exp_dt = __import__("datetime").datetime.fromisoformat(str(exp))
|
||||
if exp_dt <= now:
|
||||
return JsonResponse({"ok": False, "message": "注册码已过期"}, status=400)
|
||||
except Exception:
|
||||
pass
|
||||
return JsonResponse(
|
||||
{
|
||||
"ok": True,
|
||||
"data": {
|
||||
"code": rc.get("code"),
|
||||
"keys": list(rc.get("keys") or []),
|
||||
"manage_keys": list(rc.get("manage_keys") or []),
|
||||
"expires_at": rc.get("expires_at"),
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@csrf_protect
|
||||
def submit_registration_code_request_view(request):
|
||||
session_user_id = request.session.get("user_id")
|
||||
if session_user_id is None:
|
||||
return JsonResponse({"ok": False, "message": "未登录"}, status=401)
|
||||
try:
|
||||
perm = int(request.session.get("permission", 1))
|
||||
except Exception:
|
||||
perm = 1
|
||||
if perm == 0:
|
||||
return JsonResponse({"ok": False, "message": "无权限"}, status=403)
|
||||
me = get_user_by_id(session_user_id) or {}
|
||||
if (me.get("manage_key") or []) or int(me.get("can_manage_registration_codes") or 0) == 1:
|
||||
return JsonResponse({"ok": False, "message": "无需申请"}, status=400)
|
||||
if str(me.get("registration_code") or "").strip():
|
||||
return JsonResponse({"ok": False, "message": "已有注册码,无法申请"}, status=400)
|
||||
try:
|
||||
payload = json.loads(request.body.decode("utf-8"))
|
||||
except json.JSONDecodeError:
|
||||
return HttpResponseBadRequest("Invalid JSON")
|
||||
reason = (payload.get("reason") or "").strip()
|
||||
if not reason:
|
||||
return JsonResponse({"ok": False, "message": "请填写申请理由"}, status=400)
|
||||
pending = find_pending_registration_code_manage_request(session_user_id)
|
||||
if pending:
|
||||
return JsonResponse({"ok": True, "message": "已提交申请"})
|
||||
rid = create_registration_code_manage_request(session_user_id, me.get("username"), reason)
|
||||
if not rid:
|
||||
return JsonResponse({"ok": False, "message": "提交失败"}, status=500)
|
||||
return JsonResponse({"ok": True})
|
||||
|
||||
@require_http_methods(["GET"])
|
||||
@ensure_csrf_cookie
|
||||
def registration_code_requests_page(request):
|
||||
session_user_id = request.session.get("user_id")
|
||||
if session_user_id is None:
|
||||
return redirect("/accounts/login/")
|
||||
try:
|
||||
perm = int(request.session.get("permission", 1))
|
||||
except Exception:
|
||||
perm = 1
|
||||
if perm != 0:
|
||||
return redirect("/main/home/")
|
||||
me = get_user_by_id(session_user_id) or {}
|
||||
return render(request, "accounts/registration_code_requests.html", {"username": me.get("username")})
|
||||
|
||||
@require_http_methods(["GET"])
|
||||
def list_registration_code_requests_view(request):
|
||||
session_user_id = request.session.get("user_id")
|
||||
if session_user_id is None:
|
||||
return JsonResponse({"ok": False, "message": "未登录"}, status=401)
|
||||
try:
|
||||
perm = int(request.session.get("permission", 1))
|
||||
except Exception:
|
||||
perm = 1
|
||||
if perm != 0:
|
||||
return JsonResponse({"ok": False, "message": "无权限"}, status=403)
|
||||
status = (request.GET.get("status") or "").strip() or None
|
||||
data = list_registration_code_manage_requests(status=status)
|
||||
return JsonResponse({"ok": True, "data": data})
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@csrf_protect
|
||||
def decide_registration_code_request_view(request):
|
||||
session_user_id = request.session.get("user_id")
|
||||
if session_user_id is None:
|
||||
return JsonResponse({"ok": False, "message": "未登录"}, status=401)
|
||||
try:
|
||||
perm = int(request.session.get("permission", 1))
|
||||
except Exception:
|
||||
perm = 1
|
||||
if perm != 0:
|
||||
return JsonResponse({"ok": False, "message": "无权限"}, status=403)
|
||||
try:
|
||||
payload = json.loads(request.body.decode("utf-8"))
|
||||
except json.JSONDecodeError:
|
||||
return HttpResponseBadRequest("Invalid JSON")
|
||||
request_id = (payload.get("request_id") or "").strip()
|
||||
action = (payload.get("action") or "").strip().lower()
|
||||
note = (payload.get("note") or "").strip()
|
||||
if not request_id or action not in ("approve", "reject"):
|
||||
return JsonResponse({"ok": False, "message": "参数错误"}, status=400)
|
||||
req = get_registration_code_manage_request(request_id)
|
||||
if not req:
|
||||
return JsonResponse({"ok": False, "message": "申请不存在"}, status=404)
|
||||
status = "approved" if action == "approve" else "rejected"
|
||||
ok = decide_registration_code_manage_request(request_id, status=status, reviewed_by=session_user_id, reviewer_note=note)
|
||||
if not ok:
|
||||
return JsonResponse({"ok": False, "message": "操作失败"}, status=500)
|
||||
if status == "approved":
|
||||
uid = req.get("user_id")
|
||||
update_user_by_id(uid, can_manage_registration_codes=1, registration_manage_keys=[])
|
||||
return JsonResponse({"ok": True})
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@csrf_protect
|
||||
def send_email_code(request):
|
||||
@@ -327,4 +491,4 @@ def _send_smtp_email(to_email: str, code: str):
|
||||
pass
|
||||
return True, ""
|
||||
except Exception as e:
|
||||
return False, str(e)
|
||||
return False, str(e)
|
||||
|
||||
Reference in New Issue
Block a user