conn->refcount++;
conn->request_handler =
auth_request_handler_create(auth_callback, conn,
+ !conn->login_requests ? NULL :
auth_master_request_callback);
auth_request_handler_set(conn->request_handler, conn->connect_uid, pid);
}
struct auth_client_connection *
-auth_client_connection_create(struct auth *auth, int fd)
+auth_client_connection_create(struct auth *auth, int fd, bool login_requests)
{
static unsigned int connect_uid_counter = 0;
struct auth_client_connection *conn;
conn->auth = auth;
conn->refcount = 1;
conn->connect_uid = ++connect_uid_counter;
+ conn->login_requests = login_requests;
random_fill(conn->cookie, sizeof(conn->cookie));
conn->fd = fd;
uint8_t cookie[MASTER_AUTH_COOKIE_SIZE];
struct auth_request_handler *request_handler;
+ unsigned int login_requests:1;
unsigned int version_received:1;
};
struct auth_client_connection *
-auth_client_connection_create(struct auth *auth, int fd);
+auth_client_connection_create(struct auth *auth, int fd, bool login_requests);
void auth_client_connection_destroy(struct auth_client_connection **conn);
struct auth_client_connection *
client_pid);
(void)o_stream_send_str(conn->output,
t_strdup_printf("FAIL\t%u\n", id));
- } else {
- auth_request_handler_master_request(
- client_conn->request_handler, conn, id, client_id);
+ } else if (!auth_request_handler_master_request(
+ client_conn->request_handler, conn, id, client_id)) {
+ i_error("Master requested auth for non-login client %u",
+ client_pid);
+ (void)o_stream_send_str(conn->output,
+ t_strdup_printf("FAIL\t%u\n", id));
}
return TRUE;
}
auth_request_handler_unref(&handler);
}
-void auth_request_handler_master_request(struct auth_request_handler *handler,
+bool auth_request_handler_master_request(struct auth_request_handler *handler,
struct auth_master_connection *master,
unsigned int id,
unsigned int client_id)
handler->client_pid, client_id);
auth_stream_reply_add(reply, "FAIL", NULL);
auth_stream_reply_add(reply, NULL, dec2str(id));
+ if (handler->master_callback == NULL)
+ return FALSE;
handler->master_callback(reply, master);
- return;
+ return TRUE;
}
auth_request_ref(request);
handler->refcount++;
auth_request_lookup_user(request, userdb_callback);
}
+ return TRUE;
}
void auth_request_handler_flush_failures(bool flush_all)
const char *args);
bool auth_request_handler_auth_continue(struct auth_request_handler *handler,
const char *args);
-void auth_request_handler_master_request(struct auth_request_handler *handler,
+bool auth_request_handler_master_request(struct auth_request_handler *handler,
struct auth_master_connection *master,
unsigned int id,
unsigned int client_id);
/* <settings checks> */
static struct file_listener_settings auth_unix_listeners_array[] = {
- { "login/auth", 0666, "", "" },
+ { "login/login", 0666, "", "" },
{ "auth-client", 0600, "", "" },
{ "auth-userdb", 0600, "", "" },
{ "auth-master", 0600, "", "" }
enum auth_socket_type {
AUTH_SOCKET_UNKNOWN = 0,
AUTH_SOCKET_CLIENT,
+ AUTH_SOCKET_LOGIN_CLIENT,
AUTH_SOCKET_MASTER,
AUTH_SOCKET_USERDB
};
static void client_connected(const struct master_service_connection *conn)
{
enum auth_socket_type *type;
- const char *name, *suffix;
+ const char *path, *name, *suffix;
struct auth *auth;
type = array_idx_modifiable(&listen_fd_types, conn->listen_fd);
if (*type == AUTH_SOCKET_UNKNOWN) {
/* figure out if this is a server or network socket by
checking the socket path name. */
- if (net_getunixname(conn->listen_fd, &name) < 0)
+ if (net_getunixname(conn->listen_fd, &path) < 0)
i_fatal("getsockname(%d) failed: %m", conn->listen_fd);
+ name = strrchr(path, '/');
+ if (name == NULL)
+ name = path;
+ else
+ name++;
+
suffix = strrchr(name, '-');
- if (suffix == NULL)
- *type = AUTH_SOCKET_CLIENT;
- else {
+ if (suffix == NULL) {
+ if (strcmp(name, "login") == 0)
+ *type = AUTH_SOCKET_LOGIN_CLIENT;
+ else
+ *type = AUTH_SOCKET_CLIENT;
+ } else {
suffix++;
if (strcmp(suffix, "master") == 0)
*type = AUTH_SOCKET_MASTER;
case AUTH_SOCKET_USERDB:
(void)auth_master_connection_create(auth, conn->fd, TRUE);
break;
+ case AUTH_SOCKET_LOGIN_CLIENT:
+ (void)auth_client_connection_create(auth, conn->fd, TRUE);
+ break;
case AUTH_SOCKET_CLIENT:
- (void)auth_client_connection_create(auth, conn->fd);
+ (void)auth_client_connection_create(auth, conn->fd, FALSE);
break;
default:
i_unreached();
client_destroy_oldest);
master_service_set_die_callback(master_service, login_die);
- auth_client = auth_client_init("auth", (unsigned int)getpid(), FALSE);
+ auth_client = auth_client_init("login", (unsigned int)getpid(), FALSE);
auth_client_set_connect_notify(auth_client, auth_connect_notify, NULL);
master_auth = master_auth_init(master_service, login_binary.protocol);