diff options
author | ꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id> | 2022-09-22 15:37:57 +0800 |
---|---|---|
committer | ꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id> | 2022-09-22 15:37:57 +0800 |
commit | 1fa2c1228f279b7e298b6e1e3037924717539211 (patch) | |
tree | 8a35f4afd0c732155973eb58ae65fbbf8a081fc7 | |
parent | 77f8f4a9c3f6a83f965fad7cc6010476f784584d (diff) |
Merge request_gettoken
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | common.h | 11 | ||||
-rw-r--r-- | graphql.c (renamed from request.c) | 6 | ||||
-rw-r--r-- | request.h | 34 | ||||
-rw-r--r-- | shopify.c | 39 |
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; +} @@ -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); -} @@ -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]; |