Pārlūkot izejas kodu

Merge branch 'export-auth' into new-master

* export-auth:
  * Remove old msgc binds
  * Automatically trim out '+OK ' when decrypting FiSH
  * Add 'cq' as an alias for 'clearqueue play'
  * Update docs
  * Fix up op/deop/voice/devoice/kick/kickban/invite for auth control
  * Minor relay fix
  * Export all cmds to auth system which have AUTH
  * Return bind check result for dcc
  * Export down/cycle/mmode/clearqueue
  * When viewing help over auth, only show allowed commands
  * Support floodless time count in play
  * Send auth responses in notice if triggered from chan. Privmsg if from msg
Bryan Drewery 16 gadi atpakaļ
vecāks
revīzija
f7dcf2a5a1

+ 3 - 0
doc/UPDATES

@@ -1,3 +1,5 @@
+* More Auth commands are now available. Auth up and run +help to see them all.
+
 1.3 - http://wraith.botpack.net/milestone/1.3
 * Binary / shell / startup changes
   * Binary error messages are no longer obscure numbers or fake segfaults. (Compile with OBSCURE_ERRORS to re-enable)
@@ -94,6 +96,7 @@
   * Removed 'set chanset' as it has been replaced by 'chanset default'
   * Add new channel setting 'ban-type' which support mIRC style ban types (adapted from recent eggdrop patch)
   * EFnet server list updates (To update yours: .set -YES servers - | .set -YES servers6 -)
+  * Default alias updates (To update yours: .set -YES alias - ) 'cq' added as an alias to 'clearqueue play' to stop .play
   * EFnet's CSIRCD servers have been removed as they have proven to be highly incompatible with Ratbox features. (irc.nac.net/irc.efnet.no)
   * Give localhubs credit for adding their child bots in 'whois'.
   * Ident lookup timeout is now 5 seconds (will speed up linking / partyline connecting)

+ 1 - 0
doc/settings.txt

@@ -4,6 +4,7 @@ bl botcmd ?
 bm botmsg
 bs botset 
 op botcmd ? op
+cq clearqueue play
 +list set +
 -list set -
 list set list

+ 5 - 5
src/auth.c

@@ -185,7 +185,7 @@ sdprintf(STR("GETIDX: auth: %s, idx: %d"), nick, idx);
       idx = -1;
     else {
       sdprintf(STR("FIRST FOUND: %d"), idx);
-      strlcpy(dcc[idx].simulbot, chname ? chname : nick, sizeof(dcc[idx].simulbot));
+      strlcpy(dcc[idx].simulbot, nick, sizeof(dcc[idx].simulbot));
       strlcpy(dcc[idx].u.chat->con_chan, chname ? chname : "*", sizeof(dcc[idx].u.chat->con_chan));
       return 1;
     }
@@ -200,7 +200,7 @@ sdprintf(STR("GETIDX: auth: %s, idx: %d"), nick, idx);
       putlog(LOG_DEBUG, "*", STR("Simul found old idx for %s/%s: (%s!%s)"), nick, chname, nick, host);
       dcc[i].simultime = now;
       idx = i;
-      strlcpy(dcc[idx].simulbot, chname ? chname : nick, sizeof(dcc[idx].simulbot));
+      strlcpy(dcc[idx].simulbot, nick, sizeof(dcc[idx].simulbot));
       strlcpy(dcc[idx].u.chat->con_chan, chname ? chname : "*", sizeof(dcc[idx].u.chat->con_chan));
 
       return 1;
@@ -217,7 +217,7 @@ sdprintf(STR("GETIDX: auth: %s, idx: %d"), nick, idx);
     dcc[idx].simul = 0;		/* not -1, so it's cleaned up later */
     dcc[idx].status = STAT_COLOR;
     dcc[idx].u.chat->con_flags = 0;
-    strlcpy(dcc[idx].simulbot, chname ? chname : nick, sizeof(dcc[idx].simulbot));
+    strlcpy(dcc[idx].simulbot, nick, sizeof(dcc[idx].simulbot));
     strlcpy(dcc[idx].u.chat->con_chan, chname ? chname : "*", sizeof(dcc[idx].u.chat->con_chan));
     dcc[idx].u.chat->strip_flags = STRIP_ALL;
     strlcpy(dcc[idx].nick, handle, sizeof(dcc[idx].nick));
@@ -260,7 +260,7 @@ void makehash(struct userrec *u, const char *randstring, char *out, size_t out_s
   OPENSSL_cleanse(hash, sizeof(hash));
 }
 
-void check_auth_dcc(Auth *auth, const char *cmd, const char *par)
+int check_auth_dcc(Auth *auth, const char *cmd, const char *par)
 {
-  real_check_bind_dcc(cmd, auth->idx, par, auth);
+  return real_check_bind_dcc(cmd, auth->idx, par, auth);
 }

+ 1 - 1
src/auth.h

