oh boy, this sucks #194

This commit is contained in:
rimu 2024-06-05 13:21:41 +12:00
parent c902f28137
commit 3203ac5506
14 changed files with 155 additions and 152 deletions

View file

@ -255,7 +255,7 @@ def user_profile(actor):
server = current_app.config['SERVER_NAME']
actor_data = { "@context": default_context(),
"type": "Person" if not user.bot else "Service",
"id": user.profile_id(),
"id": user.public_url(),
"preferredUsername": actor.lower(),
"name": user.title if user.title else user.user_name,
"inbox": f"https://{server}/u/{actor.lower()}/inbox",
@ -264,8 +264,8 @@ def user_profile(actor):
"indexable": user.indexable,
"manuallyApprovesFollowers": False if not user.ap_manually_approves_followers else user.ap_manually_approves_followers,
"publicKey": {
"id": f"https://{server}/u/{actor.lower()}#main-key",
"owner": f"https://{server}/u/{actor.lower()}",
"id": f"{user.public_url()}#main-key",
"owner": user.public_url(),
"publicKeyPem": user.public_key # .replace("\n", "\\n") #LOOKSWRONG
},
"endpoints": {
@ -1187,13 +1187,13 @@ def announce_activity_to_followers(community, creator, activity):
announce_activity = {
'@context': default_context(),
"actor": community.profile_id(),
"actor": community.public_url(),
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"object": activity,
"cc": [
f"{community.profile_id()}/followers"
f"{community.public_url()}/followers"
],
"type": "Announce",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/announce/{gibberish(15)}"
@ -1390,7 +1390,7 @@ def process_user_follow_request(request_json, activitypublog_id, remote_user_id)
"type": "Accept",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/accept/" + gibberish(32)
}
if post_request(remote_user.ap_inbox_url, accept, local_user.private_key, f"{local_user.profile_id()}#main-key"):
if post_request(remote_user.ap_inbox_url, accept, local_user.private_key, f"{local_user.public_url()}#main-key"):
activity_log.result = 'success'
else:
activity_log.exception_message = 'Error sending Accept'
@ -1461,21 +1461,21 @@ def comment_ap(comment_id):
"@context": default_context(),
"type": "Note",
"id": reply.ap_id,
"attributedTo": reply.author.profile_id(),
"attributedTo": reply.author.public_url(),
"inReplyTo": reply.in_reply_to(),
"to": [
"https://www.w3.org/ns/activitystreams#Public",
reply.to()
],
"cc": [
reply.community.profile_id(),
reply.community.public_url(),
reply.author.followers_url()
],
'content': reply.body_html,
'mediaType': 'text/html',
'published': ap_datetime(reply.created_at),
'distinguished': False,
'audience': reply.community.profile_id(),
'audience': reply.community.public_url(),
'language': {
'identifier': reply.language_code(),
'name': reply.language_name()

View file

@ -133,14 +133,14 @@ def post_to_activity(post: Post, community: Community):
],
"object": {
"id": create_id,
"actor": post.author.profile_id() if post.author.is_local() else post.author.ap_public_url,
"actor": post.author.public_url(),
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"object": {
"type": "Page",
"id": post.ap_id,
"attributedTo": post.author.profile_id() if post.author.is_local() else post.author.ap_public_url,
"attributedTo": post.author.public_url(),
"to": [
f"https://{current_app.config['SERVER_NAME']}/c/{community.name}",
"https://www.w3.org/ns/activitystreams#Public"
@ -2283,7 +2283,7 @@ def lemmy_site_data():
"banned": admin.banned,
"published": admin.created.isoformat() + 'Z',
"updated": admin.created.isoformat() + 'Z',
"actor_id": admin.profile_id(),
"actor_id": admin.public_url(),
"local": True,
"deleted": admin.deleted,
"matrix_user_id": admin.matrix_user_id,
@ -2571,8 +2571,8 @@ def inform_followers_of_post_update_task(post_id: int, sending_instance_id: int)
update_json = {
'id': f"https://{current_app.config['SERVER_NAME']}/activities/update/{gibberish(15)}",
'type': 'Update',
'actor': post.author.profile_id(),
'audience': post.community.profile_id(),
'actor': post.author.public_url(),
'audience': post.community.public_url(),
'to': ['https://www.w3.org/ns/activitystreams#Public'],
'published': ap_datetime(utcnow()),
'cc': [
@ -2589,7 +2589,7 @@ def inform_followers_of_post_update_task(post_id: int, sending_instance_id: int)
for i in instances:
if sending_instance_id != i.id:
try:
post_request(i.inbox, update_json, post.author.private_key, post.author.profile_id() + '#main-key')
post_request(i.inbox, update_json, post.author.private_key, post.author.public_url() + '#main-key')
except Exception:
pass
@ -2600,6 +2600,6 @@ def inform_followers_of_post_update_task(post_id: int, sending_instance_id: int)
for i in instances:
if sending_instance_id != i.id:
try:
post_request(i.inbox, update_json, post.author.private_key, post.author.profile_id() + '#main-key')
post_request(i.inbox, update_json, post.author.private_key, post.author.public_url() + '#main-key')
except Exception:
pass

View file

@ -34,9 +34,9 @@ def unsubscribe_from_everything_then_delete_task(user_id):
instances = Instance.query.filter(Instance.dormant == False).all()
payload = {
"@context": default_context(),
"actor": user.profile_id(),
"id": f"{user.profile_id()}#delete",
"object": user.profile_id(),
"actor": user.public_url(),
"id": f"{user.public_url()}#delete",
"object": user.public_url(),
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
@ -44,7 +44,7 @@ def unsubscribe_from_everything_then_delete_task(user_id):
}
for instance in instances:
if instance.inbox and instance.online() and instance.id != 1: # instance id 1 is always the current instance
post_request(instance.inbox, payload, user.private_key, f"{user.profile_id()}#main-key")
post_request(instance.inbox, payload, user.private_key, f"{user.public_url()}#main-key")
sleep(5)
@ -57,15 +57,15 @@ def unsubscribe_from_everything_then_delete_task(user_id):
def unsubscribe_from_community(community, user):
undo_id = f"https://{current_app.config['SERVER_NAME']}/activities/undo/" + gibberish(15)
follow = {
"actor": f"https://{current_app.config['SERVER_NAME']}/u/{user.user_name}",
"to": [community.ap_profile_id],
"object": community.ap_profile_id,
"actor": user.public_url(),
"to": [community.public_url()],
"object": community.public_url(),
"type": "Follow",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/follow/{gibberish(15)}"
}
undo = {
'actor': user.profile_id(),
'to': [community.ap_profile_id],
'actor': user.public_url(),
'to': [community.public_url()],
'type': 'Undo',
'id': undo_id,
'object': follow
@ -74,7 +74,7 @@ def unsubscribe_from_community(community, user):
activity_json=json.dumps(undo), result='processing')
db.session.add(activity)
db.session.commit()
post_request(community.ap_inbox_url, undo, user.private_key, user.profile_id() + '#main-key')
post_request(community.ap_inbox_url, undo, user.private_key, user.public_url() + '#main-key')
activity.result = 'success'
db.session.commit()

View file

@ -30,26 +30,26 @@ def send_message(message: str, conversation_id: int) -> ChatMessage:
else:
# Federate reply
reply_json = {
"actor": current_user.profile_id(),
"actor": current_user.public_url(),
"id": f"https://{current_app.config['SERVER_NAME']}/activities/create/{gibberish(15)}",
"object": {
"attributedTo": current_user.profile_id(),
"attributedTo": current_user.public_url(),
"content": reply.body_html,
"id": f"https://{current_app.config['SERVER_NAME']}/private_message/{reply.id}",
"mediaType": "text/html",
"published": utcnow().isoformat() + 'Z', # Lemmy is inconsistent with the date format they use
"to": [
recipient.profile_id()
recipient.public_url()
],
"type": "ChatMessage"
},
"to": [
recipient.profile_id()
recipient.public_url()
],
"type": "Create"
}
success = post_request(recipient.ap_inbox_url, reply_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash(_('Message failed to send to %(name)s.', name=recipient.link()), 'error')

View file

@ -386,14 +386,14 @@ def subscribe(actor):
db.session.add(join_request)
db.session.commit()
follow = {
"actor": current_user.profile_id(),
"to": [community.ap_profile_id],
"object": community.ap_profile_id,
"actor": current_user.public_url(),
"to": [community.public_url()],
"object": community.public_url(),
"type": "Follow",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/follow/{join_request.id}"
}
success = post_request(community.ap_inbox_url, follow, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash(_("There was a problem while trying to communicate with remote server. If other people have already joined this community it won't matter."), 'error')
# for local communities, joining is instant
@ -426,21 +426,21 @@ def unsubscribe(actor):
if '@' in actor: # this is a remote community, so activitypub is needed
undo_id = f"https://{current_app.config['SERVER_NAME']}/activities/undo/" + gibberish(15)
follow = {
"actor": current_user.profile_id(),
"to": [community.ap_profile_id],
"object": community.ap_profile_id,
"actor": current_user.public_url(),
"to": [community.public_url()],
"object": community.public_url(),
"type": "Follow",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/follow/{gibberish(15)}"
}
undo = {
'actor': current_user.profile_id(),
'to': [community.ap_profile_id],
'actor': current_user.public_url(),
'to': [community.public_url()],
'type': 'Undo',
'id': undo_id,
'object': follow
}
success = post_request(community.ap_inbox_url, undo, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('There was a problem while trying to unsubscribe', 'error')
@ -478,14 +478,14 @@ def join_then_add(actor):
db.session.add(join_request)
db.session.commit()
follow = {
"actor": current_user.profile_id(),
"to": [community.ap_profile_id],
"object": community.ap_profile_id,
"actor": current_user.public_url(),
"to": [community.public_url()],
"object": community.public_url(),
"type": "Follow",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/follow/{join_request.id}"
}
success = post_request(community.ap_inbox_url, follow, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
member = CommunityMember(user_id=current_user.id, community_id=community.id)
db.session.add(member)
db.session.commit()
@ -952,7 +952,7 @@ def federate_post(community, post):
page['oneOf' if poll.mode == 'single' else 'anyOf'] = choices
if not community.is_local(): # this is a remote community - send the post to the instance that hosts it
success = post_request(community.ap_inbox_url, create, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if success:
flash(_('Your post to %(name)s has been made.', name=community.title))
else:
@ -1067,7 +1067,7 @@ def federate_post_to_user_followers(post):
instances = Instance.query.join(User, User.instance_id == Instance.id).join(UserFollower, UserFollower.remote_user_id == User.id)
instances = instances.filter(UserFollower.local_user_id == post.user_id).filter(Instance.gone_forever == False)
for i in instances:
post_request(i.inbox, create, current_user.private_key, current_user.profile_id() + '#main-key')
post_request(i.inbox, create, current_user.private_key, current_user.public_url() + '#main-key')
@bp.route('/community/<int:community_id>/report', methods=['GET', 'POST'])

View file

@ -548,9 +548,9 @@ def delete_post_from_community_task(post_id):
delete_json = {
'id': f"https://{current_app.config['SERVER_NAME']}/activities/delete/{gibberish(15)}",
'type': 'Delete',
'actor': current_user.profile_id(),
'audience': post.community.profile_id(),
'to': [post.community.profile_id(), 'https://www.w3.org/ns/activitystreams#Public'],
'actor': current_user.public_url(),
'audience': post.community.public_url(),
'to': [post.community.public_url(), 'https://www.w3.org/ns/activitystreams#Public'],
'published': ap_datetime(utcnow()),
'cc': [
current_user.followers_url()
@ -560,7 +560,7 @@ def delete_post_from_community_task(post_id):
if not post.community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(post.community.ap_inbox_url, delete_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
else: # local community - send it to followers on remote instances
announce = {
"id": f"https://{current_app.config['SERVER_NAME']}/activities/announce/{gibberish(15)}",
@ -608,9 +608,9 @@ def delete_post_reply_from_community_task(post_reply_id):
delete_json = {
'id': f"https://{current_app.config['SERVER_NAME']}/activities/delete/{gibberish(15)}",
'type': 'Delete',
'actor': current_user.profile_id(),
'audience': post.community.profile_id(),
'to': [post.community.profile_id(), 'https://www.w3.org/ns/activitystreams#Public'],
'actor': current_user.public_url(),
'audience': post.community.public_url(),
'to': [post.community.public_url(), 'https://www.w3.org/ns/activitystreams#Public'],
'published': ap_datetime(utcnow()),
'cc': [
current_user.followers_url()
@ -620,7 +620,7 @@ def delete_post_reply_from_community_task(post_reply_id):
if not post.community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(post.community.ap_inbox_url, delete_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
else: # local community - send it to followers on remote instances
announce = {

View file

@ -756,7 +756,7 @@ class User(UserMixin, db.Model):
if self.ap_followers_url:
return self.ap_followers_url
else:
return self.profile_id() + '/followers'
return self.public_url() + '/followers'
def get_reset_password_token(self, expires_in=600):
return jwt.encode(
@ -1118,6 +1118,9 @@ class PostReply(db.Model):
else:
return f"https://{current_app.config['SERVER_NAME']}/comment/{self.id}"
def public_url(self):
return self.profile_id()
# the ap_id of the parent object, whether it's another PostReply or a Post
def in_reply_to(self):
if self.parent_id is None:
@ -1129,10 +1132,10 @@ class PostReply(db.Model):
# the AP profile of the person who wrote the parent object, which could be another PostReply or a Post
def to(self):
if self.parent_id is None:
return self.post.author.profile_id()
return self.post.author.public_url()
else:
parent = PostReply.query.get(self.parent_id)
return parent.author.profile_id()
return parent.author.public_url()
def delete_dependencies(self):
for child_reply in self.child_replies():

View file

@ -145,7 +145,7 @@ def show_post(post_id: int):
# federation
reply_json = {
'type': 'Note',
'id': reply.profile_id(),
'id': reply.public_url(),
'attributedTo': current_user.public_url(),
'to': [
'https://www.w3.org/ns/activitystreams#Public'
@ -154,7 +154,7 @@ def show_post(post_id: int):
community.public_url(), post.author.public_url()
],
'content': reply.body_html,
'inReplyTo': post.profile_id(),
'inReplyTo': post.public_url(),
'mediaType': 'text/html',
'published': ap_datetime(utcnow()),
'distinguished': False,
@ -189,7 +189,7 @@ def show_post(post_id: int):
}
if not community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(community.ap_inbox_url, create_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send to remote instance', 'error')
else: # local community - send it to followers on remote instances
@ -215,12 +215,12 @@ def show_post(post_id: int):
if not post.author.is_local() and post.author.ap_domain != community.ap_domain:
if not community.is_local() or (community.is_local and not community.has_followers_from_domain(post.author.ap_domain)):
success = post_request(post.author.ap_inbox_url, create_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
# sending to shared inbox is good enough for Mastodon, but Lemmy will reject it the local community has no followers
personal_inbox = post.author.public_url() + '/inbox'
post_request(personal_inbox, create_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
return redirect(url_for('activitypub.post_ap', post_id=post_id)) # redirect to current page to avoid refresh resubmitting the form
else:
@ -387,26 +387,26 @@ def post_vote(post_id: int, vote_direction):
if not post.community.local_only:
if undo:
action_json = {
'actor': current_user.profile_id(),
'actor': current_user.public_url(),
'type': 'Undo',
'id': f"https://{current_app.config['SERVER_NAME']}/activities/undo/{gibberish(15)}",
'audience': post.community.profile_id(),
'audience': post.community.public_url(),
'object': {
'actor': current_user.profile_id(),
'object': post.profile_id(),
'actor': current_user.public_url(),
'object': post.public_url(),
'type': undo,
'id': f"https://{current_app.config['SERVER_NAME']}/activities/{undo.lower()}/{gibberish(15)}",
'audience': post.community.profile_id()
'audience': post.community.public_url()
}
}
else:
action_type = 'Like' if vote_direction == 'upvote' else 'Dislike'
action_json = {
'actor': current_user.profile_id(),
'object': post.profile_id(),
'actor': current_user.public_url(),
'object': post.public_url(),
'type': action_type,
'id': f"https://{current_app.config['SERVER_NAME']}/activities/{action_type.lower()}/{gibberish(15)}",
'audience': post.community.profile_id()
'audience': post.community.public_url()
}
if post.community.is_local():
announce = {
@ -415,7 +415,7 @@ def post_vote(post_id: int, vote_direction):
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"actor": post.community.ap_profile_id,
"actor": post.community.public_url(),
"cc": [
post.community.ap_followers_url
],
@ -427,7 +427,7 @@ def post_vote(post_id: int, vote_direction):
send_to_remote_instance(instance.id, post.community.id, announce)
else:
success = post_request_in_background(post.community.ap_inbox_url, action_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send vote', 'warning')
@ -499,26 +499,26 @@ def comment_vote(comment_id, vote_direction):
if not comment.community.local_only:
if undo:
action_json = {
'actor': current_user.profile_id(),
'actor': current_user.public_url(),
'type': 'Undo',
'id': f"https://{current_app.config['SERVER_NAME']}/activities/undo/{gibberish(15)}",
'audience': comment.community.profile_id(),
'audience': comment.community.public_url(),
'object': {
'actor': current_user.profile_id(),
'object': comment.profile_id(),
'actor': current_user.public_url(),
'object': comment.public_url(),
'type': undo,
'id': f"https://{current_app.config['SERVER_NAME']}/activities/{undo.lower()}/{gibberish(15)}",
'audience': comment.community.profile_id()
'audience': comment.community.public_url()
}
}
else:
action_type = 'Like' if vote_direction == 'upvote' else 'Dislike'
action_json = {
'actor': current_user.profile_id(),
'object': comment.profile_id(),
'actor': current_user.public_url(),
'object': comment.public_url(),
'type': action_type,
'id': f"https://{current_app.config['SERVER_NAME']}/activities/{action_type.lower()}/{gibberish(15)}",
'audience': comment.community.profile_id()
'audience': comment.community.public_url()
}
if comment.community.is_local():
announce = {
@ -539,7 +539,7 @@ def comment_vote(comment_id, vote_direction):
send_to_remote_instance(instance.id, comment.community.id, announce)
else:
success = post_request_in_background(comment.community.ap_inbox_url, action_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send vote', 'warning')
@ -592,7 +592,7 @@ def poll_vote(post_id):
'object': {
'attributedTo': current_user.public_url(),
'id': f"https://{current_app.config['SERVER_NAME']}/activities/vote/{gibberish(15)}",
'inReplyTo': post.profile_id(),
'inReplyTo': post.public_url(),
'name': pv.choice_text,
'to': post.author.public_url(),
'type': 'Note'
@ -602,7 +602,7 @@ def poll_vote(post_id):
}
try:
post_request(post.author.ap_inbox_url, pollvote_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
except Exception:
pass
@ -741,7 +741,7 @@ def add_reply(post_id: int, comment_id: int):
if not post.community.local_only:
reply_json = {
'type': 'Note',
'id': reply.profile_id(),
'id': reply.public_url(),
'attributedTo': current_user.public_url(),
'to': [
'https://www.w3.org/ns/activitystreams#Public'
@ -751,8 +751,8 @@ def add_reply(post_id: int, comment_id: int):
in_reply_to.author.public_url()
],
'content': reply.body_html,
'inReplyTo': in_reply_to.profile_id(),
'url': reply.profile_id(),
'inReplyTo': in_reply_to.public_url(),
'url': reply.public_url(),
'mediaType': 'text/html',
'published': ap_datetime(utcnow()),
'distinguished': False,
@ -793,7 +793,7 @@ def add_reply(post_id: int, comment_id: int):
]
if not post.community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(post.community.ap_inbox_url, create_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send reply', 'error')
else: # local community - send it to followers on remote instances
@ -819,12 +819,12 @@ def add_reply(post_id: int, comment_id: int):
if not in_reply_to.author.is_local() and in_reply_to.author.ap_domain != reply.community.ap_domain:
if not post.community.is_local() or (post.community.is_local and not post.community.has_followers_from_domain(in_reply_to.author.ap_domain)):
success = post_request(in_reply_to.author.ap_inbox_url, create_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
# sending to shared inbox is good enough for Mastodon, but Lemmy will reject it the local community has no followers
personal_inbox = in_reply_to.author.public_url() + '/inbox'
post_request(personal_inbox, create_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if reply.depth <= constants.THREAD_CUTOFF_DEPTH:
return redirect(url_for('activitypub.post_ap', post_id=post_id, _anchor=f'comment_{reply.id}'))
@ -1312,9 +1312,9 @@ def federate_post_update(post):
update_json = {
'id': f"https://{current_app.config['SERVER_NAME']}/activities/update/{gibberish(15)}",
'type': 'Update',
'actor': current_user.profile_id(),
'audience': post.community.profile_id(),
'to': [post.community.profile_id(), 'https://www.w3.org/ns/activitystreams#Public'],
'actor': current_user.public_url(),
'audience': post.community.public_url(),
'to': [post.community.public_url(), 'https://www.w3.org/ns/activitystreams#Public'],
'published': ap_datetime(utcnow()),
'cc': [
current_user.followers_url()
@ -1356,7 +1356,7 @@ def federate_post_update(post):
if not post.community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(post.community.ap_inbox_url, update_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send edit to remote server', 'error')
else: # local community - send it to followers on remote instances
@ -1458,7 +1458,7 @@ def federate_post_edit_to_user_followers(post):
instances = Instance.query.join(User, User.instance_id == Instance.id).join(UserFollower, UserFollower.remote_user_id == User.id)
instances = instances.filter(UserFollower.local_user_id == post.user_id)
for i in instances:
post_request(i.inbox, update, current_user.private_key, current_user.profile_id() + '#main-key')
post_request(i.inbox, update, current_user.private_key, current_user.public_url() + '#main-key')
@bp.route('/post/<int:post_id>/delete', methods=['GET', 'POST'])
@ -1483,9 +1483,9 @@ def post_delete(post_id: int):
delete_json = {
'id': f"https://{current_app.config['SERVER_NAME']}/activities/delete/{gibberish(15)}",
'type': 'Delete',
'actor': current_user.profile_id(),
'audience': post.community.profile_id(),
'to': [post.community.profile_id(), 'https://www.w3.org/ns/activitystreams#Public'],
'actor': current_user.public_url(),
'audience': post.community.public_url(),
'to': [post.community.public_url(), 'https://www.w3.org/ns/activitystreams#Public'],
'published': ap_datetime(utcnow()),
'cc': [
current_user.followers_url()
@ -1499,7 +1499,7 @@ def post_delete(post_id: int):
if not community.local_only:
if not post.community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(post.community.ap_inbox_url, delete_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send delete to remote server', 'error')
else: # local community - send it to followers on remote instances
@ -1527,7 +1527,7 @@ def post_delete(post_id: int):
instances = Instance.query.join(User, User.instance_id == Instance.id).join(UserFollower, UserFollower.remote_user_id == User.id)
instances = instances.filter(UserFollower.local_user_id == post.user_id)
for i in instances:
post_request(i.inbox, delete_json, current_user.private_key, current_user.profile_id() + '#main-key')
post_request(i.inbox, delete_json, current_user.private_key, current_user.public_url() + '#main-key')
return redirect(url_for('activitypub.community_profile', actor=community.ap_id if community.ap_id is not None else community.name))
@ -1543,14 +1543,14 @@ def post_restore(post_id: int):
# Federate un-delete
if post.is_local():
delete_json = {
"actor": current_user.profile_id(),
"actor": current_user.public_url(),
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"object": {
'id': f"https://{current_app.config['SERVER_NAME']}/activities/delete/{gibberish(15)}",
'type': 'Delete',
'actor': current_user.profile_id(),
'audience': post.community.profile_id(),
'to': [post.community.profile_id(), 'https://www.w3.org/ns/activitystreams#Public'],
'actor': current_user.public_url(),
'audience': post.community.public_url(),
'to': [post.community.public_url(), 'https://www.w3.org/ns/activitystreams#Public'],
'published': ap_datetime(utcnow()),
'cc': [
current_user.followers_url()
@ -1559,8 +1559,8 @@ def post_restore(post_id: int):
'uri': post.ap_id,
"summary": "bad post",
},
"cc": [post.community.profile_id()],
"audience": post.author.profile_id(),
"cc": [post.community.public_url()],
"audience": post.author.public_url(),
"type": "Undo",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/undo/{gibberish(15)}"
}
@ -1571,7 +1571,7 @@ def post_restore(post_id: int):
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"actor": post.community.ap_profile_id,
"actor": post.community.public_url(),
"cc": [
post.community.ap_followers_url
],
@ -1626,21 +1626,21 @@ def post_report(post_id: int):
if form.description.data:
summary += ' - ' + form.description.data
report_json = {
"actor": current_user.profile_id(),
"audience": post.community.profile_id(),
"actor": current_user.public_url(),
"audience": post.community.public_url(),
"content": None,
"id": f"https://{current_app.config['SERVER_NAME']}/activities/flag/{gibberish(15)}",
"object": post.ap_id,
"summary": summary,
"to": [
post.community.profile_id()
post.community.public_url()
],
"type": "Flag"
}
instance = Instance.query.get(post.community.instance_id)
if post.community.ap_inbox_url and not current_user.has_blocked_instance(instance.id) and not instance_banned(instance.domain):
success = post_request(post.community.ap_inbox_url, report_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send report to remote server', 'error')
@ -1762,14 +1762,14 @@ def post_reply_report(post_id: int, comment_id: int):
if form.description.data:
summary += ' - ' + form.description.data
report_json = {
"actor": current_user.profile_id(),
"audience": post.community.profile_id(),
"actor": current_user.public_url(),
"audience": post.community.public_url(),
"content": None,
"id": f"https://{current_app.config['SERVER_NAME']}/activities/flag/{gibberish(15)}",
"object": post_reply.ap_id,
"summary": summary,
"to": [
post.community.profile_id()
post.community.public_url()
],
"type": "Flag"
}
@ -1777,7 +1777,7 @@ def post_reply_report(post_id: int, comment_id: int):
if post.community.ap_inbox_url and not current_user.has_blocked_instance(
instance.id) and not instance_banned(instance.domain):
success = post_request(post.community.ap_inbox_url, report_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send report to remote server', 'error')
@ -1852,7 +1852,7 @@ def post_reply_edit(post_id: int, comment_id: int):
if not post.community.local_only:
reply_json = {
'type': 'Note',
'id': post_reply.profile_id(),
'id': post_reply.public_url(),
'attributedTo': current_user.public_url(),
'to': [
'https://www.w3.org/ns/activitystreams#Public'
@ -1862,8 +1862,8 @@ def post_reply_edit(post_id: int, comment_id: int):
in_reply_to.author.public_url()
],
'content': post_reply.body_html,
'inReplyTo': in_reply_to.profile_id(),
'url': post_reply.profile_id(),
'inReplyTo': in_reply_to.public_url(),
'url': post_reply.public_url(),
'mediaType': 'text/html',
'published': ap_datetime(post_reply.posted_at),
'updated': ap_datetime(post_reply.edited_at),
@ -1909,7 +1909,7 @@ def post_reply_edit(post_id: int, comment_id: int):
]
if not post.community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(post.community.ap_inbox_url, update_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send send edit to remote server', 'error')
else: # local community - send it to followers on remote instances
@ -1935,12 +1935,12 @@ def post_reply_edit(post_id: int, comment_id: int):
if not in_reply_to.author.is_local() and in_reply_to.author.ap_domain != post_reply.community.ap_domain:
if not post.community.is_local() or (post.community.is_local and not post.community.has_followers_from_domain(in_reply_to.author.ap_domain)):
success = post_request(in_reply_to.author.ap_inbox_url, update_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
# sending to shared inbox is good enough for Mastodon, but Lemmy will reject it the local community has no followers
personal_inbox = in_reply_to.author.public_url() + '/inbox'
post_request(personal_inbox, update_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
return redirect(url_for('activitypub.post_ap', post_id=post.id))
else:
@ -1978,9 +1978,9 @@ def post_reply_delete(post_id: int, comment_id: int):
delete_json = {
'id': f"https://{current_app.config['SERVER_NAME']}/activities/delete/{gibberish(15)}",
'type': 'Delete',
'actor': current_user.profile_id(),
'audience': post.community.profile_id(),
'to': [post.community.profile_id(), 'https://www.w3.org/ns/activitystreams#Public'],
'actor': current_user.public_url(),
'audience': post.community.public_url(),
'to': [post.community.public_url(), 'https://www.w3.org/ns/activitystreams#Public'],
'published': ap_datetime(utcnow()),
'cc': [
current_user.followers_url()
@ -1992,7 +1992,7 @@ def post_reply_delete(post_id: int, comment_id: int):
if not post.community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(post.community.ap_inbox_url, delete_json, current_user.private_key,
current_user.profile_id() + '#main-key')
current_user.public_url() + '#main-key')
if not success:
flash('Failed to send delete to remote server', 'error')
else: # local community - send it to followers on remote instances

View file

@ -38,7 +38,7 @@
</form>
<p class="mt-4">
{% if not user.is_local() %}
<a href="{{ user.profile_id() }}" class="btn btn-primary">View original profile</a>
<a href="{{ user.public_url() }}" class="btn btn-primary">View original profile</a>
{% endif %}
</p>
</div>

View file

@ -149,7 +149,7 @@
{% endif -%}
{% if not community.is_local() -%}
<ul>
<li><p><a href="{{ community.profile_id() }}">{{ _('View community on original server') }}</a></p></li>
<li><p><a href="{{ community.public_url() }}">{{ _('View community on original server') }}</a></p></li>
<li><p><a href="{{ url_for('community.retrieve_remote_post', community_id=community.id) }}">{{ _('Retrieve a post from the original server') }}</a></p></li>
</ul>
{% endif -%}

View file

@ -11,11 +11,11 @@
<div class="col-12 col-md-8 position-relative add_reply main_pane">
<fieldset class="coolfieldset mt-4"><legend class="w-auto">Original post</legend>
<h3>{{ post.title }}</h3>
{{ post.body_html | safe }}
{{ post.body_html|safe if post.body_html }}
</fieldset>
{% if comment %}
<fieldset class="coolfieldset mt-4"><legend class="w-auto">Comment you are replying to</legend>
{{ comment.body_html | safe}}
{{ comment.body_html|safe }}
</fieldset>
{% endif %}
<div class="position-relative">

View file

@ -273,11 +273,11 @@ def send_community_follow(community_id, join_request_id, user_id):
user = User.query.get(user_id)
community = Community.query.get(community_id)
follow = {
"actor": current_user.profile_id(),
"to": [community.ap_profile_id],
"object": community.ap_profile_id,
"actor": current_user.public_url(),
"to": [community.public_url()],
"object": community.public_url(),
"type": "Follow",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/follow/{join_request_id}"
}
success = post_request(community.ap_inbox_url, follow, user.private_key,
user.profile_id() + '#main-key')
user.public_url() + '#main-key')

View file

@ -560,9 +560,9 @@ def send_deletion_requests(user_id):
instances = Instance.query.filter(Instance.dormant == False).all()
payload = {
"@context": default_context(),
"actor": user.profile_id(),
"id": f"{user.profile_id()}#delete",
"object": user.profile_id(),
"actor": user.public_url(),
"id": f"{user.public_url()}#delete",
"object": user.public_url(),
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
@ -570,7 +570,7 @@ def send_deletion_requests(user_id):
}
for instance in instances:
if instance.inbox and instance.online() and instance.id != 1: # instance id 1 is always the current instance
post_request(instance.inbox, payload, user.private_key, f"{user.profile_id()}#main-key")
post_request(instance.inbox, payload, user.private_key, f"{user.public_url()}#main-key")
sleep(5)
@ -704,14 +704,14 @@ def import_settings_task(user_id, filename):
db.session.add(join_request)
db.session.commit()
follow = {
"actor": current_user.profile_id(),
"to": [community.ap_profile_id],
"object": community.ap_profile_id,
"actor": current_user.public_url(),
"to": [community.public_url()],
"object": community.public_url(),
"type": "Follow",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/follow/{join_request.id}"
}
success = post_request(community.ap_inbox_url, follow, user.private_key,
user.profile_id() + '#main-key')
user.public_url() + '#main-key')
if not success:
sleep(5) # give them a rest
else: # for local communities, joining is instant

View file

@ -27,9 +27,9 @@ def purge_user_then_delete_task(user_id):
delete_json = {
'id': f"https://{current_app.config['SERVER_NAME']}/activities/delete/{gibberish(15)}",
'type': 'Delete',
'actor': user.profile_id(),
'audience': post.community.profile_id(),
'to': [post.community.profile_id(), 'https://www.w3.org/ns/activitystreams#Public'],
'actor': user.public_url(),
'audience': post.community.public_url(),
'to': [post.community.public_url(), 'https://www.w3.org/ns/activitystreams#Public'],
'published': ap_datetime(utcnow()),
'cc': [
user.followers_url()
@ -39,7 +39,7 @@ def purge_user_then_delete_task(user_id):
if not post.community.is_local(): # this is a remote community, send it to the instance that hosts it
success = post_request(post.community.ap_inbox_url, delete_json, user.private_key,
user.profile_id() + '#main-key')
user.public_url() + '#main-key')
else: # local community - send it to followers on remote instances, using Announce
announce = {
@ -81,7 +81,7 @@ def purge_user_then_delete_task(user_id):
}
for instance in instances:
if instance.inbox and instance.id != 1:
post_request(instance.inbox, payload, user.private_key, user.profile_id() + '#main-key')
post_request(instance.inbox, payload, user.private_key, user.public_url() + '#main-key')
sleep(100) # wait a while for any related activitypub traffic to die down.
user.deleted = True
@ -93,15 +93,15 @@ def purge_user_then_delete_task(user_id):
def unsubscribe_from_community(community, user):
undo_id = f"https://{current_app.config['SERVER_NAME']}/activities/undo/" + gibberish(15)
follow = {
"actor": user.profile_id(),
"to": [community.ap_profile_id],
"object": community.ap_profile_id,
"actor": user.public_url(),
"to": [community.public_url()],
"object": community.public_url(),
"type": "Follow",
"id": f"https://{current_app.config['SERVER_NAME']}/activities/follow/{gibberish(15)}"
}
undo = {
'actor': user.profile_id(),
'to': [community.ap_profile_id],
'actor': user.public_url(),
'to': [community.public_url()],
'type': 'Undo',
'id': undo_id,
'object': follow
@ -110,7 +110,7 @@ def unsubscribe_from_community(community, user):
activity_json=json.dumps(undo), result='processing')
db.session.add(activity)
db.session.commit()
post_request(community.ap_inbox_url, undo, user.private_key, user.profile_id() + '#main-key')
post_request(community.ap_inbox_url, undo, user.private_key, user.public_url() + '#main-key')
activity.result = 'success'
db.session.commit()