summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/commands/cmd_who.h1
-rw-r--r--src/cmd_who.cpp15
2 files changed, 15 insertions, 1 deletions
diff --git a/include/commands/cmd_who.h b/include/commands/cmd_who.h
index 8b5bbe89e..299b70cdd 100644
--- a/include/commands/cmd_who.h
+++ b/include/commands/cmd_who.h
@@ -26,6 +26,7 @@
*/
class cmd_who : public command_t
{
+ bool CanView(chanrec* chan, userrec* user);
public:
cmd_who (InspIRCd* Instance) : command_t(Instance,"WHO",0,1) { syntax = "<server>|<nickname>|<channel>|<realname>|<host>|0 [ohur]"; }
CmdResult Handle(const char** parameters, int pcnt, userrec *user);
diff --git a/src/cmd_who.cpp b/src/cmd_who.cpp
index 81145a91c..508956c44 100644
--- a/src/cmd_who.cpp
+++ b/src/cmd_who.cpp
@@ -82,6 +82,19 @@ extern "C" command_t* init_command(InspIRCd* Instance)
return new cmd_who(Instance);
}
+bool cmd_who::CanView(chanrec* chan, userrec* user)
+{
+ /* Execute items in fastest-to-execute first order */
+ if (*user->oper)
+ return true;
+ else if (!chan->IsModeSet('s') && !chan->IsModeSet('p'))
+ return true;
+ else if (chan->HasUser(user))
+ return true;
+
+ return false;
+}
+
CmdResult cmd_who::Handle (const char** parameters, int pcnt, userrec *user)
{
/*
@@ -145,7 +158,7 @@ CmdResult cmd_who::Handle (const char** parameters, int pcnt, userrec *user)
/* who on a channel? */
ch = ServerInstance->FindChan(matchtext);
- if (ch)
+ if ((ch) && (CanView(ch,user)))
{
/* who on a channel. */
CUList *cu = ch->GetUsers();