Merge branch 'master' of ssh+git://git.claws-mail.org/home/git/claws
authorwwp <wwp@free.fr>
Mon, 28 Apr 2014 08:27:44 +0000 (10:27 +0200)
committerwwp <wwp@free.fr>
Mon, 28 Apr 2014 08:27:44 +0000 (10:27 +0200)
14 files changed:
README
manual/advanced.xml
manual/de/advanced.xml
manual/es/advanced.xml
manual/fr/advanced.xml
manual/plugins.xml
src/main.c
src/plugins/libravatar/Makefile.am
src/plugins/libravatar/TODO
src/plugins/libravatar/libravatar.c
src/plugins/libravatar/libravatar_federation.c [new file with mode: 0644]
src/plugins/libravatar/libravatar_federation.h [new file with mode: 0644]
src/plugins/libravatar/libravatar_prefs.c
src/plugins/libravatar/libravatar_prefs.h

diff --git a/README b/README
index d678f094c950772f306e22b0b6c693c0e733f68a..dd69c0d7884c909abde8d71f37e138f826d61040 100644 (file)
--- a/README
+++ b/README
@@ -521,12 +521,6 @@ http://www.claws-mail.org/plugins.php
        The colour used for the X-Mailer line when its value is
        Claws Mail.
 
-    enable_dotted_lines                (default: 0)
-       Use the old dotted line look in the main window GtkTreeView
-       components, (Folder List and Message List), instead of the
-       modern lineless look. 
-       0: off  1: on
-
     enable_hscrollbar          (default: 1)
        enable horizontal scroll bar in summary view
        0: off  1: on
index 5d4cb6718a4c6aed85cca1cb3873090a0699cd08..1776d14fe7ae78cd475aa051160874b9c0061c10 100644 (file)
          </para>
        </listitem>
       </varlistentry>
-      <varlistentry>
-       <term><literal>enable_dotted_lines</literal></term>
-       <listitem>
-         <para>
-       Use the <emphasis>old</emphasis> dotted line look in the main window
-       GtkTreeView components, (Folder List and Message List), instead of the
-       <emphasis>modern</emphasis> lineless look.
-         </para>
-       </listitem>
-      </varlistentry>
       <varlistentry>
        <term><literal>enable_hscrollbar</literal></term>
        <listitem>
index 1781154b76583fc4c285b491facc98c2bdbf39d0..f4c0481ce90284e9389f219e8e9e199a7cde4b34 100644 (file)
@@ -62,7 +62,7 @@
   </section>
   <section id="adv_hidden">
     <title>Verborgene Einstellungen</title>
