summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/extern.h4
-rw-r--r--src/channels.c20
-rw-r--r--src/chanserv.c20
-rw-r--r--src/protocol/inspircd12.c233
-rw-r--r--src/protocol/inspircd12.h13
-rw-r--r--version.log3
6 files changed, 245 insertions, 48 deletions
diff --git a/include/extern.h b/include/extern.h
index 050228e6f..c141234ca 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -109,6 +109,8 @@ E char *get_throttle(Channel * chan);
E void set_throttle(Channel * chan, char *value);
E char *get_redirect(Channel * chan);
E void set_redirect(Channel * chan, char *value);
+E char *get_unkwn(Channel * chan);
+E void set_unkwn(Channel *chan, char *value);
E void get_channel_stats(long *nrec, long *memuse);
@@ -215,6 +217,8 @@ E char *cs_get_limit(ChannelInfo * ci);
E void cs_set_limit(ChannelInfo * ci, char *value);
E char *cs_get_redirect(ChannelInfo * ci);
E void cs_set_redirect(ChannelInfo * ci, char *value);
+E char *cs_get_unkwn(ChannelInfo * ci);
+E void cs_set_unkwn(ChannelInfo * ci, char *value);
E int levelinfo_maxwidth;
E ChannelInfo *makechan(const char *chan);
diff --git a/src/channels.c b/src/channels.c
index 0d957c32e..fbeddb633 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -1849,6 +1849,15 @@ char *get_redirect(Channel * chan)
/*************************************************************************/
+/* This is a dummy function part of making anope accept modes
+ * it does actively parse.. ~ Viper */
+char *get_unkwn(Channel * chan)
+{
+ return NULL;
+}
+
+/*************************************************************************/
+
Channel *join_user_update(User * user, Channel * chan, char *name,
time_t chants)
{
@@ -1972,6 +1981,17 @@ void set_redirect(Channel * chan, char *value)
chan->redirect ? chan->redirect : "no redirect");
}
+/*************************************************************************/
+
+/* This is a dummy function to make anope parse a param for a mode,
+ * yet we don't use that param internally.. ~ Viper */
+void set_unkwn(Channel *chan, char *value)
+{
+ /* Do nothing.. */
+}
+
+/*************************************************************************/
+
void do_mass_mode(char *modes)
{
int ac;
diff --git a/src/chanserv.c b/src/chanserv.c
index dce22c06b..983c21719 100644
--- a/src/chanserv.c
+++ b/src/chanserv.c
@@ -2487,6 +2487,15 @@ char *cs_get_redirect(ChannelInfo * ci)
/*************************************************************************/
+/* This is a dummy function part of making anope accept modes
+ * it does actively parse.. ~ Viper */
+char *cs_get_unkwn(ChannelInfo * ci)
+{
+ return NULL;
+}
+
+/*************************************************************************/
+
void cs_set_flood(ChannelInfo * ci, char *value)
{
if (!ci) {
@@ -2577,6 +2586,17 @@ void cs_set_redirect(ChannelInfo * ci, char *value)
}
}
+/*************************************************************************/
+
+/* This is a dummy function to make anope parse a param for a mode,
+ * yet we don't use that param internally.. ~ Viper */
+void cs_set_unkwn(ChannelInfo * ci, char *value)
+{
+ /* Do nothing.. */
+}
+
+/*************************************************************************/
+
int get_access_level(ChannelInfo * ci, NickAlias * na)
{
ChanAccess *access;
diff --git a/src/protocol/inspircd12.c b/src/protocol/inspircd12.c
index 86456c448..42c065496 100644
--- a/src/protocol/inspircd12.c
+++ b/src/protocol/inspircd12.c
@@ -255,28 +255,28 @@ CBMode myCbmodes[128] = {
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
{0},
- {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* A */
{0}, /* B */
- {CMODE_C, 0, NULL, NULL}, /* C */
+ {0}, /* C */
{0}, /* D */
{0}, /* E */
{0}, /* F */
- {CMODE_G, 0, NULL, NULL}, /* G */
- {CMODE_H, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* G */
+ {0}, /* H */
{0}, /* I */
{0}, /* J */
- {CMODE_K, 0, NULL, NULL}, /* K */
+ {0}, /* K */
{0}, /* L */
- {0}, /* M */
- {CMODE_N, 0, NULL, NULL}, /* N */
- {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {0}, /* N */
+ {0}, /* O */
{0}, /* P */
- {CMODE_Q, 0, NULL, NULL}, /* Q */
+ {0}, /* Q */
{CMODE_R, 0, NULL, NULL}, /* R */
- {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* S */
{0}, /* T */
{0}, /* U */
- {CMODE_V, 0, NULL, NULL}, /* V */
+ {0}, /* V */
{0}, /* W */
{0}, /* X */
{0}, /* Y */
@@ -284,7 +284,7 @@ CBMode myCbmodes[128] = {
{0}, {0}, {0}, {0}, {0}, {0},
{0}, /* a */
{0}, /* b */
- {CMODE_c, 0, NULL, NULL},
+ {0}, /* c */
{0}, /* d */
{0}, /* e */
{0}, /* f */
@@ -302,12 +302,12 @@ CBMode myCbmodes[128] = {
{CMODE_r, CBM_NO_MLOCK, NULL, NULL},
{CMODE_s, 0, NULL, NULL},
{CMODE_t, 0, NULL, NULL},
- {CMODE_u, 0, NULL, NULL},
+ {0},
{0}, /* v */
{0}, /* w */
{0}, /* x */
{0}, /* y */
- {CMODE_z, 0, NULL, NULL},
+ {0},
{0}, {0}, {0}, {0}
};
@@ -328,16 +328,19 @@ CBModeInfo myCbmodeinfos[] = {
{'z', CMODE_z, 0, NULL, NULL},
{'A', CMODE_A, 0, NULL, NULL},
{'C', CMODE_C, 0, NULL, NULL},
+ {'F', CMODE_F, 0, NULL, NULL},
{'G', CMODE_G, 0, NULL, NULL},
- {'H', CMODE_H, 0, NULL, NULL},
+ {'J', CMODE_J, 0, NULL, NULL},
{'K', CMODE_K, 0, NULL, NULL},
{'L', CMODE_L, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
{'N', CMODE_N, 0, NULL, NULL},
{'O', CMODE_O, 0, NULL, NULL},
+ {'P', CMODE_P, 0, NULL, NULL},
{'Q', CMODE_Q, 0, NULL, NULL},
{'R', CMODE_R, 0, NULL, NULL},
{'S', CMODE_S, 0, NULL, NULL},
- {'V', CMODE_V, 0, NULL, NULL},
+ {'T', CMODE_T, 0, NULL, NULL},
{0}
};
@@ -404,10 +407,26 @@ static int has_inviteexceptionmod = 0;
static int has_joinfloodmod = 0;
static int has_hidechansmod = 0;
static int has_chanprotectmod = 0;
-static int has_knockmod = 0;
static int has_halfop = 0;
static int has_redirectmod = 0;
static int has_servprotectmod = 0;
+static int has_permchannels = 0;
+static int has_nokicks = 0;
+static int has_stripcolor = 0;
+static int has_nonotice = 0;
+static int has_auditorium = 0;
+static int has_sslmodes = 0;
+static int has_blockcolor = 0;
+static int has_operchans = 0;
+static int has_nonicks = 0;
+static int has_knock = 0;
+static int has_censor = 0;
+static int has_noctcp = 0;
+static int has_allowinvite = 0;
+static int has_blockcaps = 0;
+static int has_nickflood = 0;
+static int has_chanfilter = 0;
+static int has_kicknorejoin = 0;
void inspircd_set_umode(User *user, int ac, char **av)
{
@@ -1911,15 +1930,63 @@ int anope_event_capab(char *source, int ac, char **av)
if (strstr(av[1], "m_chanprotect.so")) {
has_chanprotectmod = 1;
}
- if (strstr(av[1], "m_knock.so")) {
- has_knockmod = 1;
- }
if (strstr(av[1], "m_redirect.so")) {
has_redirectmod = 1;
}
if (strstr(av[1], "m_servprotect.so")) {
has_servprotectmod = 1;
}
+ if (strstr(av[1], "m_permchannels.so")) {
+ has_permchannels = 1;
+ }
+ if (strstr(av[1], "m_nokicks.so")) {
+ has_nokicks = 1;
+ }
+ if (strstr(av[1], "m_stripcolor.so")) {
+ has_stripcolor = 1;
+ }
+ if (strstr(av[1], "m_nonotice.so")) {
+ has_nonotice = 1;
+ }
+ if (strstr(av[1], "m_auditorium.so")) {
+ has_auditorium = 1;
+ }
+ if (strstr(av[1], "m_sslmodes.so")) {
+ has_sslmodes = 1;
+ }
+ if (strstr(av[1], "m_blockcolor.so")) {
+ has_blockcolor = 1;
+ }
+ if (strstr(av[1], "m_operchans.so")) {
+ has_operchans = 1;
+ }
+ if (strstr(av[1], "m_nonicks.so")) {
+ has_nonicks = 1;
+ }
+ if (strstr(av[1], "m_knock.so")) {
+ has_knock = 1;
+ }
+ if (strstr(av[1], "m_censor.so")) {
+ has_censor = 1;
+ }
+ if (strstr(av[1], "m_noctcp.so")) {
+ has_noctcp = 1;
+ }
+ if (strstr(av[1], "m_allowinvite.so")) {
+ has_allowinvite = 1;
+ }
+ if (strstr(av[1], "m_blockcaps.so")) {
+ has_blockcaps = 1;
+ }
+ if (strstr(av[1], "m_nickflood.so")) {
+ has_nickflood = 1;
+ }
+ if (strstr(av[1], "m_chanfilter.so")) {
+ has_chanfilter = 1;
+ }
+ if (strstr(av[1], "m_kicknorejoin.so")) {
+ has_kicknorejoin = 1;
+ }
} else if (strcasecmp(av[0], "END") == 0) {
if (!has_globopsmod) {
send_cmd(NULL, "ERROR :m_globops is not loaded. This is required by Anope");
@@ -1963,19 +2030,13 @@ int anope_event_capab(char *source, int ac, char **av)
cbmi->csgetvalue = cs_get_flood;
myCbmodes['f'].flag = CMODE_f;
- myCbmodes['f'].flags = 0;
+ myCbmodes['f'].flags = CBM_MINUS_NO_ARG;
myCbmodes['f'].setvalue = set_flood;
myCbmodes['f'].cssetvalue = cs_set_flood;
- pmodule_ircd_cbmodeinfos(myCbmodeinfos);
- pmodule_ircd_cbmodes(myCbmodes);
-
ircd->fmode = 1;
} else {
alog("Support for channelmode +f can not be enabled");
- if (debug) {
- alog("debug: 'f' missing from myCbmodeinfos");
- }
}
}
@@ -1989,10 +2050,10 @@ int anope_event_capab(char *source, int ac, char **av)
myCmmodes['I'].delmask = del_invite;
ircd->invitemode = 1;
}
- ircd->svshold = has_svsholdmod;
if (has_banexceptionmod || has_inviteexceptionmod) {
pmodule_ircd_cmmodes(myCmmodes);
}
+ ircd->svshold = has_svsholdmod;
if (has_joinfloodmod) {
cbmi = myCbmodeinfos;
@@ -2009,14 +2070,9 @@ int anope_event_capab(char *source, int ac, char **av)
myCbmodes['j'].setvalue = chan_set_throttle;
myCbmodes['j'].cssetvalue = cs_set_throttle;
- pmodule_ircd_cbmodeinfos(myCbmodeinfos);
- pmodule_ircd_cbmodes(myCbmodes);
-
ircd->jmode = 1;
} else {
alog("Support for channelmode +j can not be enabled");
- if (debug)
- alog("debug: 'j' missing from myCbmodeinfos");
}
}
if (!has_chanprotectmod) {
@@ -2026,10 +2082,7 @@ int anope_event_capab(char *source, int ac, char **av)
alog("Support for admin and owner channelmodes disabled.");
} else
ircd->botchanumode = "+oa";
- if (has_knockmod) {
- ircd->noknock = CMODE_K;
- alog("Support for channelmode +K enabled.");
- }
+
if (!has_halfop) {
ircd->halfop = 0;
alog("Support for halfops disabled.");
@@ -2046,18 +2099,13 @@ int anope_event_capab(char *source, int ac, char **av)
cbmi->csgetvalue = cs_get_redirect;
myCbmodes['L'].flag = CMODE_L;
- myCbmodes['L'].flags = 0;
+ myCbmodes['L'].flags = CBM_MINUS_NO_ARG;
myCbmodes['L'].setvalue = set_redirect;
myCbmodes['L'].cssetvalue = cs_set_redirect;
- pmodule_ircd_cbmodeinfos(myCbmodeinfos);
- pmodule_ircd_cbmodes(myCbmodes);
-
ircd->Lmode = 1;
} else {
alog("Support for channelmode +L can not be enabled");
- if (debug)
- alog("debug: 'L' missing from myCbmodeinfos");
}
}
@@ -2086,6 +2134,105 @@ int anope_event_capab(char *source, int ac, char **av)
alog("Support for usermode +k enabled. Pseudo-clients will be gods.");
}
+ if (has_permchannels) {
+ myCbmodes['P'].flag = CMODE_P;
+ myCbmodes['P'].flags = CBM_NO_USER_MLOCK;
+ }
+ if (has_nokicks) {
+ myCbmodes['Q'].flag = CMODE_Q;
+ myCbmodes['Q'].flags = 0;
+ }
+ if (has_stripcolor) {
+ myCbmodes['S'].flag = CMODE_S;
+ myCbmodes['S'].flags = 0;
+ }
+ if (has_nonotice) {
+ myCbmodes['T'].flag = CMODE_T;
+ myCbmodes['T'].flags = 0;
+ }
+ if (has_auditorium) {
+ myCbmodes['u'].flag = CMODE_u;
+ myCbmodes['u'].flags = 0;
+ }
+ if (has_sslmodes) {
+ myCbmodes['z'].flag = CMODE_z;
+ myCbmodes['z'].flags = 0;
+ }
+ if (has_blockcolor) {
+ myCbmodes['c'].flag = CMODE_c;
+ myCbmodes['c'].flags = 0;
+ }
+ if (has_operchans) {
+ myCbmodes['O'].flag = CMODE_O;
+ myCbmodes['O'].flags = CBM_NO_USER_MLOCK;
+ }
+ if (has_nonicks) {
+ myCbmodes['N'].flag = CMODE_N;
+ myCbmodes['N'].flags = 0;
+ }
+ if (has_knock) {
+ ircd->noknock = CMODE_K;
+ myCbmodes['K'].flag = CMODE_K;
+ myCbmodes['K'].flags = 0;
+ }
+ if (has_censor) {
+ myCbmodes['G'].flag = CMODE_G;
+ myCbmodes['G'].flags = 0;
+ }
+ if (has_noctcp) {
+ myCbmodes['C'].flag = CMODE_C;
+ myCbmodes['C'].flags = 0;
+ }
+ if (has_allowinvite) {
+ myCbmodes['A'].flag = CMODE_A;
+ myCbmodes['A'].flags = 0;
+ }
+ if (has_blockcaps) {
+ myCbmodes['B'].flag = CMODE_B;
+ myCbmodes['B'].flags = 0;
+ }
+ if (has_nickflood) {
+ cbmi = myCbmodeinfos;
+
+ while ((cbmi->mode != 'F'))
+ cbmi++;
+ if (cbmi) {
+ cbmi->getvalue = get_unkwn;
+ cbmi->csgetvalue = cs_get_unkwn;
+
+ myCbmodes['F'].flag = CMODE_F;
+ myCbmodes['F'].flags = CBM_NO_MLOCK | CBM_MINUS_NO_ARG;
+ myCbmodes['F'].setvalue = set_unkwn;
+ myCbmodes['F'].cssetvalue = cs_set_unkwn;
+ } else {
+ alog("Support for channelmode +F can not be enabled");
+ }
+ }
+ if (has_chanfilter) {
+ myCbmodes['g'].flag = CMODE_g;
+ myCbmodes['g'].flags = CBM_NO_MLOCK;
+ }
+ if (has_kicknorejoin) {
+ cbmi = myCbmodeinfos;
+
+ while ((cbmi->mode != 'J'))
+ cbmi++;
+ if (cbmi) {
+ cbmi->getvalue = get_unkwn;
+ cbmi->csgetvalue = cs_get_unkwn;
+
+ myCbmodes['J'].flag = CMODE_J;
+ myCbmodes['J'].flags = CBM_NO_MLOCK | CBM_MINUS_NO_ARG;
+ myCbmodes['J'].setvalue = set_unkwn;
+ myCbmodes['J'].cssetvalue = cs_set_unkwn;
+ } else {
+ alog("Support for channelmode +J can not be enabled");
+ }
+ }
+
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cbmodes(myCbmodes); /* Commit all changes we made to the modes list.. */
+
/* Generate a fake capabs parsing call so things like NOQUIT work
* fine. It's ugly, but it works....
*/
diff --git a/src/protocol/inspircd12.h b/src/protocol/inspircd12.h
index 6e1448894..b0b2314a2 100644
--- a/src/protocol/inspircd12.h
+++ b/src/protocol/inspircd12.h
@@ -36,24 +36,29 @@
#define CMODE_t 0x00000020
#define CMODE_k 0x00000040 /* These two used only by ChanServ */
#define CMODE_l 0x00000080
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
#define CMODE_c 0x00000400
#define CMODE_A 0x00000800
-#define CMODE_H 0x00001000
+#define CMODE_T 0x00001000
#define CMODE_K 0x00002000
#define CMODE_L 0x00004000
#define CMODE_O 0x00008000
#define CMODE_Q 0x00010000
#define CMODE_S 0x00020000
-#define CMODE_V 0x00040000
+#define CMODE_P 0x00040000
#define CMODE_f 0x00080000
#define CMODE_G 0x00100000
#define CMODE_C 0x00200000
#define CMODE_u 0x00400000
#define CMODE_z 0x00800000
#define CMODE_N 0x01000000
-#define CMODE_R 0x00000100 /* Only identified users can join */
-#define CMODE_r 0x00000200 /* Set for all registered channels */
#define CMODE_j 0x02000000
+#define CMODE_M 0x04000000
+#define CMODE_B 0x08000000
+#define CMODE_F 0x10000000
+#define CMODE_g 0x20000000
+#define CMODE_J 0x40000000
#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
diff --git a/version.log b/version.log
index 3705dc3b6..bf96d3b23 100644
--- a/version.log
+++ b/version.log
@@ -9,9 +9,10 @@ VERSION_MAJOR="1"
VERSION_MINOR="8"
VERSION_PATCH="2"
VERSION_EXTRA="-svn"
-VERSION_BUILD="2571"
+VERSION_BUILD="2598"
# $Log$ # Changes since 1.8.2 Release
+#Revision 2598 - More dynamic detection of channel modes on InspIRCd 1.2. Also fixes params being linked to the wrong mode.
#Revision 2571 - Fixed small typo in dutch translation.
#Revision 2550 - Removed proxy server from ulined servers in example config as more people use a client proxy scanner and this should reduce occurences of user servers being listed.
#Revision 2546 - Reset errno before calling strtol in bs_kick, it would sometimes not allow valid kick settings to work