diff options
Diffstat (limited to 'irc.c')
| -rw-r--r-- | irc.c | 33 | 
1 files changed, 32 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)  { @@ -116,6 +117,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 +136,13 @@ 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); +#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 +281,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 +671,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 +751,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 +997,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); | 
