# SCAR Chat

A cross-platform C++20 chat application with text messaging, live video streaming, and screen sharing capabilities.

## Features

- 🔐 **Secure Authentication** - User/password with Argon2 hashing and JWT session management
- 💬 **Real-time Text Chat** - Instant messaging with online user list
- 🎥 **Live Video Streaming** - Camera feed sharing via Pipewire (Linux)
- 🖥️ **Screen Sharing** - Multi-platform screen capture (X11/Wayland/Hyprland/Windows)
- 🎨 **Modern UI** - Dark Discord-inspired Qt6 interface with grid video layout
- 🔒 **SSL/TLS** - End-to-end encrypted connections via Boost.ASIO
- 📱 **Cross-Platform** - Desktop (Linux/Windows) and Android support

## Architecture

- **Language:** C++20
- **GUI Framework:** Qt6
- **Networking:** Boost.ASIO with SSL
- **Database:** SQLite3
- **Hashing:** Argon2
- **Auth:** JWT tokens
- **Media:** FFmpeg, Pipewire, DBus portals
- **Build:** CMake 3.20+

## Project Structure

```
scar-chat7/
├── client/           # Qt6 GUI client (scarchat)
├── server/           # Boost.ASIO server (scarchat-server)
├── shared/           # Common protocol and utilities
├── dbmanager/        # Database management CLI tool
├── third_party/      # External dependencies (Argon2, JWT-CPP)
├── tests/            # Unit and integration tests
├── installer/        # WiX installer scripts
└── CMakeLists.txt    # Root build configuration
```

## Prerequisites

### Linux
```bash
# Ubuntu/Debian
sudo apt install build-essential cmake qt6-base-dev libboost-all-dev \
    libssl-dev libsqlite3-dev libpipewire-0.3-dev \
    libavcodec-dev libavformat-dev libavutil-dev

# Fedora
sudo dnf install gcc-c++ cmake qt6-qtbase-devel boost-devel \
    openssl-devel sqlite-devel pipewire-devel \
    ffmpeg-devel
```

### Windows
- Visual Studio 2022 (with C++20 support)
- CMake 3.20+
- Qt6 (install via official installer)
- Boost (via vcpkg or pre-built binaries)
- OpenSSL (via vcpkg)
- SQLite3 (via vcpkg)
- FFmpeg development libraries

### Android
- Android NDK r25+
- Qt for Android
- Android SDK with minimum API level 24

## Building

### Linux/Windows Desktop

```bash
# Configure
cmake -B build -DCMAKE_BUILD_TYPE=Release

# Build
cmake --build build --config Release

# Optional: Build only server or client
cmake -B build -DBUILD_CLIENT=OFF  # Server only
cmake -B build -DBUILD_SERVER=OFF  # Client only
```

Binaries will be in:
- `build/server/scarchat-server` - Server executable
- `build/client/scarchat` - Client executable  
- `build/dbmanager/dbmanager` - Database management tool

### Android

```bash
# Requires Qt for Android and Android NDK
cmake -B build-android \
    -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=arm64-v8a \
    -DANDROID_PLATFORM=android-24 \
    -DQt6_DIR=/path/to/Qt/6.x.x/android_arm64_v8a/lib/cmake/Qt6

cmake --build build-android
```

## Usage

### Server

```bash
# Start with default settings (looks for scarchat.db, server.pem, server.key in current directory)
./scarchat-server

# Specify custom paths
./scarchat-server --db /path/to/custom.db \
                  --cert /path/to/cert.pem \
                  --key /path/to/key.pem
```

**Server Configuration:**
- Database: `scarchat.db` (auto-created on first run)
- SSL Certificate: `server.pem` or via `--cert`
- SSL Key: `server.key` or via `--key`
- Config: `server.json` with hardcoded defaults as fallback

### Client

```bash
./scarchat
```

**Client Configuration:**
- Settings stored in `$XDG_CONFIG_HOME/scarchat/client.json` (Linux) or `%APPDATA%/scarchat/client.json` (Windows)
- Remembers last username, server IP/hostname, port, and JWT token

### Database Management

Use the `dbmanager` tool for user administration:

```bash
# Create a user
./dbmanager adduser alice password123

# Create admin with avatar
./dbmanager adduser admin adminpass /path/to/avatar.jpg
./dbmanager modifyrole admin admin

# List all users
./dbmanager list

# Search users
./dbmanager search role admin

# Fetch user details
./dbmanager fetch alice

# Modify user
./dbmanager modifypass alice newpassword
./dbmanager modifyemail alice alice@example.com
```

See `dbmanager/README.md` for complete documentation.

## Database Schema

The `scarchat.db` SQLite database contains:

```sql
CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    password TEXT NOT NULL,      -- Argon2 hash
    salt TEXT NOT NULL,
    token TEXT,                   -- JWT session token
    status TEXT DEFAULT 'offline',
    role TEXT,                    -- Optional
    email TEXT,                   -- Optional
    last_login INTEGER,           -- Unix timestamp
    avatar_pic BLOB               -- Optional
);
```

## Security Model

1. **Client → Server Login:**
   - Client sends username + plaintext password over SSL
   - Server fetches user's SALT from database
   - Server computes Argon2 hash and verifies
   - Server generates JWT token on success

2. **Session Management:**
   - JWT stored in database TOKEN field and client config
   - All subsequent requests authenticated via JWT

3. **Transport Security:**
   - All connections enforce SSL/TLS
   - No plaintext transmission outside SSL layer

## Windows Installer

Build the MSI installer using WiX Toolset:

```bash
# After building the Release binaries
cd installer
candle -ext WixUIExtension installer.wxs
light -ext WixUIExtension -out "Scar Chat.msi" installer.wixobj
```

## Development Progress

See [PROGRESS.md](PROGRESS.md) for detailed feature implementation status and dependencies.

## License

[Specify your license here]

## Contributing

[Contribution guidelines if applicable]

## Troubleshooting

### Linux: Missing Pipewire/Portal
Ensure `pipewire` and `xdg-desktop-portal-hyprland` (or appropriate portal) are installed and running:
```bash
systemctl --user status pipewire
```

### Windows: FFmpeg not found
Add FFmpeg library paths to CMake:
```bash
cmake -DFFMPEG_ROOT=/path/to/ffmpeg ..
```

### SSL Certificate Errors
Generate self-signed certificates for testing:
```bash
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.pem -days 365 -nodes
```

---

**Project Status:** In Development - See PROGRESS.md for current milestone
