diff --git a/inbox.py b/inbox.py index 7fa6d46f..a9998440 100644 --- a/inbox.py +++ b/inbox.py @@ -438,6 +438,52 @@ def receiveLike(session,handle: str,baseDir: str, \ updateLikesCollection(postFilename,messageJson['object'],messageJson['actor'],debug) return True +def receiveAnnounce(session,handle: str,baseDir: str, \ + httpPrefix: str,domain :str,port: int, \ + sendThreads: [],postLog: [],cachedWebfingers: {}, \ + personCache: {},messageJson: {},federationList: [], \ + debug : bool) -> bool: + """Receives a Like activity within the POST section of HTTPServer + """ + if messageJson['type']!='Announce': + return False + if not messageJson.get('actor'): + if debug: + print('DEBUG: '+messageJson['type']+' has no actor') + return False + if not messageJson.get('object'): + if debug: + print('DEBUG: '+messageJson['type']+' has no object') + return False + if not isinstance(messageJson['object'], str): + if debug: + print('DEBUG: '+messageJson['type']+' object is not a string') + return False + if not messageJson.get('to'): + if debug: + print('DEBUG: '+messageJson['type']+' has no "to" list') + return False + if '/users/' not in messageJson['actor']: + if debug: + print('DEBUG: "users" missing from actor in '+messageJson['type']) + return False + if '/statuses/' not in messageJson['object']: + if debug: + print('DEBUG: "statuses" missing from object in '+messageJson['type']) + return False + if not os.path.isdir(baseDir+'/accounts/'+handle): + print('DEBUG: unknown recipient of announce - '+handle) + # if this post in the outbox of the person? + postFilename=locatePost(baseDir,handle.split('@')[0],handle.split('@')[1],messageJson['object']) + if not postFilename: + if debug: + print('DEBUG: announce post not found in inbox or outbox') + print(messageJson['object']) + return True + if debug: + print('DEBUG: announced/repeated post found in inbox') + return True + def inboxAfterCapabilities(session,keyId: str,handle: str,messageJson: {}, \ baseDir: str,httpPrefix: str,sendThreads: [], \ postLog: [],cachedWebfingers: {},personCache: {}, \ @@ -460,6 +506,18 @@ def inboxAfterCapabilities(session,keyId: str,handle: str,messageJson: {}, \ print('DEBUG: Like accepted from '+keyId) return False + if receiveAnnounce(session,handle, \ + baseDir,httpPrefix, \ + domain,port, \ + sendThreads,postLog, \ + cachedWebfingers, \ + personCache, \ + messageJson, \ + federationList, \ + debug): + if debug: + print('DEBUG: Announce accepted from '+keyId) + if debug: print('DEBUG: object capabilities passed') print('copy from '+queueFilename+' to '+destinationFilename) diff --git a/tests.py b/tests.py index cbeefde7..96c4d91b 100644 --- a/tests.py +++ b/tests.py @@ -318,13 +318,27 @@ def testPostMessageBetweenServers(): print('\n\n*******************************************************') print("Bob repeats Alice's post") objectUrl=httpPrefix+'://'+aliceDomain+':'+str(alicePort)+'/users/alice/statuses/'+str(statusNumber) + inboxPath=aliceDir+'/accounts/alice@'+aliceDomain+'/inbox' + beforeAnnounceCount=len([name for name in os.listdir(inboxPath) if os.path.isfile(os.path.join(inboxPath, name))]) + assert beforeAnnounceCount==0 + print('inbox items before announce: '+str(beforeAnnounceCount)) announcePublic(sessionBob,bobDir,federationList, \ 'bob',bobDomain,bobPort,httpPrefix, \ objectUrl, \ False,bobSendThreads,bobPostLog, \ bobPersonCache,bobCachedWebfingers, \ True) - + announceMessageArrived=False + for i in range(10): + time.sleep(1) + if os.path.isdir(inboxPath): + if len([name for name in os.listdir(inboxPath) if os.path.isfile(os.path.join(inboxPath, name))])>0: + announceMessageArrived=True + print('Announce message sent to Alice!') + break + afterAnnounceCount=len([name for name in os.listdir(inboxPath) if os.path.isfile(os.path.join(inboxPath, name))]) + print('inbox items after announce: '+str(afterAnnounceCount)) + assert afterAnnounceCount==beforeAnnounceCount+1 # stop the servers thrAlice.kill() thrAlice.join() diff --git a/utils.py b/utils.py index 7292cbed..83f5e619 100644 --- a/utils.py +++ b/utils.py @@ -121,15 +121,16 @@ def followPerson(baseDir: str,nickname: str, domain: str, \ def locatePost(baseDir: str,nickname: str,domain: str,postUrl: str): """Returns the filename for the given status post url """ - boxName='outbox' + # if this post in the shared inbox? + handle='inbox@'+domain + boxName='inbox' postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.json' if not os.path.isfile(postFilename): - # if this post in the inbox of the person? - boxName='inbox' + boxName='outbox' postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.json' if not os.path.isfile(postFilename): - # if this post in the shared inbox? - handle='inbox@'+domain + # if this post in the inbox of the person? + boxName='inbox' postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.json' if not os.path.isfile(postFilename): postFilename=None