flake8 format

merge-requests/30/head
Bob Mottram 2020-04-03 17:15:33 +00:00
parent 08a1b05a76
commit 2bbfd60969
1 changed files with 173 additions and 163 deletions

336
outbox.py
View File

@ -1,20 +1,18 @@
__filename__="outbox.py" __filename__ = "outbox.py"
__author__="Bob Mottram" __author__ = "Bob Mottram"
__license__="AGPL3+" __license__ = "AGPL3+"
__version__="1.1.0" __version__ = "1.1.0"
__maintainer__="Bob Mottram" __maintainer__ = "Bob Mottram"
__email__="bob@freedombone.net" __email__ = "bob@freedombone.net"
__status__="Production" __status__ = "Production"
import os import os
import json
from session import createSession from session import createSession
from auth import createPassword from auth import createPassword
from posts import outboxMessageCreateWrap from posts import outboxMessageCreateWrap
from posts import savePostToBox from posts import savePostToBox
from posts import sendToFollowersThread from posts import sendToFollowersThread
from posts import sendToNamedAddresses from posts import sendToNamedAddresses
from utils import isBlogPost
from utils import getDomainFromActor from utils import getDomainFromActor
from blocking import isBlockedDomain from blocking import isBlockedDomain
from blocking import outboxBlock from blocking import outboxBlock
@ -36,15 +34,16 @@ from delete import outboxDelete
from shares import outboxShareUpload from shares import outboxShareUpload
from shares import outboxUndoShareUpload from shares import outboxUndoShareUpload
def postMessageToOutbox(messageJson: {},postToNickname: str, \
server,baseDir: str,httpPrefix: str, \ def postMessageToOutbox(messageJson: {}, postToNickname: str,
domain: str,domainFull: str,onionDomain: str, \ server, baseDir: str, httpPrefix: str,
port: int, \ domain: str, domainFull: str, onionDomain: str,
recentPostsCache: {},followersThreads: [], \ port: int,
federationList: [],sendThreads: [], \ recentPostsCache: {}, followersThreads: [],
postLog: [],cachedWebfingers: {}, \ federationList: [], sendThreads: [],
personCache: {},allowDeletion: bool, \ postLog: [], cachedWebfingers: {},
useTor: bool,version: str,debug: bool) -> bool: personCache: {}, allowDeletion: bool,
useTor: bool, version: str, debug: bool) -> bool:
"""post is received by the outbox """post is received by the outbox
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
@ -54,275 +53,286 @@ def postMessageToOutbox(messageJson: {},postToNickname: str, \
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 messageJson.get('object') and messageJson.get('content'):
if messageJson['type']!='Create': if messageJson['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= \ messageJson = \
outboxMessageCreateWrap(httpPrefix, \ outboxMessageCreateWrap(httpPrefix,
postToNickname, \ postToNickname,
domain,port, \ domain, port,
messageJson) messageJson)
if messageJson['type']=='Create': if messageJson['type'] == 'Create':
if not (messageJson.get('id') and \ if not (messageJson.get('id') and
messageJson.get('type') and \ messageJson.get('type') and
messageJson.get('actor') and \ messageJson.get('actor') and
messageJson.get('object') and \ messageJson.get('object') and
messageJson.get('to')): messageJson.get('to')):
if not messageJson.get('id'): if not messageJson.get('id'):
if debug: if debug:
print('DEBUG: POST to outbox - Create does not have the id parameter '+str(messageJson)) print('DEBUG: POST to outbox - ' +
'Create does not have the id parameter ' +
str(messageJson))
elif not messageJson.get('id'): elif not messageJson.get('id'):
if debug: if debug:
print('DEBUG: POST to outbox - Create does not have the type parameter '+str(messageJson)) print('DEBUG: POST to outbox - ' +
'Create does not have the type parameter ' +
str(messageJson))
elif not messageJson.get('id'): elif not messageJson.get('id'):
if debug: if debug:
print('DEBUG: POST to outbox - Create does not have the actor parameter '+str(messageJson)) print('DEBUG: POST to outbox - ' +
'Create does not have the actor parameter ' +
str(messageJson))
elif not messageJson.get('id'): elif not messageJson.get('id'):
if debug: if debug:
print('DEBUG: POST to outbox - Create does not have the object parameter '+str(messageJson)) print('DEBUG: POST to outbox - ' +
'Create does not have the object parameter ' +
str(messageJson))
else: else:
if debug: if debug:
print('DEBUG: POST to outbox - Create does not have the "to" parameter '+str(messageJson)) print('DEBUG: POST to outbox - ' +
'Create does not have the "to" parameter ' +
str(messageJson))
return False return False
testDomain,testPort=getDomainFromActor(messageJson['actor']) testDomain, testPort = getDomainFromActor(messageJson['actor'])
if testPort: if testPort:
if testPort!=80 and testPort!=443: if testPort != 80 and testPort != 443:
testDomain=testDomain+':'+str(testPort) testDomain = testDomain + ':' + str(testPort)
if isBlockedDomain(baseDir,testDomain): if isBlockedDomain(baseDir, testDomain):
if debug: if debug:
print('DEBUG: domain is blocked: '+messageJson['actor']) print('DEBUG: domain is blocked: ' + messageJson['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) replaceYouTube(messageJson)
# https://www.w3.org/TR/activitypub/#create-activity-outbox # https://www.w3.org/TR/activitypub/#create-activity-outbox
messageJson['object']['attributedTo']=messageJson['actor'] messageJson['object']['attributedTo'] = messageJson['actor']
if messageJson['object'].get('attachment'): if messageJson['object'].get('attachment'):
attachmentIndex=0 attachmentIndex = 0
if messageJson['object']['attachment'][attachmentIndex].get('mediaType'): attach = messageJson['object']['attachment'][attachmentIndex]
fileExtension='png' if attach.get('mediaType'):
mediaTypeStr= \ fileExtension = 'png'
messageJson['object']['attachment'][attachmentIndex]['mediaType'] mediaTypeStr = \
attach['mediaType']
if mediaTypeStr.endswith('jpeg'): if mediaTypeStr.endswith('jpeg'):
fileExtension='jpg' fileExtension = 'jpg'
elif mediaTypeStr.endswith('gif'): elif mediaTypeStr.endswith('gif'):
fileExtension='gif' fileExtension = 'gif'
elif mediaTypeStr.endswith('webp'): elif mediaTypeStr.endswith('webp'):
fileExtension='webp' fileExtension = 'webp'
elif mediaTypeStr.endswith('audio/mpeg'): elif mediaTypeStr.endswith('audio/mpeg'):
fileExtension='mp3' fileExtension = 'mp3'
elif mediaTypeStr.endswith('ogg'): elif mediaTypeStr.endswith('ogg'):
fileExtension='ogg' fileExtension = 'ogg'
elif mediaTypeStr.endswith('mp4'): elif mediaTypeStr.endswith('mp4'):
fileExtension='mp4' fileExtension = 'mp4'
elif mediaTypeStr.endswith('webm'): elif mediaTypeStr.endswith('webm'):
fileExtension='webm' fileExtension = 'webm'
elif mediaTypeStr.endswith('ogv'): elif mediaTypeStr.endswith('ogv'):
fileExtension='ogv' fileExtension = 'ogv'
mediaDir= \ mediaDir = \
baseDir+'/accounts/'+ \ baseDir + '/accounts/' + \
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 messageJson['object']['attachment']
else: else:
# generate a path for the uploaded image # generate a path for the uploaded image
mPath=getMediaPath() mPath = getMediaPath()
mediaPath=mPath+'/'+createPassword(32)+'.'+fileExtension mediaPath = mPath + '/' + \
createMediaDirs(baseDir,mPath) createPassword(32) + '.' + fileExtension
mediaFilename=baseDir+'/'+mediaPath createMediaDirs(baseDir, mPath)
mediaFilename = baseDir + '/' + mediaPath
# move the uploaded image to its new path # move the uploaded image to its new path
os.rename(uploadMediaFilename,mediaFilename) os.rename(uploadMediaFilename, mediaFilename)
# change the url of the attachment # change the url of the attachment
messageJson['object']['attachment'][attachmentIndex]['url']= \ attach['url'] = \
httpPrefix+'://'+domainFull+'/'+mediaPath httpPrefix + '://' + domainFull + '/' + mediaPath
permittedOutboxTypes=[ permittedOutboxTypes = ('Create', 'Announce', 'Like', 'Follow', 'Undo',
'Create','Announce','Like','Follow','Undo', \ 'Update', 'Add', 'Remove', 'Block', 'Delete',
'Update','Add','Remove','Block','Delete', \ 'Delegate', 'Skill', 'Bookmark')
'Delegate','Skill','Bookmark'
]
if messageJson['type'] not in permittedOutboxTypes: if messageJson['type'] not in permittedOutboxTypes:
if debug: if debug:
print('DEBUG: POST to outbox - '+messageJson['type']+ \ print('DEBUG: POST to outbox - ' + messageJson['type'] +
' is not a permitted activity type') ' is not a permitted activity type')
return False return False
if messageJson.get('id'): if messageJson.get('id'):
postId=messageJson['id'].replace('/activity','').replace('/undo','') postId = \
messageJson['id'].replace('/activity', '').replace('/undo', '')
if debug: if debug:
print('DEBUG: id attribute exists within POST to outbox') print('DEBUG: id attribute exists within POST to outbox')
else: else:
if debug: if debug:
print('DEBUG: No id attribute within POST to outbox') print('DEBUG: No id attribute within POST to outbox')
postId=None postId = None
if debug: if debug:
print('DEBUG: savePostToBox') print('DEBUG: savePostToBox')
if messageJson['type']!='Upgrade': if messageJson['type'] != 'Upgrade':
outboxName='outbox' outboxName = 'outbox'
# if this is a blog post then save to its own box # if this is a blog post then save to its own box
if messageJson['type']=='Create': if messageJson['type'] == 'Create':
if messageJson.get('object'): if messageJson.get('object'):
if isinstance(messageJson['object'], dict): if isinstance(messageJson['object'], dict):
if messageJson['object'].get('type'): if messageJson['object'].get('type'):
if messageJson['object']['type']=='Article': if messageJson['object']['type'] == 'Article':
outboxName='tlblogs' outboxName = 'tlblogs'
savedFilename= \ savedFilename = \
savePostToBox(baseDir, \ savePostToBox(baseDir,
httpPrefix, \ httpPrefix,
postId, \ postId,
postToNickname, \ postToNickname,
domainFull,messageJson,outboxName) domainFull, messageJson, outboxName)
if messageJson['type']=='Create' or \ if messageJson['type'] == 'Create' or \
messageJson['type']=='Question' or \ messageJson['type'] == 'Question' or \
messageJson['type']=='Note' or \ messageJson['type'] == 'Note' or \
messageJson['type']=='Article' or \ messageJson['type'] == 'Article' or \
messageJson['type']=='Announce': messageJson['type'] == 'Announce':
indexes=[outboxName,"inbox"] indexes = [outboxName, "inbox"]
for boxNameIndex in indexes: for boxNameIndex in indexes:
if boxNameIndex=='inbox' and outboxName=='tlblogs': if boxNameIndex == 'inbox' and outboxName == 'tlblogs':
continue continue
inboxUpdateIndex(boxNameIndex,baseDir, \ inboxUpdateIndex(boxNameIndex, baseDir,
postToNickname+'@'+domain, \ postToNickname + '@' + domain,
savedFilename,debug) savedFilename, debug)
if outboxAnnounce(recentPostsCache, \ if outboxAnnounce(recentPostsCache,
baseDir,messageJson,debug): baseDir, messageJson, debug):
if debug: if debug:
print('DEBUG: Updated announcements (shares) collection for the post associated with the Announce activity') print('DEBUG: Updated announcements (shares) collection ' +
'for the post associated with the Announce activity')
if not server.session: if not server.session:
if debug: if debug:
print('DEBUG: creating new session for c2s') print('DEBUG: creating new session for c2s')
server.session= \ server.session = \
createSession(useTor) createSession(useTor)
if debug: if debug:
print('DEBUG: sending c2s post to followers') print('DEBUG: sending c2s post to followers')
# remove inactive threads # remove inactive threads
inactiveFollowerThreads=[] inactiveFollowerThreads = []
for th in followersThreads: for th in followersThreads:
if not th.is_alive(): if not th.is_alive():
inactiveFollowerThreads.append(th) inactiveFollowerThreads.append(th)
for th in inactiveFollowerThreads: for th in inactiveFollowerThreads:
followersThreads.remove(th) followersThreads.remove(th)
if debug: if debug:
print('DEBUG: '+str(len(followersThreads))+' followers threads active') print('DEBUG: ' + str(len(followersThreads)) +
' followers threads active')
# retain up to 200 threads # retain up to 200 threads
if len(followersThreads)>200: if len(followersThreads) > 200:
# kill the thread if it is still alive # kill the thread if it is still alive
if followersThreads[0].is_alive(): if followersThreads[0].is_alive():
followersThreads[0].kill() followersThreads[0].kill()
# remove it from the list # remove it from the list
followersThreads.pop(0) followersThreads.pop(0)
# create a thread to send the post to followers # create a thread to send the post to followers
followersThread= \ followersThread = \
sendToFollowersThread(server.session, \ sendToFollowersThread(server.session,
baseDir, \ baseDir,
postToNickname, \ postToNickname,
domain,onionDomain, \ domain, onionDomain,
port, \ port, httpPrefix,
httpPrefix, \ federationList,
federationList, \ sendThreads,
sendThreads, \ postLog,
postLog, \ cachedWebfingers,
cachedWebfingers, \ personCache,
personCache, \ messageJson, debug,
messageJson,debug, \
version) version)
followersThreads.append(followersThread) followersThreads.append(followersThread)
if debug: if debug:
print('DEBUG: handle any unfollow requests') print('DEBUG: handle any unfollow requests')
outboxUndoFollow(baseDir,messageJson,debug) outboxUndoFollow(baseDir, messageJson, debug)
if debug: if debug:
print('DEBUG: handle delegation requests') print('DEBUG: handle delegation requests')
outboxDelegate(baseDir,postToNickname,messageJson,debug) outboxDelegate(baseDir, postToNickname, messageJson, debug)
if debug: if debug:
print('DEBUG: handle skills changes requests') print('DEBUG: handle skills changes requests')
outboxSkills(baseDir,postToNickname,messageJson,debug) outboxSkills(baseDir, postToNickname, messageJson, debug)
if debug: if debug:
print('DEBUG: handle availability changes requests') print('DEBUG: handle availability changes requests')
outboxAvailability(baseDir,postToNickname,messageJson,debug) outboxAvailability(baseDir, postToNickname, messageJson, debug)
if debug: if debug:
print('DEBUG: handle any like requests') print('DEBUG: handle any like requests')
outboxLike(recentPostsCache, \ outboxLike(recentPostsCache,
baseDir,httpPrefix, \ baseDir, httpPrefix,
postToNickname,domain,port, \ postToNickname, domain, port,
messageJson,debug) messageJson, debug)
if debug: if debug:
print('DEBUG: handle any undo like requests') print('DEBUG: handle any undo like requests')
outboxUndoLike(recentPostsCache, \ outboxUndoLike(recentPostsCache,
baseDir,httpPrefix, \ baseDir, httpPrefix,
postToNickname,domain,port, \ postToNickname, domain, port,
messageJson,debug) messageJson, debug)
if debug: if debug:
print('DEBUG: handle any bookmark requests') print('DEBUG: handle any bookmark requests')
outboxBookmark(recentPostsCache, \ outboxBookmark(recentPostsCache,
baseDir,httpPrefix, \ baseDir, httpPrefix,
postToNickname,domain,port, \ postToNickname, domain, port,
messageJson,debug) messageJson, debug)
if debug: if debug:
print('DEBUG: handle any undo bookmark requests') print('DEBUG: handle any undo bookmark requests')
outboxUndoBookmark(recentPostsCache, \ outboxUndoBookmark(recentPostsCache,
baseDir,httpPrefix, \ baseDir, httpPrefix,
postToNickname,domain,port, \ postToNickname, domain, port,
messageJson,debug) messageJson, debug)
if debug: if debug:
print('DEBUG: handle delete requests') print('DEBUG: handle delete requests')
outboxDelete(baseDir,httpPrefix, \ outboxDelete(baseDir, httpPrefix,
postToNickname,domain, \ postToNickname, domain,
messageJson,debug, \ messageJson, debug,
allowDeletion) allowDeletion)
if debug: if debug:
print('DEBUG: handle block requests') print('DEBUG: handle block requests')
outboxBlock(baseDir,httpPrefix, \ outboxBlock(baseDir, httpPrefix,
postToNickname,domain, \ postToNickname, domain,
port, port,
messageJson,debug) messageJson, debug)
if debug: if debug:
print('DEBUG: handle undo block requests') print('DEBUG: handle undo block requests')
outboxUndoBlock(baseDir,httpPrefix, \ outboxUndoBlock(baseDir, httpPrefix,
postToNickname,domain, \ postToNickname, domain,
port, port, messageJson, debug)
messageJson,debug)
if debug: if debug:
print('DEBUG: handle share uploads') print('DEBUG: handle share uploads')
outboxShareUpload(baseDir,httpPrefix, \ outboxShareUpload(baseDir, httpPrefix,
postToNickname,domain, \ postToNickname, domain,
port, port, messageJson, debug)
messageJson,debug)
if debug: if debug:
print('DEBUG: handle undo share uploads') print('DEBUG: handle undo share uploads')
outboxUndoShareUpload(baseDir,httpPrefix, \ outboxUndoShareUpload(baseDir, httpPrefix,
postToNickname,domain, \ postToNickname, domain,
port, port, messageJson, debug)
messageJson,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 messageJson.get('to'):
print('c2s sender: '+postToNickname+'@'+domain+':'+str(port)+ \ print('c2s sender: ' +
' recipient: '+str(messageJson['to'])) postToNickname + '@' + domain + ':' + str(port) +
' recipient: ' + str(messageJson['to']))
else: else:
print('c2s sender: '+postToNickname+'@'+domain+':'+str(port)) print('c2s sender: ' +
sendToNamedAddresses(server.session,baseDir, \ postToNickname + '@' + domain + ':' + str(port))
postToNickname, \ sendToNamedAddresses(server.session, baseDir,
domain,onionDomain,port, \ postToNickname,
httpPrefix, \ domain, onionDomain, port,
federationList, \ httpPrefix,
sendThreads, \ federationList,
postLog, \ sendThreads,
cachedWebfingers, \ postLog,
personCache, \ cachedWebfingers,
messageJson,debug, \ personCache,
messageJson, debug,
version) version)
return True return True