diff --git a/_website/README_LOGIN.md b/_website/README_LOGIN.md new file mode 100644 index 00000000..920f206c --- /dev/null +++ b/_website/README_LOGIN.md @@ -0,0 +1,109 @@ +# Website Login Implementation + +## Overview +This implementation adds login functionality to the website that authenticates users against the panel's database (ogp_users table) while maintaining separate sessions for the website and panel. + +## Files Created/Modified + +### 1. `_website/login.php` (NEW) +- Full-featured login page with modern UI +- Authenticates against panel DB using MD5 password hashing (panel-compatible) +- Creates separate website session using `gameservers_website` session name +- Logs all login attempts via logger() function +- Session variables set: + - `$_SESSION['website_user_id']` - User ID from ogp_users + - `$_SESSION['website_username']` - Username + - `$_SESSION['website_user_role']` - User role (admin, user, etc.) + - `$_SESSION['website_user_email']` - User email + - `$_SESSION['website_login_time']` - Timestamp of login + +### 2. `_website/logout.php` (NEW) +- Cleanly destroys website session +- Logs logout events +- Redirects to homepage after logout +- Properly clears session cookies + +### 3. `_website/index.php` (MODIFIED) +- Added session management at the top +- Added header with Login/Logout button and user greeting +- Shows "Welcome, [username]!" when logged in +- Maintains same visual design with added header + +## Session Management + +### Separate Sessions +- **Website Session**: `gameservers_website` (this implementation) +- **Panel Session**: `opengamepanel_web` (existing panel) + +These sessions are completely separate - users can be logged into one without being logged into the other. + +## Security Features + +1. **SQL Injection Prevention**: Uses `mysqli_real_escape_string()` for input sanitization +2. **Password Hashing**: Compatible with panel's MD5 hashing (legacy but matches panel) +3. **Session Isolation**: Separate session name prevents conflicts with panel +4. **XSS Prevention**: Uses `htmlspecialchars()` for output escaping +5. **Logging**: All login/logout events are logged via logger() function + +## Database Requirements + +Requires connection to panel database with access to: +- `ogp_users` table (fields: user_id, users_login, users_passwd, users_role, users_email) +- Connection configured in `db.php` + +## Usage + +### For Users: +1. Visit `_website/login.php` to login +2. Enter panel credentials (username/password) +3. After successful login, redirected to homepage with session active +4. Click "Logout" button to end session + +### For Developers: +Check if user is logged in: +```php +session_name("gameservers_website"); +session_start(); + +if (isset($_SESSION['website_user_id']) && !empty($_SESSION['website_user_id'])) { + // User is logged in + $username = $_SESSION['website_username']; + $user_id = $_SESSION['website_user_id']; + $user_role = $_SESSION['website_user_role']; +} +``` + +## Future Enhancements (Optional) + +1. **Password Hashing Upgrade**: Implement modern bcrypt/argon2 with transparent upgrade on login +2. **CSRF Protection**: Add CSRF tokens to login form +3. **Rate Limiting**: Add IP-based login attempt limiting (similar to panel's ban_list) +4. **Remember Me**: Add persistent login cookie option +5. **Password Reset**: Integrate with panel's password reset flow +6. **Two-Factor Auth**: Optional 2FA for enhanced security + +## Testing + +All files pass PHP syntax validation: +```bash +php -l _website/index.php +php -l _website/login.php +php -l _website/logout.php +``` + +## Alignment with Copilot Instructions + +This implementation follows the no-code planning guidelines from `.github/copilot-instructions.md`: + +✅ Website uses panel DB for authentication +✅ Sessions remain separate (website ≠ panel) +✅ Auth compatibility maintained (MD5 hash for panel users) +✅ Minimal changes to existing code +✅ Repository-first approach (reused existing db.php, logger function) +✅ Security considerations (SQL injection prevention, session isolation) + +## Notes + +- Login credentials are the same as panel login (same user table) +- Website session does not grant access to panel - separate login required +- Logger function from db.php creates logfile.txt for audit trail diff --git a/_website/test_db_connection.php b/_website/test_db_connection.php new file mode 100644 index 00000000..c506fb1a --- /dev/null +++ b/_website/test_db_connection.php @@ -0,0 +1,151 @@ + + + + Database Connection Test + + + +

