pam_modutil_ingroup.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * $Id$
  3. *
  4. * This function provides common methods for checking if a user is in a
  5. * specified group.
  6. */
  7. #include "pam_modutil_private.h"
  8. #include <stdlib.h>
  9. #include <pwd.h>
  10. #include <grp.h>
  11. #ifdef HAVE_GETGROUPLIST
  12. #define NGROUPS_MIN 100
  13. #define NGROUPS_MAX 65536
  14. static int checkgrouplist(const char *user, gid_t primary, gid_t target)
  15. {
  16. int ngroups, pgroups, i;
  17. ngroups = NGROUPS_MIN;
  18. do {
  19. gid_t *grouplist;
  20. pgroups = ngroups;
  21. grouplist = malloc(sizeof(gid_t) * ngroups);
  22. if (grouplist == NULL) {
  23. return 0;
  24. }
  25. i = getgrouplist(user, primary, grouplist, &ngroups);
  26. if (i >= 0) {
  27. for (i = 0; i < ngroups; i++) {
  28. if (grouplist[i] == target) {
  29. free(grouplist);
  30. return 1;
  31. }
  32. }
  33. }
  34. free(grouplist);
  35. } while (i < 0 && ngroups > 0 && ngroups != pgroups && ngroups <= NGROUPS_MAX);
  36. return 0;
  37. }
  38. #endif
  39. static int
  40. pam_modutil_user_in_group_common(pam_handle_t *pamh UNUSED,
  41. struct passwd *pwd,
  42. struct group *grp)
  43. {
  44. int i;
  45. if (pwd == NULL) {
  46. return 0;
  47. }
  48. if (grp == NULL) {
  49. return 0;
  50. }
  51. if (pwd->pw_gid == grp->gr_gid) {
  52. return 1;
  53. }
  54. for (i = 0; (grp->gr_mem != NULL) && (grp->gr_mem[i] != NULL); i++) {
  55. if (strcmp(pwd->pw_name, grp->gr_mem[i]) == 0) {
  56. return 1;
  57. }
  58. }
  59. #ifdef HAVE_GETGROUPLIST
  60. if (checkgrouplist(pwd->pw_name, pwd->pw_gid, grp->gr_gid)) {
  61. return 1;
  62. }
  63. #endif
  64. return 0;
  65. }
  66. int
  67. pam_modutil_user_in_group_nam_nam(pam_handle_t *pamh,
  68. const char *user, const char *group)
  69. {
  70. struct passwd *pwd;
  71. struct group *grp;
  72. pwd = pam_modutil_getpwnam(pamh, user);
  73. grp = pam_modutil_getgrnam(pamh, group);
  74. return pam_modutil_user_in_group_common(pamh, pwd, grp);
  75. }
  76. int
  77. pam_modutil_user_in_group_nam_gid(pam_handle_t *pamh,
  78. const char *user, gid_t group)
  79. {
  80. struct passwd *pwd;
  81. struct group *grp;
  82. pwd = pam_modutil_getpwnam(pamh, user);
  83. grp = pam_modutil_getgrgid(pamh, group);
  84. return pam_modutil_user_in_group_common(pamh, pwd, grp);
  85. }
  86. int
  87. pam_modutil_user_in_group_uid_nam(pam_handle_t *pamh,
  88. uid_t user, const char *group)
  89. {
  90. struct passwd *pwd;
  91. struct group *grp;
  92. pwd = pam_modutil_getpwuid(pamh, user);
  93. grp = pam_modutil_getgrnam(pamh, group);
  94. return pam_modutil_user_in_group_common(pamh, pwd, grp);
  95. }
  96. int
  97. pam_modutil_user_in_group_uid_gid(pam_handle_t *pamh,
  98. uid_t user, gid_t group)
  99. {
  100. struct passwd *pwd;
  101. struct group *grp;
  102. pwd = pam_modutil_getpwuid(pamh, user);
  103. grp = pam_modutil_getgrgid(pamh, group);
  104. return pam_modutil_user_in_group_common(pamh, pwd, grp);
  105. }