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"
33 /* Include config.h so that _() works: */
38 #define MODEST_PRESETS_KEY_NAME "Name"
39 #define MODEST_PRESETS_KEY_DOMAIN "Domain"
40 #define MODEST_PRESETS_KEY_MCC "MCC"
41 #define MODEST_PRESETS_KEY_INCOMING "IncomingMailServer"
42 #define MODEST_PRESETS_KEY_OUTGOING "OutgoingMailServer"
43 #define MODEST_PRESETS_KEY_MAILBOX_TYPE "MailboxType"
44 #define MODEST_PRESETS_KEY_MAILBOX_TYPE_POP "pop"
45 #define MODEST_PRESETS_KEY_MAILBOX_TYPE_IMAP "imap"
46 #define MODEST_PRESETS_KEY_APOP "APOPSecureLogin"
47 #define MODEST_PRESETS_KEY_SECURE_SMTP "SecureSMTP"
48 #define MODEST_PRESETS_KEY_TRUE "true"
50 /** An efficient way to store the info for each provider.
52 typedef enum _ModestPresetsInfo {
53 /* two bits for the server type */
54 MODEST_PRESETS_INFO_NONE = 0x0000,
55 MODEST_PRESETS_INFO_IMAP = 0x0001,
56 MODEST_PRESETS_INFO_POP = 0x0002,
57 MODEST_PRESETS_INFO_SMTP = 0x0003,
59 /* one bit for each of these */
60 MODEST_PRESETS_INFO_APOP = 0x0004,
61 MODEST_PRESETS_INFO_SECURE_SMTP = 0x0008,
62 MODEST_PRESETS_INFO_SECURE_INCOMING = 0x000f
66 * modest_presets_get_info:
67 * @self: a valid ModestPresets instance
68 * @provider_id: ID of the provider
69 * @incoming_server: get the incoming mailserver if TRUE, get the
70 * outgoing server otherwise
72 * get information about some incoming or outgoing mailserver
74 * Returns: a ModestPresetsInfo with the required information
76 static ModestPresetsInfo
77 modest_presets_get_info (ModestPresets *self, const gchar *provider_id, gboolean incoming_server);
81 modest_presets_new (const gchar *presetfile)
83 ModestPresets *presets = NULL;
86 g_return_val_if_fail (presetfile, NULL);
88 presets = g_new (ModestPresets, 1);
89 presets->keyfile = g_key_file_new ();
91 if (!presets->keyfile) {
92 g_printerr ("modest: cannot instantiate GKeyFile\n");
97 /* TODO: Unobfuscate an obfuscated file and then load it with g_key_file_load_from_data() instead. */
99 if (!g_key_file_load_from_file (presets->keyfile, presetfile,
100 G_KEY_FILE_NONE, &err)) {
101 g_printerr ("modest: cannot open keyfile from %s:\n %s\n", presetfile,
102 err ? err->message : "unknown reason");
112 modest_presets_get_providers (ModestPresets *self, guint mcc,
113 gboolean include_globals, gchar ***provider_ids)
115 gchar **all_providers = NULL;
116 gchar **all_provider_ids = NULL;
117 gchar **filtered = NULL;
118 gchar **filtered_ids = NULL;
122 g_return_val_if_fail (self && self->keyfile, NULL);
124 /* Get all the provider IDs: */
125 all_provider_ids = g_key_file_get_groups (self->keyfile, NULL);
126 len = g_strv_length(all_provider_ids);
128 /* Get the names for all these providers: */
129 all_providers = g_new0(gchar*, len + 1); /* Provider names. */
130 for (i=0; i != len; ++i) {
131 const gchar * provider_id = all_provider_ids[i];
133 gchar* name = g_key_file_get_string(self->keyfile, provider_id,
134 MODEST_PRESETS_KEY_NAME, NULL);
136 /* Be forgiving of missing names.
137 * If we use NULL then we will null-terminate the array.
142 all_providers[i] = name;
145 all_providers[i] = NULL;
148 /* return *all* providers? */
149 if (mcc == 0 && include_globals) {
150 *provider_ids = all_provider_ids;
151 return all_providers;
154 /* nope: filter them */
156 filtered = g_new0(gchar*, len + 1); /* Provider names. */
157 filtered_ids = g_new0(gchar*, len + 1); /* Provider IDs */
159 for (i=0, j=0; i != len; ++i) {
162 this_mcc = g_key_file_get_integer (self->keyfile, all_provider_ids[i],
163 MODEST_PRESETS_KEY_MCC, &err);
165 g_strfreev (all_providers);
166 g_strfreev (all_provider_ids);
167 g_strfreev (filtered);
168 g_strfreev (filtered_ids);
170 g_printerr ("modest: error parsing keyfile: %s\n", err->message);
176 if (this_mcc == mcc || (this_mcc == 0 && include_globals)) {
177 filtered[j] = all_providers[i];
178 filtered_ids[j] = all_provider_ids[i];
180 filtered[j] = NULL; /* the array must be NULL-terminated */
181 filtered_ids[j] = NULL; /* the array must be NULL-terminated */
183 all_providers[i] = NULL; /* g_strfreev: leave it alone */
184 all_provider_ids[i] = NULL; /* g_strfreev: leave it alone */
188 g_strfreev (all_providers);
189 g_strfreev (all_provider_ids);
191 *provider_ids = filtered_ids;
197 modest_presets_get_server (ModestPresets *self, const gchar *provider_id,
198 gboolean incoming_server)
200 g_return_val_if_fail (self && self->keyfile, NULL);
201 g_return_val_if_fail (provider_id, NULL);
203 return g_key_file_get_string (self->keyfile, provider_id,
205 MODEST_PRESETS_KEY_INCOMING :
206 MODEST_PRESETS_KEY_OUTGOING,
210 gchar * modest_presets_get_domain (ModestPresets *self,
211 const gchar *provider_id)
213 g_return_val_if_fail (self && self->keyfile, NULL);
214 g_return_val_if_fail (provider_id, NULL);
216 return g_key_file_get_string (self->keyfile, provider_id,
217 MODEST_PRESETS_KEY_DOMAIN,
223 modest_presets_get_info (ModestPresets *self, const gchar *provider_id, gboolean incoming_server)
225 ModestPresetsInfo info = 0;
228 g_return_val_if_fail (self && self->keyfile, 0);
230 if(incoming_server) {
231 val = g_key_file_get_string (self->keyfile, provider_id,
232 MODEST_PRESETS_KEY_INCOMING, NULL);
235 val = g_key_file_get_string (self->keyfile, provider_id,
236 MODEST_PRESETS_KEY_MAILBOX_TYPE, NULL);
237 if (strcmp (val, MODEST_PRESETS_KEY_MAILBOX_TYPE_POP) == 0)
238 info |= MODEST_PRESETS_INFO_POP;
239 if (strcmp (val, MODEST_PRESETS_KEY_MAILBOX_TYPE_IMAP) == 0)
240 info |= MODEST_PRESETS_INFO_IMAP;
243 val = g_key_file_get_string (self->keyfile, provider_id,
244 MODEST_PRESETS_KEY_APOP, NULL);
245 if (val && strcmp(val, MODEST_PRESETS_KEY_TRUE) == 0)
246 info |= MODEST_PRESETS_INFO_APOP;
250 else /* outgoing: */ {
251 val = g_key_file_get_string (self->keyfile, provider_id,
252 MODEST_PRESETS_KEY_OUTGOING, NULL);
255 info |= MODEST_PRESETS_INFO_SMTP;
257 val = g_key_file_get_string (self->keyfile, provider_id,
258 MODEST_PRESETS_KEY_SECURE_SMTP, NULL);
259 if (val && strcmp(val,MODEST_PRESETS_KEY_TRUE) == 0)
260 info |= MODEST_PRESETS_INFO_SECURE_SMTP;
268 ModestPresetsServerType
269 modest_presets_get_info_server_type (ModestPresets *self,
270 const gchar *provider_id,
271 gboolean incoming_server)
273 ModestPresetsInfo info = modest_presets_get_info (self, provider_id, incoming_server);
275 /* The server type is stored in the first 2 bits: */
278 /* Convert from the internal enum to the public enum: */
279 if(info == MODEST_PRESETS_INFO_IMAP)
280 return MODEST_PRESETS_SERVER_TYPE_IMAP;
281 else if(info == MODEST_PRESETS_INFO_POP)
282 return MODEST_PRESETS_SERVER_TYPE_POP;
283 else if(info == MODEST_PRESETS_INFO_SMTP)
284 return MODEST_PRESETS_SERVER_TYPE_SMTP;
286 return MODEST_PRESETS_SERVER_TYPE_NONE;
289 ModestPresetsSecurity
290 modest_presets_get_info_server_security (ModestPresets *self,
291 const gchar *provider_id,
292 gboolean incoming_server)
294 ModestPresetsInfo info = modest_presets_get_info (self, provider_id, incoming_server);
296 /* The security flags are stored in all except the first 4 bits: */
297 info = info && !0x04;
299 /* Convert from the internal flags to the public flags: */
300 ModestPresetsSecurity security = MODEST_PRESETS_SECURITY_NONE;
301 if(info && MODEST_PRESETS_INFO_APOP)
302 security = security | MODEST_PRESETS_SECURITY_APOP;
304 if(info && MODEST_PRESETS_INFO_SECURE_SMTP)
305 security = security | MODEST_PRESETS_SECURITY_SECURE_SMTP;
307 if(info && MODEST_PRESETS_INFO_SECURE_INCOMING)
308 security = security | MODEST_PRESETS_SECURITY_SECURE_INCOMING;
317 modest_presets_destroy (ModestPresets *self)
322 g_key_file_free (self->keyfile);
323 self->keyfile = NULL;