diff options
Diffstat (limited to 'plugins/common/RESTSupport.vala')
-rw-r--r-- | plugins/common/RESTSupport.vala | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/plugins/common/RESTSupport.vala b/plugins/common/RESTSupport.vala index b512fe7..d9bf2ce 100644 --- a/plugins/common/RESTSupport.vala +++ b/plugins/common/RESTSupport.vala @@ -4,10 +4,24 @@ * (version 2.1 or later). See the COPYING file in this distribution. */ -extern Soup.Message soup_form_request_new_from_multipart(string uri, Soup.Multipart multipart); - namespace Publishing.RESTSupport { +// Ported from librest +// https://git.gnome.org/browse/librest/tree/rest/sha1.c?id=e412da58080eec2e771482e7e4c509b9e71477ff#n38 + +internal const int SHA1_HMAC_LENGTH = 20; + +public string hmac_sha1(string key, string message) { + uint8 buffer[SHA1_HMAC_LENGTH]; + size_t len = SHA1_HMAC_LENGTH; + + var mac = new Hmac (ChecksumType.SHA1, key.data); + mac.update (message.data); + mac.get_digest (buffer, ref len); + + return Base64.encode (buffer[0:len]); +} + public abstract class Session { private string? endpoint_url = null; private Soup.Session soup_session = null; @@ -109,13 +123,17 @@ public class Argument { } public static Argument[] sort(Argument[] inputArray) { - FixedTreeSet<Argument> sorted_args = new FixedTreeSet<Argument>(Argument.compare); + Gee.TreeSet<Argument> sorted_args = new Gee.TreeSet<Argument>(Argument.compare); foreach (Argument arg in inputArray) sorted_args.add(arg); return sorted_args.to_array(); } + + public string to_string () { + return "%s=%s".printf (this.key, this.value); + } } public class Transaction { @@ -298,7 +316,7 @@ public class Transaction { // concatenate the REST arguments array into an HTTP formdata string string formdata_string = ""; for (int i = 0; i < arguments.length; i++) { - formdata_string += ("%s=%s".printf(arguments[i].key, arguments[i].value)); + formdata_string += arguments[i].to_string (); if (i < arguments.length - 1) formdata_string += "&"; } @@ -338,6 +356,11 @@ public class Transaction { assert(get_is_executed()); return message.response_headers; } + + public Soup.Message get_message() { + assert(get_is_executed()); + return message; + } public void add_argument(string name, string value) { arguments += new Argument(name, value); @@ -437,7 +460,7 @@ public class UploadTransaction : Transaction { image_part_header.set_content_disposition("form-data", binary_disposition_table); Soup.Message outbound_message = - soup_form_request_new_from_multipart(get_endpoint_url(), message_parts); + Soup.Form.request_new_from_multipart(get_endpoint_url(), message_parts); // TODO: there must be a better way to iterate over a map Gee.MapIterator<string, string> i = message_headers.map_iterator(); bool cont = i.next(); @@ -562,7 +585,7 @@ public string decimal_entity_encode(string source) { return encoded_str_builder.str; } -internal abstract class BatchUploader { +public abstract class BatchUploader { private int current_file = 0; private Spit.Publishing.Publishable[] publishables = null; private Session session = null; @@ -659,20 +682,6 @@ public string asciify_string(string s) { return b.str; } -/** @brief Work-around for a problem in libgee where a TreeSet can leak references when it - * goes out of scope; please see https://bugzilla.gnome.org/show_bug.cgi?id=695045 for more - * details. This class merely wraps it and adds a call to clear() to the destructor. - */ -public class FixedTreeSet<G> : Gee.TreeSet<G> { - public FixedTreeSet(owned CompareDataFunc<G>? comp_func = null) { - base((owned) comp_func); - } - - ~FixedTreeSet() { - clear(); - } -} - public abstract class GoogleSession : Session { public abstract string get_user_name(); public abstract string get_access_token(); |