get('security.master_application_key')); $encryption = new Encryption($masterKey, $config->get('security.encryption')); $db = new Database($encryption, $config->database()); $logger = new Logger($config->get('database.activity_log')); $validator = new Validator($config); $auth = new Auth($db, $config, $logger); // Require authentication for all pages except login/register $publicPages = ['login', 'register', 'keys', 'public-share', 'reset-password']; $page = $_GET['page'] ?? 'dashboard'; if (!$auth->check() && !in_array($page, $publicPages)) { header('Location: /login.php'); exit; } // ------------------------------------------------------------------ // PGP context injection // If the authenticated user has PGP encryption mode enabled AND their // passphrase is stored in the session, configure $db to use PGP for // their per-user credential and public-key files. // ------------------------------------------------------------------ if ($auth->check()) { $pgpPassphrase = Session::get('pgp_passphrase', ''); if ($pgpPassphrase !== '') { $currentUser = $auth->getCurrentUser(); if ($currentUser && ($currentUser['settings']['pgp_encryption_mode'] ?? false)) { $pgpDir = $config->get('app.paths.pgp'); if ($pgpDir) { $pubKeyFile = $pgpDir . '/' . $currentUser['id'] . '_public.key'; $privKeyFile = $pgpDir . '/' . $currentUser['id'] . '_private.key.enc'; if (file_exists($pubKeyFile) && file_exists($privKeyFile)) { $db->setPGPContext( file_get_contents($pubKeyFile), file_get_contents($privKeyFile), $pgpPassphrase, $currentUser['id'] ); } } } } } // CSRF protection $csrf = new CSRF(); // Route to appropriate controller try { switch ($page) { case 'dashboard': require_once __DIR__ . '/src/Controllers/DashboardController.php'; $controller = new PassGram\Controllers\DashboardController($db, $auth, $encryption); $controller->index(); break; case 'credentials': require_once __DIR__ . '/src/Controllers/CredentialController.php'; require_once __DIR__ . '/src/Models/Credential.php'; require_once __DIR__ . '/src/Models/Group.php'; require_once __DIR__ . '/src/Models/User.php'; require_once __DIR__ . '/src/Models/Share.php'; $credentialModel = new PassGram\Models\Credential($db, $validator); $groupModel = new PassGram\Models\Group($db, $validator); $userModel = new PassGram\Models\User($db, $config, $validator); $shareModel = new PassGram\Models\Share($db, $validator); $controller = new PassGram\Controllers\CredentialController($auth, $csrf, $credentialModel, $logger, $groupModel, $userModel, $shareModel); $action = $_GET['action'] ?? 'index'; switch ($action) { case 'create': $controller->create(); break; case 'store': $controller->store(); break; case 'view': $controller->show(); break; case 'edit': $controller->edit(); break; case 'update': $controller->update(); break; case 'delete': $controller->delete(); break; case 'share': $controller->share(); break; case 'share-with-group': $controller->shareWithGroup(); break; case 'revoke-group-share': $controller->revokeGroupShare(); break; case 'get-password': $controller->getPassword(); break; case 'generate-password': $controller->generatePassword(); break; default: $controller->index(); break; } break; case 'groups': require_once __DIR__ . '/src/Controllers/GroupController.php'; require_once __DIR__ . '/src/Models/User.php'; require_once __DIR__ . '/src/Models/Group.php'; $userModel = new PassGram\Models\User($db, $config, $validator); $groupModel = new PassGram\Models\Group($db, $validator); $controller = new PassGram\Controllers\GroupController($auth, $csrf, $userModel, $groupModel, $logger); $action = $_GET['action'] ?? 'index'; switch ($action) { case 'view': $controller->view(); break; case 'create': $controller->create(); break; case 'store': $controller->store(); break; case 'edit': $controller->edit(); break; case 'update': $controller->update(); break; case 'delete': $controller->delete(); break; case 'add-member': $controller->addMember(); break; case 'remove-member': $controller->removeMember(); break; case 'transfer-ownership': $controller->transferOwnership(); break; case 'users-autocomplete': $controller->usersAutocomplete(); break; default: $controller->index(); break; } break; case 'invites': require_once __DIR__ . '/src/Controllers/InviteController.php'; require_once __DIR__ . '/src/Models/Group.php'; require_once __DIR__ . '/src/Models/Invite.php'; $groupModel = new PassGram\Models\Group($db, $validator); $inviteModel = new PassGram\Models\Invite($db, $config, $validator); $controller = new PassGram\Controllers\InviteController($auth, $csrf, $groupModel, $inviteModel); $action = $_GET['action'] ?? 'index'; switch ($action) { case 'generate': $controller->generate(); break; default: $controller->index(); break; } break; case 'shares': require_once __DIR__ . '/src/Controllers/ShareController.php'; require_once __DIR__ . '/src/Models/User.php'; require_once __DIR__ . '/src/Models/Group.php'; require_once __DIR__ . '/src/Models/Credential.php'; require_once __DIR__ . '/src/Models/Share.php'; $userModel = new PassGram\Models\User($db, $config, $validator); $groupModel = new PassGram\Models\Group($db, $validator); $credentialModel = new PassGram\Models\Credential($db, $validator); $shareModel = new PassGram\Models\Share($db, $validator); $controller = new PassGram\Controllers\ShareController($config, $auth, $csrf, $userModel, $groupModel, $credentialModel, $shareModel, $logger); $action = $_GET['action'] ?? 'index'; switch ($action) { case 'share': $controller->showShareForm(); break; case 'create': $controller->create(); break; case 'view': $controller->view(); break; case 'revoke': $controller->revoke(); break; default: $controller->index(); break; } break; case 'public-share': require_once __DIR__ . '/src/Controllers/PublicShareController.php'; require_once __DIR__ . '/src/Models/PublicShare.php'; require_once __DIR__ . '/src/Models/Credential.php'; $credentialModel = new PassGram\Models\Credential($db, $validator); $publicShareModel = new PassGram\Models\PublicShare($db); $controller = new PassGram\Controllers\PublicShareController( $config, $auth, $csrf, $credentialModel, $publicShareModel, $logger ); $action = $_GET['action'] ?? 'view'; switch ($action) { case 'create': $controller->create(); break; case 'revoke': $controller->revoke(); break; case 'list': $controller->listShares(); break; default: $controller->view(); break; } break; case 'notes': require_once __DIR__ . '/src/Controllers/NoteController.php'; require_once __DIR__ . '/src/Models/Note.php'; $noteModel = new PassGram\Models\Note($db, $validator); $controller = new PassGram\Controllers\NoteController($auth, $csrf, $noteModel); $controller->index(); break; case 'pgpkeys': require_once __DIR__ . '/src/Controllers/PGPKeyController.php'; require_once __DIR__ . '/src/Models/PGPKey.php'; require_once __DIR__ . '/src/Models/Group.php'; $pgpKeyModel = new PassGram\Models\PGPKey($db, $validator); $groupModel = new PassGram\Models\Group($db, $validator); $controller = new PassGram\Controllers\PGPKeyController($auth, $csrf, $pgpKeyModel, $logger, $groupModel); $action = $_GET['action'] ?? 'index'; switch ($action) { case 'create': $controller->create(); break; case 'store': $controller->store(); break; case 'view': $controller->show(); break; case 'edit': $controller->edit(); break; case 'update': $controller->update(); break; case 'delete': $controller->delete(); break; case 'share-with-group': $controller->shareWithGroup(); break; case 'revoke-group-share': $controller->revokeGroupShare(); break; default: $controller->index(); break; } break; case 'pgp': require_once __DIR__ . '/src/Controllers/PGPController.php'; require_once __DIR__ . '/src/Models/User.php'; $userModel = new PassGram\Models\User($db, $config, $validator); $controller = new PassGram\Controllers\PGPController($config, $auth, $csrf, $userModel, $logger); $action = $_GET['action'] ?? 'view'; switch ($action) { case 'generate': $controller->generate(); break; case 'show-generate': $controller->showGenerate(); break; case 'unlock-pgp': $controller->unlockPGP(); break; case 'lock-pgp': $controller->lockPGP(); break; case 'toggle-encryption': $controller->toggleEncryption(); break; default: $controller->view(); break; } break; case 'keys': require_once __DIR__ . '/src/Controllers/PublicKeyController.php'; $controller = new PassGram\Controllers\PublicKeyController($db); $controller->index(); break; case 'export': require_once __DIR__ . '/src/Controllers/ExportController.php'; require_once __DIR__ . '/src/Models/Credential.php'; require_once __DIR__ . '/src/Models/Group.php'; require_once __DIR__ . '/src/Models/User.php'; $credentialModel = new PassGram\Models\Credential($db, $validator); $groupModel = new PassGram\Models\Group($db, $validator); $userModel = new PassGram\Models\User($db, $config, $validator); $controller = new PassGram\Controllers\ExportController($auth, $csrf, $credentialModel, $groupModel, $userModel, $logger, $encryption); $action = $_GET['action'] ?? 'index'; switch ($action) { case 'export': $controller->export(); break; case 'plaintext-json': $controller->plaintextJson(); break; default: $controller->index(); break; } break; case 'import': require_once __DIR__ . '/src/Controllers/ImportController.php'; require_once __DIR__ . '/src/Models/Credential.php'; $credentialModel = new PassGram\Models\Credential($db, $validator); $controller = new PassGram\Controllers\ImportController($auth, $csrf, $credentialModel, $logger, $encryption, $validator); $action = $_GET['action'] ?? 'index'; switch ($action) { case 'import': $controller->import(); break; case 'import-gpg': $controller->importGpg(); break; default: $controller->index(); break; } break; case 'admin': require_once __DIR__ . '/src/Controllers/AdminController.php'; require_once __DIR__ . '/src/Models/User.php'; require_once __DIR__ . '/src/Models/Group.php'; require_once __DIR__ . '/src/Models/AuditLog.php'; require_once __DIR__ . '/src/Models/PasswordReset.php'; $userModel = new PassGram\Models\User($db, $config, $validator); $groupModel = new PassGram\Models\Group($db, $validator); $auditLogModel = new PassGram\Models\AuditLog($db); $resetModel = new PassGram\Models\PasswordReset($db); $controller = new PassGram\Controllers\AdminController( $config, $auth, $csrf, $userModel, $groupModel, $auditLogModel, $resetModel, $validator, $logger ); $action = $_GET['action'] ?? 'index'; switch ($action) { case 'users': $controller->users(); break; case 'view-user': $controller->viewUser(); break; case 'add-user': $controller->addUser(); break; case 'update-user': $controller->updateUser(); break; case 'delete-user': $controller->deleteUser(); break; case 'generate-reset-link': $controller->generateResetLink(); break; case 'audit-log': $controller->auditLog(); break; case 'files': $controller->listFiles(); break; default: $controller->index(); break; } break; default: // Redirect to dashboard for unknown pages header('Location: /index.php?page=dashboard'); exit; } } catch (Exception $e) { // Log error and show generic error page $logger->error('Application error: ' . $e->getMessage()); echo '