import os
import re
import json
from datetime import datetime
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
from binascii import hexlify, unhexlify
from rest_framework import parsers, renderers
from rest_framework.compat import coreapi, coreschema
from rest_framework.response import Response
from rest_framework.schemas import ManualSchema
from rest_framework.views import APIView
from rest_framework.authtoken.models import Token
from rest_framework.authtoken.serializers import AuthTokenSerializer
from django.contrib import auth
from django.http import QueryDict
from django.shortcuts import HttpResponse
from django.views.generic.base import View
from django.contrib.auth.hashers import make_password, check_password
from .models import *
from case.models import CaseType
from users.models import ScoreModel
from .utils import send_register_email
from fcdaserver.rest_framework.views import ViewBase
class UserPermissions(ViewBase):
def put(self, request):
exam_type = request.data.get("exam_type")
user = request.user
if user.is_active:
user.exam_type = exam_type
user.save()
response_data = {"code": 0, "msg": ""}
else:
response_data = {"code": 1, "msg": "用户没有激活!"}
return self.json_response(data=response_data)
class ResetPwd(ViewBase):
def post(self, request):
old_word = request.data.get("old_pwd", "")
new_pwd = request.data.get("new_pwd", "")
user = auth.authenticate(username=request.user.username, password=old_word)
if user is not None:
if user.is_active:
user.set_password(new_pwd)
user.save()
response_data = {"code": 0, "msg": ""}
else:
response_data = {"code": 1, "msg": "用户未激活!"}
else:
response_data = {"code": 1, "msg": "用户名或密码错误!"}
return self.json_response(data=response_data)
class MyAuthToken(APIView):
throttle_classes = ()
permission_classes = ()
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
serializer_class = AuthTokenSerializer
if coreapi is not None and coreschema is not None:
schema = ManualSchema(
fields=[
coreapi.Field(
name="username",
required=True,
location='form',
schema=coreschema.String(
title="Username",
description="Valid username for authentication",
),
),
coreapi.Field(
name="password",
required=True,
location='form',
schema=coreschema.String(
title="Password",
description="Valid password for authentication",
),
),
],
encoding="application/json",
)
def post(self, request, *args, **kwargs):
username = request.data.get("username")
password = request.data.get("password")
user_obj = UserProfile.objects.filter(username=username).first()
if user_obj:
if not check_password(password, user_obj.password):
return Response({"code": 1, "msg": "密码不正确!"})
if user_obj.sn and user_obj.is_active:
current_time = datetime.now().timetuple()
active_time = user_obj.sn.active_time.timetuple()
if int(time.mktime(current_time)) - int(time.mktime(active_time)) > 60 * 60 * 24 * user_obj.sn.expire_date:
user_obj.sn.is_valid = False
else:
user_obj.sn.is_valid = True
user_obj.sn.save()
if Token.objects.filter(user=user_obj).exists():
token_key = hexlify(os.urandom(20)).decode()
Token.objects.filter(user=user_obj).update(key=token_key, created=datetime.now())
token_info = Token.objects.filter(user=user_obj).first()
else:
token_info = Token.objects.create(user=user_obj)
UserProfile.objects.filter(username=username).update(last_login=datetime.now())
if user_obj.sn.is_valid:
return Response({"code": 0, "msg": token_info.key})
else:
return Response({"code": 1, "msg": "当前账户已过期!请联系管理员!"})
else:
return Response({"code": 1, "msg": "用户未激活!请联系管理员!"})
else:
return Response({"code": 1, "msg": "用户不存在!"})
class UserRegister(View):
def post(self, request, *args, **kwargs):
username = request.POST.get("username", "")
nickname = request.POST.get("nickname", "")
email = request.POST.get("email", "")
password = request.POST.get("password", "")
serial_number = request.POST.get("serial_number", "")
response_data = {"code": 0, "msg": ""}
if username == "":
response_data = {"code": 2, "msg": "用户名不允许为空!"}
elif nickname == "":
response_data = {"code": 2, "msg": "昵称不允许为空!"}
elif password == "":
response_data = {"code": 2, "msg": "密码不允许为空!"}
elif email == "":
response_data = {"code": 2, "msg": "邮箱不允许为空!"}
elif serial_number == "":
response_data = {"code": 2, "msg": "序列号不允许为空!"}
if response_data["code"] != 0:
return HttpResponse(content=json.dumps(response_data, indent=4, ),
content_type="application/json;charset=UTF-8")
if not username.isalnum():
response_data = {"code": 3, "msg": "用户名包含非法字符!"}
elif re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) == None:
response_data = {"code": 3, "msg": "邮箱格式不正确!"}
if response_data["code"] != 0:
return HttpResponse(content=json.dumps(response_data, indent=4, ),
content_type="application/json;charset=UTF-8")
if UserProfile.objects.filter(username=username).exists():
response_data = {"code": 1, "msg": "用户名已存在!"}
else:
serial_number_obj = SerialNumber.objects.filter(serial_number=serial_number).first()
if not serial_number_obj or not serial_number_obj.is_valid:
response_data = {"code": 2, "msg": "序列号已经过期!"}
else:
encrypt_pwd = make_password(password, None, 'pbkdf2_sha256')
UserProfile.objects.create(username=username, nick_name=nickname, password=encrypt_pwd,
email=email, sn=serial_number_obj, is_active=False)
serial_number_obj.active_time = datetime.now()
serial_number_obj.save()
send_register_email(username, email)
response_data = {"code": 0, "msg": ""}
return HttpResponse(content=json.dumps(response_data, indent=4,),
content_type="application/json;charset=UTF-8")
class UserActive(View):
def post(self, request):
email_code = request.POST.get("email_code", "")
response_data = {"code": 0, "msg": ""}
if email_code == "":
response_data = {"code": 2, "msg": "验证码无效"}
if response_data["code"] == 0:
email_record_obj = EmailVerifyRecord.objects.filter(code=email_code).first()
if email_record_obj:
user_obj = UserProfile.objects.filter(username=email_record_obj.username,
email=email_record_obj.email).first()
user_obj.is_active = True
user_obj.save()
user_group_obj = UserGroup.objects.get(name="默认组")
user_group_obj.user.add(user_obj)
response_data = {"code": 0, "msg": "用户已激活"}
else:
response_data = {"code": 2, "msg": "验证码无效"}
return HttpResponse(content=json.dumps(response_data, indent=4, ),
content_type="application/json;charset=UTF-8")
class UserAuthentication(View):
def get(self, request):
username = request.GET.get("username")
user_obj = UserProfile.objects.filter(username=username).first()
if user_obj:
response_data = {"code": 0, "msg": "验证码已发送至您的邮箱,请注意查收!"}
send_register_email(username, user_obj.email, send_type="reset_pwd")
else:
response_data = {"code": 1, "msg": "用户不存在"}
return HttpResponse(content=json.dumps(response_data, indent=4, ),
content_type="application/json;charset=UTF-8")
def post(self, request):
username = request.POST.get("username")
password = request.POST.get("password")
user_obj = UserProfile.objects.filter(username=username).first()
if user_obj:
if user_obj.is_active:
user_obj.set_password(password)
user_obj.save()
response_data = {"code": 0, "msg": ""}
else:
response_data = {"code": 1, "msg": "用户未激活!"}
else:
response_data = {"code": 1, "msg": "用户名或密码错误!"}
return HttpResponse(content=json.dumps(response_data, indent=4, ),
content_type="application/json;charset=UTF-8")
def put(self, request):
put = QueryDict(request.body)
username = put.get("username")
email_code = put.get("email_code")
email_record_obj = EmailVerifyRecord.objects.filter(username=username, code=email_code).first()
if email_record_obj:
response_data = {"code": 0, "msg": "验证成功!"}
else:
response_data = {"code": 1, "msg": "验证失败!"}
return HttpResponse(content=json.dumps(response_data, indent=4, ),
content_type="application/json;charset=UTF-8")
class EditPersonalInformation(ViewBase):
def get(self, request):
username = request.GET.get("username")
user_obj = UserProfile.objects.filter(username=username).first()
if user_obj:
temp = {
"username": username,
"nickname": user_obj.nick_name,
"email": user_obj.email,
"phone": user_obj.first_name
}
response_data = {"code": 0, "msg": "", "data": temp}
else:
response_data = {"code": 1, "msg": "用户名获取失败!"}
return self.json_response(data=response_data)
def post(self, request):
username = request.POST.get("username")
nickname = request.POST.get("nickname")
email = request.POST.get("email")
phone = request.POST.get("phone")
user_obj = UserProfile.objects.filter(username=username).first()
if user_obj:
user_obj.nick_name = nickname
user_obj.email = email
user_obj.first_name = phone
user_obj.save()
response_data = {"code": 0, "msg": "修改成功!"}
else:
response_data = {"code": 1, "msg": "用户名获取失败!"}
return self.json_response(data=response_data)
class ScoreView(ViewBase):
def post(self, request):
stage_id = request.POST.get("stageId")
question_number = request.POST.get("questionNo")
score = request.POST.get("score")
try:
ScoreModel.objects.create(user=request.user,
stage_id=stage_id,
question_number=question_number,
score=score)
return self.json_response(data={"code": 0, "msg": "提交成功!"})
except Exception as e:
print(e)
return self.json_response(data={"code": -1, "msg": "提交失败!"})
def get_key(key):
# 确保密钥是字节串类型
if isinstance(key, str):
key = key.encode('utf-8')
# 填充或截断密钥以确保长度为 16 字节
key = key.ljust(16, b'\x00')[:16]
return key
def encode2hex(src, key):
try:
key = get_key(key)
cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend())
encryptor = cipher.encryptor()
padder = padding.PKCS7(algorithms.AES.block_size).padder()
padded_data = padder.update(src.encode('utf-8')) + padder.finalize()
encrypted = encryptor.update(padded_data) + encryptor.finalize()
return hexlify(encrypted).decode('utf-8')
except Exception as e:
print(f"encode2hex fail: {e}")
return None
def decode4hex(src, key):
try:
key = get_key(key)
cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend())
decryptor = cipher.decryptor()
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
encrypted_bytes = unhexlify(src)
decrypted = decryptor.update(encrypted_bytes) + decryptor.finalize()
decrypted_padded = unpadder.update(decrypted) + unpadder.finalize()
return decrypted_padded.decode('utf-8')
except Exception as e:
print(f"decode4hex fail: {e}")
return None
class CheckIdCard(View):
def post(self, request):
id_card = request.POST.get("id_card", "")
if id_card == "":
response_data = {"code": 2, "msg": "参数无效!"}
return HttpResponse(content=json.dumps(response_data, indent=4, ),
content_type="application/json;charset=UTF-8")
id_card = decode4hex(id_card, "loginqwert@12345")
user_obj = UserProfile.objects.filter(id_card=id_card).first()
if user_obj and id_card:
if user_obj.is_active:
if Token.objects.filter(user=user_obj).exists():
token_key = hexlify(os.urandom(20)).decode()
Token.objects.filter(user=user_obj).update(key=token_key, created=datetime.now())
token_info = Token.objects.filter(user=user_obj).first()
else:
token_info = Token.objects.create(user=user_obj)
UserProfile.objects.filter(username=user_obj.username).update(last_login=datetime.now())
if user_obj.sn.is_valid:
response_data = {"code": 0, "msg": "", "token": token_info.key, "username": user_obj.username}
else:
response_data = {"code": 1, "msg": "当前账户已过期!请联系管理员!"}
else:
response_data = {"code": 1, "msg": "用户未激活!"}
else:
response_data = {"code": 1, "msg": "此用户不存在!"}
return HttpResponse(content=json.dumps(response_data, indent=4, ),
content_type="application/json;charset=UTF-8")
逐行解析