From: Stephan Bosch Date: Sun, 16 Sep 2012 13:02:15 +0000 (+0300) Subject: imap-urlauth: Fixes to handling anonymous user X-Git-Tag: 2.2.alpha1~182 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6541da94741ea43514cdac3dd2ebbcf839ffb783;p=thirdparty%2Fdovecot%2Fcore.git imap-urlauth: Fixes to handling anonymous user --- diff --git a/src/imap-urlauth/imap-urlauth-worker.c b/src/imap-urlauth/imap-urlauth-worker.c index 28af7c4a89..c6d1c87a1b 100644 --- a/src/imap-urlauth/imap-urlauth-worker.c +++ b/src/imap-urlauth/imap-urlauth-worker.c @@ -73,9 +73,9 @@ struct client { unsigned int debug:1; unsigned int finished:1; + unsigned int waiting_input:1; unsigned int version_received:1; unsigned int access_received:1; - unsigned int waiting_input:1; unsigned int access_anonymous:1; }; @@ -639,6 +639,7 @@ client_handle_user_command(struct client *client, const char *cmd, config.url_host = set->imap_urlauth_host; config.url_port = set->imap_urlauth_port; config.access_user = client->access_user; + config.access_anonymous = client->access_anonymous; config.access_applications = (const void *)array_get(&client->access_apps, &count); @@ -873,6 +874,7 @@ static void client_ctrl_input(struct client *client) client->access_user = i_strdup(*args); client->access_anonymous = FALSE; } else { + client->access_user = i_strdup("anonymous"); client->access_anonymous = TRUE; } i_set_failure_prefix(t_strdup_printf("imap-urlauth[%s](%s): ", my_pid, diff --git a/src/imap/imap-client.c b/src/imap/imap-client.c index ab81795907..91170f514b 100644 --- a/src/imap/imap-client.c +++ b/src/imap/imap-client.c @@ -50,8 +50,8 @@ static int client_init_urlauth(struct client *client) config.socket_path = t_strconcat(client->user->set->base_dir, "/"IMAP_URLAUTH_SOCKET_NAME, NULL); config.session_id = client->session_id; - config.access_user = client->user->anonymous ? NULL : - client->user->username; + config.access_anonymous = client->user->anonymous; + config.access_user = client->user->username; return imap_urlauth_init(client->user, &config, &client->urlauth_ctx); } diff --git a/src/lib-imap-urlauth/imap-urlauth-private.h b/src/lib-imap-urlauth/imap-urlauth-private.h index 8b75973ddb..8f2612f8d0 100644 --- a/src/lib-imap-urlauth/imap-urlauth-private.h +++ b/src/lib-imap-urlauth/imap-urlauth-private.h @@ -13,6 +13,8 @@ struct imap_urlauth_context { char *access_user; const char **access_applications; + + unsigned int access_anonymous:1; }; #endif diff --git a/src/lib-imap-urlauth/imap-urlauth.c b/src/lib-imap-urlauth/imap-urlauth.c index a8e8f1ec0a..5e09a840fd 100644 --- a/src/lib-imap-urlauth/imap-urlauth.c +++ b/src/lib-imap-urlauth/imap-urlauth.c @@ -45,8 +45,11 @@ int imap_urlauth_init(struct mail_user *user, uctx->url_host = i_strdup(my_hostdomain()); uctx->url_port = config->url_port; - if (config->access_user != NULL && *config->access_user != '\0') + if (config->access_anonymous) + uctx->access_user = i_strdup("anonymous"); + else uctx->access_user = i_strdup(config->access_user); + uctx->access_anonymous = config->access_anonymous; if (config->access_applications != NULL && *config->access_applications != NULL) { uctx->access_applications = @@ -160,9 +163,9 @@ imap_urlauth_check_access(struct imap_urlauth_context *uctx, if (strcasecmp(url->uauth_access_application, "user") == 0) { /* user+ */ - if (uctx->access_user == NULL || + if (uctx->access_anonymous || strcasecmp(url->uauth_access_user, uctx->access_user) != 0) { - if (uctx->access_user == NULL) { + if (uctx->access_anonymous) { *error_r = t_strdup_printf( "No 'user+%s' access allowed for anonymous user", url->uauth_access_user); @@ -174,7 +177,7 @@ imap_urlauth_check_access(struct imap_urlauth_context *uctx, } } else if (strcasecmp(url->uauth_access_application, "authuser") == 0) { /* authuser */ - if (uctx->access_user == NULL) { + if (uctx->access_anonymous) { *error_r = "No 'authuser' access allowed for anonymous user"; return FALSE; } @@ -185,7 +188,7 @@ imap_urlauth_check_access(struct imap_urlauth_context *uctx, const char *userid = url->uauth_access_user == NULL ? "" : t_strdup_printf("+%s", url->uauth_access_user); - if (uctx->access_user == NULL) { + if (uctx->access_anonymous) { *error_r = t_strdup_printf( "No '%s%s' access allowed for anonymous user", url->uauth_access_application, userid); @@ -269,7 +272,7 @@ int imap_urlauth_generate(struct imap_urlauth_context *uctx, *error_r = "Invalid URL: Missing user name"; return 0; } - if (strcmp(url->userid, user->username) != 0) { + if (user->anonymous || strcmp(url->userid, user->username) != 0) { *error_r = t_strdup_printf( "Not permitted to generate URLAUTH for user %s", url->userid); @@ -373,7 +376,7 @@ int imap_urlauth_fetch_parsed(struct imap_urlauth_context *uctx, } /* validate target user */ - if (strcmp(url->userid, user->username) != 0) { + if (user->anonymous || strcmp(url->userid, user->username) != 0) { *error_r = t_strdup_printf("Not permitted to fetch URLAUTH for user %s", url->userid); *error_code_r = MAIL_ERROR_PARAMS; diff --git a/src/lib-imap-urlauth/imap-urlauth.h b/src/lib-imap-urlauth/imap-urlauth.h index 829d543509..2f0d5e1834 100644 --- a/src/lib-imap-urlauth/imap-urlauth.h +++ b/src/lib-imap-urlauth/imap-urlauth.h @@ -18,6 +18,7 @@ struct imap_urlauth_config { const char *access_user; const char *const *access_applications; + bool access_anonymous; }; int imap_urlauth_init(struct mail_user *user,