1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3 * SPDX-FileCopyrightText: (C) 2020 Red Hat (www.redhat.com)
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
7 #include "evolution-ews-config.h"
8
9 #include <libebackend/libebackend.h>
10 #include <libedataserver/libedataserver.h>
11
12 #include "camel-m365-settings.h"
13
14 struct _CamelM365SettingsPrivate {
15 GMutex property_lock;
16 gboolean use_impersonation;
17 gboolean check_all;
18 gboolean filter_junk;
19 gboolean filter_junk_inbox;
20 gboolean override_oauth2;
21 guint timeout;
22 guint concurrent_connections;
23 gchar *impersonate_user;
24 gchar *email;
25 gchar *oauth2_tenant;
26 gchar *oauth2_client_id;
27 gchar *oauth2_redirect_uri;
28 gchar *oauth2_endpoint_host;
29 };
30
31 enum {
32 PROP_0,
33 PROP_AUTH_MECHANISM,
34 PROP_CHECK_ALL,
35 PROP_EMAIL,
36 PROP_FILTER_JUNK,
37 PROP_FILTER_JUNK_INBOX,
38 PROP_HOST,
39 PROP_PORT,
40 PROP_SECURITY_METHOD,
41 PROP_TIMEOUT,
42 PROP_USER,
43 PROP_USE_IMPERSONATION,
44 PROP_IMPERSONATE_USER,
45 PROP_OVERRIDE_OAUTH2,
46 PROP_OAUTH2_TENANT,
47 PROP_OAUTH2_CLIENT_ID,
48 PROP_OAUTH2_REDIRECT_URI,
49 PROP_OAUTH2_ENDPOINT_HOST,
50 PROP_CONCURRENT_CONNECTIONS
51 };
52
G_DEFINE_TYPE_WITH_CODE(CamelM365Settings,camel_m365_settings,CAMEL_TYPE_OFFLINE_SETTINGS,G_IMPLEMENT_INTERFACE (CAMEL_TYPE_NETWORK_SETTINGS,NULL)G_ADD_PRIVATE (CamelM365Settings))53 G_DEFINE_TYPE_WITH_CODE (CamelM365Settings, camel_m365_settings, CAMEL_TYPE_OFFLINE_SETTINGS,
54 G_IMPLEMENT_INTERFACE (CAMEL_TYPE_NETWORK_SETTINGS, NULL)
55 G_ADD_PRIVATE (CamelM365Settings))
56
57 static void
58 m365_settings_set_property (GObject *object,
59 guint property_id,
60 const GValue *value,
61 GParamSpec *pspec)
62 {
63 switch (property_id) {
64 case PROP_AUTH_MECHANISM:
65 camel_network_settings_set_auth_mechanism (
66 CAMEL_NETWORK_SETTINGS (object),
67 g_value_get_string (value));
68 return;
69
70 case PROP_CHECK_ALL:
71 camel_m365_settings_set_check_all (
72 CAMEL_M365_SETTINGS (object),
73 g_value_get_boolean (value));
74 return;
75
76 case PROP_EMAIL:
77 camel_m365_settings_set_email (
78 CAMEL_M365_SETTINGS (object),
79 g_value_get_string (value));
80 return;
81
82 case PROP_FILTER_JUNK:
83 camel_m365_settings_set_filter_junk (
84 CAMEL_M365_SETTINGS (object),
85 g_value_get_boolean (value));
86 return;
87
88 case PROP_FILTER_JUNK_INBOX:
89 camel_m365_settings_set_filter_junk_inbox (
90 CAMEL_M365_SETTINGS (object),
91 g_value_get_boolean (value));
92 return;
93
94 case PROP_HOST:
95 camel_network_settings_set_host (
96 CAMEL_NETWORK_SETTINGS (object),
97 g_value_get_string (value));
98 return;
99
100 case PROP_PORT:
101 camel_network_settings_set_port (
102 CAMEL_NETWORK_SETTINGS (object),
103 g_value_get_uint (value));
104 return;
105
106 case PROP_SECURITY_METHOD:
107 camel_network_settings_set_security_method (
108 CAMEL_NETWORK_SETTINGS (object),
109 g_value_get_enum (value));
110 return;
111
112 case PROP_TIMEOUT:
113 camel_m365_settings_set_timeout (
114 CAMEL_M365_SETTINGS (object),
115 g_value_get_uint (value));
116 return;
117
118 case PROP_USER:
119 camel_network_settings_set_user (
120 CAMEL_NETWORK_SETTINGS (object),
121 g_value_get_string (value));
122 return;
123
124 case PROP_USE_IMPERSONATION:
125 camel_m365_settings_set_use_impersonation (
126 CAMEL_M365_SETTINGS (object),
127 g_value_get_boolean (value));
128 return;
129
130 case PROP_IMPERSONATE_USER:
131 camel_m365_settings_set_impersonate_user (
132 CAMEL_M365_SETTINGS (object),
133 g_value_get_string (value));
134 return;
135
136 case PROP_OVERRIDE_OAUTH2:
137 camel_m365_settings_set_override_oauth2 (
138 CAMEL_M365_SETTINGS (object),
139 g_value_get_boolean (value));
140 return;
141
142 case PROP_OAUTH2_TENANT:
143 camel_m365_settings_set_oauth2_tenant (
144 CAMEL_M365_SETTINGS (object),
145 g_value_get_string (value));
146 return;
147
148 case PROP_OAUTH2_CLIENT_ID:
149 camel_m365_settings_set_oauth2_client_id (
150 CAMEL_M365_SETTINGS (object),
151 g_value_get_string (value));
152 return;
153
154 case PROP_OAUTH2_REDIRECT_URI:
155 camel_m365_settings_set_oauth2_redirect_uri (
156 CAMEL_M365_SETTINGS (object),
157 g_value_get_string (value));
158 return;
159
160 case PROP_OAUTH2_ENDPOINT_HOST:
161 camel_m365_settings_set_oauth2_endpoint_host (
162 CAMEL_M365_SETTINGS (object),
163 g_value_get_string (value));
164 return;
165
166 case PROP_CONCURRENT_CONNECTIONS:
167 camel_m365_settings_set_concurrent_connections (
168 CAMEL_M365_SETTINGS (object),
169 g_value_get_uint (value));
170 return;
171 }
172
173 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
174 }
175
176 static void
m365_settings_get_property(GObject * object,guint property_id,GValue * value,GParamSpec * pspec)177 m365_settings_get_property (GObject *object,
178 guint property_id,
179 GValue *value,
180 GParamSpec *pspec)
181 {
182 switch (property_id) {
183 case PROP_AUTH_MECHANISM:
184 g_value_take_string (
185 value,
186 camel_network_settings_dup_auth_mechanism (
187 CAMEL_NETWORK_SETTINGS (object)));
188 return;
189
190 case PROP_CHECK_ALL:
191 g_value_set_boolean (
192 value,
193 camel_m365_settings_get_check_all (
194 CAMEL_M365_SETTINGS (object)));
195 return;
196
197 case PROP_EMAIL:
198 g_value_take_string (
199 value,
200 camel_m365_settings_dup_email (
201 CAMEL_M365_SETTINGS (object)));
202 return;
203
204 case PROP_FILTER_JUNK:
205 g_value_set_boolean (
206 value,
207 camel_m365_settings_get_filter_junk (
208 CAMEL_M365_SETTINGS (object)));
209 return;
210
211 case PROP_FILTER_JUNK_INBOX:
212 g_value_set_boolean (
213 value,
214 camel_m365_settings_get_filter_junk_inbox (
215 CAMEL_M365_SETTINGS (object)));
216 return;
217
218 case PROP_HOST:
219 g_value_take_string (
220 value,
221 camel_network_settings_dup_host (
222 CAMEL_NETWORK_SETTINGS (object)));
223 return;
224
225 case PROP_PORT:
226 g_value_set_uint (
227 value,
228 camel_network_settings_get_port (
229 CAMEL_NETWORK_SETTINGS (object)));
230 return;
231
232 case PROP_SECURITY_METHOD:
233 g_value_set_enum (
234 value,
235 camel_network_settings_get_security_method (
236 CAMEL_NETWORK_SETTINGS (object)));
237 return;
238
239 case PROP_TIMEOUT:
240 g_value_set_uint (
241 value,
242 camel_m365_settings_get_timeout (
243 CAMEL_M365_SETTINGS (object)));
244 return;
245
246 case PROP_USER:
247 g_value_take_string (
248 value,
249 camel_network_settings_dup_user (
250 CAMEL_NETWORK_SETTINGS (object)));
251 return;
252
253 case PROP_USE_IMPERSONATION:
254 g_value_set_boolean (
255 value,
256 camel_m365_settings_get_use_impersonation (
257 CAMEL_M365_SETTINGS (object)));
258 return;
259
260 case PROP_IMPERSONATE_USER:
261 g_value_take_string (
262 value,
263 camel_m365_settings_dup_impersonate_user (
264 CAMEL_M365_SETTINGS (object)));
265 return;
266
267 case PROP_OVERRIDE_OAUTH2:
268 g_value_set_boolean (
269 value,
270 camel_m365_settings_get_override_oauth2 (
271 CAMEL_M365_SETTINGS (object)));
272 return;
273
274 case PROP_OAUTH2_TENANT:
275 g_value_take_string (
276 value,
277 camel_m365_settings_dup_oauth2_tenant (
278 CAMEL_M365_SETTINGS (object)));
279 return;
280
281 case PROP_OAUTH2_CLIENT_ID:
282 g_value_take_string (
283 value,
284 camel_m365_settings_dup_oauth2_client_id (
285 CAMEL_M365_SETTINGS (object)));
286 return;
287
288 case PROP_OAUTH2_REDIRECT_URI:
289 g_value_take_string (
290 value,
291 camel_m365_settings_dup_oauth2_redirect_uri (
292 CAMEL_M365_SETTINGS (object)));
293 return;
294
295 case PROP_OAUTH2_ENDPOINT_HOST:
296 g_value_take_string (
297 value,
298 camel_m365_settings_dup_oauth2_endpoint_host (
299 CAMEL_M365_SETTINGS (object)));
300 return;
301
302 case PROP_CONCURRENT_CONNECTIONS:
303 g_value_set_uint (
304 value,
305 camel_m365_settings_get_concurrent_connections (
306 CAMEL_M365_SETTINGS (object)));
307 return;
308 }
309
310 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
311 }
312
313 static void
m365_settings_finalize(GObject * object)314 m365_settings_finalize (GObject *object)
315 {
316 CamelM365Settings *m365_settings = CAMEL_M365_SETTINGS (object);
317
318 g_mutex_clear (&m365_settings->priv->property_lock);
319
320 g_free (m365_settings->priv->email);
321 g_free (m365_settings->priv->oauth2_tenant);
322 g_free (m365_settings->priv->oauth2_client_id);
323 g_free (m365_settings->priv->oauth2_redirect_uri);
324 g_free (m365_settings->priv->oauth2_endpoint_host);
325
326 /* Chain up to parent's method. */
327 G_OBJECT_CLASS (camel_m365_settings_parent_class)->finalize (object);
328 }
329
330 static void
camel_m365_settings_class_init(CamelM365SettingsClass * class)331 camel_m365_settings_class_init (CamelM365SettingsClass *class)
332 {
333 GObjectClass *object_class;
334
335 object_class = G_OBJECT_CLASS (class);
336 object_class->set_property = m365_settings_set_property;
337 object_class->get_property = m365_settings_get_property;
338 object_class->finalize = m365_settings_finalize;
339
340 /* Inherited from CamelNetworkSettings. */
341 g_object_class_override_property (
342 object_class,
343 PROP_AUTH_MECHANISM,
344 "auth-mechanism");
345
346 g_object_class_install_property (
347 object_class,
348 PROP_CHECK_ALL,
349 g_param_spec_boolean (
350 "check-all",
351 "Check All",
352 "Check all folders for new messages",
353 FALSE,
354 G_PARAM_READWRITE |
355 G_PARAM_CONSTRUCT |
356 G_PARAM_STATIC_STRINGS));
357
358 g_object_class_install_property (
359 object_class,
360 PROP_EMAIL,
361 g_param_spec_string (
362 "email",
363 "Email",
364 "Email",
365 NULL,
366 G_PARAM_READWRITE |
367 G_PARAM_CONSTRUCT |
368 G_PARAM_STATIC_STRINGS));
369
370 g_object_class_install_property (
371 object_class,
372 PROP_FILTER_JUNK,
373 g_param_spec_boolean (
374 "filter-junk",
375 "Filter Junk",
376 "Whether to filter junk from all folders",
377 FALSE,
378 G_PARAM_READWRITE |
379 G_PARAM_CONSTRUCT |
380 G_PARAM_STATIC_STRINGS));
381
382 g_object_class_install_property (
383 object_class,
384 PROP_FILTER_JUNK_INBOX,
385 g_param_spec_boolean (
386 "filter-junk-inbox",
387 "Filter Junk Inbox",
388 "Whether to filter junk from Inbox only",
389 FALSE,
390 G_PARAM_READWRITE |
391 G_PARAM_CONSTRUCT |
392 G_PARAM_STATIC_STRINGS));
393
394 /* Inherited from CamelNetworkSettings. */
395 g_object_class_override_property (
396 object_class,
397 PROP_HOST,
398 "host");
399
400 /* Inherited from CamelNetworkSettings. */
401 g_object_class_override_property (
402 object_class,
403 PROP_PORT,
404 "port");
405
406 g_object_class_install_property (
407 object_class,
408 PROP_TIMEOUT,
409 g_param_spec_uint (
410 "timeout",
411 "timeout",
412 "Connection timeout in seconds",
413 0, G_MAXUINT, 120,
414 G_PARAM_READWRITE |
415 G_PARAM_CONSTRUCT |
416 G_PARAM_STATIC_STRINGS));
417
418 /* Inherited from CamelNetworkSettings. */
419 g_object_class_override_property (
420 object_class,
421 PROP_SECURITY_METHOD,
422 "security-method");
423
424 /* Inherited from CamelNetworkSettings. */
425 g_object_class_override_property (
426 object_class,
427 PROP_USER,
428 "user");
429
430 g_object_class_install_property (
431 object_class,
432 PROP_USE_IMPERSONATION,
433 g_param_spec_boolean (
434 "use-impersonation",
435 "Use Impersonation",
436 "Use Impersonation",
437 FALSE,
438 G_PARAM_READWRITE |
439 G_PARAM_CONSTRUCT |
440 G_PARAM_STATIC_STRINGS));
441
442 g_object_class_install_property (
443 object_class,
444 PROP_IMPERSONATE_USER,
445 g_param_spec_string (
446 "impersonate-user",
447 "Impersonate User",
448 "Impersonate User",
449 NULL,
450 G_PARAM_READWRITE |
451 G_PARAM_CONSTRUCT |
452 G_PARAM_STATIC_STRINGS));
453
454 g_object_class_install_property (
455 object_class,
456 PROP_OVERRIDE_OAUTH2,
457 g_param_spec_boolean (
458 "override-oauth2",
459 "Override OAuth2",
460 "Whether to override OAuth2 values",
461 FALSE,
462 G_PARAM_READWRITE |
463 G_PARAM_CONSTRUCT |
464 G_PARAM_STATIC_STRINGS));
465
466 g_object_class_install_property (
467 object_class,
468 PROP_OAUTH2_TENANT,
469 g_param_spec_string (
470 "oauth2-tenant",
471 "OAuth2 Tenant",
472 "OAuth2 Tenant to use, only if override-oauth2 is TRUE, otherwise the compile-time value is used",
473 MICROSOFT365_TENANT,
474 G_PARAM_READWRITE |
475 G_PARAM_CONSTRUCT |
476 G_PARAM_STATIC_STRINGS));
477
478 g_object_class_install_property (
479 object_class,
480 PROP_OAUTH2_CLIENT_ID,
481 g_param_spec_string (
482 "oauth2-client-id",
483 "OAuth2 Client ID",
484 "OAuth2 Client-ID to use, only if override-oauth2 is TRUE, otherwise the compile-time value is used",
485 MICROSOFT365_CLIENT_ID,
486 G_PARAM_READWRITE |
487 G_PARAM_CONSTRUCT |
488 G_PARAM_STATIC_STRINGS));
489
490 g_object_class_install_property (
491 object_class,
492 PROP_OAUTH2_REDIRECT_URI,
493 g_param_spec_string (
494 "oauth2-redirect-uri",
495 "OAuth2 Redirect URI",
496 "OAuth2 Redirect URI to use, only if override-oauth2 is TRUE, otherwise the compile-time value is used",
497 MICROSOFT365_REDIRECT_URI,
498 G_PARAM_READWRITE |
499 G_PARAM_CONSTRUCT |
500 G_PARAM_STATIC_STRINGS));
501
502 g_object_class_install_property (
503 object_class,
504 PROP_OAUTH2_ENDPOINT_HOST,
505 g_param_spec_string (
506 "oauth2-endpoint-host",
507 "OAuth2 Endpoint Host",
508 "OAuth2 endpoint host to use, only if override-oauth2 is TRUE, otherwise the compile-time value is used",
509 MICROSOFT365_ENDPOINT_HOST,
510 G_PARAM_READWRITE |
511 G_PARAM_CONSTRUCT |
512 G_PARAM_STATIC_STRINGS));
513
514 g_object_class_install_property (
515 object_class,
516 PROP_CONCURRENT_CONNECTIONS,
517 g_param_spec_uint (
518 "concurrent-connections",
519 "Concurrent Connections",
520 "Number of concurrent connections to use",
521 MIN_CONCURRENT_CONNECTIONS,
522 MAX_CONCURRENT_CONNECTIONS,
523 1,
524 G_PARAM_READWRITE |
525 G_PARAM_CONSTRUCT |
526 G_PARAM_EXPLICIT_NOTIFY |
527 G_PARAM_STATIC_STRINGS));
528 }
529
530 static void
camel_m365_settings_init(CamelM365Settings * settings)531 camel_m365_settings_init (CamelM365Settings *settings)
532 {
533 settings->priv = camel_m365_settings_get_instance_private (settings);
534
535 g_mutex_init (&settings->priv->property_lock);
536 }
537
538 /* transfer none. Checks the settings from the ESource extension related to backend. */
539 CamelM365Settings *
camel_m365_settings_get_from_backend(struct _EBackend * backend,struct _ESourceRegistry * registry)540 camel_m365_settings_get_from_backend (struct _EBackend *backend,
541 struct _ESourceRegistry *registry)
542 {
543 ESource *source;
544 ESource *collection;
545 ESourceCamel *extension;
546 CamelSettings *settings;
547 const gchar *extension_name;
548
549 g_return_val_if_fail (E_IS_BACKEND (backend), NULL);
550 if (registry)
551 g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
552
553 source = e_backend_get_source (backend);
554 extension_name = e_source_camel_get_extension_name ("microsoft365");
555 e_source_camel_generate_subtype ("microsoft365", CAMEL_TYPE_M365_SETTINGS);
556
557 if (registry) {
558 /* It's either in the 'source' or in the collection parent. */
559 collection = e_source_registry_find_extension (registry, source, extension_name);
560
561 g_return_val_if_fail (collection != NULL, NULL);
562 } else {
563 collection = g_object_ref (source);
564 }
565
566 extension = e_source_get_extension (collection, extension_name);
567 settings = e_source_camel_get_settings (extension);
568
569 g_object_unref (collection);
570
571 return CAMEL_M365_SETTINGS (settings);
572 }
573
574 void
camel_m365_settings_lock(CamelM365Settings * settings)575 camel_m365_settings_lock (CamelM365Settings *settings)
576 {
577 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
578
579 g_mutex_lock (&settings->priv->property_lock);
580 }
581
582 void
camel_m365_settings_unlock(CamelM365Settings * settings)583 camel_m365_settings_unlock (CamelM365Settings *settings)
584 {
585 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
586
587 g_mutex_unlock (&settings->priv->property_lock);
588 }
589
590 gboolean
camel_m365_settings_get_use_impersonation(CamelM365Settings * settings)591 camel_m365_settings_get_use_impersonation (CamelM365Settings *settings)
592 {
593 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), FALSE);
594
595 return settings->priv->use_impersonation;
596 }
597
598 void
camel_m365_settings_set_use_impersonation(CamelM365Settings * settings,gboolean use_impersonation)599 camel_m365_settings_set_use_impersonation (CamelM365Settings *settings,
600 gboolean use_impersonation)
601 {
602 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
603
604 if ((settings->priv->use_impersonation ? 1 : 0) == (use_impersonation ? 1 : 0))
605 return;
606
607 settings->priv->use_impersonation = use_impersonation;
608
609 g_object_notify (G_OBJECT (settings), "use-impersonation");
610 }
611
612 const gchar *
camel_m365_settings_get_impersonate_user(CamelM365Settings * settings)613 camel_m365_settings_get_impersonate_user (CamelM365Settings *settings)
614 {
615 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
616
617 return settings->priv->impersonate_user;
618 }
619
620 gchar *
camel_m365_settings_dup_impersonate_user(CamelM365Settings * settings)621 camel_m365_settings_dup_impersonate_user (CamelM365Settings *settings)
622 {
623 const gchar *protected;
624 gchar *duplicate;
625
626 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
627
628 camel_m365_settings_lock (settings);
629
630 protected = camel_m365_settings_get_impersonate_user (settings);
631 duplicate = g_strdup (protected);
632
633 camel_m365_settings_unlock (settings);
634
635 return duplicate;
636 }
637
638 void
camel_m365_settings_set_impersonate_user(CamelM365Settings * settings,const gchar * impersonate_user)639 camel_m365_settings_set_impersonate_user (CamelM365Settings *settings,
640 const gchar *impersonate_user)
641 {
642 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
643
644 camel_m365_settings_lock (settings);
645
646 if (g_strcmp0 (settings->priv->impersonate_user, impersonate_user) == 0) {
647 camel_m365_settings_unlock (settings);
648 return;
649 }
650
651 g_free (settings->priv->impersonate_user);
652 settings->priv->impersonate_user = e_util_strdup_strip (impersonate_user);
653
654 camel_m365_settings_unlock (settings);
655
656 g_object_notify (G_OBJECT (settings), "impersonate-user");
657 }
658
659 gboolean
camel_m365_settings_get_check_all(CamelM365Settings * settings)660 camel_m365_settings_get_check_all (CamelM365Settings *settings)
661 {
662 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), FALSE);
663
664 return settings->priv->check_all;
665 }
666
667 void
camel_m365_settings_set_check_all(CamelM365Settings * settings,gboolean check_all)668 camel_m365_settings_set_check_all (CamelM365Settings *settings,
669 gboolean check_all)
670 {
671 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
672
673 if ((settings->priv->check_all ? 1 : 0) == (check_all ? 1 : 0))
674 return;
675
676 settings->priv->check_all = check_all;
677
678 g_object_notify (G_OBJECT (settings), "check-all");
679 }
680
681 const gchar *
camel_m365_settings_get_email(CamelM365Settings * settings)682 camel_m365_settings_get_email (CamelM365Settings *settings)
683 {
684 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
685
686 return settings->priv->email;
687 }
688
689 gchar *
camel_m365_settings_dup_email(CamelM365Settings * settings)690 camel_m365_settings_dup_email (CamelM365Settings *settings)
691 {
692 const gchar *protected;
693 gchar *duplicate;
694
695 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
696
697 camel_m365_settings_lock (settings);
698
699 protected = camel_m365_settings_get_email (settings);
700 duplicate = g_strdup (protected);
701
702 camel_m365_settings_unlock (settings);
703
704 return duplicate;
705 }
706
707 void
camel_m365_settings_set_email(CamelM365Settings * settings,const gchar * email)708 camel_m365_settings_set_email (CamelM365Settings *settings,
709 const gchar *email)
710 {
711 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
712
713 camel_m365_settings_lock (settings);
714
715 if (g_strcmp0 (settings->priv->email, email) == 0) {
716 camel_m365_settings_unlock (settings);
717 return;
718 }
719
720 g_free (settings->priv->email);
721 settings->priv->email = e_util_strdup_strip (email);
722
723 camel_m365_settings_unlock (settings);
724
725 g_object_notify (G_OBJECT (settings), "email");
726 }
727
728 gboolean
camel_m365_settings_get_filter_junk(CamelM365Settings * settings)729 camel_m365_settings_get_filter_junk (CamelM365Settings *settings)
730 {
731 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), FALSE);
732
733 return settings->priv->filter_junk;
734 }
735
736 void
camel_m365_settings_set_filter_junk(CamelM365Settings * settings,gboolean filter_junk)737 camel_m365_settings_set_filter_junk (CamelM365Settings *settings,
738 gboolean filter_junk)
739 {
740 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
741
742 if ((settings->priv->filter_junk ? 1 : 0) == (filter_junk ? 1 : 0))
743 return;
744
745 settings->priv->filter_junk = filter_junk;
746
747 g_object_notify (G_OBJECT (settings), "filter-junk");
748 }
749
750 gboolean
camel_m365_settings_get_filter_junk_inbox(CamelM365Settings * settings)751 camel_m365_settings_get_filter_junk_inbox (CamelM365Settings *settings)
752 {
753 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), FALSE);
754
755 return settings->priv->filter_junk_inbox;
756 }
757
758 void
camel_m365_settings_set_filter_junk_inbox(CamelM365Settings * settings,gboolean filter_junk_inbox)759 camel_m365_settings_set_filter_junk_inbox (CamelM365Settings *settings,
760 gboolean filter_junk_inbox)
761 {
762 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
763
764 if ((settings->priv->filter_junk_inbox ? 1 : 0) == (filter_junk_inbox ? 1 : 0))
765 return;
766
767 settings->priv->filter_junk_inbox = filter_junk_inbox;
768
769 g_object_notify (G_OBJECT (settings), "filter-junk-inbox");
770 }
771
772 guint
camel_m365_settings_get_timeout(CamelM365Settings * settings)773 camel_m365_settings_get_timeout (CamelM365Settings *settings)
774 {
775 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), 0);
776
777 return settings->priv->timeout;
778 }
779
780 void
camel_m365_settings_set_timeout(CamelM365Settings * settings,guint timeout)781 camel_m365_settings_set_timeout (CamelM365Settings *settings,
782 guint timeout)
783 {
784 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
785
786 if (settings->priv->timeout == timeout)
787 return;
788
789 settings->priv->timeout = timeout;
790
791 g_object_notify (G_OBJECT (settings), "timeout");
792 }
793
794 gboolean
camel_m365_settings_get_override_oauth2(CamelM365Settings * settings)795 camel_m365_settings_get_override_oauth2 (CamelM365Settings *settings)
796 {
797 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), FALSE);
798
799 return settings->priv->override_oauth2;
800 }
801
802 void
camel_m365_settings_set_override_oauth2(CamelM365Settings * settings,gboolean override_oauth2)803 camel_m365_settings_set_override_oauth2 (CamelM365Settings *settings,
804 gboolean override_oauth2)
805 {
806 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
807
808 if ((settings->priv->override_oauth2 ? 1 : 0) == (override_oauth2 ? 1 : 0))
809 return;
810
811 settings->priv->override_oauth2 = override_oauth2;
812
813 g_object_notify (G_OBJECT (settings), "override-oauth2");
814 }
815
816 const gchar *
camel_m365_settings_get_oauth2_tenant(CamelM365Settings * settings)817 camel_m365_settings_get_oauth2_tenant (CamelM365Settings *settings)
818 {
819 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
820
821 return settings->priv->oauth2_tenant;
822 }
823
824 gchar *
camel_m365_settings_dup_oauth2_tenant(CamelM365Settings * settings)825 camel_m365_settings_dup_oauth2_tenant (CamelM365Settings *settings)
826 {
827 const gchar *protected;
828 gchar *duplicate;
829
830 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
831
832 camel_m365_settings_lock (settings);
833
834 protected = camel_m365_settings_get_oauth2_tenant (settings);
835 duplicate = g_strdup (protected);
836
837 camel_m365_settings_unlock (settings);
838
839 return duplicate;
840 }
841
842 void
camel_m365_settings_set_oauth2_tenant(CamelM365Settings * settings,const gchar * tenant)843 camel_m365_settings_set_oauth2_tenant (CamelM365Settings *settings,
844 const gchar *tenant)
845 {
846 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
847
848 camel_m365_settings_lock (settings);
849
850 if (g_strcmp0 (settings->priv->oauth2_tenant, tenant) == 0) {
851 camel_m365_settings_unlock (settings);
852 return;
853 }
854
855 g_free (settings->priv->oauth2_tenant);
856 settings->priv->oauth2_tenant = e_util_strdup_strip (tenant);
857
858 camel_m365_settings_unlock (settings);
859
860 g_object_notify (G_OBJECT (settings), "oauth2-tenant");
861 }
862
863 const gchar *
camel_m365_settings_get_oauth2_client_id(CamelM365Settings * settings)864 camel_m365_settings_get_oauth2_client_id (CamelM365Settings *settings)
865 {
866 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
867
868 return settings->priv->oauth2_client_id;
869 }
870
871 gchar *
camel_m365_settings_dup_oauth2_client_id(CamelM365Settings * settings)872 camel_m365_settings_dup_oauth2_client_id (CamelM365Settings *settings)
873 {
874 const gchar *protected;
875 gchar *duplicate;
876
877 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
878
879 camel_m365_settings_lock (settings);
880
881 protected = camel_m365_settings_get_oauth2_client_id (settings);
882 duplicate = g_strdup (protected);
883
884 camel_m365_settings_unlock (settings);
885
886 return duplicate;
887 }
888
889 void
camel_m365_settings_set_oauth2_client_id(CamelM365Settings * settings,const gchar * client_id)890 camel_m365_settings_set_oauth2_client_id (CamelM365Settings *settings,
891 const gchar *client_id)
892 {
893 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
894
895 camel_m365_settings_lock (settings);
896
897 if (g_strcmp0 (settings->priv->oauth2_client_id, client_id) == 0) {
898 camel_m365_settings_unlock (settings);
899 return;
900 }
901
902 g_free (settings->priv->oauth2_client_id);
903 settings->priv->oauth2_client_id = e_util_strdup_strip (client_id);
904
905 camel_m365_settings_unlock (settings);
906
907 g_object_notify (G_OBJECT (settings), "oauth2-client-id");
908 }
909
910 const gchar *
camel_m365_settings_get_oauth2_redirect_uri(CamelM365Settings * settings)911 camel_m365_settings_get_oauth2_redirect_uri (CamelM365Settings *settings)
912 {
913 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
914
915 return settings->priv->oauth2_redirect_uri;
916 }
917
918 gchar *
camel_m365_settings_dup_oauth2_redirect_uri(CamelM365Settings * settings)919 camel_m365_settings_dup_oauth2_redirect_uri (CamelM365Settings *settings)
920 {
921 const gchar *protected;
922 gchar *duplicate;
923
924 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
925
926 camel_m365_settings_lock (settings);
927
928 protected = camel_m365_settings_get_oauth2_redirect_uri (settings);
929 duplicate = g_strdup (protected);
930
931 camel_m365_settings_unlock (settings);
932
933 return duplicate;
934 }
935
936 void
camel_m365_settings_set_oauth2_redirect_uri(CamelM365Settings * settings,const gchar * redirect_uri)937 camel_m365_settings_set_oauth2_redirect_uri (CamelM365Settings *settings,
938 const gchar *redirect_uri)
939 {
940 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
941
942 camel_m365_settings_lock (settings);
943
944 if (g_strcmp0 (settings->priv->oauth2_redirect_uri, redirect_uri) == 0) {
945 camel_m365_settings_unlock (settings);
946 return;
947 }
948
949 g_free (settings->priv->oauth2_redirect_uri);
950 settings->priv->oauth2_redirect_uri = e_util_strdup_strip (redirect_uri);
951
952 camel_m365_settings_unlock (settings);
953
954 g_object_notify (G_OBJECT (settings), "oauth2-redirect-uri");
955 }
956
957 const gchar *
camel_m365_settings_get_oauth2_endpoint_host(CamelM365Settings * settings)958 camel_m365_settings_get_oauth2_endpoint_host (CamelM365Settings *settings)
959 {
960 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
961
962 return settings->priv->oauth2_endpoint_host;
963 }
964
965 gchar *
camel_m365_settings_dup_oauth2_endpoint_host(CamelM365Settings * settings)966 camel_m365_settings_dup_oauth2_endpoint_host (CamelM365Settings *settings)
967 {
968 const gchar *protected;
969 gchar *duplicate;
970
971 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), NULL);
972
973 camel_m365_settings_lock (settings);
974
975 protected = camel_m365_settings_get_oauth2_endpoint_host (settings);
976 duplicate = g_strdup (protected);
977
978 camel_m365_settings_unlock (settings);
979
980 return duplicate;
981 }
982
983 void
camel_m365_settings_set_oauth2_endpoint_host(CamelM365Settings * settings,const gchar * endpoint_host)984 camel_m365_settings_set_oauth2_endpoint_host (CamelM365Settings *settings,
985 const gchar *endpoint_host)
986 {
987 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
988
989 camel_m365_settings_lock (settings);
990
991 if (g_strcmp0 (settings->priv->oauth2_endpoint_host, endpoint_host) == 0) {
992 camel_m365_settings_unlock (settings);
993 return;
994 }
995
996 g_free (settings->priv->oauth2_endpoint_host);
997 settings->priv->oauth2_endpoint_host = e_util_strdup_strip (endpoint_host);
998
999 camel_m365_settings_unlock (settings);
1000
1001 g_object_notify (G_OBJECT (settings), "oauth2-endpoint-host");
1002 }
1003
1004 guint
camel_m365_settings_get_concurrent_connections(CamelM365Settings * settings)1005 camel_m365_settings_get_concurrent_connections (CamelM365Settings *settings)
1006 {
1007 g_return_val_if_fail (CAMEL_IS_M365_SETTINGS (settings), 1);
1008
1009 return settings->priv->concurrent_connections;
1010 }
1011
1012 void
camel_m365_settings_set_concurrent_connections(CamelM365Settings * settings,guint concurrent_connections)1013 camel_m365_settings_set_concurrent_connections (CamelM365Settings *settings,
1014 guint concurrent_connections)
1015 {
1016 g_return_if_fail (CAMEL_IS_M365_SETTINGS (settings));
1017
1018 concurrent_connections = CLAMP (
1019 concurrent_connections,
1020 MIN_CONCURRENT_CONNECTIONS,
1021 MAX_CONCURRENT_CONNECTIONS);
1022
1023 if (settings->priv->concurrent_connections == concurrent_connections)
1024 return;
1025
1026 settings->priv->concurrent_connections = concurrent_connections;
1027
1028 g_object_notify (G_OBJECT (settings), "concurrent-connections");
1029 }
1030