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