Test that number of function arguments match

merge-requests/30/head
Bob Mottram 2020-12-22 21:24:46 +00:00
parent 49e052d5f0
commit 3ff0866deb
15 changed files with 282 additions and 69 deletions

View File

@ -174,7 +174,8 @@ def blurhash_encode(image, components_x=4, components_y=4, linear=False):
# Build final blurhash # Build final blurhash
blurhash = "" blurhash = ""
blurhash += _base83_encode((components_x - 1) + (components_y - 1) * 9, 1) blurhashValue = (components_x - 1) + (components_y - 1) * 9
blurhash += _base83_encode(blurhashValue, 1)
blurhash += _base83_encode(quant_max_ac_component, 1) blurhash += _base83_encode(quant_max_ac_component, 1)
blurhash += _base83_encode(dc_value, 4) blurhash += _base83_encode(dc_value, 4)
for ac_value in ac_values: for ac_value in ac_values:

View File

@ -58,7 +58,7 @@ from person import personBoxJson
from person import createSharedInbox from person import createSharedInbox
from person import createNewsInbox from person import createNewsInbox
from person import suspendAccount from person import suspendAccount
from person import unsuspendAccount from person import reenableAccount
from person import removeAccount from person import removeAccount
from person import canRemovePost from person import canRemovePost
from person import personSnooze from person import personSnooze
@ -1074,13 +1074,14 @@ class PubServer(BaseHTTPRequestHandler):
beginSaveTime = time.time() beginSaveTime = time.time()
# save the json for later queue processing # save the json for later queue processing
messageBytesDecoded = messageBytes.decode('utf-8')
queueFilename = \ queueFilename = \
savePostToInboxQueue(self.server.baseDir, savePostToInboxQueue(self.server.baseDir,
self.server.httpPrefix, self.server.httpPrefix,
nickname, nickname,
self.server.domainFull, self.server.domainFull,
messageJson, messageJson,
messageBytes.decode('utf-8'), messageBytesDecoded,
headersDict, headersDict,
self.path, self.path,
self.server.debug) self.server.debug)
@ -1514,7 +1515,7 @@ class PubServer(BaseHTTPRequestHandler):
if moderationButton == 'suspend': if moderationButton == 'suspend':
suspendAccount(baseDir, nickname, domain) suspendAccount(baseDir, nickname, domain)
if moderationButton == 'unsuspend': if moderationButton == 'unsuspend':
unsuspendAccount(baseDir, nickname) reenableAccount(baseDir, nickname)
if moderationButton == 'filter': if moderationButton == 'filter':
addGlobalFilter(baseDir, moderationText) addGlobalFilter(baseDir, moderationText)
if moderationButton == 'unfilter': if moderationButton == 'unfilter':
@ -2912,11 +2913,13 @@ class PubServer(BaseHTTPRequestHandler):
if self.postToNickname: if self.postToNickname:
if monthStr and yearStr: if monthStr and yearStr:
if monthStr.isdigit() and yearStr.isdigit(): if monthStr.isdigit() and yearStr.isdigit():
yearInt = int(yearStr)
monthInt = int(monthStr)
removeCalendarEvent(baseDir, removeCalendarEvent(baseDir,
self.postToNickname, self.postToNickname,
domain, domain,
int(yearStr), yearInt,
int(monthStr), monthInt,
removeMessageId) removeMessageId)
self._postToOutboxThread(deleteJson) self._postToOutboxThread(deleteJson)
if callingDomain.endswith('.onion') and onionDomain: if callingDomain.endswith('.onion') and onionDomain:
@ -6837,6 +6840,7 @@ class PubServer(BaseHTTPRequestHandler):
recentPostsCache, recentPostsCache,
maxRecentPosts, maxRecentPosts,
translate, translate,
self.server.baseDir,
self.server.session, self.server.session,
cachedWebfingers, cachedWebfingers,
personCache, personCache,
@ -7062,6 +7066,7 @@ class PubServer(BaseHTTPRequestHandler):
'show inbox page') 'show inbox page')
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = htmlInbox(self.server.cssCache, msg = htmlInbox(self.server.cssCache,
defaultTimeline, defaultTimeline,
recentPostsCache, recentPostsCache,
@ -7079,7 +7084,7 @@ class PubServer(BaseHTTPRequestHandler):
allowDeletion, allowDeletion,
httpPrefix, httpPrefix,
projectVersion, projectVersion,
self._isMinimal(nickname), minimalNick,
YTReplacementDomain, YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -7185,6 +7190,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.votingTimeMins) self.server.votingTimeMins)
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlInboxDMs(self.server.cssCache, htmlInboxDMs(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -7203,7 +7209,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -7301,6 +7307,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.votingTimeMins) self.server.votingTimeMins)
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlInboxReplies(self.server.cssCache, htmlInboxReplies(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -7319,7 +7326,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -7417,6 +7424,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.votingTimeMins) self.server.votingTimeMins)
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlInboxMedia(self.server.cssCache, htmlInboxMedia(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -7435,7 +7443,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -7534,6 +7542,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.votingTimeMins) self.server.votingTimeMins)
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlInboxBlogs(self.server.cssCache, htmlInboxBlogs(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -7552,7 +7561,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -7659,6 +7668,7 @@ class PubServer(BaseHTTPRequestHandler):
editor = isEditor(baseDir, currNickname) editor = isEditor(baseDir, currNickname)
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlInboxNews(self.server.cssCache, htmlInboxNews(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -7677,7 +7687,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -7782,6 +7792,7 @@ class PubServer(BaseHTTPRequestHandler):
currNickname = currNickname.split('/')[0] currNickname = currNickname.split('/')[0]
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlInboxFeatures(self.server.cssCache, htmlInboxFeatures(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -7800,7 +7811,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -7967,6 +7978,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.votingTimeMins) self.server.votingTimeMins)
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlBookmarks(self.server.cssCache, htmlBookmarks(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -7985,7 +7997,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -8087,6 +8099,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.votingTimeMins) self.server.votingTimeMins)
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlEvents(self.server.cssCache, htmlEvents(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -8105,7 +8118,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,
@ -8199,6 +8212,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.votingTimeMins) self.server.votingTimeMins)
fullWidthTimelineButtonHeader = \ fullWidthTimelineButtonHeader = \
self.server.fullWidthTimelineButtonHeader self.server.fullWidthTimelineButtonHeader
minimalNick = self._isMinimal(nickname)
msg = \ msg = \
htmlOutbox(self.server.cssCache, htmlOutbox(self.server.cssCache,
self.server.defaultTimeline, self.server.defaultTimeline,
@ -8217,7 +8231,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion, self.server.allowDeletion,
httpPrefix, httpPrefix,
self.server.projectVersion, self.server.projectVersion,
self._isMinimal(nickname), minimalNick,
self.server.YTReplacementDomain, self.server.YTReplacementDomain,
self.server.showPublishedDateOnly, self.server.showPublishedDateOnly,
self.server.newswire, self.server.newswire,

View File

@ -1124,7 +1124,7 @@ if args.undoItemName:
cachedWebfingers = {} cachedWebfingers = {}
print('Sending undo of shared item: ' + args.undoItemName) print('Sending undo of shared item: ' + args.undoItemName)
sendUndoShareViaServer(session, sendUndoShareViaServer(baseDir, session,
args.nickname, args.password, args.nickname, args.password,
domain, port, domain, port,
httpPrefix, httpPrefix,
@ -1931,33 +1931,88 @@ if args.testdata:
deleteAllPosts(baseDir, nickname, domain, 'inbox') deleteAllPosts(baseDir, nickname, domain, 'inbox')
deleteAllPosts(baseDir, nickname, domain, 'outbox') deleteAllPosts(baseDir, nickname, domain, 'outbox')
testFollowersOnly = False
testSaveToFile = True
testClientToServer = False
testCommentsEnabled = True
testAttachImageFilename = None
testMediaType = None
testImageDescription = None
createPublicPost(baseDir, nickname, domain, port, httpPrefix, createPublicPost(baseDir, nickname, domain, port, httpPrefix,
"like, this is totally just a #test, man", "like this is totally just a #test man",
False, True, False, True, None, None, useBlurhash) testFollowersOnly,
testSaveToFile,
testClientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType, testImageDescription,
useBlurhash)
createPublicPost(baseDir, nickname, domain, port, httpPrefix, createPublicPost(baseDir, nickname, domain, port, httpPrefix,
"Zoiks!!!", "Zoiks!!!",
False, True, False, True, None, None, useBlurhash) testFollowersOnly,
testSaveToFile,
testClientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType, testImageDescription,
useBlurhash)
createPublicPost(baseDir, nickname, domain, port, httpPrefix, createPublicPost(baseDir, nickname, domain, port, httpPrefix,
"Hey scoob we need like a hundred more #milkshakes", "Hey scoob we need like a hundred more #milkshakes",
False, True, False, True, None, None, useBlurhash) testFollowersOnly,
testSaveToFile,
testClientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType, testImageDescription,
useBlurhash)
createPublicPost(baseDir, nickname, domain, port, httpPrefix, createPublicPost(baseDir, nickname, domain, port, httpPrefix,
"Getting kinda spooky around here", "Getting kinda spooky around here",
False, True, False, True, None, None, testFollowersOnly,
testSaveToFile,
testClientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType, testImageDescription,
useBlurhash, 'someone') useBlurhash, 'someone')
createPublicPost(baseDir, nickname, domain, port, httpPrefix, createPublicPost(baseDir, nickname, domain, port, httpPrefix,
"And they would have gotten away with it too" + "And they would have gotten away with it too" +
"if it wasn't for those pesky hackers", "if it wasn't for those pesky hackers",
False, True, False, True, 'img/logo.png', testFollowersOnly,
'Description of image', useBlurhash) testSaveToFile,
testClientToServer,
testCommentsEnabled,
'img/logo.png', 'image/png',
'Description of image',
useBlurhash)
createPublicPost(baseDir, nickname, domain, port, httpPrefix, createPublicPost(baseDir, nickname, domain, port, httpPrefix,
"man, these centralized sites are, like, the worst!", "man these centralized sites are like the worst!",
False, True, False, True, None, None, useBlurhash) testFollowersOnly,
testSaveToFile,
testClientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType, testImageDescription,
useBlurhash)
createPublicPost(baseDir, nickname, domain, port, httpPrefix, createPublicPost(baseDir, nickname, domain, port, httpPrefix,
"another mystery solved #test", "another mystery solved #test",
False, True, False, True, None, None, useBlurhash) testFollowersOnly,
testSaveToFile,
testClientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType, testImageDescription,
useBlurhash)
createPublicPost(baseDir, nickname, domain, port, httpPrefix, createPublicPost(baseDir, nickname, domain, port, httpPrefix,
"let's go bowling", "let's go bowling",
False, True, False, True, None, None, useBlurhash) testFollowersOnly,
testSaveToFile,
testClientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType, testImageDescription,
useBlurhash)
domainFull = domain + ':' + str(port) domainFull = domain + ':' + str(port)
clearFollows(baseDir, nickname, domain) clearFollows(baseDir, nickname, domain)

View File

@ -959,8 +959,9 @@ def _receiveLike(recentPostsCache: {},
if not os.path.isdir(baseDir + '/accounts/' + handle): if not os.path.isdir(baseDir + '/accounts/' + handle):
print('DEBUG: unknown recipient of like - ' + handle) print('DEBUG: unknown recipient of like - ' + handle)
# if this post in the outbox of the person? # if this post in the outbox of the person?
postFilename = locatePost(baseDir, handle.split('@')[0], handleName = handle.split('@')[0]
handle.split('@')[1], handleDom = handle.split('@')[1]
postFilename = locatePost(baseDir, handleName, handleDom,
messageJson['object']) messageJson['object'])
if not postFilename: if not postFilename:
if debug: if debug:
@ -970,9 +971,10 @@ def _receiveLike(recentPostsCache: {},
if debug: if debug:
print('DEBUG: liked post found in inbox') print('DEBUG: liked post found in inbox')
handleName = handle.split('@')[0]
handleDom = handle.split('@')[1]
if not _alreadyLiked(baseDir, if not _alreadyLiked(baseDir,
handle.split('@')[0], handleName, handleDom,
handle.split('@')[1],
messageJson['object'], messageJson['object'],
messageJson['actor']): messageJson['actor']):
updateLikesCollection(recentPostsCache, baseDir, postFilename, updateLikesCollection(recentPostsCache, baseDir, postFilename,
@ -1028,8 +1030,10 @@ def _receiveUndoLike(recentPostsCache: {},
if not os.path.isdir(baseDir + '/accounts/' + handle): if not os.path.isdir(baseDir + '/accounts/' + handle):
print('DEBUG: unknown recipient of undo like - ' + handle) print('DEBUG: unknown recipient of undo like - ' + handle)
# if this post in the outbox of the person? # if this post in the outbox of the person?
handleName = handle.split('@')[0]
handleDom = handle.split('@')[1]
postFilename = \ postFilename = \
locatePost(baseDir, handle.split('@')[0], handle.split('@')[1], locatePost(baseDir, handleName, handleDom,
messageJson['object']['object']) messageJson['object']['object'])
if not postFilename: if not postFilename:
if debug: if debug:
@ -1446,8 +1450,9 @@ def _receiveUndoAnnounce(recentPostsCache: {},
if not os.path.isdir(baseDir + '/accounts/' + handle): if not os.path.isdir(baseDir + '/accounts/' + handle):
print('DEBUG: unknown recipient of undo announce - ' + handle) print('DEBUG: unknown recipient of undo announce - ' + handle)
# if this post in the outbox of the person? # if this post in the outbox of the person?
postFilename = locatePost(baseDir, handle.split('@')[0], handleName = handle.split('@')[0]
handle.split('@')[1], handleDom = handle.split('@')[1]
postFilename = locatePost(baseDir, handleName, handleDom,
messageJson['object']['object']) messageJson['object']['object'])
if not postFilename: if not postFilename:
if debug: if debug:
@ -2361,13 +2366,14 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int,
print('Saving inbox post as html to cache') print('Saving inbox post as html to cache')
htmlCacheStartTime = time.time() htmlCacheStartTime = time.time()
handleName = handle.split('@')[0]
_inboxStorePostToHtmlCache(recentPostsCache, _inboxStorePostToHtmlCache(recentPostsCache,
maxRecentPosts, maxRecentPosts,
translate, baseDir, translate, baseDir,
httpPrefix, httpPrefix,
session, cachedWebfingers, session, cachedWebfingers,
personCache, personCache,
handle.split('@')[0], handleName,
domain, port, domain, port,
postJsonObject, postJsonObject,
allowDeletion, allowDeletion,
@ -2383,7 +2389,8 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int,
_inboxUpdateCalendar(baseDir, handle, postJsonObject) _inboxUpdateCalendar(baseDir, handle, postJsonObject)
storeHashTags(baseDir, handle.split('@')[0], postJsonObject) handleName = handle.split('@')[0]
storeHashTags(baseDir, handleName, postJsonObject)
# send the post out to group members # send the post out to group members
if isGroup: if isGroup:
@ -2710,12 +2717,13 @@ def runInboxQueue(recentPostsCache: {}, maxRecentPosts: int,
if debug: if debug:
print('DEBUG: checking http headers') print('DEBUG: checking http headers')
pprint(queueJson['httpHeaders']) pprint(queueJson['httpHeaders'])
postStr = json.dumps(queueJson['post'])
if not verifyPostHeaders(httpPrefix, if not verifyPostHeaders(httpPrefix,
pubKey, pubKey,
queueJson['httpHeaders'], queueJson['httpHeaders'],
queueJson['path'], False, queueJson['path'], False,
queueJson['digest'], queueJson['digest'],
json.dumps(queueJson['post']), postStr,
debug): debug):
print('Queue: Header signature check failed') print('Queue: Header signature check failed')
pprint(queueJson['httpHeaders']) pprint(queueJson['httpHeaders'])

View File

@ -813,13 +813,14 @@ def _addAccountBlogsToNewswire(baseDir: str, nickname: str, domain: str,
content = postJsonObject['object']['content'] content = postJsonObject['object']['content']
description = firstParagraphFromString(content) description = firstParagraphFromString(content)
description = _removeCDATA(description) description = _removeCDATA(description)
tagsFromPost = _getHashtagsFromPost(postJsonObject)
_addNewswireDictEntry(baseDir, domain, _addNewswireDictEntry(baseDir, domain,
newswire, published, newswire, published,
postJsonObject['object']['summary'], postJsonObject['object']['summary'],
postJsonObject['object']['url'], postJsonObject['object']['url'],
votes, fullPostFilename, votes, fullPostFilename,
description, moderated, False, description, moderated, False,
_getHashtagsFromPost(postJsonObject), tagsFromPost,
maxTags) maxTags)
ctr += 1 ctr += 1

View File

@ -758,7 +758,7 @@ def setBio(baseDir: str, nickname: str, domain: str, bio: str) -> bool:
return True return True
def unsuspendAccount(baseDir: str, nickname: str) -> None: def reenableAccount(baseDir: str, nickname: str) -> None:
"""Removes an account suspention """Removes an account suspention
""" """
suspendedFilename = baseDir + '/accounts/suspended.txt' suspendedFilename = baseDir + '/accounts/suspended.txt'
@ -897,7 +897,7 @@ def removeAccount(baseDir: str, nickname: str,
if moderator.strip('\n') == nickname: if moderator.strip('\n') == nickname:
return False return False
unsuspendAccount(baseDir, nickname) reenableAccount(baseDir, nickname)
handle = nickname + '@' + domain handle = nickname + '@' + domain
removePassword(baseDir, nickname) removePassword(baseDir, nickname)
_removeTagsForNickname(baseDir, nickname, domain, port) _removeTagsForNickname(baseDir, nickname, domain, port)

View File

@ -1936,8 +1936,9 @@ def sendPostViaServer(projectVersion: str,
'Content-type': 'application/json', 'Content-type': 'application/json',
'Authorization': authHeader 'Authorization': authHeader
} }
postDumps = json.dumps(postJsonObject)
postResult = \ postResult = \
postJsonString(session, json.dumps(postJsonObject), [], postJsonString(session, postDumps, [],
inboxUrl, headers, debug) inboxUrl, headers, debug)
if not postResult: if not postResult:
if debug: if debug:

View File

@ -104,7 +104,9 @@ def _updatePostSchedule(baseDir: str, handle: str, httpd,
httpd.proxyType, httpd.proxyType,
httpd.projectVersion, httpd.projectVersion,
httpd.debug, httpd.debug,
httpd.YTReplacementDomain): httpd.YTReplacementDomain,
httpd.showPublishedDateOnly,
httpd.allowLocalNetworkAccess):
indexLines.remove(line) indexLines.remove(line)
os.remove(postFilename) os.remove(postFilename)
continue continue

161
tests.py
View File

@ -274,19 +274,44 @@ def createServerAlice(path: str, domain: str, port: int,
followerOfPerson(path, nickname, domain, 'bob', bobAddress, followerOfPerson(path, nickname, domain, 'bob', bobAddress,
federationList, False) federationList, False)
if hasPosts: if hasPosts:
clientToServer = False testFollowersOnly = False
testSaveToFile = True
clientToServer = False
testCommentsEnabled = True
testAttachImageFilename = None
testMediaType = None
testImageDescription = None
createPublicPost(path, nickname, domain, port, httpPrefix, createPublicPost(path, nickname, domain, port, httpPrefix,
"No wise fish would go anywhere without a porpoise", "No wise fish would go anywhere without a porpoise",
False, True, clientToServer, True, testFollowersOnly,
None, None, useBlurhash) testSaveToFile,
clientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType,
testImageDescription,
useBlurhash)
createPublicPost(path, nickname, domain, port, httpPrefix, createPublicPost(path, nickname, domain, port, httpPrefix,
"Curiouser and curiouser!", False, True, "Curiouser and curiouser!",
clientToServer, True, None, None, useBlurhash) testFollowersOnly,
testSaveToFile,
clientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType,
testImageDescription,
useBlurhash)
createPublicPost(path, nickname, domain, port, httpPrefix, createPublicPost(path, nickname, domain, port, httpPrefix,
"In the gardens of memory, in the palace " + "In the gardens of memory, in the palace " +
"of dreams, that is where you and I shall meet", "of dreams, that is where you and I shall meet",
False, True, clientToServer, True, testFollowersOnly,
None, None, useBlurhash) testSaveToFile,
clientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType,
testImageDescription,
useBlurhash)
global testServerAliceRunning global testServerAliceRunning
testServerAliceRunning = True testServerAliceRunning = True
maxMentions = 10 maxMentions = 10
@ -346,19 +371,42 @@ def createServerBob(path: str, domain: str, port: int,
followerOfPerson(path, nickname, domain, followerOfPerson(path, nickname, domain,
'alice', aliceAddress, federationList, False) 'alice', aliceAddress, federationList, False)
if hasPosts: if hasPosts:
testFollowersOnly = False
testSaveToFile = True
testCommentsEnabled = True
testAttachImageFilename = None
testMediaType = None
createPublicPost(path, nickname, domain, port, httpPrefix, createPublicPost(path, nickname, domain, port, httpPrefix,
"It's your life, live it your way.", "It's your life, live it your way.",
False, True, clientToServer, True, testFollowersOnly,
None, None, useBlurhash) testSaveToFile,
clientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType,
testImageDescription,
useBlurhash)
createPublicPost(path, nickname, domain, port, httpPrefix, createPublicPost(path, nickname, domain, port, httpPrefix,
"One of the things I've realised is that " + "One of the things I've realised is that " +
"I am very simple", "I am very simple",
False, True, clientToServer, True, testFollowersOnly,
None, None, useBlurhash) testSaveToFile,
clientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType,
testImageDescription,
useBlurhash)
createPublicPost(path, nickname, domain, port, httpPrefix, createPublicPost(path, nickname, domain, port, httpPrefix,
"Quantum physics is a bit of a passion of mine", "Quantum physics is a bit of a passion of mine",
False, True, clientToServer, True, testFollowersOnly,
None, None, useBlurhash) testSaveToFile,
clientToServer,
testCommentsEnabled,
testAttachImageFilename,
testMediaType,
testImageDescription,
useBlurhash)
global testServerBobRunning global testServerBobRunning
testServerBobRunning = True testServerBobRunning = True
maxMentions = 10 maxMentions = 10
@ -601,10 +649,12 @@ def testPostMessageBetweenServers():
print('\n\n*******************************************************') print('\n\n*******************************************************')
print("Bob likes Alice's post") print("Bob likes Alice's post")
aliceDomainStr = aliceDomain + ':' + str(alicePort)
followerOfPerson(bobDir, 'bob', bobDomain, 'alice', followerOfPerson(bobDir, 'bob', bobDomain, 'alice',
aliceDomain + ':' + str(alicePort), federationList, False) aliceDomainStr, federationList, False)
bobDomainStr = bobDomain + ':' + str(bobPort)
followPerson(aliceDir, 'alice', aliceDomain, 'bob', followPerson(aliceDir, 'alice', aliceDomain, 'bob',
bobDomain + ':' + str(bobPort), federationList, False) bobDomainStr, federationList, False)
sessionBob = createSession(proxyType) sessionBob = createSession(proxyType)
bobPostLog = [] bobPostLog = []
@ -1753,7 +1803,8 @@ def testWebLinks():
'they prefer to cling to their customs, beliefs, and traditions ' + \ 'they prefer to cling to their customs, beliefs, and traditions ' + \
'rather than to accept the teachings of a war of each ' + \ 'rather than to accept the teachings of a war of each ' + \
'against all"\n\n--Peter Kropotkin' 'against all"\n\n--Peter Kropotkin'
resultText = removeLongWords(addWebLinks(exampleText), 40, []) testFnStr = addWebLinks(exampleText)
resultText = removeLongWords(testFnStr, 40, [])
assert resultText == exampleText assert resultText == exampleText
assert 'ellipsis' not in resultText assert 'ellipsis' not in resultText
@ -1767,7 +1818,8 @@ def testWebLinks():
exampleText = \ exampleText = \
'<p>Test1 test2 #YetAnotherExcessivelyLongwindedAndBoringHashtag</p>' '<p>Test1 test2 #YetAnotherExcessivelyLongwindedAndBoringHashtag</p>'
resultText = removeLongWords(addWebLinks(exampleText), 40, []) testFnStr = addWebLinks(exampleText)
resultText = removeLongWords(testFnStr, 40, [])
assert(resultText == assert(resultText ==
'<p>Test1 test2 ' '<p>Test1 test2 '
'#YetAnotherExcessivelyLongwindedAndBorin\ngHashtag</p>') '#YetAnotherExcessivelyLongwindedAndBorin\ngHashtag</p>')
@ -1776,7 +1828,8 @@ def testWebLinks():
"<p>Don't remove a p2p link " + \ "<p>Don't remove a p2p link " + \
"rad:git:hwd1yrerc3mcgn8ga9rho3dqi4w33nep7kxmqezss4topyfgmexihp" + \ "rad:git:hwd1yrerc3mcgn8ga9rho3dqi4w33nep7kxmqezss4topyfgmexihp" + \
"33xcw</p>" "33xcw</p>"
resultText = removeLongWords(addWebLinks(exampleText), 40, []) testFnStr = addWebLinks(exampleText)
resultText = removeLongWords(testFnStr, 40, [])
assert resultText == exampleText assert resultText == exampleText
@ -2533,6 +2586,48 @@ def testReplyToPublicPost() -> None:
httpPrefix + '://rat.site/users/ninjarodent' httpPrefix + '://rat.site/users/ninjarodent'
def getFunctionCallArgs(name: str, lines: [], startLineCtr: int) -> []:
"""Returns the arguments of a function call given lines
of source code and a starting line number
"""
argsStr = lines[startLineCtr].split(name + '(')[1]
if ')' in argsStr:
argsStr = argsStr.split(')')[0].replace(' ', '').split(',')
return argsStr
for lineCtr in range(startLineCtr + 1, len(lines)):
if ')' not in lines[lineCtr]:
argsStr += lines[lineCtr]
continue
else:
argsStr += lines[lineCtr].split(')')[0]
break
return argsStr.replace('\n', '').replace(' ', '').split(',')
def functionArgsMatch(callArgs: [], funcArgs: []):
"""Do the function artuments match the function call arguments
"""
if len(callArgs) == len(funcArgs):
return True
# count non-optional arguments
callArgsCtr = 0
for a in callArgs:
if a == 'self':
continue
if '=' not in a:
callArgsCtr += 1
funcArgsCtr = 0
for a in funcArgs:
if a == 'self':
continue
if '=' not in a:
funcArgsCtr += 1
return callArgsCtr >= funcArgsCtr
def testFunctions(): def testFunctions():
print('testFunctions') print('testFunctions')
function = {} function = {}
@ -2575,18 +2670,48 @@ def testFunctions():
} }
break break
excludeFuncArgs = [
'pyjsonld'
]
excludeFuncs = [
'link'
]
# which modules is each function used within? # which modules is each function used within?
for modName, modProperties in modules.items(): for modName, modProperties in modules.items():
print('Module: ' + modName + '') print('Module: ' + modName + '')
for name, properties in functionProperties.items(): for name, properties in functionProperties.items():
lineCtr = 0
for line in modules[modName]['lines']: for line in modules[modName]['lines']:
if line.startswith('def '): if line.startswith('def '):
lineCtr += 1
continue continue
if name + '(' in line: if name + '(' in line:
modList = \ modList = \
functionProperties[name]['calledInModule'] functionProperties[name]['calledInModule']
if modName not in modList: if modName not in modList:
modList.append(modName) modList.append(modName)
if modName in excludeFuncArgs:
lineCtr += 1
continue
if name in excludeFuncs:
lineCtr += 1
continue
callArgs = \
getFunctionCallArgs(name,
modules[modName]['lines'],
lineCtr)
if not functionArgsMatch(callArgs,
functionProperties[name]['args']):
print('Call to function ' + name +
' does not match its arguments')
print('def args: ' +
str(len(functionProperties[name]['args'])) +
'\n' + str(functionProperties[name]['args']))
print('Call args: ' + str(len(callArgs)) + '\n' +
str(callArgs))
print('module ' + modName + ' line ' + str(lineCtr))
assert False
lineCtr += 1
# don't check these functions, because they are procedurally called # don't check these functions, because they are procedurally called
exclusions = [ exclusions = [

View File

@ -579,7 +579,7 @@ def setTheme(baseDir: str, name: str, domain: str,
if not result: if not result:
# default # default
_setThemeDefault(baseDir) _setThemeDefault(baseDir, allowLocalNetworkAccess)
result = True result = True
variablesFile = baseDir + '/theme/' + name + '/theme.json' variablesFile = baseDir + '/theme/' + name + '/theme.json'

View File

@ -647,7 +647,8 @@ def followPerson(baseDir: str, nickname: str, domain: str,
followFile='following.txt') -> bool: followFile='following.txt') -> bool:
"""Adds a person to the follow list """Adds a person to the follow list
""" """
if not domainPermitted(followDomain.lower().replace('\n', ''), followDomainStrLower = followDomain.lower().replace('\n', '')
if not domainPermitted(followDomainStrLower,
federationList): federationList):
if debug: if debug:
print('DEBUG: follow of domain ' + print('DEBUG: follow of domain ' +

View File

@ -40,10 +40,12 @@ def _htmlFrontScreenPosts(recentPostsCache: {}, maxRecentPosts: int,
boxName = 'tlfeatures' boxName = 'tlfeatures'
authorized = True authorized = True
while ctr < maxItems and currPage < 4: while ctr < maxItems and currPage < 4:
outboxFeedPathStr = \
'/users/' + nickname + '/' + boxName + \
'?page=' + str(currPage)
outboxFeed = \ outboxFeed = \
personBoxJson({}, session, baseDir, domain, port, personBoxJson({}, session, baseDir, domain, port,
'/users/' + nickname + '/' + boxName + outboxFeedPathStr,
'?page=' + str(currPage),
httpPrefix, 10, boxName, httpPrefix, 10, boxName,
authorized, 0, False, 0) authorized, 0, False, 0)
if not outboxFeed: if not outboxFeed:

View File

@ -110,8 +110,9 @@ def htmlAccountInfo(cssCache: {}, translate: {},
urlCtr += 1 urlCtr += 1
blockedPostsHtml = '' blockedPostsHtml = ''
if blockedPostsLinks: if blockedPostsLinks:
blockNoStr = 'blockNumber' + str(ctr)
blockedPostsHtml = \ blockedPostsHtml = \
getContentWarningButton('blockNumber' + str(ctr), getContentWarningButton(blockNoStr,
translate, blockedPostsLinks) translate, blockedPostsLinks)
ctr += 1 ctr += 1

View File

@ -772,7 +772,7 @@ def _getPostTitleAnnounceHtml(baseDir: str,
containerClassIcons, containerClass) containerClassIcons, containerClass)
def _replyToYourselfHtml(translate: {}, ) -> str: def _replyToYourselfHtml(translate: {}) -> str:
"""Returns html for a title which is a reply to yourself """Returns html for a title which is a reply to yourself
""" """
return ' <img loading="lazy" title="' + \ return ' <img loading="lazy" title="' + \

View File

@ -685,11 +685,13 @@ def _htmlProfilePosts(recentPostsCache: {}, maxRecentPosts: int,
currPage = 1 currPage = 1
boxName = 'outbox' boxName = 'outbox'
while ctr < maxItems and currPage < 4: while ctr < maxItems and currPage < 4:
outboxFeedPathStr = \
'/users/' + nickname + '/' + boxName + '?page=' + \
str(currPage)
outboxFeed = \ outboxFeed = \
personBoxJson({}, session, baseDir, domain, personBoxJson({}, session, baseDir, domain,
port, port,
'/users/' + nickname + '/' + boxName + '?page=' + outboxFeedPathStr,
str(currPage),
httpPrefix, httpPrefix,
10, boxName, 10, boxName,
authorized, 0, False, 0) authorized, 0, False, 0)