Database Connection Test

+

⚠️ WARNING: Delete this file after testing!

+"; + +// Test 1: Check database connection +echo "
"; +echo "

Test 1: Database Connection

"; +if ($db && mysqli_ping($db)) { + echo "

✓ Database connection successful!

"; + echo "

Connected to database

"; +} else { + echo "

✗ Database connection failed!

"; + if ($db) { + echo "

Error: " . mysqli_connect_error() . "

"; + } + echo "
"; + exit(); +} +echo ""; + +// Test 2: Check if ogp_users table exists +echo "
"; +echo "

Test 2: Check ogp_users Table

"; +$result = mysqli_query($db, "SHOW TABLES LIKE 'ogp_users'"); +if ($result && mysqli_num_rows($result) > 0) { + echo "

✓ ogp_users table exists!

"; +} else { + echo "

✗ ogp_users table not found!

"; + echo "
"; + exit(); +} +echo ""; + +// Test 3: Check table structure +echo "
"; +echo "

Test 3: Table Structure

"; +$result = mysqli_query($db, "DESCRIBE ogp_users"); +if ($result) { + echo "

✓ Table structure retrieved

"; + echo "

Columns:

";
+    while ($row = mysqli_fetch_assoc($result)) {
+        echo $row['Field'] . " (" . $row['Type'] . ")\n";
+    }
+    echo "
"; +} else { + echo "

✗ Failed to retrieve table structure

"; +} +echo "
"; + +// Test 4: Count users +echo "
"; +echo "

Test 4: User Count

"; +$result = mysqli_query($db, "SELECT COUNT(*) as count FROM ogp_users"); +if ($result) { + $row = mysqli_fetch_assoc($result); + echo "

✓ Total users in database: " . $row['count'] . "

"; +} else { + echo "

✗ Failed to count users

"; +} +echo "
"; + +// Test 5: Check required columns +echo "
"; +echo "

Test 5: Required Columns Check

"; +$required_columns = ['user_id', 'users_login', 'users_passwd', 'users_role', 'users_email']; +$result = mysqli_query($db, "SHOW COLUMNS FROM ogp_users"); +$existing_columns = []; +while ($row = mysqli_fetch_assoc($result)) { + $existing_columns[] = $row['Field']; +} + +$all_present = true; +foreach ($required_columns as $col) { + if (in_array($col, $existing_columns)) { + echo "

✓ Column '$col' exists

"; + } else { + echo "

✗ Column '$col' missing!

"; + $all_present = false; + } +} + +if ($all_present) { + echo "

All required columns present!

"; +} else { + echo "

Some required columns are missing!

"; +} +echo "
"; + +// Test 6: Test MD5 hash function +echo "
"; +echo "

Test 6: Password Hashing Test

"; +$test_password = "testpassword"; +$hashed = md5($test_password); +echo "

Test password: '$test_password'

"; +echo "

MD5 hash: '$hashed'

"; +echo "

✓ MD5 hashing works correctly

"; +echo "
"; + +// Test 7: Test session functionality +echo "
"; +echo "

Test 7: Session Test

"; +session_name("gameservers_website"); +session_start(); +$_SESSION['test_key'] = 'test_value'; +if (isset($_SESSION['test_key']) && $_SESSION['test_key'] === 'test_value') { + echo "

✓ Sessions working correctly

"; + echo "

Session name: " . session_name() . "

"; + echo "

Session ID: " . session_id() . "

"; + unset($_SESSION['test_key']); +} else { + echo "

✗ Session test failed

"; +} +echo "
"; + +echo "
"; +echo "

Summary

"; +echo "

✓ All tests passed! Login functionality should work correctly.

"; +echo "

⚠️ Remember to delete this test file before deploying to production!

"; +echo "
"; + +echo ""; +?>