mirror of https://gitlab.com/bashrc2/epicyon
Move mastodon API response out of daemon
parent
ec7f86394c
commit
a9f7d38513
131
daemon.py
131
daemon.py
|
@ -24,10 +24,7 @@ from webfinger import webfingerMeta
|
||||||
from webfinger import webfingerNodeInfo
|
from webfinger import webfingerNodeInfo
|
||||||
from webfinger import webfingerLookup
|
from webfinger import webfingerLookup
|
||||||
from webfinger import webfingerUpdate
|
from webfinger import webfingerUpdate
|
||||||
from mastoapiv1 import getMastoApiV1Account
|
from mastoapiv1 import mastoApiV1Response
|
||||||
from mastoapiv1 import getMastApiV1Id
|
|
||||||
from mastoapiv1 import getNicknameFromMastoApiV1Id
|
|
||||||
from metadata import metaDataInstance
|
|
||||||
from metadata import metaDataNodeInfo
|
from metadata import metaDataNodeInfo
|
||||||
from metadata import metadataCustomEmoji
|
from metadata import metadataCustomEmoji
|
||||||
from pgp import getEmailAddress
|
from pgp import getEmailAddress
|
||||||
|
@ -805,6 +802,8 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _hasAccept(self, callingDomain: str) -> bool:
|
def _hasAccept(self, callingDomain: str) -> bool:
|
||||||
|
"""Do the http headers have an Accept field?
|
||||||
|
"""
|
||||||
if self.headers.get('Accept') or callingDomain.endswith('.b32.i2p'):
|
if self.headers.get('Accept') or callingDomain.endswith('.b32.i2p'):
|
||||||
if not self.headers.get('Accept'):
|
if not self.headers.get('Accept'):
|
||||||
self.headers['Accept'] = \
|
self.headers['Accept'] = \
|
||||||
|
@ -835,123 +834,23 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
print('mastodon api v1: authorized ' + str(authorized))
|
print('mastodon api v1: authorized ' + str(authorized))
|
||||||
print('mastodon api v1: nickname ' + str(nickname))
|
print('mastodon api v1: nickname ' + str(nickname))
|
||||||
|
|
||||||
sendJson = None
|
brochMode = brochModeIsActive(baseDir)
|
||||||
sendJsonStr = ''
|
sendJson, sendJsonStr = mastoApiV1Response(path,
|
||||||
|
callingDomain,
|
||||||
# parts of the api needing authorization
|
authorized,
|
||||||
if authorized and nickname:
|
|
||||||
if path == '/api/v1/accounts/verify_credentials':
|
|
||||||
sendJson = getMastoApiV1Account(baseDir, nickname, domain)
|
|
||||||
sendJsonStr = 'masto API account sent for ' + nickname
|
|
||||||
|
|
||||||
# Parts of the api which don't need authorization
|
|
||||||
mastoId = getMastApiV1Id(path)
|
|
||||||
if mastoId is not None:
|
|
||||||
pathNickname = getNicknameFromMastoApiV1Id(mastoId)
|
|
||||||
if pathNickname:
|
|
||||||
originalPath = path
|
|
||||||
if '/followers?' in path or \
|
|
||||||
'/following?' in path or \
|
|
||||||
'/search?' in path or \
|
|
||||||
'/relationships?' in path or \
|
|
||||||
'/statuses?' in path:
|
|
||||||
path = path.split('?')[0]
|
|
||||||
if path.endswith('/followers'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API followers sent for ' + nickname
|
|
||||||
elif path.endswith('/following'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API following sent for ' + nickname
|
|
||||||
elif path.endswith('/statuses'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API statuses sent for ' + nickname
|
|
||||||
elif path.endswith('/search'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API search sent ' + originalPath
|
|
||||||
elif path.endswith('/relationships'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = \
|
|
||||||
'masto API relationships sent ' + originalPath
|
|
||||||
else:
|
|
||||||
sendJson = \
|
|
||||||
getMastoApiV1Account(baseDir, pathNickname, domain)
|
|
||||||
sendJsonStr = 'masto API account sent for ' + nickname
|
|
||||||
|
|
||||||
if path.startswith('/api/v1/blocks'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API instance blocks sent'
|
|
||||||
elif path.startswith('/api/v1/favorites'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API favorites sent'
|
|
||||||
elif path.startswith('/api/v1/follow_requests'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API follow requests sent'
|
|
||||||
elif path.startswith('/api/v1/mutes'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API mutes sent'
|
|
||||||
elif path.startswith('/api/v1/notifications'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API notifications sent'
|
|
||||||
elif path.startswith('/api/v1/reports'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API reports sent'
|
|
||||||
elif path.startswith('/api/v1/statuses'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API statuses sent'
|
|
||||||
elif path.startswith('/api/v1/timelines'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API timelines sent'
|
|
||||||
elif path.startswith('/api/v1/custom_emojis'):
|
|
||||||
sendJson = customEmoji
|
|
||||||
sendJsonStr = 'masto API custom emojis sent'
|
|
||||||
|
|
||||||
adminNickname = getConfigParam(baseDir, 'admin')
|
|
||||||
if adminNickname and path == '/api/v1/instance':
|
|
||||||
instanceDescriptionShort = \
|
|
||||||
getConfigParam(baseDir,
|
|
||||||
'instanceDescriptionShort')
|
|
||||||
if not instanceDescriptionShort:
|
|
||||||
instanceDescriptionShort = \
|
|
||||||
translate['Yet another Epicyon Instance']
|
|
||||||
instanceDescription = getConfigParam(baseDir,
|
|
||||||
'instanceDescription')
|
|
||||||
instanceTitle = getConfigParam(baseDir, 'instanceTitle')
|
|
||||||
|
|
||||||
if callingDomain.endswith('.onion') and onionDomain:
|
|
||||||
domainFull = onionDomain
|
|
||||||
httpPrefix = 'http'
|
|
||||||
elif (callingDomain.endswith('.i2p') and i2pDomain):
|
|
||||||
domainFull = i2pDomain
|
|
||||||
httpPrefix = 'http'
|
|
||||||
|
|
||||||
if brochModeIsActive(baseDir):
|
|
||||||
showNodeInfoAccounts = False
|
|
||||||
|
|
||||||
sendJson = \
|
|
||||||
metaDataInstance(showNodeInfoAccounts,
|
|
||||||
instanceTitle,
|
|
||||||
instanceDescriptionShort,
|
|
||||||
instanceDescription,
|
|
||||||
httpPrefix,
|
httpPrefix,
|
||||||
baseDir,
|
baseDir,
|
||||||
adminNickname,
|
nickname, domain,
|
||||||
domain,
|
|
||||||
domainFull,
|
domainFull,
|
||||||
|
onionDomain,
|
||||||
|
i2pDomain,
|
||||||
|
translate,
|
||||||
registration,
|
registration,
|
||||||
systemLanguage,
|
systemLanguage,
|
||||||
projectVersion)
|
projectVersion,
|
||||||
sendJsonStr = 'masto API instance metadata sent'
|
customEmoji,
|
||||||
elif path.startswith('/api/v1/instance/peers'):
|
showNodeInfoAccounts,
|
||||||
# This is just a dummy result.
|
brochMode)
|
||||||
# Showing the full list of peers would have privacy implications.
|
|
||||||
# On a large instance you are somewhat lost in the crowd, but on
|
|
||||||
# small instances a full list of peers would convey a lot of
|
|
||||||
# information about the interests of a small number of accounts
|
|
||||||
sendJson = ['mastodon.social', domainFull]
|
|
||||||
sendJsonStr = 'masto API peers metadata sent'
|
|
||||||
elif path.startswith('/api/v1/instance/activity'):
|
|
||||||
sendJson = []
|
|
||||||
sendJsonStr = 'masto API activity metadata sent'
|
|
||||||
|
|
||||||
if sendJson is not None:
|
if sendJson is not None:
|
||||||
msg = json.dumps(sendJson).encode('utf-8')
|
msg = json.dumps(sendJson).encode('utf-8')
|
||||||
|
|
143
mastoapiv1.py
143
mastoapiv1.py
|
@ -8,9 +8,11 @@ __status__ = "Production"
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from utils import loadJson
|
from utils import loadJson
|
||||||
|
from utils import getConfigParam
|
||||||
|
from metadata import metaDataInstance
|
||||||
|
|
||||||
|
|
||||||
def getMastApiV1Id(path: str) -> int:
|
def _getMastApiV1Id(path: str) -> int:
|
||||||
"""Extracts the mastodon Id number from the given path
|
"""Extracts the mastodon Id number from the given path
|
||||||
"""
|
"""
|
||||||
mastoId = None
|
mastoId = None
|
||||||
|
@ -46,7 +48,7 @@ def getNicknameFromMastoApiV1Id(mastoId: int) -> str:
|
||||||
return nickname[::-1]
|
return nickname[::-1]
|
||||||
|
|
||||||
|
|
||||||
def getMastoApiV1Account(baseDir: str, nickname: str, domain: str) -> {}:
|
def _getMastoApiV1Account(baseDir: str, nickname: str, domain: str) -> {}:
|
||||||
"""See https://github.com/McKael/mastodon-documentation/
|
"""See https://github.com/McKael/mastodon-documentation/
|
||||||
blob/master/Using-the-API/API.md#account
|
blob/master/Using-the-API/API.md#account
|
||||||
Authorization has already been performed
|
Authorization has already been performed
|
||||||
|
@ -76,3 +78,140 @@ def getMastoApiV1Account(baseDir: str, nickname: str, domain: str) -> {}:
|
||||||
"header_static": accountJson['image']['url']
|
"header_static": accountJson['image']['url']
|
||||||
}
|
}
|
||||||
return mastoAccountJson
|
return mastoAccountJson
|
||||||
|
|
||||||
|
|
||||||
|
def mastoApiV1Response(path: str, callingDomain: str,
|
||||||
|
authorized: bool,
|
||||||
|
httpPrefix: str,
|
||||||
|
baseDir: str, nickname: str, domain: str,
|
||||||
|
domainFull: str,
|
||||||
|
onionDomain: str, i2pDomain: str,
|
||||||
|
translate: {},
|
||||||
|
registration: bool,
|
||||||
|
systemLanguage: str,
|
||||||
|
projectVersion: str,
|
||||||
|
customEmoji: [],
|
||||||
|
showNodeInfoAccounts: bool,
|
||||||
|
brochMode: bool) -> ({}, str):
|
||||||
|
"""This is a vestigil mastodon API for the purpose
|
||||||
|
of returning an empty result to sites like
|
||||||
|
https://mastopeek.app-dist.eu
|
||||||
|
"""
|
||||||
|
sendJson = None
|
||||||
|
sendJsonStr = ''
|
||||||
|
|
||||||
|
# parts of the api needing authorization
|
||||||
|
if authorized and nickname:
|
||||||
|
if path == '/api/v1/accounts/verify_credentials':
|
||||||
|
sendJson = _getMastoApiV1Account(baseDir, nickname, domain)
|
||||||
|
sendJsonStr = 'masto API account sent for ' + nickname
|
||||||
|
|
||||||
|
# Parts of the api which don't need authorization
|
||||||
|
mastoId = _getMastApiV1Id(path)
|
||||||
|
if mastoId is not None:
|
||||||
|
pathNickname = getNicknameFromMastoApiV1Id(mastoId)
|
||||||
|
if pathNickname:
|
||||||
|
originalPath = path
|
||||||
|
if '/followers?' in path or \
|
||||||
|
'/following?' in path or \
|
||||||
|
'/search?' in path or \
|
||||||
|
'/relationships?' in path or \
|
||||||
|
'/statuses?' in path:
|
||||||
|
path = path.split('?')[0]
|
||||||
|
if path.endswith('/followers'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API followers sent for ' + nickname
|
||||||
|
elif path.endswith('/following'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API following sent for ' + nickname
|
||||||
|
elif path.endswith('/statuses'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API statuses sent for ' + nickname
|
||||||
|
elif path.endswith('/search'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API search sent ' + originalPath
|
||||||
|
elif path.endswith('/relationships'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = \
|
||||||
|
'masto API relationships sent ' + originalPath
|
||||||
|
else:
|
||||||
|
sendJson = \
|
||||||
|
_getMastoApiV1Account(baseDir, pathNickname, domain)
|
||||||
|
sendJsonStr = 'masto API account sent for ' + nickname
|
||||||
|
|
||||||
|
if path.startswith('/api/v1/blocks'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API instance blocks sent'
|
||||||
|
elif path.startswith('/api/v1/favorites'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API favorites sent'
|
||||||
|
elif path.startswith('/api/v1/follow_requests'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API follow requests sent'
|
||||||
|
elif path.startswith('/api/v1/mutes'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API mutes sent'
|
||||||
|
elif path.startswith('/api/v1/notifications'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API notifications sent'
|
||||||
|
elif path.startswith('/api/v1/reports'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API reports sent'
|
||||||
|
elif path.startswith('/api/v1/statuses'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API statuses sent'
|
||||||
|
elif path.startswith('/api/v1/timelines'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API timelines sent'
|
||||||
|
elif path.startswith('/api/v1/custom_emojis'):
|
||||||
|
sendJson = customEmoji
|
||||||
|
sendJsonStr = 'masto API custom emojis sent'
|
||||||
|
|
||||||
|
adminNickname = getConfigParam(baseDir, 'admin')
|
||||||
|
if adminNickname and path == '/api/v1/instance':
|
||||||
|
instanceDescriptionShort = \
|
||||||
|
getConfigParam(baseDir,
|
||||||
|
'instanceDescriptionShort')
|
||||||
|
if not instanceDescriptionShort:
|
||||||
|
instanceDescriptionShort = \
|
||||||
|
translate['Yet another Epicyon Instance']
|
||||||
|
instanceDescription = getConfigParam(baseDir,
|
||||||
|
'instanceDescription')
|
||||||
|
instanceTitle = getConfigParam(baseDir, 'instanceTitle')
|
||||||
|
|
||||||
|
if callingDomain.endswith('.onion') and onionDomain:
|
||||||
|
domainFull = onionDomain
|
||||||
|
httpPrefix = 'http'
|
||||||
|
elif (callingDomain.endswith('.i2p') and i2pDomain):
|
||||||
|
domainFull = i2pDomain
|
||||||
|
httpPrefix = 'http'
|
||||||
|
|
||||||
|
if brochMode:
|
||||||
|
showNodeInfoAccounts = False
|
||||||
|
|
||||||
|
sendJson = \
|
||||||
|
metaDataInstance(showNodeInfoAccounts,
|
||||||
|
instanceTitle,
|
||||||
|
instanceDescriptionShort,
|
||||||
|
instanceDescription,
|
||||||
|
httpPrefix,
|
||||||
|
baseDir,
|
||||||
|
adminNickname,
|
||||||
|
domain,
|
||||||
|
domainFull,
|
||||||
|
registration,
|
||||||
|
systemLanguage,
|
||||||
|
projectVersion)
|
||||||
|
sendJsonStr = 'masto API instance metadata sent'
|
||||||
|
elif path.startswith('/api/v1/instance/peers'):
|
||||||
|
# This is just a dummy result.
|
||||||
|
# Showing the full list of peers would have privacy implications.
|
||||||
|
# On a large instance you are somewhat lost in the crowd, but on
|
||||||
|
# small instances a full list of peers would convey a lot of
|
||||||
|
# information about the interests of a small number of accounts
|
||||||
|
sendJson = ['mastodon.social', domainFull]
|
||||||
|
sendJsonStr = 'masto API peers metadata sent'
|
||||||
|
elif path.startswith('/api/v1/instance/activity'):
|
||||||
|
sendJson = []
|
||||||
|
sendJsonStr = 'masto API activity metadata sent'
|
||||||
|
return sendJson, sendJsonStr
|
||||||
|
|
Loading…
Reference in New Issue