From 3ff0866deb3d4a3d8ee28c94dbefec2f2579437c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Dec 2020 21:24:46 +0000 Subject: [PATCH] Test that number of function arguments match --- blurhash.py | 3 +- daemon.py | 44 ++++++++---- epicyon.py | 79 +++++++++++++++++---- inbox.py | 28 +++++--- newswire.py | 3 +- person.py | 4 +- posts.py | 3 +- schedule.py | 4 +- tests.py | 161 +++++++++++++++++++++++++++++++++++++----- theme.py | 2 +- utils.py | 3 +- webapp_frontscreen.py | 6 +- webapp_moderation.py | 3 +- webapp_post.py | 2 +- webapp_profile.py | 6 +- 15 files changed, 282 insertions(+), 69 deletions(-) diff --git a/blurhash.py b/blurhash.py index 7728c839..de2eb50e 100644 --- a/blurhash.py +++ b/blurhash.py @@ -174,7 +174,8 @@ def blurhash_encode(image, components_x=4, components_y=4, linear=False): # Build final 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(dc_value, 4) for ac_value in ac_values: diff --git a/daemon.py b/daemon.py index d89edd84..8537ea5b 100644 --- a/daemon.py +++ b/daemon.py @@ -58,7 +58,7 @@ from person import personBoxJson from person import createSharedInbox from person import createNewsInbox from person import suspendAccount -from person import unsuspendAccount +from person import reenableAccount from person import removeAccount from person import canRemovePost from person import personSnooze @@ -1074,13 +1074,14 @@ class PubServer(BaseHTTPRequestHandler): beginSaveTime = time.time() # save the json for later queue processing + messageBytesDecoded = messageBytes.decode('utf-8') queueFilename = \ savePostToInboxQueue(self.server.baseDir, self.server.httpPrefix, nickname, self.server.domainFull, messageJson, - messageBytes.decode('utf-8'), + messageBytesDecoded, headersDict, self.path, self.server.debug) @@ -1514,7 +1515,7 @@ class PubServer(BaseHTTPRequestHandler): if moderationButton == 'suspend': suspendAccount(baseDir, nickname, domain) if moderationButton == 'unsuspend': - unsuspendAccount(baseDir, nickname) + reenableAccount(baseDir, nickname) if moderationButton == 'filter': addGlobalFilter(baseDir, moderationText) if moderationButton == 'unfilter': @@ -2912,11 +2913,13 @@ class PubServer(BaseHTTPRequestHandler): if self.postToNickname: if monthStr and yearStr: if monthStr.isdigit() and yearStr.isdigit(): + yearInt = int(yearStr) + monthInt = int(monthStr) removeCalendarEvent(baseDir, self.postToNickname, domain, - int(yearStr), - int(monthStr), + yearInt, + monthInt, removeMessageId) self._postToOutboxThread(deleteJson) if callingDomain.endswith('.onion') and onionDomain: @@ -6837,6 +6840,7 @@ class PubServer(BaseHTTPRequestHandler): recentPostsCache, maxRecentPosts, translate, + self.server.baseDir, self.server.session, cachedWebfingers, personCache, @@ -7062,6 +7066,7 @@ class PubServer(BaseHTTPRequestHandler): 'show inbox page') fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = htmlInbox(self.server.cssCache, defaultTimeline, recentPostsCache, @@ -7079,7 +7084,7 @@ class PubServer(BaseHTTPRequestHandler): allowDeletion, httpPrefix, projectVersion, - self._isMinimal(nickname), + minimalNick, YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -7185,6 +7190,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.votingTimeMins) fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlInboxDMs(self.server.cssCache, self.server.defaultTimeline, @@ -7203,7 +7209,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -7301,6 +7307,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.votingTimeMins) fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlInboxReplies(self.server.cssCache, self.server.defaultTimeline, @@ -7319,7 +7326,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -7417,6 +7424,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.votingTimeMins) fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlInboxMedia(self.server.cssCache, self.server.defaultTimeline, @@ -7435,7 +7443,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -7534,6 +7542,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.votingTimeMins) fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlInboxBlogs(self.server.cssCache, self.server.defaultTimeline, @@ -7552,7 +7561,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -7659,6 +7668,7 @@ class PubServer(BaseHTTPRequestHandler): editor = isEditor(baseDir, currNickname) fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlInboxNews(self.server.cssCache, self.server.defaultTimeline, @@ -7677,7 +7687,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -7782,6 +7792,7 @@ class PubServer(BaseHTTPRequestHandler): currNickname = currNickname.split('/')[0] fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlInboxFeatures(self.server.cssCache, self.server.defaultTimeline, @@ -7800,7 +7811,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -7967,6 +7978,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.votingTimeMins) fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlBookmarks(self.server.cssCache, self.server.defaultTimeline, @@ -7985,7 +7997,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -8087,6 +8099,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.votingTimeMins) fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlEvents(self.server.cssCache, self.server.defaultTimeline, @@ -8105,7 +8118,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, @@ -8199,6 +8212,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.votingTimeMins) fullWidthTimelineButtonHeader = \ self.server.fullWidthTimelineButtonHeader + minimalNick = self._isMinimal(nickname) msg = \ htmlOutbox(self.server.cssCache, self.server.defaultTimeline, @@ -8217,7 +8231,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowDeletion, httpPrefix, self.server.projectVersion, - self._isMinimal(nickname), + minimalNick, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.newswire, diff --git a/epicyon.py b/epicyon.py index 8b243c66..4e0de4b2 100644 --- a/epicyon.py +++ b/epicyon.py @@ -1124,7 +1124,7 @@ if args.undoItemName: cachedWebfingers = {} print('Sending undo of shared item: ' + args.undoItemName) - sendUndoShareViaServer(session, + sendUndoShareViaServer(baseDir, session, args.nickname, args.password, domain, port, httpPrefix, @@ -1931,33 +1931,88 @@ if args.testdata: deleteAllPosts(baseDir, nickname, domain, 'inbox') 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, - "like, this is totally just a #test, man", - False, True, False, True, None, None, useBlurhash) + "like this is totally just a #test man", + testFollowersOnly, + testSaveToFile, + testClientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, testImageDescription, + useBlurhash) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Zoiks!!!", - False, True, False, True, None, None, useBlurhash) + testFollowersOnly, + testSaveToFile, + testClientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, testImageDescription, + useBlurhash) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "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, "Getting kinda spooky around here", - False, True, False, True, None, None, + testFollowersOnly, + testSaveToFile, + testClientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, testImageDescription, useBlurhash, 'someone') createPublicPost(baseDir, nickname, domain, port, httpPrefix, "And they would have gotten away with it too" + "if it wasn't for those pesky hackers", - False, True, False, True, 'img/logo.png', - 'Description of image', useBlurhash) + testFollowersOnly, + testSaveToFile, + testClientToServer, + testCommentsEnabled, + 'img/logo.png', 'image/png', + 'Description of image', + useBlurhash) createPublicPost(baseDir, nickname, domain, port, httpPrefix, - "man, these centralized sites are, like, the worst!", - False, True, False, True, None, None, useBlurhash) + "man these centralized sites are like the worst!", + testFollowersOnly, + testSaveToFile, + testClientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, testImageDescription, + useBlurhash) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "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, "let's go bowling", - False, True, False, True, None, None, useBlurhash) + testFollowersOnly, + testSaveToFile, + testClientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, testImageDescription, + useBlurhash) domainFull = domain + ':' + str(port) clearFollows(baseDir, nickname, domain) diff --git a/inbox.py b/inbox.py index 70073d71..68013230 100644 --- a/inbox.py +++ b/inbox.py @@ -959,8 +959,9 @@ def _receiveLike(recentPostsCache: {}, if not os.path.isdir(baseDir + '/accounts/' + handle): print('DEBUG: unknown recipient of like - ' + handle) # if this post in the outbox of the person? - postFilename = locatePost(baseDir, handle.split('@')[0], - handle.split('@')[1], + handleName = handle.split('@')[0] + handleDom = handle.split('@')[1] + postFilename = locatePost(baseDir, handleName, handleDom, messageJson['object']) if not postFilename: if debug: @@ -970,9 +971,10 @@ def _receiveLike(recentPostsCache: {}, if debug: print('DEBUG: liked post found in inbox') + handleName = handle.split('@')[0] + handleDom = handle.split('@')[1] if not _alreadyLiked(baseDir, - handle.split('@')[0], - handle.split('@')[1], + handleName, handleDom, messageJson['object'], messageJson['actor']): updateLikesCollection(recentPostsCache, baseDir, postFilename, @@ -1028,8 +1030,10 @@ def _receiveUndoLike(recentPostsCache: {}, if not os.path.isdir(baseDir + '/accounts/' + handle): print('DEBUG: unknown recipient of undo like - ' + handle) # if this post in the outbox of the person? + handleName = handle.split('@')[0] + handleDom = handle.split('@')[1] postFilename = \ - locatePost(baseDir, handle.split('@')[0], handle.split('@')[1], + locatePost(baseDir, handleName, handleDom, messageJson['object']['object']) if not postFilename: if debug: @@ -1446,8 +1450,9 @@ def _receiveUndoAnnounce(recentPostsCache: {}, if not os.path.isdir(baseDir + '/accounts/' + handle): print('DEBUG: unknown recipient of undo announce - ' + handle) # if this post in the outbox of the person? - postFilename = locatePost(baseDir, handle.split('@')[0], - handle.split('@')[1], + handleName = handle.split('@')[0] + handleDom = handle.split('@')[1] + postFilename = locatePost(baseDir, handleName, handleDom, messageJson['object']['object']) if not postFilename: if debug: @@ -2361,13 +2366,14 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, print('Saving inbox post as html to cache') htmlCacheStartTime = time.time() + handleName = handle.split('@')[0] _inboxStorePostToHtmlCache(recentPostsCache, maxRecentPosts, translate, baseDir, httpPrefix, session, cachedWebfingers, personCache, - handle.split('@')[0], + handleName, domain, port, postJsonObject, allowDeletion, @@ -2383,7 +2389,8 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, _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 if isGroup: @@ -2710,12 +2717,13 @@ def runInboxQueue(recentPostsCache: {}, maxRecentPosts: int, if debug: print('DEBUG: checking http headers') pprint(queueJson['httpHeaders']) + postStr = json.dumps(queueJson['post']) if not verifyPostHeaders(httpPrefix, pubKey, queueJson['httpHeaders'], queueJson['path'], False, queueJson['digest'], - json.dumps(queueJson['post']), + postStr, debug): print('Queue: Header signature check failed') pprint(queueJson['httpHeaders']) diff --git a/newswire.py b/newswire.py index 657641c4..ae4b8d21 100644 --- a/newswire.py +++ b/newswire.py @@ -813,13 +813,14 @@ def _addAccountBlogsToNewswire(baseDir: str, nickname: str, domain: str, content = postJsonObject['object']['content'] description = firstParagraphFromString(content) description = _removeCDATA(description) + tagsFromPost = _getHashtagsFromPost(postJsonObject) _addNewswireDictEntry(baseDir, domain, newswire, published, postJsonObject['object']['summary'], postJsonObject['object']['url'], votes, fullPostFilename, description, moderated, False, - _getHashtagsFromPost(postJsonObject), + tagsFromPost, maxTags) ctr += 1 diff --git a/person.py b/person.py index a2b76bd2..b7e80061 100644 --- a/person.py +++ b/person.py @@ -758,7 +758,7 @@ def setBio(baseDir: str, nickname: str, domain: str, bio: str) -> bool: return True -def unsuspendAccount(baseDir: str, nickname: str) -> None: +def reenableAccount(baseDir: str, nickname: str) -> None: """Removes an account suspention """ suspendedFilename = baseDir + '/accounts/suspended.txt' @@ -897,7 +897,7 @@ def removeAccount(baseDir: str, nickname: str, if moderator.strip('\n') == nickname: return False - unsuspendAccount(baseDir, nickname) + reenableAccount(baseDir, nickname) handle = nickname + '@' + domain removePassword(baseDir, nickname) _removeTagsForNickname(baseDir, nickname, domain, port) diff --git a/posts.py b/posts.py index 1bb3462a..895c50c7 100644 --- a/posts.py +++ b/posts.py @@ -1936,8 +1936,9 @@ def sendPostViaServer(projectVersion: str, 'Content-type': 'application/json', 'Authorization': authHeader } + postDumps = json.dumps(postJsonObject) postResult = \ - postJsonString(session, json.dumps(postJsonObject), [], + postJsonString(session, postDumps, [], inboxUrl, headers, debug) if not postResult: if debug: diff --git a/schedule.py b/schedule.py index 0cf8797c..6d781b37 100644 --- a/schedule.py +++ b/schedule.py @@ -104,7 +104,9 @@ def _updatePostSchedule(baseDir: str, handle: str, httpd, httpd.proxyType, httpd.projectVersion, httpd.debug, - httpd.YTReplacementDomain): + httpd.YTReplacementDomain, + httpd.showPublishedDateOnly, + httpd.allowLocalNetworkAccess): indexLines.remove(line) os.remove(postFilename) continue diff --git a/tests.py b/tests.py index 738e396b..e90f6796 100644 --- a/tests.py +++ b/tests.py @@ -274,19 +274,44 @@ def createServerAlice(path: str, domain: str, port: int, followerOfPerson(path, nickname, domain, 'bob', bobAddress, federationList, False) if hasPosts: - clientToServer = False + testFollowersOnly = False + testSaveToFile = True + clientToServer = False + testCommentsEnabled = True + testAttachImageFilename = None + testMediaType = None + testImageDescription = None createPublicPost(path, nickname, domain, port, httpPrefix, "No wise fish would go anywhere without a porpoise", - False, True, clientToServer, True, - None, None, useBlurhash) + testFollowersOnly, + testSaveToFile, + clientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, + testImageDescription, + useBlurhash) createPublicPost(path, nickname, domain, port, httpPrefix, - "Curiouser and curiouser!", False, True, - clientToServer, True, None, None, useBlurhash) + "Curiouser and curiouser!", + testFollowersOnly, + testSaveToFile, + clientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, + testImageDescription, + useBlurhash) createPublicPost(path, nickname, domain, port, httpPrefix, "In the gardens of memory, in the palace " + "of dreams, that is where you and I shall meet", - False, True, clientToServer, True, - None, None, useBlurhash) + testFollowersOnly, + testSaveToFile, + clientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, + testImageDescription, + useBlurhash) global testServerAliceRunning testServerAliceRunning = True maxMentions = 10 @@ -346,19 +371,42 @@ def createServerBob(path: str, domain: str, port: int, followerOfPerson(path, nickname, domain, 'alice', aliceAddress, federationList, False) if hasPosts: + testFollowersOnly = False + testSaveToFile = True + testCommentsEnabled = True + testAttachImageFilename = None + testMediaType = None createPublicPost(path, nickname, domain, port, httpPrefix, "It's your life, live it your way.", - False, True, clientToServer, True, - None, None, useBlurhash) + testFollowersOnly, + testSaveToFile, + clientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, + testImageDescription, + useBlurhash) createPublicPost(path, nickname, domain, port, httpPrefix, "One of the things I've realised is that " + "I am very simple", - False, True, clientToServer, True, - None, None, useBlurhash) + testFollowersOnly, + testSaveToFile, + clientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, + testImageDescription, + useBlurhash) createPublicPost(path, nickname, domain, port, httpPrefix, "Quantum physics is a bit of a passion of mine", - False, True, clientToServer, True, - None, None, useBlurhash) + testFollowersOnly, + testSaveToFile, + clientToServer, + testCommentsEnabled, + testAttachImageFilename, + testMediaType, + testImageDescription, + useBlurhash) global testServerBobRunning testServerBobRunning = True maxMentions = 10 @@ -601,10 +649,12 @@ def testPostMessageBetweenServers(): print('\n\n*******************************************************') print("Bob likes Alice's post") + aliceDomainStr = aliceDomain + ':' + str(alicePort) followerOfPerson(bobDir, 'bob', bobDomain, 'alice', - aliceDomain + ':' + str(alicePort), federationList, False) + aliceDomainStr, federationList, False) + bobDomainStr = bobDomain + ':' + str(bobPort) followPerson(aliceDir, 'alice', aliceDomain, 'bob', - bobDomain + ':' + str(bobPort), federationList, False) + bobDomainStr, federationList, False) sessionBob = createSession(proxyType) bobPostLog = [] @@ -1753,7 +1803,8 @@ def testWebLinks(): 'they prefer to cling to their customs, beliefs, and traditions ' + \ 'rather than to accept the teachings of a war of each ' + \ 'against all"\n\n--Peter Kropotkin' - resultText = removeLongWords(addWebLinks(exampleText), 40, []) + testFnStr = addWebLinks(exampleText) + resultText = removeLongWords(testFnStr, 40, []) assert resultText == exampleText assert 'ellipsis' not in resultText @@ -1767,7 +1818,8 @@ def testWebLinks(): exampleText = \ '

