tst-pam_mkhomedir-retval.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Check pam_mkhomedir return values.
  3. *
  4. * Copyright (c) 2020 Dmitry V. Levin <ldv@altlinux.org>
  5. */
  6. #include "test_assert.h"
  7. #include <fcntl.h>
  8. #include <limits.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <unistd.h>
  12. #include <pwd.h>
  13. #include <sys/stat.h>
  14. #include <security/pam_appl.h>
  15. #define MODULE_NAME "pam_mkhomedir"
  16. #define TEST_NAME "tst-" MODULE_NAME "-retval"
  17. static const char service_file[] = TEST_NAME ".service";
  18. static const char user_empty[] = "";
  19. static const char user_missing[] = ":";
  20. static struct pam_conv conv;
  21. int
  22. main(void)
  23. {
  24. pam_handle_t *pamh = NULL;
  25. FILE *fp;
  26. struct passwd *pw;
  27. struct stat st;
  28. char cwd[PATH_MAX];
  29. ASSERT_NE(NULL, getcwd(cwd, sizeof(cwd)));
  30. /* PAM_USER_UNKNOWN */
  31. ASSERT_NE(NULL, fp = fopen(service_file, "w"));
  32. ASSERT_LT(0, fprintf(fp, "#%%PAM-1.0\n"
  33. "auth required %s/.libs/%s.so\n"
  34. "account required %s/.libs/%s.so\n"
  35. "password required %s/.libs/%s.so\n"
  36. "session required %s/.libs/%s.so\n",
  37. cwd, MODULE_NAME,
  38. cwd, MODULE_NAME,
  39. cwd, MODULE_NAME,
  40. cwd, MODULE_NAME));
  41. ASSERT_EQ(0, fclose(fp));
  42. ASSERT_EQ(PAM_SUCCESS,
  43. pam_start_confdir(service_file, user_empty,
  44. &conv, ".", &pamh));
  45. ASSERT_NE(NULL, pamh);
  46. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_authenticate(pamh, 0));
  47. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_setcred(pamh, 0));
  48. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_acct_mgmt(pamh, 0));
  49. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_chauthtok(pamh, 0));
  50. ASSERT_EQ(PAM_USER_UNKNOWN, pam_open_session(pamh, 0));
  51. ASSERT_EQ(PAM_PERM_DENIED, pam_close_session(pamh, 0));
  52. ASSERT_EQ(PAM_SUCCESS, pam_end(pamh, 0));
  53. pamh = NULL;
  54. ASSERT_EQ(PAM_SUCCESS,
  55. pam_start_confdir(service_file, user_missing,
  56. &conv, ".", &pamh));
  57. ASSERT_NE(NULL, pamh);
  58. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_authenticate(pamh, 0));
  59. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_setcred(pamh, 0));
  60. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_acct_mgmt(pamh, 0));
  61. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_chauthtok(pamh, 0));
  62. ASSERT_EQ(PAM_USER_UNKNOWN, pam_open_session(pamh, 0));
  63. ASSERT_EQ(PAM_PERM_DENIED, pam_close_session(pamh, 0));
  64. ASSERT_EQ(PAM_SUCCESS, pam_end(pamh, 0));
  65. pamh = NULL;
  66. /* PAM_SUCCESS */
  67. ASSERT_NE(NULL, fp = fopen(service_file, "w"));
  68. ASSERT_LT(0, fprintf(fp, "#%%PAM-1.0\n"
  69. "auth required %s/.libs/%s.so debug\n"
  70. "account required %s/.libs/%s.so debug\n"
  71. "password required %s/.libs/%s.so debug\n"
  72. "session required %s/.libs/%s.so debug\n",
  73. cwd, MODULE_NAME,
  74. cwd, MODULE_NAME,
  75. cwd, MODULE_NAME,
  76. cwd, MODULE_NAME));
  77. ASSERT_EQ(0, fclose(fp));
  78. if ((pw = getpwuid(geteuid())) != NULL &&
  79. pw->pw_dir != NULL &&
  80. stat(pw->pw_dir, &st) == 0 &&
  81. (st.st_mode & S_IFMT) == S_IFDIR) {
  82. ASSERT_EQ(PAM_SUCCESS,
  83. pam_start_confdir(service_file, pw->pw_name,
  84. &conv, ".", &pamh));
  85. ASSERT_NE(NULL, pamh);
  86. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_authenticate(pamh, 0));
  87. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_setcred(pamh, 0));
  88. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_acct_mgmt(pamh, 0));
  89. ASSERT_EQ(PAM_MODULE_UNKNOWN, pam_chauthtok(pamh, 0));
  90. ASSERT_EQ(PAM_SUCCESS, pam_open_session(pamh, 0));
  91. ASSERT_EQ(PAM_SUCCESS, pam_close_session(pamh, 0));
  92. ASSERT_EQ(PAM_SUCCESS, pam_end(pamh, 0));
  93. pamh = NULL;
  94. }
  95. ASSERT_EQ(0, unlink(service_file));
  96. return 0;
  97. }