diff options
Diffstat (limited to 'irc.c')
-rw-r--r-- | irc.c | 37 |
1 files changed, 36 insertions, 1 deletions
@@ -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); |