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 webfingerLookup
 | 
			
		||||
from webfinger import webfingerUpdate
 | 
			
		||||
from mastoapiv1 import getMastoApiV1Account
 | 
			
		||||
from metadata import metaDataInstance
 | 
			
		||||
from metadata import metaDataNodeInfo
 | 
			
		||||
from pgp import getEmailAddress
 | 
			
		||||
| 
						 | 
				
			
			@ -781,17 +782,37 @@ class PubServer(BaseHTTPRequestHandler):
 | 
			
		|||
            return True
 | 
			
		||||
        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
 | 
			
		||||
        of returning an empty result to sites like
 | 
			
		||||
        https://mastopeek.app-dist.eu
 | 
			
		||||
        """
 | 
			
		||||
        if not self.path.startswith('/api/v1/'):
 | 
			
		||||
        if not path.startswith('/api/v1/'):
 | 
			
		||||
            return False
 | 
			
		||||
        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')
 | 
			
		||||
        if adminNickname and self.path == '/api/v1/instance':
 | 
			
		||||
        if adminNickname and path == '/api/v1/instance':
 | 
			
		||||
            instanceDescriptionShort = \
 | 
			
		||||
                getConfigParam(self.server.baseDir,
 | 
			
		||||
                               'instanceDescriptionShort')
 | 
			
		||||
| 
						 | 
				
			
			@ -829,7 +850,7 @@ class PubServer(BaseHTTPRequestHandler):
 | 
			
		|||
            self._write(msg)
 | 
			
		||||
            print('instance metadata sent')
 | 
			
		||||
            return True
 | 
			
		||||
        if self.path.startswith('/api/v1/instance/peers'):
 | 
			
		||||
        if 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
 | 
			
		||||
| 
						 | 
				
			
			@ -851,7 +872,7 @@ class PubServer(BaseHTTPRequestHandler):
 | 
			
		|||
            self._write(msg)
 | 
			
		||||
            print('instance peers metadata sent')
 | 
			
		||||
            return True
 | 
			
		||||
        if self.path.startswith('/api/v1/instance/activity'):
 | 
			
		||||
        if path.startswith('/api/v1/instance/activity'):
 | 
			
		||||
            # This is just a dummy result.
 | 
			
		||||
            msg = json.dumps([]).encode('utf-8')
 | 
			
		||||
            msglen = len(msg)
 | 
			
		||||
| 
						 | 
				
			
			@ -871,8 +892,11 @@ class PubServer(BaseHTTPRequestHandler):
 | 
			
		|||
        self._404()
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
    def _mastoApi(self, callingDomain: str, authorized: bool) -> bool:
 | 
			
		||||
        return self._mastoApiV1(callingDomain, authorized)
 | 
			
		||||
    def _mastoApi(self, path: str, callingDomain: str,
 | 
			
		||||
                  authorized: bool,
 | 
			
		||||
                  baseDir: str, nickname: str, domain: str) -> bool:
 | 
			
		||||
        return self._mastoApiV1(path, callingDomain, authorized,
 | 
			
		||||
                                baseDir, nickname, domain)
 | 
			
		||||
 | 
			
		||||
    def _nodeinfo(self, callingDomain: str) -> bool:
 | 
			
		||||
        if not self.path.startswith('/nodeinfo/2.0'):
 | 
			
		||||
| 
						 | 
				
			
			@ -9892,7 +9916,10 @@ class PubServer(BaseHTTPRequestHandler):
 | 
			
		|||
                                  'show logout', 'isAuthorized')
 | 
			
		||||
 | 
			
		||||
        # minimal mastodon api
 | 
			
		||||
        if self._mastoApi(callingDomain, authorized):
 | 
			
		||||
        if self._mastoApi(self.path, callingDomain, authorized,
 | 
			
		||||
                          self.server.baseDir,
 | 
			
		||||
                          self.authorizedNickname,
 | 
			
		||||
                          self.server.domain):
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        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