[shotwell] OAuth1: Move into own file



commit 6a2fe441f5872b7e98dd3ae81ec28242c78fa602
Author: Jens Georg <mail jensge org>
Date:   Fri Nov 17 19:29:26 2017 +0100

    OAuth1: Move into own file

 Makefile.am                       |    1 +
 plugins/common/OAuth1Support.vala |  233 +++++++++++++++++++++++++++++++++++++
 plugins/common/RESTSupport.vala   |  225 -----------------------------------
 plugins/meson.build               |    3 +-
 4 files changed, 236 insertions(+), 226 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 472330d..720cf2b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -58,6 +58,7 @@ lib_LTLIBRARIES = \
 
 plugins_common_libshotwell_plugin_common_la_SOURCES = \
        plugins/common/RESTSupport.vala \
+       plugins/common/OAuth1Support.vala \
        plugins/common/Resources.vala \
        plugins/common/WebAuthenticationPane.vala \
        plugins/common/BuilderPane.vala \
diff --git a/plugins/common/OAuth1Support.vala b/plugins/common/OAuth1Support.vala
new file mode 100644
index 0000000..e5a8545
--- /dev/null
+++ b/plugins/common/OAuth1Support.vala
@@ -0,0 +1,233 @@
+/* Copyright 2016 Software Freedom Conservancy Inc.
+ * Copyright 2017 Jens Georg <mail jensge org>
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later).  See the COPYING file in this distribution.
+ */
+
+namespace Publishing.RESTSupport.OAuth1 {
+    internal const string ENCODE_RFC_3986_EXTRA = "!*'();:@&=+$,/?%#[] \\";
+
+    public class Session : Publishing.RESTSupport.Session {
+        private string? request_phase_token = null;
+        private string? request_phase_token_secret = null;
+        private string? access_phase_token = null;
+        private string? access_phase_token_secret = null;
+        private string? username = null;
+        private string? consumer_key = null;
+        private string? consumer_secret = null;
+
+        public Session(string? endpoint_uri = null) {
+            base(endpoint_uri);
+        }
+
+        public override bool is_authenticated() {
+            return (access_phase_token != null && access_phase_token_secret != null &&
+                    username != null);
+        }
+
+        public void authenticate_from_persistent_credentials(string token, string secret,
+                string username) {
+            this.access_phase_token = token;
+            this.access_phase_token_secret = secret;
+            this.username = username;
+
+            this.authenticated();
+        }
+
+        public void deauthenticate() {
+            access_phase_token = null;
+            access_phase_token_secret = null;
+            username = null;
+        }
+
+        public void set_api_credentials(string consumer_key, string consumer_secret) {
+            this.consumer_key = consumer_key;
+            this.consumer_secret = consumer_secret;
+        }
+
+        public string sign_transaction(Publishing.RESTSupport.Transaction txn,
+                                     Publishing.RESTSupport.Argument[]? extra_arguments = null) {
+            string http_method = txn.get_method().to_string();
+
+            debug("signing transaction with parameters:");
+            debug("HTTP method = " + http_method);
+
+            Publishing.RESTSupport.Argument[] base_string_arguments = txn.get_arguments();
+
+            foreach (var arg in extra_arguments) {
+                base_string_arguments += arg;
+            }
+
+            Publishing.RESTSupport.Argument[] sorted_args =
+                Publishing.RESTSupport.Argument.sort(base_string_arguments);
+
+            var arguments_string = Argument.serialize_list(sorted_args);
+
+            string? signing_key = null;
+            if (access_phase_token_secret != null) {
+                debug("access phase token secret available; using it as signing key");
+
+                signing_key = consumer_secret + "&" + access_phase_token_secret;
+            } else if (request_phase_token_secret != null) {
+                debug("request phase token secret available; using it as signing key");
+
+                signing_key = consumer_secret + "&" + request_phase_token_secret;
+            } else {
+                debug("neither access phase nor request phase token secrets available; using API " +
+                        "key as signing key");
+
+                signing_key = consumer_secret + "&";
+            }
+
+            string signature_base_string = http_method + "&" + Soup.URI.encode(
+                    txn.get_endpoint_url(), ENCODE_RFC_3986_EXTRA) + "&" +
+                Soup.URI.encode(arguments_string, ENCODE_RFC_3986_EXTRA);
+
+            debug("signature base string = '%s'", signature_base_string);
+
+            debug("signing key = '%s'", signing_key);
+
+            // compute the signature
+            string signature = RESTSupport.hmac_sha1(signing_key, signature_base_string);
+            signature = Soup.URI.encode(signature, ENCODE_RFC_3986_EXTRA);
+
+            debug("signature = '%s'", signature);
+
+            return signature;
+        }
+
+        public void set_request_phase_credentials(string token, string secret) {
+            this.request_phase_token = token;
+            this.request_phase_token_secret = secret;
+        }
+
+        public void set_access_phase_credentials(string token, string secret, string username) {
+            this.access_phase_token = token;
+            this.access_phase_token_secret = secret;
+            this.username = username;
+
+            authenticated();
+        }
+
+        public string get_oauth_nonce() {
+            TimeVal currtime = TimeVal();
+            currtime.get_current_time();
+
+            return Checksum.compute_for_string(ChecksumType.MD5, currtime.tv_sec.to_string() +
+                    currtime.tv_usec.to_string());
+        }
+
+        public string get_oauth_timestamp() {
+            return GLib.get_real_time().to_string().substring(0, 10);
+        }
+
+        public string get_consumer_key() {
+            assert(consumer_key != null);
+            return consumer_key;
+        }
+
+        public string get_request_phase_token() {
+            assert(request_phase_token != null);
+            return request_phase_token;
+        }
+
+        public string get_access_phase_token() {
+            assert(access_phase_token != null);
+            return access_phase_token;
+        }
+
+        public bool has_access_phase_token() {
+            return access_phase_token != null;
+        }
+
+        public string get_access_phase_token_secret() {
+            assert(access_phase_token_secret != null);
+            return access_phase_token_secret;
+        }
+
+        public string get_username() {
+            assert(is_authenticated());
+            return username;
+        }
+    }
+
+    public class Transaction : Publishing.RESTSupport.Transaction {
+        public Transaction(Session session, Publishing.RESTSupport.HttpMethod method =
+                Publishing.RESTSupport.HttpMethod.POST) {
+            base(session, method);
+            setup_arguments();
+        }
+
+        public Transaction.with_uri(Session session, string uri,
+                Publishing.RESTSupport.HttpMethod method = Publishing.RESTSupport.HttpMethod.POST) {
+            base.with_endpoint_url(session, uri, method);
+            setup_arguments();
+        }
+
+        private void setup_arguments() {
+            var session = (Session) get_parent_session();
+
+            add_argument("oauth_nonce", session.get_oauth_nonce());
+            add_argument("oauth_signature_method", "HMAC-SHA1");
+            add_argument("oauth_version", "1.0");
+            add_argument("oauth_timestamp", session.get_oauth_timestamp());
+            add_argument("oauth_consumer_key", session.get_consumer_key());
+            if (session.has_access_phase_token()) {
+                add_argument("oauth_token", session.get_access_phase_token());
+            }
+        }
+
+
+        public override void execute() throws Spit.Publishing.PublishingError {
+            var signature = ((Session) get_parent_session()).sign_transaction(this);
+            add_argument("oauth_signature", signature);
+
+            base.execute();
+        }
+    }
+
+    public class UploadTransaction : Publishing.RESTSupport.UploadTransaction {
+        protected unowned Publishing.RESTSupport.OAuth1.Session session;
+        private Publishing.RESTSupport.Argument[] auth_header_fields;
+
+        public UploadTransaction(Publishing.RESTSupport.OAuth1.Session session,
+                                 Spit.Publishing.Publishable publishable,
+                                 string endpoint_uri) {
+            base.with_endpoint_url(session, publishable, endpoint_uri);
+
+            this.auth_header_fields = new Publishing.RESTSupport.Argument[0];
+            this.session = session;
+
+            add_authorization_header_field("oauth_nonce", session.get_oauth_nonce());
+            add_authorization_header_field("oauth_signature_method", "HMAC-SHA1");
+            add_authorization_header_field("oauth_version", "1.0");
+            add_authorization_header_field("oauth_timestamp", session.get_oauth_timestamp());
+            add_authorization_header_field("oauth_consumer_key", session.get_consumer_key());
+            add_authorization_header_field("oauth_token", session.get_access_phase_token());
+        }
+
+        public void add_authorization_header_field(string key, string value) {
+            auth_header_fields += new Publishing.RESTSupport.Argument(key, value);
+        }
+
+        public string get_authorization_header_string() {
+            return "OAuth " + Argument.serialize_list(auth_header_fields, true, ", ");
+        }
+
+        public void authorize() {
+            var signature = session.sign_transaction(this, auth_header_fields);
+            add_authorization_header_field("oauth_signature", signature);
+
+
+            string authorization_header = get_authorization_header_string();
+
+            debug("executing upload transaction: authorization header string = '%s'",
+                    authorization_header);
+            add_header("Authorization", authorization_header);
+
+        }
+    }
+}
+
+
diff --git a/plugins/common/RESTSupport.vala b/plugins/common/RESTSupport.vala
index 14e5962..d92c264 100644
--- a/plugins/common/RESTSupport.vala
+++ b/plugins/common/RESTSupport.vala
@@ -873,230 +873,5 @@ public abstract class GooglePublisher : Object, Spit.Publishing.Publisher {
     }
 }
 
