Преглед на файлове

* Port [3131] to 1.2.13
* Fix cmd_chanset accepting invalid flags


svn: 3132

Bryan Drewery преди 19 години
родител
ревизия
11fe137bc1
променени са 6 файла, в които са добавени 42 реда и са изтрити 36 реда
  1. 3 0
      doc/UPDATES
  2. 2 1
      src/chanprog.c
  3. 1 0
      src/chanprog.h
  4. 1 1
      src/mod/channels.mod/channels.h
  5. 1 1
      src/mod/channels.mod/cmdschan.c
  6. 34 33
      src/mod/channels.mod/tclchan.c

+ 3 - 0
doc/UPDATES

@@ -2,6 +2,9 @@ This is a summary of ChangeLog basically.
 Numbers expressed as '#12' are references to a ticket/bug posting which can be viewed at: http://xx.shatow.net
 Lines prefixed with '-' were disabled before release and are not finished, or are planned changes.
 
+1.2.13 - http://wraith.shatow.net/milestone/1.2.13
+* Fix cmd_chanset accepting invalid flags
+
 1.2.12 - http://wraith.shatow.net/milestone/1.2.12
 * Clearing a variable via 'set var -' now resets that variable to default settings. (implements #111)
 * Fix bug introduced from fixing #274

+ 2 - 1
src/chanprog.c

@@ -767,6 +767,7 @@ int do_chanset(char *result, struct chanset_t *chan, const char *options, int lo
   }
 
   if (local & DO_LOCAL) {
+    bool cmd = (local & CMD);
     struct chanset_t *ch = NULL;
     int all = chan ? 0 : 1;
 
@@ -780,7 +781,7 @@ int do_chanset(char *result, struct chanset_t *chan, const char *options, int lo
       int items = 0;
 
       if (SplitList(result, options, &items, &item) == OK) {
-        ret = channel_modify(result, ch, items, (char **) item);
+        ret = channel_modify(result, ch, items, (char **) item, cmd);
       } else 
         ret = ERROR;
 

+ 1 - 0
src/chanprog.h

@@ -5,6 +5,7 @@
 
 #define DO_LOCAL	1
 #define DO_NET		2
+#define CMD		4
 
 int do_chanset(char *, struct chanset_t *, const char *, int);
 void checkchans(int);

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

@@ -42,7 +42,7 @@ bool u_addmask(char type, struct chanset_t *, char *, char *, char *, time_t, in
 int u_sticky_mask(maskrec *, char *);
 int u_setsticky_mask(struct chanset_t *, maskrec *, char *, int, const char);
 int SplitList(char *, const char *, int *, const char ***);
-int channel_modify(char *, struct chanset_t *, int, char **);
+int channel_modify(char *, struct chanset_t *, int, char **, bool);
 int channel_add(char *, char *, char *);
 void clear_channel(struct chanset_t *, bool);
 int u_equals_mask(maskrec *, char *);

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

@@ -1319,7 +1319,7 @@ static void cmd_chanset(int idx, char *par)
 
   putlog(LOG_CMDS, "*", "#%s# chanset (%s) %s", dcc[idx].nick, all ? "*" : chan->dname, par);
   
-  if (do_chanset(result, all ? NULL : chan, par, DO_LOCAL | DO_NET) == ERROR) {
+  if (do_chanset(result, all ? NULL : chan, par, DO_LOCAL | DO_NET | CMD) == ERROR) {
     dprintf(idx, "Error trying to set { %s } on %s: %s\n", par, all ? "all channels" : chan->dname, result);
     return;
   }

+ 34 - 33
src/mod/channels.mod/tclchan.c

@@ -284,7 +284,7 @@ int SplitList(char *resultBuf, const char *list, int *argcPtr, const char ***arg
 
 /* Parse options for a channel.
  */
-int channel_modify(char *result, struct chanset_t *chan, int items, char **item)
+int channel_modify(char *result, struct chanset_t *chan, int items, char **item, bool cmd)
 {
   bool error = 0;
   int old_status = chan->status,
@@ -325,7 +325,7 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item)
       p = replace(item[i], "{", "[");
       p = replace(p, "}", "]");
       strlcpy(chan->topic, p, 121);
-    } else if (!strcmp(item[i], "addedby")) {
+    } else if (!cmd && !strcmp(item[i], "addedby")) {
       i++;
       if (i >= items) {
 	if (result)
@@ -333,7 +333,7 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item)
 	return ERROR;
       }
       strlcpy(chan->added_by, item[i], NICKLEN);
-    } else if (!strcmp(item[i], "addedts")) {
+    } else if (!cmd && !strcmp(item[i], "addedts")) {
       i++;
       if (i >= items) {
 	if (result)
@@ -576,35 +576,36 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item)
 
     /* ignore wasoptest, stopnethack and clearbans in chanfile, remove
        this later */
-    else if (!have_take && !strcmp(item[i], "+take")) ;
-    else if (!have_take && !strcmp(item[i], "-take")) ;
-    else if (!strcmp(item[i], "stopnethack-mode")) ;
-    else if (!strcmp(item[i], "revenge-mode")) ;
-    else if (!strcmp(item[i], "+revenge")) ;
-    else if (!strcmp(item[i], "-revenge")) ;
-    else if (!strcmp(item[i], "+revengebot")) ;
-    else if (!strcmp(item[i], "-revengebot")) ;
-    else if (!strcmp(item[i], "+manop")) ;
-    else if (!strcmp(item[i], "-manop")) ;
-    else if (!strcmp(item[i], "+dontkickops")) ;
-    else if (!strcmp(item[i], "-dontkickops")) ;
-    else if (!strcmp(item[i], "+nomdop"))  ;
-    else if (!strcmp(item[i], "-nomdop"))  ;
-    else if (!strcmp(item[i], "+protectfriends"))  ;
-    else if (!strcmp(item[i], "-protectfriends"))  ;
-    else if (!strcmp(item[i], "+punish"))  ;
-    else if (!strcmp(item[i], "-punish"))  ;
-    else if (!strcmp(item[i], "+seen"))  ;
-    else if (!strcmp(item[i], "-seen"))  ;
-    else if (!strcmp(item[i], "+secret"))  ;
-    else if (!strcmp(item[i], "-secret"))  ;
-    else if (!strcmp(item[i], "-stopnethack"))  ;
-    else if (!strcmp(item[i], "+stopnethack"))  ;
-    else if (!strcmp(item[i], "-wasoptest"))  ;
-    else if (!strcmp(item[i], "+wasoptest"))  ;  /* Eule 01.2000 */
-    else if (!strcmp(item[i], "+clearbans"))  ;
-    else if (!strcmp(item[i], "-clearbans"))  ;
-    else if (!strncmp(item[i], "need-", 5))   ;
+
+    else if (!cmd && !have_take && !strcmp(item[i], "+take")) ;
+    else if (!cmd && !have_take && !strcmp(item[i], "-take")) ;
+    else if (!cmd && !strcmp(item[i], "stopnethack-mode")) ;
+    else if (!cmd && !strcmp(item[i], "revenge-mode")) ;
+    else if (!cmd && !strcmp(item[i], "+revenge")) ;
+    else if (!cmd && !strcmp(item[i], "-revenge")) ;
+    else if (!cmd && !strcmp(item[i], "+revengebot")) ;
+    else if (!cmd && !strcmp(item[i], "-revengebot")) ;
+    else if (!cmd && !strcmp(item[i], "+manop")) ;
+    else if (!cmd && !strcmp(item[i], "-manop")) ;
+    else if (!cmd && !strcmp(item[i], "+dontkickops")) ;
+    else if (!cmd && !strcmp(item[i], "-dontkickops")) ;
+    else if (!cmd && !strcmp(item[i], "+nomdop"))  ;
+    else if (!cmd && !strcmp(item[i], "-nomdop"))  ;
+    else if (!cmd && !strcmp(item[i], "+protectfriends"))  ;
+    else if (!cmd && !strcmp(item[i], "-protectfriends"))  ;
+    else if (!cmd && !strcmp(item[i], "+punish"))  ;
+    else if (!cmd && !strcmp(item[i], "-punish"))  ;
+    else if (!cmd && !strcmp(item[i], "+seen"))  ;
+    else if (!cmd && !strcmp(item[i], "-seen"))  ;
+    else if (!cmd && !strcmp(item[i], "+secret"))  ;
+    else if (!cmd && !strcmp(item[i], "-secret"))  ;
+    else if (!cmd && !strcmp(item[i], "-stopnethack"))  ;
+    else if (!cmd && !strcmp(item[i], "+stopnethack"))  ;
+    else if (!cmd && !strcmp(item[i], "-wasoptest"))  ;
+    else if (!cmd && !strcmp(item[i], "+wasoptest"))  ;  /* Eule 01.2000 */
+    else if (!cmd && !strcmp(item[i], "+clearbans"))  ;
+    else if (!cmd && !strcmp(item[i], "-clearbans"))  ;
+    else if (!cmd && !strncmp(item[i], "need-", 5))   ;
     else if (!strncmp(item[i], "flood-", 6)) {
       int *pthr = NULL;
       time_t *ptime = NULL;
@@ -892,7 +893,7 @@ int channel_add(char *result, char *newname, char *options)
    * if a user goes back to an eggdrop that no-longer supports certain
    * (channel) options.
    */
-  if ((channel_modify(result, chan, items, (char **) item) != OK) && !loading)
+  if ((channel_modify(result, chan, items, (char **) item, 0) != OK) && !loading)
     ret = ERROR;
 
   free(item);