]>
Commit | Line | Data |
---|---|---|
1dd6d55d | 1 | /* Automatically generated by refactor.pl. |
2 | * | |
3 | * | |
4 | * CMDNAME: whois | |
5 | * CMDLEVEL: QCMD_AUTHED | |
6 | * CMDARGS: 1 | |
7 | * CMDDESC: Displays information about a user. | |
8 | * CMDFUNC: csu_dowhois | |
9 | * CMDPROTO: int csu_dowhois(void *source, int cargc, char **cargv); | |
50cd26d6 | 10 | * CMDHELP: Usage: WHOIS <user> |
11 | * CMDHELP: Displays information about a user, where: | |
12 | * CMDHELP: user - user to request information for, either the nickname of an active user on | |
13 | * CMDHELP: the network or #accountname. | |
1dd6d55d | 14 | */ |
15 | ||
16 | #include "../chanserv.h" | |
17 | #include "../../lib/irc_string.h" | |
f305c646 | 18 | #include "../../lib/strlfunc.h" |
1dd6d55d | 19 | #include <stdio.h> |
20 | #include <string.h> | |
21 | ||
22 | int csu_dowhois(void *source, int cargc, char **cargv) { | |
23 | nick *sender=source; | |
24 | reguser *rup=getreguserfromnick(sender), *target; | |
25 | char buf[200]; | |
26 | char nbpos=0; | |
1dd6d55d | 27 | struct tm *tmp; |
28 | regchanuser *rcup, *rcup2; | |
29 | flag_t flagmask, flags; | |
30 | int doneheader=0; | |
23b85e10 | 31 | authname *anp; |
32 | nick *tnp; | |
1dd6d55d | 33 | |
34 | if (!(rup=getreguserfromnick(sender))) | |
35 | return CMD_ERROR; | |
36 | ||
37 | if (cargc<1) { | |
38 | chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "whois"); | |
39 | return CMD_ERROR; | |
40 | } | |
41 | ||
42 | if (!(target=findreguser(sender, cargv[0]))) { | |
23b85e10 | 43 | nick *np; |
1dd6d55d | 44 | |
8ae8bd45 | 45 | if (cs_privcheck(QPRIV_VIEWFULLWHOIS, sender) && (np=getnickbynick(cargv[0]))) { |
23b85e10 | 46 | activeuser *aup=getactiveuserfromnick(np); |
1dd6d55d | 47 | chanservsendmessage(sender, "%s has attempted to auth %d time%s.", np->nick, aup->authattempts, |
48 | aup->authattempts==1?"":"s"); | |
49 | } | |
50 | return CMD_ERROR; | |
51 | } | |
52 | ||
53 | if (cargv[0][0]=='#') { | |
54 | chanservstdmessage(sender, QM_WHOISHEADER_AUTH, target->username); | |
55 | } else { | |
56 | chanservstdmessage(sender, QM_WHOISHEADER_NICK, cargv[0], target->username); | |
57 | } | |
58 | ||
59 | if (rup==target || cs_privcheck(QPRIV_VIEWFULLWHOIS, sender)) { | |
60 | chanservstdmessage(sender, QM_WHOIS_USERID, target->ID); | |
61 | } | |
62 | ||
63 | if (cs_privcheck(QPRIV_VIEWUSERFLAGS, sender)) { | |
347686bd | 64 | flagmask=QUFLAG_ALL & ~(QUFLAG_SUSPENDED | QUFLAG_GLINE | QUFLAG_DELAYEDGLINE); |
65 | if (UIsDev(rup)) | |
66 | flagmask=QUFLAG_ALL; | |
f305c646 CP |
67 | |
68 | if (UHasSuspension(target)) { | |
79313d98 | 69 | char expiresbuf[100]; |
f305c646 CP |
70 | char *reason, *suspendtype, *whom; |
71 | ||
72 | if(UIsDelayedGline(target)) { | |
73 | suspendtype = "delayed gline"; | |
74 | } else if(UIsGline(target)) { | |
75 | suspendtype = "gline"; | |
76 | } else if(UIsSuspended(target)) { | |
77 | suspendtype = "suspended"; | |
78 | } else { | |
79 | suspendtype = "???"; | |
80 | } | |
81 | ||
82 | if(target->suspendexp) { | |
83 | if(time(NULL) >= target->suspendexp) { | |
84 | strlcpy(expiresbuf, "(next auth)", sizeof(expiresbuf)); | |
85 | } else { | |
79313d98 | 86 | strftime(expiresbuf, sizeof(expiresbuf), Q9_FORMAT_TIME, gmtime(&(target->suspendexp))); |
f305c646 CP |
87 | } |
88 | } else { | |
89 | strlcpy(expiresbuf, "(never)", sizeof(expiresbuf)); | |
90 | } | |
f305c646 | 91 | |
a49c6c1c | 92 | if(cs_privcheck(QPRIV_VIEWSUSPENDEDBY, sender)) { |
f305c646 CP |
93 | reguser *trup = findreguserbyID(target->suspendby); |
94 | if(trup) { | |
95 | whom = trup->username; | |
96 | } else { | |
97 | whom = "(unknown)"; | |
98 | } | |
99 | } else { | |
100 | whom = "(hidden)"; | |
101 | } | |
102 | ||
103 | if(target->suspendreason && target->suspendreason->content) { | |
104 | reason = target->suspendreason->content; | |
105 | } else { | |
106 | reason = "(none)"; | |
107 | } | |
108 | ||
109 | chanservstdmessage(sender, QM_USERSUSPENDEDTYPE, suspendtype); | |
110 | chanservstdmessage(sender, QM_USERSUSPENDEDBY, whom); | |
111 | chanservstdmessage(sender, QM_USERSUSPENDEDREASON, reason); | |
79313d98 | 112 | chanservstdmessage(sender, QM_USERSUSPENDEDAT, target->suspendtime); |
f305c646 CP |
113 | chanservstdmessage(sender, QM_USERSUSPENDEDEXPIRY, expiresbuf); |
114 | } | |
1dd6d55d | 115 | } else { |
347686bd | 116 | /* Incidentally none of the QM_USERIS* mesages take parameters. Just thought I'd mention it.. */ |
1dd6d55d | 117 | if (UIsAdmin(target)) |
118 | chanservstdmessage(sender, QM_USERISADMIN, target->username); | |
119 | else if (UIsOper(target)) | |
120 | chanservstdmessage(sender, QM_USERISOPER, target->username); | |
121 | else if (UIsHelper(target)) | |
122 | chanservstdmessage(sender, QM_USERISHELPER, target->username); | |
347686bd | 123 | else if (UIsStaff(target)) |
124 | chanservstdmessage(sender, QM_USERISSTAFF, target->username); | |
1dd6d55d | 125 | |
126 | if (UIsDev(target)) | |
127 | chanservstdmessage(sender, QM_USERISDEV, target->username); | |
128 | ||
129 | flagmask=0; | |
130 | } | |
131 | ||
132 | if (rup==target) | |
133 | flagmask|=(QUFLAG_OPER | QUFLAG_DEV | QUFLAG_HELPER | | |
347686bd | 134 | QUFLAG_ADMIN | QUFLAG_INFO | QUFLAG_NOTICE | QUFLAG_STAFF); |
1dd6d55d | 135 | |
136 | if (flagmask & target->flags) | |
43583524 | 137 | chanservstdmessage(sender, QM_WHOIS_FLAGS, printflagsornone(flagmask & target->flags, ruflags)); |
1dd6d55d | 138 | |
23b85e10 | 139 | if (!(anp=findauthname(target->ID)) || !anp->nicks) { |
1dd6d55d | 140 | chanservstdmessage(sender, QM_WHOIS_USERS, "(none)"); |
141 | } else { | |
23b85e10 | 142 | for (tnp=anp->nicks; ;tnp=tnp->nextbyauthname) { |
143 | if (nbpos>0 && (!tnp || nbpos+strlen(tnp->nick) > 60)) { | |
1dd6d55d | 144 | chanservstdmessage(sender, QM_WHOIS_USERS, buf); |
145 | nbpos=0; | |
146 | } | |
147 | ||
23b85e10 | 148 | if (!tnp) |
1dd6d55d | 149 | break; |
150 | ||
23b85e10 | 151 | nbpos+=sprintf(buf+nbpos,"%s ",tnp->nick); |
1dd6d55d | 152 | } |
153 | } | |
154 | ||
79313d98 CP |
155 | if (target->created) |
156 | chanservstdmessage(sender, QM_WHOIS_CREATED, target->created); | |
1dd6d55d | 157 | |
cf50e022 CP |
158 | if (target->lastauth == 0) { |
159 | snprintf(buf,sizeof(buf),"(never)"); | |
160 | } else { | |
161 | tmp=gmtime(&(target->lastauth)); | |
79313d98 | 162 | strftime(buf,sizeof(buf),Q9_FORMAT_TIME,tmp); |
cf50e022 | 163 | } |
1dd6d55d | 164 | chanservstdmessage(sender, QM_WHOIS_LASTAUTH, buf); |
165 | ||
166 | if (target->lastuserhost && (rup==target || cs_privcheck(QPRIV_VIEWFULLWHOIS, sender))) { | |
50cd26d6 | 167 | /* Commenting out language until we implement some - splidge |
1dd6d55d | 168 | chanservstdmessage(sender, QM_WHOIS_USERLANG, cslanguages[target->languageid] ? |
50cd26d6 | 169 | cslanguages[target->languageid]->name->content : "(unknown)"); */ |
1dd6d55d | 170 | chanservstdmessage(sender, QM_WHOIS_LASTUSERHOST, target->lastuserhost->content); |
171 | } | |
172 | ||
173 | if (target->email && (rup==target || cs_privcheck(QPRIV_VIEWEMAIL, sender))) { | |
174 | chanservstdmessage(sender, QM_WHOIS_EMAIL, target->email->content); | |
79313d98 | 175 | chanservstdmessage(sender, QM_WHOIS_EMAILSET, target->lastemailchange); |
1dd6d55d | 176 | } |
177 | ||
3a744b8f | 178 | if (target->info && *target->info->content) { |
1dd6d55d | 179 | chanservstdmessage(sender, QM_WHOIS_INFO, target->info->content); |
180 | } | |
181 | ||
182 | if (target->comment && (cs_privcheck(QPRIV_VIEWCOMMENTS, sender))) { | |
183 | chanservstdmessage(sender, QM_WHOIS_COMMENT, target->comment->content); | |
184 | } | |
185 | ||
186 | for (rcup=target->knownon;rcup;rcup=rcup->nextbyuser) { | |
a19424d6 | 187 | if (!UHasHelperPriv(rup) || (UHasOperPriv(target) && UHasHelperPriv(rup) && !UHasOperPriv(rup))) { |
1dd6d55d | 188 | if (!(rcup2=findreguseronchannel(rcup->chan,rup))) |
189 | continue; | |
190 | ||
50ec21f3 | 191 | if (!CUKnown(rcup2)) |
1dd6d55d | 192 | continue; |
193 | ||
194 | flagmask = (QCUFLAG_OWNER | QCUFLAG_MASTER | QCUFLAG_OP | QCUFLAG_VOICE | QCUFLAG_AUTOVOICE | | |
50ec21f3 | 195 | QCUFLAG_AUTOOP | QCUFLAG_TOPIC | QCUFLAG_KNOWN | QCUFLAG_PROTECT ); |
1dd6d55d | 196 | |
197 | if (CUHasMasterPriv(rcup2)) | |
50ec21f3 | 198 | flagmask |= QCUFLAGS_PUNISH; |
199 | ||
200 | if (rcup2==rcup) | |
201 | flagmask |= QCUFLAGS_PERSONAL; | |
1dd6d55d | 202 | } else { |
203 | flagmask=QCUFLAG_ALL; | |
204 | } | |
205 | ||
206 | if (!(flags=rcup->flags & flagmask)) | |
207 | continue; | |
208 | ||
209 | if (!doneheader) { | |
210 | doneheader=1; | |
211 | chanservstdmessage(sender, QM_WHOIS_CHANHEADER, target->username); | |
212 | } | |
213 | ||
214 | chanservsendmessage(sender, " %-30s %s",rcup->chan->index->name->content,printflags(flags, rcuflags)); | |
215 | } | |
216 | ||
0c393f78 | 217 | chanservstdmessage(sender, QM_ENDOFLIST); |
1dd6d55d | 218 | |
219 | return CMD_OK; | |
220 | } |