]> jfr.im git - solanum.git/blobdiff - ircd/s_serv.c
m_stats: display certificate fingerprint in STATS C
[solanum.git] / ircd / s_serv.c
index 208a6fe16ef0c7366ac95bad017f235153c926ce..6335c5767a66249c34c39e4d142741c435102bce 100644 (file)
@@ -31,7 +31,6 @@
 #include "s_serv.h"
 #include "class.h"
 #include "client.h"
-#include "common.h"
 #include "hash.h"
 #include "match.h"
 #include "ircd.h"
@@ -348,6 +347,9 @@ check_server(const char *name, struct Client *client_p)
        rb_dlink_node *ptr;
        int error = -1;
        const char *encr;
+       bool name_matched = false;
+       bool host_matched = false;
+       bool certfp_failed = false;
 
        s_assert(NULL != client_p);
        if(client_p == NULL)
@@ -369,14 +371,14 @@ check_server(const char *name, struct Client *client_p)
                if(!match(tmp_p->name, name))
                        continue;
 
-               error = -3;
+               name_matched = true;
 
                /* XXX: Fix me for IPv6 */
                /* XXX sockhost is the IPv4 ip as a string */
                if(match(tmp_p->host, client_p->host) ||
                   match(tmp_p->host, client_p->sockhost))
                {
-                       error = -2;
+                       host_matched = true;
 
                        if(tmp_p->passwd)
                        {
@@ -398,8 +400,10 @@ check_server(const char *name, struct Client *client_p)
 
                        if(tmp_p->certfp)
                        {
-                               if(!client_p->certfp || strcasecmp(tmp_p->certfp, client_p->certfp) != 0)
+                               if(!client_p->certfp || rb_strcasecmp(tmp_p->certfp, client_p->certfp) != 0) {
+                                       certfp_failed = true;
                                        continue;
+                               }
                        }
 
                        server_p = tmp_p;
@@ -408,7 +412,17 @@ check_server(const char *name, struct Client *client_p)
        }
 
        if(server_p == NULL)
+       {
+               /* return the most specific error */
+               if(certfp_failed)
+                       error = -6;
+               else if(host_matched)
+                       error = -2;
+               else if(name_matched)
+                       error = -3;
+
                return error;
+       }
 
        if(ServerConfSSL(server_p) && client_p->localClient->ssl_ctl == NULL)
        {
@@ -797,19 +811,6 @@ server_estab(struct Client *client_p)
        /* Its got identd , since its a server */
        SetGotId(client_p);
 
-       /* If there is something in the serv_list, it might be this
-        * connecting server..
-        */
-       if(!ServerInfo.hub && serv_list.head)
-       {
-               if(client_p != serv_list.head->data || serv_list.head->next)
-               {
-                       ServerStats.is_ref++;
-                       sendto_one(client_p, "ERROR :I'm a leaf not a hub");
-                       return exit_client(client_p, client_p, client_p, "I'm a leaf");
-               }
-       }
-
        if(IsUnknown(client_p))
        {
                /* the server may be linking based on certificate fingerprint now. --nenolod */
@@ -1055,12 +1056,7 @@ serv_connect(struct server_conf *server_p, struct Client *by)
        rb_strlcpy(client_p->sockhost, buf, sizeof(client_p->sockhost));
        client_p->localClient->F = F;
        /* shove the port number into the sockaddr */
-#ifdef RB_IPV6
-       if(GET_SS_FAMILY(&server_p->my_ipnum) == AF_INET6)
-               ((struct sockaddr_in6 *)&server_p->my_ipnum)->sin6_port = htons(server_p->port);
-       else
-#endif
-               ((struct sockaddr_in *)&server_p->my_ipnum)->sin_port = htons(server_p->port);
+       SET_SS_PORT(&server_p->my_ipnum, htons(server_p->port));
 
        /*
         * Set up the initial server evilness, ripped straight from
@@ -1098,15 +1094,15 @@ serv_connect(struct server_conf *server_p, struct Client *by)
        if(ServerConfVhosted(server_p))
        {
                memcpy(&myipnum, &server_p->my_ipnum, sizeof(myipnum));
-               ((struct sockaddr_in *)&myipnum)->sin_port = 0;
                SET_SS_FAMILY(&myipnum, GET_SS_FAMILY(&server_p->my_ipnum));
+               SET_SS_PORT(&myipnum, 0);
 
        }
        else if(GET_SS_FAMILY(&server_p->my_ipnum) == AF_INET && ServerInfo.specific_ipv4_vhost)
        {
                memcpy(&myipnum, &ServerInfo.ip, sizeof(myipnum));
-               ((struct sockaddr_in *)&myipnum)->sin_port = 0;
                SET_SS_FAMILY(&myipnum, AF_INET);
+               SET_SS_PORT(&myipnum, 0);
                SET_SS_LEN(&myipnum, sizeof(struct sockaddr_in));
        }
 
@@ -1114,8 +1110,8 @@ serv_connect(struct server_conf *server_p, struct Client *by)
        else if((GET_SS_FAMILY(&server_p->my_ipnum) == AF_INET6) && ServerInfo.specific_ipv6_vhost)
        {
                memcpy(&myipnum, &ServerInfo.ip6, sizeof(myipnum));
-               ((struct sockaddr_in6 *)&myipnum)->sin6_port = 0;
                SET_SS_FAMILY(&myipnum, AF_INET6);
+               SET_SS_PORT(&myipnum, 0);
                SET_SS_LEN(&myipnum, sizeof(struct sockaddr_in6));
        }
 #endif
@@ -1171,7 +1167,7 @@ serv_connect_ssl_callback(rb_fde_t *F, int status, void *data)
        }
        client_p->localClient->F = xF[0];
 
-       client_p->localClient->ssl_ctl = start_ssld_connect(F, xF[1], rb_get_fd(xF[0]));
+       client_p->localClient->ssl_ctl = start_ssld_connect(F, xF[1], connid_get(client_p));
        if(!client_p->localClient->ssl_ctl)
        {
                serv_connect_callback(client_p->localClient->F, RB_ERROR, data);