lasuser.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. #ifdef HAVE_CONFIG_H
  10. # include <config.h>
  11. #endif
  12. /* lasuser.c
  13. * This file contains the User LAS code.
  14. */
  15. #include <netsite.h>
  16. #include <base/shexp.h>
  17. #include <base/util.h>
  18. #include <libaccess/las.h>
  19. #include <libaccess/dbtlibaccess.h>
  20. #include <libaccess/aclerror.h>
  21. #include "aclutil.h"
  22. #ifdef UTEST
  23. extern char * LASUserGetUser();
  24. #endif
  25. /*
  26. * LASUserEval
  27. * INPUT
  28. * attr_name The string "user" - in lower case.
  29. * comparator CMP_OP_EQ or CMP_OP_NE only
  30. * attr_pattern A comma-separated list of users
  31. * *cachable Always set to ACL_NOT_CACHABLE.
  32. * subject Subject property list
  33. * resource Resource property list
  34. * auth_info Authentication info, if any
  35. * RETURNS
  36. * retcode The usual LAS return codes.
  37. */
  38. int LASUserEval(NSErr_t *errp, char *attr_name, CmpOp_t comparator,
  39. char *attr_pattern, ACLCachable_t *cachable,
  40. void **LAS_cookie, PList_t subject, PList_t resource,
  41. PList_t auth_info, PList_t global_auth)
  42. {
  43. char *uid;
  44. char *users;
  45. char *user;
  46. char *comma;
  47. int retcode;
  48. int matched;
  49. int is_owner;
  50. int rv;
  51. *cachable = ACL_NOT_CACHABLE;
  52. *LAS_cookie = (void *)0;
  53. if (strcmp(attr_name, ACL_ATTR_USER) != 0) {
  54. nserrGenerate(errp, ACLERRINVAL, ACLERR5700, ACL_Program, 2, XP_GetAdminStr(DBT_lasUserEvalReceivedRequestForAtt_), attr_name);
  55. return LAS_EVAL_INVALID;
  56. }
  57. if ((comparator != CMP_OP_EQ) && (comparator != CMP_OP_NE)) {
  58. nserrGenerate(errp, ACLERRINVAL, ACLERR5710, ACL_Program, 2, XP_GetAdminStr(DBT_lasuserevalIllegalComparatorDN_), comparator_string(comparator));
  59. return LAS_EVAL_INVALID;
  60. }
  61. if (!strcmp(attr_pattern, "anyone")) {
  62. *cachable = ACL_INDEF_CACHABLE;
  63. return comparator == CMP_OP_EQ ? LAS_EVAL_TRUE : LAS_EVAL_FALSE;
  64. }
  65. /* get the authenticated user name */
  66. #ifndef UTEST
  67. rv = ACL_GetAttribute(errp, ACL_ATTR_USER, (void **)&uid,
  68. subject, resource, auth_info, global_auth);
  69. if (rv != LAS_EVAL_TRUE) {
  70. return rv;
  71. }
  72. #else
  73. uid = (char *)LASUserGetUser();
  74. #endif
  75. /* We have an authenticated user */
  76. if (!strcmp(attr_pattern, "all")) {
  77. return comparator == CMP_OP_EQ ? LAS_EVAL_TRUE : LAS_EVAL_FALSE;
  78. }
  79. users = STRDUP(attr_pattern);
  80. if (!users) {
  81. nserrGenerate(errp, ACLERRNOMEM, ACLERR5720, ACL_Program, 1,
  82. XP_GetAdminStr(DBT_lasuserevalRanOutOfMemoryN_));
  83. return LAS_EVAL_FAIL;
  84. }
  85. user = users;
  86. matched = 0;
  87. /* check if the uid is one of the users */
  88. while(user != 0 && *user != 0 && !matched) {
  89. if ((comma = strchr(user, ',')) != NULL) {
  90. *comma++ = 0;
  91. }
  92. /* ignore leading whitespace */
  93. while(*user == ' ' || *user == '\t') user++;
  94. if (*user) {
  95. /* ignore trailing whitespace */
  96. int len = strlen(user);
  97. char *ptr = user+len-1;
  98. while(*ptr == ' ' || *ptr == '\t') *ptr-- = 0;
  99. }
  100. if (!strcasecmp(user, ACL_ATTR_OWNER)) {
  101. rv = ACL_GetAttribute(errp, ACL_ATTR_IS_OWNER, (void **)&is_owner,
  102. subject, resource, auth_info, global_auth);
  103. if (rv == LAS_EVAL_TRUE)
  104. matched = 1;
  105. else
  106. /* continue checking for next user */
  107. user = comma;
  108. }
  109. else if (!WILDPAT_CASECMP(uid, user)) {
  110. /* uid is one of the users */
  111. matched = 1;
  112. }
  113. else {
  114. /* continue checking for next user */
  115. user = comma;
  116. }
  117. }
  118. if (comparator == CMP_OP_EQ) {
  119. retcode = (matched ? LAS_EVAL_TRUE : LAS_EVAL_FALSE);
  120. }
  121. else {
  122. retcode = (matched ? LAS_EVAL_FALSE : LAS_EVAL_TRUE);
  123. }
  124. FREE(users);
  125. return retcode;
  126. }
  127. /* LASUserFlush
  128. * Deallocates any memory previously allocated by the LAS
  129. */
  130. void
  131. LASUserFlush(void **las_cookie)
  132. {
  133. /* do nothing */
  134. return;
  135. }