Import Upstream version 0.69.0
[hcoop/debian/courier-authlib.git] / authpgsql.c
dissimilarity index 60%
index 522215a..9e5c5aa 100644 (file)
-/*
-** Copyright 2000-2005 Double Precision, Inc.  See COPYING for
-** distribution information.
-*/
-#if    HAVE_CONFIG_H
-#include       "courier_auth_config.h"
-#endif
-#include       <stdio.h>
-#include       <stdlib.h>
-#include       <string.h>
-#include       <errno.h>
-#include       <pwd.h>
-#if    HAVE_UNISTD_H
-#include       <unistd.h>
-#endif
-
-#include       "auth.h"
-#include       "authpgsql.h"
-#include       "authstaticlist.h"
-#include       "courierauthdebug.h"
-
-static const char rcsid[]="$Id: authpgsql.c,v 1.13 2006/10/28 19:22:52 mrsam Exp $";
-
-extern void auth_pgsql_enumerate( void(*cb_func)(const char *name,
-                                                uid_t uid,
-                                                gid_t gid,
-                                                const char *homedir,
-                                                const char *maildir,
-                                                const char *options,
-                                                void *void_arg),
-                                 void *void_arg);
-
-static int auth_pgsql_login(const char *service, char *authdata,
-                           int (*callback_func)(struct authinfo *, void *),
-                           void *callback_arg)
-{
-       char *user, *pass;
-       struct authpgsqluserinfo *authinfo;
-       struct  authinfo        aa;
-
-       if ((user=strtok(authdata, "\n")) == 0 ||
-               (pass=strtok(0, "\n")) == 0)
-       {
-               errno=EPERM;
-               return (-1);
-       }
-
-       authinfo=auth_pgsql_getuserinfo(user, service);
-
-       if (!authinfo)          /* Fatal error - such as PgSQL being down */
-       {
-               errno=EACCES;
-               return (1);
-       }
-
-       if (authinfo->cryptpw)
-       {
-               if (authcheckpassword(pass,authinfo->cryptpw))
-               {
-                       errno=EPERM;
-                       return (-1);    /* User/Password not found. */
-               }
-       }
-       else if (authinfo->clearpw)
-       {
-               if (strcmp(pass, authinfo->clearpw))
-               {
-                       if (courier_authdebug_login_level >= 2)
-                       {
-                               DPRINTF("supplied password '%s' does not match clearpasswd '%s'",
-                                       pass, authinfo->clearpw);
-                       }
-                       else
-                       {
-                               DPRINTF("supplied password does not match clearpasswd");
-                       }
-                       errno=EPERM;
-                       return (-1);
-               }
-       }
-       else
-       {
-               DPRINTF("no password available to compare");
-               errno=EPERM;
-               return (-1);            /* Username not found */
-       }
-
-
-       memset(&aa, 0, sizeof(aa));
-
-       /*aa.sysusername=user;*/
-       aa.sysuserid= &authinfo->uid;
-       aa.sysgroupid= authinfo->gid;
-       aa.homedir=authinfo->home;
-       aa.maildir=authinfo->maildir && authinfo->maildir[0] ?
-               authinfo->maildir:0;
-       aa.address=authinfo->username;
-       aa.quota=authinfo->quota && authinfo->quota[0] ?
-               authinfo->quota:0;
-       aa.fullname=authinfo->fullname;
-       aa.options=authinfo->options;
-       aa.passwd=authinfo->cryptpw;
-       aa.clearpasswd=pass;
-       courier_authdebug_authinfo("DEBUG: authpgsql: ", &aa,
-                           authinfo->clearpw, authinfo->cryptpw);
-       return (*callback_func)(&aa, callback_arg);
-}
-
-static int auth_pgsql_changepw(const char *service, const char *user,
-                                const char *pass,
-                                const char *newpass)
-{
-       struct authpgsqluserinfo *authinfo;
-
-       authinfo=auth_pgsql_getuserinfo(user, service);
-
-       if (!authinfo)
-       {
-               errno=ENOENT;
-               return (-1);
-       }
-
-       if (authinfo->cryptpw)
-       {
-               if (authcheckpassword(pass,authinfo->cryptpw))
-               {
-                       errno=EPERM;
-                       return (-1);    /* User/Password not found. */
-               }
-       }
-       else if (authinfo->clearpw)
-       {
-               if (strcmp(pass, authinfo->clearpw))
-               {
-                       errno=EPERM;
-                       return (-1);
-               }
-       }
-       else
-       {
-               errno=EPERM;
-               return (-1);
-       }
-
-       if (auth_pgsql_setpass(user, newpass, authinfo->cryptpw))
-       {
-               errno=EPERM;
-               return (-1);
-       }
-       return (0);
-}
-
-#if HAVE_HMACLIB
-
-#include       "libhmac/hmac.h"
-#include       "cramlib.h"
-
-static int auth_pgsql_cram(const char *service,
-                          const char *authtype, char *authdata,
-                          int (*callback_func)(struct authinfo *, void *),
-                          void *callback_arg)
-{
-       struct  cram_callback_info      cci;
-
-       if (auth_get_cram(authtype, authdata, &cci))
-               return (-1);
-
-       cci.callback_func=callback_func;
-       cci.callback_arg=callback_arg;
-
-       return auth_pgsql_pre(cci.user, service, &auth_cram_callback, &cci);
-}
-#endif
-
-int auth_pgsql(const char *service, const char *authtype, char *authdata,
-              int (*callback_func)(struct authinfo *, void *),
-              void *callback_arg)
-{
-       if (strcmp(authtype, AUTHTYPE_LOGIN) == 0)
-               return (auth_pgsql_login(service, authdata,
-                       callback_func, callback_arg));
-
-#if HAVE_HMACLIB
-       return (auth_pgsql_cram(service, authtype, authdata,
-                       callback_func, callback_arg));
-#else
-       errno=EPERM;
-       return (-1);
-#endif
-}
-
-extern int auth_pgsql_pre(const char *user, const char *service,
-                         int (*callback)(struct authinfo *, void *),
-                         void *arg);
-
-static struct authstaticinfo authpgsql_info={
-       "authpgsql",
-       auth_pgsql,
-       auth_pgsql_pre,
-       auth_pgsql_cleanup,
-       auth_pgsql_changepw,
-       auth_pgsql_cleanup,
-       auth_pgsql_enumerate};
-
-struct authstaticinfo *courier_authpgsql_init()
-{
-       return &authpgsql_info;
-}
+/*
+** Copyright 2000-2008 Double Precision, Inc.  See COPYING for
+** distribution information.
+*/
+#if    HAVE_CONFIG_H
+#include       "courier_auth_config.h"
+#endif
+#include       <stdio.h>
+#include       <stdlib.h>
+#include       <string.h>
+#include       <errno.h>
+#include       <pwd.h>
+#if    HAVE_UNISTD_H
+#include       <unistd.h>
+#endif
+
+#include       "auth.h"
+#include       "authpgsql.h"
+#include       "courierauth.h"
+#include       "courierauthstaticlist.h"
+#include       "courierauthdebug.h"
+#include       "libhmac/hmac.h"
+
+extern void auth_pgsql_enumerate( void(*cb_func)(const char *name,
+                                                uid_t uid,
+                                                gid_t gid,
+                                                const char *homedir,
+                                                const char *maildir,
+                                                const char *options,
+                                                void *void_arg),
+                                 void *void_arg);
+
+static int auth_pgsql_cram(const char *service,
+                          const char *authtype, char *authdata,
+                          int (*callback_func)(struct authinfo *, void *),
+                          void *callback_arg)
+{
+       struct  cram_callback_info      cci;
+
+       if (auth_get_cram(authtype, authdata, &cci))
+               return (-1);
+
+       cci.callback_func=callback_func;
+       cci.callback_arg=callback_arg;
+
+       return auth_pgsql_pre(cci.user, service, &auth_cram_callback, &cci);
+}
+
+int auth_pgsql(const char *service, const char *authtype, char *authdata,
+              int (*callback_func)(struct authinfo *, void *),
+              void *callback_arg)
+{
+       if (strcmp(authtype, AUTHTYPE_LOGIN) == 0)
+               return (auth_pgsql_login(service, authdata,
+                       callback_func, callback_arg));
+
+       return (auth_pgsql_cram(service, authtype, authdata,
+                       callback_func, callback_arg));
+}
+
+extern int auth_pgsql_pre(const char *user, const char *service,
+                         int (*callback)(struct authinfo *, void *),
+                         void *arg);
+
+static struct authstaticinfo authpgsql_info={
+       "authpgsql",
+       auth_pgsql,
+       auth_pgsql_pre,
+       auth_pgsql_cleanup,
+       auth_pgsql_changepw,
+       auth_pgsql_cleanup,
+       auth_pgsql_enumerate};
+
+struct authstaticinfo *courier_authpgsql_init()
+{
+       return &authpgsql_info;
+}