summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mode.h20
-rw-r--r--include/modes/cmode_o.h13
-rw-r--r--src/mode.cpp110
-rw-r--r--src/modes/cmode_o.cpp104
4 files changed, 156 insertions, 91 deletions
diff --git a/include/mode.h b/include/mode.h
index e32e7532a..40055ab4c 100644
--- a/include/mode.h
+++ b/include/mode.h
@@ -228,21 +228,23 @@ class ModeParser
* we have 256 lists of them.
*/
std::vector<ModeWatcher*> modewatchers[256];
-
- char* GiveOps(userrec *user,char *dest,chanrec *chan,int status);
- char* GiveHops(userrec *user,char *dest,chanrec *chan,int status);
+
+ /*char* GiveHops(userrec *user,char *dest,chanrec *chan,int status);
char* GiveVoice(userrec *user,char *dest,chanrec *chan,int status);
- char* TakeOps(userrec *user,char *dest,chanrec *chan,int status);
char* TakeHops(userrec *user,char *dest,chanrec *chan,int status);
- char* TakeVoice(userrec *user,char *dest,chanrec *chan,int status);
- userrec* SanityChecks(userrec *user,char *dest,chanrec *chan,int status);
- char* Grant(userrec *d,chanrec *chan,int MASK);
- char* Revoke(userrec *d,chanrec *chan,int MASK);
+ char* TakeVoice(userrec *user,char *dest,chanrec *chan,int status);*/
+
public:
+
ModeParser();
+
+ static userrec* SanityChecks(userrec *user,const char *dest,chanrec *chan,int status);
+ static const char* Grant(userrec *d,chanrec *chan,int MASK);
+ static const char* Revoke(userrec *d,chanrec *chan,int MASK);
+ static void CleanMask(std::string &mask);
+
bool AddMode(ModeHandler* mh, unsigned const char modeletter);
void Process(char **parameters, int pcnt, userrec *user, bool servermode);
- static void CleanMask(std::string &mask);
};
class cmd_mode : public command_t
diff --git a/include/modes/cmode_o.h b/include/modes/cmode_o.h
new file mode 100644
index 000000000..cf223b97f
--- /dev/null
+++ b/include/modes/cmode_o.h
@@ -0,0 +1,13 @@
+#include "mode.h"
+#include "channels.h"
+
+class ModeChannelOp : public ModeHandler
+{
+ private:
+ public:
+ ModeChannelOp();
+ ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding);
+ std::string AddOp(userrec *user,const char *dest,chanrec *chan,int status);
+ std::string DelOp(userrec *user,const char *dest,chanrec *chan,int status);
+};
+
diff --git a/src/mode.cpp b/src/mode.cpp
index e11103fee..1a5cbc186 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -132,7 +132,7 @@ void ModeWatcher::AfterMode(userrec* source, userrec* dest, chanrec* channel, co
{
}
-userrec* ModeParser::SanityChecks(userrec *user,char *dest,chanrec *chan,int status)
+userrec* ModeParser::SanityChecks(userrec *user,const char *dest,chanrec *chan,int status)
{
userrec *d;
if ((!user) || (!dest) || (!chan) || (!*dest))
@@ -148,101 +148,75 @@ userrec* ModeParser::SanityChecks(userrec *user,char *dest,chanrec *chan,int sta
return d;
}
-char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK)
+const char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK)
{
if (!chan)
- return NULL;
+ return "";
for (std::vector<ucrec*>::const_iterator i = d->chans.begin(); i != d->chans.end(); i++)
{
- if (((ucrec*)(*i))->channel == chan)
+ ucrec* n = (ucrec*)(*i);
+ if (n->channel == chan)
{
- if (((ucrec*)(*i))->uc_modes & MASK)
+ if (n->uc_modes & MASK)
{
- return NULL;
+ return "";
}
- ((ucrec*)(*i))->uc_modes = ((ucrec*)(*i))->uc_modes | MASK;
+ n->uc_modes = ((ucrec*)(*i))->uc_modes | MASK;
switch (MASK)
{
case UCMODE_OP:
- ((ucrec*)(*i))->channel->AddOppedUser(d);
+ n->channel->AddOppedUser(d);
break;
case UCMODE_HOP:
- ((ucrec*)(*i))->channel->AddHalfoppedUser(d);
+ n->channel->AddHalfoppedUser(d);
break;
case UCMODE_VOICE:
- ((ucrec*)(*i))->channel->AddVoicedUser(d);
+ n->channel->AddVoicedUser(d);
break;
}
- log(DEBUG,"grant: %s %s",((ucrec*)(*i))->channel->name,d->nick);
+ log(DEBUG,"grant: %s %s",n->channel->name,d->nick);
return d->nick;
}
}
- return NULL;
+ return "";
}
-char* ModeParser::Revoke(userrec *d,chanrec *chan,int MASK)
+const char* ModeParser::Revoke(userrec *d,chanrec *chan,int MASK)
{
if (!chan)
- return NULL;
+ return "";
for (std::vector<ucrec*>::const_iterator i = d->chans.begin(); i != d->chans.end(); i++)
{
- if (((ucrec*)(*i))->channel == chan)
+ ucrec* n = (ucrec*)(*i);
+ if (n->channel == chan)
{
- if ((((ucrec*)(*i))->uc_modes & MASK) == 0)
+ if ((n->uc_modes & MASK) == 0)
{
- return NULL;
+ return "";
}
- ((ucrec*)(*i))->uc_modes ^= MASK;
+ n->uc_modes ^= MASK;
switch (MASK)
{
case UCMODE_OP:
- ((ucrec*)(*i))->channel->DelOppedUser(d);
+ n->channel->DelOppedUser(d);
break;
case UCMODE_HOP:
- ((ucrec*)(*i))->channel->DelHalfoppedUser(d);
+ n->channel->DelHalfoppedUser(d);
break;
case UCMODE_VOICE:
- ((ucrec*)(*i))->channel->DelVoicedUser(d);
+ n->channel->DelVoicedUser(d);
break;
}
- log(DEBUG,"revoke: %s %s",((ucrec*)(*i))->channel->name,d->nick);
+ log(DEBUG,"revoke: %s %s",n->channel->name,d->nick);
return d->nick;
}
}
- return NULL;
-}
-
-char* ModeParser::GiveOps(userrec *user,char *dest,chanrec *chan,int status)
-{
- userrec *d = this->SanityChecks(user,dest,chan,status);
-
- if (d)
- {
- if (IS_LOCAL(user))
- {
- int MOD_RESULT = 0;
- FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_OP));
-
- if (MOD_RESULT == ACR_DENY)
- return NULL;
- if (MOD_RESULT == ACR_DEFAULT)
- {
- if ((status < STATUS_OP) && (!is_uline(user->server)))
- {
- WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
- return NULL;
- }
- }
- }
-
- return this->Grant(d,chan,UCMODE_OP);
- }
- return NULL;
+ return "";
}
-char* ModeParser::GiveHops(userrec *user,char *dest,chanrec *chan,int status)
+/*char* ModeParser::GiveHops(userrec *user,char *dest,chanrec *chan,int status)
{
userrec *d = this->SanityChecks(user,dest,chan,status);
@@ -298,34 +272,6 @@ char* ModeParser::GiveVoice(userrec *user,char *dest,chanrec *chan,int status)
return NULL;
}
-char* ModeParser::TakeOps(userrec *user,char *dest,chanrec *chan,int status)
-{
- userrec *d = this->SanityChecks(user,dest,chan,status);
-
- if (d)
- {
- if (IS_LOCAL(user))
- {
- int MOD_RESULT = 0;
- FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEOP));
-
- if (MOD_RESULT == ACR_DENY)
- return NULL;
- if (MOD_RESULT == ACR_DEFAULT)
- {
- if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
- {
- WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
- return NULL;
- }
- }
- }
-
- return this->Revoke(d,chan,UCMODE_OP);
- }
- return NULL;
-}
-
char* ModeParser::TakeHops(userrec *user,char *dest,chanrec *chan,int status)
{
userrec *d = this->SanityChecks(user,dest,chan,status);
@@ -341,7 +287,7 @@ char* ModeParser::TakeHops(userrec *user,char *dest,chanrec *chan,int status)
return NULL;
if (MOD_RESULT == ACR_DEFAULT)
{
- /* Tweak by Brain suggested by w00t, allow a halfop to dehalfop themselves */
+ // Tweak by Brain suggested by w00t, allow a halfop to dehalfop themselves
if ((user != d) && ((status < STATUS_OP) && (!is_uline(user->server))))
{
WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
@@ -381,7 +327,7 @@ char* ModeParser::TakeVoice(userrec *user,char *dest,chanrec *chan,int status)
return this->Revoke(d,chan,UCMODE_VOICE);
}
return NULL;
-}
+}*/
void ModeParser::Process(char **parameters, int pcnt, userrec *user, bool servermode)
{
diff --git a/src/modes/cmode_o.cpp b/src/modes/cmode_o.cpp
new file mode 100644
index 000000000..dfa3a1a10
--- /dev/null
+++ b/src/modes/cmode_o.cpp
@@ -0,0 +1,104 @@
+#include <string>
+#include <vector>
+#include "inspircd_config.h"
+#include "configreader.h"
+#include "hash_map.h"
+#include "inspircd.h"
+#include "mode.h"
+#include "channels.h"
+#include "users.h"
+#include "helperfuncs.h"
+#include "message.h"
+#include "commands.h"
+#include "modules.h"
+#include "inspstring.h"
+#include "hashcomp.h"
+#include "modes/cmode_o.h"
+
+extern InspIRCd* ServerInstance;
+extern ServerConfig* Config;
+extern std::vector<Module*> modules;
+extern std::vector<ircd_module*> factory;
+extern int MODCOUNT;
+extern time_t TIME;
+
+ModeChannelOp::ModeChannelOp() : ModeHandler('o', 1, 1, true, MODETYPE_CHANNEL, false)
+{
+}
+
+ModeAction ModeChannelOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding)
+{
+ int status = cstatus(source, channel);
+
+ /* Call the correct method depending on wether we're adding or removing the mode */
+ if (adding)
+ {
+ parameter = this->AddOp(source, parameter.c_str(), channel, status);
+ }
+ else
+ {
+ parameter = this->DelOp(source, parameter.c_str(), channel, status);
+ }
+ /* If the method above 'ate' the parameter by reducing it to an empty string, then
+ * it won't matter wether we return ALLOW or DENY here, as an empty string overrides
+ * the return value and is always MODEACTION_DENY if the mode is supposed to have
+ * a parameter.
+ */
+ return MODEACTION_ALLOW;
+}
+
+std::string ModeChannelOp::AddOp(userrec *user,const char* dest,chanrec *chan,int status)
+{
+ userrec *d = ModeParser::SanityChecks(user,dest,chan,status);
+
+ if (d)
+ {
+ if (IS_LOCAL(user))
+ {
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_OP));
+
+ if (MOD_RESULT == ACR_DENY)
+ return "";
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ if ((status < STATUS_OP) && (!is_uline(user->server)))
+ {
+ WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
+ return "";
+ }
+ }
+ }
+
+ return ModeParser::Grant(d,chan,UCMODE_OP);
+ }
+ return "";
+}
+
+std::string ModeChannelOp::DelOp(userrec *user,const char *dest,chanrec *chan,int status)
+{
+ userrec *d = ModeParser::SanityChecks(user,dest,chan,status);
+
+ if (d)
+ {
+ if (IS_LOCAL(user))
+ {
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEOP));
+
+ if (MOD_RESULT == ACR_DENY)
+ return "";
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ {
+ WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
+ return "";
+ }
+ }
+ }
+
+ return ModeParser::Revoke(d,chan,UCMODE_OP);
+ }
+ return "";
+}