Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/auth/checkpassword-reply.c @ 9008:fc4f65a4ca60 HEAD
virtual: Don't show mailboxes as \Noselect.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 01 May 2009 14:56:52 -0400 |
parents | 4497c58eaca8 |
children |
rev | line source |
---|---|
2162
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* simple checkpassword wrapper to send userdb data back to dovecot-auth */ |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "str.h" |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "write-full.h" |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include <stdlib.h> |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include <unistd.h> |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 int main(void) |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 { |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 string_t *str; |
8314
4497c58eaca8
Added missing changes to userdb checkpassword.
Timo Sirainen <tss@iki.fi>
parents:
8255
diff
changeset
|
13 const char *user, *home, *authorized; |
8255
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
14 const char *extra_env, *key, *value, *const *tmp; |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
15 bool uid_found = FALSE, gid_found = FALSE; |
2162
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 lib_init(); |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 str = t_str_new(1024); |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
5152
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
20 user = getenv("USER"); |
5155
facdf5823359
If USER environment is set, return it in "user" field and not "userdb_user".
Timo Sirainen <tss@iki.fi>
parents:
5152
diff
changeset
|
21 if (user != NULL) { |
facdf5823359
If USER environment is set, return it in "user" field and not "userdb_user".
Timo Sirainen <tss@iki.fi>
parents:
5152
diff
changeset
|
22 if (strchr(user, '\t') != NULL) { |
facdf5823359
If USER environment is set, return it in "user" field and not "userdb_user".
Timo Sirainen <tss@iki.fi>
parents:
5152
diff
changeset
|
23 i_error("checkpassword: USER contains TAB"); |
facdf5823359
If USER environment is set, return it in "user" field and not "userdb_user".
Timo Sirainen <tss@iki.fi>
parents:
5152
diff
changeset
|
24 return 1; |
facdf5823359
If USER environment is set, return it in "user" field and not "userdb_user".
Timo Sirainen <tss@iki.fi>
parents:
5152
diff
changeset
|
25 } |
facdf5823359
If USER environment is set, return it in "user" field and not "userdb_user".
Timo Sirainen <tss@iki.fi>
parents:
5152
diff
changeset
|
26 str_printfa(str, "user=%s\t", user); |
3063
a0fbf92b41c3
userdb = passdb works now with checkpassword passdb.
Timo Sirainen <tss@iki.fi>
parents:
2162
diff
changeset
|
27 } |
a0fbf92b41c3
userdb = passdb works now with checkpassword passdb.
Timo Sirainen <tss@iki.fi>
parents:
2162
diff
changeset
|
28 |
5152
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
29 home = getenv("HOME"); |
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
30 if (home != NULL) { |
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
31 if (strchr(home, '\t') != NULL) { |
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
32 i_error("checkpassword: HOME contains TAB"); |
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
33 return 1; |
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
34 } |
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
35 str_printfa(str, "userdb_home=%s\t", home); |
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
36 } |
2162
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
4032
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
38 extra_env = getenv("EXTRA"); |
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
39 if (extra_env != NULL) { |
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
40 for (tmp = t_strsplit(extra_env, " "); *tmp != NULL; tmp++) { |
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
41 value = getenv(*tmp); |
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
42 if (value != NULL) { |
8255
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
43 key = t_str_lcase(*tmp); |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
44 if (strcmp(key, "userdb_uid") == 0) |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
45 uid_found = TRUE; |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
46 else if (strcmp(key, "userdb_gid") == 0) |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
47 gid_found = TRUE; |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
48 str_printfa(str, "%s=%s\t", key, value); |
4032
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
49 } |
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
50 } |
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
51 } |
8255
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
52 if (!uid_found) |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
53 str_printfa(str, "userdb_uid=%s\t", dec2str(getuid())); |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
54 if (!gid_found) |
a38778911fa9
checkpassword: Allow setting uid/gid in userdb_uid and userdb_gid environment.
Timo Sirainen <tss@iki.fi>
parents:
5155
diff
changeset
|
55 str_printfa(str, "userdb_gid=%s\t", dec2str(getgid())); |
4032
7140f09b464f
Allow checkpassword program to send extra parameters to Dovecot. EXTRA environment contains a list of environment variables that are passed to Dovecot.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3063
diff
changeset
|
56 |
2162
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 if (write_full(4, str_data(str), str_len(str)) < 0) { |
5152
3dc493d152ac
Don't crash if USER or HOME environment is missing. Allow HOME environment
Timo Sirainen <tss@iki.fi>
parents:
4032
diff
changeset
|
58 i_error("checkpassword: write_full() failed: %m"); |
2162
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 exit(111); |
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 } |
8314
4497c58eaca8
Added missing changes to userdb checkpassword.
Timo Sirainen <tss@iki.fi>
parents:
8255
diff
changeset
|
61 authorized = getenv("AUTHORIZED"); |
4497c58eaca8
Added missing changes to userdb checkpassword.
Timo Sirainen <tss@iki.fi>
parents:
8255
diff
changeset
|
62 return authorized != NULL && strcmp(authorized, "2") == 0 ? 2 : 0; |
2162
95b2a6abc01e
Added checkpassword passdb. userdb has only beginnings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 } |