diff --git a/blocking.py b/blocking.py index 5c70ca676..67952d27b 100644 --- a/blocking.py +++ b/blocking.py @@ -874,3 +874,94 @@ def brochModeLapses(baseDir: str, lapseDays: int = 7) -> bool: print('Broch mode has elapsed') return True return False + + +def loadCWLists(baseDir: str, verbose: bool) -> {}: + """Load lists used for content warnings + """ + if not os.path.isdir(baseDir + '/cwlists'): + return {} + result = {} + for subdir, dirs, files in os.walk(baseDir + '/cwlists'): + for f in files: + if not f.endswith('.json'): + continue + listFilename = os.path.join(baseDir + '/cwlists', f) + print('listFilename: ' + listFilename) + listJson = loadJson(listFilename, 0, 1) + if not listJson: + continue + if not listJson.get('name'): + continue + if not listJson.get('words') and not listJson.get('domains'): + continue + name = listJson['name'] + if verbose: + print('List: ' + name) + result[name] = listJson + return result + + +def addCWfromLists(postJsonObject: {}, CWlists: {}, translate: {}, + listsEnabled: str) -> None: + """Adds content warnings by matching the post content + against domains or keywords + """ + if not listsEnabled: + return + if not postJsonObject['object'].get('content'): + return + cw = '' + if postJsonObject['object'].get('summary'): + cw = postJsonObject['object']['summary'] + + content = postJsonObject['object']['content'] + for name, item in CWlists.items(): + if name not in listsEnabled: + continue + if not item.get('warning'): + continue + warning = item['warning'] + + # is there a translated version of the warning? + if translate.get(warning): + warning = translate[warning] + + # is the warning already in the CW? + if warning in cw: + continue + + matched = False + + # match domains within the content + if item.get('domains'): + for domain in item['domains']: + if domain in content: + if cw: + cw = warning + ' / ' + cw + else: + cw = warning + matched = True + break + + if matched: + continue + + # match words within the content + if item.get('words'): + for wordStr in item['words']: + if wordStr in content: + if cw: + cw = warning + ' / ' + cw + else: + cw = warning + break + if cw: + postJsonObject['object']['summary'] = cw + postJsonObject['object']['sensitive'] = True + + +def getCWlistVariable(listName: str) -> str: + """Returns the variable associated with a CW list + """ + return 'list' + listName.replace(' ', '').replace("'", '') diff --git a/cwlists/murdoch.json b/cwlists/murdoch.json new file mode 100644 index 000000000..38932207d --- /dev/null +++ b/cwlists/murdoch.json @@ -0,0 +1,82 @@ +{ + "name": "Murdoch press", + "warning": "Murdoch Press", + "words": [], + "domains": [ + "api.news", + "content.api.news", + "newscdn.com.au", + "resourcesssl.newscdn.com.au", + "thesun.co.uk", + "thetimes.co.uk", + "thesundaytimes.co.uk", + "pressassociation.com", + "news.co.uk", + "newscorpaustralia.com", + "theaustralian.com.au", + "aap.com.au", + "news.com.au", + "skynews.com.au", + "skyweather.com.au", + "australiannewschannel.com.au", + "weeklytimesnow.com.au", + "dailytelegraph.com.au", + "heraldsun.com.au", + "geelongadvertiser.com.au", + "couriermail.com.au", + "thesundaymail.com.au", + "goldcoastbulletin.com.au", + "cairnspost.com.au", + "townsvillebulletin.com.au", + "adelaidenow.com.au", + "themercury.com.au", + "ntnews.com.au", + "postcourier.com.pg", + "nypost.com", + "pagesix.com", + "realtor.com", + "wsj.com", + "wsj.net", + "foxnews.com", + "fncstatic.com", + "foxnewsgo.com", + "fox.com", + "foxbusiness.com", + "foxsports.com", + "fssta.com", + "foxsports.com.au", + "dowjones.com", + "factiva.com", + "barrons.com", + "marketwatch.com", + "heatst.com", + "fnlondon.com", + "mansionglobal.com", + "spindices.com", + "spglobal.com", + "talksport.com", + "harpercollins.com", + "bestrecipes.com.au", + "hipages.com.au", + "homeimprovementpages.com.au", + "odds.com.au", + "onebigswitch.com.au", + "suddenly.com.au", + "supercoach.com.au", + "punters.com.au", + "kayosports.com.au", + "foxtel.com.au", + "newscorp.com", + "storyful.com", + "vogue.com.au", + "taste.com.au", + "kidspot.com.au", + "bodyandsoul.com.au", + "realcommercial.com.au", + "reastatic.net", + "realestate.com.au", + "whereilive.com.au", + "www.newsoftheworld.co.uk", + "newsoftheworld.co.uk" + ] +} diff --git a/cwlists/ukrwthinktanks.json b/cwlists/ukrwthinktanks.json new file mode 100644 index 000000000..b674ff49b --- /dev/null +++ b/cwlists/ukrwthinktanks.json @@ -0,0 +1,24 @@ +{ + "name": "UK RW Think Tanks", + "warning": "UK RW Think Tank", + "words": [ + "Adam Smith Institute", + "Bow Group", + "Centre for Policy Studies", + "Centre for Social Justice", + "Chatham House", + "Institute of Economic Affairs", + "Legatum Institute", + "Policy Exchange" + ], + "domains": [ + "adamsmith.org", + "bowgroup.org", + "cps.org.uk", + "centreforsocialjustice.org.uk", + "chathamhouse.org", + "iea.org.uk", + "https://li.com", + "policyexchange.org.uk" + ] +} diff --git a/daemon.py b/daemon.py index 5c6849af2..9bbbf2c09 100644 --- a/daemon.py +++ b/daemon.py @@ -125,6 +125,8 @@ from media import replaceTwitter from media import attachMedia from media import pathIsVideo from media import pathIsAudio +from blocking import getCWlistVariable +from blocking import loadCWLists from blocking import updateBlockedCache from blocking import mutePost from blocking import unmutePost @@ -1229,7 +1231,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.peertubeInstances, self.server.themeName, self.server.maxLikeCount, - self.server.maxRecentPosts) + self.server.maxRecentPosts, + self.server.CWlists, + self.server.listsEnabled) def _postToOutboxThread(self, messageJson: {}) -> bool: """Creates a thread to send a post @@ -3007,7 +3011,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, self.server.systemLanguage, self.server.maxLikeCount, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) if hashtagStr: msg = hashtagStr.encode('utf-8') msglen = len(msg) @@ -3065,7 +3071,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, 'outbox', self.server.systemLanguage, self.server.maxLikeCount, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) if historyStr: msg = historyStr.encode('utf-8') msglen = len(msg) @@ -3103,7 +3111,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, 'bookmarks', self.server.systemLanguage, self.server.maxLikeCount, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) if bookmarksStr: msg = bookmarksStr.encode('utf-8') msglen = len(msg) @@ -3207,7 +3217,9 @@ class PubServer(BaseHTTPRequestHandler): accessKeys, self.server.systemLanguage, self.server.maxLikeCount, - signingPrivateKeyPem) + signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) if profileStr: msg = profileStr.encode('utf-8') msglen = len(msg) @@ -5684,9 +5696,24 @@ class PubServer(BaseHTTPRequestHandler): except BaseException: pass - # save blocked user agents - # This is admin lebel and global to the instance - if path.startswith('/users/' + adminNickname + '/'): + if isModerator(self.server.baseDir, nickname): + # set selected content warning lists + newListsEnabled = '' + for name, item in self.server.CWlists.items(): + listVarName = getCWlistVariable(name) + if fields.get(listVarName): + if fields[listVarName] == 'on': + if newListsEnabled: + newListsEnabled += ', ' + name + else: + newListsEnabled += name + if newListsEnabled != self.server.listsEnabled: + self.server.listsEnabled = newListsEnabled + setConfigParam(self.server.baseDir, + "listsEnabled", + newListsEnabled) + + # save blocked user agents userAgentsBlocked = [] if fields.get('userAgentsBlockedStr'): userAgentsBlockedStr = \ @@ -6727,7 +6754,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, self.server.systemLanguage, self.server.maxLikeCount, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) if hashtagStr: msg = hashtagStr.encode('utf-8') msglen = len(msg) @@ -6854,9 +6883,6 @@ class PubServer(BaseHTTPRequestHandler): self._redirect_headers(actorPathStr, cookie, callingDomain) return - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_announceButton1', - self.server.debug) if not self.server.session: print('Starting new session during repeat button') self.server.session = createSession(proxyType) @@ -6866,9 +6892,6 @@ class PubServer(BaseHTTPRequestHandler): self._404() self.server.GETbusy = False return - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_announceButton2', - self.server.debug) self.server.actorRepeat = path.split('?actor=')[1] announceToStr = \ localActorUrl(httpPrefix, self.postToNickname, domainFull) + \ @@ -6891,9 +6914,6 @@ class PubServer(BaseHTTPRequestHandler): debug, self.server.projectVersion, self.server.signingPrivateKeyPem) - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_announceButton3', - self.server.debug) announceFilename = None if announceJson: # save the announce straight to the outbox @@ -6905,10 +6925,6 @@ class PubServer(BaseHTTPRequestHandler): self.postToNickname, domainFull, announceJson, 'outbox') - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_announceButton4', - self.server.debug) - # clear the icon from the cache so that it gets updated if self.server.iconsCache.get('repeat.png'): del self.server.iconsCache['repeat.png'] @@ -6917,7 +6933,7 @@ class PubServer(BaseHTTPRequestHandler): self._postToOutboxThread(announceJson) fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_announceButton5', + '_GET', '_announceButton postToOutboxThread', self.server.debug) # generate the html for the announce @@ -6927,9 +6943,6 @@ class PubServer(BaseHTTPRequestHandler): cachedPostFilename = \ getCachedPostFilename(baseDir, self.postToNickname, domain, announceJson) - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_announceButton6', - self.server.debug) if debug: print('Announced post json: ' + str(announceJson)) print('Announced post nickname: ' + @@ -6940,9 +6953,6 @@ class PubServer(BaseHTTPRequestHandler): followerApprovalActive(baseDir, self.postToNickname, domain) showRepeats = not isDM(announceJson) - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_announceButton7', - self.server.debug) individualPostAsHtml(self.server.signingPrivateKeyPem, False, self.server.recentPostsCache, self.server.maxRecentPosts, @@ -6968,10 +6978,9 @@ class PubServer(BaseHTTPRequestHandler): showRepeats, showIndividualPostIcons, manuallyApproveFollowers, - False, True, False) - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_announceButton8', - self.server.debug) + False, True, False, + self.server.CWlists, + self.server.listsEnabled) self.server.GETbusy = False actorAbsolute = self._getInstanceUrl(callingDomain) + actor @@ -7348,9 +7357,6 @@ class PubServer(BaseHTTPRequestHandler): self._redirect_headers(actorPathStr, cookie, callingDomain) return - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton1', - self.server.debug) if not self.server.session: print('Starting new session during like') self.server.session = createSession(proxyType) @@ -7359,9 +7365,6 @@ class PubServer(BaseHTTPRequestHandler): self._404() self.server.GETbusy = False return - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton2', - self.server.debug) likeActor = \ localActorUrl(httpPrefix, self.postToNickname, domainFull) actorLiked = path.split('?actor=')[1] @@ -7372,9 +7375,6 @@ class PubServer(BaseHTTPRequestHandler): origActor, origPostUrl, origFilename = \ getOriginalPostFromAnnounceUrl(likeUrl, baseDir, self.postToNickname, domain) - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton3', - self.server.debug) likeUrl2 = likeUrl likedPostFilename = origFilename if origActor and origPostUrl: @@ -7394,7 +7394,7 @@ class PubServer(BaseHTTPRequestHandler): self._postToOutbox(likeJson, self.server.projectVersion, None) fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton4', + '_GET', '_likeButton postToOutbox', self.server.debug) print('Locating liked post ' + likeUrl) @@ -7403,9 +7403,6 @@ class PubServer(BaseHTTPRequestHandler): likedPostFilename = \ locatePost(baseDir, self.postToNickname, domain, likeUrl) if likedPostFilename: - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton5', - self.server.debug) recentPostsCache = self.server.recentPostsCache likedPostJson = loadJson(likedPostFilename, 0, 1) if origFilename and origPostUrl: @@ -7417,9 +7414,6 @@ class PubServer(BaseHTTPRequestHandler): likedPostFilename = origFilename if debug: print('Updating likes for ' + likedPostFilename) - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton6', - self.server.debug) updateLikesCollection(recentPostsCache, baseDir, likedPostFilename, likeUrl, likeActor, self.postToNickname, domain, @@ -7428,9 +7422,6 @@ class PubServer(BaseHTTPRequestHandler): print('Regenerating html post for changed likes collection') # clear the icon from the cache so that it gets updated if likedPostJson: - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton6', - self.server.debug) cachedPostFilename = \ getCachedPostFilename(baseDir, self.postToNickname, domain, likedPostJson) @@ -7444,9 +7435,6 @@ class PubServer(BaseHTTPRequestHandler): followerApprovalActive(baseDir, self.postToNickname, domain) showRepeats = not isDM(likedPostJson) - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton7', - self.server.debug) individualPostAsHtml(self.server.signingPrivateKeyPem, False, self.server.recentPostsCache, self.server.maxRecentPosts, @@ -7473,10 +7461,9 @@ class PubServer(BaseHTTPRequestHandler): showRepeats, showIndividualPostIcons, manuallyApproveFollowers, - False, True, False) - fitnessPerformance(GETstartTime, self.server.fitness, - '_GET', '_likeButton8', - self.server.debug) + False, True, False, + self.server.CWlists, + self.server.listsEnabled) else: print('WARN: Liked post not found: ' + likedPostFilename) # clear the icon from the cache so that it gets updated @@ -7636,7 +7623,9 @@ class PubServer(BaseHTTPRequestHandler): showRepeats, showIndividualPostIcons, manuallyApproveFollowers, - False, True, False) + False, True, False, + self.server.CWlists, + self.server.listsEnabled) else: print('WARN: Unliked post not found: ' + likedPostFilename) # clear the icon from the cache so that it gets updated @@ -7771,7 +7760,9 @@ class PubServer(BaseHTTPRequestHandler): showRepeats, showIndividualPostIcons, manuallyApproveFollowers, - False, True, False) + False, True, False, + self.server.CWlists, + self.server.listsEnabled) else: print('WARN: Bookmarked post not found: ' + bookmarkFilename) # self._postToOutbox(bookmarkJson, self.server.projectVersion, None) @@ -7905,7 +7896,9 @@ class PubServer(BaseHTTPRequestHandler): showRepeats, showIndividualPostIcons, manuallyApproveFollowers, - False, True, False) + False, True, False, + self.server.CWlists, + self.server.listsEnabled) else: print('WARN: Unbookmarked post not found: ' + bookmarkFilename) self.server.GETbusy = False @@ -8007,7 +8000,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, self.server.systemLanguage, self.server.maxLikeCount, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) if deleteStr: deleteStrLen = len(deleteStr) self._set_headers('text/html', deleteStrLen, @@ -8115,7 +8110,9 @@ class PubServer(BaseHTTPRequestHandler): showIndividualPostIcons, manuallyApproveFollowers, showPublicOnly, storeToCache, - useCacheOnly) + useCacheOnly, + self.server.CWlists, + self.server.listsEnabled) else: print('WARN: Muted post not found: ' + muteFilename) @@ -8224,7 +8221,9 @@ class PubServer(BaseHTTPRequestHandler): showIndividualPostIcons, manuallyApproveFollowers, showPublicOnly, storeToCache, - useCacheOnly) + useCacheOnly, + self.server.CWlists, + self.server.listsEnabled) else: print('WARN: Unmuted post not found: ' + muteFilename) self.server.GETbusy = False @@ -8347,7 +8346,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, self.server.systemLanguage, self.server.maxLikeCount, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -8446,7 +8447,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, self.server.systemLanguage, self.server.maxLikeCount, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -8555,7 +8558,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, rolesList, - None, None) + None, None, self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -8668,7 +8672,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.maxLikeCount, sharedItemsFederatedDomains, skills, - None, None) + None, None, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -8817,7 +8823,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, self.server.systemLanguage, self.server.maxLikeCount, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -9063,7 +9071,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) if GETstartTime: fitnessPerformance(GETstartTime, self.server.fitness, @@ -9211,7 +9221,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -9352,7 +9364,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -9492,7 +9506,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -9632,7 +9648,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -9781,7 +9799,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -9928,7 +9948,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10034,7 +10056,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10118,7 +10142,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10239,7 +10265,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10377,7 +10405,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10506,7 +10536,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, sharedItemsFederatedDomains, - self.server.signingPrivateKeyPem) + self.server.signingPrivateKeyPem, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10633,7 +10665,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, shares, - pageNumber, sharesPerPage) + pageNumber, sharesPerPage, + self.server.CWlists, + self.server.listsEnabled) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10757,7 +10791,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.sharedItemsFederatedDomains, following, pageNumber, - followsPerPage).encode('utf-8') + followsPerPage, + self.server.CWlists, + self.server.listsEnabled).encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, cookie, callingDomain, False) @@ -10880,7 +10916,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.sharedItemsFederatedDomains, followers, pageNumber, - followsPerPage).encode('utf-8') + followsPerPage, + self.server.CWlists, + self.server.listsEnabled).encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, cookie, callingDomain, False) @@ -11019,7 +11057,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.systemLanguage, self.server.maxLikeCount, self.server.sharedItemsFederatedDomains, - None, None).encode('utf-8') + None, None, None, + self.server.CWlists, + self.server.listsEnabled).encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, cookie, callingDomain, False) @@ -11785,7 +11825,9 @@ class PubServer(BaseHTTPRequestHandler): city, self.server.userAgentsBlocked, accessKeys, - defaultReplyIntervalHours).encode('utf-8') + defaultReplyIntervalHours, + self.server.CWlists, + self.server.listsEnabled).encode('utf-8') if msg: msglen = len(msg) self._set_headers('text/html', msglen, @@ -16875,7 +16917,8 @@ def loadTokens(baseDir: str, tokensDict: {}, tokensLookup: {}) -> None: break -def runDaemon(defaultReplyIntervalHours: int, +def runDaemon(listsEnabled: str, + defaultReplyIntervalHours: int, lowBandwidth: bool, maxLikeCount: int, sharedItemsFederatedDomains: [], @@ -17228,6 +17271,13 @@ def runDaemon(defaultReplyIntervalHours: int, if not os.path.isdir(baseDir + '/accounts/news@' + domain): print('Creating news inbox: news@' + domain) createNewsInbox(baseDir, domain, port, httpPrefix) + setConfigParam(baseDir, "listsEnabled", "Murdoch press") + + if listsEnabled: + httpd.listsEnabled = listsEnabled + else: + httpd.listsEnabled = getConfigParam(baseDir, "listsEnabled") + httpd.CWlists = loadCWLists(baseDir, True) # set the avatar for the news account httpd.themeName = getConfigParam(baseDir, 'theme') @@ -17359,7 +17409,8 @@ def runDaemon(defaultReplyIntervalHours: int, httpd.systemLanguage, httpd.maxLikeCount, httpd.signingPrivateKeyPem, - httpd.defaultReplyIntervalHours), daemon=True) + httpd.defaultReplyIntervalHours, + httpd.CWlists), daemon=True) print('Creating scheduled post thread') httpd.thrPostSchedule = \ diff --git a/epicyon.py b/epicyon.py index 897ddafa3..e9f39e100 100644 --- a/epicyon.py +++ b/epicyon.py @@ -112,6 +112,10 @@ def str2bool(v) -> bool: parser = argparse.ArgumentParser(description='ActivityPub Server') +parser.add_argument('--listsEnabled', type=str, + default=None, + help='Names of content warning lists enabled. ' + + 'See the cwlists directory') parser.add_argument('--userAgentBlocks', type=str, default=None, help='List of blocked user agents, separated by commas') @@ -3011,6 +3015,13 @@ if userAgentsBlockedStr: for agentBlockStr in agentBlocksList: userAgentsBlocked.append(agentBlockStr.strip()) +listsEnabled = '' +if args.listsEnabled: + listsEnabled = args.listsEnabled + setConfigParam(baseDir, 'listsEnabled', listsEnabled) +else: + listsEnabled = getConfigParam(baseDir, 'listsEnabled') + city = \ getConfigParam(baseDir, 'city') if city is not None: @@ -3064,7 +3075,8 @@ if args.defaultCurrency: print('Default currency set to ' + args.defaultCurrency) if __name__ == "__main__": - runDaemon(args.defaultReplyIntervalHours, + runDaemon(listsEnabled, + args.defaultReplyIntervalHours, args.lowBandwidth, args.maxLikeCount, sharedItemsFederatedDomains, userAgentsBlocked, diff --git a/fitnessFunctions.py b/fitnessFunctions.py index 1a4bb1976..f3531e7aa 100644 --- a/fitnessFunctions.py +++ b/fitnessFunctions.py @@ -112,7 +112,7 @@ def htmlWatchPointsGraph(baseDir: str, fitness: {}, fitnessId: str, htmlStr += \ '
' + \
diff --git a/webapp_frontscreen.py b/webapp_frontscreen.py
index 8462d80e2..25104840a 100644
--- a/webapp_frontscreen.py
+++ b/webapp_frontscreen.py
@@ -35,7 +35,8 @@ def _htmlFrontScreenPosts(recentPostsCache: {}, maxRecentPosts: int,
allowLocalNetworkAccess: bool,
themeName: str, systemLanguage: str,
maxLikeCount: int,
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str, CWlists: {},
+ listsEnabled: str) -> str:
"""Shows posts on the front screen of a news instance
These should only be public blog posts from the features timeline
which is the blog timeline of the news actor
@@ -81,7 +82,8 @@ def _htmlFrontScreenPosts(recentPostsCache: {}, maxRecentPosts: int,
themeName, systemLanguage,
maxLikeCount,
False, False, False,
- True, False, False)
+ True, False, False,
+ CWlists, listsEnabled)
if postStr:
profileStr += postStr + separatorStr
ctr += 1
@@ -109,9 +111,10 @@ def htmlFrontScreen(signingPrivateKeyPem: str,
accessKeys: {},
systemLanguage: str, maxLikeCount: int,
sharedItemsFederatedDomains: [],
- extraJson: {} = None,
- pageNumber: int = None,
- maxItemsPerPage: int = None) -> str:
+ extraJson: {},
+ pageNumber: int,
+ maxItemsPerPage: int,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the news instance front screen
"""
nickname = profileJson['preferredUsername']
@@ -182,7 +185,8 @@ def htmlFrontScreen(signingPrivateKeyPem: str,
allowLocalNetworkAccess,
theme, systemLanguage,
maxLikeCount,
- signingPrivateKeyPem) + licenseStr
+ signingPrivateKeyPem,
+ CWlists, listsEnabled) + licenseStr
# Footer which is only used for system accounts
profileFooterStr = ' \n'
diff --git a/webapp_moderation.py b/webapp_moderation.py
index ef455e412..21009939a 100644
--- a/webapp_moderation.py
+++ b/webapp_moderation.py
@@ -52,7 +52,8 @@ def htmlModeration(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the moderation feed as html
This is what you see when selecting the "mod" timeline
"""
@@ -72,7 +73,7 @@ def htmlModeration(cssCache: {}, defaultTimeline: str,
peertubeInstances, allowLocalNetworkAccess,
textModeBanner, accessKeys, systemLanguage,
maxLikeCount, sharedItemsFederatedDomains,
- signingPrivateKeyPem)
+ signingPrivateKeyPem, CWlists, listsEnabled)
def htmlAccountInfo(cssCache: {}, translate: {},
diff --git a/webapp_post.py b/webapp_post.py
index 4e5e6cbe6..74d90a6b1 100644
--- a/webapp_post.py
+++ b/webapp_post.py
@@ -77,6 +77,7 @@ from webfinger import webfingerHandle
from speaker import updateSpeaker
from languages import autoTranslatePost
from blocking import isBlocked
+from blocking import addCWfromLists
def _logPostTiming(enableTimingLog: bool, postStartTime, debugId: str) -> None:
@@ -1205,7 +1206,9 @@ def individualPostAsHtml(signingPrivateKeyPem: str,
manuallyApprovesFollowers: bool,
showPublicOnly: bool,
storeToCache: bool,
- useCacheOnly: bool) -> str:
+ useCacheOnly: bool,
+ CWlists: {},
+ listsEnabled: str) -> str:
""" Shows a single post as html
"""
if not postJsonObject:
@@ -1651,6 +1654,9 @@ def individualPostAsHtml(signingPrivateKeyPem: str,
if newFooterStr:
footerStr = newFooterStr
+ # add any content warning from the cwlists directory
+ addCWfromLists(postJsonObject, CWlists, translate, listsEnabled)
+
postIsSensitive = False
if postJsonObject['object'].get('sensitive'):
# sensitive posts should have a summary
@@ -1825,7 +1831,8 @@ def htmlIndividualPost(cssCache: {},
peertubeInstances: [],
allowLocalNetworkAccess: bool,
themeName: str, systemLanguage: str,
- maxLikeCount: int, signingPrivateKeyPem: str) -> str:
+ maxLikeCount: int, signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show an individual post as html
"""
postStr = ''
@@ -1878,7 +1885,8 @@ def htmlIndividualPost(cssCache: {},
peertubeInstances,
allowLocalNetworkAccess, themeName,
systemLanguage, maxLikeCount,
- False, authorized, False, False, False, False)
+ False, authorized, False, False, False, False,
+ CWlists, listsEnabled)
messageId = removeIdEnding(postJsonObject['id'])
# show the previous posts
@@ -1910,7 +1918,8 @@ def htmlIndividualPost(cssCache: {},
themeName, systemLanguage,
maxLikeCount,
False, authorized,
- False, False, False, False) + postStr
+ False, False, False, False,
+ CWlists, listsEnabled) + postStr
# show the following posts
postFilename = locatePost(baseDir, nickname, domain, messageId)
@@ -1944,7 +1953,8 @@ def htmlIndividualPost(cssCache: {},
themeName, systemLanguage,
maxLikeCount,
False, authorized,
- False, False, False, False)
+ False, False, False, False,
+ CWlists, listsEnabled)
cssFilename = baseDir + '/epicyon-profile.css'
if os.path.isfile(baseDir + '/epicyon.css'):
cssFilename = baseDir + '/epicyon.css'
@@ -1968,7 +1978,8 @@ def htmlPostReplies(cssCache: {},
allowLocalNetworkAccess: bool,
themeName: str, systemLanguage: str,
maxLikeCount: int,
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str, CWlists: {},
+ listsEnabled: str) -> str:
"""Show the replies to an individual post as html
"""
repliesStr = ''
@@ -1991,7 +2002,8 @@ def htmlPostReplies(cssCache: {},
allowLocalNetworkAccess,
themeName, systemLanguage,
maxLikeCount,
- False, False, False, False, False, False)
+ False, False, False, False, False, False,
+ CWlists, listsEnabled)
cssFilename = baseDir + '/epicyon-profile.css'
if os.path.isfile(baseDir + '/epicyon.css'):
diff --git a/webapp_profile.py b/webapp_profile.py
index 9de5871e4..914d212c8 100644
--- a/webapp_profile.py
+++ b/webapp_profile.py
@@ -34,6 +34,7 @@ from person import personBoxJson
from person import getActorJson
from person import getPersonAvatarUrl
from webfinger import webfingerHandle
+from posts import isModerator
from posts import parseUserFeed
from posts import getPersonBox
from posts import isCreateInsideAnnounce
@@ -69,6 +70,7 @@ from webapp_utils import endEditSection
from blog import getBlogAddress
from webapp_post import individualPostAsHtml
from webapp_timeline import htmlIndividualShare
+from blocking import getCWlistVariable
def htmlProfileAfterSearch(cssCache: {},
@@ -89,7 +91,8 @@ def htmlProfileAfterSearch(cssCache: {},
accessKeys: {},
systemLanguage: str,
maxLikeCount: int,
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show a profile page after a search for a fediverse address
"""
http = False
@@ -306,7 +309,8 @@ def htmlProfileAfterSearch(cssCache: {},
peertubeInstances,
allowLocalNetworkAccess,
themeName, systemLanguage, maxLikeCount,
- False, False, False, False, False, False)
+ False, False, False, False, False, False,
+ CWlists, listsEnabled)
i += 1
if i >= 8:
break
@@ -516,8 +520,9 @@ def htmlProfile(signingPrivateKeyPem: str,
debug: bool, accessKeys: {}, city: str,
systemLanguage: str, maxLikeCount: int,
sharedItemsFederatedDomains: [],
- extraJson: {} = None, pageNumber: int = None,
- maxItemsPerPage: int = None) -> str:
+ extraJson: {}, pageNumber: int,
+ maxItemsPerPage: int,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the profile page as html
"""
nickname = profileJson['preferredUsername']
@@ -539,8 +544,9 @@ def htmlProfile(signingPrivateKeyPem: str,
newswire, theme, extraJson,
allowLocalNetworkAccess, accessKeys,
systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains,
- pageNumber, maxItemsPerPage)
+ sharedItemsFederatedDomains, None,
+ pageNumber, maxItemsPerPage, CWlists,
+ listsEnabled)
domain, port = getDomainFromActor(profileJson['id'])
if not domain:
@@ -897,7 +903,8 @@ def htmlProfile(signingPrivateKeyPem: str,
allowLocalNetworkAccess,
theme, systemLanguage,
maxLikeCount,
- signingPrivateKeyPem) + licenseStr
+ signingPrivateKeyPem,
+ CWlists, listsEnabled) + licenseStr
if not isGroup:
if selected == 'following':
profileStr += \
@@ -963,7 +970,8 @@ def _htmlProfilePosts(recentPostsCache: {}, maxRecentPosts: int,
allowLocalNetworkAccess: bool,
themeName: str, systemLanguage: str,
maxLikeCount: int,
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Shows posts on the profile screen
These should only be public posts
"""
@@ -1008,7 +1016,8 @@ def _htmlProfilePosts(recentPostsCache: {}, maxRecentPosts: int,
themeName, systemLanguage,
maxLikeCount,
False, False, False,
- True, False, False)
+ True, False, False,
+ CWlists, listsEnabled)
if postStr:
profileStr += postStr + separatorStr
ctr += 1
@@ -1512,7 +1521,8 @@ def _htmlEditProfileSharedItems(baseDir: str, nickname: str, domain: str,
def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str,
userAgentsBlocked: str, translate: {},
- replyIntervalHours: int) -> str:
+ replyIntervalHours: int,
+ CWlists: {}, listsEnabled: str) -> str:
"""Filtering and blocking section of edit profile screen
"""
filterStr = ''
@@ -1658,15 +1668,32 @@ def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str,
'style="height:200px" spellcheck="false">' + \
allowedInstancesStr + '\n'
- userAgentsBlockedStr = ''
- for ua in userAgentsBlocked:
- if userAgentsBlockedStr:
- userAgentsBlockedStr += '\n'
- userAgentsBlockedStr += ua
- editProfileForm += \
- editTextArea(translate['Blocked User Agents'],
- 'userAgentsBlockedStr', userAgentsBlockedStr,
- 200, '', False)
+ if isModerator(baseDir, nickname):
+ userAgentsBlockedStr = ''
+ for ua in userAgentsBlocked:
+ if userAgentsBlockedStr:
+ userAgentsBlockedStr += '\n'
+ userAgentsBlockedStr += ua
+ editProfileForm += \
+ editTextArea(translate['Blocked User Agents'],
+ 'userAgentsBlockedStr', userAgentsBlockedStr,
+ 200, '', False)
+
+ CWlistsStr = ''
+ for name, item in CWlists.items():
+ variableName = getCWlistVariable(name)
+ listIsEnabled = False
+ if listsEnabled:
+ if name in listsEnabled:
+ listIsEnabled = True
+ if translate.get(name):
+ name = translate[name]
+ CWlistsStr += editCheckBox(name, variableName, listIsEnabled)
+ if CWlistsStr:
+ idx = 'Add content warnings for the following sites'
+ editProfileForm += \
+ '\n' + \
+ '
' + CWlistsStr
editProfileForm += endEditSection()
return editProfileForm
@@ -1950,7 +1977,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str,
textModeBanner: str, city: str,
userAgentsBlocked: str,
accessKeys: {},
- defaultReplyIntervalHours: int) -> str:
+ defaultReplyIntervalHours: int,
+ CWlists: {}, listsEnabled: str) -> str:
"""Shows the edit profile screen
"""
path = path.replace('/inbox', '').replace('/outbox', '')
@@ -2146,7 +2174,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str,
editProfileForm += \
_htmlEditProfileFiltering(baseDir, nickname, domain,
userAgentsBlocked, translate,
- replyIntervalHours)
+ replyIntervalHours,
+ CWlists, listsEnabled)
# git projects section
editProfileForm += \
diff --git a/webapp_search.py b/webapp_search.py
index c98f73c35..5c48ac6b3 100644
--- a/webapp_search.py
+++ b/webapp_search.py
@@ -598,7 +598,9 @@ def htmlHistorySearch(cssCache: {}, translate: {}, baseDir: str,
themeName: str, boxName: str,
systemLanguage: str,
maxLikeCount: int,
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {},
+ listsEnabled: str) -> str:
"""Show a page containing search results for your post history
"""
if historysearch.startswith("'"):
@@ -683,7 +685,8 @@ def htmlHistorySearch(cssCache: {}, translate: {}, baseDir: str,
themeName, systemLanguage, maxLikeCount,
showIndividualPostIcons,
showIndividualPostIcons,
- False, False, False, False)
+ False, False, False, False,
+ CWlists, listsEnabled)
if postStr:
historySearchForm += separatorStr + postStr
index += 1
@@ -707,7 +710,8 @@ def htmlHashtagSearch(cssCache: {},
allowLocalNetworkAccess: bool,
themeName: str, systemLanguage: str,
maxLikeCount: int,
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show a page containing search results for a hashtag
or after selecting a hashtag from the swarm
"""
@@ -865,7 +869,8 @@ def htmlHashtagSearch(cssCache: {},
showRepeats, showIcons,
manuallyApprovesFollowers,
showPublicOnly,
- storeToCache, False)
+ storeToCache, False, CWlists,
+ listsEnabled)
if postStr:
hashtagSearchForm += separatorStr + postStr
index += 1
diff --git a/webapp_timeline.py b/webapp_timeline.py
index 91afad775..27db4313b 100644
--- a/webapp_timeline.py
+++ b/webapp_timeline.py
@@ -446,7 +446,8 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the timeline as html
"""
enableTimingLog = False
@@ -913,7 +914,8 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str,
boxName != 'dm',
showIndividualPostIcons,
manuallyApproveFollowers,
- False, True, useCacheOnly)
+ False, True, useCacheOnly,
+ CWlists, listsEnabled)
_logTimelineTiming(enableTimingLog,
timelineStartTime, boxName, '12')
@@ -1137,7 +1139,8 @@ def htmlShares(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the shares timeline as html
"""
manuallyApproveFollowers = \
@@ -1162,7 +1165,8 @@ def htmlShares(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlWanted(cssCache: {}, defaultTimeline: str,
@@ -1189,7 +1193,8 @@ def htmlWanted(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the wanted timeline as html
"""
manuallyApproveFollowers = \
@@ -1214,7 +1219,8 @@ def htmlWanted(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlInbox(cssCache: {}, defaultTimeline: str,
@@ -1242,7 +1248,8 @@ def htmlInbox(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the inbox as html
"""
manuallyApproveFollowers = \
@@ -1267,7 +1274,8 @@ def htmlInbox(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlBookmarks(cssCache: {}, defaultTimeline: str,
@@ -1295,7 +1303,8 @@ def htmlBookmarks(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the bookmarks as html
"""
manuallyApproveFollowers = \
@@ -1320,7 +1329,8 @@ def htmlBookmarks(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlInboxDMs(cssCache: {}, defaultTimeline: str,
@@ -1348,7 +1358,8 @@ def htmlInboxDMs(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the DM timeline as html
"""
return htmlTimeline(cssCache, defaultTimeline,
@@ -1368,7 +1379,8 @@ def htmlInboxDMs(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlInboxReplies(cssCache: {}, defaultTimeline: str,
@@ -1396,7 +1408,8 @@ def htmlInboxReplies(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the replies timeline as html
"""
return htmlTimeline(cssCache, defaultTimeline,
@@ -1417,7 +1430,8 @@ def htmlInboxReplies(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlInboxMedia(cssCache: {}, defaultTimeline: str,
@@ -1445,7 +1459,8 @@ def htmlInboxMedia(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the media timeline as html
"""
return htmlTimeline(cssCache, defaultTimeline,
@@ -1466,7 +1481,8 @@ def htmlInboxMedia(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlInboxBlogs(cssCache: {}, defaultTimeline: str,
@@ -1494,7 +1510,8 @@ def htmlInboxBlogs(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the blogs timeline as html
"""
return htmlTimeline(cssCache, defaultTimeline,
@@ -1515,7 +1532,8 @@ def htmlInboxBlogs(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlInboxFeatures(cssCache: {}, defaultTimeline: str,
@@ -1544,7 +1562,8 @@ def htmlInboxFeatures(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the features timeline as html
"""
return htmlTimeline(cssCache, defaultTimeline,
@@ -1565,7 +1584,8 @@ def htmlInboxFeatures(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlInboxNews(cssCache: {}, defaultTimeline: str,
@@ -1593,7 +1613,8 @@ def htmlInboxNews(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the news timeline as html
"""
return htmlTimeline(cssCache, defaultTimeline,
@@ -1614,7 +1635,8 @@ def htmlInboxNews(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)
def htmlOutbox(cssCache: {}, defaultTimeline: str,
@@ -1642,7 +1664,8 @@ def htmlOutbox(cssCache: {}, defaultTimeline: str,
accessKeys: {}, systemLanguage: str,
maxLikeCount: int,
sharedItemsFederatedDomains: [],
- signingPrivateKeyPem: str) -> str:
+ signingPrivateKeyPem: str,
+ CWlists: {}, listsEnabled: str) -> str:
"""Show the Outbox as html
"""
manuallyApproveFollowers = \
@@ -1664,4 +1687,5 @@ def htmlOutbox(cssCache: {}, defaultTimeline: str,
authorized, None, theme, peertubeInstances,
allowLocalNetworkAccess, textModeBanner,
accessKeys, systemLanguage, maxLikeCount,
- sharedItemsFederatedDomains, signingPrivateKeyPem)
+ sharedItemsFederatedDomains, signingPrivateKeyPem,
+ CWlists, listsEnabled)