]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/channel.c
Correct error message involving no fingerprint credentials or password credentials...
[irc/rqf/shadowircd.git] / src / channel.c
index 39d2f85d828dd80ddd5e9f9b7cd82f31ae560795..a2e6fa60d66fa7e8a28eb4f3ec95fefb292cea42 100644 (file)
@@ -106,6 +106,7 @@ free_channel(struct Channel *chptr)
 {
        channel_metadata_clear(chptr);
        rb_free(chptr->chname);
+       rb_free(chptr->mode_lock);
        rb_bh_free(channel_heap, chptr);
 }
 
@@ -986,6 +987,62 @@ can_send(struct Channel *chptr, struct Client *source_p, struct membership *mspt
        return CAN_SEND_NONOP;
 }
 
+/*
+ * flood_attack_channel
+ * inputs       - flag 0 if PRIVMSG 1 if NOTICE. RFC
+ *                says NOTICE must not auto reply
+ *              - pointer to source Client 
+ *             - pointer to target channel
+ * output      - 1 if target is under flood attack
+ * side effects        - check for flood attack on target chptr
+ */
+int
+flood_attack_channel(int p_or_n, struct Client *source_p, struct Channel *chptr, char *chname)
+{
+       int delta;
+
+       if(GlobalSetOptions.floodcount && MyClient(source_p) && (!IsOper(source_p) || !ConfigFileEntry.true_no_oper_flood))
+       {
+               if((chptr->first_received_message_time + 1) < rb_current_time())
+               {
+                       delta = rb_current_time() - chptr->first_received_message_time;
+                       chptr->received_number_of_privmsgs -= delta;
+                       chptr->first_received_message_time = rb_current_time();
+                       if(chptr->received_number_of_privmsgs <= 0)
+                       {
+                               chptr->received_number_of_privmsgs = 0;
+                               chptr->flood_noticed = 0;
+                       }
+               }
+
+               if((chptr->received_number_of_privmsgs >= GlobalSetOptions.floodcount)
+                  || chptr->flood_noticed)
+               {
+                       if(chptr->flood_noticed == 0)
+                       {
+                               sendto_realops_snomask(SNO_BOTS, *chptr->chname == '&' ? L_ALL : L_NETWIDE,
+                                                    "Possible Flooder %s[%s@%s] on %s target: %s",
+                                                    source_p->name, source_p->username,
+                                                    source_p->orighost,
+                                                    source_p->servptr->name, chptr->chname);
+                               chptr->flood_noticed = 1;
+
+                               /* Add a bit of penalty */
+                               chptr->received_number_of_privmsgs += 2;
+                       }
+                       if(MyClient(source_p) && (p_or_n != 1))
+                               sendto_one(source_p,
+                                          ":%s NOTICE %s :*** Message to %s throttled due to flooding",
+                                          me.name, source_p->name, chptr->chname);
+                       return 1;
+               }
+               else
+                       chptr->received_number_of_privmsgs++;
+       }
+
+       return 0;
+}
+
 /* find_bannickchange_channel()
  * Input: client to check
  * Output: channel preventing nick change
@@ -1829,7 +1886,10 @@ void user_join(struct Client * client_p, struct Client * source_p, const char *
                                continue;
                        }
 
-                       flags = CHFL_CHANOP;
+                       if(ConfigChannel.admin_on_channel_create && ConfigChannel.use_admin)
+                               flags = CHFL_ADMIN | CHFL_CHANOP;
+                       else
+                               flags = CHFL_CHANOP;
                }
 
                if((rb_dlink_list_length(&source_p->user->channel) >=