-    <para> Es gibt eine Reihe verborgender Einstellungen in Claws Mail - Einstellungen, ohne die einige Benutzer (denen wir entgegenkommen) schwerlich leben könnten, für die aber die Bedienoberfläche kaum Platz bietet, wie wir glauben. Sie können folgende finden - und auch verändern, solange Claws Mail nicht aktiv ist - und zwar in <filename>~/.claws-mail/clawsrc</filename>. </para> <para> Es gibt ein kleines Hilfsprogramm, das in Perl-GTK geschrieben ist. Es heißt Clawsker und hat eine bedienerfreundliche Oberfläche, mit der sich diese Einstellungen justieren lassen, anstatt <filename>clawsrc</filename> direkt zu editieren. Mehr darüber erfahren können Sie auf der <ulink url="http://www.claws-mail.org/clawsker.php">Clawsker</ulink>-Seite. </para> <variablelist> <varlistentry> <term><literal>addressbook_use_editaddress_dialog</literal></term> <listitem> <para> Separates Dialogfenster verwenden, um Details einer Person zu bearbeiten. '0' verwendet eine im Hauptfenster des Adressbuchs integrierte Maske. </para> </listitem> </varlistentry> <varlistentry> <term><literal>bold_unread</literal></term> <listitem> <para>Ungelesene Nachrichten in der Listenansicht fettgedruckt anzeigen. </para> </listitem> </varlistentry> <varlistentry> <term><literal>cache_max_mem_usage</literal></term> <listitem> <para> Der maximale Speicherplatz als Zwischenpuffer für Nachrichten, in kB. </para> </listitem> </varlistentry> <varlistentry> <term><literal>cache_min_keep_time</literal></term> <listitem> <para> Die minimale Dauer in Minuten, die ein Zwischenpuffer im Speicher verbleibt. Zwischenpuffer, die jünger als dieser Wert sind, werden nicht freigegeben, selbst bei zu hoher Speichernutzung. </para> </listitem> </varlistentry> <varlistentry> <term><literal>compose_no_markup</literal></term> <listitem> <para> Verwende keinen fett oder kursiv gedruckten Text bei der Kontenauswahl im Dialog zur Mail-Erstellung. </para> </listitem> </varlistentry> <varlistentry> <term><literal>emphasis_color</literal></term> <listitem> <para> Die Farbe der X-Mailer-Zeile, wenn diese Claws Mail beinhaltet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>enable_dotted_lines</literal></term> <listitem> <para> Verwende den <emphasis>alten</emphasis> gepunkteten Linienstil bei den GtkTreeView-Komponenten des Hauptfensters (Ordnerliste und Nachrichtenliste) anstatt der <emphasis>modernen</emphasis> linienlosen Darstellung. </para> </listitem> </varlistentry> <varlistentry> <term><literal>enable_hscrollbar</literal></term> <listitem> <para> Aktiviere die horizontale Bildlaufleiste in der Nachrichtenliste. </para> </listitem> </varlistentry> <varlistentry> <term><literal>enable_swap_from</literal></term> <listitem> <para> Zeige die Mailadresse des Absenders anstelle des Empfängers in der Spalte 'An' des Gesendet-Ordners. </para> </listitem> </varlistentry> <varlistentry> <term><literal>folderview_vscrollbar_policy</literal></term> <listitem> <para> Bestimme das Verhalten der senkrechten Bildlaufleiste der Ordnerliste. '0' zeigt sie immer an, '1' automatisch, '2' verbirgt sie stets. </para> </listitem> </varlistentry> <varlistentry> <term><literal>hover_timeout</literal></term> <listitem> <para> Die Zeit in Millisekunden, bis sich die Ordnerstruktur entfaltet, wenn beim Ziehen mit der Maus der Zeiger darauf deutet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>live_dangerously</literal></term> <listitem> <para> Verlange keine Bestätigung, bevor eine E-Mail endgültig gelöscht wird. </para> </listitem> </varlistentry> <varlistentry> <term><literal>log_error_color</literal></term> <term><literal>log_in_color</literal></term> <term><literal>log_msg_color</literal></term> <term><literal>log_out_color</literal></term> <term><literal>log_warn_color</literal></term> <term><literal>log_status_ok_color</literal></term> <term><literal>log_status_nok_color</literal></term> <term><literal>log_status_skip_color</literal></term> <listitem> <para> Die im Protokollfenster verwendeten Farben. </para> </listitem> </varlistentry> <varlistentry> <term><literal>outgoing_fallback_to_ascii</literal></term> <listitem> <para> 0 oder 1. Soweit es deren Inhalt zuläßt, werden abgehende Nachrichten mit 7bit-US-ASCII kodiert, ungeachtet der Option <quote>Ausgehende Zeichenkodierung</quote>, wenn diese nicht erforderlich ist. Wird diese Option ausgeschaltet, gilt strikt die benutzerdefinierte Kodierung - ohne Beachtung des Inhalts der Nachricht. Vorgabewert ist 1, also eingeschaltet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>primary_paste_unselects</literal></term> <listitem> <para> 0 oder 1. Sorgt dafür, daß der Primärpuffer geleert und der Einfügepunkt zurückgesetzt wird, wenn man die mittlere Maustaste zum Einkopieren von Text benutzt. Vorgabewert ist 0, also ausgeschaltet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>respect_flowed_format</literal></term> <listitem> <para> 0 oder 1. Respektiere Fließtextformat (f=f) in reinen Text-/Nachrichtenpassagen. Dies sorgt dafür, daß manche Mails (über)lange Zeilen haben, repariert aber einige URLs, die sonst umgebrochen würden. Vorgabewert ist 0, also ausgeschaltet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>save_parts_readwrite</literal></term> <listitem> <para> Sichert temporäre Dateien, wenn ein Mailanhang geöffnet wird, bei dem Schreibschutz gesetzt ist. </para> </listitem> </varlistentry> <varlistentry> <term><literal>skip_ssl_cert_check</literal></term> <listitem> <para> Schaltet die  Überprüfung von SSL-Zertifikaten ab. </para> </listitem> </varlistentry> <varlistentry> <term><literal>statusbar_update_step</literal></term> <listitem> <para> Aktualisierung mit Fortschrittsanzeige. </para> </listitem> </varlistentry> <varlistentry> <term><literal>stripes_color_offset</literal></term> <listitem> <para> Geben Sie den Wert an, mit dem in GtkTreeView-Komponenten wechselfarbige Linien erzeugt werden. Je kleiner der Wert, desto weniger sichtbar ist der Unterschied der wechselnden Linienfarben. </para> </listitem> </varlistentry> <varlistentry> <term><literal>textview_cursor_visible</literal></term> <listitem> <para> Anzeige des Cursors in der Nachrichtenansicht. </para> </listitem> </varlistentry> <varlistentry> <term><literal>thread_by_subject_max_age</literal></term> <listitem> <para> Anzahl der Tage, die eine Nachricht in einem Diskurs verbleiben soll, wenn <quote>
+    <para> Es gibt eine Reihe verborgender Einstellungen in Claws Mail - Einstellungen, ohne die einige Benutzer (denen wir entgegenkommen) schwerlich leben könnten, für die aber die Bedienoberfläche kaum Platz bietet, wie wir glauben. Sie können folgende finden - und auch verändern, solange Claws Mail nicht aktiv ist - und zwar in <filename>~/.claws-mail/clawsrc</filename>. </para> <para> Es gibt ein kleines Hilfsprogramm, das in Perl-GTK geschrieben ist. Es heißt Clawsker und hat eine bedienerfreundliche Oberfläche, mit der sich diese Einstellungen justieren lassen, anstatt <filename>clawsrc</filename> direkt zu editieren. Mehr darüber erfahren können Sie auf der <ulink url="http://www.claws-mail.org/clawsker.php">Clawsker</ulink>-Seite. </para> <variablelist> <varlistentry> <term><literal>addressbook_use_editaddress_dialog</literal></term> <listitem> <para> Separates Dialogfenster verwenden, um Details einer Person zu bearbeiten. '0' verwendet eine im Hauptfenster des Adressbuchs integrierte Maske. </para> </listitem> </varlistentry> <varlistentry> <term><literal>bold_unread</literal></term> <listitem> <para>Ungelesene Nachrichten in der Listenansicht fettgedruckt anzeigen. </para> </listitem> </varlistentry> <varlistentry> <term><literal>cache_max_mem_usage</literal></term> <listitem> <para> Der maximale Speicherplatz als Zwischenpuffer für Nachrichten, in kB. </para> </listitem> </varlistentry> <varlistentry> <term><literal>cache_min_keep_time</literal></term> <listitem> <para> Die minimale Dauer in Minuten, die ein Zwischenpuffer im Speicher verbleibt. Zwischenpuffer, die jünger als dieser Wert sind, werden nicht freigegeben, selbst bei zu hoher Speichernutzung. </para> </listitem> </varlistentry> <varlistentry> <term><literal>compose_no_markup</literal></term> <listitem> <para> Verwende keinen fett oder kursiv gedruckten Text bei der Kontenauswahl im Dialog zur Mail-Erstellung. </para> </listitem> </varlistentry> <varlistentry> <term><literal>emphasis_color</literal></term> <listitem> <para> Die Farbe der X-Mailer-Zeile, wenn diese Claws Mail beinhaltet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>enable_hscrollbar</literal></term> <listitem> <para> Aktiviere die horizontale Bildlaufleiste in der Nachrichtenliste. </para> </listitem> </varlistentry> <varlistentry> <term><literal>enable_swap_from</literal></term> <listitem> <para> Zeige die Mailadresse des Absenders anstelle des Empfängers in der Spalte 'An' des Gesendet-Ordners. </para> </listitem> </varlistentry> <varlistentry> <term><literal>folderview_vscrollbar_policy</literal></term> <listitem> <para> Bestimme das Verhalten der senkrechten Bildlaufleiste der Ordnerliste. '0' zeigt sie immer an, '1' automatisch, '2' verbirgt sie stets. </para> </listitem> </varlistentry> <varlistentry> <term><literal>hover_timeout</literal></term> <listitem> <para> Die Zeit in Millisekunden, bis sich die Ordnerstruktur entfaltet, wenn beim Ziehen mit der Maus der Zeiger darauf deutet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>live_dangerously</literal></term> <listitem> <para> Verlange keine Bestätigung, bevor eine E-Mail endgültig gelöscht wird. </para> </listitem> </varlistentry> <varlistentry> <term><literal>log_error_color</literal></term> <term><literal>log_in_color</literal></term> <term><literal>log_msg_color</literal></term> <term><literal>log_out_color</literal></term> <term><literal>log_warn_color</literal></term> <term><literal>log_status_ok_color</literal></term> <term><literal>log_status_nok_color</literal></term> <term><literal>log_status_skip_color</literal></term> <listitem> <para> Die im Protokollfenster verwendeten Farben. </para> </listitem> </varlistentry> <varlistentry> <term><literal>outgoing_fallback_to_ascii</literal></term> <listitem> <para> 0 oder 1. Soweit es deren Inhalt zuläßt, werden abgehende Nachrichten mit 7bit-US-ASCII kodiert, ungeachtet der Option <quote>Ausgehende Zeichenkodierung</quote>, wenn diese nicht erforderlich ist. Wird diese Option ausgeschaltet, gilt strikt die benutzerdefinierte Kodierung - ohne Beachtung des Inhalts der Nachricht. Vorgabewert ist 1, also eingeschaltet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>primary_paste_unselects</literal></term> <listitem> <para> 0 oder 1. Sorgt dafür, daß der Primärpuffer geleert und der Einfügepunkt zurückgesetzt wird, wenn man die mittlere Maustaste zum Einkopieren von Text benutzt. Vorgabewert ist 0, also ausgeschaltet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>respect_flowed_format</literal></term> <listitem> <para> 0 oder 1. Respektiere Fließtextformat (f=f) in reinen Text-/Nachrichtenpassagen. Dies sorgt dafür, daß manche Mails (über)lange Zeilen haben, repariert aber einige URLs, die sonst umgebrochen würden. Vorgabewert ist 0, also ausgeschaltet. </para> </listitem> </varlistentry> <varlistentry> <term><literal>save_parts_readwrite</literal></term> <listitem> <para> Sichert temporäre Dateien, wenn ein Mailanhang geöffnet wird, bei dem Schreibschutz gesetzt ist. </para> </listitem> </varlistentry> <varlistentry> <term><literal>skip_ssl_cert_check</literal></term> <listitem> <para> Schaltet die  Überprüfung von SSL-Zertifikaten ab. </para> </listitem> </varlistentry> <varlistentry> <term><literal>statusbar_update_step</literal></term> <listitem> <para> Aktualisierung mit Fortschrittsanzeige. </para> </listitem> </varlistentry> <varlistentry> <term><literal>stripes_color_offset</literal></term> <listitem> <para> Geben Sie den Wert an, mit dem in GtkTreeView-Komponenten wechselfarbige Linien erzeugt werden. Je kleiner der Wert, desto weniger sichtbar ist der Unterschied der wechselnden Linienfarben. </para> </listitem> </varlistentry> <varlistentry> <term><literal>textview_cursor_visible</literal></term> <listitem> <para> Anzeige des Cursors in der Nachrichtenansicht. </para> </listitem> </varlistentry> <varlistentry> <term><literal>thread_by_subject_max_age</literal></term> <listitem> <para> Anzahl der Tage, die eine Nachricht in einem Diskurs verbleiben soll, wenn <quote>
 Diskurs nutzt Betreff zusätzlich zur Standardkopfzeile</quote> aktiviert ist. </para> </listitem> </varlistentry> <varlistentry> <term><literal>toolbar_detachable</literal></term> <listitem> <para> Die Werkzeugleisten mit Anfassern darstellen. </para> </listitem> </varlistentry> <varlistentry> <term><literal>two_line_vertical</literal></term> <listitem> <para> Doppelzeilige Informationsdarstellung der Nachrichtenliste, wenn das dreispaltige Layout verwendet wird. </para> </listitem> </varlistentry> <varlistentry> <term><literal>unsafe_ssl_certs</literal></term> <listitem> <para> Gestattet Claws, einem bestimmten Server/Port mehrere SSL-Zertifikate zuzuordnen. Dies ist standardmäßig deaktiviert. </para> </listitem> </varlistentry> <varlistentry> <term><literal>use_networkmanager</literal></term> <listitem> <para> Verwende NetworkManager, um automatisch offline zu schalten. Dies ist standardmäßig aktiviert. </para> </listitem> </varlistentry> <varlistentry> <term><literal>use_stripes_everywhere</literal></term> <listitem> <para> Aktiviere wechselfarbige Linien in GtkTreeView-Komponenten. </para> </listitem> </varlistentry> <varlistentry> <term><literal>use_stripes_in_summaries</literal></term> <listitem> <para> Aktiviere wechselfarbige Linien bei den GtkTreeView-Komponenten des Hauptfensters (Ordnerliste und Nachrichtenliste). Der einzig brauchbare Umgang mit dieser Option ist, sie auf 0 zu setzen, wenn use_stripes_everywhere gleich 1 ist. </para> </listitem> </varlistentry> <varlistentry> <term><literal>utf8_instead_of_locale_for_broken_mail</literal></term> <listitem> <para> Verwende bei beschädigten Mails UTF-8-Kodierung anstelle des aktuellen Gebietsschemas. </para> </listitem> </varlistentry> <varlistentry> <term><literal>warn_dnd</literal></term> <listitem> <para> Zeige beim Verschieben von Ordnern mit der Maus einen Bestätigungsdialog. </para> </listitem> </varlistentry> </variablelist>
   </section>
   <section id="adv_autofaces">
