]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/coremods/core_who.cpp
Use an oper priv instead of a config flag for overriding nonicks.
[user/henk/code/inspircd.git] / src / coremods / core_who.cpp
index 739c675a9d43010b7c46530f452617ce06f0d2c6..29feefc2ba8c095173968ba004c99b9138b11f22 100644 (file)
@@ -38,14 +38,18 @@ class CommandWho : public Command
        bool opt_time;
        ChanModeReference secretmode;
        ChanModeReference privatemode;
+       UserModeReference hidechansmode;
        UserModeReference invisiblemode;
 
-       Membership* get_first_visible_channel(User* u)
+       Membership* get_first_visible_channel(User* source, User* u)
        {
                for (User::ChanList::iterator i = u->chans.begin(); i != u->chans.end(); ++i)
                {
                        Membership* memb = *i;
-                       if (!memb->chan->IsModeSet(secretmode))
+
+                       /* XXX move the +I check into m_hidechans */
+                       bool has_modes = memb->chan->IsModeSet(secretmode) || memb->chan->IsModeSet(privatemode) || u->IsModeSet(hidechansmode);
+                       if (source == u || !has_modes || memb->chan->HasUser(source))
                                return memb;
                }
                return NULL;
@@ -58,6 +62,7 @@ class CommandWho : public Command
                : Command(parent, "WHO", 1)
                , secretmode(parent, "secret")
                , privatemode(parent, "private")
+               , hidechansmode(parent, "hidechans")
                , invisiblemode(parent, "invisible")
        {
                syntax = "<server>|<nickname>|<channel>|<realname>|<host>|0 [ohurmMiaplf]";
@@ -69,7 +74,7 @@ class CommandWho : public Command
         * @param user The user issuing the command
         * @return A value from CmdResult to indicate command success or failure.
         */
-       CmdResult Handle(const std::vector<std::string>& parameters, User *user);
+       CmdResult Handle(const std::vector<std::string>& parameters, User* user) CXX11_OVERRIDE;
        bool whomatch(User* cuser, User* user, const char* matchtext);
 };
 
@@ -123,7 +128,7 @@ bool CommandWho::whomatch(User* cuser, User* user, const char* matchtext)
                else if (opt_realname)
                        match = InspIRCd::Match(user->fullname, matchtext);
                else if (opt_showrealhost)
-                       match = InspIRCd::Match(user->host, matchtext, ascii_case_insensitive_map);
+                       match = InspIRCd::Match(user->GetRealHost(), matchtext, ascii_case_insensitive_map);
                else if (opt_ident)
                        match = InspIRCd::Match(user->ident, matchtext, ascii_case_insensitive_map);
                else if (opt_port)
@@ -141,10 +146,10 @@ bool CommandWho::whomatch(User* cuser, User* user, const char* matchtext)
                        match = InspIRCd::Match(user->awaymsg, matchtext);
                else if (opt_time)
                {
-                       long seconds = InspIRCd::Duration(matchtext);
+                       time_t seconds = ServerInstance->Time() - InspIRCd::Duration(matchtext);
 
                        // Okay, so time matching, we want all users connected `seconds' ago
-                       if (user->signon >= ServerInstance->Time() - seconds)
+                       if (user->signon >= seconds)
                                match = true;
                }
 
@@ -156,13 +161,13 @@ bool CommandWho::whomatch(User* cuser, User* user, const char* matchtext)
                 * -- w00t
                 */
                if (!match)
-                       match = InspIRCd::Match(user->dhost, matchtext, ascii_case_insensitive_map);
+                       match = InspIRCd::Match(user->GetDisplayedHost(), matchtext, ascii_case_insensitive_map);
 
                if (!match)
                        match = InspIRCd::Match(user->nick, matchtext);
 
-               /* Don't allow server name matches if HideWhoisServer is enabled, unless the command user has the priv */
-               if (!match && (ServerInstance->Config->HideWhoisServer.empty() || cuser->HasPrivPermission("users/auspex")))
+               /* Don't allow server name matches if HideServer is enabled, unless the command user has the priv */
+               if (!match && (ServerInstance->Config->HideServer.empty() || cuser->HasPrivPermission("users/auspex")))
                        match = InspIRCd::Match(user->server->GetName(), matchtext);
 
                return match;
@@ -189,13 +194,13 @@ bool CommandWho::CanView(Channel* chan, User* user)
 void CommandWho::SendWhoLine(User* user, const std::vector<std::string>& parms, Membership* memb, User* u, std::vector<Numeric::Numeric>& whoresults)
 {
        if (!memb)
-               memb = get_first_visible_channel(u);
+               memb = get_first_visible_channel(user, u);
 
        Numeric::Numeric wholine(RPL_WHOREPLY);
        wholine.push(memb ? memb->chan->name : "*").push(u->ident);
-       wholine.push(opt_showrealhost ? u->host : u->dhost);
-       if (!ServerInstance->Config->HideWhoisServer.empty() && !user->HasPrivPermission("servers/auspex"))
-               wholine.push(ServerInstance->Config->HideWhoisServer);
+       wholine.push(u->GetHost(opt_showrealhost));
+       if (!ServerInstance->Config->HideServer.empty() && !user->HasPrivPermission("servers/auspex"))
+               wholine.push(ServerInstance->Config->HideServer);
        else
                wholine.push(u->server->GetName());
 
@@ -300,11 +305,11 @@ CmdResult CommandWho::Handle (const std::vector<std::string>& parameters, User *
                                        opt_away = true;
                                        break;
                                case 'l':
-                                       if (user->HasPrivPermission("users/auspex") || ServerInstance->Config->HideWhoisServer.empty())
+                                       if (user->HasPrivPermission("users/auspex") || ServerInstance->Config->HideServer.empty())
                                                opt_local = true;
                                        break;
                                case 'f':
-                                       if (user->HasPrivPermission("users/auspex") || ServerInstance->Config->HideWhoisServer.empty())
+                                       if (user->HasPrivPermission("users/auspex") || ServerInstance->Config->HideServer.empty())
                                                opt_far = true;
                                        break;
                                case 't':