]>
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
);
491 int kill
=1, gline
=0, email
=0, password
=0, hitcount
=0;
502 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduser");
506 if (cargv
[0][0] == '-') {
508 if (!(victim
=strchr(flag
, ' '))) {
509 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduser");
513 if (!(dur_p
=strchr(victim
, ' '))) {
514 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduser");
518 if ((reason
=strchr(dur_p
, ' '))) {
520 if ((duration
=durationtolong(dur_p
))) {
521 if ((duration
< 86400) || (duration
> 2592000)) {
522 chanservstdmessage(sender
, QM_INVALIDDURATION
);
525 expires
=time(0)+duration
;
538 if (!ircd_strcmp(flag
, "-nokill")) {
541 else if (!ircd_strcmp(flag
, "-gline")) {
544 else if (!ircd_strcmp(flag
, "-instantgline")) {
547 else if (!ircd_strcmp(flag
, "-email")) {
550 else if (!ircd_strcmp(flag
, "-password")) {
554 chanservstdmessage(sender
, QM_INVALIDCHANLEVCHANGE
);
560 if (!(dur_p
=strchr(victim
, ' '))) {
561 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduser");
565 if ((reason
=strchr(dur_p
, ' '))) {
567 if ((duration
=durationtolong(dur_p
))) {
568 if ((duration
< 86400) || (duration
> 2592000)) {
569 chanservstdmessage(sender
, QM_INVALIDDURATION
);
572 expires
=time(0)+duration
;
587 tmp
=gmtime(&expires
);
588 strftime(buf
,15,"%d/%m/%y %H:%M",tmp
);
594 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
595 for (vrup
=regusernicktable
[i
]; vrup
; vrup
=vrup
->nextbyname
) {
596 if (!ircd_strcmp(vrup
->email
->content
, victim
)) {
597 if (UHasSuspension(vrup
))
600 if (UHasOperPriv(vrup
) && !UHasAdminPriv(rup
))
604 vrup
->flags
|=QUFLAG_SUSPENDED
;
605 vrup
->suspendby
=rup
->ID
;
606 vrup
->suspendexp
=expires
;
607 vrup
->suspendreason
=getsstring(reason
, strlen(reason
)+1);
609 while (vrup
->nicks
) {
610 if (!vrup
->nicks
->np
)
613 chanservstdmessage(sender
, QM_DISCONNECTINGUSER
, vrup
->nicks
->np
->nick
, vrup
->username
);
614 chanservkillstdmessage(vrup
->nicks
->np
, QM_SUSPENDKILL
);
616 csdb_updateuser(vrup
);
621 chanservwallmessage("%s (%s) bulk suspended <%s>, hit %d account/s (expires: %s)", sender
->nick
, rup
->username
, victim
, hitcount
, expires
?buf
:"never");
626 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
627 for (vrup
=regusernicktable
[i
]; vrup
; vrup
=vrup
->nextbyname
) {
628 if (!strcmp(vrup
->password
, victim
)) {
629 if (UHasSuspension(vrup
))
632 if (UHasOperPriv(vrup
) && !UHasAdminPriv(rup
))
636 vrup
->flags
|=QUFLAG_SUSPENDED
;
637 vrup
->suspendby
=rup
->ID
;
638 vrup
->suspendexp
=expires
;
639 vrup
->suspendreason
=getsstring(reason
, strlen(reason
)+1);
641 while (vrup
->nicks
) {
642 if (!vrup
->nicks
->np
)
645 chanservstdmessage(sender
, QM_DISCONNECTINGUSER
, vrup
->nicks
->np
->nick
, vrup
->username
);
646 chanservkillstdmessage(vrup
->nicks
->np
, QM_SUSPENDKILL
);
648 csdb_updateuser(vrup
);
653 chanservwallmessage("%s (%s) bulk suspended password \"%s\", hit %d account/s (expires: %s)", sender
->nick
, rup
->username
, victim
, hitcount
, expires
?buf
:"never");
656 if (!(vrup
=findreguser(sender
, victim
)))
659 if (!ircd_strcmp(vrup
->username
, rup
->username
)) {
660 chanservsendmessage(sender
, "You can't suspend yourself, silly.");
664 if (UHasSuspension(vrup
)) {
665 chanservstdmessage(sender
, QM_USERALREADYSUSPENDED
);
669 if (UHasOperPriv(vrup
) && !UHasAdminPriv(rup
)) {
670 snprintf(buf
, 199, "suspenduser on %s", vrup
->username
);
671 chanservstdmessage(sender
, QM_NOACCESS
, buf
);
672 chanservwallmessage("%s (%s) FAILED to suspend %s", sender
->nick
, rup
->username
, vrup
->username
);
677 vrup
->flags
|=QUFLAG_GLINE
;
679 vrup
->flags
|=QUFLAG_DELAYEDGLINE
;
681 vrup
->flags
|=QUFLAG_SUSPENDED
;
682 vrup
->suspendby
=rup
->ID
;
683 vrup
->suspendexp
=expires
;
684 vrup
->suspendreason
=getsstring(reason
, strlen(reason
)+1);
686 chanservwallmessage("%s (%s) %s %s (expires: %s)", sender
->nick
, rup
->username
, (gline
)?((gline
== 2)?"instantly glined":"delayed glined"):"suspended", vrup
->username
, expires
?buf
:"never");
688 dgwait
=(gline
==2)?0:rand()%900
;
689 chanservsendmessage(sender
, "Scheduling delayed GLINE for account %s in %d %s",
690 vrup
->username
, (dgwait
>60)?(dgwait
/60):dgwait
, (dgwait
>60)?"minutes":"seconds");
691 deleteschedule(NULL
, &chanservdgline
, (void*)vrup
);
692 scheduleoneshot(time(NULL
)+dgwait
, &chanservdgline
, (void*)vrup
);
695 while (vrup
->nicks
) {
696 if (!vrup
->nicks
->np
)
699 chanservstdmessage(sender
, QM_DISCONNECTINGUSER
, vrup
->nicks
->np
->nick
, vrup
->username
);
700 chanservkillstdmessage(vrup
->nicks
->np
, QM_SUSPENDKILL
);
705 csdb_updateuser(vrup
);
711 int csu_dounsuspenduser(void *source
, int cargc
, char **cargv
) {
713 reguser
*rup
=getreguserfromnick(sender
);
721 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "unsuspenduser");
725 if (cargv
[0][0] == '#') {
726 if (!(vrup
=findreguserbynick(&cargv
[0][1]))) {
727 chanservstdmessage(sender
, QM_UNKNOWNUSER
, &cargv
[0][1]);
734 if (!(np
=getnickbynick(cargv
[0]))) {
735 chanservstdmessage(sender
, QM_UNKNOWNUSER
, cargv
[0]);
739 if (!(vrup
=getreguserfromnick(np
)) && sender
) {
740 chanservstdmessage(sender
, QM_USERNOTAUTHED
, cargv
[0]);
745 if (!UHasSuspension(vrup
)) {
746 chanservstdmessage(sender
, QM_USERNOTSUSPENDED
, cargv
[0]);
750 if (UHasOperPriv(vrup
) && !UHasAdminPriv(rup
)) {
751 snprintf(action
, 99, "unsuspenduser on %s", vrup
->username
);
752 chanservstdmessage(sender
, QM_NOACCESS
, action
);
753 chanservwallmessage("%s (%s) FAILED to unsuspend %s", sender
->nick
, rup
->username
, vrup
->username
);
757 if (UIsDelayedGline(vrup
)) {
758 strcpy(action
, "removed delayed gline on");
760 else if (UIsGline(vrup
)) {
761 strcpy(action
, "removed instant gline on");
763 else if (UIsSuspended(vrup
)) {
764 strcpy(action
, "unsuspended");
766 else if (UIsNeedAuth(vrup
)) {
767 strcpy(action
, "enabled");
770 chanservsendmessage(sender
, "Unknown suspend type encountered.");
774 vrup
->flags
&=(~(QUFLAG_GLINE
|QUFLAG_DELAYEDGLINE
|QUFLAG_SUSPENDED
|QUFLAG_NEEDAUTH
));
777 freesstring(vrup
->suspendreason
);
778 vrup
->suspendreason
=0;
779 csdb_updateuser(vrup
);
781 chanservwallmessage("%s (%s) %s %s", sender
->nick
, rup
->username
, action
, vrup
->username
);
782 chanservstdmessage(sender
, QM_DONE
);
786 int csu_dospewdb(void *source
, int cargc
, char **cargv
) {
788 reguser
*rup
=getreguserfromnick(sender
);
791 unsigned int count
=0;
797 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "spewdb");
801 chanservstdmessage(sender
, QM_SPEWHEADER
);
802 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
803 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
804 if (!match(cargv
[0], dbrup
->username
)) {
805 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");
808 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
814 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");
819 int csu_dospewpass(void *source
, int cargc
, char **cargv
) {
821 reguser
*rup
=getreguserfromnick(sender
);
824 unsigned int count
=0;
830 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "spewpass");
834 chanservstdmessage(sender
, QM_SPEWHEADER
);
835 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
836 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
837 if (!match(cargv
[0], dbrup
->password
)) {
838 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");
841 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
847 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");
852 int csu_dospewemail(void *source
, int cargc
, char **cargv
) {
854 reguser
*rup
=getreguserfromnick(sender
);
857 unsigned int count
=0;
863 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "spewemail");
867 chanservstdmessage(sender
, QM_SPEWHEADER
);
868 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
869 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
872 if (!match(cargv
[0], dbrup
->email
->content
)) {
873 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");
876 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
882 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");
887 int csu_dolistflags(void *source
, int cargc
, char **cargv
) {
889 reguser
*rup
=getreguserfromnick(sender
);
891 flag_t matchflags
= 0;
894 unsigned int count
=0;
900 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "listflags");
904 ch
=cargv
[0][0]=='+'?cargv
[0]+1:cargv
[0];
906 for (i
=0; ch
[i
]; i
++) {
907 for (j
= 0; ruflags
[j
].flagchar
; j
++) {
908 if (ruflags
[j
].flagchar
== ch
[i
]) {
909 matchflags
|=ruflags
[j
].flagbit
;
915 chanservstdmessage(sender
, QM_LISTFLAGSHEADER
);
916 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
917 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
918 if ((dbrup
->flags
& matchflags
) == matchflags
) {
919 chanservsendmessage(sender
, "%-15s %-17s %-10s %-30s %s", dbrup
->username
, printflags(dbrup
->flags
, ruflags
),
920 UHasSuspension(dbrup
)?"yes":"no", dbrup
->email
?dbrup
->email
->content
:"none set",
921 dbrup
->lastuserhost
?dbrup
->lastuserhost
->content
:"none");
924 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
930 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");
935 int csu_dosuspenduserlist(void *source
, int cargc
, char **cargv
) {
937 reguser
*rup
=getreguserfromnick(sender
);
941 unsigned int count
=0;
949 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "suspenduserlist");
953 vrup
=findreguserbynick(cargv
[0]);
955 chanservstdmessage(sender
, QM_SUSPENDUSERLISTHEADER
);
956 for (i
=0;i
<REGUSERHASHSIZE
;i
++) {
957 for (dbrup
=regusernicktable
[i
]; dbrup
; dbrup
=dbrup
->nextbyname
) {
958 if (!UHasSuspension(dbrup
))
961 /*if (!ircd_strcmp(dbrup->username, cargv[0]) || (dbrup->suspendby == vrup->ID)) {*/
962 if (!match(cargv
[0], dbrup
->username
) || (vrup
&& (dbrup
->suspendby
== vrup
->ID
))) {
963 char suspendtype
[100];
966 if ((UIsGline(dbrup
) || UIsDelayedGline(dbrup
)) && !UHasOperPriv(rup
))
969 if (UIsDelayedGline(dbrup
))
970 strcpy(suspendtype
, "delayed gline");
971 else if (UIsGline(dbrup
))
972 strcpy(suspendtype
, "instant gline");
973 else if (UIsSuspended(dbrup
))
974 strcpy(suspendtype
, "suspended");
976 strcpy(suspendtype
, "not used");
978 if (vrup
&& (dbrup
->suspendby
== vrup
->ID
)) {
979 bywhom
=vrup
->username
;
982 reguser
* trup
=findreguserbyID(dbrup
->suspendby
);
984 bywhom
=trup
->username
;
987 if (dbrup
->suspendexp
) {
988 tmp
=gmtime(&(dbrup
->suspendexp
));
989 strftime(buf
,15,"%d/%m/%y %H:%M",tmp
);
993 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
);
995 chanservstdmessage(sender
, QM_TOOMANYRESULTS
, 2000, "users");
1001 chanservstdmessage(sender
, QM_RESULTCOUNT
, count
, "user", (count
==1)?"":"s");