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 = \ '