mirror of https://gitlab.com/bashrc2/epicyon
Masto api account
parent
7422c4f860
commit
0ff65b483a
45
daemon.py
45
daemon.py
|
@ -25,6 +25,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 metadata import metaDataInstance
|
from metadata import metaDataInstance
|
||||||
from metadata import metaDataNodeInfo
|
from metadata import metaDataNodeInfo
|
||||||
from pgp import getEmailAddress
|
from pgp import getEmailAddress
|
||||||
|
@ -781,17 +782,37 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _mastoApiV1(self, callingDomain: str, authorized: bool) -> bool:
|
def _mastoApiV1(self, path: str, callingDomain: str,
|
||||||
|
authorized: bool,
|
||||||
|
baseDir: str, nickname: str, domain: str) -> bool:
|
||||||
"""This is a vestigil mastodon API for the purpose
|
"""This is a vestigil mastodon API for the purpose
|
||||||
of returning an empty result to sites like
|
of returning an empty result to sites like
|
||||||
https://mastopeek.app-dist.eu
|
https://mastopeek.app-dist.eu
|
||||||
"""
|
"""
|
||||||
if not self.path.startswith('/api/v1/'):
|
if not path.startswith('/api/v1/'):
|
||||||
return False
|
return False
|
||||||
if self.server.debug:
|
if self.server.debug:
|
||||||
print('DEBUG: mastodon api v1 ' + self.path)
|
print('DEBUG: mastodon api v1 ' + path)
|
||||||
|
if authorized and nickname:
|
||||||
|
if path == '/api/v1/accounts/:id':
|
||||||
|
acctJson = getMastoApiV1Account(baseDir, nickname, domain)
|
||||||
|
msg = json.dumps(instanceJson).encode('utf-8')
|
||||||
|
msglen = len(msg)
|
||||||
|
if self._hasAccept(callingDomain):
|
||||||
|
if 'application/ld+json' in self.headers['Accept']:
|
||||||
|
self._set_headers('application/ld+json', msglen,
|
||||||
|
None, callingDomain)
|
||||||
|
else:
|
||||||
|
self._set_headers('application/json', msglen,
|
||||||
|
None, callingDomain)
|
||||||
|
else:
|
||||||
|
self._set_headers('application/ld+json', msglen,
|
||||||
|
None, callingDomain)
|
||||||
|
self._write(msg)
|
||||||
|
print('masto API account sent for ' + nickname)
|
||||||
|
return True
|
||||||
adminNickname = getConfigParam(self.server.baseDir, 'admin')
|
adminNickname = getConfigParam(self.server.baseDir, 'admin')
|
||||||
if adminNickname and self.path == '/api/v1/instance':
|
if adminNickname and path == '/api/v1/instance':
|
||||||
instanceDescriptionShort = \
|
instanceDescriptionShort = \
|
||||||
getConfigParam(self.server.baseDir,
|
getConfigParam(self.server.baseDir,
|
||||||
'instanceDescriptionShort')
|
'instanceDescriptionShort')
|
||||||
|
@ -829,7 +850,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self._write(msg)
|
self._write(msg)
|
||||||
print('instance metadata sent')
|
print('instance metadata sent')
|
||||||
return True
|
return True
|
||||||
if self.path.startswith('/api/v1/instance/peers'):
|
if path.startswith('/api/v1/instance/peers'):
|
||||||
# This is just a dummy result.
|
# This is just a dummy result.
|
||||||
# Showing the full list of peers would have privacy implications.
|
# Showing the full list of peers would have privacy implications.
|
||||||
# On a large instance you are somewhat lost in the crowd, but on
|
# On a large instance you are somewhat lost in the crowd, but on
|
||||||
|
@ -851,7 +872,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self._write(msg)
|
self._write(msg)
|
||||||
print('instance peers metadata sent')
|
print('instance peers metadata sent')
|
||||||
return True
|
return True
|
||||||
if self.path.startswith('/api/v1/instance/activity'):
|
if path.startswith('/api/v1/instance/activity'):
|
||||||
# This is just a dummy result.
|
# This is just a dummy result.
|
||||||
msg = json.dumps([]).encode('utf-8')
|
msg = json.dumps([]).encode('utf-8')
|
||||||
msglen = len(msg)
|
msglen = len(msg)
|
||||||
|
@ -871,8 +892,11 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self._404()
|
self._404()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _mastoApi(self, callingDomain: str, authorized: bool) -> bool:
|
def _mastoApi(self, path: str, callingDomain: str,
|
||||||
return self._mastoApiV1(callingDomain, authorized)
|
authorized: bool,
|
||||||
|
baseDir: str, nickname: str, domain: str) -> bool:
|
||||||
|
return self._mastoApiV1(path, callingDomain, authorized,
|
||||||
|
baseDir, nickname, domain)
|
||||||
|
|
||||||
def _nodeinfo(self, callingDomain: str) -> bool:
|
def _nodeinfo(self, callingDomain: str) -> bool:
|
||||||
if not self.path.startswith('/nodeinfo/2.0'):
|
if not self.path.startswith('/nodeinfo/2.0'):
|
||||||
|
@ -9892,7 +9916,10 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
'show logout', 'isAuthorized')
|
'show logout', 'isAuthorized')
|
||||||
|
|
||||||
# minimal mastodon api
|
# minimal mastodon api
|
||||||
if self._mastoApi(callingDomain, authorized):
|
if self._mastoApi(self.path, callingDomain, authorized,
|
||||||
|
self.server.baseDir,
|
||||||
|
self.authorizedNickname,
|
||||||
|
self.server.domain):
|
||||||
return
|
return
|
||||||
|
|
||||||
self._benchmarkGETtimings(GETstartTime, GETtimings,
|
self._benchmarkGETtimings(GETstartTime, GETtimings,
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
__filename__ = "mastoapiv1.py"
|
||||||
|
__author__ = "Bob Mottram"
|
||||||
|
__license__ = "AGPL3+"
|
||||||
|
__version__ = "1.1.0"
|
||||||
|
__maintainer__ = "Bob Mottram"
|
||||||
|
__email__ = "bob@freedombone.net"
|
||||||
|
__status__ = "Production"
|
||||||
|
|
||||||
|
import os
|
||||||
|
from utils import loadJson
|
||||||
|
|
||||||
|
|
||||||
|
def getMastoApiV1Account(baseDir: str, nickname: str, domain: str) -> {}:
|
||||||
|
"""See https://github.com/McKael/mastodon-documentation/
|
||||||
|
blob/master/Using-the-API/API.md#account
|
||||||
|
Authorization has already been performed
|
||||||
|
"""
|
||||||
|
accountFilename = \
|
||||||
|
baseDir + '/accounts/' + nickname + '@' + domain + '.json'
|
||||||
|
if not os.path.isfile(accountFilename):
|
||||||
|
return {}
|
||||||
|
accountJson = loadJson(accountFilename)
|
||||||
|
if not accountJson:
|
||||||
|
return {}
|
||||||
|
mastoAccountJson = {
|
||||||
|
"id": accountJson['id'],
|
||||||
|
"username": nickname,
|
||||||
|
"acct": nickname,
|
||||||
|
"display_name": accountJson['preferredUsername'],
|
||||||
|
"locked": accountJson['manuallyApprovesFollowers'],
|
||||||
|
# "created_at": "",
|
||||||
|
"followers_count": 0,
|
||||||
|
"following_count": 0,
|
||||||
|
"statuses_count": 0,
|
||||||
|
"note": accountJson['summary'],
|
||||||
|
"url": accountJson['id'],
|
||||||
|
"avatar": accountJson['icon']['url'],
|
||||||
|
"avatar_static": accountJson['icon']['url'],
|
||||||
|
"header": accountJson['image']['url'],
|
||||||
|
"header_static": accountJson['image']['url']
|
||||||
|
}
|
||||||
|
return mastoAccountJson
|
Loading…
Reference in New Issue