1- import os
1+ import os , requests , json
22from datetime import timedelta , datetime
33from fastapi import FastAPI , Depends , HTTPException
44from fastapi .middleware .cors import CORSMiddleware
55from authx import AuthX , AuthXConfig
6- from models .site import IllegalSite
7- from config .database import collection_name
6+ from models .site import IllegalSite , ReportedIllegalSite
7+ from config .database import sites_collection , reports_collection
88from schema .schemas import site_entities
99from dotenv import load_dotenv
1010from api_analytics .fastapi import Analytics
1818 allow_methods = ["*" ],
1919 allow_headers = ["*" ],
2020)
21- app .add_middleware (Analytics , api_key = os .getenv ("ANALYTICS_API_KEY" ))
21+ # app.add_middleware(Analytics, api_key=os.getenv("ANALYTICS_API_KEY"))
2222
2323load_dotenv ()
2424
@@ -53,34 +53,87 @@ def login(username: str, password: str):
5353
5454@app .get ("/sites" )
5555async def get_sites () -> list [IllegalSite ]:
56- sites = site_entities (collection_name .find ())
56+ sites = site_entities (sites_collection .find ())
5757 return sites
5858
5959
6060@app .get ("/sites/{domain}" )
6161async def get_site (domain ) -> list [IllegalSite ]:
62- site = site_entities (collection_name .find ({"domain" : domain }))
62+ site = site_entities (sites_collection .find ({"domain" : domain }))
6363 return site
6464
6565
6666@app .post ("/sites" , dependencies = [Depends (auth .access_token_required )])
6767async def post_site (site : IllegalSite ):
68- collection_name .insert_one (dict (site ))
68+ sites_collection .insert_one (dict (site ))
6969
7070
7171@app .put ("/sites/{domain}" , dependencies = [Depends (auth .access_token_required )])
7272async def put_site (domain : str , site : IllegalSite ):
73- collection_name .find_one_and_update ({"domain" : domain }, {"$set" : dict (site )})
73+ sites_collection .find_one_and_update ({"domain" : domain }, {"$set" : dict (site )})
7474
7575
7676@app .delete ("/sites/{domain}" , dependencies = [Depends (auth .access_token_required )])
7777async def delete_site (domain : str ):
78- collection_name .find_one_and_delete ({"domain" : domain })
78+ sites_collection .find_one_and_delete ({"domain" : domain })
7979
8080
81+ @app .get ("/reports" )
82+ async def get_reports () -> list [IllegalSite ]:
83+ sites = site_entities (reports_collection .find ())
84+ return sites
85+
86+
87+ @app .get ("/reports/{domain}" )
88+ async def get_report (domain ) -> list [IllegalSite ]:
89+ site = site_entities (reports_collection .find ({"domain" : domain }))
90+ return site
91+
92+
93+ @app .delete ("/reports/{domain}" , dependencies = [Depends (auth .access_token_required )])
94+ async def delete_report (domain : str ):
95+ reports_collection .find_one_and_delete ({"domain" : domain })
96+
97+
98+ @app .post ("/reports" )
99+ async def post_report (site : ReportedIllegalSite ):
100+ r = requests .post ("https://challenges.cloudflare.com/turnstile/v0/siteverify" , data = {
101+ "secret" : os .getenv ("TURNSTILE_SECRET_KEY" ),
102+ "response" : site .token
103+ })
104+
105+ if json .loads (r .text )["success" ]:
106+ site_dict = dict (site )
107+ site_dict .pop ('token' , None )
108+
109+ if not reports_collection .find_one ({"domain" : site .domain }):
110+
111+ match site_dict ["reason" ]:
112+ case "illegal-redistribution" :
113+ hr_reason = "Illegal redistribution"
114+ case "phishing" :
115+ hr_reason = "Phishing website"
116+ case "malware" :
117+ hr_reason = "Contains malware"
118+ case "puw" :
119+ hr_reason = "Potentially unwanted website"
120+ case "false-pos" :
121+ hr_reason = "False positive"
122+ case _:
123+ raise HTTPException (400 , "Invalid reason" )
124+
125+ site_dict ["reason" ] = hr_reason
126+ reports_collection .insert_one (site_dict )
127+ else :
128+ raise HTTPException (409 , "Report already exists" )
129+ else :
130+ raise HTTPException (400 , "Invalid captcha" )
131+
81132@app .get ("/stats" )
82133async def get_stats ():
83- sites = site_entities (collection_name .find ())
134+ sites = site_entities (sites_collection .find ())
135+ reports = site_entities (reports_collection .find ())
84136 return {
85- "sites" : len (list (sites ))
137+ "sites" : len (list (sites )),
138+ "reports" : len (list (reports ))
86139 }
0 commit comments