コード例 #1
0
ファイル: jupe.c プロジェクト: Niichan/snircd
/** Send a jupe (or a list of jupes) to a server.
 * @param[in] sptr Client searching for jupes.
 * @param[in] server Name of jupe to search for (if NULL, list all).
 * @return Zero.
 */
int
jupe_list(struct Client *sptr, char *server)
{
  struct Jupe *jupe;
  struct Jupe *sjupe;

  if (server) {
    if (!(jupe = jupe_find(server))) /* no such jupe */
      return send_reply(sptr, ERR_NOSUCHJUPE, server);

    /* send jupe information along */
    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 */
      sjupe = jupe->ju_next;

      if (jupe->ju_expire <= CurrentTime) /* expire any that need expiring */
	jupe_free(jupe);
      else /* send jupe information along */
	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 */
  return send_reply(sptr, RPL_ENDOFJUPELIST);
}
コード例 #2
0
/*
 * ms_jupe - server message handler
 *
 * parv[0] = Send prefix
 *
 * From server:
 *
 * parv[1] = Target: server numeric or *
 * parv[2] = (+|-)<server name>
 * parv[3] = Expiration offset
 * parv[4] = Last modification time
 * parv[5] = Comment
 *
 */
int ms_jupe(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
    struct Client *acptr = 0;
    struct Jupe *ajupe;
    unsigned int flags = 0;
    time_t expire_off, lastmod;
    char *server = parv[2], *target = parv[1], *reason = parv[5];

    if (parc < 6)
        return need_more_params(sptr, "JUPE");

    if (!(target[0] == '*' && target[1] == '\0')) {
        if (!(acptr = FindNServer(target)))
            return 0; /* no such server */

        if (!IsMe(acptr)) { /* manually propagate, since we don't set it */
            sendcmdto_one(sptr, CMD_JUPE, acptr, "%s %s %s %s :%s", target, server,
                          parv[3], parv[4], reason);
            return 0;
        }

        flags |= JUPE_LOCAL;
    }

    if (*server == '-')
        server++;
    else if (*server == '+') {
        flags |= JUPE_ACTIVE;
        server++;
    }

    expire_off = atoi(parv[3]);
    lastmod = atoi(parv[4]);

    ajupe = jupe_find(server);

    if (ajupe) {
        if (JupeIsLocal(ajupe) && !(flags & JUPE_LOCAL)) /* global over local */
            jupe_free(ajupe);
        else if (JupeLastMod(ajupe) < lastmod) { /* new modification */
            if (flags & JUPE_ACTIVE)
                return jupe_activate(cptr, sptr, ajupe, lastmod, flags);
            else
                return jupe_deactivate(cptr, sptr, ajupe, lastmod, flags);
        } else if (JupeLastMod(ajupe) == lastmod || IsBurstOrBurstAck(cptr))
            return 0;
        else
            return jupe_resend(cptr, ajupe); /* other server desynched WRT jupes */
    }

    return jupe_add(cptr, sptr, server, reason, expire_off, lastmod, flags);
}
コード例 #3
0
ファイル: jupe.c プロジェクト: Niichan/snircd
/** Deactivate a jupe.
 * @param[in] cptr Local client that sent us the jupe.
 * @param[in] sptr Originator of the jupe.
 * @param[in] jupe Jupe to deactivate.
 * @param[in] lastmod New timestamp for last modification of the jupe.
 * @param[in] flags Flags to set on the jupe.
 * @return Zero.
 */
int
jupe_deactivate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
		time_t lastmod, unsigned int flags)
{
  unsigned int saveflags = 0;

  assert(0 != jupe);

  saveflags = jupe->ju_flags;

  if (!JupeIsLocal(jupe)) {
    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 ((saveflags & JUPE_ACTMASK) != JUPE_ACTIVE)
      return 0; /* was inactive to begin with */
  }

  /* Inform ops and log it */
  sendto_opmask_butone(0, SNO_NETWORK, "%s %s JUPE for %s, expiring at %Tu: "
		       "%s",
                       (feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
                         cli_name(sptr) :
                         cli_name((cli_user(sptr))->server),
		       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 if (!(flags & JUPE_LOCAL)) /* don't propagate local changes */
    propagate_jupe(cptr, sptr, jupe);

  return 0;
}
コード例 #4
0
ファイル: jupe.c プロジェクト: Niichan/snircd
/** Find a jupe by name.
 * @param[in] server %Jupe name to search for.
 * @return Matching jupe (or NULL if none match).
 */
struct Jupe *
jupe_find(char *server)
{
  struct Jupe* jupe;
  struct Jupe* sjupe;

  for (jupe = GlobalJupeList; jupe; jupe = sjupe) { /* go through jupes */
    sjupe = jupe->ju_next;

    if (jupe->ju_expire <= CurrentTime) /* expire any that need expiring */
      jupe_free(jupe);
    else if (0 == ircd_strcmp(server, jupe->ju_server)) /* found it yet? */
      return jupe;
  }

  return 0;
}
コード例 #5
0
ファイル: jupe.c プロジェクト: Niichan/snircd
/** Send the full list of active global jupes to \a cptr.
 * @param[in] cptr Local server to send jupes to.
 */
void
jupe_burst(struct Client *cptr)
{
  struct Jupe *jupe;
  struct Jupe *sjupe;

  for (jupe = GlobalJupeList; jupe; jupe = sjupe) { /* go through jupes */
    sjupe = jupe->ju_next;

    if (jupe->ju_expire <= CurrentTime) /* expire any that need expiring */
      jupe_free(jupe);
    else if (!JupeIsLocal(jupe)) /* forward global jupes */
      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);
  }
}
コード例 #6
0
/*
 * mo_jupe - oper message handler
 *
 * parv[0] = Send prefix
 * parv[1] = [[+|-]<server name>]
 *
 * Local (to me) style:
 *
 * parv[2] = [Expiration offset]
 * parv[3] = [Comment]
 *
 * Global (or remote local) style:
 *
 * parv[2] = [target]
 * parv[3] = [Expiration offset]
 * parv[4] = [Comment]
 *
 */
int mo_jupe(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
    struct Client *acptr = 0;
    struct Jupe *ajupe;
    unsigned int flags = 0;
    time_t expire_off;
    char *server = parv[1], *target = 0, *reason;

    if (parc < 2)
        return jupe_list(sptr, 0);

    if (*server == '+') {
        flags |= JUPE_ACTIVE;
        server++;
    } else if (*server == '-')
        server++;
    else
        return jupe_list(sptr, server);

    if (!feature_bool(FEAT_CONFIG_OPERCMDS))
        return send_reply(sptr, ERR_DISABLED, "JUPE");

    if (parc == 4) {
        expire_off = atoi(parv[2]);
        reason = parv[3];
        flags |= JUPE_LOCAL;
    } else if (parc > 4) {
        target = parv[2];
        expire_off = atoi(parv[3]);
        reason = parv[4];
    } else
        return need_more_params(sptr, "JUPE");

    if (target) {
        if (!(target[0] == '*' && target[1] == '\0')) {
            if (!(acptr = find_match_server(target)))
                return send_reply(sptr, ERR_NOSUCHSERVER, target);

            if (!IsMe(acptr)) { /* manually propagate, since we don't set it */
                if (!HasPriv(sptr, PRIV_JUPE))
                    return send_reply(sptr, ERR_NOPRIVILEGES);

                sendcmdto_one(sptr, CMD_JUPE, acptr, "%C %c%s %s %Tu :%s", acptr,
                              flags & JUPE_ACTIVE ? '+' : '-', server, parv[3],
                              TStime(), reason);
                return 0;
            } else if (!HasPriv(sptr, PRIV_LOCAL_JUPE))
                return send_reply(sptr, ERR_NOPRIVILEGES);

            flags |= JUPE_LOCAL;
        } else if (!HasPriv(sptr, PRIV_JUPE))
            return send_reply(sptr, ERR_NOPRIVILEGES);
    }

    ajupe = jupe_find(server);

    if (ajupe) {
        if (JupeIsLocal(ajupe) && !(flags & JUPE_LOCAL)) /* global over local */
            jupe_free(ajupe);
        else {
            if (flags & JUPE_ACTIVE)
                return jupe_activate(cptr, sptr, ajupe, TStime(), flags);
            else
                return jupe_deactivate(cptr, sptr, ajupe, TStime(), flags);
        }
    }

    return jupe_add(cptr, sptr, server, reason, expire_off, TStime(), flags);
}