index eb4f48471787bb5d8054df376c94b8c501b9f132..bb74a469972792f46a3a67804a442b18aa4a2027 100644 (file)
          </para>
        </listitem>
       </varlistentry>
-      <varlistentry>
-        <term><literal>enable_dotted_lines</literal></term>
-       <listitem>
-         <para>
-       Usar la apariencia <emphasis>antigua</emphasis> con líneas punteadas
-       en la lista de carpetas y de mensajes en lugar de la apariencia
-       <emphasis>moderna</emphasis> sin líneas.
-         </para>
-       </listitem>
-      </varlistentry>
       <varlistentry>
        <term><literal>enable_hscrollbar</literal></term>
        <listitem>
index 4271b5db006703da3677ca4974f840a7072b17e1..d51268a2234fe87877bf26205d2a324941ce9e02 100644 (file)
                        valeur est Claws Mail.
                        </para></listitem>
            </varlistentry>
-           <varlistentry><term>enable_dotted_lines</term>
-                   <listitem><para>
-                       Utilise le <emphasis>vieux</emphasis> style de lignes en pointillés dans
-                       les composants de type GtkTreeView (Liste de Dossiers et Liste de Messages),
-                       au lieu du style <emphasis>moderne</emphasis>, sans lignes ni pointillés.
-                       </para></listitem>
-           </varlistentry>
            <varlistentry><term>enable_hscrollbar</term>
                    <listitem><para>Active la barre de défilement horizontale dans la liste de messages.</para></listitem>
            </varlistentry>
