]> jfr.im git - solanum.git/blobdiff - src/s_conf.c
Track who set a dline/kline/xline/resv as in ratbox3.
[solanum.git] / src / s_conf.c
index 94e8669d9146af3ce30bada0dec87accb55fe14b..ff87a309c04efa9bbfeb56f32f656231762ebc69 100644 (file)
@@ -49,6 +49,8 @@
 #include "blacklist.h"
 #include "privilege.h"
 #include "sslproc.h"
+#include "bandbi.h"
+#include "operhash.h"
 
 struct config_server_hide ConfigServerHide;
 
@@ -141,11 +143,15 @@ free_conf(struct ConfItem *aconf)
 
        rb_free(aconf->passwd);
        rb_free(aconf->spasswd);
-       rb_free(aconf->name);
        rb_free(aconf->className);
        rb_free(aconf->user);
        rb_free(aconf->host);
 
+       if(IsConfBan(aconf))
+               operhash_delete(aconf->info.oper);
+       else
+               rb_free(aconf->info.name);
+
        rb_bh_free(confitem_heap, aconf);
 }
 
@@ -332,7 +338,7 @@ verify_access(struct Client *client_p, const char *username)
                if(aconf->flags & CONF_FLAGS_REDIR)
                {
                        sendto_one_numeric(client_p, RPL_REDIR, form_str(RPL_REDIR),
-                                       aconf->name ? aconf->name : "", aconf->port);
+                                       aconf->info.name ? aconf->info.name : "", aconf->port);
                        return (NOT_AUTHORISED);
                }
 
@@ -349,35 +355,34 @@ verify_access(struct Client *client_p, const char *username)
                                sendto_realops_snomask(SNO_GENERAL, L_ALL,
                                                "%s spoofing: %s as %s",
                                                client_p->name,
-                                               show_ip(NULL, client_p) ? client_p->host : aconf->name,
-                                               aconf->name);
+                                               show_ip(NULL, client_p) ? client_p->host : aconf->info.name,
+                                               aconf->info.name);
                        }
 
                        /* user@host spoof */
-                       if((p = strchr(aconf->name, '@')) != NULL)
+                       if((p = strchr(aconf->info.name, '@')) != NULL)
                        {
                                char *host = p+1;
                                *p = '\0';
 
-                               rb_strlcpy(client_p->username, aconf->name,
+                               rb_strlcpy(client_p->username, aconf->info.name,
                                        sizeof(client_p->username));
                                rb_strlcpy(client_p->host, host,
                                        sizeof(client_p->host));
                                *p = '@';
                        }
                        else
-                               rb_strlcpy(client_p->host, aconf->name, sizeof(client_p->host));
+                               rb_strlcpy(client_p->host, aconf->info.name, sizeof(client_p->host));
                }
                return (attach_iline(client_p, aconf));
        }
        else if(aconf->status & CONF_KILL)
        {
                if(ConfigFileEntry.kline_with_reason)
-               {
                        sendto_one(client_p,
                                        form_str(ERR_YOUREBANNEDCREEP),
-                                       me.name, client_p->name, aconf->passwd);
-               }
+                                       me.name, client_p->name,
+                                       get_user_ban_reason(aconf));
                add_reject(client_p, aconf->user, aconf->host);
                return (BANNED_CLIENT);
        }
@@ -634,63 +639,10 @@ rehash(int sig)
        return (0);
 }
 
