@@ -26,16 +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 .route ('/ask' , methods = ['POST' ])
35- def ask ():
36- if not validate_pow (request .headers .get ('X-Nonce' ), request .get_data (), 0x50000 ):
37- return jsonify ({"error" : "Invalid proof of work" }), 400
38-
29+ def handle_ask_request (request , session ):
3930 data = request .get_json ()
4031 query = data .get ('query' )
4132
@@ -70,6 +61,30 @@ def generate():
7061
7162 return Response (stream_with_context (generate ()), content_type = 'text/markdown' )
7263
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+
7388@app .route ('/trigger-rebuild' , methods = ['POST' ])
7489@csrf .exempt
7590def trigger_rebuild ():
0 commit comments