Automated merge with ssh://shadowircd/uranium/shadowircd/
This commit is contained in:
commit
ea4041ece9
|
@ -2,7 +2,6 @@ Todo list for Shadowircd 6.0
|
||||||
-----------------------------
|
-----------------------------
|
||||||
* swhois support
|
* swhois support
|
||||||
* custom operstrings (?)
|
* custom operstrings (?)
|
||||||
* autochanmodes defined in the .conf (cmodes that are set on a channel on initial join.)
|
|
||||||
* halfops - probably enabled/disabled via a configure switch on in the .conf
|
* halfops - probably enabled/disabled via a configure switch on in the .conf
|
||||||
* owner/+a prefix/cmode - see comment for halfops :D
|
* owner/+a prefix/cmode - see comment for halfops :D
|
||||||
* "soft" callerid umode (+G, only allows PM's from users in the same channel as you)
|
* "soft" callerid umode (+G, only allows PM's from users in the same channel as you)
|
||||||
|
|
|
@ -326,6 +326,7 @@ exempt {
|
||||||
};
|
};
|
||||||
|
|
||||||
channel {
|
channel {
|
||||||
|
autochanmodes = "nt";
|
||||||
use_invex = yes;
|
use_invex = yes;
|
||||||
use_except = yes;
|
use_except = yes;
|
||||||
use_knock = yes;
|
use_knock = yes;
|
||||||
|
@ -510,6 +511,7 @@ general {
|
||||||
reject_duration = 5 minutes;
|
reject_duration = 5 minutes;
|
||||||
throttle_duration = 60;
|
throttle_duration = 60;
|
||||||
throttle_count = 4;
|
throttle_count = 4;
|
||||||
|
expire_override_time = 5 minutes;
|
||||||
};
|
};
|
||||||
|
|
||||||
modules {
|
modules {
|
||||||
|
|
|
@ -673,6 +673,11 @@ exempt {
|
||||||
|
|
||||||
/* The channel block contains options pertaining to channels */
|
/* The channel block contains options pertaining to channels */
|
||||||
channel {
|
channel {
|
||||||
|
/* autochanmodes: Modes that will be set on a unregistered channel
|
||||||
|
* when the first user joins it.
|
||||||
|
*/
|
||||||
|
autochanmodes = "nt";
|
||||||
|
|
||||||
/* invex: Enable/disable channel mode +I, a n!u@h list of masks
|
/* invex: Enable/disable channel mode +I, a n!u@h list of masks
|
||||||
* that can join a +i channel without an invite.
|
* that can join a +i channel without an invite.
|
||||||
*/
|
*/
|
||||||
|
@ -1260,6 +1265,12 @@ general {
|
||||||
/* throttle_count: Number of connections within throttle_duration that it takes
|
/* throttle_count: Number of connections within throttle_duration that it takes
|
||||||
* for throttling to take effect */
|
* for throttling to take effect */
|
||||||
throttle_count = 4;
|
throttle_count = 4;
|
||||||
|
|
||||||
|
/* expire_override_time: User mode +p (override) will be automatically unset
|
||||||
|
* this long after it is set. 0 disables this (not recommended). Default is
|
||||||
|
* 5 minutes.
|
||||||
|
*/
|
||||||
|
expire_override_time = 5 minutes;
|
||||||
};
|
};
|
||||||
|
|
||||||
modules {
|
modules {
|
||||||
|
|
|
@ -13,6 +13,7 @@ Usermodes: (* designates that the umode is oper only)
|
||||||
* +l - Can see oper locops (local wallops).
|
* +l - Can see oper locops (local wallops).
|
||||||
* +s - Can see server notices (see /quote help snomask).
|
* +s - Can see server notices (see /quote help snomask).
|
||||||
* +z - Can see operwalls.
|
* +z - Can see operwalls.
|
||||||
|
* +p - Override -- implicit operator access in all channels.
|
||||||
+B - Marks you as a bot in /whois.
|
+B - Marks you as a bot in /whois.
|
||||||
+C - Prevents you from receiving CTCPs other than ACTION.
|
+C - Prevents you from receiving CTCPs other than ACTION.
|
||||||
+D - Deaf - ignores all channel messages.
|
+D - Deaf - ignores all channel messages.
|
||||||
|
|
|
@ -88,6 +88,7 @@ struct membership
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
|
||||||
unsigned long bants;
|
unsigned long bants;
|
||||||
|
unsigned long override_ts;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BANLEN 195
|
#define BANLEN 195
|
||||||
|
@ -114,6 +115,7 @@ struct ChModeChange
|
||||||
int caps;
|
int caps;
|
||||||
int nocaps;
|
int nocaps;
|
||||||
int mems;
|
int mems;
|
||||||
|
int override;
|
||||||
struct Client *client;
|
struct Client *client;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -171,6 +173,7 @@ typedef int (*ExtbanFunc)(const char *data, struct Client *client_p,
|
||||||
#define MODE_FREEINVITE 0x0800 /* allow free use of /invite */
|
#define MODE_FREEINVITE 0x0800 /* allow free use of /invite */
|
||||||
#define MODE_FREETARGET 0x1000 /* can be forwarded to without authorization */
|
#define MODE_FREETARGET 0x1000 /* can be forwarded to without authorization */
|
||||||
#define MODE_DISFORWARD 0x2000 /* disable channel forwarding */
|
#define MODE_DISFORWARD 0x2000 /* disable channel forwarding */
|
||||||
|
#define MODE_NOOPERKICK 0x4000 /* disallow kicking opers aka immune */
|
||||||
#define MODE_NOCTCP 0x8000 /* Block CTCPs directed to this channel */
|
#define MODE_NOCTCP 0x8000 /* Block CTCPs directed to this channel */
|
||||||
#define MODE_NONOTICE 0x16000 /* Block notices directed to this channel */
|
#define MODE_NONOTICE 0x16000 /* Block notices directed to this channel */
|
||||||
#define MODE_NOACTION 0x32000 /* Block CTCP ACTION directed to this channel */
|
#define MODE_NOACTION 0x32000 /* Block CTCP ACTION directed to this channel */
|
||||||
|
@ -194,6 +197,8 @@ typedef int (*ExtbanFunc)(const char *data, struct Client *client_p,
|
||||||
|
|
||||||
/* channel visible */
|
/* channel visible */
|
||||||
#define ShowChannel(v,c) (PubChannel(c) || IsMember((v),(c)))
|
#define ShowChannel(v,c) (PubChannel(c) || IsMember((v),(c)))
|
||||||
|
/* user visible in channel */
|
||||||
|
#define ShowInChannel(v,t,c) ((PubChannel(c) && !IsInvisible(t)) || IsMember((v),(c)))
|
||||||
|
|
||||||
#define IsMember(who, chan) ((who && who->user && \
|
#define IsMember(who, chan) ((who && who->user && \
|
||||||
find_channel_membership(chan, who)) ? 1 : 0)
|
find_channel_membership(chan, who)) ? 1 : 0)
|
||||||
|
|
|
@ -48,6 +48,9 @@ extern void chm_simple(struct Client *source_p, struct Channel *chptr,
|
||||||
extern void chm_ban(struct Client *source_p, struct Channel *chptr,
|
extern void chm_ban(struct Client *source_p, struct Channel *chptr,
|
||||||
int alevel, int parc, int *parn,
|
int alevel, int parc, int *parn,
|
||||||
const char **parv, int *errors, int dir, char c, long mode_type);
|
const char **parv, int *errors, int dir, char c, long mode_type);
|
||||||
|
extern void chm_hidden(struct Client *source_p, struct Channel *chptr,
|
||||||
|
int alevel, int parc, int *parn,
|
||||||
|
const char **parv, int *errors, int dir, char c, long mode_type);
|
||||||
extern void chm_staff(struct Client *source_p, struct Channel *chptr,
|
extern void chm_staff(struct Client *source_p, struct Channel *chptr,
|
||||||
int alevel, int parc, int *parn,
|
int alevel, int parc, int *parn,
|
||||||
const char **parv, int *errors, int dir, char c, long mode_type);
|
const char **parv, int *errors, int dir, char c, long mode_type);
|
||||||
|
|
|
@ -281,6 +281,8 @@ struct LocalUser
|
||||||
struct ev_entry *event; /* used for associated events */
|
struct ev_entry *event; /* used for associated events */
|
||||||
|
|
||||||
struct PrivilegeSet *privset; /* privset... */
|
struct PrivilegeSet *privset; /* privset... */
|
||||||
|
|
||||||
|
struct rb_event_t *override_timeout_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PreClient
|
struct PreClient
|
||||||
|
@ -430,6 +432,17 @@ struct ListClient
|
||||||
#define UMODE_ADMIN 0x2000 /* Admin on server */
|
#define UMODE_ADMIN 0x2000 /* Admin on server */
|
||||||
#define UMODE_SSLCLIENT 0x4000 /* using SSL */
|
#define UMODE_SSLCLIENT 0x4000 /* using SSL */
|
||||||
|
|
||||||
|
/* oper-controlled privledge umodes. */
|
||||||
|
#define UMODE_OVERRIDE 0x20000
|
||||||
|
|
||||||
|
/* umode/oper mode macros */
|
||||||
|
#define IsOper(x) ((x)->umodes & UMODE_OPER)
|
||||||
|
#define IsAdmin(x) ((x)->umodes & UMODE_ADMIN)
|
||||||
|
#define IsHelper(x) ((x)->umodes & UMODE_HELPER)
|
||||||
|
#define IsAnyOper(x) ((x)->umodes & (UMODE_OPER|UMODE_HELPER))
|
||||||
|
|
||||||
|
#define IsOverride(x) ((x)->umodes & UMODE_OVERRIDE)
|
||||||
|
|
||||||
/* overflow flags */
|
/* overflow flags */
|
||||||
/* EARLIER FLAGS ARE IN s_newconf.h */
|
/* EARLIER FLAGS ARE IN s_newconf.h */
|
||||||
#define FLAGS2_EXEMPTRESV 0x00400000
|
#define FLAGS2_EXEMPTRESV 0x00400000
|
||||||
|
|
|
@ -217,10 +217,12 @@ struct config_file_entry
|
||||||
int global_snotices;
|
int global_snotices;
|
||||||
int operspy_dont_care_user_info;
|
int operspy_dont_care_user_info;
|
||||||
int secret_channels_in_whois;
|
int secret_channels_in_whois;
|
||||||
|
int expire_override_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct config_channel_entry
|
struct config_channel_entry
|
||||||
{
|
{
|
||||||
|
char * autochanmodes;
|
||||||
int use_except;
|
int use_except;
|
||||||
int use_invex;
|
int use_invex;
|
||||||
int use_knock;
|
int use_knock;
|
||||||
|
|
|
@ -164,6 +164,7 @@ extern void cluster_generic(struct Client *, const char *, int cltype,
|
||||||
#define IsOperSpy(x) (HasPrivilege((x), "oper:spy"))
|
#define IsOperSpy(x) (HasPrivilege((x), "oper:spy"))
|
||||||
#define IsOperInvis(x) (HasPrivilege((x), "oper:hidden"))
|
#define IsOperInvis(x) (HasPrivilege((x), "oper:hidden"))
|
||||||
#define IsOperRemoteBan(x) (HasPrivilege((x), "oper:remoteban"))
|
#define IsOperRemoteBan(x) (HasPrivilege((x), "oper:remoteban"))
|
||||||
|
#define IsOperOverride(x) HasPrivilege(x, "oper:override")
|
||||||
#define IsOperMassNotice(x) (HasPrivilege((x), "oper:mass_notice"))
|
#define IsOperMassNotice(x) (HasPrivilege((x), "oper:mass_notice"))
|
||||||
|
|
||||||
extern struct oper_conf *make_oper_conf(void);
|
extern struct oper_conf *make_oper_conf(void);
|
||||||
|
@ -175,6 +176,20 @@ extern struct oper_conf *find_oper_conf(const char *username, const char *host,
|
||||||
|
|
||||||
extern const char *get_oper_privs(int flags);
|
extern const char *get_oper_privs(int flags);
|
||||||
|
|
||||||
|
struct mode_table
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
int mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct oper_flags
|
||||||
|
{
|
||||||
|
int flag;
|
||||||
|
const char *name;
|
||||||
|
char has;
|
||||||
|
char hasnt;
|
||||||
|
};
|
||||||
|
|
||||||
struct server_conf
|
struct server_conf
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
|
|
@ -175,6 +175,12 @@ static struct InfoStruct info_table[] = {
|
||||||
&ConfigFileEntry.dots_in_ident,
|
&ConfigFileEntry.dots_in_ident,
|
||||||
"Number of permissable dots in an ident"
|
"Number of permissable dots in an ident"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"expire_override_time",
|
||||||
|
OUTPUT_DECIMAL,
|
||||||
|
&ConfigFileEntry.expire_override_time,
|
||||||
|
"Period of time after which to unset user mode +p"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"failed_oper_notice",
|
"failed_oper_notice",
|
||||||
OUTPUT_BOOLEAN,
|
OUTPUT_BOOLEAN,
|
||||||
|
@ -326,6 +332,12 @@ static struct InfoStruct info_table[] = {
|
||||||
&ServerInfo.network_desc,
|
&ServerInfo.network_desc,
|
||||||
"Network description"
|
"Network description"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"autochanmodes",
|
||||||
|
OUTPUT_STRING,
|
||||||
|
&ConfigChannel.autochanmodes,
|
||||||
|
"Channelmodes set on channel creation"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"nick_delay",
|
"nick_delay",
|
||||||
OUTPUT_DECIMAL,
|
OUTPUT_DECIMAL,
|
||||||
|
|
|
@ -53,13 +53,6 @@ mapi_clist_av1 privs_clist[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
/* XXX this is a copy, not so nice */
|
|
||||||
struct mode_table
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
int mode;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* there is no such table like this anywhere else */
|
/* there is no such table like this anywhere else */
|
||||||
static struct mode_table auth_client_table[] = {
|
static struct mode_table auth_client_table[] = {
|
||||||
{"resv_exempt", FLAGS2_EXEMPTRESV },
|
{"resv_exempt", FLAGS2_EXEMPTRESV },
|
||||||
|
|
|
@ -1705,8 +1705,22 @@ void user_join(struct Client * client_p, struct Client * source_p, const char *
|
||||||
if(flags & CHFL_CHANOP)
|
if(flags & CHFL_CHANOP)
|
||||||
{
|
{
|
||||||
chptr->channelts = rb_current_time();
|
chptr->channelts = rb_current_time();
|
||||||
|
|
||||||
|
/* autochanmodes stuff */
|
||||||
|
if(ConfigChannel.autochanmodes)
|
||||||
|
{
|
||||||
|
char * ch;
|
||||||
|
for(ch = ConfigChannel.autochanmodes; *ch; *ch++)
|
||||||
|
{
|
||||||
|
chptr->mode.mode |= chmode_table[*ch].mode_type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
chptr->mode.mode |= MODE_TOPICLIMIT;
|
chptr->mode.mode |= MODE_TOPICLIMIT;
|
||||||
chptr->mode.mode |= MODE_NOPRIVMSGS;
|
chptr->mode.mode |= MODE_NOPRIVMSGS;
|
||||||
|
}
|
||||||
|
|
||||||
modes = channel_modes(chptr, &me);
|
modes = channel_modes(chptr, &me);
|
||||||
|
|
||||||
sendto_channel_local(ONLY_CHANOPS, chptr, ":%s MODE %s %s",
|
sendto_channel_local(ONLY_CHANOPS, chptr, ":%s MODE %s %s",
|
||||||
|
|
|
@ -232,6 +232,12 @@ free_local_client(struct Client *client_p)
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_free(client_p->localClient->auth_user);
|
rb_free(client_p->localClient->auth_user);
|
||||||
|
|
||||||
|
if(client_p->localClient->override_timeout_event)
|
||||||
|
{
|
||||||
|
rb_event_delete(client_p->localClient->override_timeout_event);
|
||||||
|
}
|
||||||
|
|
||||||
rb_free(client_p->localClient->challenge);
|
rb_free(client_p->localClient->challenge);
|
||||||
rb_free(client_p->localClient->fullcaps);
|
rb_free(client_p->localClient->fullcaps);
|
||||||
rb_free(client_p->localClient->opername);
|
rb_free(client_p->localClient->opername);
|
||||||
|
|
|
@ -286,12 +286,6 @@ conf_set_modules_path(void *data)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mode_table
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
int mode;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
static struct mode_table umode_table[] = {
|
static struct mode_table umode_table[] = {
|
||||||
{"callerid", UMODE_CALLERID },
|
{"callerid", UMODE_CALLERID },
|
||||||
|
@ -303,6 +297,7 @@ static struct mode_table umode_table[] = {
|
||||||
{"servnotice", UMODE_SERVNOTICE},
|
{"servnotice", UMODE_SERVNOTICE},
|
||||||
{"wallop", UMODE_WALLOP },
|
{"wallop", UMODE_WALLOP },
|
||||||
{"operwall", UMODE_OPERWALL },
|
{"operwall", UMODE_OPERWALL },
|
||||||
|
{"override", UMODE_OVERRIDE },
|
||||||
{"noctcp", UMODE_NOCTCP },
|
{"noctcp", UMODE_NOCTCP },
|
||||||
{"noinvite", UMODE_NOINVITE },
|
{"noinvite", UMODE_NOINVITE },
|
||||||
{"bot", UMODE_BOT },
|
{"bot", UMODE_BOT },
|
||||||
|
@ -2199,11 +2194,13 @@ static struct ConfEntry conf_general_table[] =
|
||||||
{ "ts_warn_delta", CF_TIME, NULL, 0, &ConfigFileEntry.ts_warn_delta },
|
{ "ts_warn_delta", CF_TIME, NULL, 0, &ConfigFileEntry.ts_warn_delta },
|
||||||
{ "use_whois_actually", CF_YESNO, NULL, 0, &ConfigFileEntry.use_whois_actually },
|
{ "use_whois_actually", CF_YESNO, NULL, 0, &ConfigFileEntry.use_whois_actually },
|
||||||
{ "warn_no_nline", CF_YESNO, NULL, 0, &ConfigFileEntry.warn_no_nline },
|
{ "warn_no_nline", CF_YESNO, NULL, 0, &ConfigFileEntry.warn_no_nline },
|
||||||
|
{ "expire_override_time", CF_TIME, NULL, 0, &ConfigFileEntry.expire_override_time },
|
||||||
{ "\0", 0, NULL, 0, NULL }
|
{ "\0", 0, NULL, 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct ConfEntry conf_channel_table[] =
|
static struct ConfEntry conf_channel_table[] =
|
||||||
{
|
{
|
||||||
|
{ "autochanmodes", CF_QSTRING, NULL, 0, &ConfigChannel.autochanmodes },
|
||||||
{ "default_split_user_count", CF_INT, NULL, 0, &ConfigChannel.default_split_user_count },
|
{ "default_split_user_count", CF_INT, NULL, 0, &ConfigChannel.default_split_user_count },
|
||||||
{ "default_split_server_count", CF_INT, NULL, 0, &ConfigChannel.default_split_server_count },
|
{ "default_split_server_count", CF_INT, NULL, 0, &ConfigChannel.default_split_server_count },
|
||||||
{ "burst_topicwho", CF_YESNO, NULL, 0, &ConfigChannel.burst_topicwho },
|
{ "burst_topicwho", CF_YESNO, NULL, 0, &ConfigChannel.burst_topicwho },
|
||||||
|
|
|
@ -746,6 +746,7 @@ set_default_conf(void)
|
||||||
ConfigFileEntry.oper_only_umodes = UMODE_SERVNOTICE;
|
ConfigFileEntry.oper_only_umodes = UMODE_SERVNOTICE;
|
||||||
ConfigFileEntry.oper_snomask = SNO_GENERAL;
|
ConfigFileEntry.oper_snomask = SNO_GENERAL;
|
||||||
|
|
||||||
|
ConfigChannel.autochanmodes = rb_strdup("nt");
|
||||||
ConfigChannel.use_except = YES;
|
ConfigChannel.use_except = YES;
|
||||||
ConfigChannel.use_invex = YES;
|
ConfigChannel.use_invex = YES;
|
||||||
ConfigChannel.use_knock = YES;
|
ConfigChannel.use_knock = YES;
|
||||||
|
@ -783,6 +784,7 @@ set_default_conf(void)
|
||||||
ConfigFileEntry.reject_duration = 120;
|
ConfigFileEntry.reject_duration = 120;
|
||||||
ConfigFileEntry.throttle_count = 4;
|
ConfigFileEntry.throttle_count = 4;
|
||||||
ConfigFileEntry.throttle_duration = 60;
|
ConfigFileEntry.throttle_duration = 60;
|
||||||
|
ConfigFileEntry.expire_override_time = 300;
|
||||||
|
|
||||||
ServerInfo.default_max_clients = MAXCONNECTIONS;
|
ServerInfo.default_max_clients = MAXCONNECTIONS;
|
||||||
|
|
||||||
|
|
28
src/s_user.c
28
src/s_user.c
|
@ -109,7 +109,7 @@ int user_modes[256] = {
|
||||||
0, /* m */
|
0, /* m */
|
||||||
0, /* n */
|
0, /* n */
|
||||||
UMODE_OPER, /* o */
|
UMODE_OPER, /* o */
|
||||||
0, /* p */
|
UMODE_OVERRIDE, /* p */
|
||||||
0, /* q */
|
0, /* q */
|
||||||
0, /* r */
|
0, /* r */
|
||||||
UMODE_SERVNOTICE, /* s */
|
UMODE_SERVNOTICE, /* s */
|
||||||
|
@ -881,6 +881,15 @@ report_and_set_user_flags(struct Client *source_p, struct ConfItem *aconf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
expire_umode_p(void *data)
|
||||||
|
{
|
||||||
|
struct Client *source_p = data;
|
||||||
|
char *parv[4] = {source_p->name, source_p->name, "-p", NULL};
|
||||||
|
source_p->localClient->override_timeout_event = NULL;
|
||||||
|
user_mode(source_p, source_p, 3, parv);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_other_user_mode(struct Client *source_p, struct Client *target_p)
|
show_other_user_mode(struct Client *source_p, struct Client *target_p)
|
||||||
{
|
{
|
||||||
|
@ -1138,6 +1147,12 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char
|
||||||
source_p->umodes &= ~UMODE_ADMIN;
|
source_p->umodes &= ~UMODE_ADMIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(MyConnect(source_p) && (source_p->umodes & UMODE_OVERRIDE) && (!IsOperOverride(source_p)))
|
||||||
|
{
|
||||||
|
sendto_one_notice(source_p, ":*** You need oper and the override flag for +p");
|
||||||
|
source_p->umodes &= ~UMODE_OVERRIDE;
|
||||||
|
}
|
||||||
|
|
||||||
/* let modules providing usermodes know that we've changed our usermode --nenolod */
|
/* let modules providing usermodes know that we've changed our usermode --nenolod */
|
||||||
hdata.client = source_p;
|
hdata.client = source_p;
|
||||||
hdata.oldumodes = setflags;
|
hdata.oldumodes = setflags;
|
||||||
|
@ -1157,6 +1172,17 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char
|
||||||
sendto_one_numeric(source_p, RPL_SNOMASK, form_str(RPL_SNOMASK),
|
sendto_one_numeric(source_p, RPL_SNOMASK, form_str(RPL_SNOMASK),
|
||||||
construct_snobuf(source_p->snomask));
|
construct_snobuf(source_p->snomask));
|
||||||
|
|
||||||
|
if(ConfigFileEntry.expire_override_time && MyClient(source_p) && (source_p->umodes & ~setflags) & UMODE_OVERRIDE)
|
||||||
|
{
|
||||||
|
source_p->localClient->override_timeout_event =
|
||||||
|
rb_event_addonce("expire_override", expire_umode_p, source_p, ConfigFileEntry.expire_override_time);
|
||||||
|
}
|
||||||
|
else if(MyClient(source_p) && source_p->localClient->override_timeout_event && (setflags & ~source_p->umodes) & UMODE_OVERRIDE)
|
||||||
|
{
|
||||||
|
rb_event_delete(source_p->localClient->override_timeout_event);
|
||||||
|
source_p->localClient->override_timeout_event = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue