/[muddleftpd]/muddleftpd/modules/auth/authlibmsql/authmsql.c
ViewVC logotype

Diff of /muddleftpd/modules/auth/authlibmsql/authmsql.c

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

revision 1.1 by rugger, Sun Oct 20 12:00:41 2002 UTC revision 1.1.4.1 by ganneff, Mon Oct 21 19:52:58 2002 UTC
# Line 1  Line 1 
1    
2  /* Copyright (C) 1999 Beau Kuiper  /* Copyright (C) 1999 Beau Kuiper
3    
4     This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
# Line 26  Line 27 
27  #define ENCRYPTED_NONE 0  #define ENCRYPTED_NONE 0
28  #define ENCRYPTED_CRYPT 1  #define ENCRYPTED_CRYPT 1
29    
30  typedef struct  typedef struct
31  {  {
32          char *password;          char *password;
33          char *homedir;          char *homedir;
# Line 34  typedef struct Line 35  typedef struct
35          int uid;          int uid;
36          int gid;          int gid;
37          int encrypted;          int encrypted;
38  } PASSWDSTRUCT;  }
39    PASSWDSTRUCT;
40    
41  void *gethandle(void *peer, void *tset, char *username, int *err)  void *gethandle(void *peer,
42                                    void *tset,
43                                    char *username,
44                                    int *err)
45  {  {
46          int sqlhandle = -1;          int sqlhandle = -1;
47          m_result *result = NULL;          m_result *result = NULL;
# Line 51  void *gethandle(void *peer, void *tset, Line 56  void *gethandle(void *peer, void *tset,
56          char *sqlquery, *query = NULL;          char *sqlquery, *query = NULL;
57    
58          section = auth_getcursectionid(peer);          section = auth_getcursectionid(peer);
59          newhandle = (PASSWDSTRUCT *)mallocwrapper(sizeof(PASSWDSTRUCT));          newhandle = (PASSWDSTRUCT *) mallocwrapper(sizeof(PASSWDSTRUCT));
60    
61          /* read info from config file */          /*
62             * read info from config file
63             */
64          sqlserver = mktokconfstr(tset, section, "msql_host", NULL);          sqlserver = mktokconfstr(tset, section, "msql_host", NULL);
65          sqldatabase = mktokconfstr(tset, section, "msql_database", NULL);          sqldatabase = mktokconfstr(tset, section, "msql_database", NULL);
66          sqltable = mktokconfstr(tset, section, "msql_table", "users");          sqltable = mktokconfstr(tset, section, "msql_table", "users");
# Line 63  void *gethandle(void *peer, void *tset, Line 70  void *gethandle(void *peer, void *tset,
70    
71          if (!sqldatabase)          if (!sqldatabase)
72          {          {
73                  log_addentry(MYLOG_INFO, NULL, "libauthmsql REQUIRES msql_database to connect to sql server");                  log_addentry(MYLOG_INFO, NULL,
74                                             "libauthmsql REQUIRES msql_database to connect to sql server");
75                  goto error;                  goto error;
76          }          }
77    
# Line 73  void *gethandle(void *peer, void *tset, Line 81  void *gethandle(void *peer, void *tset,
81                  newhandle->encrypted = ENCRYPTED_CRYPT;                  newhandle->encrypted = ENCRYPTED_CRYPT;
82          else          else
83          {          {
84                  log_addentry(MYLOG_INFO, NULL, "libauthmsql REQUIRES msql_encryption to be set to either plaintext or crypt");                  log_addentry(MYLOG_INFO, NULL,
85                                             "libauthmsql REQUIRES msql_encryption to be set to either plaintext or crypt");
86                  goto error;                  goto error;
87          }          }
88    
89          if (!sqlquery)          if (!sqlquery)
90                  query = safe_snprintf("SELECT password,homedir,rootdir,uid,gid FROM %s WHERE username='%s'", sqltable, username);                  query =
91                            safe_snprintf
92                            ("SELECT password,homedir,rootdir,uid,gid FROM %s WHERE username='%s'",
93                             sqltable, username);
94          else          else
95                  query = strdupwrapper(sqlquery);                  query = strdupwrapper(sqlquery);
96    
97          /* connect to sql server */          /*
98             * connect to sql server
99             */
100    
101          if ((sqlhandle = msqlConnect(sqlserver)) == -1)          if ((sqlhandle = msqlConnect(sqlserver)) == -1)
102          {          {
103                  log_giveentry(MYLOG_INFO, NULL,                  log_giveentry(MYLOG_INFO, NULL,
104                                safe_snprintf("libauthmsql could not connect to SQL server: %s", msqlErrMsg));                                            safe_snprintf
105                  goto error;                                                ("libauthmsql could not connect to SQL server: %s",
106                                               msqlErrMsg));
107                    goto error;
108          }          }
109    
110          if (msqlSelectDB(sqlhandle, sqldatabase) == -1)          if (msqlSelectDB(sqlhandle, sqldatabase) == -1)
111          {          {
112                  log_giveentry(MYLOG_INFO, NULL,                  log_giveentry(MYLOG_INFO, NULL,
113                                safe_snprintf("libauthmsql could not connect to SQL database '%s': %s", sqldatabase, msqlErrMsg));                                            safe_snprintf
114                  goto error;                                                ("libauthmsql could not connect to SQL database '%s': %s",
115          }                                             sqldatabase, msqlErrMsg));
116                            goto error;
117          /* perform sql query */          }
118            
119            /*
120             * perform sql query
121             */
122    
123          if (msqlQuery(sqlhandle, query) == -1)          if (msqlQuery(sqlhandle, query) == -1)
124          {          {
125                  log_giveentry(MYLOG_INFO, NULL,                  log_giveentry(MYLOG_INFO, NULL,
126                                safe_snprintf("libauthmsql could not perform query on SQL server: %s", msqlErrMsg));                                            safe_snprintf
127                                              ("libauthmsql could not perform query on SQL server: %s",
128                                               msqlErrMsg));
129                  goto error;                  goto error;
130          }          }
131    
132          /* get result data */          /*
133                     * get result data
134             */
135    
136          result = msqlStoreResult();          result = msqlStoreResult();
137            
138          if (msqlNumFields(result) != 5)          if (msqlNumFields(result) != 5)
139          {          {
140                  log_addentry(MYLOG_INFO, NULL,                  log_addentry(MYLOG_INFO, NULL,
141                               "libauthmsql, msql_query setting incorrectly set");                                           "libauthmsql, msql_query setting incorrectly set");
142                  goto error;                  goto error;
143          }          }
144            
145          /* if we got no rows, then the user does not exist */          /*
146                     * if we got no rows, then the user does not exist
147             */
148    
149          if (msqlNumRows(result) == 0)          if (msqlNumRows(result) == 0)
150          {          {
151                  freewrapper(newhandle);                  freewrapper(newhandle);
# Line 127  void *gethandle(void *peer, void *tset, Line 153  void *gethandle(void *peer, void *tset,
153                  *err = AUTH_USERNKNOW;                  *err = AUTH_USERNKNOW;
154                  goto cleanup;                  goto cleanup;
155          }          }
156            
157          if (msqlNumRows(result) > 1)          if (msqlNumRows(result) > 1)
158          {          {
159                  log_giveentry(MYLOG_INFO, NULL,                  log_giveentry(MYLOG_INFO, NULL,
160                          safe_snprintf("libauthmsql got more than 1 result for query on user '%s'", username));                                            safe_snprintf
161                                              ("libauthmsql got more than 1 result for query on user '%s'",
162                                               username));
163                  goto error;                  goto error;
164          }          }
165            
166          /* decode row */          /*
167                     * decode row
168             */
169    
170          row = msqlFetchRow(result);          row = msqlFetchRow(result);
171    
172          if (!row[0] || !row[1] || !row[2] || !row[3] || !row[4])          if (!row[0] || !row[1] || !row[2] || !row[3] || !row[4])
173          {          {
174                  log_giveentry(MYLOG_INFO, NULL,                  log_giveentry(MYLOG_INFO, NULL,
175                          safe_snprintf("libauthmsql found NULL values in SQL result for user '%s'", username));                                            safe_snprintf
176                                              ("libauthmsql found NULL values in SQL result for user '%s'",
177                                               username));
178                  goto error;                  goto error;
179          }          }
180            
181          if (sscanf(row[3], "%d", &(newhandle->uid)) != 1)          if (sscanf(row[3], "%d", &(newhandle->uid)) != 1)
182          {          {
183                  log_giveentry(MYLOG_INFO, NULL,                  log_giveentry(MYLOG_INFO, NULL,
184                          safe_snprintf("libauthmsql could not decode uid of user '%s'", username));                                            safe_snprintf
185                                              ("libauthmsql could not decode uid of user '%s'",
186                                               username));
187                  goto error;                  goto error;
188          }                }
189    
190          if (sscanf(row[4], "%d", &(newhandle->gid)) != 1)          if (sscanf(row[4], "%d", &(newhandle->gid)) != 1)
191          {          {
192                  log_giveentry(MYLOG_INFO, NULL,                  log_giveentry(MYLOG_INFO, NULL,
193                          safe_snprintf("libauthmsql could not decode gid of user '%s'", username));                                            safe_snprintf
194                                              ("libauthmsql could not decode gid of user '%s'",
195                                               username));
196                  goto error;                  goto error;
197          }                }
198    
199          newhandle->password = strdupwrapper(row[0]);          newhandle->password = strdupwrapper(row[0]);
200          newhandle->homedir = strdupwrapper(row[1]);          newhandle->homedir = strdupwrapper(row[1]);
201    
202          newhandle->rootdir = strdupwrapper(row[2]);          newhandle->rootdir = strdupwrapper(row[2]);
203    
204          /* we are FINALLY DONE!, clean up and go home! */          /*
205                     * we are FINALLY DONE!, clean up and go home!
206             */
207    
208          *err = AUTH_OK;          *err = AUTH_OK;
209          goto cleanup;          goto cleanup;
210            
211  error:    error:
212          *err = AUTH_ERROR;          *err = AUTH_ERROR;
213          freewrapper(newhandle);          freewrapper(newhandle);
214          newhandle = NULL;          newhandle = NULL;
           
 cleanup:  
         if (query) freewrapper(query);  
         if (result) msqlFreeResult(result);  
         if (sqlhandle != -1) msqlClose(sqlhandle);  
