[epiphany] sync: Use WebChannels communication to sign in
- From: Gabriel Ivașcu <gabrielivascu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany] sync: Use WebChannels communication to sign in
- Date: Tue, 30 May 2017 19:11:29 +0000 (UTC)
commit bc2af30cc613b48681870524e538e5bbda6e518a
Author: Gabriel Ivascu <ivascu gabriel59 gmail com>
Date: Tue May 30 22:08:44 2017 +0300
sync: Use WebChannels communication to sign in
FirefoxAccountsCommands have been deprecated
https://github.com/mozilla/fxa-content-server/blob/master/docs/relier-communication-protocols/fx-webchannel.md
src/prefs-dialog.c | 107 +++++++++++++++++++++++++++++----------------------
1 files changed, 61 insertions(+), 46 deletions(-)
---
diff --git a/src/prefs-dialog.c b/src/prefs-dialog.c
index c72f023..1d5e635 100644
--- a/src/prefs-dialog.c
+++ b/src/prefs-dialog.c
@@ -57,7 +57,7 @@
#endif
#define DOWNLOAD_BUTTON_WIDTH 8
-#define FXA_IFRAME_URL "https://accounts.firefox.com/signin?service=sync&context=fx_ios_v1"
+#define FXA_IFRAME_URL "https://accounts.firefox.com/signin?service=sync&context=fx_desktop_v2"
enum {
COL_LANG_NAME,
@@ -327,30 +327,42 @@ poll_fxa_server (gpointer user_data)
}
static void
-inject_data_to_server (PrefsDialog *dialog,
- const char *type,
- const char *status,
- const char *data)
+sync_send_message_to_content (PrefsDialog *dialog,
+ const char *channel_id,
+ const char *command,
+ gint64 message_id,
+ JsonObject *data)
{
- char *json;
+ JsonNode *node;
+ JsonObject *detail;
+ JsonObject *message;
+ char *detail_str;
char *script;
+ const char *type;
- if (data == NULL)
- json = g_strdup_printf ("{'type': '%s', 'content': {'status': '%s'}}",
- type, status);
- else
- json = g_strdup_printf ("{'type': '%s', 'content': {'status': '%s', 'data': %s}}",
- type, status, data);
-
- script = g_strdup_printf ("window.postMessage(%s, '%s');", json, FXA_IFRAME_URL);
-
- /* No callback, we don't expect any response from the server. */
- webkit_web_view_run_javascript (dialog->fxa_web_view,
- script,
- NULL, NULL, NULL);
+ message = json_object_new ();
+ json_object_set_string_member (message, "command", command);
+ json_object_set_int_member (message, "messageId", message_id);
+ json_object_set_object_member (message, "data", json_object_ref (data));
+ detail = json_object_new ();
+ json_object_set_string_member (detail, "id", channel_id);
+ json_object_set_object_member (detail, "message", message);
+ node = json_node_new (JSON_NODE_OBJECT);
+ json_node_set_object (node, detail);
+
+ type = "WebChannelMessageToContent";
+ detail_str = json_to_string (node, FALSE);
+ script = g_strdup_printf ("let e = new window.CustomEvent(\"%s\", {detail: %s});"
+ "window.dispatchEvent(e);",
+ type, detail_str);
+
+ /* We don't expect any response from the server. */
+ webkit_web_view_run_javascript (dialog->fxa_web_view, script, NULL, NULL, NULL);
- g_free (json);
g_free (script);
+ g_free (detail_str);
+ json_object_unref (detail);
+ json_node_unref (node);
}
static void
@@ -362,6 +374,7 @@ server_message_received_cb (WebKitUserContentManager *manager,
JsonParser *parser;
JsonObject *object;
JsonObject *detail;
+ JsonObject *message;
char *json_string;
const char *type;
const char *command;
@@ -373,23 +386,31 @@ server_message_received_cb (WebKitUserContentManager *manager,
object = json_node_get_object (json_parser_get_root (parser));
type = json_object_get_string_member (object, "type");
- /* The only message type we can receive is FirefoxAccountsCommand. */
- if (g_strcmp0 (type, "FirefoxAccountsCommand") != 0) {
+ /* The only message type we can receive is WebChannelMessageToChrome. */
+ if (g_strcmp0 (type, "WebChannelMessageToChrome") != 0) {
g_warning ("Unknown command type: %s", type);
goto out;
}
detail = json_object_get_object_member (object, "detail");
- command = json_object_get_string_member (detail, "command");
+ message = json_object_get_object_member (detail, "message");
+ command = json_object_get_string_member (message, "command");
- if (g_strcmp0 (command, "loaded") == 0) {
+ if (g_strcmp0 (command, "fxaccounts:loaded") == 0) {
LOG ("Loaded Firefox Sign In iframe");
gtk_widget_set_visible (dialog->sync_sign_in_details, FALSE);
- } else if (g_strcmp0 (command, "can_link_account") == 0) {
+ } else if (g_strcmp0 (command, "fxaccounts:can_link_account") == 0) {
/* We need to confirm a relink. */
- inject_data_to_server (dialog, "message", "can_link_account", "{'ok': true}");
- } else if (g_strcmp0 (command, "login") == 0) {
- JsonObject *data = json_object_get_object_member (detail, "data");
+ JsonObject *data = json_object_new ();
+ json_object_set_boolean_member (data, "ok", TRUE);
+ sync_send_message_to_content (dialog,
+ json_object_get_string_member (detail, "id"),
+ "fxaccounts:can_link_account",
+ json_object_get_int_member (message, "messageId"),
+ data);
+ json_object_unref (data);
+ } else if (g_strcmp0 (command, "fxaccounts:login") == 0) {
+ JsonObject *data = json_object_get_object_member (message, "data");
const char *email = json_object_get_string_member (data, "email");
const char *uid = json_object_get_string_member (data, "uid");
const char *sessionToken = json_object_get_string_member (data, "sessionToken");
@@ -401,8 +422,6 @@ server_message_received_cb (WebKitUserContentManager *manager,
guint8 *respXORkey;
char *text;
- inject_data_to_server (dialog, "message", "login", NULL);
-
/* Cannot retrieve the sync keys without keyFetchToken or unwrapBKey. */
if (keyFetchToken == NULL || unwrapBKey == NULL) {
g_warning ("Ignoring login with keyFetchToken or unwrapBKey missing!"
@@ -453,12 +472,8 @@ server_message_received_cb (WebKitUserContentManager *manager,
g_free (bundle);
}
- } else if (g_strcmp0 (command, "session_status") == 0) {
- /* We are not signed in at this time, which we signal by returning an error. */
- inject_data_to_server (dialog, "message", "error", NULL);
- } else if (g_strcmp0 (command, "sign_out") == 0) {
- /* We are not signed in at this time. We should never get a sign out message! */
- inject_data_to_server (dialog, "message", "error", NULL);
+ } else {
+ g_warning ("Unexepected command: %s", command);
}
out:
@@ -472,25 +487,25 @@ setup_fxa_sign_in_view (PrefsDialog *dialog)
EphyEmbedShell *shell;
WebKitWebContext *embed_context;
WebKitWebContext *sync_context;
- const char *js = "\"use strict\";"
- "function handleAccountsCommand(evt) {"
- " let j = {type: evt.type, detail: evt.detail};"
- " window.webkit.messageHandlers.accountsCommandHandler.postMessage(JSON.stringify(j));"
- "};"
- "window.addEventListener(\"FirefoxAccountsCommand\", handleAccountsCommand);";
-
- dialog->fxa_script = webkit_user_script_new (js,
+ const char *script;
+
+ script = "function handleToChromeMessage(evt) {"
+ " let e = JSON.stringify({type: evt.type, detail: evt.detail});"
+ " window.webkit.messageHandlers.toChromeMessageHandler.postMessage(e);"
+ "};"
+ "window.addEventListener(\"WebChannelMessageToChrome\", handleToChromeMessage);";
+ dialog->fxa_script = webkit_user_script_new (script,
WEBKIT_USER_CONTENT_INJECT_TOP_FRAME,
WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_END,
NULL, NULL);
dialog->fxa_manager = webkit_user_content_manager_new ();
webkit_user_content_manager_add_script (dialog->fxa_manager, dialog->fxa_script);
g_signal_connect (dialog->fxa_manager,
- "script-message-received::accountsCommandHandler",
+ "script-message-received::toChromeMessageHandler",
G_CALLBACK (server_message_received_cb),
dialog);
webkit_user_content_manager_register_script_message_handler (dialog->fxa_manager,
- "accountsCommandHandler");
+ "toChromeMessageHandler");
shell = ephy_embed_shell_get_default ();
embed_context = ephy_embed_shell_get_web_context (shell);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]