-namespace OAuth1 {
-    internal const string ENCODE_RFC_3986_EXTRA = "!*'();:@&=+$,/?%#[] \\";
-
-    public class Session : Publishing.RESTSupport.Session {
-        private string? request_phase_token = null;
-        private string? request_phase_token_secret = null;
-        private string? access_phase_token = null;
-        private string? access_phase_token_secret = null;
-        private string? username = null;
-        private string? consumer_key = null;
-        private string? consumer_secret = null;
-
-        public Session(string? endpoint_uri = null) {
-            base(endpoint_uri);
-        }
-
-        public override bool is_authenticated() {
-            return (access_phase_token != null && access_phase_token_secret != null &&
-                    username != null);
-        }
-
-        public void authenticate_from_persistent_credentials(string token, string secret,
-                string username) {
-            this.access_phase_token = token;
-            this.access_phase_token_secret = secret;
-            this.username = username;
-
-            this.authenticated();
-        }
-
-        public void deauthenticate() {
-            access_phase_token = null;
-            access_phase_token_secret = null;
-            username = null;
-        }
-
-        public void set_api_credentials(string consumer_key, string consumer_secret) {
-            this.consumer_key = consumer_key;
-            this.consumer_secret = consumer_secret;
-        }
-
-        public string sign_transaction(Publishing.RESTSupport.Transaction txn,
-                                     Publishing.RESTSupport.Argument[]? extra_arguments = null) {
-            string http_method = txn.get_method().to_string();
-
-            debug("signing transaction with parameters:");
-            debug("HTTP method = " + http_method);
-
-            Publishing.RESTSupport.Argument[] base_string_arguments = txn.get_arguments();
-
-            foreach (var arg in extra_arguments) {
-                base_string_arguments += arg;
-            }
-
-            Publishing.RESTSupport.Argument[] sorted_args =
-                Publishing.RESTSupport.Argument.sort(base_string_arguments);
-
-            var arguments_string = Argument.serialize_list(sorted_args);
-
-            string? signing_key = null;
-            if (access_phase_token_secret != null) {
-                debug("access phase token secret available; using it as signing key");
-
-                signing_key = consumer_secret + "&" + access_phase_token_secret;
-            } else if (request_phase_token_secret != null) {
-                debug("request phase token secret available; using it as signing key");
-
-                signing_key = consumer_secret + "&" + request_phase_token_secret;
-            } else {
-                debug("neither access phase nor request phase token secrets available; using API " +
-                        "key as signing key");
-
-                signing_key = consumer_secret + "&";
-            }
-
-            string signature_base_string = http_method + "&" + Soup.URI.encode(
-                    txn.get_endpoint_url(), ENCODE_RFC_3986_EXTRA) + "&" +
-                Soup.URI.encode(arguments_string, ENCODE_RFC_3986_EXTRA);
-
-            debug("signature base string = '%s'", signature_base_string);
-
-            debug("signing key = '%s'", signing_key);
-
-            // compute the signature
-            string signature = RESTSupport.hmac_sha1(signing_key, signature_base_string);
-            signature = Soup.URI.encode(signature, ENCODE_RFC_3986_EXTRA);
-
-            debug("signature = '%s'", signature);
-
-            return signature;
-        }
-
-        public void set_request_phase_credentials(string token, string secret) {
-            this.request_phase_token = token;
-            this.request_phase_token_secret = secret;
-        }
-
-        public void set_access_phase_credentials(string token, string secret, string username) {
-            this.access_phase_token = token;
-            this.access_phase_token_secret = secret;
-            this.username = username;
-
-            authenticated();
-        }
-
-        public string get_oauth_nonce() {
-            TimeVal currtime = TimeVal();
-            currtime.get_current_time();
-
-            return Checksum.compute_for_string(ChecksumType.MD5, currtime.tv_sec.to_string() +
-                    currtime.tv_usec.to_string());
-        }
-
-        public string get_oauth_timestamp() {
-            return GLib.get_real_time().to_string().substring(0, 10);
-        }
-
-        public string get_consumer_key() {
-            assert(consumer_key != null);
-            return consumer_key;
-        }
-
-        public string get_request_phase_token() {
-            assert(request_phase_token != null);
-            return request_phase_token;
-        }
-
-        public string get_access_phase_token() {
-            assert(access_phase_token != null);
-            return access_phase_token;
-        }
-
-        public bool has_access_phase_token() {
-            return access_phase_token != null;
-        }
-
-        public string get_access_phase_token_secret() {
-            assert(access_phase_token_secret != null);
-            return access_phase_token_secret;
-        }
-
-        public string get_username() {
-            assert(is_authenticated());
-            return username;
-        }
-    }
-
-    public class Transaction : Publishing.RESTSupport.Transaction {
-        public Transaction(Session session, Publishing.RESTSupport.HttpMethod method =
-                Publishing.RESTSupport.HttpMethod.POST) {
-            base(session, method);
-            setup_arguments();
-        }
-
-        public Transaction.with_uri(Session session, string uri,
-                Publishing.RESTSupport.HttpMethod method = Publishing.RESTSupport.HttpMethod.POST) {
-            base.with_endpoint_url(session, uri, method);
-            setup_arguments();
-        }
-
-        private void setup_arguments() {
-            var session = (Session) get_parent_session();
-
-            add_argument("oauth_nonce", session.get_oauth_nonce());
-            add_argument("oauth_signature_method", "HMAC-SHA1");
-            add_argument("oauth_version", "1.0");
-            add_argument("oauth_timestamp", session.get_oauth_timestamp());
-            add_argument("oauth_consumer_key", session.get_consumer_key());
-            if (session.has_access_phase_token()) {
-                add_argument("oauth_token", session.get_access_phase_token());
-            }
-        }
-
-
-        public override void execute() throws Spit.Publishing.PublishingError {
-            var signature = ((Session) get_parent_session()).sign_transaction(this);
-            add_argument("oauth_signature", signature);
-
-            base.execute();
-        }
-    }
-
-    public class UploadTransaction : Publishing.RESTSupport.UploadTransaction {
-        protected unowned Publishing.RESTSupport.OAuth1.Session session;
-        private Publishing.RESTSupport.Argument[] auth_header_fields;
-
-        public UploadTransaction(Publishing.RESTSupport.OAuth1.Session session,
-                                 Spit.Publishing.Publishable publishable,
-                                 string endpoint_uri) {
-            base.with_endpoint_url(session, publishable, endpoint_uri);
-
-            this.auth_header_fields = new Publishing.RESTSupport.Argument[0];
-            this.session = session;
-
-            add_authorization_header_field("oauth_nonce", session.get_oauth_nonce());
-            add_authorization_header_field("oauth_signature_method", "HMAC-SHA1");
-            add_authorization_header_field("oauth_version", "1.0");
-            add_authorization_header_field("oauth_timestamp", session.get_oauth_timestamp());
-            add_authorization_header_field("oauth_consumer_key", session.get_consumer_key());
-            add_authorization_header_field("oauth_token", session.get_access_phase_token());
-        }
-
-        public void add_authorization_header_field(string key, string value) {
-            auth_header_fields += new Publishing.RESTSupport.Argument(key, value);
-        }
-
-        public string get_authorization_header_string() {
-            return "OAuth " + Argument.serialize_list(auth_header_fields, true, ", ");
-        }
-
-        public void authorize() {
-            var signature = session.sign_transaction(this, auth_header_fields);
-            add_authorization_header_field("oauth_signature", signature);
-
-
-            string authorization_header = get_authorization_header_string();
-
-            debug("executing upload transaction: authorization header string = '%s'",
-                    authorization_header);
-            add_header("Authorization", authorization_header);
-
-        }
-    }
-}
-
 }
 
diff --git a/plugins/meson.build b/plugins/meson.build
index 635351b..66096c7 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -4,7 +4,8 @@ sw_plugin_common = library('shotwell-plugin-common',
                           ['common/RESTSupport.vala',
                            'common/Resources.vala',
                            'common/WebAuthenticationPane.vala',
-                           'common/BuilderPane.vala'],
+                           'common/BuilderPane.vala',
+                           'common/OAuth1Support.vala'],
                           version: meson.project_version(),
                           dependencies : [gtk, gee, webkit, soup, xml, sw_plugin],
                           vala_header : 'shotwell-plugin-common.h',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]