index 9778a96c192084f093986d2cfb42a1d810b4f576..5d8346bd5247e810f7f772137b372f2c36ea3b5f 100644 (file)
          </para>
        </listitem>
       </varlistentry>
+      <varlistentry>
+       <term>Libravatar</term>
+       <listitem>
+         <para>
+       Enables displaying avatar images associated to user profiles in
+       libravatar.org or user's avatar enabled domains.
+       More information: <ulink
+       url="http://www.claws-mail.org/plugin.php?plugin=libravatar"
+       >www.claws-mail.org/plugin.php?plugin=libravatar</ulink>
+         </para>
+       </listitem>
+      </varlistentry>
       <varlistentry>
        <term>Mail Archiver</term>
        <listitem>
index c2bcaff310e408a9584142be778e9e15bae6b53a..be6a0030b6f767fa5b6e3cde794e9a2097a3cef1 100644 (file)
@@ -2166,6 +2166,7 @@ gchar *claws_get_socket_name(void)
 
                filename = g_strdup_printf("%s%c%s", socket_dir, G_DIR_SEPARATOR,
                                           md5sum);
+               g_free(socket_dir);
                debug_print("Using control socket %s\n", filename);
        }
 
index 8d8d4db61b174645a05cc093eaabc127cfa19321..0e642366ca2a78943f62659c1e6b4578b99c5bd4 100644 (file)
@@ -73,5 +73,6 @@ libravatar_la_CPPFLAGS = \
 libravatar_la_SOURCES = \
        libravatar.c libravatar.h \
        libravatar_prefs.c libravatar_prefs.h \
