while (userdb != NULL && userdb->userdb->iface->iterate_init == NULL)
userdb = userdb->next;
if (userdb == NULL) {
- i_error("Trying to iterate users, but userdbs don't suppor it");
+ i_error("Trying to iterate users, but userdbs don't support it");
str = t_strdup_printf("DONE\t%u\tfail", id);
(void)o_stream_send_str(conn->output, str);
return TRUE;
if (conn->auth->set->debug)
i_info("master in: %s", line);
- if (strncmp(line, "REQUEST\t", 8) == 0)
- return master_input_request(conn, line + 8);
- else if (strncmp(line, "USER\t", 5) == 0)
+ if (strncmp(line, "USER\t", 5) == 0)
return master_input_user(conn, line + 5);
- else if (strncmp(line, "LIST\t", 5) == 0)
+ if (strncmp(line, "LIST\t", 5) == 0)
return master_input_list(conn, line + 5);
- else if (strncmp(line, "CPID\t", 5) == 0) {
- i_error("Authentication client trying to connect to "
- "master socket");
- return FALSE;
- } else {
- /* ignore unknown command */
- i_error("BUG: Unknown command in master socket: %s",
- str_sanitize(line, 80));
- return FALSE;
+
+ if (!conn->userdb_only) {
+ if (strncmp(line, "REQUEST\t", 8) == 0)
+ return master_input_request(conn, line + 8);
+ if (strncmp(line, "CPID\t", 5) == 0) {
+ i_error("Authentication client trying to connect to "
+ "master socket");
+ return FALSE;
+ }
}
+
+ i_error("BUG: Unknown command in master socket: %s",
+ str_sanitize(line, 80));
+ return FALSE;
}
static void master_input(struct auth_master_connection *conn)
}
struct auth_master_connection *
-auth_master_connection_create(struct auth *auth, int fd)
+auth_master_connection_create(struct auth *auth, int fd, bool userdb_only)
{
struct auth_master_connection *conn;
const char *line;
conn->output = o_stream_create_fd(fd, (size_t)-1, FALSE);
o_stream_set_flush_callback(conn->output, master_output, conn);
conn->io = io_add(fd, IO_READ, master_input, conn);
+ conn->userdb_only = userdb_only;
line = t_strdup_printf("VERSION\t%u\t%u\nSPID\t%s\n",
AUTH_MASTER_PROTOCOL_MAJOR_VERSION,
unsigned int version_received:1;
unsigned int destroyed:1;
+ unsigned int userdb_only:1;
};
ARRAY_DEFINE_TYPE(auth_master_connections, struct auth_master_connection *);
extern ARRAY_TYPE(auth_master_connections) auth_master_connections;
struct auth_master_connection *
-auth_master_connection_create(struct auth *auth, int fd);
+auth_master_connection_create(struct auth *auth, int fd, bool userdb_only);
void auth_master_connection_destroy(struct auth_master_connection **conn);
void auth_master_connection_ref(struct auth_master_connection *conn);
enum auth_socket_type {
AUTH_SOCKET_UNKNOWN = 0,
AUTH_SOCKET_CLIENT,
- AUTH_SOCKET_MASTER
+ AUTH_SOCKET_MASTER,
+ AUTH_SOCKET_USERDB
};
bool worker = FALSE, shutdown_request = FALSE;
auth process */
master_service_set_client_limit(master_service, 1);
} else if (getenv("MASTER_AUTH_FD") != NULL) {
- (void)auth_master_connection_create(auth, MASTER_AUTH_FD);
+ (void)auth_master_connection_create(auth, MASTER_AUTH_FD,
+ FALSE);
}
}
suffix = strrchr(sa.sun_path, '-');
if (strcmp(suffix, "master") == 0)
*type = AUTH_SOCKET_MASTER;
+ else if (strcmp(suffix, "userdb") == 0)
+ *type = AUTH_SOCKET_USERDB;
else
*type = AUTH_SOCKET_CLIENT;
}
switch (*type) {
case AUTH_SOCKET_MASTER:
- (void)auth_master_connection_create(auth, conn->fd);
+ (void)auth_master_connection_create(auth, conn->fd, FALSE);
+ break;
+ case AUTH_SOCKET_USERDB:
+ (void)auth_master_connection_create(auth, conn->fd, TRUE);
break;
case AUTH_SOCKET_CLIENT:
(void)auth_client_connection_create(auth, conn->fd);