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