-       libravatar_missing.c libravatar_missing.h
+       libravatar_missing.c libravatar_missing.h \
+       libravatar_federation.c libravatar_federation.h
 
index 581c4f131edc713a8618cdbc868895522e794343..f64281fc89e5e400ff052a3e8a76c581f83906dc 100644 (file)
@@ -1,13 +1,8 @@
 Enhancements, possibilities and random ideas
 --------------------------------------------
 
-- Retrieve federated domain records (!)
 - Support federated IDN domains (??) (Claws Mail itself doesn't support it
   http://www.thewildbeast.co.uk/claws-mail/bugzilla/show_bug.cgi?id=1670)
-- Domain validation when searching for federated avatars, or at least
-  exclude some domains (eg.: localhost) (???)
-- Check box to enable/disable domain validation (?)
-  http://data.iana.org/TLD/tlds-alpha-by-domain.txt may be useful.
 - Button for checking custom default URL is not 404 (!) check on apply (?)
 - Make it run in cache-less mode if cache dir cannot be created (??)
 - Only cache "mystery man" once for all hashes (what if changes) (?)
index abb2d9a5a74f30129865cc0c3e642e3b54cd867e..48d3bf3bf34fa4a3a7ded125fc077bcbb6b43b4d 100644 (file)
@@ -31,6 +31,7 @@
 #include "libravatar.h"
 #include "libravatar_prefs.h"
 #include "libravatar_missing.h"
+#include "libravatar_federation.h"
 #include "prefs_common.h"
 #include "procheader.h"
 #include "procmsg.h"
@@ -76,10 +77,21 @@ static gboolean libravatar_header_update_hook(gpointer source, gpointer data)
 
 static gchar *federated_base_url_from_address(const gchar *address)
 {
-       /*
-          TODO: no federation supported right now
-          Details on http://wiki.libravatar.org/running_your_own/
-        */
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+       gchar *base_url = NULL;
+
+       if (!libravatarprefs.allow_federated) {
+               debug_print("federated domains disabled by configuration\n");
+               goto default_url;
+       }
+
+       base_url = federated_url_for_address(address);
+       if (base_url != NULL) {
+               return base_url;
+       }
+
+default_url:
+#endif
        return g_strdup(libravatarprefs.base_url);
 }
 
diff --git a/src/plugins/libravatar/libravatar_federation.c b/src/plugins/libravatar/libravatar_federation.c
new file mode 100644 (file)
index 0000000..106fdfb
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2014 Hiroyuki Yamamoto and the Claws Mail Team
+ * Copyright (C) 2014 Ricardo Mones
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+
+#include "libravatar_federation.h"
+#include "libravatar_prefs.h"
+#include "utils.h"
+
+#define MISSING "x"
+
+static GHashTable *federated = NULL;
+
+/**
+ * Get the associated avatar URL for a domain.
+ *
+ * @param domain Domain to get the URL for.
+ *
+ * @return The avatar URL for the domain or NULL if not found.
+ */
+static gchar *get_federated_url_for_domain(const gchar *domain)
+{
+       gchar *found;
+
+       if (federated == NULL) {
+               return NULL;
+       }
+
+       found = (gchar *) g_hash_table_lookup(federated, domain);
+
+       if (found != NULL)
+               debug_print("cached avatar url for domain %s found: %s\n", domain, found);
+       else    
+               debug_print("cached avatar url for domain %s not found\n", domain);
+
+       return found;
+}
+
+/**
+ * Adds a URL for a domain.
+ *
+ * @param url  The computed avatar URL.
+ * @param domain  Associated domain.
+ */
+static void add_federated_url_for_domain(const gchar *url, const gchar *domain)
+{
+       if (url == NULL)
+               return;
+
+       if (federated == NULL)
+               federated = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+
+       debug_print("new cached avatar url for domain %s: %s\n", domain, url);
+       g_hash_table_insert(federated, g_strdup(domain), g_strdup(url)); 
+}
+
+/**
+ * Retrieves the federated URL for a given email address.
+ *
+ * @param address  The email address.
+ *
+ * @return The avatar URL for the domain of the address. 
+ */
+gchar *federated_url_for_address(const gchar *address)
+{
+       gchar *domain = NULL, *last = NULL, *addr = NULL, *url = NULL;
+       gchar *host = NULL;
+       guint16 port = 0;
+
+       if (address == NULL || *address == '\0')
+               goto invalid_addr;
+
+       addr = g_strdup(address);
+        domain = strchr(addr, '@');
+       if (domain == NULL)
+               goto invalid_addr;
+       ++domain;
+       if (strlen(domain) < 5)
+               goto invalid_addr;
+
+       last = domain;
+       while (*last != '\0' && *last != ' ' && *last != '\t' && *last != '>')
+               ++last;
+       *last = '\0';
+
+       /* try cached domains */
+       url = get_federated_url_for_domain(domain);
+       if (url != NULL) {
+               g_free(addr);
+               if (!strcmp(url, MISSING)) {
+                       return g_strdup(libravatarprefs.base_url);
+               }
+               return g_strdup(url);
+       }
+
+       /* not cached, try secure service first */
+       if (auto_configure_service("avatars-sec", domain, &host, &port)) {
+               if (port != 443) {
+                       url = g_strdup_printf("https://%s:%d/avatar", host, port);
+               } else {
+                       url = g_strdup_printf("https://%s/avatar", host);
+               }
+       } else { /* try standard one if no secure service available */
+               if (auto_configure_service("avatars", domain, &host, &port)) {
+                       if (port != 80) {
+                               url = g_strdup_printf("http://%s:%d/avatar", host, port);
+                       } else {
+                               url = g_strdup_printf("http://%s/avatar", host);
+                       }
+               } else {
+                       debug_print("libravatar federated domain for %s not found\n", domain);
+               }
+       }
+       if (url != NULL) {
+               add_federated_url_for_domain(url, domain);
+       } else {
+               add_federated_url_for_domain(MISSING, domain);
+       }
+
+       g_free(addr);
+       return url;
+
+invalid_addr:
+       if (addr != NULL)
+               g_free(addr);
+
+       debug_print("invalid address for libravatar federated domain\n");
+       return NULL;
+}
+
diff --git a/src/plugins/libravatar/libravatar_federation.h b/src/plugins/libravatar/libravatar_federation.h
new file mode 100644 (file)
index 0000000..e34015d
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2014 Hiroyuki Yamamoto and the Claws Mail Team
+ * Copyright (C) 2014 Ricardo Mones
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __LIBRAVATAR_FEDERATION_H
+#define __LIBRAVATAR_FEDERATION_H
+
+#include <glib.h>
+
+gchar *federated_url_for_address       (const gchar *address);
+
+#endif
index d72ba935410887c3d13a1eb4ba9196f757fa30c4..b85cfa44ece17f96cdf2415fcf2d4b69559cefc9 100644 (file)
@@ -53,6 +53,9 @@ struct LibravatarPrefsPage
        GtkWidget *defm_radio[NUM_DEF_BUTTONS];
        GtkWidget *defm_url_text;
        GtkWidget *allow_redirects_check;
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+       GtkWidget *allow_federated_check;
+#endif
 };
 
 struct LibravatarPrefsPage libravatarprefs_page;
