initial commit
[m6w6/m6w6.github.io] / _posts / 2004-10-06-extvpopmail-no-thanks.md
1 ---
2 title: ext/vpopmail? no thanks...
3 author: m6w6
4 tags:
5 - PHP
6 ---
7
8 If you ever thought about administering vpopmail through PHP, you most
9 probably already stumbled across the [vpopmail](http://pecl.php.net/vpopmail)
10 extension living in [PECL](http://pecl.php.net/), and know that making use of
11 it is rather kludgy...
12
13 In need of such a solution I've written a simple XML-RPC CGI service in C with
14 help of the [xmlrpc-c](http://xmlrpc-c.sourceforge.net/) library. I really
15 didn't think that it would be that easy, but it definitely was, considering
16 that I'm a C novice ;)
17
18 The following source will show that it's quite as simple as writing this XML-
19 RPC backend in PHP, and it's really fast.
20
21 ### Update
22 There's now a source tarball available at: <http://dev.iworks.at/vpop-xmlrpc/>
23 ```c
24 #include <sys/types.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <vauth.h>
28 #include <vpopmail.h>
29 #include <xmlrpc.h>
30 #include <xmlrpc_cgi.h>
31
32 static xmlrpc_value *vpop_adduser(xmlrpc_env *env, xmlrpc_value *param, void *data)
33 {
34 char *user, *domain, *password, *fullname;
35 xmlrpc_bool rs;
36
37 xmlrpc_parse_value(env, param, "({s:s,s:s,s:s,s:s,*})",
38 "user", &user,
39 "domain", &domain,
40 "password", &password,
41 "fullname", &fullname
42 );
43
44 if (env->fault_occurred) {
45 return NULL;
46 }
47
48 rs = vadduser(user, domain, password, fullname, 0) == 0 ? 1 : 0;
49
50 return xmlrpc_build_value(env, "b", rs);
51 }
52
53 static xmlrpc_value *vpop_deluser(xmlrpc_env *env, xmlrpc_value *param, void *data)
54 {
55 char *user, *domain;
56 xmlrpc_bool rs;
57
58 xmlrpc_parse_value(env, param, "({s:s,s:s,*})",
59 "user", &user,
60 "domain", &domain
61 );
62
63 if (env->fault_occurred) {
64 return NULL;
65 }
66
67 rs = vdeluser(user, domain) == 0 ? 1 : 0;
68
69 return xmlrpc_build_value(env, "b", rs);
70 }
71
72 static xmlrpc_value *vpop_passwd(xmlrpc_env *env, xmlrpc_value *param, void *data)
73 {
74 char *user, *domain, *password;
75 xmlrpc_bool rs;
76
77 xmlrpc_parse_value(env, param, "({s:s,s:s,s:s,*})",
78 "user", &user,
79 "domain", &domain,
80 "password", &password
81 );
82
83 if (env->fault_occurred) {
84 return NULL;
85 }
86
87 rs = vpasswd(user, domain, password, 0) == 0 ? 1 : 0;
88
89 return xmlrpc_build_value(env, "b", rs);
90 }
91
92 static xmlrpc_value *vpop_setquota(xmlrpc_env *env, xmlrpc_value *param, void *data)
93 {
94 char *user, *domain, *quota;
95 xmlrpc_bool rs;
96
97 xmlrpc_parse_value(env, param, "({s:s,s:s,s:s,*})",
98 "user", &user,
99 "domain", &domain,
100 "quota", &quota
101 );
102
103 if (env->fault_occurred) {
104 return NULL;
105 }
106
107 rs = vsetuserquota(user, domain, quota) == 0 ? 1 : 0;
108
109 return xmlrpc_build_value(env, "b", rs);
110 }
111
112 int main(int argc, char **argv)
113 {
114 xmlrpc_cgi_init(XMLRPC_CGI_NO_FLAGS);
115
116 xmlrpc_cgi_add_method_w_doc("vpop.adduser", &vpop_adduser, NULL,
117 "b:S", "Add a vpopmail user to a domain with password, fullname and quota.");
118 xmlrpc_cgi_add_method_w_doc("vpop.deluser", &vpop_deluser, NULL,
119 "b:S", "Delete a user from a domain.");
120 xmlrpc_cgi_add_method_w_doc("vpop.passwd", &vpop_passwd, NULL,
121 "b:S", "Change the password of a user in a domain.");
122 xmlrpc_cgi_add_method_w_doc("vpop.setquota", &vpop_setquota, NULL,
123 "b:S", "Set the quota of a user in a domain.");
124
125 xmlrpc_cgi_process_call();
126
127 xmlrpc_cgi_cleanup();
128 return 0;
129 }
130 ```
131