diff options
-rw-r--r-- | include/users.h | 50 | ||||
-rw-r--r-- | src/commands/cmd_pass.cpp | 10 | ||||
-rw-r--r-- | src/users.cpp | 16 |
3 files changed, 34 insertions, 42 deletions
diff --git a/include/users.h b/include/users.h index fbeba1bb9..ed672450e 100644 --- a/include/users.h +++ b/include/users.h @@ -291,16 +291,6 @@ class CoreExport User : public StreamSocket */ int cmds_out; - /** True if user has authenticated, false if otherwise - */ - bool haspassed; - - /** Used by User to indicate the registration status of the connection - * It is a bitfield of the REG_NICK, REG_USER and REG_ALL bits to indicate - * the connection state. - */ - char registered; - /** Time the connection was last pinged */ time_t lastping; @@ -400,28 +390,43 @@ class CoreExport User : public StreamSocket */ std::string oper; - /** True when DNS lookups are completed. - * The UserResolver classes res_forward and res_reverse will - * set this value once they complete. - */ - bool dns_done; - /** Password specified by the user when they registered. * This is stored even if the <connect> block doesnt need a password, so that * modules may check it. */ std::string password; + /** This value contains how far into the penalty threshold the user is. Once its over + * the penalty threshold then commands are held and processed on-timer. + */ + int Penalty; + + /** Used by User to indicate the registration status of the connection + * It is a bitfield of the REG_NICK, REG_USER and REG_ALL bits to indicate + * the connection state. + */ + unsigned int registered:3; + + /** True when DNS lookups are completed. + * The UserResolver classes res_forward and res_reverse will + * set this value once they complete. + */ + unsigned int dns_done:1; + /** Whether or not to send an snotice about this user's quitting */ - bool quietquit; + unsigned int quietquit:1; /** If this is set to true, then all socket operations for the user * are dropped into the bit-bucket. * This value is set by QuitUser, and is not needed seperately from that call. * Please note that setting this value alone will NOT cause the user to quit. */ - bool quitting; + unsigned int quitting:1; + + /** This is true if the user matched an exception (E:Line). It is used to save time on ban checks. + */ + unsigned int exempt:1; /** Server address and port that this user is connected to. * If unknown, address family is AF_UNKNOWN @@ -458,15 +463,6 @@ class CoreExport User : public StreamSocket */ const char *GetCIDRMask(int range); - /** This is true if the user matched an exception (E:Line). It is used to save time on ban checks. - */ - bool exempt; - - /** This value contains how far into the penalty threshold the user is. Once its over - * the penalty threshold then commands are held and processed on-timer. - */ - int Penalty; - /** Default constructor * @throw CoreException if the UID allocated to the user already exists * @param Instance Creator instance diff --git a/src/commands/cmd_pass.cpp b/src/commands/cmd_pass.cpp index 6219118ee..21b5b2759 100644 --- a/src/commands/cmd_pass.cpp +++ b/src/commands/cmd_pass.cpp @@ -36,19 +36,13 @@ class CommandPass : public Command CmdResult CommandPass::Handle (const std::vector<std::string>& parameters, User *user) { - // Check to make sure they havnt registered -- Fix by FCS + // Check to make sure they haven't registered -- Fix by FCS if (user->registered == REG_ALL) { user->WriteNumeric(ERR_ALREADYREGISTERED, "%s :You may not reregister",user->nick.c_str()); return CMD_FAILURE; } - ConnectClass* a = user->GetClass(); - if (!a) - return CMD_FAILURE; - - user->password.assign(parameters[0], 0, 63); - if (!ServerInstance->PassCompare(user, a->pass.c_str(), parameters[0].c_str(), a->hash.c_str())) - user->haspassed = true; + user->password = parameters[0]; return CMD_SUCCESS; } diff --git a/src/users.cpp b/src/users.cpp index 324edbfdb..657225069 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -228,17 +228,16 @@ User::User(const std::string &uid) Penalty = 0; lastping = signon = idle_lastmsg = nping = registered = 0; bytes_in = bytes_out = cmds_in = cmds_out = 0; - quietquit = quitting = exempt = haspassed = dns_done = false; + quietquit = quitting = exempt = dns_done = false; fd = -1; server_sa.sa.sa_family = AF_UNSPEC; client_sa.sa.sa_family = AF_UNSPEC; - MyClass = NULL; AllowedPrivs = AllowedOperCommands = NULL; if (uid.empty()) - uuid.assign(ServerInstance->GetUID(), 0, UUID_LENGTH - 1); + uuid = ServerInstance->GetUID(); else - uuid.assign(uid, 0, UUID_LENGTH - 1); + uuid = uid; ServerInstance->Logs->Log("USERS", DEBUG,"New UUID for user: %s (%s)", uuid.c_str(), uid.empty() ? "allocated new" : "used remote"); @@ -846,10 +845,13 @@ void User::FullConnect() /* Check the password, if one is required by the user's connect class. * This CANNOT be in CheckClass(), because that is called prior to PASS as well! */ - if (this->MyClass && !this->MyClass->GetPass().empty() && !this->haspassed) + if (MyClass && !MyClass->pass.empty()) { - ServerInstance->Users->QuitUser(this, "Invalid password"); - return; + if (ServerInstance->PassCompare(this, MyClass->pass.c_str(), password.c_str(), MyClass->hash.c_str())) + { + ServerInstance->Users->QuitUser(this, "Invalid password"); + return; + } } if (this->CheckLines()) |