Changeset 508c340


Ignore:
Timestamp:
2010-04-26T00:42:37Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
acba168
Parents:
b2bc25c
Message:

Successfully posted a tweet!

Twitter's tricky. It returns vars (user_id, screen_name) in the access token
that, the way I read the spec, should be included in all subsequent queries.
However, stuff only started to work when I dropped those vars.

This code's definitely not pretty ATM. Need to clean up now that it actually
works.

Files:
7 edited

Legend:

Unmodified
Added
Removed
  • lib/oauth.c

    rb2bc25c r508c340  
    175175}
    176176
    177 GSList *oauth_params_parse( char *in )
    178 {
    179         GSList *ret = NULL;
     177static void oauth_params_parse( GSList **params, char *in )
     178{
    180179        char *amp, *eq;
    181180       
     
    190189                        *amp = '\0';
    191190               
    192                 oauth_params_add( &ret, in, eq + 1 );
     191                oauth_params_add( params, in, eq + 1 );
    193192               
    194193                *eq = '=';
     
    199198                in = amp + 1;
    200199        }
    201        
    202         return ret;
    203200}
    204201
     
    312309        if( req->status_code == 200 )
    313310        {
    314                 GSList *params;
     311                GSList *params = NULL;
    315312               
    316313                st->auth_params = g_strdup( req->reply_body );
    317                 params = oauth_params_parse( st->auth_params );
     314                oauth_params_parse( &params, st->auth_params );
    318315                st->token = g_strdup( oauth_params_get( &params, "oauth_token" ) );
    319316                oauth_params_free( &params );
     
    345342}
    346343
    347 char *oauth_http_header( char *access_token, const char *method, const char *url )
    348 {
    349         GSList *params, *l;
    350         char *token_secret, *sig, *params_s;
     344char *oauth_http_header( char *access_token, const char *method, const char *url, char *args )
     345{
     346        GSList *params = NULL, *l;
     347        char *token_secret, *sig, *params_s, *s;
    351348        GString *ret = NULL;
    352349       
    353         params = oauth_params_parse( access_token );
     350        oauth_params_parse( &params, access_token );
    354351        if( params == NULL )
    355352                goto err;
     
    361358        oauth_add_default_params( &params );
    362359       
     360        ret = g_string_new( "OAuth " );
     361        for( l = params; l; l = l->next )
     362        {
     363                char *kv = l->data;
     364                char *eq = strchr( kv, '=' );
     365                char esc[strlen(kv)*3+1];
     366               
     367                if( eq == NULL )
     368                        break; /* WTF */
     369               
     370                strcpy( esc, eq + 1 );
     371                http_encode( esc );
     372               
     373                g_string_append_len( ret, kv, eq - kv + 1 );
     374                g_string_append_c( ret, '"' );
     375                g_string_append( ret, esc );
     376                g_string_append( ret, "\", " );
     377        }
     378       
     379        if( args )
     380                oauth_params_parse( &params, args );
     381        if( ( s = strchr( url, '?' ) ) )
     382        {
     383                s = g_strdup( s + 1 );
     384                oauth_params_parse( &params, s + 1 );
     385                g_free( s );
     386        }
     387       
    363388        params_s = oauth_params_string( params );
    364389        sig = oauth_sign( method, url, params_s, token_secret );
     
    367392        http_encode( sig );
    368393       
    369         ret = g_string_new( "OAuth " );
    370         for( l = params; l; l = l->next )
    371         {
    372                 char *kv = l->data;
    373                 char *eq = strchr( kv, '=' );
    374                 char esc[strlen(kv)*3+1];
    375                
    376                 if( eq == NULL )
    377                         break; /* WTF */
    378                
    379                 strcpy( esc, eq + 1 );
    380                 http_encode( esc );
    381                
    382                 g_string_append_len( ret, kv, eq - kv + 1 );
    383                 g_string_append_c( ret, '"' );
    384                 g_string_append( ret, esc );
    385                 g_string_append( ret, "\", " );
    386         }
    387        
    388394        g_string_append_printf( ret, "oauth_signature=\"%s\"", sig );
    389395       
  • lib/oauth.h

    rb2bc25c r508c340  
    2121*                                                                           *
    2222\***************************************************************************/
     23
     24char *oauth_http_header( char *access_token, const char *method, const char *url, char *args );
  • protocols/twitter/twitter.c

    rb2bc25c r508c340  
    8282
    8383        td->user = acc->user;
    84         td->pass = acc->pass;
     84        if( strstr( acc->pass, "oauth_token=" ) == NULL )
     85                td->pass = g_strdup( acc->pass );
     86        else
     87                td->oauth = g_strdup( acc->pass );
    8588        td->home_timeline_id = 0;
    8689
     
    119122        if( td )
    120123        {
     124                g_free( td->pass );
     125                g_free( td->oauth );
    121126                g_free( td );
    122127        }
  • protocols/twitter/twitter.h

    rb2bc25c r508c340  
    3737        char* user;
    3838        char* pass;
     39        char* oauth;
    3940        guint64 home_timeline_id;
    4041        gint main_loop_id;
  • protocols/twitter/twitter_http.c

    rb2bc25c r508c340  
    3535#include "misc.h"
    3636#include "base64.h"
     37#include "oauth.h"
    3738#include <ctype.h>
    3839#include <errno.h>
     
    4546 * This is actually pretty generic function... Perhaps it should move to the lib/http_client.c
    4647 */
    47 void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post, char* user, char* pass, char** arguments, int arguments_len)
     48void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post, char* user, char* pass, char* oauth_token, char** arguments, int arguments_len)
    4849{
    4950        url_t *url = g_new0( url_t, 1 );
     
    110111
    111112        // If a pass and user are given we append them to the request.
    112         if (userpass_base64)
     113        if (oauth_token)
     114        {
     115                char *full_header;
     116               
     117                full_header = oauth_http_header(oauth_token,
     118                                                is_post ? "POST" : "GET",
     119                                                url_string, url_arguments);
     120               
     121                tmp = g_strdup_printf("%sAuthorization: %s\r\n", request, full_header);
     122                g_free(request);
     123                g_free(full_header);
     124                request = tmp;
     125        }
     126        else if (userpass_base64)
    113127        {
    114128                tmp = g_strdup_printf("%sAuthorization: Basic %s\r\n", request, userpass_base64);
  • protocols/twitter/twitter_http.h

    rb2bc25c r508c340  
    2929
    3030void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post,
    31                                         char* user, char* pass, char** arguments, int arguments_len);
     31                   char* user, char* pass, char *oauth_token, char** arguments, int arguments_len);
    3232
    3333#endif //_TWITTER_HTTP_H
  • protocols/twitter/twitter_lib.c

    rb2bc25c r508c340  
    130130        args[0] = "cursor";
    131131        args[1] = g_strdup_printf ("%d", next_cursor);
    132         twitter_http(TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, td->user, td->pass, args, 2);
     132        twitter_http(TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, td->user, td->pass, td->oauth, args, 2);
    133133
    134134        g_free(args[1]);
     
    396396        }
    397397
    398         twitter_http(TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, td->user, td->pass, args, td->home_timeline_id ? 4 : 2);
     398        twitter_http(TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, td->user, td->pass, td->oauth, args, td->home_timeline_id ? 4 : 2);
    399399
    400400        g_free(args[1]);
     
    620620        args[1] = g_strdup_printf ("%d", next_cursor);
    621621
    622         twitter_http(TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, args, 2);
     622        twitter_http(TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, td->oauth, args, 2);
    623623
    624624        g_free(args[1]);
     
    654654        args[0] = "status";
    655655        args[1] = msg;
    656         twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, args, 2);
     656        twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth, args, 2);
    657657//      g_free(args[1]);
    658658}
     
    672672        args[3] = msg;
    673673        // Use the same callback as for twitter_post_status, since it does basically the same.
    674         twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, args, 4);
     674        twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth, args, 4);
    675675//      g_free(args[1]);
    676676//      g_free(args[3]);
Note: See TracChangeset for help on using the changeset viewer.