diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2002-08-13 13:28:23 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2002-08-13 13:28:23 +0000 |
commit | 7db001982f68f724adef77c79f11aea7cb0e193e (patch) | |
tree | bc304c5138ef43fda16985f44f8e5525ed5885e1 /auth | |
parent | d806b9814d2356157a940c29749f57fee1c2eee3 (diff) | |
download | mailutils-7db001982f68f724adef77c79f11aea7cb0e193e.tar.gz mailutils-7db001982f68f724adef77c79f11aea7cb0e193e.tar.bz2 |
SQL-specific auth functions.
Diffstat (limited to 'auth')
-rw-r--r-- | auth/sql.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/auth/sql.c b/auth/sql.c new file mode 100644 index 000000000..f889fa8d8 --- /dev/null +++ b/auth/sql.c @@ -0,0 +1,194 @@ +/* GNU mailutils - a suite of utilities for electronic mail + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <unistd.h> +#include <sys/types.h> +#include <pwd.h> +#ifdef HAVE_SHADOW_H +# include <shadow.h> +#endif +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif + +#include <mailutils/list.h> +#include <mailutils/iterator.h> +#include <mailutils/mailbox.h> +#include <mailutils/argp.h> +#include <mailutils/mu_auth.h> + +#ifdef HAVE_MYSQL +# include "../MySql/MySql.h" +#endif + +/* SQL */ +/* FIXME: Underlying library needs rewriting */ + +int +mu_auth_sql_by_name (void *return_data, void *key, + void *unused_func_data, void *unused_call_data) +{ + if (!key) + { + errno = EINVAL; + return 1; + } +#ifdef HAVE_MYSQL + return mu_auth_system (return_data, getMpwnam (key)); +#else + errno = ENOSYS; + return 1; +#endif +} + +int +mu_auth_sql_by_uid (void *return_data, void *key, + void *unused_func_data, void *unused_call_data) +{ + if (!key) + { + errno = EINVAL; + return 1; + } + +#ifdef HAVE_MYSQL + return mu_auth_system (return_data, getMpwuid (key)); +#else + errno = ENOSYS; + return 1; +#endif +} + +#ifdef HAVE_MYSQL +# define ARG_SQL_GETPWNAM 1 +# define ARG_SQL_GETPWUID 2 +# define ARG_SQL_GETPASS 3 +# define ARG_SQL_HOST 4 +# define ARG_SQL_USER 5 +# define ARG_SQL_PASSWD 6 +# define ARG_SQL_DB 7 +# define ARG_SQL_PORT 8 + +static struct argp_option mu_sql_argp_option[] = { + {"sql-getpwnam", ARG_SQL_GETPWNAM, "QUERY", 0, + "SQL query to retrieve a passwd entry based on username", 0}, + {"sql-getpwuid", ARG_SQL_GETPWUID, "QUERY", 0, + "SQL query to retrieve a passwd entry based on UID", 0}, + {"sql-getpass", ARG_SQL_GETPASS, "QUERY", 0, + "SQL query to retrieve a password from the database", 0}, + {"sql-host", ARG_SQL_HOST, "HOSTNAME", 0, + "Name or IP of MySQL server to connect to", 0}, + {"sql-user", ARG_SQL_USER, "NAME", 0, + "SQL user name", 0}, + {"sql-passwd", ARG_SQL_PASSWD, "STRING", 0, + "SQL connection password", 0}, + {"sql-db", ARG_SQL_DB, "STRING", 0, + "Name of the database to connect to", 0}, + {"sql-port", ARG_SQL_PORT, "NUMBER", 0, + "Port to use", 0}, + { NULL, 0, NULL, 0, NULL, 0 } +}; + +char *sql_getpwnam_query; +char *sql_getpass_query; +char *sql_getpwuid_query; +char *sql_host = MHOST; +char *sql_user = MUSER; +char *sql_passwd = MPASS; +char *sql_db = MDB; +char *sql_socket = MSOCKET; +int sql_port = MPORT; + +static error_t +mu_sql_argp_parser (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case ARG_SQL_GETPWNAM: + sql_getpwnam_query = arg; + break; + + case ARG_SQL_GETPWUID: + sql_getpwuid_query = arg; + break; + + case ARG_SQL_GETPASS: + sql_getpass_query = arg; + break; + + case ARG_SQL_HOST: + sql_host = arg; + break; + + case ARG_SQL_USER: + sql_user = arg; + break; + + case ARG_SQL_PASSWD: + sql_passwd = arg; + break; + + case ARG_SQL_DB: + sql_db = arg; + break; + + case ARG_SQL_PORT: + sql_port = strtoul (arg, NULL, 0); + if (sql_port == 0) + { + sql_host = NULL; + sql_socket = arg; + } + break; + + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +struct argp mu_sql_argp = { + mu_sql_argp_option, + mu_sql_argp_parser, +}; + +#endif + +struct mu_auth_module mu_auth_sql_module = { + "sql", +#ifdef HAVE_MYSQL + &mu_sql_argp, +#else + NULL, +#endif + mu_auth_nosupport, + NULL, + mu_auth_sql_by_name, + NULL, + mu_auth_sql_by_uid, + NULL +}; + |