]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Fix multiple (useless) linefeeds on the end of ADDLINE in burst
[user/henk/code/inspircd.git] / src / users.cpp
index 2e0e0d3cce99e2f4f0f0fcde2a85d94c279fcbf5..aeb9852377fc865bee0042d86e7d05b9e69ac252 100644 (file)
@@ -73,6 +73,9 @@ std::string User::ProcessNoticeMasks(const char *sm)
                                                output += *c;
                                        }
                                }
+                               else
+                                       this->WriteServ("501 %s %c :is unknown snomask char to me", this->nick, *c);
+
                                oldadding = adding;
                        break;
                }
@@ -88,13 +91,13 @@ void User::StartDNSLookup()
        try
        {
                bool cached;
-               const char* ip = this->GetIPString();
+               const char* sip = this->GetIPString();
 
                /* Special case for 4in6 (Have i mentioned i HATE 4in6?) */
-               if (!strncmp(ip, "0::ffff:", 8))
-                       res_reverse = new UserResolver(this->ServerInstance, this, ip + 8, DNS_QUERY_PTR4, cached);
+               if (!strncmp(sip, "0::ffff:", 8))
+                       res_reverse = new UserResolver(this->ServerInstance, this, sip + 8, DNS_QUERY_PTR4, cached);
                else
-                       res_reverse = new UserResolver(this->ServerInstance, this, ip, this->GetProtocolFamily() == AF_INET ? DNS_QUERY_PTR4 : DNS_QUERY_PTR6, cached);
+                       res_reverse = new UserResolver(this->ServerInstance, this, sip, this->GetProtocolFamily() == AF_INET ? DNS_QUERY_PTR4 : DNS_QUERY_PTR6, cached);
 
                this->ServerInstance->AddResolver(res_reverse, cached);
        }
@@ -177,11 +180,11 @@ User::User(InspIRCd* Instance, const std::string &uid) : ServerInstance(Instance
        *password = *nick = *ident = *host = *dhost = *fullname = *awaymsg = *oper = *uuid = 0;
        server = (char*)Instance->FindServerNamePtr(Instance->Config->ServerName);
        reset_due = ServerInstance->Time();
-       age = ServerInstance->Time(true);
+       age = ServerInstance->Time();
        Penalty = 0;
        lines_in = lastping = signon = idle_lastmsg = nping = registered = 0;
        ChannelCount = timeout = bytes_in = bytes_out = cmds_in = cmds_out = 0;
-       OverPenalty = ExemptFromPenalty = quitting = exempt = haspassed = dns_done = false;
+       quietquit = OverPenalty = ExemptFromPenalty = quitting = exempt = haspassed = dns_done = false;
        fd = -1;
        recvq.clear();
        sendq.clear();
@@ -405,21 +408,21 @@ InvitedList* User::GetInviteList()
        return &invites;
 }
 
-void User::InviteTo(const irc::string &channel, time_t timeout)
+void User::InviteTo(const irc::string &channel, time_t invtimeout)
 {
        time_t now = time(NULL);
-       if (timeout != 0 && now > timeout) return; /* Don't add invites that are expired from the get-go. */
+       if (invtimeout != 0 && now > invtimeout) return; /* Don't add invites that are expired from the get-go. */
        for (InvitedList::iterator i = invites.begin(); i != invites.end(); ++i)
        {
                if (channel == i->first)
                {
-                       if (i->second != 0 && timeout > i->second)
+                       if (i->second != 0 && invtimeout > i->second)
                        {
-                               i->second = timeout;
+                               i->second = invtimeout;
                        }
                }
        }
-       invites.push_back(std::make_pair(channel, timeout));
+       invites.push_back(std::make_pair(channel, invtimeout));
 }
 
 void User::RemoveInvite(const irc::string &channel)
@@ -692,7 +695,7 @@ void User::Oper(const std::string &opertype, const std::string &opername)
 
        catch (...)
        {
-               ServerInstance->Log(DEBUG,"Exception in User::Oper()");
+               ServerInstance->Logs->Log("OPER", DEBUG,"Exception in User::Oper()");
        }
 }
 
