aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2012-09-19 19:43:22 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2012-09-19 19:43:22 +0300
commit96871660d41c0130460f52057c0334cec46f7dd3 (patch)
tree3c78ca7b60d127a8745c4da5e71a184dd3fa13e8
parent7bec448cd0383ef533ab7c0c6e19374d515dfecf (diff)
downloadeclat-96871660d41c0130460f52057c0334cec46f7dd3.tar.gz
eclat-96871660d41c0130460f52057c0334cec46f7dd3.tar.bz2
Implement query-to-url function.
* lib/q2url.c: New file. * lib/Makefile.am: Add new file. * lib/libeclat.h (ec2_query) <signature>: New member. (eclat_query_to_url): New proto. (eclat_query_signature): Change signature. * lib/reqsign.c (eclat_query_signature): Store signature to req->signature.
-rw-r--r--lib/Makefile.am1
-rw-r--r--lib/libeclat.h6
-rw-r--r--lib/q2url.c75
-rw-r--r--lib/reqsign.c7
4 files changed, 83 insertions, 6 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 1162210..eeb3dcb 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -20,6 +20,7 @@ libeclat_a_SOURCES=\
base64.c\
hmac_sha1.c\
libeclat.h\
+ q2url.c\
reqsign.c\
sha1.c\
sha1.h\
diff --git a/lib/libeclat.h b/lib/libeclat.h
index 1212dc4..aacc0e2 100644
--- a/lib/libeclat.h
+++ b/lib/libeclat.h
@@ -39,9 +39,11 @@ struct ec2_query {
char *uri; /* URI without parameters */
char *verb; /* GET or POST */
struct grecs_symtab *params; /* Query parameters */
+ char *signature;
};
-int eclat_query_signature(struct ec2_query *req, char *secret,
- char **signature);
+int eclat_query_signature(struct ec2_query *req, char *secret);
+
+char *eclat_query_to_url(struct ec2_query *req, char **post_params);
diff --git a/lib/q2url.c b/lib/q2url.c
new file mode 100644
index 0000000..a96e2e9
--- /dev/null
+++ b/lib/q2url.c
@@ -0,0 +1,75 @@
+/* This file is part of Eclat.
+ Copyright (C) 2012 Sergey Poznyakoff.
+
+ Eclat is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ Eclat 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Eclat. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <string.h>
+#include "libeclat.h"
+#include "grecs.h"
+
+static int
+add_param(void *sym, void *data)
+{
+ struct ec2_param *p = sym;
+ struct grecs_txtacc *acc = data;
+
+ grecs_txtacc_grow_char(acc, '&');
+ grecs_txtacc_grow(acc, p->name, strlen(p->name));
+ grecs_txtacc_grow_char(acc, '=');
+ grecs_txtacc_grow(acc, p->value, strlen(p->value));
+
+ return 0;
+}
+
+char *
+eclat_query_to_url(struct ec2_query *req, char **post_params)
+{
+ struct grecs_txtacc *acc;
+ char *ret = NULL;
+
+ acc = grecs_txtacc_create();
+
+ grecs_txtacc_grow(acc, "http", 4);
+ if (req->https)
+ grecs_txtacc_grow_char(acc, 's');
+ grecs_txtacc_grow(acc, "//", 2);
+ grecs_txtacc_grow(acc, req->endpoint, strlen(req->endpoint));
+ grecs_txtacc_grow(acc, req->uri, strlen(req->uri));
+
+ if (strcmp(req->verb, "POST") == 0) {
+ grecs_txtacc_grow_char(acc, 0);
+ ret = grecs_txtacc_finish(acc, 1);
+ } else {
+ grecs_txtacc_grow_char(acc, '?');
+ }
+
+ /* Add signature */
+ grecs_txtacc_grow(acc, "Signature", sizeof ("Signature"));
+ grecs_txtacc_grow_char(acc, '=');
+ grecs_txtacc_grow(acc, req->signature, strlen(req->signature));
+ /* Add other parameters */
+ grecs_symtab_enumerate(req->params, add_param, acc);
+
+ grecs_txtacc_grow_char(acc, 0);
+
+ if (!ret)
+ ret = grecs_txtacc_finish(acc, 1);
+ else
+ *post_params = grecs_txtacc_finish(acc, 1);
+
+ grecs_txtacc_free(acc);
+
+ return ret;
+}
diff --git a/lib/reqsign.c b/lib/reqsign.c
index bc65efe..f8ad234 100644
--- a/lib/reqsign.c
+++ b/lib/reqsign.c
@@ -42,8 +42,7 @@ compnames(const void *a, const void *b)
}
int
-eclat_query_signature(struct ec2_query *req, char *secret,
- char **signature)
+eclat_query_signature(struct ec2_query *req, char *secret)
{
char **pnames;
size_t i, n;
@@ -90,8 +89,8 @@ eclat_query_signature(struct ec2_query *req, char *secret,
hmac_sha1(str, strlen(str), secret, strlen(secret), digest);
eclat_base64_encode(digest, sizeof(digest),
- (unsigned char**) signature, &siglen);
-
+ (unsigned char**) req->signature, &siglen);
+
grecs_txtacc_free(acc);
free(pnames);
}

Return to:

Send suggestions and report system problems to the System administrator.