|
|
From 2212488b777035a619633284515c657075c9ed0d Mon Sep 17 00:00:00 2001
|
|
|
From: Dmitry Samoylik <Dmitriy.Samoylik@softline.com>
|
|
|
Date: Mon, 10 Feb 2025 14:30:49 +0300
|
|
|
Subject: [PATCH] Added yandex provider
|
|
|
|
|
|
---
|
|
|
data/icons/meson.build | 2 +
|
|
|
data/icons/scalable/goa-account-yandex.svg | 45 ++
|
|
|
.../symbolic/goa-account-yandex-symbolic.svg | 45 ++
|
|
|
meson.build | 12 +
|
|
|
meson_options.txt | 4 +
|
|
|
src/goabackend/goaoauth2handler.c | 7 +
|
|
|
src/goabackend/goaprovider.c | 4 +
|
|
|
src/goabackend/goayandexprovider.c | 402 ++++++++++++++++++
|
|
|
src/goabackend/goayandexprovider.h | 37 ++
|
|
|
src/goabackend/meson.build | 1 +
|
|
|
10 files changed, 559 insertions(+)
|
|
|
create mode 100644 data/icons/scalable/goa-account-yandex.svg
|
|
|
create mode 100644 data/icons/symbolic/goa-account-yandex-symbolic.svg
|
|
|
create mode 100644 src/goabackend/goayandexprovider.c
|
|
|
create mode 100644 src/goabackend/goayandexprovider.h
|
|
|
|
|
|
diff --git a/data/icons/meson.build b/data/icons/meson.build
|
|
|
index fdc661a..e32b7cf 100644
|
|
|
--- a/data/icons/meson.build
|
|
|
+++ b/data/icons/meson.build
|
|
|
@@ -6,6 +6,7 @@ icon_scalable_data = [
|
|
|
'goa-account-ms365.svg',
|
|
|
'goa-account-msn.svg',
|
|
|
'goa-account-owncloud.svg',
|
|
|
+ 'goa-account-yandex.svg',
|
|
|
]
|
|
|
|
|
|
icon_symbolic_data = [
|
|
|
@@ -14,6 +15,7 @@ icon_symbolic_data = [
|
|
|
'goa-account-google-symbolic.svg',
|
|
|
'goa-account-msn-symbolic.svg',
|
|
|
'goa-account-owncloud-symbolic.svg',
|
|
|
+ 'goa-account-yandex-symbolic.svg',
|
|
|
]
|
|
|
|
|
|
icons = [
|
|
|
diff --git a/data/icons/scalable/goa-account-yandex.svg b/data/icons/scalable/goa-account-yandex.svg
|
|
|
new file mode 100644
|
|
|
index 0000000..dd7624f
|
|
|
--- /dev/null
|
|
|
+++ b/data/icons/scalable/goa-account-yandex.svg
|
|
|
@@ -0,0 +1,45 @@
|
|
|
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
|
+<svg
|
|
|
+ width="128"
|
|
|
+ height="128"
|
|
|
+ fill="none"
|
|
|
+ version="1.1"
|
|
|
+ id="svg6"
|
|
|
+ sodipodi:docname="goa-account-yandex.svg"
|
|
|
+ inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
|
|
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
|
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
|
+ xmlns="http://www.w3.org/2000/svg"
|
|
|
+ xmlns:svg="http://www.w3.org/2000/svg">
|
|
|
+ <defs
|
|
|
+ id="defs10" />
|
|
|
+ <sodipodi:namedview
|
|
|
+ id="namedview8"
|
|
|
+ pagecolor="#ffffff"
|
|
|
+ bordercolor="#666666"
|
|
|
+ borderopacity="1.0"
|
|
|
+ inkscape:pageshadow="2"
|
|
|
+ inkscape:pageopacity="0.0"
|
|
|
+ inkscape:pagecheckerboard="0"
|
|
|
+ showgrid="false"
|
|
|
+ inkscape:zoom="3.1041667"
|
|
|
+ inkscape:cx="6.6040268"
|
|
|
+ inkscape:cy="32.214765"
|
|
|
+ inkscape:window-width="1600"
|
|
|
+ inkscape:window-height="831"
|
|
|
+ inkscape:window-x="0"
|
|
|
+ inkscape:window-y="0"
|
|
|
+ inkscape:window-maximized="1"
|
|
|
+ inkscape:current-layer="svg6"
|
|
|
+ units="px" />
|
|
|
+ <path
|
|
|
+ d="m 2.8068309,62.777027 c 0,-33.16674 26.8792921,-60.0520375 60.0520371,-60.0520375 33.160731,0 60.052032,26.8852975 60.052032,60.0520375 0,33.166747 -26.891301,60.052043 -60.052032,60.052043 -33.172745,0 -60.0520371,-26.885296 -60.0520371,-60.052043 z"
|
|
|
+ fill="#fc3f1d"
|
|
|
+ id="path2"
|
|
|
+ style="stroke-width:6.0052" />
|
|
|
+ <path
|
|
|
+ d="m 72.133795,26.165699 h -7.118289 c -13.050211,0 -19.91428,6.609848 -19.91428,16.355126 0,11.016409 4.745529,16.177946 14.490817,22.79549 l 8.050452,5.423463 -23.134456,34.566882 H 27.220758 L 47.982446,74.383659 C 36.041588,65.824765 29.339297,57.512386 29.339297,43.452989 c 0,-17.626257 12.287531,-29.659558 35.591462,-29.659558 H 88.065216 V 105.22192 H 72.133795 Z"
|
|
|
+ fill="#ffffff"
|
|
|
+ id="path4"
|
|
|
+ style="stroke-width:7.70379" />
|
|
|
+</svg>
|
|
|
diff --git a/data/icons/symbolic/goa-account-yandex-symbolic.svg b/data/icons/symbolic/goa-account-yandex-symbolic.svg
|
|
|
new file mode 100644
|
|
|
index 0000000..528713f
|
|
|
--- /dev/null
|
|
|
+++ b/data/icons/symbolic/goa-account-yandex-symbolic.svg
|
|
|
@@ -0,0 +1,45 @@
|
|
|
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
|
+<svg
|
|
|
+ width="16"
|
|
|
+ height="16"
|
|
|
+ fill="none"
|
|
|
+ version="1.1"
|
|
|
+ id="svg6"
|
|
|
+ sodipodi:docname="goa-account-yandex.svg"
|
|
|
+ inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
|
|
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
|
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
|
+ xmlns="http://www.w3.org/2000/svg"
|
|
|
+ xmlns:svg="http://www.w3.org/2000/svg">
|
|
|
+ <defs
|
|
|
+ id="defs10" />
|
|
|
+ <sodipodi:namedview
|
|
|
+ id="namedview8"
|
|
|
+ pagecolor="#ffffff"
|
|
|
+ bordercolor="#666666"
|
|
|
+ borderopacity="1.0"
|
|
|
+ inkscape:pageshadow="2"
|
|
|
+ inkscape:pageopacity="0.0"
|
|
|
+ inkscape:pagecheckerboard="0"
|
|
|
+ showgrid="false"
|
|
|
+ inkscape:zoom="24.833333"
|
|
|
+ inkscape:cx="19.42953"
|
|
|
+ inkscape:cy="12"
|
|
|
+ inkscape:window-width="1600"
|
|
|
+ inkscape:window-height="831"
|
|
|
+ inkscape:window-x="0"
|
|
|
+ inkscape:window-y="0"
|
|
|
+ inkscape:window-maximized="1"
|
|
|
+ inkscape:current-layer="svg6"
|
|
|
+ units="px" />
|
|
|
+ <path
|
|
|
+ d="m 1.1935759,7.6916685 c 0,-3.8106297 3.0882453,-6.8995649 6.8995649,-6.8995649 3.8099392,0 6.8995642,3.0889352 6.8995642,6.8995649 0,3.8106305 -3.089625,6.8995655 -6.8995642,6.8995655 -3.8113196,0 -6.8995649,-3.088935 -6.8995649,-6.8995655 z"
|
|
|
+ fill="#fc3f1d"
|
|
|
+ id="path2"
|
|
|
+ style="stroke-width:0.689956" />
|
|
|
+ <path
|
|
|
+ d="m 9.0981498,3.9138576 h -0.803668 c -1.4733923,0 -2.2483582,0.7462635 -2.2483582,1.8465241 0,1.2437728 0.5357789,1.8265194 1.6360394,2.5736529 L 8.5910746,8.9463533 5.9791511,12.849017 H 4.0273847 L 6.3714179,9.3577547 C 5.0232728,8.3914394 4.2665717,7.4529564 4.2665717,5.8656241 c 0,-1.9900365 1.3872851,-3.348619 4.0183427,-3.348619 H 10.896837 V 12.83945 H 9.0981498 Z"
|
|
|
+ fill="#ffffff"
|
|
|
+ id="path4"
|
|
|
+ style="stroke-width:0.869772" />
|
|
|
+</svg>
|
|
|
diff --git a/meson.build b/meson.build
|
|
|
index 95e17de..9d08775 100644
|
|
|
--- a/meson.build
|
|
|
+++ b/meson.build
|
|
|
@@ -174,6 +174,18 @@ config_h.set_quoted('GOA_GOOGLE_CLIENT_SECRET', google_client_secret)
|
|
|
enable_google = get_option('google')
|
|
|
config_h.set('GOA_GOOGLE_ENABLED', enable_google)
|
|
|
|
|
|
+# Yandex
|
|
|
+config_h.set_quoted('GOA_YANDEX_NAME', 'yandex')
|
|
|
+
|
|
|
+yandex_client_id = get_option('yandex_client_id')
|
|
|
+config_h.set_quoted('GOA_YANDEX_CLIENT_ID', yandex_client_id)
|
|
|
+
|
|
|
+yandex_client_secret = get_option('yandex_client_secret')
|
|
|
+config_h.set_quoted('GOA_YANDEX_CLIENT_SECRET', yandex_client_secret)
|
|
|
+
|
|
|
+enable_yandex = get_option('yandex')
|
|
|
+config_h.set('GOA_YANDEX_ENABLED', enable_yandex)
|
|
|
+
|
|
|
# IMAP/SMTP
|
|
|
config_h.set_quoted('GOA_IMAP_SMTP_NAME', 'imap_smtp')
|
|
|
|
|
|
diff --git a/meson_options.txt b/meson_options.txt
|
|
|
index 7b2d208..dfe22af 100644
|
|
|
--- a/meson_options.txt
|
|
|
+++ b/meson_options.txt
|
|
|
@@ -8,6 +8,10 @@ option('google', type: 'boolean', value: true, description: 'Enable Google provi
|
|
|
option('google_client_id', type: 'string', value: '44438659992-7kgjeitenc16ssihbtdjbgguch7ju55s.apps.googleusercontent.com', description: 'Google OAuth 2.0 client id')
|
|
|
option('google_client_secret', type: 'string', value: '-gMLuQyDiI0XrQS_vx_mhuYF', description: 'Google OAuth 2.0 client secret')
|
|
|
|
|
|
+option('yandex', type: 'boolean', value: true, description: 'Enable Yandex provider')
|
|
|
+option('yandex_client_id', type: 'string', value: 'aab3f89a0d504003bfa3bb5326f68575', description: 'Yandex OAuth 2.0 client id')
|
|
|
+option('yandex_client_secret', type: 'string', value: '4e6f4755f2ec457e9a80f0f43683fc32', description: 'Yandex OAuth 2.0 client secret')
|
|
|
+
|
|
|
option('imap_smtp', type: 'boolean', value: true, description: 'Enable IMAP/SMTP provider')
|
|
|
|
|
|
option('kerberos', type: 'boolean', value: true, description: 'Enable kerberos provider')
|
|
|
diff --git a/src/goabackend/goaoauth2handler.c b/src/goabackend/goaoauth2handler.c
|
|
|
index d510d3b..cd295c4 100644
|
|
|
--- a/src/goabackend/goaoauth2handler.c
|
|
|
+++ b/src/goabackend/goaoauth2handler.c
|
|
|
@@ -56,6 +56,11 @@ oauth2_providers[] =
|
|
|
{
|
|
|
.client_id = GOA_MS_GRAPH_CLIENT_ID,
|
|
|
},
|
|
|
+#endif
|
|
|
+#ifdef GOA_YANDEX_ENABLED
|
|
|
+ {
|
|
|
+ .client_id = GOA_YANDEX_CLIENT_ID,
|
|
|
+ },
|
|
|
#endif
|
|
|
{ NULL },
|
|
|
};
|
|
|
@@ -141,6 +146,8 @@ main (int argc,
|
|
|
return EXIT_FAILURE;
|
|
|
}
|
|
|
|
|
|
+ g_printerr("argv1: %s client_id: %s \n", argv[1], client_id);
|
|
|
+
|
|
|
if (!secret_password_store_sync (&oauth2_schema,
|
|
|
SECRET_COLLECTION_SESSION,
|
|
|
"GNOME Online Accounts OAuth2 URI",
|
|
|
diff --git a/src/goabackend/goaprovider.c b/src/goabackend/goaprovider.c
|
|
|
index b763c1e..1e5ce4f 100644
|
|
|
--- a/src/goabackend/goaprovider.c
|
|
|
+++ b/src/goabackend/goaprovider.c
|
|
|
@@ -30,6 +30,7 @@
|
|
|
#include "goawebdavprovider.h"
|
|
|
#include "goawindowsliveprovider.h"
|
|
|
#include "goamsgraphprovider.h"
|
|
|
+#include "goayandexprovider.h"
|
|
|
|
|
|
#ifdef GOA_FEDORA_ENABLED
|
|
|
#include "goafedoraprovider.h"
|
|
|
@@ -1176,6 +1177,9 @@ static struct
|
|
|
* important because it affects the order in which they are
|
|
|
* returned by goa_provider_get_all.
|
|
|
*/
|
|
|
+#ifdef GOA_YANDEX_ENABLED
|
|
|
+ { GOA_YANDEX_NAME, goa_yandex_provider_get_type },
|
|
|
+#endif
|
|
|
#ifdef GOA_GOOGLE_ENABLED
|
|
|
{ GOA_GOOGLE_NAME, goa_google_provider_get_type },
|
|
|
#endif
|
|
|
diff --git a/src/goabackend/goayandexprovider.c b/src/goabackend/goayandexprovider.c
|
|
|
new file mode 100644
|
|
|
index 0000000..d8c79a9
|
|
|
--- /dev/null
|
|
|
+++ b/src/goabackend/goayandexprovider.c
|
|
|
@@ -0,0 +1,402 @@
|
|
|
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
|
+/*
|
|
|
+ * Copyright © 2011 – 2017 Red Hat, Inc.
|
|
|
+ *
|
|
|
+ * 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; either
|
|
|
+ * version 2 of the License, or (at your option) any later version.
|
|
|
+ *
|
|
|
+ * 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 "config.h"
|
|
|
+#include <glib/gi18n-lib.h>
|
|
|
+
|
|
|
+#include <rest/rest.h>
|
|
|
+#include <json-glib/json-glib.h>
|
|
|
+
|
|
|
+#include "goaprovider.h"
|
|
|
+#include "goaprovider-priv.h"
|
|
|
+#include "goaoauth2provider.h"
|
|
|
+#include "goayandexprovider.h"
|
|
|
+#include "goaobjectskeletonutils.h"
|
|
|
+#include "goarestproxy.h"
|
|
|
+
|
|
|
+struct _GoaYandexProvider
|
|
|
+{
|
|
|
+ GoaOAuth2Provider parent_instance;
|
|
|
+ gchar *redirect_uri;
|
|
|
+};
|
|
|
+
|
|
|
+G_DEFINE_TYPE_WITH_CODE (GoaYandexProvider, goa_yandex_provider, GOA_TYPE_OAUTH2_PROVIDER,
|
|
|
+ goa_provider_ensure_extension_points_registered ();
|
|
|
+ g_io_extension_point_implement (GOA_PROVIDER_EXTENSION_POINT_NAME,
|
|
|
+ g_define_type_id,
|
|
|
+ GOA_YANDEX_NAME,
|
|
|
+ 0));
|
|
|
+
|
|
|
+/* ---------------------------------------------------------------------------------------------------- */
|
|
|
+
|
|
|
+static const gchar *
|
|
|
+get_provider_type (GoaProvider *provider)
|
|
|
+{
|
|
|
+ return GOA_YANDEX_NAME;
|
|
|
+}
|
|
|
+
|
|
|
+static gchar *
|
|
|
+get_provider_name (GoaProvider *provider,
|
|
|
+ GoaObject *object)
|
|
|
+{
|
|
|
+ return g_strdup (_("Yandex"));
|
|
|
+}
|
|
|
+
|
|
|
+static GoaProviderGroup
|
|
|
+get_provider_group (GoaProvider *provider)
|
|
|
+{
|
|
|
+ return GOA_PROVIDER_GROUP_BRANDED;
|
|
|
+}
|
|
|
+
|
|
|
+static GoaProviderFeatures
|
|
|
+get_provider_features (GoaProvider *provider)
|
|
|
+{
|
|
|
+ return GOA_PROVIDER_FEATURE_BRANDED |
|
|
|
+ GOA_PROVIDER_FEATURE_MAIL |
|
|
|
+ GOA_PROVIDER_FEATURE_CALENDAR |
|
|
|
+// GOA_PROVIDER_FEATURE_CONTACTS |
|
|
|
+ GOA_PROVIDER_FEATURE_FILES;
|
|
|
+}
|
|
|
+
|
|
|
+static const gchar *
|
|
|
+get_authorization_uri (GoaOAuth2Provider *oauth2_provider)
|
|
|
+{
|
|
|
+ return "https://oauth.yandex.ru/authorize";
|
|
|
+}
|
|
|
+
|
|
|
+static const gchar *
|
|
|
+get_token_uri (GoaOAuth2Provider *oauth2_provider)
|
|
|
+{
|
|
|
+ return "https://oauth.yandex.ru/token";
|
|
|
+}
|
|
|
+
|
|
|
+static const gchar *
|
|
|
+get_redirect_uri (GoaOAuth2Provider *oauth2_provider)
|
|
|
+{
|
|
|
+ G_LOCK_DEFINE_STATIC (redirect_uri);
|
|
|
+ GoaYandexProvider *self = GOA_YANDEX_PROVIDER (oauth2_provider);
|
|
|
+
|
|
|
+ G_LOCK (redirect_uri);
|
|
|
+
|
|
|
+ if (!self->redirect_uri) {
|
|
|
+ self->redirect_uri = g_strconcat ("goa-oauth2://localhost/", GOA_YANDEX_CLIENT_ID, NULL);
|
|
|
+ // self->redirect_uri = GOA_YANDEX_CLIENT_ID":goa-oauth2://localhost/";
|
|
|
+ // self->redirect_uri = "goa-oauth2://localhost/";
|
|
|
+ }
|
|
|
+
|
|
|
+ G_UNLOCK (redirect_uri);
|
|
|
+
|
|
|
+ return self->redirect_uri;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+static const gchar *
|
|
|
+get_scope (GoaOAuth2Provider *oauth2_provider)
|
|
|
+{
|
|
|
+ return "login:email login:info mail:imap_full mail:imap_ro mail:smtp calendar:all yadisk:disk cloud_api:disk.read cloud_api:disk.write";
|
|
|
+}
|
|
|
+
|
|
|
+static guint
|
|
|
+get_credentials_generation (GoaProvider *provider)
|
|
|
+{
|
|
|
+ return 37;
|
|
|
+}
|
|
|
+
|
|
|
+static const gchar *
|
|
|
+get_client_id (GoaOAuth2Provider *oauth2_provider)
|
|
|
+{
|
|
|
+ return GOA_YANDEX_CLIENT_ID;
|
|
|
+}
|
|
|
+
|
|
|
+static const gchar *
|
|
|
+get_client_secret (GoaOAuth2Provider *oauth2_provider)
|
|
|
+{
|
|
|
+ return GOA_YANDEX_CLIENT_SECRET;
|
|
|
+}
|
|
|
+
|
|
|
+static gboolean
|
|
|
+get_use_pkce (GoaOAuth2Provider *oauth2_provider)
|
|
|
+{
|
|
|
+ return FALSE;
|
|
|
+}
|
|
|
+
|
|
|
+/* ---------------------------------------------------------------------------------------------------- */
|
|
|
+
|
|
|
+static gchar *
|
|
|
+get_identity_sync (GoaOAuth2Provider *oauth2_provider,
|
|
|
+ const gchar *access_token,
|
|
|
+ gchar **out_presentation_identity,
|
|
|
+ GCancellable *cancellable,
|
|
|
+ GError **error)
|
|
|
+{
|
|
|
+ GError *identity_error = NULL;
|
|
|
+ RestProxy *proxy = NULL;
|
|
|
+ RestProxyCall *call = NULL;
|
|
|
+ JsonParser *parser = NULL;
|
|
|
+ JsonObject *json_object;
|
|
|
+ gchar *ret = NULL;
|
|
|
+ gchar *id = NULL;
|
|
|
+
|
|
|
+ /* TODO: cancellable */
|
|
|
+
|
|
|
+ proxy = goa_rest_proxy_new ("https://login.yandex.ru/info", FALSE);
|
|
|
+ call = rest_proxy_new_call (proxy);
|
|
|
+ rest_proxy_call_set_method (call, "GET");
|
|
|
+ rest_proxy_call_add_param (call, "oauth_token", access_token);
|
|
|
+
|
|
|
+ if (!rest_proxy_call_sync (call, error))
|
|
|
+ goto out;
|
|
|
+ if (rest_proxy_call_get_status_code (call) != 200)
|
|
|
+ {
|
|
|
+ g_set_error (error,
|
|
|
+ GOA_ERROR,
|
|
|
+ GOA_ERROR_FAILED,
|
|
|
+ _("Expected status 200 when requesting your identity, instead got status %d (%s)"),
|
|
|
+ rest_proxy_call_get_status_code (call),
|
|
|
+ rest_proxy_call_get_status_message (call));
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ parser = json_parser_new ();
|
|
|
+ if (!json_parser_load_from_data (parser,
|
|
|
+ rest_proxy_call_get_payload (call),
|
|
|
+ rest_proxy_call_get_payload_length (call),
|
|
|
+ &identity_error))
|
|
|
+ {
|
|
|
+ g_warning ("json_parser_load_from_data() failed: %s (%s, %d)",
|
|
|
+ identity_error->message,
|
|
|
+ g_quark_to_string (identity_error->domain),
|
|
|
+ identity_error->code);
|
|
|
+ g_set_error (error,
|
|
|
+ GOA_ERROR,
|
|
|
+ GOA_ERROR_FAILED,
|
|
|
+ _("Could not parse response"));
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ json_object = json_node_get_object (json_parser_get_root (parser));
|
|
|
+ if (!json_object_has_member (json_object, "default_email"))
|
|
|
+ {
|
|
|
+ g_warning ("Did not find emails in JSON data");
|
|
|
+ g_set_error (error,
|
|
|
+ GOA_ERROR,
|
|
|
+ GOA_ERROR_FAILED,
|
|
|
+ _("Could not parse response"));
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ id = g_strdup (json_object_get_string_member (json_object, "default_email"));
|
|
|
+
|
|
|
+ ret = id;
|
|
|
+ id = NULL;
|
|
|
+ if (out_presentation_identity != NULL)
|
|
|
+ *out_presentation_identity = g_strdup(ret);
|
|
|
+
|
|
|
+ out:
|
|
|
+ g_clear_object (&parser);
|
|
|
+ g_clear_error (&identity_error);
|
|
|
+ g_clear_object (&call);
|
|
|
+ g_clear_object (&proxy);
|
|
|
+ g_free (id);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/* ---------------------------------------------------------------------------------------------------- */
|
|
|
+
|
|
|
+static gboolean
|
|
|
+build_object (GoaProvider *provider,
|
|
|
+ GoaObjectSkeleton *object,
|
|
|
+ GKeyFile *key_file,
|
|
|
+ const gchar *group,
|
|
|
+ GDBusConnection *connection,
|
|
|
+ gboolean just_added,
|
|
|
+ GError **error)
|
|
|
+{
|
|
|
+ GoaAccount *account = NULL;
|
|
|
+ GoaMail *mail = NULL;
|
|
|
+ gchar *uri_caldav;
|
|
|
+ gchar *uri_drive;
|
|
|
+ gchar *uri_carddav;
|
|
|
+ gboolean ret = FALSE;
|
|
|
+ gboolean mail_enabled;
|
|
|
+ gboolean files_enabled;
|
|
|
+ gboolean calendar_enabled;
|
|
|
+ gboolean contacts_enabled;
|
|
|
+ const gchar *email_address;
|
|
|
+ gchar *u_name, *u_name_pos;
|
|
|
+
|
|
|
+ /* Chain up */
|
|
|
+ if (!GOA_PROVIDER_CLASS (goa_yandex_provider_parent_class)->build_object (provider,
|
|
|
+ object,
|
|
|
+ key_file,
|
|
|
+ group,
|
|
|
+ connection,
|
|
|
+ just_added,
|
|
|
+ error))
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ account = goa_object_get_account (GOA_OBJECT (object));
|
|
|
+ email_address = goa_account_get_identity (account);
|
|
|
+
|
|
|
+ /* Email */
|
|
|
+ mail = goa_object_get_mail (GOA_OBJECT (object));
|
|
|
+ mail_enabled = g_key_file_get_boolean (key_file, group, "MailEnabled", NULL);
|
|
|
+ if (mail_enabled)
|
|
|
+ {
|
|
|
+ if (mail == NULL)
|
|
|
+ {
|
|
|
+ mail = goa_mail_skeleton_new ();
|
|
|
+ g_object_set (G_OBJECT (mail),
|
|
|
+ "email-address", email_address,
|
|
|
+ "imap-supported", TRUE,
|
|
|
+ "imap-host", "imap.yandex.ru",
|
|
|
+ "imap-user-name", email_address,
|
|
|
+ "imap-use-ssl", TRUE,
|
|
|
+ "smtp-supported", TRUE,
|
|
|
+ "smtp-host", "smtp.yandex.ru",
|
|
|
+ "smtp-user-name", email_address,
|
|
|
+ "smtp-use-auth", TRUE,
|
|
|
+ "smtp-auth-xoauth2", TRUE,
|
|
|
+ "smtp-use-ssl", TRUE,
|
|
|
+ "smtp-use-tls", TRUE,
|
|
|
+ NULL);
|
|
|
+ goa_object_skeleton_set_mail (object, mail);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (mail != NULL)
|
|
|
+ goa_object_skeleton_set_mail (object, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Calendar */
|
|
|
+ calendar_enabled = g_key_file_get_boolean (key_file, group, "CalendarEnabled", NULL);
|
|
|
+ uri_caldav = g_strconcat ("https://caldav.yandex.ru/", NULL);
|
|
|
+ goa_object_skeleton_attach_calendar (object, uri_caldav, calendar_enabled, FALSE);
|
|
|
+ g_free (uri_caldav);
|
|
|
+
|
|
|
+ /* Contacts */
|
|
|
+ // contacts_enabled = g_key_file_get_boolean (key_file, group, "ContactsEnabled", NULL);
|
|
|
+ // uri_carddav = g_strconcat ("https://carddav.yandex.ru/", NULL);
|
|
|
+ // goa_object_skeleton_attach_contacts (object, uri_carddav, contacts_enabled, FALSE);
|
|
|
+ // g_free (uri_carddav);
|
|
|
+
|
|
|
+ /* Files */
|
|
|
+ files_enabled = g_key_file_get_boolean (key_file, group, "FilesEnabled", NULL);
|
|
|
+ u_name = g_strdup(email_address);
|
|
|
+ u_name_pos = g_utf8_strchr(u_name, -1, '@');
|
|
|
+ if (u_name_pos){
|
|
|
+ *u_name_pos = '\0';
|
|
|
+ }
|
|
|
+ uri_drive = g_strconcat ("davs://", u_name, "@webdav.yandex.ru/", NULL);
|
|
|
+ goa_object_skeleton_attach_files (object, uri_drive, files_enabled, FALSE);
|
|
|
+ g_free (u_name);
|
|
|
+ g_free (uri_drive);
|
|
|
+
|
|
|
+
|
|
|
+ if (just_added)
|
|
|
+ {
|
|
|
+ goa_account_set_mail_disabled (account, !mail_enabled);
|
|
|
+ goa_account_set_calendar_disabled (account, !calendar_enabled);
|
|
|
+ goa_account_set_contacts_disabled (account, !contacts_enabled);
|
|
|
+ goa_account_set_files_disabled (account, !files_enabled);
|
|
|
+
|
|
|
+ g_signal_connect (account,
|
|
|
+ "notify::mail-disabled",
|
|
|
+ G_CALLBACK (goa_util_account_notify_property_cb),
|
|
|
+ (gpointer) "MailEnabled");
|
|
|
+ g_signal_connect (account,
|
|
|
+ "notify::calendar-disabled",
|
|
|
+ G_CALLBACK (goa_util_account_notify_property_cb),
|
|
|
+ (gpointer) "CalendarEnabled");
|
|
|
+ // g_signal_connect (account,
|
|
|
+ // "notify::contacts-disabled",
|
|
|
+ // G_CALLBACK (goa_util_account_notify_property_cb),
|
|
|
+ // (gpointer) "ContactsEnabled");
|
|
|
+ g_signal_connect (account,
|
|
|
+ "notify::files-disabled",
|
|
|
+ G_CALLBACK (goa_util_account_notify_property_cb),
|
|
|
+ (gpointer) "FilesEnabled");
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = TRUE;
|
|
|
+
|
|
|
+ out:
|
|
|
+ g_clear_object (&mail);
|
|
|
+ g_clear_object (&account);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/* ---------------------------------------------------------------------------------------------------- */
|
|
|
+
|
|
|
+static void
|
|
|
+add_account_key_values (GoaOAuth2Provider *oauth2_provider,
|
|
|
+ GVariantBuilder *builder)
|
|
|
+{
|
|
|
+ g_variant_builder_add (builder, "{ss}", "MailEnabled", "true");
|
|
|
+ g_variant_builder_add (builder, "{ss}", "CalendarEnabled", "true");
|
|
|
+ // g_variant_builder_add (builder, "{ss}", "ContactsEnabled", "true");
|
|
|
+ g_variant_builder_add (builder, "{ss}", "FilesEnabled", "true");
|
|
|
+}
|
|
|
+
|
|
|
+/* ---------------------------------------------------------------------------------------------------- */
|
|
|
+
|
|
|
+static void
|
|
|
+goa_yandex_finalize (GObject *object)
|
|
|
+{
|
|
|
+ GoaYandexProvider *self = GOA_YANDEX_PROVIDER (object);
|
|
|
+
|
|
|
+ g_free (self->redirect_uri);
|
|
|
+
|
|
|
+ G_OBJECT_CLASS (goa_yandex_provider_parent_class)->finalize (object);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+goa_yandex_provider_init (GoaYandexProvider *self)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+goa_yandex_provider_class_init (GoaYandexProviderClass *klass)
|
|
|
+{
|
|
|
+ GoaProviderClass *provider_class;
|
|
|
+ GoaOAuth2ProviderClass *oauth2_class;
|
|
|
+ GObjectClass *object_class;
|
|
|
+
|
|
|
+ object_class = G_OBJECT_CLASS (klass);
|
|
|
+ object_class->finalize = goa_yandex_finalize;
|
|
|
+
|
|
|
+ provider_class = GOA_PROVIDER_CLASS (klass);
|
|
|
+ provider_class->get_provider_type = get_provider_type;
|
|
|
+ provider_class->get_provider_name = get_provider_name;
|
|
|
+ provider_class->get_provider_group = get_provider_group;
|
|
|
+ provider_class->get_provider_features = get_provider_features;
|
|
|
+ provider_class->build_object = build_object;
|
|
|
+ provider_class->get_credentials_generation = get_credentials_generation;
|
|
|
+
|
|
|
+ oauth2_class = GOA_OAUTH2_PROVIDER_CLASS (klass);
|
|
|
+ oauth2_class->get_authorization_uri = get_authorization_uri;
|
|
|
+ oauth2_class->get_client_id = get_client_id;
|
|
|
+ oauth2_class->get_client_secret = get_client_secret;
|
|
|
+ oauth2_class->get_identity_sync = get_identity_sync;
|
|
|
+ oauth2_class->get_redirect_uri = get_redirect_uri;
|
|
|
+ oauth2_class->get_scope = get_scope;
|
|
|
+ oauth2_class->get_token_uri = get_token_uri;
|
|
|
+ oauth2_class->get_use_pkce = get_use_pkce;
|
|
|
+ oauth2_class->add_account_key_values = add_account_key_values;
|
|
|
+}
|
|
|
diff --git a/src/goabackend/goayandexprovider.h b/src/goabackend/goayandexprovider.h
|
|
|
new file mode 100644
|
|
|
index 0000000..bd4315f
|
|
|
--- /dev/null
|
|
|
+++ b/src/goabackend/goayandexprovider.h
|
|
|
@@ -0,0 +1,37 @@
|
|
|
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
|
+/*
|
|
|
+ * Copyright © 2011 – 2017 Red Hat, Inc.
|
|
|
+ *
|
|
|
+ * 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; either
|
|
|
+ * version 2 of the License, or (at your option) any later version.
|
|
|
+ *
|
|
|
+ * 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 (__GOA_BACKEND_INSIDE_GOA_BACKEND_H__) && !defined (GOA_BACKEND_COMPILATION)
|
|
|
+#error "Only <goabackend/goabackend.h> can be included directly."
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef __GOA_YANDEX_PROVIDER_H__
|
|
|
+#define __GOA_YANDEX_PROVIDER_H__
|
|
|
+
|
|
|
+#include <glib-object.h>
|
|
|
+
|
|
|
+#include "goaoauth2provider-priv.h"
|
|
|
+
|
|
|
+G_BEGIN_DECLS
|
|
|
+
|
|
|
+#define GOA_TYPE_YANDEX_PROVIDER (goa_yandex_provider_get_type ())
|
|
|
+G_DECLARE_FINAL_TYPE (GoaYandexProvider, goa_yandex_provider, GOA, YANDEX_PROVIDER, GoaOAuth2Provider);
|
|
|
+
|
|
|
+G_END_DECLS
|
|
|
+
|
|
|
+#endif /* __GOA_YANDEX_PROVIDER_H__ */
|
|
|
diff --git a/src/goabackend/meson.build b/src/goabackend/meson.build
|
|
|
index 150a9fb..23dda34 100644
|
|
|
--- a/src/goabackend/meson.build
|
|
|
+++ b/src/goabackend/meson.build
|
|
|
@@ -26,6 +26,7 @@ libgoa_backend_sources = files(
|
|
|
'goautils.c',
|
|
|
'goawebdavprovider.c',
|
|
|
'goawindowsliveprovider.c',
|
|
|
+ 'goayandexprovider.c',
|
|
|
)
|
|
|
|
|
|
enum_headers = files('goabackendenums.h')
|
|
|
--
|
|
|
2.39.5
|
|
|
|