@@ -76,6 +79,11 @@ static PrefParam param[] = {
        { "allow_redirects", "TRUE",
          &libravatarprefs.allow_redirects,
           P_BOOL, NULL, NULL, NULL },
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+       { "allow_federated", "TRUE",
+         &libravatarprefs.allow_federated,
+          P_BOOL, NULL, NULL, NULL },
+#endif
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
 };
 
@@ -175,7 +183,6 @@ static GtkWidget *p_create_frame_missing(struct LibravatarPrefsPage *page)
        GtkWidget *vbox, *radio[NUM_DEF_BUTTONS], *hbox, *label, *entry;
        gboolean enable = FALSE;
        int i, e = 0;
-       
        gchar *radio_label[] = {
                _("None"),
                _("Mystery man"),
@@ -239,19 +246,31 @@ static GtkWidget *p_create_frame_missing(struct LibravatarPrefsPage *page)
 
 static GtkWidget *p_create_frame_network(struct LibravatarPrefsPage *page)
 {
-       GtkWidget *vbox, *checkbox;
+       GtkWidget *vbox, *chk_redirects;
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+       GtkWidget *chk_federated;
+#endif
 
        vbox =  gtk_vbox_new(FALSE, 6);
 
-       checkbox = create_checkbox(_("_Allow redirects to other sites"),
+       chk_redirects = create_checkbox(_("_Allow redirects to other sites"),
                                   _("Follow redirect responses received from "
                                     "libravatar server to other avatar "
                                     "services like gravatar.com"));
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_redirects),
                                     libravatarprefs.allow_redirects);
-       page->allow_redirects_check = checkbox;
-
-       gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
+       page->allow_redirects_check = chk_redirects;
+       gtk_box_pack_start(GTK_BOX(vbox), chk_redirects, FALSE, FALSE, 0);
+
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+       chk_federated = create_checkbox(_("_Enable federated servers"),
+                               _("Try to get avatar from sender's domain "
+                                 "libravatar server"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_federated),
+                                    libravatarprefs.allow_federated);
+       page->allow_federated_check = chk_federated;
+       gtk_box_pack_start(GTK_BOX(vbox), chk_federated, FALSE, FALSE, 0);
+#endif
 
        return vbox;
 }
