@@ -26,32 +26,7 @@ def validate_pow(nonce, data, difficulty):
2626 first_uint32 = int .from_bytes (calculated_hash [:4 ], byteorder = 'big' )
2727 return first_uint32 <= difficulty
2828
29-
30- @app .route ('/' , methods = ['GET' , 'POST' ])
31- def index ():
32- return render_template ('index.html' , debug = os .getenv ('DEBUG' ))
33-
34- @app .before_request
35- def exempt_csrf_for_ask_token ():
36- if request .endpoint == 'ask' :
37- ask_token = request .headers .get ('Ask-Token' )
38- # If ask token matches the expected value, bypass CSRF protection
39- if ask_token and ask_token == os .getenv ('ASK_TOKEN' ):
40- print (f"CSRF protection exempted for endpoint '{ request .endpoint } ' due to valid Ask-Token" )
41- csrf .exempt (app .view_functions ['ask' ])
42- else :
43- print (f"CSRF protection enabled for endpoint: { request .endpoint } " )
44-
45- @app .route ('/ask' , methods = ['POST' ])
46- def ask ():
47- ask_token = request .headers .get ('Ask-Token' )
48- # If ask token matches the expected value, bypass PoW validation
49- if ask_token != os .getenv ('ASK_TOKEN' ):
50- if not validate_pow (request .headers .get ('X-Nonce' ), request .get_data (), 0x50000 ):
51- return jsonify ({"error" : "Invalid Proof of Work" }), 400
52- else :
53- print (f"Proof of Work validation skipped for endpoint: { request .endpoint } due to valid Ask-Token" )
54-
29+ def handle_ask_request (request , session ):
5530 data = request .get_json ()
5631 query = data .get ('query' )
5732
@@ -86,6 +61,30 @@ def generate():
8661
8762 return Response (stream_with_context (generate ()), content_type = 'text/markdown' )
8863
64+ @app .route ('/' , methods = ['GET' , 'POST' ])
65+ def index ():
66+ return render_template ('index.html' , debug = os .getenv ('DEBUG' ))
67+
68+ @app .route ('/ask' , methods = ['POST' ])
69+ def ask ():
70+ if not validate_pow (request .headers .get ('X-Nonce' ), request .get_data (), 0x50000 ):
71+ return jsonify ({"error" : "Invalid Proof of Work" }), 400
72+
73+ response = handle_ask_request (request , session )
74+ return response
75+
76+ # /v1/ask allows bypassing of CSRF and PoW for clients with a valid Ask Token
77+ @app .route ('/v1/ask' , methods = ['POST' ])
78+ @csrf .exempt
79+ def v1_ask ():
80+ auth_header = request .headers .get ('Authorization' )
81+ ask_token = auth_header .split ("Bearer " )[1 ] if auth_header and auth_header .startswith ("Bearer " ) else None
82+ if ask_token and ask_token == os .getenv ('ASK_TOKEN' ):
83+ response = handle_ask_request (request , session )
84+ return response
85+ else :
86+ jsonify ({"error" : "Invalid or missing Ask Token" }), 401
87+
8988@app .route ('/trigger-rebuild' , methods = ['POST' ])
9089@csrf .exempt
9190def trigger_rebuild ():
0 commit comments