153 lines
7.3 KiB
Markdown
153 lines
7.3 KiB
Markdown
# Sw1tch: Matrix Registration and Admin System for Conduwuit
|
||
|
||
`Sw1tch` is a FastAPI-based web application designed to enhance the `conduwuit` Matrix homeserver by addressing key shortcomings for public deployments. It manages account registration with email-based token requests and provides an admin API by relaying HTTP requests to a Matrix admin room, parsing responses for automation. Currently in use for the [We2.ee](https://we2.ee/about) homeserver at [join.we2.ee](https://join.we2.ee).
|
||
|
||
This project is specifically built around `conduwuit`, an excellent Matrix homeserver that lacks native SMTP authentication and a robust admin API—issues `sw1tch` resolves elegantly.
|
||
|
||
## Features
|
||
|
||
- Daily rotating registration tokens, emailed upon request
|
||
- Email-based registration requiring a valid address
|
||
- Rate limiting per email address
|
||
- IP, email, and regex-based username banning
|
||
- Automatic downtime before token rotation
|
||
- Admin API via Matrix room message relaying
|
||
- Warrant canary generation and posting (work in progress)
|
||
- Gruvbox-themed, responsive UI
|
||
|
||
## Setup
|
||
|
||
1. **Clone the Repository**:
|
||
```bash
|
||
git clone https://sij.ai/sij/hand_of_morpheus
|
||
cd hand_of_morpheus
|
||
```
|
||
|
||
2. **Install Dependencies**:
|
||
```bash
|
||
pip install fastapi uvicorn jinja2 httpx pyyaml python-multipart nio requests feedparser urllib3 smtplib
|
||
```
|
||
|
||
3. **Set Up Configuration**:
|
||
```bash
|
||
cp -r ./sw1tch/example-config ./sw1tch/config
|
||
nano sw1tch/config/config.yaml
|
||
```
|
||
- `config.yaml`: Fill in credentials and options for registration, Matrix admin, canary, and SMTP.
|
||
- `conduwuit.env`: Add `conduwuit` settings (see [Conduwuit Config Examples](https://conduwuit.puppyirl.gay/configuration/examples.html)).
|
||
- `banned_emails.txt`: Prefilled with disposable email providers linked to spam/abuse.
|
||
- `banned_usernames.txt`: Prefilled with regex patterns targeting CSAM-related usernames.
|
||
- `banned_ips.txt`: Blank; add IPs to block token requests.
|
||
- `attestations.txt`: Generic statements for the warrant canary; customize as needed.
|
||
|
||
4. **Add Static Assets**:
|
||
```bash
|
||
# Add your logo and favicon to the static directory
|
||
cp your-logo.png sw1tch/static/logo.png
|
||
cp your-favicon.ico sw1tch/static/favicon.ico
|
||
```
|
||
|
||
5. **Generate Initial Registration Token**:
|
||
```bash
|
||
openssl rand -hex 16 > sw1tch/data/.registration_token
|
||
```
|
||
|
||
6. **Configure `launch.sh`**:
|
||
- `launch.sh` manages token rotation, `conduwuit` container updates, and ensures the `sw1tch` service runs:
|
||
- Updates the `conduwuit` Docker image from a Nix-built repository.
|
||
- Refreshes the registration token and restarts the container.
|
||
- Starts or restarts the `sw1tch` FastAPI service.
|
||
```bash
|
||
nano launch.sh # Adjust paths (e.g., BASE_PATH, REPO_PATH) for your environment
|
||
chmod +x launch.sh
|
||
```
|
||
|
||
7. **Set Up Cron Jobs**:
|
||
```bash
|
||
crontab -e
|
||
```
|
||
Add:
|
||
```bash
|
||
# Daily token refresh and container restart at midnight UTC
|
||
0 0 * * * cd /home/sij/hand_of_morpheus && ./launch.sh --refresh-token > /home/sij/hand_of_morpheus/logs/token_refresh.log 2>&1
|
||
|
||
# Weekly conduwuit update (Sundays at 2 AM UTC)
|
||
0 2 * * 0 cd /home/sij/hand_of_morpheus && ./launch.sh --update --force-restart > /home/sij/hand_of_morpheus/logs/update.log 2>&1
|
||
|
||
# Ensure service runs after reboot
|
||
@reboot cd /home/sij/hand_of_morpheus && ./launch.sh > /home/sij/hand_of_morpheus/logs/reboot.log 2>&1
|
||
```
|
||
|
||
## Running the Server
|
||
|
||
Run manually:
|
||
```bash
|
||
./launch.sh # --refresh-token, --super-admin, --update, and/or --force-restart
|
||
```
|
||
|
||
### launch.sh Command line flags
|
||
|
||
1. **`--refresh-token`**:
|
||
- **Purpose**: Generates a new, random 6-character hexadecimal registration token and writes it to `sw1tch/data/.registration_token`.
|
||
- **Behavior**: Overwrites the existing token, logs the new value, and exits on failure (e.g., if the file isn’t writable).
|
||
- **When to Use**:
|
||
- Daily via cron (e.g., at midnight UTC) to rotate tokens as a security measure.
|
||
- Manually if you suspect the current token has been compromised.
|
||
- **Example**: `./launch.sh --refresh-token`
|
||
|
||
2. **`--super-admin`**:
|
||
- **Purpose**: Generates a random 16-character emergency password for the `@conduit` user in `conduwuit` and passes it to the container via `CONDUWUIT_EMERGENCY_PASSWORD`.
|
||
- **Behavior**: Logs the username (`@conduit:we2.ee`) and password, which you can use to log in and regain admin access.
|
||
- **When to Use**:
|
||
- During initial setup to establish admin access.
|
||
- If you lose access to the admin account and need to recover it.
|
||
- **Example**: `./launch.sh --super-admin`
|
||
|
||
3. **`--update`**:
|
||
- **Purpose**: Updates the `conduwuit` Docker image by pulling the latest source from `REPO_PATH`, building it with Nix, and tagging it as `conduwuit:custom`.
|
||
- **Behavior**: Requires Git and Nix; exits on failure (e.g., if the build fails or no image is produced).
|
||
- **When to Use**:
|
||
- Weekly via cron to keep `conduwuit` up-to-date with the latest features or fixes.
|
||
- Manually when you want to apply a specific update.
|
||
- **Example**: `./launch.sh --update`
|
||
|
||
4. **`--force-restart`**:
|
||
- **Purpose**: Forces the `sw1tch` registration service to restart by killing any process on the configured port (from `config.yaml`) and starting a new instance.
|
||
- **Behavior**: Removes the PID file, starts `python3 -m sw1tch` detached, and verifies it’s running; logs errors if it fails to start.
|
||
- **When to Use**:
|
||
- After updating `sw1tch` code or configuration to ensure changes take effect.
|
||
- If the service is unresponsive or stuck.
|
||
- Combined with `--update` to refresh everything.
|
||
- **Example**: `./launch.sh --force-restart`
|
||
|
||
### Additional Notes
|
||
- **Combination**: Flags can be combined (e.g., `./launch.sh --update --force-restart`) for comprehensive updates.
|
||
- **Default Behavior**: Without flags, the script restarts the `conduwuit` container and ensures `sw1tch` is running (no forced restart).
|
||
- **Cron Integration**: The comments align with your crontab (daily `--refresh-token`, weekly `--update --force-restart`, reboot startup).
|
||
|
||
## Security Features
|
||
|
||
- **IP Banning**: Add IPs to `sw1tch/config/banned_ips.txt`.
|
||
- **Email Banning**: Add emails to `sw1tch/config/banned_emails.txt`.
|
||
- **Username Patterns**: Add regex to `sw1tch/config/banned_usernames.txt`.
|
||
- **Registration Tracking**: Logged to `sw1tch/data/registrations.json`.
|
||
- **Admin API**: Relays HTTP requests to `#admins` room, parsing responses.
|
||
|
||
## Security Notes
|
||
|
||
- Use a reverse proxy (e.g., Nginx) with HTTPS.
|
||
- Move `.registration_token` outside the web root if exposed.
|
||
- Backup `sw1tch/data/registrations.json` regularly.
|
||
- Monitor `sw1tch/logs/registration.log` for abuse.
|
||
|
||
## Warrant Canary
|
||
|
||
The warrant canary feature (in progress) generates signed statements posted to a Matrix room, using data from RSS feeds and Bitcoin blocks for freshness. Configure in `config.yaml` under `canary`. Current limitations include UI polish and broader testing.
|
||
|
||
## Conduwuit Integration
|
||
|
||
`Sw1tch` resolves two `conduwuit` shortcomings:
|
||
1. **Email-Based Registration**: Requires a valid email for token requests, enhancing security for public homeservers.
|
||
2. **Admin API**: Bridges HTTP requests to Matrix room messages, enabling automation by parsing `@conduit` responses.
|
||
|
||
Review `launch.sh` for `conduwuit` container management settings.
|