-static struct banconf_entry
-{
-       const char **filename;
-       void (*func) (FILE *);
-       int perm;
-} banconfs[] = {
-       { &ConfigFileEntry.klinefile,   parse_k_file,   0 },
-       { &ConfigFileEntry.klinefile,   parse_k_file,   1 },
-       { &ConfigFileEntry.dlinefile,   parse_d_file,   0 },
-       { &ConfigFileEntry.dlinefile,   parse_d_file,   1 },
-       { &ConfigFileEntry.xlinefile,   parse_x_file,   0 },
-       { &ConfigFileEntry.xlinefile,   parse_x_file,   1 },
-       { &ConfigFileEntry.resvfile,    parse_resv_file,0 },
-       { &ConfigFileEntry.resvfile,    parse_resv_file,1 },
-       { NULL,                         NULL,           0 }
-};
-
 void
 rehash_bans(int sig)
 {
-       FILE *file;
-       char buf[MAXPATHLEN];
-       int i;
-
-       if(sig != 0)
-               sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                               "Got signal SIGUSR2, reloading ban confs");
-
-       clear_out_address_conf_bans();
-       clear_s_newconf_bans();
-
-       for(i = 0; banconfs[i].filename; i++)
-       {
-               if(banconfs[i].perm)
-                       snprintf(buf, sizeof(buf), "%s.perm", *banconfs[i].filename);
-               else
-                       snprintf(buf, sizeof(buf), "%s", *banconfs[i].filename);
-
-               if((file = fopen(buf, "r")) == NULL)
-               {
-                       if(banconfs[i].perm)
-                               continue;
-
-                       ilog(L_MAIN, "Failed reading ban file %s",
-                               *banconfs[i].filename);
-                       sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                       "Can't open %s file bans could be missing!",
-                                       *banconfs[i].filename);
-               }
-               else
-               {
-                       (banconfs[i].func)(file);
-                       fclose(file);
-               }
-       }
-
-       check_banned_lines();
+       bandb_rehash_bans();
 }
 
 /*
@@ -814,6 +766,7 @@ set_default_conf(void)
        ConfigChannel.default_split_server_count = 10;
        ConfigChannel.no_join_on_split = NO;
        ConfigChannel.no_create_on_split = YES;
+       ConfigChannel.resv_forcepart = YES;
 
        ConfigServerHide.flatten_links = 0;
        ConfigServerHide.links_delay = 300;
@@ -833,6 +786,9 @@ set_default_conf(void)
        ConfigFileEntry.throttle_duration = 60;
 
        ServerInfo.default_max_clients = MAXCONNECTIONS;
+
+       if (!alias_dict)
+               alias_dict = irc_dictionary_create(strcasecmp);
 }
 
 #undef YES
@@ -1095,7 +1051,7 @@ get_printable_conf(struct ConfItem *aconf, char **name, char **host,
        static char null[] = "<NULL>";
        static char zero[] = "default";
 
-       *name = EmptyString(aconf->name) ? null : aconf->name;
+       *name = EmptyString(aconf->info.name) ? null : aconf->info.name;
        *host = EmptyString(aconf->host) ? null : aconf->host;
        *pass = EmptyString(aconf->passwd) ? null : aconf->passwd;
        *user = EmptyString(aconf->user) ? null : aconf->user;
@@ -1103,6 +1059,33 @@ get_printable_conf(struct ConfItem *aconf, char **name, char **host,
        *port = (int) aconf->port;
 }
 
+char *
+get_user_ban_reason(struct ConfItem *aconf)
+{
+       static char reasonbuf[BUFSIZE];
+
+       if (aconf->flags & CONF_FLAGS_TEMPORARY &&
+                       (aconf->status == CONF_KILL || aconf->status == CONF_DLINE))
+               rb_snprintf(reasonbuf, sizeof reasonbuf,
+                               "Temporary %c-line %d min. - ",
+                               aconf->status == CONF_DLINE ? 'D' : 'K',
+                               (aconf->hold - aconf->created) / 60);
+       else
+               reasonbuf[0] = '\0';
+       if (aconf->passwd)
+               rb_strlcat(reasonbuf, aconf->passwd, sizeof reasonbuf);
+       else
+               rb_strlcat(reasonbuf, "No Reason", sizeof reasonbuf);
+       if (aconf->created)
+       {
+               rb_strlcat(reasonbuf, " (", sizeof reasonbuf);
+               rb_strlcat(reasonbuf, smalldate(aconf->created),
+                               sizeof reasonbuf);
+               rb_strlcat(reasonbuf, ")", sizeof reasonbuf);
+       }
+       return reasonbuf;
+}
+
 void
 get_printable_kline(struct Client *source_p, struct ConfItem *aconf, 
                    char **host, char **reason,
@@ -1111,8 +1094,8 @@ get_printable_kline(struct Client *source_p, struct ConfItem *aconf,
        static char null[] = "<NULL>";
 
        *host = EmptyString(aconf->host) ? null : aconf->host;
-       *reason = EmptyString(aconf->passwd) ? null : aconf->passwd;
        *user = EmptyString(aconf->user) ? null : aconf->user;
+       *reason = get_user_ban_reason(aconf);
 
        if(EmptyString(aconf->spasswd) || !IsOper(source_p))
                *oper_reason = NULL;
@@ -1134,7 +1117,7 @@ read_conf_files(int cold)
 
        conf_fbfile_in = NULL;
 
-       filename = get_conf_name(CONF_TYPE);
+       filename = ConfigFileEntry.configfile;
 
        /* We need to know the initial filename for the yyerror() to report
           FIXME: The full path is in conffilenamebuf first time since we
@@ -1252,8 +1235,11 @@ clear_out_old_conf(void)
        }
 
        /* remove any aliases... -- nenolod */
-       irc_dictionary_destroy(alias_dict, free_alias_cb, NULL);
-       alias_dict = NULL;
+       if (alias_dict != NULL)
+       {
+               irc_dictionary_destroy(alias_dict, free_alias_cb, NULL);
+               alias_dict = NULL;
+       }
 
        destroy_blacklists();
 
@@ -1263,162 +1249,6 @@ clear_out_old_conf(void)
 }
 
 
