#include "reject.h"
#include "hostmask.h"
+static int m_ban(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
static int ms_ban(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
struct Message ban_msgtab = {
"BAN", 0, 0, 0, MFLG_SLOW,
- {mg_unreg, mg_ignore, {ms_ban, 9}, {ms_ban, 9}, mg_ignore, mg_ignore}
+ {mg_unreg, {m_ban, 0}, {ms_ban, 9}, {ms_ban, 9}, mg_ignore, {m_ban, 0}}
};
mapi_clist_av1 ban_clist[] = { &ban_msgtab, NULL };
DECLARE_MODULE_AV1(ban, NULL, NULL, ban_clist, NULL, NULL, "$Revision: 1349 $");
+static int
+m_ban(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+{
+ sendto_one_notice(source_p, ":The BAN command is not user-accessible.");
+ sendto_one_notice(source_p, ":To ban a user from a channel, see /QUOTE HELP CMODE");
+ if (IsOper(source_p))
+ sendto_one_notice(source_p, ":To ban a user from a server or from the network, see /QUOTE HELP KLINE");
+ return 0;
+}
+
/* ms_ban()
*
* parv[1] - type
ptr = find_prop_ban(ntype, parv[2], parv[3]);
if (ptr != NULL)
{
+ /* We already know about this ban mask. */
aconf = ptr->data;
if (aconf->created > created ||
(aconf->created == created &&
aconf->host);
return 0;
}
+ /* act indicates if something happened (from the oper's
+ * point of view). This is the case if the ban was
+ * previously active (not deleted) or if the new ban
+ * is not a removal and not already expired.
+ */
act = !(aconf->status & CONF_ILLEGAL) || (hold != created &&
hold > rb_current_time());
if (lifetime > aconf->lifetime)
/* already expired, hmm */
if (aconf->lifetime <= rb_current_time())
return 0;
+ /* Deactivate, it will be reactivated later if appropriate. */
deactivate_conf(aconf, ptr);
rb_free(aconf->user);
aconf->user = NULL;
}
else
{
+ /* New ban mask. */
aconf = make_conf();
aconf->status = CONF_ILLEGAL | ntype;
aconf->lifetime = lifetime;
aconf->passwd = rb_strndup(parv[parc - 1], p - parv[parc - 1] + 1);
aconf->spasswd = rb_strdup(p + 1);
}
+ /* The ban is fully filled in and in the prop_bans list
+ * but still deactivated. Now determine if it should be activated
+ * and send the server notices.
+ */
+ /* We only reject *@* and the like here.
+ * Otherwise malformed bans are fairly harmless and can be removed.
+ */
switch (ntype)
{
case CONF_KILL:
aconf->user ? " " : "",
aconf->host);
}
+ /* If CONF_ILLEGAL is still set at this point, remove entries from the
+ * reject cache (for klines and xlines).
+ * If CONF_ILLEGAL is not set, add the ban to the type-specific data
+ * structure and take action on matched clients/channels.
+ */
switch (ntype)
{
case CONF_KILL: