Переглянути джерело

* +autoop
* +O (autoop)
* Fixed various bugs in flags.c


svn: 970

Bryan Drewery 22 роки тому
батько
коміт
2cd59ef8ec

+ 2 - 0
doc/UPDATES

@@ -24,6 +24,8 @@ This is a summary of ChangeLog basically.
 19.Limits were not being set.
 20.No longer chmodding on CYGWIN
 21.The AES core should be slightly faster now.
+22.Added channel flag +autoop (users only, +private accounted for).
+23.Added user flag for autoop (+O).
 
 1.1.5
 

+ 4 - 2
src/chan.h

@@ -145,8 +145,8 @@ struct chanset_t {
   int flood_ctcp_time;
   int flood_nick_thr;
   int flood_nick_time;
-  int status;
-  int ircnet_status;
+  uint32_t status;
+  uint32_t ircnet_status;
   int limitraise;
   int closed_ban;
   int closed_private;
@@ -218,6 +218,7 @@ struct chanset_t {
 #define CHAN_ASKEDMODES     BIT22	/* find out key-info on IRCu          */
 #define CHAN_JUPED          BIT23	/* Is channel juped                   */
 #define CHAN_STOP_CYCLE     BIT24	/* Some efnetservers have defined NO_CHANOPS_WHEN_SPLIT */
+#define CHAN_AUTOOP         BIT25
 
 #define CHAN_ASKED_EXEMPTS  BIT0
 #define CHAN_ASKED_INVITED  BIT1
@@ -263,6 +264,7 @@ struct chanset_t *findchan_by_dname(const char *name);
 #define channel_voice(chan) (chan->status & CHAN_VOICE)
 #define channel_fastop(chan) (chan->status & CHAN_FASTOP)
 #define channel_private(chan) (chan->status & CHAN_PRIVATE)
+#define channel_autoop(chan) (chan->status & CHAN_AUTOOP)
 /* Chanflag template
  *#define channel_temp(chan) (chan->status & CHAN_PRIVATE)
  */

+ 24 - 7
src/flags.c

@@ -34,9 +34,8 @@ void init_flags()
 
 /* Some flags are mutually exclusive -- this roots them out
  */
-int sanity_check(flag_t atr)
+flag_t sanity_check(flag_t atr)
 {
-/* bots shouldnt have +pmcnaijlys */
   if ((atr & USER_BOT) &&
       (atr & (USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA)))
     atr &= ~(USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA);
@@ -46,6 +45,8 @@ int sanity_check(flag_t atr)
     atr &= ~(USER_DOLIMIT | USER_DOVOICE | USER_UPDATEHUB | USER_CHANHUB);
   if ((atr & USER_OP) && (atr & USER_DEOP))
     atr &= ~(USER_OP | USER_DEOP);
+  if ((atr & USER_AUTOOP) && (atr & USER_DEOP))
+    atr &= ~(USER_AUTOOP | USER_DEOP);
   if ((atr & USER_VOICE) && (atr & USER_QUIET))
     atr &= ~(USER_VOICE | USER_QUIET);
  
@@ -70,13 +71,15 @@ int sanity_check(flag_t atr)
 
 /* Sanity check on channel attributes
  */
-int chan_sanity_check(int chatr, int atr)
+flag_t chan_sanity_check(flag_t chatr, flag_t atr)
 {
   /* admin for chan does shit.. */
   if (chatr & USER_ADMIN)
     chatr &= ~(USER_ADMIN);
   if ((chatr & USER_OP) && (chatr & USER_DEOP))
     chatr &= ~(USER_OP | USER_DEOP);
+  if ((chatr & USER_AUTOOP) && (chatr & USER_DEOP))
+    chatr &= ~(USER_AUTOOP | USER_DEOP);
   if ((chatr & USER_VOICE) && (chatr & USER_QUIET))
     chatr &= ~(USER_VOICE | USER_QUIET);
   /* Can't be channel owner without also being channel master */
@@ -156,26 +159,31 @@ void break_down_flags(const char *string, struct flag_record *plus, struct flag_
         chan = 1;
       break;		/* switch() */
     default:
-      if ((*string >= 'a') && (*string <= 'z')) {
+     {
+      flag_t flagbit = FLAG[(unsigned char) *string];
+
+      if (flagbit) {
 	switch (chan) {
 	case 0:
 	  /* which->global |= (flag_t) 1 << (*string - 'a'); */
-          which->global |= FLAG[(unsigned char) *string];
+          which->global |= flagbit;
 	  break;
 	case 1:
 	  /* which->chan |= (flag_t) 1 << (*string - 'a'); */
-          which->chan |= FLAG[(unsigned char) *string];
+          which->chan |= flagbit;
 	  break;
 	}
       } 
+     }
     }
     string++;
   }
+  /*
   for (which = plus; which; which = (which == plus ? minus : 0)) {
     which->global &= USER_VALID;
-
     which->chan &= CHAN_VALID;
   }
+  */
   plus->match |= flags;
   if (minus) {
     minus->match |= flags;
@@ -399,6 +407,15 @@ int chk_op(struct flag_record fr, struct chanset_t *chan)
   return 0;
 }
 
+int chk_autoop(struct flag_record fr, struct chanset_t *chan)
+{
+  if (!chan || (!private(fr, chan, PRIV_OP) && chk_op(fr, chan) && !chk_deop(fr, chan))) {
+    if (channel_autoop(chan) || chan_autoop(fr) || glob_autoop(fr))
+      return 1;
+  }
+  return 0;
+}
+
 int chk_deop(struct flag_record fr, struct chanset_t *chan)
 {
   if (chan_deop(fr) || (glob_deop(fr) && !chan_op(fr)))

+ 8 - 7
src/flags.h

@@ -28,7 +28,6 @@ struct flag_record {
 #define FR_ANYWH  0x10000000
 #define FR_AND    0x20000000
 #define FR_OR     0x40000000
-#define FR_ALL    0x0fffffff
 
 /*
  * userflags:
@@ -59,9 +58,8 @@ struct flag_record {
 #define DEFLAG_MDOP        6
 #define DEFLAG_MOP	   7
 
-#define USER_VALID 0x03ffffff	/* all USER_ flags in use              */
-#define CHAN_VALID 0x03ffffff	/* all flags that can be chan specific */
-#define BOT_VALID  0x7fe689C1 /* all BOT_ flags in use               */
+#define USER_VALID (flag_t) 0xfffffffffffff
+#define CHAN_VALID (flag_t) 0xfffffffffffff
 
 #define USER_ADMIN	FLAG['a']
 #define USER_BOT	FLAG['b']
@@ -75,6 +73,7 @@ struct flag_record {
 #define USER_MASTER	FLAG['m']
 #define USER_OWNER	FLAG['n']
 #define USER_OP		FLAG['o']
+#define USER_AUTOOP	FLAG['O']
 #define USER_PARTY	FLAG['p']
 #define USER_QUIET	FLAG['q']
 #define USER_UPDATEHUB	FLAG['u']
@@ -85,7 +84,6 @@ struct flag_record {
 #define USER_DEFAULT	0
 
 
-
 #define bot_hublevel(x) ( ( (x) && (x->flags & USER_BOT) && (get_user(&USERENTRY_BOTADDR, x)) ) ? \
                           ( ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel ? \
                             ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel : 999) \
@@ -95,6 +93,8 @@ struct flag_record {
  */
 #define chan_op(x)                     ((x).chan & USER_OP)
 #define glob_op(x)                     ((x).global & USER_OP)
+#define chan_autoop(x)                 ((x).chan & USER_AUTOOP)
+#define glob_autoop(x)                 ((x).global & USER_AUTOOP)
 #define chan_deop(x)                   ((x).chan & USER_DEOP)
 #define glob_deop(x)                   ((x).global & USER_DEOP)
 #define glob_master(x)                 ((x).global & USER_MASTER)
@@ -132,12 +132,13 @@ void break_down_flags(const char *, struct flag_record *, struct flag_record *);
 int build_flags(char *, struct flag_record *, struct flag_record *);
 int flagrec_eq(struct flag_record *, struct flag_record *);
 int flagrec_ok(struct flag_record *, struct flag_record *);
-int sanity_check(flag_t);
-int chan_sanity_check(int, int);
+flag_t sanity_check(flag_t);
+flag_t chan_sanity_check(flag_t, flag_t);
 char geticon(int);
 
 int private(struct flag_record, struct chanset_t *, int);
 int chk_op(struct flag_record, struct chanset_t *);
+int chk_autoop(struct flag_record, struct chanset_t *);
 int chk_deop(struct flag_record, struct chanset_t *);
 int chk_voice(struct flag_record, struct chanset_t *);
 int chk_devoice(struct flag_record, struct chanset_t *);

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

@@ -770,6 +770,8 @@ void channels_report(int idx, int details)
           i += my_strcpy(s + i, "manop ");
         if (channel_voice(chan))
           i += my_strcpy(s + i, "voice ");
+        if (channel_autoop(chan))
+          i += my_strcpy(s + i, "autoop ");
 /* Chanflag template
  *	if (channel_temp(chan))
  *	  i += my_strcpy(s + i, "temp ");

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

@@ -1161,6 +1161,7 @@ static void cmd_chaninfo(struct userrec *u, int idx, char *par)
  */
     dprintf(idx, "Channel flags:\n");
     work[0] = 0;
+    SHOW_FLAG("autoop",		channel_autoop(chan));
     SHOW_FLAG("bitch",		channel_bitch(chan));
     SHOW_FLAG("closed",		channel_closed(chan));
     SHOW_FLAG("cycle",		channel_cycle(chan));

+ 4 - 0
src/mod/channels.mod/tclchan.c

@@ -510,6 +510,10 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item)
       chan->status |= CHAN_VOICE;
     else if (!strcmp(item[i], "-voice"))
       chan->status &= ~CHAN_VOICE;
+    else if (!strcmp(item[i], "+autoop"))
+      chan->status |= CHAN_AUTOOP;
+    else if (!strcmp(item[i], "-autoop"))
+      chan->status &= ~CHAN_AUTOOP;
 /* Chanflag template
  *  else if (!strcmp(item[i], "+temp"))
  *    chan->status |= CHAN_TEMP;

+ 3 - 2
src/mod/channels.mod/userchan.c

@@ -1009,7 +1009,7 @@ flood-nick %d:%d closed-ban %d closed-private %d ban-time %d \
 exempt-time %d invite-time %d %cenforcebans %cdynamicbans %cuserbans \
 %cbitch %cprotectops %crevenge %crevengebot %cprivate %ccycle \
 %cinactive %cdynamicexempts %cuserexempts %cdynamicinvites %cuserinvites \
-%cnodesynch %cclosed %ctake %cmanop %cvoice %cfastop }\n",
+%cnodesynch %cclosed %ctake %cmanop %cvoice %cfastop %cautoop }\n",
 	chan->dname,
 	w,
         chan->added_by,
@@ -1056,7 +1056,8 @@ exempt-time %d invite-time %d %cenforcebans %cdynamicbans %cuserbans \
 	PLSMNS(channel_take(chan)),
 	PLSMNS(channel_manop(chan)),
 	PLSMNS(channel_voice(chan)),
-	PLSMNS(channel_fastop(chan))
+	PLSMNS(channel_fastop(chan)),
+        PLSMNS(channel_autoop(chan))
 /* Chanflag template
  * also include a %ctemp above.
  *      PLSMNS(channel_temp(chan)),

+ 6 - 2
src/mod/irc.mod/chan.c

@@ -915,7 +915,6 @@ static void check_this_member(struct chanset_t *chan, char *nick, struct flag_re
   if (!m || match_my_nick(nick) || !me_op(chan))
     return;
   if (me_op(chan)) {
-	// user mode +d
     /* +d or bitch and not an op
      * we dont check private because +private does not imply bitch. */
     if (chan_hasop(m) && 
@@ -923,6 +922,8 @@ static void check_this_member(struct chanset_t *chan, char *nick, struct flag_re
          (!loading && userlist && channel_bitch(chan) && !chk_op(*fr, chan)) ) ) {
       /* if (target_priority(chan, m, 1)) */
         add_mode(chan, '-', 'o', m->nick);
+    } else if (!chan_hasop(m) && chk_autoop(*fr, chan)) {
+      do_op(m->nick, chan, 1, 0);
     }
     if (dovoice(chan)) {
       if (chan_hasvoice(m) && !chan_hasop(m)) {
@@ -1432,7 +1433,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *serv,
   if (match_my_nick(nick) && !waschanop && me_op(chan))
     recheck_channel(chan, 1);
   if (match_my_nick(nick) && any_ops(chan) && !me_op(chan))
-    chan->channel.do_opreq=1;
+    chan->channel.do_opreq = 1;
 
   m->user = get_user_by_host(userhost);
   m->tried_getuser = 1;
@@ -2202,6 +2203,9 @@ static int gotjoin(char *from, char *chname)
 	    m->flags |= SENTKICK;
 	  }
 	}
+        if (!chan_hasop(m) && chk_autoop(fr, chan)) {
+          do_op(m->nick, chan, 1, 0);
+        }
       }
     }
   }

+ 6 - 2
src/mod/irc.mod/cmdsirc.c

@@ -478,7 +478,7 @@ static void cmd_op(struct userrec *u, int idx, char *par)
     return;
   }
 
-  if (do_op(nick, chan, 1)) {
+  if (do_op(nick, chan, 0, 1)) {
     dprintf(idx, "Gave op to %s on %s.\n", nick, chan->dname);
     stats_add(u, 0, 1);
   }
@@ -1030,7 +1030,7 @@ static void cmd_mop(struct userrec *u, int idx, char *par)
         if (!chan_hasop(m) && !glob_bot(victim) && chk_op(victim, chan)) {
           found++;
           dprintf(idx, "Gave op to '%s' as '%s' on %s\n", m->user->handle, m->nick, chan->dname);
-          do_op(m->nick, chan, 0);
+          do_op(m->nick, chan, 0, 0);
         }
       }
     } else {
@@ -1292,6 +1292,10 @@ static void cmd_channel(struct userrec *u, int idx, char *par)
         atrflag = 'D';
       else if (chan_deop(user))
         atrflag = 'd';
+      else if (glob_autoop(user))
+        atrflag = 'A';
+      else if (chan_autoop(user))
+        atrflag = 'a';
       else if (glob_op(user))
         atrflag = 'O';
       else if (chan_op(user))

+ 2 - 2
src/mod/irc.mod/irc.c

@@ -301,7 +301,7 @@ void getin_request(char *botnick, char *code, char *par)
       else
         chan->channel.no_op = 0;
     }
-    do_op(nick, chan, 1);
+    do_op(nick, chan, 0, 1);
     mem->flags |= SENTOP;
 
     putlog(LOG_GETIN, "*", "opreq from %s/%s on %s - Opped", botnick, nick, chan->dname);
@@ -1295,7 +1295,7 @@ void flush_modes()
 	m->flags &= ~FULL_DELAY;
         if (chan_sentop(m)) {
           m->flags &= ~SENTOP;
-          do_op(m->nick, chan, 0);
+          do_op(m->nick, chan, 0, 0);
         }
         if (chan_sentvoice(m)) {
           m->flags &= ~SENTVOICE;

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

@@ -38,7 +38,7 @@ static void flush_mode(struct chanset_t *, int);
 
 static void detect_autokick(char *, char *, struct chanset_t *, char *);
 /* static int target_priority(struct chanset_t *, memberlist *, int); */
-static int do_op(char *, struct chanset_t *, int);
+static int do_op(char *, struct chanset_t *, int, int);
 static void request_op(struct chanset_t *);
 static void request_in(struct chanset_t *);
 static void reset_chan_info(struct chanset_t *);

+ 2 - 2
src/mod/irc.mod/mode.c

@@ -21,7 +21,7 @@ static int reversing = 0;
 static struct flag_record user   = {FR_GLOBAL | FR_CHAN, 0, 0};
 static struct flag_record victim = {FR_GLOBAL | FR_CHAN, 0, 0};
 
-static int do_op(char *nick, struct chanset_t *chan, int force)
+static int do_op(char *nick, struct chanset_t *chan, int delay, int force)
 {
   memberlist *m = ismember(chan, nick);
 
@@ -523,7 +523,7 @@ static void got_deop(struct chanset_t *chan, char *nick, char *from,
 	((chan_op(victim) || (glob_op(victim) && !chan_deop(victim))) ||
 	 !channel_bitch(chan)))
       /* Then we'll bless the victim */
-      do_op(who, chan, 0);
+      do_op(who, chan, 0, 0);
   }
 
   if (!nick[0])

+ 4 - 4
src/mod/irc.mod/msgcmds.c

@@ -68,7 +68,7 @@ static int msg_op(char *nick, char *host, struct userrec *u, char *par)
         if (chan && channel_active(chan)) {
           get_user_flagrec(u, &fr, par);
           if (chk_op(fr, chan)) {
-            if (do_op(nick, chan, 1)) {
+            if (do_op(nick, chan, 0, 1)) {
               stats_add(u, 0, 1);
               putlog(LOG_CMDS, "*", "(%s!%s) !%s! OP %s", nick, host, u->handle, par);
             }
@@ -80,7 +80,7 @@ static int msg_op(char *nick, char *host, struct userrec *u, char *par)
         for (chan = chanset; chan; chan = chan->next) {
           get_user_flagrec(u, &fr, chan->dname);
           if (chk_op(fr, chan)) {
-            if (do_op(nick, chan, 1))
+            if (do_op(nick, chan, 0, 1))
               stats++;
           }
         }
@@ -495,7 +495,7 @@ static int msgc_op(char *nick, char *host, struct userrec *u, char *par, char *c
     if (chan && channel_active(chan)) {
       get_user_flagrec(u, &fr, chan->dname);
       if (chk_op(fr, chan)) {
-        if (do_op(nick, chan, force))
+        if (do_op(nick, chan, 0, force))
           stats_add(u, 0, 1);
       }
       return BIND_RET_BREAK;
@@ -504,7 +504,7 @@ static int msgc_op(char *nick, char *host, struct userrec *u, char *par, char *c
     for (chan = chanset; chan; chan = chan->next) {
       get_user_flagrec(u, &fr, chan->dname);
       if (chk_op(fr, chan)) {
-       if (do_op(nick, chan, force))
+       if (do_op(nick, chan, 0, force))
          stats_add(u, 0, 1);
       }
     }

+ 3 - 4
src/mod/share.mod/share.c

@@ -271,18 +271,17 @@ share_chattr(int idx, char *par)
           shareout_but(cst, idx, "a %s %s %s\n", hand, atr, par);
         noshare = 1;
         if (par[0] && cst) {
-          fr.match = (FR_CHAN);
-          get_user_flagrec(dcc[idx].user, &fr, par);
           fr.match = FR_CHAN;
           fr2.match = FR_CHAN;
           break_down_flags(atr, &fr, 0);
-          set_user_flagrec(u, &fr, par);
           get_user_flagrec(u, &fr2, par);
+
+          set_user_flagrec(u, &fr, par);
           check_dcc_chanattrs(u, par, fr.chan, fr2.chan);
           noshare = 0;
           build_flags(s, &fr, 0);
           if (!(dcc[idx].status & STAT_GETTING))
-            putlog(LOG_CMDS, "@", "%s: chattr %s %s %s", dcc[idx].nick, hand, s, par);
+            putlog(LOG_CMDS, "*", "%s: chattr %s %s %s", dcc[idx].nick, hand, s, par);
 #ifdef LEAF
           recheck_channel(cst, 0);
 #endif /* LEAF */

+ 1 - 1
src/userrec.c

@@ -458,7 +458,7 @@ int change_handle(struct userrec *u, char *newh)
   return 1;
 }
 
-struct userrec *adduser(struct userrec *bu, char *handle, char *host, char *pass, int flags)
+struct userrec *adduser(struct userrec *bu, char *handle, char *host, char *pass, flag_t flags)
 {
   struct userrec *u = NULL, *x = NULL;
   int oldshare = noshare;

+ 1 - 1
src/userrec.h

@@ -2,7 +2,7 @@
 #define _USERREC_H
 
 void deflag_user(struct userrec *, int, char *, struct chanset_t *);
-struct userrec *adduser(struct userrec *, char *, char *, char *, int);
+struct userrec *adduser(struct userrec *, char *, char *, char *, flag_t);
 void addhost_by_handle(char *, char *);
 void clear_masks(struct maskrec *);
 void clear_userlist(struct userrec *);

+ 1 - 1
src/users.c

@@ -952,7 +952,7 @@ int readuserfile(char *file, struct userrec **ret)
 		putlog(LOG_MISC, "*", "* %s '%s'", USERF_BROKEPASS, code);
 		strcpy(pass, "-");
 	      }
-	      bu = adduser(bu, code, 0, pass, sanity_check(fr.global &USER_VALID));
+	      bu = adduser(bu, code, 0, pass, sanity_check(fr.global));
 
 	      u = get_user_by_handle(bu, code);
 	      for (i = 0; i < dcc_total; i++)