1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include <string.h> /* for strcmp */
31 #include "modest-presets.h"
34 /* Include config.h so that _() works: */
39 #define MODEST_PRESETS_KEY_NAME "Name"
40 #define MODEST_PRESETS_KEY_DOMAIN "Domain"
41 #define MODEST_PRESETS_KEY_MCC "MCC"
42 #define MODEST_PRESETS_KEY_INCOMING "IncomingMailServer"
43 #define MODEST_PRESETS_KEY_INCOMING_SECURITY "IncomingSecurity"
44 #define MODEST_PRESETS_KEY_OUTGOING "OutgoingMailServer"
45 #define MODEST_PRESETS_KEY_MAILBOX_TYPE "MailboxType"
46 #define MODEST_PRESETS_KEY_APOP "APOPSecureLogin"
47 #define MODEST_PRESETS_KEY_SECURE_SMTP "SecureSmtp"
51 modest_presets_new (const gchar *presetfile)
53 ModestPresets *presets = NULL;
56 g_return_val_if_fail (presetfile, NULL);
58 presets = g_new (ModestPresets, 1);
59 presets->keyfile = g_key_file_new ();
61 if (!presets->keyfile) {
62 g_printerr ("modest: cannot instantiate GKeyFile\n");
67 /* TODO: Unobfuscate an obfuscated file and then load it with g_key_file_load_from_data() instead. */
69 if (!g_key_file_load_from_file (presets->keyfile, presetfile,
70 G_KEY_FILE_NONE, &err)) {
71 g_printerr ("modest: cannot open keyfile from %s:\n %s\n", presetfile,
72 err ? err->message : "unknown reason");
82 modest_presets_get_providers (ModestPresets *self, guint mcc,
83 gboolean include_globals, gchar ***provider_ids)
85 gchar **all_providers = NULL;
86 gchar **all_provider_ids = NULL;
87 gchar **filtered = NULL;
88 gchar **filtered_ids = NULL;
92 g_return_val_if_fail (self && self->keyfile, NULL);
94 /* Get all the provider IDs: */
95 all_provider_ids = g_key_file_get_groups (self->keyfile, NULL);
96 len = g_strv_length(all_provider_ids);
98 /* Get the names for all these providers: */
99 all_providers = g_new0(gchar*, len + 1); /* Provider names. */
100 for (i=0; i != len; ++i) {
101 const gchar * provider_id = all_provider_ids[i];
103 gchar* name = g_key_file_get_string(self->keyfile, provider_id,
104 MODEST_PRESETS_KEY_NAME, NULL);
106 /* Be forgiving of missing names.
107 * If we use NULL then we will null-terminate the array.
112 all_providers[i] = name;
115 all_providers[i] = NULL;
118 /* return *all* providers? */
120 if (mcc == 0 && include_globals) {
121 *provider_ids = all_provider_ids;
122 return all_providers;
126 /* nope: filter them */
128 filtered = g_new0(gchar*, len + 1); /* Provider names. */
129 filtered_ids = g_new0(gchar*, len + 1); /* Provider IDs */
131 for (i=0, j=0; i != len; ++i) {
134 this_mcc = g_key_file_get_integer (self->keyfile, all_provider_ids[i],
135 MODEST_PRESETS_KEY_MCC, &err);
137 g_strfreev (all_providers);
138 g_strfreev (all_provider_ids);
139 g_strfreev (filtered);
140 g_strfreev (filtered_ids);
142 g_printerr ("modest: error parsing keyfile: %s\n", err->message);
148 if (this_mcc == mcc || (this_mcc == 0 && include_globals)) {
149 filtered[j] = all_providers[i];
150 filtered_ids[j] = all_provider_ids[i];
152 filtered[j] = NULL; /* the array must be NULL-terminated */
153 filtered_ids[j] = NULL; /* the array must be NULL-terminated */
155 all_providers[i] = NULL; /* g_strfreev: leave it alone */
156 all_provider_ids[i] = NULL; /* g_strfreev: leave it alone */
160 g_strfreev (all_providers);
161 g_strfreev (all_provider_ids);
163 *provider_ids = filtered_ids;
169 modest_presets_get_server (ModestPresets *self, const gchar *provider_id,
170 gboolean incoming_server)
172 g_return_val_if_fail (self && self->keyfile, NULL);
173 g_return_val_if_fail (provider_id, NULL);
175 return g_key_file_get_string (self->keyfile, provider_id,
177 MODEST_PRESETS_KEY_INCOMING :
178 MODEST_PRESETS_KEY_OUTGOING,
183 modest_presets_get_domain (ModestPresets *self,
184 const gchar *provider_id)
186 g_return_val_if_fail (self && self->keyfile, NULL);
187 g_return_val_if_fail (provider_id, NULL);
189 return g_key_file_get_string (self->keyfile, provider_id,
190 MODEST_PRESETS_KEY_DOMAIN,
197 ModestPresetsServerType
198 modest_presets_get_info_server_type (ModestPresets *self,
199 const gchar *provider_id,
200 gboolean incoming_server)
202 ModestPresetsServerType info = MODEST_PRESETS_SERVER_TYPE_NONE;
205 g_return_val_if_fail (self && self->keyfile, 0);
207 if (incoming_server) {
208 val = g_key_file_get_string (self->keyfile, provider_id,
209 MODEST_PRESETS_KEY_INCOMING, NULL);
214 val = g_key_file_get_string (self->keyfile, provider_id,
215 MODEST_PRESETS_KEY_MAILBOX_TYPE,NULL);
216 if (val && strcmp (val, "pop") == 0)
217 info = MODEST_PRESETS_SERVER_TYPE_POP;
218 if (val && strcmp (val, "imap") == 0)
219 info = MODEST_PRESETS_SERVER_TYPE_IMAP;
221 val = g_key_file_get_string (self->keyfile, provider_id,
222 MODEST_PRESETS_KEY_OUTGOING, NULL);
225 info = MODEST_PRESETS_SERVER_TYPE_SMTP;
230 /* g_message ("provider id: %s, server type: %d", provider_id, info); */
236 ModestPresetsSecurity
237 modest_presets_get_info_server_security (ModestPresets *self, const gchar *provider_id,
238 gboolean incoming_server)
240 ModestPresetsSecurity info = MODEST_PRESETS_SECURITY_NONE;
243 g_return_val_if_fail (self && self->keyfile, MODEST_PRESETS_SECURITY_NONE);
245 if (incoming_server) {
246 val = g_key_file_get_string (self->keyfile, provider_id,
247 MODEST_PRESETS_KEY_INCOMING, NULL);
250 val = g_key_file_get_string (self->keyfile, provider_id,
251 MODEST_PRESETS_KEY_APOP, NULL);
252 if (val && strcmp(val, "true") == 0)
253 info |= MODEST_PRESETS_SECURITY_APOP;
256 val = g_key_file_get_string (self->keyfile, provider_id,
257 MODEST_PRESETS_KEY_INCOMING_SECURITY, NULL);
258 if (val && strcmp (val, "1") == 0)
259 info |= MODEST_PRESETS_SECURITY_SECURE_INCOMING;
260 if (val && strcmp (val, "2") == 0) {
261 info |= MODEST_PRESETS_SECURITY_SECURE_INCOMING;
262 info |= MODEST_PRESETS_SECURITY_SECURE_INCOMING_ALTERNATE_PORT;
266 } else /* outgoing: */ {
267 val = g_key_file_get_string (self->keyfile, provider_id,
268 MODEST_PRESETS_KEY_OUTGOING, NULL);
272 val = g_key_file_get_string (self->keyfile, provider_id,
273 MODEST_PRESETS_KEY_SECURE_SMTP, NULL);
274 /* printf("debug: %s: provider_id=%s, secure-smtp val=%s\n", __FUNCTION__, provider_id, val); */
275 if (val && strcmp(val,"true") == 0)
276 info |= MODEST_PRESETS_SECURITY_SECURE_SMTP;
282 /* g_message ("provider id: %s, apop:%s, secure-incoming:%s, altport: %s, secure-smtp: %s", */
284 /* info & MODEST_PRESETS_SECURITY_APOP ? "yes" : "no", */
285 /* info & MODEST_PRESETS_SECURITY_SECURE_INCOMING ? "yes" : "no", */
286 /* info & MODEST_PRESETS_SECURITY_SECURE_INCOMING_ALTERNATE_PORT ? "yes" : "no", */
287 /* info & MODEST_PRESETS_SECURITY_SECURE_SMTP ? "yes" : "no"); */
296 modest_presets_destroy (ModestPresets *self)
301 g_key_file_free (self->keyfile);
302 self->keyfile = NULL;