Shared inbox actor on @domain@domain

master
Bob Mottram 2019-08-23 14:47:29 +01:00
parent d9c8dc46c2
commit 377940a31f
7 changed files with 33 additions and 50 deletions

View File

@ -488,7 +488,9 @@ class PubServer(BaseHTTPRequestHandler):
createSession(self.server.domain,self.server.port,self.server.useTor)
# treat shared inbox paths consistently
if self.path=='/sharedInbox' or self.path=='/users/inbox':
if self.path=='/sharedInbox' or \
self.path=='/users/inbox' or \
self.path=='/users/'+self.server.domain:
self.path='/inbox'
# is this a html request?

View File

@ -817,17 +817,9 @@ if args.actor:
port=443
session = createSession(domain,port,useTor)
if nickname!='inbox':
wfRequest = webfingerHandle(session,nickname+'@'+domain,httpPrefix,wfCache, \
domain,__version__)
else:
wfRequest={
'aliases': [httpPrefix+'://'+domain+'/@inbox',
httpPrefix+'://'+domain+'/users/inbox'],
'links': [{'href': httpPrefix+'://'+domain+'/users/inbox',
'rel': 'self',
'type': 'application/activity+json'}],
'subject': 'acct:inbox@'+domain
}
nickname=domain
wfRequest = webfingerHandle(session,nickname+'@'+domain,httpPrefix,wfCache, \
domain,__version__)
if not wfRequest:
print('Unable to webfinger '+nickname+'@'+domain)
@ -858,7 +850,7 @@ if args.addaccount:
if not args.domain or not getConfigParam(baseDir,'domain'):
print('Use the --domain option to set the domain name')
sys.exit()
if not validNickname(nickname):
if not validNickname(domain,nickname):
print(nickname+' is a reserved name. Use something different.')
sys.exit()
if not args.password:

View File

@ -207,7 +207,7 @@ def getFollowingFeed(baseDir: str,domain: str,port: int,path: str, \
nickname=path.replace('/@','',1).replace('/'+followFile,'')
if not nickname:
return None
if not validNickname(nickname):
if not validNickname(domain,nickname):
return None
if port:

View File

@ -248,7 +248,7 @@ def registerAccount(baseDir: str,httpPrefix: str,domain: str,port: int, \
"""
if accountExists(baseDir,nickname,domain):
return False
if not validNickname(nickname):
if not validNickname(domain,nickname):
print('REGISTER: Nickname '+nickname+' is invalid')
return False
if len(password)<8:
@ -265,7 +265,7 @@ def createPerson(baseDir: str,nickname: str,domain: str,port: int, \
httpPrefix: str, saveToFile: bool,password=None) -> (str,str,{},{}):
"""Returns the private key, public key, actor and webfinger endpoint
"""
if not validNickname(nickname):
if not validNickname(domain,nickname):
return None,None,None,None
# If a config.json file doesn't exist then don't decrement
@ -321,7 +321,8 @@ def personLookup(domain: str,path: str,baseDir: str) -> {}:
# is this a shared inbox lookup?
isSharedInbox=False
if path=='/inbox' or path=='/users/inbox' or path=='/sharedInbox':
path='/users/inbox'
# shared inbox actor on @domain@domain
path='/users/'+domain
isSharedInbox=True
else:
notPersonLookup=['/inbox','/outbox','/outboxarchive', \
@ -337,7 +338,7 @@ def personLookup(domain: str,path: str,baseDir: str) -> {}:
nickname=path.replace('/@','',1)
if not nickname:
return None
if not isSharedInbox and not validNickname(nickname):
if not isSharedInbox and not validNickname(domain,nickname):
return None
if ':' in domain:
domain=domain.split(':')[0]
@ -391,7 +392,7 @@ def personBoxJson(baseDir: str,domain: str,port: int,path: str, \
nickname=path.replace('/@','',1).replace('/'+boxname,'')
if not nickname:
return None
if not validNickname(nickname):
if not validNickname(domain,nickname):
return None
if boxname=='inbox':
return createInbox(baseDir,nickname,domain,port,httpPrefix, \
@ -438,7 +439,7 @@ def personInboxJson(baseDir: str,domain: str,port: int,path: str, \
nickname=path.replace('/@','',1).replace('/inbox','')
if not nickname:
return None
if not validNickname(nickname):
if not validNickname(domain,nickname):
return None
return createInbox(baseDir,nickname,domain,port,httpPrefix, \
noOfItems,headerOnly,ocapAlways,pageNumber)

View File

@ -792,7 +792,10 @@ def getMentionedPeople(baseDir: str,httpPrefix: str, \
if not ('.' in externalDomain or externalDomain=='localhost'):
continue
mentionedNickname=handle.split('@')[0]
if not validNickname(mentionedNickname):
mentionedDomain=handle.split('@')[1].strip('\n')
if ':' in mentionedDomain:
mentionedDomain=mentionedDomain.split(':')[0]
if not validNickname(mentionedDomain,mentionedNickname):
continue
actor=httpPrefix+'://'+handle.split('@')[1]+'/users/'+mentionedNickname
mentions.append(actor)
@ -1167,6 +1170,8 @@ def sendSignedJson(postJsonObject: {},session,baseDir: str, \
sharedInbox=False
if toNickname=='inbox':
# shared inbox actor on @domain@domain
toNickname=toDomain
sharedInbox=True
if toPort:
@ -1174,37 +1179,18 @@ def sendSignedJson(postJsonObject: {},session,baseDir: str, \
if ':' not in toDomain:
toDomain=toDomain+':'+str(toPort)
if not sharedInbox:
handle=httpPrefix+'://'+toDomain+'/@'+toNickname
else:
handle=httpPrefix+'://'+toDomain+'/'+toNickname
sharedInboxUrl=handle
handle=httpPrefix+'://'+toDomain+'/@'+toNickname
if debug:
print('DEBUG: handle - '+handle+' toPort '+str(toPort))
if not sharedInbox:
# lookup the inbox for the To handle
wfRequest=webfingerHandle(session,handle,httpPrefix,cachedWebfingers, \
domain,projectVersion)
if not wfRequest:
if debug:
print('DEBUG: webfinger for '+handle+' failed')
return 1
else:
wfRequest={
"aliases": [
httpPrefix+'://'+toDomain+'/users/inbox'
],
"links": [
{
"href": httpPrefix+'://'+toDomain+'/users/inbox',
"rel": "self",
"type": "application/activity+json"
}
],
"subject": 'acct:inbox@'+toDomain
}
# lookup the inbox for the To handle
wfRequest=webfingerHandle(session,handle,httpPrefix,cachedWebfingers, \
domain,projectVersion)
if not wfRequest:
if debug:
print('DEBUG: webfinger for '+handle+' failed')
return 1
if not clientToServer:
postToBox='inbox'

View File

@ -202,7 +202,7 @@ def getSharesFeedForPerson(baseDir: str, \
nickname=path.replace('/@','',1).replace('/shares','')
if not nickname:
return None
if not validNickname(nickname):
if not validNickname(domain,nickname):
return None
if port:

View File

@ -265,11 +265,13 @@ def deletePost(baseDir: str,httpPrefix: str,nickname: str,domain: str,postFilena
# finally, remove the post itself
os.remove(postFilename)
def validNickname(nickname: str) -> bool:
def validNickname(domain: str,nickname: str) -> bool:
forbiddenChars=['.',' ','/','?',':',';','@']
for c in forbiddenChars:
if c in nickname:
return False
if nickname==domain:
return False
reservedNames=['inbox','outbox','following','followers','capabilities']
if nickname in reservedNames:
return False