]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanserv_relay.c
2 #include "../control/control.h"
3 #include "../lib/version.h"
4 #include "../lib/irc_string.h"
10 MODULE_VERSION(QVERSION
);
12 int csa_docheckhashpass(void *source
, int cargc
, char **cargv
);
13 int csa_docreateaccount(void *source
, int cargc
, char **cargv
);
14 int csa_dosettempemail(void *source
, int cargc
, char **cargv
);
15 int csa_doresendemail(void *source
, int cargc
, char **cargv
);
16 int csa_doactivateuser(void *source
, int cargc
, char **cargv
);
19 registercontrolhelpcmd("checkhashpass", NO_RELAY
, 3, csa_docheckhashpass
, "Usage: checkhashpass <username> <digest> ?junk?");
20 registercontrolhelpcmd("createaccount", NO_RELAY
, 4, csa_docreateaccount
, "Usage: createaccount <execute> <username> <email address> <password>");
21 registercontrolhelpcmd("settempemail", NO_RELAY
, 2, csa_dosettempemail
, "Usage: settempemail <userid> <email address>");
22 registercontrolhelpcmd("resendemail", NO_RELAY
, 1, csa_doresendemail
, "Usage: resendemail <userid>");
23 registercontrolhelpcmd("activateuser", NO_RELAY
, 1, csa_doactivateuser
, "Usage: activateuser <userid>");
27 deregistercontrolcmd("checkhashpass", csa_docheckhashpass
);
28 deregistercontrolcmd("createaccount", csa_docreateaccount
);
29 deregistercontrolcmd("settempemail", csa_dosettempemail
);
30 deregistercontrolcmd("resendemail", csa_doresendemail
);
31 deregistercontrolcmd("activateuser", csa_doactivateuser
);
34 int csa_docheckhashpass(void *source
, int cargc
, char **cargv
) {
35 nick
*sender
=(nick
*)source
;
40 controlreply(sender
, "CHECKHASHPASS FAIL args");
44 if (!(rup
=findreguserbynick(cargv
[0]))) {
45 controlreply(sender
, "CHECKHASHPASS FAIL user");
49 flags
= printflags(QUFLAG_ALL
& rup
->flags
, ruflags
);
50 if(UHasSuspension(rup
)) {
51 controlreply(sender
, "CHECKHASHPASS FAIL suspended %s %s %u", rup
->username
, flags
, rup
->ID
);
52 } else if(UIsInactive(rup
)) {
53 controlreply(sender
, "CHECKHASHPASS FAIL inactive %s %s %u", rup
->username
, flags
, rup
->ID
);
54 } else if(!checkhashpass(rup
, cargc
<3?NULL
:cargv
[2], cargv
[1])) {
55 controlreply(sender
, "CHECKHASHPASS FAIL digest %s %s %u", rup
->username
, flags
, rup
->ID
);
57 controlreply(sender
, "CHECKHASHPASS OK %s %s %u %s", rup
->username
, flags
, rup
->ID
, rup
->email
?rup
->email
->content
:"-");
63 static char *email_to_error(char *email
) {
64 maildomain
*mdp
, *smdp
;
71 switch(csa_checkeboy_r(email
)) {
73 case QM_EMAILTOOSHORT
: return "emailshort";
74 case QM_EMAILNOAT
: return "emailinvalid";
75 case QM_EMAILATEND
: return "emailinvalid";
76 case QM_EMAILINVCHR
: return "emailinvalid";
77 case QM_NOTYOUREMAIL
: return "emailnotyours";
78 case QM_INVALIDEMAIL
: return "emailinvalid";
79 default: return "emailunknown";
82 /* maildomain BS... c&p from hello.c */
83 for(mlp
=maillocks
;mlp
;mlp
=mlp
->next
) {
84 if(!match(mlp
->pattern
->content
, email
)) {
89 dupemail
= strdup(email
);
90 local
=strchr(dupemail
, '@');
93 return "emailunknown";
97 mdp
=findnearestmaildomain(local
);
99 for(smdp
=mdp
; smdp
; smdp
=smdp
->parent
) {
100 if(MDIsBanned(smdp
)) {
102 return "emaillocked";
104 if((smdp
->count
>= smdp
->limit
) && (smdp
->limit
> 0)) {
106 return "emaildomainlimit";
111 mdp
=findmaildomainbydomain(local
);
113 for (ruh
=mdp
->users
; ruh
; ruh
=ruh
->nextbydomain
) {
115 if (!strcasecmp(dupemail
, ruh
->localpart
->content
)) {
120 if((found
>= mdp
->actlimit
) && (mdp
->actlimit
> 0)) {
122 return "emailaddresslimit";
129 static void sendemail(reguser
*rup
) {
130 csdb_createmail(rup
, QMAIL_ACTIVATEEMAIL
);
133 int csa_docreateaccount(void *source
, int cargc
, char **cargv
) {
134 nick
*sender
=(nick
*)source
;
136 char *error_username
= NULL
, *error_password
= NULL
, *error_email
= NULL
;
137 char *username
= NULL
, *password
= NULL
, *email
= NULL
;
138 char account_info
[512];
142 controlreply(sender
, "CREATEACCOUNT FALSE args");
146 execute
= cargv
[0][0] == '1';
147 if(strcmp(cargv
[1], "0"))
149 if(strcmp(cargv
[2], "0"))
151 if(strcmp(cargv
[3], "0"))
155 if (findreguserbynick(username
)) {
156 error_username
= "usernameinuse";
157 } else if(csa_checkaccountname_r(username
)) {
158 error_username
= "usernameinvalid";
163 error_email
= email_to_error(email
);
166 int r
= csa_checkpasswordquality(password
);
167 if(r
== QM_PWTOSHORT
) {
168 error_password
= "passwordshort";
169 } else if(r
== QM_PWTOWEAK
) {
170 error_password
= "passwordweak";
172 error_password
= "passwordunknown";
176 if(execute
&& email
&& password
&& username
&& !error_email
&& !error_password
&& !error_username
) {
180 rup
= csa_createaccount(username
, password
, email
);
183 cs_log(sender
,"CREATEACCOUNT created auth %s (%s)",rup
->username
,rup
->email
->content
);
184 csdb_createuser(rup
);
185 snprintf(account_info
, sizeof(account_info
), " %u", rup
->ID
);
189 account_info
[0] = '\0';
193 controlreply(sender
, "CREATEACCOUNT %s%s%s%s%s%s%s%s",
194 do_create
? "TRUE" : "FALSE",
196 email
&& error_email
? " " : "", email
&& error_email
? error_email
: "",
197 password
&& error_password
? " " : "", password
&& error_password
? error_password
: "",
198 username
&& error_username
? " " : "", username
&& error_username
? error_username
: ""
204 int csa_dosettempemail(void *source
, int cargc
, char **cargv
) {
208 nick
*sender
=(nick
*)source
;
211 controlreply(sender
, "SETTEMPEMAIL FALSE args");
215 rup
= findreguserbyID(atoi(cargv
[0]));
217 controlreply(sender
, "SETTEMPEMAIL FALSE useridnotexist");
221 if(!UIsInactive(rup
)) {
222 controlreply(sender
, "SETTEMPEMAIL FALSE accountactive");
227 error
= email_to_error(email
);
229 controlreply(sender
, "SETTEMPEMAIL FALSE %s", error
);
233 freesstring(rup
->email
);
234 rup
->email
=getsstring(email
,EMAILLEN
);
235 cs_log(sender
,"SETTEMPEMAIL OK username %s email %s",rup
->username
, rup
->email
->content
);
237 csdb_updateuser(rup
);
240 controlreply(sender
, "SETTEMPEMAIL TRUE");
245 int csa_doresendemail(void *source
, int cargc
, char **cargv
) {
247 nick
*sender
=(nick
*)source
;
250 controlreply(sender
, "RESENDEMAIL FALSE args");
254 rup
= findreguserbyID(atoi(cargv
[0]));
256 controlreply(sender
, "RESENDEMAIL FALSE useridnotexist");
260 if(!UIsInactive(rup
)) {
261 controlreply(sender
, "RESENDEMAIL FALSE accountactive");
266 controlreply(sender
, "RESENDEMAIL TRUE");
267 cs_log(sender
,"RESENDEMAIL OK username %s",rup
->username
);
272 int csa_doactivateuser(void *source
, int cargc
, char **cargv
) {
274 nick
*sender
=(nick
*)source
;
277 controlreply(sender
, "ACTIVATEUSER FALSE args");
281 rup
= findreguserbyID(atoi(cargv
[0]));
283 controlreply(sender
, "ACTIVATEUSER FALSE useridnotexist");
287 if(!UIsInactive(rup
)) {
288 controlreply(sender
, "ACTIVATEUSER FALSE accountactive");
293 csdb_updateuser(rup
);
295 cs_log(sender
,"ACTIVATEUSER OK username %s",rup
->username
);
296 controlreply(sender
, "ACTIVATEUSER TRUE");