Configurable default follower approval

main
Bob Mottram 2020-07-12 13:31:28 +01:00
parent f537c2f96f
commit 9bc6f1691e
4 changed files with 60 additions and 38 deletions

View File

@ -5842,7 +5842,9 @@ class PubServer(BaseHTTPRequestHandler):
self.server.httpPrefix, self.server.httpPrefix,
self.server.domain, self.server.domain,
self.server.port, self.server.port,
loginNickname, loginPassword): loginNickname,
loginPassword,
self.server.manualFollowerApproval):
self.server.POSTbusy = False self.server.POSTbusy = False
if callingDomain.endswith('.onion') and \ if callingDomain.endswith('.onion') and \
self.server.onionDomain: self.server.onionDomain:
@ -8324,7 +8326,8 @@ def runDaemon(blogsInstance: bool, mediaInstance: bool,
domainMaxPostsPerDay=8640, accountMaxPostsPerDay=864, domainMaxPostsPerDay=8640, accountMaxPostsPerDay=864,
allowDeletion=False, debug=False, unitTest=False, allowDeletion=False, debug=False, unitTest=False,
instanceOnlySkillsSearch=False, sendThreads=[], instanceOnlySkillsSearch=False, sendThreads=[],
useBlurHash=False) -> None: useBlurHash=False,
manualFollowerApproval=True) -> None:
if len(domain) == 0: if len(domain) == 0:
domain = 'localhost' domain = 'localhost'
if '.' not in domain: if '.' not in domain:
@ -8356,6 +8359,7 @@ def runDaemon(blogsInstance: bool, mediaInstance: bool,
httpd.blocklistUpdateInterval = 100 httpd.blocklistUpdateInterval = 100
httpd.domainBlocklist = getDomainBlocklist(baseDir) httpd.domainBlocklist = getDomainBlocklist(baseDir)
httpd.manualFollowerApproval = manualFollowerApproval
httpd.onionDomain = onionDomain httpd.onionDomain = onionDomain
httpd.i2pDomain = i2pDomain httpd.i2pDomain = i2pDomain
httpd.useBlurHash = useBlurHash httpd.useBlurHash = useBlurHash

View File

@ -163,6 +163,9 @@ parser.add_argument('--json', dest='json', type=str, default=None,
help='Show the json for a given activitypub url') help='Show the json for a given activitypub url')
parser.add_argument('-f', '--federate', nargs='+', dest='federationList', parser.add_argument('-f', '--federate', nargs='+', dest='federationList',
help='Specify federation list separated by spaces') help='Specify federation list separated by spaces')
parser.add_argument("--noapproval", type=str2bool, nargs='?',
const=True, default=False,
help="Allow followers without approval")
parser.add_argument("--mediainstance", type=str2bool, nargs='?', parser.add_argument("--mediainstance", type=str2bool, nargs='?',
const=True, default=False, const=True, default=False,
help="Media Instance - favor media over text") help="Media Instance - favor media over text")
@ -1265,7 +1268,7 @@ if args.addaccount:
print('Account is deactivated') print('Account is deactivated')
sys.exit() sys.exit()
createPerson(baseDir, nickname, domain, port, httpPrefix, createPerson(baseDir, nickname, domain, port, httpPrefix,
True, args.password.strip()) True, not args.noapproval, args.password.strip())
if os.path.isdir(baseDir + '/accounts/' + nickname + '@' + domain): if os.path.isdir(baseDir + '/accounts/' + nickname + '@' + domain):
print('Account created for ' + nickname + '@' + domain) print('Account created for ' + nickname + '@' + domain)
else: else:
@ -1696,16 +1699,16 @@ if args.testdata:
str(maxRegistrations)) str(maxRegistrations))
createPerson(baseDir, 'maxboardroom', domain, port, httpPrefix, createPerson(baseDir, 'maxboardroom', domain, port, httpPrefix,
True, password) True, False, password)
createPerson(baseDir, 'ultrapancake', domain, port, httpPrefix, createPerson(baseDir, 'ultrapancake', domain, port, httpPrefix,
True, password) True, False, password)
createPerson(baseDir, 'drokk', domain, port, httpPrefix, createPerson(baseDir, 'drokk', domain, port, httpPrefix,
True, password) True, False, password)
createPerson(baseDir, 'sausagedog', domain, port, httpPrefix, createPerson(baseDir, 'sausagedog', domain, port, httpPrefix,
True, password) True, False, password)
createPerson(baseDir, nickname, domain, port, httpPrefix, createPerson(baseDir, nickname, domain, port, httpPrefix,
True, 'likewhateveryouwantscoob') True, False, 'likewhateveryouwantscoob')
setSkillLevel(baseDir, nickname, domain, 'testing', 60) setSkillLevel(baseDir, nickname, domain, 'testing', 60)
setSkillLevel(baseDir, nickname, domain, 'typing', 50) setSkillLevel(baseDir, nickname, domain, 'typing', 50)
setRole(baseDir, nickname, domain, 'instance', 'admin') setRole(baseDir, nickname, domain, 'instance', 'admin')
@ -1807,4 +1810,4 @@ runDaemon(args.blogsinstance, args.mediainstance,
args.accountMaxPostsPerDay, args.accountMaxPostsPerDay,
args.allowdeletion, debug, False, args.allowdeletion, debug, False,
args.instanceOnlySkillsSearch, [], args.instanceOnlySkillsSearch, [],
args.blurhash) args.blurhash, not args.noapproval)

