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