Exemplo n.º 1
0
Arquivo: Oauth.c Projeto: bomma/io
static void build_signature(struct signctx *senv, const char *method, const char *consumerSecret, const char *tokenSecret)
{
	struct signature_param *sp;
	const size_t nParams = vector_size(&senv->signatureParams);
	uint32_t i;
	uint8_t digest[20];

	qsort(vector_values(&senv->signatureParams), vector_size(&senv->signatureParams), senv->signatureParams.item_size, bySignatureParamName);
	string_append(&senv->signatureSeed, "&", 1);

	if (nParams)
	{
		i = 0;
		do
		{
			sp = (struct signature_param *)vector_value(&senv->signatureParams, i);
			string_appendfmt(&senv->signatureSeed, "%s%%3D", sp->name);
			string_append_urlencoded_rfc3986(&senv->signatureSeed, sp->value, sp->len);
			string_append(&senv->signatureSeed, "%26", 3);

		} while (++i != nParams);
		string_adjustlen(&senv->signatureSeed, 3);
	}


	char _k[256];
	const size_t keyLen = sprintf(_k, "%s&%s", consumerSecret, tokenSecret);

	string_reset(&senv->signatureParamsBuf);
	hmac((uint8_t *)_k, keyLen, (uint8_t *)string_data(&senv->signatureSeed), string_len(&senv->signatureSeed), digest);
	base64_encode(digest, 20, &senv->signatureParamsBuf, 0);
}
Exemplo n.º 2
0
Arquivo: Oauth.c Projeto: bomma/io
static void init_signature_seed(struct signctx *senv, const char *reqMethod, const struct url_props *url)
{
	const char *e = url->path + url->pathLen, *p = url->path;

	string_reset(&senv->signatureParamsBuf);
	vector_reset(&senv->signatureParams);

	while (p != e && *p != '?')
		++p;
	
	if (p != e)
		append_signature_params(senv, p + 1, e);

	string_reset(&senv->signatureSeed);
	string_appendfmt(&senv->signatureSeed, "%s&%s%%3A%%2F%%2F%.*s", reqMethod, url->port == 443 ? "https": "http", url->hostNameLen, url->hostName);
	string_append_urlencoded_rfc3986(&senv->signatureSeed, url->path, p - url->path);
}
Exemplo n.º 3
0
int main()
{
	string *s = string_init();
	string *o;
	string *subs;
	string *q = string_init_cstring("quit");
	
	string_read_line(s);
	
	while(string_cmp(s, q))
	{
		string_print(s);
		
		string_reset(s);
		string_read_line(s);
	}

	string_append(s, q);
	o = string_cat(s, q);
	string_print(s);
	string_print(o);
	string_append_cstring(o, "hello");
	string_append_char(o, 'J');
	string_print(o);
	subs = string_substring(o, 5, 6);

	printf("--\n");
	printf("%c\n", string_get(s, 5));
	printf("%d\n", string_index(o, 'o'));
	string_print(subs);
	printf("--\n");

	o = string_free(o);
	s = string_free(s);
	q = string_free(q);
	subs = string_free(subs);

	return 0;
}
Exemplo n.º 4
0
Arquivo: Oauth.c Projeto: bomma/io
/*
 *	Once the user has authorized the request key, we can exchange it for an access key
 *	This function implements the logic required to do so.
 *	Once you get back the new/exchanged accessToken and accessSecret you can use it for issuing requests
 *	to the sevice from now on
 */ 
int oauth_exchange_reqtoken(const char *fullUrl, const char *consumerKey, const char *consumerSecret, const char *oauthToken, const char *oauthTokenSecret, struct string *accessToken, struct string *accessSeret)
{
	struct url_props url;
	struct string headers;
	struct http_response resp;
	const char *p, *e;

	if (parse_url(fullUrl, &url))
		return -1;

	string_reset(accessToken);
	string_reset(accessSeret);

	string_init(&headers);
	oauth_signandappend_oauth_header("GET", &url, consumerKey, consumerSecret, oauthToken, oauthTokenSecret, time(NULL), NULL, 0, NULL, NULL, NULL, &headers);

	http_response_init(&resp);
	if (http_request(&url, "GET", &headers, NULL, &resp))
		goto onFailure;

	p = resp.body + resp.headersSize;
	e = p + resp.contentLen;

	printf("3 Parsing [%.*s]\n", e - p, p);

	while (p != e)
	{
		const char *name = p;

		while (p != e)
		{
			if (*p == '=')
				break;
			++p;
		}


		if (p != e)
		{
			const size_t nameLen 	= p - name;
			const char *value 	= ++p;
			size_t valueLen;

			printf("[%.*s]\n", (signed)nameLen, name);

			for (; p != e && *p != '&'; ++p)
				continue;

			valueLen = p - value;

			if (nameLen == 11 && memcmp(name, "oauth_token", 11) == 0)
				string_append(accessToken, value, valueLen);
			else if (nameLen == 18 && memcmp(name, "oauth_token_secret", 18) == 0)
				string_append(accessSeret, value, valueLen);

			printf("value =[%.*s]\n", (signed)valueLen, value);

			if (p != e)
				++p;
			else
				break;
		}
		else
			break;
	}

	if (string_len(accessToken) && string_len(accessSeret))
	{
		string_dealloc(&headers);
		http_response_dealloc(&resp);
		return 0;
	}

onFailure:
	string_dealloc(&headers);
	http_response_dealloc(&resp);
	return -1;

}