* src/maemo/modest-msg-edit-window.c:
[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 #include <stdio.h>
33
34 /* Include config.h so that _() works: */
35 #ifdef HAVE_CONFIG_H
36 #include <config.h>
37 #endif
38
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"
48                                                     
49
50 ModestPresets*
51 modest_presets_new (const gchar *presetfile)
52 {
53         ModestPresets *presets = NULL;
54         GError        *err     = NULL;
55         
56         g_return_val_if_fail (presetfile, NULL);
57         
58         presets = g_new (ModestPresets, 1);
59         presets->keyfile = g_key_file_new ();
60
61         if (!presets->keyfile) {
62                 g_printerr ("modest: cannot instantiate GKeyFile\n");
63                 g_free (presets);
64                 return NULL;
65         }
66
67         /* TODO: Unobfuscate an obfuscated file and then load it with g_key_file_load_from_data() instead. */
68         
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");
73                 g_error_free (err);
74                 g_free (presets);
75                 return NULL;
76         }
77
78         return presets;
79 }
80
81 gchar**
82 modest_presets_get_providers  (ModestPresets *self, guint mcc,
83                                gboolean include_globals, gchar ***provider_ids)
84 {
85         gchar **all_providers = NULL;
86         gchar **all_provider_ids = NULL;
87         gchar **filtered  = NULL;
88         gchar **filtered_ids = NULL;
89         GError *err       = NULL;
90         guint i, j, len;
91         
92         g_return_val_if_fail (self && self->keyfile, NULL);
93
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);
97
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];
102                 if(provider_id) {
103                         gchar* name = g_key_file_get_string(self->keyfile, provider_id, 
104                                 MODEST_PRESETS_KEY_NAME, NULL);
105                                 
106                         /* Be forgiving of missing names.
107                          * If we use NULL then we will null-terminate the array.
108                          */
109                         if(!name)
110                                 name = g_strdup("");
111                                 
112                         all_providers[i] = name;        
113                 }
114                 else
115                         all_providers[i] = NULL;
116         };
117                 
118         /* return *all* providers? */
119         /*
120         if (mcc == 0 && include_globals) {
121                 *provider_ids = all_provider_ids;
122                 return all_providers;
123         }
124         */
125         
126         /* nope: filter them */
127
128         filtered = g_new0(gchar*, len + 1); /* Provider names. */
129         filtered_ids = g_new0(gchar*, len + 1); /* Provider IDs */
130
131         for (i=0, j=0; i != len; ++i) {
132
133                 int this_mcc;
134                 this_mcc = g_key_file_get_integer (self->keyfile, all_provider_ids[i],
135                                                    MODEST_PRESETS_KEY_MCC, &err);
136                 if (err) {
137                         g_strfreev (all_providers);
138                         g_strfreev (all_provider_ids);
139                         g_strfreev (filtered);
140                         g_strfreev (filtered_ids);
141                         
142                         g_printerr ("modest: error parsing keyfile: %s\n", err->message);
143                         g_error_free (err);
144                         
145                         return NULL;
146                 }
147                 
148                 if (this_mcc == mcc || (this_mcc == 0 && include_globals)) {
149                         filtered[j]   = all_providers[i];
150                         filtered_ids[j]   = all_provider_ids[i];
151                         ++j;
152                         filtered[j] = NULL; /* the array must be NULL-terminated */
153                         filtered_ids[j] = NULL; /* the array must be NULL-terminated */
154                         
155                         all_providers[i]  = NULL; /*  g_strfreev: leave it alone */
156                         all_provider_ids[i]  = NULL; /*  g_strfreev: leave it alone */
157                 }
158         }
159         
160         g_strfreev (all_providers);
161         g_strfreev (all_provider_ids);
162         
163         *provider_ids = filtered_ids;
164         return filtered;
165 }
166
167
168 gchar*
169 modest_presets_get_server (ModestPresets *self, const gchar *provider_id,
170                            gboolean incoming_server)
171 {       
172         g_return_val_if_fail (self && self->keyfile, NULL);
173         g_return_val_if_fail (provider_id, NULL);
174
175         return g_key_file_get_string (self->keyfile, provider_id, 
176                                       incoming_server ?
177                                       MODEST_PRESETS_KEY_INCOMING :
178                                       MODEST_PRESETS_KEY_OUTGOING,
179                                       NULL);
180 }
181
182 gchar *
183 modest_presets_get_domain      (ModestPresets *self,
184                                 const gchar *provider_id)
185 {       
186         g_return_val_if_fail (self && self->keyfile, NULL);
187         g_return_val_if_fail (provider_id, NULL);
188
189         return g_key_file_get_string (self->keyfile, provider_id, 
190                                       MODEST_PRESETS_KEY_DOMAIN,
191                                       NULL);
192 }               
193
194
195
196
197 ModestPresetsServerType
198 modest_presets_get_info_server_type (ModestPresets *self,
199                                      const gchar *provider_id,
200                                      gboolean incoming_server)
201 {
202         ModestPresetsServerType info = MODEST_PRESETS_SERVER_TYPE_NONE;
203         gchar *val = NULL;
204         
205         g_return_val_if_fail (self && self->keyfile, 0);
206
207         if (incoming_server) {
208                 val = g_key_file_get_string (self->keyfile, provider_id,
209                                              MODEST_PRESETS_KEY_INCOMING, NULL);
210                 if (!val)
211                         return info;
212                 
213                 g_free (val);
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;
220         } else {
221                 val = g_key_file_get_string (self->keyfile, provider_id,
222                                              MODEST_PRESETS_KEY_OUTGOING, NULL);
223                 if (!val)
224                         return info;
225                 info = MODEST_PRESETS_SERVER_TYPE_SMTP;
226         }
227         g_free (val);
228
229         /* debug: */
230 /*      g_message ("provider id: %s, server type: %d", provider_id, info); */
231         return info;
232 }
233
234
235
236 ModestPresetsSecurity
237 modest_presets_get_info_server_security (ModestPresets *self, const gchar *provider_id,
238                                          gboolean incoming_server)
239 {
240         ModestPresetsSecurity info = MODEST_PRESETS_SECURITY_NONE;
241         gchar *val = NULL;
242         
243         g_return_val_if_fail (self && self->keyfile, MODEST_PRESETS_SECURITY_NONE);
244
245         if (incoming_server) {
246                 val = g_key_file_get_string (self->keyfile, provider_id,
247                                              MODEST_PRESETS_KEY_INCOMING, NULL);
248                 if (val) {
249                         g_free (val);   
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;
254                         g_free(val);
255                         
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;
263                         }
264                         g_free (val);
265                 }
266         } else /* outgoing: */ {
267                 val = g_key_file_get_string (self->keyfile, provider_id,
268                                              MODEST_PRESETS_KEY_OUTGOING, NULL);
269                 if (val) {
270                         g_free (val);
271                         
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;
277                         g_free(val);
278                 }
279         }
280
281         /* debug */
282 /*      g_message ("provider id: %s, apop:%s, secure-incoming:%s, altport: %s, secure-smtp: %s", */
283 /*                 provider_id, */
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"); */
288
289         return info;
290 }
291
292                                                         
293
294         
295 void
296 modest_presets_destroy (ModestPresets *self)
297 {
298         if (!self)
299                 return;
300
301         g_key_file_free (self->keyfile);
302         self->keyfile = NULL;
303         
304         g_free (self);
305 }