acl.h 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. /** BEGIN COPYRIGHT BLOCK
  2. * This Program is free software; you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation; version 2 of the License.
  5. *
  6. * This Program is distributed in the hope that it will be useful, but WITHOUT
  7. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  8. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  9. *
  10. * You should have received a copy of the GNU General Public License along with
  11. * this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
  12. * Place, Suite 330, Boston, MA 02111-1307 USA.
  13. *
  14. * In addition, as a special exception, Red Hat, Inc. gives You the additional
  15. * right to link the code of this Program with code not covered under the GNU
  16. * General Public License ("Non-GPL Code") and to distribute linked combinations
  17. * including the two, subject to the limitations in this paragraph. Non-GPL Code
  18. * permitted under this exception must only link to the code of this Program
  19. * through those well defined interfaces identified in the file named EXCEPTION
  20. * found in the source code files (the "Approved Interfaces"). The files of
  21. * Non-GPL Code may instantiate templates or use macros or inline functions from
  22. * the Approved Interfaces without causing the resulting work to be covered by
  23. * the GNU General Public License. Only Red Hat, Inc. may make changes or
  24. * additions to the list of Approved Interfaces. You must obey the GNU General
  25. * Public License in all respects for all of the Program code and other code used
  26. * in conjunction with the Program except the Non-GPL Code covered by this
  27. * exception. If you modify this file, you may extend this exception to your
  28. * version of the file, but you are not obligated to do so. If you do not wish to
  29. * provide this exception without modification, you must delete this exception
  30. * statement from your version and license this file solely under the GPL without
  31. * exception.
  32. *
  33. *
  34. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  35. * Copyright (C) 2005 Red Hat, Inc.
  36. * All rights reserved.
  37. * END COPYRIGHT BLOCK **/
  38. #ifdef HAVE_CONFIG_H
  39. # include <config.h>
  40. #endif
  41. /*****************************************************************************
  42. * acl.h
  43. *
  44. * Header file for ACL processing
  45. *
  46. *****************************************************************************/
  47. #ifndef _ACL_H_
  48. #define _ACL_H_
  49. /* Required to get portable printf/scanf format macros */
  50. #ifdef HAVE_INTTYPES_H
  51. #include <inttypes.h>
  52. /* NSPR uses the print macros a bit differently than ANSI C. We
  53. * need to use ll for a 64-bit integer, even when a long is 64-bit.
  54. */
  55. #undef PRIu64
  56. #define PRIu64 "llu"
  57. #undef PRI64
  58. #define PRI64 "ll"
  59. #else
  60. #error Need to define portable format macros such as PRIu64
  61. #endif /* HAVE_INTTYPES_H */
  62. #include <stdio.h>
  63. #include <string.h>
  64. #include <sys/types.h>
  65. #include <limits.h>
  66. #ifndef _WIN32
  67. #include <sys/socket.h>
  68. #include <netinet/in.h>
  69. #include <arpa/inet.h>
  70. #include <netdb.h>
  71. #endif
  72. #include <ldap.h>
  73. #include <las.h>
  74. #include <aclproto.h>
  75. #include <aclerror.h>
  76. #include "prcvar.h"
  77. #include "slapi-plugin.h"
  78. #include "slap.h"
  79. #include "slapi-private.h"
  80. #include "portable.h"
  81. #include "avl.h"
  82. #include "cert.h"
  83. #include <plhash.h>
  84. #ifdef SOLARIS
  85. #include <tnf/probe.h>
  86. #else
  87. #define TNF_PROBE_0_DEBUG(a,b,c)
  88. #define TNF_PROBE_1_DEBUG(a,b,c,d,e,f)
  89. #endif
  90. #define ACL_PLUGIN_NAME "NSACLPlugin"
  91. extern char *plugin_name;
  92. /*
  93. * Define the OID for version 2 of the proxied authorization control if
  94. * it is not already defined (it is in recent copies of ldap.h).
  95. */
  96. #ifndef LDAP_CONTROL_PROXIEDAUTH
  97. #define LDAP_CONTROL_PROXIEDAUTH "2.16.840.1.113730.3.4.18"
  98. #endif
  99. #define ACLUCHP unsigned char *
  100. static char* const aci_attr_type = "aci";
  101. static char* const filter_string = "aci=*";
  102. static char* const aci_targetdn = "target";
  103. static char* const aci_targetattr = "targetattr";
  104. static char* const aci_targetattrfilters = "targattrfilters";
  105. static char* const aci_targetfilter = "targetfilter";
  106. static char* const aci_target_to = "target_to";
  107. static char* const aci_target_from = "target_from";
  108. static char* const LDAP_URL_prefix_core = "ldap://";
  109. static char* const LDAPS_URL_prefix_core = "ldaps://";
  110. static char* const LDAP_URL_prefix = "ldap:///";
  111. static char* const LDAPS_URL_prefix = "ldaps:///";
  112. static char* const access_str_compare = "compare";
  113. static char* const access_str_search = "search";
  114. static char* const access_str_read = "read";
  115. static char* const access_str_write = "write";
  116. static char* const access_str_delete = "delete";
  117. static char* const access_str_add = "add";
  118. static char* const access_str_selfwrite = "selfwrite";
  119. static char* const access_str_proxy = "proxy";
  120. static char* const access_str_moddn = "moddn";
  121. #define ACL_INIT_ATTR_ARRAY 5
  122. /* define the method */
  123. #define DS_METHOD "ds_method"
  124. #define ACL_ESCAPE_STRING_WITH_PUNCTUATION(x,y) (slapi_is_loglevel_set(SLAPI_LOG_ACL) ? escape_string_with_punctuation(x,y) : "")
  125. /* Lases */
  126. #define DS_LAS_USER "user"
  127. #define DS_LAS_GROUP "group"
  128. #define DS_LAS_USERDN "userdn"
  129. #define DS_LAS_GROUPDN "groupdn"
  130. #define DS_LAS_SELFDNATTR "selfdnattr"
  131. #define DS_LAS_USERDNATTR "userdnattr"
  132. #define DS_LAS_AUTHMETHOD "authmethod"
  133. #define DS_LAS_GROUPDNATTR "groupdnattr"
  134. #define DS_LAS_USERATTR "userattr"
  135. #define DS_LAS_ROLEDN "roledn"
  136. #define DS_LAS_ROLEDNATTR "rolednattr"
  137. #define DS_LAS_SSF "ssf"
  138. /* These define the things that aclutil_evaluate_macro() supports */
  139. typedef enum
  140. {
  141. ACL_EVAL_USER,
  142. ACL_EVAL_GROUP,
  143. ACL_EVAL_ROLE,
  144. ACL_EVAL_GROUPDNATTR,
  145. ACL_EVAL_TARGET_FILTER
  146. }acl_eval_types;
  147. typedef enum
  148. {
  149. ACL_RULE_MACRO_DN_TYPE,
  150. ACL_RULE_MACRO_DN_LEVELS_TYPE
  151. }acl_rule_macro_types;
  152. #define ACL_TARGET_MACRO_DN_KEY "($dn)"
  153. #define ACL_RULE_MACRO_DN_KEY "($dn)"
  154. #define ACL_RULE_MACRO_DN_LEVELS_KEY "[$dn]"
  155. #define ACL_RULE_MACRO_ATTR_KEY "($attr."
  156. #define ACL_EVAL_USER 0
  157. #define ACL_EVAL_GROUP 1
  158. #define ACL_EVAL_ROLE 2
  159. /* The LASes are implemented in the libaccess library */
  160. #define DS_LAS_TIMEOFDAY "timeofday"
  161. #define DS_LAS_DAYOFWEEK "dayofweek"
  162. /* ACL function return codes */
  163. #define ACL_TRUE 1 /* evaluation results to TRUE */
  164. #define ACL_OK ACL_TRUE
  165. #define ACL_FALSE 0 /* evaluation results to FALSE */
  166. #define ACL_ERR -1 /* generic error */
  167. #define ACL_TARGET_FILTER_ERR -2 /* Target filter not set properly */
  168. #define ACL_TARGETATTR_FILTER_ERR -3 /* TargetAttr filter not set properly */
  169. #define ACL_TARGETFILTER_ERR -4 /* Target filter not set properly */
  170. #define ACL_SYNTAX_ERR -5 /* Syntax error */
  171. #define ACL_ONEACL_TEXT_ERR -6 /* ONE ACL text error */
  172. #define ACL_ERR_CONCAT_HANDLES -7 /* unable to concat the handles */
  173. #define ACL_INVALID_TARGET -8 /* invalid target */
  174. #define ACL_INVALID_AUTHMETHOD -9 /* multiple client auth */
  175. #define ACL_INVALID_AUTHORIZATION -10 /* no authorization */
  176. #define ACL_INCORRECT_ACI_VERSION -11 /* incorrect version # */
  177. #define ACL_DONT_KNOW -12 /* the world is an uncertain place */
  178. /* supported by the DS */
  179. #define DS_PROP_CONNECTION "connection"
  180. #define DS_ATTR_USERDN "userdn"
  181. #define DS_ATTR_ENTRY "entry"
  182. #define DS_PROP_ACLPB "aclblock"
  183. #define DS_ATTR_AUTHTYPE "authtype"
  184. #define DS_ATTR_CERT "clientcert"
  185. #define DS_ATTR_SSF "ssf"
  186. #define DS_ATTR_LDAPI "ldapi"
  187. #define ACL_ANOM_MAX_ACL 40
  188. struct scoped_entry_anominfo {
  189. short anom_e_targetInfo[ACL_ANOM_MAX_ACL];
  190. short anom_e_nummatched;
  191. short anom_e_isrootds;
  192. };
  193. typedef struct targetattr {
  194. int attr_type;
  195. #define ACL_ATTR_FILTER 0x01
  196. #define ACL_ATTR_STRING 0x02
  197. #define ACL_ATTR_STAR 0x04 /* attr is * only */
  198. union {
  199. char *attr_str;
  200. struct slapi_filter *attr_filter;
  201. }u;
  202. }Targetattr;
  203. typedef struct targetattrfilter {
  204. char *attr_str;
  205. char *filterStr;
  206. struct slapi_filter *filter; /* value filter */
  207. }Targetattrfilter;
  208. typedef struct Aci_Macro {
  209. char *match_this;
  210. char *macro_ptr; /* ptr into match_this */
  211. }aciMacro;
  212. typedef PLHashTable acl_ht_t;
  213. /* Access Control Item (aci): Stores information about a particular ACL */
  214. typedef struct aci {
  215. int aci_type; /* Type of resurce */
  216. /* THE FIRST BYTE WAS USED TO KEEP THE RIGHTS. ITS BEEN MOVED TO
  217. ** aci_access and is now free.
  218. **
  219. **
  220. **
  221. */
  222. #define ACI_TARGET_MACRO_DN (int)0x0000001
  223. #define ACI_TARGET_FILTER_MACRO_DN (int)0x0000002
  224. #define ACI_TARGET_DN (int)0x0000100 /* target has DN */
  225. #define ACI_TARGET_ATTR (int)0x0000200 /* target is an attr */
  226. #define ACI_TARGET_PATTERN (int)0x0000400 /* target has some patt */
  227. #define ACI_TARGET_FILTER (int)0x0000800 /* target has a filter */
  228. #define ACI_ACLTXT (int)0x0001000 /* ACI has text only */
  229. #define ACI_TARGET_NOT (int)0x0002000 /* it's a != */
  230. #define ACI_TARGET_ATTR_NOT (int)0x0004000 /* It's a != manager */
  231. #define ACI_TARGET_FILTER_NOT (int)0x0008000 /* It's a != filter */
  232. #define ACI_UNUSED2 (int)0x0010000 /* Unused */
  233. #define ACI_HAS_ALLOW_RULE (int)0x0020000 /* allow (...) */
  234. #define ACI_HAS_DENY_RULE (int)0x0040000 /* deny (...) */
  235. #define ACI_CONTAIN_NOT_USERDN (int)0x0080000 /* userdn != blah */
  236. #define ACI_TARGET_ATTR_ADD_FILTERS (int)0x0100000
  237. #define ACI_TARGET_ATTR_DEL_FILTERS (int)0x0200000
  238. #define ACI_CONTAIN_NOT_GROUPDN (int)0x0400000 /* groupdn != blah */
  239. #define ACI_CONTAIN_NOT_ROLEDN (int)0x0800000
  240. #define ACI_TARGET_MODDN (int)0x1000000
  241. #define ACI_TARGET_MODDN_FROM_PATTERN (int)0x2000000
  242. #define ACI_TARGET_MODDN_TO_PATTERN (int)0x4000000
  243. int aci_access;
  244. /*
  245. * See also aclpb_access which is used to store rights too.
  246. */
  247. short aci_ruleType; /* kinds of rules in the ACL */
  248. #define ACI_USERDN_RULE (short) 0x0001
  249. #define ACI_USERDNATTR_RULE (short) 0x0002
  250. #define ACI_GROUPDN_RULE (short) 0x0004
  251. #define ACI_GROUPDNATTR_RULE (short) 0x0008
  252. #define ACI_AUTHMETHOD_RULE (short) 0x0010
  253. #define ACI_IP_RULE (short) 0x0020
  254. #define ACI_DNS_RULE (short) 0x0040
  255. #define ACI_TIMEOFDAY_RULE (short) 0x0080
  256. #define ACI_DAYOFWEEK_RULE (short) 0x0010
  257. #define ACI_USERATTR_RULE (short) 0x0200
  258. /*
  259. * These are extension of USERDN/GROUPDN rule. However since the
  260. * semantics are quite different, we classify them as different rules.
  261. * ex: groupdn = "ldap:///cn=helpdesk, ou=$attr.dept, o=$dn.o, o=isp"
  262. */
  263. #define ACI_PARAM_DNRULE (short) 0x0400
  264. #define ACI_PARAM_ATTRRULE (short) 0x0800
  265. #define ACI_USERDN_SELFRULE (short) 0x1000
  266. #define ACI_ROLEDN_RULE (short) 0x2000
  267. #define ACI_SSF_RULE (short) 0x4000
  268. #define ACI_ATTR_RULES ( ACI_USERDNATTR_RULE | ACI_GROUPDNATTR_RULE | ACI_USERATTR_RULE | ACI_PARAM_DNRULE | ACI_PARAM_ATTRRULE | ACI_USERDN_SELFRULE)
  269. #define ACI_CACHE_RESULT_PER_ENTRY ACI_ATTR_RULES
  270. short aci_elevel; /* Based on the aci type some idea about the
  271. ** execution flow
  272. */
  273. int aci_index; /* index # */
  274. Slapi_DN *aci_sdn; /* location */
  275. Slapi_Filter *target; /* Target is a DN */
  276. Targetattr **targetAttr;
  277. char *targetFilterStr;
  278. struct slapi_filter *targetFilter; /* Target has a filter */
  279. Targetattrfilter **targetAttrAddFilters;
  280. Targetattrfilter **targetAttrDelFilters;
  281. Slapi_Filter *target_to; /* Target is the destination DN of moddn */
  282. Slapi_Filter *target_from; /* Target is the source DN of moddn */
  283. char *aclName; /* ACL name */
  284. struct ACLListHandle *aci_handle; /*handle of the ACL */
  285. aciMacro *aci_macro;
  286. struct aci *aci_next; /* next one */
  287. }aci_t;
  288. /* Aci excution level
  289. ** The idea is that for each handle types, we can prioritize which one to evaluate first.
  290. ** Evaluating the user before the group is better.
  291. */
  292. #define ACI_ELEVEL_USERDN_ANYONE 0
  293. #define ACI_ELEVEL_USERDN_ALL 1
  294. #define ACI_ELEVEL_USERDN 2
  295. #define ACI_ELEVEL_USERDNATTR 3
  296. #define ACI_ELEVEL_GROUPDNATTR_URL 4
  297. #define ACI_ELEVEL_GROUPDNATTR 5
  298. #define ACI_ELEVEL_GROUPDN 6
  299. #define ACI_MAX_ELEVEL ACI_ELEVEL_GROUPDN +1
  300. #define ACI_DEFAULT_ELEVEL ACI_MAX_ELEVEL
  301. #define ACL_PLUGIN_CONFIG_ENTRY_DN "cn=ACL Plugin,cn=plugins,cn=config"
  302. /*
  303. * In plugin config entry, set this attribute to change the value
  304. * of aclpb_max_selected_acls and aclpb_max_cache_results.
  305. * If not set, DEFAULT_ACLPB_MAX_SELECTED_ACLS will be used.
  306. */
  307. #define ATTR_ACLPB_MAX_SELECTED_ACLS "nsslapd-aclpb-max-selected-acls"
  308. #define DEFAULT_ACLPB_MAX_SELECTED_ACLS 200
  309. int aclpb_max_selected_acls; /* initialized from plugin config entry */
  310. int aclpb_max_cache_results; /* initialized from plugin config entry */
  311. typedef struct result_cache {
  312. int aci_index;
  313. short aci_ruleType;
  314. short result;
  315. #define ACLPB_CACHE_READ_RES_ALLOW (short)0x0001 /* used for ALLOW handles only */
  316. #define ACLPB_CACHE_READ_RES_DENY (short)0x0002 /* used for DENY handles only */
  317. #define ACLPB_CACHE_SEARCH_RES_ALLOW (short)0x0004 /* used for ALLOW handles only */
  318. #define ACLPB_CACHE_SEARCH_RES_DENY (short)0x0008 /* used for DENY handles only */
  319. #define ACLPB_CACHE_SEARCH_RES_SKIP (short)0x0010 /* used for both types */
  320. #define ACLPB_CACHE_READ_RES_SKIP (short)0x0020 /* used for both types */
  321. #define ACLPB_CACHE_ERROR_REPORTED (short)0x8000 /* error is reported */
  322. }r_cache_t;
  323. /*
  324. * This is use to keep the result of the evaluation of the attr.
  325. * We are only intrested in read/searc only.
  326. */
  327. struct acl_attrEval {
  328. char *attrEval_name; /* Attribute Name */
  329. short attrEval_r_status; /* status of read evaluation */
  330. short attrEval_s_status; /* status of search evaluation */
  331. int attrEval_r_aciIndex; /* Index of the ACL which grants access*/
  332. int attrEval_s_aciIndex; /* Index of the ACL which grants access*/
  333. #define ACL_ATTREVAL_SUCCESS 0x1
  334. #define ACL_ATTREVAL_FAIL 0x2
  335. #define ACL_ATTREVAL_RECOMPUTE 0x4
  336. #define ACL_ATTREVAL_DETERMINISTIC 7
  337. #define ACL_ATTREVAL_INVALID 0x8
  338. };
  339. typedef struct acl_attrEval AclAttrEval;
  340. /*
  341. * Struct to keep the evaluation context information. This struct is
  342. * used in multiple places ( different instance ) to keep the context for
  343. * current entry evaluation, previous entry evaluation or previous operation
  344. * evaluation status.
  345. */
  346. #define ACLPB_MAX_ATTR_LEN 100
  347. #define ACLPB_MAX_ATTRS 100
  348. struct acleval_context {
  349. /* Information about the attrs */
  350. AclAttrEval acle_attrEval[ACLPB_MAX_ATTRS];
  351. short acle_numof_attrs;
  352. /* Handles information */
  353. short acle_numof_tmatched_handles;
  354. int *acle_handles_matched_target;
  355. };
  356. typedef struct acleval_context aclEvalContext;
  357. struct acl_usergroup {
  358. short aclug_signature;
  359. /*
  360. * To modify refcnt you need either the write lock on the whole cache or
  361. * the reader lock on the whole cache plus this refcnt mutex
  362. */
  363. short aclug_refcnt;
  364. PRLock *aclug_refcnt_mutex;
  365. char *aclug_ndn; /* Client's normalized DN */
  366. char **aclug_member_groups;
  367. short aclug_member_group_size;
  368. short aclug_numof_member_group;
  369. char **aclug_notmember_groups;
  370. short aclug_notmember_group_size;
  371. short aclug_numof_notmember_group;
  372. struct acl_usergroup *aclug_next;
  373. struct acl_usergroup *aclug_prev;
  374. };
  375. typedef struct acl_usergroup aclUserGroup;
  376. #define ACLUG_INCR_GROUPS_LIST 20
  377. struct aci_container {
  378. Slapi_DN *acic_sdn; /* node DN */
  379. aci_t *acic_list; /* List of the ACLs for that node */
  380. int acic_index; /* index to the container array */
  381. };
  382. typedef struct aci_container AciContainer;
  383. struct acl_pblock {
  384. int aclpb_state;
  385. #define ACLPB_ACCESS_ALLOWED_ON_A_ATTR 0x000001
  386. #define ACLPB_ACCESS_DENIED_ON_ALL_ATTRS 0x000002
  387. #define ACLPB_ACCESS_ALLOWED_ON_ENTRY 0x000004
  388. #define ACLPB_ATTR_STAR_MATCHED 0x000008
  389. #define ACLPB_FOUND_ATTR_RULE 0x000010
  390. #define ACLPB_SEARCH_BASED_ON_LIST 0x000020
  391. #define ACLPB_EXECUTING_DENY_HANDLES 0x000040
  392. #define ACLPB_EXECUTING_ALLOW_HANDLES 0x000080
  393. #define ACLPB_ACCESS_ALLOWED_USERATTR 0x000100
  394. #ifdef DETERMINE_ACCESS_BASED_ON_REQUESTED_ATTRIBUTES
  395. #define ACLPB_USER_SPECIFIED_ATTARS 0x000200
  396. #define ACLPB_USER_WANTS_ALL_ATTRS 0x000400
  397. #endif
  398. #define ACLPB_EVALUATING_FIRST_ATTR 0x000800
  399. #define ACLPB_FOUND_A_ENTRY_TEST_RULE 0x001000
  400. #define ACLPB_SEARCH_BASED_ON_ENTRY_LIST 0x002000
  401. #define ACLPB_DONOT_USE_CONTEXT_ACLS 0x004000
  402. #define ACLPB_HAS_ACLCB_EVALCONTEXT 0x008000
  403. #define ACLPB_COPY_EVALCONTEXT 0x010000
  404. #define ACLPB_MATCHES_ALL_ACLS 0x020000
  405. #define ACLPB_INITIALIZED 0x040000
  406. #define ACLPB_INCR_ACLCB_CACHE 0x080000
  407. #define ACLPB_UPD_ACLCB_CACHE 0x100000
  408. #define ACLPB_ATTR_RULE_EVALUATED 0x200000
  409. #define ACLPB_DONOT_EVALUATE_PROXY 0x400000
  410. #define ACLPB_CACHE_RESULT_PER_ENTRY_SKIP 0x800000
  411. #define ACLPB_RESET_MASK ( ACLPB_ACCESS_ALLOWED_ON_A_ATTR | ACLPB_ACCESS_DENIED_ON_ALL_ATTRS | \
  412. ACLPB_ACCESS_ALLOWED_ON_ENTRY | ACLPB_ATTR_STAR_MATCHED | \
  413. ACLPB_FOUND_ATTR_RULE | ACLPB_EVALUATING_FIRST_ATTR | \
  414. ACLPB_FOUND_A_ENTRY_TEST_RULE )
  415. #define ACLPB_STATE_ALL 0xffffff
  416. int aclpb_res_type;
  417. #define ACLPB_NEW_ENTRY 0x100
  418. #define ACLPB_EFFECTIVE_RIGHTS 0x200
  419. #define ACLPB_RESTYPE_ALL 0x7ff
  420. /*
  421. * The bottom bye used to be for rights. It's free now as they have
  422. * been moved to aclpb_access.
  423. */
  424. int aclpb_access;
  425. #define ACLPB_SLAPI_ACL_WRITE_ADD 0x200
  426. #define ACLPB_SLAPI_ACL_WRITE_DEL 0x400
  427. /* stores the requested access during an operation */
  428. short aclpb_signature;
  429. short aclpb_type;
  430. #define ACLPB_TYPE_MAIN 1
  431. #define ACLPB_TYPE_MAIN_STR "Main Block"
  432. #define ACLPB_TYPE_PROXY 2
  433. #define ACLPB_TYPE_PROXY_STR "Proxy Block"
  434. Slapi_Entry *aclpb_client_entry; /* A copy of client's entry */
  435. Slapi_PBlock *aclpb_pblock; /* back to LDAP PBlock */
  436. int aclpb_optype; /* current optype from pb */
  437. /* Current entry/dn/attr evaluation info */
  438. Slapi_Entry *aclpb_curr_entry; /* current Entry being processed */
  439. int aclpb_num_entries;
  440. Slapi_DN *aclpb_curr_entry_sdn; /* Entry's SDN */
  441. Slapi_DN *aclpb_authorization_sdn; /* dn used for authorization */
  442. AclAttrEval *aclpb_curr_attrEval; /* Current attr being evaluated */
  443. struct berval *aclpb_curr_attrVal; /* Value of Current attr */
  444. Slapi_Entry *aclpb_filter_test_entry; /* Scratch entry */
  445. aci_t *aclpb_curr_aci;
  446. char *aclpb_Evalattr; /* The last attr evaluated */
  447. /* Source entry (MODDN) */
  448. Slapi_DN *aclpb_moddn_source_sdn; /* This is a pointer into the pb, do not free it */
  449. /* Plist and eval info */
  450. ACLEvalHandle_t *aclpb_acleval; /* acleval handle for evaluation */
  451. struct PListStruct_s *aclpb_proplist;/* All the needed property */
  452. /* DENY ACI HANDLES */
  453. aci_t **aclpb_deny_handles;
  454. int aclpb_deny_handles_size;
  455. int aclpb_num_deny_handles;
  456. /* ALLOW ACI HANDLES */
  457. aci_t **aclpb_allow_handles;
  458. int aclpb_allow_handles_size;
  459. int aclpb_num_allow_handles;
  460. /* This is used in the groupdnattr="URL" rule
  461. ** Keep a list of base where searched has been done
  462. */
  463. char **aclpb_grpsearchbase;
  464. int aclpb_grpsearchbase_size;
  465. int aclpb_numof_bases;
  466. aclUserGroup *aclpb_groupinfo;
  467. /* Keep the Group nesting level */
  468. int aclpb_max_nesting_level;
  469. int aclpb_max_member_sizelimit;
  470. /* To keep the results in the cache */
  471. int aclpb_last_cache_result;
  472. struct result_cache *aclpb_cache_result;
  473. /* Index numbers of ACLs selected based on a locality search*/
  474. char *aclpb_search_base;
  475. int *aclpb_base_handles_index;
  476. int *aclpb_handles_index;
  477. /* Evaluation context info
  478. ** 1) Context cached from aclcb ( from connection struct )
  479. ** 2) Context cached from previous entry evaluation
  480. ** 3) current entry evaluation info
  481. */
  482. aclEvalContext aclpb_curr_entryEval_context;
  483. aclEvalContext aclpb_prev_entryEval_context;
  484. aclEvalContext aclpb_prev_opEval_context;
  485. /* Currentry anom profile sumamry */
  486. struct scoped_entry_anominfo aclpb_scoped_entry_anominfo;
  487. /* Some Statistics gathering */
  488. PRUint16 aclpb_stat_acllist_scanned;
  489. PRUint16 aclpb_stat_aclres_matched;
  490. PRUint16 aclpb_stat_total_entries;
  491. PRUint16 aclpb_stat_anom_list_scanned;
  492. PRUint16 aclpb_stat_num_copycontext;
  493. PRUint16 aclpb_stat_num_copy_attrs;
  494. PRUint16 aclpb_stat_num_tmatched_acls;
  495. PRUint16 aclpb_stat_unused;
  496. CERTCertificate *aclpb_clientcert;
  497. AciContainer *aclpb_aclContainer;
  498. struct acl_pblock *aclpb_proxy; /* Child proxy block */
  499. acl_ht_t *aclpb_macro_ht; /* ht for partial macro strs */
  500. struct acl_pblock *aclpb_prev; /* Previpous in the chain */
  501. struct acl_pblock *aclpb_next; /* Next in the chain */
  502. };
  503. typedef struct acl_pblock Acl_PBlock;
  504. /* PBLCOK TYPES */
  505. typedef enum
  506. {
  507. ACLPB_BINDDN_PBLOCK,
  508. ACLPB_PROXYDN_PBLOCK,
  509. ACLPB_ALL_PBLOCK
  510. }aclpb_types;
  511. #define ACLPB_EVALCONTEXT_CURR 1
  512. #define ACLPB_EVALCONTEXT_PREV 2
  513. #define ACLPB_EVALCONTEXT_ACLCB 3
  514. /* Cleaning/ deallocating/ ... acl_freeBlock() */
  515. #define ACL_CLEAN_ACLPB 1
  516. #define ACL_COPY_ACLCB 2
  517. #define ACL_CLEAN_ACLCB 3
  518. /* used to differentiate acl plugins sharing the same lib */
  519. #define ACL_PLUGIN_IDENTITY 1
  520. #define ACL_PREOP_PLUGIN_IDENTITY 2
  521. /* start with 50 and then add 50 more as required
  522. * The first ACI_MAX_ELEVEL slots are predefined.
  523. */
  524. #define ACLPB_INCR_LIST_HANDLES ACI_MAX_ELEVEL + 43
  525. #define ACLPB_INCR_BASES 5
  526. /*
  527. * acl private block which hangs from connection structure.
  528. * This is allocated the first time an operation is done and freed when the
  529. * connection are cleaned.
  530. *
  531. */
  532. struct acl_cblock {
  533. short aclcb_aclsignature;
  534. short aclcb_state;
  535. #define ACLCB_HAS_CACHED_EVALCONTEXT 0x1
  536. Slapi_DN *aclcb_sdn; /* Contains bind SDN */
  537. aclEvalContext aclcb_eval_context;
  538. PRLock *aclcb_lock; /* shared lock */
  539. };
  540. struct acl_groupcache {
  541. short aclg_state; /* status information */
  542. short aclg_signature;
  543. int aclg_num_userGroups;
  544. aclUserGroup *aclg_first;
  545. aclUserGroup *aclg_last;
  546. Slapi_RWLock *aclg_rwlock; /* lock to monitor the group cache */
  547. };
  548. typedef struct acl_groupcache aclGroupCache;
  549. /* Type of extensions that can be registered */
  550. typedef enum
  551. {
  552. ACL_EXT_OPERATION, /* extension for Operation object */
  553. ACL_EXT_CONNECTION, /* extension for Connection object */
  554. ACL_EXT_ALL
  555. }ext_type;
  556. /* Used to pass data around in acllas.c */
  557. typedef struct {
  558. char *clientDn;
  559. char *authType;
  560. int anomUser;
  561. Acl_PBlock *aclpb;
  562. Slapi_Entry *resourceEntry;
  563. int ssf;
  564. char *ldapi;
  565. }lasInfo;
  566. /* reasons why the subject allowed/denied access--good for logs */
  567. typedef enum{
  568. ACL_REASON_NO_ALLOWS,
  569. ACL_REASON_RESULT_CACHED_DENY,
  570. ACL_REASON_EVALUATED_DENY, /* evaluated deny */
  571. ACL_REASON_RESULT_CACHED_ALLOW, /* cached allow */
  572. ACL_REASON_EVALUATED_ALLOW, /* evalauted allow */
  573. ACL_REASON_NO_MATCHED_RESOURCE_ALLOWS, /* were allows/denies, but none matched */
  574. ACL_REASON_NONE, /* no reason available */
  575. ACL_REASON_ANON_ALLOWED,
  576. ACL_REASON_ANON_DENIED,
  577. ACL_REASON_NO_MATCHED_SUBJECT_ALLOWS,
  578. ACL_REASON_EVALCONTEXT_CACHED_ALLOW,
  579. ACL_REASON_EVALCONTEXT_CACHED_NOT_ALLOWED,
  580. ACL_REASON_EVALCONTEXT_CACHED_ATTR_STAR_ALLOW
  581. }aclReasonCode_t;
  582. typedef struct{
  583. aci_t *deciding_aci;
  584. aclReasonCode_t reason;
  585. }aclResultReason_t;
  586. #define ACL_NO_DECIDING_ACI_INDEX -10
  587. /* Extern declaration for backend state change fnc: acllist.c and aclinit.c */
  588. void acl_be_state_change_fnc ( void *handle, char *be_name, int old_state,
  589. int new_state);
  590. /* Extern declaration for ATTRs */
  591. extern int
  592. DS_LASIpGetter(NSErr_t *errp, PList_t subject, PList_t resource, PList_t
  593. auth_info, PList_t global_auth, void *arg);
  594. extern int
  595. DS_LASDnsGetter(NSErr_t *errp, PList_t subject, PList_t resource, PList_t
  596. auth_info, PList_t global_auth, void *arg);
  597. extern int
  598. DS_LASUserDnGetter(NSErr_t *errp, PList_t subject, PList_t resource, PList_t
  599. auth_info, PList_t global_auth, void *arg);
  600. extern int
  601. DS_LASGroupDnGetter(NSErr_t *errp, PList_t subject, PList_t resource, PList_t
  602. auth_info, PList_t global_auth, void *arg);
  603. extern int
  604. DS_LASEntryGetter(NSErr_t *errp, PList_t subject, PList_t resource,
  605. PList_t auth_info, PList_t global_auth, void *arg);
  606. extern int
  607. DS_LASCertGetter(NSErr_t *errp, PList_t subject, PList_t resource,
  608. PList_t auth_info, PList_t global_auth, void *arg);
  609. /* function declartion for LAses supported by DS */
  610. extern int DS_LASUserEval(NSErr_t *errp, char *attribute, CmpOp_t comparator,
  611. char *pattern, int *cachable, void **las_cookie,
  612. PList_t subject, PList_t resource, PList_t auth_info,
  613. PList_t global_auth);
  614. extern int DS_LASGroupEval(NSErr_t *errp, char *attribute, CmpOp_t comparator,
  615. char *pattern, int *cachable, void **las_cookie,
  616. PList_t subject, PList_t resource, PList_t auth_info,
  617. PList_t global_auth);
  618. extern int DS_LASUserDnEval(NSErr_t *errp, char *attribute, CmpOp_t comparator,
  619. char *pattern, int *cachable, void **las_cookie,
  620. PList_t subject, PList_t resource, PList_t auth_info,
  621. PList_t global_auth);
  622. extern int DS_LASGroupDnEval(NSErr_t *errp, char *attribute, CmpOp_t comparator,
  623. char *pattern, int *cachable, void **las_cookie,
  624. PList_t subject, PList_t resource, PList_t auth_info,
  625. PList_t global_auth);
  626. extern int DS_LASRoleDnEval(NSErr_t *errp, char *attr_name, CmpOp_t comparator,
  627. char *attr_pattern, int *cachable, void **LAS_cookie,
  628. PList_t subject, PList_t resource, PList_t auth_info,
  629. PList_t global_auth);
  630. extern int DS_LASUserDnAttrEval(NSErr_t *errp, char *attribute,
  631. CmpOp_t comparator,
  632. char *pattern, int *cachable, void **las_cookie,
  633. PList_t subject, PList_t resource, PList_t auth_info,
  634. PList_t global_auth);
  635. extern int DS_LASAuthMethodEval(NSErr_t *errp, char *attribute,
  636. CmpOp_t comparator,
  637. char *pattern, int *cachable, void **las_cookie,
  638. PList_t subject, PList_t resource, PList_t auth_info,
  639. PList_t global_auth);
  640. extern int DS_LASGroupDnAttrEval(NSErr_t *errp, char *attribute,
  641. CmpOp_t comparator,
  642. char *pattern, int *cachable, void **las_cookie,
  643. PList_t subject, PList_t resource, PList_t auth_info,
  644. PList_t global_auth);
  645. extern int DS_LASRoleDnAttrEval(NSErr_t *errp, char *attribute,
  646. CmpOp_t comparator,
  647. char *pattern, int *cachable, void **las_cookie,
  648. PList_t subject, PList_t resource, PList_t auth_info,
  649. PList_t global_auth);
  650. extern int DS_LASUserAttrEval(NSErr_t *errp, char *attribute,
  651. CmpOp_t comparator,
  652. char *pattern, int *cachable, void **las_cookie,
  653. PList_t subject, PList_t resource, PList_t auth_info,
  654. PList_t global_auth);
  655. extern int DS_LASSSFEval(NSErr_t *errp, char *attribute,
  656. CmpOp_t comparator,
  657. char *pattern, int *cachable, void **las_cookie,
  658. PList_t subject, PList_t resource, PList_t auth_info,
  659. PList_t global_auth);
  660. /* other function declaration */
  661. int aclinit_main();
  662. int acl_match_substring (struct slapi_filter *f, char *str, int match);
  663. void acl_print_acllib_err(NSErr_t *errp, char * str);
  664. void acl_initBlock ( Slapi_PBlock *pb );
  665. void acl_freeBlock ( Slapi_PBlock *pb, int state );
  666. int acl_read_access_allowed_on_entry ( Slapi_PBlock *pb, Slapi_Entry *e,
  667. char **attrs, int access);
  668. int acl_access_allowed_modrdn ( Slapi_PBlock *pb, Slapi_Entry *e, char *attr,
  669. struct berval *val, int access);
  670. int acl_read_access_allowed_on_attr ( Slapi_PBlock *pb, Slapi_Entry *e, char *attr,
  671. struct berval *val, int access);
  672. void acl_set_acllist (Slapi_PBlock *pb, int scope, char *base);
  673. void acl_gen_err_msg(int access, char *edn, char *attr, char **errbuf);
  674. void acl_modified (Slapi_PBlock *pb, int optype, Slapi_DN *e_sdn, void *change);
  675. int acl_access_allowed_disjoint_resource( Slapi_PBlock *pb, Slapi_Entry *e,
  676. char *attr, struct berval *val, int access );
  677. int acl_access_allowed_main ( Slapi_PBlock *pb, Slapi_Entry *e, char **attrs,
  678. struct berval *val, int access , int flags, char **errbuf);
  679. int acl_access_allowed( Slapi_PBlock *pb, Slapi_Entry *e, char *attr,
  680. struct berval *val, int access );
  681. aclUserGroup * acl_get_usersGroup ( struct acl_pblock *aclpb , char *n_dn);
  682. void acl_print_acllib_err (NSErr_t *errp , char * str);
  683. int acl_check_mods( Slapi_PBlock *pb, Slapi_Entry *e, LDAPMod **mods, char **errbuf );
  684. char * acl__access2str(int access);
  685. void acl_strcpy_special (char *d, char *s);
  686. int acl_parse(Slapi_PBlock *pb, char * str, aci_t *aci_item, char **errbuf);
  687. int acl_verify_aci_syntax (Slapi_PBlock *pb, Slapi_Entry *e, char **errbuf);
  688. int acl_verify_syntax(Slapi_PBlock *pb, const Slapi_DN *e_sdn,
  689. const struct berval *bval, char **errbuf);
  690. int acllist_insert_aci_needsLock_ext( Slapi_PBlock *pb, const Slapi_DN *e_sdn,
  691. const struct berval* aci_attr);
  692. char * acl_access2str ( int access );
  693. int acl_init_ext ();
  694. void * acl_get_ext (ext_type type, void *object);
  695. void acl_set_ext (ext_type type, void *object, void *data);
  696. void acl_reset_ext_status (ext_type type, void *object);
  697. void acl_init_op_ext ( Slapi_PBlock *pb , int type, char *dn, int copy);
  698. void * acl_operation_ext_constructor (void *object, void *parent );
  699. void acl_operation_ext_destructor ( void *ext, void *object, void *parent );
  700. void * acl_conn_ext_constructor (void *object, void *parent );
  701. void acl_conn_ext_destructor ( void *ext, void *object, void *parent );
  702. void acl_clean_aclEval_context ( aclEvalContext *clean_me, int scrub_only );
  703. void acl_copyEval_context ( struct acl_pblock *aclpb, aclEvalContext *src,
  704. aclEvalContext *dest , int copy_attr_only );
  705. struct acl_pblock * acl_get_aclpb ( Slapi_PBlock *pb, int type );
  706. int acl_client_anonymous ( Slapi_PBlock *pb );
  707. short acl_get_aclsignature();
  708. void acl_set_aclsignature( short value);
  709. void acl_regen_aclsignature();
  710. struct acl_pblock * acl_new_proxy_aclpb( Slapi_PBlock *pb );
  711. void acl_set_authorization_dn( Slapi_PBlock *pb, char *dn, int type );
  712. void acl_init_aclpb ( Slapi_PBlock *pb , Acl_PBlock *aclpb,
  713. const char *dn, int copy_from_aclcb);
  714. int acl_create_aclpb_pool ();
  715. void acl_destroy_aclpb_pool ();
  716. int acl_skip_access_check ( Slapi_PBlock *pb, Slapi_Entry *e );
  717. int aclext_alloc_lockarray ();
  718. void aclext_free_lockarray();
  719. int aclutil_str_append(char **str1, const char *str2);
  720. void aclutil_print_err (int rv , const Slapi_DN *sdn,
  721. const struct berval* val, char **errbuf);
  722. void aclutil_print_aci (aci_t *aci_item, char *type);
  723. short aclutil_gen_signature ( short c_signature );
  724. void aclutil_print_resource( struct acl_pblock *aclpb, const char *right , char *attr, char *clientdn );
  725. char * aclutil_expand_paramString ( char *str, Slapi_Entry *e );
  726. void acllist_init_scan (Slapi_PBlock *pb, int scope, const char *base);
  727. aci_t * acllist_get_first_aci (Acl_PBlock *aclpb, PRUint32 *cookie );
  728. aci_t * acllist_get_next_aci ( Acl_PBlock *aclpb, aci_t *curraci, PRUint32 *cookie );
  729. aci_t * acllist_get_aci_new ();
  730. void acllist_free_aci (aci_t *item);
  731. void acllist_acicache_READ_UNLOCK(void);
  732. void acllist_acicache_READ_LOCK(void);
  733. void acllist_acicache_WRITE_UNLOCK(void);
  734. void acllist_acicache_WRITE_LOCK(void);
  735. void acllist_aciscan_update_scan ( Acl_PBlock *aclpb, char *edn );
  736. int acllist_remove_aci_needsLock( const Slapi_DN *sdn, const struct berval *attr );
  737. void free_acl_avl_list();
  738. int acllist_insert_aci_needsLock( const Slapi_DN *e_sdn, const struct berval* aci_attr);
  739. int acllist_init ();
  740. void acllist_free();
  741. int acllist_moddn_aci_needsLock ( Slapi_DN *oldsdn, char *newdn );
  742. void acllist_print_tree ( Avlnode *root, int *depth, char *start, char *side);
  743. AciContainer *acllist_get_aciContainer_new ( );
  744. void acllist_free_aciContainer ( AciContainer **container);
  745. void acllist_done_aciContainer ( AciContainer *);
  746. void free_targetattrfilters( Targetattrfilter ***attrFilterArray);
  747. aclUserGroup* aclg_find_userGroup (const char *n_dn);
  748. void aclg_regen_ugroup_signature( aclUserGroup *ugroup);
  749. void aclg_markUgroupForRemoval ( aclUserGroup *u_group );
  750. void aclg_reader_incr_ugroup_refcnt(aclUserGroup* u_group);
  751. int aclg_numof_usergroups(void);
  752. int aclgroup_init ();
  753. void aclgroup_free();
  754. void aclg_regen_group_signature ();
  755. void aclg_reset_userGroup ( struct acl_pblock *aclpb );
  756. void aclg_init_userGroup ( struct acl_pblock *aclpb, const char *dn , int got_lock);
  757. aclUserGroup * aclg_get_usersGroup ( struct acl_pblock *aclpb , char *n_dn);
  758. void aclg_lock_groupCache (int type );
  759. void aclg_unlock_groupCache (int type );
  760. int aclanom_init();
  761. int aclanom_match_profile (Slapi_PBlock *pb, struct acl_pblock *aclpb,
  762. Slapi_Entry *e, char *attr, int access);
  763. void aclanom_get_suffix_info(Slapi_Entry *e, struct acl_pblock *aclpb );
  764. void aclanom_invalidateProfile();
  765. void aclanom__del_profile (int closing);
  766. typedef enum{
  767. DONT_TAKE_ACLCACHE_READLOCK,
  768. DO_TAKE_ACLCACHE_READLOCK,
  769. DONT_TAKE_ACLCACHE_WRITELOCK,
  770. DO_TAKE_ACLCACHE_WRITELOCK
  771. }acl_lock_flag_t;
  772. void aclanom_gen_anomProfile (acl_lock_flag_t lock_flag);
  773. int aclanom_is_client_anonymous ( Slapi_PBlock *pb );
  774. int aclinit_main ();
  775. typedef struct aclinit_handler_callback_data {
  776. #define ACL_ADD_ACIS 1
  777. #define ACL_REMOVE_ACIS 0
  778. int op;
  779. int retCode;
  780. acl_lock_flag_t lock_flag;
  781. }aclinit_handler_callback_data_t;
  782. int
  783. aclinit_search_and_update_aci ( int thisbeonly, const Slapi_DN *base,
  784. char *be_name, int scope, int op,
  785. acl_lock_flag_t lock_flag);
  786. void *aclplugin_get_identity(int plug);
  787. int
  788. acl_dn_component_match( const char *ndn, char *match_this, int component_number);
  789. char *
  790. acl_match_macro_in_target( const char *ndn, char *match_this,
  791. char *macro_ptr);
  792. char* get_next_component(char *dn, int *index);
  793. int acl_match_prefix( char *macro_prefix, const char *ndn,
  794. int *exact_match);
  795. char *
  796. get_this_component(char *dn, int *index);
  797. int
  798. acl_find_comp_end( char * s);
  799. char *
  800. acl_replace_str(char * s, char *substr, char* replace_with);
  801. int acl_strstr(char * s, char *substr);
  802. int aclutil_evaluate_macro( char * rule, lasInfo *lasinfo,
  803. acl_eval_types evalType );
  804. int aclutil_str_append_ext(char **dest, size_t *dlen, const char *src, size_t slen);
  805. /* acl hash table functions */
  806. void acl_ht_add_and_freeOld(acl_ht_t * acl_ht, PLHashNumber key,char *value);
  807. void acl_ht_remove_and_free(acl_ht_t * acl_ht, PLHashNumber key);
  808. acl_ht_t *acl_ht_new(void);
  809. void acl_ht_free_all_entries_and_values( acl_ht_t *acl_ht);
  810. void acl_ht_remove( acl_ht_t *acl_ht, PLHashNumber key);
  811. void *acl_ht_lookup( acl_ht_t *acl_ht, PLHashNumber key);
  812. void acl_ht_display_ht( acl_ht_t *acl_ht);
  813. /* acl get effective rights */
  814. int
  815. acl_get_effective_rights ( Slapi_PBlock *pb, Slapi_Entry *e,
  816. char **attrs, struct berval *val, int access, char **errbuf );
  817. char* aclutil__access_str (int type , char str[]);
  818. int aclplugin_preop_common( Slapi_PBlock *pb );
  819. #endif /* _ACL_H_ */