2025-12-07 12:00:44 -07:00
|
|
|
# SCAR Chat
|
2025-12-08 08:16:48 -07:00
|
|
|
## Written by Claude Sonnet, with assistancer from Ganome.
|
2025-12-07 12:00:44 -07:00
|
|
|
|
|
|
|
|
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
|