Add SASL authentication in IRC plugin (task #8829), add function "string_encode_base64" in plugin API, fix bug with base64 encoding

New options for IRC servers:
- sasl_mechanism (only "plain" for now)
- sasl_username
- sasl_password
v2.8-utf8proc
Sebastien Helleu 2010-02-15 11:51:44 +01:00
parent 34272b7e4d
commit 341551f2f2
26 changed files with 925 additions and 115 deletions

View File

@ -1,7 +1,7 @@
WeeChat ChangeLog
=================
FlashCode <flashcode@flashtux.org>
v0.3.2-dev, 2010-02-12
v0.3.2-dev, 2010-02-15
Version 0.3.2 (under dev!)
@ -20,9 +20,11 @@ Version 0.3.2 (under dev!)
input (bug #28754)
* api: add "version_number" for function info_get to get WeeChat version as
number
* api: add function "string_encode_base64", fix bug with base64 encoding
* api: add missing infos in functions buffer_get_integer / buffer_get_string
and in buffer infolist
* api: add description of arguments for functions hook_info and hook_infolist
* irc: add SASL authentication (task #8829)
* irc: fix crash with SSL connection if option ssl_cert is set (bug #28752)
* irc: fix bug with SSL connection (fails sometimes when ssl_verify is on)
(bug #28741)

View File

@ -308,6 +308,21 @@
** type: string
** values: any string (default value: "")
* *irc.server_default.sasl_mechanism*
** description: mechanism for SASL authentication
** type: integer
** values: plain (default value: plain)
* *irc.server_default.sasl_password*
** description: password for SASL authentication
** type: string
** values: any string (default value: "")
* *irc.server_default.sasl_username*
** description: username for SASL authentication
** type: string
** values: any string (default value: "")
* *irc.server_default.ssl*
** description: use SSL for server communication
** type: boolean

View File

@ -1108,6 +1108,33 @@ str = weechat.string_remove_color(string, replacement)
str = weechat.string_remove_color(my_string, "?")
----------------------------------------
weechat_string_encode_base64
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Encode a string in base64.
Prototype:
[source,C]
----------------------------------------
void weechat_string_encode_base64 (const char *from, int length, char *to);
----------------------------------------
Arguments:
* 'from': string to encode
* 'length': length of string to encode (for example `strlen(from)`)
* 'to': pointer to string to store result (must be long enough)
Example:
[source,C]
----------------------------------------
char *string = "abcdefgh", result[128];
weechat_string_encode_base64 (string, strlen (string), result);
/* result == "YWJjZGVmZ2g=" */
----------------------------------------
[[utf-8]]
UTF-8
~~~~~

View File

@ -308,6 +308,21 @@
** type: chaîne
** valeurs: toute chaîne (valeur par défaut: "")
* *irc.server_default.sasl_mechanism*
** description: mécanisme pour l'authentification SASL
** type: entier
** valeurs: plain (valeur par défaut: plain)
* *irc.server_default.sasl_password*
** description: mot de passe pour l'authentification SASL
** type: chaîne
** valeurs: toute chaîne (valeur par défaut: "")
* *irc.server_default.sasl_username*
** description: nom d'utilisateur pour l'authentification SASL
** type: chaîne
** valeurs: toute chaîne (valeur par défaut: "")
* *irc.server_default.ssl*
** description: utiliser SSL pour la communication avec le serveur
** type: booléen

View File

@ -1122,6 +1122,34 @@ str = weechat.string_remove_color(string, replacement)
str = weechat.string_remove_color(ma_chaine, "?")
----------------------------------------
weechat_string_encode_base64
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Encode une chaîne en base64.
Prototype :
[source,C]
----------------------------------------
void weechat_string_encode_base64 (const char *from, int length, char *to);
----------------------------------------
Paramètres :
* 'from': chaîne à encoder
* 'length': longueur de chaîne à encoder (par exemple `strlen(from)`)
* 'to': pointeur vers la chaîne pour stocker le résultat (doit être suffisamment
long)
Exemple :
[source,C]
----------------------------------------
char *string = "abcdefgh", result[128];
weechat_string_encode_base64 (string, strlen (string), result);
/* result == "YWJjZGVmZ2g=" */
----------------------------------------
[[utf-8]]
UTF-8
~~~~~

View File

@ -308,6 +308,21 @@
** tipo: stringa
** valori: qualsiasi stringa (valore predefinito: "")
* *irc.server_default.sasl_mechanism*
** descrizione: mechanism for SASL authentication
** tipo: intero
** valori: plain (valore predefinito: plain)
* *irc.server_default.sasl_password*
** descrizione: password for SASL authentication
** tipo: stringa
** valori: qualsiasi stringa (valore predefinito: "")
* *irc.server_default.sasl_username*
** descrizione: username for SASL authentication
** tipo: stringa
** valori: qualsiasi stringa (valore predefinito: "")
* *irc.server_default.ssl*
** descrizione: utilizza SSL per le comunicazioni col server
** tipo: bool

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.3.2-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: 2010-01-23 11:56+0100\n"
"Last-Translator: Jiri Golembiovsky <golemj@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -4027,6 +4027,15 @@ msgstr ""
msgid "password for server"
msgstr "heslo pro server"
msgid "mechanism for SASL authentication"
msgstr ""
msgid "username for SASL authentication"
msgstr ""
msgid "password for SASL authentication"
msgstr ""
msgid "automatically connect to server when WeeChat is starting"
msgstr "automaticky připojit k serveru, když je WeeChat spouštěn"
@ -4420,6 +4429,22 @@ msgstr "%s%s: nejste připojen k serveru"
msgid "%s%s: this buffer is not a channel!"
msgstr "%s%s: tenhle buffer není kanál!"
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr ""
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr ""
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr ""
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr ""
#, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr "%sByl jsi pozván na %s%s%s od %s%s%s"
@ -4742,6 +4767,10 @@ msgstr "(spojení uzavřeno druhou stranou)"
msgid "%s: disconnecting from server..."
msgstr "%s: odpojuji se od serveru..."
#, c-format
msgid "%s%s: sasl authentication timeout"
msgstr ""
#, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr "%s: zpoždění je veliké, odpojuji se od serveru..."

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.3.2-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: 2010-02-09 16:11+0100\n"
"Last-Translator: Nils G <weechatter@arcor.de>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -4211,6 +4211,15 @@ msgstr "Überprüfe ob die SSL-Verbindung vertrauenswürdig ist."
msgid "password for server"
msgstr "Passwort für den Server"
msgid "mechanism for SASL authentication"
msgstr ""
msgid "username for SASL authentication"
msgstr ""
msgid "password for SASL authentication"
msgstr ""
msgid "automatically connect to server when WeeChat is starting"
msgstr "Automatisch mit dem Server verbinden, wenn WeeChat gestartet wird"
@ -4621,6 +4630,22 @@ msgstr "%s%s: Es besteht keine Verbindung zum Server"
msgid "%s%s: this buffer is not a channel!"
msgstr "%s%s: Dieser Buffer ist kein Channel!"
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr ""
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr ""
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr ""
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr ""
#, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr "%sDu bist in den Channel %s%s%s von %s%s%s eingeladen worden"
@ -4938,6 +4963,10 @@ msgstr "(Verbindung wurde durch Peer getrennt)"
msgid "%s: disconnecting from server..."
msgstr "%s: Trennung vom Server..."
#, c-format
msgid "%s%s: sasl authentication timeout"
msgstr ""
#, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr "%s: Lag ist zu hoch, die Verbindung wird getrennt..."

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.3.2-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: 2010-01-23 11:56+0100\n"
"Last-Translator: Elián Hanisch <lambdae2@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -4110,6 +4110,18 @@ msgstr "verificar que la conexión SSL es confiable completamente"
msgid "password for server"
msgstr "contraseña del servidor"
#, fuzzy
msgid "mechanism for SASL authentication"
msgstr "usar SSL para la comunicación del servidor"
#, fuzzy
msgid "username for SASL authentication"
msgstr "usar SSL para la comunicación del servidor"
#, fuzzy
msgid "password for SASL authentication"
msgstr "usar SSL para la comunicación del servidor"
msgid "automatically connect to server when WeeChat is starting"
msgstr "conectarse automáticamente al servidor cuando WeeChat se inicia"
@ -4512,6 +4524,22 @@ msgstr "%s%s: no estas conectado a ningún servidor"
msgid "%s%s: this buffer is not a channel!"
msgstr "%s%s: ¡este buffer no es un canal!"
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr ""
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr ""
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr ""
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr ""
#, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr "%sUsted ha sido invitado a %s%s%s por %s%s%s"
@ -4828,6 +4856,10 @@ msgstr "(conexión cerrara por un par)"
msgid "%s: disconnecting from server..."
msgstr "%s: desconectado del servidor..."
#, fuzzy, c-format
msgid "%s%s: sasl authentication timeout"
msgstr "No es posible escribir un fichero de log para un búfer\n"
#, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr "%s: el retraso es alto, desconectando del servidor..."
@ -6502,10 +6534,6 @@ msgstr "entero"
#~ msgid "use TLS cryptographic protocol for server communication"
#~ msgstr "usar el protocolo IPv6 para la comunicación del servidor"
#, fuzzy
#~ msgid "use SASL for authentication"
#~ msgstr "usar SSL para la comunicación del servidor"
#, fuzzy
#~ msgid "password"
#~ msgstr "contraseña de usuario"
@ -6763,10 +6791,6 @@ msgstr "entero"
#~ "%s No ha sido posible conectar con SSL debido a que Weechat no fue "
#~ "compilado con soporte GNUtls\n"
#, fuzzy
#~ msgid "%s%s: authentication failed"
#~ msgstr "No es posible escribir un fichero de log para un búfer\n"
#, fuzzy
#~ msgid "list of Jabber ignore"
#~ msgstr "puerto para el servidor IRC"

View File

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.3.2-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"PO-Revision-Date: 2010-02-12 16:29+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: 2010-02-15 10:01+0100\n"
"Last-Translator: FlashCode <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"MIME-Version: 1.0\n"
@ -4160,6 +4160,15 @@ msgstr "vérifier que la connexion ssl est entièrement de confiance"
msgid "password for server"
msgstr "mot de passe pour le serveur"
msgid "mechanism for SASL authentication"
msgstr "mécanisme pour l'authentification SASL"
msgid "username for SASL authentication"
msgstr "nom d'utilisateur pour l'authentification SASL"
msgid "password for SASL authentication"
msgstr "mot de passe pour l'authentification SASL"
msgid "automatically connect to server when WeeChat is starting"
msgstr "connexion automatique au serveur quand WeeChat démarre"
@ -4558,6 +4567,22 @@ msgstr "%s%s: vous n'êtes pas connecté au serveur"
msgid "%s%s: this buffer is not a channel!"
msgstr "%s%s: ce tampon n'est pas un canal !"
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr "%s%s: client capability, le serveur supporte: %s"
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr "%s%s: client capability, demande: sasl"
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr "%s%s: client capability: sasl non supporté"
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr "%s%s: client capability, activé: %s"
#, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr "%sVous avez été invité sur %s%s%s par %s%s%s"
@ -4876,6 +4901,10 @@ msgstr "(connexion fermée par l'hôte distant)"
msgid "%s: disconnecting from server..."
msgstr "%s: déconnexion du serveur..."
#, c-format
msgid "%s%s: sasl authentication timeout"
msgstr "%s%s: délai d'authentification sasl dépassé"
#, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr "%s: le lag est élevé, déconnexion du serveur..."

View File

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.3.2-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: 2010-01-23 11:57+0100\n"
"Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -3960,6 +3960,18 @@ msgstr ""
msgid "password for server"
msgstr "jelszó az IRC szerveren"
#, fuzzy
msgid "mechanism for SASL authentication"
msgstr "SSL használata a a kapcsolathoz"
#, fuzzy
msgid "username for SASL authentication"
msgstr "SSL használata a a kapcsolathoz"
#, fuzzy
msgid "password for SASL authentication"
msgstr "SSL használata a a kapcsolathoz"
msgid "automatically connect to server when WeeChat is starting"
msgstr "automatikus csatlakozás a szerverhez a WeeChat indulásakor"
@ -4362,6 +4374,22 @@ msgstr "%s nincs csatlakozva szerverhez!\n"
msgid "%s%s: this buffer is not a channel!"
msgstr "Ez az ablak nem egy szoba!\n"
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr ""
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr ""
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr ""
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr ""
#, fuzzy, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr "Meghívást kapott a %s%s%s szobába %s%s felhasználótól\n"
@ -4671,6 +4699,10 @@ msgstr ""
msgid "%s: disconnecting from server..."
msgstr "Lekapcsolódott a szerverről!\n"
#, fuzzy, c-format
msgid "%s%s: sasl authentication timeout"
msgstr "Nem sikerült a(z) \"%s\" naplófájlt írni\n"
#, fuzzy, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr "%s túl nagy a késés(lag), lecsatlakozás a szerverről...\n"
@ -6342,10 +6374,6 @@ msgstr "perc"
#~ msgid "use TLS cryptographic protocol for server communication"
#~ msgstr "IPv6 protokoll használata a kapcsolathoz"
#, fuzzy
#~ msgid "use SASL for authentication"
#~ msgstr "SSL használata a a kapcsolathoz"
#, fuzzy
#~ msgid "password"
#~ msgstr "felhasználó jelszó"
@ -6610,10 +6638,6 @@ msgstr "perc"
#~ "%s nem sikerült SSL használattal kapcsolódni, mert a WeeChat GNUtls "
#~ "támogatás nélkül lett fordítva\n"
#, fuzzy
#~ msgid "%s%s: authentication failed"
#~ msgstr "Nem sikerült a(z) \"%s\" naplófájlt írni\n"
#, fuzzy
#~ msgid "list of Jabber ignore"
#~ msgstr "IRC szerver portja"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Weechat 0.3.2-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: 2010-01-23 11:57+0100\n"
"Last-Translator: Marco Paolone <marcopaolone@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -4112,6 +4112,15 @@ msgstr "verifica che la connessione ssl sia totalmente fidata"
msgid "password for server"
msgstr "password per il server"
msgid "mechanism for SASL authentication"
msgstr ""
msgid "username for SASL authentication"
msgstr ""
msgid "password for SASL authentication"
msgstr ""
msgid "automatically connect to server when WeeChat is starting"
msgstr "connette automaticamente ai server all'avvio di WeeChat"
@ -4513,6 +4522,22 @@ msgstr "%s%s: non connesso al server"
msgid "%s%s: this buffer is not a channel!"
msgstr "%s%s: questo buffer non è un canale!"
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr ""
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr ""
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr ""
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr ""
#, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr "%sSei stato invitato su %s%s%s da %s%s%s"
@ -4829,6 +4854,10 @@ msgstr "(connessione chiusa dal peer)"
msgid "%s: disconnecting from server..."
msgstr "%s: disconnessione dal server..."
#, c-format
msgid "%s%s: sasl authentication timeout"
msgstr ""
#, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr "%s: ritardo eccessivo, disconnessione dal server..."

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.3.0-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: 2010-02-09 15:52+0100\n"
"Last-Translator: Krzysztof Koroscik <soltys@szluug.org>\n"
"Language-Team: Polish\n"
@ -4111,6 +4111,15 @@ msgstr "sprawdź czy połączenie ssl jest w pełni zaufane"
msgid "password for server"
msgstr "hasło dla serwera"
msgid "mechanism for SASL authentication"
msgstr ""
msgid "username for SASL authentication"
msgstr ""
msgid "password for SASL authentication"
msgstr ""
msgid "automatically connect to server when WeeChat is starting"
msgstr "automatycznie połącz się z serwerem przy uruchamianiu WeeChat"
@ -4509,6 +4518,22 @@ msgstr "%s%s: nie jesteś połączony z serwerem"
msgid "%s%s: this buffer is not a channel!"
msgstr "%s%s: to nie jest bufor kanału"
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr ""
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr ""
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr ""
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr ""
#, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr "%sZostałeś zaproszony na %s%s%s przez %s%s%s"
@ -4825,6 +4850,10 @@ msgstr "(połączenie zamknięte przez drugą stronę)"
msgid "%s: disconnecting from server..."
msgstr "%s: rozłączam z serwerem"
#, c-format
msgid "%s%s: sasl authentication timeout"
msgstr ""
#, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr "%s: za duze opóźnienie, rozłączam z serwerem..."

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat 0.3.2-dev\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: 2010-01-23 11:57+0100\n"
"Last-Translator: Pavel Shevchuk <stlwrt@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -3961,6 +3961,18 @@ msgstr ""
msgid "password for server"
msgstr "пароль, используемый при подключении к IRC серверу"
#, fuzzy
msgid "mechanism for SASL authentication"
msgstr "использовать SSL при связи с сервером"
#, fuzzy
msgid "username for SASL authentication"
msgstr "использовать SSL при связи с сервером"
#, fuzzy
msgid "password for SASL authentication"
msgstr "использовать SSL при связи с сервером"
msgid "automatically connect to server when WeeChat is starting"
msgstr "подключаться к серверу автоматически при запуске WeeChat"
@ -4364,6 +4376,22 @@ msgstr "%s вы не подключены к серверу\n"
msgid "%s%s: this buffer is not a channel!"
msgstr "Это окно не является каналом!\n"
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr ""
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr ""
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr ""
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr ""
#, fuzzy, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr "Вас пригласил на %s%s%s пользователь %s%s\n"
@ -4679,6 +4707,10 @@ msgstr ""
msgid "%s: disconnecting from server..."
msgstr "Отключен от сервера!\n"
#, fuzzy, c-format
msgid "%s%s: sasl authentication timeout"
msgstr "Не могу записать лог-файл \"%s\"\n"
#, fuzzy, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr "%s задержка слишком высокая, отключаюсь от сервера...\n"
@ -6335,10 +6367,6 @@ msgstr "минута"
#~ msgid "use TLS cryptographic protocol for server communication"
#~ msgstr "использовать IPv6 при связи с сервером"
#, fuzzy
#~ msgid "use SASL for authentication"
#~ msgstr "использовать SSL при связи с сервером"
#, fuzzy
#~ msgid "password"
#~ msgstr "пользователь пароль"
@ -6598,10 +6626,6 @@ msgstr "минута"
#~ "%s невозможно соединиться с использованием SSL, так как WeeChat собран "
#~ "без поддержки GNUtls\n"
#, fuzzy
#~ msgid "%s%s: authentication failed"
#~ msgstr "Не могу записать лог-файл \"%s\"\n"
#, fuzzy
#~ msgid "list of Jabber ignore"
#~ msgstr "порт IRC сервера"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2010-02-12 16:45+0100\n"
"POT-Creation-Date: 2010-02-15 11:45+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -3378,6 +3378,15 @@ msgstr ""
msgid "password for server"
msgstr ""
msgid "mechanism for SASL authentication"
msgstr ""
msgid "username for SASL authentication"
msgstr ""
msgid "password for SASL authentication"
msgstr ""
msgid "automatically connect to server when WeeChat is starting"
msgstr ""
@ -3721,6 +3730,22 @@ msgstr ""
msgid "%s%s: this buffer is not a channel!"
msgstr ""
#, c-format
msgid "%s%s: client capability, server supports: %s"
msgstr ""
#, c-format
msgid "%s%s: client capability, requesting: sasl"
msgstr ""
#, c-format
msgid "%s%s: client capability: sasl not supported"
msgstr ""
#, c-format
msgid "%s%s: client capability, enabled: %s"
msgstr ""
#, c-format
msgid "%sYou have been invited to %s%s%s by %s%s%s"
msgstr ""
@ -4019,6 +4044,10 @@ msgstr ""
msgid "%s: disconnecting from server..."
msgstr ""
#, c-format
msgid "%s%s: sasl authentication timeout"
msgstr ""
#, c-format
msgid "%s: lag is high, disconnecting from server..."
msgstr ""

View File

@ -99,67 +99,6 @@ network_end ()
#endif
}
/*
* network_convbase64_8x3_to_6x4 : convert 3 bytes of 8 bits in 4 bytes of 6 bits
*/
void
network_convbase64_8x3_to_6x4 (const char *from, char *to)
{
unsigned char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz0123456789+/";
to[0] = base64_table [ (from[0] & 0xfc) >> 2 ];
to[1] = base64_table [ ((from[0] & 0x03) << 4) + ((from[1] & 0xf0) >> 4) ];
to[2] = base64_table [ ((from[1] & 0x0f) << 2) + ((from[2] & 0xc0) >> 6) ];
to[3] = base64_table [ from[2] & 0x3f ];
}
/*
* network_base64encode: encode a string in base64
*/
void
network_base64encode (const char *from, char *to)
{
const char *f;
char *t;
int from_len;
from_len = strlen (from);
f = from;
t = to;
while (from_len >= 3)
{
network_convbase64_8x3_to_6x4 (f, t);
f += 3 * sizeof (*f);
t += 4 * sizeof (*t);
from_len -= 3;
}
if (from_len > 0)
{
char rest[3] = { 0, 0, 0 };
switch (from_len)
{
case 1 :
rest[0] = f[0];
network_convbase64_8x3_to_6x4 (rest, t);
t[2] = t[3] = '=';
break;
case 2 :
rest[0] = f[0];
rest[1] = f[1];
network_convbase64_8x3_to_6x4 (rest, t);
t[3] = '=';
break;
}
t[4] = 0;
}
}
/*
* network_pass_httpproxy: establish connection/authentification to an
* http proxy
@ -182,7 +121,7 @@ network_pass_httpproxy (struct t_proxy *proxy, int sock, const char *address,
CONFIG_STRING(proxy->options[PROXY_OPTION_USERNAME]),
(CONFIG_STRING(proxy->options[PROXY_OPTION_PASSWORD])) ?
CONFIG_STRING(proxy->options[PROXY_OPTION_PASSWORD]) : "");
network_base64encode (authbuf, authbuf_base64);
string_encode_base64 (authbuf, strlen (authbuf), authbuf_base64);
n = snprintf (buffer, sizeof (buffer),
"CONNECT %s:%d HTTP/1.0\r\nProxy-Authorization: Basic %s\r\n\r\n",
address, port, authbuf_base64);

View File

@ -1271,3 +1271,65 @@ string_format_size (unsigned long size)
return strdup (str_size);
}
/*
* string_convbase64_8x3_to_6x4 : convert 3 bytes of 8 bits in 4 bytes of 6 bits
*/
void
string_convbase64_8x3_to_6x4 (const char *from, char *to)
{
unsigned char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz0123456789+/";
to[0] = base64_table [ (from[0] & 0xfc) >> 2 ];
to[1] = base64_table [ ((from[0] & 0x03) << 4) + ((from[1] & 0xf0) >> 4) ];
to[2] = base64_table [ ((from[1] & 0x0f) << 2) + ((from[2] & 0xc0) >> 6) ];
to[3] = base64_table [ from[2] & 0x3f ];
}
/*
* string_encode_base64: encode a string in base64
* length is number of bytes in "from" to convert
* (commonly strlen(from))
*/
void
string_encode_base64 (const char *from, int length, char *to)
{
const char *ptr_from;
char *ptr_to;
ptr_from = from;
ptr_to = to;
while (length >= 3)
{
string_convbase64_8x3_to_6x4 (ptr_from, ptr_to);
ptr_from += 3 * sizeof (*ptr_from);
ptr_to += 4 * sizeof (*ptr_to);
length -= 3;
}
if (length > 0)
{
char rest[3] = { 0, 0, 0 };
switch (length)
{
case 1 :
rest[0] = ptr_from[0];
string_convbase64_8x3_to_6x4 (rest, ptr_to);
ptr_to[2] = ptr_to[3] = '=';
break;
case 2 :
rest[0] = ptr_from[0];
rest[1] = ptr_from[1];
string_convbase64_8x3_to_6x4 (rest, ptr_to);
ptr_to[3] = '=';
break;
}
ptr_to[4] = 0;
}
else
ptr_to[0] = '\0';
}

View File

@ -56,5 +56,6 @@ extern char *string_iconv_from_internal (const char *charset,
const char *string);
extern void string_iconv_fprintf (FILE *file, const char *data, ...);
extern char *string_format_size (unsigned long size);
extern void string_encode_base64 (const char *from, int length, char *to);
#endif /* wee-string.h */

View File

@ -1247,7 +1247,7 @@ irc_command_disconnect_one_server (struct t_irc_server *server)
return 0;
if ((!server->is_connected) && (!server->hook_connect)
&& (server->reconnect_start == 0))
&& (!server->hook_fd) && (server->reconnect_start == 0))
{
weechat_printf (server->buffer,
_("%s%s: not connected to server \"%s\"!"),
@ -1296,6 +1296,7 @@ irc_command_disconnect (void *data, struct t_gui_buffer *buffer, int argc,
ptr_server = ptr_server->next_server)
{
if ((ptr_server->is_connected) || (ptr_server->hook_connect)
|| (ptr_server->hook_fd)
|| (ptr_server->reconnect_start != 0))
{
if (!irc_command_disconnect_one_server (ptr_server))
@ -2853,7 +2854,7 @@ irc_command_quote (void *data, struct t_gui_buffer *buffer, int argc,
/*
* irc_command_reconnect_one_server: reconnect to a server
* return 0 if error, 1 if ok
* return 0 if error, 1 if ok
*/
int
@ -2862,7 +2863,8 @@ irc_command_reconnect_one_server (struct t_irc_server *server, int no_join)
if (!server)
return 0;
if ((!server->is_connected) && (!server->hook_connect))
if ((!server->is_connected) && (!server->hook_connect)
&& (!server->hook_fd))
{
weechat_printf (server->buffer,
_("%s%s: not connected to server \"%s\"!"),
@ -2918,7 +2920,8 @@ irc_command_reconnect (void *data, struct t_gui_buffer *buffer, int argc,
ptr_server = ptr_server->next_server)
{
nb_reconnect++;
if ((ptr_server->is_connected) || (ptr_server->hook_connect))
if ((ptr_server->is_connected) || (ptr_server->hook_connect)
|| (ptr_server->hook_fd))
{
if (!irc_command_reconnect_one_server (ptr_server, no_join))
reconnect_ok = 0;

View File

@ -964,6 +964,42 @@ irc_config_server_new_option (struct t_config_file *config_file,
callback_change, callback_change_data,
NULL, NULL);
break;
case IRC_SERVER_OPTION_SASL_MECHANISM:
new_option = weechat_config_new_option (
config_file, section,
option_name, "integer",
N_("mechanism for SASL authentication"),
"plain" /*"plain|dh-blowfish"*/, 0, 0,
default_value, value,
null_value_allowed,
NULL, NULL,
callback_change, callback_change_data,
NULL, NULL);
break;
case IRC_SERVER_OPTION_SASL_USERNAME:
new_option = weechat_config_new_option (
config_file, section,
option_name, "string",
N_("username for SASL authentication"),
NULL, 0, 0,
default_value, value,
null_value_allowed,
NULL, NULL,
callback_change, callback_change_data,
NULL, NULL);
break;
case IRC_SERVER_OPTION_SASL_PASSWORD:
new_option = weechat_config_new_option (
config_file, section,
option_name, "string",
N_("password for SASL authentication"),
NULL, 0, 0,
default_value, value,
null_value_allowed,
NULL, NULL,
callback_change, callback_change_data,
NULL, NULL);
break;
case IRC_SERVER_OPTION_AUTOCONNECT:
new_option = weechat_config_new_option (
config_file, section,

View File

@ -172,7 +172,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT,
(server->temp_server) ? _(" (temporary)") : "");
/* addresses */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_ADDRESSES]))
weechat_printf (NULL, " addresses. . . . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_ADDRESSES));
@ -180,6 +180,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " addresses. . . . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_ADDRESSES]));
/* proxy */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_PROXY]))
weechat_printf (NULL, " proxy. . . . . . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_PROXY));
@ -187,6 +188,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " proxy. . . . . . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_PROXY]));
/* ipv6 */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_IPV6]))
weechat_printf (NULL, " ipv6 . . . . . . . . : (%s)",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_IPV6)) ?
@ -196,6 +198,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_boolean (server->options[IRC_SERVER_OPTION_IPV6]) ?
_("on") : _("off"));
/* ssl */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_SSL]))
weechat_printf (NULL, " ssl. . . . . . . . . : (%s)",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_SSL)) ?
@ -205,7 +208,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_boolean (server->options[IRC_SERVER_OPTION_SSL]) ?
_("on") : _("off"));
/* ssl_cert */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_SSL_CERT]))
weechat_printf (NULL, " ssl_cert . . . . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_SSL_CERT));
@ -213,6 +216,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " ssl_cert . . . . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_SSL_CERT]));
/* ssl_dhkey_size */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_SSL_DHKEY_SIZE]))
weechat_printf (NULL, " ssl_dhkey_size . . . : (%d)",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_SSL_DHKEY_SIZE));
@ -220,6 +224,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " ssl_dhkey_size . . . : %s%d",
IRC_COLOR_CHAT_VALUE,
weechat_config_integer (server->options[IRC_SERVER_OPTION_SSL_DHKEY_SIZE]));
/* ssl_verify */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_SSL_VERIFY]))
weechat_printf (NULL, " ssl_verify . . . . . : (%s)",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_SSL_VERIFY)) ?
@ -229,6 +234,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_boolean (server->options[IRC_SERVER_OPTION_SSL_VERIFY]) ?
_("on") : _("off"));
/* password */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_PASSWORD]))
weechat_printf (NULL, " password . . . . . . : %s",
_("(hidden)"));
@ -236,6 +242,31 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " password . . . . . . : %s%s",
IRC_COLOR_CHAT_VALUE,
_("(hidden)"));
/* sasl_mechanism */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_SASL_MECHANISM]))
weechat_printf (NULL, " sasl_mechanism . . . : ('%s')",
irc_sasl_mechanism_string[IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_SASL_MECHANISM)]);
else
weechat_printf (NULL, " sasl_mechanism . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
irc_sasl_mechanism_string[weechat_config_integer (server->options[IRC_SERVER_OPTION_SASL_MECHANISM])]);
/* sasl_username */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_SASL_USERNAME]))
weechat_printf (NULL, " sasl_username. . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_SASL_USERNAME));
else
weechat_printf (NULL, " sasl_username. . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_SASL_USERNAME]));
/* sasl_password */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_SASL_PASSWORD]))
weechat_printf (NULL, " sasl_password. . . . : %s",
_("(hidden)"));
else
weechat_printf (NULL, " sasl_password. . . . : %s%s",
IRC_COLOR_CHAT_VALUE,
_("(hidden)"));
/* autoconnect */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_AUTOCONNECT]))
weechat_printf (NULL, " autoconnect. . . . . : (%s)",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_AUTOCONNECT)) ?
@ -245,6 +276,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_boolean (server->options[IRC_SERVER_OPTION_AUTOCONNECT]) ?
_("on") : _("off"));
/* autoreconnect */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_AUTORECONNECT]))
weechat_printf (NULL, " autoreconnect. . . . : (%s)",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_AUTORECONNECT)) ?
@ -254,6 +286,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_boolean (server->options[IRC_SERVER_OPTION_AUTORECONNECT]) ?
_("on") : _("off"));
/* autoreconnect_delay */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_AUTORECONNECT_DELAY]))
weechat_printf (NULL, " autoreconnect_delay. : (%d %s)",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AUTORECONNECT_DELAY),
@ -263,6 +296,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_integer (server->options[IRC_SERVER_OPTION_AUTORECONNECT_DELAY]),
NG_("second", "seconds", weechat_config_integer (server->options[IRC_SERVER_OPTION_AUTORECONNECT_DELAY])));
/* nicks */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_NICKS]))
weechat_printf (NULL, " nicks. . . . . . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_NICKS));
@ -270,6 +304,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " nicks. . . . . . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_NICKS]));
/* username */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_USERNAME]))
weechat_printf (NULL, " username . . . . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_USERNAME));
@ -277,6 +312,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " username . . . . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_USERNAME]));
/* realname */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_REALNAME]))
weechat_printf (NULL, " realname . . . . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_REALNAME));
@ -284,6 +320,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " realname . . . . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_REALNAME]));
/* local_hostname */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_LOCAL_HOSTNAME]))
weechat_printf (NULL, " local_hostname . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_LOCAL_HOSTNAME));
@ -291,6 +328,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " local_hostname . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_LOCAL_HOSTNAME]));
/* command */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_COMMAND]))
{
string = strdup (IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_COMMAND));
@ -312,6 +350,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
if (string)
free (string);
}
/* command_delay */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_COMMAND_DELAY]))
weechat_printf (NULL, " command_delay. . . . : (%d %s)",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_COMMAND_DELAY),
@ -321,6 +360,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_integer (server->options[IRC_SERVER_OPTION_COMMAND_DELAY]),
NG_("second", "seconds", weechat_config_integer (server->options[IRC_SERVER_OPTION_COMMAND_DELAY])));
/* autojoin */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_AUTOJOIN]))
weechat_printf (NULL, " autojoin . . . . . . : ('%s')",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN));
@ -328,6 +368,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
weechat_printf (NULL, " autojoin . . . . . . : %s'%s'",
IRC_COLOR_CHAT_VALUE,
weechat_config_string (server->options[IRC_SERVER_OPTION_AUTOJOIN]));
/* autorejoin */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_AUTOREJOIN]))
weechat_printf (NULL, " autorejoin . . . . . : (%s)",
(IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_AUTOREJOIN)) ?
@ -337,6 +378,7 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_boolean (server->options[IRC_SERVER_OPTION_AUTOREJOIN]) ?
_("on") : _("off"));
/* autorejoin_delay */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_AUTOREJOIN_DELAY]))
weechat_printf (NULL, " autorejoin_delay . . : (%d %s)",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AUTOREJOIN_DELAY),

