2007-06-08 Murray Cumming <murrayc@murrayc.com>
[modest] / src / maemo / easysetup / modest-presets.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
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.
16  *
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.
28  */
29
30 #include <string.h> /* for strcmp */
31 #include "modest-presets.h"
32
33 /* Include config.h so that _() works: */
34 #ifdef HAVE_CONFIG_H
35 #include <config.h>
36 #endif
37
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_INCOMING_SECURITY   "IncomingSecurity"
43 #define MODEST_PRESETS_KEY_OUTGOING            "OutgoingMailServer"
44 #define MODEST_PRESETS_KEY_MAILBOX_TYPE        "MailboxType"
45 #define MODEST_PRESETS_KEY_APOP                "APOPSecureLogin"
46 #define MODEST_PRESETS_KEY_SECURE_SMTP         "SecureSMTP"
47                                                     
48
49 ModestPresets*
50 modest_presets_new (const gchar *presetfile)
51 {
52         ModestPresets *presets = NULL;
53         GError        *err     = NULL;
54         
55         g_return_val_if_fail (presetfile, NULL);
56         
57         presets = g_new (ModestPresets, 1);
58         presets->keyfile = g_key_file_new ();
59
60         if (!presets->keyfile) {
61                 g_printerr ("modest: cannot instantiate GKeyFile\n");
62                 g_free (presets);
63                 return NULL;
64         }
65
66         /* TODO: Unobfuscate an obfuscated file and then load it with g_key_file_load_from_data() instead. */
67         
68         if (!g_key_file_load_from_file (presets->keyfile, presetfile,
69                                         G_KEY_FILE_NONE, &err)) {
70                 g_printerr ("modest: cannot open keyfile from %s:\n  %s\n", presetfile,
71                             err ? err->message : "unknown reason");
72                 g_error_free (err);
73                 g_free (presets);
74                 return NULL;
75         }
76
77         return presets;
78 }
79
80 gchar**
81 modest_presets_get_providers  (ModestPresets *self, guint mcc,
82                                gboolean include_globals, gchar ***provider_ids)
83 {
84         gchar **all_providers = NULL;
85         gchar **all_provider_ids = NULL;
86         gchar **filtered  = NULL;
87         gchar **filtered_ids = NULL;
88         GError *err       = NULL;
89         guint i, j, len;
90         
91         g_return_val_if_fail (self && self->keyfile, NULL);
92
93         /* Get all the provider IDs: */
94         all_provider_ids = g_key_file_get_groups (self->keyfile, NULL);
95         len = g_strv_length(all_provider_ids);
96
97         /* Get the names for all these providers: */
98         all_providers = g_new0(gchar*, len + 1); /* Provider names. */
99         for (i=0; i != len; ++i) {
100                 const gchar * provider_id = all_provider_ids[i];
101                 if(provider_id) {
102                         gchar* name = g_key_file_get_string(self->keyfile, provider_id, 
103                                 MODEST_PRESETS_KEY_NAME, NULL);
104                                 
105                         /* Be forgiving of missing names.
106                          * If we use NULL then we will null-terminate the array.
107                          */
108                         if(!name)
109                                 name = g_strdup("");
110                                 
111                         all_providers[i] = name;        
112                 }
113                 else
114                         all_providers[i] = NULL;
115         };
116                 
117         /* return *all* providers? */
118         if (mcc == 0 && include_globals) {
119                 *provider_ids = all_provider_ids;
120                 return all_providers;
121         }
122         
123         /* nope: filter them */
124
125         filtered = g_new0(gchar*, len + 1); /* Provider names. */
126         filtered_ids = g_new0(gchar*, len + 1); /* Provider IDs */
127
128         for (i=0, j=0; i != len; ++i) {
129
130                 int this_mcc;
131                 this_mcc = g_key_file_get_integer (self->keyfile, all_provider_ids[i],
132                                                    MODEST_PRESETS_KEY_MCC, &err);
133                 if (err) {
134                         g_strfreev (all_providers);
135                         g_strfreev (all_provider_ids);
136                         g_strfreev (filtered);
137                         g_strfreev (filtered_ids);
138                         
139                         g_printerr ("modest: error parsing keyfile: %s\n", err->message);
140                         g_error_free (err);
141                         
142                         return NULL;
143                 }
144                 
145                 if (this_mcc == mcc || (this_mcc == 0 && include_globals)) {
146                         filtered[j]   = all_providers[i];
147                         filtered_ids[j]   = all_provider_ids[i];
148                         ++j;
149                         filtered[j] = NULL; /* the array must be NULL-terminated */
150                         filtered_ids[j] = NULL; /* the array must be NULL-terminated */
151                         
152                         all_providers[i]  = NULL; /*  g_strfreev: leave it alone */
153                         all_provider_ids[i]  = NULL; /*  g_strfreev: leave it alone */
154                 }
155         }
156         
157         g_strfreev (all_providers);
158         g_strfreev (all_provider_ids);
159         
160         *provider_ids = filtered_ids;
161         return filtered;
162 }
163
164
165 gchar*
166 modest_presets_get_server (ModestPresets *self, const gchar *provider_id,
167                            gboolean incoming_server)
168 {       
169         g_return_val_if_fail (self && self->keyfile, NULL);
170         g_return_val_if_fail (provider_id, NULL);
171
172         return g_key_file_get_string (self->keyfile, provider_id, 
173                                       incoming_server ?
174                                       MODEST_PRESETS_KEY_INCOMING :
175                                       MODEST_PRESETS_KEY_OUTGOING,
176                                       NULL);
177 }
178
179 gchar *
180 modest_presets_get_domain      (ModestPresets *self,
181                                 const gchar *provider_id)
182 {       
183         g_return_val_if_fail (self && self->keyfile, NULL);
184         g_return_val_if_fail (provider_id, NULL);
185
186         return g_key_file_get_string (self->keyfile, provider_id, 
187                                       MODEST_PRESETS_KEY_DOMAIN,
188                                       NULL);
189 }               
190
191
192
193
194 ModestPresetsServerType
195 modest_presets_get_info_server_type (ModestPresets *self,
196                                      const gchar *provider_id,
197                                      gboolean incoming_server)
198 {
199         ModestPresetsServerType info = MODEST_PRESETS_SERVER_TYPE_NONE;
200         gchar *val = NULL;
201         
202         g_return_val_if_fail (self && self->keyfile, 0);
203
204         if (incoming_server) {
205                 val = g_key_file_get_string (self->keyfile, provider_id,
206                                              MODEST_PRESETS_KEY_INCOMING, NULL);
207                 if (!val)
208                         return info;
209                 
210                 g_free (val);
211                 val = g_key_file_get_string (self->keyfile, provider_id,
212                                              MODEST_PRESETS_KEY_MAILBOX_TYPE,NULL);
213                 if (val && strcmp (val, "pop") == 0)
214                         info = MODEST_PRESETS_SERVER_TYPE_POP;
215                 if (val && strcmp (val, "imap") == 0)
216                         info = MODEST_PRESETS_SERVER_TYPE_IMAP;
217         } else {
218                 val = g_key_file_get_string (self->keyfile, provider_id,
219                                              MODEST_PRESETS_KEY_OUTGOING, NULL);
220                 if (!val)
221                         return info;
222                 info = MODEST_PRESETS_SERVER_TYPE_SMTP;
223         }
224         g_free (val);
225
226         /* debug: */
227 /*      g_message ("provider id: %s, server type: %d", provider_id, info); */
228         return info;
229 }
230
231
232
233 ModestPresetsSecurity
234 modest_presets_get_info_server_security (ModestPresets *self, const gchar *provider_id,
235                                          gboolean incoming_server)
236 {
237         ModestPresetsSecurity info = MODEST_PRESETS_SECURITY_NONE;
238         gchar *val = NULL;
239         
240         g_return_val_if_fail (self && self->keyfile, MODEST_PRESETS_SECURITY_NONE);
241
242         if (incoming_server) {
243                 val = g_key_file_get_string (self->keyfile, provider_id,
244                                              MODEST_PRESETS_KEY_INCOMING, NULL);
245                 if (val) {
246                         g_free (val);   
247                         val = g_key_file_get_string (self->keyfile, provider_id,
248                                                      MODEST_PRESETS_KEY_APOP, NULL);
249                         if (val && strcmp(val, "true") == 0)
250                                 info |= MODEST_PRESETS_SECURITY_APOP;
251                         g_free(val);
252                         
253                         val = g_key_file_get_string (self->keyfile, provider_id,
254                                                      MODEST_PRESETS_KEY_INCOMING_SECURITY, NULL);
255                         if (val && strcmp (val, "1") == 0) 
256                                 info |= MODEST_PRESETS_SECURITY_SECURE_INCOMING;
257                         if (val && strcmp (val, "2") == 0) {
258                                 info |= MODEST_PRESETS_SECURITY_SECURE_INCOMING;
259                                 info |= MODEST_PRESETS_SECURITY_SECURE_INCOMING_ALTERNATE_PORT;
260                         }
261                         g_free (val);
262                 }
263         } else /* outgoing: */ {
264                 val = g_key_file_get_string (self->keyfile, provider_id,
265                                              MODEST_PRESETS_KEY_OUTGOING, NULL);
266                 if (val) {
267                         g_free (val);
268                         info |= MODEST_PRESETS_SECURITY_SECURE_SMTP;
269                         
270                         val = g_key_file_get_string (self->keyfile, provider_id,
271                                                      MODEST_PRESETS_KEY_SECURE_SMTP, NULL);
272                         if (val && strcmp(val,"true") == 0)
273                                 info |= MODEST_PRESETS_SECURITY_SECURE_SMTP;
274                         g_free(val);
275                 }
276         }
277
278         /* debug */
279 /*      g_message ("provider id: %s, apop:%s, secure-incoming:%s, altport: %s, secure-smtp: %s", */
280 /*                 provider_id, */
281 /*                 info & MODEST_PRESETS_SECURITY_APOP ? "yes" : "no", */
282 /*                 info & MODEST_PRESETS_SECURITY_SECURE_INCOMING ? "yes" : "no", */
283 /*                 info & MODEST_PRESETS_SECURITY_SECURE_INCOMING_ALTERNATE_PORT ? "yes" : "no", */
284 /*                 info & MODEST_PRESETS_SECURITY_SECURE_SMTP ? "yes" : "no"); */
285
286         return info;
287 }
288
289                                                         
290
291         
292 void
293 modest_presets_destroy (ModestPresets *self)
294 {
295         if (!self)
296                 return;
297
298         g_key_file_free (self->keyfile);
299         self->keyfile = NULL;
300         
301         g_free (self);
302 }