Redo inbox bookmark handling

merge-requests/30/head
Bob Mottram 2021-03-20 09:49:43 +00:00
parent 6f196d5fc3
commit 60276e70e9
5 changed files with 250 additions and 192 deletions

View File

@ -440,6 +440,8 @@ sounds off Turn off notification sounds
rp Repeat the last post rp Repeat the last post
like Like the last post like Like the last post
unlike Unlike the last post unlike Unlike the last post
bookmark Bookmark the last post
unbookmark Unbookmark the last post
reply Reply to the last post reply Reply to the last post
post Create a new post post Create a new post
post to [handle] Create a new direct message post to [handle] Create a new direct message

View File

@ -345,116 +345,6 @@ def undoBookmark(recentPostsCache: {},
return newUndoBookmarkJson return newUndoBookmarkJson
def outboxBookmark(recentPostsCache: {},
baseDir: str, httpPrefix: str,
nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None:
""" When a bookmark request is received by the outbox from c2s
"""
if not messageJson.get('type'):
if debug:
print('DEBUG: bookmark - no type')
return
if not messageJson['type'] == 'Bookmark':
if debug:
print('DEBUG: not a bookmark')
return
if not messageJson.get('object'):
if debug:
print('DEBUG: no object in bookmark')
return
if not isinstance(messageJson['object'], str):
if debug:
print('DEBUG: bookmark object is not string')
return
if messageJson.get('to'):
if not isinstance(messageJson['to'], list):
return
if len(messageJson['to']) != 1:
print('WARN: Bookmark should only be sent to one recipient')
return
if messageJson['to'][0] != messageJson['actor']:
print('WARN: Bookmark should be addressed to the same actor')
return
if debug:
print('DEBUG: c2s bookmark request arrived in outbox')
messageId = removeIdEnding(messageJson['object'])
if ':' in domain:
domain = domain.split(':')[0]
postFilename = locatePost(baseDir, nickname, domain, messageId)
if not postFilename:
if debug:
print('DEBUG: c2s bookmark post not found in inbox or outbox')
print(messageId)
return True
updateBookmarksCollection(recentPostsCache,
baseDir, postFilename, messageId,
messageJson['actor'], domain, debug)
if debug:
print('DEBUG: post bookmarked via c2s - ' + postFilename)
def outboxUndoBookmark(recentPostsCache: {},
baseDir: str, httpPrefix: str,
nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None:
""" When an undo bookmark request is received by the outbox from c2s
"""
if not messageJson.get('type'):
return
if not messageJson['type'] == 'Undo':
return
if not messageJson.get('object'):
return
if not isinstance(messageJson['object'], dict):
if debug:
print('DEBUG: undo bookmark object is not dict')
return
if not messageJson['object'].get('type'):
if debug:
print('DEBUG: undo bookmark - no type')
return
if not messageJson['object']['type'] == 'Bookmark':
if debug:
print('DEBUG: not a undo bookmark')
return
if not messageJson['object'].get('object'):
if debug:
print('DEBUG: no object in undo bookmark')
return
if not isinstance(messageJson['object']['object'], str):
if debug:
print('DEBUG: undo bookmark object is not string')
return
if messageJson.get('to'):
if not isinstance(messageJson['to'], list):
return
if len(messageJson['to']) != 1:
print('WARN: Bookmark should only be sent to one recipient')
return
if messageJson['to'][0] != messageJson['actor']:
print('WARN: Bookmark should be addressed to the same actor')
return
if debug:
print('DEBUG: c2s undo bookmark request arrived in outbox')
messageId = removeIdEnding(messageJson['object']['object'])
if ':' in domain:
domain = domain.split(':')[0]
postFilename = locatePost(baseDir, nickname, domain, messageId)
if not postFilename:
if debug:
print('DEBUG: c2s undo bookmark post not found in inbox or outbox')
print(messageId)
return True
undoBookmarksCollectionEntry(recentPostsCache,
baseDir, postFilename, messageId,
messageJson['actor'], domain, debug)
if debug:
print('DEBUG: post undo bookmarked via c2s - ' + postFilename)
def sendBookmarkViaServer(baseDir: str, session, def sendBookmarkViaServer(baseDir: str, session,
nickname: str, password: str, nickname: str, password: str,
domain: str, fromPort: int, domain: str, fromPort: int,
@ -617,3 +507,141 @@ def sendUndoBookmarkViaServer(baseDir: str, session,
print('DEBUG: c2s POST unbookmark success') print('DEBUG: c2s POST unbookmark success')
return newBookmarkJson return newBookmarkJson
def outboxBookmark(recentPostsCache: {},
baseDir: str, httpPrefix: str,
nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None:
""" When a bookmark request is received by the outbox from c2s
"""
if not messageJson.get('type'):
if debug:
print('DEBUG: bookmark - no type')
return
if not messageJson['type'] == 'Add':
if debug:
print('DEBUG: not a bookmark Add')
return
if not messageJson.get('actor'):
if debug:
print('DEBUG: no actor in bookmark Add')
return
if not messageJson.get('object'):
if debug:
print('DEBUG: no object in bookmark Add')
return
if not messageJson.get('target'):
if debug:
print('DEBUG: no target in bookmark Add')
return
if not isinstance(messageJson['object'], str):
if debug:
print('DEBUG: bookmark Add object is not string')
return
if not isinstance(messageJson['target'], str):
if debug:
print('DEBUG: bookmark Add target is not string')
return
domainFull = getFullDomain(domain, port)
if not messageJson['target'].endswith('://' + domainFull +
'/users/' + nickname +
'/tlbookmarks'):
if debug:
print('DEBUG: bookmark Add target invalid ' +
messageJson['target'])
return
if messageJson['object']['type'] != 'Document':
if debug:
print('DEBUG: bookmark Add type is not Document')
return
if not messageJson['object'].get('url'):
if debug:
print('DEBUG: bookmark Add missing url')
return
if debug:
print('DEBUG: c2s bookmark Add request arrived in outbox')
messageUrl = removeIdEnding(messageJson['object']['url'])
if ':' in domain:
domain = domain.split(':')[0]
postFilename = locatePost(baseDir, nickname, domain, messageUrl)
if not postFilename:
if debug:
print('DEBUG: c2s like post not found in inbox or outbox')
print(messageUrl)
return True
updateBookmarksCollection(recentPostsCache,
baseDir, postFilename, messageUrl,
messageJson['actor'], domain, debug)
if debug:
print('DEBUG: post bookmarked via c2s - ' + postFilename)
def outboxUndoBookmark(recentPostsCache: {},
baseDir: str, httpPrefix: str,
nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None:
""" When an undo bookmark request is received by the outbox from c2s
"""
if not messageJson.get('type'):
if debug:
print('DEBUG: unbookmark - no type')
return
if not messageJson['type'] == 'Remove':
if debug:
print('DEBUG: not an unbookmark Remove')
return
if not messageJson.get('actor'):
if debug:
print('DEBUG: no actor in unbookmark Remove')
return
if not messageJson.get('object'):
if debug:
print('DEBUG: no object in unbookmark Remove')
return
if not messageJson.get('target'):
if debug:
print('DEBUG: no target in unbookmark Remove')
return
if not isinstance(messageJson['object'], str):
if debug:
print('DEBUG: unbookmark Remove object is not string')
return
if not isinstance(messageJson['target'], str):
if debug:
print('DEBUG: unbookmark Remove target is not string')
return
domainFull = getFullDomain(domain, port)
if not messageJson['target'].endswith('://' + domainFull +
'/users/' + nickname +
'/tlbookmarks'):
if debug:
print('DEBUG: unbookmark Remove target invalid ' +
messageJson['target'])
return
if messageJson['object']['type'] != 'Document':
if debug:
print('DEBUG: unbookmark Remove type is not Document')
return
if not messageJson['object'].get('url'):
if debug:
print('DEBUG: unbookmark Remove missing url')
return
if debug:
print('DEBUG: c2s unbookmark Remove request arrived in outbox')
messageUrl = removeIdEnding(messageJson['object']['url'])
if ':' in domain:
domain = domain.split(':')[0]
postFilename = locatePost(baseDir, nickname, domain, messageUrl)
if not postFilename:
if debug:
print('DEBUG: c2s unbookmark post not found in inbox or outbox')
print(messageUrl)
return True
updateBookmarksCollection(recentPostsCache,
baseDir, postFilename, messageUrl,
messageJson['actor'], domain, debug)
if debug:
print('DEBUG: post unbookmarked via c2s - ' + postFilename)

View File

@ -68,6 +68,10 @@ def _desktopHelp() -> None:
'Like the last post') 'Like the last post')
print(indent + 'unlike ' + print(indent + 'unlike ' +
'Unlike the last post') 'Unlike the last post')
print(indent + 'bookmark ' +
'bookmark the last post')
print(indent + 'unbookmark ' +
'Unbookmark the last post')
print(indent + 'reply ' + print(indent + 'reply ' +
'Reply to the last post') 'Reply to the last post')
print(indent + 'post ' + print(indent + 'post ' +

186
inbox.py
View File

@ -1082,60 +1082,73 @@ def _receiveBookmark(recentPostsCache: {},
debug: bool) -> bool: debug: bool) -> bool:
"""Receives a bookmark activity within the POST section of HTTPServer """Receives a bookmark activity within the POST section of HTTPServer
""" """
if messageJson['type'] != 'Bookmark': if not messageJson.get('type'):
return False if debug:
print('DEBUG: inbox bookmark - no type')
return
if not messageJson['type'] == 'Add':
if debug:
print('DEBUG: not a inbox bookmark Add')
return
if not messageJson.get('actor'): if not messageJson.get('actor'):
if debug: if debug:
print('DEBUG: ' + messageJson['type'] + ' has no actor') print('DEBUG: no actor in inbox bookmark Add')
return False return
if not messageJson.get('object'): if not messageJson.get('object'):
if debug: if debug:
print('DEBUG: ' + messageJson['type'] + ' has no object') print('DEBUG: no object in inbox bookmark Add')
return False return
if not messageJson.get('target'):
if debug:
print('DEBUG: no target in inbox bookmark Add')
return
if not isinstance(messageJson['object'], str): if not isinstance(messageJson['object'], str):
if debug: if debug:
print('DEBUG: ' + messageJson['type'] + ' object is not a string') print('DEBUG: inbox bookmark Add object is not string')
return False return
if not messageJson.get('to'): if not isinstance(messageJson['target'], str):
if debug: if debug:
print('DEBUG: ' + messageJson['type'] + ' has no "to" list') print('DEBUG: inbox bookmark Add target is not string')
return False return
if '/users/' not in messageJson['actor']:
if debug:
print('DEBUG: "users" missing from actor in ' +
messageJson['type'])
return False
if '/statuses/' not in messageJson['object']:
if debug:
print('DEBUG: "statuses" missing from object in ' +
messageJson['type'])
return False
if domain not in handle.split('@')[1]:
if debug:
print('DEBUG: unrecognized domain ' + handle)
return False
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
nickname = handle.split('@')[0] nickname = handle.split('@')[0]
if not messageJson['actor'].endswith(domainFull + '/users/' + nickname): if not messageJson['actor'].endswith(domainFull + '/users/' + nickname):
if debug: if debug:
print('DEBUG: ' + print('DEBUG: inbox bookmark Add unexpected actor')
'bookmark actor should be the same as the handle sent to ' + return
handle + ' != ' + messageJson['actor']) if not messageJson['target'].endswith(messageJson['actor'] +
return False '/tlbookmarks'):
if not os.path.isdir(baseDir + '/accounts/' + handle): if debug:
print('DEBUG: unknown recipient of bookmark - ' + handle) print('DEBUG: inbox bookmark Add target invalid ' +
# if this post in the outbox of the person? messageJson['target'])
postFilename = locatePost(baseDir, nickname, domain, messageJson['object']) return
if messageJson['object']['type'] != 'Document':
if debug:
print('DEBUG: inbox bookmark Add type is not Document')
return
if not messageJson['object'].get('url'):
if debug:
print('DEBUG: inbox bookmark Add missing url')
return
if '/statuses/' not in messageJson['object']['url']:
if debug:
print('DEBUG: inbox bookmark Add missing statuses un url')
return
if debug:
print('DEBUG: c2s inbox bookmark Add request arrived in outbox')
messageUrl = removeIdEnding(messageJson['object']['url'])
if ':' in domain:
domain = domain.split(':')[0]
postFilename = locatePost(baseDir, nickname, domain, messageUrl)
if not postFilename: if not postFilename:
if debug: if debug:
print('DEBUG: post not found in inbox or outbox') print('DEBUG: c2s inbox like post not found in inbox or outbox')
print(messageJson['object']) print(messageUrl)
return True return True
if debug:
print('DEBUG: bookmarked post was found')
updateBookmarksCollection(recentPostsCache, baseDir, postFilename, updateBookmarksCollection(recentPostsCache, baseDir, postFilename,
messageJson['object'], messageJson['object']['url'],
messageJson['actor'], domain, debug) messageJson['actor'], domain, debug)
return True return True
@ -1148,63 +1161,74 @@ def _receiveUndoBookmark(recentPostsCache: {},
debug: bool) -> bool: debug: bool) -> bool:
"""Receives an undo bookmark activity within the POST section of HTTPServer """Receives an undo bookmark activity within the POST section of HTTPServer
""" """
if messageJson['type'] != 'Undo': if not messageJson.get('type'):
return False if debug:
print('DEBUG: inbox undo bookmark - no type')
return
if not messageJson['type'] == 'Remove':
if debug:
print('DEBUG: not a inbox undo bookmark Remove')
return
if not messageJson.get('actor'): if not messageJson.get('actor'):
return False if debug:
print('DEBUG: no actor in inbox undo bookmark Remove')
return
if not messageJson.get('object'): if not messageJson.get('object'):
return False
if not isinstance(messageJson['object'], dict):
return False
if not messageJson['object'].get('type'):
return False
if messageJson['object']['type'] != 'Bookmark':
return False
if not messageJson['object'].get('object'):
if debug: if debug:
print('DEBUG: ' + messageJson['type'] + ' like has no object') print('DEBUG: no object in inbox undo bookmark Remove')
return False return
if not isinstance(messageJson['object']['object'], str): if not messageJson.get('target'):
if debug: if debug:
print('DEBUG: ' + messageJson['type'] + print('DEBUG: no target in inbox undo bookmark Remove')
' like object is not a string') return
return False if not isinstance(messageJson['object'], str):
if '/users/' not in messageJson['actor']:
if debug: if debug:
print('DEBUG: "users" missing from actor in ' + print('DEBUG: inbox undo bookmark Remove object is not string')
messageJson['type'] + ' like') return
return False if not isinstance(messageJson['target'], str):
if '/statuses/' not in messageJson['object']['object']:
if debug: if debug:
print('DEBUG: "statuses" missing from like object in ' + print('DEBUG: inbox undo bookmark Remove target is not string')
messageJson['type']) return
return False
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
nickname = handle.split('@')[0] nickname = handle.split('@')[0]
if domain not in handle.split('@')[1]:
if debug:
print('DEBUG: unrecognized bookmark domain ' + handle)
return False
if not messageJson['actor'].endswith(domainFull + '/users/' + nickname): if not messageJson['actor'].endswith(domainFull + '/users/' + nickname):
if debug: if debug:
print('DEBUG: ' + print('DEBUG: inbox undo bookmark Remove unexpected actor')
'bookmark actor should be the same as the handle sent to ' + return
handle + ' != ' + messageJson['actor']) if not messageJson['target'].endswith(messageJson['actor'] +
return False '/tlbookmarks'):
if not os.path.isdir(baseDir + '/accounts/' + handle): if debug:
print('DEBUG: unknown recipient of bookmark undo - ' + handle) print('DEBUG: inbox undo bookmark Remove target invalid ' +
# if this post in the outbox of the person? messageJson['target'])
postFilename = locatePost(baseDir, nickname, domain, return
messageJson['object']['object']) if messageJson['object']['type'] != 'Document':
if debug:
print('DEBUG: inbox undo bookmark Remove type is not Document')
return
if not messageJson['object'].get('url'):
if debug:
print('DEBUG: inbox undo bookmark Remove missing url')
return
if '/statuses/' not in messageJson['object']['url']:
if debug:
print('DEBUG: inbox undo bookmark Remove missing statuses un url')
return
if debug:
print('DEBUG: c2s inbox undo bookmark Remove ' +
'request arrived in outbox')
messageUrl = removeIdEnding(messageJson['object']['url'])
if ':' in domain:
domain = domain.split(':')[0]
postFilename = locatePost(baseDir, nickname, domain, messageUrl)
if not postFilename: if not postFilename:
if debug: if debug:
print('DEBUG: unbookmarked post not found in inbox or outbox') print('DEBUG: c2s inbox like post not found in inbox or outbox')
print(messageJson['object']['object']) print(messageUrl)
return True return True
if debug:
print('DEBUG: bookmarked post found. Now undoing.')
undoBookmarksCollectionEntry(recentPostsCache, baseDir, postFilename, undoBookmarksCollectionEntry(recentPostsCache, baseDir, postFilename,
messageJson['object'], messageJson['object']['url'],
messageJson['actor'], domain, debug) messageJson['actor'], domain, debug)
return True return True

View File

@ -309,7 +309,7 @@ def postMessageToOutbox(session, translate: {},
permittedOutboxTypes = ('Create', 'Announce', 'Like', 'Follow', 'Undo', permittedOutboxTypes = ('Create', 'Announce', 'Like', 'Follow', 'Undo',
'Update', 'Add', 'Remove', 'Block', 'Delete', 'Update', 'Add', 'Remove', 'Block', 'Delete',
'Delegate', 'Skill', 'Bookmark', 'Event') 'Delegate', 'Skill', 'Add', 'Remove', 'Event')
if messageJson['type'] not in permittedOutboxTypes: if messageJson['type'] not in permittedOutboxTypes:
if debug: if debug:
print('DEBUG: POST to outbox - ' + messageJson['type'] + print('DEBUG: POST to outbox - ' + messageJson['type'] +