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