diff options
Diffstat (limited to 'irc.c')
-rw-r--r-- | irc.c | 42 |
1 files changed, 41 insertions, 1 deletions
@@ -37,6 +37,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) { @@ -62,6 +63,8 @@ irc_t *irc_new(int fd) irc->iconv = (GIConv) - 1; irc->oconv = (GIConv) - 1; + irc->save_source_id = -1; + if (global.conf->ping_interval > 0 && global.conf->ping_timeout > 0) { irc->ping_source_id = b_timeout_add(global.conf->ping_interval * 1000, irc_userping, irc); } @@ -73,6 +76,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); @@ -88,6 +92,7 @@ irc_t *irc_new(int fd) s = set_add(&b->set, "nick_underscores", "false", set_eval_bool, 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); @@ -106,6 +111,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->fullname = g_strdup(ROOT_FN); @@ -246,6 +259,11 @@ void irc_free(irc_t * irc) log_message(LOGLVL_INFO, "Destroying connection with fd %d", irc->fd); + if (irc->save_source_id != -1) { + b_event_remove(irc->save_source_id); + irc->save_source_id = -1; + } + if (irc->status & USTATUS_IDENTIFIED && set_getbool(&irc->b->set, "save_on_quit")) { if (storage_save(irc, NULL, TRUE) != STORAGE_OK) { log_message(LOGLVL_WARNING, "Error while saving settings for user %s", irc->user->nick); @@ -288,8 +306,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); @@ -672,7 +696,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; @@ -747,6 +776,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; @@ -988,6 +1022,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); |