* Fixes NB#91382, clear passwords before freeing them
[modest] / src / modest-server-account-settings.c
1 /* Copyright (c) 2007, 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 <modest-protocol-registry.h>
31 #include <modest-server-account-settings.h>
32
33 /* 'private'/'protected' functions */
34 static void   modest_server_account_settings_class_init (ModestServerAccountSettingsClass *klass);
35 static void   modest_server_account_settings_finalize   (GObject *obj);
36 static void   modest_server_account_settings_instance_init (ModestServerAccountSettings *obj);
37
38 typedef struct _ModestServerAccountSettingsPrivate ModestServerAccountSettingsPrivate;
39 struct _ModestServerAccountSettingsPrivate {
40         gchar *hostname;
41         guint port;
42         ModestProtocolType protocol;
43         gchar *username;
44         gchar *password;
45         ModestProtocolType security_protocol;
46         ModestProtocolType auth_protocol;
47         gchar *account_name;
48         gchar *uri;
49 };
50
51 #define MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
52                                                            MODEST_TYPE_SERVER_ACCOUNT_SETTINGS, \
53                                                            ModestServerAccountSettingsPrivate))
54
55 /* globals */
56 static GObjectClass *parent_class = NULL;
57
58 GType
59 modest_server_account_settings_get_type (void)
60 {
61         static GType my_type = 0;
62
63         if (!my_type) {
64                 static const GTypeInfo my_info = {
65                         sizeof(ModestServerAccountSettingsClass),
66                         NULL,   /* base init */
67                         NULL,   /* base finalize */
68                         (GClassInitFunc) modest_server_account_settings_class_init,
69                         NULL,   /* class finalize */
70                         NULL,   /* class data */
71                         sizeof(ModestServerAccountSettings),
72                         0,      /* n_preallocs */
73                         (GInstanceInitFunc) modest_server_account_settings_instance_init,
74                         NULL
75                 };
76
77                 my_type = g_type_register_static (G_TYPE_OBJECT,
78                                                   "ModestServerAccountSettings",
79                                                   &my_info, 0);
80         }
81         return my_type;
82 }
83
84 static void
85 modest_server_account_settings_class_init (ModestServerAccountSettingsClass *klass)
86 {
87         GObjectClass *gobject_class;
88         gobject_class = (GObjectClass *) klass;
89
90         parent_class = g_type_class_peek_parent (klass);
91         gobject_class->finalize = modest_server_account_settings_finalize;
92
93         g_type_class_add_private (gobject_class,
94                                   sizeof(ModestServerAccountSettingsPrivate));
95 }
96
97 static void
98 modest_server_account_settings_instance_init (ModestServerAccountSettings *obj)
99 {
100         ModestServerAccountSettingsPrivate *priv;
101
102         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (obj);
103
104         priv->hostname = NULL;
105         priv->protocol = MODEST_PROTOCOL_REGISTRY_TYPE_INVALID;
106         priv->port = 0;
107         priv->username = NULL;
108         priv->password = NULL;
109         priv->security_protocol = MODEST_PROTOCOLS_CONNECTION_NONE;
110         priv->auth_protocol = MODEST_PROTOCOLS_AUTH_NONE;
111         priv->account_name = NULL;
112         priv->uri = NULL;
113 }
114
115 static void   
116 modest_server_account_settings_finalize   (GObject *obj)
117 {
118         ModestServerAccountSettings *settings = MODEST_SERVER_ACCOUNT_SETTINGS (obj);
119         ModestServerAccountSettingsPrivate *priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
120         g_free (priv->hostname);
121         priv->hostname = NULL;
122         g_free (priv->username);
123         priv->username = NULL;
124
125         if (priv->password) {
126                 bzero (priv->password, strlen (priv->password));
127                 g_free (priv->password);
128         }
129         priv->password = NULL;
130
131         priv->protocol = MODEST_PROTOCOL_REGISTRY_TYPE_INVALID;
132         priv->port = 0;
133         priv->security_protocol = MODEST_PROTOCOL_REGISTRY_TYPE_INVALID;
134         priv->auth_protocol = MODEST_PROTOCOL_REGISTRY_TYPE_INVALID;
135         g_free (priv->account_name);
136         priv->account_name = NULL;
137         g_free (priv->uri);
138         priv->uri = NULL;
139
140         G_OBJECT_CLASS (parent_class)->finalize (obj);
141 }
142
143 ModestServerAccountSettings*
144 modest_server_account_settings_new (void)
145 {
146         return g_object_new (MODEST_TYPE_SERVER_ACCOUNT_SETTINGS, NULL);
147 }
148
149 const gchar* 
150 modest_server_account_settings_get_hostname (ModestServerAccountSettings *settings)
151 {
152         ModestServerAccountSettingsPrivate *priv;
153
154         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), NULL);
155
156         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);   
157         return priv->hostname;
158 }
159
160 void         
161 modest_server_account_settings_set_hostname (ModestServerAccountSettings *settings,
162                                              const gchar *hostname)
163 {
164         ModestServerAccountSettingsPrivate *priv;
165
166         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
167
168         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
169         g_free (priv->hostname);
170         priv->hostname = g_strdup (hostname);
171 }
172
173 const gchar* 
174 modest_server_account_settings_get_uri (ModestServerAccountSettings *settings)
175 {
176         ModestServerAccountSettingsPrivate *priv;
177
178         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), NULL);
179
180         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);   
181         return priv->uri;
182 }
183
184 void         
185 modest_server_account_settings_set_uri (ModestServerAccountSettings *settings,
186                                         const gchar *uri)
187 {
188         ModestServerAccountSettingsPrivate *priv;
189         
190         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
191
192         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
193         g_free (priv->uri);
194         priv->uri = g_strdup (uri);
195
196 }
197
198 const gchar* 
199 modest_server_account_settings_get_username (ModestServerAccountSettings *settings)
200 {
201         ModestServerAccountSettingsPrivate *priv;
202
203         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), NULL);
204
205         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);   
206         return priv->username;
207 }
208
209 void         
210 modest_server_account_settings_set_username (ModestServerAccountSettings *settings,
211                                              const gchar *username)
212 {
213         ModestServerAccountSettingsPrivate *priv;
214
215         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
216
217         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
218         g_free (priv->username);
219         priv->username = g_strdup (username);
220 }
221
222 const gchar* 
223 modest_server_account_settings_get_password (ModestServerAccountSettings *settings)
224 {
225         ModestServerAccountSettingsPrivate *priv;
226
227         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), NULL);
228
229         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);   
230         return priv->password;
231 }
232
233 void         
234 modest_server_account_settings_set_password (ModestServerAccountSettings *settings,
235                                              const gchar *password)
236 {
237         ModestServerAccountSettingsPrivate *priv;
238
239         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
240
241         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
242         if (priv->password) {
243                 bzero (priv->password, strlen (priv->password));
244                 g_free (priv->password);
245         }
246         priv->password = g_strdup (password);
247 }
248
249 const gchar* 
250 modest_server_account_settings_get_account_name (ModestServerAccountSettings *settings)
251 {
252         ModestServerAccountSettingsPrivate *priv;
253
254         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), NULL);
255
256         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);   
257         return priv->account_name;
258 }
259
260 void         
261 modest_server_account_settings_set_account_name (ModestServerAccountSettings *settings,
262                                                  const gchar *account_name)
263 {
264         ModestServerAccountSettingsPrivate *priv;
265
266         /* be careful. This method should only be used internally in #ModestAccountMgr and
267          * #ModestAccountSettings. */
268
269         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
270
271         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
272         g_free (priv->account_name);
273         priv->account_name = g_strdup (account_name);
274 }
275
276 ModestProtocolType
277 modest_server_account_settings_get_protocol (ModestServerAccountSettings *settings)
278 {
279         ModestServerAccountSettingsPrivate *priv;
280
281         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), MODEST_PROTOCOL_REGISTRY_TYPE_INVALID);
282
283         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
284         return priv->protocol;
285 }
286
287 void                          
288 modest_server_account_settings_set_protocol (ModestServerAccountSettings *settings,
289                                              ModestProtocolType protocol)
290 {
291         ModestServerAccountSettingsPrivate *priv;
292
293         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
294
295         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
296         priv->protocol = protocol;
297         
298 }
299
300 guint  
301 modest_server_account_settings_get_port (ModestServerAccountSettings *settings)
302 {
303         ModestServerAccountSettingsPrivate *priv;
304
305         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), 0);
306
307         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
308         return priv->port;
309 }
310
311 void   
312 modest_server_account_settings_set_port (ModestServerAccountSettings *settings,
313                                          guint port)
314 {
315         ModestServerAccountSettingsPrivate *priv;
316
317         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
318
319         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
320         priv->port = port;
321 }
322
323 ModestProtocolType
324 modest_server_account_settings_get_security_protocol (ModestServerAccountSettings *settings)
325 {
326         ModestServerAccountSettingsPrivate *priv;
327
328         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), MODEST_PROTOCOL_REGISTRY_TYPE_INVALID);
329
330         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
331         return priv->security_protocol;
332 }
333
334 void   
335 modest_server_account_settings_set_security_protocol (ModestServerAccountSettings *settings,
336                                                       ModestProtocolType security_protocol)
337 {
338         ModestServerAccountSettingsPrivate *priv;
339
340         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
341
342         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
343         priv->security_protocol = security_protocol;
344 }
345
346 ModestProtocolType
347 modest_server_account_settings_get_auth_protocol (ModestServerAccountSettings *settings)
348 {
349         ModestServerAccountSettingsPrivate *priv;
350
351         g_return_val_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings), MODEST_PROTOCOL_REGISTRY_TYPE_INVALID);
352
353         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
354         return priv->auth_protocol;
355 }
356
357 void   
358 modest_server_account_settings_set_auth_protocol (ModestServerAccountSettings *settings,
359                                                   ModestProtocolType auth_protocol)
360 {
361         ModestServerAccountSettingsPrivate *priv;
362
363         g_return_if_fail (MODEST_IS_SERVER_ACCOUNT_SETTINGS (settings));
364
365         priv = MODEST_SERVER_ACCOUNT_SETTINGS_GET_PRIVATE (settings);
366         priv->auth_protocol = auth_protocol;
367 }
368