1 #ifndef ACL_API_PRIVATE_H
2 #define ACL_API_PRIVATE_H
3 
4 #include "acl-api.h"
5 
6 #define ACL_ID_NAME_ANYONE "anyone"
7 #define ACL_ID_NAME_AUTHENTICATED "authenticated"
8 #define ACL_ID_NAME_OWNER "owner"
9 #define ACL_ID_NAME_USER_PREFIX "user="
10 #define ACL_ID_NAME_GROUP_PREFIX "group="
11 #define ACL_ID_NAME_GROUP_OVERRIDE_PREFIX "group-override="
12 
13 struct acl_backend_vfuncs {
14 	struct acl_backend *(*alloc)(void);
15 	int (*init)(struct acl_backend *backend, const char *data);
16 	void (*deinit)(struct acl_backend *backend);
17 
18 	struct acl_mailbox_list_context *
19 		(*nonowner_lookups_iter_init)(struct acl_backend *backend);
20 	bool (*nonowner_lookups_iter_next)(struct acl_mailbox_list_context *ctx,
21 					  const char **name_r);
22 	int (*nonowner_lookups_iter_deinit)
23 		(struct acl_mailbox_list_context *ctx);
24 	int (*nonowner_lookups_rebuild)(struct acl_backend *backend);
25 
26 	struct acl_object *(*object_init)(struct acl_backend *backend,
27 					  const char *name);
28 	struct acl_object *(*object_init_parent)(struct acl_backend *backend,
29 						 const char *child_name);
30 	void (*object_deinit)(struct acl_object *aclobj);
31 
32 	int (*object_refresh_cache)(struct acl_object *aclobj);
33 	int (*object_update)(struct acl_object *aclobj,
34 			     const struct acl_rights_update *update);
35 	int (*last_changed)(struct acl_object *aclobj, time_t *last_changed_r);
36 
37 	struct acl_object_list_iter *
38 		(*object_list_init)(struct acl_object *aclobj);
39 	bool (*object_list_next)(struct acl_object_list_iter *iter,
40 				struct acl_rights *rights_r);
41 	int (*object_list_deinit)(struct acl_object_list_iter *iter);
42 };
43 
44 struct acl_backend {
45 	pool_t pool;
46 	const char *username;
47 	const char **groups;
48 	unsigned int group_count;
49 
50 	struct mailbox_list *list;
51 	struct acl_cache *cache;
52 	struct acl_global_file *global_file;
53 
54 	struct acl_object *default_aclobj;
55 	struct acl_mask *default_aclmask;
56 	const char *const *default_rights;
57 
58 	struct acl_backend_vfuncs v;
59 
60 	bool owner:1;
61 	bool debug:1;
62 	bool globals_only:1;
63 };
64 
65 struct acl_mailbox_list_context {
66 	struct acl_backend *backend;
67 
68 	bool empty:1;
69 	bool failed:1;
70 	const char *error;
71 };
72 
73 struct acl_object {
74 	struct acl_backend *backend;
75 	char *name;
76 
77 	pool_t rights_pool;
78 	ARRAY_TYPE(acl_rights) rights;
79 };
80 
81 struct acl_object_list_iter {
82 	struct acl_object *aclobj;
83 	pool_t pool;
84 
85 	struct acl_rights *rights;
86 	unsigned int idx, count;
87 
88 	bool empty:1;
89 	bool failed:1;
90 	const char *error;
91 };
92 
93 extern const char *const all_mailbox_rights[];
94 
95 struct acl_object_list_iter *
96 acl_default_object_list_init(struct acl_object *aclobj);
97 bool acl_default_object_list_next(struct acl_object_list_iter *iter,
98 				  struct acl_rights *rights_r);
99 int acl_default_object_list_deinit(struct acl_object_list_iter *iter);
100 
101 const char *const *
102 acl_backend_mask_get_names(struct acl_backend *backend,
103 			   const struct acl_mask *mask, pool_t pool);
104 struct acl_object *acl_backend_get_default_object(struct acl_backend *backend);
105 int acl_backend_get_default_rights(struct acl_backend *backend,
106 				   const struct acl_mask **mask_r);
107 void acl_rights_write_id(string_t *dest, const struct acl_rights *right);
108 bool acl_rights_has_nonowner_lookup_changes(const struct acl_rights *rights);
109 
110 int acl_identifier_parse(const char *line, struct acl_rights *rights);
111 int acl_rights_update_import(struct acl_rights_update *update,
112 			     const char *id, const char *const *rights,
113 			     const char **error_r);
114 const char *acl_rights_export(const struct acl_rights *rights);
115 int acl_rights_parse_line(const char *line, pool_t pool,
116 			  struct acl_rights *rights_r, const char **error_r);
117 void acl_rights_dup(const struct acl_rights *src,
118 		    pool_t pool, struct acl_rights *dest_r);
119 int acl_rights_cmp(const struct acl_rights *r1, const struct acl_rights *r2);
120 void acl_rights_sort(struct acl_object *aclobj);
121 
122 const char *const *
123 acl_right_names_parse(pool_t pool, const char *acl, const char **error_r);
124 void acl_right_names_write(string_t *dest, const char *const *rights);
125 void acl_right_names_merge(pool_t pool, const char *const **destp,
126 			   const char *const *src, bool dup_strings);
127 bool acl_right_names_modify(pool_t pool,
128 			    const char *const **rightsp,
129 			    const char *const *modify_rights,
130 			    enum acl_modify_mode modify_mode);
131 void acl_object_rebuild_cache(struct acl_object *aclobj);
132 void acl_object_remove_all_access(struct acl_object *aclobj);
133 void acl_object_add_global_acls(struct acl_object *aclobj);
134 
135 #endif
136