#include "user_manager.h" #include "auth_middleware.h" #include "pam_auth.h" #include #include #include #include using json = nlohmann::json; int main() { std::cout << "Testing Unix+PAM Authentication Integration\n"; std::cout << "==========================================\n\n"; // Create test data directory std::string dataDir = "./test-auth-data"; // Test 1: Unix authentication without PAM std::cout << "Test 1: Unix authentication without PAM\n"; { auto userManager = std::make_shared(dataDir, UserManager::AuthMethod::UNIX, true); userManager->setPamAuthEnabled(false); if (!userManager->initialize()) { std::cerr << "Failed to initialize UserManager\n"; return 1; } // Test with existing system user (should work without password) auto result = userManager->authenticateUnix("root", ""); if (result.success) { std::cout << "✓ Unix auth without PAM: SUCCESS\n"; std::cout << " User: " << result.username << ", Role: " << result.role << "\n"; } else { std::cout << "✗ Unix auth without PAM: FAILED - " << result.errorMessage << "\n"; } } std::cout << "\n"; // Test 2: Unix authentication with PAM (if available) std::cout << "Test 2: Unix authentication with PAM\n"; { auto userManager = std::make_shared(dataDir, UserManager::AuthMethod::UNIX, true); userManager->setPamAuthEnabled(true); if (!userManager->initialize()) { std::cerr << "Failed to initialize UserManager\n"; return 1; } // Check if PAM is actually available if (userManager->isPamAuthEnabled()) { std::cout << "✓ PAM is enabled\n"; // Test with password (will fail if user doesn't exist or password is wrong) auto result = userManager->authenticateUnix("testuser", "testpass"); if (result.success) { std::cout << "✓ Unix auth with PAM: SUCCESS\n"; std::cout << " User: " << result.username << ", Role: " << result.role << "\n"; } else { std::cout << "✗ Unix auth with PAM: FAILED - " << result.errorMessage << "\n"; std::cout << " (This is expected if testuser doesn't exist or password is wrong)\n"; } } else { std::cout << "✗ PAM is not available - skipping test\n"; } } std::cout << "\n"; // Test 3: AuthMiddleware Unix authentication std::cout << "Test 3: AuthMiddleware Unix authentication\n"; { AuthConfig config; config.authMethod = AuthMethod::UNIX; config.authRealm = "test-realm"; auto userManager = std::make_shared(dataDir, UserManager::AuthMethod::UNIX, true); userManager->setPamAuthEnabled(true); userManager->initialize(); auto authMiddleware = std::make_unique(config, userManager); authMiddleware->initialize(); // Test JSON parsing for login endpoint (simulate what server does) json loginRequest = { {"username", "testuser"}, {"password", "testpass"} }; std::cout << "✓ AuthMiddleware can handle JSON login requests\n"; std::cout << " Request body: " << loginRequest.dump() << "\n"; // Note: We can't directly test authenticateUnix as it's private, // but we can verify the UserManager integration works auto result = userManager->authenticateUnix("testuser", "testpass"); if (result.success) { std::cout << "✓ UserManager Unix+PAM auth: SUCCESS\n"; std::cout << " User: " << result.username << ", Role: " << result.role << "\n"; } else { std::cout << "✗ UserManager Unix+PAM auth: FAILED - " << result.errorMessage << "\n"; std::cout << " (This is expected if testuser doesn't exist or password is wrong)\n"; } } std::cout << "\n"; // Test 4: Verify authentication method configuration std::cout << "Test 4: Authentication method configuration\n"; { auto userManager = std::make_shared(dataDir, UserManager::AuthMethod::UNIX, true); std::cout << "✓ Unix auth enabled: " << (userManager->isUnixAuthEnabled() ? "YES" : "NO") << "\n"; userManager->setPamAuthEnabled(true); std::cout << "✓ PAM auth enabled: " << (userManager->isPamAuthEnabled() ? "YES" : "NO") << "\n"; userManager->setPamAuthEnabled(false); std::cout << "✓ PAM auth disabled: " << (userManager->isPamAuthEnabled() ? "YES" : "NO") << "\n"; } std::cout << "\nIntegration tests completed!\n"; return 0; }