From 42a6a8a29b42e11deb0f1d6159fe50e3de7344e1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 10:06:32 +0000 Subject: [PATCH 01/19] Extra http headers, same as mastodon --- webapp_utils.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index cd68b6963..55a97c973 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -533,8 +533,15 @@ def htmlHeaderWithExternalStyle(cssFilename: str, instanceTitle: str, '\n' + \ ' \n' + \ ' \n' + \ - ' \n' + \ + ' \n' + \ ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ ' \n' + \ metadata + \ ' ' + instanceTitle + '\n' + \ From 6ed992faaf08f9d0a8945ef02a498c14018cff2b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 10:12:43 +0000 Subject: [PATCH 02/19] Extra icons, same as mastodon --- daemon.py | 14 +++++++++++++- img/apple-touch-icon.png | Bin 0 -> 20016 bytes img/logo120.png | Bin 0 -> 17522 bytes 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 img/apple-touch-icon.png create mode 100644 img/logo120.png diff --git a/daemon.py b/daemon.py index 4a5f14d94..7b61121a4 100644 --- a/daemon.py +++ b/daemon.py @@ -6038,6 +6038,11 @@ class PubServer(BaseHTTPRequestHandler): "type": "image/png", "sizes": "96x96" }, + { + "src": "/logo120.png", + "type": "image/png", + "sizes": "120x120" + }, { "src": "/logo128.png", "type": "image/png", @@ -6053,6 +6058,11 @@ class PubServer(BaseHTTPRequestHandler): "type": "image/png", "sizes": "152x152" }, + { + "src": "/apple-touch-icon.png", + "type": "image/png", + "sizes": "180x180" + }, { "src": "/logo192.png", "type": "image/png", @@ -13480,12 +13490,14 @@ class PubServer(BaseHTTPRequestHandler): # which support progressive web apps if self.path == '/logo72.png' or \ self.path == '/logo96.png' or \ + self.path == '/logo120.png' or \ self.path == '/logo128.png' or \ self.path == '/logo144.png' or \ self.path == '/logo152.png' or \ self.path == '/logo192.png' or \ self.path == '/logo256.png' or \ - self.path == '/logo512.png': + self.path == '/logo512.png' or \ + self.path == '/apple-touch-icon.png': mediaFilename = \ self.server.baseDir + '/img' + self.path if os.path.isfile(mediaFilename): diff --git a/img/apple-touch-icon.png b/img/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..996deaf00ccf29be465c83e231f36092c5bfb74f GIT binary patch literal 20016 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 Y3(cy0njr$*2*JSM>FVdQ&MBb@0RE8}&;S4c literal 0 HcmV?d00001 diff --git a/img/logo120.png b/img/logo120.png new file mode 100644 index 0000000000000000000000000000000000000000..ed93ab43efb0f6e3d05b45d2a4aa0653dc70f94b GIT binary patch literal 17522 zcmeHtWmFtr^XA|V!QGwU?(Xgo+yYXt9|@#jg{H<;dt;?}RTLF6~4KN%afv9+o?_Z^?G4ITS#O4bh5`nU2E9$tQF zZT7pHZt;=#U-sZW5*ECEeDeJD68PX6b|`nK^XyS7XxdL;8Z^Ii^84;vf(ZsPQS#xa z-v+qX8RzE>%0rh#PzBJvX8#6f?EU*b(N|`epoG5sAGw=KyH6VruZa;$hB1e*7v7-3 z>y4;KREnc|uHqY%ac^QKe7E_VoC}Vg%E{25Evokm;Li`>fF8FXpI1Y5$@iOlJy)I_ zH{-M9Ti!noNBO*C#6$!>C(;M`zQXeLsU7}$$kUk?c*!(~PlFv*Ms=$*Hn`(vrql!f@z>q2#2un&v#u$lY_s;=&QbaEbi>I~5DaMt`_)Yq zkKXbLJTvC3DrzKh^o%ur%G3o2Q=~*9aI_Q!(zUgeM50LCCj~N@FHdNLBdYc^6Q9T?d2v@UH1pafgmcc$waI`rPm&EyLeo*T`*TvEsLf0-za7hF3^z0G#5$hOH| z`po-s{gxSIv9F_R>~wd=Th+3wDs<6w;@nNHc@~bXCis-5r6%-?+I~jZ{MXq@q1<$D z>48g`hxt=95jo3#APPOdLM$QX%{=B+31ZTm2}kqN=uv`XW!CCJRqP%iP!p7)H4<&M zK2y0XYVq*a&2-1w;%Ct4bU(EXPS>mSUcBT()Wk2ccJh+85#9xOcj_|E#gaAgC)dHc zjTKhSmvOP_{$B&Hzhq0JfC$k9_n^*0G^#?8OsB&##Pf(iuUfj#JuK?RPg|Iovr%Oe z{?M66aRD=!XH9h7{-SF?18sQRXwJ0WH45(#;y4L)GH1-5=c_Tmp&WFWg!gV^_!rjwmhW5%&UTL@;X2M)^J1Gf$ z^&Vct$~>-bbG?*>Mg_;Syj1w)MceI#D2ygItVqJa1{-?eBeMFI zV)0wcZl7xd_uUZ4orO=2OR@T}Z|0PB-4j3`;MZDkk&E4^FIufBa6AtNVs9-@_eQf^ z0jI&zZoj}ELh_nEl6Tg$nQf62c-ROse{x-vUvsiqOCD;T)Xui*aX?dHkz1t{BFGMh!phModn%}~l z3f-2W5T7>qu|b|8dHFLR@G}T8wEu0n#C20qU-JkM2~mpwV|

R`H&2H6iI^Ly@sT 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 literal 0 HcmV?d00001 From 523a6bca24c0ee9860818710f7634e9ac4b1f46d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 10:32:19 +0000 Subject: [PATCH 03/19] Support for ms desktop icon --- daemon.py | 47 +++++++++++++++++++++++++++++++++++++++++------ img/logo120.png | Bin 17522 -> 0 bytes img/logo150.png | Bin 0 -> 18214 bytes 3 files changed, 41 insertions(+), 6 deletions(-) delete mode 100644 img/logo120.png create mode 100644 img/logo150.png diff --git a/daemon.py b/daemon.py index 7b61121a4..21f8f0142 100644 --- a/daemon.py +++ b/daemon.py @@ -6038,11 +6038,6 @@ class PubServer(BaseHTTPRequestHandler): "type": "image/png", "sizes": "96x96" }, - { - "src": "/logo120.png", - "type": "image/png", - "sizes": "120x120" - }, { "src": "/logo128.png", "type": "image/png", @@ -6053,6 +6048,11 @@ class PubServer(BaseHTTPRequestHandler): "type": "image/png", "sizes": "144x144" }, + { + "src": "/logo150.png", + "type": "image/png", + "sizes": "150x150" + }, { "src": "/logo152.png", "type": "image/png", @@ -6102,6 +6102,33 @@ class PubServer(BaseHTTPRequestHandler): '_GET', '_progressiveWebAppManifest', self.server.debug) + def _browserConfig(self, callingDomain: str, GETstartTime) -> None: + """Used by MS Windows to put an icon on the desktop if you + link to a website + """ + xmlStr = \ + '\n' + \ + '\n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' #eeeeee\n' + \ + ' \n' + \ + ' \n' + \ + '' + + msg = json.dumps(xmlStr, + ensure_ascii=False).encode('utf-8') + msglen = len(msg) + self._set_headers('application/xml', msglen, + None, callingDomain, False) + self._write(msg) + if self.server.debug: + print('Sent browserconfig: ' + callingDomain) + fitnessPerformance(GETstartTime, self.server.fitness, + '_GET', '_browserConfig', + self.server.debug) + def _getFavicon(self, callingDomain: str, baseDir: str, debug: bool, favFilename: str) -> None: @@ -12411,6 +12438,14 @@ class PubServer(BaseHTTPRequestHandler): else: self.path = '/' + if '/browserconfig.xml' in self.path: + if self._hasAccept(callingDomain): + if not self._requestHTTP(): + self._browserConfig(callingDomain, GETstartTime) + return + else: + self.path = '/' + # default newswire favicon, for links to sites which # have no favicon if 'newswire_favicon.ico' in self.path: @@ -13490,9 +13525,9 @@ class PubServer(BaseHTTPRequestHandler): # which support progressive web apps if self.path == '/logo72.png' or \ self.path == '/logo96.png' or \ - self.path == '/logo120.png' or \ self.path == '/logo128.png' or \ self.path == '/logo144.png' or \ + self.path == '/logo150.png' or \ self.path == '/logo152.png' or \ self.path == '/logo192.png' or \ self.path == '/logo256.png' or \ diff --git a/img/logo120.png b/img/logo120.png deleted file mode 100644 index ed93ab43efb0f6e3d05b45d2a4aa0653dc70f94b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17522 zcmeHtWmFtr^XA|V!QGwU?(Xgo+yYXt9|@#jg{H<;dt;?}RTLF6~4KN%afv9+o?_Z^?G4ITS#O4bh5`nU2E9$tQF zZT7pHZt;=#U-sZW5*ECEeDeJD68PX6b|`nK^XyS7XxdL;8Z^Ii^84;vf(ZsPQS#xa z-v+qX8RzE>%0rh#PzBJvX8#6f?EU*b(N|`epoG5sAGw=KyH6VruZa;$hB1e*7v7-3 z>y4;KREnc|uHqY%ac^QKe7E_VoC}Vg%E{25Evokm;Li`>fF8FXpI1Y5$@iOlJy)I_ zH{-M9Ti!noNBO*C#6$!>C(;M`zQXeLsU7}$$kUk?c*!(~PlFv*Ms=$*Hn`(vrql!f@z>q2#2un&v#u$lY_s;=&QbaEbi>I~5DaMt`_)Yq zkKXbLJTvC3DrzKh^o%ur%G3o2Q=~*9aI_Q!(zUgeM50LCCj~N@FHdNLBdYc^6Q9T?d2v@UH1pafgmcc$waI`rPm&EyLeo*T`*TvEsLf0-za7hF3^z0G#5$hOH| z`po-s{gxSIv9F_R>~wd=Th+3wDs<6w;@nNHc@~bXCis-5r6%-?+I~jZ{MXq@q1<$D z>48g`hxt=95jo3#APPOdLM$QX%{=B+31ZTm2}kqN=uv`XW!CCJRqP%iP!p7)H4<&M zK2y0XYVq*a&2-1w;%Ct4bU(EXPS>mSUcBT()Wk2ccJh+85#9xOcj_|E#gaAgC)dHc zjTKhSmvOP_{$B&Hzhq0JfC$k9_n^*0G^#?8OsB&##Pf(iuUfj#JuK?RPg|Iovr%Oe z{?M66aRD=!XH9h7{-SF?18sQRXwJ0WH45(#;y4L)GH1-5=c_Tmp&WFWg!gV^_!rjwmhW5%&UTL@;X2M)^J1Gf$ z^&Vct$~>-bbG?*>Mg_;Syj1w)MceI#D2ygItVqJa1{-?eBeMFI zV)0wcZl7xd_uUZ4orO=2OR@T}Z|0PB-4j3`;MZDkk&E4^FIufBa6AtNVs9-@_eQf^ z0jI&zZoj}ELh_nEl6Tg$nQf62c-ROse{x-vUvsiqOCD;T)Xui*aX?dHkz1t{BFGMh!phModn%}~l z3f-2W5T7>qu|b|8dHFLR@G}T8wEu0n#C20qU-JkM2~mpwV|

R`H&2H6iI^Ly@sT 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 diff --git a/img/logo150.png b/img/logo150.png new file mode 100644 index 0000000000000000000000000000000000000000..5b933f90fa28d933c468ef3f1e560c9c0bd5c1ef GIT binary patch literal 18214 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 literal 0 HcmV?d00001 From de8ae4f8072e1cb4a885ad76863bfd2081db47c0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 10:36:36 +0000 Subject: [PATCH 04/19] Simplify --- daemon.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/daemon.py b/daemon.py index 21f8f0142..67901d7a1 100644 --- a/daemon.py +++ b/daemon.py @@ -12440,11 +12440,8 @@ class PubServer(BaseHTTPRequestHandler): if '/browserconfig.xml' in self.path: if self._hasAccept(callingDomain): - if not self._requestHTTP(): - self._browserConfig(callingDomain, GETstartTime) - return - else: - self.path = '/' + self._browserConfig(callingDomain, GETstartTime) + return # default newswire favicon, for links to sites which # have no favicon From 0845570e4051d4d04bb24ba63d3af5e9c201eec7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 10:40:52 +0000 Subject: [PATCH 05/19] xml mime type --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 67901d7a1..d30591162 100644 --- a/daemon.py +++ b/daemon.py @@ -6120,7 +6120,7 @@ class PubServer(BaseHTTPRequestHandler): msg = json.dumps(xmlStr, ensure_ascii=False).encode('utf-8') msglen = len(msg) - self._set_headers('application/xml', msglen, + self._set_headers('application/xrd+xml', msglen, None, callingDomain, False) self._write(msg) if self.server.debug: From 4406bb768ef483c1af7306702d3a2e5fc8d8e36e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 11:05:32 +0000 Subject: [PATCH 06/19] Remove icon with similar resolution --- daemon.py | 6 ------ img/logo152.png | Bin 13426 -> 0 bytes 2 files changed, 6 deletions(-) delete mode 100644 img/logo152.png diff --git a/daemon.py b/daemon.py index d30591162..bc32b5580 100644 --- a/daemon.py +++ b/daemon.py @@ -6053,11 +6053,6 @@ class PubServer(BaseHTTPRequestHandler): "type": "image/png", "sizes": "150x150" }, - { - "src": "/logo152.png", - "type": "image/png", - "sizes": "152x152" - }, { "src": "/apple-touch-icon.png", "type": "image/png", @@ -13525,7 +13520,6 @@ class PubServer(BaseHTTPRequestHandler): self.path == '/logo128.png' or \ self.path == '/logo144.png' or \ self.path == '/logo150.png' or \ - self.path == '/logo152.png' or \ self.path == '/logo192.png' or \ self.path == '/logo256.png' or \ self.path == '/logo512.png' or \ diff --git a/img/logo152.png b/img/logo152.png deleted file mode 100644 index 011235ee427a0d6ca39e38b61c6d842ae1a9a0bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13426 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 Date: Mon, 8 Nov 2021 11:52:08 +0000 Subject: [PATCH 07/19] Some endpoints with basic info are available to crawlers --- daemon.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/daemon.py b/daemon.py index bc32b5580..700b15e6b 100644 --- a/daemon.py +++ b/daemon.py @@ -12271,6 +12271,16 @@ class PubServer(BaseHTTPRequestHandler): uaStr = self.headers['User-agent'] return uaStr + def _permittedCrawlerPath(self, path: str) -> bool: + """Is the given path permitted to be crawled by a search engine? + this should only allow through basic information, such as nodeinfo + """ + if path == '/' or path == '/about' or \ + path.startswith('/api/') or \ + path.startswith('/nodeinfo/'): + return True + return False + def do_GET(self): callingDomain = self.server.domainFull @@ -12299,9 +12309,10 @@ class PubServer(BaseHTTPRequestHandler): uaStr = self._getUserAgent() - if self._blockedUserAgent(callingDomain, uaStr): - self._400() - return + if not self._permittedCrawlerPath(self.path): + if self._blockedUserAgent(callingDomain, uaStr): + self._400() + return refererDomain = self._getRefererDomain(uaStr) @@ -13698,6 +13709,7 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime) return + # show a background image on the login or person options page if '-background.' in self.path: if self._showBackgroundImage(callingDomain, self.path, self.server.baseDir, @@ -13887,6 +13899,7 @@ class PubServer(BaseHTTPRequestHandler): '_GET', 'login shown done', self.server.debug) + # the newswire screen on mobile if htmlGET and self.path.startswith('/users/') and \ self.path.endswith('/newswiremobile'): if (authorized or @@ -14656,6 +14669,7 @@ class PubServer(BaseHTTPRequestHandler): '_GET', 'post replies done', self.server.debug) + # roles on profile screen if self.path.endswith('/roles') and usersInPath: if self._showRoles(authorized, callingDomain, self.path, From d18b97e85043e1efea8cae0f717962a945550f8b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 13:20:06 +0000 Subject: [PATCH 08/19] opengraph metadata on blog posts --- blog.py | 10 ++++++++-- webapp_utils.py | 26 +++++++++++++++++++++----- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/blog.py b/blog.py index 0666e8677..d9cf7e704 100644 --- a/blog.py +++ b/blog.py @@ -431,12 +431,18 @@ def htmlBlogPost(session, authorized: bool, instanceTitle = \ getConfigParam(baseDir, 'instanceTitle') published = postJsonObject['object']['published'] + modified = published + if postJsonObject['object'].get('updated'): + modified = postJsonObject['object']['updated'] title = postJsonObject['object']['summary'] + url = '' + if postJsonObject['object'].get('url'): + url = postJsonObject['object']['url'] snippet = _getSnippetFromBlogContent(postJsonObject, systemLanguage) blogStr = htmlHeaderWithBlogMarkup(cssFilename, instanceTitle, httpPrefix, domainFull, nickname, - systemLanguage, published, - title, snippet) + systemLanguage, published, modified, + title, snippet, translate, url) _htmlBlogRemoveCwButton(blogStr, translate) blogStr += _htmlBlogPostContent(debug, session, authorized, baseDir, diff --git a/webapp_utils.py b/webapp_utils.py index 55a97c973..b03cb8a05 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -795,8 +795,10 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str, def htmlHeaderWithBlogMarkup(cssFilename: str, instanceTitle: str, httpPrefix: str, domain: str, nickname: str, - systemLanguage: str, published: str, - title: str, snippet: str) -> str: + systemLanguage: str, + published: str, modified: str, + title: str, snippet: str, + translate: {}, url: str) -> str: """html header which includes blog post markup https://schema.org/BlogPosting """ @@ -814,7 +816,7 @@ def htmlHeaderWithBlogMarkup(cssFilename: str, instanceTitle: str, ' "@type" : "BlogPosting",\n' + \ ' "headline": "' + title + '",\n' + \ ' "datePublished": "' + published + '",\n' + \ - ' "dateModified": "' + published + '",\n' + \ + ' "dateModified": "' + modified + '",\n' + \ ' "author": {\n' + \ ' "@type": "Person",\n' + \ ' "name": "' + nickname + '",\n' + \ @@ -829,9 +831,23 @@ def htmlHeaderWithBlogMarkup(cssFilename: str, instanceTitle: str, ' "description": "' + snippet + '"\n' + \ ' }\n' + \ ' \n' + + ogMetadata = \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' ' + htmlStr = \ - htmlHeaderWithExternalStyle(cssFilename, instanceTitle, blogMarkup, - systemLanguage) + htmlHeaderWithExternalStyle(cssFilename, instanceTitle, + ogMetadata + blogMarkup, systemLanguage) return htmlStr From a71c352ce35848d6a720cf0010a7a9a746b044b8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 13:23:13 +0000 Subject: [PATCH 09/19] Newline --- webapp_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index b03cb8a05..59c395bc8 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -843,7 +843,7 @@ def htmlHeaderWithBlogMarkup(cssFilename: str, instanceTitle: str, ' \n' + \ ' ' + modified + '" />\n' htmlStr = \ htmlHeaderWithExternalStyle(cssFilename, instanceTitle, From 135f0f760f07de9e0c5d5f8c49fe6c160d9b6cbf Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 13:34:29 +0000 Subject: [PATCH 10/19] Blogs can be crawled --- daemon.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 700b15e6b..bfe08edfa 100644 --- a/daemon.py +++ b/daemon.py @@ -12277,7 +12277,8 @@ class PubServer(BaseHTTPRequestHandler): """ if path == '/' or path == '/about' or \ path.startswith('/api/') or \ - path.startswith('/nodeinfo/'): + path.startswith('/nodeinfo/') or \ + path.startswith('/blog/'): return True return False From 3548b8795c533f8c957cc91650dee23198772671 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 14:49:18 +0000 Subject: [PATCH 11/19] Show emoji to indicate new follower domain --- follow.py | 22 ++++++++++++++++++++++ webapp_profile.py | 17 ++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/follow.py b/follow.py index 4343d60b7..cf5ea7837 100644 --- a/follow.py +++ b/follow.py @@ -209,6 +209,28 @@ def followerOfPerson(baseDir: str, nickname: str, domain: str, federationList, debug, groupAccount, 'followers.txt') +def getFollowerDomains(baseDir: str, nickname: str, domain: str) -> []: + """Returns a list of domains for followers + """ + domain = removeDomainPort(domain) + followersFile = acctDir(baseDir, nickname, domain) + '/followers.txt' + if not os.path.isfile(followersFile): + return [] + + lines = [] + with open(followersFile, 'r') as fpFollowers: + lines = fpFollowers.readlines() + + domainsList = [] + for handle in lines: + followerDomain, _ = getDomainFromActor(handle) + if not followerDomain: + continue + if followerDomain not in domainsList: + domainsList.append(followerDomain) + return domainsList + + def isFollowerOfPerson(baseDir: str, nickname: str, domain: str, followerNickname: str, followerDomain: str) -> bool: """is the given nickname a follower of followerNickname? diff --git a/webapp_profile.py b/webapp_profile.py index 9d01178e0..9b7a5e33d 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -53,6 +53,7 @@ from jami import getJamiAddress from cwtch import getCwtchAddress from filters import isFiltered from follow import isFollowerOfPerson +from follow import getFollowerDomains from webapp_frontscreen import htmlFrontScreen from webapp_utils import htmlKeyboardNavigation from webapp_utils import htmlHideFromScreenReader @@ -716,6 +717,8 @@ def htmlProfile(signingPrivateKeyPem: str, break if selected == 'followers': if followApprovals: + currFollowerDomains = \ + getFollowerDomains(baseDir, nickname, domain) with open(followRequestsFilename, 'r') as f: for followerHandle in f: if len(line) > 0: @@ -726,13 +729,25 @@ def htmlProfile(signingPrivateKeyPem: str, dom = followerHandle.split('@')[1] followerActor = \ localActorUrl(httpPrefix, nick, dom) + + # is this a new domain? + # if so then append a new instance indicator + followerDomain, _ = \ + getDomainFromActor(followerActor) + newFollowerDomain = '' + if followerDomain not in currFollowerDomains: + newFollowerDomain = ' ✨' + basePath = '/users/' + nickname followApprovalsSection += '

' followApprovalsSection += \ '' followApprovalsSection += \ '' + \ - followerHandle + '' + followerHandle + \ + newFollowerDomain + '' + + # show Approve and Deny buttons followApprovalsSection += \ '' From ebacc0e6f12e35b22717d4affb4ccdfaf8390a49 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Nov 2021 16:17:07 +0000 Subject: [PATCH 12/19] Command option for content license --- blog.py | 5 +++-- daemon.py | 33 +++++++++++++++++++++++++-------- epicyon.py | 13 ++++++++++++- tests.py | 16 ++++++++++++---- webapp_profile.py | 6 ++++-- webapp_utils.py | 8 ++++---- 6 files changed, 60 insertions(+), 21 deletions(-) diff --git a/blog.py b/blog.py index d9cf7e704..a136d36d0 100644 --- a/blog.py +++ b/blog.py @@ -420,7 +420,7 @@ def htmlBlogPost(session, authorized: bool, postJsonObject: {}, peertubeInstances: [], systemLanguage: str, personCache: {}, - debug: bool) -> str: + debug: bool, contentLicenseUrl: str) -> str: """Returns a html blog post """ blogStr = '' @@ -442,7 +442,8 @@ def htmlBlogPost(session, authorized: bool, blogStr = htmlHeaderWithBlogMarkup(cssFilename, instanceTitle, httpPrefix, domainFull, nickname, systemLanguage, published, modified, - title, snippet, translate, url) + title, snippet, translate, url, + contentLicenseUrl) _htmlBlogRemoveCwButton(blogStr, translate) blogStr += _htmlBlogPostContent(debug, session, authorized, baseDir, diff --git a/daemon.py b/daemon.py index bfe08edfa..031790be3 100644 --- a/daemon.py +++ b/daemon.py @@ -8758,7 +8758,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.sharedItemsFederatedDomains, rolesList, None, None, self.server.CWlists, - self.server.listsEnabled) + self.server.listsEnabled, + self.server.contentLicenseUrl) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -8873,7 +8874,8 @@ class PubServer(BaseHTTPRequestHandler): skills, None, None, self.server.CWlists, - self.server.listsEnabled) + self.server.listsEnabled, + self.server.contentLicenseUrl) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10866,7 +10868,8 @@ class PubServer(BaseHTTPRequestHandler): shares, pageNumber, sharesPerPage, self.server.CWlists, - self.server.listsEnabled) + self.server.listsEnabled, + self.server.contentLicenseUrl) msg = msg.encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, @@ -10958,6 +10961,8 @@ class PubServer(BaseHTTPRequestHandler): city = getSpoofedCity(self.server.city, baseDir, nickname, domain) + contentLicenseUrl = \ + self.server.contentLicenseUrl msg = \ htmlProfile(self.server.signingPrivateKeyPem, self.server.rssIconAtTop, @@ -10992,7 +10997,8 @@ class PubServer(BaseHTTPRequestHandler): pageNumber, followsPerPage, self.server.CWlists, - self.server.listsEnabled).encode('utf-8') + self.server.listsEnabled, + contentLicenseUrl).encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, cookie, callingDomain, False) @@ -11082,6 +11088,8 @@ class PubServer(BaseHTTPRequestHandler): city = getSpoofedCity(self.server.city, baseDir, nickname, domain) + contentLicenseUrl = \ + self.server.contentLicenseUrl msg = \ htmlProfile(self.server.signingPrivateKeyPem, self.server.rssIconAtTop, @@ -11117,7 +11125,8 @@ class PubServer(BaseHTTPRequestHandler): pageNumber, followsPerPage, self.server.CWlists, - self.server.listsEnabled).encode('utf-8') + self.server.listsEnabled, + contentLicenseUrl).encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, cookie, callingDomain, False) @@ -11258,7 +11267,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.sharedItemsFederatedDomains, None, None, None, self.server.CWlists, - self.server.listsEnabled).encode('utf-8') + self.server.listsEnabled, + self.server.contentLicenseUrl).encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, cookie, callingDomain, False) @@ -13138,7 +13148,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.peertubeInstances, self.server.systemLanguage, self.server.personCache, - self.server.debug) + self.server.debug, + self.server.contentLicenseUrl) if msg is not None: msg = msg.encode('utf-8') msglen = len(msg) @@ -17179,7 +17190,8 @@ def loadTokens(baseDir: str, tokensDict: {}, tokensLookup: {}) -> None: break -def runDaemon(listsEnabled: str, +def runDaemon(contentLicenseUrl: str, + listsEnabled: str, defaultReplyIntervalHours: int, lowBandwidth: bool, maxLikeCount: int, @@ -17267,6 +17279,11 @@ def runDaemon(listsEnabled: str, # scan the theme directory for any svg files containing scripts assert not scanThemesForScripts(baseDir) + # license for content of the instance + if not contentLicenseUrl: + contentLicenseUrl = 'https://creativecommons.org/licenses/by/4.0' + httpd.contentLicenseUrl = contentLicenseUrl + # fitness metrics fitnessFilename = baseDir + '/accounts/fitness.json' httpd.fitness = {} diff --git a/epicyon.py b/epicyon.py index a0c9e1f64..6cfe1768f 100644 --- a/epicyon.py +++ b/epicyon.py @@ -112,6 +112,9 @@ def str2bool(v) -> bool: parser = argparse.ArgumentParser(description='ActivityPub Server') +parser.add_argument('--contentLicenseUrl', type=str, + default='https://creativecommons.org/licenses/by/4.0', + help='Url of the license used for the instance content') parser.add_argument('--listsEnabled', type=str, default=None, help='Names of content warning lists enabled. ' + @@ -2884,6 +2887,13 @@ minimumvotes = getConfigParam(baseDir, 'minvotes') if minimumvotes: args.minimumvotes = int(minimumvotes) +contentLicenseUrl = '' +if args.contentLicenseUrl: + contentLicenseUrl = args.contentLicenseUrl + setConfigParam(baseDir, 'contentLicenseUrl', contentLicenseUrl) +else: + contentLicenseUrl = getConfigParam(baseDir, 'contentLicenseUrl') + votingtime = getConfigParam(baseDir, 'votingtime') if votingtime: args.votingtime = votingtime @@ -3078,7 +3088,8 @@ if args.defaultCurrency: print('Default currency set to ' + args.defaultCurrency) if __name__ == "__main__": - runDaemon(listsEnabled, + runDaemon(contentLicenseUrl, + listsEnabled, args.defaultReplyIntervalHours, args.lowBandwidth, args.maxLikeCount, sharedItemsFederatedDomains, diff --git a/tests.py b/tests.py index 876594409..39fe63547 100644 --- a/tests.py +++ b/tests.py @@ -818,8 +818,10 @@ def createServerAlice(path: str, domain: str, port: int, maxLikeCount = 10 defaultReplyIntervalHours = 9999999999 listsEnabled = '' + contentLicenseUrl = None print('Server running: Alice') - runDaemon(listsEnabled, defaultReplyIntervalHours, + runDaemon(contentLicenseUrl, + listsEnabled, defaultReplyIntervalHours, lowBandwidth, maxLikeCount, sharedItemsFederatedDomains, userAgentsBlocked, @@ -957,8 +959,10 @@ def createServerBob(path: str, domain: str, port: int, maxLikeCount = 10 defaultReplyIntervalHours = 9999999999 listsEnabled = '' + contentLicenseUrl = None print('Server running: Bob') - runDaemon(listsEnabled, defaultReplyIntervalHours, + runDaemon(contentLicenseUrl, + listsEnabled, defaultReplyIntervalHours, lowBandwidth, maxLikeCount, sharedItemsFederatedDomains, userAgentsBlocked, @@ -1025,8 +1029,10 @@ def createServerEve(path: str, domain: str, port: int, federationList: [], lowBandwidth = True defaultReplyIntervalHours = 9999999999 listsEnabled = '' + contentLicenseUrl = None print('Server running: Eve') - runDaemon(listsEnabled, defaultReplyIntervalHours, + runDaemon(contentLicenseUrl, + listsEnabled, defaultReplyIntervalHours, lowBandwidth, maxLikeCount, sharedItemsFederatedDomains, userAgentsBlocked, @@ -1095,8 +1101,10 @@ def createServerGroup(path: str, domain: str, port: int, lowBandwidth = True defaultReplyIntervalHours = 9999999999 listsEnabled = '' + contentLicenseUrl = None print('Server running: Group') - runDaemon(listsEnabled, defaultReplyIntervalHours, + runDaemon(contentLicenseUrl, + listsEnabled, defaultReplyIntervalHours, lowBandwidth, maxLikeCount, sharedItemsFederatedDomains, userAgentsBlocked, diff --git a/webapp_profile.py b/webapp_profile.py index 9b7a5e33d..b4f8e0f3e 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -542,7 +542,8 @@ def htmlProfile(signingPrivateKeyPem: str, sharedItemsFederatedDomains: [], extraJson: {}, pageNumber: int, maxItemsPerPage: int, - CWlists: {}, listsEnabled: str) -> str: + CWlists: {}, listsEnabled: str, + contentLicenseUrl: str) -> str: """Show the profile page as html """ nickname = profileJson['preferredUsername'] @@ -985,7 +986,8 @@ def htmlProfile(signingPrivateKeyPem: str, getConfigParam(baseDir, 'instanceTitle') profileStr = \ htmlHeaderWithPersonMarkup(cssFilename, instanceTitle, - profileJson, city) + \ + profileJson, city, + contentLicenseUrl) + \ profileStr + htmlFooter() return profileStr diff --git a/webapp_utils.py b/webapp_utils.py index 59c395bc8..0647d899b 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -552,6 +552,7 @@ def htmlHeaderWithExternalStyle(cssFilename: str, instanceTitle: str, def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, actorJson: {}, city: str, + contentLicenseUrl: str, lang='en') -> str: """html header which includes person markup https://schema.org/Person @@ -665,7 +666,6 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, ' "url": "' + actorJson['id'] + '"\n' + \ ' },\n' - licenseUrl = 'https://creativecommons.org/licenses/by/4.0' profileMarkup = \ ' \n' @@ -798,7 +798,8 @@ def htmlHeaderWithBlogMarkup(cssFilename: str, instanceTitle: str, systemLanguage: str, published: str, modified: str, title: str, snippet: str, - translate: {}, url: str) -> str: + translate: {}, url: str, + contentLicenseUrl: str) -> str: """html header which includes blog post markup https://schema.org/BlogPosting """ @@ -807,7 +808,6 @@ def htmlHeaderWithBlogMarkup(cssFilename: str, instanceTitle: str, # license for content on the site may be different from # the software license - contentLicenseUrl = 'https://creativecommons.org/licenses/by/3.0' blogMarkup = \ '