View File

@ -215,6 +215,158 @@ irc_protocol_replace_vars (struct t_irc_server *server,
return res;
}
/*
* irc_protocol_cmd_authenticate: 'authenticate' message received
*/
int
irc_protocol_cmd_authenticate (struct t_irc_server *server, const char *command,
int argc, char **argv, char **argv_eol)
{
const char *sasl_username, *sasl_password;
char *string, *string_base64;
int length_username, length;
/* AUTHENTICATE message looks like:
AUTHENTICATE +
*/
IRC_PROTOCOL_MIN_ARGS(2);
/* make C compiler happy */
(void) command;
(void) argv_eol;
if (strcmp (argv[1], "+") == 0)
{
sasl_username = IRC_SERVER_OPTION_STRING(server,
IRC_SERVER_OPTION_SASL_USERNAME);
sasl_password = IRC_SERVER_OPTION_STRING(server,
IRC_SERVER_OPTION_SASL_PASSWORD);
if (sasl_username && sasl_username[0]
&& sasl_password && sasl_password[0])
{
length_username = strlen (sasl_username);
length = ((length_username + 1) * 2) + strlen (sasl_password) + 1;
string = malloc (length);
if (string)
{
snprintf (string, length, "%s|%s|%s",
sasl_username, sasl_username, sasl_password);
string[length_username] = '\0';
string[(length_username * 2) + 1] = '\0';
string_base64 = malloc (length * 2);
if (string_base64)
{
weechat_string_encode_base64 (string, length - 1, string_base64);
irc_server_sendf (server, 0, "AUTHENTICATE %s", string_base64);
free (string_base64);
}
free (string);
}
}
}
return WEECHAT_RC_OK;
}
/*
* irc_protocol_cmd_cap: 'cap' message received (client capability)
*/
int
irc_protocol_cmd_cap (struct t_irc_server *server, const char *command,
int argc, char **argv, char **argv_eol)
{
char *ptr_caps, **items;
int num_items, sasl, i;
/* CAP message looks like:
:server CAP * LS :identify-msg multi-prefix sasl
:server CAP * ACK :sasl
*/
IRC_PROTOCOL_MIN_ARGS(4);
/* make C compiler happy */
(void) command;
if (strcmp (argv[3], "LS") == 0)
{
if (argc > 4)
{
ptr_caps = (argv_eol[4][0] == ':') ? argv_eol[4] + 1 : argv_eol[4];
weechat_printf (server->buffer,
_("%s%s: client capability, server supports: %s"),
weechat_prefix ("network"),
IRC_PLUGIN_NAME,
ptr_caps);
sasl = 0;
items = weechat_string_split (ptr_caps, " ", 0, 0, &num_items);
if (items)
{
for (i = 0; i < num_items; i++)
{
if (strcmp (items[i], "sasl") == 0)
{
sasl = 1;
break;
}
}
weechat_string_free_split (items);
}
if (sasl)
{
weechat_printf (server->buffer,
_("%s%s: client capability, requesting: sasl"),
weechat_prefix ("network"),
IRC_PLUGIN_NAME);
irc_server_sendf (server, 0, "CAP REQ :sasl");
}
else
{
weechat_printf (server->buffer,
_("%s%s: client capability: sasl not supported"),
weechat_prefix ("network"),
IRC_PLUGIN_NAME);
irc_server_sendf (server, 0, "CAP END");
}
}
}
else if (strcmp (argv[3], "ACK") == 0)
{
if (argc > 4)
{
ptr_caps = (argv_eol[4][0] == ':') ? argv_eol[4] + 1 : argv_eol[4];
weechat_printf (server->buffer,
_("%s%s: client capability, enabled: %s"),
weechat_prefix ("network"),
IRC_PLUGIN_NAME,
ptr_caps);
if (strcmp (ptr_caps, "sasl") == 0)
{
switch (IRC_SERVER_OPTION_INTEGER(server,
IRC_SERVER_OPTION_SASL_USERNAME))
{
case IRC_SASL_MECHANISM_PLAIN:
irc_server_sendf (server, 0, "AUTHENTICATE PLAIN");
break;
default:
irc_server_sendf (server, 0, "AUTHENTICATE PLAIN");
break;
}
if (server->hook_timer_sasl)
weechat_unhook (server->hook_timer_sasl);
server->hook_timer_sasl = weechat_hook_timer (5 * 1000, 0, 1,
&irc_server_timer_sasl_cb,
server);
}
}
}
return WEECHAT_RC_OK;
}
/*
* irc_protocol_cmd_error: error received from server
*/
@ -3557,6 +3709,35 @@ irc_protocol_cmd_438 (struct t_irc_server *server, const char *command,
return WEECHAT_RC_OK;
}
/*
* irc_protocol_cmd_900: '900' command (logged in as (SASL))
*/
int
irc_protocol_cmd_900 (struct t_irc_server *server, const char *command,
int argc, char **argv, char **argv_eol)
{
/* 900 message looks like:
:server 900 mynick nick!user@host mynick :You are now logged in as mynick
*/
IRC_PROTOCOL_MIN_ARGS(6);
weechat_printf_tags (irc_msgbuffer_get_target_buffer (server, argv[3],
command, NULL,
NULL),
irc_protocol_tags (command, "irc_numeric"),
"%s%s %s(%s%s%s)",
weechat_prefix ("network"),
(argv_eol[5][0] == ':') ? argv_eol[5] + 1 : argv_eol[5],
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_HOST,
argv[3],
IRC_COLOR_CHAT_DELIMITERS);
return WEECHAT_RC_OK;
}
/*
* irc_protocol_cmd_901: '901' command received (you are now logged in)
*/
@ -3587,6 +3768,44 @@ irc_protocol_cmd_901 (struct t_irc_server *server, const char *command,
return WEECHAT_RC_OK;
}
/*
* irc_protocol_cmd_903: '903' command received (SASL authentication successful)
*/
int
irc_protocol_cmd_903 (struct t_irc_server *server, const char *command,
int argc, char **argv, char **argv_eol)
{
/* 903 message looks like:
:server 903 nick :SASL authentication successful
*/
irc_protocol_cmd_numeric (server, command, argc, argv, argv_eol);
irc_server_sendf (server, 0, "CAP END");
return WEECHAT_RC_OK;
}
/*
* irc_protocol_cmd_904: '904' command received (SASL authentication failed)
*/
int
irc_protocol_cmd_904 (struct t_irc_server *server, const char *command,
int argc, char **argv, char **argv_eol)
{
/* 904 message looks like:
:server 904 nick :SASL authentication failed
*/
irc_protocol_cmd_numeric (server, command, argc, argv, argv_eol);
irc_server_sendf (server, 0, "CAP END");
return WEECHAT_RC_OK;
}
/*
* irc_protocol_is_numeric_command: return 1 if given string is 100% numeric
*/
@ -3621,7 +3840,9 @@ irc_protocol_recv_command (struct t_irc_server *server, const char *entire_line,
const char *cmd_name;
char **argv, **argv_eol;
struct t_irc_protocol_msg irc_protocol_messages[] =
{ { "error", /* error received from IRC server */ 1, &irc_protocol_cmd_error },
{ { "authenticate", /* authenticate */ 1, &irc_protocol_cmd_authenticate },
{ "cap", /* client capability */ 1, &irc_protocol_cmd_cap },
{ "error", /* error received from IRC server */ 1, &irc_protocol_cmd_error },
{ "invite", /* invite a nick on a channel */ 1, &irc_protocol_cmd_invite },
{ "join", /* join a channel */ 1, &irc_protocol_cmd_join },
{ "kick", /* forcibly remove a user from a channel */ 1, &irc_protocol_cmd_kick },
@ -3741,7 +3962,10 @@ irc_protocol_recv_command (struct t_irc_server *server, const char *entire_line,
{ "501", /* unknown mode flag */ 1, &irc_protocol_cmd_error },
{ "502", /* can't change mode for other users */ 1, &irc_protocol_cmd_error },
{ "671", /* whois (secure connection) */ 1, &irc_protocol_cmd_whois_nick_msg },
{ "900", /* logged in as (SASL) */ 1, &irc_protocol_cmd_900 },
{ "901", /* you are now logged in */ 1, &irc_protocol_cmd_901 },
{ "903", /* SASL authentication successful */ 1, &irc_protocol_cmd_903 },
{ "904", /* SASL authentication failed */ 1, &irc_protocol_cmd_904 },
{ "973", /* whois (secure connection) */ 1, &irc_protocol_cmd_server_mode_reason },
{ "974", /* whois (secure connection) */ 1, &irc_protocol_cmd_server_mode_reason },
{ "975", /* whois (secure connection) */ 1, &irc_protocol_cmd_server_mode_reason },

View File

@ -58,19 +58,26 @@ struct t_irc_message *irc_recv_msgq = NULL;
struct t_irc_message *irc_msgq_last_msg = NULL;
char *irc_server_option_string[IRC_SERVER_NUM_OPTIONS] =
{ "addresses", "proxy", "ipv6", "ssl", "ssl_cert", "ssl_dhkey_size",
"ssl_verify", "password", "autoconnect", "autoreconnect",
"autoreconnect_delay", "nicks", "username", "realname", "local_hostname",
{ "addresses", "proxy", "ipv6",
"ssl", "ssl_cert", "ssl_dhkey_size", "ssl_verify",
"password", "sasl_mechanism", "sasl_username", "sasl_password",
"autoconnect", "autoreconnect", "autoreconnect_delay",
"nicks", "username", "realname", "local_hostname",
"command", "command_delay", "autojoin", "autorejoin", "autorejoin_delay",
};
char *irc_server_option_default[IRC_SERVER_NUM_OPTIONS] =
{ "", "", "off", "off", "", "2048",
"on", "", "off", "on",
"30", "", "", "", "",
{ "", "", "off",
"off", "", "2048", "on",
"", "plain", "", "",
"off", "on", "30",
"", "", "", "",
"", "0", "", "off", "30",
};
char *irc_sasl_mechanism_string[IRC_NUM_SASL_MECHANISMS] =
{ "plain", /*"dh-blowfish"*/ };
void irc_server_reconnect (struct t_irc_server *server);
void irc_server_check_away ();
@ -128,6 +135,26 @@ irc_server_search_option (const char *option_name)
return -1;
}
/*
* irc_server_sasl_enabled: return 1 if SASL is enabled on server
* 0 if SASL is NOT enabled on server
*/
int
irc_server_sasl_enabled (struct t_irc_server *server)
{
const char *sasl_username, *sasl_password;
sasl_username = IRC_SERVER_OPTION_STRING(server,
IRC_SERVER_OPTION_SASL_USERNAME);
sasl_password = IRC_SERVER_OPTION_STRING(server,
IRC_SERVER_OPTION_SASL_PASSWORD);
/* SASL is enabled if username AND password are set */
return (sasl_username && sasl_username[0]
&& sasl_password && sasl_password[0]) ? 1 : 0;
}
/*
* irc_server_get_name_without_port: get name of server without port
* (ends before first '/' if found)
@ -295,6 +322,7 @@ irc_server_alloc (const char *name)
new_server->sock = -1;
new_server->hook_connect = NULL;
new_server->hook_fd = NULL;
new_server->hook_timer_sasl = NULL;
new_server->is_connected = 0;
new_server->ssl_connected = 0;
new_server->unterminated_message = NULL;
@ -684,10 +712,16 @@ irc_server_free_data (struct t_irc_server *server)
free (server->ports_array);
if (server->current_ip)
free (server->current_ip);
if (server->nicks_array)
weechat_string_free_split (server->nicks_array);
if (server->hook_connect)
weechat_unhook (server->hook_connect);
if (server->hook_fd)
weechat_unhook (server->hook_fd);
if (server->hook_timer_sasl)
weechat_unhook (server->hook_timer_sasl);
if (server->unterminated_message)
free (server->unterminated_message);
if (server->nicks_array)
weechat_string_free_split (server->nicks_array);
if (server->nick)
free (server->nick);
if (server->nick_modes)
@ -696,6 +730,11 @@ irc_server_free_data (struct t_irc_server *server)
free (server->prefix);
if (server->away_message)
free (server->away_message);
if (server->cmd_list_regexp)
{
regfree (server->cmd_list_regexp);
free (server->cmd_list_regexp);
}
for (i = 0; i < IRC_SERVER_NUM_OUTQUEUES_PRIO; i++)
{
irc_server_outqueue_free_all (server, i);
@ -1693,6 +1732,41 @@ irc_server_recv_cb (void *arg_server, int fd)
return WEECHAT_RC_OK;
}
/*
* irc_server_timer_sasl_cb: callback for SASL authentication timer
* it is called if there is a timeout with SASL
* authentication
* (if SASL authentication is ok or failed, then
* hook timer is removed before this callback is
* called)
*/
int
irc_server_timer_sasl_cb (void *arg_server, int remaining_calls)
{
struct t_irc_server *server;
/* make C compiler happy */
(void) remaining_calls;
server = (struct t_irc_server *)arg_server;
if (!server)
return WEECHAT_RC_ERROR;
server->hook_timer_sasl = NULL;
if (!server->is_connected)
{
weechat_printf (server->buffer,
_("%s%s: sasl authentication timeout"),
weechat_prefix ("error"), IRC_PLUGIN_NAME);
irc_server_sendf (server, 0, "CAP END");
}
return WEECHAT_RC_OK;
}
/*
* irc_server_timer_cb: timer called each second to perform some operations
* on servers
@ -1795,6 +1869,12 @@ void
irc_server_close_connection (struct t_irc_server *server)
{
int i;
if (server->hook_timer_sasl)
{
weechat_unhook (server->hook_timer_sasl);
server->hook_timer_sasl = NULL;
}
if (server->hook_fd)
{
@ -1883,7 +1963,7 @@ void
irc_server_login (struct t_irc_server *server)
{
const char *password, *username, *realname;
password = IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_PASSWORD);
username = IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_USERNAME);
realname = IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_REALNAME);
@ -1898,6 +1978,11 @@ irc_server_login (struct t_irc_server *server)
server->nicks_array[0] : "weechat");
}
if (irc_server_sasl_enabled (server))
{
irc_server_sendf (server, 0, "CAP LS");
}
irc_server_sendf (server, 0,
"NICK %s\n"
"USER %s %s %s :%s",
@ -3276,6 +3361,15 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
if (!weechat_infolist_new_var_string (ptr_item, "password",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_PASSWORD)))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "sasl_mechanism",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_SASL_MECHANISM)))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "sasl_username",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_SASL_USERNAME)))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "sasl_password",
IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_SASL_PASSWORD)))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "autoconnect",
IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_AUTOCONNECT)))
return 0;
@ -3374,19 +3468,21 @@ irc_server_print_log ()
{
weechat_log_printf ("");
weechat_log_printf ("[server %s (addr:0x%lx)]", ptr_server->name, ptr_server);
/* addresses */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_ADDRESSES]))
weechat_log_printf (" addresses. . . . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_ADDRESSES));
else
weechat_log_printf (" addresses. . . . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_ADDRESSES]));
/* proxy */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_PROXY]))
weechat_log_printf (" proxy. . . . . . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_PROXY));
else
weechat_log_printf (" proxy. . . . . . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_PROXY]));
/* ipv6 */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_IPV6]))
weechat_log_printf (" ipv6 . . . . . . . . : null (%s)",
(IRC_SERVER_OPTION_BOOLEAN(ptr_server, IRC_SERVER_OPTION_IPV6)) ?
@ -3395,6 +3491,7 @@ irc_server_print_log ()
weechat_log_printf (" ipv6 . . . . . . . . : %s",
weechat_config_boolean (ptr_server->options[IRC_SERVER_OPTION_IPV6]) ?
"on" : "off");
/* ssl */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_SSL]))
weechat_log_printf (" ssl. . . . . . . . . : null (%s)",
(IRC_SERVER_OPTION_BOOLEAN(ptr_server, IRC_SERVER_OPTION_SSL)) ?
@ -3403,18 +3500,21 @@ irc_server_print_log ()
weechat_log_printf (" ssl. . . . . . . . . : %s",
weechat_config_boolean (ptr_server->options[IRC_SERVER_OPTION_SSL]) ?
"on" : "off");
/* ssl_cert */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_SSL_CERT]))
weechat_log_printf (" ssl_cert . . . . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_SSL_CERT));
else
weechat_log_printf (" ssl_cert . . . . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_SSL_CERT]));
/* ssl_dhkey_size */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_SSL_DHKEY_SIZE]))
weechat_log_printf (" ssl_dhkey_size . . . : null ('%d')",
IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_SSL_DHKEY_SIZE));
else
weechat_log_printf (" ssl_dhkey_size . . . : '%d'",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_SSL_DHKEY_SIZE]));
/* ssl_verify */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_SSL_VERIFY]))
weechat_log_printf (" ssl_verify . . . . . : null (%s)",
(IRC_SERVER_OPTION_BOOLEAN(ptr_server, IRC_SERVER_OPTION_SSL_VERIFY)) ?
@ -3423,10 +3523,31 @@ irc_server_print_log ()
weechat_log_printf (" ssl_verify . . . . . : %s",
weechat_config_boolean (ptr_server->options[IRC_SERVER_OPTION_SSL_VERIFY]) ?
"on" : "off");
/* password */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_PASSWORD]))
weechat_log_printf (" password . . . . . . : null");
else
weechat_log_printf (" password . . . . . . : (hidden)");
/* sasl_mechanism */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_SASL_MECHANISM]))
weechat_log_printf (" sasl_mechanism . . . : null ('%s')",
irc_sasl_mechanism_string[IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_SASL_MECHANISM)]);
else
weechat_log_printf (" sasl_mechanism . . . : '%s'",
irc_sasl_mechanism_string[weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_SASL_MECHANISM])]);
/* sasl_username */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_SASL_USERNAME]))
weechat_log_printf (" sasl_username. . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_SASL_USERNAME));
else
weechat_log_printf (" sasl_username. . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_USERNAME]));
/* sasl_password */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_SASL_PASSWORD]))
weechat_log_printf (" sasl_password. . . . : null");
else
weechat_log_printf (" sasl_password. . . . : (hidden)");
/* autoconnect */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_AUTOCONNECT]))
weechat_log_printf (" autoconnect. . . . . : null (%s)",
(IRC_SERVER_OPTION_BOOLEAN(ptr_server, IRC_SERVER_OPTION_AUTOCONNECT)) ?
@ -3435,6 +3556,7 @@ irc_server_print_log ()
weechat_log_printf (" autoconnect. . . . . : %s",
weechat_config_boolean (ptr_server->options[IRC_SERVER_OPTION_AUTOCONNECT]) ?
"on" : "off");
/* autoreconnect */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_AUTORECONNECT]))
weechat_log_printf (" autoreconnect. . . . : null (%s)",
(IRC_SERVER_OPTION_BOOLEAN(ptr_server, IRC_SERVER_OPTION_AUTORECONNECT)) ?
@ -3443,52 +3565,61 @@ irc_server_print_log ()
weechat_log_printf (" autoreconnect. . . . : %s",
weechat_config_boolean (ptr_server->options[IRC_SERVER_OPTION_AUTORECONNECT]) ?
"on" : "off");
/* autoreconnect_delay */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_AUTORECONNECT_DELAY]))
weechat_log_printf (" autoreconnect_delay. : null (%d)",
IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_AUTORECONNECT_DELAY));
else
weechat_log_printf (" autoreconnect_delay. : %d",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_AUTORECONNECT_DELAY]));
/* nicks */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_NICKS]))
weechat_log_printf (" nicks. . . . . . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_NICKS));
else
weechat_log_printf (" nicks. . . . . . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_NICKS]));
/* username */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_USERNAME]))
weechat_log_printf (" username . . . . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_USERNAME));
else
weechat_log_printf (" username . . . . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_USERNAME]));
/* realname */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_REALNAME]))
weechat_log_printf (" realname . . . . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_REALNAME));
else
weechat_log_printf (" realname . . . . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_REALNAME]));
/* local_hostname */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_LOCAL_HOSTNAME]))
weechat_log_printf (" local_hostname . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_LOCAL_HOSTNAME));
else
weechat_log_printf (" local_hostname . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_LOCAL_HOSTNAME]));
/* command */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_COMMAND]))
weechat_log_printf (" command. . . . . . . : null");
else
weechat_log_printf (" command. . . . . . . : (hidden)");
/* command_delay */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_COMMAND_DELAY]))
weechat_log_printf (" command_delay. . . . : null (%d)",
IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_COMMAND_DELAY));
else
weechat_log_printf (" command_delay. . . . : %d",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_COMMAND_DELAY]));
/* autojoin */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_AUTOJOIN]))
weechat_log_printf (" autojoin . . . . . . : null ('%s')",
IRC_SERVER_OPTION_STRING(ptr_server, IRC_SERVER_OPTION_AUTOJOIN));
else
weechat_log_printf (" autojoin . . . . . . : '%s'",
weechat_config_string (ptr_server->options[IRC_SERVER_OPTION_AUTOJOIN]));
/* autorejoin */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_AUTOREJOIN]))
weechat_log_printf (" autorejoin . . . . . : null (%s)",
(IRC_SERVER_OPTION_BOOLEAN(ptr_server, IRC_SERVER_OPTION_AUTOREJOIN)) ?
@ -3497,12 +3628,14 @@ irc_server_print_log ()
weechat_log_printf (" autorejoin . . . . . : %s",
weechat_config_boolean (ptr_server->options[IRC_SERVER_OPTION_AUTOREJOIN]) ?
"on" : "off");
/* autorejoin_delay */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_AUTOREJOIN_DELAY]))
weechat_log_printf (" autorejoin_delay . . : null (%d)",
IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_AUTOREJOIN_DELAY));
else
weechat_log_printf (" autorejoin_delay . . : %d",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_AUTOREJOIN_DELAY]));
/* other server variables */
weechat_log_printf (" temp_server. . . . . : %d", ptr_server->temp_server);
weechat_log_printf (" reloading_from_config: %d", ptr_server->reloaded_from_config);
weechat_log_printf (" reloaded_from_config : %d", ptr_server->reloaded_from_config);
@ -3514,6 +3647,7 @@ irc_server_print_log ()
weechat_log_printf (" sock . . . . . . . . : %d", ptr_server->sock);
weechat_log_printf (" hook_connect . . . . : 0x%lx", ptr_server->hook_connect);
weechat_log_printf (" hook_fd. . . . . . . : 0x%lx", ptr_server->hook_fd);
weechat_log_printf (" hook_timer_sasl. . . : 0x%lx", ptr_server->hook_timer_sasl);
weechat_log_printf (" is_connected . . . . : %d", ptr_server->is_connected);
weechat_log_printf (" ssl_connected. . . . : %d", ptr_server->ssl_connected);
#ifdef HAVE_GNUTLS

