summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/channels.cpp42
-rw-r--r--src/cmd_oper.cpp120
2 files changed, 74 insertions, 88 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index 5918a4568..3f2eca3f5 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -589,21 +589,21 @@ void server_kick_channel(userrec* user, chanrec* Ptr, char* reason, bool trigger
}
}
-void kick_channel(userrec *src,userrec *user, chanrec *chan, char* reason)
+void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
{
- if ((!src) || (!user) || (!chan) || (!reason))
+ if ((!src) || (!user) || (!Ptr) || (!reason))
{
log(DEFAULT,"*** BUG *** kick_channel was given an invalid parameter");
return;
}
- log(DEBUG,"kick_channel: removing: %s %s %s",user->nick,chan->name,src->nick);
+ log(DEBUG,"kick_channel: removing: %s %s %s",user->nick,Ptr->name,src->nick);
if (IS_LOCAL(src))
{
- if (!chan->HasUser(user))
+ if (!Ptr->HasUser(user))
{
- WriteServ(src->fd,"441 %s %s %s :They are not on that channel",src->nick, user->nick, chan->name);
+ WriteServ(src->fd,"441 %s %s %s :They are not on that channel",src->nick, user->nick, Ptr->name);
return;
}
int MOD_RESULT = 0;
@@ -611,28 +611,28 @@ void kick_channel(userrec *src,userrec *user, chanrec *chan, char* reason)
if (!is_uline(src->server))
{
MOD_RESULT = 0;
- FOREACH_RESULT(I_OnUserPreKick,OnUserPreKick(src,user,chan,reason));
+ FOREACH_RESULT(I_OnUserPreKick,OnUserPreKick(src,user,Ptr,reason));
if (MOD_RESULT == 1)
return;
}
/* Set to -1 by OnUserPreKick if explicit allow was set */
if (MOD_RESULT != -1)
{
- FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(src,user,chan,AC_KICK));
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(src,user,Ptr,AC_KICK));
if ((MOD_RESULT == ACR_DENY) && (!is_uline(src->server)))
return;
if ((MOD_RESULT == ACR_DEFAULT) || (!is_uline(src->server)))
{
- if ((cstatus(src,chan) < STATUS_HOP) || (cstatus(src,chan) < cstatus(user,chan)))
+ if ((cstatus(src,Ptr) < STATUS_HOP) || (cstatus(src,Ptr) < cstatus(user,Ptr)))
{
- if (cstatus(src,chan) == STATUS_HOP)
+ if (cstatus(src,Ptr) == STATUS_HOP)
{
- WriteServ(src->fd,"482 %s %s :You must be a channel operator",src->nick, chan->name);
+ WriteServ(src->fd,"482 %s %s :You must be a channel operator",src->nick, Ptr->name);
}
else
{
- WriteServ(src->fd,"482 %s %s :You must be at least a half-operator",src->nick, chan->name);
+ WriteServ(src->fd,"482 %s %s :You must be at least a half-operator",src->nick, Ptr->name);
}
return;
@@ -641,34 +641,34 @@ void kick_channel(userrec *src,userrec *user, chanrec *chan, char* reason)
}
}
- FOREACH_MOD(I_OnUserKick,OnUserKick(src,user,chan,reason));
+ FOREACH_MOD(I_OnUserKick,OnUserKick(src,user,Ptr,reason));
for (std::vector<ucrec*>::const_iterator i = user->chans.begin(); i != user->chans.end(); i++)
{
/* zap it from the channel list of the user */
- if ((((ucrec*)(*i))->channel) && (((ucrec*)(*i))->channel == chan))
+ if ((((ucrec*)(*i))->channel) && (((ucrec*)(*i))->channel == Ptr))
{
- WriteChannel(chan,src,"KICK %s %s :%s",chan->name, user->nick, reason);
+ WriteChannel(Ptr,src,"KICK %s %s :%s",Ptr->name, user->nick, reason);
((ucrec*)(*i))->uc_modes = 0;
((ucrec*)(*i))->channel = NULL;
- log(DEBUG,"del_channel: unlinked: %s %s",user->nick,chan->name);
+ log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
break;
}
}
- if (!chan->DelUser(user))
+ if (!Ptr->DelUser(user))
/* if there are no users left on the channel */
{
- chan_hash::iterator iter = chanlist.find(chan->name);
+ chan_hash::iterator iter = chanlist.find(Ptr->name);
- log(DEBUG,"del_channel: destroying channel: %s",chan->name);
+ log(DEBUG,"del_channel: destroying channel: %s",Ptr->name);
/* kill the record */
if (iter != chanlist.end())
{
- log(DEBUG,"del_channel: destroyed: %s",chan->name);
- FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(chan));
- delete chan;
+ log(DEBUG,"del_channel: destroyed: %s",Ptr->name);
+ FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(Ptr));
+ delete Ptr;
chanlist.erase(iter);
}
}
diff --git a/src/cmd_oper.cpp b/src/cmd_oper.cpp
index 2e9a0b457..0c0026121 100644
--- a/src/cmd_oper.cpp
+++ b/src/cmd_oper.cpp
@@ -85,6 +85,8 @@ void cmd_oper::Handle (char **parameters, int pcnt, userrec *user)
char HostName[MAXBUF];
char TheHost[MAXBUF];
int j;
+ bool found = false;
+ bool fail2 = false;
snprintf(TheHost,MAXBUF,"%s@%s",user->ident,user->host);
@@ -94,82 +96,66 @@ void cmd_oper::Handle (char **parameters, int pcnt, userrec *user)
Config->ConfValue("oper","password",i,Password,&Config->config_f);
Config->ConfValue("oper","type",i,OperType,&Config->config_f);
Config->ConfValue("oper","host",i,HostName,&Config->config_f);
-
- if (!strcmp(LoginName, parameters[0]))
+ if ((!strcmp(LoginName,parameters[0])) && (!operstrcmp(Password,parameters[1])) && (OneOfMatches(TheHost,HostName)))
{
- /* login name matches */
- if (!operstrcmp(Password, parameters[1]))
+ fail2 = true;
+ for (j =0; j < Config->ConfValueEnum("type",&Config->config_f); j++)
{
- /* password matches */
- if (OneOfMatches(TheHost, HostName))
+ Config->ConfValue("type","name",j,TypeName,&Config->config_f);
+
+ if (!strcmp(TypeName,OperType))
{
- for (j =0; j < Config->ConfValueEnum("type",&Config->config_f); j++)
+ /* found this oper's opertype */
+ Config->ConfValue("type","host",j,HostName,&Config->config_f);
+ if (*HostName)
+ ChangeDisplayedHost(user,HostName);
+ if (!isnick(TypeName))
{
- Config->ConfValue("type","name",j,TypeName,&Config->config_f);
-
- if (!strcmp(TypeName,OperType))
- {
- /* found this oper's opertype */
- Config->ConfValue("type","host",j,HostName,&Config->config_f);
- if (*HostName)
- ChangeDisplayedHost(user,HostName);
- if (!isnick(TypeName))
- {
- WriteServ(user->fd,"491 %s :Invalid oper type (oper types must follow the same syntax as nicknames)",user->nick);
- WriteOpers("*** CONFIGURATION ERROR! Oper type invalid for OperType '%s'",OperType);
- log(DEFAULT,"OPER: Failed oper attempt by %s!%s@%s: credentials valid, but oper type erroneous.",user->nick,user->ident,user->host);
- return;
- }
-
- /* correct oper credentials */
- WriteOpers("*** %s (%s@%s) is now an IRC operator of type %s",user->nick,user->ident,user->host,OperType);
- WriteServ(user->fd,"381 %s :You are now an IRC operator of type %s",user->nick,OperType);
-
- if (!strchr(user->modes,'o'))
- {
- strcat(user->modes,"o");
- WriteServ(user->fd,"MODE %s :+o",user->nick);
- FOREACH_MOD(I_OnOper,OnOper(user,OperType));
- log(DEFAULT,"OPER: %s!%s@%s opered as type: %s",user->nick,user->ident,user->host,OperType);
- AddOper(user);
- FOREACH_MOD(I_OnPostOper,OnPostOper(user,OperType));
- }
-
- strlcpy(user->oper,TypeName,NICKMAX-1);
- return;
- }
+ WriteServ(user->fd,"491 %s :Invalid oper type (oper types must follow the same syntax as nicknames)",user->nick);
+ WriteOpers("*** CONFIGURATION ERROR! Oper type invalid for OperType '%s'",OperType);
+ log(DEFAULT,"OPER: Failed oper attempt by %s!%s@%s: credentials valid, but oper type erroneous.",user->nick,user->ident,user->host);
+ return;
}
-
- /* if we get to here, we have NOT found their opertype. */
- WriteServ(user->fd,"491 %s :Your oper block does not have a valid opertype associated with it",user->nick);
- WriteOpers("*** CONFIGURATION ERROR! Oper block mismatch for OperType %s",OperType);
- log(DEFAULT,"OPER: Failed oper attempt by %s!%s@%s: credentials valid, but oper type nonexistent.",user->nick,user->ident,user->host);
- return;
- }
- else
- {
- /* no host matches */
- WriteServ(user->fd, "491 %s :Invalid Credentials", user->nick);
- WriteOpers("*** WARNING! Failed oper attempt by %s!%s@%s (incorrect hostname)!", user->nick, user->ident, user->host);
- log(DEFAULT, "OPER: Failed oper attempt by %s!%s@%s: host did not match.", user->nick, user->ident, user->host);
- return;
+ strlcpy(user->oper,TypeName,NICKMAX-1);
+ found = true;
+ fail2 = false;
+ break;
}
}
- else
- {
- /* password WRONG */
- WriteServ(user->fd, "491 %s :Invalid Credentials", user->nick);
- WriteOpers("*** WARNING! Failed oper attempt by %s!%s@%s (incorrect password)!", user->nick, user->ident, user->host);
- log(DEFAULT, "OPER: Failed oper attempt by %s!%s@%s: password did not match.", user->nick, user->ident, user->host);
- return;
- }
+ }
+ if (found)
+ break;
+ }
+ if (found)
+ {
+ /* correct oper credentials */
+ WriteOpers("*** %s (%s@%s) is now an IRC operator of type %s",user->nick,user->ident,user->host,OperType);
+ WriteServ(user->fd,"381 %s :You are now an IRC operator of type %s",user->nick,OperType);
+ if (!strchr(user->modes,'o'))
+ {
+ strcat(user->modes,"o");
+ WriteServ(user->fd,"MODE %s :+o",user->nick);
+ FOREACH_MOD(I_OnOper,OnOper(user,OperType));
+ log(DEFAULT,"OPER: %s!%s@%s opered as type: %s",user->nick,user->ident,user->host,OperType);
+ AddOper(user);
+ FOREACH_MOD(I_OnPostOper,OnPostOper(user,OperType));
+ }
+ }
+ else
+ {
+ if (!fail2)
+ {
+ WriteServ(user->fd,"491 %s :Invalid oper credentials",user->nick);
+ WriteOpers("*** WARNING! Failed oper attempt by %s!%s@%s!",user->nick,user->ident,user->host);
+ log(DEFAULT,"OPER: Failed oper attempt by %s!%s@%s: user, host or password did not match.",user->nick,user->ident,user->host);
+ }
+ else
+ {
+ WriteServ(user->fd,"491 %s :Your oper block does not have a valid opertype associated with it",user->nick);
+ WriteOpers("*** CONFIGURATION ERROR! Oper block mismatch for OperType %s",OperType);
+ log(DEFAULT,"OPER: Failed oper attempt by %s!%s@%s: credentials valid, but oper type nonexistent.",user->nick,user->ident,user->host);
}
}
-
- /* if we get here, invalid oper login */
- WriteServ(user->fd, "491 %s :Invalid Credentials", user->nick);
- WriteOpers("*** WARNING! Failed oper attempt by %s!%s@%s (incorrect oper (%s))!", user->nick, user->ident, user->host, parameters[0]);
- log(DEFAULT, "OPER: Failed oper attempt by %s!%s@%s: incorrect oper (%s)", user->nick, user->ident, user->host, parameters[0]);
return;
}