]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/usercmds.c
4 #include "../lib/irc_string.h"
9 int csu_douserflags(void *source
, int cargc
, char **cargv
);
10 int csu_doinfo(void *source
, int cargc
, char **cargv
);
11 int csu_dowhois(void *source
, int cargc
, char **cargv
);
12 int csu_dousercomment(void *source
, int cargc
, char **cargv
);
13 int csu_dodeluser(void *source
, int cargc
, char **cargv
);
14 int csu_dolanguage(void *source
, int cargc
, char **cargv
);
15 int csu_dosuspenduser(void *source
, int cargc
, char **cargv
);
16 int csu_dounsuspenduser(void *source
, int cargc
, char **cargv
);
17 int csu_dospewdb(void *source
, int cargc
, char **cargv
);
18 int csu_dospewpass(void *source
, int cargc
, char **cargv
);
19 int csu_dospewemail(void *source
, int cargc
, char **cargv
);
20 int csu_dolistflags(void *source
, int cargc
, char **cargv
);
21 int csu_dosuspenduserlist(void *source
, int cargc
, char **cargv
);
24 chanservaddcommand("userflags" , QCMD_AUTHED
, 2, csu_douserflags
,"Shows or changes user flags.");
25 chanservaddcommand("info" , QCMD_AUTHED
, 2, csu_doinfo
,"Shows or changes info line.");
26 chanservaddcommand("whois" , QCMD_AUTHED
, 1, csu_dowhois
,"Displays information about a user.");
27 chanservaddcommand("usercomment" , QCMD_OPER
, 2, csu_dousercomment
,"Shows or changes staff comment for a user.");
28 chanservaddcommand("deluser" , QCMD_OPER
, 2, csu_dodeluser
,"Removes a user from the bot.");
29 chanservaddcommand("language" , QCMD_AUTHED
, 1, csu_dolanguage
,"Shows or changes your current language.");
30 chanservaddcommand("suspenduser" , QCMD_OPER
, 1, csu_dosuspenduser
,"Suspend/Delay GLINE/Instantly GLINE a user.");
31 chanservaddcommand("unsuspenduser" , QCMD_OPER
, 1, csu_dounsuspenduser
,"Unsuspend a user.");
32 chanservaddcommand("spewdb" , QCMD_OPER
, 1, csu_dospewdb
,"Search for a user in the database.");
33 chanservaddcommand("spewpass" , QCMD_OPER
, 1, csu_dospewpass
,"Search for a password in the database.");
34 chanservaddcommand("spewemail" , QCMD_OPER
, 1, csu_dospewemail
,"Search for an e-mail in the database.");
35 chanservaddcommand("listflags" , QCMD_OPER
, 1, csu_dolistflags
,"List users with the specified user flags.");
36 chanservaddcommand("suspenduserlist", QCMD_HELPER
, 1, csu_dosuspenduserlist
,"Lists suspended/locked users.");
40 chanservremovecommand("userflags", csu_douserflags
);
41 chanservremovecommand("info", csu_doinfo
);
42 chanservremovecommand("whois", csu_dowhois
);
43 chanservremovecommand("usercomment", csu_dousercomment
);
44 chanservremovecommand("deluser", csu_dodeluser
);
45 chanservremovecommand("language", csu_dolanguage
);
46 chanservremovecommand("suspenduser", csu_dosuspenduser
);
47 chanservremovecommand("unsuspenduser", csu_dounsuspenduser
);
48 chanservremovecommand("spewdb", csu_dospewdb
);
49 chanservremovecommand("spewpass", csu_dospewpass
);
50 chanservremovecommand("spewemail", csu_dospewemail
);
51 chanservremovecommand("listflags", csu_dolistflags
);
52 chanservremovecommand("suspenduserlist", csu_dosuspenduserlist
);
55 int csu_douserflags(void *source
, int cargc
, char **cargv
) {
57 reguser
*rup
=getreguserfromnick(sender
), *target
;
59 flag_t flagmask
, changemask
;
66 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "userflags");
70 if (*cargv
[0]!='+' && *cargv
[0]!='-') {
72 /* If the first char isn't a "change" character, it must specify a target */
74 if (!(target
=findreguser(sender
,cargv
[0])))
77 if (target
!=rup
&& !cs_privcheck(QPRIV_VIEWUSERFLAGS
, sender
)) {
78 chanservstdmessage(sender
, QM_NOACCESS
, "userflags");
86 /* OK, now we have a changestring.. */
87 if (target
!=rup
&& !cs_privcheck(QPRIV_CHANGEUSERFLAGS
, sender
)) {
88 chanservstdmessage(sender
, QM_NOACCESS
, "userflags");
92 strcpy(flagbuf
,printflags(target
->flags
, ruflags
));
94 changemask
=QUFLAG_NOTICE
| QUFLAG_INFO
;
97 /* If you're changing yourself, you can give up the "status" flags and add/remove notice */
98 changemask
|=(target
->flags
& (QUFLAG_OPER
| QUFLAG_DEV
| QUFLAG_PROTECT
| QUFLAG_HELPER
| QUFLAG_ADMIN
));
101 /* Warning, policy ahead */
103 if (UHasOperPriv(rup
))
104 changemask
|= QUFLAG_GLINE
| QUFLAG_DELAYEDGLINE
| QUFLAG_RESTRICTED
| QUFLAG_PROTECT
;
106 if (UHasAdminPriv(rup
))
107 changemask
|= (QUFLAG_OPER
| QUFLAG_HELPER
);
110 changemask
=QUFLAG_ALL
;
112 setflags(&target
->flags
, changemask
, cargv
[arg
], ruflags
, REJECT_NONE
);
115 if (!UHasHelperPriv(target
)) {
116 target
->flags
&= ~QUFLAG_PROTECT
;
119 cs_log(sender
,"USERFLAGS #%s %s (%s -> %s)",target
->username
,cargv
[arg
],flagbuf
,printflags(target
->flags
, ruflags
));
120 csdb_updateuser(target
);
121 chanservstdmessage(sender
, QM_DONE
);
124 if (cs_privcheck(QPRIV_VIEWUSERFLAGS
, sender
))
127 flagmask
=QUFLAG_INFO
| QUFLAG_NOTICE
| QUFLAG_OPER
| QUFLAG_HELPER
| QUFLAG_DEV
| QUFLAG_ADMIN
;
129 chanservstdmessage(sender
, QM_CURUSERFLAGS
, target
->username
, printflags(target
->flags
& flagmask
, ruflags
));
134 int csu_doinfo(void *source
, int cargc
, char **cargv
) {
136 reguser
*rup
=getreguserfromnick(sender
);
140 char linebuf
[INFOLEN
+10];
144 if (cargc
==0 || *cargv
[0]!='#') {
145 /* Global info line */
147 /* Setting to either one word or "none" */
148 if (!ircd_strcmp(cargv
[0],"none")) {
155 } else if (cargc
>1) {
156 /* More than one word: we need to stick them back together */
157 snprintf(linebuf
,INFOLEN
,"%s %s",cargv
[0],cargv
[1]);
164 freesstring(rup
->info
);
166 rup
->info
=getsstring(newline
, INFOLEN
);
168 chanservstdmessage(sender
, QM_DONE
);
169 csdb_updateuser(rup
);
172 chanservstdmessage(sender
, QM_GLOBALINFO
, rup
->info
?rup
->info
->content
:"(none)");
174 /* Channel info line */
176 if (!(cip
=findchanindex(cargv
[0])) || !(rcp
=cip
->exts
[chanservext
]) ||
177 (CIsSuspended(rcp
) && !cs_privcheck(QPRIV_SUSPENDBYPASS
, sender
))) {
178 chanservstdmessage(sender
, QM_UNKNOWNCHAN
, cargv
[0]);
182 if ((!(rcup
=findreguseronchannel(rcp
, rup
)) || !CUHasVoicePriv(rcup
))) {
183 chanservstdmessage(sender
, QM_NOACCESSONCHAN
, cargv
[0], "info");
189 freesstring(rcup
->info
);
191 if (!ircd_strcmp(cargv
[1],"none"))
194 rcup
->info
=getsstring(cargv
[1],INFOLEN
);
196 csdb_updatechanuser(rcup
);
197 chanservstdmessage(sender
, QM_DONE
);
200 chanservstdmessage(sender
, QM_CHANNELINFO
, cip
->name
->content
,
201 rcup
->info
?rcup
->info
->content
:"(none)");
207 int csu_dowhois(void *source
, int cargc
, char **cargv
) {
209 reguser
*rup
=getreguserfromnick(sender
), *target
;
214 regchanuser
*rcup
, *rcup2
;
215 flag_t flagmask
, flags
;
218 if (!(rup
=getreguserfromnick(sender
)))
222 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "whois");
226 if (!(target
=findreguser(sender
, cargv
[0]))) {
229 if ((np
=getnickbynick(cargv
[0]))) {
230 activeuser
* aup
=getactiveuserfromnick(np
);
231 chanservsendmessage(sender
, "%s has attempted to auth %d time%s.", np
->nick
, aup
->authattempts
,
232 aup
->authattempts
==1?"":"s");
237 if (cargv
[0][0]=='#') {
238 chanservstdmessage(sender
, QM_WHOISHEADER_AUTH
, target
->username
);
240 chanservstdmessage(sender
, QM_WHOISHEADER_NICK
, cargv
[0], target
->username
);
243 if (rup
==target
|| cs_privcheck(QPRIV_VIEWFULLWHOIS
, sender
)) {
244 chanservstdmessage(sender
, QM_WHOIS_USERID
, target
->ID
);
247 if (cs_privcheck(QPRIV_VIEWUSERFLAGS
, sender
)) {
250 if (UIsAdmin(target
))
251 chanservstdmessage(sender
, QM_USERISADMIN
, target
->username
);
252 else if (UIsOper(target
))
253 chanservstdmessage(sender
, QM_USERISOPER
, target
->username
);
254 else if (UIsHelper(target
))
255 chanservstdmessage(sender
, QM_USERISHELPER
, target
->username
);
258 chanservstdmessage(sender
, QM_USERISDEV
, target
->username
);
264 flagmask
|=(QUFLAG_OPER
| QUFLAG_DEV
| QUFLAG_HELPER
|
265 QUFLAG_ADMIN
| QUFLAG_INFO
| QUFLAG_NOTICE
);
267 if (flagmask
& target
->flags
)
268 chanservstdmessage(sender
, QM_WHOIS_FLAGS
, printflags(flagmask
& target
->flags
, ruflags
));
270 if (!target
->nicks
) {
271 chanservstdmessage(sender
, QM_WHOIS_USERS
, "(none)");
273 for (nlp
=target
->nicks
; ;nlp
=nlp
->next
) {
274 if (nbpos
>0 && (!nlp
|| nbpos
+strlen(nlp
->np
->nick
) > 60)) {
275 chanservstdmessage(sender
, QM_WHOIS_USERS
, buf
);
282 nbpos
+=sprintf(buf
+nbpos
,"%s ",nlp
->np
->nick
);
286 if (target
->created
) {
287 tmp
=gmtime(&(target
->created
));
288 strftime(buf
,15,"%d/%m/%y %H:%M",tmp
);
290 chanservstdmessage(sender
, QM_WHOIS_CREATED
, buf
);
293 tmp
=gmtime(&(target
->lastauth
));
294 strftime(buf
,15,"%d/%m/%y %H:%M",tmp
);
296 chanservstdmessage(sender
, QM_WHOIS_LASTAUTH
, buf
);
298 if (target
->lastuserhost
&& (rup
==target
|| cs_privcheck(QPRIV_VIEWFULLWHOIS
, sender
))) {
299 chanservstdmessage(sender
, QM_WHOIS_USERLANG
, cslanguages
[target
->languageid
] ?
300 cslanguages
[target
->languageid
]->name
->content
: "(unknown)");
301 chanservstdmessage(sender
, QM_WHOIS_LASTUSERHOST
, target
->lastuserhost
->content
);
304 if (target
->email
&& (rup
==target
|| cs_privcheck(QPRIV_VIEWEMAIL
, sender
))) {
305 chanservstdmessage(sender
, QM_WHOIS_EMAIL
, target
->email
->content
);
307 tmp
=gmtime(&(target
->lastemailchange
));
308 strftime(buf
,15,"%d/%m/%y %H:%M",tmp
);
310 chanservstdmessage(sender
, QM_WHOIS_EMAILSET
, buf
);
314 chanservstdmessage(sender
, QM_WHOIS_INFO
, target
->info
->content
);
317 if (target
->comment
&& (cs_privcheck(QPRIV_VIEWCOMMENTS
, sender
))) {
318 chanservstdmessage(sender
, QM_WHOIS_COMMENT
, target
->comment
->content
);
321 for (rcup
=target
->knownon
;rcup
;rcup
=rcup
->nextbyuser
) {
322 if (!UHasHelperPriv(rup
)) {
323 if (!(rcup2
=findreguseronchannel(rcup
->chan
,rup
)))
326 if (!CUHasVoicePriv(rcup2
))
329 flagmask
= (QCUFLAG_OWNER
| QCUFLAG_MASTER
| QCUFLAG_OP
| QCUFLAG_VOICE
| QCUFLAG_AUTOVOICE
|
330 QCUFLAG_AUTOOP
| QCUFLAG_TOPIC
| QCUFLAG_SPAMCON
);
332 if (CUHasMasterPriv(rcup2
))
333 flagmask
|= (QCUFLAG_DENY
| QCUFLAG_QUIET
| QCUFLAG_BANNED
);
335 flagmask
=QCUFLAG_ALL
;
338 if (!(flags
=rcup
->flags
& flagmask
))
343 chanservstdmessage(sender
, QM_WHOIS_CHANHEADER
, target
->username
);
346 chanservsendmessage(sender
, " %-30s %s",rcup
->chan
->index
->name
->content
,printflags(flags
, rcuflags
));
349 chanservstdmessage(sender
, QM_ENDOFLIST
);
354 int csu_dodeluser(void *source
, int cargc
, char **cargv
) {
356 reguser
*rup
=getreguserfromnick(sender
), *target
;
362 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "deluser");
366 if (!(target
=findreguser(sender
, cargv
[0])))
369 cs_log(sender
,"DELUSER %s (%s)",target
->username
,cargc
>1?cargv
[1]:"");
370 cs_removeuser(target
);
372 chanservstdmessage(sender
, QM_DONE
);
377 int csu_dousercomment(void *source
, int cargc
, char **cargv
) {
379 reguser
*rup
=getreguserfromnick(sender
), *target
;
387 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "usercomment");
391 if (!(target
=findreguser(sender
, cargv
[0])))
395 if (!ircd_strcmp(cargv
[1],"none")) {
396 freesstring(target
->comment
);
397 target
->comment
=NULL
;
399 if (*cargv
[1]=='+') {
400 if (target
->comment
) {
401 strcpy(buf
,target
->comment
->content
);
402 bufpos
=target
->comment
->length
;
407 strncpy(buf
+bufpos
, cargv
[1]+1, 250-bufpos
);
409 strncpy(buf
, cargv
[1], 250);
412 freesstring(target
->comment
);
413 target
->comment
=getsstring(buf
,250);
415 csdb_updateuser(target
);
419 chanservstdmessage(sender
, QM_COMMENT
, target
->username
, target
->comment
->content
);
421 chanservstdmessage(sender
, QM_NOCOMMENT
, target
->username
);
426 int csu_dolanguage(void *source
, int cargc
, char **cargv
) {
428 reguser
*rup
=getreguserfromnick(sender
);
438 /* Display language */
440 chanservstdmessage(sender
, QM_YOURLANGUAGE
, cslanguages
[i
] ? cslanguages
[i
]->name
->content
: "Unknown");
442 /* Display available lanaguages */
443 chanservstdmessage(sender
, QM_LANGUAGELIST
);
445 for (i
=0;i
<MAXLANG
;i
++) {
446 if (cslanguages
[i
]) {
448 chanservsendmessage(sender
, "%s", buf
);
451 len
=sprintf(buf
+bufpos
, "%.14s (%.2s)",cslanguages
[i
]->name
->content
,cslanguages
[i
]->code
);
452 memset(buf
+bufpos
+len
,' ',20-len
);
459 chanservsendmessage(sender
, "%s", buf
);
461 chanservstdmessage(sender
, QM_ENDOFLIST
);
464 for (i
=0;i
<MAXLANG
;i
++) {
465 if (cslanguages
[i
] && !ircd_strcmp(cargv
[0],cslanguages
[i
]->code
)) {
468 csdb_updateuser(rup
);
470 chanservstdmessage(sender
, QM_DONE
);
471 chanservstdmessage(sender
, QM_YOURLANGUAGE
, cslanguages
[i
]->name
->content
);
477 chanservstdmessage(sender
, QM_UNKNOWNLANGUAGE
, cargv
[0]);
483 int csu_dosuspenduser(void *source
, int cargc
, char **cargv
) {
485 reguser
*rup
=getreguserfromnick(sender
);
492 int kill
=1, gline
=0, email
=0, password
=0, hitcount
=0;
503 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduser");
507 if (cargv
[0][0] == '-') {
509 if (!(victim
=strchr(flag
, ' '))) {
510 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduser");
514 if (!(dur_p
=strchr(victim
, ' '))) {
515 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduser");
519 if ((reason
=strchr(dur_p
, ' '))) {
521 if ((duration
=durationtolong(dur_p
))) {
522 if ((duration
< 86400) || (duration
> 2592000)) {
523 chanservstdmessage(sender
, QM_INVALIDDURATION
);
526 expires
=time(0)+duration
;
539 if (!ircd_strcmp(flag
, "-nokill")) {
542 else if (!ircd_strcmp(flag
, "-gline")) {
545 else if (!ircd_strcmp(flag
, "-instantgline")) {
548 else if (!ircd_strcmp(flag
, "-email")) {
551 else if (!ircd_strcmp(flag
, "-password")) {
555 chanservstdmessage(sender
, QM_INVALIDCHANLEVCHANGE
);
561 if (!(dur_p
=strchr(victim
, ' '))) {
562 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduser");
566 if ((reason
=strchr(dur_p
, ' '))) {
568 if ((duration
=durationtolong(dur_p
))) {
569 if ((duration
< 86400) || (duration
> 2592000)) {
570 chanservstdmessage(sender
, QM_INVALIDDURATION
);
573 expires
=time(0)+duration
;
588 tmp
=gmtime(&expires
);
589 strftime(buf
,15,"%d/%m/%y %H:%M",tmp
);
595 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
596 for (vrup
=regusernicktable
[i
]; vrup
; vrup
=vrup
->nextbyname
) {
597 if (!ircd_strcmp(vrup
->email
->content
, victim
)) {
598 if (UHasSuspension(vrup
))
601 if (UHasOperPriv(vrup
) && !UHasAdminPriv(rup
))
605 vrup
->flags
|=QUFLAG_SUSPENDED
;
606 vrup
->suspendby
=rup
->ID
;
607 vrup
->suspendexp
=expires
;
608 vrup
->suspendreason
=getsstring(reason
, strlen(reason
)+1);
610 while (vrup
->nicks
) {
611 if (!vrup
->nicks
->np
)
614 chanservstdmessage(sender
, QM_DISCONNECTINGUSER
, vrup
->nicks
->np
->nick
, vrup
->username
);
615 chanservkillstdmessage(vrup
->nicks
->np
, QM_SUSPENDKILL
);
617 csdb_updateuser(vrup
);
622 chanservwallmessage("%s (%s) bulk suspended <%s>, hit %d account/s (expires: %s)", sender
->nick
, rup
->username
, victim
, hitcount
, expires
?buf
:"never");
627 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
628 for (vrup
=regusernicktable
[i
]; vrup
; vrup
=vrup
->nextbyname
) {
629 if (!strcmp(vrup
->password
, victim
)) {
630 if (UHasSuspension(vrup
))
633 if (UHasOperPriv(vrup
) && !UHasAdminPriv(rup
))
637 vrup
->flags
|=QUFLAG_SUSPENDED
;
638 vrup
->suspendby
=rup
->ID
;
639 vrup
->suspendexp
=expires
;
640 vrup
->suspendreason
=getsstring(reason
, strlen(reason
)+1);
642 while (vrup
->nicks
) {
643 if (!vrup
->nicks
->np
)
646 chanservstdmessage(sender
, QM_DISCONNECTINGUSER
, vrup
->nicks
->np
->nick
, vrup
->username
);
647 chanservkillstdmessage(vrup
->nicks
->np
, QM_SUSPENDKILL
);
649 csdb_updateuser(vrup
);
654 chanservwallmessage("%s (%s) bulk suspended password \"%s\", hit %d account/s (expires: %s)", sender
->nick
, rup
->username
, victim
, hitcount
, expires
?buf
:"never");
657 if (!(vrup
=findreguser(sender
, victim
)))
660 if (!ircd_strcmp(vrup
->username
, rup
->username
)) {
661 chanservsendmessage(sender
, "You can't suspend yourself, silly.");
665 if (UHasSuspension(vrup
)) {
666 chanservstdmessage(sender
, QM_USERALREADYSUSPENDED
);
670 if (UHasOperPriv(vrup
) && !UHasAdminPriv(rup
)) {
671 snprintf(buf
, 199, "suspenduser on %s", vrup
->username
);
672 chanservstdmessage(sender
, QM_NOACCESS
, buf
);
673 chanservwallmessage("%s (%s) FAILED to suspend %s", sender
->nick
, rup
->username
, vrup
->username
);
678 vrup
->flags
|=QUFLAG_GLINE
;
680 vrup
->flags
|=QUFLAG_DELAYEDGLINE
;
682 vrup
->flags
|=QUFLAG_SUSPENDED
;
683 vrup
->suspendby
=rup
->ID
;
684 vrup
->suspendexp
=expires
;
685 vrup
->suspendreason
=getsstring(reason
, strlen(reason
)+1);
687 chanservwallmessage("%s (%s) %s %s (expires: %s)", sender
->nick
, rup
->username
, (gline
)?((gline
== 2)?"instantly glined":"delayed glined"):"suspended", vrup
->username
, expires
?buf
:"never");
689 dgwait
=(gline
==2)?0:rand()%900
;
690 chanservsendmessage(sender
, "Scheduling delayed GLINE for account %s in %d %s",
691 vrup
->username
, (dgwait
>60)?(dgwait
/60):dgwait
, (dgwait
>60)?"minutes":"seconds");
692 deleteschedule(NULL
, &chanservdgline
, (void*)vrup
);
693 scheduleoneshot(time(NULL
)+dgwait
, &chanservdgline
, (void*)vrup
);
696 while (vrup
->nicks
) {
697 if (!vrup
->nicks
->np
)
700 chanservstdmessage(sender
, QM_DISCONNECTINGUSER
, vrup
->nicks
->np
->nick
, vrup
->username
);
701 chanservkillstdmessage(vrup
->nicks
->np
, QM_SUSPENDKILL
);
706 csdb_updateuser(vrup
);
712 int csu_dounsuspenduser(void *source
, int cargc
, char **cargv
) {
714 reguser
*rup
=getreguserfromnick(sender
);
722 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "unsuspenduser");
726 if (cargv
[0][0] == '#') {
727 if (!(vrup
=findreguserbynick(&cargv
[0][1]))) {
728 chanservstdmessage(sender
, QM_UNKNOWNUSER
, &cargv
[0][1]);
735 if (!(np
=getnickbynick(cargv
[0]))) {
736 chanservstdmessage(sender
, QM_UNKNOWNUSER
, cargv
[0]);
740 if (!(vrup
=getreguserfromnick(np
)) && sender
) {
741 chanservstdmessage(sender
, QM_USERNOTAUTHED
, cargv
[0]);
746 if (!UHasSuspension(vrup
)) {
747 chanservstdmessage(sender
, QM_USERNOTSUSPENDED
, cargv
[0]);
751 if (UHasOperPriv(vrup
) && !UHasAdminPriv(rup
)) {
752 snprintf(action
, 99, "unsuspenduser on %s", vrup
->username
);
753 chanservstdmessage(sender
, QM_NOACCESS
, action
);
754 chanservwallmessage("%s (%s) FAILED to unsuspend %s", sender
->nick
, rup
->username
, vrup
->username
);
758 if (UIsDelayedGline(vrup
)) {
759 strcpy(action
, "removed delayed gline on");
761 else if (UIsGline(vrup
)) {
762 strcpy(action
, "removed instant gline on");
764 else if (UIsSuspended(vrup
)) {
765 strcpy(action
, "unsuspended");
767 else if (UIsNeedAuth(vrup
)) {
768 strcpy(action
, "enabled");
771 chanservsendmessage(sender
, "Unknown suspend type encountered.");
775 vrup
->flags
&=(~(QUFLAG_GLINE
|QUFLAG_DELAYEDGLINE
|QUFLAG_SUSPENDED
|QUFLAG_NEEDAUTH
));
778 freesstring(vrup
->suspendreason
);
779 vrup
->suspendreason
=0;
780 csdb_updateuser(vrup
);
782 chanservwallmessage("%s (%s) %s %s", sender
->nick
, rup
->username
, action
, vrup
->username
);
783 chanservstdmessage(sender
, QM_DONE
);
787 int csu_dospewdb(void *source
, int cargc
, char **cargv
) {
789 reguser
*rup
=getreguserfromnick(sender
);
792 unsigned int count
=0;
798 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "spewdb");
802 chanservstdmessage(sender
, QM_SPEWHEADER
);
803 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
804 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
805 if (!match(cargv
[0], dbrup
->username
)) {
806 chanservsendmessage(sender
, "%-15s %-10s %-30s %s", dbrup
->username
, UHasSuspension(dbrup
)?"yes":"no", dbrup
->email
?dbrup
->email
->content
:"none set", dbrup
->lastuserhost
?dbrup
->lastuserhost
->content
:"none");
809 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
815 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");
820 int csu_dospewpass(void *source
, int cargc
, char **cargv
) {
822 reguser
*rup
=getreguserfromnick(sender
);
825 unsigned int count
=0;
831 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "spewpass");
835 chanservstdmessage(sender
, QM_SPEWHEADER
);
836 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
837 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
838 if (!match(cargv
[0], dbrup
->password
)) {
839 chanservsendmessage(sender
, "%-15s %-10s %-30s %s", dbrup
->username
, UHasSuspension(dbrup
)?"yes":"no", dbrup
->email
?dbrup
->email
->content
:"none set", dbrup
->lastuserhost
?dbrup
->lastuserhost
->content
:"none");
842 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
848 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");
853 int csu_dospewemail(void *source
, int cargc
, char **cargv
) {
855 reguser
*rup
=getreguserfromnick(sender
);
858 unsigned int count
=0;
864 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "spewemail");
868 chanservstdmessage(sender
, QM_SPEWHEADER
);
869 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
870 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
873 if (!match(cargv
[0], dbrup
->email
->content
)) {
874 chanservsendmessage(sender
, "%-15s %-10s %-30s %s", dbrup
->username
, UHasSuspension(dbrup
)?"yes":"no", dbrup
->email
?dbrup
->email
->content
:"none set", dbrup
->lastuserhost
?dbrup
->lastuserhost
->content
:"none");
877 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
883 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");
888 int csu_dolistflags(void *source
, int cargc
, char **cargv
) {
890 reguser
*rup
=getreguserfromnick(sender
);
892 flag_t matchflags
= 0;
895 unsigned int count
=0;
902 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "listflags");
906 ch
=cargv
[0][0]=='+'?cargv
[0]+1:cargv
[0];
908 for (i
=0; ch
[i
]; i
++) {
909 for (j
= 0; ruflags
[j
].flagchar
; j
++) {
910 if (ruflags
[j
].flagchar
== ch
[i
]) {
911 matchflags
|=ruflags
[j
].flagbit
;
917 chanservstdmessage(sender
, QM_LISTFLAGSHEADER
);
918 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
919 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
920 if ((dbrup
->flags
& matchflags
) == matchflags
) {
921 chanservsendmessage(sender
, "%-15s %-17s %-10s %-30s %s", dbrup
->username
, printflags(dbrup
->flags
, ruflags
),
922 UHasSuspension(dbrup
)?"yes":"no", dbrup
->email
?dbrup
->email
->content
:"none set",
923 dbrup
->lastuserhost
?dbrup
->lastuserhost
->content
:"none");
926 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
932 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");
937 int csu_dosuspenduserlist(void *source
, int cargc
, char **cargv
) {
939 reguser
*rup
=getreguserfromnick(sender
);
943 unsigned int count
=0;
951 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduserlist");
955 vrup
=findreguserbynick(cargv
[0]);
957 chanservstdmessage(sender
, QM_SUSPENDUSERLISTHEADER
);
958 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
959 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
960 if (!UHasSuspension(dbrup
))
963 /*if (!ircd_strcmp(dbrup->username, cargv[0]) || (dbrup->suspendby == vrup->ID)) {*/
964 if (!match(cargv
[0], dbrup
->username
) || (vrup
&& (dbrup
->suspendby
== vrup
->ID
))) {
965 char suspendtype
[100];
968 if ((UIsGline(dbrup
) || UIsDelayedGline(dbrup
)) && !UHasOperPriv(rup
))
971 if (UIsDelayedGline(dbrup
))
972 strcpy(suspendtype
, "delayed gline");
973 else if (UIsGline(dbrup
))
974 strcpy(suspendtype
, "instant gline");
975 else if (UIsSuspended(dbrup
))
976 strcpy(suspendtype
, "suspended");
978 strcpy(suspendtype
, "not used");
980 if (vrup
&& (dbrup
->suspendby
== vrup
->ID
)) {
981 bywhom
=vrup
->username
;
984 reguser
* trup
=findreguserbyID(dbrup
->suspendby
);
986 bywhom
=trup
->username
;
989 if (dbrup
->suspendexp
) {
990 tmp
=gmtime(&(dbrup
->suspendexp
));
991 strftime(buf
,15,"%d/%m/%y %H:%M",tmp
);
995 chanservsendmessage(sender
, "%-15s %-13s %-15s %-15s %s", dbrup
->username
, suspendtype
, UHasOperPriv(rup
)?(bywhom
?bywhom
:"unknown"):"not shown", (dbrup
->suspendexp
)?((time(0) >= dbrup
->suspendexp
)?"next auth":buf
):"never", dbrup
->suspendreason
->content
);
997 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
1003 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");