# 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.