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 |
15 |
along with this program; if not, write to the Free Software |
along with this program; if not, write to the Free Software |
16 |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
17 |
|
|
18 |
#include "config.h" |
#include "../../../config.h" |
19 |
#include "auth.h" |
#include "auth.h" |
20 |
#include <string.h> |
#include <string.h> |
21 |
#include <sys/time.h> |
#include <sys/time.h> |
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; |
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; |
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"); |
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 |
|
|
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); |
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); |
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 |
} |
} |