mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			Resolving recipients
							parent
							
								
									7106ad84e6
								
							
						
					
					
						commit
						5d9f972a5d
					
				
							
								
								
									
										19
									
								
								follow.py
								
								
								
								
							
							
						
						
									
										19
									
								
								follow.py
								
								
								
								
							| 
						 | 
				
			
			@ -350,22 +350,21 @@ def sendFollowRequest(session,baseDir: str, \
 | 
			
		|||
 | 
			
		||||
    return newFollowJson
 | 
			
		||||
 | 
			
		||||
def getFollowersOfActor(baseDir :str,actor :str) -> []:
 | 
			
		||||
def getFollowersOfActor(baseDir :str,actor :str,recipientsDict: {}) -> {}:
 | 
			
		||||
    """In a shared inbox if we receive a post we know who it's from
 | 
			
		||||
    and if it's addressed to followers then we need to get a list of those.
 | 
			
		||||
    This returns a list of account handles which follow the given actor
 | 
			
		||||
    and also the corresponding capability id if it exists
 | 
			
		||||
    """
 | 
			
		||||
    result=[]
 | 
			
		||||
    if ':' not in actor:
 | 
			
		||||
        return result
 | 
			
		||||
        return recipientsDict
 | 
			
		||||
    httpPrefix=actor.split(':')[0]
 | 
			
		||||
    nickname=getNicknameFromActor(actor)
 | 
			
		||||
    if not nickname:
 | 
			
		||||
        return result
 | 
			
		||||
        return recipientsDict
 | 
			
		||||
    domain,port=getDomainFromActor(actor)
 | 
			
		||||
    if not domain:
 | 
			
		||||
        return result
 | 
			
		||||
        return recipientsDict
 | 
			
		||||
    actorHandle=nickname+'@'+domain
 | 
			
		||||
    # for each of the accounts
 | 
			
		||||
    for subdir, dirs, files in os.walk(baseDir+'/accounts'):
 | 
			
		||||
| 
						 | 
				
			
			@ -375,14 +374,14 @@ def getFollowersOfActor(baseDir :str,actor :str) -> []:
 | 
			
		|||
                if os.path.isfile(followingFilename):
 | 
			
		||||
                    # does this account follow the given actor?
 | 
			
		||||
                    if actorHandle in open(followingFilename).read():
 | 
			
		||||
                        ocapFilename=baseDir+'/accounts/'+account+'/ocap/granted/'+httpPrefix+':##'+domain+':'+str(port)+'#users#'+nickname+'.json'
 | 
			
		||||
                        ocapFilename=baseDir+'/accounts/'+account+'/ocap/accept/'+httpPrefix+':##'+domain+':'+str(port)+'#users#'+nickname+'.json'
 | 
			
		||||
                        if os.path.isfile(ocapFilename):                        
 | 
			
		||||
                            with open(ocapFilename, 'r') as fp:
 | 
			
		||||
                                ocapJson=commentjson.load(fp)
 | 
			
		||||
                            if ocapJson.get('id'):                                
 | 
			
		||||
                                result.append([account,ocapJson['id']])
 | 
			
		||||
                                recipientsDict[account]=ocapJson['id']
 | 
			
		||||
                            else:
 | 
			
		||||
                                result.append([account,None])
 | 
			
		||||
                                recipientsDict[account]=None
 | 
			
		||||
                        else:
 | 
			
		||||
                            result.append([account,None])
 | 
			
		||||
    return result
 | 
			
		||||
                            recipientsDict[account]=None
 | 
			
		||||
    return recipientsDict
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										130
									
								
								inbox.py
								
								
								
								
							
							
						
						
									
										130
									
								
								inbox.py
								
								
								
								
							| 
						 | 
				
			
			@ -149,29 +149,6 @@ def savePostToInboxQueue(baseDir: str,httpPrefix: str,nickname: str, domain: str
 | 
			
		|||
        commentjson.dump(newQueueItem, fp, indent=4, sort_keys=False)
 | 
			
		||||
    return filename
 | 
			
		||||
 | 
			
		||||
def postedToFollowers(postJsonObject: {}) -> bool:
 | 
			
		||||
    """Is the given post sent to followers
 | 
			
		||||
    """
 | 
			
		||||
    if postJsonObject.get('object'):
 | 
			
		||||
        if postJsonObject['object'].get('to'):
 | 
			
		||||
            for recipient in postJsonObject['object']['to']:
 | 
			
		||||
                if 'followers' in recipient:
 | 
			
		||||
                    return True
 | 
			
		||||
        if postJsonObject['object'].get('cc'):
 | 
			
		||||
            for recipient in postJsonObject['object']['cc']:
 | 
			
		||||
                if 'followers' in recipient:
 | 
			
		||||
                    return True
 | 
			
		||||
            
 | 
			
		||||
    if postJsonObject.get('to'):
 | 
			
		||||
        for recipient in postJsonObject['to']:
 | 
			
		||||
            if 'followers' in recipient:
 | 
			
		||||
                return True
 | 
			
		||||
    if postJsonObject.get('cc'):
 | 
			
		||||
        for recipient in postJsonObject['cc']:
 | 
			
		||||
            if 'followers' in recipient:
 | 
			
		||||
                return True
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
def inboxCheckCapabilities(baseDir :str,nickname :str,domain :str, \
 | 
			
		||||
                           actor: str,queue: [],queueJson: {}, \
 | 
			
		||||
                           capabilityId: str,debug : bool) -> bool:
 | 
			
		||||
| 
						 | 
				
			
			@ -225,6 +202,103 @@ def inboxCheckCapabilities(baseDir :str,nickname :str,domain :str, \
 | 
			
		|||
        print('DEBUG: object capabilities check success')
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
def inboxPostRecipientsAdd(baseDir :str,httpPrefix :str,toList :[], \
 | 
			
		||||
                           recipientsDict :{}, \
 | 
			
		||||
                           domainMatch: str,domain :str, \
 | 
			
		||||
                           actor :str) -> bool:
 | 
			
		||||
    """Given a list of post recipients (toList) from 'to' or 'cc' parameters
 | 
			
		||||
    populate a recipientsDict with the handle and capabilities id for each
 | 
			
		||||
    """
 | 
			
		||||
    followerRecipients=False
 | 
			
		||||
    for recipient in toList:
 | 
			
		||||
        # is this a to a local account?
 | 
			
		||||
        if domainMatch in recipient:
 | 
			
		||||
            # get the handle for the local account
 | 
			
		||||
            nickname=recipient.split(domainMatch)[1]
 | 
			
		||||
            handle=nickname+'@'+domain
 | 
			
		||||
            if os.path.isdir(baseDir+'/accounts/'+handle):
 | 
			
		||||
                # are capabilities granted for this account to the
 | 
			
		||||
                # sender (actor) of the post?
 | 
			
		||||
                ocapFilename=baseDir+'/accounts/'+handle+'/ocap/accept/'+actor.replace('/','#')+'.json'
 | 
			
		||||
                if os.path.isfile(ocapFilename):
 | 
			
		||||
                    # read the granted capabilities and obtain the id
 | 
			
		||||
                    with open(ocapFilename, 'r') as fp:
 | 
			
		||||
                        ocapJson=commentjson.load(fp)
 | 
			
		||||
                        if ocapJson.get('id'):
 | 
			
		||||
                            # append with the capabilities id
 | 
			
		||||
                            recipientsDict[handle]=ocapJson['id']
 | 
			
		||||
                        else:
 | 
			
		||||
                            recipientsDict[handle]=None
 | 
			
		||||
                else:
 | 
			
		||||
                    recipientsDict[handle]=None
 | 
			
		||||
        if recipient.endswith('followers'):
 | 
			
		||||
            followerRecipients=True
 | 
			
		||||
    return followerRecipients,recipientsDict
 | 
			
		||||
 | 
			
		||||
def inboxPostRecipients(baseDir :str,postJsonObject :{},httpPrefix :str,domain : str,port :int) -> []:
 | 
			
		||||
    recipientsDict={}
 | 
			
		||||
 | 
			
		||||
    if not postJsonObject.get('actor'):
 | 
			
		||||
        return recipientsDict
 | 
			
		||||
 | 
			
		||||
    if ':' in domain:
 | 
			
		||||
        domain=domain.split(':')[0]
 | 
			
		||||
    domainBase=domain
 | 
			
		||||
    if port!=80 and port!=443:
 | 
			
		||||
        domain=domain+':'+str(port)
 | 
			
		||||
    domainMatch='/'+domain+'/users/'
 | 
			
		||||
 | 
			
		||||
    actor = postJsonObject['actor']
 | 
			
		||||
    # first get any specific people which the post is addressed to
 | 
			
		||||
    
 | 
			
		||||
    followerRecipients=False
 | 
			
		||||
    if postJsonObject.get('object'):
 | 
			
		||||
        if isinstance(postJsonObject['object'], dict):
 | 
			
		||||
            if postJsonObject['object'].get('to'):
 | 
			
		||||
                includesFollowers,recipientsDict= \
 | 
			
		||||
                    inboxPostRecipientsAdd(baseDir,httpPrefix, \
 | 
			
		||||
                                           postJsonObject['object']['to'], \
 | 
			
		||||
                                           recipientsDict, \
 | 
			
		||||
                                           domainMatch,domainBase,actor)
 | 
			
		||||
                if includesFollowers:
 | 
			
		||||
                    followerRecipients=True
 | 
			
		||||
 | 
			
		||||
            if postJsonObject['object'].get('cc'):
 | 
			
		||||
                includesFollowers,recipientsDict= \
 | 
			
		||||
                    inboxPostRecipientsAdd(baseDir,httpPrefix, \
 | 
			
		||||
                                           postJsonObject['object']['cc'], \
 | 
			
		||||
                                           recipientsDict, \
 | 
			
		||||
                                           domainMatch,domainBase,actor)
 | 
			
		||||
                if includesFollowers:
 | 
			
		||||
                    followerRecipients=True
 | 
			
		||||
 | 
			
		||||
    if postJsonObject.get('to'):
 | 
			
		||||
        includesFollowers,recipientsDict= \
 | 
			
		||||
            inboxPostRecipientsAdd(baseDir,httpPrefix, \
 | 
			
		||||
                                   postJsonObject['to'], \
 | 
			
		||||
                                   recipientsDict, \
 | 
			
		||||
                                   domainMatch,domainBase,actor)
 | 
			
		||||
        if includesFollowers:
 | 
			
		||||
            followerRecipients=True
 | 
			
		||||
 | 
			
		||||
    if postJsonObject.get('cc'):
 | 
			
		||||
        includesFollowers,recipientsDict= \
 | 
			
		||||
            inboxPostRecipientsAdd(baseDir,httpPrefix, \
 | 
			
		||||
                                   postJsonObject['cc'], \
 | 
			
		||||
                                   recipientsDict, \
 | 
			
		||||
                                   domainMatch,domainBase,actor)
 | 
			
		||||
        if includesFollowers:
 | 
			
		||||
            followerRecipients=True
 | 
			
		||||
 | 
			
		||||
    if not followerRecipients:
 | 
			
		||||
        return recipientsDict
 | 
			
		||||
 | 
			
		||||
    # now resolve the followers
 | 
			
		||||
    recipientsDict= \
 | 
			
		||||
        getFollowersOfActor(baseDir,actor,recipientsDict)
 | 
			
		||||
 | 
			
		||||
    return recipientsDict
 | 
			
		||||
 | 
			
		||||
def runInboxQueue(baseDir: str,httpPrefix: str,sendThreads: [],postLog: [],cachedWebfingers: {},personCache: {},queue: [],domain: str,port: int,useTor: bool,federationList: [],ocapAlways: bool,ocapGranted: {},debug: bool) -> None:
 | 
			
		||||
    """Processes received items and moves them to
 | 
			
		||||
    the appropriate directories
 | 
			
		||||
| 
						 | 
				
			
			@ -256,11 +330,19 @@ def runInboxQueue(baseDir: str,httpPrefix: str,sendThreads: [],postLog: [],cache
 | 
			
		|||
            with open(queueFilename, 'r') as fp:
 | 
			
		||||
                queueJson=commentjson.load(fp)
 | 
			
		||||
 | 
			
		||||
            # get recipients list
 | 
			
		||||
            recipientsDict=inboxPostRecipients(baseDir,queueJson['post'],httpPrefix,domain,port)
 | 
			
		||||
 | 
			
		||||
            print('*************************************')
 | 
			
		||||
            print('Resolved recipients list:')
 | 
			
		||||
            pprint(recipientsDict)
 | 
			
		||||
            print('*************************************')
 | 
			
		||||
 | 
			
		||||
            sentToSharedInbox=False
 | 
			
		||||
            followerOcap=[]
 | 
			
		||||
            if queueJson['post'].get('actor'):
 | 
			
		||||
                # get the followers of this actor and their capabilities ids
 | 
			
		||||
                followerOcap=getFollowersOfActor(baseDir,queueJson['post']['actor'])
 | 
			
		||||
                #followerOcap=getFollowersOfActor(baseDir,queueJson['post']['actor'])
 | 
			
		||||
 | 
			
		||||
                if queueJson['post']['actor'].endswith('/inbox'):
 | 
			
		||||
                    sentToSharedInbox=True
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										8
									
								
								tests.py
								
								
								
								
							
							
						
						
									
										8
									
								
								tests.py
								
								
								
								
							| 
						 | 
				
			
			@ -360,12 +360,6 @@ def testFollowBetweenServers():
 | 
			
		|||
                    if os.path.isfile(aliceDir+'/accounts/alice@'+aliceDomain+'/ocap/granted/'+httpPrefix+':##'+bobDomain+':'+str(bobPort)+'#users#bob.json'):
 | 
			
		||||
                        break
 | 
			
		||||
        time.sleep(1)
 | 
			
		||||
 | 
			
		||||
    actorFollows=getFollowersOfActor(aliceDir,httpPrefix+'://'+bobDomain+':'+str(bobPort)+'/users/bob')
 | 
			
		||||
    print(str(actorFollows))
 | 
			
		||||
    assert len(actorFollows)==1
 | 
			
		||||
    assert actorFollows[0][0]=='alice@'+aliceDomain
 | 
			
		||||
    assert actorFollows[0][1].startswith(httpPrefix+'://'+bobDomain+':'+str(bobPort)+'/caps/')
 | 
			
		||||
        
 | 
			
		||||
    print('\n\nEve tries to send to Bob')
 | 
			
		||||
    sessionEve = createSession(eveDomain,evePort,useTor)
 | 
			
		||||
| 
						 | 
				
			
			@ -437,7 +431,7 @@ def testFollowBetweenServers():
 | 
			
		|||
    assert 'bob@'+bobDomain in open(aliceDir+'/accounts/alice@'+aliceDomain+'/following.txt').read()
 | 
			
		||||
    
 | 
			
		||||
    os.chdir(baseDir)
 | 
			
		||||
    shutil.rmtree(baseDir+'/.tests')
 | 
			
		||||
    #shutil.rmtree(baseDir+'/.tests')
 | 
			
		||||
 | 
			
		||||
def testFollowersOfPerson():
 | 
			
		||||
    print('testFollowersOfPerson')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue