aboutsummaryrefslogtreecommitdiffstats
path: root/irc.c
diff options
context:
space:
mode:
Diffstat (limited to 'irc.c')
-rw-r--r--irc.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/irc.c b/irc.c
index 835bffa0..1d5a5e6a 100644
--- a/irc.c
+++ b/irc.c
@@ -36,6 +36,7 @@ static char *set_eval_charset(set_t *set, char *value);
static char *set_eval_password(set_t *set, char *value);
static char *set_eval_bw_compat(set_t *set, char *value);
static char *set_eval_utf8_nicks(set_t *set, char *value);
+static char *set_eval_certfp(set_t *set, char *value);
irc_t *irc_new(int fd)
{
@@ -64,6 +65,8 @@ irc_t *irc_new(int fd)
irc->iconv = (GIConv) - 1;
irc->oconv = (GIConv) - 1;
+ irc->save_source_id = -1;
+
if (global.conf->hostname) {
myhost = g_strdup(global.conf->hostname);
} else if (getsockname(irc->fd, (struct sockaddr*) &sock, &socklen) == 0) {
@@ -102,6 +105,7 @@ irc_t *irc_new(int fd)
b->ui = &irc_ui_funcs;
s = set_add(&b->set, "allow_takeover", "true", set_eval_bool, irc);
+ s = set_add(&b->set, "auto_save", "true", set_eval_bool, irc);
s = set_add(&b->set, "away_devoice", "true", set_eval_bw_compat, irc);
s->flags |= SET_HIDDEN;
s = set_add(&b->set, "away_reply_timeout", "3600", set_eval_int, irc);
@@ -116,6 +120,7 @@ irc_t *irc_new(int fd)
s = set_add(&b->set, "nick_format", "%-@nick", NULL, irc);
s = set_add(&b->set, "offline_user_quits", "true", set_eval_bool, irc);
s = set_add(&b->set, "ops", "both", set_eval_irc_channel_ops, irc);
+ s = set_add(&b->set, "ops_mode", "@", set_eval_irc_channel_ops_mode, irc);
s = set_add(&b->set, "paste_buffer", "false", set_eval_bool, irc);
s->old_key = g_strdup("buddy_sendbuffer");
s = set_add(&b->set, "paste_buffer_delay", "200", set_eval_int, irc);
@@ -134,6 +139,14 @@ irc_t *irc_new(int fd)
s = set_add(&b->set, "to_char", ": ", set_eval_to_char, irc);
s = set_add(&b->set, "typing_notice", "false", set_eval_bool, irc);
s = set_add(&b->set, "utf8_nicks", "false", set_eval_utf8_nicks, irc);
+ s = set_add(&b->set, "strict_away", "false", set_eval_bool, irc);
+ s = set_add(&b->set, "only_log_tags", "false", set_eval_bool, irc);
+#ifdef WITH_GNUTLS
+ if (global.conf->ssl) {
+ s = set_add(&b->set, "_certfp", NULL, set_eval_certfp, irc);
+ s->flags = SET_NULL_OK | SET_HIDDEN;
+ }
+#endif
irc->root = iu = irc_user_new(irc, ROOT_NICK);
iu->host = g_strdup(myhost);
@@ -272,8 +285,14 @@ void irc_free(irc_t * irc)
b_event_remove(irc->w_watch_source_id);
}
+ if (global.conf->ssl) {
+ gnutls_bye(irc->ssl_session, GNUTLS_SHUT_WR);
+ }
closesocket(irc->fd);
irc->fd = -1;
+ if (global.conf->ssl) {
+ gnutls_deinit(irc->ssl_session);
+ }
g_hash_table_foreach_remove(irc->nick_user_hash, irc_free_hashkey, NULL);
g_hash_table_destroy(irc->nick_user_hash);
@@ -656,7 +675,12 @@ void irc_flush(irc_t *irc)
}
len = strlen(irc->sendbuffer);
- if ((n = send(irc->fd, irc->sendbuffer, len, 0)) == len) {
+ if (global.conf->ssl) {
+ n = ssl_server_write(irc, irc->sendbuffer, len);
+ } else {
+ n = send(irc->fd, irc->sendbuffer, len, 0);
+ }
+ if (n == len) {
g_free(irc->sendbuffer);
irc->sendbuffer = NULL;
@@ -731,6 +755,11 @@ int irc_check_login(irc_t *irc)
if (global.conf->authmode == AUTHMODE_CLOSED && !(irc->status & USTATUS_AUTHORIZED)) {
irc_send_num(irc, 464, ":This server is password-protected.");
return 0;
+ } else if (global.conf->authmode == AUTHMODE_SASL &&
+ (!(irc->caps & CAP_SASL) ||
+ !(irc->status & USTATUS_SASL_AUTHENTICATED))) {
+ irc_send_num(irc, 464, ":This server requires sasl.");
+ return 0;
} else {
irc_channel_t *ic;
irc_user_t *iu = irc->user;
@@ -972,6 +1001,12 @@ static char *set_eval_utf8_nicks(set_t *set, char *value)
return set_eval_bool(set, value);
}
+static char *set_eval_certfp(set_t *set, char *value)
+{
+ /* XXX: What should we do here? */
+ return value;
+}
+
void register_irc_plugin(const struct irc_plugin *p)
{
irc_plugins = g_slist_prepend(irc_plugins, (gpointer) p);