88from django .conf import settings
99from django .utils import timezone
1010
11+ from datetime import timedelta
12+ from django .core .signing import TimestampSigner , BadSignature , SignatureExpired
13+
1114from rest_framework .response import Response
1215from rest_framework .views import APIView
1316from rest_framework import status
2023from .decorator import password_verify_required
2124
2225import os .path
26+ import secrets
2327
2428# Create your views here.
2529class AccountSessionView (APIView ):
@@ -213,3 +217,64 @@ def delete(self, request, uid):
213217
214218 os .remove (avatar_path )
215219 return Response (status = status .HTTP_200_OK )
220+
221+ class AccountEmailView (APIView ):
222+
223+ @method_decorator (login_required ())
224+ def get (self , request ):
225+ return Response ({
226+ "res" : request .user .email
227+ })
228+
229+ # @method_decorator(login_required())
230+ def post (self , request , vid = None ):
231+ signer = TimestampSigner ()
232+ user = request .user
233+ if vid == None :
234+ # send mail
235+ signature = signer .sign (user .username )
236+ user .email_user (settings .VERIFY_EMAIL_TEMPLATE_TITLE ,
237+ settings .VERIFY_EMAIL_TEMPLATE_CONTENT .format (username = user .username , signature = signature ),
238+ html_message = settings .VERIFY_EMAIL_TEMPLATE_CONTENT .format (username = user .username , signature = signature ),)
239+ return Response ({
240+ "detail" : "Email sent"
241+ }, status = status .HTTP_202_ACCEPTED )
242+
243+ try :
244+ value = signer .unsign (vid , max_age = timedelta (minutes = settings .VERIFY_EMAIL_MAX_AGE ))
245+ except SignatureExpired :
246+ return Response ({
247+ "detail" : "Signature Expired"
248+ }, status = status .HTTP_403_FORBIDDEN )
249+ except BadSignature :
250+ return Response ({
251+ "detail" : "Bad Signature"
252+ }, status = status .HTTP_403_FORBIDDEN )
253+
254+ if value != user .username :
255+ return Response ({
256+ "detail" : "Mismatch Signature"
257+ }, status = status .HTTP_403_FORBIDDEN )
258+
259+ user .email_verified = True
260+ user .save ()
261+ request .session ["email_verified" ] = True
262+ return Response ({
263+ "detail" : "Susccess"
264+ }, status = status .HTTP_204_NO_CONTENT )
265+
266+ @method_decorator (syllable_required ("email" , str ))
267+ @method_decorator (password_verify_required ())
268+ def patch (self , request ):
269+ # change email
270+
271+ data = request .data
272+ user = request .user
273+
274+ user .email = data .get ("email" )
275+ user .email_verified = False
276+ user .save ()
277+
278+ return Response ({
279+ "detail" : "Success"
280+ }, status .HTTP_204_NO_CONTENT )
0 commit comments