MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "module.h"
GSList *setupservers;
-char *old_source_host;
+static char *old_source_host;
int source_host_ok; /* Use source_host_ip .. */
IPADDR *source_host_ip4, *source_host_ip6; /* Resolved address */
conn->family = sserver->family;
if (sserver->port > 0 && conn->port <= 0)
conn->port = sserver->port;
+
+ conn->use_ssl = sserver->use_ssl;
+ if (conn->ssl_cert == NULL && sserver->ssl_cert != NULL && sserver->ssl_cert[0] != '\0')
+ conn->ssl_cert = g_strdup(sserver->ssl_cert);
+ if (conn->ssl_pkey == NULL && sserver->ssl_pkey != NULL && sserver->ssl_pkey[0] != '\0')
+ conn->ssl_pkey = g_strdup(sserver->ssl_pkey);
+ conn->ssl_verify = sserver->ssl_verify;
+ if (conn->ssl_cafile == NULL && sserver->ssl_cafile != NULL && sserver->ssl_cafile[0] != '\0')
+ conn->ssl_cafile = g_strdup(sserver->ssl_cafile);
+ if (conn->ssl_capath == NULL && sserver->ssl_capath != NULL && sserver->ssl_capath[0] != '\0')
+ conn->ssl_capath = g_strdup(sserver->ssl_capath);
+
server_setup_fill_reconn(conn, sserver);
signal_emit("server setup fill server", 2, conn, sserver);
return server;
}
-/* Find matching server from setup. Ports must match or NULL is returned. */
-SERVER_SETUP_REC *server_setup_find_port(const char *address, int port)
-{
- SERVER_SETUP_REC *rec;
-
- rec = server_setup_find(address, port, NULL);
- return rec == NULL || rec->port != port ? NULL : rec;
-}
-
static SERVER_SETUP_REC *server_setup_read(CONFIG_NODE *node)
{
SERVER_SETUP_REC *rec;
return NULL;
port = config_node_get_int(node, "port", 0);
- if (server_setup_find_port(server, port) != NULL) {
- /* already exists - don't let it get there twice or
- server reconnects will screw up! */
+ chatnet = config_node_get_str(node, "chatnet", NULL);
+
+ if (server_setup_find(server, port, chatnet) != NULL) {
return NULL;
}
rec = NULL;
- chatnet = config_node_get_str(node, "chatnet", NULL);
chatnetrec = chatnet == NULL ? NULL : chatnet_find(chatnet);
if (chatnetrec == NULL && chatnet != NULL) {
rec->type = module_get_uniq_id("SERVER SETUP", 0);
rec->chat_type = CHAT_PROTOCOL(chatnetrec)->id;
rec->chatnet = chatnetrec == NULL ? NULL : g_strdup(chatnetrec->name);
- rec->family = g_strcasecmp(family, "inet6") == 0 ? AF_INET6 :
- (g_strcasecmp(family, "inet") == 0 ? AF_INET : 0);
+ rec->family = g_ascii_strcasecmp(family, "inet6") == 0 ? AF_INET6 :
+ (g_ascii_strcasecmp(family, "inet") == 0 ? AF_INET : 0);
rec->address = g_strdup(server);
rec->password = g_strdup(config_node_get_str(node, "password", NULL));
+ rec->use_ssl = config_node_get_bool(node, "use_ssl", FALSE);
+ rec->ssl_cert = g_strdup(config_node_get_str(node, "ssl_cert", NULL));
+ rec->ssl_pkey = g_strdup(config_node_get_str(node, "ssl_pkey", NULL));
+ rec->ssl_verify = config_node_get_bool(node, "ssl_verify", FALSE);
+ rec->ssl_cafile = g_strdup(config_node_get_str(node, "ssl_cafile", NULL));
+ rec->ssl_capath = g_strdup(config_node_get_str(node, "ssl_capath", NULL));
+ if (rec->ssl_cafile || rec->ssl_capath)
+ rec->ssl_verify = TRUE;
+ if (rec->ssl_cert != NULL || rec->ssl_verify)
+ rec->use_ssl = TRUE;
rec->port = port;
rec->autoconnect = config_node_get_bool(node, "autoconnect", FALSE);
rec->no_proxy = config_node_get_bool(node, "no_proxy", FALSE);
index = g_slist_index(setupservers, rec);
parentnode = iconfig_node_traverse("(servers", TRUE);
- node = config_node_index(parentnode, index);
+ node = config_node_nth(parentnode, index);
if (node == NULL)
node = config_node_section(parentnode, NULL, NODE_TYPE_BLOCK);
iconfig_node_set_int(node, "port", rec->port);
iconfig_node_set_str(node, "password", rec->password);
+ iconfig_node_set_bool(node, "use_ssl", rec->use_ssl);
+ iconfig_node_set_str(node, "ssl_cert", rec->ssl_cert);
+ iconfig_node_set_str(node, "ssl_pkey", rec->ssl_pkey);
+ iconfig_node_set_bool(node, "ssl_verify", rec->ssl_verify);
+ iconfig_node_set_str(node, "ssl_cafile", rec->ssl_cafile);
+ iconfig_node_set_str(node, "ssl_capath", rec->ssl_capath);
iconfig_node_set_str(node, "own_host", rec->own_host);
iconfig_node_set_str(node, "family",
g_free_not_null(rec->own_ip6);
g_free_not_null(rec->chatnet);
g_free_not_null(rec->password);
+ g_free_not_null(rec->ssl_cert);
+ g_free_not_null(rec->ssl_pkey);
+ g_free_not_null(rec->ssl_cafile);
+ g_free_not_null(rec->ssl_capath);
g_free(rec->address);
g_free(rec);
}
if (g_slist_find(setupservers, rec) == NULL)
setupservers = g_slist_append(setupservers, rec);
server_setup_save(rec);
+
+ signal_emit("server setup updated", 1, rec);
}
void server_setup_remove(SERVER_SETUP_REC *rec)