initial commit

This commit is contained in:
Kay Faraday 2023-09-21 07:23:34 +00:00
commit 86f2346165
5 changed files with 78 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.venv/
__pycache__/

8
fingerd.example.toml Normal file
View File

@ -0,0 +1,8 @@
instance_name = 'freak.university'
[db]
# Accepts all parameters accepted by https://magicstack.github.io/asyncpg/current/api/index.html#connection.
# Or leave this section blank to use the defaults.
username='mastodon'
password='...'
database='...'

64
fingerd.py Executable file
View File

@ -0,0 +1,64 @@
#!/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())

2
fingerd.toml Normal file
View File

@ -0,0 +1,2 @@
instance_name = 'freak.university'
[db]

2
requirements.txt Normal file
View File

@ -0,0 +1,2 @@
asyncpg ~= 0.28.0
qtoml ~= 0.3.1