@@ -700,11 +703,27 @@ void User::UnOper()
 {
        if (IS_OPER(this))
        {
-               // unset their oper type (what IS_OPER checks), and remove +o
+               /* Remove all oper only modes from the user when the deoper - Bug #466*/
+               std::string moderemove("-");
+
+               for (unsigned char letter = 'A'; letter <= 'z'; letter++)
+               {
+                       if (letter != 'o')
+                       {
+                               ModeHandler* mh = ServerInstance->Modes->FindMode(letter, MODETYPE_USER);
+                               if (mh && mh->NeedsOper())
+                                       moderemove += letter;
+                       }
+               }
+
+               const char* parameters[] = { this->nick, moderemove.c_str() };
+               ServerInstance->Parser->CallHandler("MODE", parameters, 2, this);
+
+               /* unset their oper type (what IS_OPER checks), and remove +o */
                *this->oper = 0;
                this->modes[UM_OPERATOR] = 0;
                        
-               // remove the user from the oper list. Will remove multiple entries as a safeguard against bug #404
+               /* remove the user from the oper list. Will remove multiple entries as a safeguard against bug #404 */
                ServerInstance->Users->all_opers.remove(this);
 
                if (AllowedOperCommands)
@@ -721,7 +740,12 @@ void User::QuitUser(InspIRCd* Instance, User *user, const std::string &quitreaso
        user->Write("ERROR :Closing link (%s@%s) [%s]", user->ident, user->host, *operreason ? operreason : quitreason.c_str());
        user->quietquit = false;
        user->quitmsg = quitreason;
-       user->operquitmsg = operreason;
+
+       if (!*operreason)
+               user->operquitmsg = quitreason;
+       else
+               user->operquitmsg = operreason;
+
        Instance->GlobalCulls.AddItem(user);
 }
 
@@ -926,7 +950,7 @@ bool User::ForceNickChange(const char* newnick)
        return false;
 }
 
-void User::SetSockAddr(int protocol_family, const char* ip, int port)
+void User::SetSockAddr(int protocol_family, const char* sip, int port)
 {
        this->cachedip = "";
 
@@ -938,7 +962,7 @@ void User::SetSockAddr(int protocol_family, const char* ip, int port)
                        sockaddr_in6* sin = new sockaddr_in6;
                        sin->sin6_family = AF_INET6;
                        sin->sin6_port = port;
-                       inet_pton(AF_INET6, ip, &sin->sin6_addr);
+                       inet_pton(AF_INET6, sip, &sin->sin6_addr);
                        this->ip = (sockaddr*)sin;
                }
                break;
@@ -948,12 +972,12 @@ void User::SetSockAddr(int protocol_family, const char* ip, int port)
                        sockaddr_in* sin = new sockaddr_in;
                        sin->sin_family = AF_INET;
                        sin->sin_port = port;
-                       inet_pton(AF_INET, ip, &sin->sin_addr);
+                       inet_pton(AF_INET, sip, &sin->sin_addr);
                        this->ip = (sockaddr*)sin;
                }
                break;
                default:
-                       ServerInstance->Log(DEBUG,"Uh oh, I dont know protocol %d to be set on '%s'!", protocol_family, this->nick);
+                       ServerInstance->Logs->Log("USERS",DEBUG,"Uh oh, I dont know protocol %d to be set on '%s'!", protocol_family, this->nick);
                break;
        }
 }
@@ -1060,12 +1084,12 @@ void User::Write(std::string text)
 
        try
        {
-               ServerInstance->Logs->Log("USERIO", DEBUG,"C[%d] O %s", this->GetFd(), text.c_str());
+               ServerInstance->Logs->Log("USEROUTPUT", DEBUG,"C[%d] O %s", this->GetFd(), text.c_str());
                text.append("\r\n");
        }
        catch (...)
        {
-               ServerInstance->Log(DEBUG,"Exception in User::Write() std::string::append");
+               ServerInstance->Logs->Log("USEROUTPUT", DEBUG,"Exception in User::Write() std::string::append");
                return;
        }
 
