added basic ssl support to ircu
[ircu2.10.12-pk.git] / ircd / m_jupe.c
index 6541d046cc9ce867442bfb532fed53360a213227..51f219f53023dad24147d2ad8596ee23a3ac3a08 100644 (file)
  *            note:   it is guaranteed that parv[0]..parv[parc-1] are all
  *                    non-NULL pointers.
  */
-#if 0
-/*
- * No need to include handlers.h here the signatures must match
- * and we don't need to force a rebuild of all the handlers everytime
- * we add a new one to the list. --Bleep
- */
-#include "handlers.h"
-#endif /* 0 */
+#include "config.h"
+
 #include "client.h"
 #include "jupe.h"
 #include "hash.h"
 #include "ircd.h"
+#include "ircd_features.h"
+#include "ircd_log.h"
 #include "ircd_reply.h"
 #include "ircd_string.h"
 #include "match.h"
 #include "s_conf.h"
 #include "s_misc.h"
 #include "send.h"
-#include "support.h"
 
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
 #include <stdlib.h>
 #include <string.h>
 
@@ -125,7 +120,7 @@ int ms_jupe(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 {
   struct Client *acptr = 0;
   struct Jupe *ajupe;
-  int local = 0, active = 1;
+  unsigned int flags = 0;
   time_t expire_off, lastmod;
   char *server = parv[2], *target = parv[1], *reason = parv[5];
 
@@ -137,24 +132,18 @@ int ms_jupe(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
       return 0; /* no such server */
 
     if (!IsMe(acptr)) { /* manually propagate, since we don't set it */
-      if (IsServer(sptr))
-       sendto_one(acptr, "%s " TOK_JUPE " %s %s %s %s :%s", NumServ(sptr),
-                  target, server, parv[3], parv[4], reason);
-      else
-       sendto_one(acptr, "%s%s " TOK_JUPE " %s %s %s %s :%s", NumNick(sptr),
-                  target, server, parv[3], parv[4], reason);
-
+      sendcmdto_one(sptr, CMD_JUPE, acptr, "%s %s %s %s :%s", target, server,
+                   parv[3], parv[4], reason);
       return 0;
     }
 
-    local = 1;
+    flags |= JUPE_LOCAL;
   }
 
-  if (*server == '-') {
-    active = 0;
+  if (*server == '-')
     server++;
-  else if (*server == '+') {
-    active = 1;
+  else if (*server == '+') {
+    flags |= JUPE_ACTIVE;
     server++;
   }
 
@@ -164,103 +153,109 @@ int ms_jupe(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   ajupe = jupe_find(server);
 
   if (ajupe) {
-    if (JupeIsLocal(ajupe) && !local) /* global jupes override local ones */
+    if (JupeIsLocal(ajupe) && !(flags & JUPE_LOCAL)) /* global over local */
       jupe_free(ajupe);
     else if (JupeLastMod(ajupe) < lastmod) { /* new modification */
-      if (active)
-       return jupe_activate(cptr, sptr, ajupe, lastmod);
+      if (flags & JUPE_ACTIVE)
+       return jupe_activate(cptr, sptr, ajupe, lastmod, flags);
       else
-       return jupe_deactivate(cptr, sptr, ajupe, lastmod);
-    } else if (JupeLastMod(ajupe) == lastmod) /* no changes */
+       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, local,
-                 active);
+  return jupe_add(cptr, sptr, server, reason, expire_off, lastmod, flags);
 }
 
 /*
  * mo_jupe - oper message handler
  *
  * parv[0] = Send prefix
+ * parv[1] = [[+|-]<server name>]
  *
- * From oper:
+ * Local (to me) style:
+ *
+ * parv[2] = [Expiration offset]
+ * parv[3] = [Comment]
+ *
+ * Global (or remote local) style:
  *
- * parv[1] = [[+|-]<server name>]
  * parv[2] = [target]
  * parv[3] = [Expiration offset]
  * parv[4] = [Comment]
  *
  */
-#ifdef CONFIG_OPERCMDS
 int mo_jupe(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 {
   struct Client *acptr = 0;
   struct Jupe *ajupe;
-  int local = 0, active = 1;
+  unsigned int flags = 0;
   time_t expire_off;
-  char *server = parv[1], *target = parv[2], *reason = parv[4];
+  char *server = parv[1], *target = 0, *reason;
 
   if (parc < 2)
     return jupe_list(sptr, 0);
 
   if (*server == '+') {
-    active = 1;
+    flags |= JUPE_ACTIVE;
     server++;
-  } else if (*server == '-') {
-    active = 0;
+  } else if (*server == '-')
     server++;
-  else
+  else
     return jupe_list(sptr, server);
 
-  if (parc < 5)
+  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[0] == '*' && target[1] == '\0')) {
-    if (!(acptr = find_match_server(target))) {
-      sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], target);
-      return 0;
-    }
+  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 (!IsOper(sptr)) {
-       sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
-       return 0;
-      }
+      if (!IsMe(acptr)) { /* manually propagate, since we don't set it */
+       if (!HasPriv(sptr, PRIV_JUPE))
+         return send_reply(sptr, ERR_NOPRIVILEGES);
 
-      sendto_one(acptr, "%s%s " TOK_JUPE " %s %c%s %s " TIME_T_FMT " :%s",
-                NumNick(sptr), NumServ(acptr), active ? '+' : '-', server,
-                parv[3], TStime(), reason);
-      return 0;
-    }
+       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);
 
-    local = 1;
-  } else if (!IsOper(sptr)) {
-    sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
-    return 0;
+      flags |= JUPE_LOCAL;
+    } else if (!HasPriv(sptr, PRIV_JUPE))
+      return send_reply(sptr, ERR_NOPRIVILEGES);
   }
 
-  expire_off = atoi(parv[3]);
-
   ajupe = jupe_find(server);
 
   if (ajupe) {
-    if (JupeIsLocal(ajupe) && !local) /* global jupes override local ones */
+    if (JupeIsLocal(ajupe) && !(flags & JUPE_LOCAL)) /* global over local */
       jupe_free(ajupe);
     else {
-      if (active)
-       return jupe_activate(cptr, sptr, ajupe, TStime());
+      if (flags & JUPE_ACTIVE)
+       return jupe_activate(cptr, sptr, ajupe, TStime(), flags);
       else
-       return jupe_deactivate(cptr, sptr, ajupe, TStime());
+       return jupe_deactivate(cptr, sptr, ajupe, TStime(), flags);
     }
   }
 
-  return jupe_add(cptr, sptr, server, reason, expire_off, TStime(), local,
-                 active);
+  return jupe_add(cptr, sptr, server, reason, expire_off, TStime(), flags);
 }
-#endif /* CONFIG_OPERCMDS */
 
 /*
  * m_jupe - user message handler