22import requests
33
44from django .http import HttpResponse , HttpResponseRedirect , HttpResponseForbidden
5- from django .shortcuts import render , get_object_or_404
5+ from django .shortcuts import render , get_object_or_404 , redirect
66from django .template .context_processors import csrf
77from django .contrib .auth .decorators import login_required
88from django .contrib import messages
@@ -166,7 +166,6 @@ def home(request):
166166 uids .add (q .last_post_by )
167167
168168 users = {u .id : u .username for u in User .objects .filter (id__in = uids )}
169-
170169 # Attach usernames to question objects so templates don't trigger queries
171170 for q in all_questions :
172171 q .cached_user = users .get (q .uid , "Unknown User" )
@@ -1090,3 +1089,40 @@ def unanswered_notification(request):
10901089 if total_count :
10911090 forums_mail (to , subject , message )
10921091 return HttpResponse (message )
1092+
1093+
1094+ def verify_filter_access (request ):
1095+ if request .method != 'POST' :
1096+ return HttpResponseForbidden ("Invalid request method" )
1097+
1098+ token = request .POST .get ('token' , "" ).strip ()
1099+ next_url = request .POST .get ('next' , "" ).strip ()
1100+
1101+ if not token :
1102+ return HttpResponseForbidden ("Missing captcha token" )
1103+
1104+ try :
1105+ data = {'secret' : settings .RECAPTCHA_SECRET_KEY , 'response' : token }
1106+ resp = requests .post ('https://www.google.com/recaptcha/api/siteverify' ,
1107+ data , timeout = 5 )
1108+ result = resp .json ()
1109+ except Exception :
1110+ return HttpResponseForbidden ("Captcha verification service unavailable" )
1111+
1112+ success = result .get ('success' , False )
1113+ score = result .get ('score' , 0.0 )
1114+ action = result .get ('action' , "" )
1115+
1116+
1117+ # Tune score threshold as needed.
1118+ if not success :
1119+ return HttpResponseForbidden ("Captcha verification failed" )
1120+ if action != 'filter_page' :
1121+ return HttpResponseForbidden ("Invalid captcha action" )
1122+ if score < 0.5 :
1123+ return HttpResponseForbidden ("Request looks suspicious" )
1124+
1125+ request .session ["filter_verified" ] = True
1126+ # optionally, set filter_verified_at timestamp session for seperate filter_verify expiiry
1127+
1128+ return redirect (next_url )
0 commit comments