Don't send proxy requests for incoming connections.
[tinc] / src / protocol_auth.c
index ccb7976..f4a30a4 100644 (file)
@@ -20,7 +20,6 @@
 
 #include "system.h"
 
-#include "splay_tree.h"
 #include "conf.h"
 #include "connection.h"
 #include "control.h"
@@ -65,7 +64,7 @@ static bool send_proxyrequest(connection_t *c) {
                        memcpy(s4req + 2, &c->address.in.sin_port, 2);
                        memcpy(s4req + 4, &c->address.in.sin_addr, 4);
                        if(proxyuser)
-                               strcpy(s4req + 8, proxyuser);
+                               memcpy(s4req + 8, proxyuser, strlen(proxyuser));
                        s4req[sizeof s4req - 1] = 0;
                        c->tcplen = 8;
                        return send_meta(c, s4req, sizeof s4req);
@@ -83,10 +82,10 @@ static bool send_proxyrequest(connection_t *c) {
                                s5req[i++] = 2;
                                s5req[i++] = 1;
                                s5req[i++] = strlen(proxyuser);
-                               strcpy(s5req + i, proxyuser);
+                               memcpy(s5req + i, proxyuser, strlen(proxyuser));
                                i += strlen(proxyuser);
                                s5req[i++] = strlen(proxypass);
-                               strcpy(s5req + i, proxypass);
+                               memcpy(s5req + i, proxypass, strlen(proxypass));
                                i += strlen(proxypass);
                                c->tcplen += 2;
                        } else {
@@ -140,7 +139,7 @@ bool send_id(connection_t *c) {
                        minor = myself->connection->protocol_minor;
        }
 
-       if(proxytype)
+       if(proxytype && c->outgoing)
                if(!send_proxyrequest(c))
                        return false;
 
@@ -163,8 +162,8 @@ bool id_h(connection_t *c, const char *request) {
                c->allow_request = CONTROL;
                c->last_ping_time = time(NULL) + 3600;
 
-               free(c->name);
-                c->name = xstrdup("<control>");
+               free(c->name);
+               c->name = xstrdup("<control>");
 
                return send_request(c, "%d %d %d", ACK, TINC_CTL_VERSION_CURRENT, getpid());
        }
@@ -212,9 +211,8 @@ bool id_h(connection_t *c, const char *request) {
        if(!c->config_tree) {
                init_configuration(&c->config_tree);
 
-               if(!read_connection_config(c)) {
-                       logger(DEBUG_ALWAYS, LOG_ERR, "Peer %s had unknown identity (%s)", c->hostname,
-                                  c->name);
+               if(!read_host_config(c->config_tree, c->name)) {
+                       logger(DEBUG_ALWAYS, LOG_ERR, "Peer %s had unknown identity (%s)", c->hostname, c->name);
                        return false;
                }
 
@@ -250,7 +248,7 @@ bool send_metakey(connection_t *c) {
 
        if(!cipher_open_blowfish_ofb(&c->outcipher))
                return false;
-       
+
        if(!digest_open_sha1(&c->outdigest, -1))
                return false;
 
@@ -304,7 +302,7 @@ bool send_metakey(connection_t *c) {
                         cipher_get_nid(&c->outcipher),
                         digest_get_nid(&c->outdigest), c->outmaclength,
                         c->outcompression, hexkey);
-       
+
        c->status.encryptout = true;
        return result;
 }
@@ -506,38 +504,25 @@ bool send_ack(connection_t *c) {
 
        get_config_int(lookup_config(c->config_tree, "Weight"), &c->estimated_weight);
 
-       return send_request(c, "%d %s %d %x", ACK, myport, c->estimated_weight, c->options);
+       return send_request(c, "%d %s %d %x", ACK, myport, c->estimated_weight, (c->options & 0xffffff) | (experimental ? (PROT_MINOR << 24) : 0));
 }
 
 static void send_everything(connection_t *c) {
-       splay_node_t *node, *node2;
-       node_t *n;
-       subnet_t *s;
-       edge_t *e;
-
        /* Send all known subnets and edges */
 
        if(tunnelserver) {
-               for(node = myself->subnet_tree->head; node; node = node->next) {
-                       s = node->data;
+               for splay_each(subnet_t, s, myself->subnet_tree)
                        send_add_subnet(c, s);
-               }
 
                return;
        }
 
-       for(node = node_tree->head; node; node = node->next) {
-               n = node->data;
-
-               for(node2 = n->subnet_tree->head; node2; node2 = node2->next) {
-                       s = node2->data;
+       for splay_each(node_t, n, node_tree) {
+               for splay_each(subnet_t, s, n->subnet_tree)
                        send_add_subnet(c, s);
-               }
 
-               for(node2 = n->edge_tree->head; node2; node2 = node2->next) {
-                       e = node2->data;
+               for splay_each(edge_t, e, n->edge_tree)
                        send_add_edge(c, e);
-               }
        }
 }
 
@@ -626,9 +611,6 @@ bool ack_h(connection_t *c, const char *request) {
                        c->options &= ~OPTION_CLAMP_MSS;
        }
 
-       if(c->protocol_minor > 0)
-               c->node->status.ecdh = true;
-
        /* Activate this connection */
 
        c->allow_request = ALL;