2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2014 Hiroyuki Yamamoto and the Claws Mail Team
4 * Copyright (C) 2014 Ricardo Mones
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "libravatar_federation.h"
23 #include "libravatar_prefs.h"
29 static GHashTable *federated = NULL;
32 * Get the associated avatar URL for a domain.
34 * @param domain Domain to get the URL for.
36 * @return The avatar URL for the domain or NULL if not found.
38 static gchar *get_federated_url_for_domain(const gchar *domain)
42 if (federated == NULL) {
46 found = (gchar *) g_hash_table_lookup(federated, domain);
49 debug_print("cached avatar url for domain %s found: %s\n", domain, found);
51 debug_print("cached avatar url for domain %s not found\n", domain);
57 * Adds a URL for a domain.
59 * @param url The computed avatar URL.
60 * @param domain Associated domain.
62 static void add_federated_url_for_domain(const gchar *url, const gchar *domain)
67 if (federated == NULL)
68 federated = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
70 debug_print("new cached avatar url for domain %s: %s\n", domain, url);
71 g_hash_table_insert(federated, g_strdup(domain), g_strdup(url));
75 * Retrieves the federated URL for a given email address.
77 * @param address The email address.
79 * @return The avatar URL for the domain of the address.
81 gchar *federated_url_for_address(const gchar *address)
83 gchar *domain = NULL, *last = NULL, *addr = NULL, *url = NULL;
87 if (address == NULL || *address == '\0')
90 addr = g_strdup(address);
91 domain = strchr(addr, '@');
96 if (strlen(domain) < 5)
100 while (*last != '\0' && *last != ' ' && *last != '\t' && *last != '>')
104 /* try cached domains */
105 url = get_federated_url_for_domain(domain);
108 if (!strcmp(url, MISSING)) {
111 return g_strdup(url);
114 /* not cached, try secure service first */
115 if (auto_configure_service_sync("avatars-sec", domain, &host, &port)) {
117 url = g_strdup_printf("https://%s:%d/avatar", host, port);
119 url = g_strdup_printf("https://%s/avatar", host);
121 } else { /* try standard one if no secure service available */
122 if (auto_configure_service_sync("avatars", domain, &host, &port)) {
124 url = g_strdup_printf("http://%s:%d/avatar", host, port);
126 url = g_strdup_printf("http://%s/avatar", host);
129 debug_print("libravatar federated domain for %s not found\n", domain);
133 add_federated_url_for_domain(url, domain);
135 add_federated_url_for_domain(MISSING, domain);
145 debug_print("invalid address for libravatar federated domain\n");