@@ -1080,7 +1104,7 @@ void User::Write(std::string text)
                }
                catch (CoreException& modexcept)
                {
-                       ServerInstance->Log(DEBUG, "%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason());
+                       ServerInstance->Logs->Log("USEROUTPUT", DEBUG, "%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason());
                }
        }
        else
@@ -1380,25 +1404,25 @@ bool User::ChangeName(const char* gecos)
        return true;
 }
 
-bool User::ChangeDisplayedHost(const char* host)
+bool User::ChangeDisplayedHost(const char* shost)
 {
-       if (!strcmp(host, this->dhost))
+       if (!strcmp(shost, this->dhost))
                return true;
 
        if (IS_LOCAL(this))
        {
                int MOD_RESULT = 0;
-               FOREACH_RESULT(I_OnChangeLocalUserHost,OnChangeLocalUserHost(this,host));
+               FOREACH_RESULT(I_OnChangeLocalUserHost,OnChangeLocalUserHost(this,shost));
                if (MOD_RESULT)
                        return false;
-               FOREACH_MOD(I_OnChangeHost,OnChangeHost(this,host));
+               FOREACH_MOD(I_OnChangeHost,OnChangeHost(this,shost));
        }
 
        if (this->ServerInstance->Config->CycleHosts)
                this->WriteCommonExcept("QUIT :Changing hosts");
 
        /* Fix by Om: User::dhost is 65 long, this was truncating some long hosts */
-       strlcpy(this->dhost,host,64);
+       strlcpy(this->dhost,shost,64);
 
        this->InvalidateCache();
 
@@ -1445,7 +1469,7 @@ bool User::ChangeIdent(const char* newident)
        return true;
 }
 
-void User::SendAll(const char* command, char* text, ...)
+void User::SendAll(const char* command, const char* text, ...)
 {
        char textbuffer[MAXBUF];
        char formatbuffer[MAXBUF];
@@ -1585,7 +1609,7 @@ ConnectClass* User::SetClass(const std::string &explicit_name)
                /* deny change if change will take class over the limit */
                if (found->limit && (found->RefCount + 1 >= found->limit))
                {
-                       ServerInstance->Log(DEBUG, "OOPS: Connect class limit (%u) hit, denying", found->limit);
+                       ServerInstance->Logs->Log("USERS", DEBUG, "OOPS: Connect class limit (%u) hit, denying", found->limit);
                        return this->MyClass;
                }
 
@@ -1595,12 +1619,12 @@ ConnectClass* User::SetClass(const std::string &explicit_name)
                        if (found == this->MyClass) // no point changing this shit :P
                                return this->MyClass;
                        this->MyClass->RefCount--;
-                       ServerInstance->Log(DEBUG, "Untying user from connect class -- refcount: %u", this->MyClass->RefCount);
+                       ServerInstance->Logs->Log("USERS", DEBUG, "Untying user from connect class -- refcount: %u", this->MyClass->RefCount);
                }
 
                this->MyClass = found;
                this->MyClass->RefCount++;
-               ServerInstance->Log(DEBUG, "User tied to new class -- connect refcount now: %u", this->MyClass->RefCount);
+               ServerInstance->Logs->Log("USERS", DEBUG, "User tied to new class -- connect refcount now: %u", this->MyClass->RefCount);
        }
 
        return this->MyClass;
@@ -1633,7 +1657,7 @@ void User::PurgeEmptyChannels()
                        }
                        catch (...)
                        {
-                               ServerInstance->Log(DEBUG,"Exception in User::PurgeEmptyChannels to_delete.push_back()");
+                               ServerInstance->Logs->Log("USERS", DEBUG,"Exception in User::PurgeEmptyChannels to_delete.push_back()");
                        }
                }
        }
@@ -1711,7 +1735,7 @@ void User::HandleEvent(EventType et, int errornum)
        }
        catch (...)
        {
-               ServerInstance->Log(DEBUG,"Exception in User::HandleEvent intercepted");
+               ServerInstance->Logs->Log("USERS", DEBUG,"Exception in User::HandleEvent intercepted");
        }
 
        /* If the user has raised an error whilst being processed, quit them now we're safe to */