diff --git a/posts.py b/posts.py index f033310b..37581cc4 100644 --- a/posts.py +++ b/posts.py @@ -251,7 +251,7 @@ def deleteAllPosts(baseDir: str,nickname: str, domain: str) -> None: def createPostBase(baseDir: str,nickname: str, domain: str, port: int, \ toUrl: str, ccUrl: str, https: bool, content: str, \ - followersOnly: bool, saveToFile: bool, \ + followersOnly: bool, saveToFile: bool, clientToServer: bool, \ inReplyTo=None, inReplyToAtomUri=None, subject=None) -> {}: """Creates a message """ @@ -276,43 +276,68 @@ def createPostBase(baseDir: str,nickname: str, domain: str, port: int, \ if subject: summary=subject sensitive=True - newPost = { - 'id': newPostId+'/activity', - 'type': 'Create', - 'actor': prefix+'://'+domain+'/users/'+nickname, - 'published': published, - 'to': [toUrl], - 'cc': [], - 'object': {'id': newPostId, - 'type': 'Note', - 'summary': summary, - 'inReplyTo': inReplyTo, - 'published': published, - 'url': prefix+'://'+domain+'/@'+nickname+'/'+statusNumber, - 'attributedTo': prefix+'://'+domain+'/users/'+nickname, - 'to': [toUrl], - 'cc': [], - 'sensitive': sensitive, - 'atomUri': prefix+'://'+domain+'/users/'+nickname+'/statuses/'+statusNumber, - 'inReplyToAtomUri': inReplyToAtomUri, - 'conversation': 'tag:'+domain+','+conversationDate+':objectId='+conversationId+':objectType=Conversation', - 'content': content, - 'contentMap': { - 'en': content - }, - 'attachment': [], - 'tag': [], - 'replies': {} - # 'id': 'https://'+domain+'/users/'+nickname+'/statuses/'+statusNumber+'/replies', - # 'type': 'Collection', - # 'first': { - # 'type': 'CollectionPage', - # 'partOf': 'https://'+domain+'/users/'+nickname+'/statuses/'+statusNumber+'/replies', - # 'items': [] - # } - #} + if not clientToServer: + newPost = { + 'id': newPostId+'/activity', + 'type': 'Create', + 'actor': prefix+'://'+domain+'/users/'+nickname, + 'published': published, + 'to': [toUrl], + 'cc': [], + 'object': { + 'id': newPostId, + 'type': 'Note', + 'summary': summary, + 'inReplyTo': inReplyTo, + 'published': published, + 'url': prefix+'://'+domain+'/@'+nickname+'/'+statusNumber, + 'attributedTo': prefix+'://'+domain+'/users/'+nickname, + 'to': [toUrl], + 'cc': [], + 'sensitive': sensitive, + 'atomUri': prefix+'://'+domain+'/users/'+nickname+'/statuses/'+statusNumber, + 'inReplyToAtomUri': inReplyToAtomUri, + 'conversation': 'tag:'+domain+','+conversationDate+':objectId='+conversationId+':objectType=Conversation', + 'content': content, + 'contentMap': { + 'en': content + }, + 'attachment': [], + 'tag': [], + 'replies': {} + # 'id': 'https://'+domain+'/users/'+nickname+'/statuses/'+statusNumber+'/replies', + # 'type': 'Collection', + # 'first': { + # 'type': 'CollectionPage', + # 'partOf': 'https://'+domain+'/users/'+nickname+'/statuses/'+statusNumber+'/replies', + # 'items': [] + # } + #} + } + } + else: + newPost = { + 'id': newPostId, + 'type': 'Note', + 'summary': summary, + 'inReplyTo': inReplyTo, + 'published': published, + 'url': prefix+'://'+domain+'/@'+nickname+'/'+statusNumber, + 'attributedTo': prefix+'://'+domain+'/users/'+nickname, + 'to': [toUrl], + 'cc': [], + 'sensitive': sensitive, + 'atomUri': prefix+'://'+domain+'/users/'+nickname+'/statuses/'+statusNumber, + 'inReplyToAtomUri': inReplyToAtomUri, + 'conversation': 'tag:'+domain+','+conversationDate+':objectId='+conversationId+':objectType=Conversation', + 'content': content, + 'contentMap': { + 'en': content + }, + 'attachment': [], + 'tag': [], + 'replies': {} } - } if ccUrl: if len(ccUrl)>0: newPost['cc']=ccUrl @@ -326,8 +351,10 @@ def createPostBase(baseDir: str,nickname: str, domain: str, port: int, \ commentjson.dump(newPost, fp, indent=4, sort_keys=False) return newPost -def createPublicPost(baseDir: str,nickname: str, domain: str, port: int,https: bool, \ - content: str, followersOnly: bool, saveToFile: bool, \ +def createPublicPost(baseDir: str, + nickname: str, domain: str, port: int,https: bool, \ + content: str, followersOnly: bool, saveToFile: bool, + clientToServer: bool, \ inReplyTo=None, inReplyToAtomUri=None, subject=None) -> {}: """Public post to the outbox """ @@ -337,7 +364,7 @@ def createPublicPost(baseDir: str,nickname: str, domain: str, port: int,https: b return createPostBase(baseDir,nickname, domain, port, \ 'https://www.w3.org/ns/activitystreams#Public', \ prefix+'://'+domain+'/users/'+nickname+'/followers', \ - https, content, followersOnly, saveToFile, \ + https, content, followersOnly, saveToFile, clientToServer, \ inReplyTo, inReplyToAtomUri, subject) def threadSendPost(session,postJsonObject: {},federationList: [],inboxUrl: str, \ @@ -368,8 +395,8 @@ def threadSendPost(session,postJsonObject: {},federationList: [],inboxUrl: str, def sendPost(session,baseDir: str,nickname: str, domain: str, port: int, \ toNickname: str, toDomain: str, toPort: int, cc: str, \ https: bool, content: str, followersOnly: bool, \ - saveToFile: bool, federationList: [], sendThreads: [], \ - postLog: [], cachedWebfingers: {},personCache: {}, \ + saveToFile: bool, clientToServer: bool, federationList: [], \ + sendThreads: [], postLog: [], cachedWebfingers: {},personCache: {}, \ inReplyTo=None, inReplyToAtomUri=None, subject=None) -> int: """Post to another inbox """ @@ -399,21 +426,27 @@ def sendPost(session,baseDir: str,nickname: str, domain: str, port: int, \ if not toPersonId: return 4 - postJsonObject=createPostBase(baseDir,nickname,domain,port, \ - toPersonId,cc,https,content, \ - followersOnly,saveToFile, \ - inReplyTo,inReplyToAtomUri, \ - subject) + postJsonObject = \ + createPostBase(baseDir,nickname,domain,port, \ + toPersonId,cc,https,content, \ + followersOnly,saveToFile,clientToServer, \ + inReplyTo,inReplyToAtomUri, \ + subject) # get the senders private key privateKeyPem=getPersonKey(nickname,domain,baseDir,'private') if len(privateKeyPem)==0: return 5 + if not clientToServer: + postPath='/inbox' + else: + postPath='/outbox' + # construct the http header signatureHeaderJson = \ createSignedHeader(privateKeyPem, nickname, domain, port, \ - '/inbox', https, withDigest, postJsonObject) + postPath, https, withDigest, postJsonObject) # Keep the number of threads being used small while len(sendThreads)>10: diff --git a/tests.py b/tests.py index 8bba9d09..4c3b4474 100644 --- a/tests.py +++ b/tests.py @@ -110,13 +110,14 @@ def createServerAlice(path: str,domain: str,port: int,federationList: []): nickname='alice' https=False useTor=False + clientToServer=False privateKeyPem,publicKeyPem,person,wfEndpoint=createPerson(path,nickname,domain,port,https,True) deleteAllPosts(path,nickname,domain) followPerson(path,nickname,domain,'bob','127.0.0.100:61936',federationList) followerOfPerson(path,nickname,domain,'bob','127.0.0.100:61936',federationList) - createPublicPost(path,nickname, domain, port,https, "No wise fish would go anywhere without a porpoise", False, True) - createPublicPost(path,nickname, domain, port,https, "Curiouser and curiouser!", False, True) - createPublicPost(path,nickname, domain, port,https, "In the gardens of memory, in the palace of dreams, that is where you and I shall meet", False, True) + createPublicPost(path,nickname, domain, port,https, "No wise fish would go anywhere without a porpoise", False, True, clientToServer) + createPublicPost(path,nickname, domain, port,https, "Curiouser and curiouser!", False, True, clientToServer) + createPublicPost(path,nickname, domain, port,https, "In the gardens of memory, in the palace of dreams, that is where you and I shall meet", False, True, clientToServer) global testServerAliceRunning testServerAliceRunning = True print('Server running: Alice') @@ -131,13 +132,14 @@ def createServerBob(path: str,domain: str,port: int,federationList: []): nickname='bob' https=False useTor=False + clientToServer=False privateKeyPem,publicKeyPem,person,wfEndpoint=createPerson(path,nickname,domain,port,https,True) deleteAllPosts(path,nickname,domain) followPerson(path,nickname,domain,'alice','127.0.0.50:61935',federationList) followerOfPerson(path,nickname,domain,'alice','127.0.0.50:61935',federationList) - createPublicPost(path,nickname, domain, port,https, "It's your life, live it your way.", False, True) - createPublicPost(path,nickname, domain, port,https, "One of the things I've realised is that I am very simple", False, True) - createPublicPost(path,nickname, domain, port,https, "Quantum physics is a bit of a passion of mine", False, True) + createPublicPost(path,nickname, domain, port,https, "It's your life, live it your way.", False, True, clientToServer) + createPublicPost(path,nickname, domain, port,https, "One of the things I've realised is that I am very simple", False, True, clientToServer) + createPublicPost(path,nickname, domain, port,https, "Quantum physics is a bit of a passion of mine", False, True, clientToServer) global testServerBobRunning testServerBobRunning = True print('Server running: Bob') @@ -191,10 +193,11 @@ def testPostMessageBetweenServers(): alicePostLog = [] followersOnly=False saveToFile=True + clientToServer=False ccUrl=None alicePersonCache={} aliceCachedWebfingers={} - sendResult = sendPost(sessionAlice,aliceDir,'alice', aliceDomain, alicePort, 'bob', bobDomain, bobPort, ccUrl, https, 'Why is a mouse when it spins?', followersOnly, saveToFile, federationList, aliceSendThreads, alicePostLog, aliceCachedWebfingers,alicePersonCache,inReplyTo, inReplyToAtomUri, subject) + sendResult = sendPost(sessionAlice,aliceDir,'alice', aliceDomain, alicePort, 'bob', bobDomain, bobPort, ccUrl, https, 'Why is a mouse when it spins?', followersOnly, saveToFile, clientToServer, federationList, aliceSendThreads, alicePostLog, aliceCachedWebfingers,alicePersonCache,inReplyTo, inReplyToAtomUri, subject) print('sendResult: '+str(sendResult)) for i in range(10): @@ -275,6 +278,7 @@ def testCreatePerson(): domain='badgerdomain.com' port=80 https=True + clientToServer=False baseDir=currDir+'/.tests_createperson' if os.path.isdir(baseDir): shutil.rmtree(baseDir) @@ -286,7 +290,7 @@ def testCreatePerson(): setPreferredNickname(baseDir,nickname,domain,'badger') setBio(baseDir,nickname,domain,'Randomly roaming in your backyard') archivePosts(nickname,domain,baseDir,4) - createPublicPost(baseDir,nickname, domain, port,https, "G'day world!", False, True, None, None, 'Not suitable for Vogons') + createPublicPost(baseDir,nickname, domain, port,https, "G'day world!", False, True, clientToServer, None, None, 'Not suitable for Vogons') os.chdir(currDir) shutil.rmtree(baseDir)