diff --git a/blog.py b/blog.py index 0822aa64a..5acefa981 100644 --- a/blog.py +++ b/blog.py @@ -28,6 +28,7 @@ from utils import firstParagraphFromString from posts import createBlogsTimeline from newswire import rss2Header from newswire import rss2Footer +from storage import readWholeFile def _noOfBlogReplies(baseDir: str, httpPrefix: str, translate: {}, @@ -744,8 +745,9 @@ def htmlEditBlog(mediaInstance: bool, translate: {}, editBlogText = '' + translate['Write your post text below.'] + '' if os.path.isfile(baseDir + '/accounts/newpost.txt'): - with open(baseDir + '/accounts/newpost.txt', 'r') as file: - editBlogText = '

' + file.read() + '

' + newPostStr = readWholeFile(baseDir + '/accounts/newpost.txt') + if newPostStr: + editBlogText = '

' + newPostStr + '

' cssFilename = baseDir + '/epicyon-profile.css' if os.path.isfile(baseDir + '/epicyon.css'): diff --git a/bookmarks.py b/bookmarks.py index 3858d22e7..f5f55fe96 100644 --- a/bookmarks.py +++ b/bookmarks.py @@ -25,6 +25,7 @@ from utils import saveJson from posts import getPersonBox from session import postJson from storage import storeValue +from storage import readWholeFile def undoBookmarksCollectionEntry(recentPostsCache: {}, @@ -59,10 +60,9 @@ def undoBookmarksCollectionEntry(recentPostsCache: {}, bookmarkIndex = bookmarkIndex.replace('\n', '').replace('\r', '') if bookmarkIndex not in open(bookmarksIndexFilename).read(): return - indexStr = '' - with open(bookmarksIndexFilename, 'r') as indexFile: - indexStr = indexFile.read().replace(bookmarkIndex + '\n', '') - storeValue(bookmarksIndexFilename, indexStr, 'writeonly') + indexStr = readWholeFile(bookmarksIndexFilename) + indexStr = indexStr.replace(bookmarkIndex + '\n', '') + storeValue(bookmarksIndexFilename, indexStr, 'writeonly') if not postJsonObject.get('type'): return diff --git a/categories.py b/categories.py index 67c65ba15..32247ccf2 100644 --- a/categories.py +++ b/categories.py @@ -10,6 +10,7 @@ __module_group__ = "RSS Feeds" import os import datetime from storage import storeValue +from storage import readWholeFile def getHashtagCategory(baseDir: str, hashtag: str) -> str: @@ -24,10 +25,9 @@ def getHashtagCategory(baseDir: str, hashtag: str) -> str: if not os.path.isfile(categoryFilename): return '' - with open(categoryFilename, 'r') as fp: - categoryStr = fp.read() - if categoryStr: - return categoryStr + categoryStr = readWholeFile(categoryFilename) + if categoryStr: + return categoryStr return '' @@ -53,12 +53,10 @@ def getHashtagCategories(baseDir: str, hashtag = f.split('.')[0] if len(hashtag) > maxTagLength: continue - with open(categoryFilename, 'r') as fp: - categoryStr = fp.read() - - if not categoryStr: - continue - + categoryStr = readWholeFile(categoryFilename) + if not categoryStr: + continue + if categoryStr: if category: # only return a dictionary for a specific category if categoryStr != category: diff --git a/city.py b/city.py index 1726966d3..12d5ba570 100644 --- a/city.py +++ b/city.py @@ -12,6 +12,7 @@ import datetime import random import math from random import randint +from storage import readWholeFile # states which the simulated city dweller can be in PERSON_SLEEP = 0 @@ -294,8 +295,7 @@ def getSpoofedCity(city: str, baseDir: str, nickname: str, domain: str) -> str: cityFilename = baseDir + '/accounts/' + \ nickname + '@' + domain + '/city.txt' if os.path.isfile(cityFilename): - with open(cityFilename, 'r') as fp: - city = fp.read().replace('\n', '') + city = readWholeFile(cityFilename).replace('\n', '') return city diff --git a/content.py b/content.py index 22ba06f0b..89821b983 100644 --- a/content.py +++ b/content.py @@ -19,6 +19,7 @@ from utils import dangerousMarkup from utils import isPGPEncrypted from utils import containsPGPPublicKey from petnames import getPetName +from storage import readWholeFile def removeHtmlTag(htmlStr: str, tag: str) -> str: @@ -169,8 +170,9 @@ def dangerousCSS(filename: str, allowLocalNetworkAccess: bool) -> bool: if not os.path.isfile(filename): return False - with open(filename, 'r') as fp: - content = fp.read().lower() + content = readWholeFile(filename) + if content: + content = content.lower() cssMatches = ('behavior:', ':expression', '?php', '.php', 'google', 'regexp', 'localhost', diff --git a/daemon.py b/daemon.py index 32ee60d6e..6ca766959 100644 --- a/daemon.py +++ b/daemon.py @@ -301,6 +301,7 @@ from speaker import getSSMLbox from city import getSpoofedCity import os from storage import storeValue +from storage import readWholeFile # maximum number of posts to list in outbox feed @@ -665,11 +666,7 @@ class PubServer(BaseHTTPRequestHandler): # self.send_header('Cache-Control', 'public, max-age=86400') etag = None if os.path.isfile(mediaFilename + '.etag'): - try: - with open(mediaFilename + '.etag', 'r') as etagFile: - etag = etagFile.read() - except BaseException: - pass + etag = readWholeFile(mediaFilename + '.etag') if not etag: etag = sha1(data).hexdigest() # nosec storeValue(mediaFilename + '.etag', etag, 'writeonly') @@ -690,12 +687,7 @@ class PubServer(BaseHTTPRequestHandler): oldEtag = self.headers['If-None-Match'] if os.path.isfile(mediaFilename + '.etag'): # load the etag from file - currEtag = '' - try: - with open(mediaFilename, 'r') as etagFile: - currEtag = etagFile.read() - except BaseException: - pass + currEtag = readWholeFile(mediaFilename) if oldEtag == currEtag: # The file has not changed return True @@ -1532,12 +1524,7 @@ class PubServer(BaseHTTPRequestHandler): loginNickname + '@' + domain + '/.salt' salt = createPassword(32) if os.path.isfile(saltFilename): - try: - with open(saltFilename, 'r') as fp: - salt = fp.read() - except Exception as e: - print('WARN: Unable to read salt for ' + - loginNickname + ' ' + str(e)) + salt = readWholeFile(saltFilename) else: storeValue(saltFilename, salt, 'writeonly') @@ -13108,11 +13095,7 @@ class PubServer(BaseHTTPRequestHandler): fileLength = os.path.getsize(mediaFilename) mediaTagFilename = mediaFilename + '.etag' if os.path.isfile(mediaTagFilename): - try: - with open(mediaTagFilename, 'r') as etagFile: - etag = etagFile.read() - except BaseException: - pass + etag = readWholeFile(mediaTagFilename) else: with open(mediaFilename, 'rb') as avFile: mediaBinary = avFile.read() @@ -14856,13 +14839,7 @@ def loadTokens(baseDir: str, tokensDict: {}, tokensLookup: {}) -> None: if not os.path.isfile(tokenFilename): continue nickname = handle.split('@')[0] - token = None - try: - with open(tokenFilename, 'r') as fp: - token = fp.read() - except Exception as e: - print('WARN: Unable to read token for ' + - nickname + ' ' + str(e)) + token = readWholeFile(tokenFilename) if not token: continue tokensDict[nickname] = token diff --git a/desktop_client.py b/desktop_client.py index ee7fccf83..d1dc12fbd 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -57,6 +57,7 @@ from bookmarks import sendUndoBookmarkViaServer from delete import sendDeleteViaServer from person import getActorJson from storage import storeValue +from storage import readWholeFile def _desktopHelp() -> None: @@ -284,10 +285,9 @@ def _desktopShowBanner() -> None: bannerFilename = 'theme/' + bannerTheme + '/banner.txt' if not os.path.isfile(bannerFilename): return - with open(bannerFilename, 'r') as bannerFile: - banner = bannerFile.read() - if banner: - print(banner + '\n') + banner = readWholeFile(bannerFilename) + if banner: + print(banner + '\n') def _desktopWaitForCmd(timeout: int, debug: bool) -> str: diff --git a/follow.py b/follow.py index 9eb158491..1387c2c8a 100644 --- a/follow.py +++ b/follow.py @@ -31,6 +31,8 @@ from auth import createBasicAuthHeader from session import getJson from session import postJson from storage import storeValue +from storage import readWholeFile +from storage import readFileLines def createInitialLastSeen(baseDir: str, httpPrefix: str) -> None: @@ -49,8 +51,8 @@ def createInitialLastSeen(baseDir: str, httpPrefix: str) -> None: lastSeenDir = accountDir + '/lastseen' if not os.path.isdir(lastSeenDir): os.mkdir(lastSeenDir) - with open(followingFilename, 'r') as fp: - followingHandles = fp.readlines() + followingHandles = readFileLines(followingFilename) + if followingHandles: for handle in followingHandles: if '#' in handle: continue @@ -214,9 +216,7 @@ def isFollowerOfPerson(baseDir: str, nickname: str, domain: str, alreadyFollowing = False - followersStr = '' - with open(followersFile, 'r') as fpFollowers: - followersStr = fpFollowers.read() + followersStr = readWholeFile(followersFile) if handle in followersStr: alreadyFollowing = True @@ -556,9 +556,7 @@ def _storeFollowRequest(baseDir: str, if os.path.isfile(followersFilename): alreadyFollowing = False - followersStr = '' - with open(followersFilename, 'r') as fpFollowers: - followersStr = fpFollowers.read() + followersStr = readWholeFile(followersFilename) if approveHandle in followersStr: alreadyFollowing = True diff --git a/followingCalendar.py b/followingCalendar.py index 3b4665dbe..24cd9da12 100644 --- a/followingCalendar.py +++ b/followingCalendar.py @@ -8,6 +8,7 @@ __status__ = "Production" __module_group__ = "Calendar" import os +from storage import readWholeFile from storage import storeValue @@ -29,9 +30,8 @@ def receivingCalendarEvents(baseDir: str, nickname: str, domain: str, if not os.path.isfile(followingFilename): return False # create a new calendar file from the following file - with open(followingFilename, 'r') as followingFile: - followingHandles = followingFile.read() - storeValue(calendarFilename, followingHandles, 'writeonly') + followingHandles = readWholeFile(followingFilename) + storeValue(calendarFilename, followingHandles, 'writeonly') return handle + '\n' in open(calendarFilename).read() @@ -66,14 +66,11 @@ def _receiveCalendarEvents(baseDir: str, nickname: str, domain: str, followingHandles = '' if os.path.isfile(calendarFilename): print('Calendar file exists') - with open(calendarFilename, 'r') as calendarFile: - followingHandles = calendarFile.read() + followingHandles = readWholeFile(calendarFilename) else: # create a new calendar file from the following file print('Creating calendar file ' + calendarFilename) - followingHandles = '' - with open(followingFilename, 'r') as followingFile: - followingHandles = followingFile.read() + followingHandles = readWholeFile(followingFilename) if add: storeValue(calendarFilename, followingHandles + handle, 'write') diff --git a/happening.py b/happening.py index 1bc8685a5..efb5c7c3f 100644 --- a/happening.py +++ b/happening.py @@ -17,6 +17,7 @@ from utils import loadJson from utils import saveJson from utils import locatePost from storage import storeValue +from storage import readWholeFile def _validUuid(testUuid: str, version=4): @@ -35,9 +36,9 @@ def _removeEventFromTimeline(eventId: str, tlEventsFilename: str) -> None: """ if eventId + '\n' not in open(tlEventsFilename).read(): return - with open(tlEventsFilename, 'r') as fp: - eventsTimeline = fp.read().replace(eventId + '\n', '') - storeValue(tlEventsFilename, eventsTimeline, 'writeonly') + eventsTimeline = readWholeFile(tlEventsFilename) + eventsTimeline = eventsTimeline.replace(eventId + '\n', '') + storeValue(tlEventsFilename, eventsTimeline, 'writeonly') def saveEventPost(baseDir: str, handle: str, postId: str, diff --git a/inbox.py b/inbox.py index e80fc9071..033f6b0d5 100644 --- a/inbox.py +++ b/inbox.py @@ -84,6 +84,7 @@ from context import hasValidContext from speaker import updateSpeaker from announce import isSelfAnnounce from storage import storeValue +from storage import readWholeFile def storeHashTags(baseDir: str, nickname: str, postJsonObject: {}) -> None: @@ -1879,10 +1880,9 @@ def _likeNotify(baseDir: str, domain: str, onionDomain: str, # was there a previous like notification? if os.path.isfile(prevLikeFile): # is it the same as the current notification ? - with open(prevLikeFile, 'r') as fp: - prevLikeStr = fp.read() - if prevLikeStr == likeStr: - return + prevLikeStr = readWholeFile(prevLikeFile) + if prevLikeStr == likeStr: + return storeValue(prevLikeFile, likeStr, 'writeonly') storeValue(likeFile, likeStr, 'writeonly') @@ -2108,8 +2108,8 @@ def _updateLastSeen(baseDir: str, handle: str, actor: str) -> None: daysSinceEpoch = (currTime - datetime.datetime(1970, 1, 1)).days # has the value changed? if os.path.isfile(lastSeenFilename): - with open(lastSeenFilename, 'r') as lastSeenFile: - daysSinceEpochFile = lastSeenFile.read() + daysSinceEpochFile = readWholeFile(lastSeenFilename) + if daysSinceEpochFile: if int(daysSinceEpochFile) == daysSinceEpoch: # value hasn't changed, so we can save writing anything to file return diff --git a/manualapprove.py b/manualapprove.py index 7e97543b4..9c7fdd558 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -12,6 +12,7 @@ from follow import followedAccountAccepts from follow import followedAccountRejects from follow import removeFromFollowRequests from utils import loadJson +from storage import readWholeFile from storage import storeValue @@ -96,9 +97,7 @@ def manualApproveFollowRequest(session, baseDir: str, return # is the handle in the requests file? - approveFollowsStr = '' - with open(approveFollowsFilename, 'r') as fpFollowers: - approveFollowsStr = fpFollowers.read() + approveFollowsStr = readWholeFile(approveFollowsFilename) exists = False approveHandleFull = approveHandle if approveHandle in approveFollowsStr: diff --git a/media.py b/media.py index 5530f60f5..0182222ba 100644 --- a/media.py +++ b/media.py @@ -21,6 +21,7 @@ from shutil import copyfile from shutil import rmtree from shutil import move from city import spoofGeolocation +from storage import readWholeFile from storage import storeValue @@ -70,8 +71,10 @@ def _spoofMetaData(baseDir: str, nickname: str, domain: str, baseDir + '/accounts/' + nickname + '@' + domain + '/decoyseed' decoySeed = 63725 if os.path.isfile(decoySeedFilename): - with open(decoySeedFilename, 'r') as fp: - decoySeed = int(fp.read()) + decoySeedStr = readWholeFile(decoySeedFilename) + if decoySeedStr: + if decoySeedStr.isdigit(): + decoySeed = int(decoySeedStr) else: decoySeed = randint(10000, 10000000000000000) decoySeedStr = str(decoySeed) diff --git a/newsdaemon.py b/newsdaemon.py index c816417dd..8c43b0b55 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -34,6 +34,7 @@ from utils import clearFromPostCaches from utils import dangerousMarkup from inbox import storeHashTags from session import createSession +from storage import readWholeFile from storage import storeValue @@ -398,9 +399,8 @@ def _createNewsMirror(baseDir: str, domain: str, # remove the corresponding index entries if removals: - indexContent = '' - with open(mirrorIndexFilename, 'r') as indexFile: - indexContent = indexFile.read() + indexContent = readWholeFile(mirrorIndexFilename) + if indexContent: for removePostId in removals: indexContent = \ indexContent.replace(removePostId + '\n', '') diff --git a/newswire.py b/newswire.py index 51c773994..8a877d07f 100644 --- a/newswire.py +++ b/newswire.py @@ -29,6 +29,8 @@ from utils import removeHtml from blocking import isBlockedDomain from blocking import isBlockedHashtag from filters import isFiltered +from storage import readWholeFile +from storage import readFileLines def _removeCDATA(text: str) -> str: @@ -219,8 +221,8 @@ def loadHashtagCategories(baseDir: str, language: str) -> None: if not os.path.isfile(hashtagCategoriesFilename): return - with open(hashtagCategoriesFilename, 'r') as fp: - xmlStr = fp.read() + xmlStr = readWholeFile(hashtagCategoriesFilename) + if xmlStr: _xml2StrToHashtagCategories(baseDir, xmlStr, 1024, True) @@ -1014,9 +1016,7 @@ def getDictFromNewswire(session, baseDir: str, domain: str, maxPostsPerSource = 5 # add rss feeds - rssFeed = [] - with open(subscriptionsFilename, 'r') as fp: - rssFeed = fp.readlines() + rssFeed = readFileLines(subscriptionsFilename) result = {} for url in rssFeed: url = url.strip() diff --git a/person.py b/person.py index f9052ff86..eaca21988 100644 --- a/person.py +++ b/person.py @@ -52,6 +52,7 @@ from session import createSession from session import getJson from webfinger import webfingerHandle from pprint import pprint +from storage import readWholeFile from storage import storeValue @@ -1121,9 +1122,7 @@ def isPersonSnoozed(baseDir: str, nickname: str, domain: str, replaceStr = line break if replaceStr: - content = None - with open(snoozedFilename, 'r') as snoozedFile: - content = snoozedFile.read().replace(replaceStr, '') + content = readWholeFile(snoozedFilename).replace(replaceStr, '') if content: storeValue(snoozedFilename, content, 'writeonly') @@ -1168,9 +1167,7 @@ def personUnsnooze(baseDir: str, nickname: str, domain: str, replaceStr = line break if replaceStr: - content = None - with open(snoozedFilename, 'r') as snoozedFile: - content = snoozedFile.read().replace(replaceStr, '') + content = readWholeFile(snoozedFilename).replace(replaceStr, '') if content: storeValue(snoozedFilename, content, 'writeonly') diff --git a/petnames.py b/petnames.py index 52ece3c3f..7d4ffd4f5 100644 --- a/petnames.py +++ b/petnames.py @@ -7,6 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" import os +from storage import readWholeFile from storage import storeValue @@ -28,8 +29,8 @@ def setPetName(baseDir: str, nickname: str, domain: str, # does this entry already exist? if os.path.isfile(petnamesFilename): - with open(petnamesFilename, 'r') as petnamesFile: - petnamesStr = petnamesFile.read() + petnamesStr = readWholeFile(petnamesFilename) + if petnamesStr: if entry in petnamesStr: return True if ' ' + handle + '\n' in petnamesStr: @@ -65,8 +66,8 @@ def getPetName(baseDir: str, nickname: str, domain: str, if not os.path.isfile(petnamesFilename): return '' - with open(petnamesFilename, 'r') as petnamesFile: - petnamesStr = petnamesFile.read() + petnamesStr = readWholeFile(petnamesFilename) + if petnamesStr: if ' ' + handle + '\n' in petnamesStr: petnamesList = petnamesStr.split('\n') for pet in petnamesList: @@ -86,8 +87,8 @@ def _getPetNameHandle(baseDir: str, nickname: str, domain: str, if not os.path.isfile(petnamesFilename): return '' - with open(petnamesFilename, 'r') as petnamesFile: - petnamesStr = petnamesFile.read() + petnamesStr = readWholeFile(petnamesFilename) + if petnamesStr: if petname + ' ' in petnamesStr: petnamesList = petnamesStr.split('\n') for pet in petnamesList: diff --git a/posts.py b/posts.py index 05291fedf..e7d0c6328 100644 --- a/posts.py +++ b/posts.py @@ -72,6 +72,7 @@ from git import convertPostToPatch from linked_data_sig import generateJsonSignature from petnames import resolvePetnames from storage import storeValue +from storage import readWholeFile def isModerator(baseDir: str, nickname: str) -> bool: @@ -3022,9 +3023,8 @@ def _addPostToTimeline(filePath: str, boxname: str, postsInBox: [], boxActor: str) -> bool: """ Reads a post from file and decides whether it is valid """ - with open(filePath, 'r') as postFile: - postStr = postFile.read() - + postStr = readWholeFile(filePath) + if postStr: if filePath.endswith('.json'): repliesFilename = filePath.replace('.json', '.replies') if os.path.isfile(repliesFilename): @@ -3715,9 +3715,7 @@ def getPublicPostDomainsBlocked(session, baseDir: str, return [] # read the blocked domains as a single string - blockedStr = '' - with open(blockingFilename, 'r') as fp: - blockedStr = fp.read() + blockedStr = readWholeFile(blockingFilename) blockedDomains = [] for domainName in postDomains: @@ -3766,8 +3764,7 @@ def checkDomains(session, baseDir: str, updateFollowerWarnings = False followerWarningStr = '' if os.path.isfile(followerWarningFilename): - with open(followerWarningFilename, 'r') as fp: - followerWarningStr = fp.read() + followerWarningStr = readWholeFile(followerWarningFilename) if singleCheck: # checks a single random non-mutual diff --git a/speaker.py b/speaker.py index a04ef3709..c1d61042d 100644 --- a/speaker.py +++ b/speaker.py @@ -22,6 +22,8 @@ from utils import loadJson from utils import saveJson from utils import isPGPEncrypted from content import htmlReplaceQuoteMarks +from storage import readFileLines +from storage import readWholeFile speakerRemoveChars = ('.\n', '. ', ',', ';', '?', '!') @@ -135,8 +137,8 @@ def _speakerPronounce(baseDir: str, sayText: str, translate: {}) -> str: ")": "," } if os.path.isfile(pronounceFilename): - with open(pronounceFilename, 'r') as fp: - pronounceList = fp.readlines() + pronounceList = readFileLines(pronounceFilename) + if pronounceList: for conversion in pronounceList: separator = None if '->' in conversion: @@ -494,8 +496,8 @@ def _postToSpeakerJson(baseDir: str, httpPrefix: str, accountsDir = baseDir + '/accounts/' + nickname + '@' + domainFull approveFollowsFilename = accountsDir + '/followrequests.txt' if os.path.isfile(approveFollowsFilename): - with open(approveFollowsFilename, 'r') as fp: - follows = fp.readlines() + follows = readFileLines(approveFollowsFilename) + if follows: if len(follows) > 0: followRequestsExist = True for i in range(len(follows)): @@ -512,8 +514,7 @@ def _postToSpeakerJson(baseDir: str, httpPrefix: str, likedBy = '' likeFilename = accountsDir + '/.newLike' if os.path.isfile(likeFilename): - with open(likeFilename, 'r') as fp: - likedBy = fp.read() + likedBy = readWholeFile(likeFilename) calendarFilename = accountsDir + '/.newCalendar' postCal = os.path.isfile(calendarFilename) shareFilename = accountsDir + '/.newShare' diff --git a/storage.py b/storage.py index 0417796f0..d78d35648 100644 --- a/storage.py +++ b/storage.py @@ -54,3 +54,19 @@ def storeValue(filename: str, lineStr: str, storeType: str) -> bool: print('WARN: Unable to prepend to ' + filename + ' ' + str(e)) return False + + +def readWholeFile(filename: str) -> str: + """Returns the entire contents of a file + """ + with open(filename, 'r') as fp: + return fp.read() + return '' + + +def readFileLines(filename: str) -> []: + """Returns a list of lines from a file + """ + with open(filename, 'r') as fp: + return fp.readlines() + return [] diff --git a/theme.py b/theme.py index 5fa2bac01..600faadbf 100644 --- a/theme.py +++ b/theme.py @@ -17,6 +17,7 @@ from shutil import unpack_archive from shutil import rmtree from content import dangerousCSS from storage import storeValue +from storage import readWholeFile def importTheme(baseDir: str, filename: str) -> bool: @@ -35,9 +36,9 @@ def importTheme(baseDir: str, filename: str) -> bool: print('WARN: ' + themeFile + ' missing from imported theme') return False - newThemeName = None - with open(tempThemeDir + '/name.txt', 'r') as fp: - newThemeName = fp.read().replace('\n', '').replace('\r', '') + newThemeName = readWholeFile(tempThemeDir + '/name.txt') + if newThemeName: + newThemeName = newThemeName.replace('\n', '').replace('\r', '') if len(newThemeName) > 20: print('WARN: Imported theme name is too long') return False @@ -327,8 +328,8 @@ def _setThemeFromDict(baseDir: str, name: str, if not os.path.isfile(templateFilename): continue - with open(templateFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(templateFilename) + if css: for paramName, paramValue in themeParams.items(): if paramName == 'newswire-publish-icon': if paramValue.lower() == 'true': @@ -385,8 +386,8 @@ def _setBackgroundFormat(baseDir: str, name: str, cssFilename = baseDir + '/' + backgroundType + '.css' if not os.path.isfile(cssFilename): return - with open(cssFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(cssFilename) + if css: css = css.replace('background.jpg', 'background.' + extension) storeValue(cssFilename, css, 'writeonly') @@ -399,8 +400,8 @@ def enableGrayscale(baseDir: str) -> None: templateFilename = baseDir + '/' + filename if not os.path.isfile(templateFilename): continue - with open(templateFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(templateFilename) + if css: if 'grayscale' not in css: css = \ css.replace('body, html {', @@ -420,8 +421,8 @@ def disableGrayscale(baseDir: str) -> None: templateFilename = baseDir + '/' + filename if not os.path.isfile(templateFilename): continue - with open(templateFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(templateFilename) + if css: if 'grayscale' in css: css = \ css.replace('\n filter: grayscale(100%);', '') @@ -456,8 +457,8 @@ def _setCustomFont(baseDir: str): templateFilename = baseDir + '/' + filename if not os.path.isfile(templateFilename): continue - with open(templateFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(templateFilename) + if css: css = \ setCSSparam(css, "*src", "url('./fonts/custom." + @@ -540,10 +541,9 @@ def getTextModeBanner(baseDir: str) -> str: """ textModeBannerFilename = baseDir + '/accounts/banner.txt' if os.path.isfile(textModeBannerFilename): - with open(textModeBannerFilename, 'r') as fp: - bannerStr = fp.read() - if bannerStr: - return bannerStr.replace('\n', '
') + bannerStr = readWholeFile(textModeBannerFilename) + if bannerStr: + return bannerStr.replace('\n', '
') return None @@ -554,10 +554,9 @@ def getTextModeLogo(baseDir: str) -> str: if not os.path.isfile(textModeLogoFilename): textModeLogoFilename = baseDir + '/img/logo.txt' - with open(textModeLogoFilename, 'r') as fp: - logoStr = fp.read() - if logoStr: - return logoStr.replace('\n', '
') + logoStr = readWholeFile(textModeLogoFilename) + if logoStr: + return logoStr.replace('\n', '
') return None diff --git a/utils.py b/utils.py index 85d24364e..41abdba78 100644 --- a/utils.py +++ b/utils.py @@ -19,6 +19,7 @@ from followingCalendar import addPersonToCalendar from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from storage import storeValue +from storage import readWholeFile # posts containing these strings will always get screened out, # both incoming and outgoing. @@ -163,8 +164,8 @@ def isDormant(baseDir: str, nickname: str, domain: str, actor: str, if not os.path.isfile(lastSeenFilename): return False - with open(lastSeenFilename, 'r') as lastSeenFile: - daysSinceEpochStr = lastSeenFile.read() + daysSinceEpochStr = readWholeFile(lastSeenFilename) + if daysSinceEpochStr: daysSinceEpoch = int(daysSinceEpochStr) currTime = datetime.datetime.utcnow() currDaysSinceEpoch = (currTime - datetime.datetime(1970, 1, 1)).days @@ -506,8 +507,8 @@ def loadJson(filename: str, delaySec=2, maxTries=5) -> {}: tries = 0 while tries < maxTries: try: - with open(filename, 'r') as fp: - data = fp.read() + data = readWholeFile(filename) + if data: jsonObject = json.loads(data) break except BaseException: @@ -527,14 +528,13 @@ def loadJsonOnionify(filename: str, domain: str, onionDomain: str, tries = 0 while tries < 5: try: - with open(filename, 'r') as fp: - data = fp.read() - if data: - data = data.replace(domain, onionDomain) - data = data.replace('https:', 'http:') - print('*****data: ' + data) - jsonObject = json.loads(data) - break + data = readWholeFile(filename) + if data: + data = data.replace(domain, onionDomain) + data = data.replace('https:', 'http:') + print('*****data: ' + data) + jsonObject = json.loads(data) + break except BaseException: print('WARN: loadJson exception') if delaySec > 0: @@ -942,14 +942,13 @@ def _setDefaultPetName(baseDir: str, nickname: str, domain: str, storeValue(petnamesFilename, petnameLookupEntry, 'writeonly') return - with open(petnamesFilename, 'r') as petnamesFile: - petnamesStr = petnamesFile.read() - if petnamesStr: - petnamesList = petnamesStr.split('\n') - for pet in petnamesList: - if pet.startswith(followNickname + ' '): - # petname already exists - return + petnamesStr = readWholeFile(petnamesFilename) + if petnamesStr: + petnamesList = petnamesStr.split('\n') + for pet in petnamesList: + if pet.startswith(followNickname + ' '): + # petname already exists + return # petname doesn't already exist storeValue(petnamesFilename, petnameLookupEntry, 'append') @@ -1094,13 +1093,12 @@ def locateNewsArrival(baseDir: str, domain: str, accountDir = baseDir + '/accounts/news@' + domain + '/' postFilename = accountDir + 'outbox/' + postUrl if os.path.isfile(postFilename): - with open(postFilename, 'r') as arrivalFile: - arrival = arrivalFile.read() - if arrival: - arrivalDate = \ - datetime.datetime.strptime(arrival, - "%Y-%m-%dT%H:%M:%SZ") - return arrivalDate + arrival = readWholeFile(postFilename) + if arrival: + arrivalDate = \ + datetime.datetime.strptime(arrival, + "%Y-%m-%dT%H:%M:%SZ") + return arrivalDate return None @@ -1488,8 +1486,8 @@ def noOfActiveAccountsMonthly(baseDir: str, months: int) -> bool: lastUsedFilename = \ baseDir + '/accounts/' + account + '/.lastUsed' if os.path.isfile(lastUsedFilename): - with open(lastUsedFilename, 'r') as lastUsedFile: - lastUsed = lastUsedFile.read() + lastUsed = readWholeFile(lastUsedFilename) + if lastUsed: if lastUsed.isdigit(): timeDiff = (currTime - int(lastUsed)) if timeDiff < monthSeconds: @@ -1645,8 +1643,8 @@ def getCSS(baseDir: str, cssFilename: str, cssCache: {}) -> str: # file hasn't changed, so return the version in the cache return cssCache[cssFilename][1] - with open(cssFilename, 'r') as fpCSS: - css = fpCSS.read() + css = readWholeFile(cssFilename) + if css: if cssCache.get(cssFilename): # alter the cache contents cssCache[cssFilename][0] = lastModified @@ -1756,9 +1754,8 @@ def _searchVirtualBoxPosts(baseDir: str, nickname: str, domain: str, postFilename = path + '/' + postFilename.strip() if not os.path.isfile(postFilename): continue - with open(postFilename, 'r') as postFile: - data = postFile.read().lower() - + data = readWholeFile(postFilename).lower() + if data: notFound = False for keyword in searchWords: if keyword not in data: @@ -1799,9 +1796,8 @@ def searchBoxPosts(baseDir: str, nickname: str, domain: str, for root, dirs, fnames in os.walk(path): for fname in fnames: filePath = os.path.join(root, fname) - with open(filePath, 'r') as postFile: - data = postFile.read().lower() - + data = readWholeFile(filePath).lower() + if data: notFound = False for keyword in searchWords: if keyword not in data: diff --git a/webapp_about.py b/webapp_about.py index 233d052f7..a9f468007 100644 --- a/webapp_about.py +++ b/webapp_about.py @@ -13,6 +13,7 @@ from utils import getConfigParam from webapp_utils import htmlHeaderWithWebsiteMarkup from webapp_utils import htmlFooter from webapp_utils import markdownToHtml +from storage import readWholeFile def htmlAbout(cssCache: {}, baseDir: str, httpPrefix: str, @@ -32,8 +33,9 @@ def htmlAbout(cssCache: {}, baseDir: str, httpPrefix: str, aboutText = 'Information about this instance goes here.' if os.path.isfile(baseDir + '/accounts/about.md'): - with open(baseDir + '/accounts/about.md', 'r') as aboutFile: - aboutText = markdownToHtml(aboutFile.read()) + aboutText = readWholeFile(baseDir + '/accounts/about.md') + if aboutText: + aboutText = markdownToHtml(aboutText) aboutForm = '' cssFilename = baseDir + '/epicyon-profile.css' diff --git a/webapp_column_left.py b/webapp_column_left.py index 5428650f0..5fc2cfe82 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -18,6 +18,7 @@ from webapp_utils import headerButtonsFrontScreen from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter from webapp_utils import getBannerFile +from storage import readWholeFile def _linksExist(baseDir: str) -> bool: @@ -403,8 +404,7 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, linksFilename = baseDir + '/accounts/links.txt' linksStr = '' if os.path.isfile(linksFilename): - with open(linksFilename, 'r') as fp: - linksStr = fp.read() + linksStr = readWholeFile(linksFilename) editLinksForm += \ '
' @@ -426,8 +426,7 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, aboutFilename = baseDir + '/accounts/about.md' aboutStr = '' if os.path.isfile(aboutFilename): - with open(aboutFilename, 'r') as fp: - aboutStr = fp.read() + aboutStr = readWholeFile(aboutFilename) editLinksForm += \ '
' @@ -445,8 +444,7 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, TOSFilename = baseDir + '/accounts/tos.md' TOSStr = '' if os.path.isfile(TOSFilename): - with open(TOSFilename, 'r') as fp: - TOSStr = fp.read() + TOSStr = readWholeFile(TOSFilename) editLinksForm += \ '
' diff --git a/webapp_column_right.py b/webapp_column_right.py index 0d194c1b0..6a5664630 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -24,6 +24,7 @@ from webapp_utils import htmlFooter from webapp_utils import getBannerFile from webapp_utils import htmlPostSeparator from webapp_utils import headerButtonsFrontScreen +from storage import readWholeFile def _votesIndicator(totalVotes: int, positiveVoting: bool) -> str: @@ -576,8 +577,7 @@ def htmlEditNewswire(cssCache: {}, translate: {}, baseDir: str, path: str, newswireFilename = baseDir + '/accounts/newswire.txt' newswireStr = '' if os.path.isfile(newswireFilename): - with open(newswireFilename, 'r') as fp: - newswireStr = fp.read() + newswireStr = readWholeFile(newswireFilename) editNewswireForm += \ '
' @@ -595,8 +595,7 @@ def htmlEditNewswire(cssCache: {}, translate: {}, baseDir: str, path: str, filterFilename = \ baseDir + '/accounts/news@' + domain + '/filters.txt' if os.path.isfile(filterFilename): - with open(filterFilename, 'r') as filterfile: - filterStr = filterfile.read() + filterStr = readWholeFile(filterFilename) editNewswireForm += \ '