2727from better_profanity import profanity as _bp
2828from security .audit import log_access , log_dm , log_public_chat , log_security
2929from security .profanity import censor_text
30- from security .rate_limit import rate_limit_per_user
30+ from security .rate_limit import rate_limit_per_ip
3131
3232router = APIRouter ()
3333logger = logging .getLogger ("uvicorn.error" )
@@ -386,7 +386,7 @@ async def _send_message_internal(
386386
387387
388388@router .post ("/send_message" )
389- @rate_limit_per_user ("30/minute" )
389+ @rate_limit_per_ip ("30/minute" )
390390async def send_message (
391391 request : Request ,
392392 message_request : SendMessageRequest | None = None ,
@@ -414,7 +414,8 @@ async def send_message(
414414
415415
416416@router .get ("/get_messages" )
417- async def get_messages (db : Session = Depends (get_db )):
417+ @rate_limit_per_ip ("60/minute" ) # Per-IP limit to prevent abuse
418+ async def get_messages (current_user : User = Depends (get_current_user ), db : Session = Depends (get_db )):
418419 messages = db .query (Message ).order_by (Message .timestamp .asc ()).all ()
419420
420421 messages_data = []
@@ -428,7 +429,7 @@ async def get_messages(db: Session = Depends(get_db)):
428429
429430
430431@router .post ("/dm/send" )
431- @rate_limit_per_user ("20/minute" )
432+ @rate_limit_per_ip ("20/minute" )
432433async def dm_send (
433434 request : Request ,
434435 payload : dict | None = None ,
@@ -578,6 +579,7 @@ def convert_envelopes(envs: list[DMEnvelope]):
578579 }
579580
580581@router .get ("/dm/fetch" )
582+ @rate_limit_per_ip ("60/minute" ) # Per-IP limit to prevent abuse
581583async def dm_fetch (since : int | None = None , current_user : User = Depends (get_current_user ), db : Session = Depends (get_db )):
582584 q = db .query (DMEnvelope ).filter (DMEnvelope .recipient_id == current_user .id )
583585 if since :
@@ -586,6 +588,7 @@ async def dm_fetch(since: int | None = None, current_user: User = Depends(get_cu
586588
587589
588590@router .get ("/dm/history/{other_user_id}" )
591+ @rate_limit_per_ip ("60/minute" ) # Per-IP limit to prevent abuse
589592async def dm_history (other_user_id : int , current_user : User = Depends (get_current_user ), db : Session = Depends (get_db )):
590593 return convert_envelopes (
591594 db .query (DMEnvelope )
@@ -599,6 +602,7 @@ async def dm_history(other_user_id: int, current_user: User = Depends(get_curren
599602
600603
601604@router .get ("/dm/conversations" )
605+ @rate_limit_per_ip ("60/minute" ) # Per-IP limit to prevent abuse
602606async def get_dm_conversations (current_user : User = Depends (get_current_user ), db : Session = Depends (get_db )):
603607 # Get all DM conversations where current user is involved
604608 conversations_query = db .query (DMEnvelope ).filter (
@@ -641,7 +645,7 @@ async def get_dm_conversations(current_user: User = Depends(get_current_user), d
641645
642646
643647@router .put ("/edit_message/{message_id}" )
644- @rate_limit_per_user ("20/minute" )
648+ @rate_limit_per_ip ("20/minute" )
645649async def edit_message (
646650 request : Request ,
647651 message_id : int ,
@@ -718,7 +722,7 @@ async def delete_message(
718722
719723
720724@router .post ("/add_reaction" )
721- @rate_limit_per_user ("50/minute" )
725+ @rate_limit_per_ip ("50/minute" )
722726async def add_reaction (
723727 request : Request ,
724728 reaction_request : ReactionRequest ,
@@ -787,7 +791,7 @@ async def add_reaction(
787791
788792
789793@router .post ("/dm/add_reaction" )
790- @rate_limit_per_user ("50/minute" )
794+ @rate_limit_per_ip ("50/minute" )
791795async def add_dm_reaction (
792796 request : Request ,
793797 reaction_request : DMReactionRequest ,
0 commit comments