From 6fd6fdf35c358fd41db6564e268e478c816941ca Mon Sep 17 00:00:00 2001 From: db0 Date: Tue, 12 Sep 2023 13:23:53 +0200 Subject: [PATCH] feat: Can now provide receipts for censuresz --- fediseer/apis/models/v1.py | 2 ++ fediseer/apis/v1/censures.py | 22 +++++++++++++++++++--- fediseer/classes/instance.py | 1 + fediseer/database/functions.py | 5 ++++- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/fediseer/apis/models/v1.py b/fediseer/apis/models/v1.py index ffc08cf..54115eb 100644 --- a/fediseer/apis/models/v1.py +++ b/fediseer/apis/models/v1.py @@ -46,6 +46,7 @@ class Models: }) self.response_model_instances_censured = api.inherit('CensuredInstanceDetails', self.response_model_instances, { 'censure_reasons': fields.List(fields.String(description="The reasons instances have given for censuring this instance")), + 'censure_evidence': fields.List(fields.String(description="Evidence justifying this censure, typically should be one or more URLs.")), 'censure_count': fields.Integer(description="The amount of censures this instance has received from the reference instances"), }) self.response_model_model_Censures_get = api.model('CensuredInstances', { @@ -55,6 +56,7 @@ class Models: }) self.input_censures_modify = api.model('ModifyCensure', { 'reason': fields.String(required=False, description="The reason for this censure. No profanity or hate speech allowed!", example="csam"), + 'evidence': fields.String(required=False, description="The evidence for this censure. Typically URL but can be a long form of anything you feel appropriate.", example="https://link.to/your/evidence"), }) self.response_model_api_key_reset = api.model('ApiKeyReset', { "message": fields.String(default='OK',required=True, description="The result of this operation."), diff --git a/fediseer/apis/v1/censures.py b/fediseer/apis/v1/censures.py index ea42b2c..9c5c865 100644 --- a/fediseer/apis/v1/censures.py +++ b/fediseer/apis/v1/censures.py @@ -49,6 +49,7 @@ class CensuresGiven(Resource): if skip_instance: continue c_instance_details["censure_reasons"] = [censure.reason for censure in censures] + c_instance_details["censure_evidence"] = [censure.evidence for censure in censures if censure.evidence is not None] c_instance_details["censure_count"] = censure_count instance_details.append(c_instance_details) if self.args.csv: @@ -82,6 +83,7 @@ class Censures(Resource): c_instance_details = c_instance.get_details() if len(censures) > 0: c_instance_details["censure_reasons"] = [censure.reason for censure in censures] + c_instance_details["censure_evidence"] = [censure.evidence for censure in censures if censure.evidence is not None] instance_details.append(c_instance_details) if self.args.csv: return {"csv": ",".join([instance["domain"] for instance in instance_details])},200 @@ -93,6 +95,7 @@ class Censures(Resource): put_parser.add_argument("apikey", type=str, required=True, help="The sending instance's API key.", location='headers') put_parser.add_argument("Client-Agent", default="unknown:0:unknown", type=str, required=False, help="The client name and version.", location="headers") put_parser.add_argument("reason", default=None, type=str, required=False, location="json") + put_parser.add_argument("evidence", default=None, type=str, required=False, location="json") @api.expect(put_parser,models.input_censures_modify, validate=True) @@ -131,10 +134,14 @@ class Censures(Resource): reason = self.args.reason if reason is not None: reason = sanitize_string(reason) + evidence = self.args.evidence + if evidence is not None: + evidence = sanitize_string(evidence) new_censure = Censure( censuring_id=instance.id, censured_id=target_instance.id, reason=reason, + evidence=evidence, ) db.session.add(new_censure) new_report = Report( @@ -153,6 +160,7 @@ class Censures(Resource): patch_parser.add_argument("apikey", type=str, required=True, help="The sending instance's API key.", location='headers') patch_parser.add_argument("Client-Agent", default="unknown:0:unknown", type=str, required=False, help="The client name and version.", location="headers") patch_parser.add_argument("reason", default=None, type=str, required=False, location="json") + patch_parser.add_argument("evidence", default=None, type=str, required=False, location="json") @api.expect(patch_parser,models.input_censures_modify, validate=True) @@ -176,13 +184,21 @@ class Censures(Resource): censure = database.get_censure(target_instance.id,instance.id) if not censure: raise e.BadRequest(f"No censure found for {domain} from {instance.domain}") + changed = False reason = self.args.reason if reason is not None: reason = sanitize_string(reason) - logger.debug([censure.reason,reason]) - if censure.reason == reason: + if censure.reason != reason: + censure.reason = reason + changed = True + evidence = self.args.evidence + if evidence is not None: + evidence = sanitize_string(evidence) + if censure.evidence != evidence: + censure.evidence = evidence + changed = True + if changed is False: return {"message":'OK'}, 200 - censure.reason = reason new_report = Report( source_domain=instance.domain, target_domain=target_instance.domain, diff --git a/fediseer/classes/instance.py b/fediseer/classes/instance.py index 7326a2b..1ccbd0f 100644 --- a/fediseer/classes/instance.py +++ b/fediseer/classes/instance.py @@ -53,6 +53,7 @@ class Censure(db.Model): __table_args__ = (UniqueConstraint('censuring_id', 'censured_id', name='censures_censuring_id_censured_id'),) id = db.Column(db.Integer, primary_key=True) reason = db.Column(db.String(255), unique=False, nullable=True, index=False) + evidence = db.Column(db.Text, unique=False, nullable=True, index=False) censuring_id = db.Column(db.Integer, db.ForeignKey("instances.id", ondelete="CASCADE"), nullable=False) censuring_instance = db.relationship("Instance", back_populates="censures_given", foreign_keys=[censuring_id]) censured_id = db.Column(db.Integer, db.ForeignKey("instances.id", ondelete="CASCADE"), nullable=False) diff --git a/fediseer/database/functions.py b/fediseer/database/functions.py index 24f147b..8ade232 100644 --- a/fediseer/database/functions.py +++ b/fediseer/database/functions.py @@ -99,7 +99,10 @@ def get_all_censure_reasons_for_censured_id(censured_id, censuring_ids): Censure.censured_id == censured_id, Censure.censuring_id.in_(censuring_ids), ) - ).with_entities(Censure.reason) + ).with_entities( + Censure.reason, + Censure.evidence, + ) return query.all()