Compare commits

...

8 Commits

Author SHA1 Message Date
db0 eb5d179b6b feat: allow to update gui with github actions 2023-12-29 17:56:07 +01:00
db0 8cdb1854cd feat: allow to update gui with github actions 2023-12-29 17:53:26 +01:00
db0 531b0cb2c7 feat: allow to update gui with github actions 2023-12-29 17:53:09 +01:00
db0 d070d67636 feat: allow to update gui with github actions 2023-12-29 17:49:06 +01:00
db0 b7846862cf feat: allow to update gui with github actions 2023-12-29 17:46:51 +01:00
Divided by Zer0 36e9701735
Merge pull request #61 from Fediseer/config
Feat: config endpoint
2023-12-29 17:08:41 +01:00
db0 601c198ded feat: allow pushing new version via github actions 2023-12-29 17:07:59 +01:00
db0 e3d954d34c feat: Adds /config endpoint
Closes #31
2023-12-29 16:46:06 +01:00
17 changed files with 191 additions and 30 deletions

View File

@ -0,0 +1,37 @@
name: Deploy new fediseer API version
on:
workflow_dispatch:
permissions:
contents: write
pull-requests: read
jobs:
build-n-deploy:
name: Fediseer new API release
runs-on: ubuntu-latest
steps:
- name: "✔️ Checkout"
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Run playbook
uses: dawidd6/action-ansible-playbook@v2
with:
# Required, playbook filepath
playbook: ansible/fediseer_api_deploy.yml
# Optional, directory where playbooks live
directory: ./
# Optional, SSH private key
key: ${{secrets.SSH_PRIVATE_KEY}}
# Optional, SSH known hosts file content
known_hosts: |
${{secrets.SSH_FEDISEER_IP}} ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuk6apo8+3YzU6WQ7WYu4F/9Pf1Nc1w4QXTqLsIlTmd
# # Optional, encrypted vault password
# vault_password: ${{secrets.VAULT_PASSWORD}}
# Optional, galaxy requirements filepath
# requirements: galaxy-requirements.yml
# Optional, additional flags to pass to ansible-playbook
options: |
--inventory ansible/inventory.yml

View File

@ -0,0 +1,38 @@
name: Deploy new fediseer GUI version
on:
workflow_dispatch:
permissions:
contents: write
pull-requests: read
jobs:
build-n-deploy:
name: Fediseer new GUI release
runs-on: ubuntu-latest
steps:
- name: "✔️ Checkout"
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Run playbook
uses: dawidd6/action-ansible-playbook@v2
with:
# Required, playbook filepath
playbook: ansible/fediseer_gui_deploy.yml
# Optional, directory where playbooks live
directory: ./
# Optional, SSH private key
key: ${{secrets.SSH_CICD_PRIVKEY}}
# Optional, SSH known hosts file content
known_hosts: |
${{secrets.SSH_FEDISEER_IP}} ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuk6apo8+3YzU6WQ7WYu4F/9Pf1Nc1w4QXTqLsIlTmd
# # Optional, encrypted vault password
# vault_password: ${{secrets.VAULT_PASSWORD}}
# Optional, galaxy requirements filepath
# requirements: galaxy-requirements.yml
# Optional, additional flags to pass to ansible-playbook
options: |
--inventory ansible/inventory.yml
-e docker_compose_dir=${{secrets.DOCKER_COMPOSE_DIR}}

View File

@ -1,5 +1,9 @@
# Changelog
# 0.24.0
* Adds config endpoint
# 0.23.0
* Results will return the total count in the DB to help with pagination

View File

@ -0,0 +1,27 @@
---
- hosts: fediseer_api
gather_facts: false
tasks:
- name: Ensure we're on main branch
command: git checkout main
args:
chdir: fediseer/
tags:
- git
- name: Update branch
command: git pull
args:
chdir: fediseer/
tags:
- git
- name: Make sure a fediseer service unit is restarted
ansible.builtin.systemd_service:
state: restarted
name: fediseer_systemd_10001
scope: user
tags:
- service

View File

@ -0,0 +1,15 @@
---
- hosts: fediseer_gui
gather_facts: true
tasks:
- name: start docker-compose
docker_compose:
project_src: "{{ docker_compose_dir }}"
state: present
pull: yes
remove_orphans: yes
tags:
- docker
- compose

View File

@ -0,0 +1,13 @@
---
all:
hosts:
fediseer_api:
ansible_host: 144.91.110.65
ansible_become: false
ansible_user: fediseer
fediseer_gui:
ansible_host: 144.91.110.65
ansible_become: true
ansible_user: cicd

