1 /*
2  * Copyright (C) 2015 Red Hat, Inc. (www.redhat.com)
3  *
4  * This library is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation.
7  *
8  * This library is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
11  * for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this library. If not, see <http://www.gnu.org/licenses/>.
15  *
16  */
17 
18 #include "evolution-data-server-config.h"
19 
20 #include <glib.h>
21 #include <glib/gi18n-lib.h>
22 
23 #include "e-source-credentials-provider.h"
24 #include "e-source-credentials-provider-impl.h"
25 
26 struct _ESourceCredentialsProviderImplPrivate {
27 	gboolean dummy;
28 };
29 
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(ESourceCredentialsProviderImpl,e_source_credentials_provider_impl,E_TYPE_EXTENSION)30 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ESourceCredentialsProviderImpl, e_source_credentials_provider_impl, E_TYPE_EXTENSION)
31 
32 static gboolean
33 source_credentials_provider_impl_lookup_sync (ESourceCredentialsProviderImpl *provider_impl,
34 					      ESource *source,
35 					      GCancellable *cancellable,
36 					      ENamedParameters **out_credentials,
37 					      GError **error)
38 {
39 	g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Credentials lookup is not supported"));
40 
41 	return FALSE;
42 }
43 
44 static gboolean
source_credentials_provider_impl_store_sync(ESourceCredentialsProviderImpl * provider_impl,ESource * source,const ENamedParameters * credentials,gboolean permanently,GCancellable * cancellable,GError ** error)45 source_credentials_provider_impl_store_sync (ESourceCredentialsProviderImpl *provider_impl,
46 					     ESource *source,
47 					     const ENamedParameters *credentials,
48 					     gboolean permanently,
49 					     GCancellable *cancellable,
50 					     GError **error)
51 {
52 	g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Credentials store is not supported"));
53 
54 	return FALSE;
55 }
56 
57 static gboolean
source_credentials_provider_impl_delete_sync(ESourceCredentialsProviderImpl * provider_impl,ESource * source,GCancellable * cancellable,GError ** error)58 source_credentials_provider_impl_delete_sync (ESourceCredentialsProviderImpl *provider_impl,
59 					      ESource *source,
60 					      GCancellable *cancellable,
61 					      GError **error)
62 {
63 	g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Credentials delete is not supported"));
64 
65 	return FALSE;
66 }
67 
68 static void
e_source_credentials_provider_impl_constructed(GObject * object)69 e_source_credentials_provider_impl_constructed (GObject *object)
70 {
71 	ESourceCredentialsProviderImpl *provider_impl = E_SOURCE_CREDENTIALS_PROVIDER_IMPL (object);
72 	ESourceCredentialsProvider *provider;
73 
74 	/* Chain up to parent's method. */
75 	G_OBJECT_CLASS (e_source_credentials_provider_impl_parent_class)->constructed (object);
76 
77 	provider = E_SOURCE_CREDENTIALS_PROVIDER (e_extension_get_extensible (E_EXTENSION (provider_impl)));
78 
79 	e_source_credentials_provider_register_impl (provider, provider_impl);
80 }
81 
82 static void
e_source_credentials_provider_impl_class_init(ESourceCredentialsProviderImplClass * klass)83 e_source_credentials_provider_impl_class_init (ESourceCredentialsProviderImplClass *klass)
84 {
85 	GObjectClass *object_class;
86 	EExtensionClass *extension_class;
87 	ESourceCredentialsProviderImplClass *provider_impl_class;
88 
89 	object_class = G_OBJECT_CLASS (klass);
90 	object_class->constructed = e_source_credentials_provider_impl_constructed;
91 
92 	extension_class = E_EXTENSION_CLASS (klass);
93 	extension_class->extensible_type = E_TYPE_SOURCE_CREDENTIALS_PROVIDER;
94 
95 	provider_impl_class = E_SOURCE_CREDENTIALS_PROVIDER_IMPL_CLASS (klass);
96 	provider_impl_class->lookup_sync = source_credentials_provider_impl_lookup_sync;
97 	provider_impl_class->store_sync = source_credentials_provider_impl_store_sync;
98 	provider_impl_class->delete_sync = source_credentials_provider_impl_delete_sync;
99 }
100 
101 static void
e_source_credentials_provider_impl_init(ESourceCredentialsProviderImpl * provider_impl)102 e_source_credentials_provider_impl_init (ESourceCredentialsProviderImpl *provider_impl)
103 {
104 	provider_impl->priv = e_source_credentials_provider_impl_get_instance_private (provider_impl);
105 }
106 
107 /**
108  * e_source_credentials_provider_impl_get_provider:
109  * @provider_impl: an #ESourceCredentialsProviderImpl
110  *
111  * Returns an #ESourceCredentialsProvider with which the @provider_impl is associated.
112  *
113  * Returns: (transfer none) : an #ESourceCredentialsProvider
114  *
115  * Since: 3.16
116  **/
117 ESourceCredentialsProvider *
e_source_credentials_provider_impl_get_provider(ESourceCredentialsProviderImpl * provider_impl)118 e_source_credentials_provider_impl_get_provider (ESourceCredentialsProviderImpl *provider_impl)
119 {
120 	EExtensible *extensible;
121 
122 	g_return_val_if_fail (E_IS_SOURCE_CREDENTIALS_PROVIDER_IMPL (provider_impl), NULL);
123 
124 	extensible = e_extension_get_extensible (E_EXTENSION (provider_impl));
125 	if (!extensible)
126 		return NULL;
127 
128 	return E_SOURCE_CREDENTIALS_PROVIDER (extensible);
129 }
130 
131 /**
132  * e_source_credentials_provider_impl_can_process:
133  * @provider_impl: an #ESourceCredentialsProviderImpl
134  * @source: an #ESource
135  *
136  * Returns whether the @provider_impl can process credentials for the @source.
137  *
138  * Returns: Whether the @provider_impl can process credentials for the @source.
139  *
140  * Since: 3.16
141  **/
142 gboolean
e_source_credentials_provider_impl_can_process(ESourceCredentialsProviderImpl * provider_impl,ESource * source)143 e_source_credentials_provider_impl_can_process (ESourceCredentialsProviderImpl *provider_impl,
144 						ESource *source)
145 {
146 	ESourceCredentialsProviderImplClass *klass;
147 
148 	g_return_val_if_fail (E_IS_SOURCE_CREDENTIALS_PROVIDER_IMPL (provider_impl), FALSE);
149 	g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
150 
151 	klass = E_SOURCE_CREDENTIALS_PROVIDER_IMPL_GET_CLASS (provider_impl);
152 	g_return_val_if_fail (klass != NULL, FALSE);
153 	g_return_val_if_fail (klass->can_process != NULL, FALSE);
154 
155 	return klass->can_process (provider_impl, source);
156 }
157 
158 /**
159  * e_source_credentials_provider_impl_can_store:
160  * @provider_impl: an #ESourceCredentialsProviderImpl
161  *
162  * Returns whether the @provider_impl can store credentials.
163  *
164  * Returns: Whether the @provider_impl can store credentials.
165  *
166  * Since: 3.16
167  **/
168 gboolean
e_source_credentials_provider_impl_can_store(ESourceCredentialsProviderImpl * provider_impl)169 e_source_credentials_provider_impl_can_store (ESourceCredentialsProviderImpl *provider_impl)
170 {
171 	ESourceCredentialsProviderImplClass *klass;
172 
173 	g_return_val_if_fail (E_IS_SOURCE_CREDENTIALS_PROVIDER_IMPL (provider_impl), FALSE);
174 
175 	klass = E_SOURCE_CREDENTIALS_PROVIDER_IMPL_GET_CLASS (provider_impl);
176 	g_return_val_if_fail (klass != NULL, FALSE);
177 	g_return_val_if_fail (klass->can_store != NULL, FALSE);
178 
179 	return klass->can_store (provider_impl);
180 }
181 
182 /**
183  * e_source_credentials_provider_impl_can_prompt:
184  * @provider_impl: an #ESourceCredentialsProviderImpl
185  *
186  * Returns whether credential prompt can be done for the @provider_impl.
187  *
188  * Returns: Whether credential prompt can be done for the @provider_impl.
189  *
190  * Since: 3.16
191  **/
192 gboolean
e_source_credentials_provider_impl_can_prompt(ESourceCredentialsProviderImpl * provider_impl)193 e_source_credentials_provider_impl_can_prompt (ESourceCredentialsProviderImpl *provider_impl)
194 {
195 	ESourceCredentialsProviderImplClass *klass;
196 
197 	g_return_val_if_fail (E_IS_SOURCE_CREDENTIALS_PROVIDER_IMPL (provider_impl), FALSE);
198 
199 	klass = E_SOURCE_CREDENTIALS_PROVIDER_IMPL_GET_CLASS (provider_impl);
200 	g_return_val_if_fail (klass != NULL, FALSE);
201 	g_return_val_if_fail (klass->can_prompt != NULL, FALSE);
202 
203 	return klass->can_prompt (provider_impl);
204 }
205 
206 /**
207  * e_source_credentials_provider_impl_lookup_sync:
208  * @provider_impl: an #ESourceCredentialsProviderImpl
209  * @source: an #ESource
210  * @cancellable: optional #GCancellable object, or %NULL
211  * @out_credentials: (out): an #ENamedParameters to be set with stored credentials
212  * @error: return location for a #GError, or %NULL
213  *
214  * Asks @provider_impl to lookup for stored credentials for @source.
215  * The @out_credentials is populated with them. If the result is not
216  * %NULL, then it should be freed with e_named_parameters_free() when
217  * no longer needed.
218  *
219  * Default implementation returns %FALSE and sets #G_IO_ERROR_NOT_SUPPORTED error.
220  *
221  * If an error occurs, the function sets @error and returns %FALSE.
222  *
223  * Returns: %TRUE on success, %FALSE on error
224  *
225  * Since: 3.16
226  **/
227 gboolean
e_source_credentials_provider_impl_lookup_sync(ESourceCredentialsProviderImpl * provider_impl,ESource * source,GCancellable * cancellable,ENamedParameters ** out_credentials,GError ** error)228 e_source_credentials_provider_impl_lookup_sync (ESourceCredentialsProviderImpl *provider_impl,
229 						ESource *source,
230 						GCancellable *cancellable,
231 						ENamedParameters **out_credentials,
232 						GError **error)
233 {
234 	ESourceCredentialsProviderImplClass *klass;
235 
236 	g_return_val_if_fail (E_IS_SOURCE_CREDENTIALS_PROVIDER_IMPL (provider_impl), FALSE);
237 	g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
238 	g_return_val_if_fail (out_credentials != NULL, FALSE);
239 
240 	klass = E_SOURCE_CREDENTIALS_PROVIDER_IMPL_GET_CLASS (provider_impl);
241 	g_return_val_if_fail (klass != NULL, FALSE);
242 	g_return_val_if_fail (klass->lookup_sync != NULL, FALSE);
243 
244 	return klass->lookup_sync (provider_impl, source, cancellable, out_credentials, error);
245 }
246 
247 /**
248  * e_source_credentials_provider_impl_store_sync:
249  * @provider_impl: an #ESourceCredentialsProviderImpl
250  * @source: an #ESource
251  * @credentials: an #ENamedParameters containing credentials to store
252  * @permanently: whether to store credentials permanently, or for the current session only
253  * @cancellable: optional #GCancellable object, or %NULL
254  * @error: return location for a #GError, or %NULL
255  *
256  * Asks @provider_impl to store @credentials for @source.
257  *
258  * Default implementation returns %FALSE and sets #G_IO_ERROR_NOT_SUPPORTED error.
259  *
260  * If an error occurs, the function sets @error and returns %FALSE.
261  *
262  * Returns: %TRUE on success, %FALSE on error
263  *
264  * Since: 3.16
265  **/
266 gboolean
e_source_credentials_provider_impl_store_sync(ESourceCredentialsProviderImpl * provider_impl,ESource * source,const ENamedParameters * credentials,gboolean permanently,GCancellable * cancellable,GError ** error)267 e_source_credentials_provider_impl_store_sync (ESourceCredentialsProviderImpl *provider_impl,
268 					       ESource *source,
269 					       const ENamedParameters *credentials,
270 					       gboolean permanently,
271 					       GCancellable *cancellable,
272 					       GError **error)
273 {
274 	ESourceCredentialsProviderImplClass *klass;
275 
276 	g_return_val_if_fail (E_IS_SOURCE_CREDENTIALS_PROVIDER_IMPL (provider_impl), FALSE);
277 	g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
278 	g_return_val_if_fail (credentials != NULL, FALSE);
279 
280 	klass = E_SOURCE_CREDENTIALS_PROVIDER_IMPL_GET_CLASS (provider_impl);
281 	g_return_val_if_fail (klass != NULL, FALSE);
282 	g_return_val_if_fail (klass->store_sync != NULL, FALSE);
283 
284 	return klass->store_sync (provider_impl, source, credentials, permanently, cancellable, error);
285 }
286 
287 /**
288  * e_source_credentials_provider_impl_delete_sync:
289  * @provider_impl: an #ESourceCredentialsProviderImpl
290  * @source: an #ESource
291  * @cancellable: optional #GCancellable object, or %NULL
292  * @error: return location for a #GError, or %NULL
293  *
294  * Asks @provider_impl to delete any stored credentials for @source.
295  *
296  * Default implementation returns %FALSE and sets #G_IO_ERROR_NOT_SUPPORTED error.
297  *
298  * If an error occurs, the function sets @error and returns %FALSE.
299  *
300  * Returns: %TRUE on success, %FALSE on error
301  *
302  * Since: 3.16
303  **/
304 gboolean
e_source_credentials_provider_impl_delete_sync(ESourceCredentialsProviderImpl * provider_impl,ESource * source,GCancellable * cancellable,GError ** error)305 e_source_credentials_provider_impl_delete_sync (ESourceCredentialsProviderImpl *provider_impl,
306 						ESource *source,
307 						GCancellable *cancellable,
308 						GError **error)
309 {
310 	ESourceCredentialsProviderImplClass *klass;
311 
312 	g_return_val_if_fail (E_IS_SOURCE_CREDENTIALS_PROVIDER_IMPL (provider_impl), FALSE);
313 	g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
314 
315 	klass = E_SOURCE_CREDENTIALS_PROVIDER_IMPL_GET_CLASS (provider_impl);
316 	g_return_val_if_fail (klass != NULL, FALSE);
317 	g_return_val_if_fail (klass->delete_sync != NULL, FALSE);
318 
319 	return klass->delete_sync (provider_impl, source, cancellable, error);
320 }
321