1 // Copyright (C) 2000 Bruce Guenter <bruceg@em.ca>
2 //
3 // This program is free software; you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation; either version 2 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
17 #include <config.h>
18 #include <stdlib.h>
19 #include <sys/stat.h>
20 #include "daemon.h"
21
build_forwards(const command & args,int offset,vpwentry * vpw,vdomain & domain)22 response build_forwards(const command& args, int offset,
23 vpwentry* vpw, vdomain& domain)
24 {
25 bool first = true;
26 for(unsigned i = offset; i < args.count(); i++) {
27 if(!!args[i]) {
28 OK_RESPONSE(domain.validate_forward(args[i]));
29 if(!first)
30 vpw->forwards = vpw->forwards + mystring::NUL + args[i];
31 else {
32 vpw->forwards = args[i];
33 first = false;
34 }
35 }
36 }
37 RETURN(ok, "");
38 }
39
do_adduser(command & args,int minargc)40 static response do_adduser(command& args, int minargc)
41 {
42 mystring fulluser = args[0];
43 mystring adminpass = args[1];
44 mystring newpass = args[2];
45 mystring directory = args[3];
46 args[1] = LOG_ADMINPASS;
47 args[2] = LOG_NEWPASS;
48 logcommand(args);
49
50 pwentry* pw;
51 vpwentry* vpw;
52 OK_RESPONSE(lookup_and_validate(fulluser, pw, vpw, adminpass, false));
53 OK_RESPONSE(build_forwards(args, minargc, vpw, state->domain));
54 if(!!newpass)
55 vpw->pass = pwcrypt(newpass);
56 if(!directory)
57 directory = vpw->name;
58 vpw->directory = "./" + state->domain.userdir(directory);
59 vpw->has_mailbox = !!args[minargc-1];
60 return state->domain.set(vpw, true);
61 }
62
CMD(adduser2)63 CMD(adduser2)
64 // Usage: adduser2 baseuser-virtuser adminpass newpass dirname [forwards ...]
65 // If <newpass> is empty, a null-password is used.
66 // If <dirname> is empty, no mailbox directory is created.
67 // <dirname> should normally be the same as virtuser.
68 {
69 return do_adduser(args, 4);
70 }
71
CMD(adduser3)72 CMD(adduser3)
73 // Usage: adduser3 baseuser-virtuser adminpass newpass dirname has_mailbox [forwards ...]
74 // If <newpass> is empty, a null-password is used.
75 // If <dirname> is empty, <virtuser> is used in its place
76 // If <has_mailbox> is empty, no mailbox is created,
77 // just the account directory
78 {
79 return do_adduser(args, 5);
80 }
81