From aa9f1acec3f941cbb6b9fa716db1e775e88005c2 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 31 Jul 2011 15:51:07 +0100 Subject: Export oauth_params_parse(). --- lib/oauth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/oauth.c') diff --git a/lib/oauth.c b/lib/oauth.c index 372a62d3..4131dc97 100644 --- a/lib/oauth.c +++ b/lib/oauth.c @@ -164,7 +164,7 @@ const char *oauth_params_get( GSList **params, const char *key ) return NULL; } -static void oauth_params_parse( GSList **params, char *in ) +void oauth_params_parse( GSList **params, char *in ) { char *amp, *eq, *s; -- cgit v1.2.3 From f138bd25e9184c3033f405a7bbb5734d82a877c7 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 31 Jul 2011 21:27:30 +0100 Subject: OAuth code cleanup. --- lib/oauth.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/oauth.c') diff --git a/lib/oauth.c b/lib/oauth.c index 4131dc97..4f431ed6 100644 --- a/lib/oauth.c +++ b/lib/oauth.c @@ -121,6 +121,9 @@ void oauth_params_add( GSList **params, const char *key, const char *value ) { char *item; + if( !key || !value ) + return; + item = g_strdup_printf( "%s=%s", key, value ); *params = g_slist_insert_sorted( *params, item, (GCompareFunc) strcmp ); } -- cgit v1.2.3 From bf57cd1bf1019decd67d7c835060675e6a030cde Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 19 Dec 2011 01:17:38 +0100 Subject: Facebook OAuth2 should now be fully usable. --- lib/oauth.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'lib/oauth.c') diff --git a/lib/oauth.c b/lib/oauth.c index 4f431ed6..23353c61 100644 --- a/lib/oauth.c +++ b/lib/oauth.c @@ -133,6 +133,9 @@ void oauth_params_del( GSList **params, const char *key ) int key_len = strlen( key ); GSList *l, *n; + if( params == NULL ) + return NULL; + for( l = *params; l; l = n ) { n = l->next; @@ -157,6 +160,9 @@ const char *oauth_params_get( GSList **params, const char *key ) int key_len = strlen( key ); GSList *l; + if( params == NULL ) + return NULL; + for( l = *params; l; l = l->next ) { if( strncmp( (char*) l->data, key, key_len ) == 0 && -- cgit v1.2.3 From 4be0e3458a001a1c2eb3dd0074d7fd65260f2e6f Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 19 Dec 2011 01:41:40 +0100 Subject: Give a list of SASL mechanisms supported by a server when reporting we don't support any of them. --- lib/oauth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/oauth.c') diff --git a/lib/oauth.c b/lib/oauth.c index 23353c61..4d7acd97 100644 --- a/lib/oauth.c +++ b/lib/oauth.c @@ -134,7 +134,7 @@ void oauth_params_del( GSList **params, const char *key ) GSList *l, *n; if( params == NULL ) - return NULL; + return; for( l = *params; l; l = n ) { -- cgit v1.2.3 From 31db81651fa3ac5d742c3616efaccf43a1ebcaf2 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 21 Dec 2011 20:03:56 +0100 Subject: Use sha1_hmac() instead of reimplementing the algorithm in oauth_sign(). --- lib/oauth.c | 51 +++++++++------------------------------------------ 1 file changed, 9 insertions(+), 42 deletions(-) (limited to 'lib/oauth.c') diff --git a/lib/oauth.c b/lib/oauth.c index 4d7acd97..acbf433e 100644 --- a/lib/oauth.c +++ b/lib/oauth.c @@ -37,64 +37,31 @@ static char *oauth_sign( const char *method, const char *url, const char *params, struct oauth_info *oi ) { - sha1_state_t sha1; uint8_t hash[sha1_hash_size]; - uint8_t key[HMAC_BLOCK_SIZE+1]; + GString *payload = g_string_new( "" ); + char *key; char *s; - int i; - /* Create K. If our current key is >64 chars we have to hash it, - otherwise just pad. */ - memset( key, 0, HMAC_BLOCK_SIZE ); - i = strlen( oi->sp->consumer_secret ) + 1 + ( oi->token_secret ? strlen( oi->token_secret ) : 0 ); - if( i > HMAC_BLOCK_SIZE ) - { - sha1_init( &sha1 ); - sha1_append( &sha1, (uint8_t*) oi->sp->consumer_secret, strlen( oi->sp->consumer_secret ) ); - sha1_append( &sha1, (uint8_t*) "&", 1 ); - if( oi->token_secret ) - sha1_append( &sha1, (uint8_t*) oi->token_secret, strlen( oi->token_secret ) ); - sha1_finish( &sha1, key ); - } - else - { - g_snprintf( (gchar*) key, HMAC_BLOCK_SIZE + 1, "%s&%s", - oi->sp->consumer_secret, oi->token_secret ? oi->token_secret : "" ); - } - - /* Inner part: H(K XOR 0x36, text) */ - sha1_init( &sha1 ); - - for( i = 0; i < HMAC_BLOCK_SIZE; i ++ ) - key[i] ^= 0x36; - sha1_append( &sha1, key, HMAC_BLOCK_SIZE ); + key = g_strdup_printf( "%s&%s", oi->sp->consumer_secret, oi->token_secret ? oi->token_secret : "" ); - /* OAuth: text = method&url¶ms, all http_encoded. */ - sha1_append( &sha1, (const uint8_t*) method, strlen( method ) ); - sha1_append( &sha1, (const uint8_t*) "&", 1 ); + g_string_append_printf( payload, "%s&", method ); s = g_new0( char, strlen( url ) * 3 + 1 ); strcpy( s, url ); http_encode( s ); - sha1_append( &sha1, (const uint8_t*) s, strlen( s ) ); - sha1_append( &sha1, (const uint8_t*) "&", 1 ); + g_string_append_printf( payload, "%s&", s ); g_free( s ); s = g_new0( char, strlen( params ) * 3 + 1 ); strcpy( s, params ); http_encode( s ); - sha1_append( &sha1, (const uint8_t*) s, strlen( s ) ); + g_string_append( payload, s ); g_free( s ); - sha1_finish( &sha1, hash ); + sha1_hmac( key, 0, payload->str, 0, hash ); - /* Final result: H(K XOR 0x5C, inner stuff) */ - sha1_init( &sha1 ); - for( i = 0; i < HMAC_BLOCK_SIZE; i ++ ) - key[i] ^= 0x36 ^ 0x5c; - sha1_append( &sha1, key, HMAC_BLOCK_SIZE ); - sha1_append( &sha1, hash, sha1_hash_size ); - sha1_finish( &sha1, hash ); + g_free( key ); + g_string_free( payload, TRUE ); /* base64_encode + HTTP escape it (both consumers need it that away) and we're done. */ -- cgit v1.2.3 From e306fbf84aa37ab934c5ea18ccfd75da041af052 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 21 Dec 2011 20:35:13 +0100 Subject: Fixed a bug that probably (can't test this now since it's down) broke OAuth setup for identi.ca. Turning on oauth for identi.ca accounts by default now. --- lib/oauth.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/oauth.c') diff --git a/lib/oauth.c b/lib/oauth.c index acbf433e..04949e1b 100644 --- a/lib/oauth.c +++ b/lib/oauth.c @@ -308,6 +308,7 @@ static void oauth_request_token_done( struct http_request *req ) st->auth_url = g_strdup_printf( "%s?%s", st->sp->url_authorize, req->reply_body ); oauth_params_parse( ¶ms, req->reply_body ); st->request_token = g_strdup( oauth_params_get( ¶ms, "oauth_token" ) ); + st->token_secret = g_strdup( oauth_params_get( ¶ms, "oauth_token_secret" ) ); oauth_params_free( ¶ms ); } @@ -337,6 +338,7 @@ static void oauth_access_token_done( struct http_request *req ) { oauth_params_parse( &st->params, req->reply_body ); st->token = g_strdup( oauth_params_get( &st->params, "oauth_token" ) ); + g_free( st->token_secret ); st->token_secret = g_strdup( oauth_params_get( &st->params, "oauth_token_secret" ) ); } -- cgit v1.2.3