aboutsummaryrefslogtreecommitdiffstats
path: root/lib/oauth.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-04-27 23:11:11 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-04-27 23:11:11 +0100
commitee84bdbc2510fa09bd0f67e14d06e69c2626d0f1 (patch)
treec7a4fdbb21ec90d466a0426cb6166475aa964e88 /lib/oauth.c
parent288b215ca64d09ea6a49cf9ff1fcc7682b7607ec (diff)
The escaping, I fixed it for you. More expensive code this way and most of
the vars don't need escaping. But this shouldn't be so fragile anymore.
Diffstat (limited to 'lib/oauth.c')
-rw-r--r--lib/oauth.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/lib/oauth.c b/lib/oauth.c
index 9a372082..0ab94c96 100644
--- a/lib/oauth.c
+++ b/lib/oauth.c
@@ -100,21 +100,21 @@ static char *oauth_sign( const char *method, const char *url,
sha1_append( &sha1, hash, sha1_hash_size );
sha1_finish( &sha1, hash );
- /* base64_encode it and we're done. */
- return base64_encode( hash, sha1_hash_size );
+ /* base64_encode + HTTP escape it (both consumers
+ need it that away) and we're done. */
+ s = base64_encode( hash, sha1_hash_size );
+ s = g_realloc( s, strlen( s ) * 3 + 1 );
+ http_encode( s );
+
+ return s;
}
static char *oauth_nonce()
{
unsigned char bytes[9];
- char *ret;
random_bytes( bytes, sizeof( bytes ) );
- ret = base64_encode( bytes, sizeof( bytes ) );
- ret = g_realloc( ret, strlen( ret ) * 3 + 1 );
- http_encode( ret );
-
- return ret;
+ return base64_encode( bytes, sizeof( bytes ) );
}
void oauth_params_add( GSList **params, const char *key, const char *value )
@@ -166,7 +166,7 @@ const char *oauth_params_get( GSList **params, const char *key )
static void oauth_params_parse( GSList **params, char *in )
{
- char *amp, *eq;
+ char *amp, *eq, *s;
while( in && *in )
{
@@ -178,7 +178,10 @@ static void oauth_params_parse( GSList **params, char *in )
if( ( amp = strchr( eq + 1, '&' ) ) )
*amp = '\0';
- oauth_params_add( params, in, eq + 1 );
+ s = g_strdup( eq + 1 );
+ http_decode( s );
+ oauth_params_add( params, in, s );
+ g_free( s );
*eq = '=';
if( amp == NULL )
@@ -205,7 +208,15 @@ char *oauth_params_string( GSList *params )
for( l = params; l; l = l->next )
{
- g_string_append( str, l->data );
+ char *s, *eq;
+
+ s = g_malloc( strlen( l->data ) * 3 + 1 );
+ strcpy( s, l->data );
+ if( ( eq = strchr( s, '=' ) ) )
+ http_encode( eq + 1 );
+ g_string_append( str, s );
+ g_free( s );
+
if( l->next )
g_string_append_c( str, '&' );
}
@@ -253,9 +264,6 @@ static void *oauth_post_request( const char *url, GSList **params_, http_input_f
oauth_params_free( params_ );
s = oauth_sign( "POST", url, params_s, NULL );
- s = g_realloc( s, strlen( s ) * 3 + 1 );
- http_encode( s );
-
post = g_strdup_printf( "%s&oauth_signature=%s", params_s, s );
g_free( params_s );
g_free( s );
@@ -389,11 +397,8 @@ char *oauth_http_header( char *access_token, const char *method, const char *url
params_s = oauth_params_string( params );
sig = oauth_sign( method, url, params_s, token_secret );
- g_free( params_s );
- sig = g_realloc( sig, strlen( sig ) * 3 + 1 );
- http_encode( sig );
-
g_string_append_printf( ret, "oauth_signature=\"%s\"", sig );
+ g_free( params_s );
err:
oauth_params_free( &params );