diff --git a/announce.py b/announce.py index 6e11506a..42273165 100644 --- a/announce.py +++ b/announce.py @@ -11,11 +11,18 @@ import commentjson from utils import getStatusNumber from utils import createOutboxDir from utils import urlPermitted +from utils import getNicknameFromActor +from utils import getDomainFromActor +from posts import sendSignedJson -def createAnnounce(baseDir: str,federationList: [], \ +def createAnnounce(session,baseDir: str,federationList: [], \ nickname: str, domain: str, port: int, \ toUrl: str, ccUrl: str, httpPrefix: str, \ - objectUrl: str, saveToFile: bool) -> {}: + objectUrl: str, saveToFile: bool, \ + clientToServer: bool, \ + sendThreads: [],postLog: [], \ + personCache: {},cachedWebfingers: {}, \ + debug: bool) -> {}: """Creates an announce message Typically toUrl will be https://www.w3.org/ns/activitystreams#Public and ccUrl might be a specific person favorited or repeated and the @@ -25,15 +32,18 @@ def createAnnounce(baseDir: str,federationList: [], \ if not urlPermitted(objectUrl,federationList,"inbox:write"): return None + if ':' in domain: + domain=domain.split(':')[0] + fullDomain=domain if port!=80 and port!=443: - domain=domain+':'+str(port) + fullDomain=domain+':'+str(port) statusNumber,published = getStatusNumber() newAnnounceId= \ - httpPrefix+'://'+domain+'/users/'+nickname+'/statuses/'+statusNumber + httpPrefix+'://'+fullDomain+'/users/'+nickname+'/statuses/'+statusNumber newAnnounce = { - 'actor': httpPrefix+'://'+domain+'/users/'+nickname, - 'atomUri': httpPrefix+'://'+domain+'/users/'+nickname+'/statuses/'+statusNumber, + 'actor': httpPrefix+'://'+fullDomain+'/users/'+nickname, + 'atomUri': httpPrefix+'://'+fullDomain+'/users/'+nickname+'/statuses/'+statusNumber, 'cc': [], 'id': newAnnounceId+'/activity', 'object': objectUrl, @@ -43,44 +53,75 @@ def createAnnounce(baseDir: str,federationList: [], \ } if ccUrl: if len(ccUrl)>0: - newAnnounce['cc']=ccUrl + newAnnounce['cc']=[ccUrl] if saveToFile: - if ':' in domain: - domain=domain.split(':')[0] outboxDir = createOutboxDir(nickname,domain,baseDir) filename=outboxDir+'/'+newAnnounceId.replace('/','#')+'.json' with open(filename, 'w') as fp: commentjson.dump(newAnnounce, fp, indent=4, sort_keys=False) + + announceNickname=None + announceDomain=None + announcePort=None + if '/users/' in objectUrl: + announceNickname=getNicknameFromActor(objectUrl) + announceDomain,announcePort=getDomainFromActor(objectUrl) + + if announceNickname and announceDomain: + sendSignedJson(newAnnounce,session,baseDir, \ + nickname,domain,port, \ + announceNickname,announceDomain,announcePort, \ + 'https://www.w3.org/ns/activitystreams#Public', \ + httpPrefix,True,clientToServer,federationList, \ + sendThreads,postLog,cachedWebfingers,personCache,debug) + return newAnnounce -def announcePublic(baseDir: str,federationList: [], \ +def announcePublic(session,baseDir: str,federationList: [], \ nickname: str, domain: str, port: int, httpPrefix: str, \ - objectUrl: str, saveToFile: bool) -> {}: + objectUrl: str,clientToServer: bool, \ + sendThreads: [],postLog: [], \ + personCache: {},cachedWebfingers: {}, \ + debug: bool) -> {}: """Makes a public announcement """ fromDomain=domain if port!=80 and port!=443: - fromDomain=fromDomain+':'+str(port) + if ':' not in domain: + fromDomain=domain+':'+str(port) toUrl = 'https://www.w3.org/ns/activitystreams#Public' ccUrl = httpPrefix + '://'+fromDomain+'/users/'+nickname+'/followers' - return createAnnounce(baseDir,nickname, domain, port, \ - toUrl, ccUrl, httpPrefix, objectUrl, saveToFile) + return createAnnounce(session,baseDir,federationList, \ + nickname,domain,port, \ + toUrl,ccUrl,httpPrefix, \ + objectUrl,True,clientToServer, \ + sendThreads,postLog, \ + personCache,cachedWebfingers, \ + debug) -def repeatPost(baseDir: str,federationList: [], \ +def repeatPost(session,baseDir: str,federationList: [], \ nickname: str, domain: str, port: int, httpPrefix: str, \ announceNickname: str, announceDomain: str, \ announcePort: int, announceHttpsPrefix: str, \ - announceStatusNumber: int, saveToFile: bool) -> {}: + announceStatusNumber: int,clientToServer: bool, \ + sendThreads: [],postLog: [], \ + personCache: {},cachedWebfingers: {}, \ + debug: bool) -> {}: """Repeats a given status post """ announcedDomain=announceDomain if announcePort!=80 and announcePort!=443: - announcedDomain=announcedDomain+':'+str(announcePort) + if ':' not in announcedDomain: + announcedDomain=announcedDomain+':'+str(announcePort) objectUrl = announceHttpsPrefix + '://'+announcedDomain+'/users/'+ \ announceNickname+'/statuses/'+str(announceStatusNumber) - return announcePublic(baseDir,nickname, domain, port, \ - httpPrefix, objectUrl, saveToFile) + return announcePublic(session,baseDir,federationList, \ + nickname,domain,port,httpPrefix, \ + objectUrl,clientToServer, \ + sendThreads,postLog, \ + personCache,cachedWebfingers, \ + debug) diff --git a/inbox.py b/inbox.py index 0c55791d..7fa6d46f 100644 --- a/inbox.py +++ b/inbox.py @@ -88,7 +88,9 @@ def inboxPermittedMessage(domain: str,messageJson: {},federationList: []) -> boo if not urlPermitted(actor,federationList,"inbox:write"): return False - if messageJson['type']!='Follow' and messageJson['type']!='Like': + if messageJson['type']!='Follow' and \ + messageJson['type']!='Like' and \ + messageJson['type']!='Announce': if messageJson.get('object'): if messageJson['object'].get('inReplyTo'): inReplyTo=messageJson['object']['inReplyTo'] diff --git a/tests.py b/tests.py index 87abce40..cbeefde7 100644 --- a/tests.py +++ b/tests.py @@ -43,6 +43,7 @@ from auth import createBasicAuthHeader from auth import authorizeBasic from auth import storeBasicCredentials from like import likePost +from announce import announcePublic testServerAliceRunning = False testServerBobRunning = False @@ -296,7 +297,7 @@ def testPostMessageBetweenServers(): if '#statuses#' in name: statusNumber=int(name.split('#statuses#')[1].replace('.json','')) outboxPostFilename=outboxPath+'/'+name - assert statusNumber + assert statusNumber>0 assert outboxPostFilename assert likePost(sessionBob,bobDir,federationList, \ 'bob',bobDomain,bobPort,httpPrefix, \ @@ -313,7 +314,17 @@ def testPostMessageBetweenServers(): alicePostJson=commentjson.load(fp) pprint(alicePostJson) assert 'likes' in open(outboxPostFilename).read() - + + print('\n\n*******************************************************') + print("Bob repeats Alice's post") + objectUrl=httpPrefix+'://'+aliceDomain+':'+str(alicePort)+'/users/alice/statuses/'+str(statusNumber) + announcePublic(sessionBob,bobDir,federationList, \ + 'bob',bobDomain,bobPort,httpPrefix, \ + objectUrl, \ + False,bobSendThreads,bobPostLog, \ + bobPersonCache,bobCachedWebfingers, \ + True) + # stop the servers thrAlice.kill() thrAlice.join()