*
* $Id$
*/
+#include "config.h"
+
#include "jupe.h"
#include "client.h"
#include "hash.h"
#include "ircd.h"
#include "ircd_alloc.h"
+#include "ircd_log.h"
+#include "ircd_policy.h"
#include "ircd_reply.h"
#include "ircd_string.h"
#include "match.h"
#include "sys.h" /* FALSE bleah */
#include <assert.h>
+#include <string.h>
static struct Jupe *GlobalJupeList = 0;
ajupe = (struct Jupe*) MyMalloc(sizeof(struct Jupe)); /* alloc memory */
assert(0 != ajupe);
- DupString(ajupe->ju_server, server); /* copy vital information */
+ DupString(ajupe->ju_server, server); /* copy vital information */
DupString(ajupe->ju_reason, reason);
ajupe->ju_expire = expire;
ajupe->ju_lastmod = lastmod;
- ajupe->ju_flags = flags; /* set jupe flags */
+ ajupe->ju_flags = flags & JUPE_MASK; /* set jupe flags */
- ajupe->ju_next = GlobalJupeList; /* link it into the list */
+ ajupe->ju_next = GlobalJupeList; /* link it into the list */
ajupe->ju_prev_p = &GlobalJupeList;
if (GlobalJupeList)
GlobalJupeList->ju_prev_p = &ajupe->ju_next;
if (JupeIsLocal(jupe)) /* don't propagate local jupes */
return;
- sendcmdto_serv_butone(cptr, CMD_JUPE, sptr, "* %c%s %Tu %Tu :%s",
- JupeIsActive(jupe) ? '+' : '-', jupe->ju_server,
+ sendcmdto_serv_butone(sptr, CMD_JUPE, cptr, "* %c%s %Tu %Tu :%s",
+ JupeIsRemActive(jupe) ? '+' : '-', jupe->ju_server,
jupe->ju_expire - CurrentTime, jupe->ju_lastmod,
jupe->ju_reason);
}
int
jupe_add(struct Client *cptr, struct Client *sptr, char *server, char *reason,
- time_t expire, time_t lastmod, int local, int active)
+ time_t expire, time_t lastmod, unsigned int flags)
{
struct Jupe *ajupe;
- unsigned int flags = 0;
assert(0 != server);
assert(0 != reason);
*/
if (expire <= 0 || expire > JUPE_MAX_EXPIRE) {
if (!IsServer(cptr) && MyConnect(cptr))
- send_error_to_client(cptr, ERR_BADEXPIRE, expire);
+ send_reply(cptr, ERR_BADEXPIRE, expire);
return 0;
}
expire += CurrentTime; /* convert from lifetime to timestamp */
/* Inform ops and log it */
- sendto_op_mask(SNO_NETWORK, "%s adding %sJUPE for %s, expiring at "
- TIME_T_FMT ": %s",
- IsServer(sptr) ? sptr->name : sptr->user->server->name,
- local ? "local " : "", server, expire + TSoffset, reason);
-
-#ifdef JPATH
- if (IsServer(sptr))
- write_log(JPATH, TIME_T_FMT " %s adding %sJUPE for %s, expiring at "
- TIME_T_FMT ": %s\n", TStime(), sptr->name,
- local ? "local " : "", server, expire + TSoffset, reason);
- else
- write_log(JPATH, TIME_T_FMT, " %s!%s@%s adding %sJUPE for %s, expiring at "
- TIME_T_FMT ": %s\n", TStime(), sptr->name, sptr->user->username,
- sptr->user->host, local ? "local " : "", server,
- expire + TSoffset, reason);
-#endif /* JPATH */
-
- if (active) /* compute initial flags */
- flags |= JUPE_ACTIVE;
- if (local)
- flags |= JUPE_LOCAL;
+ sendto_opmask_butone(0, SNO_NETWORK, "%s adding %sJUPE for %s, expiring at "
+ "%Tu: %s",
+#ifdef HEAD_IN_SAND_SNOTICES
+ cli_name(sptr),
+#else
+ IsServer(sptr) ? cli_name(sptr) :
+ cli_name(cli_user(sptr)->server),
+#endif
+ flags & JUPE_LOCAL ? "local " : "", server,
+ expire + TSoffset, reason);
+
+ log_write(LS_JUPE, L_INFO, LOG_NOSNOTICE,
+ "%#C adding %sJUPE for %s, expiring at %Tu: %s", sptr,
+ flags & JUPE_LOCAL ? "local " : "", server, expire + TSoffset,
+ reason);
/* make the jupe */
ajupe = make_jupe(server, reason, expire, lastmod, flags);
int
jupe_activate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
- time_t lastmod)
+ time_t lastmod, unsigned int flags)
{
+ unsigned int saveflags = 0;
+
assert(0 != jupe);
assert(!JupeIsLocal(jupe));
- jupe->ju_flags |= JUPE_ACTIVE;
+ saveflags = jupe->ju_flags;
+
+ if (flags & JUPE_LOCAL)
+ jupe->ju_flags &= ~JUPE_LDEACT;
+ else {
+ jupe->ju_flags |= JUPE_ACTIVE;
+
+ if (jupe->ju_lastmod >= lastmod) /* force lastmod to increase */
+ jupe->ju_lastmod++;
+ else
+ jupe->ju_lastmod = lastmod;
+ }
- if (jupe->ju_lastmod >= lastmod) /* force lastmod to increase */
- jupe->ju_lastmod++;
- else
- jupe->ju_lastmod = lastmod;
+ if ((saveflags & JUPE_ACTMASK) == JUPE_ACTIVE)
+ return 0; /* was active to begin with */
/* Inform ops and log it */
- sendto_op_mask(SNO_NETWORK, "%s activating JUPE for %s, expiring at "
- TIME_T_FMT ": %s",
- IsServer(sptr) ? sptr->name : sptr->user->server->name,
- jupe->ju_server, jupe->ju_expire + TSoffset, jupe->ju_reason);
-
-#ifdef JPATH
- if (IsServer(sptr))
- write_log(JPATH, TIME_T_FMT " %s activating JUPE for %s, expiring at "
- TIME_T_FMT ": %s\n", TStime(), sptr->name, jupe->ju_server,
- jupe->ju_expire + TSoffset, jupe->ju_reason);
- else
- write_log(JPATH, TIME_T_FMT, " %s!%s@%s activating JUPE for %s, "
- "expiring at " TIME_T_FMT ": %s\n", TStime(), sptr->name,
- sptr->user->username, sptr->user->host, jupe->ju_server,
- jupe->ju_expire + TSoffset, jupe->ju_reason);
-#endif /* JPATH */
-
- propagate_jupe(cptr, sptr, jupe);
+ sendto_opmask_butone(0, SNO_NETWORK, "%s activating JUPE for %s, expiring "
+ "at %Tu: %s",
+#ifdef HEAD_IN_SAND_SNOTICES
+ cli_name(sptr),
+#else
+ IsServer(sptr) ? cli_name(sptr) :
+ cli_name(cli_user(sptr)->server),
+#endif
+ jupe->ju_server, jupe->ju_expire + TSoffset,
+ jupe->ju_reason);
+
+ log_write(LS_JUPE, L_INFO, LOG_NOSNOTICE,
+ "%#C activating JUPE for %s, expiring at %Tu: %s",sptr,
+ jupe->ju_server, jupe->ju_expire + TSoffset, jupe->ju_reason);
+
+ if (!(flags & JUPE_LOCAL)) /* don't propagate local changes */
+ propagate_jupe(cptr, sptr, jupe);
return do_jupe(cptr, sptr, jupe);
}
int
jupe_deactivate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
- time_t lastmod)
+ time_t lastmod, unsigned int flags)
{
+ unsigned int saveflags = 0;
+
assert(0 != jupe);
+ saveflags = jupe->ju_flags;
+
if (!JupeIsLocal(jupe)) {
- jupe->ju_flags &= ~JUPE_ACTIVE;
+ if (flags & JUPE_LOCAL)
+ jupe->ju_flags |= JUPE_LDEACT;
+ else {
+ jupe->ju_flags &= ~JUPE_ACTIVE;
+
+ if (jupe->ju_lastmod >= lastmod) /* force lastmod to increase */
+ jupe->ju_lastmod++;
+ else
+ jupe->ju_lastmod = lastmod;
+ }
- if (jupe->ju_lastmod >= lastmod) /* force lastmod to increase */
- jupe->ju_lastmod++;
- else
- jupe->ju_lastmod = lastmod;
+ if ((saveflags & JUPE_ACTMASK) != JUPE_ACTIVE)
+ return 0; /* was inactive to begin with */
}
/* Inform ops and log it */
- sendto_op_mask(SNO_NETWORK, "%s %s JUPE for %s, expiring at " TIME_T_FMT
- ": %s",
- IsServer(sptr) ? sptr->name : sptr->user->server->name,
- JupeIsLocal(jupe) ? "removing local" : "deactivating",
- jupe->ju_server, jupe->ju_expire + TSoffset, jupe->ju_reason);
-
-#ifdef JPATH
- if (IsServer(sptr))
- write_log(JPATH, TIME_T_FMT " %s %s JUPE for %s, expiring at " TIME_T_FMT
- ": %s\n", TStime(), sptr->name,
- JupeIsLocal(jupe) ? "removing local" : "deactivating",
- jupe->ju_server, jupe->ju_expire + TSoffset, jupe->ju_reason);
- else
- write_log(JPATH, TIME_T_FMT, " %s!%s@%s %s JUPE for %s, "
- "expiring at " TIME_T_FMT ": %s\n", TStime(), sptr->name,
- sptr->user->username, sptr->user->host,
- JupeIsLocal(jupe) ? "removing local" : "deactivating",
- jupe->ju_server, jupe->ju_expire + TSoffset, jupe->ju_reason);
-#endif /* JPATH */
+ sendto_opmask_butone(0, SNO_NETWORK, "%s %s JUPE for %s, expiring at %Tu: "
+ "%s",
+#ifdef HEAD_IN_SAND_SNOTICES
+ cli_name(sptr),
+#else
+ IsServer(sptr) ? cli_name(sptr) :
+ cli_name(cli_user(sptr)->server),
+#endif
+ JupeIsLocal(jupe) ? "removing local" : "deactivating",
+ jupe->ju_server, jupe->ju_expire + TSoffset,
+ jupe->ju_reason);
+
+ log_write(LS_JUPE, L_INFO, LOG_NOSNOTICE,
+ "%#C %s JUPE for %s, expiring at %Tu: %s", sptr,
+ JupeIsLocal(jupe) ? "removing local" : "deactivating",
+ jupe->ju_server, jupe->ju_expire + TSoffset, jupe->ju_reason);
if (JupeIsLocal(jupe))
jupe_free(jupe);
- else
+ else if (!(flags & JUPE_LOCAL)) /* don't propagate local changes */
propagate_jupe(cptr, sptr, jupe);
return 0;
if (jupe->ju_expire <= CurrentTime) /* expire any that need expiring */
jupe_free(jupe);
else if (!JupeIsLocal(jupe)) /* forward global jupes */
- sendcmdto_one(cptr, CMD_JUPE, &me, "* %c%s %Tu %Tu :%s",
- JupeIsActive(jupe) ? '+' : '-', jupe->ju_server,
+ sendcmdto_one(&me, CMD_JUPE, cptr, "* %c%s %Tu %Tu :%s",
+ JupeIsRemActive(jupe) ? '+' : '-', jupe->ju_server,
jupe->ju_expire - CurrentTime, jupe->ju_lastmod,
jupe->ju_reason);
}
if (JupeIsLocal(jupe)) /* don't propagate local jupes */
return 0;
- sendcmdto_one(cptr, CMD_JUPE, &me, "* %c%s %Tu %Tu :%s",
- JupeIsActive(jupe) ? '+' : '-', jupe->ju_server,
+ sendcmdto_one(&me, CMD_JUPE, cptr, "* %c%s %Tu %Tu :%s",
+ JupeIsRemActive(jupe) ? '+' : '-', jupe->ju_server,
jupe->ju_expire - CurrentTime, jupe->ju_lastmod,
jupe->ju_reason);
if (server) {
if (!(jupe = jupe_find(server))) /* no such jupe */
- return send_error_to_client(sptr, ERR_NOSUCHJUPE, server);
+ return send_reply(sptr, ERR_NOSUCHJUPE, server);
/* send jupe information along */
- sendto_one(sptr, rpl_str(RPL_JUPELIST), me.name, sptr->name,
- jupe->ju_server, jupe->ju_expire + TSoffset,
- JupeIsLocal(jupe) ? me.name : "*",
+ send_reply(sptr, RPL_JUPELIST, jupe->ju_server, jupe->ju_expire + TSoffset,
+ JupeIsLocal(jupe) ? cli_name(&me) : "*",
JupeIsActive(jupe) ? '+' : '-', jupe->ju_reason);
} else {
for (jupe = GlobalJupeList; jupe; jupe = sjupe) { /* go through jupes */
if (jupe->ju_expire <= CurrentTime) /* expire any that need expiring */
jupe_free(jupe);
else /* send jupe information along */
- sendto_one(sptr, rpl_str(RPL_JUPELIST), me.name, sptr->name,
- jupe->ju_server, jupe->ju_expire + TSoffset,
- JupeIsLocal(jupe) ? me.name : "*",
+ send_reply(sptr, RPL_JUPELIST, jupe->ju_server,
+ jupe->ju_expire + TSoffset,
+ JupeIsLocal(jupe) ? cli_name(&me) : "*",
JupeIsActive(jupe) ? '+' : '-', jupe->ju_reason);
}
}
/* end of jupe information */
- sendto_one(sptr, rpl_str(RPL_ENDOFJUPELIST), me.name, sptr->name);
- return 0;
+ return send_reply(sptr, RPL_ENDOFJUPELIST);
}