2023-06-22 00:04:45 +00:00
import os
2023-06-20 17:47:56 +00:00
from flask import request
from flask_restx import Namespace , Resource , reqparse
2023-06-22 00:04:45 +00:00
from overseer . flask import cache , db
2023-06-20 17:47:56 +00:00
from overseer . observer import retrieve_suspicious_instances
from loguru import logger
2023-06-21 17:37:34 +00:00
from overseer . classes . instance import Instance
from overseer . database import functions as database
2023-06-22 00:04:45 +00:00
from overseer import exceptions as e
from overseer . utils import hash_api_key
2023-06-22 13:40:28 +00:00
from overseer . lemmy import pm_new_api_key , pm_instance
2023-06-22 00:04:45 +00:00
from pythorhead import Lemmy
2023-06-20 17:47:56 +00:00
api = Namespace ( ' v1 ' , ' API Version 1 ' )
from overseer . apis . models . v1 import Models
models = Models ( api )
2023-06-22 00:04:45 +00:00
handle_bad_request = api . errorhandler ( e . BadRequest ) ( e . handle_bad_requests )
handle_forbidden = api . errorhandler ( e . Forbidden ) ( e . handle_bad_requests )
2023-06-22 00:32:08 +00:00
handle_unauthorized = api . errorhandler ( e . Unauthorized ) ( e . handle_bad_requests )
handle_not_found = api . errorhandler ( e . NotFound ) ( e . handle_bad_requests )
2023-06-22 00:04:45 +00:00
2023-06-20 17:47:56 +00:00
# Used to for the flask limiter, to limit requests per url paths
def get_request_path ( ) :
# logger.info(dir(request))
return f " { request . remote_addr } @ { request . method } @ { request . path } "
2023-06-21 17:37:34 +00:00
class Suspicions ( Resource ) :
2023-06-20 17:47:56 +00:00
get_parser = reqparse . RequestParser ( )
get_parser . add_argument ( " Client-Agent " , default = " unknown:0:unknown " , type = str , required = False , help = " The client name and version. " , location = " headers " )
2023-06-20 23:57:30 +00:00
get_parser . add_argument ( " activity_suspicion " , required = False , default = 20 , type = int , help = " How many users per local post+comment to consider suspicious " , location = " args " )
2023-06-20 22:41:13 +00:00
get_parser . add_argument ( " csv " , required = False , type = bool , help = " Set to true to return just the domains as a csv. Mutually exclusive with domains " , location = " args " )
get_parser . add_argument ( " domains " , required = False , type = bool , help = " Set to true to return just the domains as a list. Mutually exclusive with csv " , location = " args " )
2023-06-20 17:47:56 +00:00
@api.expect ( get_parser )
@logger.catch ( reraise = True )
@cache.cached ( timeout = 10 , query_string = True )
2023-06-21 17:37:34 +00:00
@api.marshal_with ( models . response_model_model_Suspicions_get , code = 200 , description = ' Suspicious Instances ' , skip_none = True )
2023-06-20 17:47:56 +00:00
def get ( self ) :
''' A List with the details of all suspicious instances
'''
self . args = self . get_parser . parse_args ( )
2023-06-20 23:57:30 +00:00
sus_instances = retrieve_suspicious_instances ( self . args . activity_suspicion )
2023-06-20 22:33:37 +00:00
if self . args . csv :
return { " csv " : " , " . join ( [ instance [ " domain " ] for instance in sus_instances ] ) } , 200
if self . args . domains :
return { " domains " : [ instance [ " domain " ] for instance in sus_instances ] } , 200
return { " instances " : sus_instances } , 200
2023-06-21 17:37:34 +00:00