# ANetBBS — production runtime dependencies
# Curated list. Use `pip install -e .` to install this plus the package metadata in setup.py.

# Core
bcrypt>=4.0.0
python-dotenv>=1.0.0

# Web framework (Flask app)
Flask>=3.1.0
Flask-Login>=0.6.3
Flask-SocketIO>=5.5.0
Flask-WTF>=1.2.0
Flask-SQLAlchemy>=3.1.0
Flask-Migrate>=4.0.0
WTForms>=3.1.0
Werkzeug>=3.0.0
Jinja2>=3.1.0
itsdangerous>=2.2.0
click>=8.1.0
blinker>=1.9.0
MarkupSafe>=3.0.0

# Database
SQLAlchemy>=2.0.0
alembic>=1.13.0
Mako>=1.3.0
greenlet>=3.0.0

# WebSocket transport (Flask-SocketIO + eventlet worker for Gunicorn).
# Gunicorn 25 deprecates the eventlet worker, but the documented
# replacement (gevent + gevent-websocket 0.10.1) hangs websocket
# upgrades against modern gevent. Pinned to eventlet until flask-socketio
# offers a maintained gevent path.
python-socketio>=5.10.0
python-engineio>=4.10.0
simple-websocket>=1.0.0
eventlet>=0.35.0

# SSH server
asyncssh>=2.14.0
cryptography>=42.0.0

# MRC web bridge (standalone aiohttp service)
aiohttp>=3.9.0
aiosignal>=1.3.0
multidict>=6.0.0
yarl>=1.9.0
frozenlist>=1.4.0
attrs>=23.0.0

# Production WSGI server.
# Upper-bound at <23 because gunicorn 23.0.0 stopped registering the
# eventlet worker via setuptools entry_points; a fresh install on
# Python 3.12 then dies with "Entry point ('gunicorn.workers',
# 'eventlet') not found" on first start. 22.0 ships the worker.
gunicorn>=22.0.0,<23

# Email validation + DNS (email-validator)
email-validator>=2.1.0
dnspython>=2.5.0
idna>=3.6

# Imaging (avatars / file uploads)
Pillow>=10.0.0

# HTTP client (echomail poller / general)
requests>=2.32.0
urllib3>=2.2.0
certifi>=2024.2.0
charset-normalizer>=3.3.0

# Markdown rendering for messages (graceful degradation if missing — see web_app.py)
markdown>=3.5
bleach>=6.1

# RSS / Atom parser for the in-app feed reader (anetbbs.rss.poller)
feedparser>=6.0

# FTP server (anetbbs.ftp) — serves the FileArea tree to anonymous + auth users.
pyftpdlib>=2.0.0
# pyOpenSSL is what makes pyftpdlib's TLS_FTPHandler importable; without
# it FTPS is silently disabled and AUTH TLS clients get refused on the
# control channel. Required for the FTPS path that update.sh wires up
# when FTP_TLS_CERTFILE is configured.
pyopenssl>=24.0.0

# Internet email — LMTP listener that takes mail handed off from the
# sysop's local Postfix/Exim/OpenSMTPD, and an outbound submitter that
# hands fresh mail back to the MTA at 127.0.0.1:25.
aiosmtpd>=1.4.0
aiosmtplib>=3.0.0

# Service Control Center — per-PID CPU% + memory sampling for the
# live graphs at /admin/control/. Reads /proc, no special privileges.
psutil>=5.9.0