Test1 test2 #YetAnotherExcessivelyLongwindedAndBoringHashtag

' - resultText = removeLongWords(addWebLinks(exampleText), 40, []) + testFnStr = addWebLinks(exampleText) + resultText = removeLongWords(testFnStr, 40, []) assert(resultText == '

Test1 test2 ' '#YetAnotherExcessivelyLongwindedAndBorin\ngHashtag

') @@ -1776,7 +1828,8 @@ def testWebLinks(): "

Don't remove a p2p link " + \ "rad:git:hwd1yrerc3mcgn8ga9rho3dqi4w33nep7kxmqezss4topyfgmexihp" + \ "33xcw

" - resultText = removeLongWords(addWebLinks(exampleText), 40, []) + testFnStr = addWebLinks(exampleText) + resultText = removeLongWords(testFnStr, 40, []) assert resultText == exampleText @@ -2533,6 +2586,48 @@ def testReplyToPublicPost() -> None: 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(): print('testFunctions') function = {} @@ -2575,18 +2670,48 @@ def testFunctions(): } break + excludeFuncArgs = [ + 'pyjsonld' + ] + excludeFuncs = [ + 'link' + ] # which modules is each function used within? for modName, modProperties in modules.items(): print('Module: ' + modName + ' ✓') for name, properties in functionProperties.items(): + lineCtr = 0 for line in modules[modName]['lines']: if line.startswith('def '): + lineCtr += 1 continue if name + '(' in line: modList = \ functionProperties[name]['calledInModule'] if modName not in modList: 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 exclusions = [ diff --git a/theme.py b/theme.py index 14515f6a..df7f4c80 100644 --- a/theme.py +++ b/theme.py @@ -579,7 +579,7 @@ def setTheme(baseDir: str, name: str, domain: str, if not result: # default - _setThemeDefault(baseDir) + _setThemeDefault(baseDir, allowLocalNetworkAccess) result = True variablesFile = baseDir + '/theme/' + name + '/theme.json' diff --git a/utils.py b/utils.py index 2468e5a5..ff89afd0 100644 --- a/utils.py +++ b/utils.py @@ -647,7 +647,8 @@ def followPerson(baseDir: str, nickname: str, domain: str, followFile='following.txt') -> bool: """Adds a person to the follow list """ - if not domainPermitted(followDomain.lower().replace('\n', ''), + followDomainStrLower = followDomain.lower().replace('\n', '') + if not domainPermitted(followDomainStrLower, federationList): if debug: print('DEBUG: follow of domain ' + diff --git a/webapp_frontscreen.py b/webapp_frontscreen.py index 1e289f4a..ab667ed8 100644 --- a/webapp_frontscreen.py +++ b/webapp_frontscreen.py @@ -40,10 +40,12 @@ def _htmlFrontScreenPosts(recentPostsCache: {}, maxRecentPosts: int, boxName = 'tlfeatures' authorized = True while ctr < maxItems and currPage < 4: + outboxFeedPathStr = \ + '/users/' + nickname + '/' + boxName + \ + '?page=' + str(currPage) outboxFeed = \ personBoxJson({}, session, baseDir, domain, port, - '/users/' + nickname + '/' + boxName + - '?page=' + str(currPage), + outboxFeedPathStr, httpPrefix, 10, boxName, authorized, 0, False, 0) if not outboxFeed: diff --git a/webapp_moderation.py b/webapp_moderation.py index 6dad2b3a..fabb0b89 100644 --- a/webapp_moderation.py +++ b/webapp_moderation.py @@ -110,8 +110,9 @@ def htmlAccountInfo(cssCache: {}, translate: {}, urlCtr += 1 blockedPostsHtml = '' if blockedPostsLinks: + blockNoStr = 'blockNumber' + str(ctr) blockedPostsHtml = \ - getContentWarningButton('blockNumber' + str(ctr), + getContentWarningButton(blockNoStr, translate, blockedPostsLinks) ctr += 1 diff --git a/webapp_post.py b/webapp_post.py index 412d7b78..274a7840 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -772,7 +772,7 @@ def _getPostTitleAnnounceHtml(baseDir: str, containerClassIcons, containerClass) -def _replyToYourselfHtml(translate: {}, ) -> str: +def _replyToYourselfHtml(translate: {}) -> str: """Returns html for a title which is a reply to yourself """ return '