It defaults to same as service, but can be overridden.
return 1;
i_zero(&info);
- info.protocol = user->service;
+ info.protocol = user->protocol;
if (user->conn.local_ip != NULL)
info.local_ip = *user->conn.local_ip;
if (user->conn.remote_ip != NULL)
const struct mail_storage_service_input input = {
.event_parent = event_get_parent(service_user_event),
.service = user->service,
+ .protocol = user->protocol,
.username = userdomain,
.set_instance = service_user_set_instance,
.session_id = user->session_id,
int ret;
i_zero(&info);
- info.protocol = input->service != NULL ? input->service :
- ctx->service->name;
+ /* If protocol was explicitly provided, use it. Otherwise, fallback to
+ using service name as the protocol. Outside a few special cases
+ (e.g. imap-urlauth-worker) the service and protocol are the same. */
+ if (input->protocol != NULL)
+ info.protocol = input->protocol;
+ else if (input->service != NULL)
+ info.protocol = input->service;
+ else
+ info.protocol = ctx->service->name;
info.local_ip = input->local_ip;
info.remote_ip = input->remote_ip;
info.local_port = input->local_port;
const char *service_name = input->service != NULL ?
input->service : service->name;
+ const char *protocol = input->protocol != NULL ?
+ input->protocol : service_name;
const char *hostname = user != NULL ?
user->user_set->hostname : my_hostname;
const char *local_port = "";
mail_user->gid = priv->gid == (gid_t)-1 ? getegid() : priv->gid;
mail_user->anonymous = user->anonymous;
mail_user->admin = user->admin;
+ mail_user->protocol = user->input.protocol != NULL ?
+ p_strdup(mail_user->pool, user->input.protocol) :
+ mail_user->service;
mail_user->auth_mech = p_strdup(mail_user->pool, user->auth_mech);
mail_user->auth_token = p_strdup(mail_user->pool, user->auth_token);
mail_user->auth_user = p_strdup(mail_user->pool, user->auth_user);
struct mail_storage_service_input {
struct event *event_parent;
+ /* service name - NULL defaults to master_service_get_name() */
const char *service;
+ /* protocol name - defaults to service name */
+ const char *protocol;
const char *username;
/* If set, use this string as the session ID */
const char *session_id;
i_assert(!user->home_looked_up);
i_zero(&info);
- info.protocol = user->service;
+ info.protocol = user->protocol;
if (user->conn.local_ip != NULL)
info.local_ip = *user->conn.local_ip;
if (user->conn.remote_ip != NULL)
user2->gid = user->gid;
user2->anonymous = user->anonymous;
user2->admin = user->admin;
+ user2->protocol = p_strdup(user2->pool, user->protocol);
user2->auth_mech = p_strdup(user2->pool, user->auth_mech);
user2->auth_token = p_strdup(user2->pool, user->auth_token);
user2->auth_user = p_strdup(user2->pool, user->auth_user);
uid_t uid;
gid_t gid;
const char *service;
+ const char *protocol;
const char *session_id;
struct mail_user_connection_data conn;
const char *auth_mech, *auth_token, *auth_user;
i_zero(&input);
input.service = old_input->service;
+ input.protocol = old_input->protocol;
input.username = dest_username;
input.session_id_prefix = user->session_id;
input.flags_override_add = MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS |
i_zero(&input);
input.service = old_input->service;
+ input.protocol = old_input->protocol;
input.username = dest_username;
input.session_id_prefix = user->session_id;
input.flags_override_add = MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS |