From 23bb250deb644cad8712b412d413a719487e400a Mon Sep 17 00:00:00 2001
From: Bob Mottram '+file.read()+' '+file.read()+''+postJsonObject['object']['published'].split('T')[0]
@@ -312,7 +312,7 @@ def htmlBlogPage(authorized: bool, session, \
"""
if ' ' in nickname or '@' in nickname or '\n' in nickname:
return None
- blogStr=''
+ blogStr=''
cssFilename=baseDir+'/epicyon-profile.css'
if os.path.isfile(baseDir+'/epicyon.css'):
@@ -424,7 +424,7 @@ def htmlBlogPageRSS(authorized: bool, session, \
if not timelineJson:
return blogRSS+rssFooter()
- if pageNumber!=None:
+ if pageNumber!=None:
for item in timelineJson['orderedItems']:
if item['type']!='Create':
continue
@@ -556,11 +556,11 @@ def htmlEditBlog(mediaInstance: bool,translate: {}, \
if os.path.isfile(baseDir+'/accounts/newpost.txt'):
with open(baseDir+'/accounts/newpost.txt', 'r') as file:
- editBlogText='
') return '
'+content+'
' - + def getMentionsFromHtml(htmlText: str,matchStr=" []: """Extracts mentioned actors from the given html content string """ @@ -521,7 +521,7 @@ def saveMediaInFormPOST(mediaBytes,debug: bool, \ mediaLocation=-1 searchStr='' filename=None - + # directly search the binary array for the beginning # of an image extensionList= { @@ -579,7 +579,7 @@ def saveMediaInFormPOST(mediaBytes,debug: bool, \ def extractTextFieldsInPOST(postBytes,boundary,debug: bool) -> {}: """Returns a dictionary containing the text fields of a http form POST The boundary argument comes from the http header - """ + """ msg=email.parser.BytesParser().parsebytes(postBytes) if debug: print('DEBUG: POST arriving '+msg.get_payload(decode=True).decode('utf-8')) @@ -590,7 +590,7 @@ def extractTextFieldsInPOST(postBytes,boundary,debug: bool) -> {}: if f=='--': continue if ' name="' not in f: - continue + continue postStr=f.split(' name="',1)[1] if '"' not in postStr: continue @@ -600,7 +600,7 @@ def extractTextFieldsInPOST(postBytes,boundary,debug: bool) -> {}: continue if '\r\n' not in postValueStr: continue - postLines=postValueStr.split('\r\n') + postLines=postValueStr.split('\r\n') postValue='' if len(postLines)>2: for line in range(2,len(postLines)-1): diff --git a/daemon.py b/daemon.py index 160f6e9d0..f3fb92da5 100644 --- a/daemon.py +++ b/daemon.py @@ -218,7 +218,7 @@ def readFollowList(filename: str) -> None: followlist=[] if not os.path.isfile(filename): return followlist - followUsers=open(filename, "r") + followUsers=open(filename, "r") for u in followUsers: if u not in followlist: nickname,domain=parseHandle(u) @@ -228,7 +228,7 @@ def readFollowList(filename: str) -> None: return followlist class PubServer(BaseHTTPRequestHandler): - protocol_version='HTTP/1.1' + protocol_version='HTTP/1.1' def _sendReplyToQuestion(self,nickname: str,messageId: str,answer: str) -> None: """Sends a reply to a question @@ -293,7 +293,7 @@ class PubServer(BaseHTTPRequestHandler): print('ERROR: unable to post vote to outbox') else: print('ERROR: unable to create vote') - + def _removePostInteractions(self,postJsonObject: {}) -> None: """Removes potentially sensitive interactions from a post This is the type of thing which would be of interest to marketers @@ -419,7 +419,7 @@ class PubServer(BaseHTTPRequestHandler): 'title="Login to Epicyon", Basic realm="epicyon"') self.send_header('X-Robots-Tag','noindex') self.end_headers() - + def _set_headers_base(self,fileFormat: str,length: int,cookie: str) -> None: self.send_response(200) self.send_header('Content-type', fileFormat) @@ -507,7 +507,7 @@ class PubServer(BaseHTTPRequestHandler): def _503(self) -> None: self._httpReturnCode(503,'Service Unavailable') - + def _write(self,msg) -> None: tries=0 while tries<5: @@ -563,7 +563,7 @@ class PubServer(BaseHTTPRequestHandler): self._set_headers('application/ld+json',len(msg),None) self._write(msg) print('instance metadata sent') - return True + return True if self.path.startswith('/api/v1/instance/peers'): # This is just a dummy result. # Showing the full list of peers would have privacy implications. @@ -594,14 +594,14 @@ class PubServer(BaseHTTPRequestHandler): self._write(msg) print('instance activity metadata sent') return True - self._404() + self._404() return True - + def _nodeinfo(self) -> bool: if not self.path.startswith('/nodeinfo/2.0'): return False if self.server.debug: - print('DEBUG: nodeinfo '+self.path) + print('DEBUG: nodeinfo '+self.path) info=metaDataNodeInfo(self.server.baseDir,self.server.registration,self.server.projectVersion) if info: msg=json.dumps(info).encode('utf-8') @@ -617,7 +617,7 @@ class PubServer(BaseHTTPRequestHandler): return True self._404() return True - + def _webfinger(self) -> bool: if not self.path.startswith('/.well-known'): return False @@ -633,7 +633,7 @@ class PubServer(BaseHTTPRequestHandler): self._set_headers('application/xrd+xml',len(msg),None) self._write(msg) return True - self._404() + self._404() return True if self.path.startswith('/.well-known/nodeinfo'): wfResult=webfingerNodeInfo(self.server.httpPrefix,self.server.domainFull) @@ -648,7 +648,7 @@ class PubServer(BaseHTTPRequestHandler): self._set_headers('application/ld+json',len(msg),None) self._write(msg) return True - self._404() + self._404() return True if self.server.debug: @@ -675,7 +675,7 @@ class PubServer(BaseHTTPRequestHandler): path.startswith('/accounts'): return False return True - + def _postToOutbox(self,messageJson: {},version: str,postToNickname=None) -> bool: """post is received by the outbox Client to server message post @@ -700,7 +700,7 @@ class PubServer(BaseHTTPRequestHandler): accountOutboxThreadName=self.postToNickname if not accountOutboxThreadName: accountOutboxThreadName='*' - + if self.server.outboxThread.get(accountOutboxThreadName): print('Waiting for previous outbox thread to end') waitCtr=0 @@ -737,7 +737,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.inboxQueue.pop(0) timeDiff=str(int((time.time()-cleardownStartTime)*1000)) print('Inbox cleardown took '+timeDiff+' mS. Removed '+str(removals)+' items.') - + def _updateInboxQueue(self,nickname: str,messageJson: {}, \ messageBytes: str) -> int: """Update the inbox queue @@ -755,7 +755,7 @@ class PubServer(BaseHTTPRequestHandler): if self.headers.get('Content-type'): headersDict['Content-type']=self.headers['Content-type'] if self.headers.get('Content-Length'): - headersDict['Content-Length']=self.headers['Content-Length'] + headersDict['Content-Length']=self.headers['Content-Length'] elif self.headers.get('content-length'): headersDict['content-length']=self.headers['content-length'] @@ -763,7 +763,7 @@ class PubServer(BaseHTTPRequestHandler): # of the object field messageJson,toFieldExists= \ addToField('Follow',messageJson,self.server.debug) - + # For like activities add a 'to' field, which is a copy of # the actor within the object field messageJson,toFieldExists= \ @@ -814,7 +814,7 @@ class PubServer(BaseHTTPRequestHandler): self.path='/users/'+nickname+'/inbox' # check that the path contains the same nickname as the cookie # otherwise it would be possible to be authorized to use - # an account you don't own + # an account you don't own if '/'+nickname+'/' in self.path: return True if self.path.endswith('/'+nickname): @@ -834,7 +834,7 @@ class PubServer(BaseHTTPRequestHandler): return True print('AUTH: Basic auth did not authorize '+self.headers['Authorization']) return False - + def _clearLoginDetails(self,nickname: str): """Clears login details for the given account """ @@ -934,14 +934,14 @@ class PubServer(BaseHTTPRequestHandler): msg=htmlLogin(self.server.translate, \ self.server.baseDir,False).encode('utf-8') self._logout_headers('text/html',len(msg)) - self._write(msg) + self._write(msg) return self._benchmarkGETtimings(GETstartTime,GETtimings,3) # replace https://domain/@nick with https://domain/users/nick if self.path.startswith('/@'): - self.path=self.path.replace('/@','/users/') + self.path=self.path.replace('/@','/users/') # redirect music to #nowplaying list if self.path=='/music' or self.path=='/nowplaying': @@ -1007,7 +1007,7 @@ class PubServer(BaseHTTPRequestHandler): if not self.server.enableSharedInbox: self._503() return - + self.path='/inbox' self._benchmarkGETtimings(GETstartTime,GETtimings,8) @@ -1022,7 +1022,7 @@ class PubServer(BaseHTTPRequestHandler): '@'+self.server.domain): if not self.server.session: self.server.session= \ - createSession(self.server.useTor) + createSession(self.server.useTor) msg= \ htmlBlogPageRSS(authorized, \ self.server.session, \ @@ -1039,7 +1039,7 @@ class PubServer(BaseHTTPRequestHandler): self._write(msg) return self._404() - return + return # show the main blog page if htmlGET and (self.path=='/blog' or \ @@ -1049,7 +1049,7 @@ class PubServer(BaseHTTPRequestHandler): if '/rss.xml' not in self.path: if not self.server.session: self.server.session= \ - createSession(self.server.useTor) + createSession(self.server.useTor) msg=htmlBlogView(authorized, \ self.server.session, \ self.server.baseDir, \ @@ -1087,7 +1087,7 @@ class PubServer(BaseHTTPRequestHandler): pageNumber=10 if not self.server.session: self.server.session= \ - createSession(self.server.useTor) + createSession(self.server.useTor) msg=htmlBlogPage(authorized, \ self.server.session, \ self.server.baseDir, \ @@ -1104,7 +1104,7 @@ class PubServer(BaseHTTPRequestHandler): self._404() return - if htmlGET and '/users/' in self.path: + if htmlGET and '/users/' in self.path: # show the person options screen with view/follow/block/report if '?options=' in self.path: optionsStr=self.path.split('?options=')[1] @@ -1177,7 +1177,7 @@ class PubServer(BaseHTTPRequestHandler): return self._404() return - + self._benchmarkGETtimings(GETstartTime,GETtimings,9) # remove a shared item @@ -1192,7 +1192,7 @@ class PubServer(BaseHTTPRequestHandler): actor,shareName).encode() if not msg: self._redirect_headers(actor+'/tlshares',cookie) - return + return self._set_headers('text/html',len(msg),cookie) self._write(msg) return @@ -1222,7 +1222,7 @@ class PubServer(BaseHTTPRequestHandler): # send robots.txt if asked if self._robotsTxt(): return - + self._benchmarkGETtimings(GETstartTime,GETtimings,13) # if not authorized then show the login screen @@ -1381,7 +1381,7 @@ class PubServer(BaseHTTPRequestHandler): elif emojiFilename.endswith('.webp'): mediaImageType='webp' else: - mediaImageType='gif' + mediaImageType='gif' with open(emojiFilename, 'rb') as avFile: mediaBinary=avFile.read() self._set_headers('image/'+mediaImageType,len(mediaBinary),cookie) @@ -1431,7 +1431,7 @@ class PubServer(BaseHTTPRequestHandler): etagHeader='if-none-match' if not self.headers.get(etagHeader): etagHeader='If-none-match' - + if self.headers.get(etagHeader): oldEtag=self.headers['If-None-Match'] if os.path.isfile(mediaFilename+'.etag'): @@ -1450,7 +1450,7 @@ class PubServer(BaseHTTPRequestHandler): mediaBinary=avFile.read() self._set_headers_etag(mediaFilename,mediaFileType,mediaBinary,cookie) self._write(mediaBinary) - return + return self._404() return @@ -1480,7 +1480,7 @@ class PubServer(BaseHTTPRequestHandler): mediaBinary=avFile.read() self._set_headers('image/'+mediaFileType,len(mediaBinary),cookie) self._write(mediaBinary) - return + return self._404() return @@ -1497,7 +1497,7 @@ class PubServer(BaseHTTPRequestHandler): mediaBinary=self.server.iconsCache[mediaStr] self._set_headers('image/png',len(mediaBinary),cookie) self._write(mediaBinary) - return + return else: if os.path.isfile(mediaFilename): with open(mediaFilename, 'rb') as avFile: @@ -1531,7 +1531,7 @@ class PubServer(BaseHTTPRequestHandler): #self._404() return self._write(mediaBinary) - return + return self._404() return @@ -1584,7 +1584,7 @@ class PubServer(BaseHTTPRequestHandler): if currTimeGET-self.server.lastGET==0: if self.server.debug: print('DEBUG: GET Busy') - self.send_response(429) + self.send_response(429) self.end_headers() return self.server.lastGET=currTimeGET @@ -1658,7 +1658,7 @@ class PubServer(BaseHTTPRequestHandler): else: originPathStr=self.path.split('/tags/')[0] originPathStrAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+originPathStr - self._redirect_headers(originPathStrAbsolute+'/search',cookie) + self._redirect_headers(originPathStrAbsolute+'/search',cookie) self.server.GETbusy=False return @@ -1770,7 +1770,7 @@ class PubServer(BaseHTTPRequestHandler): if '?' in pageNumberStr: pageNumberStr=pageNumberStr.split('?')[0] if pageNumberStr.isdigit(): - pageNumber=int(pageNumberStr) + pageNumber=int(pageNumberStr) timelineStr='inbox' if '?tl=' in self.path: timelineStr=self.path.split('?tl=')[1] @@ -1781,13 +1781,13 @@ class PubServer(BaseHTTPRequestHandler): if not self.postToNickname: print('WARN: unable to find nickname in '+actor) self.server.GETbusy=False - actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor + actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor self._redirect_headers(actorAbsolute+'/'+timelineStr+ \ '?page='+str(pageNumber),cookie) - return + return if not self.server.session: self.server.session= \ - createSession(self.server.useTor) + createSession(self.server.useTor) self.server.actorRepeat=self.path.split('?actor=')[1] announceToStr=self.server.httpPrefix+'://'+self.server.domain+'/users/'+self.postToNickname+'/followers' if not repeatPrivate: @@ -1810,7 +1810,7 @@ class PubServer(BaseHTTPRequestHandler): if announceJson: self._postToOutboxThread(announceJson) self.server.GETbusy=False - actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor + actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor self._redirect_headers(actorAbsolute+'/'+timelineStr+'?page='+ \ str(pageNumber)+ \ timelineBookmark,cookie) @@ -1839,7 +1839,7 @@ class PubServer(BaseHTTPRequestHandler): if '?' in pageNumberStr: pageNumberStr=pageNumberStr.split('?')[0] if pageNumberStr.isdigit(): - pageNumber=int(pageNumberStr) + pageNumber=int(pageNumberStr) timelineStr='inbox' if '?tl=' in self.path: timelineStr=self.path.split('?tl=')[1] @@ -1850,10 +1850,10 @@ class PubServer(BaseHTTPRequestHandler): if not self.postToNickname: print('WARN: unable to find nickname in '+actor) self.server.GETbusy=False - actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor + actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor self._redirect_headers(actorAbsolute+'/'+timelineStr+'?page='+ \ str(pageNumber),cookie) - return + return if not self.server.session: self.server.session= \ createSession(self.server.useTor) @@ -1874,10 +1874,10 @@ class PubServer(BaseHTTPRequestHandler): 'to': [unRepeatToStr], 'type': 'Announce' } - } + } self._postToOutboxThread(newUndoAnnounce) self.server.GETbusy=False - actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor + actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor self._redirect_headers(actorAbsolute+'/'+timelineStr+'?page='+ \ str(pageNumber)+ \ timelineBookmark,cookie) @@ -1950,7 +1950,7 @@ class PubServer(BaseHTTPRequestHandler): pageNumber=1 likeUrl=self.path.split('?like=')[1] if '?' in likeUrl: - likeUrl=likeUrl.split('?')[0] + likeUrl=likeUrl.split('?')[0] timelineBookmark='' if '?bm=' in self.path: timelineBookmark=self.path.split('?bm=')[1] @@ -1969,7 +1969,7 @@ class PubServer(BaseHTTPRequestHandler): timelineStr=self.path.split('?tl=')[1] if '?' in timelineStr: timelineStr=timelineStr.split('?')[0] - + self.postToNickname=getNicknameFromActor(actor) if not self.postToNickname: print('WARN: unable to find nickname in '+actor) @@ -1978,13 +1978,13 @@ class PubServer(BaseHTTPRequestHandler): self._redirect_headers(actorAbsolute+'/'+timelineStr+ \ '?page='+str(pageNumber)+ \ timelineBookmark,cookie) - return + return if not self.server.session: self.server.session= \ createSession(self.server.useTor) likeActor= \ self.server.httpPrefix+'://'+ \ - self.server.domainFull+'/users/'+self.postToNickname + self.server.domainFull+'/users/'+self.postToNickname actorLiked=self.path.split('?actor=')[1] if '?' in actorLiked: actorLiked=actorLiked.split('?')[0] @@ -1994,7 +1994,7 @@ class PubServer(BaseHTTPRequestHandler): 'actor': likeActor, 'to': [actorLiked], 'object': likeUrl - } + } self._postToOutbox(likeJson,self.server.projectVersion) self.server.GETbusy=False actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor @@ -2036,7 +2036,7 @@ class PubServer(BaseHTTPRequestHandler): actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor self._redirect_headers(actorAbsolute+'/'+timelineStr+ \ '?page='+str(pageNumber),cookie) - return + return if not self.server.session: self.server.session= \ createSession(self.server.useTor) @@ -2073,7 +2073,7 @@ class PubServer(BaseHTTPRequestHandler): pageNumber=1 bookmarkUrl=self.path.split('?bookmark=')[1] if '?' in bookmarkUrl: - bookmarkUrl=bookmarkUrl.split('?')[0] + bookmarkUrl=bookmarkUrl.split('?')[0] timelineBookmark='' if '?bm=' in self.path: timelineBookmark=self.path.split('?bm=')[1] @@ -2100,20 +2100,20 @@ class PubServer(BaseHTTPRequestHandler): actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor self._redirect_headers(actorAbsolute+'/'+timelineStr+ \ '?page='+str(pageNumber),cookie) - return + return if not self.server.session: self.server.session= \ createSession(self.server.useTor) bookmarkActor= \ self.server.httpPrefix+'://'+ \ - self.server.domainFull+'/users/'+self.postToNickname + self.server.domainFull+'/users/'+self.postToNickname bookmarkJson= { "@context": "https://www.w3.org/ns/activitystreams", 'type': 'Bookmark', 'actor': bookmarkActor, 'to': [bookmarkActor], 'object': bookmarkUrl - } + } self._postToOutbox(bookmarkJson,self.server.projectVersion) self.server.GETbusy=False actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor @@ -2153,7 +2153,7 @@ class PubServer(BaseHTTPRequestHandler): actorAbsolute=self.server.httpPrefix+'://'+self.server.domainFull+actor self._redirect_headers(actorAbsolute+'/'+timelineStr+ \ '?page='+str(pageNumber),cookie) - return + return if not self.server.session: self.server.session= \ createSession(self.server.useTor) @@ -2187,12 +2187,12 @@ class PubServer(BaseHTTPRequestHandler): pageNumber=1 if '?page=' in self.path: pageNumberStr=self.path.split('?page=')[1] - if '?' in pageNumberStr: + if '?' in pageNumberStr: pageNumberStr=pageNumberStr.split('?')[0] if pageNumberStr.isdigit(): pageNumber=int(pageNumberStr) deleteUrl=self.path.split('?delete=')[1] - if '?' in deleteUrl: + if '?' in deleteUrl: deleteUrl=deleteUrl.split('?')[0] timelineStr=self.server.defaultTimeline if '?tl=' in self.path: @@ -2217,7 +2217,7 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: unable to find nickname in '+actor) self.server.GETbusy=False self._redirect_headers(actor+'/'+timelineStr,cookie) - return + return if not self.server.session: self.server.session= \ createSession(self.server.useTor) @@ -2244,12 +2244,12 @@ class PubServer(BaseHTTPRequestHandler): pageNumber=1 if '?page=' in self.path: pageNumberStr=self.path.split('?page=')[1] - if '?' in pageNumberStr: + if '?' in pageNumberStr: pageNumberStr=pageNumberStr.split('?')[0] if pageNumberStr.isdigit(): pageNumber=int(pageNumberStr) muteUrl=self.path.split('?mute=')[1] - if '?' in muteUrl: + if '?' in muteUrl: muteUrl=muteUrl.split('?')[0] timelineBookmark='' if '?bm=' in self.path: @@ -2277,12 +2277,12 @@ class PubServer(BaseHTTPRequestHandler): pageNumber=1 if '?page=' in self.path: pageNumberStr=self.path.split('?page=')[1] - if '?' in pageNumberStr: + if '?' in pageNumberStr: pageNumberStr=pageNumberStr.split('?')[0] if pageNumberStr.isdigit(): pageNumber=int(pageNumberStr) muteUrl=self.path.split('?unmute=')[1] - if '?' in muteUrl: + if '?' in muteUrl: muteUrl=muteUrl.split('?')[0] timelineBookmark='' if '?bm=' in self.path: @@ -2461,7 +2461,7 @@ class PubServer(BaseHTTPRequestHandler): if len(postSections)==2: nickname=postSections[0] statusNumber=postSections[1] - if len(statusNumber)>10 and statusNumber.isdigit(): + if len(statusNumber)>10 and statusNumber.isdigit(): postFilename= \ self.server.baseDir+'/accounts/'+nickname+'@'+ \ self.server.domain+'/outbox/'+ \ @@ -2475,7 +2475,7 @@ class PubServer(BaseHTTPRequestHandler): loadedPost=True else: postJsonObject={} - if loadedPost: + if loadedPost: # Only authorized viewers get to see likes on posts # Otherwize marketers could gain more social graph info if not authorized: @@ -2493,7 +2493,7 @@ class PubServer(BaseHTTPRequestHandler): authorized,postJsonObject, \ self.server.httpPrefix, \ self.server.projectVersion).encode('utf-8') - self._set_headers('text/html',len(msg),cookie) + self._set_headers('text/html',len(msg),cookie) self._write(msg) else: if self._fetchAuthenticated(): @@ -2634,7 +2634,7 @@ class PubServer(BaseHTTPRequestHandler): nickname+'@'+self.server.domain+'.json' if os.path.isfile(actorFilename): actorJson=loadJson(actorFilename) - if actorJson: + if actorJson: if actorJson.get('roles'): if self._requestHTTP(): getPerson= \ @@ -2680,7 +2680,7 @@ class PubServer(BaseHTTPRequestHandler): nickname+'@'+self.server.domain+'.json' if os.path.isfile(actorFilename): actorJson=loadJson(actorFilename) - if actorJson: + if actorJson: if actorJson.get('skills'): if self._requestHTTP(): getPerson= \ @@ -2806,7 +2806,7 @@ class PubServer(BaseHTTPRequestHandler): if pageNumber.isdigit(): pageNumber=int(pageNumber) else: - pageNumber=1 + pageNumber=1 if 'page=' not in self.path: # if no page was specified then show the first inboxFeed= \ @@ -2885,7 +2885,7 @@ class PubServer(BaseHTTPRequestHandler): if pageNumber.isdigit(): pageNumber=int(pageNumber) else: - pageNumber=1 + pageNumber=1 if 'page=' not in self.path: # if no page was specified then show the first inboxDMFeed= \ @@ -3243,7 +3243,7 @@ class PubServer(BaseHTTPRequestHandler): if pageNumber.isdigit(): pageNumber=int(pageNumber) else: - pageNumber=1 + pageNumber=1 if 'page=' not in self.path: # if no page was specified then show the first bookmarksFeed= \ @@ -3387,7 +3387,7 @@ class PubServer(BaseHTTPRequestHandler): if pageNumber.isdigit(): pageNumber=int(pageNumber) else: - pageNumber=1 + pageNumber=1 if 'page=' not in self.path: # if no page was specified then show the first moderationFeed= \ @@ -3437,7 +3437,7 @@ class PubServer(BaseHTTPRequestHandler): self.end_headers() self.server.GETbusy=False return - + self._benchmarkGETtimings(GETstartTime,GETtimings,49) shares= \ @@ -3680,7 +3680,7 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: Unauthenticated GET') self._404() return - + self._benchmarkGETtimings(GETstartTime,GETtimings,54) # check that the file exists @@ -3802,7 +3802,7 @@ class PubServer(BaseHTTPRequestHandler): filenameBase= \ self.server.baseDir+'/accounts/'+ \ nickname+'@'+self.server.domain+'/upload.temp' - + filename,attachmentMediaType= \ saveMediaInFormPOST(mediaBytes,self.server.debug,filenameBase) if self.server.debug: @@ -3902,7 +3902,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.debug) return 1 else: - return -1 + return -1 elif postType=='newblog': messageJson= \ createBlogPost(self.server.baseDir,nickname, \ @@ -3928,7 +3928,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.debug) return 1 else: - return -1 + return -1 elif postType=='editblogpost': print('Edited blog post received') postFilename= \ @@ -3971,7 +3971,7 @@ class PubServer(BaseHTTPRequestHandler): # get list of tags fields['message']= \ replaceEmojiFromTags(fields['message'],tags,'content') - + postJsonObject['object']['content']=fields['message'] imgDescription='' @@ -3998,7 +3998,7 @@ class PubServer(BaseHTTPRequestHandler): print('Edited blog post, unable to load json for '+postFilename) else: print('Edited blog post not found '+str(fields['postUrl'])) - return -1 + return -1 elif postType=='newunlisted': messageJson= \ createUnlistedPost(self.server.baseDir, \ @@ -4071,7 +4071,7 @@ class PubServer(BaseHTTPRequestHandler): True,fields['schedulePost'], \ fields['eventDate'], \ fields['eventTime'], \ - fields['location']) + fields['location']) if messageJson: if fields['schedulePost']: return 1 @@ -4246,20 +4246,20 @@ class PubServer(BaseHTTPRequestHandler): boundary=boundary.split(';')[0] postBytes=self.rfile.read(length) - + # second length check from the bytes received # since Content-Length could be untruthful length=len(postBytes) if length>self.server.maxPostLength: print('POST size too large') return None - + # Note sending new posts needs to be synchronous, otherwise any attachments # can get mangled if other events happen during their decoding print('Creating new post from: '+newPostThreadName) self._receiveNewPostProcess(authorized,postType,path,headers,length,postBytes,boundary) return pageNumber - + def do_POST(self): POSTstartTime=time.time() POSTtimings=[] @@ -4278,9 +4278,9 @@ class PubServer(BaseHTTPRequestHandler): if currTimePOST-self.server.lastPOST==0: self.send_response(429) self.end_headers() - return + return self.server.lastPOST=currTimePOST - + self.server.POSTbusy=True if not self.headers.get('Content-type'): print('Content-type header missing') @@ -4317,7 +4317,7 @@ class PubServer(BaseHTTPRequestHandler): self.postToNickname=None self._benchmarkPOSTtimings(POSTstartTime,POSTtimings,1) - + if self.path.startswith('/login'): # get the contents of POST containing login credentials length=int(self.headers['Content-length']) @@ -4326,7 +4326,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_response(401) self.end_headers() self.server.POSTbusy=False - return + return loginParams=self.rfile.read(length).decode('utf-8') loginNickname,loginPassword,register= \ htmlGetLoginCredentials(loginParams,self.server.lastLoginTime) @@ -4354,7 +4354,7 @@ class PubServer(BaseHTTPRequestHandler): self._login_headers('text/html',len(msg)) self._write(msg) self.server.POSTbusy=False - return + return # login success - redirect with authorization print('Login success: '+loginNickname) self.send_response(303) @@ -4576,7 +4576,7 @@ class PubServer(BaseHTTPRequestHandler): else: if currentMatrixAddress: setMatrixAddress(actorJson,'') - actorChanged=True + actorChanged=True currentSSBAddress=getSSBAddress(actorJson) if fields.get('ssbAddress'): if fields['ssbAddress']!=currentSSBAddress: @@ -4690,7 +4690,7 @@ class PubServer(BaseHTTPRequestHandler): setRole(self.server.baseDir, \ modNick,self.server.domain, \ 'instance','moderator') - + if fields.get('removeScheduledPosts'): if fields['removeScheduledPosts']=='on': removeScheduledPosts(self.server.baseDir,nickname,self.server.domain) @@ -4754,7 +4754,7 @@ class PubServer(BaseHTTPRequestHandler): removeTwitterFile.write('\n') if not removeTwitterActive: if os.path.isfile(removeTwitterFilename): - os.remove(removeTwitterFilename) + os.remove(removeTwitterFilename) # this account is a bot if fields.get('isBot'): if fields['isBot']=='on': @@ -4876,7 +4876,7 @@ class PubServer(BaseHTTPRequestHandler): self._login_headers('text/html',len(msg)) self._write(msg) self.server.POSTbusy=False - return + return elif moderationStr.startswith('submitBlock'): moderationButton='block' elif moderationStr.startswith('submitUnblock'): @@ -4943,7 +4943,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.domain, \ self.server.port) else: - # remove a post or thread + # remove a post or thread postFilename= \ locatePost(self.server.baseDir, \ nickname,self.server.domain, \ @@ -4953,7 +4953,7 @@ class PubServer(BaseHTTPRequestHandler): nickname, \ self.server.domain, \ self.server.port, \ - moderationText): + moderationText): deletePost(self.server.baseDir, \ self.server.httpPrefix, \ nickname,self.server.domain, \ @@ -5014,7 +5014,7 @@ class PubServer(BaseHTTPRequestHandler): self._redirect_headers(actor+'/'+self.server.defaultTimeline+ \ '?page='+str(pageNumber),cookie) self.server.POSTbusy=False - return + return self._benchmarkPOSTtimings(POSTstartTime,POSTtimings,6) @@ -5040,7 +5040,7 @@ class PubServer(BaseHTTPRequestHandler): # go back on search screen self._redirect_headers(actorStr+'/'+self.server.defaultTimeline,cookie) self.server.POSTbusy=False - return + return if 'searchtext=' in searchParams: searchStr=searchParams.split('searchtext=')[1] if '&' in searchStr: @@ -5052,7 +5052,7 @@ class PubServer(BaseHTTPRequestHandler): print('searchStr: '+searchStr) if searchForEmoji: searchStr=':'+searchStr+':' - if searchStr.startswith('#'): + if searchStr.startswith('#'): nickname=getNicknameFromActor(actorStr) # hashtag search hashtagStr= \ @@ -5073,7 +5073,7 @@ class PubServer(BaseHTTPRequestHandler): self._write(msg) self.server.POSTbusy=False return - elif searchStr.startswith('*'): + elif searchStr.startswith('*'): # skill search searchStr=searchStr.replace('*','').strip() skillStr= \ @@ -5119,7 +5119,7 @@ class PubServer(BaseHTTPRequestHandler): else: self._redirect_headers(actorStr+'/search',cookie) self.server.POSTbusy=False - return + return elif searchStr.startswith(':') or \ searchStr.lower().strip('\n').endswith(' emoji'): # eg. "cat emoji" @@ -5362,7 +5362,7 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: unable to find nickname in '+originPathStr) self._redirect_headers(originPathStr,cookie) self.server.POSTbusy=False - return + return length=int(self.headers['Content-length']) blockConfirmParams=self.rfile.read(length).decode('utf-8') if '&submitYes=' in blockConfirmParams: @@ -5375,7 +5375,7 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: unable to find nickname in '+blockingActor) self._redirect_headers(originPathStr,cookie) self.server.POSTbusy=False - return + return blockingDomain,blockingPort=getDomainFromActor(blockingActor) blockingDomainFull=blockingDomain if blockingPort: @@ -5409,7 +5409,7 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: unable to find nickname in '+originPathStr) self._redirect_headers(originPathStr,cookie) self.server.POSTbusy=False - return + return length=int(self.headers['Content-length']) blockConfirmParams=self.rfile.read(length).decode('utf-8') if '&submitYes=' in blockConfirmParams: @@ -5422,7 +5422,7 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: unable to find nickname in '+blockingActor) self._redirect_headers(originPathStr,cookie) self.server.POSTbusy=False - return + return blockingDomain,blockingPort= \ getDomainFromActor(blockingActor) blockingDomainFull=blockingDomain @@ -5461,7 +5461,7 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: unable to find nickname in '+originPathStr) self._redirect_headers(originPathStr,cookie) self.server.POSTbusy=False - return + return length=int(self.headers['Content-length']) optionsConfirmParams= \ self.rfile.read(length).decode('utf-8').replace('%3A',':').replace('%2F','/') @@ -5486,13 +5486,13 @@ class PubServer(BaseHTTPRequestHandler): postUrl=optionsConfirmParams.split('postUrl=')[1] if '&' in postUrl: postUrl=postUrl.split('&')[0] - + optionsNickname=getNicknameFromActor(optionsActor) if not optionsNickname: print('WARN: unable to find nickname in '+optionsActor) self._redirect_headers(originPathStr,cookie) self.server.POSTbusy=False - return + return optionsDomain,optionsPort=getDomainFromActor(optionsActor) optionsDomainFull=optionsDomain if optionsPort: @@ -5568,7 +5568,7 @@ class PubServer(BaseHTTPRequestHandler): self._set_headers('text/html',len(msg),cookie) self._write(msg) self.server.POSTbusy=False - return + return if '&submitSnooze=' in optionsConfirmParams: thisActor= \ self.server.httpPrefix+'://'+self.server.domainFull+ \ @@ -5610,7 +5610,7 @@ class PubServer(BaseHTTPRequestHandler): self._set_headers('text/html',len(msg),cookie) self._write(msg) self.server.POSTbusy=False - return + return self._redirect_headers(originPathStr,cookie) self.server.POSTbusy=False @@ -5700,13 +5700,13 @@ class PubServer(BaseHTTPRequestHandler): self.send_response(403) self.end_headers() self.server.POSTbusy=False - return + return pathUsersSection=self.path.split('/users/')[1] if '/' not in pathUsersSection: self.send_response(404) self.end_headers() self.server.POSTbusy=False - return + return self.postFromNickname=pathUsersSection.split('/')[0] accountsDir= \ self.server.baseDir+'/accounts/'+ \ @@ -5715,7 +5715,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_response(404) self.end_headers() self.server.POSTbusy=False - return + return mediaBytes=self.rfile.read(length) mediaFilenameBase=accountsDir+'/upload' mediaFilename=mediaFilenameBase+'.png' @@ -5732,7 +5732,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_response(201) self.end_headers() self.server.POSTbusy=False - return + return # refuse to receive non-json content if self.headers['Content-type'] != 'application/json' and \ @@ -5782,12 +5782,12 @@ class PubServer(BaseHTTPRequestHandler): # convert the raw bytes to json messageJson=json.loads(messageBytes) - + self._benchmarkPOSTtimings(POSTstartTime,POSTtimings,19) # https://www.w3.org/TR/activitypub/#object-without-create if self.outboxAuthenticated: - if self._postToOutbox(messageJson,__version__): + if self._postToOutbox(messageJson,__version__): if messageJson.get('id'): self.headers['Location']= \ messageJson['id'].replace('/activity','').replace('/undo','') @@ -5842,7 +5842,7 @@ class PubServer(BaseHTTPRequestHandler): self.end_headers() self.server.POSTbusy=False return - + self._benchmarkPOSTtimings(POSTstartTime,POSTtimings,23) if self.server.debug: @@ -5891,7 +5891,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_response(503) self.end_headers() self.server.POSTbusy=False - return + return self.send_response(200) self.end_headers() self.server.POSTbusy=False @@ -5920,7 +5920,7 @@ def runPostsWatchdog(projectVersion: str,httpd) -> None: postsQueueOriginal=httpd.thrPostsQueue.clone(runPostsQueue) httpd.thrPostsQueue.start() while True: - time.sleep(20) + time.sleep(20) if not httpd.thrPostsQueue.isAlive(): httpd.thrPostsQueue.kill() httpd.thrPostsQueue=postsQueueOriginal.clone(runPostsQueue) @@ -5934,7 +5934,7 @@ def runSharesExpireWatchdog(projectVersion: str,httpd) -> None: sharesExpireOriginal=httpd.thrSharesExpire.clone(runSharesExpire) httpd.thrSharesExpire.start() while True: - time.sleep(20) + time.sleep(20) if not httpd.thrSharesExpire.isAlive(): httpd.thrSharesExpire.kill() httpd.thrSharesExpire=sharesExpireOriginal.clone(runSharesExpire) @@ -5983,7 +5983,7 @@ def runDaemon(blogsInstance: bool,mediaInstance: bool, \ print('Invalid domain: ' + domain) return - if unitTest: + if unitTest: serverAddress=(domain, proxyPort) pubHandler=partial(PubServerUnitTest) else: @@ -5996,7 +5996,7 @@ def runDaemon(blogsInstance: bool,mediaInstance: bool, \ if e.errno==98: print('ERROR: HTTP server address is already in use. '+str(serverAddress)) return False - + print('ERROR: HTTP server failed to start. '+str(e)) return False @@ -6022,7 +6022,7 @@ def runDaemon(blogsInstance: bool,mediaInstance: bool, \ else: systemLanguage=language if not systemLanguage: - systemLanguage='en' + systemLanguage='en' if '_' in systemLanguage: systemLanguage=systemLanguage.split('_')[0] while '/' in systemLanguage: @@ -6121,7 +6121,7 @@ def runDaemon(blogsInstance: bool,mediaInstance: bool, \ if not os.path.isdir(archiveDir): print('Creating archive') os.mkdir(archiveDir) - + print('Creating cache expiry thread') httpd.thrCache= \ threadWithTrace(target=expireCache, \ @@ -6135,10 +6135,10 @@ def runDaemon(blogsInstance: bool,mediaInstance: bool, \ httpd.thrPostsQueue= \ threadWithTrace(target=runPostsQueue, \ args=(baseDir,httpd.sendThreads,debug),daemon=True) - if not unitTest: + if not unitTest: httpd.thrPostsWatchdog= \ threadWithTrace(target=runPostsWatchdog, \ - args=(projectVersion,httpd),daemon=True) + args=(projectVersion,httpd),daemon=True) httpd.thrPostsWatchdog.start() else: httpd.thrPostsQueue.start() @@ -6147,10 +6147,10 @@ def runDaemon(blogsInstance: bool,mediaInstance: bool, \ httpd.thrSharesExpire= \ threadWithTrace(target=runSharesExpire, \ args=(__version__,baseDir),daemon=True) - if not unitTest: + if not unitTest: httpd.thrSharesExpireWatchdog= \ threadWithTrace(target=runSharesExpireWatchdog, \ - args=(projectVersion,httpd),daemon=True) + args=(projectVersion,httpd),daemon=True) httpd.thrSharesExpireWatchdog.start() else: httpd.thrSharesExpire.start() @@ -6177,18 +6177,18 @@ def runDaemon(blogsInstance: bool,mediaInstance: bool, \ print('Creating scheduled post thread') httpd.thrPostSchedule= \ threadWithTrace(target=runPostSchedule, \ - args=(baseDir,httpd,20),daemon=True) - if not unitTest: + args=(baseDir,httpd,20),daemon=True) + if not unitTest: print('Creating inbox queue watchdog') httpd.thrWatchdog= \ threadWithTrace(target=runInboxQueueWatchdog, \ - args=(projectVersion,httpd),daemon=True) + args=(projectVersion,httpd),daemon=True) httpd.thrWatchdog.start() print('Creating scheduled post watchdog') httpd.thrWatchdogSchedule= \ threadWithTrace(target=runPostScheduleWatchdog, \ - args=(projectVersion,httpd),daemon=True) + args=(projectVersion,httpd),daemon=True) httpd.thrWatchdogSchedule.start() else: httpd.thrInboxQueue.start() diff --git a/delete.py b/delete.py index 64e3a95b9..be5c3be09 100644 --- a/delete.py +++ b/delete.py @@ -80,7 +80,7 @@ def createDelete(session,baseDir: str,federationList: [], \ 'https://www.w3.org/ns/activitystreams#Public', \ httpPrefix,True,clientToServer,federationList, \ sendThreads,postLog,cachedWebfingers,personCache,debug) - + return newDelete def sendDeleteViaServer(baseDir: str,session, \ @@ -131,7 +131,7 @@ def sendDeleteViaServer(baseDir: str,session, \ getPersonBox(baseDir,session,wfRequest,personCache, \ projectVersion,httpPrefix,fromNickname, \ fromDomain,postToBox) - + if not inboxUrl: if debug: print('DEBUG: No '+postToBox+' was found for '+handle) @@ -140,9 +140,9 @@ def sendDeleteViaServer(baseDir: str,session, \ if debug: print('DEBUG: No actor was found for '+handle) return 4 - + authHeader=createBasicAuthHeader(fromNickname,password) - + headers={ 'host': fromDomain, \ 'Content-type': 'application/json', \ @@ -257,14 +257,14 @@ def outboxDelete(baseDir: str,httpPrefix: str, \ if deleteNickname!=nickname: if debug: print("DEBUG: you can't delete a post which wasn't created by you (nickname does not match)") - return + return deleteDomain,deletePort=getDomainFromActor(messageId) if ':' in domain: domain=domain.split(':')[0] if deleteDomain!=domain: if debug: print("DEBUG: you can't delete a post which wasn't created by you (domain does not match)") - return + return removeModerationPostFromIndex(baseDir,messageId,debug) postFilename=locatePost(baseDir,deleteNickname,deleteDomain,messageId) if not postFilename: diff --git a/donate.py b/donate.py index 884d5f006..054b50427 100644 --- a/donate.py +++ b/donate.py @@ -12,7 +12,7 @@ def getDonationTypes() -> str: return ('patreon','paypal','gofundme','liberapay', \ 'kickstarter','indiegogo','crowdsupply', \ 'subscribestar') - + def getDonationUrl(actorJson: {}) -> str: """Returns a link used for donations """ diff --git a/epicyon.py b/epicyon.py index 28e63e9f8..136115115 100644 --- a/epicyon.py +++ b/epicyon.py @@ -354,7 +354,7 @@ if args.posts: if args.postsraw: if '@' not in args.postsraw: print('Syntax: --postsraw nickname@domain') - sys.exit() + sys.exit() if not args.http: args.port=443 nickname=args.postsraw.split('@')[0] @@ -398,7 +398,7 @@ if not args.blogsinstance: blogsInstance=getConfigParam(baseDir,'blogsInstance') if blogsInstance!=None: args.blogsinstance=blogsInstance - + # set the instance title in config.json title=getConfigParam(baseDir,'instanceTitle') if not title: @@ -450,13 +450,13 @@ if not getConfigParam(baseDir,'registration'): setConfigParam(baseDir,'maxRegistrations',str(maxRegistrations)) setConfigParam(baseDir,'registrationsRemaining',str(maxRegistrations)) -if args.resetregistrations: +if args.resetregistrations: setConfigParam(baseDir,'registrationsRemaining',str(maxRegistrations)) print('Number of new registrations reset to '+str(maxRegistrations)) - + # whether new registrations are open or closed if args.registration: - if args.registration.lower()=='open': + if args.registration.lower()=='open': registration=getConfigParam(baseDir,'registration') if not registration: setConfigParam(baseDir,'registrationsRemaining',str(maxRegistrations)) @@ -468,7 +468,7 @@ if args.registration: else: setConfigParam(baseDir,'registration','closed') print('New registrations closed') - + # unique ID for the instance instanceId=getConfigParam(baseDir,'instanceId') if not instanceId: @@ -535,7 +535,7 @@ if args.approve: if '@' not in args.approve: print('syntax: --approve nick@domain') sys.exit() - session=createSession(useTor) + session=createSession(useTor) sendThreads=[] postLog=[] cachedWebfingers={} @@ -559,7 +559,7 @@ if args.deny: if '@' not in args.deny: print('syntax: --deny nick@domain') sys.exit() - session=createSession(useTor) + session=createSession(useTor) sendThreads=[] postLog=[] cachedWebfingers={} @@ -590,21 +590,21 @@ if args.followerspending: if approveCtr==0: print('There are no follow requests pending approval.') sys.exit() - - + + if args.message: if not args.nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() - - session=createSession(useTor) + + session=createSession(useTor) if not args.sendto: print('Specify an account to sent to: --sendto [nickname@domain]') - sys.exit() + sys.exit() if '@' not in args.sendto and \ not args.sendto.lower().endswith('public') and \ not args.sendto.lower().endswith('followers'): @@ -628,7 +628,7 @@ if args.message: toNickname=None toDomain='public' toPort=port - + #ccUrl=httpPrefix+'://'+domain+'/users/'+nickname+'/followers' ccUrl=None sendMessage=args.message @@ -668,12 +668,12 @@ if args.announce: if not args.nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() - - session=createSession(useTor) + + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending announce/repeat of '+args.announce) @@ -717,7 +717,7 @@ if args.itemName: print('Specify a duration to share the object with the --duration option') sys.exit() - session=createSession(useTor) + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending shared item: '+args.itemName) @@ -749,7 +749,7 @@ if args.undoItemName: print('Specify a nickname with the --nickname option') sys.exit() - session=createSession(useTor) + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending undo of shared item: '+args.undoItemName) @@ -770,12 +770,12 @@ if args.like: if not args.nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() - - session=createSession(useTor) + + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending like of '+args.like) @@ -795,12 +795,12 @@ if args.undolike: if not args.nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() - - session=createSession(useTor) + + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending undo like of '+args.undolike) @@ -820,12 +820,12 @@ if args.delete: if not args.nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() - - session=createSession(useTor) + + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending delete request of '+args.delete) @@ -852,11 +852,11 @@ if args.follow: if not args.password: print('Please specify the password for '+args.nickname+' on '+domain) sys.exit() - + followNickname=getNicknameFromActor(args.follow) if not followNickname: print('Unable to find nickname in '+args.follow) - sys.exit() + sys.exit() followDomain,followPort=getDomainFromActor(args.follow) session=createSession(useTor) @@ -890,11 +890,11 @@ if args.unfollow: if not args.password: print('Please specify the password for '+args.nickname+' on '+domain) sys.exit() - + followNickname=getNicknameFromActor(args.unfollow) if not followNickname: print('WARN: unable to find nickname in '+args.unfollow) - sys.exit() + sys.exit() followDomain,followPort=getDomainFromActor(args.unfollow) session=createSession(useTor) @@ -927,7 +927,7 @@ if args.port: if args.proxyPort: proxyPort=args.proxyPort setConfigParam(baseDir,'proxyPort',proxyPort) -ocapAlways=False +ocapAlways=False if args.ocap: ocapAlways=args.ocap if args.dat: @@ -995,7 +995,7 @@ if args.actor: personUrl=originalActor else: sys.exit() - + asHeader={ 'Accept': 'application/activity+json; profile="https://www.w3.org/ns/activitystreams"' } @@ -1041,13 +1041,13 @@ if args.addaccount: sys.exit() if not validNickname(domain,nickname): print(nickname+' is a reserved name. Use something different.') - sys.exit() + sys.exit() if not args.password: print('Use the --password option to set the password for '+nickname) sys.exit() if len(args.password.strip())<8: print('Password should be at least 8 characters') - sys.exit() + sys.exit() if os.path.isdir(baseDir+'/accounts/'+nickname+'@'+domain): print('Account already exists') sys.exit() @@ -1198,7 +1198,7 @@ if args.avatar: print('Avatar added for '+args.nickname) else: print('Avatar was not added for '+args.nickname) - sys.exit() + sys.exit() if args.backgroundImage: if not os.path.isfile(args.backgroundImage): @@ -1212,14 +1212,14 @@ if args.backgroundImage: print('Background image added for '+args.nickname) else: print('Background image was not added for '+args.nickname) - sys.exit() + sys.exit() if args.project: - if not args.delegate and not args.undelegate: + if not args.delegate and not args.undelegate: if not nickname: print('No nickname given') sys.exit() - + if args.role.lower()=='none' or \ args.role.lower()=='remove' or \ args.role.lower()=='delete': @@ -1236,7 +1236,7 @@ if args.skill: if not nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() @@ -1249,7 +1249,7 @@ if args.skill: print('Skill level should be a percentage in the range 0-100') sys.exit() - session=createSession(useTor) + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending '+args.skill+' skill level '+str(args.skillLevelPercent)+' for '+nickname) @@ -1270,12 +1270,12 @@ if args.availability: if not nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() - session=createSession(useTor) + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending availability status of '+nickname+' as '+args.availability) @@ -1305,7 +1305,7 @@ if args.block: if not nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() @@ -1320,7 +1320,7 @@ if args.block: print(args.block+' does not look like an actor url') sys.exit() - session=createSession(useTor) + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending block of '+args.block) @@ -1339,7 +1339,7 @@ if args.delegate: if not nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() @@ -1356,7 +1356,7 @@ if args.delegate: delegatedNickname=args.delegate.split('@')[0] args.delegate=blockedActor - session=createSession(useTor) + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending delegation for '+args.delegate+' with role '+args.role+' in project '+args.project) @@ -1377,7 +1377,7 @@ if args.undelegate: if not nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() @@ -1390,7 +1390,7 @@ if args.undelegate: delegatedNickname=args.undelegate.split('@')[0] args.undelegate=blockedActor - session=createSession(useTor) + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending delegation removal for '+args.undelegate+' from role '+args.role+' in project '+args.project) @@ -1411,7 +1411,7 @@ if args.unblock: if not nickname: print('Specify a nickname with the --nickname option') sys.exit() - + if not args.password: print('Specify a password with the --password option') sys.exit() @@ -1426,7 +1426,7 @@ if args.unblock: print(args.unblock+' does not look like an actor url') sys.exit() - session=createSession(useTor) + session=createSession(useTor) personCache={} cachedWebfingers={} print('Sending undo block of '+args.unblock) @@ -1458,7 +1458,7 @@ if args.unfilterStr: sys.exit() if args.testdata: - useBlurhash=False + useBlurhash=False nickname='testuser567' password='boringpassword' print('Generating some test data for user: '+nickname) @@ -1475,7 +1475,7 @@ if args.testdata: shutil.rmtree(baseDir+'/sharefiles') if os.path.isdir(baseDir+'/wfendpoints'): shutil.rmtree(baseDir+'/wfendpoints') - + setConfigParam(baseDir,'registrationsRemaining',str(maxRegistrations)) createPerson(baseDir,'maxboardroom',domain,port,httpPrefix,True,password) @@ -1511,7 +1511,7 @@ if args.testdata: "City", \ "3 months", debug) - + deleteAllPosts(baseDir,nickname,domain,'inbox') deleteAllPosts(baseDir,nickname,domain,'outbox') createPublicPost(baseDir,nickname,domain,port,httpPrefix,"like, this is totally just a #test, man",False,True,False,None,None,useBlurhash) diff --git a/filters.py b/filters.py index d14f21aea..4a06d44ac 100644 --- a/filters.py +++ b/filters.py @@ -74,4 +74,3 @@ def isFiltered(baseDir: str,nickname: str,domain: str,content: str) -> bool: return False return True return False - diff --git a/follow.py b/follow.py index 07bb40afb..e577f9c0f 100644 --- a/follow.py +++ b/follow.py @@ -88,7 +88,7 @@ def isFollowingActor(baseDir: str,nickname: str,domain: str,actor: str) -> bool: handle=nickname+'@'+domain if not os.path.isdir(baseDir+'/accounts/'+handle): return False - followingFile=baseDir+'/accounts/'+handle+'/following.txt' + followingFile=baseDir+'/accounts/'+handle+'/following.txt' if not os.path.isfile(followingFile): return False if actor in open(followingFile).read(): @@ -284,7 +284,7 @@ def getFollowingFeed(baseDir: str,domain: str,port: int,path: str, \ return None # handle page numbers headerOnly=True - pageNumber=None + pageNumber=None if '?page=' in path: pageNumber=path.split('?page=')[1] if pageNumber=='true' or not authenticated: @@ -296,7 +296,7 @@ def getFollowingFeed(baseDir: str,domain: str,port: int,path: str, \ pass path=path.split('?page=')[0] headerOnly=False - + if not path.endswith('/'+followFile): return None nickname=None @@ -495,7 +495,7 @@ def receiveFollowRequest(session,baseDir: str,httpPrefix: str, \ '/channel/' not in messageJson['actor'] and \ '/profile/' not in messageJson['actor']: if debug: - print('DEBUG: "users" or "profile" missing from actor') + print('DEBUG: "users" or "profile" missing from actor') return False domain,tempPort=getDomainFromActor(messageJson['actor']) fromPort=port @@ -534,7 +534,7 @@ def receiveFollowRequest(session,baseDir: str,httpPrefix: str, \ if tempPort: if tempPort!=80 and tempPort!=443: if ':' not in domainToFollow: - domainToFollowFull=domainToFollow+':'+str(tempPort) + domainToFollowFull=domainToFollow+':'+str(tempPort) nicknameToFollow=getNicknameFromActor(messageJson['object']) if not nicknameToFollow: if debug: @@ -547,7 +547,7 @@ def receiveFollowRequest(session,baseDir: str,httpPrefix: str, \ print('DEBUG: followed account not found - '+ \ baseDir+'/accounts/'+handleToFollow) return True - + if isFollowerOfPerson(baseDir, \ nicknameToFollow,domainToFollowFull, \ nickname,domainFull): @@ -556,13 +556,13 @@ def receiveFollowRequest(session,baseDir: str,httpPrefix: str, \ ' is already a follower of '+ \ nicknameToFollow+'@'+domainToFollow) return True - + # what is the followers policy? - approveHandle=nickname+'@'+domainFull + approveHandle=nickname+'@'+domainFull if followApprovalRequired(baseDir,nicknameToFollow, \ domainToFollow,debug,approveHandle): print('Follow approval is required') - if not domain.endswith('.onion'): + if not domain.endswith('.onion'): if noOfFollowRequests(baseDir, \ nicknameToFollow,domainToFollow, \ nickname,domain,fromPort, \ @@ -730,10 +730,10 @@ def sendFollowRequest(session,baseDir: str, \ personCache: {},debug : bool, \ projectVersion: str) -> {}: """Gets the json object for sending a follow request - """ + """ if not domainPermitted(followDomain,federationList): return None - + fullDomain=domain followActor=httpPrefix+'://'+domain+'/users/'+nickname if port: @@ -749,7 +749,7 @@ def sendFollowRequest(session,baseDir: str, \ requestDomain=followDomain+':'+str(followPort) statusNumber,published=getStatusNumber() - + if followNickname: followedId=followHttpPrefix+'://'+requestDomain+'/users/'+followNickname followHandle=followNickname+'@'+requestDomain @@ -812,7 +812,7 @@ def sendFollowRequestViaServer(baseDir: str,session, \ if ':' not in followDomain: followDomainFull=followDomain+':'+str(followPort) - followActor=httpPrefix+'://'+fromDomainFull+'/users/'+fromNickname + followActor=httpPrefix+'://'+fromDomainFull+'/users/'+fromNickname followedId=httpPrefix+'://'+followDomainFull+'/users/'+followNickname statusNumber,published=getStatusNumber() @@ -842,7 +842,7 @@ def sendFollowRequestViaServer(baseDir: str,session, \ getPersonBox(baseDir,session,wfRequest,personCache, \ projectVersion,httpPrefix,fromNickname, \ fromDomain,postToBox) - + if not inboxUrl: if debug: print('DEBUG: No '+postToBox+' was found for '+handle) @@ -851,9 +851,9 @@ def sendFollowRequestViaServer(baseDir: str,session, \ if debug: print('DEBUG: No actor was found for '+handle) return 4 - + authHeader=createBasicAuthHeader(fromNickname,password) - + headers={ 'host': fromDomain, \ 'Content-type': 'application/json', \ @@ -895,7 +895,7 @@ def sendUnfollowRequestViaServer(baseDir: str,session, \ if ':' not in followDomain: followDomainFull=followDomain+':'+str(followPort) - followActor=httpPrefix+'://'+fromDomainFull+'/users/'+fromNickname + followActor=httpPrefix+'://'+fromDomainFull+'/users/'+fromNickname followedId=httpPrefix+'://'+followDomainFull+'/users/'+followNickname statusNumber,published=getStatusNumber() @@ -930,7 +930,7 @@ def sendUnfollowRequestViaServer(baseDir: str,session, \ getPersonBox(baseDir,session,wfRequest,personCache, \ projectVersion,httpPrefix,fromNickname, \ fromDomain,postToBox) - + if not inboxUrl: if debug: print('DEBUG: No '+postToBox+' was found for '+handle) @@ -939,9 +939,9 @@ def sendUnfollowRequestViaServer(baseDir: str,session, \ if debug: print('DEBUG: No actor was found for '+handle) return 4 - + authHeader=createBasicAuthHeader(fromNickname,password) - + headers={ 'host': fromDomain, \ 'Content-type': 'application/json', \ @@ -1008,7 +1008,7 @@ def getFollowersOfActor(baseDir :str,actor :str,debug: bool) -> {}: if ocapJson.get('id'): if debug: print('DEBUG: capabilities id found for '+account) - + recipientsDict[account]=ocapJson['id'] else: if debug: @@ -1058,7 +1058,7 @@ def outboxUndoFollow(baseDir: str,messageJson: {},debug: bool) -> None: if portFollower!=80 and portFollower!=443: if ':' not in domainFollower: domainFollowerFull=domainFollower+':'+str(portFollower) - + nicknameFollowing=getNicknameFromActor(messageJson['object']['object']) if not nicknameFollowing: print('WARN: unable to find nickname in '+messageJson['object']['object']) diff --git a/happening.py b/happening.py index 940f8bd60..31b86cd2b 100644 --- a/happening.py +++ b/happening.py @@ -67,7 +67,7 @@ def getTodaysEvents(baseDir: str,nickname: str,domain: str, \ calendarPostIds=[] recreateEventsFile=False - with open(calendarFilename,'r') as eventsFile: + with open(calendarFilename,'r') as eventsFile: for postId in eventsFile: postId=postId.replace('\n','') postFilename=locatePost(baseDir,nickname,domain,postId) @@ -134,7 +134,7 @@ def todaysEventsCheck(baseDir: str,nickname: str,domain: str) -> bool: return False eventsExist=False - with open(calendarFilename,'r') as eventsFile: + with open(calendarFilename,'r') as eventsFile: for postId in eventsFile: postId=postId.replace('\n','') postFilename=locatePost(baseDir,nickname,domain,postId) @@ -180,7 +180,7 @@ def thisWeeksEventsCheck(baseDir: str,nickname: str,domain: str) -> bool: return False eventsExist=False - with open(calendarFilename,'r') as eventsFile: + with open(calendarFilename,'r') as eventsFile: for postId in eventsFile: postId=postId.replace('\n','') postFilename=locatePost(baseDir,nickname,domain,postId) @@ -207,7 +207,7 @@ def thisWeeksEventsCheck(baseDir: str,nickname: str,domain: str) -> bool: int(eventTime.strftime("%m"))==monthNumber and \ (int(eventTime.strftime("%d"))>dayNumber and \ int(eventTime.strftime("%d"))<=dayNumber+6): - eventsExist=True + eventsExist=True break return eventsExist @@ -233,7 +233,7 @@ def getThisWeeksEvents(baseDir: str,nickname: str,domain: str) -> {}: calendarPostIds=[] recreateEventsFile=False - with open(calendarFilename,'r') as eventsFile: + with open(calendarFilename,'r') as eventsFile: for postId in eventsFile: postId=postId.replace('\n','') postFilename=locatePost(baseDir,nickname,domain,postId) @@ -317,7 +317,7 @@ def getCalendarEvents(baseDir: str,nickname: str,domain: str, \ calendarPostIds=[] recreateEventsFile=False - with open(calendarFilename,'r') as eventsFile: + with open(calendarFilename,'r') as eventsFile: for postId in eventsFile: postId=postId.replace('\n','') postFilename=locatePost(baseDir,nickname,domain,postId) @@ -362,7 +362,7 @@ def getCalendarEvents(baseDir: str,nickname: str,domain: str, \ for postId in calendarPostIds: calendarFile.write(postId+'\n') calendarFile.close() - + return events def removeCalendarEvent(baseDir: str,nickname: str,domain: str, \ diff --git a/httpsig.py b/httpsig.py index 94a3d0129..33286e4c1 100644 --- a/httpsig.py +++ b/httpsig.py @@ -9,7 +9,7 @@ __status__="Production" # see https://tools.ietf.org/html/draft-cavage-http-signatures-06 -try: +try: from Cryptodome.PublicKey import RSA from Cryptodome.Hash import SHA256 from Cryptodome.Signature import pkcs1_15 @@ -175,7 +175,7 @@ def verifyPostHeaders(httpPrefix: str,publicKeyPem: str,headers: dict, \ if debug: print('DEBUG: verifyPostHeaders '+method) - + publicKeyPem=RSA.import_key(publicKeyPem) # Build a dictionary of the signature values signatureHeader=headers['signature'] diff --git a/inbox.py b/inbox.py index 640ddf23e..885283a76 100644 --- a/inbox.py +++ b/inbox.py @@ -79,7 +79,7 @@ def storeHashTags(baseDir: str,nickname: str,postJsonObject: {}) -> None: return if not isinstance(postJsonObject['object']['tag'], list): return - tagsDir=baseDir+'/tags' + tagsDir=baseDir+'/tags' for tag in postJsonObject['object']['tag']: if not tag.get('type'): continue @@ -149,7 +149,7 @@ def validInbox(baseDir: str,nickname: str,domain: str) -> bool: if 'postNickname' in open(filename).read(): print('queue file incorrectly saved to '+filename) return False - return True + return True def validInboxFilenames(baseDir: str,nickname: str,domain: str, \ expectedDomain: str,expectedPort: int) -> bool: @@ -172,7 +172,7 @@ def validInboxFilenames(baseDir: str,nickname: str,domain: str, \ print('Expected: '+expectedStr) print('Invalid filename: '+filename) return False - return True + return True def getPersonPubKey(baseDir: str,session,personUrl: str, \ personCache: {},debug: bool, \ @@ -184,7 +184,7 @@ def getPersonPubKey(baseDir: str,session,personUrl: str, \ if personUrl.endswith('/users/inbox'): if debug: print('DEBUG: Obtaining public key for shared inbox') - personUrl=personUrl.replace('/users/inbox','/inbox') + personUrl=personUrl.replace('/users/inbox','/inbox') personJson=getPersonFromCache(baseDir,personUrl,personCache) if not personJson: if debug: @@ -345,9 +345,9 @@ def savePostToInboxQueue(baseDir: str,httpPrefix: str, \ postId=actor+'/statuses/'+statusNumber else: postId=httpPrefix+'://'+originalDomain+'/users/'+nickname+'/statuses/'+statusNumber - + # NOTE: don't change postJsonObject['id'] before signature check - + inboxQueueDir=createInboxQueueDir(nickname,domain,baseDir) handle=nickname+'@'+domain @@ -418,7 +418,7 @@ def inboxCheckCapabilities(baseDir :str,nickname :str,domain :str, \ return False oc=loadJson(ocapFilename) - if not oc: + if not oc: return False if not oc.get('id'): @@ -533,7 +533,7 @@ def inboxPostRecipients(baseDir :str,postJsonObject :{}, \ actor=postJsonObject['actor'] # first get any specific people which the post is addressed to - + followerRecipients=False if postJsonObject.get('object'): if isinstance(postJsonObject['object'], dict): @@ -649,7 +649,7 @@ def receiveUndoFollow(session,baseDir: str,httpPrefix: str, \ if portFollower!=80 and portFollower!=443: if ':' not in domainFollower: domainFollowerFull=domainFollower+':'+str(portFollower) - + nicknameFollowing=getNicknameFromActor(messageJson['object']['object']) if not nicknameFollowing: print('WARN: unable to find nickname in '+messageJson['object']['object']) @@ -668,7 +668,7 @@ def receiveUndoFollow(session,baseDir: str,httpPrefix: str, \ if debug: print('DEBUG: Follower '+nicknameFollower+'@'+domainFollowerFull+' was removed') return True - + if debug: print('DEBUG: Follower '+nicknameFollower+'@'+domainFollowerFull+' was not removed') return False @@ -693,7 +693,7 @@ def receiveUndo(session,baseDir: str,httpPrefix: str, \ '/channel/' not in messageJson['actor'] and \ '/profile/' not in messageJson['actor']: if debug: - print('DEBUG: "users" or "profile" missing from actor') + print('DEBUG: "users" or "profile" missing from actor') return False if not messageJson.get('object'): if debug: @@ -755,11 +755,11 @@ def personReceiveUpdate(baseDir: str, \ return False if not personJson.get('publicKey'): if debug: - print('DEBUG: actor update does not contain a public key') + print('DEBUG: actor update does not contain a public key') return False if not personJson['publicKey'].get('publicKeyPem'): if debug: - print('DEBUG: actor update does not contain a public key Pem') + print('DEBUG: actor update does not contain a public key Pem') return False actorFilename=baseDir+'/cache/actors/'+personJson['id'].replace('/','#')+'.json' # check that the public keys match. @@ -824,7 +824,7 @@ def receiveUpdateToQuestion(recentPostsCache: {},messageJson: {}, \ os.remove(cachedPostFilename) # remove from memory cache removePostFromCache(messageJson,recentPostsCache) - + def receiveUpdate(recentPostsCache: {},session,baseDir: str, \ httpPrefix: str,domain :str,port: int, \ sendThreads: [],postLog: [],cachedWebfingers: {}, \ @@ -878,7 +878,7 @@ def receiveUpdate(recentPostsCache: {},session,baseDir: str, \ if debug: print('DEBUG: Unwrapped profile update was received for '+messageJson['url']) return True - + if messageJson['object']['type']=='Person' or \ messageJson['object']['type']=='Application' or \ messageJson['object']['type']=='Group' or \ @@ -1056,11 +1056,11 @@ def receiveBookmark(recentPostsCache: {}, \ if domain not in handle.split('@')[1]: if debug: print('DEBUG: unrecognized domain '+handle) - return False + return False domainFull=domain if port: if port!=80 and port!=443: - domainFull=domain+':'+str(port) + domainFull=domain+':'+str(port) nickname=handle.split('@')[0] if not messageJson['actor'].endswith(domainFull+'/users/'+nickname): if debug: @@ -1121,12 +1121,12 @@ def receiveUndoBookmark(recentPostsCache: {}, \ domainFull=domain if port: if port!=80 and port!=443: - domainFull=domain+':'+str(port) + domainFull=domain+':'+str(port) nickname=handle.split('@')[0] if domain not in handle.split('@')[1]: if debug: print('DEBUG: unrecognized bookmark domain '+handle) - return False + return False if not messageJson['actor'].endswith(domainFull+'/users/'+nickname): if debug: print('DEBUG: bookmark actor should be the same as the handle sent to '+handle+' != '+messageJson['actor']) @@ -1180,7 +1180,7 @@ def receiveDelete(session,handle: str,isGroup: bool,baseDir: str, \ not messageJson['actor'].startswith(deletePrefix)): if debug: print('DEBUG: delete not permitted from other instances') - return False + return False if not messageJson.get('to'): if debug: print('DEBUG: '+messageJson['type']+' has no "to" list') @@ -1197,9 +1197,9 @@ def receiveDelete(session,handle: str,isGroup: bool,baseDir: str, \ return False if messageJson['actor'] not in messageJson['object']: if debug: - print('DEBUG: actor is not the owner of the post to be deleted') + print('DEBUG: actor is not the owner of the post to be deleted') if not os.path.isdir(baseDir+'/accounts/'+handle): - print('DEBUG: unknown recipient of like - '+handle) + print('DEBUG: unknown recipient of like - '+handle) # if this post in the outbox of the person? messageId=messageJson['object'].replace('/activity','').replace('/undo','') removeModerationPostFromIndex(baseDir,messageId,debug) @@ -1227,7 +1227,7 @@ def receiveAnnounce(recentPostsCache: {}, \ if '@' not in handle: if debug: print('DEBUG: bad handle '+handle) - return False + return False if not messageJson.get('actor'): if debug: print('DEBUG: '+messageJson['type']+' has no actor') @@ -1308,7 +1308,7 @@ def receiveAnnounce(recentPostsCache: {}, \ getPersonPubKey(baseDir,session,lookupActor, \ personCache,debug, \ __version__,httpPrefix, \ - domain,onionDomain) + domain,onionDomain) if pubKey: print('DEBUG: public key obtained for announce: '+lookupActor) break @@ -1316,7 +1316,7 @@ def receiveAnnounce(recentPostsCache: {}, \ if debug: print('DEBUG: Retry '+str(tries+1)+ \ ' obtaining actor for '+lookupActor) - time.sleep(5) + time.sleep(5) if debug: print('DEBUG: announced/repeated post arrived in inbox') return True @@ -1342,7 +1342,7 @@ def receiveUndoAnnounce(recentPostsCache: {}, \ if not isinstance(messageJson['object']['object'], str): return False if messageJson['object']['type']!='Announce': - return False + return False if '/users/' not in messageJson['actor'] and \ '/channel/' not in messageJson['actor'] and \ '/profile/' not in messageJson['actor']: @@ -1367,7 +1367,7 @@ def receiveUndoAnnounce(recentPostsCache: {}, \ if postJsonObject['type']!='Announce': if debug: print("DEBUG: Attempt to undo something which isn't an announcement") - return False + return False undoAnnounceCollectionEntry(recentPostsCache,baseDir,postFilename, \ messageJson['actor'],domain,debug) if os.path.isfile(postFilename): @@ -1376,7 +1376,7 @@ def receiveUndoAnnounce(recentPostsCache: {}, \ def populateReplies(baseDir :str,httpPrefix :str,domain :str, \ messageJson :{},maxReplies: int,debug :bool) -> bool: - """Updates the list of replies for a post on this domain if + """Updates the list of replies for a post on this domain if a reply to it arrives """ if not messageJson.get('id'): @@ -1412,7 +1412,7 @@ def populateReplies(baseDir :str,httpPrefix :str,domain :str, \ if not postFilename: if debug: print('DEBUG: post may have expired - '+replyTo) - return False + return False # populate a text file containing the ids of replies postRepliesFilename=postFilename.replace('.json','.replies') messageId=messageJson['id'].replace('/activity','').replace('/undo','') @@ -1461,7 +1461,7 @@ def validPostContent(baseDir: str,nickname: str,domain: str, \ if 'Z' not in messageJson['object']['published']: return False # check for bad html - invalidStrings=['' + postStr='' postStr+= \ individualPostAsHtml(recentPostsCache,maxRecentPosts, \ iconsDir,translate,None, \ @@ -4023,7 +4023,7 @@ def htmlIndividualPost(recentPostsCache: {},maxRecentPosts: int, \ False,authorized,False,False,False) cssFilename=baseDir+'/epicyon-profile.css' if os.path.isfile(baseDir+'/epicyon.css'): - cssFilename=baseDir+'/epicyon.css' + cssFilename=baseDir+'/epicyon.css' with open(cssFilename, 'r') as cssFile: postsCSS=cssFile.read() if httpPrefix!='https': @@ -4051,7 +4051,7 @@ def htmlPostReplies(recentPostsCache: {},maxRecentPosts: int, \ cssFilename=baseDir+'/epicyon-profile.css' if os.path.isfile(baseDir+'/epicyon.css'): - cssFilename=baseDir+'/epicyon.css' + cssFilename=baseDir+'/epicyon.css' with open(cssFilename, 'r') as cssFile: postsCSS=cssFile.read() if httpPrefix!='https': @@ -4068,7 +4068,7 @@ def htmlRemoveSharedItem(translate: {},baseDir: str,actor: str,shareName: str) - if not os.path.isfile(sharesFile): print('ERROR: no shares file '+sharesFile) return None - sharesJson=loadJson(sharesFile) + sharesJson=loadJson(sharesFile) if not sharesJson: print('ERROR: unable to load shares.json') return None @@ -4087,7 +4087,7 @@ def htmlRemoveSharedItem(translate: {},baseDir: str,actor: str,shareName: str) - cssFilename=baseDir+'/epicyon-follow.css' if os.path.isfile(baseDir+'/follow.css'): - cssFilename=baseDir+'/follow.css' + cssFilename=baseDir+'/follow.css' with open(cssFilename, 'r') as cssFile: profileStyle=cssFile.read() sharesStr=htmlHeader(cssFilename,profileStyle) @@ -4145,7 +4145,7 @@ def htmlDeletePost(recentPostsCache: {},maxRecentPosts: int, \ deletePostStr=None cssFilename=baseDir+'/epicyon-profile.css' if os.path.isfile(baseDir+'/epicyon.css'): - cssFilename=baseDir+'/epicyon.css' + cssFilename=baseDir+'/epicyon.css' with open(cssFilename, 'r') as cssFile: profileStyle=cssFile.read() if httpPrefix!='https': @@ -4209,7 +4209,7 @@ def htmlCalendarDeleteConfirm(translate: {},baseDir: str, \ deletePostStr=None cssFilename=baseDir+'/epicyon-profile.css' if os.path.isfile(baseDir+'/epicyon.css'): - cssFilename=baseDir+'/epicyon.css' + cssFilename=baseDir+'/epicyon.css' with open(cssFilename, 'r') as cssFile: profileStyle=cssFile.read() if httpPrefix!='https': @@ -4245,7 +4245,7 @@ def htmlFollowConfirm(translate: {},baseDir: str, \ """Asks to confirm a follow """ followDomain,port=getDomainFromActor(followActor) - + if os.path.isfile(baseDir+'/img/follow-background.png'): if not os.path.isfile(baseDir+'/accounts/follow-background.png'): copyfile(baseDir+'/img/follow-background.png', \ @@ -4253,7 +4253,7 @@ def htmlFollowConfirm(translate: {},baseDir: str, \ cssFilename=baseDir+'/epicyon-follow.css' if os.path.isfile(baseDir+'/follow.css'): - cssFilename=baseDir+'/follow.css' + cssFilename=baseDir+'/follow.css' with open(cssFilename, 'r') as cssFile: profileStyle=cssFile.read() followStr=htmlHeader(cssFilename,profileStyle) @@ -4287,7 +4287,7 @@ def htmlUnfollowConfirm(translate: {},baseDir: str, \ """Asks to confirm unfollowing an actor """ followDomain,port=getDomainFromActor(followActor) - + if os.path.isfile(baseDir+'/img/follow-background.png'): if not os.path.isfile(baseDir+'/accounts/follow-background.png'): copyfile(baseDir+'/img/follow-background.png', \ @@ -4295,7 +4295,7 @@ def htmlUnfollowConfirm(translate: {},baseDir: str, \ cssFilename=baseDir+'/epicyon-follow.css' if os.path.isfile(baseDir+'/follow.css'): - cssFilename=baseDir+'/follow.css' + cssFilename=baseDir+'/follow.css' with open(cssFilename, 'r') as cssFile: profileStyle=cssFile.read() followStr=htmlHeader(cssFilename,profileStyle) @@ -4338,7 +4338,7 @@ def htmlPersonOptions(translate: {},baseDir: str, \ """Show options for a person: view/follow/block/report """ optionsDomain,optionsPort=getDomainFromActor(optionsActor) - + if os.path.isfile(baseDir+'/img/options-background.png'): if not os.path.isfile(baseDir+'/accounts/options-background.png'): copyfile(baseDir+'/img/options-background.png', \ @@ -4370,7 +4370,7 @@ def htmlPersonOptions(translate: {},baseDir: str, \ optionsLinkStr=' ' cssFilename=baseDir+'/epicyon-follow.css' if os.path.isfile(baseDir+'/follow.css'): - cssFilename=baseDir+'/follow.css' + cssFilename=baseDir+'/follow.css' with open(cssFilename, 'r') as cssFile: profileStyle=cssFile.read() @@ -4452,7 +4452,7 @@ def htmlPersonOptions(translate: {},baseDir: str, \ # """Asks to confirm a block # """ # blockDomain,port=getDomainFromActor(blockActor) -# +# # if os.path.isfile(baseDir+'/img/block-background.png'): # if not os.path.isfile(baseDir+'/accounts/block-background.png'): # copyfile(baseDir+'/img/block-background.png',baseDir+'/accounts/block-background.png') @@ -4484,7 +4484,7 @@ def htmlUnblockConfirm(translate: {},baseDir: str, \ """Asks to confirm unblocking an actor """ blockDomain,port=getDomainFromActor(blockActor) - + if os.path.isfile(baseDir+'/img/block-background.png'): if not os.path.isfile(baseDir+'/accounts/block-background.png'): copyfile(baseDir+'/img/block-background.png', \ @@ -4492,7 +4492,7 @@ def htmlUnblockConfirm(translate: {},baseDir: str, \ cssFilename=baseDir+'/epicyon-follow.css' if os.path.isfile(baseDir+'/follow.css'): - cssFilename=baseDir+'/follow.css' + cssFilename=baseDir+'/follow.css' with open(cssFilename, 'r') as cssFile: profileStyle=cssFile.read() blockStr=htmlHeader(cssFilename,profileStyle) @@ -4524,7 +4524,7 @@ def htmlSearchEmojiTextEntry(translate: {}, \ """Search for an emoji by name """ # emoji.json is generated so that it can be customized and the changes - # will be retained even if default_emoji.json is subsequently updated + # will be retained even if default_emoji.json is subsequently updated if not os.path.isfile(baseDir+'/emoji/emoji.json'): copyfile(baseDir+'/emoji/default_emoji.json', \ baseDir+'/emoji/emoji.json') @@ -4532,7 +4532,7 @@ def htmlSearchEmojiTextEntry(translate: {}, \ actor=path.replace('/search','') nickname=getNicknameFromActor(actor) domain,port=getDomainFromActor(actor) - + if os.path.isfile(baseDir+'/img/search-background.png'): if not os.path.isfile(baseDir+'/accounts/search-background.png'): copyfile(baseDir+'/img/search-background.png', \ @@ -4540,13 +4540,13 @@ def htmlSearchEmojiTextEntry(translate: {}, \ cssFilename=baseDir+'/epicyon-follow.css' if os.path.isfile(baseDir+'/follow.css'): - cssFilename=baseDir+'/follow.css' + cssFilename=baseDir+'/follow.css' with open(cssFilename, 'r') as cssFile: profileStyle=cssFile.read() emojiStr=htmlHeader(cssFilename,profileStyle) emojiStr+=''+ \ translate['Enter an emoji name to search for']+'
' @@ -4585,7 +4585,7 @@ def htmlCalendarDay(translate: {}, \ cssFilename=baseDir+'/epicyon-calendar.css' if os.path.isfile(baseDir+'/calendar.css'): - cssFilename=baseDir+'/calendar.css' + cssFilename=baseDir+'/calendar.css' with open(cssFilename, 'r') as cssFile: calendarStyle=cssFile.read() @@ -4617,15 +4617,15 @@ def htmlCalendarDay(translate: {}, \ if ev.get('startTime'): eventDate= \ datetime.strptime(ev['startTime'], \ - "%Y-%m-%dT%H:%M:%S%z") + "%Y-%m-%dT%H:%M:%S%z") eventTime=eventDate.strftime("%H:%M").strip() if ev.get('name'): eventDescription=ev['name'].strip() elif ev['type']=='Place': if ev.get('name'): eventPlace=ev['name'] - - deleteButtonStr='' + + deleteButtonStr='' if postId: deleteButtonStr= \ ''+ \ translate['Enter an address, shared item, #hashtag, *skill or :emoji: to search for']+'
' @@ -4978,11 +4978,11 @@ def htmlProfileAfterSearch(recentPostsCache: {},maxRecentPosts: int, \ if searchPort!=80 and searchPort!=443: if ':' not in searchDomain: searchDomainFull=searchDomain+':'+str(searchPort) - + profileStr='' cssFilename=baseDir+'/epicyon-profile.css' if os.path.isfile(baseDir+'/epicyon.css'): - cssFilename=baseDir+'/epicyon.css' + cssFilename=baseDir+'/epicyon.css' with open(cssFilename, 'r') as cssFile: wf= \ webfingerHandle(session, \ @@ -4996,7 +4996,7 @@ def htmlProfileAfterSearch(recentPostsCache: {},maxRecentPosts: int, \ personUrl=None if wf.get('errors'): personUrl=httpPrefix+'://'+searchDomainFull+'/users/'+searchNickname - + asHeader={ 'Accept': 'application/activity+json; profile="https://www.w3.org/ns/activitystreams"' } @@ -5119,4 +5119,3 @@ def htmlProfileAfterSearch(recentPostsCache: {},maxRecentPosts: int, \ break return htmlHeader(cssFilename,profileStyle)+profileStr+htmlFooter() -