test_unix_pam_integration.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "user_manager.h"
  2. #include "auth_middleware.h"
  3. #include "pam_auth.h"
  4. #include <httplib.h>
  5. #include <iostream>
  6. #include <memory>
  7. #include <nlohmann/json.hpp>
  8. using json = nlohmann::json;
  9. int main() {
  10. std::cout << "Testing Unix+PAM Authentication Integration\n";
  11. std::cout << "==========================================\n\n";
  12. // Create test data directory
  13. std::string dataDir = "./test-auth-data";
  14. // Test 1: Unix authentication without PAM
  15. std::cout << "Test 1: Unix authentication without PAM\n";
  16. {
  17. auto userManager = std::make_shared<UserManager>(dataDir, UserManager::AuthMethod::UNIX, true);
  18. userManager->setPamAuthEnabled(false);
  19. if (!userManager->initialize()) {
  20. std::cerr << "Failed to initialize UserManager\n";
  21. return 1;
  22. }
  23. // Test with existing system user (should work without password)
  24. auto result = userManager->authenticateUnix("root", "");
  25. if (result.success) {
  26. std::cout << "✓ Unix auth without PAM: SUCCESS\n";
  27. std::cout << " User: " << result.username << ", Role: " << result.role << "\n";
  28. } else {
  29. std::cout << "✗ Unix auth without PAM: FAILED - " << result.errorMessage << "\n";
  30. }
  31. }
  32. std::cout << "\n";
  33. // Test 2: Unix authentication with PAM (if available)
  34. std::cout << "Test 2: Unix authentication with PAM\n";
  35. {
  36. auto userManager = std::make_shared<UserManager>(dataDir, UserManager::AuthMethod::UNIX, true);
  37. userManager->setPamAuthEnabled(true);
  38. if (!userManager->initialize()) {
  39. std::cerr << "Failed to initialize UserManager\n";
  40. return 1;
  41. }
  42. // Check if PAM is actually available
  43. if (userManager->isPamAuthEnabled()) {
  44. std::cout << "✓ PAM is enabled\n";
  45. // Test with password (will fail if user doesn't exist or password is wrong)
  46. auto result = userManager->authenticateUnix("testuser", "testpass");
  47. if (result.success) {
  48. std::cout << "✓ Unix auth with PAM: SUCCESS\n";
  49. std::cout << " User: " << result.username << ", Role: " << result.role << "\n";
  50. } else {
  51. std::cout << "✗ Unix auth with PAM: FAILED - " << result.errorMessage << "\n";
  52. std::cout << " (This is expected if testuser doesn't exist or password is wrong)\n";
  53. }
  54. } else {
  55. std::cout << "✗ PAM is not available - skipping test\n";
  56. }
  57. }
  58. std::cout << "\n";
  59. // Test 3: AuthMiddleware Unix authentication
  60. std::cout << "Test 3: AuthMiddleware Unix authentication\n";
  61. {
  62. AuthConfig config;
  63. config.authMethod = AuthMethod::UNIX;
  64. config.authRealm = "test-realm";
  65. auto userManager = std::make_shared<UserManager>(dataDir, UserManager::AuthMethod::UNIX, true);
  66. userManager->setPamAuthEnabled(true);
  67. userManager->initialize();
  68. auto authMiddleware = std::make_unique<AuthMiddleware>(config, userManager);
  69. authMiddleware->initialize();
  70. // Test JSON parsing for login endpoint (simulate what server does)
  71. json loginRequest = {
  72. {"username", "testuser"},
  73. {"password", "testpass"}
  74. };
  75. std::cout << "✓ AuthMiddleware can handle JSON login requests\n";
  76. std::cout << " Request body: " << loginRequest.dump() << "\n";
  77. // Note: We can't directly test authenticateUnix as it's private,
  78. // but we can verify the UserManager integration works
  79. auto result = userManager->authenticateUnix("testuser", "testpass");
  80. if (result.success) {
  81. std::cout << "✓ UserManager Unix+PAM auth: SUCCESS\n";
  82. std::cout << " User: " << result.username << ", Role: " << result.role << "\n";
  83. } else {
  84. std::cout << "✗ UserManager Unix+PAM auth: FAILED - " << result.errorMessage << "\n";
  85. std::cout << " (This is expected if testuser doesn't exist or password is wrong)\n";
  86. }
  87. }
  88. std::cout << "\n";
  89. // Test 4: Verify authentication method configuration
  90. std::cout << "Test 4: Authentication method configuration\n";
  91. {
  92. auto userManager = std::make_shared<UserManager>(dataDir, UserManager::AuthMethod::UNIX, true);
  93. std::cout << "✓ Unix auth enabled: " << (userManager->isUnixAuthEnabled() ? "YES" : "NO") << "\n";
  94. userManager->setPamAuthEnabled(true);
  95. std::cout << "✓ PAM auth enabled: " << (userManager->isPamAuthEnabled() ? "YES" : "NO") << "\n";
  96. userManager->setPamAuthEnabled(false);
  97. std::cout << "✓ PAM auth disabled: " << (userManager->isPamAuthEnabled() ? "YES" : "NO") << "\n";
  98. }
  99. std::cout << "\nIntegration tests completed!\n";
  100. return 0;
  101. }