@@ -273,6 +292,7 @@ static GtkWidget *p_create_frame_network(struct LibravatarPrefsPage *page)
   └──────────────────────────────────────────────────────┘
   ┌─Network──────────────────────────────────────────────┐
   │ [✔] Allow redirects                                  │
+  │ [✔] Federated servers                                │
   └──────────────────────────────────────────────────────┘
  */
 static void libravatar_prefs_create_widget_func(PrefsPage * _page,
@@ -362,6 +382,11 @@ static void libravatar_prefs_save_func(PrefsPage * _page)
        /* redirects */
        libravatarprefs.allow_redirects = gtk_toggle_button_get_active(
                GTK_TOGGLE_BUTTON(page->allow_redirects_check));
+       /* federation */
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+       libravatarprefs.allow_federated = gtk_toggle_button_get_active(
+               GTK_TOGGLE_BUTTON(page->allow_federated_check));
+#endif
 
        libravatar_save_config();
 }
index 791c440e94bdbbb441eaae0c824ce071ad321ece..84985ea397db3ee20b61cfb7d4749247c3411bd0 100644 (file)
@@ -45,6 +45,9 @@ struct _LibravatarPrefs
        guint           default_mode;
        gchar           *default_mode_url;
        gboolean        allow_redirects;
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+       gboolean        allow_federated;
+#endif
 };
 
 extern LibravatarPrefs libravatarprefs;