conn->proxy = g_strdup(settings_get_str("proxy_address"));
conn->proxy_port = settings_get_int("proxy_port");
conn->proxy_string = g_strdup(settings_get_str("proxy_string"));
+ conn->proxy_string_after = g_strdup(settings_get_str("proxy_string_after"));
conn->proxy_password = g_strdup(settings_get_str("proxy_password"));
}
conn->own_ip6 = g_new(IPADDR, 1);
memcpy(conn->own_ip6, source_host_ip6, sizeof(IPADDR));
}
+
+ signal_emit("server setup fill connect", 1, conn);
}
static void server_setup_fill_server(SERVER_CONNECT_REC *conn,
sserver->last_connect = time(NULL);
+ if (sserver->no_proxy)
+ g_free_and_null(conn->proxy);
+
if (sserver->family != 0 && conn->family == 0)
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);
g_return_if_fail(IS_SERVER_CONNECT(conn));
g_return_if_fail(IS_CHATNET(chatnet));
- if (chatnet->nick) {
+ if (chatnet->nick != NULL) {
g_free(conn->nick);
conn->nick = g_strdup(chatnet->nick);;
}
- if (chatnet->username) {
+ if (chatnet->username != NULL) {
g_free(conn->username);
conn->username = g_strdup(chatnet->username);;
}
- if (chatnet->realname) {
+ if (chatnet->realname != NULL) {
g_free(conn->realname);
conn->realname = g_strdup(chatnet->realname);;
}
g_return_val_if_fail(address != NULL, NULL);
- sserver = server_setup_find(address, port);
+ sserver = server_setup_find(address, port, chatnet);
if (sserver != NULL) {
if (chat_type < 0)
chat_type = sserver->chat_type;
chat_protocol_get_default();
conn = proto->create_server_connect();
+ server_connect_ref(conn);
+
conn->chat_type = proto->id;
if (chatnet != NULL && *chatnet != '\0')
conn->chatnet = g_strdup(chatnet);
conn->nick = g_strdup(nick);
}
- signal_emit("server setup fill connect", 1, conn);
return conn;
}
const char *nick)
{
SERVER_CONNECT_REC *rec;
+ CHATNET_REC *chatrec;
g_return_val_if_fail(dest != NULL, NULL);
- if (chatnet_find(dest) != NULL) {
- rec = create_chatnet_conn(dest, port, password, nick);
+ chatrec = chatnet_find(dest);
+ if (chatrec != NULL) {
+ rec = create_chatnet_conn(chatrec->name, port, password, nick);
if (rec != NULL)
return rec;
}
+ chatrec = chatnet == NULL ? NULL : chatnet_find(chatnet);
+ if (chatrec != NULL)
+ chatnet = chatrec->name;
+
return create_addr_conn(chat_type, dest, port,
chatnet, password, nick);
}
/* Find matching server from setup. Try to find record with a same port,
but fallback to any server with the same address. */
-SERVER_SETUP_REC *server_setup_find(const char *address, int port)
+SERVER_SETUP_REC *server_setup_find(const char *address, int port,
+ const char *chatnet)
{
SERVER_SETUP_REC *server;
GSList *tmp;
for (tmp = setupservers; tmp != NULL; tmp = tmp->next) {
SERVER_SETUP_REC *rec = tmp->data;
- if (g_strcasecmp(rec->address, address) == 0) {
+ if (g_strcasecmp(rec->address, address) == 0 &&
+ (chatnet == NULL || rec->chatnet == NULL ||
+ g_strcasecmp(rec->chatnet, chatnet) == 0)) {
server = rec;
if (rec->port == port)
break;
{
SERVER_SETUP_REC *rec;
- rec = server_setup_find(address, port);
+ rec = server_setup_find(address, port, NULL);
return rec == NULL || rec->port != port ? NULL : rec;
}
rec = NULL;
chatnet = config_node_get_str(node, "chatnet", NULL);
- if (chatnet == NULL) /* FIXME: remove this after .98... */ {
- chatnet = config_node_get_str(node, "ircnet", NULL);
- if (chatnet != NULL) {
- iconfig_node_set_str(node, "chatnet", chatnet);
- iconfig_node_set_str(node, "ircnet", NULL);
- chatnet = config_node_get_str(node, "chatnet", NULL);
- }
- }
chatnetrec = chatnet == NULL ? NULL : chatnet_find(chatnet);
if (chatnetrec == NULL && chatnet != NULL) {
(g_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);
rec->own_host = g_strdup(config_node_get_str(node, "own_host", NULL));
signal_emit("server setup read", 2, rec, node);
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",
if (rec->autoconnect)
iconfig_node_set_bool(node, "autoconnect", TRUE);
+ if (rec->no_proxy)
+ iconfig_node_set_bool(node, "no_proxy", TRUE);
signal_emit("server setup saved", 2, rec, node);
}
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)
/* Read servers */
node = iconfig_node_traverse("servers", FALSE);
if (node != NULL) {
- for (tmp = node->value; tmp != NULL; tmp = tmp->next)
+ tmp = config_node_first(node->value);
+ for (; tmp != NULL; tmp = config_node_next(tmp))
server_setup_read(tmp->data);
}
}
settings_add_str("server", "user_name", NULL);
settings_add_str("server", "real_name", NULL);
+ settings_add_bool("server", "use_ssl", FALSE);
+ settings_add_str("server", "ssl_cert", NULL);
+ settings_add_str("server", "ssl_pkey", NULL);
+ settings_add_bool("server", "ssl_verify", FALSE);
+ settings_add_str("server", "ssl_cafile", NULL);
+ settings_add_str("server", "ssl_cacert", NULL);
+
settings_add_bool("proxy", "use_proxy", FALSE);
settings_add_str("proxy", "proxy_address", "");
settings_add_int("proxy", "proxy_port", 6667);
settings_add_str("proxy", "proxy_string", "CONNECT %s %d");
+ settings_add_str("proxy", "proxy_string_after", "");
settings_add_str("proxy", "proxy_password", "");
setupservers = NULL;