mirror of
https://codeberg.org/rimu/pyfedi
synced 2025-01-23 19:36:56 -08:00
apf part 16: Block requests
This commit is contained in:
parent
9bca07504e
commit
dccecc15bc
2 changed files with 73 additions and 1 deletions
|
@ -25,7 +25,7 @@ from app.activitypub.util import public_key, users_total, active_half_year, acti
|
||||||
update_post_from_activity, undo_vote, undo_downvote, post_to_page, get_redis_connection, find_reported_object, \
|
update_post_from_activity, undo_vote, undo_downvote, post_to_page, get_redis_connection, find_reported_object, \
|
||||||
process_report, ensure_domains_match, can_edit, can_delete, remove_data_from_banned_user, resolve_remote_post, \
|
process_report, ensure_domains_match, can_edit, can_delete, remove_data_from_banned_user, resolve_remote_post, \
|
||||||
inform_followers_of_post_update, comment_model_to_json, restore_post_or_comment, ban_local_user, unban_local_user, \
|
inform_followers_of_post_update, comment_model_to_json, restore_post_or_comment, ban_local_user, unban_local_user, \
|
||||||
lock_post, log_incoming_ap, find_community_ap_id
|
lock_post, log_incoming_ap, find_community_ap_id, site_ban_remove_data
|
||||||
from app.utils import gibberish, get_setting, render_template, \
|
from app.utils import gibberish, get_setting, render_template, \
|
||||||
community_membership, ap_datetime, ip_address, can_downvote, \
|
community_membership, ap_datetime, ip_address, can_downvote, \
|
||||||
can_upvote, can_create_post, awaken_dormant_instance, shorten_string, can_create_post_reply, sha256_digest, \
|
can_upvote, can_create_post, awaken_dormant_instance, shorten_string, can_create_post_reply, sha256_digest, \
|
||||||
|
@ -759,6 +759,36 @@ def process_inbox_request(request_json, store_ap_json):
|
||||||
log_incoming_ap(request_json['id'], APLOG_REPORT, APLOG_IGNORED, request_json if store_ap_json else None, 'Report ignored due to missing content')
|
log_incoming_ap(request_json['id'], APLOG_REPORT, APLOG_IGNORED, request_json if store_ap_json else None, 'Report ignored due to missing content')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if request_json['type'] == 'Block': # remote site is banning one of their users
|
||||||
|
blocker = user
|
||||||
|
blocked_ap_id = request_json['object'].lower()
|
||||||
|
blocked = User.query.filter_by(ap_profile_id=blocked_ap_id).first()
|
||||||
|
if store_ap_json:
|
||||||
|
request_json['cc'] = [] # cut very long list of instances
|
||||||
|
if not blocked:
|
||||||
|
log_incoming_ap(request_json['id'], APLOG_USERBAN, APLOG_IGNORED, request_json if store_ap_json else None, 'Does not exist here')
|
||||||
|
return
|
||||||
|
block_from_ap_id = request_json['target']
|
||||||
|
remove_data = request_json['removeData'] if 'removeData' in request_json else False
|
||||||
|
|
||||||
|
# Lemmy currently only sends userbans for admins banning local users
|
||||||
|
# Banning remote users is hacked by banning them from every community of which they are a part
|
||||||
|
# There's plans to change this in the future though.
|
||||||
|
if not blocker.is_instance_admin() and not blocked.instance_id == blocker.instance_id:
|
||||||
|
log_incoming_ap(request_json['id'], APLOG_USERBAN, APLOG_FAILURE, request_json if store_ap_json else None, 'Does not have permission')
|
||||||
|
return
|
||||||
|
|
||||||
|
# request_json includes 'expires' and 'endTime' (same thing) but nowhere to record this and check in future for end in ban.
|
||||||
|
|
||||||
|
if remove_data == True:
|
||||||
|
site_ban_remove_data(blocker.id, blocked)
|
||||||
|
log_incoming_ap(request_json['id'], APLOG_USERBAN, APLOG_SUCCESS, request_json if store_ap_json else None)
|
||||||
|
else:
|
||||||
|
#blocked.banned = True # uncommented until there's a mechanism for processing ban expiry date
|
||||||
|
#db.session.commit()
|
||||||
|
log_incoming_ap(request_json['id'], APLOG_USERBAN, APLOG_IGNORED, request_json if store_ap_json else None, 'Banned, but content retained')
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
# -- below this point is code that will be incrementally replaced to use log_incoming_ap() instead --
|
# -- below this point is code that will be incrementally replaced to use log_incoming_ap() instead --
|
||||||
|
|
||||||
|
|
|
@ -1429,6 +1429,48 @@ def restore_post_or_comment(object_json, aplog_id):
|
||||||
aplog.exception_message = 'Unable to resolve restorer or target'
|
aplog.exception_message = 'Unable to resolve restorer or target'
|
||||||
|
|
||||||
|
|
||||||
|
def site_ban_remove_data(blocker_id, blocked):
|
||||||
|
replies = PostReply.query.filter_by(user_id=blocked.id, deleted=False)
|
||||||
|
for reply in replies:
|
||||||
|
reply.deleted = True
|
||||||
|
reply.deleted_by = blocker_id
|
||||||
|
if not blocked.bot:
|
||||||
|
reply.post.reply_count -= 1
|
||||||
|
reply.community.post_reply_count -= 1
|
||||||
|
blocked.reply_count = 0
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
posts = Post.query.filter_by(user_id=blocked.id, deleted=False)
|
||||||
|
for post in posts:
|
||||||
|
post.deleted = True
|
||||||
|
post.deleted_by = blocker_id
|
||||||
|
post.community.post_count -= 1
|
||||||
|
if post.url and post.cross_posts is not None:
|
||||||
|
old_cross_posts = Post.query.filter(Post.id.in_(post.cross_posts)).all()
|
||||||
|
post.cross_posts.clear()
|
||||||
|
for ocp in old_cross_posts:
|
||||||
|
if ocp.cross_posts is not None and post.id in ocp.cross_posts:
|
||||||
|
ocp.cross_posts.remove(post.id)
|
||||||
|
blocked.post_count = 0
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
# Delete all their images to save moderators from having to see disgusting stuff.
|
||||||
|
# Images attached to posts can't be restored, but site ban reversals don't have a 'removeData' field anyway.
|
||||||
|
files = File.query.join(Post).filter(Post.user_id == blocked.id).all()
|
||||||
|
for file in files:
|
||||||
|
file.delete_from_disk()
|
||||||
|
file.source_url = ''
|
||||||
|
if blocked.avatar_id:
|
||||||
|
blocked.avatar.delete_from_disk()
|
||||||
|
blocked.avatar.source_url = ''
|
||||||
|
if blocked.cover_id:
|
||||||
|
blocked.cover.delete_from_disk()
|
||||||
|
blocked.cover.source_url = ''
|
||||||
|
# blocked.banned = True # uncommented until there's a mechanism for processing ban expiry date
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
def remove_data_from_banned_user(deletor_ap_id, user_ap_id, target):
|
def remove_data_from_banned_user(deletor_ap_id, user_ap_id, target):
|
||||||
if current_app.debug:
|
if current_app.debug:
|
||||||
remove_data_from_banned_user_task(deletor_ap_id, user_ap_id, target)
|
remove_data_from_banned_user_task(deletor_ap_id, user_ap_id, target)
|
||||||
|
|
Loading…
Add table
Reference in a new issue