]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-urlauth: Fixes to handling anonymous user
authorStephan Bosch <stephan@rename-it.nl>
Sun, 16 Sep 2012 13:02:15 +0000 (16:02 +0300)
committerStephan Bosch <stephan@rename-it.nl>
Sun, 16 Sep 2012 13:02:15 +0000 (16:02 +0300)
src/imap-urlauth/imap-urlauth-worker.c
src/imap/imap-client.c
src/lib-imap-urlauth/imap-urlauth-private.h
src/lib-imap-urlauth/imap-urlauth.c
src/lib-imap-urlauth/imap-urlauth.h

index 28af7c4a895dc1279e5c07740e99deed6246d12b..c6d1c87a1be734fbf93356ab1188ae894f4c8e20 100644 (file)
@@ -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,
index ab81795907d70e938fcfe64bda96e896b5dfe5c0..91170f514b8c269e57bb0191e023128e88300a35 100644 (file)
@@ -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);
 }
index 8b75973ddb0fc39cc8c43ff79d1f86e120ae584f..8f2612f8d0bdef9b1a2c655eaf771d286270135b 100644 (file)
@@ -13,6 +13,8 @@ struct imap_urlauth_context {
 
        char *access_user;
        const char **access_applications;
+
+       unsigned int access_anonymous:1;
 };
 
 #endif
index a8e8f1ec0a32440c8acb05d28dd8730f25fbc634..5e09a840fde0a2f0b41aff9573215c212e3d04fc 100644 (file)
@@ -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+<access_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;
index 829d5435090b82fae1936e095022f14712393ab5..2f0d5e18342db28b04437bc78288b4d0faa301c9 100644 (file)
@@ -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,