View File

@ -165,6 +165,7 @@ def randomizeActorImages(personJson: {}) -> None:
def createPersonBase(baseDir: str, nickname: str, domain: str, port: int, def createPersonBase(baseDir: str, nickname: str, domain: str, port: int,
httpPrefix: str, saveToFile: bool, httpPrefix: str, saveToFile: bool,
manualFollowerApproval: bool,
password=None) -> (str, str, {}, {}): password=None) -> (str, str, {}, {}):
"""Returns the private key, public key, actor and webfinger endpoint """Returns the private key, public key, actor and webfinger endpoint
""" """
@ -185,7 +186,7 @@ def createPersonBase(baseDir: str, nickname: str, domain: str, port: int,
personType = 'Person' personType = 'Person'
# Enable follower approval by default # Enable follower approval by default
approveFollowers = True approveFollowers = manualFollowerApproval
personName = nickname personName = nickname
personId = httpPrefix + '://' + domain + '/users/' + nickname personId = httpPrefix + '://' + domain + '/users/' + nickname
inboxStr = personId + '/inbox' inboxStr = personId + '/inbox'
@ -352,7 +353,8 @@ def createPersonBase(baseDir: str, nickname: str, domain: str, port: int,
def registerAccount(baseDir: str, httpPrefix: str, domain: str, port: int, def registerAccount(baseDir: str, httpPrefix: str, domain: str, port: int,
nickname: str, password: str) -> bool: nickname: str, password: str,
manualFollowerApproval: bool) -> bool:
"""Registers a new account from the web interface """Registers a new account from the web interface
""" """
if accountExists(baseDir, nickname, domain): if accountExists(baseDir, nickname, domain):
@ -367,6 +369,7 @@ def registerAccount(baseDir: str, httpPrefix: str, domain: str, port: int,
newPerson, webfingerEndpoint) = createPerson(baseDir, nickname, newPerson, webfingerEndpoint) = createPerson(baseDir, nickname,
domain, port, domain, port,
httpPrefix, True, httpPrefix, True,
manualFollowerApproval,
password) password)
if privateKeyPem: if privateKeyPem:
return True return True
@ -382,7 +385,7 @@ def createGroup(baseDir: str, nickname: str, domain: str, port: int,
newPerson, webfingerEndpoint) = createPerson(baseDir, nickname, newPerson, webfingerEndpoint) = createPerson(baseDir, nickname,
domain, port, domain, port,
httpPrefix, saveToFile, httpPrefix, saveToFile,
password) False, password)
newPerson['type'] = 'Group' newPerson['type'] = 'Group'
return privateKeyPem, publicKeyPem, newPerson, webfingerEndpoint return privateKeyPem, publicKeyPem, newPerson, webfingerEndpoint
@ -407,6 +410,7 @@ def savePersonQrcode(baseDir: str,
def createPerson(baseDir: str, nickname: str, domain: str, port: int, def createPerson(baseDir: str, nickname: str, domain: str, port: int,
httpPrefix: str, saveToFile: bool, httpPrefix: str, saveToFile: bool,
manualFollowerApproval: bool,
password=None) -> (str, str, {}, {}): password=None) -> (str, str, {}, {}):
"""Returns the private key, public key, actor and webfinger endpoint """Returns the private key, public key, actor and webfinger endpoint
""" """
@ -425,7 +429,9 @@ def createPerson(baseDir: str, nickname: str, domain: str, port: int,
newPerson, webfingerEndpoint) = createPersonBase(baseDir, nickname, newPerson, webfingerEndpoint) = createPersonBase(baseDir, nickname,
domain, port, domain, port,
httpPrefix, httpPrefix,
saveToFile, password) saveToFile,
manualFollowerApproval,
password)
if noOfAccounts(baseDir) == 1: if noOfAccounts(baseDir) == 1:
# print(nickname+' becomes the instance admin and a moderator') # print(nickname+' becomes the instance admin and a moderator')
setRole(baseDir, nickname, domain, 'instance', 'admin') setRole(baseDir, nickname, domain, 'instance', 'admin')
@ -470,7 +476,7 @@ def createSharedInbox(baseDir: str, nickname: str, domain: str, port: int,
"""Generates the shared inbox """Generates the shared inbox
""" """
return createPersonBase(baseDir, nickname, domain, port, httpPrefix, return createPersonBase(baseDir, nickname, domain, port, httpPrefix,
True, None) True, True, None)
def createCapabilitiesInbox(baseDir: str, nickname: str, def createCapabilitiesInbox(baseDir: str, nickname: str,
@ -479,7 +485,7 @@ def createCapabilitiesInbox(baseDir: str, nickname: str,
"""Generates the capabilities inbox to sign requests """Generates the capabilities inbox to sign requests
""" """
return createPersonBase(baseDir, nickname, domain, port, return createPersonBase(baseDir, nickname, domain, port,
httpPrefix, True, None) httpPrefix, True, True, None)
def personUpgradeActor(baseDir: str, personJson: {}, def personUpgradeActor(baseDir: str, personJson: {},

View File

@ -101,7 +101,8 @@ def testHttpsigBase(withDigest):
port = 5576 port = 5576
password = 'SuperSecretPassword' password = 'SuperSecretPassword'
privateKeyPem, publicKeyPem, person, wfEndpoint = \ privateKeyPem, publicKeyPem, person, wfEndpoint = \
createPerson(path, nickname, domain, port, httpPrefix, False, password) createPerson(path, nickname, domain, port, httpPrefix,
False, False, password)
assert privateKeyPem assert privateKeyPem
messageBodyJson = { messageBodyJson = {
"a key": "a value", "a key": "a value",
@ -253,7 +254,8 @@ def createServerAlice(path: str, domain: str, port: int,
accountMaxPostsPerDay = 1000 accountMaxPostsPerDay = 1000
allowDeletion = True allowDeletion = True
privateKeyPem, publicKeyPem, person, wfEndpoint = \ privateKeyPem, publicKeyPem, person, wfEndpoint = \
createPerson(path, nickname, domain, port, httpPrefix, True, password) createPerson(path, nickname, domain, port, httpPrefix, True,
False, password)
deleteAllPosts(path, nickname, domain, 'inbox') deleteAllPosts(path, nickname, domain, 'inbox')
deleteAllPosts(path, nickname, domain, 'outbox') deleteAllPosts(path, nickname, domain, 'outbox')
assert setSkillLevel(path, nickname, domain, 'hacking', 90) assert setSkillLevel(path, nickname, domain, 'hacking', 90)
@ -289,7 +291,8 @@ def createServerAlice(path: str, domain: str, port: int,
noreply, nolike, nopics, noannounce, cw, ocapAlways, noreply, nolike, nopics, noannounce, cw, ocapAlways,
proxyType, maxReplies, proxyType, maxReplies,
domainMaxPostsPerDay, accountMaxPostsPerDay, domainMaxPostsPerDay, accountMaxPostsPerDay,
allowDeletion, True, True, False, sendThreads, False) allowDeletion, True, True, False, sendThreads, False,
False)
def createServerBob(path: str, domain: str, port: int, def createServerBob(path: str, domain: str, port: int,
@ -317,7 +320,8 @@ def createServerBob(path: str, domain: str, port: int,
accountMaxPostsPerDay = 1000 accountMaxPostsPerDay = 1000
allowDeletion = True allowDeletion = True
privateKeyPem, publicKeyPem, person, wfEndpoint = \ privateKeyPem, publicKeyPem, person, wfEndpoint = \
createPerson(path, nickname, domain, port, httpPrefix, True, password) createPerson(path, nickname, domain, port, httpPrefix, True,
False, password)
deleteAllPosts(path, nickname, domain, 'inbox') deleteAllPosts(path, nickname, domain, 'inbox')
deleteAllPosts(path, nickname, domain, 'outbox') deleteAllPosts(path, nickname, domain, 'outbox')
assert setRole(path, nickname, domain, 'bandname', 'bass player') assert setRole(path, nickname, domain, 'bandname', 'bass player')
@ -352,7 +356,8 @@ def createServerBob(path: str, domain: str, port: int,
noreply, nolike, nopics, noannounce, cw, ocapAlways, noreply, nolike, nopics, noannounce, cw, ocapAlways,
proxyType, maxReplies, proxyType, maxReplies,
domainMaxPostsPerDay, accountMaxPostsPerDay, domainMaxPostsPerDay, accountMaxPostsPerDay,
allowDeletion, True, True, False, sendThreads, False) allowDeletion, True, True, False, sendThreads, False,
False)
def createServerEve(path: str, domain: str, port: int, federationList: [], def createServerEve(path: str, domain: str, port: int, federationList: [],
@ -375,7 +380,8 @@ def createServerEve(path: str, domain: str, port: int, federationList: [],
maxReplies = 64 maxReplies = 64
allowDeletion = True allowDeletion = True
privateKeyPem, publicKeyPem, person, wfEndpoint = \ privateKeyPem, publicKeyPem, person, wfEndpoint = \
createPerson(path, nickname, domain, port, httpPrefix, True, password) createPerson(path, nickname, domain, port, httpPrefix, True,
False, password)
deleteAllPosts(path, nickname, domain, 'inbox') deleteAllPosts(path, nickname, domain, 'inbox')
deleteAllPosts(path, nickname, domain, 'outbox') deleteAllPosts(path, nickname, domain, 'outbox')
global testServerEveRunning global testServerEveRunning
@ -391,7 +397,7 @@ def createServerEve(path: str, domain: str, port: int, federationList: [],
httpPrefix, federationList, maxMentions, maxEmoji, False, httpPrefix, federationList, maxMentions, maxEmoji, False,
noreply, nolike, nopics, noannounce, cw, ocapAlways, noreply, nolike, nopics, noannounce, cw, ocapAlways,
proxyType, maxReplies, allowDeletion, True, True, False, proxyType, maxReplies, allowDeletion, True, True, False,
sendThreads, False) sendThreads, False, False)
def testPostMessageBetweenServers(): def testPostMessageBetweenServers():
@ -840,15 +846,15 @@ def testFollowersOfPerson():
os.mkdir(baseDir) os.mkdir(baseDir)
os.chdir(baseDir) os.chdir(baseDir)
createPerson(baseDir, nickname, domain, port, createPerson(baseDir, nickname, domain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
createPerson(baseDir, 'maxboardroom', domain, port, createPerson(baseDir, 'maxboardroom', domain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
createPerson(baseDir, 'ultrapancake', domain, port, createPerson(baseDir, 'ultrapancake', domain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
createPerson(baseDir, 'drokk', domain, port, createPerson(baseDir, 'drokk', domain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
createPerson(baseDir, 'sausagedog', domain, port, createPerson(baseDir, 'sausagedog', domain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
clearFollows(baseDir, nickname, domain) clearFollows(baseDir, nickname, domain)
followPerson(baseDir, nickname, domain, 'maxboardroom', domain, followPerson(baseDir, nickname, domain, 'maxboardroom', domain,
@ -889,15 +895,16 @@ def testNoOfFollowersOnDomain():
shutil.rmtree(baseDir) shutil.rmtree(baseDir)
os.mkdir(baseDir) os.mkdir(baseDir)
os.chdir(baseDir) os.chdir(baseDir)
createPerson(baseDir, nickname, domain, port, httpPrefix, True, password) createPerson(baseDir, nickname, domain, port, httpPrefix, True,
False, password)
createPerson(baseDir, 'maxboardroom', otherdomain, port, createPerson(baseDir, 'maxboardroom', otherdomain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
createPerson(baseDir, 'ultrapancake', otherdomain, port, createPerson(baseDir, 'ultrapancake', otherdomain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
createPerson(baseDir, 'drokk', otherdomain, port, createPerson(baseDir, 'drokk', otherdomain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
createPerson(baseDir, 'sausagedog', otherdomain, port, createPerson(baseDir, 'sausagedog', otherdomain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
followPerson(baseDir, 'drokk', otherdomain, nickname, domain, followPerson(baseDir, 'drokk', otherdomain, nickname, domain,
federationList, False) federationList, False)
@ -949,7 +956,8 @@ def testGroupFollowers():
shutil.rmtree(baseDir) shutil.rmtree(baseDir)
os.mkdir(baseDir) os.mkdir(baseDir)
os.chdir(baseDir) os.chdir(baseDir)
createPerson(baseDir, nickname, domain, port, httpPrefix, True, password) createPerson(baseDir, nickname, domain, port, httpPrefix, True,
False, password)
clearFollowers(baseDir, nickname, domain) clearFollowers(baseDir, nickname, domain)
followerOfPerson(baseDir, nickname, domain, 'badger', 'wild.domain', followerOfPerson(baseDir, nickname, domain, 'badger', 'wild.domain',
@ -992,7 +1000,8 @@ def testFollows():
shutil.rmtree(baseDir) shutil.rmtree(baseDir)
os.mkdir(baseDir) os.mkdir(baseDir)
os.chdir(baseDir) os.chdir(baseDir)
createPerson(baseDir, nickname, domain, port, httpPrefix, True, password) createPerson(baseDir, nickname, domain, port, httpPrefix, True,
False, password)
clearFollows(baseDir, nickname, domain) clearFollows(baseDir, nickname, domain)
followPerson(baseDir, nickname, domain, 'badger', 'wild.com', followPerson(baseDir, nickname, domain, 'badger', 'wild.com',
@ -1072,7 +1081,7 @@ def testCreatePerson():
privateKeyPem, publicKeyPem, person, wfEndpoint = \ privateKeyPem, publicKeyPem, person, wfEndpoint = \
createPerson(baseDir, nickname, domain, port, createPerson(baseDir, nickname, domain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
assert os.path.isfile(baseDir + '/accounts/passwords') assert os.path.isfile(baseDir + '/accounts/passwords')
deleteAllPosts(baseDir, nickname, domain, 'inbox') deleteAllPosts(baseDir, nickname, domain, 'inbox')
deleteAllPosts(baseDir, nickname, domain, 'outbox') deleteAllPosts(baseDir, nickname, domain, 'outbox')
@ -1106,10 +1115,10 @@ def testDelegateRoles():
privateKeyPem, publicKeyPem, person, wfEndpoint = \ privateKeyPem, publicKeyPem, person, wfEndpoint = \
createPerson(baseDir, nickname, domain, port, createPerson(baseDir, nickname, domain, port,
httpPrefix, True, password) httpPrefix, True, False, password)
privateKeyPem, publicKeyPem, person, wfEndpoint = \ privateKeyPem, publicKeyPem, person, wfEndpoint = \
createPerson(baseDir, nicknameDelegated, domain, port, createPerson(baseDir, nicknameDelegated, domain, port,
httpPrefix, True, 'insecure') httpPrefix, True, False, 'insecure')
httpPrefix = 'http' httpPrefix = 'http'
project = 'artechoke' project = 'artechoke'
@ -1702,7 +1711,7 @@ def testAddEmoji():
os.chdir(baseDir) os.chdir(baseDir)
privateKeyPem, publicKeyPem, person, wfEndpoint = \ privateKeyPem, publicKeyPem, person, wfEndpoint = \
createPerson(baseDir, nickname, domain, port, createPerson(baseDir, nickname, domain, port,
httpPrefix, True, 'password') httpPrefix, True, False, 'password')
contentModified = \ contentModified = \
addHtmlTags(baseDir, httpPrefix, addHtmlTags(baseDir, httpPrefix,
nickname, domain, content, nickname, domain, content,