#include "config.h"
#include "gline.h"
+#include "channel.h"
#include "client.h"
#include "ircd.h"
#include "ircd_alloc.h"
/* Figure out the next pointer in list... */ \
if ((((next) = (gl)->gl_next) || 1) && \
/* Then see if it's expired */ \
- (gl)->gl_lifetime <= CurrentTime) \
+ (gl)->gl_lifetime <= TStime()) \
/* Record has expired, so free the G-line */ \
gline_free((gl)); \
/* See if we need to expire the G-line */ \
- else if ((((gl)->gl_expire > CurrentTime) || \
+ else if ((((gl)->gl_expire > TStime()) || \
(((gl)->gl_flags &= ~GLINE_ACTIVE) && 0) || \
((gl)->gl_state = GLOCAL_GLOBAL)) && 0) \
; /* empty statement */ \
GlineIsRemActive(gline) ? '+' : '-', gline->gl_user,
gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire - CurrentTime, gline->gl_lastmod,
+ gline->gl_expire - TStime(), gline->gl_lastmod,
gline->gl_lifetime, gline->gl_reason);
return 0;
continue;
ircd_snprintf(0, namebuf, sizeof(namebuf), "%s@%s",
- cli_user(acptr)->username, cli_user(acptr)->host);
+ cli_user(acptr)->username, cli_user(acptr)->realhost);
ircd_snprintf(0, ipbuf, sizeof(ipbuf), "%s@%s", cli_user(acptr)->username,
ircd_ntoa(&cli_ip(acptr)));
if (*userhost == '#' || *userhost == '&') {
if ((flags & GLINE_LOCAL) && !HasPriv(sptr, PRIV_LOCAL_BADCHAN))
return send_reply(sptr, ERR_NOPRIVILEGES);
+ /* Allow maximum channel name length, plus margin for wildcards. */
+ if (strlen(userhost+1) >= CHANNELLEN + 6)
+ return send_reply(sptr, ERR_LONGMASK);
flags |= GLINE_BADCHAN;
user = userhost;
host = NULL;
} else if (*userhost == '$') {
switch (userhost[1]) {
- case 'R': flags |= GLINE_REALNAME; break;
+ case 'R':
+ /* Allow REALLEN for the real name, plus margin for wildcards. */
+ if (strlen(userhost+2) >= REALLEN + 6)
+ return send_reply(sptr, ERR_LONGMASK);
+ flags |= GLINE_REALNAME;
+ break;
default:
/* uh, what to do here? */
/* The answer, my dear Watson, is we throw a protocol_violation()
* expiration time for greater than GLINE_MAX_EXPIRE.
*/
if (!(flags & GLINE_FORCE) &&
- (expire <= CurrentTime || expire > CurrentTime + GLINE_MAX_EXPIRE)) {
+ (expire <= TStime() || expire > TStime() + GLINE_MAX_EXPIRE)) {
if (!IsServer(sptr) && MyConnect(sptr))
send_reply(sptr, ERR_BADEXPIRE, expire);
return 0;
+ } else if (expire <= TStime()) {
+ /* This expired G-line was forced to be added, so mark it inactive. */
+ flags &= ~GLINE_ACTIVE;
}
if (!lifetime) /* no lifetime set, use expiration time */
(flags & GLINE_BADCHAN) ? "BADCHAN" : "GLINE", user,
(flags & (GLINE_BADCHAN|GLINE_REALNAME)) ? "" : "@",
(flags & (GLINE_BADCHAN|GLINE_REALNAME)) ? "" : host,
- expire + TSoffset, reason);
+ expire, reason);
/* and log it */
log_write(LS_GLINE, L_INFO, LOG_NOSNOTICE,
flags & GLINE_BADCHAN ? "BADCHAN" : "GLINE", user,
flags & (GLINE_BADCHAN|GLINE_REALNAME) ? "" : "@",
flags & (GLINE_BADCHAN|GLINE_REALNAME) ? "" : host,
- expire + TSoffset, reason);
+ expire, reason);
/* make the gline */
agline = make_gline(user, host, reason, expire, lastmod, lifetime, flags);
GlineIsBadChan(gline) ? "BADCHAN" : "GLINE",
gline->gl_user, gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire + TSoffset, gline->gl_reason);
-
+ gline->gl_expire, gline->gl_reason);
+
log_write(LS_GLINE, L_INFO, LOG_NOSNOTICE,
"%#C activating global %s for %s%s%s, expiring at %Tu: %s", sptr,
GlineIsBadChan(gline) ? "BADCHAN" : "GLINE", gline->gl_user,
gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire + TSoffset, gline->gl_reason);
+ gline->gl_expire, gline->gl_reason);
if (!(flags & GLINE_LOCAL)) /* don't propagate local changes */
gline_propagate(cptr, sptr, gline);
msg, GlineIsBadChan(gline) ? "BADCHAN" : "GLINE",
gline->gl_user, gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire + TSoffset, gline->gl_reason);
+ gline->gl_expire, gline->gl_reason);
log_write(LS_GLINE, L_INFO, LOG_NOSNOTICE,
"%#C %s %s for %s%s%s, expiring at %Tu: %s", sptr, msg,
GlineIsBadChan(gline) ? "BADCHAN" : "GLINE", gline->gl_user,
gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire + TSoffset, gline->gl_reason);
+ gline->gl_expire, gline->gl_reason);
if (!(flags & GLINE_LOCAL)) /* don't propagate local changes */
gline_propagate(cptr, sptr, gline);
time_t lastmod, time_t lifetime, unsigned int flags)
{
char buf[BUFSIZE], *op = "";
- int pos = 0;
+ int pos = 0, non_auto = 0;
assert(gline);
assert(!GlineIsLocal(gline));
/* first, check out the expiration time... */
if ((flags & GLINE_EXPIRE) && expire) {
if (!(flags & GLINE_FORCE) &&
- (expire <= CurrentTime || expire > CurrentTime + GLINE_MAX_EXPIRE)) {
+ (expire <= TStime() || expire > TStime() + GLINE_MAX_EXPIRE)) {
if (!IsServer(sptr) && MyConnect(sptr)) /* bad expiration time */
send_reply(sptr, ERR_BADEXPIRE, expire);
return 0;
(action == GLINE_LOCAL_DEACTIVATE &&
(gline->gl_state == GLOCAL_DEACTIVATED)) ||
/* can't activate an expired G-line */
- IRCD_MAX(gline->gl_expire, expire) <= CurrentTime)
+ IRCD_MAX(gline->gl_expire, expire) <= TStime())
action = GLINE_MODIFY; /* no activity state modifications */
Debug((DEBUG_DEBUG, "About to perform changes; flags 0x%04x, action %s",
/* Now, handle reason changes... */
if (flags & GLINE_REASON) {
+ non_auto = non_auto || ircd_strncmp(gline->gl_reason, "AUTO", 4);
MyFree(gline->gl_reason); /* release old reason */
DupString(gline->gl_reason, reason); /* store new reason */
if (pos < BUFSIZE)
}
/* All right, inform ops... */
- sendto_opmask_butone(0, SNO_GLINE, "%s modifying global %s for %s%s%s:%s",
+ non_auto = non_auto || ircd_strncmp(gline->gl_reason, "AUTO", 4);
+ sendto_opmask_butone(0, non_auto ? SNO_GLINE : SNO_AUTO,
+ "%s modifying global %s for %s%s%s:%s",
(feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
cli_name(sptr) : cli_name((cli_user(sptr))->server),
GlineIsBadChan(gline) ? "BADCHAN" : "GLINE",
flags & GLINE_OPERFORCE ? "!" : "", op,
gline->gl_user, gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire - CurrentTime, gline->gl_lastmod,
+ gline->gl_expire - TStime(), gline->gl_lastmod,
gline->gl_lifetime, gline->gl_reason);
/* OK, let's do the G-line... */
GlineIsRemActive(gline) ? '+' : '-', gline->gl_user,
gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire - CurrentTime, gline->gl_lastmod,
+ gline->gl_expire - TStime(), gline->gl_lastmod,
gline->gl_lifetime, gline->gl_reason);
}
if (!GlineIsLocal(gline) && gline->gl_lastmod)
sendcmdto_one(&me, CMD_GLINE, cptr, "* %c%s %Tu %Tu %Tu :%s",
GlineIsRemActive(gline) ? '+' : '-', gline->gl_user,
- gline->gl_expire - CurrentTime, gline->gl_lastmod,
+ gline->gl_expire - TStime(), gline->gl_lastmod,
gline->gl_lifetime, gline->gl_reason);
}
}
GlineIsRemActive(gline) ? '+' : '-', gline->gl_user,
gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire - CurrentTime, gline->gl_lastmod,
+ gline->gl_expire - TStime(), gline->gl_lastmod,
gline->gl_lifetime, gline->gl_reason);
return 0;
send_reply(sptr, RPL_GLIST, gline->gl_user,
gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire + TSoffset, gline->gl_lastmod,
- gline->gl_lifetime + TSoffset,
+ gline->gl_expire, gline->gl_lastmod,
+ gline->gl_lifetime,
GlineIsLocal(gline) ? cli_name(&me) : "*",
gline->gl_state == GLOCAL_ACTIVATED ? ">" :
(gline->gl_state == GLOCAL_DEACTIVATED ? "<" : ""),
send_reply(sptr, RPL_GLIST, gline->gl_user,
gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire + TSoffset, gline->gl_lastmod,
- gline->gl_lifetime + TSoffset,
+ gline->gl_expire, gline->gl_lastmod,
+ gline->gl_lifetime,
GlineIsLocal(gline) ? cli_name(&me) : "*",
gline->gl_state == GLOCAL_ACTIVATED ? ">" :
(gline->gl_state == GLOCAL_DEACTIVATED ? "<" : ""),
gliter(BadChanGlineList, gline, sgline) {
send_reply(sptr, RPL_GLIST, gline->gl_user, "", "",
- gline->gl_expire + TSoffset, gline->gl_lastmod,
- gline->gl_lifetime + TSoffset,
+ gline->gl_expire, gline->gl_lastmod,
+ gline->gl_lifetime,
GlineIsLocal(gline) ? cli_name(&me) : "*",
gline->gl_state == GLOCAL_ACTIVATED ? ">" :
(gline->gl_state == GLOCAL_DEACTIVATED ? "<" : ""),
send_reply(sptr, RPL_STATSGLINE, 'G', gline->gl_user,
gline->gl_host ? "@" : "",
gline->gl_host ? gline->gl_host : "",
- gline->gl_expire + TSoffset, gline->gl_lastmod,
- gline->gl_lifetime + TSoffset,
+ gline->gl_expire, gline->gl_lastmod,
+ gline->gl_lifetime,
gline->gl_state == GLOCAL_ACTIVATED ? ">" :
(gline->gl_state == GLOCAL_DEACTIVATED ? "<" : ""),
GlineIsRemActive(gline) ? '+' : '-',