/[mailutils]/mailutils/auth/sql.c
ViewVC logotype

Diff of /mailutils/auth/sql.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.11 by gray, Tue Mar 11 14:10:40 2003 UTC revision 1.12 by gray, Wed Apr 23 11:45:49 2003 UTC
# Line 31  Line 31 
31  #include <string.h>  #include <string.h>
32  #ifdef HAVE_STRINGS_H  #ifdef HAVE_STRINGS_H
33  # include <strings.h>  # include <strings.h>
34    #else
35    # include <string.h>
36  #endif  #endif
37  #ifdef HAVE_CRYPT_H  #ifdef HAVE_CRYPT_H
38  # include <crypt.h>  # include <crypt.h>
# Line 44  Line 46 
46  #include <mailutils/error.h>  #include <mailutils/error.h>
47  #include <mailutils/nls.h>  #include <mailutils/nls.h>
48    
49  #ifdef HAVE_MYSQL  #ifdef USE_SQL
 #include <mysql/mysql.h>  
   
 #define MFLAGS 0                /* Special user flags. It is safe to leave  
                                    this untouched */  
50    
51  char *sql_getpwnam_query;  char *mu_sql_getpwnam_query;
52  char *sql_getpass_query;  char *mu_sql_getpass_query;
53  char *sql_getpwuid_query;  char *mu_sql_getpwuid_query;
54    
55  char *sql_host = NULL;          /* Hostname to connect to. NULL for UNIX  char *mu_sql_host = NULL;          /* Hostname to connect to. NULL for UNIX
56                                     socket connection */                                     socket connection */
57  char *sql_user = "accounts";    /* Username for mysql access */      char *mu_sql_user = "accounts";    /* Username for mysql access */    
58  char *sql_passwd = "yurpass";   /* Password for mysql access */  char *mu_sql_passwd = "yurpass";   /* Password for mysql access */
59  char *sql_db = "accounts";      /* Database Name */  char *mu_sql_db = "accounts";      /* Database Name */
60  char *sql_socket = NULL;        /* Socket name to use. Valid only if  char *mu_sql_socket = NULL;        /* Socket name to use. Valid only if
61                                     connecting via UNIX sockets */                                     connecting via UNIX sockets */
62  int  sql_port = 0;              /* Port number to connect to. 0 means default  int  mu_sql_port = 0;              /* Port number to connect to.
63                                     MySQL port (3300) */                                     0 means default port */
64    
65  static char *  char *
66  sql_expand_query (const char *query, const char *ustr)  mu_sql_expand_query (const char *query, const char *ustr)
67  {  {
68    char *p, *q, *res;    char *p, *q, *res;
69    int len;    int len;
# Line 132  sql_expand_query (const char *query, con Line 130  sql_expand_query (const char *query, con
130    return res;    return res;
131  }  }
132    
 static int  
 mu_auth_sql_by_name (void *return_data, void *key,  
                      void *unused_func_data, void *unused_call_data)  
 {  
   char *query_str = NULL;  
   MYSQL *m;  
   MYSQL_RES *res;  
   MYSQL_ROW row;  
   char *mailbox_name;  
   int rc;  
     
   if (!key)  
     {  
       errno = EINVAL;  
       return 1;  
     }  
   
   m = mysql_init (0);  
   
   if (!m)  
     return 1;  
   
   if (!mysql_real_connect (m, sql_host, sql_user, sql_passwd, sql_db, sql_port,  
                            sql_socket, MFLAGS))  
     {  
       mu_error (_("MySQL: connect failed: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
   
   query_str = sql_expand_query (sql_getpwnam_query, key);  
   
   if (!query_str)  
     {  
       mysql_close (m);  
       return 1;  
     }  
     
   if (mysql_query (m, query_str) != 0)  
     {  
       mu_error (_("MySQL: query failed: %s"), mysql_error (m));  
       free (query_str);  
       mysql_close (m);  
       return 1;  
     }  
   
   free (query_str);  
   
   if ((res = mysql_store_result (m)) == NULL)  
     {  
       mu_error (_("MySQL: can't store result: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
     
   if ((row = mysql_fetch_row (res)) == NULL)  
     {  
       mu_error (_("MySQL: can't fetch row: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
   
   if (mysql_num_fields (res) == 7 && row[6])  
     mailbox_name = strdup (row[6]);  
   else  
     {  
       mailbox_name = malloc (strlen (mu_path_maildir) +  
                              strlen (row[0]) + 1);  
       if (mailbox_name)  
         sprintf (mailbox_name, "%s%s", mu_path_maildir, row[0]);  
     }  
   
   if (mailbox_name)  
     rc = mu_auth_data_alloc ((struct mu_auth_data **) return_data,  
                              row[0],  
                              row[1],  
                              atoi (row[2]),  
                              atoi (row[3]),  
                              "Mysql User",  
                              row[4],  
                              row[5],  
                              mailbox_name,  
                              1);  
   else  
     rc = 1;  
     
   free (mailbox_name);  
   mysql_free_result (res);  
   mysql_close (m);  
     
   return rc;  
 }  
   
 static int  
 mu_auth_sql_by_uid (void *return_data, void *key,  
                     void *unused_func_data, void *unused_call_data)  
 {  
   char *query_str = NULL;  
   MYSQL *m;  
   MYSQL_RES *res;  
   MYSQL_ROW row;  
   char uidstr[64];  
   char *mailbox_name;  
   int rc;  
     
   if (!key)  
     {  
       errno = EINVAL;  
       return 1;  
     }  
   
   m = mysql_init (0);  
   
   if (!m)  
     return 1;  
   
   if (!mysql_real_connect (m, sql_host, sql_user, sql_passwd, sql_db, sql_port,  
                            sql_socket, MFLAGS))  
     {  
       mu_error (_("MySQL: connect failed: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
   
   snprintf (uidstr, sizeof (uidstr), "%u", *(uid_t*)key);  
   query_str = sql_expand_query (sql_getpwuid_query, uidstr);  
   
   if (!query_str)  
     {  
       mysql_close (m);  
       return 1;  
     }  
     
   if (mysql_query (m, query_str) != 0)  
     {  
       mu_error (_("MySQL: query failed: %s"), mysql_error (m));  
       free (query_str);  
       mysql_close (m);  
       return 1;  
     }  
   
   free (query_str);  
     
   if ((res = mysql_store_result (m)) == NULL)  
     {  
       mu_error (_("MySQL: can't store result: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
     
   if ((row = mysql_fetch_row (res)) == NULL)  
     {  
       mu_error (_("MySQL: can't fetch row: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
   
   if (mysql_num_fields (res) == 7 && row[6])  
     mailbox_name = strdup (row[6]);  
   else  
     {  
       mailbox_name = malloc (strlen (mu_path_maildir) +  
                              strlen (row[0]) + 1);  
       if (mailbox_name)  
         sprintf (mailbox_name, "%s%s", mu_path_maildir, row[0]);  
     }  
   
   if (mailbox_name)  
     rc = mu_auth_data_alloc ((struct mu_auth_data **) return_data,  
                              row[0],  
                              row[1],  
                              atoi (row[2]),  
                              atoi (row[3]),  
                              "Mysql User",  
                              row[4],  
                              row[5],  
                              mailbox_name,  
                              1);  
   else  
     rc = 1;  
     
   free (mailbox_name);  
   mysql_free_result (res);  
   mysql_close (m);  
     
   return rc;  
 }  
   
 static int  
 mu_sql_authenticate (void *ignored_return_data, void *key,  
                      void *ignored_func_data, void *call_data)  
 {  
   struct mu_auth_data *auth_data = key;  
   char *pass = call_data;  
   char *query_str = NULL;  
   MYSQL *m;  
   MYSQL_RES *res;  
   MYSQL_ROW row;  
   int rc;  
     
   if (!auth_data)  
     return 1;  
   
   m = mysql_init (0);  
   
   if (!m)  
     return 1;  
     
   if (!mysql_real_connect (m, sql_host, sql_user, sql_passwd, sql_db, sql_port,  
                            sql_socket, MFLAGS))  
     {  
       mu_error (_("MySQL: connect failed: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
     
   query_str = sql_expand_query (sql_getpass_query, auth_data->name);  
   
   if (!query_str)  
     {  
       mysql_close (m);  
       return 1;  
     }  
   
   if (mysql_query (m, query_str) != 0)  
     {  
       mu_error (_("MySQL: query failed: %s"), mysql_error (m));  
       free (query_str);  
       mysql_close (m);  
       return 1;  
     }  
   
   free (query_str);  
     
   if ((res = mysql_store_result (m)) == NULL)  
     {  
       mu_error (_("MySQL: can't store result: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
     
   if ((row = mysql_fetch_row (res)) == NULL)  
     {  
       mu_error (_("MySQL: can't fetch row: %s"), mysql_error (m));  
       mysql_close (m);  
       return 1;  
     }  
   
   rc = strcmp (row[0], crypt (pass, row[0]));  
   mysql_free_result (res);  
   mysql_close (m);  
   return rc;  
 }  
   
   
133  # define ARG_SQL_GETPWNAM 1  # define ARG_SQL_GETPWNAM 1
134  # define ARG_SQL_GETPWUID 2  # define ARG_SQL_GETPWUID 2
135  # define ARG_SQL_GETPASS 3  # define ARG_SQL_GETPASS 3
# Line 422  mu_sql_argp_parser (int key, char *arg, Line 165  mu_sql_argp_parser (int key, char *arg,
165    switch (key)    switch (key)
166      {      {
167      case ARG_SQL_GETPWNAM:      case ARG_SQL_GETPWNAM:
168        sql_getpwnam_query = arg;        mu_sql_getpwnam_query = arg;
169        break;        break;
170    
171      case ARG_SQL_GETPWUID:      case ARG_SQL_GETPWUID:
172        sql_getpwuid_query = arg;        mu_sql_getpwuid_query = arg;
173        break;        break;
174    
175      case ARG_SQL_GETPASS:      case ARG_SQL_GETPASS:
176        sql_getpass_query = arg;        mu_sql_getpass_query = arg;
177        break;        break;
178    
179      case ARG_SQL_HOST:      case ARG_SQL_HOST:
180        sql_host = arg;        mu_sql_host = arg;
181        break;        break;
182    
183      case ARG_SQL_USER:      case ARG_SQL_USER:
184        sql_user = arg;        mu_sql_user = arg;
185        break;        break;
186    
187      case ARG_SQL_PASSWD:      case ARG_SQL_PASSWD:
188        sql_passwd = arg;        mu_sql_passwd = arg;
189        break;        break;
190    
191      case ARG_SQL_DB:      case ARG_SQL_DB:
192        sql_db = arg;        mu_sql_db = arg;
193        break;        break;
194    
195      case ARG_SQL_PORT:      case ARG_SQL_PORT:
196        sql_port = strtoul (arg, NULL, 0);        mu_sql_port = strtoul (arg, NULL, 0);
197        if (sql_port == 0)        if (mu_sql_port == 0)
198          {          {
199            sql_host = NULL;            mu_sql_host = NULL;
200            sql_socket = arg;            mu_sql_socket = arg;
201          }          }
202        break;        break;
203    
# Line 469  struct argp mu_sql_argp = { Line 212  struct argp mu_sql_argp = {
212    mu_sql_argp_parser,    mu_sql_argp_parser,
213  };  };
214    
215    
216    # ifdef HAVE_MYSQL
217    int mysql_auth_sql_by_name __P((void *return_data, void *key,
218                                    void *func_data, void *call_data));
219    int mysql_auth_sql_by_uid __P((void *return_data, void *key,
220                                   void *func_data, void *call_data));
221    int mysql_sql_authenticate __P((void *return_data, void *key,
222                                    void *func_data, void *call_data));
223    
224    #  define mu_sql_authenticate mysql_sql_authenticate
225    #  define mu_auth_sql_by_name mysql_auth_sql_by_name
226    #  define mu_auth_sql_by_uid  mysql_auth_sql_by_uid
227    
228    # endif
229    
230    # ifdef HAVE_PGSQL
231    int pg_auth_sql_by_name __P((void *return_data, void *key,
232                                 void *func_data, void *call_data));
233    int pg_auth_sql_by_uid __P((void *return_data, void *key,
234                                void *func_data, void *call_data));
235    int pg_sql_authenticate __P((void *return_data, void *key,
236                                 void *func_data, void *call_data));
237    
238    #  define mu_sql_authenticate pg_sql_authenticate
239    #  define mu_auth_sql_by_name pg_auth_sql_by_name
240    #  define mu_auth_sql_by_uid  pg_auth_sql_by_uid
241    
242    # endif
243    
244  #else  #else
245    
246  #define mu_sql_authenticate mu_auth_nosupport  # define mu_sql_authenticate mu_auth_nosupport
247  #define mu_auth_sql_by_name mu_auth_nosupport  # define mu_auth_sql_by_name mu_auth_nosupport
248  #define mu_auth_sql_by_uid  mu_auth_nosupport  # define mu_auth_sql_by_uid  mu_auth_nosupport
249    
250  #endif  #endif
251    
252  struct mu_auth_module mu_auth_sql_module = {  struct mu_auth_module mu_auth_sql_module = {
253    "sql",    "sql",
254  #ifdef HAVE_MYSQL  #ifdef USE_SQL
255    &mu_sql_argp,    &mu_sql_argp,
256  #else  #else
257    NULL,    NULL,

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.12

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26