Lines Matching refs:user
28 #include "mail-user.h"
34 static void mail_user_deinit_base(struct mail_user *user)
36 if (user->_attr_dict != NULL) {
37 dict_wait(user->_attr_dict);
38 dict_deinit(&user->_attr_dict);
40 mail_namespaces_deinit(&user->namespaces);
41 if (user->_service_user != NULL)
42 mail_storage_service_user_unref(&user->_service_user);
45 static void mail_user_deinit_pre_base(struct mail_user *user ATTR_UNUSED)
49 static void mail_user_stats_fill_base(struct mail_user *user ATTR_UNUSED,
60 struct mail_user *user;
66 user = p_new(pool, struct mail_user, 1);
67 user->pool = pool;
68 user->refcount = 1;
69 user->username = p_strdup(pool, username);
70 user->set_info = set_info;
71 user->unexpanded_set = set;
72 user->set = settings_dup_with_pointers(set_info, user->unexpanded_set, pool);
73 user->service = master_service_get_name(master_service);
74 user->default_normalizer = uni_utf8_to_decomposed_titlecase;
75 user->session_create_time = ioloop_time;
76 user->event = event_create(parent_event);
77 event_add_category(user->event, &event_category_storage);
78 event_add_str(user->event, "user", username);
82 if (!settings_check(set_info, pool, user->set, &error))
85 user->v.deinit = mail_user_deinit_base;
86 user->v.deinit_pre = mail_user_deinit_pre_base;
87 user->v.stats_fill = mail_user_stats_fill_base;
88 p_array_init(&user->module_contexts, user->pool, 5);
89 return user;
100 pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
111 pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
117 mail_user_expand_plugins_envs(struct mail_user *user)
123 if (!array_is_created(&user->set->plugin_envs))
127 envs = array_get_modifiable(&user->set->plugin_envs, &count);
130 if (user->_home == NULL &&
132 mail_user_get_home(user, &home) <= 0) {
133 user->error = p_strdup_printf(user->pool,
141 mail_user_var_expand_table(user),
142 mail_user_var_expand_func_table, user,
144 user->error = p_strdup_printf(user->pool,
149 envs[i+1] = p_strdup(user->pool, str_c(str));
153 int mail_user_init(struct mail_user *user, const char **error_r)
159 need_home_dir = user->_home == NULL &&
160 settings_vars_have_key(user->set_info, user->set,
162 if (need_home_dir && mail_user_get_home(user, &home) <= 0) {
163 user->error = p_strdup_printf(user->pool,
169 if (settings_var_expand_with_funcs(user->set_info, user->set,
170 user->pool, mail_user_var_expand_table(user),
171 mail_user_var_expand_func_table, user,
173 user->error = p_strdup_printf(user->pool,
176 user->settings_expanded = TRUE;
177 mail_user_expand_plugins_envs(user);
181 if (user->error == NULL || user->nonexistent) {
182 mail_set = mail_user_set_get_storage_set(user);
183 user->mail_debug = mail_set->mail_debug;
185 user->initialized = TRUE;
186 hook_mail_user_created(user);
189 if (user->error != NULL) {
190 *error_r = t_strdup(user->error);
196 void mail_user_ref(struct mail_user *user)
198 i_assert(user->refcount > 0);
200 user->refcount++;
205 struct mail_user *user = *_user;
207 i_assert(user->refcount > 0);
210 if (user->refcount > 1) {
211 user->refcount--;
215 user->deinitializing = TRUE;
219 user->v.deinit_pre(user);
220 user->v.deinit(user);
221 event_unref(&user->event);
222 i_assert(user->refcount == 1);
223 pool_unref(&user->pool);
226 struct mail_user *mail_user_find(struct mail_user *user, const char *name)
230 for (ns = user->namespaces; ns != NULL; ns = ns->next) {
253 void mail_user_set_vars(struct mail_user *user, const char *service,
258 user->service = p_strdup(user->pool, service);
259 event_add_str(user->event, "service", service);
261 mail_user_connection_init_from(&user->conn, user->pool, conn);
262 if (user->conn.local_ip != NULL)
263 event_add_str(user->event, "local_ip",
264 net_ip2addr(user->conn.local_ip));
265 if (user->conn.remote_ip != NULL)
266 event_add_str(user->event, "remote_ip",
267 net_ip2addr(user->conn.remote_ip));
271 mail_user_var_expand_table(struct mail_user *user)
274 if (user->var_expand_table != NULL &&
275 user->var_expand_table[4].value == user->_home)
276 return user->var_expand_table;
279 p_strdup(user->pool, t_strcut(user->username, '@'));
280 const char *domain = i_strchr_to_next(user->username, '@');
281 const char *local_ip = user->conn.local_ip == NULL ? NULL :
282 p_strdup(user->pool, net_ip2addr(user->conn.local_ip));
283 const char *remote_ip = user->conn.remote_ip == NULL ? NULL :
284 p_strdup(user->pool, net_ip2addr(user->conn.remote_ip));
287 if (user->auth_user == NULL) {
288 auth_user = user->username;
292 auth_user = user->auth_user;
294 p_strdup(user->pool, t_strcut(user->auth_user, '@'));
295 auth_domain = i_strchr_to_next(user->auth_user, '@');
299 { 'u', user->username, "user" },
302 { 's', user->service, "service" },
303 { 'h', user->_home /* don't look it up unless we need it */, "home" },
307 { 'i', p_strdup(user->pool, dec2str(user->uid)), "uid" },
308 { '\0', p_strdup(user->pool, dec2str(user->gid)), "gid" },
309 { '\0', user->session_id, "session" },
319 tab = p_malloc(user->pool, sizeof(stack_tab));
322 user->var_expand_table = tab;
323 return user->var_expand_table;
331 struct mail_user *user = context;
333 *value_r = mail_storage_service_fields_var_expand(data, user->userdb_fields);
337 void mail_user_set_home(struct mail_user *user, const char *home)
339 user->_home = p_strdup(user->pool, home);
340 user->home_looked_up = TRUE;
343 void mail_user_add_namespace(struct mail_user *user,
351 tmp = &user->namespaces;
360 *namespaces = user->namespaces;
363 hook_mail_namespaces_added(user->namespaces);
367 void mail_user_drop_useless_namespaces(struct mail_user *user)
374 for (ns = user->namespaces; ns != NULL; ns = next) {
384 const char *mail_user_home_expand(struct mail_user *user, const char *path)
386 (void)mail_user_try_home_expand(user, &path);
390 static int mail_user_userdb_lookup_home(struct mail_user *user)
398 i_assert(!user->home_looked_up);
401 info.service = user->service;
402 if (user->conn.local_ip != NULL)
403 info.local_ip = *user->conn.local_ip;
404 if (user->conn.remote_ip != NULL)
405 info.remote_ip = *user->conn.remote_ip;
409 user->username, &info, userdb_pool,
413 user->_home = p_strdup(user->pool, reply.home);
419 static bool mail_user_get_mail_home(struct mail_user *user)
421 const char *error, *home = user->set->mail_home;
424 if (user->settings_expanded) {
425 user->_home = home[0] != '\0' ? home : NULL;
428 /* we're still initializing user. need to do the expansion ourself. */
436 mail_user_var_expand_table(user),
437 mail_user_var_expand_func_table, user,
442 user->_home = p_strdup(user->pool, str_c(str));
446 int mail_user_get_home(struct mail_user *user, const char **home_r)
450 if (user->home_looked_up) {
451 *home_r = user->_home;
452 return user->_home != NULL ? 1 : 0;
457 if (!mail_user_get_mail_home(user))
459 } else if ((ret = mail_user_userdb_lookup_home(user)) < 0) {
463 /* user doesn't exist */
464 user->nonexistent = TRUE;
465 } else if (user->_home == NULL) {
468 if (!mail_user_get_mail_home(user))
471 user->home_looked_up = TRUE;
473 *home_r = user->_home;
474 return user->_home != NULL ? 1 : 0;
477 bool mail_user_is_plugin_loaded(struct mail_user *user, struct module *module)
483 plugins = t_strsplit_spaces(user->set->mail_plugins, ", ");
489 bool mail_user_plugin_getenv_bool(struct mail_user *user, const char *name)
491 return mail_user_set_plugin_getenv_bool(user->set, name);
514 const char *mail_user_plugin_getenv(struct mail_user *user, const char *name)
516 return mail_user_set_plugin_getenv(user->set, name);
536 int mail_user_try_home_expand(struct mail_user *user, const char **pathp)
545 if (mail_user_get_home(user, &home) <= 0)
565 int mail_user_lock_file_create(struct mail_user *user, const char *lock_fname,
572 if ((ret = mail_user_get_home(user, &home)) < 0) {
585 mail_user_set_get_storage_set(user);
591 mail_namespace_find_inbox(user->namespaces)->list;
602 const char *mail_user_get_anvil_userip_ident(struct mail_user *user)
604 if (user->conn.remote_ip == NULL)
606 return t_strconcat(net_ip2addr(user->conn.remote_ip), "/",
607 str_tabescape(user->username), NULL);
611 mail_user_try_load_class_plugin(struct mail_user *user, const char *name)
622 mod_set.debug = user->mail_debug;
626 user->set->mail_plugin_dir,
643 mail_user_get_storage_class(struct mail_user *user, const char *name)
652 mail_user_try_load_class_plugin(user, name);
663 struct mail_user *mail_user_dup(struct mail_user *user)
667 user2 = mail_user_alloc(event_get_parent(user->event), user->username,
668 user->set_info, user->unexpanded_set);
670 user2->_service_user = user->_service_user;
673 if (user->_home != NULL)
674 mail_user_set_home(user2, user->_home);
675 mail_user_set_vars(user2, user->service, &user->conn);
676 user2->uid = user->uid;
677 user2->gid = user->gid;
678 user2->anonymous = user->anonymous;
679 user2->admin = user->admin;
680 user2->auth_token = p_strdup(user2->pool, user->auth_token);
681 user2->auth_user = p_strdup(user2->pool, user->auth_user);
682 user2->session_id = p_strdup(user2->pool, user->session_id);
683 user2->session_create_time = user->session_create_time;
684 user2->userdb_fields = user->userdb_fields == NULL ? NULL :
685 p_strarray_dup(user2->pool, user->userdb_fields);
689 void mail_user_init_ssl_client_settings(struct mail_user *user,
693 mail_user_set_get_storage_set(user);
699 void mail_user_init_fs_settings(struct mail_user *user,
703 fs_set->username = user->username;
704 fs_set->session_id = user->session_id;
705 fs_set->base_dir = user->set->base_dir;
706 fs_set->temp_dir = user->set->mail_temp_dir;
707 fs_set->debug = user->mail_debug;
708 fs_set->enable_timing = user->stats_enabled;
711 mail_user_init_ssl_client_settings(user, ssl_set);
714 void mail_user_stats_fill(struct mail_user *user, struct stats *stats)
716 user->v.stats_fill(user, stats);