View File

@ -25,6 +25,12 @@ class Models:
'domains': fields.List(fields.String(description="The suspicious domains as a list.")),
'csv': fields.String(description="The suspicious domains as a csv."),
})
self.response_model_model_Config_get = api.model('FediseerConfig', {
'max_guarantees': fields.Integer(description="The total amount of guarantees one instance can give", required=True),
'max_guarantors': fields.Integer(description="The total amount of guarantors one instance can have", required=True),
'max_config_actions_per_min': fields.Integer(description="The amount of config actions one instance can take per minute.", required=True),
'max_tags': fields.Integer(description="The maximum tags each instance can self-assign.", required=True),
})
self.response_model_instances = api.model('InstanceDetails', {
'id': fields.Integer(description="The instance id", example=1),
'domain': fields.String(description="The instance domain", example="lemmy.dbzer0.com"),

View File

@ -16,6 +16,7 @@ import fediseer.apis.v1.faq as faq
from fediseer.apis.v1.base import api
api.add_resource(base.Suspicions, "/instances")
api.add_resource(base.Config, "/config")
api.add_resource(find.FindInstance, "/find_instance")
api.add_resource(activitypub.User, "/user/<string:username>")
api.add_resource(activitypub.Inbox, "/inbox/<string:username>")

View File

@ -9,9 +9,9 @@ from fediseer.database import functions as database
from fediseer import exceptions as e
from fediseer.utils import hash_api_key
from fediseer.messaging import activitypub_pm
from pythorhead import Lemmy
from fediseer.fediverse import InstanceInfo
from fediseer.limiter import limiter
from fediseer import consts
api = Namespace('v1', 'API Version 1' )
@ -42,7 +42,6 @@ class Suspicions(Resource):
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")
@api.expect(get_parser)
@logger.catch(reraise=True)
@cache.cached(timeout=10, query_string=True)
@api.marshal_with(models.response_model_model_Suspicions_get, code=200, description='Suspicious Instances', skip_none=True)
def get(self):
@ -59,6 +58,24 @@ class Suspicions(Resource):
return {"domains": [instance["domain"] for instance in sus_instances]},200
return {"instances": sus_instances},200
class Config(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")
@api.expect(get_parser)
@cache.cached(timeout=600)
@api.marshal_with(models.response_model_model_Config_get, code=200, description='Fediseer config')
def get(self):
'''The current Fediseer configuration options
'''
self.args = self.get_parser.parse_args()
return {
'max_guarantees': consts.MAX_GUARANTEES,
'max_guarantors': consts.MAX_GUARANTORS,
'max_tags': consts.MAX_TAGS,
'max_config_actions_per_min': consts.MAX_CONFIG_ACTIONS_PER_MIN,
}, 200
# Debug
# from fediseer.flask import OVERSEER
# with OVERSEER.app_context():

View File

@ -2,7 +2,7 @@ from fediseer.apis.v1.base import *
from fediseer.classes.instance import Censure
from fediseer.utils import sanitize_string
from fediseer.classes.reports import Report
from fediseer import enums
from fediseer import enums, consts
from fediseer.register import ensure_instance_registered
class CensuresGiven(Resource):
@ -226,7 +226,7 @@ class Censures(Resource):
if instance.domain == domain:
raise e.BadRequest("You're a mad lad, but you can't censure yourself.")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
unbroken_chain, chainbreaker = database.has_unbroken_chain(instance.id)
if not unbroken_chain:
raise e.Forbidden(f"Guarantee chain for this instance has been broken. Chain ends at {chainbreaker.domain}!")
@ -291,7 +291,7 @@ class Censures(Resource):
if not instance:
raise e.NotFound(f"No Instance found matching provided API key and domain. Have you remembered to register it?")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
target_instance = database.find_instance_by_domain(domain=domain)
if not target_instance:
raise e.BadRequest("Instance from which to modify censure not found")
@ -400,7 +400,7 @@ class BatchCensures(Resource):
if database.instance_has_flag(instance.id,enums.InstanceFlags.RESTRICTED):
raise e.Forbidden("You cannot take this action as your instance is restricted")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
unbroken_chain, chainbreaker = database.has_unbroken_chain(instance.id)
if not unbroken_chain:
raise e.Forbidden(f"Guarantee chain for this instance has been broken. Chain ends at {chainbreaker.domain}!")

View File

@ -1,7 +1,7 @@
from fediseer.apis.v1.base import *
from fediseer.classes.instance import Endorsement,Censure
from fediseer.classes.reports import Report
from fediseer import enums
from fediseer import enums, consts
from fediseer.utils import sanitize_string
from fediseer.register import ensure_instance_registered
@ -198,7 +198,7 @@ class Endorsements(Resource):
if instance.domain == domain:
raise e.BadRequest("Nice try, but you can't endorse yourself.")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
unbroken_chain, chainbreaker = database.has_unbroken_chain(instance.id)
if not unbroken_chain:
raise e.Forbidden(f"Guarantee chain for this instance has been broken. Chain ends at {chainbreaker.domain}!")
@ -275,7 +275,7 @@ class Endorsements(Resource):
if not instance:
raise e.NotFound(f"No Instance found matching provided API key and domain. Have you remembered to register it?")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
target_instance = database.find_instance_by_domain(domain=domain)
if not target_instance:
raise e.BadRequest("Instance for which to modify endorsement not found")
@ -326,7 +326,7 @@ class Endorsements(Resource):
if not instance:
raise e.NotFound(f"No Instance found matching provided API key and domain. Have you remembered to register it?")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
target_instance = database.find_instance_by_domain(domain=domain)
if not target_instance:
raise e.BadRequest("Instance from which to withdraw endorsement not found")
@ -390,7 +390,7 @@ class BatchEndorsements(Resource):
if database.instance_has_flag(instance.id,enums.InstanceFlags.RESTRICTED):
raise e.Forbidden("You cannot take this action as your instance is restricted")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
unbroken_chain, chainbreaker = database.has_unbroken_chain(instance.id)
if not unbroken_chain:
raise e.Forbidden(f"Guarantee chain for this instance has been broken. Chain ends at {chainbreaker.domain}!")

View File

@ -1,7 +1,7 @@
from fediseer.apis.v1.base import *
from fediseer.classes.instance import Guarantee, RejectionRecord, Solicitation, InstanceFlag
from fediseer.classes.reports import Report
from fediseer import enums
from fediseer import enums, consts
from fediseer.register import ensure_instance_registered
class Guarantors(Resource):
@ -74,7 +74,7 @@ class Guarantees(Resource):
def put(self, domain):
'''Guarantee an instance
A instance can only be guaranteed by one other instance
An instance can guarantee up to 20 other instances
An instance can guarantee up to consts.MAX_GUARANTEES other instances
A guaranteed instance can guarantee and endorse other instances.
'''
self.args = self.put_parser.parse_args()
@ -85,12 +85,12 @@ class Guarantees(Resource):
raise e.NotFound(f"No Instance found matching provided API key and domain. Have you remembered to register it?")
if len(instance.guarantors) == 0:
raise e.Forbidden("Only guaranteed instances can guarantee others.")
if len(instance.guarantees) >= 20 and instance.id != 0:
raise e.Forbidden("You cannot guarantee for more than 20 instances")
if len(instance.guarantees) >= consts.MAX_GUARANTEES and instance.id != 0:
raise e.Forbidden(f"You cannot guarantee for more than {consts.MAX_GUARANTEES} instances")
if database.instance_has_flag(instance.id,enums.InstanceFlags.RESTRICTED):
raise e.Forbidden("You cannot take this action as your instance is restricted")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
unbroken_chain, chainbreaker = database.has_unbroken_chain(instance.id)
if not unbroken_chain:
raise e.Forbidden(f"Guarantee chain for this instance has been broken. Chain ends at {chainbreaker.domain}!")
@ -168,7 +168,7 @@ class Guarantees(Resource):
if not instance:
raise e.NotFound(f"No Instance found matching provided API key and domain. Have you remembered to register it?")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
target_instance = database.find_instance_by_domain(domain=domain)
if not target_instance:
raise e.BadRequest("Instance from which to withdraw endorsement not found")

View File

@ -2,7 +2,7 @@ from fediseer.apis.v1.base import *
from fediseer.classes.instance import Hesitation
from fediseer.utils import sanitize_string
from fediseer.classes.reports import Report
from fediseer import enums
from fediseer import enums, consts
from fediseer.register import ensure_instance_registered
class HesitationsGiven(Resource):
@ -208,7 +208,7 @@ class Hesitations(Resource):
if instance.domain == domain:
raise e.BadRequest("You're a mad lad, but you can't hesitation yourself.")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
unbroken_chain, chainbreaker = database.has_unbroken_chain(instance.id)
if not unbroken_chain:
raise e.Forbidden(f"Guarantee chain for this instance has been broken. Chain ends at {chainbreaker.domain}!")
@ -274,7 +274,7 @@ class Hesitations(Resource):
if not instance:
raise e.NotFound(f"No Instance found matching provided API key and domain. Have you remembered to register it?")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
target_instance = database.find_instance_by_domain(domain=domain)
if not target_instance:
raise e.BadRequest("Instance from which to modify hesitation not found")
@ -330,7 +330,7 @@ class Hesitations(Resource):
if not instance:
raise e.NotFound(f"No Instance found matching provided API key and domain. Have you remembered to register it?")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
target_instance = database.find_instance_by_domain(domain=domain)
if not target_instance:
raise e.BadRequest("Instance from which to withdraw hesitation not found")
@ -383,7 +383,7 @@ class BatchHesitations(Resource):
if database.instance_has_flag(instance.id,enums.InstanceFlags.RESTRICTED):
raise e.Forbidden("You cannot take this action as your instance is restricted")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
unbroken_chain, chainbreaker = database.has_unbroken_chain(instance.id)
if not unbroken_chain:
raise e.Forbidden(f"Guarantee chain for this instance has been broken. Chain ends at {chainbreaker.domain}!")

View File

@ -2,7 +2,7 @@ from fediseer.apis.v1.base import *
from fediseer.classes.instance import Rebuttal
from fediseer.utils import sanitize_string
from fediseer.classes.reports import Report
from fediseer import enums
from fediseer import enums, consts
class Rebuttals(Resource):
decorators = [limiter.limit("45/minute"), limiter.limit("30/minute", key_func = get_request_path)]
@ -33,7 +33,7 @@ class Rebuttals(Resource):
if database.instance_has_flag(instance.id,enums.InstanceFlags.RESTRICTED):
raise e.Forbidden("You cannot take this action as your instance is restricted")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
unbroken_chain, chainbreaker = database.has_unbroken_chain(instance.id)
if not unbroken_chain:
raise e.Forbidden(f"Guarantee chain for this instance has been broken. Chain ends at {chainbreaker.domain}!")
@ -92,7 +92,7 @@ class Rebuttals(Resource):
if not instance:
raise e.NotFound(f"No Instance found matching provided API key and domain. Have you remembered to register it?")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
target_instance = database.find_instance_by_domain(domain=domain)
if not target_instance:
raise e.BadRequest("Instance from which to modify censure not found")

View File

@ -1,6 +1,6 @@
from fediseer.apis.v1.base import *
from fediseer.messaging import activitypub_pm
from fediseer import enums
from fediseer import enums, consts
from fediseer.classes.instance import Solicitation
from fediseer.classes.reports import Report
@ -56,7 +56,7 @@ class Solicitations(Resource):
if instance.is_guaranteed():
raise e.BadRequest(f"Your instance is already guaranteed by {instance.get_guarantor().domain}")
if database.has_too_many_actions_per_min(instance.domain):
raise e.TooManyRequests("Your instance is doing more than 20 actions per minute. Please slow down.")
raise e.TooManyRequests(f"Your instance is doing more than {consts.MAX_CONFIG_ACTIONS_PER_MIN} actions per minute. Please slow down.")
guarantor_instance = None
if self.args.guarantor:
guarantor_instance = database.find_instance_by_domain(self.args.guarantor)

View File

@ -11,4 +11,7 @@ SUPPORTED_SOFTWARE = {
"mitra",
}
POLLS_PER_DAY=2
MAX_TAGS=100
MAX_TAGS=100
MAX_GUARANTEES=20
MAX_GUARANTORS=1 #TODO: Not implemented yet
MAX_CONFIG_ACTIONS_PER_MIN=20

View File

@ -7,7 +7,7 @@ from sqlalchemy.orm import joinedload
from fediseer.classes.instance import Instance, Endorsement, Guarantee, RejectionRecord, Censure, Hesitation, Solicitation, InstanceFlag, InstanceTag, Rebuttal
from fediseer.classes.user import Claim, User
from fediseer.classes.reports import Report
from fediseer import enums
from fediseer import enums, consts
def get_all_instance_query(
min_endorsements = 0,
@ -590,7 +590,7 @@ def has_too_many_actions_per_min(source_domain):
).filter(
Report.created > datetime.utcnow() - timedelta(minutes=1),
)
return query.count() > 20
return query.count() > consts.MAX_CONFIG_ACTIONS_PER_MIN
def get_instance_flag(instance_id, flag_enum):
query = InstanceFlag.query.filter(