View File

@ -41,6 +41,9 @@ enum t_irc_server_option
IRC_SERVER_OPTION_SSL_DHKEY_SIZE, /* Diffie Hellman key size */
IRC_SERVER_OPTION_SSL_VERIFY, /* check if the connection is trusted */
IRC_SERVER_OPTION_PASSWORD, /* password for server */
IRC_SERVER_OPTION_SASL_MECHANISM,/* mechanism for SASL authentication */
IRC_SERVER_OPTION_SASL_USERNAME, /* username for SASL authentication */
IRC_SERVER_OPTION_SASL_PASSWORD, /* password for SASL authentication */
IRC_SERVER_OPTION_AUTOCONNECT, /* autoconnect to server at startup */
IRC_SERVER_OPTION_AUTORECONNECT, /* autoreconnect when disconnected */
IRC_SERVER_OPTION_AUTORECONNECT_DELAY, /* delay before trying again reco */
@ -87,6 +90,16 @@ enum t_irc_server_option
#define IRC_SERVER_OUTQUEUE_PRIO_LOW 2
#define IRC_SERVER_NUM_OUTQUEUES_PRIO 2
/* SASL authentication mechanisms */
enum t_irc_sasl_mechanism
{
IRC_SASL_MECHANISM_PLAIN = 0,
/* TODO: IRC_SASL_MECHANISM_DH_BLOWFISH, */
/* number of SASL mechanisms */
IRC_NUM_SASL_MECHANISMS,
};
/* output queue of messages to server (for sending slowly to server) */
struct t_irc_outqueue
@ -117,6 +130,7 @@ struct t_irc_server
int sock; /* socket for server (IPv4 or IPv6) */
struct t_hook *hook_connect; /* connection hook */
struct t_hook *hook_fd; /* hook for server socket */
struct t_hook *hook_timer_sasl; /* timer for SASL authentication */
int is_connected; /* 1 if WeeChat is connected to server */
int ssl_connected; /* = 1 if connected with SSL */
#ifdef HAVE_GNUTLS
@ -171,9 +185,11 @@ extern const int gnutls_prot_prio[];
extern struct t_irc_message *irc_recv_msgq, *irc_msgq_last_msg;
extern char *irc_server_option_string[];
extern char *irc_server_option_default[];
extern char *irc_sasl_mechanism_string[];
extern int irc_server_valid (struct t_irc_server *server);
extern int irc_server_search_option (const char *option_name);
extern int irc_server_sasl_enabled (struct t_irc_server *server);
extern char *irc_server_get_name_without_port (const char *name);
extern void irc_server_set_addresses (struct t_irc_server *server,
const char *addresses);
@ -199,6 +215,7 @@ extern int irc_server_connect (struct t_irc_server *server);
extern void irc_server_auto_connect ();
extern void irc_server_autojoin_channels ();
extern int irc_server_recv_cb (void *arg_server, int fd);
extern int irc_server_timer_sasl_cb (void *arg_server, int remaining_calls);
extern int irc_server_timer_cb (void *data, int remaining_calls);
extern int irc_server_timer_check_away_cb (void *data, int remaining_calls);
extern void irc_server_outqueue_free_all (struct t_irc_server *server,

View File

@ -384,6 +384,7 @@ plugin_load (const char *filename)
new_plugin->string_free_split_command = &string_free_split_command;
new_plugin->string_format_size = &string_format_size;
new_plugin->string_remove_color = &gui_color_decode;
new_plugin->string_encode_base64 = &string_encode_base64;
new_plugin->utf8_has_8bits = &utf8_has_8bits;
new_plugin->utf8_is_valid = &utf8_is_valid;

View File

@ -34,7 +34,7 @@ struct t_weelist;
struct timeval;
/* API version (used to check that plugin has same API and can be loaded) */
#define WEECHAT_PLUGIN_API_VERSION "20100212-01"
#define WEECHAT_PLUGIN_API_VERSION "20100215-01"
/* macros for defining plugin infos */
#define WEECHAT_PLUGIN_NAME(__name) \
@ -170,6 +170,7 @@ struct t_weechat_plugin
void (*string_free_split_command) (char **split_command);
char *(*string_format_size) (unsigned long size);
char *(*string_remove_color) (const char *string, const char *replacement);
void (*string_encode_base64) (const char *from, int length, char *to);
/* UTF-8 strings */
int (*utf8_has_8bits) (const char *string);
@ -717,6 +718,8 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
weechat_plugin->string_format_size(__size)
#define weechat_string_remove_color(__string, __replacement) \
weechat_plugin->string_remove_color(__string, __replacement)
#define weechat_string_encode_base64(__from, __length, __to) \
weechat_plugin->string_encode_base64(__from, __length, __to)
/* UTF-8 strings */
#define weechat_utf8_has_8bits(__string) \