Snake case

merge-requests/30/head
Bob Mottram 2021-12-25 23:51:19 +00:00
parent 77fc7ddc8e
commit 49308fbcb5
17 changed files with 742 additions and 738 deletions

View File

@ -41,7 +41,7 @@ def _create_accept_reject(base_dir: str, federation_list: [],
domain = getFullDomain(domain, port) domain = getFullDomain(domain, port)
newAccept = { new_accept = {
"@context": "https://www.w3.org/ns/activitystreams", "@context": "https://www.w3.org/ns/activitystreams",
'type': acceptType, 'type': acceptType,
'actor': localActorUrl(http_prefix, nickname, domain), 'actor': localActorUrl(http_prefix, nickname, domain),
@ -51,8 +51,8 @@ def _create_accept_reject(base_dir: str, federation_list: [],
} }
if ccUrl: if ccUrl:
if len(ccUrl) > 0: if len(ccUrl) > 0:
newAccept['cc'] = [ccUrl] new_accept['cc'] = [ccUrl]
return newAccept return new_accept
def createAccept(base_dir: str, federation_list: [], def createAccept(base_dir: str, federation_list: [],
@ -75,30 +75,30 @@ def createReject(base_dir: str, federation_list: [],
http_prefix, objectJson, 'Reject') http_prefix, objectJson, 'Reject')
def _acceptFollow(base_dir: str, domain: str, messageJson: {}, def _acceptFollow(base_dir: str, domain: str, message_json: {},
federation_list: [], debug: bool) -> None: federation_list: [], debug: bool) -> None:
"""Receiving a follow Accept activity """Receiving a follow Accept activity
""" """
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not messageJson['object']['type'] == 'Follow': if not message_json['object']['type'] == 'Follow':
if not messageJson['object']['type'] == 'Join': if not message_json['object']['type'] == 'Join':
return return
if debug: if debug:
print('DEBUG: receiving Follow activity') print('DEBUG: receiving Follow activity')
if not messageJson['object'].get('actor'): if not message_json['object'].get('actor'):
print('DEBUG: no actor in Follow activity') print('DEBUG: no actor in Follow activity')
return return
# no, this isn't a mistake # no, this isn't a mistake
if not hasObjectStringObject(messageJson, debug): if not hasObjectStringObject(message_json, debug):
return return
if not messageJson.get('to'): if not message_json.get('to'):
if debug: if debug:
print('DEBUG: No "to" parameter in follow Accept') print('DEBUG: No "to" parameter in follow Accept')
return return
if debug: if debug:
print('DEBUG: follow Accept received') print('DEBUG: follow Accept received')
thisActor = messageJson['object']['actor'] thisActor = message_json['object']['actor']
nickname = getNicknameFromActor(thisActor) nickname = getNicknameFromActor(thisActor)
if not nickname: if not nickname:
print('WARN: no nickname found in ' + thisActor) print('WARN: no nickname found in ' + thisActor)
@ -129,7 +129,7 @@ def _acceptFollow(base_dir: str, domain: str, messageJson: {},
print('Actual: ' + thisActor) print('Actual: ' + thisActor)
print('DEBUG: unrecognized actor ' + thisActor) print('DEBUG: unrecognized actor ' + thisActor)
return return
followedActor = messageJson['object']['object'] followedActor = message_json['object']['object']
followedDomain, port = getDomainFromActor(followedActor) followedDomain, port = getDomainFromActor(followedActor)
if not followedDomain: if not followedDomain:
print('DEBUG: no domain found within Follow activity object ' + print('DEBUG: no domain found within Follow activity object ' +
@ -183,35 +183,37 @@ def _acceptFollow(base_dir: str, domain: str, messageJson: {},
def receiveAcceptReject(session, base_dir: str, def receiveAcceptReject(session, base_dir: str,
http_prefix: str, domain: str, port: int, http_prefix: str, domain: str, port: int,
send_threads: [], postLog: [], cached_webfingers: {}, send_threads: [], postLog: [],
person_cache: {}, messageJson: {}, federation_list: [], cached_webfingers: {},
person_cache: {}, message_json: {},
federation_list: [],
debug: bool) -> bool: debug: bool) -> bool:
"""Receives an Accept or Reject within the POST section of HTTPServer """Receives an Accept or Reject within the POST section of HTTPServer
""" """
if messageJson['type'] != 'Accept' and messageJson['type'] != 'Reject': if message_json['type'] != 'Accept' and message_json['type'] != 'Reject':
return False return False
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return False return False
if not hasUsersPath(messageJson['actor']): if not hasUsersPath(message_json['actor']):
if debug: if debug:
print('DEBUG: "users" or "profile" missing from actor in ' + print('DEBUG: "users" or "profile" missing from actor in ' +
messageJson['type'] + '. Assuming single user instance.') message_json['type'] + '. Assuming single user instance.')
domain, tempPort = getDomainFromActor(messageJson['actor']) domain, tempPort = getDomainFromActor(message_json['actor'])
if not domainPermitted(domain, federation_list): if not domainPermitted(domain, federation_list):
if debug: if debug:
print('DEBUG: ' + messageJson['type'] + print('DEBUG: ' + message_json['type'] +
' from domain not permitted - ' + domain) ' from domain not permitted - ' + domain)
return False return False
nickname = getNicknameFromActor(messageJson['actor']) nickname = getNicknameFromActor(message_json['actor'])
if not nickname: if not nickname:
# single user instance # single user instance
nickname = 'dev' nickname = 'dev'
if debug: if debug:
print('DEBUG: ' + messageJson['type'] + print('DEBUG: ' + message_json['type'] +
' does not contain a nickname. ' + ' does not contain a nickname. ' +
'Assuming single user instance.') 'Assuming single user instance.')
# receive follow accept # receive follow accept
_acceptFollow(base_dir, domain, messageJson, federation_list, debug) _acceptFollow(base_dir, domain, message_json, federation_list, debug)
if debug: if debug:
print('DEBUG: Uh, ' + messageJson['type'] + ', I guess') print('DEBUG: Uh, ' + message_json['type'] + ', I guess')
return True return True

View File

@ -52,52 +52,52 @@ def isSelfAnnounce(post_json_object: {}) -> bool:
def outboxAnnounce(recentPostsCache: {}, def outboxAnnounce(recentPostsCache: {},
base_dir: str, messageJson: {}, debug: bool) -> bool: base_dir: str, message_json: {}, debug: bool) -> bool:
""" Adds or removes announce entries from the shares collection """ Adds or removes announce entries from the shares collection
within a given post within a given post
""" """
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return False return False
if not isinstance(messageJson['actor'], str): if not isinstance(message_json['actor'], str):
return False return False
if not messageJson.get('type'): if not message_json.get('type'):
return False return False
if not messageJson.get('object'): if not message_json.get('object'):
return False return False
if messageJson['type'] == 'Announce': if message_json['type'] == 'Announce':
if not isinstance(messageJson['object'], str): if not isinstance(message_json['object'], str):
return False return False
if isSelfAnnounce(messageJson): if isSelfAnnounce(message_json):
return False return False
nickname = getNicknameFromActor(messageJson['actor']) nickname = getNicknameFromActor(message_json['actor'])
if not nickname: if not nickname:
print('WARN: no nickname found in ' + messageJson['actor']) print('WARN: no nickname found in ' + message_json['actor'])
return False return False
domain, port = getDomainFromActor(messageJson['actor']) domain, port = getDomainFromActor(message_json['actor'])
postFilename = locatePost(base_dir, nickname, domain, postFilename = locatePost(base_dir, nickname, domain,
messageJson['object']) message_json['object'])
if postFilename: if postFilename:
updateAnnounceCollection(recentPostsCache, base_dir, postFilename, updateAnnounceCollection(recentPostsCache, base_dir, postFilename,
messageJson['actor'], message_json['actor'],
nickname, domain, debug) nickname, domain, debug)
return True return True
elif messageJson['type'] == 'Undo': elif message_json['type'] == 'Undo':
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return False return False
if messageJson['object']['type'] == 'Announce': if message_json['object']['type'] == 'Announce':
if not isinstance(messageJson['object']['object'], str): if not isinstance(message_json['object']['object'], str):
return False return False
nickname = getNicknameFromActor(messageJson['actor']) nickname = getNicknameFromActor(message_json['actor'])
if not nickname: if not nickname:
print('WARN: no nickname found in ' + messageJson['actor']) print('WARN: no nickname found in ' + message_json['actor'])
return False return False
domain, port = getDomainFromActor(messageJson['actor']) domain, port = getDomainFromActor(message_json['actor'])
postFilename = locatePost(base_dir, nickname, domain, postFilename = locatePost(base_dir, nickname, domain,
messageJson['object']['object']) message_json['object']['object'])
if postFilename: if postFilename:
undoAnnounceCollectionEntry(recentPostsCache, undoAnnounceCollectionEntry(recentPostsCache,
base_dir, postFilename, base_dir, postFilename,
messageJson['actor'], message_json['actor'],
domain, debug) domain, debug)
return True return True
return False return False
@ -389,25 +389,25 @@ def sendUndoAnnounceViaServer(base_dir: str, session,
def outboxUndoAnnounce(recentPostsCache: {}, def outboxUndoAnnounce(recentPostsCache: {},
base_dir: str, http_prefix: str, base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When an undo announce is received by the outbox from c2s """ When an undo announce is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not messageJson['type'] == 'Undo': if not message_json['type'] == 'Undo':
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not messageJson['object']['type'] == 'Announce': if not message_json['object']['type'] == 'Announce':
if debug: if debug:
print('DEBUG: not a undo announce') print('DEBUG: not a undo announce')
return return
if not hasObjectStringObject(messageJson, debug): if not hasObjectStringObject(message_json, debug):
return return
if debug: if debug:
print('DEBUG: c2s undo announce request arrived in outbox') print('DEBUG: c2s undo announce request arrived in outbox')
messageId = removeIdEnding(messageJson['object']['object']) messageId = removeIdEnding(message_json['object']['object'])
domain = removeDomainPort(domain) domain = removeDomainPort(domain)
postFilename = locatePost(base_dir, nickname, domain, messageId) postFilename = locatePost(base_dir, nickname, domain, messageId)
if not postFilename: if not postFilename:
@ -416,6 +416,6 @@ def outboxUndoAnnounce(recentPostsCache: {},
print(messageId) print(messageId)
return True return True
undoAnnounceCollectionEntry(recentPostsCache, base_dir, postFilename, undoAnnounceCollectionEntry(recentPostsCache, base_dir, postFilename,
messageJson['actor'], domain, debug) message_json['actor'], domain, debug)
if debug: if debug:
print('DEBUG: post undo announce via c2s - ' + postFilename) print('DEBUG: post undo announce via c2s - ' + postFilename)

View File

@ -54,24 +54,24 @@ def getAvailability(base_dir: str, nickname: str, domain: str) -> str:
return None return None
def outboxAvailability(base_dir: str, nickname: str, messageJson: {}, def outboxAvailability(base_dir: str, nickname: str, message_json: {},
debug: bool) -> bool: debug: bool) -> bool:
"""Handles receiving an availability update """Handles receiving an availability update
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return False return False
if not messageJson['type'] == 'Availability': if not message_json['type'] == 'Availability':
return False return False
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return False return False
if not hasObjectString(messageJson, debug): if not hasObjectString(message_json, debug):
return False return False
actorNickname = getNicknameFromActor(messageJson['actor']) actorNickname = getNicknameFromActor(message_json['actor'])
if actorNickname != nickname: if actorNickname != nickname:
return False return False
domain, port = getDomainFromActor(messageJson['actor']) domain, port = getDomainFromActor(message_json['actor'])
status = messageJson['object'].replace('"', '') status = message_json['object'].replace('"', '')
return setAvailability(base_dir, nickname, domain, status) return setAvailability(base_dir, nickname, domain, status)

View File

@ -416,23 +416,23 @@ def isBlocked(base_dir: str, nickname: str, domain: str,
def outboxBlock(base_dir: str, http_prefix: str, def outboxBlock(base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> bool: message_json: {}, debug: bool) -> bool:
""" When a block request is received by the outbox from c2s """ When a block request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
if debug: if debug:
print('DEBUG: block - no type') print('DEBUG: block - no type')
return False return False
if not messageJson['type'] == 'Block': if not message_json['type'] == 'Block':
if debug: if debug:
print('DEBUG: not a block') print('DEBUG: not a block')
return False return False
if not hasObjectString(messageJson, debug): if not hasObjectString(message_json, debug):
return False return False
if debug: if debug:
print('DEBUG: c2s block request arrived in outbox') print('DEBUG: c2s block request arrived in outbox')
messageId = removeIdEnding(messageJson['object']) messageId = removeIdEnding(message_json['object'])
if '/statuses/' not in messageId: if '/statuses/' not in messageId:
if debug: if debug:
print('DEBUG: c2s block object is not a status') print('DEBUG: c2s block object is not a status')
@ -448,11 +448,11 @@ def outboxBlock(base_dir: str, http_prefix: str,
print('DEBUG: c2s block post not found in inbox or outbox') print('DEBUG: c2s block post not found in inbox or outbox')
print(messageId) print(messageId)
return False return False
nicknameBlocked = getNicknameFromActor(messageJson['object']) nicknameBlocked = getNicknameFromActor(message_json['object'])
if not nicknameBlocked: if not nicknameBlocked:
print('WARN: unable to find nickname in ' + messageJson['object']) print('WARN: unable to find nickname in ' + message_json['object'])
return False return False
domainBlocked, portBlocked = getDomainFromActor(messageJson['object']) domainBlocked, portBlocked = getDomainFromActor(message_json['object'])
domainBlockedFull = getFullDomain(domainBlocked, portBlocked) domainBlockedFull = getFullDomain(domainBlocked, portBlocked)
addBlock(base_dir, nickname, domain, addBlock(base_dir, nickname, domain,
@ -465,30 +465,30 @@ def outboxBlock(base_dir: str, http_prefix: str,
def outboxUndoBlock(base_dir: str, http_prefix: str, def outboxUndoBlock(base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When an undo block request is received by the outbox from c2s """ When an undo block request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
if debug: if debug:
print('DEBUG: undo block - no type') print('DEBUG: undo block - no type')
return return
if not messageJson['type'] == 'Undo': if not message_json['type'] == 'Undo':
if debug: if debug:
print('DEBUG: not an undo block') print('DEBUG: not an undo block')
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not messageJson['object']['type'] == 'Block': if not message_json['object']['type'] == 'Block':
if debug: if debug:
print('DEBUG: not an undo block') print('DEBUG: not an undo block')
return return
if not hasObjectStringObject(messageJson, debug): if not hasObjectStringObject(message_json, debug):
return return
if debug: if debug:
print('DEBUG: c2s undo block request arrived in outbox') print('DEBUG: c2s undo block request arrived in outbox')
messageId = removeIdEnding(messageJson['object']['object']) messageId = removeIdEnding(message_json['object']['object'])
if '/statuses/' not in messageId: if '/statuses/' not in messageId:
if debug: if debug:
print('DEBUG: c2s undo block object is not a status') print('DEBUG: c2s undo block object is not a status')
@ -504,12 +504,12 @@ def outboxUndoBlock(base_dir: str, http_prefix: str,
print('DEBUG: c2s undo block post not found in inbox or outbox') print('DEBUG: c2s undo block post not found in inbox or outbox')
print(messageId) print(messageId)
return return
nicknameBlocked = getNicknameFromActor(messageJson['object']['object']) nicknameBlocked = getNicknameFromActor(message_json['object']['object'])
if not nicknameBlocked: if not nicknameBlocked:
print('WARN: unable to find nickname in ' + print('WARN: unable to find nickname in ' +
messageJson['object']['object']) message_json['object']['object'])
return return
domainObject = messageJson['object']['object'] domainObject = message_json['object']['object']
domainBlocked, portBlocked = getDomainFromActor(domainObject) domainBlocked, portBlocked = getDomainFromActor(domainObject)
domainBlockedFull = getFullDomain(domainBlocked, portBlocked) domainBlockedFull = getFullDomain(domainBlocked, portBlocked)
@ -770,25 +770,25 @@ def unmutePost(base_dir: str, nickname: str, domain: str, port: int,
def outboxMute(base_dir: str, http_prefix: str, def outboxMute(base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool, message_json: {}, debug: bool,
recentPostsCache: {}) -> None: recentPostsCache: {}) -> None:
"""When a mute is received by the outbox from c2s """When a mute is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return return
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
if not messageJson['actor'].endswith(domainFull + '/users/' + nickname): if not message_json['actor'].endswith(domainFull + '/users/' + nickname):
return return
if not messageJson['type'] == 'Ignore': if not message_json['type'] == 'Ignore':
return return
if not hasObjectString(messageJson, debug): if not hasObjectString(message_json, debug):
return return
if debug: if debug:
print('DEBUG: c2s mute request arrived in outbox') print('DEBUG: c2s mute request arrived in outbox')
messageId = removeIdEnding(messageJson['object']) messageId = removeIdEnding(message_json['object'])
if '/statuses/' not in messageId: if '/statuses/' not in messageId:
if debug: if debug:
print('DEBUG: c2s mute object is not a status') print('DEBUG: c2s mute object is not a status')
@ -804,13 +804,13 @@ def outboxMute(base_dir: str, http_prefix: str,
print('DEBUG: c2s mute post not found in inbox or outbox') print('DEBUG: c2s mute post not found in inbox or outbox')
print(messageId) print(messageId)
return return
nicknameMuted = getNicknameFromActor(messageJson['object']) nicknameMuted = getNicknameFromActor(message_json['object'])
if not nicknameMuted: if not nicknameMuted:
print('WARN: unable to find nickname in ' + messageJson['object']) print('WARN: unable to find nickname in ' + message_json['object'])
return return
mutePost(base_dir, nickname, domain, port, mutePost(base_dir, nickname, domain, port,
http_prefix, messageJson['object'], recentPostsCache, http_prefix, message_json['object'], recentPostsCache,
debug) debug)
if debug: if debug:
@ -819,31 +819,31 @@ def outboxMute(base_dir: str, http_prefix: str,
def outboxUndoMute(base_dir: str, http_prefix: str, def outboxUndoMute(base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool, message_json: {}, debug: bool,
recentPostsCache: {}) -> None: recentPostsCache: {}) -> None:
"""When an undo mute is received by the outbox from c2s """When an undo mute is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return return
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
if not messageJson['actor'].endswith(domainFull + '/users/' + nickname): if not message_json['actor'].endswith(domainFull + '/users/' + nickname):
return return
if not messageJson['type'] == 'Undo': if not message_json['type'] == 'Undo':
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if messageJson['object']['type'] != 'Ignore': if message_json['object']['type'] != 'Ignore':
return return
if not isinstance(messageJson['object']['object'], str): if not isinstance(message_json['object']['object'], str):
if debug: if debug:
print('DEBUG: undo mute object is not a string') print('DEBUG: undo mute object is not a string')
return return
if debug: if debug:
print('DEBUG: c2s undo mute request arrived in outbox') print('DEBUG: c2s undo mute request arrived in outbox')
messageId = removeIdEnding(messageJson['object']['object']) messageId = removeIdEnding(message_json['object']['object'])
if '/statuses/' not in messageId: if '/statuses/' not in messageId:
if debug: if debug:
print('DEBUG: c2s undo mute object is not a status') print('DEBUG: c2s undo mute object is not a status')
@ -859,14 +859,14 @@ def outboxUndoMute(base_dir: str, http_prefix: str,
print('DEBUG: c2s undo mute post not found in inbox or outbox') print('DEBUG: c2s undo mute post not found in inbox or outbox')
print(messageId) print(messageId)
return return
nicknameMuted = getNicknameFromActor(messageJson['object']['object']) nicknameMuted = getNicknameFromActor(message_json['object']['object'])
if not nicknameMuted: if not nicknameMuted:
print('WARN: unable to find nickname in ' + print('WARN: unable to find nickname in ' +
messageJson['object']['object']) message_json['object']['object'])
return return
unmutePost(base_dir, nickname, domain, port, unmutePost(base_dir, nickname, domain, port,
http_prefix, messageJson['object']['object'], http_prefix, message_json['object']['object'],
recentPostsCache, debug) recentPostsCache, debug)
if debug: if debug:

View File

@ -553,45 +553,45 @@ def sendUndoBookmarkViaServer(base_dir: str, session,
def outboxBookmark(recentPostsCache: {}, def outboxBookmark(recentPostsCache: {},
base_dir: str, http_prefix: str, base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When a bookmark request is received by the outbox from c2s """ When a bookmark request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if messageJson['type'] != 'Add': if message_json['type'] != 'Add':
return return
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return return
if not messageJson.get('target'): if not message_json.get('target'):
if debug: if debug:
print('DEBUG: no target in bookmark Add') print('DEBUG: no target in bookmark Add')
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not isinstance(messageJson['target'], str): if not isinstance(message_json['target'], str):
if debug: if debug:
print('DEBUG: bookmark Add target is not string') print('DEBUG: bookmark Add target is not string')
return return
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
if not messageJson['target'].endswith('://' + domainFull + if not message_json['target'].endswith('://' + domainFull +
'/users/' + nickname + '/users/' + nickname +
'/tlbookmarks'): '/tlbookmarks'):
if debug: if debug:
print('DEBUG: bookmark Add target invalid ' + print('DEBUG: bookmark Add target invalid ' +
messageJson['target']) message_json['target'])
return return
if messageJson['object']['type'] != 'Document': if message_json['object']['type'] != 'Document':
if debug: if debug:
print('DEBUG: bookmark Add type is not Document') print('DEBUG: bookmark Add type is not Document')
return return
if not messageJson['object'].get('url'): if not message_json['object'].get('url'):
if debug: if debug:
print('DEBUG: bookmark Add missing url') print('DEBUG: bookmark Add missing url')
return return
if debug: if debug:
print('DEBUG: c2s bookmark Add request arrived in outbox') print('DEBUG: c2s bookmark Add request arrived in outbox')
messageUrl = removeIdEnding(messageJson['object']['url']) messageUrl = removeIdEnding(message_json['object']['url'])
domain = removeDomainPort(domain) domain = removeDomainPort(domain)
postFilename = locatePost(base_dir, nickname, domain, messageUrl) postFilename = locatePost(base_dir, nickname, domain, messageUrl)
if not postFilename: if not postFilename:
@ -601,7 +601,7 @@ def outboxBookmark(recentPostsCache: {},
return True return True
updateBookmarksCollection(recentPostsCache, updateBookmarksCollection(recentPostsCache,
base_dir, postFilename, messageUrl, base_dir, postFilename, messageUrl,
messageJson['actor'], domain, debug) message_json['actor'], domain, debug)
if debug: if debug:
print('DEBUG: post bookmarked via c2s - ' + postFilename) print('DEBUG: post bookmarked via c2s - ' + postFilename)
@ -609,45 +609,45 @@ def outboxBookmark(recentPostsCache: {},
def outboxUndoBookmark(recentPostsCache: {}, def outboxUndoBookmark(recentPostsCache: {},
base_dir: str, http_prefix: str, base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When an undo bookmark request is received by the outbox from c2s """ When an undo bookmark request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if messageJson['type'] != 'Remove': if message_json['type'] != 'Remove':
return return
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return return
if not messageJson.get('target'): if not message_json.get('target'):
if debug: if debug:
print('DEBUG: no target in unbookmark Remove') print('DEBUG: no target in unbookmark Remove')
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not isinstance(messageJson['target'], str): if not isinstance(message_json['target'], str):
if debug: if debug:
print('DEBUG: unbookmark Remove target is not string') print('DEBUG: unbookmark Remove target is not string')
return return
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
if not messageJson['target'].endswith('://' + domainFull + if not message_json['target'].endswith('://' + domainFull +
'/users/' + nickname + '/users/' + nickname +
'/tlbookmarks'): '/tlbookmarks'):
if debug: if debug:
print('DEBUG: unbookmark Remove target invalid ' + print('DEBUG: unbookmark Remove target invalid ' +
messageJson['target']) message_json['target'])
return return
if messageJson['object']['type'] != 'Document': if message_json['object']['type'] != 'Document':
if debug: if debug:
print('DEBUG: unbookmark Remove type is not Document') print('DEBUG: unbookmark Remove type is not Document')
return return
if not messageJson['object'].get('url'): if not message_json['object'].get('url'):
if debug: if debug:
print('DEBUG: unbookmark Remove missing url') print('DEBUG: unbookmark Remove missing url')
return return
if debug: if debug:
print('DEBUG: c2s unbookmark Remove request arrived in outbox') print('DEBUG: c2s unbookmark Remove request arrived in outbox')
messageUrl = removeIdEnding(messageJson['object']['url']) messageUrl = removeIdEnding(message_json['object']['url'])
domain = removeDomainPort(domain) domain = removeDomainPort(domain)
postFilename = locatePost(base_dir, nickname, domain, messageUrl) postFilename = locatePost(base_dir, nickname, domain, messageUrl)
if not postFilename: if not postFilename:
@ -657,6 +657,6 @@ def outboxUndoBookmark(recentPostsCache: {},
return True return True
updateBookmarksCollection(recentPostsCache, updateBookmarksCollection(recentPostsCache,
base_dir, postFilename, messageUrl, base_dir, postFilename, messageUrl,
messageJson['actor'], domain, debug) message_json['actor'], domain, debug)
if debug: if debug:
print('DEBUG: post unbookmarked via c2s - ' + postFilename) print('DEBUG: post unbookmarked via c2s - ' + postFilename)

176
daemon.py
View File

@ -499,7 +499,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.base_dir, self.server.base_dir,
nickname, self.server.domain) nickname, self.server.domain)
messageJson = \ message_json = \
createPublicPost(self.server.base_dir, createPublicPost(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.port, self.server.domain, self.server.port,
@ -519,10 +519,10 @@ class PubServer(BaseHTTPRequestHandler):
conversationId, conversationId,
self.server.low_bandwidth, self.server.low_bandwidth,
self.server.content_license_url) self.server.content_license_url)
if messageJson: if message_json:
# name field contains the answer # name field contains the answer
messageJson['object']['name'] = answer message_json['object']['name'] = answer
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, nickname): self.server.project_version, nickname):
postFilename = \ postFilename = \
locatePost(self.server.base_dir, nickname, locatePost(self.server.base_dir, nickname,
@ -1258,7 +1258,7 @@ class PubServer(BaseHTTPRequestHandler):
self._404() self._404()
return True return True
def _postToOutbox(self, messageJson: {}, version: str, def _postToOutbox(self, message_json: {}, version: str,
postToNickname: str) -> bool: postToNickname: str) -> bool:
"""post is received by the outbox """post is received by the outbox
Client to server message post Client to server message post
@ -1275,7 +1275,7 @@ class PubServer(BaseHTTPRequestHandler):
return postMessageToOutbox(self.server.session, return postMessageToOutbox(self.server.session,
self.server.translate, self.server.translate,
messageJson, self.postToNickname, message_json, self.postToNickname,
self.server, self.server.base_dir, self.server, self.server.base_dir,
self.server.http_prefix, self.server.http_prefix,
self.server.domain, self.server.domain,
@ -1341,7 +1341,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.outboxThread[acct][index].kill() self.server.outboxThread[acct][index].kill()
return index return index
def _postToOutboxThread(self, messageJson: {}) -> bool: def _postToOutboxThread(self, message_json: {}) -> bool:
"""Creates a thread to send a post """Creates a thread to send a post
""" """
accountOutboxThreadName = self.postToNickname accountOutboxThreadName = self.postToNickname
@ -1355,14 +1355,14 @@ class PubServer(BaseHTTPRequestHandler):
str(self.server.outbox_thread_index[accountOutboxThreadName])) str(self.server.outbox_thread_index[accountOutboxThreadName]))
self.server.outboxThread[accountOutboxThreadName][index] = \ self.server.outboxThread[accountOutboxThreadName][index] = \
threadWithTrace(target=self._postToOutbox, threadWithTrace(target=self._postToOutbox,
args=(messageJson.copy(), args=(message_json.copy(),
self.server.project_version, None), self.server.project_version, None),
daemon=True) daemon=True)
print('Starting outbox thread') print('Starting outbox thread')
self.server.outboxThread[accountOutboxThreadName][index].start() self.server.outboxThread[accountOutboxThreadName][index].start()
return True return True
def _updateInboxQueue(self, nickname: str, messageJson: {}, def _updateInboxQueue(self, nickname: str, message_json: {},
messageBytes: str) -> int: messageBytes: str) -> int:
"""Update the inbox queue """Update the inbox queue
""" """
@ -1374,7 +1374,7 @@ class PubServer(BaseHTTPRequestHandler):
# check that the incoming message has a fully recognized # check that the incoming message has a fully recognized
# linked data context # linked data context
if not hasValidContext(messageJson): if not hasValidContext(message_json):
print('Message arriving at inbox queue has no valid context') print('Message arriving at inbox queue has no valid context')
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
@ -1382,14 +1382,14 @@ class PubServer(BaseHTTPRequestHandler):
# check for blocked domains so that they can be rejected early # check for blocked domains so that they can be rejected early
messageDomain = None messageDomain = None
if not hasActor(messageJson, self.server.debug): if not hasActor(message_json, self.server.debug):
print('Message arriving at inbox queue has no actor') print('Message arriving at inbox queue has no actor')
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
return 3 return 3
# actor should be a string # actor should be a string
if not isinstance(messageJson['actor'], str): if not isinstance(message_json['actor'], str):
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
return 3 return 3
@ -1397,9 +1397,9 @@ class PubServer(BaseHTTPRequestHandler):
# check that some additional fields are strings # check that some additional fields are strings
stringFields = ('id', 'type', 'published') stringFields = ('id', 'type', 'published')
for checkField in stringFields: for checkField in stringFields:
if not messageJson.get(checkField): if not message_json.get(checkField):
continue continue
if not isinstance(messageJson[checkField], str): if not isinstance(message_json[checkField], str):
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
return 3 return 3
@ -1407,40 +1407,40 @@ class PubServer(BaseHTTPRequestHandler):
# check that to/cc fields are lists # check that to/cc fields are lists
listFields = ('to', 'cc') listFields = ('to', 'cc')
for checkField in listFields: for checkField in listFields:
if not messageJson.get(checkField): if not message_json.get(checkField):
continue continue
if not isinstance(messageJson[checkField], list): if not isinstance(message_json[checkField], list):
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
return 3 return 3
if hasObjectDict(messageJson): if hasObjectDict(message_json):
stringFields = ( stringFields = (
'id', 'actor', 'type', 'content', 'published', 'id', 'actor', 'type', 'content', 'published',
'summary', 'url', 'attributedTo' 'summary', 'url', 'attributedTo'
) )
for checkField in stringFields: for checkField in stringFields:
if not messageJson['object'].get(checkField): if not message_json['object'].get(checkField):
continue continue
if not isinstance(messageJson['object'][checkField], str): if not isinstance(message_json['object'][checkField], str):
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
return 3 return 3
# check that some fields are lists # check that some fields are lists
listFields = ('to', 'cc', 'attachment') listFields = ('to', 'cc', 'attachment')
for checkField in listFields: for checkField in listFields:
if not messageJson['object'].get(checkField): if not message_json['object'].get(checkField):
continue continue
if not isinstance(messageJson['object'][checkField], list): if not isinstance(message_json['object'][checkField], list):
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
return 3 return 3
# actor should look like a url # actor should look like a url
if '://' not in messageJson['actor'] or \ if '://' not in message_json['actor'] or \
'.' not in messageJson['actor']: '.' not in message_json['actor']:
print('POST actor does not look like a url ' + print('POST actor does not look like a url ' +
messageJson['actor']) message_json['actor'])
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
return 3 return 3
@ -1449,15 +1449,15 @@ class PubServer(BaseHTTPRequestHandler):
if not self.server.allow_local_network_access: if not self.server.allow_local_network_access:
localNetworkPatternList = getLocalNetworkAddresses() localNetworkPatternList = getLocalNetworkAddresses()
for localNetworkPattern in localNetworkPatternList: for localNetworkPattern in localNetworkPatternList:
if localNetworkPattern in messageJson['actor']: if localNetworkPattern in message_json['actor']:
print('POST actor contains local network address ' + print('POST actor contains local network address ' +
messageJson['actor']) message_json['actor'])
self._400() self._400()
self.server.POSTbusy = False self.server.POSTbusy = False
return 3 return 3
messageDomain, messagePort = \ messageDomain, messagePort = \
getDomainFromActor(messageJson['actor']) getDomainFromActor(message_json['actor'])
self.server.blockedCacheLastUpdated = \ self.server.blockedCacheLastUpdated = \
updateBlockedCache(self.server.base_dir, updateBlockedCache(self.server.base_dir,
@ -1476,7 +1476,7 @@ class PubServer(BaseHTTPRequestHandler):
if len(self.server.inbox_queue) >= self.server.max_queue_length: if len(self.server.inbox_queue) >= self.server.max_queue_length:
if messageDomain: if messageDomain:
print('Queue: Inbox queue is full. Incoming post from ' + print('Queue: Inbox queue is full. Incoming post from ' +
messageJson['actor']) message_json['actor'])
else: else:
print('Queue: Inbox queue is full') print('Queue: Inbox queue is full')
self._503() self._503()
@ -1506,15 +1506,15 @@ class PubServer(BaseHTTPRequestHandler):
elif self.headers.get('content-length'): elif self.headers.get('content-length'):
headersDict['content-length'] = self.headers['content-length'] headersDict['content-length'] = self.headers['content-length']
originalMessageJson = messageJson.copy() originalMessageJson = message_json.copy()
# whether to add a 'to' field to the message # whether to add a 'to' field to the message
addToFieldTypes = ( addToFieldTypes = (
'Follow', 'Like', 'EmojiReact', 'Add', 'Remove', 'Ignore' 'Follow', 'Like', 'EmojiReact', 'Add', 'Remove', 'Ignore'
) )
for addToType in addToFieldTypes: for addToType in addToFieldTypes:
messageJson, toFieldExists = \ message_json, toFieldExists = \
addToField(addToType, messageJson, self.server.debug) addToField(addToType, message_json, self.server.debug)
beginSaveTime = time.time() beginSaveTime = time.time()
# save the json for later queue processing # save the json for later queue processing
@ -1536,7 +1536,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.http_prefix, self.server.http_prefix,
nickname, nickname,
self.server.domainFull, self.server.domainFull,
messageJson, originalMessageJson, message_json, originalMessageJson,
messageBytesDecoded, messageBytesDecoded,
headersDict, headersDict,
self.path, self.path,
@ -13957,20 +13957,20 @@ class PubServer(BaseHTTPRequestHandler):
nickname, self.server.domain, nickname, self.server.domain,
self.server.domainFull, self.server.domainFull,
self.server.system_language) self.server.system_language)
messageJson = {} message_json = {}
if pinnedPostJson: if pinnedPostJson:
postId = removeIdEnding(pinnedPostJson['id']) postId = removeIdEnding(pinnedPostJson['id'])
messageJson = \ message_json = \
outboxMessageCreateWrap(self.server.http_prefix, outboxMessageCreateWrap(self.server.http_prefix,
nickname, nickname,
self.server.domain, self.server.domain,
self.server.port, self.server.port,
pinnedPostJson) pinnedPostJson)
messageJson['id'] = postId + '/activity' message_json['id'] = postId + '/activity'
messageJson['object']['id'] = postId message_json['object']['id'] = postId
messageJson['object']['url'] = replaceUsersWithAt(postId) message_json['object']['url'] = replaceUsersWithAt(postId)
messageJson['object']['atomUri'] = postId message_json['object']['atomUri'] = postId
msg = json.dumps(messageJson, msg = json.dumps(message_json,
ensure_ascii=False).encode('utf-8') ensure_ascii=False).encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('application/json', self._set_headers('application/json',
@ -16614,7 +16614,7 @@ class PubServer(BaseHTTPRequestHandler):
conversationId = None conversationId = None
if fields.get('conversationId'): if fields.get('conversationId'):
conversationId = fields['conversationId'] conversationId = fields['conversationId']
messageJson = \ message_json = \
createPublicPost(self.server.base_dir, createPublicPost(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.domain,
@ -16633,25 +16633,25 @@ class PubServer(BaseHTTPRequestHandler):
conversationId, conversationId,
self.server.low_bandwidth, self.server.low_bandwidth,
self.server.content_license_url) self.server.content_license_url)
if messageJson: if message_json:
if fields['schedulePost']: if fields['schedulePost']:
return 1 return 1
if pinToProfile: if pinToProfile:
contentStr = \ contentStr = \
getBaseContentFromPost(messageJson, getBaseContentFromPost(message_json,
self.server.system_language) self.server.system_language)
followersOnly = False followersOnly = False
pinPost(self.server.base_dir, pinPost(self.server.base_dir,
nickname, self.server.domain, contentStr, nickname, self.server.domain, contentStr,
followersOnly) followersOnly)
return 1 return 1
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, self.server.project_version,
nickname): nickname):
populateReplies(self.server.base_dir, populateReplies(self.server.base_dir,
self.server.http_prefix, self.server.http_prefix,
self.server.domainFull, self.server.domainFull,
messageJson, message_json,
self.server.max_replies, self.server.max_replies,
self.server.debug) self.server.debug)
return 1 return 1
@ -16660,7 +16660,7 @@ class PubServer(BaseHTTPRequestHandler):
elif postType == 'newblog': elif postType == 'newblog':
# citations button on newblog screen # citations button on newblog screen
if citationsButtonPress: if citationsButtonPress:
messageJson = \ message_json = \
htmlCitations(self.server.base_dir, htmlCitations(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.domain,
@ -16674,13 +16674,13 @@ class PubServer(BaseHTTPRequestHandler):
filename, attachmentMediaType, filename, attachmentMediaType,
fields['imageDescription'], fields['imageDescription'],
self.server.theme_name) self.server.theme_name)
if messageJson: if message_json:
messageJson = messageJson.encode('utf-8') message_json = message_json.encode('utf-8')
messageJsonLen = len(messageJson) message_jsonLen = len(message_json)
self._set_headers('text/html', self._set_headers('text/html',
messageJsonLen, message_jsonLen,
cookie, callingDomain, False) cookie, callingDomain, False)
self._write(messageJson) self._write(message_json)
return 1 return 1
else: else:
return -1 return -1
@ -16698,7 +16698,7 @@ class PubServer(BaseHTTPRequestHandler):
conversationId = None conversationId = None
if fields.get('conversationId'): if fields.get('conversationId'):
conversationId = fields['conversationId'] conversationId = fields['conversationId']
messageJson = \ message_json = \
createBlogPost(self.server.base_dir, nickname, createBlogPost(self.server.base_dir, nickname,
self.server.domain, self.server.port, self.server.domain, self.server.port,
self.server.http_prefix, self.server.http_prefix,
@ -16718,17 +16718,17 @@ class PubServer(BaseHTTPRequestHandler):
conversationId, conversationId,
self.server.low_bandwidth, self.server.low_bandwidth,
self.server.content_license_url) self.server.content_license_url)
if messageJson: if message_json:
if fields['schedulePost']: if fields['schedulePost']:
return 1 return 1
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, self.server.project_version,
nickname): nickname):
refreshNewswire(self.server.base_dir) refreshNewswire(self.server.base_dir)
populateReplies(self.server.base_dir, populateReplies(self.server.base_dir,
self.server.http_prefix, self.server.http_prefix,
self.server.domainFull, self.server.domainFull,
messageJson, message_json,
self.server.max_replies, self.server.max_replies,
self.server.debug) self.server.debug)
return 1 return 1
@ -16849,7 +16849,7 @@ class PubServer(BaseHTTPRequestHandler):
if fields.get('conversationId'): if fields.get('conversationId'):
conversationId = fields['conversationId'] conversationId = fields['conversationId']
messageJson = \ message_json = \
createUnlistedPost(self.server.base_dir, createUnlistedPost(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.port, self.server.domain, self.server.port,
@ -16871,16 +16871,16 @@ class PubServer(BaseHTTPRequestHandler):
conversationId, conversationId,
self.server.low_bandwidth, self.server.low_bandwidth,
self.server.content_license_url) self.server.content_license_url)
if messageJson: if message_json:
if fields['schedulePost']: if fields['schedulePost']:
return 1 return 1
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, self.server.project_version,
nickname): nickname):
populateReplies(self.server.base_dir, populateReplies(self.server.base_dir,
self.server.http_prefix, self.server.http_prefix,
self.server.domain, self.server.domain,
messageJson, message_json,
self.server.max_replies, self.server.max_replies,
self.server.debug) self.server.debug)
return 1 return 1
@ -16899,7 +16899,7 @@ class PubServer(BaseHTTPRequestHandler):
if fields.get('conversationId'): if fields.get('conversationId'):
conversationId = fields['conversationId'] conversationId = fields['conversationId']
messageJson = \ message_json = \
createFollowersOnlyPost(self.server.base_dir, createFollowersOnlyPost(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.domain,
@ -16923,23 +16923,23 @@ class PubServer(BaseHTTPRequestHandler):
conversationId, conversationId,
self.server.low_bandwidth, self.server.low_bandwidth,
self.server.content_license_url) self.server.content_license_url)
if messageJson: if message_json:
if fields['schedulePost']: if fields['schedulePost']:
return 1 return 1
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, self.server.project_version,
nickname): nickname):
populateReplies(self.server.base_dir, populateReplies(self.server.base_dir,
self.server.http_prefix, self.server.http_prefix,
self.server.domain, self.server.domain,
messageJson, message_json,
self.server.max_replies, self.server.max_replies,
self.server.debug) self.server.debug)
return 1 return 1
else: else:
return -1 return -1
elif postType == 'newdm': elif postType == 'newdm':
messageJson = None message_json = None
print('A DM was posted') print('A DM was posted')
if '@' in mentionsStr: if '@' in mentionsStr:
city = getSpoofedCity(self.server.city, city = getSpoofedCity(self.server.city,
@ -16955,7 +16955,7 @@ class PubServer(BaseHTTPRequestHandler):
conversationId = fields['conversationId'] conversationId = fields['conversationId']
content_license_url = self.server.content_license_url content_license_url = self.server.content_license_url
messageJson = \ message_json = \
createDirectMessagePost(self.server.base_dir, createDirectMessagePost(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.domain,
@ -16980,25 +16980,25 @@ class PubServer(BaseHTTPRequestHandler):
conversationId, conversationId,
self.server.low_bandwidth, self.server.low_bandwidth,
content_license_url) content_license_url)
if messageJson: if message_json:
if fields['schedulePost']: if fields['schedulePost']:
return 1 return 1
print('Sending new DM to ' + print('Sending new DM to ' +
str(messageJson['object']['to'])) str(message_json['object']['to']))
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, self.server.project_version,
nickname): nickname):
populateReplies(self.server.base_dir, populateReplies(self.server.base_dir,
self.server.http_prefix, self.server.http_prefix,
self.server.domain, self.server.domain,
messageJson, message_json,
self.server.max_replies, self.server.max_replies,
self.server.debug) self.server.debug)
return 1 return 1
else: else:
return -1 return -1
elif postType == 'newreminder': elif postType == 'newreminder':
messageJson = None message_json = None
handle = nickname + '@' + self.server.domainFull handle = nickname + '@' + self.server.domainFull
print('A reminder was posted for ' + handle) print('A reminder was posted for ' + handle)
if '@' + handle not in mentionsStr: if '@' + handle not in mentionsStr:
@ -17012,7 +17012,7 @@ class PubServer(BaseHTTPRequestHandler):
client_to_server = False client_to_server = False
commentsEnabled = False commentsEnabled = False
conversationId = None conversationId = None
messageJson = \ message_json = \
createDirectMessagePost(self.server.base_dir, createDirectMessagePost(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.domain,
@ -17034,12 +17034,12 @@ class PubServer(BaseHTTPRequestHandler):
conversationId, conversationId,
self.server.low_bandwidth, self.server.low_bandwidth,
self.server.content_license_url) self.server.content_license_url)
if messageJson: if message_json:
if fields['schedulePost']: if fields['schedulePost']:
return 1 return 1
print('DEBUG: new reminder to ' + print('DEBUG: new reminder to ' +
str(messageJson['object']['to'])) str(message_json['object']['to']))
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, self.server.project_version,
nickname): nickname):
return 1 return 1
@ -17057,7 +17057,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.base_dir, self.server.base_dir,
nickname, nickname,
self.server.domain) self.server.domain)
messageJson = \ message_json = \
createReportPost(self.server.base_dir, createReportPost(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.port, self.server.domain, self.server.port,
@ -17071,8 +17071,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.system_language, self.server.system_language,
self.server.low_bandwidth, self.server.low_bandwidth,
self.server.content_license_url) self.server.content_license_url)
if messageJson: if message_json:
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, self.server.project_version,
nickname): nickname):
return 1 return 1
@ -17096,7 +17096,7 @@ class PubServer(BaseHTTPRequestHandler):
nickname, nickname,
self.server.domain) self.server.domain)
intDuration = int(fields['duration']) intDuration = int(fields['duration'])
messageJson = \ message_json = \
createQuestionPost(self.server.base_dir, createQuestionPost(self.server.base_dir,
nickname, nickname,
self.server.domain, self.server.domain,
@ -17113,10 +17113,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.system_language, self.server.system_language,
self.server.low_bandwidth, self.server.low_bandwidth,
self.server.content_license_url) self.server.content_license_url)
if messageJson: if message_json:
if self.server.debug: if self.server.debug:
print('DEBUG: new Question') print('DEBUG: new Question')
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, self.server.project_version,
nickname): nickname):
return 1 return 1
@ -18215,7 +18215,7 @@ class PubServer(BaseHTTPRequestHandler):
return return
# convert the raw bytes to json # convert the raw bytes to json
messageJson = json.loads(messageBytes) message_json = json.loads(messageBytes)
fitnessPerformance(POSTstartTime, self.server.fitness, fitnessPerformance(POSTstartTime, self.server.fitness,
'_POST', 'load json', '_POST', 'load json',
@ -18223,10 +18223,10 @@ class PubServer(BaseHTTPRequestHandler):
# https://www.w3.org/TR/activitypub/#object-without-create # https://www.w3.org/TR/activitypub/#object-without-create
if self.outboxAuthenticated: if self.outboxAuthenticated:
if self._postToOutbox(messageJson, if self._postToOutbox(message_json,
self.server.project_version, None): self.server.project_version, None):
if messageJson.get('id'): if message_json.get('id'):
locnStr = removeIdEnding(messageJson['id']) locnStr = removeIdEnding(message_json['id'])
self.headers['Location'] = locnStr self.headers['Location'] = locnStr
self.send_response(201) self.send_response(201)
self.end_headers() self.end_headers()
@ -18248,7 +18248,7 @@ class PubServer(BaseHTTPRequestHandler):
if self.server.debug: if self.server.debug:
print('DEBUG: Check message has params') print('DEBUG: Check message has params')
if not messageJson: if not message_json:
self.send_response(403) self.send_response(403)
self.end_headers() self.end_headers()
self.server.POSTbusy = False self.server.POSTbusy = False
@ -18256,7 +18256,7 @@ class PubServer(BaseHTTPRequestHandler):
if self.path.endswith('/inbox') or \ if self.path.endswith('/inbox') or \
self.path == '/sharedInbox': self.path == '/sharedInbox':
if not inboxMessageHasParams(messageJson): if not inboxMessageHasParams(message_json):
if self.server.debug: if self.server.debug:
print("DEBUG: inbox message doesn't have the " + print("DEBUG: inbox message doesn't have the " +
"required parameters") "required parameters")
@ -18287,7 +18287,7 @@ class PubServer(BaseHTTPRequestHandler):
if not self.server.unit_test: if not self.server.unit_test:
if not inboxPermittedMessage(self.server.domain, if not inboxPermittedMessage(self.server.domain,
messageJson, message_json,
self.server.federation_list): self.server.federation_list):
if self.server.debug: if self.server.debug:
# https://www.youtube.com/watch?v=K3PrSj9XEu4 # https://www.youtube.com/watch?v=K3PrSj9XEu4
@ -18313,7 +18313,7 @@ class PubServer(BaseHTTPRequestHandler):
if self.postToNickname: if self.postToNickname:
queueStatus = \ queueStatus = \
self._updateInboxQueue(self.postToNickname, self._updateInboxQueue(self.postToNickname,
messageJson, messageBytes) message_json, messageBytes)
if queueStatus >= 0 and queueStatus <= 3: if queueStatus >= 0 and queueStatus <= 3:
self.server.POSTbusy = False self.server.POSTbusy = False
return return
@ -18332,7 +18332,7 @@ class PubServer(BaseHTTPRequestHandler):
if self.server.debug: if self.server.debug:
print('DEBUG: POST to shared inbox') print('DEBUG: POST to shared inbox')
queueStatus = \ queueStatus = \
self._updateInboxQueue('inbox', messageJson, messageBytes) self._updateInboxQueue('inbox', message_json, messageBytes)
if queueStatus >= 0 and queueStatus <= 3: if queueStatus >= 0 and queueStatus <= 3:
self.server.POSTbusy = False self.server.POSTbusy = False
return return

View File

@ -114,31 +114,31 @@ def sendDeleteViaServer(base_dir: str, session,
def outboxDelete(base_dir: str, http_prefix: str, def outboxDelete(base_dir: str, http_prefix: str,
nickname: str, domain: str, nickname: str, domain: str,
messageJson: {}, debug: bool, message_json: {}, debug: bool,
allow_deletion: bool, allow_deletion: bool,
recentPostsCache: {}) -> None: recentPostsCache: {}) -> None:
""" When a delete request is received by the outbox from c2s """ When a delete request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
if debug: if debug:
print('DEBUG: delete - no type') print('DEBUG: delete - no type')
return return
if not messageJson['type'] == 'Delete': if not message_json['type'] == 'Delete':
if debug: if debug:
print('DEBUG: not a delete') print('DEBUG: not a delete')
return return
if not hasObjectString(messageJson, debug): if not hasObjectString(message_json, debug):
return return
if debug: if debug:
print('DEBUG: c2s delete request arrived in outbox') print('DEBUG: c2s delete request arrived in outbox')
deletePrefix = http_prefix + '://' + domain deletePrefix = http_prefix + '://' + domain
if (not allow_deletion and if (not allow_deletion and
(not messageJson['object'].startswith(deletePrefix) or (not message_json['object'].startswith(deletePrefix) or
not messageJson['actor'].startswith(deletePrefix))): not message_json['actor'].startswith(deletePrefix))):
if debug: if debug:
print('DEBUG: delete not permitted from other instances') print('DEBUG: delete not permitted from other instances')
return return
messageId = removeIdEnding(messageJson['object']) messageId = removeIdEnding(message_json['object'])
if '/statuses/' not in messageId: if '/statuses/' not in messageId:
if debug: if debug:
print('DEBUG: c2s delete object is not a status') print('DEBUG: c2s delete object is not a status')

View File

@ -169,7 +169,7 @@ def E2EEdevicesCollection(base_dir: str, nickname: str, domain: str,
return devicesDict return devicesDict
def E2EEdecryptMessageFromDevice(messageJson: {}) -> str: def E2EEdecryptMessageFromDevice(message_json: {}) -> str:
"""Locally decrypts a message on the device. """Locally decrypts a message on the device.
This should probably be a link to a local script This should probably be a link to a local script
or native app, such that what the user sees isn't or native app, such that what the user sees isn't

View File

@ -1375,47 +1375,47 @@ def getFollowersOfActor(base_dir: str, actor: str, debug: bool) -> {}:
return recipientsDict return recipientsDict
def outboxUndoFollow(base_dir: str, messageJson: {}, debug: bool) -> None: def outboxUndoFollow(base_dir: str, message_json: {}, debug: bool) -> None:
"""When an unfollow request is received by the outbox from c2s """When an unfollow request is received by the outbox from c2s
This removes the followed handle from the following.txt file This removes the followed handle from the following.txt file
of the relevant account of the relevant account
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not messageJson['type'] == 'Undo': if not message_json['type'] == 'Undo':
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not messageJson['object']['type'] == 'Follow': if not message_json['object']['type'] == 'Follow':
if not messageJson['object']['type'] == 'Join': if not message_json['object']['type'] == 'Join':
return return
if not hasObjectStringObject(messageJson, debug): if not hasObjectStringObject(message_json, debug):
return return
if not messageJson['object'].get('actor'): if not message_json['object'].get('actor'):
return return
if debug: if debug:
print('DEBUG: undo follow arrived in outbox') print('DEBUG: undo follow arrived in outbox')
nicknameFollower = getNicknameFromActor(messageJson['object']['actor']) nicknameFollower = getNicknameFromActor(message_json['object']['actor'])
if not nicknameFollower: if not nicknameFollower:
print('WARN: unable to find nickname in ' + print('WARN: unable to find nickname in ' +
messageJson['object']['actor']) message_json['object']['actor'])
return return
domainFollower, portFollower = \ domainFollower, portFollower = \
getDomainFromActor(messageJson['object']['actor']) getDomainFromActor(message_json['object']['actor'])
domainFollowerFull = getFullDomain(domainFollower, portFollower) domainFollowerFull = getFullDomain(domainFollower, portFollower)
nicknameFollowing = getNicknameFromActor(messageJson['object']['object']) nicknameFollowing = getNicknameFromActor(message_json['object']['object'])
if not nicknameFollowing: if not nicknameFollowing:
print('WARN: unable to find nickname in ' + print('WARN: unable to find nickname in ' +
messageJson['object']['object']) message_json['object']['object'])
return return
domainFollowing, portFollowing = \ domainFollowing, portFollowing = \
getDomainFromActor(messageJson['object']['object']) getDomainFromActor(message_json['object']['object'])
domainFollowingFull = getFullDomain(domainFollowing, portFollowing) domainFollowingFull = getFullDomain(domainFollowing, portFollowing)
groupAccount = \ groupAccount = \
hasGroupType(base_dir, messageJson['object']['object'], None) hasGroupType(base_dir, message_json['object']['object'], None)
if unfollowAccount(base_dir, nicknameFollower, domainFollowerFull, if unfollowAccount(base_dir, nicknameFollower, domainFollowerFull,
nicknameFollowing, domainFollowingFull, nicknameFollowing, domainFollowingFull,
debug, groupAccount): debug, groupAccount):

604
inbox.py

File diff suppressed because it is too large Load Diff

View File

@ -90,15 +90,15 @@ def setActorLanguages(base_dir: str, actorJson: {}, languagesStr: str) -> None:
def understoodPostLanguage(base_dir: str, nickname: str, domain: str, def understoodPostLanguage(base_dir: str, nickname: str, domain: str,
messageJson: {}, system_language: str, message_json: {}, system_language: str,
http_prefix: str, domainFull: str, http_prefix: str, domainFull: str,
person_cache: {}) -> bool: person_cache: {}) -> bool:
"""Returns true if the post is written in a language """Returns true if the post is written in a language
understood by this account understood by this account
""" """
msgObject = messageJson msgObject = message_json
if hasObjectDict(messageJson): if hasObjectDict(message_json):
msgObject = messageJson['object'] msgObject = message_json['object']
if not msgObject.get('contentMap'): if not msgObject.get('contentMap'):
return True return True
if not isinstance(msgObject['contentMap'], dict): if not isinstance(msgObject['contentMap'], dict):

28
like.py
View File

@ -341,23 +341,23 @@ def sendUndoLikeViaServer(base_dir: str, session,
def outboxLike(recentPostsCache: {}, def outboxLike(recentPostsCache: {},
base_dir: str, http_prefix: str, base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When a like request is received by the outbox from c2s """ When a like request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
if debug: if debug:
print('DEBUG: like - no type') print('DEBUG: like - no type')
return return
if not messageJson['type'] == 'Like': if not message_json['type'] == 'Like':
if debug: if debug:
print('DEBUG: not a like') print('DEBUG: not a like')
return return
if not hasObjectString(messageJson, debug): if not hasObjectString(message_json, debug):
return return
if debug: if debug:
print('DEBUG: c2s like request arrived in outbox') print('DEBUG: c2s like request arrived in outbox')
messageId = removeIdEnding(messageJson['object']) messageId = removeIdEnding(message_json['object'])
domain = removeDomainPort(domain) domain = removeDomainPort(domain)
postFilename = locatePost(base_dir, nickname, domain, messageId) postFilename = locatePost(base_dir, nickname, domain, messageId)
if not postFilename: if not postFilename:
@ -367,7 +367,7 @@ def outboxLike(recentPostsCache: {},
return True return True
updateLikesCollection(recentPostsCache, updateLikesCollection(recentPostsCache,
base_dir, postFilename, messageId, base_dir, postFilename, messageId,
messageJson['actor'], message_json['actor'],
nickname, domain, debug, None) nickname, domain, debug, None)
if debug: if debug:
print('DEBUG: post liked via c2s - ' + postFilename) print('DEBUG: post liked via c2s - ' + postFilename)
@ -376,25 +376,25 @@ def outboxLike(recentPostsCache: {},
def outboxUndoLike(recentPostsCache: {}, def outboxUndoLike(recentPostsCache: {},
base_dir: str, http_prefix: str, base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When an undo like request is received by the outbox from c2s """ When an undo like request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not messageJson['type'] == 'Undo': if not message_json['type'] == 'Undo':
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not messageJson['object']['type'] == 'Like': if not message_json['object']['type'] == 'Like':
if debug: if debug:
print('DEBUG: not a undo like') print('DEBUG: not a undo like')
return return
if not hasObjectStringObject(messageJson, debug): if not hasObjectStringObject(message_json, debug):
return return
if debug: if debug:
print('DEBUG: c2s undo like request arrived in outbox') print('DEBUG: c2s undo like request arrived in outbox')
messageId = removeIdEnding(messageJson['object']['object']) messageId = removeIdEnding(message_json['object']['object'])
domain = removeDomainPort(domain) domain = removeDomainPort(domain)
postFilename = locatePost(base_dir, nickname, domain, messageId) postFilename = locatePost(base_dir, nickname, domain, messageId)
if not postFilename: if not postFilename:
@ -403,7 +403,7 @@ def outboxUndoLike(recentPostsCache: {},
print(messageId) print(messageId)
return True return True
undoLikesCollectionEntry(recentPostsCache, base_dir, postFilename, undoLikesCollectionEntry(recentPostsCache, base_dir, postFilename,
messageId, messageJson['actor'], messageId, message_json['actor'],
domain, debug, None) domain, debug, None)
if debug: if debug:
print('DEBUG: post undo liked via c2s - ' + postFilename) print('DEBUG: post undo liked via c2s - ' + postFilename)

184
outbox.py
View File

@ -61,63 +61,63 @@ from webapp_post import individualPostAsHtml
def _outboxPersonReceiveUpdate(recentPostsCache: {}, def _outboxPersonReceiveUpdate(recentPostsCache: {},
base_dir: str, http_prefix: str, base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" Receive an actor update from c2s """ Receive an actor update from c2s
For example, setting the PGP key from the desktop client For example, setting the PGP key from the desktop client
""" """
# these attachments are updatable via c2s # these attachments are updatable via c2s
updatableAttachments = ('PGP', 'OpenPGP', 'Email') updatableAttachments = ('PGP', 'OpenPGP', 'Email')
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not isinstance(messageJson['type'], str): if not isinstance(message_json['type'], str):
if debug: if debug:
print('DEBUG: c2s actor update type is not a string') print('DEBUG: c2s actor update type is not a string')
return return
if messageJson['type'] != 'Update': if message_json['type'] != 'Update':
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not isinstance(messageJson['object']['type'], str): if not isinstance(message_json['object']['type'], str):
if debug: if debug:
print('DEBUG: c2s actor update object type is not a string') print('DEBUG: c2s actor update object type is not a string')
return return
if messageJson['object']['type'] != 'Person': if message_json['object']['type'] != 'Person':
if debug: if debug:
print('DEBUG: not a c2s actor update') print('DEBUG: not a c2s actor update')
return return
if not messageJson.get('to'): if not message_json.get('to'):
if debug: if debug:
print('DEBUG: c2s actor update has no "to" field') print('DEBUG: c2s actor update has no "to" field')
return return
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return return
if not messageJson.get('id'): if not message_json.get('id'):
if debug: if debug:
print('DEBUG: c2s actor update has no id field') print('DEBUG: c2s actor update has no id field')
return return
if not isinstance(messageJson['id'], str): if not isinstance(message_json['id'], str):
if debug: if debug:
print('DEBUG: c2s actor update id is not a string') print('DEBUG: c2s actor update id is not a string')
return return
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
actor = localActorUrl(http_prefix, nickname, domainFull) actor = localActorUrl(http_prefix, nickname, domainFull)
if len(messageJson['to']) != 1: if len(message_json['to']) != 1:
if debug: if debug:
print('DEBUG: c2s actor update - to does not contain one actor ' + print('DEBUG: c2s actor update - to does not contain one actor ' +
str(messageJson['to'])) str(message_json['to']))
return return
if messageJson['to'][0] != actor: if message_json['to'][0] != actor:
if debug: if debug:
print('DEBUG: c2s actor update - to does not contain actor ' + print('DEBUG: c2s actor update - to does not contain actor ' +
str(messageJson['to']) + ' ' + actor) str(message_json['to']) + ' ' + actor)
return return
if not messageJson['id'].startswith(actor + '#updates/'): if not message_json['id'].startswith(actor + '#updates/'):
if debug: if debug:
print('DEBUG: c2s actor update - unexpected id ' + print('DEBUG: c2s actor update - unexpected id ' +
messageJson['id']) message_json['id'])
return return
updatedActorJson = messageJson['object'] updatedActorJson = message_json['object']
# load actor from file # load actor from file
actorFilename = acctDir(base_dir, nickname, domain) + '.json' actorFilename = acctDir(base_dir, nickname, domain) + '.json'
if not os.path.isfile(actorFilename): if not os.path.isfile(actorFilename):
@ -172,13 +172,13 @@ def _outboxPersonReceiveUpdate(recentPostsCache: {},
print('actor saved: ' + actorFilename) print('actor saved: ' + actorFilename)
if debug: if debug:
print('New attachment: ' + str(actorJson['attachment'])) print('New attachment: ' + str(actorJson['attachment']))
messageJson['object'] = actorJson message_json['object'] = actorJson
if debug: if debug:
print('DEBUG: actor update via c2s - ' + nickname + '@' + domain) print('DEBUG: actor update via c2s - ' + nickname + '@' + domain)
def postMessageToOutbox(session, translate: {}, def postMessageToOutbox(session, translate: {},
messageJson: {}, postToNickname: str, message_json: {}, postToNickname: str,
server, base_dir: str, http_prefix: str, server, base_dir: str, http_prefix: str,
domain: str, domainFull: str, domain: str, domainFull: str,
onion_domain: str, i2p_domain: str, port: int, onion_domain: str, i2p_domain: str, port: int,
@ -205,97 +205,97 @@ def postMessageToOutbox(session, translate: {},
Client to server message post Client to server message post
https://www.w3.org/TR/activitypub/#client-to-server-outbox-delivery https://www.w3.org/TR/activitypub/#client-to-server-outbox-delivery
""" """
if not messageJson.get('type'): if not message_json.get('type'):
if debug: if debug:
print('DEBUG: POST to outbox has no "type" parameter') print('DEBUG: POST to outbox has no "type" parameter')
return False return False
if not messageJson.get('object') and messageJson.get('content'): if not message_json.get('object') and message_json.get('content'):
if messageJson['type'] != 'Create': if message_json['type'] != 'Create':
# https://www.w3.org/TR/activitypub/#object-without-create # https://www.w3.org/TR/activitypub/#object-without-create
if debug: if debug:
print('DEBUG: POST to outbox - adding Create wrapper') print('DEBUG: POST to outbox - adding Create wrapper')
messageJson = \ message_json = \
outboxMessageCreateWrap(http_prefix, outboxMessageCreateWrap(http_prefix,
postToNickname, postToNickname,
domain, port, domain, port,
messageJson) message_json)
# check that the outgoing post doesn't contain any markup # check that the outgoing post doesn't contain any markup
# which can be used to implement exploits # which can be used to implement exploits
if hasObjectDict(messageJson): if hasObjectDict(message_json):
contentStr = getBaseContentFromPost(messageJson, system_language) contentStr = getBaseContentFromPost(message_json, system_language)
if contentStr: if contentStr:
if dangerousMarkup(contentStr, allow_local_network_access): if dangerousMarkup(contentStr, allow_local_network_access):
print('POST to outbox contains dangerous markup: ' + print('POST to outbox contains dangerous markup: ' +
str(messageJson)) str(message_json))
return False return False
if messageJson['type'] == 'Create': if message_json['type'] == 'Create':
if not (messageJson.get('id') and if not (message_json.get('id') and
messageJson.get('type') and message_json.get('type') and
messageJson.get('actor') and message_json.get('actor') and
messageJson.get('object') and message_json.get('object') and
messageJson.get('to')): message_json.get('to')):
if not messageJson.get('id'): if not message_json.get('id'):
if debug: if debug:
print('DEBUG: POST to outbox - ' + print('DEBUG: POST to outbox - ' +
'Create does not have the id parameter ' + 'Create does not have the id parameter ' +
str(messageJson)) str(message_json))
elif not messageJson.get('id'): elif not message_json.get('id'):
if debug: if debug:
print('DEBUG: POST to outbox - ' + print('DEBUG: POST to outbox - ' +
'Create does not have the type parameter ' + 'Create does not have the type parameter ' +
str(messageJson)) str(message_json))
elif not messageJson.get('id'): elif not message_json.get('id'):
if debug: if debug:
print('DEBUG: POST to outbox - ' + print('DEBUG: POST to outbox - ' +
'Create does not have the actor parameter ' + 'Create does not have the actor parameter ' +
str(messageJson)) str(message_json))
elif not messageJson.get('id'): elif not message_json.get('id'):
if debug: if debug:
print('DEBUG: POST to outbox - ' + print('DEBUG: POST to outbox - ' +
'Create does not have the object parameter ' + 'Create does not have the object parameter ' +
str(messageJson)) str(message_json))
else: else:
if debug: if debug:
print('DEBUG: POST to outbox - ' + print('DEBUG: POST to outbox - ' +
'Create does not have the "to" parameter ' + 'Create does not have the "to" parameter ' +
str(messageJson)) str(message_json))
return False return False
# actor should be a string # actor should be a string
if not isinstance(messageJson['actor'], str): if not isinstance(message_json['actor'], str):
return False return False
# actor should look like a url # actor should look like a url
if '://' not in messageJson['actor'] or \ if '://' not in message_json['actor'] or \
'.' not in messageJson['actor']: '.' not in message_json['actor']:
return False return False
# sent by an actor on a local network address? # sent by an actor on a local network address?
if not allow_local_network_access: if not allow_local_network_access:
localNetworkPatternList = getLocalNetworkAddresses() localNetworkPatternList = getLocalNetworkAddresses()
for localNetworkPattern in localNetworkPatternList: for localNetworkPattern in localNetworkPatternList:
if localNetworkPattern in messageJson['actor']: if localNetworkPattern in message_json['actor']:
return False return False
testDomain, testPort = getDomainFromActor(messageJson['actor']) testDomain, testPort = getDomainFromActor(message_json['actor'])
testDomain = getFullDomain(testDomain, testPort) testDomain = getFullDomain(testDomain, testPort)
if isBlockedDomain(base_dir, testDomain): if isBlockedDomain(base_dir, testDomain):
if debug: if debug:
print('DEBUG: domain is blocked: ' + messageJson['actor']) print('DEBUG: domain is blocked: ' + message_json['actor'])
return False return False
# replace youtube, so that google gets less tracking data # replace youtube, so that google gets less tracking data
replaceYouTube(messageJson, yt_replace_domain, system_language) replaceYouTube(message_json, yt_replace_domain, system_language)
# replace twitter, so that twitter posts can be shown without # replace twitter, so that twitter posts can be shown without
# having a twitter account # having a twitter account
replaceTwitter(messageJson, twitter_replacement_domain, replaceTwitter(message_json, twitter_replacement_domain,
system_language) system_language)
# https://www.w3.org/TR/activitypub/#create-activity-outbox # https://www.w3.org/TR/activitypub/#create-activity-outbox
messageJson['object']['attributedTo'] = messageJson['actor'] message_json['object']['attributedTo'] = message_json['actor']
if messageJson['object'].get('attachment'): if message_json['object'].get('attachment'):
attachmentIndex = 0 attachmentIndex = 0
attach = messageJson['object']['attachment'][attachmentIndex] attach = message_json['object']['attachment'][attachmentIndex]
if attach.get('mediaType'): if attach.get('mediaType'):
fileExtension = 'png' fileExtension = 'png'
mediaTypeStr = \ mediaTypeStr = \
@ -323,7 +323,7 @@ def postMessageToOutbox(session, translate: {},
postToNickname + '@' + domain postToNickname + '@' + domain
uploadMediaFilename = mediaDir + '/upload.' + fileExtension uploadMediaFilename = mediaDir + '/upload.' + fileExtension
if not os.path.isfile(uploadMediaFilename): if not os.path.isfile(uploadMediaFilename):
del messageJson['object']['attachment'] del message_json['object']['attachment']
else: else:
# generate a path for the uploaded image # generate a path for the uploaded image
mPath = getMediaPath() mPath = getMediaPath()
@ -345,13 +345,13 @@ def postMessageToOutbox(session, translate: {},
'Create', 'Announce', 'Like', 'EmojiReact', 'Follow', 'Undo', 'Create', 'Announce', 'Like', 'EmojiReact', 'Follow', 'Undo',
'Update', 'Add', 'Remove', 'Block', 'Delete', 'Skill', 'Ignore' 'Update', 'Add', 'Remove', 'Block', 'Delete', 'Skill', 'Ignore'
) )
if messageJson['type'] not in permittedOutboxTypes: if message_json['type'] not in permittedOutboxTypes:
if debug: if debug:
print('DEBUG: POST to outbox - ' + messageJson['type'] + print('DEBUG: POST to outbox - ' + message_json['type'] +
' is not a permitted activity type') ' is not a permitted activity type')
return False return False
if messageJson.get('id'): if message_json.get('id'):
postId = removeIdEnding(messageJson['id']) postId = removeIdEnding(message_json['id'])
if debug: if debug:
print('DEBUG: id attribute exists within POST to outbox') print('DEBUG: id attribute exists within POST to outbox')
else: else:
@ -360,14 +360,14 @@ def postMessageToOutbox(session, translate: {},
postId = None postId = None
if debug: if debug:
print('DEBUG: savePostToBox') print('DEBUG: savePostToBox')
if messageJson['type'] != 'Upgrade': if message_json['type'] != 'Upgrade':
outboxName = 'outbox' outboxName = 'outbox'
# if this is a blog post or an event then save to its own box # if this is a blog post or an event then save to its own box
if messageJson['type'] == 'Create': if message_json['type'] == 'Create':
if hasObjectDict(messageJson): if hasObjectDict(message_json):
if messageJson['object'].get('type'): if message_json['object'].get('type'):
if messageJson['object']['type'] == 'Article': if message_json['object']['type'] == 'Article':
outboxName = 'tlblogs' outboxName = 'tlblogs'
savedFilename = \ savedFilename = \
@ -375,7 +375,7 @@ def postMessageToOutbox(session, translate: {},
http_prefix, http_prefix,
postId, postId,
postToNickname, domainFull, postToNickname, domainFull,
messageJson, outboxName) message_json, outboxName)
if not savedFilename: if not savedFilename:
print('WARN: post not saved to outbox ' + outboxName) print('WARN: post not saved to outbox ' + outboxName)
return False return False
@ -410,7 +410,7 @@ def postMessageToOutbox(session, translate: {},
'Create', 'Question', 'Note', 'EncryptedMessage', 'Article', 'Create', 'Question', 'Note', 'EncryptedMessage', 'Article',
'Patch', 'Announce' 'Patch', 'Announce'
) )
if messageJson['type'] in indexedActivities: if message_json['type'] in indexedActivities:
indexes = [outboxName, "inbox"] indexes = [outboxName, "inbox"]
selfActor = \ selfActor = \
localActorUrl(http_prefix, postToNickname, domainFull) localActorUrl(http_prefix, postToNickname, domainFull)
@ -422,7 +422,7 @@ def postMessageToOutbox(session, translate: {},
if boxNameIndex == 'inbox': if boxNameIndex == 'inbox':
if isImageMedia(session, base_dir, http_prefix, if isImageMedia(session, base_dir, http_prefix,
postToNickname, domain, postToNickname, domain,
messageJson, message_json,
translate, translate,
yt_replace_domain, yt_replace_domain,
twitter_replacement_domain, twitter_replacement_domain,
@ -439,7 +439,7 @@ def postMessageToOutbox(session, translate: {},
# avoid duplicates of the message if already going # avoid duplicates of the message if already going
# back to the inbox of the same account # back to the inbox of the same account
if selfActor not in messageJson['to']: if selfActor not in message_json['to']:
# show sent post within the inbox, # show sent post within the inbox,
# as is the typical convention # as is the typical convention
inboxUpdateIndex(boxNameIndex, base_dir, inboxUpdateIndex(boxNameIndex, base_dir,
@ -461,7 +461,7 @@ def postMessageToOutbox(session, translate: {},
cached_webfingers, cached_webfingers,
person_cache, person_cache,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, None, True, message_json, None, True,
allow_deletion, allow_deletion,
http_prefix, __version__, http_prefix, __version__,
boxNameIndex, boxNameIndex,
@ -479,7 +479,7 @@ def postMessageToOutbox(session, translate: {},
cw_lists, lists_enabled) cw_lists, lists_enabled)
if outboxAnnounce(recentPostsCache, if outboxAnnounce(recentPostsCache,
base_dir, messageJson, debug): base_dir, message_json, debug):
if debug: if debug:
print('DEBUG: Updated announcements (shares) collection ' + print('DEBUG: Updated announcements (shares) collection ' +
'for the post associated with the Announce activity') 'for the post associated with the Announce activity')
@ -520,7 +520,7 @@ def postMessageToOutbox(session, translate: {},
postLog, postLog,
cached_webfingers, cached_webfingers,
person_cache, person_cache,
messageJson, debug, message_json, debug,
version, version,
shared_items_federated_domains, shared_items_federated_domains,
sharedItemFederationTokens, sharedItemFederationTokens,
@ -529,67 +529,67 @@ def postMessageToOutbox(session, translate: {},
if debug: if debug:
print('DEBUG: handle any unfollow requests') print('DEBUG: handle any unfollow requests')
outboxUndoFollow(base_dir, messageJson, debug) outboxUndoFollow(base_dir, message_json, debug)
if debug: if debug:
print('DEBUG: handle skills changes requests') print('DEBUG: handle skills changes requests')
outboxSkills(base_dir, postToNickname, messageJson, debug) outboxSkills(base_dir, postToNickname, message_json, debug)
if debug: if debug:
print('DEBUG: handle availability changes requests') print('DEBUG: handle availability changes requests')
outboxAvailability(base_dir, postToNickname, messageJson, debug) outboxAvailability(base_dir, postToNickname, message_json, debug)
if debug: if debug:
print('DEBUG: handle any like requests') print('DEBUG: handle any like requests')
outboxLike(recentPostsCache, outboxLike(recentPostsCache,
base_dir, http_prefix, base_dir, http_prefix,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: handle any undo like requests') print('DEBUG: handle any undo like requests')
outboxUndoLike(recentPostsCache, outboxUndoLike(recentPostsCache,
base_dir, http_prefix, base_dir, http_prefix,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: handle any emoji reaction requests') print('DEBUG: handle any emoji reaction requests')
outboxReaction(recentPostsCache, outboxReaction(recentPostsCache,
base_dir, http_prefix, base_dir, http_prefix,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: handle any undo emoji reaction requests') print('DEBUG: handle any undo emoji reaction requests')
outboxUndoReaction(recentPostsCache, outboxUndoReaction(recentPostsCache,
base_dir, http_prefix, base_dir, http_prefix,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: handle any undo announce requests') print('DEBUG: handle any undo announce requests')
outboxUndoAnnounce(recentPostsCache, outboxUndoAnnounce(recentPostsCache,
base_dir, http_prefix, base_dir, http_prefix,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: handle any bookmark requests') print('DEBUG: handle any bookmark requests')
outboxBookmark(recentPostsCache, outboxBookmark(recentPostsCache,
base_dir, http_prefix, base_dir, http_prefix,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: handle any undo bookmark requests') print('DEBUG: handle any undo bookmark requests')
outboxUndoBookmark(recentPostsCache, outboxUndoBookmark(recentPostsCache,
base_dir, http_prefix, base_dir, http_prefix,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: handle delete requests') print('DEBUG: handle delete requests')
outboxDelete(base_dir, http_prefix, outboxDelete(base_dir, http_prefix,
postToNickname, domain, postToNickname, domain,
messageJson, debug, message_json, debug,
allow_deletion, allow_deletion,
recentPostsCache) recentPostsCache)
@ -598,20 +598,20 @@ def postMessageToOutbox(session, translate: {},
outboxBlock(base_dir, http_prefix, outboxBlock(base_dir, http_prefix,
postToNickname, domain, postToNickname, domain,
port, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: handle undo block requests') print('DEBUG: handle undo block requests')
outboxUndoBlock(base_dir, http_prefix, outboxUndoBlock(base_dir, http_prefix,
postToNickname, domain, postToNickname, domain,
port, messageJson, debug) port, message_json, debug)
if debug: if debug:
print('DEBUG: handle mute requests') print('DEBUG: handle mute requests')
outboxMute(base_dir, http_prefix, outboxMute(base_dir, http_prefix,
postToNickname, domain, postToNickname, domain,
port, port,
messageJson, debug, message_json, debug,
recentPostsCache) recentPostsCache)
if debug: if debug:
@ -619,13 +619,13 @@ def postMessageToOutbox(session, translate: {},
outboxUndoMute(base_dir, http_prefix, outboxUndoMute(base_dir, http_prefix,
postToNickname, domain, postToNickname, domain,
port, port,
messageJson, debug, message_json, debug,
recentPostsCache) recentPostsCache)
if debug: if debug:
print('DEBUG: handle share uploads') print('DEBUG: handle share uploads')
outboxShareUpload(base_dir, http_prefix, postToNickname, domain, outboxShareUpload(base_dir, http_prefix, postToNickname, domain,
port, messageJson, debug, city, port, message_json, debug, city,
system_language, translate, low_bandwidth, system_language, translate, low_bandwidth,
content_license_url) content_license_url)
@ -633,21 +633,21 @@ def postMessageToOutbox(session, translate: {},
print('DEBUG: handle undo share uploads') print('DEBUG: handle undo share uploads')
outboxUndoShareUpload(base_dir, http_prefix, outboxUndoShareUpload(base_dir, http_prefix,
postToNickname, domain, postToNickname, domain,
port, messageJson, debug) port, message_json, debug)
if debug: if debug:
print('DEBUG: handle actor updates from c2s') print('DEBUG: handle actor updates from c2s')
_outboxPersonReceiveUpdate(recentPostsCache, _outboxPersonReceiveUpdate(recentPostsCache,
base_dir, http_prefix, base_dir, http_prefix,
postToNickname, domain, port, postToNickname, domain, port,
messageJson, debug) message_json, debug)
if debug: if debug:
print('DEBUG: sending c2s post to named addresses') print('DEBUG: sending c2s post to named addresses')
if messageJson.get('to'): if message_json.get('to'):
print('c2s sender: ' + print('c2s sender: ' +
postToNickname + '@' + domain + ':' + str(port) + postToNickname + '@' + domain + ':' + str(port) +
' recipient: ' + str(messageJson['to'])) ' recipient: ' + str(message_json['to']))
else: else:
print('c2s sender: ' + print('c2s sender: ' +
postToNickname + '@' + domain + ':' + str(port)) postToNickname + '@' + domain + ':' + str(port))
@ -661,7 +661,7 @@ def postMessageToOutbox(session, translate: {},
postLog, postLog,
cached_webfingers, cached_webfingers,
person_cache, person_cache,
messageJson, debug, message_json, debug,
version, version,
shared_items_federated_domains, shared_items_federated_domains,
sharedItemFederationTokens, sharedItemFederationTokens,

View File

@ -1564,30 +1564,30 @@ def _createPostBase(base_dir: str,
def outboxMessageCreateWrap(http_prefix: str, def outboxMessageCreateWrap(http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}) -> {}: message_json: {}) -> {}:
"""Wraps a received message in a Create """Wraps a received message in a Create
https://www.w3.org/TR/activitypub/#object-without-create https://www.w3.org/TR/activitypub/#object-without-create
""" """
domain = getFullDomain(domain, port) domain = getFullDomain(domain, port)
statusNumber, published = getStatusNumber() statusNumber, published = getStatusNumber()
if messageJson.get('published'): if message_json.get('published'):
published = messageJson['published'] published = message_json['published']
newPostId = \ newPostId = \
localActorUrl(http_prefix, nickname, domain) + \ localActorUrl(http_prefix, nickname, domain) + \
'/statuses/' + statusNumber '/statuses/' + statusNumber
cc = [] cc = []
if messageJson.get('cc'): if message_json.get('cc'):
cc = messageJson['cc'] cc = message_json['cc']
newPost = { newPost = {
"@context": "https://www.w3.org/ns/activitystreams", "@context": "https://www.w3.org/ns/activitystreams",
'id': newPostId + '/activity', 'id': newPostId + '/activity',
'type': 'Create', 'type': 'Create',
'actor': localActorUrl(http_prefix, nickname, domain), 'actor': localActorUrl(http_prefix, nickname, domain),
'published': published, 'published': published,
'to': messageJson['to'], 'to': message_json['to'],
'cc': cc, 'cc': cc,
'object': messageJson 'object': message_json
} }
newPost['object']['id'] = newPost['id'] newPost['object']['id'] = newPost['id']
newPost['object']['url'] = \ newPost['object']['url'] = \
@ -1909,7 +1909,7 @@ def createQuestionPost(base_dir: str,
""" """
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
localActor = localActorUrl(http_prefix, nickname, domainFull) localActor = localActorUrl(http_prefix, nickname, domainFull)
messageJson = \ message_json = \
_createPostBase(base_dir, nickname, domain, port, _createPostBase(base_dir, nickname, domain, port,
'https://www.w3.org/ns/activitystreams#Public', 'https://www.w3.org/ns/activitystreams#Public',
localActor + '/followers', localActor + '/followers',
@ -1922,17 +1922,17 @@ def createQuestionPost(base_dir: str,
None, None, None, None, None, None,
None, None, None, None, None, system_language, None, None, None, None, None, system_language,
None, low_bandwidth, content_license_url) None, low_bandwidth, content_license_url)
messageJson['object']['type'] = 'Question' message_json['object']['type'] = 'Question'
messageJson['object']['oneOf'] = [] message_json['object']['oneOf'] = []
messageJson['object']['votersCount'] = 0 message_json['object']['votersCount'] = 0
currTime = datetime.datetime.utcnow() currTime = datetime.datetime.utcnow()
daysSinceEpoch = \ daysSinceEpoch = \
int((currTime - datetime.datetime(1970, 1, 1)).days + durationDays) int((currTime - datetime.datetime(1970, 1, 1)).days + durationDays)
endTime = datetime.datetime(1970, 1, 1) + \ endTime = datetime.datetime(1970, 1, 1) + \
datetime.timedelta(daysSinceEpoch) datetime.timedelta(daysSinceEpoch)
messageJson['object']['endTime'] = endTime.strftime("%Y-%m-%dT%H:%M:%SZ") message_json['object']['endTime'] = endTime.strftime("%Y-%m-%dT%H:%M:%SZ")
for questionOption in qOptions: for questionOption in qOptions:
messageJson['object']['oneOf'].append({ message_json['object']['oneOf'].append({
"type": "Note", "type": "Note",
"name": questionOption, "name": questionOption,
"replies": { "replies": {
@ -1940,7 +1940,7 @@ def createQuestionPost(base_dir: str,
"totalItems": 0 "totalItems": 0
} }
}) })
return messageJson return message_json
def createUnlistedPost(base_dir: str, def createUnlistedPost(base_dir: str,
@ -2072,7 +2072,7 @@ def createDirectMessagePost(base_dir: str,
return None return None
postTo = None postTo = None
postCc = None postCc = None
messageJson = \ message_json = \
_createPostBase(base_dir, nickname, domain, port, _createPostBase(base_dir, nickname, domain, port,
postTo, postCc, postTo, postCc,
http_prefix, content, followersOnly, saveToFile, http_prefix, content, followersOnly, saveToFile,
@ -2087,15 +2087,15 @@ def createDirectMessagePost(base_dir: str,
conversationId, low_bandwidth, conversationId, low_bandwidth,
content_license_url) content_license_url)
# mentioned recipients go into To rather than Cc # mentioned recipients go into To rather than Cc
messageJson['to'] = messageJson['object']['cc'] message_json['to'] = message_json['object']['cc']
messageJson['object']['to'] = messageJson['to'] message_json['object']['to'] = message_json['to']
messageJson['cc'] = [] message_json['cc'] = []
messageJson['object']['cc'] = [] message_json['object']['cc'] = []
if schedulePost: if schedulePost:
postId = removeIdEnding(messageJson['object']['id']) postId = removeIdEnding(message_json['object']['id'])
savePostToBox(base_dir, http_prefix, postId, savePostToBox(base_dir, http_prefix, postId,
nickname, domain, messageJson, 'scheduled') nickname, domain, message_json, 'scheduled')
return messageJson return message_json
def createReportPost(base_dir: str, def createReportPost(base_dir: str,

View File

@ -357,33 +357,33 @@ def sendUndoReactionViaServer(base_dir: str, session,
def outboxReaction(recentPostsCache: {}, def outboxReaction(recentPostsCache: {},
base_dir: str, http_prefix: str, base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When a reaction request is received by the outbox from c2s """ When a reaction request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
if debug: if debug:
print('DEBUG: reaction - no type') print('DEBUG: reaction - no type')
return return
if not messageJson['type'] == 'EmojiReact': if not message_json['type'] == 'EmojiReact':
if debug: if debug:
print('DEBUG: not a reaction') print('DEBUG: not a reaction')
return return
if not hasObjectString(messageJson, debug): if not hasObjectString(message_json, debug):
return return
if not messageJson.get('content'): if not message_json.get('content'):
return return
if not isinstance(messageJson['content'], str): if not isinstance(message_json['content'], str):
return return
if not validEmojiContent(messageJson['content']): if not validEmojiContent(message_json['content']):
print('outboxReaction: Invalid emoji reaction: "' + print('outboxReaction: Invalid emoji reaction: "' +
messageJson['content'] + '"') message_json['content'] + '"')
return return
if debug: if debug:
print('DEBUG: c2s reaction request arrived in outbox') print('DEBUG: c2s reaction request arrived in outbox')
messageId = removeIdEnding(messageJson['object']) messageId = removeIdEnding(message_json['object'])
domain = removeDomainPort(domain) domain = removeDomainPort(domain)
emojiContent = messageJson['content'] emojiContent = message_json['content']
postFilename = locatePost(base_dir, nickname, domain, messageId) postFilename = locatePost(base_dir, nickname, domain, messageId)
if not postFilename: if not postFilename:
if debug: if debug:
@ -392,7 +392,7 @@ def outboxReaction(recentPostsCache: {},
return True return True
updateReactionCollection(recentPostsCache, updateReactionCollection(recentPostsCache,
base_dir, postFilename, messageId, base_dir, postFilename, messageId,
messageJson['actor'], message_json['actor'],
nickname, domain, debug, None, emojiContent) nickname, domain, debug, None, emojiContent)
if debug: if debug:
print('DEBUG: post reaction via c2s - ' + postFilename) print('DEBUG: post reaction via c2s - ' + postFilename)
@ -401,30 +401,30 @@ def outboxReaction(recentPostsCache: {},
def outboxUndoReaction(recentPostsCache: {}, def outboxUndoReaction(recentPostsCache: {},
base_dir: str, http_prefix: str, base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When an undo reaction request is received by the outbox from c2s """ When an undo reaction request is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not messageJson['type'] == 'Undo': if not message_json['type'] == 'Undo':
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not messageJson['object']['type'] == 'EmojiReact': if not message_json['object']['type'] == 'EmojiReact':
if debug: if debug:
print('DEBUG: not a undo reaction') print('DEBUG: not a undo reaction')
return return
if not messageJson['object'].get('content'): if not message_json['object'].get('content'):
return return
if not isinstance(messageJson['object']['content'], str): if not isinstance(message_json['object']['content'], str):
return return
if not hasObjectStringObject(messageJson, debug): if not hasObjectStringObject(message_json, debug):
return return
if debug: if debug:
print('DEBUG: c2s undo reaction request arrived in outbox') print('DEBUG: c2s undo reaction request arrived in outbox')
messageId = removeIdEnding(messageJson['object']['object']) messageId = removeIdEnding(message_json['object']['object'])
emojiContent = messageJson['object']['content'] emojiContent = message_json['object']['content']
domain = removeDomainPort(domain) domain = removeDomainPort(domain)
postFilename = locatePost(base_dir, nickname, domain, messageId) postFilename = locatePost(base_dir, nickname, domain, messageId)
if not postFilename: if not postFilename:
@ -433,7 +433,7 @@ def outboxUndoReaction(recentPostsCache: {},
print(messageId) print(messageId)
return True return True
undoReactionCollectionEntry(recentPostsCache, base_dir, postFilename, undoReactionCollectionEntry(recentPostsCache, base_dir, postFilename,
messageId, messageJson['actor'], messageId, message_json['actor'],
domain, debug, None, emojiContent) domain, debug, None, emojiContent)
if debug: if debug:
print('DEBUG: post undo reaction via c2s - ' + postFilename) print('DEBUG: post undo reaction via c2s - ' + postFilename)

View File

@ -1029,70 +1029,70 @@ def getSharedItemsCatalogViaServer(base_dir, session,
def outboxShareUpload(base_dir: str, http_prefix: str, def outboxShareUpload(base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool, city: str, message_json: {}, debug: bool, city: str,
system_language: str, translate: {}, system_language: str, translate: {},
low_bandwidth: bool, low_bandwidth: bool,
content_license_url: str) -> None: content_license_url: str) -> None:
""" When a shared item is received by the outbox from c2s """ When a shared item is received by the outbox from c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not messageJson['type'] == 'Add': if not message_json['type'] == 'Add':
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not messageJson['object']['type'] == 'Offer': if not message_json['object']['type'] == 'Offer':
if debug: if debug:
print('DEBUG: not an Offer activity') print('DEBUG: not an Offer activity')
return return
if not messageJson['object'].get('displayName'): if not message_json['object'].get('displayName'):
if debug: if debug:
print('DEBUG: displayName missing from Offer') print('DEBUG: displayName missing from Offer')
return return
if not messageJson['object'].get('summary'): if not message_json['object'].get('summary'):
if debug: if debug:
print('DEBUG: summary missing from Offer') print('DEBUG: summary missing from Offer')
return return
if not messageJson['object'].get('itemQty'): if not message_json['object'].get('itemQty'):
if debug: if debug:
print('DEBUG: itemQty missing from Offer') print('DEBUG: itemQty missing from Offer')
return return
if not messageJson['object'].get('itemType'): if not message_json['object'].get('itemType'):
if debug: if debug:
print('DEBUG: itemType missing from Offer') print('DEBUG: itemType missing from Offer')
return return
if not messageJson['object'].get('category'): if not message_json['object'].get('category'):
if debug: if debug:
print('DEBUG: category missing from Offer') print('DEBUG: category missing from Offer')
return return
if not messageJson['object'].get('duration'): if not message_json['object'].get('duration'):
if debug: if debug:
print('DEBUG: duration missing from Offer') print('DEBUG: duration missing from Offer')
return return
itemQty = float(messageJson['object']['itemQty']) itemQty = float(message_json['object']['itemQty'])
location = '' location = ''
if messageJson['object'].get('location'): if message_json['object'].get('location'):
location = messageJson['object']['location'] location = message_json['object']['location']
imageFilename = None imageFilename = None
if messageJson['object'].get('imageFilename'): if message_json['object'].get('imageFilename'):
imageFilename = messageJson['object']['imageFilename'] imageFilename = message_json['object']['imageFilename']
if debug: if debug:
print('Adding shared item') print('Adding shared item')
pprint(messageJson) pprint(message_json)
addShare(base_dir, addShare(base_dir,
http_prefix, nickname, domain, port, http_prefix, nickname, domain, port,
messageJson['object']['displayName'], message_json['object']['displayName'],
messageJson['object']['summary'], message_json['object']['summary'],
imageFilename, imageFilename,
itemQty, itemQty,
messageJson['object']['itemType'], message_json['object']['itemType'],
messageJson['object']['category'], message_json['object']['category'],
location, location,
messageJson['object']['duration'], message_json['object']['duration'],
debug, city, debug, city,
messageJson['object']['itemPrice'], message_json['object']['itemPrice'],
messageJson['object']['itemCurrency'], message_json['object']['itemCurrency'],
system_language, translate, 'shares', system_language, translate, 'shares',
low_bandwidth, content_license_url) low_bandwidth, content_license_url)
if debug: if debug:
@ -1101,26 +1101,26 @@ def outboxShareUpload(base_dir: str, http_prefix: str,
def outboxUndoShareUpload(base_dir: str, http_prefix: str, def outboxUndoShareUpload(base_dir: str, http_prefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
messageJson: {}, debug: bool) -> None: message_json: {}, debug: bool) -> None:
""" When a shared item is removed via c2s """ When a shared item is removed via c2s
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return return
if not messageJson['type'] == 'Remove': if not message_json['type'] == 'Remove':
return return
if not hasObjectStringType(messageJson, debug): if not hasObjectStringType(message_json, debug):
return return
if not messageJson['object']['type'] == 'Offer': if not message_json['object']['type'] == 'Offer':
if debug: if debug:
print('DEBUG: not an Offer activity') print('DEBUG: not an Offer activity')
return return
if not messageJson['object'].get('displayName'): if not message_json['object'].get('displayName'):
if debug: if debug:
print('DEBUG: displayName missing from Offer') print('DEBUG: displayName missing from Offer')
return return
domainFull = getFullDomain(domain, port) domainFull = getFullDomain(domain, port)
removeSharedItem(base_dir, nickname, domain, removeSharedItem(base_dir, nickname, domain,
messageJson['object']['displayName'], message_json['object']['displayName'],
http_prefix, domainFull, 'shares') http_prefix, domainFull, 'shares')
if debug: if debug:
print('DEBUG: shared item removed via c2s') print('DEBUG: shared item removed via c2s')

View File

@ -144,26 +144,26 @@ def getSkills(base_dir: str, nickname: str, domain: str) -> []:
return None return None
def outboxSkills(base_dir: str, nickname: str, messageJson: {}, def outboxSkills(base_dir: str, nickname: str, message_json: {},
debug: bool) -> bool: debug: bool) -> bool:
"""Handles receiving a skills update """Handles receiving a skills update
""" """
if not messageJson.get('type'): if not message_json.get('type'):
return False return False
if not messageJson['type'] == 'Skill': if not message_json['type'] == 'Skill':
return False return False
if not hasActor(messageJson, debug): if not hasActor(message_json, debug):
return False return False
if not hasObjectString(messageJson, debug): if not hasObjectString(message_json, debug):
return False return False
actorNickname = getNicknameFromActor(messageJson['actor']) actorNickname = getNicknameFromActor(message_json['actor'])
if actorNickname != nickname: if actorNickname != nickname:
return False return False
domain, port = getDomainFromActor(messageJson['actor']) domain, port = getDomainFromActor(message_json['actor'])
skill = messageJson['object'].replace('"', '').split(';')[0].strip() skill = message_json['object'].replace('"', '').split(';')[0].strip()
skillLevelPercentStr = \ skillLevelPercentStr = \
messageJson['object'].replace('"', '').split(';')[1].strip() message_json['object'].replace('"', '').split(';')[1].strip()
skillLevelPercent = 50 skillLevelPercent = 50
if skillLevelPercentStr.isdigit(): if skillLevelPercentStr.isdigit():
skillLevelPercent = int(skillLevelPercentStr) skillLevelPercent = int(skillLevelPercentStr)