You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1317 lines
42 KiB
1317 lines
42 KiB
From 57f0eb558fed22ab09ac9937f264f8d1952fca6d Mon Sep 17 00:00:00 2001
|
|
From: Alexey Berezhok <alexey.berezhok@softline.com>
|
|
Date: Wed, 3 May 2023 13:03:16 +0300
|
|
Subject: [PATCH] Added yandex backend support(prebuild)
|
|
|
|
---
|
|
.gitignore | 1 +
|
|
CMakeLists.txt | 11 +
|
|
config.h.in | 6 +
|
|
po/POTFILES.in | 3 +
|
|
src/camel/CMakeLists.txt | 2 +
|
|
src/camel/camel-autocleanups.h | 1 +
|
|
src/camel/camel-sasl-xoauth2-yandex.c | 44 ++
|
|
src/camel/camel-sasl-xoauth2-yandex.h | 63 ++
|
|
src/camel/camel-sasl.c | 2 +
|
|
src/camel/camel.h | 1 +
|
|
src/libedataserver/CMakeLists.txt | 2 +
|
|
.../e-dataserver-autocleanups.h | 1 +
|
|
src/libedataserver/e-oauth2-service-yandex.c | 227 +++++++
|
|
src/libedataserver/e-oauth2-service-yandex.h | 62 ++
|
|
src/libedataserver/e-oauth2-services.c | 2 +
|
|
src/libedataserver/libedataserver.h | 1 +
|
|
src/modules/CMakeLists.txt | 1 +
|
|
.../module-gnome-online-accounts.c | 3 +
|
|
src/modules/yandex-backend/CMakeLists.txt | 23 +
|
|
.../yandex-backend/module-yandex-backend.c | 594 ++++++++++++++++++
|
|
21 files changed, 1052 insertions(+), 1 deletion(-)
|
|
create mode 100644 src/camel/camel-sasl-xoauth2-yandex.c
|
|
create mode 100644 src/camel/camel-sasl-xoauth2-yandex.h
|
|
create mode 100644 src/libedataserver/e-oauth2-service-yandex.c
|
|
create mode 100644 src/libedataserver/e-oauth2-service-yandex.h
|
|
create mode 100644 src/modules/yandex-backend/CMakeLists.txt
|
|
create mode 100644 src/modules/yandex-backend/module-yandex-backend.c
|
|
|
|
diff --git a/.gitignore b/.gitignore
|
|
index 726890e..575a9f0 100644
|
|
--- a/.gitignore
|
|
+++ b/.gitignore
|
|
@@ -3,3 +3,4 @@ _build
|
|
.build
|
|
*.orig
|
|
*.rej
|
|
+.vscode/
|
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
index 2bad65e..d7deb4a 100644
|
|
--- a/CMakeLists.txt
|
|
+++ b/CMakeLists.txt
|
|
@@ -435,6 +435,17 @@ if(ENABLE_OAUTH2)
|
|
if(WITH_YAHOO_CLIENT_SECRET STREQUAL "")
|
|
set(WITH_YAHOO_CLIENT_SECRET "35f49f199dd754ec5e86d3c7cd576a1341c9bc0b")
|
|
endif(WITH_YAHOO_CLIENT_SECRET STREQUAL "")
|
|
+
|
|
+ add_printable_variable(WITH_YANDEX_CLIENT_ID "Yandex OAuth 2.0 client id" "")
|
|
+ add_printable_variable(WITH_YANDEX_CLIENT_SECRET "Yandex OAuth 2.0 client secret" "")
|
|
+
|
|
+ if(WITH_YANDEX_CLIENT_ID STREQUAL "")
|
|
+ set(WITH_YANDEX_CLIENT_ID "8ef866ab7a1f4d3b8fcb58510d422fbc")
|
|
+ endif(WITH_YANDEX_CLIENT_ID STREQUAL "")
|
|
+
|
|
+ if(WITH_YANDEX_CLIENT_SECRET STREQUAL "")
|
|
+ set(WITH_YANDEX_CLIENT_SECRET "aa8be6b692dc4465b1fa40ae6ec7a377")
|
|
+ endif(WITH_YANDEX_CLIENT_SECRET STREQUAL "")
|
|
endif(ENABLE_OAUTH2)
|
|
|
|
# ******************************************
|
|
diff --git a/config.h.in b/config.h.in
|
|
index bd2978a..cdd864e 100644
|
|
--- a/config.h.in
|
|
+++ b/config.h.in
|
|
@@ -51,6 +51,12 @@
|
|
/* Define Yahoo! OAuth 2.0 Client Secret to use */
|
|
#define YAHOO_CLIENT_SECRET "@WITH_YAHOO_CLIENT_SECRET@"
|
|
|
|
+/* Define Yandex OAuth 2.0 Client ID to use */
|
|
+#define YANDEX_CLIENT_ID "@WITH_YANDEX_CLIENT_ID@"
|
|
+
|
|
+/* Define Yandex OAuth 2.0 Client Secret to use */
|
|
+#define YANDEX_CLIENT_SECRET "@WITH_YANDEX_CLIENT_SECRET@"
|
|
+
|
|
/* Path to a sendmail binary, or equivalent */
|
|
#define SENDMAIL_PATH "@SENDMAIL_PATH@"
|
|
|
|
diff --git a/po/POTFILES.in b/po/POTFILES.in
|
|
index 9a25ab5..10dfcf8 100644
|
|
--- a/po/POTFILES.in
|
|
+++ b/po/POTFILES.in
|
|
@@ -118,6 +118,7 @@ src/camel/camel-sasl-xoauth2.c
|
|
src/camel/camel-sasl-xoauth2-google.c
|
|
src/camel/camel-sasl-xoauth2-outlook.c
|
|
src/camel/camel-sasl-xoauth2-yahoo.c
|
|
+src/camel/camel-sasl-xoauth2-yandex.c
|
|
src/camel/camel-search-private.c
|
|
src/camel/camel-service.c
|
|
src/camel/camel-session.c
|
|
@@ -200,6 +201,7 @@ src/libedataserver/e-oauth2-service.c
|
|
src/libedataserver/e-oauth2-service-google.c
|
|
src/libedataserver/e-oauth2-service-outlook.c
|
|
src/libedataserver/e-oauth2-service-yahoo.c
|
|
+src/libedataserver/e-oauth2-service-yandex.c
|
|
src/libedataserver/e-soup-session.c
|
|
src/libedataserver/e-source.c
|
|
src/libedataserver/e-source-credentials-provider-impl.c
|
|
@@ -225,6 +227,7 @@ src/modules/google-backend/module-google-backend.c
|
|
src/modules/trust-prompt/module-trust-prompt.c
|
|
src/modules/trust-prompt/trust-prompt-gtk.c
|
|
src/modules/yahoo-backend/module-yahoo-backend.c
|
|
+src/modules/yandex-backend/module-yandex-backend.c
|
|
src/services/evolution-addressbook-factory/evolution-addressbook-factory.c
|
|
src/services/evolution-alarm-notify/e-alarm-notify.c
|
|
src/services/evolution-calendar-factory/evolution-calendar-factory.c
|
|
diff --git a/src/camel/CMakeLists.txt b/src/camel/CMakeLists.txt
|
|
index 2ba609b..26b2033 100644
|
|
--- a/src/camel/CMakeLists.txt
|
|
+++ b/src/camel/CMakeLists.txt
|
|
@@ -108,6 +108,7 @@ set(SOURCES
|
|
camel-sasl-xoauth2-google.c
|
|
camel-sasl-xoauth2-outlook.c
|
|
camel-sasl-xoauth2-yahoo.c
|
|
+ camel-sasl-xoauth2-yandex.c
|
|
camel-sasl.c
|
|
camel-search-private.c
|
|
camel-search-sql-sexp.c
|
|
@@ -250,6 +251,7 @@ set(HEADERS
|
|
camel-sasl-xoauth2-google.h
|
|
camel-sasl-xoauth2-outlook.h
|
|
camel-sasl-xoauth2-yahoo.h
|
|
+ camel-sasl-xoauth2-yandex.h
|
|
camel-sasl.h
|
|
camel-search-private.h
|
|
camel-search-sql-sexp.h
|
|
diff --git a/src/camel/camel-autocleanups.h b/src/camel/camel-autocleanups.h
|
|
index 0ff82a2..fb6595a 100644
|
|
--- a/src/camel/camel-autocleanups.h
|
|
+++ b/src/camel/camel-autocleanups.h
|
|
@@ -111,6 +111,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(CamelSaslPlain, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(CamelSaslPOPB4SMTP, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(CamelSaslXOAuth2, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(CamelSaslXOAuth2Google, g_object_unref)
|
|
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(CamelSaslXOAuth2Yandex, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(CamelSaslXOAuth2Outlook, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(CamelService, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(CamelServiceAuthType, camel_service_auth_type_free)
|
|
diff --git a/src/camel/camel-sasl-xoauth2-yandex.c b/src/camel/camel-sasl-xoauth2-yandex.c
|
|
new file mode 100644
|
|
index 0000000..234839a
|
|
--- /dev/null
|
|
+++ b/src/camel/camel-sasl-xoauth2-yandex.c
|
|
@@ -0,0 +1,44 @@
|
|
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
+/*
|
|
+ * This library is free software: you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU Lesser General Public License as published by
|
|
+ * the Free Software Foundation.
|
|
+ *
|
|
+ * This library is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
+ * for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public License
|
|
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
+ */
|
|
+
|
|
+#include "evolution-data-server-config.h"
|
|
+
|
|
+#include <glib/gi18n-lib.h>
|
|
+
|
|
+#include "camel-sasl-xoauth2-yandex.h"
|
|
+
|
|
+static CamelServiceAuthType sasl_xoauth2_yandex_auth_type = {
|
|
+ N_("OAuth2 (Yandex)"),
|
|
+ N_("This option will use an OAuth 2.0 "
|
|
+ "access token to connect to the yandex server"),
|
|
+ "Yandex",
|
|
+ FALSE
|
|
+};
|
|
+
|
|
+G_DEFINE_TYPE (CamelSaslXOAuth2Yandex, camel_sasl_xoauth2_yandex, CAMEL_TYPE_SASL_XOAUTH2)
|
|
+
|
|
+static void
|
|
+camel_sasl_xoauth2_yandex_class_init (CamelSaslXOAuth2YandexClass *klass)
|
|
+{
|
|
+ CamelSaslClass *sasl_class;
|
|
+
|
|
+ sasl_class = CAMEL_SASL_CLASS (klass);
|
|
+ sasl_class->auth_type = &sasl_xoauth2_yandex_auth_type;
|
|
+}
|
|
+
|
|
+static void
|
|
+camel_sasl_xoauth2_yandex_init (CamelSaslXOAuth2Yandex *sasl)
|
|
+{
|
|
+}
|
|
diff --git a/src/camel/camel-sasl-xoauth2-yandex.h b/src/camel/camel-sasl-xoauth2-yandex.h
|
|
new file mode 100644
|
|
index 0000000..0141ef9
|
|
--- /dev/null
|
|
+++ b/src/camel/camel-sasl-xoauth2-yandex.h
|
|
@@ -0,0 +1,63 @@
|
|
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
+/*
|
|
+ * This library is free software: you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU Lesser General Public License as published by
|
|
+ * the Free Software Foundation.
|
|
+ *
|
|
+ * This library is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
+ * for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public License
|
|
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
+ */
|
|
+
|
|
+#if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
|
|
+#error "Only <camel/camel.h> can be included directly."
|
|
+#endif
|
|
+
|
|
+#ifndef CAMEL_SASL_XOAUTH2_YANDEX_H
|
|
+#define CAMEL_SASL_XOAUTH2_YANDEX_H
|
|
+
|
|
+#include <camel/camel-sasl-xoauth2.h>
|
|
+
|
|
+/* Standard GObject macros */
|
|
+#define CAMEL_TYPE_SASL_XOAUTH2_YANDEX \
|
|
+ (camel_sasl_xoauth2_yandex_get_type ())
|
|
+#define CAMEL_SASL_XOAUTH2_YANDEX(obj) \
|
|
+ (G_TYPE_CHECK_INSTANCE_CAST \
|
|
+ ((obj), CAMEL_TYPE_SASL_XOAUTH2_YANDEX, CamelSaslXOAuth2Yandex))
|
|
+#define CAMEL_SASL_XOAUTH2_YANDEX_CLASS(cls) \
|
|
+ (G_TYPE_CHECK_CLASS_CAST \
|
|
+ ((cls), CAMEL_TYPE_SASL_XOAUTH2_YANDEX, CamelSaslXOAuth2YandexClass))
|
|
+#define CAMEL_IS_SASL_XOAUTH2_YANDEX(obj) \
|
|
+ (G_TYPE_CHECK_INSTANCE_TYPE \
|
|
+ ((obj), CAMEL_TYPE_SASL_XOAUTH2_YANDEX))
|
|
+#define CAMEL_IS_SASL_XOAUTH2_YANDEX_CLASS(cls) \
|
|
+ (G_TYPE_CHECK_CLASS_TYPE \
|
|
+ ((cls), CAMEL_TYPE_SASL_XOAUTH2_YANDEX))
|
|
+#define CAMEL_SASL_XOAUTH2_YANDEX_GET_CLASS(obj) \
|
|
+ (G_TYPE_INSTANCE_GET_CLASS \
|
|
+ ((obj), CAMEL_TYPE_SASL_XOAUTH2_YANDEX, CamelSaslXOAuth2YandexClass))
|
|
+
|
|
+G_BEGIN_DECLS
|
|
+
|
|
+typedef struct _CamelSaslXOAuth2Yandex CamelSaslXOAuth2Yandex;
|
|
+typedef struct _CamelSaslXOAuth2YandexClass CamelSaslXOAuth2YandexClass;
|
|
+typedef struct _CamelSaslXOAuth2YandexPrivate CamelSaslXOAuth2YandexPrivate;
|
|
+
|
|
+struct _CamelSaslXOAuth2Yandex {
|
|
+ CamelSaslXOAuth2 parent;
|
|
+ CamelSaslXOAuth2YandexPrivate *priv;
|
|
+};
|
|
+
|
|
+struct _CamelSaslXOAuth2YandexClass {
|
|
+ CamelSaslXOAuth2Class parent_class;
|
|
+};
|
|
+
|
|
+GType camel_sasl_xoauth2_yandex_get_type (void) G_GNUC_CONST;
|
|
+
|
|
+G_END_DECLS
|
|
+
|
|
+#endif /* CAMEL_SASL_XOAUTH2_YANDEX_H */
|
|
diff --git a/src/camel/camel-sasl.c b/src/camel/camel-sasl.c
|
|
index 0a09c55..82cc3cb 100644
|
|
--- a/src/camel/camel-sasl.c
|
|
+++ b/src/camel/camel-sasl.c
|
|
@@ -35,6 +35,7 @@
|
|
#include "camel-sasl-xoauth2-google.h"
|
|
#include "camel-sasl-xoauth2-outlook.h"
|
|
#include "camel-sasl-xoauth2-yahoo.h"
|
|
+#include "camel-sasl-xoauth2-yandex.h"
|
|
#include "camel-sasl.h"
|
|
#include "camel-service.h"
|
|
|
|
@@ -133,6 +134,7 @@ sasl_build_class_table (void)
|
|
g_type_ensure (CAMEL_TYPE_SASL_XOAUTH2_GOOGLE);
|
|
g_type_ensure (CAMEL_TYPE_SASL_XOAUTH2_OUTLOOK);
|
|
g_type_ensure (CAMEL_TYPE_SASL_XOAUTH2_YAHOO);
|
|
+ g_type_ensure (CAMEL_TYPE_SASL_XOAUTH2_YANDEX);
|
|
|
|
class_table = g_hash_table_new_full (
|
|
(GHashFunc) g_str_hash,
|
|
diff --git a/src/camel/camel.h b/src/camel/camel.h
|
|
index 0df1baf..9c71ab7 100644
|
|
--- a/src/camel/camel.h
|
|
+++ b/src/camel/camel.h
|
|
@@ -110,6 +110,7 @@
|
|
#include <camel/camel-sasl-popb4smtp.h>
|
|
#include <camel/camel-sasl-xoauth2.h>
|
|
#include <camel/camel-sasl-xoauth2-google.h>
|
|
+#include <camel/camel-sasl-xoauth2-yandex.h>
|
|
#include <camel/camel-sasl-xoauth2-outlook.h>
|
|
#include <camel/camel-sasl-xoauth2-yahoo.h>
|
|
#include <camel/camel-service.h>
|
|
diff --git a/src/libedataserver/CMakeLists.txt b/src/libedataserver/CMakeLists.txt
|
|
index b196ae2..49a8471 100644
|
|
--- a/src/libedataserver/CMakeLists.txt
|
|
+++ b/src/libedataserver/CMakeLists.txt
|
|
@@ -69,6 +69,7 @@ set(SOURCES
|
|
e-oauth2-service-google.c
|
|
e-oauth2-service-outlook.c
|
|
e-oauth2-service-yahoo.c
|
|
+ e-oauth2-service-yandex.c
|
|
e-oauth2-services.c
|
|
e-operation-pool.c
|
|
e-proxy.c
|
|
@@ -160,6 +161,7 @@ set(HEADERS
|
|
e-oauth2-service-google.h
|
|
e-oauth2-service-outlook.h
|
|
e-oauth2-service-yahoo.h
|
|
+ e-oauth2-service-yandex.h
|
|
e-oauth2-services.h
|
|
e-operation-pool.h
|
|
e-proxy.h
|
|
diff --git a/src/libedataserver/e-dataserver-autocleanups.h b/src/libedataserver/e-dataserver-autocleanups.h
|
|
index bc3c81a..93b4e14 100644
|
|
--- a/src/libedataserver/e-dataserver-autocleanups.h
|
|
+++ b/src/libedataserver/e-dataserver-autocleanups.h
|
|
@@ -39,6 +39,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(ENetworkMonitor, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(EOAuth2Service, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(EOAuth2ServiceBase, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(EOAuth2ServiceGoogle, g_object_unref)
|
|
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(EOAuth2ServiceYandex, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(EOAuth2ServiceOutlook, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(EOAuth2Services, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(EOperationPool, e_operation_pool_free)
|
|
diff --git a/src/libedataserver/e-oauth2-service-yandex.c b/src/libedataserver/e-oauth2-service-yandex.c
|
|
new file mode 100644
|
|
index 0000000..19e9453
|
|
--- /dev/null
|
|
+++ b/src/libedataserver/e-oauth2-service-yandex.c
|
|
@@ -0,0 +1,227 @@
|
|
+/*
|
|
+ * Copyright (C) 2018 Red Hat, Inc. (www.redhat.com)
|
|
+ *
|
|
+ * This library is free software: you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU Lesser General Public License as published by
|
|
+ * the Free Software Foundation.
|
|
+ *
|
|
+ * This library is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
+ * for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public License
|
|
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
+ */
|
|
+
|
|
+#include "evolution-data-server-config.h"
|
|
+
|
|
+#include <glib/gi18n-lib.h>
|
|
+
|
|
+#include "e-oauth2-service.h"
|
|
+#include "e-oauth2-service-base.h"
|
|
+
|
|
+#include "e-oauth2-service-yandex.h"
|
|
+
|
|
+/* Forward Declarations */
|
|
+static void e_oauth2_service_yandex_oauth2_service_init (EOAuth2ServiceInterface *iface);
|
|
+
|
|
+G_DEFINE_TYPE_WITH_CODE (EOAuth2ServiceYandex, e_oauth2_service_yandex, E_TYPE_OAUTH2_SERVICE_BASE,
|
|
+ G_IMPLEMENT_INTERFACE (E_TYPE_OAUTH2_SERVICE, e_oauth2_service_yandex_oauth2_service_init))
|
|
+
|
|
+static gboolean
|
|
+eos_yandex_guess_can_process (EOAuth2Service *service,
|
|
+ const gchar *protocol,
|
|
+ const gchar *hostname)
|
|
+{
|
|
+ return hostname && (
|
|
+ e_util_utf8_strstrcase (hostname, ".yandex.ru") ||
|
|
+ e_util_utf8_strstrcase (hostname, ".ya.ru") ||
|
|
+ e_util_utf8_strstrcase (hostname, ".yandex.com"));
|
|
+}
|
|
+
|
|
+static const gchar *
|
|
+eos_yandex_get_name (EOAuth2Service *service)
|
|
+{
|
|
+ return "Yandex";
|
|
+}
|
|
+
|
|
+static const gchar *
|
|
+eos_yandex_get_display_name (EOAuth2Service *service)
|
|
+{
|
|
+ /* Translators: This is a user-visible string, display name of an OAuth2 service. */
|
|
+ return C_("OAuth2Service", "yandex");
|
|
+}
|
|
+
|
|
+static const gchar *
|
|
+eos_yandex_read_settings (EOAuth2Service *service,
|
|
+ const gchar *key_name)
|
|
+{
|
|
+ G_LOCK_DEFINE_STATIC (user_settings);
|
|
+ gchar *value;
|
|
+
|
|
+ G_LOCK (user_settings);
|
|
+
|
|
+ value = g_object_get_data (G_OBJECT (service), key_name);
|
|
+ if (!value) {
|
|
+ GSettings *settings;
|
|
+
|
|
+ settings = g_settings_new ("org.gnome.evolution-data-server");
|
|
+ value = g_settings_get_string (settings, key_name);
|
|
+ g_object_unref (settings);
|
|
+
|
|
+ if (value && *value) {
|
|
+ g_object_set_data_full (G_OBJECT (service), key_name, value, g_free);
|
|
+ } else {
|
|
+ g_free (value);
|
|
+ value = (gchar *) "";
|
|
+
|
|
+ g_object_set_data (G_OBJECT (service), key_name, value);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ G_UNLOCK (user_settings);
|
|
+
|
|
+ return value;
|
|
+}
|
|
+
|
|
+static const gchar *
|
|
+eos_yandex_get_client_id (EOAuth2Service *service,
|
|
+ ESource *source)
|
|
+{
|
|
+ const gchar *client_id;
|
|
+
|
|
+ client_id = eos_yandex_read_settings (service, "oauth2-yandex-client-id");
|
|
+
|
|
+ if (client_id && *client_id)
|
|
+ return client_id;
|
|
+
|
|
+ return YANDEX_CLIENT_ID;
|
|
+}
|
|
+
|
|
+static const gchar *
|
|
+eos_yandex_get_client_secret (EOAuth2Service *service,
|
|
+ ESource *source)
|
|
+{
|
|
+ const gchar *client_secret;
|
|
+
|
|
+ client_secret = eos_yandex_read_settings (service, "oauth2-yandex-client-secret");
|
|
+
|
|
+ if (client_secret && *client_secret)
|
|
+ return client_secret;
|
|
+
|
|
+ return YANDEX_CLIENT_SECRET;
|
|
+}
|
|
+
|
|
+static const gchar *
|
|
+eos_yandex_get_authentication_uri (EOAuth2Service *service,
|
|
+ ESource *source)
|
|
+{
|
|
+ return "https://oauth.yandex.ru/authorize";
|
|
+}
|
|
+
|
|
+static const gchar *
|
|
+eos_yandex_get_refresh_uri (EOAuth2Service *service,
|
|
+ ESource *source)
|
|
+{
|
|
+ return "https://oauth.yandex.ru/token";
|
|
+}
|
|
+
|
|
+static void
|
|
+eos_yandex_prepare_authentication_uri_query (EOAuth2Service *service,
|
|
+ ESource *source,
|
|
+ GHashTable *uri_query)
|
|
+{
|
|
+ const gchar *YANDEX_SCOPE =
|
|
+ /* GMail IMAP and SMTP access */
|
|
+ "ogin:email login:info mail:imap_full mail:imap_ro mail:smtp";
|
|
+
|
|
+ g_return_if_fail (uri_query != NULL);
|
|
+
|
|
+ e_oauth2_service_util_set_to_form (uri_query, "scope", YANDEX_SCOPE);
|
|
+ e_oauth2_service_util_set_to_form (uri_query, "include_granted_scopes", "false");
|
|
+}
|
|
+
|
|
+static gboolean
|
|
+eos_yandex_extract_authorization_code (EOAuth2Service *service,
|
|
+ ESource *source,
|
|
+ const gchar *page_title,
|
|
+ const gchar *page_uri,
|
|
+ const gchar *page_content,
|
|
+ gchar **out_authorization_code)
|
|
+{
|
|
+ g_return_val_if_fail (out_authorization_code != NULL, FALSE);
|
|
+
|
|
+ *out_authorization_code = NULL;
|
|
+
|
|
+ if (page_title && *page_title) {
|
|
+ /* Known response, but no authorization code */
|
|
+ if (g_ascii_strncasecmp (page_title, "Denied ", 7) == 0)
|
|
+ return TRUE;
|
|
+
|
|
+ if (g_ascii_strncasecmp (page_title, "Success code=", 13) == 0) {
|
|
+ *out_authorization_code = g_strdup (page_title + 13);
|
|
+ return TRUE;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (page_uri && *page_uri) {
|
|
+ SoupURI *suri;
|
|
+
|
|
+ suri = soup_uri_new (page_uri);
|
|
+ if (suri) {
|
|
+ const gchar *query = soup_uri_get_query (suri);
|
|
+ gboolean known = FALSE;
|
|
+
|
|
+ if (query && *query) {
|
|
+ GHashTable *params;
|
|
+
|
|
+ params = soup_form_decode (query);
|
|
+ if (params) {
|
|
+ const gchar *response;
|
|
+
|
|
+ response = g_hash_table_lookup (params, "response");
|
|
+ if (response && g_ascii_strncasecmp (response, "code=", 5) == 0) {
|
|
+ *out_authorization_code = g_strdup (response + 5);
|
|
+ known = TRUE;
|
|
+ } else if (response && g_ascii_strncasecmp (response, "error", 5) == 0) {
|
|
+ known = TRUE;
|
|
+ }
|
|
+
|
|
+ g_hash_table_destroy (params);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ soup_uri_free (suri);
|
|
+
|
|
+ if (known)
|
|
+ return TRUE;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return FALSE;
|
|
+}
|
|
+
|
|
+static void
|
|
+e_oauth2_service_yandex_oauth2_service_init (EOAuth2ServiceInterface *iface)
|
|
+{
|
|
+ iface->guess_can_process = eos_yandex_guess_can_process;
|
|
+ iface->get_name = eos_yandex_get_name;
|
|
+ iface->get_display_name = eos_yandex_get_display_name;
|
|
+ iface->get_client_id = eos_yandex_get_client_id;
|
|
+ iface->get_client_secret = eos_yandex_get_client_secret;
|
|
+ iface->get_authentication_uri = eos_yandex_get_authentication_uri;
|
|
+ iface->get_refresh_uri = eos_yandex_get_refresh_uri;
|
|
+ iface->prepare_authentication_uri_query = eos_yandex_prepare_authentication_uri_query;
|
|
+ iface->extract_authorization_code = eos_yandex_extract_authorization_code;
|
|
+}
|
|
+
|
|
+static void
|
|
+e_oauth2_service_yandex_class_init (EOAuth2ServiceYandexClass *klass)
|
|
+{
|
|
+}
|
|
+
|
|
+static void
|
|
+e_oauth2_service_yandex_init (EOAuth2ServiceYandex *oauth2_google)
|
|
+{
|
|
+}
|
|
diff --git a/src/libedataserver/e-oauth2-service-yandex.h b/src/libedataserver/e-oauth2-service-yandex.h
|
|
new file mode 100644
|
|
index 0000000..0011fd9
|
|
--- /dev/null
|
|
+++ b/src/libedataserver/e-oauth2-service-yandex.h
|
|
@@ -0,0 +1,62 @@
|
|
+/*
|
|
+ * Copyright (C) 2018 Red Hat, Inc. (www.redhat.com)
|
|
+ *
|
|
+ * This library is free software: you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU Lesser General Public License as published by
|
|
+ * the Free Software Foundation.
|
|
+ *
|
|
+ * This library is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
+ * for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public License
|
|
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
+ */
|
|
+
|
|
+#if !defined (__LIBEDATASERVER_H_INSIDE__) && !defined (LIBEDATASERVER_COMPILATION)
|
|
+#error "Only <libedataserver/libedataserver.h> should be included directly."
|
|
+#endif
|
|
+
|
|
+#ifndef E_OAUTH2_SERVICE_YANDEX_H
|
|
+#define E_OAUTH2_SERVICE_YANDEX_H
|
|
+
|
|
+#include <libedataserver/e-oauth2-service-base.h>
|
|
+
|
|
+/* Standard GObject macros */
|
|
+#define E_TYPE_OAUTH2_SERVICE_YANDEX \
|
|
+ (e_oauth2_service_yandex_get_type ())
|
|
+#define E_OAUTH2_SERVICE_YANDEX(obj) \
|
|
+ (G_TYPE_CHECK_INSTANCE_CAST \
|
|
+ ((obj), E_TYPE_OAUTH2_SERVICE_YANDEX, EOAuth2ServiceYandex))
|
|
+#define E_OAUTH2_SERVICE_YANDEX_CLASS(cls) \
|
|
+ (G_TYPE_CHECK_CLASS_CAST \
|
|
+ ((cls), E_TYPE_OAUTH2_SERVICE_YANDEX, EOAuth2ServiceYandexClass))
|
|
+#define E_IS_OAUTH2_SERVICE_YANDEX(obj) \
|
|
+ (G_TYPE_CHECK_INSTANCE_TYPE \
|
|
+ ((obj), E_TYPE_OAUTH2_SERVICE_YANDEX))
|
|
+#define E_IS_OAUTH2_SERVICE_YANDEX_CLASS(cls) \
|
|
+ (G_TYPE_CHECK_CLASS_TYPE \
|
|
+ ((cls), E_TYPE_OAUTH2_SERVICE_YANDEX))
|
|
+#define E_OAUTH2_SERVICE_YANDEX_GET_CLASS(obj) \
|
|
+ (G_TYPE_INSTANCE_GET_CLASS \
|
|
+ ((obj), E_TYPE_OAUTH2_SERVICE_YANDEX, EOAuth2ServiceYandexClass))
|
|
+
|
|
+G_BEGIN_DECLS
|
|
+
|
|
+typedef struct _EOAuth2ServiceYandex EOAuth2ServiceYandex;
|
|
+typedef struct _EOAuth2ServiceYandexClass EOAuth2ServiceYandexClass;
|
|
+
|
|
+struct _EOAuth2ServiceYandex {
|
|
+ EOAuth2ServiceBase parent;
|
|
+};
|
|
+
|
|
+struct _EOAuth2ServiceYandexClass {
|
|
+ EOAuth2ServiceBaseClass parent_class;
|
|
+};
|
|
+
|
|
+GType e_oauth2_service_yandex_get_type (void) G_GNUC_CONST;
|
|
+
|
|
+G_END_DECLS
|
|
+
|
|
+#endif /* E_OAUTH2_SERVICE_YANDEX_H */
|
|
diff --git a/src/libedataserver/e-oauth2-services.c b/src/libedataserver/e-oauth2-services.c
|
|
index 838b007..3679cea 100644
|
|
--- a/src/libedataserver/e-oauth2-services.c
|
|
+++ b/src/libedataserver/e-oauth2-services.c
|
|
@@ -36,6 +36,7 @@
|
|
|
|
/* Known built-in implementations */
|
|
#include "e-oauth2-service-google.h"
|
|
+#include "e-oauth2-service-yandex.h"
|
|
#include "e-oauth2-service-outlook.h"
|
|
#include "e-oauth2-service-yahoo.h"
|
|
|
|
@@ -136,6 +137,7 @@ e_oauth2_services_class_init (EOAuth2ServicesClass *klass)
|
|
|
|
/* Ensure built-in service types are registered */
|
|
g_type_ensure (E_TYPE_OAUTH2_SERVICE_GOOGLE);
|
|
+ g_type_ensure (E_TYPE_OAUTH2_SERVICE_YANDEX);
|
|
g_type_ensure (E_TYPE_OAUTH2_SERVICE_OUTLOOK);
|
|
g_type_ensure (E_TYPE_OAUTH2_SERVICE_YAHOO);
|
|
}
|
|
diff --git a/src/libedataserver/libedataserver.h b/src/libedataserver/libedataserver.h
|
|
index 34e71cb..e573344 100644
|
|
--- a/src/libedataserver/libedataserver.h
|
|
+++ b/src/libedataserver/libedataserver.h
|
|
@@ -41,6 +41,7 @@
|
|
#include <libedataserver/e-oauth2-service.h>
|
|
#include <libedataserver/e-oauth2-service-base.h>
|
|
#include <libedataserver/e-oauth2-service-google.h>
|
|
+#include <libedataserver/e-oauth2-service-yandex.h>
|
|
#include <libedataserver/e-oauth2-service-outlook.h>
|
|
#include <libedataserver/e-oauth2-service-yahoo.h>
|
|
#include <libedataserver/e-oauth2-services.h>
|
|
diff --git a/src/modules/CMakeLists.txt b/src/modules/CMakeLists.txt
|
|
index d43357c..f4fafce 100644
|
|
--- a/src/modules/CMakeLists.txt
|
|
+++ b/src/modules/CMakeLists.txt
|
|
@@ -67,6 +67,7 @@ add_subdirectory(google-backend)
|
|
add_subdirectory(outlook-backend)
|
|
add_subdirectory(webdav-backend)
|
|
add_subdirectory(yahoo-backend)
|
|
+add_subdirectory(yandex-backend)
|
|
|
|
if(ENABLE_OAUTH2)
|
|
add_subdirectory(oauth2-services)
|
|
diff --git a/src/modules/gnome-online-accounts/module-gnome-online-accounts.c b/src/modules/gnome-online-accounts/module-gnome-online-accounts.c
|
|
index 03c4930..9d10d6d 100644
|
|
--- a/src/modules/gnome-online-accounts/module-gnome-online-accounts.c
|
|
+++ b/src/modules/gnome-online-accounts/module-gnome-online-accounts.c
|
|
@@ -120,6 +120,9 @@ gnome_online_accounts_get_backend_name (const gchar *goa_provider_type)
|
|
|
|
if (g_str_equal (goa_provider_type, "google"))
|
|
eds_backend_name = "google";
|
|
+
|
|
+ if (g_str_equal (goa_provider_type, "yandex"))
|
|
+ eds_backend_name = "yandex";
|
|
|
|
if (g_str_equal (goa_provider_type, "imap_smtp"))
|
|
eds_backend_name = "none";
|
|
diff --git a/src/modules/yandex-backend/CMakeLists.txt b/src/modules/yandex-backend/CMakeLists.txt
|
|
new file mode 100644
|
|
index 0000000..2416fa1
|
|
--- /dev/null
|
|
+++ b/src/modules/yandex-backend/CMakeLists.txt
|
|
@@ -0,0 +1,23 @@
|
|
+set(extra_deps)
|
|
+if(HAVE_LIBGDATA)
|
|
+ set(sources
|
|
+ module-yandex-backend.c
|
|
+ )
|
|
+else(HAVE_LIBGDATA)
|
|
+ set(sources
|
|
+ module-yandex-backend.c
|
|
+ )
|
|
+endif(HAVE_LIBGDATA)
|
|
+set(extra_defines)
|
|
+set(extra_cflags ${LIBGDATA_CFLAGS})
|
|
+set(extra_incdirs ${LIBGDATA_INCLUDE_DIRS})
|
|
+set(extra_ldflags ${LIBGDATA_LDFLAGS})
|
|
+
|
|
+add_source_registry_module(module-yandex-backend
|
|
+ sources
|
|
+ extra_deps
|
|
+ extra_defines
|
|
+ extra_cflags
|
|
+ extra_incdirs
|
|
+ extra_ldflags
|
|
+)
|
|
diff --git a/src/modules/yandex-backend/module-yandex-backend.c b/src/modules/yandex-backend/module-yandex-backend.c
|
|
new file mode 100644
|
|
index 0000000..31e6f2e
|
|
--- /dev/null
|
|
+++ b/src/modules/yandex-backend/module-yandex-backend.c
|
|
@@ -0,0 +1,594 @@
|
|
+/*
|
|
+ * module-yandex-backend.c
|
|
+ *
|
|
+ * This library is free software: you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU Lesser General Public License as published by
|
|
+ * the Free Software Foundation.
|
|
+ *
|
|
+ * This library is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
+ * for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public License
|
|
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
+ *
|
|
+ */
|
|
+
|
|
+#include "evolution-data-server-config.h"
|
|
+
|
|
+#include <glib/gi18n-lib.h>
|
|
+
|
|
+#include <libebackend/libebackend.h>
|
|
+#include <libedataserver/libedataserver.h>
|
|
+
|
|
+#ifdef HAVE_LIBGDATA
|
|
+#include <gdata/gdata.h>
|
|
+#endif
|
|
+
|
|
+/* Standard GObject macros */
|
|
+#define E_TYPE_YANDEX_BACKEND \
|
|
+ (e_yandex_backend_get_type ())
|
|
+#define E_YANDEX_BACKEND(obj) \
|
|
+ (G_TYPE_CHECK_INSTANCE_CAST \
|
|
+ ((obj), E_TYPE_YANDEX_BACKEND, EYandexBackend))
|
|
+
|
|
+/* Just for readability... */
|
|
+#define METHOD(x) (CAMEL_NETWORK_SECURITY_METHOD_##x)
|
|
+
|
|
+#define YANDEX_OAUTH2_METHOD "Yandex"
|
|
+
|
|
+/* IMAP Configuration Details */
|
|
+#define YANDEX_IMAP_BACKEND_NAME "imapx"
|
|
+#define YANDEX_IMAP_HOST "imap.yandex.ru"
|
|
+#define YANDEX_IMAP_PORT 993
|
|
+#define YANDEX_IMAP_SECURITY_METHOD METHOD (SSL_ON_ALTERNATE_PORT)
|
|
+
|
|
+/* SMTP Configuration Details */
|
|
+#define YANDEX_SMTP_BACKEND_NAME "smtp"
|
|
+#define YANDEX_SMTP_HOST "smtp.yandex.ru"
|
|
+#define YANDEX_SMTP_PORT 465
|
|
+#define YANDEX_SMTP_SECURITY_METHOD METHOD (SSL_ON_ALTERNATE_PORT)
|
|
+
|
|
+typedef struct _EYandexBackend EYandexBackend;
|
|
+typedef struct _EYandexBackendClass EYandexBackendClass;
|
|
+
|
|
+typedef struct _EYandexBackendFactory EYandexBackendFactory;
|
|
+typedef struct _EYandexBackendFactoryClass EYandexBackendFactoryClass;
|
|
+
|
|
+struct _EYandexBackend {
|
|
+ EWebDAVCollectionBackend parent;
|
|
+};
|
|
+
|
|
+struct _EYandexBackendClass {
|
|
+ EWebDAVCollectionBackendClass parent_class;
|
|
+};
|
|
+
|
|
+struct _EYandexBackendFactory {
|
|
+ ECollectionBackendFactory parent;
|
|
+};
|
|
+
|
|
+struct _EYandexBackendFactoryClass {
|
|
+ ECollectionBackendFactoryClass parent_class;
|
|
+};
|
|
+
|
|
+/* Module Entry Points */
|
|
+void e_module_load (GTypeModule *type_module);
|
|
+void e_module_unload (GTypeModule *type_module);
|
|
+
|
|
+/* Forward Declarations */
|
|
+GType e_yandex_backend_get_type (void);
|
|
+GType e_yandex_backend_factory_get_type (void);
|
|
+
|
|
+G_DEFINE_DYNAMIC_TYPE (
|
|
+ EYandexBackend,
|
|
+ e_yandex_backend,
|
|
+ E_TYPE_WEBDAV_COLLECTION_BACKEND)
|
|
+
|
|
+G_DEFINE_DYNAMIC_TYPE (
|
|
+ EYandexBackendFactory,
|
|
+ e_yandex_backend_factory,
|
|
+ E_TYPE_COLLECTION_BACKEND_FACTORY)
|
|
+
|
|
+static gboolean
|
|
+yandex_backend_can_use_yandex_auth (ESource *source)
|
|
+{
|
|
+ ESourceRegistryServer *registry;
|
|
+ ESourceAuthentication *auth_extension;
|
|
+ gboolean res;
|
|
+
|
|
+ g_return_val_if_fail (E_IS_SERVER_SIDE_SOURCE (source), FALSE);
|
|
+
|
|
+ registry = e_server_side_source_get_server (E_SERVER_SIDE_SOURCE (source));
|
|
+ if (!e_oauth2_services_is_oauth2_alias (e_source_registry_server_get_oauth2_services (registry), YANDEX_OAUTH2_METHOD))
|
|
+ return FALSE;
|
|
+
|
|
+ g_object_ref (source);
|
|
+
|
|
+ while (source && e_source_get_parent (source)) {
|
|
+ ESource *adept_source;
|
|
+
|
|
+ adept_source = e_source_registry_server_ref_source (registry, e_source_get_parent (source));
|
|
+ if (adept_source) {
|
|
+ g_object_unref (source);
|
|
+ source = adept_source;
|
|
+ } else {
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ auth_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION);
|
|
+ res = !e_source_authentication_get_is_external (auth_extension);
|
|
+
|
|
+ g_object_unref (source);
|
|
+
|
|
+ return res;
|
|
+}
|
|
+
|
|
+static gboolean
|
|
+host_ends_with (const gchar *host,
|
|
+ const gchar *ends_with)
|
|
+{
|
|
+ gint host_len, ends_with_len;
|
|
+
|
|
+ if (!host || !ends_with)
|
|
+ return FALSE;
|
|
+
|
|
+ host_len = strlen (host);
|
|
+ ends_with_len = strlen (ends_with);
|
|
+
|
|
+ if (host_len <= ends_with_len)
|
|
+ return FALSE;
|
|
+
|
|
+ return g_ascii_strcasecmp (host + host_len - ends_with_len, ends_with) == 0;
|
|
+}
|
|
+
|
|
+static gboolean
|
|
+yandex_backend_is_yandex_host (ESourceAuthentication *auth_extension,
|
|
+ gboolean *out_requires_oauth2)
|
|
+{
|
|
+ gboolean is_yandex;
|
|
+ gboolean requires_oauth2;
|
|
+ gchar *host;
|
|
+
|
|
+ g_return_val_if_fail (E_IS_SOURCE_AUTHENTICATION (auth_extension), FALSE);
|
|
+
|
|
+ host = e_source_authentication_dup_host (auth_extension);
|
|
+
|
|
+ requires_oauth2 = (host != NULL);
|
|
+
|
|
+ is_yandex = requires_oauth2 || (host && (
|
|
+ host_ends_with (host, "yandex.ru") ||
|
|
+ host_ends_with (host, "yandex.com") ||
|
|
+ host_ends_with (host, "ya.ru")));
|
|
+
|
|
+ g_free (host);
|
|
+
|
|
+ if (out_requires_oauth2)
|
|
+ *out_requires_oauth2 = requires_oauth2;
|
|
+
|
|
+ return is_yandex;
|
|
+}
|
|
+
|
|
+static gboolean
|
|
+yandex_backend_is_oauth2 (const gchar *method)
|
|
+{
|
|
+ return g_strcmp0 (method, YANDEX_OAUTH2_METHOD) == 0 ||
|
|
+ g_strcmp0 (method, "OAuth2") == 0 ||
|
|
+ g_strcmp0 (method, "XOAUTH2") == 0;
|
|
+}
|
|
+
|
|
+static gboolean
|
|
+yandex_backend_can_change_auth_method (ESourceAuthentication *auth_extension,
|
|
+ const gchar *new_method)
|
|
+{
|
|
+ gchar *cur_method;
|
|
+ gboolean can_change;
|
|
+
|
|
+ g_return_val_if_fail (E_IS_SOURCE_AUTHENTICATION (auth_extension), FALSE);
|
|
+
|
|
+ if (!new_method)
|
|
+ return FALSE;
|
|
+
|
|
+ cur_method = e_source_authentication_dup_method (auth_extension);
|
|
+
|
|
+ /* Only when turning off OAuth2 */
|
|
+ can_change = yandex_backend_is_oauth2 (cur_method) && !yandex_backend_is_oauth2 (new_method);
|
|
+
|
|
+ g_free (cur_method);
|
|
+
|
|
+ return can_change;
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_backend_mail_update_auth_method (ECollectionBackend *collection_backend,
|
|
+ ESource *child_source,
|
|
+ ESource *master_source)
|
|
+{
|
|
+ ESourceAuthentication *auth_extension;
|
|
+ EOAuth2Support *oauth2_support;
|
|
+ const gchar *method;
|
|
+ gboolean can_use_yandex_auth;
|
|
+
|
|
+ auth_extension = e_source_get_extension (child_source, E_SOURCE_EXTENSION_AUTHENTICATION);
|
|
+
|
|
+ if (!yandex_backend_is_yandex_host (auth_extension, NULL))
|
|
+ return;
|
|
+
|
|
+ oauth2_support = e_server_side_source_ref_oauth2_support (E_SERVER_SIDE_SOURCE (child_source));
|
|
+ if (!oauth2_support && master_source)
|
|
+ oauth2_support = e_server_side_source_ref_oauth2_support (E_SERVER_SIDE_SOURCE (master_source));
|
|
+
|
|
+ can_use_yandex_auth = yandex_backend_can_use_yandex_auth (child_source);
|
|
+ if (!can_use_yandex_auth && master_source)
|
|
+ can_use_yandex_auth = yandex_backend_can_use_yandex_auth (master_source);
|
|
+
|
|
+ if (oauth2_support && !can_use_yandex_auth) {
|
|
+ method = "XOAUTH2";
|
|
+ } else if (can_use_yandex_auth) {
|
|
+ method = YANDEX_OAUTH2_METHOD;
|
|
+ } else {
|
|
+ method = NULL;
|
|
+ }
|
|
+
|
|
+ if (method && (e_collection_backend_is_new_source (collection_backend, child_source) ||
|
|
+ yandex_backend_can_change_auth_method (auth_extension, method)))
|
|
+ e_source_authentication_set_method (auth_extension, method);
|
|
+
|
|
+ g_clear_object (&oauth2_support);
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_backend_mail_update_auth_method_cb (ESource *child_source,
|
|
+ GParamSpec *param,
|
|
+ EBackend *backend)
|
|
+{
|
|
+ yandex_backend_mail_update_auth_method (E_COLLECTION_BACKEND (backend), child_source, e_backend_get_source (backend));
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_remove_unknown_sources_cb (gpointer resource_id,
|
|
+ gpointer uid,
|
|
+ gpointer user_data)
|
|
+{
|
|
+ ESourceRegistryServer *server = user_data;
|
|
+ ESource *source;
|
|
+
|
|
+ source = e_source_registry_server_ref_source (server, uid);
|
|
+
|
|
+ if (source) {
|
|
+ e_source_remove_sync (source, NULL, NULL);
|
|
+ g_object_unref (source);
|
|
+ }
|
|
+}
|
|
+
|
|
+static ESourceAuthenticationResult
|
|
+yandex_backend_authenticate_sync (EBackend *backend,
|
|
+ const ENamedParameters *credentials,
|
|
+ gchar **out_certificate_pem,
|
|
+ GTlsCertificateFlags *out_certificate_errors,
|
|
+ GCancellable *cancellable,
|
|
+ GError **error)
|
|
+{
|
|
+ ECollectionBackend *collection = E_COLLECTION_BACKEND (backend);
|
|
+ ESourceCollection *collection_extension;
|
|
+ ESource *source;
|
|
+ ESourceAuthenticationResult result = E_SOURCE_AUTHENTICATION_ERROR;
|
|
+ GHashTable *known_sources;
|
|
+ GList *sources;
|
|
+ ENamedParameters *credentials_copy = NULL;
|
|
+
|
|
+ g_return_val_if_fail (collection != NULL, E_SOURCE_AUTHENTICATION_ERROR);
|
|
+
|
|
+ source = e_backend_get_source (backend);
|
|
+ collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION);
|
|
+
|
|
+ g_return_val_if_fail (e_source_collection_get_calendar_enabled (collection_extension) ||
|
|
+ e_source_collection_get_contacts_enabled (collection_extension), E_SOURCE_AUTHENTICATION_ERROR);
|
|
+
|
|
+ e_collection_backend_freeze_populate (collection);
|
|
+
|
|
+ if (credentials && !e_named_parameters_get (credentials, E_SOURCE_CREDENTIAL_USERNAME)) {
|
|
+ credentials_copy = e_named_parameters_new_clone (credentials);
|
|
+ e_named_parameters_set (credentials_copy, E_SOURCE_CREDENTIAL_USERNAME, e_source_collection_get_identity (collection_extension));
|
|
+ credentials = credentials_copy;
|
|
+ }
|
|
+
|
|
+ /* resource-id => source's UID */
|
|
+ known_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
|
+
|
|
+ sources = e_collection_backend_list_calendar_sources (collection);
|
|
+ g_list_free_full (sources, g_object_unref);
|
|
+
|
|
+ /* When the WebDAV extension is created, the auth method can be reset, thus ensure
|
|
+ it's there before setting correct authentication method on the master source. */
|
|
+ (void) e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
|
|
+
|
|
+ result = E_SOURCE_AUTHENTICATION_ACCEPTED;
|
|
+
|
|
+ if (result == E_SOURCE_AUTHENTICATION_ACCEPTED) {
|
|
+ ESourceRegistryServer *server;
|
|
+
|
|
+ server = e_collection_backend_ref_server (collection);
|
|
+
|
|
+ if (server) {
|
|
+ g_hash_table_foreach (known_sources, yandex_remove_unknown_sources_cb, server);
|
|
+ g_object_unref (server);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ g_hash_table_destroy (known_sources);
|
|
+ e_named_parameters_free (credentials_copy);
|
|
+
|
|
+ e_collection_backend_thaw_populate (collection);
|
|
+
|
|
+ return result;
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_backend_populate (ECollectionBackend *backend)
|
|
+{
|
|
+ ESourceAuthentication *authentication_extension;
|
|
+ ESource *source;
|
|
+
|
|
+ source = e_backend_get_source (E_BACKEND (backend));
|
|
+ authentication_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION);
|
|
+
|
|
+ /* When the WebDAV extension is created, the auth method can be reset, thus ensure
|
|
+ it's there before setting correct authentication method on the master source. */
|
|
+ (void) e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
|
|
+
|
|
+ if (e_source_authentication_get_is_external (authentication_extension))
|
|
+ e_source_authentication_set_method (authentication_extension, "OAuth2");
|
|
+
|
|
+ /* Chain up to parent's method. */
|
|
+ E_COLLECTION_BACKEND_CLASS (e_yandex_backend_parent_class)->populate (backend);
|
|
+
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_backend_child_added (ECollectionBackend *backend,
|
|
+ ESource *child_source)
|
|
+{
|
|
+ ESource *collection_source;
|
|
+ const gchar *extension_name;
|
|
+ gboolean is_mail = FALSE;
|
|
+
|
|
+ /* Chain up to parent's child_added() method. */
|
|
+ E_COLLECTION_BACKEND_CLASS (e_yandex_backend_parent_class)->
|
|
+ child_added (backend, child_source);
|
|
+
|
|
+ collection_source = e_backend_get_source (E_BACKEND (backend));
|
|
+
|
|
+ extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT;
|
|
+ is_mail |= e_source_has_extension (child_source, extension_name);
|
|
+
|
|
+ extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
|
|
+ is_mail |= e_source_has_extension (child_source, extension_name);
|
|
+
|
|
+ extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT;
|
|
+ is_mail |= e_source_has_extension (child_source, extension_name);
|
|
+
|
|
+ /* Synchronize mail-related user with the collection identity. */
|
|
+ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
|
|
+ if (is_mail && e_source_has_extension (child_source, extension_name)) {
|
|
+ ESourceAuthentication *auth_child_extension;
|
|
+ ESourceCollection *collection_extension;
|
|
+ const gchar *collection_identity;
|
|
+ const gchar *auth_child_user;
|
|
+
|
|
+ extension_name = E_SOURCE_EXTENSION_COLLECTION;
|
|
+ collection_extension = e_source_get_extension (
|
|
+ collection_source, extension_name);
|
|
+ collection_identity = e_source_collection_get_identity (
|
|
+ collection_extension);
|
|
+
|
|
+ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
|
|
+ auth_child_extension = e_source_get_extension (
|
|
+ child_source, extension_name);
|
|
+ auth_child_user = e_source_authentication_get_user (
|
|
+ auth_child_extension);
|
|
+
|
|
+
|
|
+ if (auth_child_user == NULL)
|
|
+ e_source_authentication_set_user (
|
|
+ auth_child_extension,
|
|
+ collection_identity);
|
|
+
|
|
+ if (e_source_has_extension (child_source, E_SOURCE_EXTENSION_MAIL_ACCOUNT) ||
|
|
+ e_source_has_extension (child_source, E_SOURCE_EXTENSION_MAIL_TRANSPORT)) {
|
|
+ yandex_backend_mail_update_auth_method (backend, child_source, collection_source);
|
|
+ g_signal_connect (
|
|
+ child_source, "notify::oauth2-support",
|
|
+ G_CALLBACK (yandex_backend_mail_update_auth_method_cb),
|
|
+ backend);
|
|
+ }
|
|
+ }
|
|
+
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_backend_child_removed (ECollectionBackend *backend,
|
|
+ ESource *child_source)
|
|
+{
|
|
+ ESource *collection_source;
|
|
+ gboolean has_external_auth = FALSE;
|
|
+
|
|
+ /* Chain up to parent's method. */
|
|
+ E_COLLECTION_BACKEND_CLASS (e_yandex_backend_parent_class)->child_removed (backend, child_source);
|
|
+
|
|
+ collection_source = e_backend_get_source (E_BACKEND (backend));
|
|
+
|
|
+ if (e_source_has_extension (child_source, E_SOURCE_EXTENSION_AUTHENTICATION)) {
|
|
+ ESourceAuthentication *auth_child_extension;
|
|
+
|
|
+ auth_child_extension = e_source_get_extension (child_source, E_SOURCE_EXTENSION_AUTHENTICATION);
|
|
+ has_external_auth = e_source_authentication_get_is_external (auth_child_extension);
|
|
+ }
|
|
+
|
|
+ if (e_source_has_extension (child_source, E_SOURCE_EXTENSION_ADDRESS_BOOK) &&
|
|
+ e_source_has_extension (collection_source, E_SOURCE_EXTENSION_COLLECTION) &&
|
|
+ !has_external_auth) {
|
|
+ ESourceCollection *collection_extension;
|
|
+
|
|
+ collection_extension = e_source_get_extension (collection_source, E_SOURCE_EXTENSION_COLLECTION);
|
|
+
|
|
+ e_source_collection_set_contacts_enabled (collection_extension, FALSE);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+e_yandex_backend_class_init (EYandexBackendClass *class)
|
|
+{
|
|
+ EBackendClass *backend_class;
|
|
+ ECollectionBackendClass *collection_backend_class;
|
|
+
|
|
+ backend_class = E_BACKEND_CLASS (class);
|
|
+ backend_class->authenticate_sync = yandex_backend_authenticate_sync;
|
|
+
|
|
+ collection_backend_class = E_COLLECTION_BACKEND_CLASS (class);
|
|
+ collection_backend_class->populate = yandex_backend_populate;
|
|
+ collection_backend_class->child_added = yandex_backend_child_added;
|
|
+ collection_backend_class->child_removed = yandex_backend_child_removed;
|
|
+
|
|
+}
|
|
+
|
|
+static void
|
|
+e_yandex_backend_class_finalize (EYandexBackendClass *class)
|
|
+{
|
|
+}
|
|
+
|
|
+static void
|
|
+e_yandex_backend_init (EYandexBackend *backend)
|
|
+{
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_backend_prepare_mail_account_source (ESource *source)
|
|
+{
|
|
+ ESourceCamel *camel_extension;
|
|
+ ESourceExtension *extension;
|
|
+ CamelSettings *settings;
|
|
+ const gchar *backend_name;
|
|
+ const gchar *extension_name;
|
|
+
|
|
+ backend_name = YANDEX_IMAP_BACKEND_NAME;
|
|
+
|
|
+ extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT;
|
|
+ extension = e_source_get_extension (source, extension_name);
|
|
+
|
|
+ e_source_backend_set_backend_name (
|
|
+ E_SOURCE_BACKEND (extension), backend_name);
|
|
+
|
|
+ extension_name = e_source_camel_get_extension_name (backend_name);
|
|
+ camel_extension = e_source_get_extension (source, extension_name);
|
|
+ settings = e_source_camel_get_settings (camel_extension);
|
|
+
|
|
+ /* The "auth-mechanism" should be determined elsewhere. */
|
|
+
|
|
+ camel_network_settings_set_host (
|
|
+ CAMEL_NETWORK_SETTINGS (settings),
|
|
+ YANDEX_IMAP_HOST);
|
|
+
|
|
+ camel_network_settings_set_port (
|
|
+ CAMEL_NETWORK_SETTINGS (settings),
|
|
+ YANDEX_IMAP_PORT);
|
|
+
|
|
+ camel_network_settings_set_security_method (
|
|
+ CAMEL_NETWORK_SETTINGS (settings),
|
|
+ YANDEX_IMAP_SECURITY_METHOD);
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_backend_prepare_mail_transport_source (ESource *source)
|
|
+{
|
|
+ ESourceCamel *camel_extension;
|
|
+ ESourceExtension *extension;
|
|
+ CamelSettings *settings;
|
|
+ const gchar *backend_name;
|
|
+ const gchar *extension_name;
|
|
+
|
|
+ /* Configure the mail transport source. */
|
|
+
|
|
+ backend_name = YANDEX_SMTP_BACKEND_NAME;
|
|
+
|
|
+ extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT;
|
|
+ extension = e_source_get_extension (source, extension_name);
|
|
+
|
|
+ e_source_backend_set_backend_name (
|
|
+ E_SOURCE_BACKEND (extension), backend_name);
|
|
+
|
|
+ extension_name = e_source_camel_get_extension_name (backend_name);
|
|
+ camel_extension = e_source_get_extension (source, extension_name);
|
|
+ settings = e_source_camel_get_settings (camel_extension);
|
|
+
|
|
+ /* The "auth-mechanism" should be determined elsewhere. */
|
|
+
|
|
+ camel_network_settings_set_host (
|
|
+ CAMEL_NETWORK_SETTINGS (settings),
|
|
+ YANDEX_SMTP_HOST);
|
|
+
|
|
+ camel_network_settings_set_port (
|
|
+ CAMEL_NETWORK_SETTINGS (settings),
|
|
+ YANDEX_SMTP_PORT);
|
|
+
|
|
+ camel_network_settings_set_security_method (
|
|
+ CAMEL_NETWORK_SETTINGS (settings),
|
|
+ YANDEX_SMTP_SECURITY_METHOD);
|
|
+}
|
|
+
|
|
+static void
|
|
+yandex_backend_factory_prepare_mail (ECollectionBackendFactory *factory,
|
|
+ ESource *mail_account_source,
|
|
+ ESource *mail_identity_source,
|
|
+ ESource *mail_transport_source)
|
|
+{
|
|
+ ECollectionBackendFactoryClass *parent_class;
|
|
+
|
|
+ /* Chain up to parent's prepare_mail() method. */
|
|
+ parent_class =
|
|
+ E_COLLECTION_BACKEND_FACTORY_CLASS (
|
|
+ e_yandex_backend_factory_parent_class);
|
|
+ parent_class->prepare_mail (
|
|
+ factory,
|
|
+ mail_account_source,
|
|
+ mail_identity_source,
|
|
+ mail_transport_source);
|
|
+
|
|
+ yandex_backend_prepare_mail_account_source (mail_account_source);
|
|
+ yandex_backend_prepare_mail_transport_source (mail_transport_source);
|
|
+}
|
|
+
|
|
+static void
|
|
+e_yandex_backend_factory_class_init (EYandexBackendFactoryClass *class)
|
|
+{
|
|
+ ECollectionBackendFactoryClass *factory_class;
|
|
+
|
|
+ factory_class = E_COLLECTION_BACKEND_FACTORY_CLASS (class);
|
|
+ factory_class->factory_name = "yandex";
|
|
+ factory_class->backend_type = E_TYPE_YANDEX_BACKEND;
|
|
+ factory_class->prepare_mail = yandex_backend_factory_prepare_mail;
|
|
+}
|
|
+
|
|
+static void
|
|
+e_yandex_backend_factory_class_finalize (EYandexBackendFactoryClass *class)
|
|
+{
|
|
+}
|
|
+
|
|
+static void
|
|
+e_yandex_backend_factory_init (EYandexBackendFactory *factory)
|
|
+{
|
|
+}
|
|
+
|
|
+G_MODULE_EXPORT void
|
|
+e_module_load (GTypeModule *type_module)
|
|
+{
|
|
+ e_yandex_backend_register_type (type_module);
|
|
+ e_yandex_backend_factory_register_type (type_module);
|
|
+}
|
|
+
|
|
+G_MODULE_EXPORT void
|
|
+e_module_unload (GTypeModule *type_module)
|
|
+{
|
|
+}
|
|
+
|
|
--
|
|
2.39.1
|
|
|