From 0cd7cf31cd36316dbde040d9144fa7f11073761a Mon Sep 17 00:00:00 2001 From: db0 Date: Mon, 26 Jun 2023 00:24:00 +0200 Subject: [PATCH 1/3] feat: find_instance --- fediseer/apis/models/v1.py | 8 +++++++- fediseer/apis/v1/__init__.py | 2 ++ fediseer/apis/v1/find.py | 24 ++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 fediseer/apis/v1/find.py diff --git a/fediseer/apis/models/v1.py b/fediseer/apis/models/v1.py index 9a0dcbb..e4879d6 100644 --- a/fediseer/apis/models/v1.py +++ b/fediseer/apis/models/v1.py @@ -38,4 +38,10 @@ class Models: 'instances': fields.List(fields.Nested(self.response_model_instances)), 'domains': fields.List(fields.String(description="The instance domains as a list.")), 'csv': fields.String(description="The instance domains as a csv."), - }) \ No newline at end of file + }) + self.response_model_model_Suspicions_get = api.model('SuspiciousInstances', { + 'self': fields.Nested(self.response_model_instances), + 'guaranteed': fields.List(fields.Nested(self.response_model_instances)), + 'endorsed': fields.List(fields.String(description="The suspicious domains as a list.")), + 'endorsing': fields.String(description="The suspicious domains as a csv."), + }) diff --git a/fediseer/apis/v1/__init__.py b/fediseer/apis/v1/__init__.py index c999cb4..9742f26 100644 --- a/fediseer/apis/v1/__init__.py +++ b/fediseer/apis/v1/__init__.py @@ -3,9 +3,11 @@ import fediseer.apis.v1.whitelist as whitelist import fediseer.apis.v1.endorsements as endorsements import fediseer.apis.v1.guarantees as guarantees import fediseer.apis.v1.activitypub as activitypub +import fediseer.apis.v1.find as find from fediseer.apis.v1.base import api api.add_resource(base.Suspicions, "/instances") +api.add_resource(find.FindInstance, "/find_instance") api.add_resource(activitypub.User, "/user/") api.add_resource(activitypub.Inbox, "/inbox/") api.add_resource(whitelist.Whitelist, "/whitelist") diff --git a/fediseer/apis/v1/find.py b/fediseer/apis/v1/find.py new file mode 100644 index 0000000..c69dfe5 --- /dev/null +++ b/fediseer/apis/v1/find.py @@ -0,0 +1,24 @@ +from fediseer.apis.v1.base import * + + +class FindInstance(Resource): + + get_parser = reqparse.RequestParser() + get_parser.add_argument("apikey", type=str, required=True, help="The sending instance's API key.", location='headers') + get_parser.add_argument("Client-Agent", default="unknown:0:unknown", type=str, required=False, help="The client name and version.", location="headers") + + + @api.expect(get_parser) + @api.marshal_with(models.response_model_instances, code=200, description='Instance', skip_none=True) + @api.response(401, 'Invalid API Key', models.response_model_error) + def get(self): + '''Retrieve instance information via API Key + ''' + self.args = self.get_parser.parse_args() + if not self.args.apikey: + raise e.Unauthorized("You must provide the API key that was PM'd admin account") + user = database.find_user_by_api_key(self.args.apikey) + if not user: + raise e.NotFound("API key not found. Please Claim an instance first and use the API key that is PM'd to you") + instance = database.find_instance_by_user(user) + return instance.get_details(),200 From 4227f163a48d6138e69347d28fc1fc2b34d90a0e Mon Sep 17 00:00:00 2001 From: db0 Date: Mon, 26 Jun 2023 00:26:02 +0200 Subject: [PATCH 2/3] feat: report claimed --- fediseer/apis/models/v1.py | 1 + fediseer/classes/instance.py | 1 + 2 files changed, 2 insertions(+) diff --git a/fediseer/apis/models/v1.py b/fediseer/apis/models/v1.py index e4879d6..64e8fe4 100644 --- a/fediseer/apis/models/v1.py +++ b/fediseer/apis/models/v1.py @@ -28,6 +28,7 @@ class Models: 'id': fields.Integer(description="The instance id", example=1), 'domain': fields.String(description="The instance domain", example="lemmy.dbzer0.com"), 'software': fields.String(description="The fediverse software running in this instance", example="lemmy"), + 'claimed': fields.Integer(description="How many admins from this instance has claimed it."), 'open_registrations': fields.Boolean(description="The instance uptime pct. 100% and thousand of users is unlikely"), 'email_verify': fields.Boolean(description="The amount of local posts in that instance"), 'approvals': fields.Integer(description="The amount of endorsements this instance has given out"), diff --git a/fediseer/classes/instance.py b/fediseer/classes/instance.py index 5296656..ef7ea19 100644 --- a/fediseer/classes/instance.py +++ b/fediseer/classes/instance.py @@ -79,6 +79,7 @@ class Instance(db.Model): "id": self.id, "domain": self.domain, "software": self.software, + "claimed": len(self.admins), "open_registrations": self.open_registrations, "email_verify": self.email_verify, "endorsements": len(self.endorsements), From 5f8e3e558b9cc55ad90eb290fb6a829764a974b7 Mon Sep 17 00:00:00 2001 From: db0 Date: Mon, 26 Jun 2023 00:32:41 +0200 Subject: [PATCH 3/3] feat: report sus per monthly active user --- fediseer/apis/models/v1.py | 10 ++-------- fediseer/apis/v1/base.py | 3 ++- fediseer/observer.py | 7 ++++++- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fediseer/apis/models/v1.py b/fediseer/apis/models/v1.py index 64e8fe4..1fe369e 100644 --- a/fediseer/apis/models/v1.py +++ b/fediseer/apis/models/v1.py @@ -16,8 +16,8 @@ class Models: 'total_users': fields.Integer(description="The total amount of users registered in that instance"), 'active_users_monthly': fields.Integer(description="The amount of active users monthly."), 'signup': fields.Boolean(default=False,description="True when subscriptions are open, else False"), - 'activity_suspicion': fields.Float(description="Local Comments+Posts per User. Higher is worse"), - 'activity_suspicion': fields.Float(description="Local Comments+Posts per User. Higher is worse"), + 'activity_suspicion': fields.Float(description="Local Comments+Posts per user. Higher is worse"), + 'active_users_suspicion': fields.Float(description="Monthly active users per user. Higher is worse"), }) self.response_model_model_Suspicions_get = api.model('SuspiciousInstances', { 'instances': fields.List(fields.Nested(self.response_model_suspicious_instances)), @@ -40,9 +40,3 @@ class Models: 'domains': fields.List(fields.String(description="The instance domains as a list.")), 'csv': fields.String(description="The instance domains as a csv."), }) - self.response_model_model_Suspicions_get = api.model('SuspiciousInstances', { - 'self': fields.Nested(self.response_model_instances), - 'guaranteed': fields.List(fields.Nested(self.response_model_instances)), - 'endorsed': fields.List(fields.String(description="The suspicious domains as a list.")), - 'endorsing': fields.String(description="The suspicious domains as a csv."), - }) diff --git a/fediseer/apis/v1/base.py b/fediseer/apis/v1/base.py index 3f4abde..ccb4e2c 100644 --- a/fediseer/apis/v1/base.py +++ b/fediseer/apis/v1/base.py @@ -34,6 +34,7 @@ class Suspicions(Resource): 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") 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") + get_parser.add_argument("active_suspicion", required=False, default=500, type=int, help="How many users per active users to consider suspicious", location="args") 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") @@ -45,7 +46,7 @@ class Suspicions(Resource): '''A List with the details of all suspicious instances ''' self.args = self.get_parser.parse_args() - sus_instances = retrieve_suspicious_instances(self.args.activity_suspicion) + sus_instances = retrieve_suspicious_instances(self.args.activity_suspicion, self.args.active_suspicion) if self.args.csv: return {"csv": ",".join([instance["domain"] for instance in sus_instances])},200 if self.args.domains: diff --git a/fediseer/observer.py b/fediseer/observer.py index aae71c2..24dc6af 100644 --- a/fediseer/observer.py +++ b/fediseer/observer.py @@ -69,7 +69,11 @@ def retrieve_suspicious_instances(activity_suspicion = 20, active_suspicious = 5 # print(node) # check active users (monthly is a lot lower than total users) - if node["total_users"] / node["active_users_monthly"] > active_suspicious: + local_active_monthly_users = node["active_users_monthly"] + # Avoid division by 0 + if local_active_monthly_users == 0: + local_active_monthly_users= 0.5 + if node["total_users"] / local_active_monthly_users > active_suspicious: is_bad = True # print(node) @@ -83,6 +87,7 @@ def retrieve_suspicious_instances(activity_suspicion = 20, active_suspicious = 5 "active_users_monthly": node["active_users_monthly"], "signup": node["signup"], "activity_suspicion": node["total_users"] / local_activity, + "active_users_suspicion": node["total_users"] / local_active_monthly_users, } bad_nodes.append(bad_node) return bad_nodes