1 /*
2
3 cvm-vchkpw.c
4
5 for authentication against vpopmail from http://www.inter7.com
6
7 add to conf-cc:
8
9 -I/usr/local/vpopmail/include
10
11 add to Makefile (mysql if vpopmail is compiled with mysql):
12
13 cvm-vchkpw: load cvm-vchkpw.o module.a crypt.lib shadow.lib s.lib socket.lib
14 ./load cvm-vchkpw getpwnam.o module.a `cat crypt.lib` `cat shadow.lib` `cat s.lib` `cat socket.lib` -L/usr/local/vpopmail/lib -L/usr/local/lib/mysql -lbg -lvpopmail -lmysqlclient
15
16 cvm-vchkpw.o: compile cvm-vchkpw.c module.h facts.h errors.h
17 ./compile cvm-vchkpw.c
18
19 and add cvm-vchkpw to the programs rule
20
21 */
22
23 #include <sys/types.h>
24 #include <string.h>
25 #include <stdlib.h>
26 #include <pwd.h>
27 #include <vpopmail.h>
28 #include <vauth.h>
29 #include "module.h"
30
31 const char program[] = "cvm-vchkpw";
32
cvm_module_init(void)33 int cvm_module_init(void)
34 {
35 return 0;
36 }
37
cvm_module_stop(void)38 void cvm_module_stop(void)
39 {
40 return;
41 }
42
43 static struct vqpasswd* mypw;
44
cvm_lookup(void)45 int cvm_lookup(void)
46 {
47 CVM_CRED_REQUIRED(DOMAIN);
48 if ((mypw = vauth_getpw(cvm_credentials[CVM_CRED_ACCOUNT].s,
49 cvm_credentials[CVM_CRED_DOMAIN].s)) == 0)
50 return CVME_PERMFAIL;
51 return 0;
52 }
53
cvm_authenticate(void)54 int cvm_authenticate(void)
55 {
56 CVM_CRED_REQUIRED(PASSWORD);
57 if (vauth_crypt(cvm_credentials[CVM_CRED_ACCOUNT].s,
58 cvm_credentials[CVM_CRED_DOMAIN].s,
59 cvm_credentials[CVM_CRED_PASSWORD].s,
60 mypw) != 0)
61 return CVME_PERMFAIL;
62 return 0;
63 }
64
cvm_results(void)65 int cvm_results(void)
66 {
67 char* mailbox;
68 char* tmpstr;
69 uid_t uid;
70 gid_t gid;
71 const long dirlen = strlen(mypw->pw_dir);
72 tmpstr = vget_assign(cvm_credentials[CVM_CRED_DOMAIN].s, 0, 0, &uid, &gid);
73 mailbox = malloc(dirlen + 10);
74 memcpy(mailbox, mypw->pw_dir, dirlen);
75 memcpy(mailbox+dirlen, "/Maildir/", 10);
76 cvm_fact_username = mypw->pw_name;
77 cvm_fact_userid = uid;
78 cvm_fact_groupid = gid;
79 cvm_fact_realname = mypw->pw_gecos;
80 cvm_fact_directory = mypw->pw_dir;
81 cvm_fact_mailbox = mailbox;
82 cvm_fact_shell = mypw->pw_shell;
83 cvm_fact_domain = cvm_credentials[CVM_CRED_DOMAIN].s;
84 cvm_fact_groupname = 0;
85 return 0;
86 }
87
88