aboutsummaryrefslogtreecommitdiffstats
path: root/irc.c
diff options
context:
space:
mode:
Diffstat (limited to 'irc.c')
-rw-r--r--irc.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/irc.c b/irc.c
index a73a3111..be804c45 100644
--- a/irc.c
+++ b/irc.c
@@ -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);