@@ -52,6 +52,6 @@ class Auth {
 
 void makehash(struct userrec *u, const char *randstring, char *out, size_t out_size);
 
-void check_auth_dcc(Auth *, const char *, const char *);
+int check_auth_dcc(Auth *, const char *, const char *);
 
 #endif /* !_AUTH_H */

+ 1 - 0
src/binds.c

@@ -430,6 +430,7 @@ void add_builtins(const char *table_name, cmd_t *cmds)
                 /* add BT_dcc cmds to cmdlist[] :: add to the help system.. */
                 if (!strcmp(table->name, "dcc") && (findhelp(cmds->name) != NULL)) {
                   cmdlist[cmdi].name = cmds->name;
+				  cmdlist[cmdi].type = cmds->type;
                   cmdlist[cmdi].flags.match = FR_GLOBAL | FR_CHAN;
                   break_down_flags(cmds->flags, &(cmdlist[cmdi].flags), NULL);
                   cmdi++;

+ 3 - 0
src/cmds.c

@@ -672,6 +672,9 @@ static void cmd_help(int idx, char *par)
     for (n = 0; n < cmdi; n++) { /* loop each command */
       if (!flagrec_ok(&cmdlist[n].flags, &fr) || !wild_match(match, (char *) cmdlist[n].name))
         continue;
+      // Auth?
+      if (!(!dcc[idx].irc || (dcc[idx].irc && (cmdlist[n].type & AUTH_ALL))))
+        continue;
       fnd++;
       if (nowild) {
         flg[0] = 0;

+ 1 - 0
src/cmds.h

@@ -23,6 +23,7 @@ typedef struct {
 typedef struct {
         const char *name;
         struct flag_record     flags;
+        int type;
 } mycmds;
 
 typedef struct {

+ 8 - 7
src/core_binds.c

@@ -167,12 +167,12 @@ bool check_aliases(int idx, const char *cmd, const char *args)
   return found;
 }
 
-void check_bind_dcc(const char *cmd, int idx, const char *text)
+int check_bind_dcc(const char *cmd, int idx, const char *text)
 {
-  real_check_bind_dcc(cmd, idx, text, NULL);
+  return real_check_bind_dcc(cmd, idx, text, NULL);
 }
 
-void real_check_bind_dcc(const char *cmd, int idx, const char *text, Auth *auth)
+int real_check_bind_dcc(const char *cmd, int idx, const char *text, Auth *auth)
 {
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   bind_entry_t *entry = NULL;
@@ -218,13 +218,13 @@ void real_check_bind_dcc(const char *cmd, int idx, const char *text, Auth *auth)
               putlog(LOG_CMDS, "*", "$ #%s# %s **hidden** %s", dcc[idx].nick, entry->mask, p && *p ? p : "");
               putlog(LOG_MISC, "*", "%s attempted %s%s with missing or incorrect command password", dcc[idx].nick, settings.dcc_prefix, entry->mask);
               free(args);
-              return;
+              return 0;
             }
           } else {
             putlog(LOG_CMDS, "*", "! #%s# %s %s", dcc[idx].nick, cmd, args);
             dprintf(idx, "What?  You need '%shelp'\n", (dcc[idx].u.chat->channel >= 0) ? settings.dcc_prefix : "");
             free(args);
-            return;
+            return 0;
           }
         }
         break;
@@ -234,13 +234,13 @@ void real_check_bind_dcc(const char *cmd, int idx, const char *text, Auth *auth)
 
   if (entry && auth) {
     if (!(entry->cflags & AUTH))
-      return;
+      return 0;
   }
 
   hits = 0;
   bool log_bad = 0;
 
-  check_bind_hits(BT_dcc, cmd, &fr, &hits, idx, args);
+  int ret = check_bind_hits(BT_dcc, cmd, &fr, &hits, idx, args);
 
   if (hits != 1)
     log_bad = 1;
@@ -258,6 +258,7 @@ void real_check_bind_dcc(const char *cmd, int idx, const char *text, Auth *auth)
     putlog(LOG_CMDS, "*", "! #%s# %s %s", dcc[idx].nick, cmd, args);
 
   free(args);
+  return ret;
 }
 
 void check_bind_bot(const char *nick, const char *code, const char *param)

+ 2 - 2
src/core_binds.h

@@ -5,8 +5,8 @@
 
 void core_binds_init();
 void check_bind_time(struct tm *tm);
-void check_bind_dcc(const char *, int, const char *);
-void real_check_bind_dcc(const char *, int, const char *, Auth *);
+int check_bind_dcc(const char *, int, const char *);
+int real_check_bind_dcc(const char *, int, const char *, Auth *);
 void check_bind_bot(const char *, const char *, const char *);
 void check_bind_chon(char *, int);
 void check_bind_chof(char *, int);

+ 3 - 0
src/crypto/bf_util.c

@@ -91,6 +91,9 @@ bd::String egg_bf_encrypt(bd::String in, const bd::String& key)
  */
 bd::String egg_bf_decrypt(bd::String in, const bd::String& key)
 {
+  // Skip over '+OK '
+  if (in(0, 4) == "+OK ")
+    in += 4;
   bd::String out(size_t(in.length() * .9));
   // Too small to process
   if (in.size() < 12) return out;

+ 4 - 1
src/dccutil.c

@@ -344,7 +344,10 @@ dprintf_real(int idx, char* buf, size_t len, size_t bufsiz)
 
 //      simple_snprintf(ircbuf, size, "PRIVMSG %s :%s", dcc[idx].simulbot, buf);
 //      tputs(dcc[idx].sock, ircbuf, strlen(ircbuf));
-      privmsg(dcc[idx].simulbot, buf, DP_HELP);
+      if (!strcmp(dcc[idx].u.chat->con_chan, "*"))
+        privmsg(dcc[idx].simulbot, buf, DP_HELP);
+      else
+        notice(dcc[idx].simulbot, buf, DP_HELP);
 //      free(ircbuf);
     } else {
       if (dcc[idx].type && ((long) (dcc[idx].type->output) == 1)) {

+ 1 - 1
src/eggdrop.h

@@ -154,7 +154,7 @@ enum {		/* TAKE A GUESS */
 #define AUTH_CHAN	BIT3
 #define AUTH_MSG	BIT4
 #define AUTH_NOT	BIT5
-#define AUTH_ALL	AUTH|AUTH_CHAN|AUTH_MSG|AUTH_NOT
+#define AUTH_ALL	(AUTH|AUTH_CHAN|AUTH_MSG|AUTH_NOT)
 #define have_cmd(name, flags) ((!is_restricted_cmd(name)) && (!(flags & (HUB|LEAF)) || (flags & HUB && conf.bot->hub) || (flags & LEAF && !conf.bot->hub)))
 
 

+ 2 - 1
src/log.c

@@ -39,6 +39,7 @@
 #include "users.h"
 #include "misc.h"
 #include "main.h"
+#include "chanprog.h"
 
 #include <ctype.h>
 #include <stdarg.h>
@@ -342,7 +343,7 @@ irc_log(struct chanset_t *chan, const char *format, ...)
   egg_vsnprintf(va_out, sizeof(va_out), format, va);
   va_end(va);
 
-  if ((chan && strcasecmp(chan->dname, "#...")) || !chan) {
+  if ((chan && strcasecmp(chan->dname, relay_chan)) || !chan) {
     bd::String msg;
     msg.printf("[%s] %s", chan ? chan->dname : "*" , va_out);
     privmsg(relay_chan, msg.c_str(), DP_HELP);

+ 2 - 2
src/mod/channels.mod/cmdschan.c

@@ -1422,8 +1422,8 @@ static cmd_t C_dcc_channels[] =
   {"chaninfo",	"m|m",	(Function) cmd_chaninfo,	NULL, 0},
   {"chanset",	"m|m",	(Function) cmd_chanset,		NULL, 0},
   {"chinfo",	"m|m",	(Function) cmd_chinfo,		NULL, 0},
-  {"cycle", 	"n|n",	(Function) cmd_cycle,		NULL, 0},
-  {"down",	"n|n",	(Function) cmd_down,		NULL, 0},
+  {"cycle", 	"n|n",	(Function) cmd_cycle,		NULL, AUTH},
+  {"down",	"n|n",	(Function) cmd_down,		NULL, AUTH},
   {"info",	"",	(Function) cmd_info,		NULL, 0},
   {"checkchannels", "n",    (Function) cmd_checkchannels,	NULL, HUB},
   {"slowjoin",  "n",    (Function) cmd_slowjoin,	NULL, 0},

+ 65 - 94
src/mod/irc.mod/cmdsirc.c

@@ -26,14 +26,20 @@
 
 #include <bdlib/src/Stream.h>
 #include <bdlib/src/String.h>
+#include <algorithm>
 #include "src/misc_file.h"
 
 /* Do we have any flags that will allow us ops on a channel?
  */
-static struct chanset_t *get_channel(int idx, char *chname, bool check_console = 1)
+static struct chanset_t *get_channel(int idx, char *chname, bool check_console = 1, bool* all = NULL)
 {
   struct chanset_t *chan = NULL;
 
+  if (all && ((chname && chname[0] && !strcmp(chname, "*")) || (check_console && !(chname && chname[0]) && !strcmp(dcc[idx].u.chat->con_chan, "*")))) {
+    *all = 1;
+    return NULL;
+  }
+
   if (chname && chname[0]) {
     chan = findchan_by_dname(chname);
     if (chan)
@@ -72,15 +78,12 @@ static int has_op(int idx, struct chanset_t *chan)
  */
 char *getnick(const char *handle, struct chanset_t *chan)
 {
-  struct userrec *u = NULL;
-  char s[UHOSTLEN] = "";
-
   for (register memberlist *m = chan->channel.member; m && m->nick[0]; m = m->next) {
-    simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
-    if ((u = get_user_by_host(s)) && !strcasecmp(u->handle, handle))
+    member_getuser(m);
+    if (m->user && !strcasecmp(m->user->handle, handle))
       return m->nick;
   }
-  return NULL;
+  return "";
 }
 
 static void cmd_act(int idx, char *par)
@@ -219,23 +222,16 @@ static void cmd_kickban(int idx, char *par)
     return;
   }
 
-  struct chanset_t *chan = NULL;
   char *chname = NULL;
   bool all = 0;
 
-  if (par[0] == '*' && par[1] == ' ') {
-    all = 1;
-    newsplit(&par);
-  } else {
-    if (strchr(CHANMETA, par[0]) != NULL)
-      chname = newsplit(&par);
-    else
-      chname = 0;
-    chan = get_channel(idx, chname);
-    if (!chan || !has_op(idx, chan))
-      return;
-  }
-
+  if (strchr(CHANMETA, par[0]))
+    chname = newsplit(&par);
+  else
+    chname = NULL;
+  struct chanset_t* chan = get_channel(idx, chname, 1, &all);
+  if (!all && !chan)
+    return;
 
   putlog(LOG_CMDS, "*", "#%s# (%s) kickban %s", dcc[idx].nick, all ? "*" : chan->dname, par);
 
@@ -346,18 +342,14 @@ static void cmd_kickban(int idx, char *par)
 
 static void cmd_voice(int idx, char *par)
 {
-  char *nick = newsplit(&par);
-  struct chanset_t *chan = NULL;
+  char *nick = newsplit(&par), *chname = newsplit(&par);
+  if (strchr(CHANMETA, nick[0]) || (!chname[0] && !strcmp(nick, "*")))
+    std::swap(nick, chname);
   bool all = 0;
 
-  if (par[0] == '*' && !par[1]) {
-    all = 1;
-    newsplit(&par);
-  } else {
-    chan = get_channel(idx, par);
-    if (!chan || !has_op(idx, chan))
-      return;
-  }
+  struct chanset_t* chan = get_channel(idx, chname, 1, &all);
+  if (!all && !chan)
+    return;
 
   memberlist *m = NULL;
 
@@ -365,7 +357,7 @@ static void cmd_voice(int idx, char *par)
     chan = chanset;
   putlog(LOG_CMDS, "*", "#%s# (%s) voice %s", dcc[idx].nick, all ? "*" : chan->dname , nick);
   while (chan) {
-    if (!nick[0] && !(nick = getnick(dcc[idx].nick, chan))) {
+    if (!nick[0] && !(nick = getnick(dcc[idx].nick, chan))[0]) {
       if (all) goto next;
       dprintf(idx, "Usage: voice <nick> [channel|*]\n");
       return;
@@ -414,18 +406,14 @@ static void cmd_voice(int idx, char *par)
 
 static void cmd_devoice(int idx, char *par)
 {
-  struct chanset_t *chan = NULL;
-  char *nick = newsplit(&par);
+  char *nick = newsplit(&par), *chname = newsplit(&par);
+  if (strchr(CHANMETA, nick[0]) || (!chname[0] && !strcmp(nick, "*")))
+    std::swap(nick, chname);
   bool all = 0;
 
-  if (par[0] == '*' && !par[1]) {
-    all = 1;
-    newsplit(&par);
-  } else {
-    chan = get_channel(idx, par);
-    if (!chan || !has_op(idx, chan))
-      return;
-  }
+  struct chanset_t* chan = get_channel(idx, chname, 1, &all);
+  if (!all && !chan)
+    return;
 
   memberlist *m = NULL;
 
@@ -433,7 +421,7 @@ static void cmd_devoice(int idx, char *par)
     chan = chanset;
   putlog(LOG_CMDS, "*", "#%s# (%s) devoice %s", dcc[idx].nick, all ? "*" : chan->dname, nick);
   while (chan) {
-  if (!nick[0] && !(nick = getnick(dcc[idx].nick, chan))) {
+  if (!nick[0] && !(nick = getnick(dcc[idx].nick, chan))[0]) {
     if (all) goto next;
     dprintf(idx, "Usage: devoice <nick> [channel|*]\n");
     return;
@@ -487,18 +475,14 @@ static void cmd_release(int idx, char *par) {
 
 static void cmd_op(int idx, char *par)
 {
-  struct chanset_t *chan = NULL;
-  char *nick = newsplit(&par);
+  char *nick = newsplit(&par), *chname = newsplit(&par);
+  if (strchr(CHANMETA, nick[0]) || (!chname[0] && !strcmp(nick, "*")))
+    std::swap(nick, chname);
   bool all = 0;
 
-  if (par[0] == '*' && !par[1]) {
-    all = 1;
-    newsplit(&par);
-  } else {
-    chan = get_channel(idx, par);
-    if (!chan || !has_op(idx, chan))
-      return;
-  }
+  struct chanset_t* chan = get_channel(idx, chname, 1, &all);
+  if (!all && !chan)
+    return;
 
   char s[UHOSTLEN] = "";
   memberlist *m = NULL;
@@ -510,7 +494,7 @@ static void cmd_op(int idx, char *par)
 
   while (chan) {
   get_user_flagrec(dcc[idx].user, &user, chan->dname);
-  if (!nick[0] && !(nick = getnick(dcc[idx].nick, chan))) {
+  if (!nick[0] && !(nick = getnick(dcc[idx].nick, chan))[0]) {
     if (all) goto next;
     dprintf(idx, "Usage: op <nick> [channel|*]\n");
     return;
@@ -977,18 +961,14 @@ static void cmd_mmode(int idx, char *par)
 
 static void cmd_deop(int idx, char *par)
 {
-  struct chanset_t *chan = NULL;
-  char *nick = newsplit(&par);
+  char *nick = newsplit(&par), *chname = newsplit(&par);
+  if (strchr(CHANMETA, nick[0]) || (!chname[0] && !strcmp(nick, "*")))
+    std::swap(nick, chname);
   bool all = 0;
 
-  if (par[0] == '*' && !par[1]) {
-    all = 1;
-    newsplit(&par);
-  } else {
-    chan = get_channel(idx, par);
-    if (!chan || !has_op(idx, chan))
-      return;
-  }
+  struct chanset_t* chan = get_channel(idx, chname, 1, &all);
+  if (!all && !chan)
+    return;
 
   char s[UHOSTLEN] = "";
   memberlist *m = NULL;
@@ -1000,7 +980,7 @@ static void cmd_deop(int idx, char *par)
 
   while (chan) {
     get_user_flagrec(dcc[idx].user, &user, chan->dname);
-    if (!nick[0] && !(nick = getnick(dcc[idx].nick, chan))) {
+    if (!nick[0] && !(nick = getnick(dcc[idx].nick, chan))[0]) {
       if (all) goto next;  
       dprintf(idx, "Usage: deop <nick> [channel|*]\n");
       return;
@@ -1068,22 +1048,16 @@ static void cmd_kick(int idx, char *par)
     return;
   }
 
-  struct chanset_t *chan = NULL;
   char *chname = NULL;
   bool all = 0;
 
-  if (par[0] == '*' && par[1] == ' ') {
-    all = 1;
-    newsplit(&par);
-  } else {
-    if (strchr(CHANMETA, par[0]) != NULL)
-      chname = newsplit(&par);
-    else
-      chname = 0;
-    chan = get_channel(idx, chname);
-    if (!chan || !has_op(idx, chan))
-      return;
-  }
+  if (strchr(CHANMETA, par[0]))
+    chname = newsplit(&par);
+  else
+    chname = NULL;
+  struct chanset_t* chan = get_channel(idx, chname, 1, &all);
+  if (!all && !chan)
+    return;
 
   putlog(LOG_CMDS, "*", "#%s# (%s) kick %s", dcc[idx].nick, all ? "*" : chan->dname, par);
 
@@ -1374,22 +1348,17 @@ static void cmd_find(int idx, char *par)
 
 static void do_invite(int idx, char *par, bool op)
 {
-  struct chanset_t *chan = NULL;
-  memberlist *m = NULL;
+  char *nick = newsplit(&par), *chname = newsplit(&par);
+  if (strchr(CHANMETA, nick[0]) || (!chname[0] && !strcmp(nick, "*")))
+    std::swap(nick, chname);
   bool all = 0;
-  char *nick = NULL;
 
-  if (!par[0])
-    par = dcc[idx].nick;
-  nick = newsplit(&par);
-  if (par[0] == '*' && !par[1]) {
-    all = 1;
-    newsplit(&par);
-  } else {
-    chan = get_channel(idx, par);
-    if (!chan || !has_op(idx, chan))
-      return;
-  }
+  struct chanset_t* chan = get_channel(idx, chname, 1, &all);
+  if (!all && !chan)
+    return;
+
+  memberlist *m = NULL;
+
   if (all)
     chan = chanset;
 
@@ -1967,7 +1936,9 @@ static void cmd_play(int idx, char *par)
   }
   dprintf(idx, "Playing %zu lines from %s to %s\n", lines, par, chan->dname);
   long time_to_play = 0;
-  if (lines < 10)
+  if (floodless)
+    time_to_play = 0;
+  else if (lines < 10)
     time_to_play = 3;
   else
     time_to_play = 3 + ((lines - 10) / 2);
@@ -1992,7 +1963,7 @@ static cmd_t irc_dcc[] =
 #endif /* CACHE */
   {"kick",		"o|o",	 (Function) cmd_kick,		NULL, LEAF|AUTH},
   {"kickban",		"o|o",	 (Function) cmd_kickban,	NULL, LEAF|AUTH},
-  {"mmode",             "n|n",	 (Function) cmd_mmode,		NULL, LEAF},
+  {"mmode",             "n|n",	 (Function) cmd_mmode,		NULL, LEAF|AUTH},
   {"mop",		"n|m",	 (Function) cmd_mop,		NULL, LEAF|AUTH},
   {"msg",		"o",	 (Function) cmd_msg,		NULL, LEAF|AUTH},
   {"nick",		"m",	 (Function) cmd_nick,		NULL, LEAF},

+ 6 - 11
src/mod/irc.mod/irc.c

@@ -1650,23 +1650,19 @@ irc_minutely()
 }
 
 
-int check_bind_authc(char *cmd, Auth *auth, char *chname, char *args)
+int check_bind_authc(char *cmd, Auth *a, char *chname, char *par)
 {
   struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   int x = 0;
 
-  get_user_flagrec(auth->user, &fr, chname);
-  x = check_bind(BT_msgc, cmd, &fr, auth, chname, args);
+  get_user_flagrec(a->user, &fr, chname);
 
-
-  if (x & BIND_RET_LOG) {
-    if (chname)
-      putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %c%s %s", auth->nick, auth->host, 
-                            auth->handle, chname, auth_prefix[0], cmd, args);
-    else
-      putlog(LOG_CMDS, "*", "(%s!%s) !%s! %c%s %s", auth->nick, auth->host, auth->handle, auth_prefix[0], cmd, args);
+  if (a->GetIdx(chname)) {
+    x = check_auth_dcc(a, cmd, par);
   }
 
+  LOGC(cmd);
+
   if (x & BIND_RET_BREAK)
     return (1);
   return (0);
@@ -1778,5 +1774,4 @@ irc_init()
   add_builtins("bot", irc_bot);
   add_builtins("raw", irc_raw);
   add_builtins("msg", C_msg);
-  add_builtins("msgc", C_msgc);
 }

+ 0 - 313
src/mod/irc.mod/msgcmds.c

@@ -282,23 +282,6 @@ static int msg_invite(char *nick, char *host, struct userrec *u, char *par)
   return BIND_RET_BREAK;
 }
 
-static void reply(char *, struct chanset_t *, const char *, ...) __attribute__((format(printf, 3, 4)));
-
-static void reply(char *nick, struct chanset_t *chan, const char *format, ...)
-{
-  va_list va;
-  char buf[1024] = "";
-
-  va_start(va, format);
-  egg_vsnprintf(buf, sizeof buf, format, va);
-  va_end(va);
-
-  if (chan)
-    privmsg(chan->name, buf, DP_HELP);
-  else
-    notice(nick, buf, DP_HELP);
-}
-
 static void logc(const char *cmd, Auth *a, char *chname, char *par)
 {
   if (chname && chname[0])
@@ -491,299 +474,3 @@ static cmd_t C_msg[] =
   {"bewm",		"",	(Function) msg_bewm,		NULL, LEAF},
   {NULL,		NULL,	NULL,				NULL, 0}
 };
-
-static int msgc_test(Auth *a, char *chname, char *par)
-{
-  char *cmd = NULL;
-
-  LOGC("TEST");
-
-  cmd = newsplit(&par);
-
-  if (a->GetIdx(chname)) {
-    check_auth_dcc(a, cmd, par);
-  }
-
-  return BIND_RET_BREAK;
-}
-
-static int msgc_op(Auth *a, char *chname, char *par)
-{
-  struct chanset_t *chan = NULL;
-  struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
-  int force = 0;
-  memberlist *m = NULL;
-
-  if (chname && chname[0]) {
-    chan = findchan_by_dname(chname);
-    if (chan) 
-      m = ismember(chan, a->nick);
-  }
-
-  LOGC("OP");
-
-  if (par[0] == '-') { /* we have an option! */
-    char *tmp = NULL;
-
-    par++;
-    tmp = newsplit(&par);
-    if (!strcasecmp(tmp, "force") || !strcasecmp(tmp, "f")) 
-      force = 1;
-    else {
-      bd::String msg;
-      msg.printf("Invalid option: %s", tmp);
-      notice(a->nick, msg.c_str(), DP_HELP);
-      return 0;
-    }
-  }
-  if (par[0] || chan) {
-    if (!chan)
-      chan = findchan_by_dname(par);
-    if (chan && channel_active(chan)) {
-      get_user_flagrec(a->user, &fr, chan->dname, chan);
-      if (chk_op(fr, chan)) {
-        if (do_op(a->nick, chan, 0, force))
-          stats_add(a->user, 0, 1);
-      }
-      return BIND_RET_BREAK;
-    }
-  } else {
-    for (chan = chanset; chan; chan = chan->next) {
-      get_user_flagrec(a->user, &fr, chan->dname, chan);
-      if (chk_op(fr, chan)) {
-       if (do_op(a->nick, chan, 0, force))
-         stats_add(a->user, 0, 1);
-      }
-    }
-  }
-  return BIND_RET_BREAK;
-}
-
-static int msgc_voice(Auth *a, char *chname, char *par)
-{
-  struct chanset_t *chan = NULL;
-  struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
-  int force = 0;
-  memberlist *m = NULL;
-
-  if (chname && chname[0]) {
-    chan = findchan_by_dname(chname);
-    if (chan) 
-      m = ismember(chan, a->nick);
-  }
-  LOGC("VOICE");
-
-  if (par[0] == '-') { /* we have an option! */
-    char *tmp = NULL;
-
-    par++;
-    tmp = newsplit(&par);
-    if (!strcasecmp(tmp, "force") || !strcasecmp(tmp, "f")) 
-      force = 1;
-    else {
-      bd::String msg;
-      msg.printf("Invalid option: %s", tmp);
-      notice(a->nick, msg.c_str(), DP_HELP);
-      return 0;
-    }
-  }
-  if (par[0] || chan) {
-    if (!chan)
-      chan = findchan_by_dname(par);
-    if (chan && channel_active(chan)) {
-      get_user_flagrec(a->user, &fr, chan->dname, chan);
-      if (!chk_devoice(fr)) {		/* dont voice +q */
-        add_mode(chan, '+', 'v', a->nick);
-      }
-      return BIND_RET_BREAK;
-    }
-  } else {
-    for (chan = chanset; chan; chan = chan->next) {
-      get_user_flagrec(a->user, &fr, chan->dname, chan);
-      if (!chk_devoice(fr)) {		/* dont voice +q */
-        add_mode(chan, '+', 'v', a->nick);
-      }
-    }
-  }
-  return BIND_RET_BREAK;
-}
-
-static int msgc_channels(Auth *a, char *chname, char *par)
-{
-  struct chanset_t *chan = NULL;
-  struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
-  char list[1024] = "";
-
-  LOGC("CHANNELS");
-  for (chan = chanset; chan; chan = chan->next) {
-    get_user_flagrec(a->user, &fr, chan->dname, chan);
-    if (chk_op(fr, chan)) {
-      if (me_op(chan)) 
-        strlcat(list, "@", sizeof(list));
-      strlcat(list, chan->dname, sizeof(list));
-      strlcat(list, " ", sizeof(list));
-    }
-  }
-
-  if (list[0]) 
-    reply(a->nick, NULL, "You have access to: %s\n", list);
-  else
-    reply(a->nick, NULL, "You do not have access to any channels.\n");
-
-  return BIND_RET_BREAK;
-}
-
-static int msgc_getkey(Auth *a, char *chname, char *par)
-{
-  struct chanset_t *chan = NULL;
-  struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
-
-  if (chname && chname[0]) 
-    return 0;
-
-  if (!par[0])
-    return 0;
-
-  LOGC("GETKEY");
-  chan = findchan_by_dname(par);
-  if (chan && channel_active(chan) && !channel_pending(chan)) {
-    get_user_flagrec(a->user, &fr, chan->dname, chan);
-    if (chk_op(fr, chan)) {
-      if (chan->channel.key[0]) {
-        reply(a->nick, NULL, "Key for %s is: %s\n", chan->name, chan->channel.key);
-      } else {
-        reply(a->nick, NULL, "%s has no key set.\n", chan->name);
-      }
-    }
-  }
-  return BIND_RET_BREAK;
-}
-
-static int msgc_help(Auth *a, char *chname, char *par)
-{
-  LOGC("HELP");
-
-  char outbuf[201] = "";
-  struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
-  bind_entry_t *entry = NULL;
-  bind_table_t *table = NULL;
-
-  get_user_flagrec(a->user, &fr, chname ? chname : NULL);
-
-  table = bind_table_lookup("msgc");
-
-  for (entry = table->entries; entry && entry->next; entry = entry->next)
-    if (((chname && chname[0] && entry->cflags & AUTH_CHAN) || 
-        ((!chname || !chname[0]) && entry->cflags & AUTH_MSG)) && flagrec_ok(&entry->user_flags, &fr)) {
-      if (outbuf[0])
-        strlcat(outbuf, " ", sizeof(outbuf));
-      strlcat(outbuf, entry->mask, sizeof(outbuf));
-    }
-
-  reply(a->nick, NULL, "%s\n", outbuf);
-  return BIND_RET_BREAK;
-}
-
-static int msgc_md5(Auth *a, char *chname, char *par)
-{
-  struct chanset_t *chan = NULL;
-
-  LOGC("MD5");
-  if (chname && chname[0])
-    chan = findchan_by_dname(chname);  
-
-  reply(a->nick, chan, "MD5(%s) = %s\n", par, MD5(par));
-  return BIND_RET_BREAK;
-}
-
-static int msgc_sha1(Auth *a, char *chname, char *par)
-{
-  struct chanset_t *chan = NULL;
-
-  LOGC("SHA1");  
-
-  if (chname && chname[0])
-    chan = findchan_by_dname(chname);  
-
-  reply(a->nick, chan, "SHA1(%s) = %s\n", par, SHA1(par));
-  return BIND_RET_BREAK;
-}
-
-static int msgc_sha256(Auth *a, char *chname, char *par)
-{
-  struct chanset_t *chan = NULL;
-
-  LOGC("SHA256");
-
-  if (chname && chname[0])
-    chan = findchan_by_dname(chname);
-
-  reply(a->nick, chan, "SHA256(%s) = %s\n", par, SHA256(par));
-  return BIND_RET_BREAK;
-}
-
-static int msgc_invite(Auth *a, char *chname, char *par)
-{
-  struct chanset_t *chan = NULL;
-  struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
-  int force = 0;
-
-  if (chname && chname[0])
-    return 0;
- 
-  LOGC("INVITE");
-  if (par[0] == '-') {
-    char *tmp = NULL;
-
-    par++;
-    tmp = newsplit(&par);
-    if (!strcasecmp(tmp, "force") || !strcasecmp(tmp, "f")) 
-      force = 1;
-    else {
-      bd::String msg;
-      msg.printf("Invalid option: %s", tmp);
-      notice(a->nick, msg.c_str(), DP_HELP);
-      return 0;
-    }
-  }
-
-  if (par[0] && (!chname || (chname && !chname[0]))) {
-    chan = findchan_by_dname(par);
-    if (chan && channel_active(chan) && !ismember(chan, a->nick)) {
-      if ((!(chan->channel.mode & CHANINV) && force) || (chan->channel.mode & CHANINV)) {
-        get_user_flagrec(a->user, &fr, chan->dname, chan);
-        if (chk_op(fr, chan)) {
-          cache_invite(chan, a->nick, a->host, a->handle, 0, 0);
-        }
-        return BIND_RET_BREAK;
-      }
-    }
-  } else {
-    for (chan = chanset; chan; chan = chan->next) {
-      if (channel_active(chan) && !ismember(chan, a->nick)) {
-        if ((!(chan->channel.mode & CHANINV) && force) || (chan->channel.mode & CHANINV)) {
-          get_user_flagrec(a->user, &fr, chan->dname, chan);
-          if (chk_op(fr, chan)) {
-            cache_invite(chan, a->nick, a->host, a->handle, 0, 0);
-          }
-        }
-      }
-    }
-  }
-  return BIND_RET_BREAK;
-}
-
-static cmd_t C_msgc[] =
-{
-  {"test",		"a",	(Function) msgc_test,		NULL, LEAF|AUTH_CHAN|AUTH_MSG},
-  {"channels",		"",	(Function) msgc_channels,	NULL, LEAF|AUTH_CHAN|AUTH_MSG},
-  {"getkey",		"",	(Function) msgc_getkey,		NULL, LEAF|AUTH_MSG},
-  {"help",		"",	(Function) msgc_help,		NULL, LEAF|AUTH_CHAN|AUTH_MSG},
-  {"invite",		"",	(Function) msgc_invite,		NULL, LEAF|AUTH_MSG},
-  {"md5",		"",	(Function) msgc_md5,		NULL, LEAF|AUTH_MSG|AUTH_CHAN},
-  {"op",		"",	(Function) msgc_op,		NULL, LEAF|AUTH_CHAN|AUTH_MSG},
-  {"sha1",		"",	(Function) msgc_sha1,		NULL, LEAF|AUTH_CHAN|AUTH_MSG},
-  {"sha256",		"",	(Function) msgc_sha256,		NULL, LEAF|AUTH_CHAN|AUTH_MSG},
-  {"voice",		"",	(Function) msgc_voice,		NULL, LEAF|AUTH_CHAN|AUTH_MSG},
-  {NULL,		NULL,	NULL,				NULL, 0}
-};

+ 1 - 1
src/mod/server.mod/cmdsserv.c

@@ -164,7 +164,7 @@ static void cmd_clearqueue(int idx, char *par)
  */
 static cmd_t C_dcc_serv[] =
 {
-  {"clearqueue",	"m",	(Function) cmd_clearqueue,	NULL, LEAF},
+  {"clearqueue",	"m",	(Function) cmd_clearqueue,	NULL, LEAF|AUTH},
   {"dump",		"a",	(Function) cmd_dump,		NULL, LEAF},
   {"jump",		"m",	(Function) cmd_jump,		NULL, LEAF},
   {"servers",		"m",	(Function) cmd_servers,		NULL, LEAF},

+ 1 - 2
src/mod/server.mod/server.c

@@ -123,7 +123,7 @@ static bool replaying_cache = 0;
 
 /* New bind tables. */
 static bind_table_t *BT_raw = NULL, *BT_msg = NULL;
-bind_table_t *BT_ctcr = NULL, *BT_ctcp = NULL, *BT_msgc = NULL;
+bind_table_t *BT_ctcr = NULL, *BT_ctcp = NULL;
 // Ratbox is (5*8):30, ircd-seven is (5*8):20, try to not push th elimits.
 #define SERVER_CONNECT_BURST_TIME 18
 #define SERVER_CONNECT_BURST_RATE 5 * 7
@@ -1166,7 +1166,6 @@ void server_init()
    * globally.
    */
 
-  BT_msgc = bind_table_add("msgc", 3, "Ass", MATCH_FLAGS, 0); // Auth, chname, par
   BT_msg = bind_table_add("msg", 4, "ssUs", MATCH_FLAGS, 0);
   BT_raw = bind_table_add("raw", 2, "ss", 0, BIND_STACKABLE);
   BT_ctcr = bind_table_add("ctcr", 6, "ssUsss", 0, BIND_STACKABLE);

+ 1 - 1
src/mod/server.mod/server.h

@@ -45,7 +45,7 @@ enum {
 	NETT_HYBRID_EFNET	= 4	/* new +e/+I Efnet hybrid.	  */
 };
 
-extern bind_table_t	*BT_ctcp, *BT_ctcr, *BT_msgc;
+extern bind_table_t	*BT_ctcp, *BT_ctcr;
 extern size_t		nick_len;
 extern bool		trigger_on_ignore, floodless, keepnick, in_deaf, in_callerid, have_cprivmsg, have_cnotice;
 extern int 		servidx, ctcp_mode, answer_ctcp, serv, curserv, default_alines;

+ 1 - 1
src/mod/server.mod/servmsg.c

@@ -1550,7 +1550,7 @@ hide_chans(const char *nick, struct userrec *u, char *_channels, bool publicOnly
     if (!chan || 
         
         (!publicOnly && (
-          getnick(u->handle, chan) || 
+          getnick(u->handle, chan)[0] ||
           !(channel_hidden(chan)) || 
           chk_op(fr, chan)
         )) ||