summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-09-22 15:37:57 +0800
committerꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-09-22 15:37:57 +0800
commit1fa2c1228f279b7e298b6e1e3037924717539211 (patch)
tree8a35f4afd0c732155973eb58ae65fbbf8a081fc7
parent77f8f4a9c3f6a83f965fad7cc6010476f784584d (diff)
Merge request_gettoken
-rw-r--r--Makefile.am2
-rw-r--r--common.h11
-rw-r--r--graphql.c (renamed from request.c)6
-rw-r--r--request.h34
-rw-r--r--shopify.c39
5 files changed, 42 insertions, 50 deletions
diff --git a/Makefile.am b/Makefile.am
index 5222786..235bf7a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
lib_LTLIBRARIES = libshopify.la
-libshopify_la_SOURCES = shopify.c request.c
+libshopify_la_SOURCES = shopify.c graphql.c
libshopify_la_CPPFLAGS = $(DEPS_CFLAGS)
include_HEADERS = shopify.h
pkgconfigdir = $(libdir)/pkgconfig
diff --git a/common.h b/common.h
new file mode 100644
index 0000000..44601fd
--- /dev/null
+++ b/common.h
@@ -0,0 +1,11 @@
+#include <stdlib.h>
+#include <string.h>
+
+static size_t append(char *data, size_t size, size_t nmemb, char **res)
+{
+ size_t realsize = size * nmemb;
+ size_t res_len = *res ? strlen(*res) : 0;
+ *res = realloc(*res, res_len + realsize + 1);
+ strlcpy(&(*res)[res_len], data, realsize + 1);
+ return realsize;
+}
diff --git a/request.c b/graphql.c
index 099491b..d0e1ca8 100644
--- a/request.c
+++ b/graphql.c
@@ -1,8 +1,6 @@
-#include "request.h"
+#include <curl/curl.h>
#include "shopify.h"
-
-extern inline void request_gettoken(const char *, const char *, const char *,
- const char *, char **);
+#include "common.h"
void shopify_graphql(const char *query, const struct shopify_session *session,
char **json)
diff --git a/request.h b/request.h
deleted file mode 100644
index 9bbbcf2..0000000
--- a/request.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <curl/curl.h>
-
-static size_t append(char *data, size_t size, size_t nmemb, char **res)
-{
- size_t realsize = size * nmemb;
- size_t res_len = *res ? strlen(*res) : 0;
- *res = realloc(*res, res_len + realsize + 1);
- strlcpy(&(*res)[res_len], data, realsize + 1);
- return realsize;
-}
-
-static inline void request_gettoken(const char *host, const char *key,
- const char *secret_key, const char *code, char **json)
-{
- CURL *curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, append);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, json);
-
- static const char *url_tmpl = "https://%s/oauth/access_token";
- char url[strlen(url_tmpl) - strlen("%s") + strlen(host) + 1];
- sprintf(url, url_tmpl, host);
- curl_easy_setopt(curl, CURLOPT_URL, url);
-
- static const char *post_tmpl = "client_id=%s&client_secret=%s&code=%s";
- char post[strlen(post_tmpl) - strlen("%s") * 3 + strlen(key)
- + strlen(secret_key) + strlen(code) + 1];
- sprintf(post, post_tmpl, key, secret_key, code);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post);
-
- curl_easy_perform(curl);
- curl_easy_cleanup(curl);
-}
diff --git a/shopify.c b/shopify.c
index 3df37fb..6ef6678 100644
--- a/shopify.c
+++ b/shopify.c
@@ -4,12 +4,13 @@
#include <gcrypt.h>
#include <gnutls/gnutls.h>
#include <toml.h>
+#include <curl/curl.h>
#include <json.h>
#include <microhttpd.h>
#include "shopify.h"
#include "regex.h"
-#include "request.h"
#include "sessiontoken.h"
+#include "common.h"
#define AUTH_URL \
"https://%s/oauth/authorize?client_id=%s&scope=%s&redirect_uri=%s%s"\
@@ -326,6 +327,7 @@ static enum MHD_Result handle_request(void *cls, struct MHD_Connection *con,
size_t host_len = 0;
bool embedded = false;
char *dec_host = NULL;
+ size_t dec_host_len = 0;
if (params) {
host = ((struct parameter *)bsearch(&(struct parameter)
{ "host" }, params, nparams,
@@ -338,10 +340,11 @@ static enum MHD_Result handle_request(void *cls, struct MHD_Connection *con,
gnutls_datum_t result;
gnutls_base64_decode2(&(gnutls_datum_t){
(unsigned char *)host,
- strlen(host)
+ host_len
}, &result);
- dec_host = malloc(result.size + 1);
- strlcpy(dec_host, (const char *)result.data, result.size + 1);
+ dec_host_len = result.size;
+ dec_host = malloc(dec_host_len + 1);
+ strlcpy(dec_host, (const char *)result.data, dec_host_len + 1);
gnutls_free(result.data);
}
@@ -356,13 +359,27 @@ static enum MHD_Result handle_request(void *cls, struct MHD_Connection *con,
&(struct parameter){ "code" }, params,
nparams, sizeof(struct parameter),
keycmp))->val;
- char *access_token = NULL;
- request_gettoken(dec_host, api_key, api_secret_key, code,
- &access_token);
+
+ CURL *curl = curl_easy_init();
+ char *json = NULL;
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, &json);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, append);
+ static const char *url_tmpl = "https://%s/oauth/access_token";
+ char url[strlen(url_tmpl) - strlen("%s") + dec_host_len + 1];
+ sprintf(url, url_tmpl, dec_host);
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ static const char *post_tmpl
+ = "client_id=%s&client_secret=%s&code=%s";
+ char post[strlen(post_tmpl) - strlen("%s") * 3 + strlen(api_key)
+ + strlen(api_secret_key) + strlen(code) + 1];
+ sprintf(post, post_tmpl, api_key, api_secret_key, code);
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post);
+ curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
json_tokener *tokener = json_tokener_new();
- json_object *obj = json_tokener_parse_ex(tokener, access_token,
- strlen(access_token));
+ json_object *obj = json_tokener_parse_ex(tokener, json,
+ strlen(json));
struct json_object_iterator iter = json_object_iter_begin(obj);
struct json_object_iterator iter_end
= json_object_iter_end(obj);
@@ -382,7 +399,7 @@ static enum MHD_Result handle_request(void *cls, struct MHD_Connection *con,
json_object_iter_next(&iter);
}
json_tokener_free(tokener);
- free(access_token);
+ free(json);
ret = redirect(dec_host, app_id, con, &res);
} else if (session_token) {
@@ -437,7 +454,7 @@ static enum MHD_Result handle_request(void *cls, struct MHD_Connection *con,
for (int i = 0; i < hex_len; i++)
sprintf(nonce, "%s%02x", nonce, hex[i]);
- const size_t auth_url_len = AUTH_URL_LEN + strlen(dec_host)
+ const size_t auth_url_len = AUTH_URL_LEN + dec_host_len
+ api_key_len + strlen(scopes) + app_url_len
+ strlen(redir_url) + nonce_len;
char auth_url[auth_url_len + 1];