This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
mastodon-fingerd/fingerd.py

65 lines
1.5 KiB
Python
Executable File

#!/usr/bin/env python
import os
import asyncio
import asyncpg
import qtoml as toml
from contextvars import ContextVar
FINGER_PORT = 79
MASTODON_USERNAME_MAX_LENGTH = 30
db = ContextVar('db')
with open('fingerd.toml') as f:
config = toml.load(f)
async def handle_finger(reader, writer):
try:
data = await reader.read(
len('@') * 2
+ MASTODON_USERNAME_MAX_LENGTH
+ len(config['instance_name'])
)
handle = data.decode().rstrip()
username = handle.removeprefix('@').removesuffix('@' + config['instance_name'])
if '@' in username:
writer.write(b'Error: user must be local to this instance\n')
writer.write(username.encode())
writer.write(b'\n')
writer.write(config['instance_name'].encode())
writer.write(b'\n')
return
resp = await db.get().fetchval(
'SELECT note FROM accounts WHERE username = $1 AND domain IS NULL',
username,
)
if resp is None:
writer.write(b'Error: user not found\n')
return
writer.write(resp.encode())
writer.write(b'\n')
finally:
print('running cleanup')
await writer.drain()
writer.close()
await writer.wait_closed()
async def main():
db.set(await asyncpg.create_pool(**config['db']))
async with await asyncio.start_server(
handle_finger,
'0.0.0.0',
os.getenv('PORT', FINGER_PORT),
) as server:
addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
print(f'Serving on {addrs}')
await server.serve_forever()
if __name__ == '__main__':
asyncio.run(main())