1 #ifndef MAILBOX_LIST_PRIVATE_H 2 #define MAILBOX_LIST_PRIVATE_H 3 4 #include "mailbox-log.h" 5 #include "mailbox-list-notify.h" 6 #include "mail-namespace.h" 7 #include "mailbox-list.h" 8 #include "mailbox-list-iter.h" 9 #include "mail-storage-settings.h" 10 11 #define MAILBOX_LIST_NAME_MAILDIRPLUSPLUS "maildir++" 12 #define MAILBOX_LIST_NAME_IMAPDIR "imapdir" 13 #define MAILBOX_LIST_NAME_FS "fs" 14 #define MAILBOX_LIST_NAME_INDEX "index" 15 #define MAILBOX_LIST_NAME_NONE "none" 16 17 #define MAILBOX_LIST_INDEX_DEFAULT_PREFIX "dovecot.list.index" 18 #define MAILBOX_LOG_FILE_NAME "dovecot.mailbox.log" 19 20 #define T_MAILBOX_LIST_ERR_NOT_FOUND(list, name) \ 21 t_strdup_printf(MAIL_ERRSTR_MAILBOX_NOT_FOUND, \ 22 mailbox_list_get_vname(list, name)) 23 24 struct stat; 25 struct dirent; 26 struct fs; 27 struct imap_match_glob; 28 struct mailbox_tree_context; 29 struct mailbox_list_notify; 30 struct mailbox_list_notify_rec; 31 32 #define MAILBOX_INFO_FLAGS_FINISHED(flags) \ 33 (((flags) & (MAILBOX_SELECT | MAILBOX_NOSELECT | \ 34 MAILBOX_NONEXISTENT)) != 0) 35 36 struct mailbox_list_vfuncs { 37 struct mailbox_list *(*alloc)(void); 38 int (*init)(struct mailbox_list *list, const char **error_r); 39 void (*deinit)(struct mailbox_list *list); 40 41 int (*get_storage)(struct mailbox_list **list, const char *vname, 42 struct mail_storage **storage_r); 43 44 char (*get_hierarchy_sep)(struct mailbox_list *list); 45 const char *(*get_vname)(struct mailbox_list *list, 46 const char *storage_name); 47 const char *(*get_storage_name)(struct mailbox_list *list, 48 const char *vname); 49 int (*get_path)(struct mailbox_list *list, const char *name, 50 enum mailbox_list_path_type type, const char **path_r); 51 52 const char *(*get_temp_prefix)(struct mailbox_list *list, bool global); 53 const char *(*join_refpattern)(struct mailbox_list *list, 54 const char *ref, const char *pattern); 55 56 struct mailbox_list_iterate_context * 57 (*iter_init)(struct mailbox_list *list, 58 const char *const *patterns, 59 enum mailbox_list_iter_flags flags); 60 const struct mailbox_info * 61 (*iter_next)(struct mailbox_list_iterate_context *ctx); 62 int (*iter_deinit)(struct mailbox_list_iterate_context *ctx); 63 64 int (*get_mailbox_flags)(struct mailbox_list *list, 65 const char *dir, const char *fname, 66 enum mailbox_list_file_type type, 67 enum mailbox_info_flags *flags_r); 68 /* Returns TRUE if name is mailbox's internal file/directory. 69 If it does, mailbox deletion assumes it can safely delete it. */ 70 bool (*is_internal_name)(struct mailbox_list *list, const char *name); 71 72 /* Read subscriptions from src_list, but place them into 73 dest_list->subscriptions. Set errors to dest_list. */ 74 int (*subscriptions_refresh)(struct mailbox_list *src_list, 75 struct mailbox_list *dest_list); 76 int (*set_subscribed)(struct mailbox_list *list, 77 const char *name, bool set); 78 int (*delete_mailbox)(struct mailbox_list *list, const char *name); 79 int (*delete_dir)(struct mailbox_list *list, const char *name); 80 int (*delete_symlink)(struct mailbox_list *list, const char *name); 81 int (*rename_mailbox)(struct mailbox_list *oldlist, const char *oldname, 82 struct mailbox_list *newlist, const char *newname); 83 84 int (*notify_init)(struct mailbox_list *list, 85 enum mailbox_list_notify_event mask, 86 struct mailbox_list_notify **notify_r); 87 int (*notify_next)(struct mailbox_list_notify *notify, 88 const struct mailbox_list_notify_rec **rec_r); 89 void (*notify_deinit)(struct mailbox_list_notify *notify); 90 void (*notify_wait)(struct mailbox_list_notify *notify, 91 void (*callback)(void *context), void *context); 92 void (*notify_flush)(struct mailbox_list_notify *notify); 93 }; 94 95 struct mailbox_list_module_register { 96 unsigned int id; 97 }; 98 99 union mailbox_list_module_context { 100 struct mailbox_list_vfuncs super; 101 struct mailbox_list_module_register *reg; 102 }; 103 104 struct mailbox_list { 105 const char *name; 106 enum mailbox_list_properties props; 107 size_t mailbox_name_max_length; 108 109 struct mailbox_list_vfuncs v, *vlast; 110 111 /* private: */ 112 pool_t pool; 113 struct mail_namespace *ns; 114 struct mailbox_list_settings set; 115 const struct mail_storage_settings *mail_set; 116 enum mailbox_list_flags flags; 117 118 /* may not be set yet, use mailbox_list_get_permissions() to access */ 119 struct mailbox_permissions root_permissions; 120 121 struct mailbox_tree_context *subscriptions; 122 time_t subscriptions_mtime, subscriptions_read_time; 123 124 struct mailbox_log *changelog; 125 time_t changelog_timestamp; 126 127 struct file_lock *lock; 128 int lock_refcount; 129 130 pool_t guid_cache_pool; 131 HASH_TABLE(uint8_t *, struct mailbox_guid_cache_rec *) guid_cache; 132 bool guid_cache_errors; 133 134 /* Last error set in mailbox_list_set_critical(). */ 135 char *last_internal_error; 136 137 char *error_string; 138 enum mail_error error; 139 bool temporary_error; 140 ARRAY(struct mail_storage_error) error_stack; 141 142 ARRAY(union mailbox_list_module_context *) module_contexts; 143 144 bool index_root_dir_created:1; 145 bool list_index_root_dir_created:1; 146 bool guid_cache_updated:1; 147 bool disable_rebuild_on_corruption:1; 148 bool guid_cache_invalidated:1; 149 bool last_error_is_internal:1; 150 }; 151 152 union mailbox_list_iterate_module_context { 153 struct mailbox_list_module_register *reg; 154 }; 155 156 struct mailbox_list_iterate_context { 157 struct mailbox_list *list; 158 pool_t pool; 159 enum mailbox_list_iter_flags flags; 160 bool failed; 161 bool index_iteration; 162 163 struct imap_match_glob *glob; 164 struct mailbox_list_autocreate_iterate_context *autocreate_ctx; 165 struct mailbox_info specialuse_info; 166 167 ARRAY(union mailbox_list_iterate_module_context *) module_contexts; 168 }; 169 170 struct mailbox_list_iter_update_context { 171 struct mailbox_list_iterate_context *iter_ctx; 172 struct mailbox_tree_context *tree_ctx; 173 174 struct imap_match_glob *glob; 175 enum mailbox_info_flags leaf_flags, parent_flags; 176 177 bool update_only:1; 178 bool match_parents:1; 179 }; 180 181 /* Modules should use do "my_id = mailbox_list_module_id++" and 182 use objects' module_contexts[id] for their own purposes. */ 183 extern struct mailbox_list_module_register mailbox_list_module_register; 184 185 void mailbox_lists_init(void); 186 void mailbox_lists_deinit(void); 187 188 void mailbox_list_settings_init_defaults(struct mailbox_list_settings *set_r); 189 int mailbox_list_settings_parse(struct mail_user *user, const char *data, 190 struct mailbox_list_settings *set_r, 191 const char **error_r); 192 const char * 193 mailbox_list_escape_name_params(const char *vname, const char *ns_prefix, 194 char ns_sep, char list_sep, char escape_char, 195 const char *maildir_name); 196 const char * 197 mailbox_list_unescape_name_params(const char *src, const char *ns_prefix, 198 char ns_sep, char list_sep, char escape_char); 199 200 const char *mailbox_list_default_get_storage_name(struct mailbox_list *list, 201 const char *vname); 202 const char *mailbox_list_default_get_vname(struct mailbox_list *list, 203 const char *storage_name); 204 const char *mailbox_list_get_unexpanded_path(struct mailbox_list *list, 205 enum mailbox_list_path_type type); 206 bool mailbox_list_set_get_root_path(const struct mailbox_list_settings *set, 207 enum mailbox_list_path_type type, 208 const char **path_r); 209 210 int mailbox_list_delete_index_control(struct mailbox_list *list, 211 const char *name); 212 213 void mailbox_list_iter_update(struct mailbox_list_iter_update_context *ctx, 214 const char *name); 215 int mailbox_list_iter_subscriptions_refresh(struct mailbox_list *list); 216 const struct mailbox_info * 217 mailbox_list_iter_default_next(struct mailbox_list_iterate_context *ctx); 218 219 enum mailbox_list_file_type mailbox_list_get_file_type(const struct dirent *d); 220 int mailbox_list_dirent_is_alias_symlink(struct mailbox_list *list, 221 const char *dir_path, 222 const struct dirent *d); 223 bool mailbox_list_try_get_absolute_path(struct mailbox_list *list, 224 const char **name); 225 void mailbox_permissions_copy(struct mailbox_permissions *dest, 226 const struct mailbox_permissions *src, 227 pool_t pool); 228 229 void mailbox_list_add_change(struct mailbox_list *list, 230 enum mailbox_log_record_type type, 231 const guid_128_t guid_128); 232 void mailbox_name_get_sha128(const char *name, guid_128_t guid_128_r); 233 234 void mailbox_list_clear_error(struct mailbox_list *list); 235 void mailbox_list_set_error(struct mailbox_list *list, 236 enum mail_error error, const char *string); 237 void mailbox_list_set_critical(struct mailbox_list *list, const char *fmt, ...) 238 ATTR_FORMAT(2, 3); 239 void mailbox_list_set_internal_error(struct mailbox_list *list); 240 bool mailbox_list_set_error_from_errno(struct mailbox_list *list); 241 242 const struct mailbox_info * 243 mailbox_list_iter_autocreate_filter(struct mailbox_list_iterate_context *ctx, 244 const struct mailbox_info *_info); 245 246 int mailbox_list_lock(struct mailbox_list *list); 247 void mailbox_list_unlock(struct mailbox_list *list); 248 249 #endif 250