215    
216          if (sqlserver) freewrapper(sqlserver);    cleanup:
217          if (sqldatabase) freewrapper(sqldatabase);          if (query)
218                    freewrapper(query);
219            if (result)
220                    msqlFreeResult(result);
221            if (sqlhandle != -1)
222                    msqlClose(sqlhandle);
223    
224            if (sqlserver)
225                    freewrapper(sqlserver);
226            if (sqldatabase)
227                    freewrapper(sqldatabase);
228          freewrapper(sqltable);          freewrapper(sqltable);
229          freewrapper(sqlencryption);          freewrapper(sqlencryption);
230          if (sqlquery) freewrapper(sqlquery);          if (sqlquery)
231                            freewrapper(sqlquery);
232          return(newhandle);        
233            return (newhandle);
234  }  }
235    
236  void freehandle(void *handle)  void freehandle(void *handle)
237  {  {
238          PASSWDSTRUCT *h = (PASSWDSTRUCT *)handle;          PASSWDSTRUCT *h = (PASSWDSTRUCT *) handle;
239          size_t sl = strlen(h->password);          size_t sl = strlen(h->password);
240    
241          /* destroy record of password */          /*
242             * destroy record of password
243             */
244          memset(h->password, 0, sl);          memset(h->password, 0, sl);
245          freewrapper(h->password);          freewrapper(h->password);
246          freewrapper(h->homedir);          freewrapper(h->homedir);
# Line 202  void freehandle(void *handle) Line 248  void freehandle(void *handle)
248          freewrapper(h);          freewrapper(h);
249  }  }
250    
251  int chkpasswd(void *handle, char *password, char **errmsg)  int chkpasswd(void *handle,
252                              char *password,
253                              char **errmsg)
254  {  {
255          PASSWDSTRUCT *h = (PASSWDSTRUCT *)handle;          PASSWDSTRUCT *h = (PASSWDSTRUCT *) handle;
256    
257          switch(h->encrypted)          switch (h->encrypted)
258          {          {
259                  case ENCRYPTED_NONE:          case ENCRYPTED_NONE:
260                          return(strcmp(password, h->password) == 0);                  return (strcmp(password, h->password) == 0);
261                  case ENCRYPTED_CRYPT:          case ENCRYPTED_CRYPT:
262                          return(chkpassword(h->password, password));                  return (chkpassword(h->password, password));
263                  default:          default:
264                          return(FALSE);                  return (FALSE);
265          }          }
266    
267          return(FALSE);          return (FALSE);
268  }  }
269    
270  char *gethomedir(void *h)  char *gethomedir(void *h)
271  {  {
272          return(((PASSWDSTRUCT *)h)->homedir);          return (((PASSWDSTRUCT *) h)->homedir);
273  }  }
274    
275  char *getrootdir(void *h)  char *getrootdir(void *h)
276  {  {
277          return(((PASSWDSTRUCT *)h)->rootdir);          return (((PASSWDSTRUCT *) h)->rootdir);
278  }  }
279    
280  uid_t getuseruid(void *h)  uid_t getuseruid(void *h)
281  {  {
282          return(((PASSWDSTRUCT *)h)->uid);          return (((PASSWDSTRUCT *) h)->uid);
283  }  }
284    
285  gid_t getusergid(void *h)  gid_t getusergid(void *h)
286  {  {
287          return(((PASSWDSTRUCT *)h)->gid);          return (((PASSWDSTRUCT *) h)->gid);
288  }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.1.4.1

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