epicyon/metadata.py

131 lines
4.1 KiB
Python
Raw Normal View History

2020-04-03 16:59:12 +00:00
__filename__ = "metadata.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
2021-01-26 10:07:42 +00:00
__version__ = "1.2.0"
2020-04-03 16:59:12 +00:00
__maintainer__ = "Bob Mottram"
__email__ = "bob@freedombone.net"
__status__ = "Production"
2019-11-13 10:32:12 +00:00
2019-11-13 12:45:41 +00:00
import os
from utils import loadJson
from utils import noOfAccounts
2019-11-13 15:19:43 +00:00
from utils import noOfActiveAccountsMonthly
2019-11-13 10:32:12 +00:00
2020-04-03 16:59:12 +00:00
2021-05-04 09:39:15 +00:00
def metaDataNodeInfo(baseDir: str,
aboutUrl: str,
termsOfServiceUrl: str,
registration: bool, version: str,
showAccounts: bool) -> {}:
2019-11-13 10:32:12 +00:00
""" /nodeinfo/2.0 endpoint
Also see https://socialhub.activitypub.rocks/t/
fep-f1d5-nodeinfo-in-fediverse-software/1190/4
Note that there are security considerations with this. If an adversary
sees a lot of accounts and "local" posts then the instance may be
considered a higher priority target.
Also exposure of the version number and number of accounts could be
sensitive
2019-11-13 10:32:12 +00:00
"""
if showAccounts:
activeAccounts = noOfAccounts(baseDir)
activeAccountsMonthly = noOfActiveAccountsMonthly(baseDir, 1)
activeAccountsHalfYear = noOfActiveAccountsMonthly(baseDir, 6)
else:
activeAccounts = 1
activeAccountsMonthly = 1
activeAccountsHalfYear = 1
2020-04-03 16:59:12 +00:00
nodeinfo = {
2019-11-13 10:32:12 +00:00
'openRegistrations': registration,
'protocols': ['activitypub'],
'software': {
'name': 'epicyon',
'version': version
},
2021-05-04 09:39:15 +00:00
'documents': {
'about': aboutUrl,
'terms': termsOfServiceUrl
},
2019-11-13 10:32:12 +00:00
'usage': {
'localPosts': 1,
'users': {
2019-11-13 15:19:43 +00:00
'activeHalfyear': activeAccountsHalfYear,
'activeMonth': activeAccountsMonthly,
'total': activeAccounts
2019-11-13 10:32:12 +00:00
}
},
'version': '2.0'
}
return nodeinfo
2019-11-13 12:45:41 +00:00
2020-04-03 16:59:12 +00:00
def metaDataInstance(instanceTitle: str,
instanceDescriptionShort: str,
instanceDescription: str,
httpPrefix: str, baseDir: str,
adminNickname: str, domain: str, domainFull: str,
registration: bool, systemLanguage: str,
2019-11-13 12:45:41 +00:00
version: str) -> {}:
""" /api/v1/instance endpoint
"""
2020-04-03 16:59:12 +00:00
adminActorFilename = \
baseDir + '/accounts/' + adminNickname + '@' + domain + '.json'
2019-11-13 12:45:41 +00:00
if not os.path.isfile(adminActorFilename):
return {}
2020-04-03 16:59:12 +00:00
adminActor = loadJson(adminActorFilename, 0)
2019-11-13 12:45:41 +00:00
if not adminActor:
print('WARN: json load exception metaDataInstance')
2019-11-13 12:45:41 +00:00
return {}
2020-04-03 16:59:12 +00:00
isBot = False
if adminActor['type'] != 'Person':
isBot = True
url = \
httpPrefix + '://' + domainFull + '/@' + \
adminActor['preferredUsername']
2020-03-22 21:16:02 +00:00
2020-04-03 16:59:12 +00:00
instance = {
2019-11-13 12:55:37 +00:00
'approval_required': False,
2020-03-22 20:36:19 +00:00
'contact_account': {
'acct': adminActor['preferredUsername'],
'avatar': adminActor['icon']['url'],
'avatar_static': adminActor['icon']['url'],
'bot': isBot,
'created_at': '2019-07-01T10:30:00Z',
'display_name': adminActor['name'],
'emojis': [],
'fields': [],
'followers_count': 1,
'following_count': 1,
'header': adminActor['image']['url'],
'header_static': adminActor['image']['url'],
'id': '1',
'last_status_at': '2019-07-01T10:30:00Z',
'locked': adminActor['manuallyApprovesFollowers'],
2021-05-04 10:17:06 +00:00
'note': '<p>Admin of ' + domain + '</p>',
2020-03-22 20:36:19 +00:00
'statuses_count': 1,
2020-04-03 16:59:12 +00:00
'url': url,
2020-03-22 20:36:19 +00:00
'username': adminActor['preferredUsername']
2019-11-13 12:45:41 +00:00
},
'description': instanceDescription,
2021-05-04 10:17:06 +00:00
'email': 'admin@' + domain,
2019-11-13 12:45:41 +00:00
'languages': [systemLanguage],
'registrations': registration,
'short_description': instanceDescriptionShort,
'stats': {
'domain_count': 2,
2019-11-13 12:45:41 +00:00
'status_count': 1,
'user_count': noOfAccounts(baseDir)
2019-11-13 12:45:41 +00:00
},
2021-05-04 10:17:06 +00:00
'thumbnail': httpPrefix + '://' + domainFull + '/login.png',
2019-11-13 12:45:41 +00:00
'title': instanceTitle,
'uri': domainFull,
'urls': {},
'version': version
}
2020-03-22 21:16:02 +00:00
2019-11-13 12:45:41 +00:00
return instance