diff src/auth/userdb-pgsql.c @ 1296:a9ac5865daf8 HEAD

Whops, forgot to add.
author Timo Sirainen <tss@iki.fi>
date Fri, 14 Mar 2003 21:28:59 +0200
parents
children 7cde19dbe754
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/auth/userdb-pgsql.c	Fri Mar 14 21:28:59 2003 +0200
@@ -0,0 +1,125 @@
+/* Copyright (C) 2003 Alex Howansky, Timo Sirainen */
+
+#include "config.h"
+#undef HAVE_CONFIG_H
+
+#ifdef USERDB_PGSQL
+
+#include "common.h"
+#include "str.h"
+#include "var-expand.h"
+#include "db-pgsql.h"
+#include "userdb.h"
+
+#include <libpq-fe.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct userdb_pgsql_connection {
+	struct pgsql_connection *conn;
+};
+
+struct userdb_pgsql_request {
+	struct pgsql_request request;
+	userdb_callback_t *userdb_callback;
+};
+
+static struct userdb_pgsql_connection *userdb_pgsql_conn;
+
+static int is_result_valid(PGresult *res)
+{
+	if (PQresultStatus(res) != PGRES_TUPLES_OK) {
+		i_error("PGSQL: Query failed");
+		return FALSE;
+	}
+
+	if (PQntuples(res) == 0) {
+		if (verbose)
+			i_error("PGSQL: Authenticated user not found");
+		return FALSE;
+	}
+
+	if (PQfnumber(res, "home") == -1) {
+		i_error("PGSQL: User query did not return 'home' field");
+		return FALSE;
+	}
+
+	if (PQfnumber(res, "uid") == -1) {
+		i_error("PGSQL: User query did not return 'uid' field");
+		return FALSE;
+	}
+
+	if (PQfnumber(res, "gid") == -1) {
+		i_error("PGSQL: User query did not return 'gid' field");
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+static void pgsql_handle_request(struct pgsql_connection *conn __attr_unused__,
+				 struct pgsql_request *request, PGresult *res)
+{
+	struct userdb_pgsql_request *urequest =
+		(struct userdb_pgsql_request *) request;
+	struct user_data user;
+
+	if (res != NULL && is_result_valid(res)) {
+		memset(&user, 0, sizeof(user));
+		user.home = PQgetvalue(res, 0, PQfnumber(res, "home"));
+		user.uid = atoi(PQgetvalue(res, 0, PQfnumber(res, "uid")));
+		user.gid = atoi(PQgetvalue(res, 0, PQfnumber(res, "gid")));
+		urequest->userdb_callback(&user, request->context);
+	} else {
+		urequest->userdb_callback(NULL, request->context);
+	}
+}
+
+static void userdb_pgsql_lookup(const char *user, userdb_callback_t *callback,
+				void *context)
+{
+	struct pgsql_connection *conn = userdb_pgsql_conn->conn;
+	struct userdb_pgsql_request *request;
+	const char *query;
+	string_t *str;
+
+	str = t_str_new(512);
+	var_expand(str, conn->set.user_query, user, NULL);
+	query = str_c(str);
+
+	request = i_new(struct userdb_pgsql_request, 1);
+	request->request.callback = pgsql_handle_request;
+	request->request.context = context;
+	request->userdb_callback = callback;
+
+	if (db_pgsql_is_valid_username(conn, user))
+		db_pgsql_query(conn, query, &request->request);
+	else {
+		if (verbose)
+			i_info("pgsql(%s): Invalid username", user);
+		pgsql_handle_request(conn, &request->request, NULL);
+	}
+}
+
+static void userdb_pgsql_init(const char *args)
+{
+	struct pgsql_connection *conn;
+
+	userdb_pgsql_conn = i_new(struct userdb_pgsql_connection, 1);
+	userdb_pgsql_conn->conn = conn = db_pgsql_init(args);
+}
+
+static void userdb_pgsql_deinit(void)
+{
+	db_pgsql_unref(userdb_pgsql_conn->conn);
+	i_free(userdb_pgsql_conn);
+}
+
+struct userdb_module userdb_pgsql = {
+	userdb_pgsql_init,
+	userdb_pgsql_deinit,
+
+	userdb_pgsql_lookup
+};
+
+#endif