-/* write_confitem()
- *
- * inputs       - kline, dline or resv type flag
- *              - client pointer to report to
- *              - user name of target
- *              - host name of target
- *              - reason for target
- *              - time string
- *              - type of xline
- * output       - NONE
- * side effects - This function takes care of finding the right conf
- *                file and adding the line to it, as well as notifying
- *                opers and the user.
- */
-void
-write_confitem(KlineType type, struct Client *source_p, char *user,
-              char *host, const char *reason, const char *oper_reason,
-              const char *current_date, int xtype)
-{
-       char buffer[1024];
-       FILE *out;
-       const char *filename;   /* filename to use for kline */
-
-       filename = get_conf_name(type);
-
-       if(type == KLINE_TYPE)
-       {
-               if(EmptyString(oper_reason))
-               {
-                       sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                       "%s added K-Line for [%s@%s] [%s]",
-                                       get_oper_name(source_p), user, 
-                                       host, reason);
-                       ilog(L_KLINE, "K %s 0 %s %s %s",
-                               get_oper_name(source_p), user, host, reason);
-               }
-               else
-               {
-                       sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                       "%s added K-Line for [%s@%s] [%s|%s]",
-                                       get_oper_name(source_p), user,
-                                       host, reason, oper_reason);
-                       ilog(L_KLINE, "K %s 0 %s %s %s|%s",
-                               get_oper_name(source_p), user, host,
-                               reason, oper_reason);
-               }
-
-               sendto_one_notice(source_p, ":Added K-Line [%s@%s]",
-                                 user, host);
-       }
-       else if(type == DLINE_TYPE)
-       {
-               if(EmptyString(oper_reason))
-               {
-                       sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                       "%s added D-Line for [%s] [%s]",
-                                       get_oper_name(source_p), host, reason);
-                       ilog(L_KLINE, "D %s 0 %s %s",
-                               get_oper_name(source_p), host, reason);
-               }
-               else
-               {
-                       sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                       "%s added D-Line for [%s] [%s|%s]",
-                                       get_oper_name(source_p), host, 
-                                       reason, oper_reason);
-                       ilog(L_KLINE, "D %s 0 %s %s|%s",
-                               get_oper_name(source_p), host, 
-                               reason, oper_reason);
-               }
-
-               sendto_one_notice(source_p, ":Added D-Line [%s] to %s", host, filename);
-
-       }
-       else if(type == RESV_TYPE)
-       {
-               sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                               "%s added RESV for [%s] [%s]",
-                               get_oper_name(source_p), host, reason);
-               ilog(L_KLINE, "R %s 0 %s %s",
-                       get_oper_name(source_p), host, reason);
-
-               sendto_one_notice(source_p, ":Added RESV for [%s] [%s]",
-                                 host, reason);
-       }
-
-       if((out = fopen(filename, "a")) == NULL)
-       {
-               sendto_realops_snomask(SNO_GENERAL, L_ALL, "*** Problem opening %s ", filename);
-               sendto_one_notice(source_p, ":*** Problem opening file, added temporarily only");
-               return;
-       }
-
-       if(oper_reason == NULL)
-               oper_reason = "";
-
-       if(type == KLINE_TYPE)
-       {
-               rb_snprintf(buffer, sizeof(buffer),
-                          "\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",%ld\n",
-                          user, host, reason, oper_reason, current_date,
-                          get_oper_name(source_p), (long int)rb_current_time());
-       }
-       else if(type == DLINE_TYPE)
-       {
-               rb_snprintf(buffer, sizeof(buffer),
-                          "\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",%ld\n", host,
-                          reason, oper_reason, current_date, get_oper_name(source_p), (long int)rb_current_time());
-       }
-       else if(type == RESV_TYPE)
-       {
-               rb_snprintf(buffer, sizeof(buffer), "\"%s\",\"%s\",\"%s\",%ld\n",
-                          host, reason, get_oper_name(source_p), (long int)rb_current_time());
-       }
-
-       if(fputs(buffer, out) == -1)
-       {
-               sendto_realops_snomask(SNO_GENERAL, L_ALL, "*** Problem writing to %s", filename);
-               sendto_one_notice(source_p, ":*** Problem writing to file, added temporarily only");
-               fclose(out);
-               return;
-       }
-
-       if (fclose(out))
-       {
-               sendto_realops_snomask(SNO_GENERAL, L_ALL, "*** Problem writing to %s", filename);
-               sendto_one_notice(source_p, ":*** Problem writing to file, added temporarily only");
-               return;
-       }
-}
-
-/* get_conf_name
- *
- * inputs       - type of conf file to return name of file for
- * output       - pointer to filename for type of conf
- * side effects - none
- */
-const char *
-get_conf_name(KlineType type)
-{
-       if(type == CONF_TYPE)
-       {
-               return (ConfigFileEntry.configfile);
-       }
-       else if(type == DLINE_TYPE)
-       {
-               return (ConfigFileEntry.dlinefile);
-       }
-       else if(type == RESV_TYPE)
-       {
-               return (ConfigFileEntry.resvfile);
-       }
-
-       return ConfigFileEntry.klinefile;
-}
-
 /*
  * conf_add_class_to_conf
  * inputs       - pointer to config item