Changeset bb5ce4d1


Ignore:
Timestamp:
2010-05-23T12:50:51Z (9 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
a7b9ec7
Parents:
f9110b4
Message:

Added base_url settting to Twitter module so other services using the
Twitter API can be used. Only with Basic authentication though.

Location:
protocols/twitter
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • protocols/twitter/twitter.c

    rf9110b4 rbb5ce4d1  
    2727#include "twitter_http.h"
    2828#include "twitter_lib.h"
     29#include "url.h"
    2930
    3031/**
     
    160161        set_t *s;
    161162       
     163        s = set_add( &acc->set, "base_url", TWITTER_API_URL, NULL, acc );
     164        s->flags |= ACC_SET_OFFLINE_ONLY;
     165       
    162166        s = set_add( &acc->set, "message_length", "140", set_eval_int, acc );
    163167       
     
    175179{
    176180        struct im_connection *ic = imcb_new( acc );
    177         struct twitter_data *td = g_new0( struct twitter_data, 1 );
     181        struct twitter_data *td;
    178182        char name[strlen(acc->user)+9];
    179 
     183        url_t url;
     184
     185        if( !url_set( &url, set_getstr( &ic->acc->set, "base_url" ) ) ||
     186            ( url.proto != PROTO_HTTP && url.proto != PROTO_HTTPS ) )
     187        {
     188                imcb_error( ic, "Incorrect API base URL: %s", set_getstr( &ic->acc->set, "base_url" ) );
     189                imc_logout( ic, FALSE );
     190                return;
     191        }
     192       
    180193        twitter_connections = g_slist_append( twitter_connections, ic );
     194        td = g_new0( struct twitter_data, 1 );
    181195        ic->proto_data = td;
    182196       
     197        td->url_ssl = url.proto == PROTO_HTTPS;
     198        td->url_port = url.port;
     199        td->url_host = g_strdup( url.host );
     200        if( strcmp( url.file, "/" ) != 0 )
     201                td->url_path = g_strdup( url.file );
     202        else
     203                td->url_path = g_strdup( "" );
     204       
    183205        td->user = acc->user;
    184         if( !set_getbool( &acc->set, "oauth" ) )
    185                 td->pass = g_strdup( acc->pass );
    186         else if( strstr( acc->pass, "oauth_token=" ) )
     206        if( strstr( acc->pass, "oauth_token=" ) )
    187207                td->oauth_info = oauth_from_string( acc->pass, &twitter_oauth );
    188         td->home_timeline_id = 0;
    189208       
    190209        sprintf( name, "twitter_%s", acc->user );
     
    192211        imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL );
    193212       
    194         if( td->pass || td->oauth_info )
     213        if( td->oauth_info || !set_getbool( &acc->set, "oauth" ) )
    195214                twitter_main_loop_start( ic );
    196215        else
  • protocols/twitter/twitter.h

    rf9110b4 rbb5ce4d1  
    4242        struct groupchat *home_timeline_gc;
    4343        gint http_fails;
     44       
     45        gboolean url_ssl;
     46        int url_port;
     47        char *url_host;
     48        char *url_path;
    4449};
    4550
  • protocols/twitter/twitter_http.c

    rf9110b4 rbb5ce4d1  
    4141
    4242
    43 char *twitter_url_append(char *url, char *key, char* value);
     43static char *twitter_url_append(char *url, char *key, char* value);
    4444
    4545/**
     
    4747 * This is actually pretty generic function... Perhaps it should move to the lib/http_client.c
    4848 */
    49 void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post, char* user, char* pass, struct oauth_info* oi, char** arguments, int arguments_len)
     49void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func, gpointer data, int is_post, char** arguments, int arguments_len)
    5050{
    51         url_t *url = g_new0( url_t, 1 );
     51        struct twitter_data *td = ic->proto_data;
    5252        char *tmp;
    53         char *request;
     53        GString *request = g_string_new("");
    5454        void *ret;
    55         char *userpass = NULL;
    56         char *userpass_base64;
    5755        char *url_arguments;
    5856
    59         // Fill the url structure.
    60         if( !url_set( url, url_string ) )
    61         {
    62                 g_free( url );
    63                 return NULL;
    64         }
    65 
    66         if( url->proto != PROTO_HTTP && url->proto != PROTO_HTTPS )
    67         {
    68                 g_free( url );
    69                 return NULL;
    70         }
    71 
    72         // Concatenate user and pass
    73         if (user && pass) {
    74                 userpass = g_strdup_printf("%s:%s", user, pass);
    75                 userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass));
    76         } else {
    77                 userpass_base64 = NULL;
    78         }
    79 
    80         url_arguments = g_malloc(1);
    81         url_arguments[0] = '\0';
     57        url_arguments = g_strdup("");
    8258
    8359        // Construct the url arguments.
     
    9369        }
    9470
    95         // Do GET stuff...
    96         if (!is_post)
    97         {
    98                 // Find the char-pointer of the end of the string.
    99                 tmp = url->file + strlen(url->file);
    100                 tmp[0] = '?';
    101                 // append the url_arguments to the end of the url->file.
    102                 // TODO GM: Check the length?
    103                 g_stpcpy (tmp+1, url_arguments);
    104         }
    105 
    106 
    10771        // Make the request.
    108         request = g_strdup_printf(  "%s %s HTTP/1.0\r\n"
    109                                     "Host: %s\r\n"
    110                                     "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n",
    111                                     is_post ? "POST" : "GET", url->file, url->host );
     72        g_string_printf(request, "%s %s%s%s%s HTTP/1.0\r\n"
     73                                 "Host: %s\r\n"
     74                                 "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n",
     75                                 is_post ? "POST" : "GET",
     76                                 td->url_path, url_string,
     77                                 is_post ? "" : "?", is_post ? "" : url_arguments,
     78                                 td->url_host);
    11279
    11380        // If a pass and user are given we append them to the request.
    114         if (oi)
     81        if (td->oauth_info)
    11582        {
    11683                char *full_header;
     84                char *full_url;
    11785               
    118                 full_header = oauth_http_header(oi, is_post ? "POST" : "GET",
    119                                                 url_string, url_arguments);
     86                full_url = g_strconcat(set_getstr(&ic->acc->set, "base_url" ), url_string, NULL);
     87                full_header = oauth_http_header(td->oauth_info, is_post ? "POST" : "GET",
     88                                                full_url, url_arguments);
    12089               
    121                 tmp = g_strdup_printf("%sAuthorization: %s\r\n", request, full_header);
    122                 g_free(request);
     90                g_string_append_printf(request, "Authorization: %s\r\n", full_header);
    12391                g_free(full_header);
    124                 request = tmp;
     92                g_free(full_url);
    12593        }
    126         else if (userpass_base64)
     94        else
    12795        {
    128                 tmp = g_strdup_printf("%sAuthorization: Basic %s\r\n", request, userpass_base64);
    129                 g_free(request);
    130                 request = tmp;
     96                char userpass[strlen(ic->acc->user)+2+strlen(ic->acc->pass)];
     97                char *userpass_base64;
     98               
     99                g_snprintf(userpass, sizeof(userpass), "%s:%s", ic->acc->user, ic->acc->pass);
     100                userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass));
     101                g_string_append_printf(request, "Authorization: Basic %s\r\n", userpass_base64);
     102                g_free( userpass_base64 );
    131103        }
    132104
     
    135107        {
    136108                // Append the Content-Type and url-encoded arguments.
    137                 tmp = g_strdup_printf("%sContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %zd\r\n\r\n%s",
    138                                                                 request, strlen(url_arguments), url_arguments);
    139                 g_free(request);
    140                 request = tmp;
     109                g_string_append_printf(request,
     110                                       "Content-Type: application/x-www-form-urlencoded\r\n"
     111                                       "Content-Length: %zd\r\n\r\n%s",
     112                                       strlen(url_arguments), url_arguments);
    141113        } else {
    142114                // Append an extra \r\n to end the request...
    143                 tmp = g_strdup_printf("%s\r\n", request);
    144                 g_free(request);
    145                 request = tmp;
     115                g_string_append(request, "\r\n");
    146116        }
    147117
    148         ret = http_dorequest( url->host, url->port,     url->proto == PROTO_HTTPS, request, func, data );
     118        ret = http_dorequest(td->url_host, td->url_port, td->url_ssl, request->str, func, data);
    149119
    150         g_free( url );
    151         g_free( userpass );
    152         g_free( userpass_base64 );
    153120        g_free( url_arguments );
    154         g_free( request );
     121        g_string_free( request, TRUE );
    155122        return ret;
    156123}
    157124
    158 char *twitter_url_append(char *url, char *key, char* value)
     125static char *twitter_url_append(char *url, char *key, char* value)
    159126{
    160127        char *key_encoded = g_strndup(key, 3 * strlen(key));
  • protocols/twitter/twitter_http.h

    rf9110b4 rbb5ce4d1  
    3030struct oauth_info;
    3131
    32 void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post,
    33                    char* user, char* pass, struct oauth_info *oi, char** arguments, int arguments_len);
     32void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func,
     33                   gpointer data, int is_post, char** arguments, int arguments_len);
    3434
    3535#endif //_TWITTER_HTTP_H
  • protocols/twitter/twitter_lib.c

    rf9110b4 rbb5ce4d1  
    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, td->oauth_info, args, 2);
     132        twitter_http(ic, TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, 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, td->oauth_info, args, td->home_timeline_id ? 4 : 2);
     398        twitter_http(ic, TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, args, td->home_timeline_id ? 4 : 2);
    399399
    400400        g_free(args[1]);
     
    623623        args[1] = g_strdup_printf ("%d", next_cursor);
    624624
    625         twitter_http(TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, td->oauth_info, args, 2);
     625        twitter_http(ic, TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, args, 2);
    626626
    627627        g_free(args[1]);
     
    657657        args[0] = "status";
    658658        args[1] = msg;
    659         twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth_info, args, 2);
     659        twitter_http(ic, TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, args, 2);
    660660//      g_free(args[1]);
    661661}
     
    675675        args[3] = msg;
    676676        // Use the same callback as for twitter_post_status, since it does basically the same.
    677         twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth_info, args, 4);
     677        twitter_http(ic, TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, args, 4);
    678678//      g_free(args[1]);
    679679//      g_free(args[3]);
  • protocols/twitter/twitter_lib.h

    rf9110b4 rbb5ce4d1  
    3232
    3333/* Status URLs */
    34 #define TWITTER_STATUS_UPDATE_URL TWITTER_API_URL "/statuses/update.xml"
    35 #define TWITTER_STATUS_SHOW_URL TWITTER_API_URL "/statuses/show/"
    36 #define TWITTER_STATUS_DESTROY_URL TWITTER_API_URL "/statuses/destroy/"
     34#define TWITTER_STATUS_UPDATE_URL "/statuses/update.xml"
     35#define TWITTER_STATUS_SHOW_URL "/statuses/show/"
     36#define TWITTER_STATUS_DESTROY_URL "/statuses/destroy/"
    3737
    3838/* Timeline URLs */
    39 #define TWITTER_PUBLIC_TIMELINE_URL TWITTER_API_URL "/statuses/public_timeline.xml"
    40 #define TWITTER_FEATURED_USERS_URL TWITTER_API_URL "/statuses/featured.xml"
    41 #define TWITTER_FRIENDS_TIMELINE_URL TWITTER_API_URL "/statuses/friends_timeline.xml"
    42 #define TWITTER_HOME_TIMELINE_URL TWITTER_API_URL "/statuses/home_timeline.xml"
    43 #define TWITTER_MENTIONS_URL TWITTER_API_URL "/statuses/mentions.xml"
    44 #define TWITTER_USER_TIMELINE_URL TWITTER_API_URL "/statuses/user_timeline.xml"
     39#define TWITTER_PUBLIC_TIMELINE_URL "/statuses/public_timeline.xml"
     40#define TWITTER_FEATURED_USERS_URL "/statuses/featured.xml"
     41#define TWITTER_FRIENDS_TIMELINE_URL "/statuses/friends_timeline.xml"
     42#define TWITTER_HOME_TIMELINE_URL "/statuses/home_timeline.xml"
     43#define TWITTER_MENTIONS_URL "/statuses/mentions.xml"
     44#define TWITTER_USER_TIMELINE_URL "/statuses/user_timeline.xml"
    4545
    4646/* Users URLs */
    47 #define TWITTER_SHOW_USERS_URL TWITTER_API_URL "/users/show.xml"
    48 #define TWITTER_SHOW_FRIENDS_URL TWITTER_API_URL "/statuses/friends.xml"
    49 #define TWITTER_SHOW_FOLLOWERS_URL TWITTER_API_URL "/statuses/followers.xml"
     47#define TWITTER_SHOW_USERS_URL "/users/show.xml"
     48#define TWITTER_SHOW_FRIENDS_URL "/statuses/friends.xml"
     49#define TWITTER_SHOW_FOLLOWERS_URL "/statuses/followers.xml"
    5050
    5151/* Direct messages URLs */
    52 #define TWITTER_DIRECT_MESSAGES_URL TWITTER_API_URL "/direct_messages.xml"
    53 #define TWITTER_DIRECT_MESSAGES_NEW_URL TWITTER_API_URL "/direct_messages/new.xml"
    54 #define TWITTER_DIRECT_MESSAGES_SENT_URL TWITTER_API_URL "/direct_messages/sent.xml"
    55 #define TWITTER_DIRECT_MESSAGES_DESTROY_URL TWITTER_API_URL "/direct_messages/destroy/"
     52#define TWITTER_DIRECT_MESSAGES_URL "/direct_messages.xml"
     53#define TWITTER_DIRECT_MESSAGES_NEW_URL "/direct_messages/new.xml"
     54#define TWITTER_DIRECT_MESSAGES_SENT_URL "/direct_messages/sent.xml"
     55#define TWITTER_DIRECT_MESSAGES_DESTROY_URL "/direct_messages/destroy/"
    5656
    5757/* Friendships URLs */
    58 #define TWITTER_FRIENDSHIPS_CREATE_URL TWITTER_API_URL "/friendships/create.xml"
    59 #define TWITTER_FRIENDSHIPS_DESTROY_URL TWITTER_API_URL "/friendships/destroy.xml"
    60 #define TWITTER_FRIENDSHIPS_SHOW_URL TWITTER_API_URL "/friendships/show.xml"
     58#define TWITTER_FRIENDSHIPS_CREATE_URL "/friendships/create.xml"
     59#define TWITTER_FRIENDSHIPS_DESTROY_URL "/friendships/destroy.xml"
     60#define TWITTER_FRIENDSHIPS_SHOW_URL "/friendships/show.xml"
    6161
    6262/* Social graphs URLs */
    63 #define TWITTER_FRIENDS_IDS_URL TWITTER_API_URL "/friends/ids.xml"
    64 #define TWITTER_FOLLOWERS_IDS_URL TWITTER_API_URL "/followers/ids.xml"
     63#define TWITTER_FRIENDS_IDS_URL "/friends/ids.xml"
     64#define TWITTER_FOLLOWERS_IDS_URL "/followers/ids.xml"
    6565
    6666/* Account URLs */
    67 #define TWITTER_ACCOUNT_RATE_LIMIT_URL TWITTER_API_URL "/account/rate_limit_status.xml"
     67#define TWITTER_ACCOUNT_RATE_LIMIT_URL "/account/rate_limit_status.xml"
    6868
    6969/* Favorites URLs */
    70 #define TWITTER_FAVORITES_GET_URL TWITTER_API_URL "/favorites.xml"
    71 #define TWITTER_FAVORITE_CREATE_URL TWITTER_API_URL "/favorites/create/"
    72 #define TWITTER_FAVORITE_DESTROY_URL TWITTER_API_URL "/favorites/destroy/"
     70#define TWITTER_FAVORITES_GET_URL "/favorites.xml"
     71#define TWITTER_FAVORITE_CREATE_URL "/favorites/create/"
     72#define TWITTER_FAVORITE_DESTROY_URL "/favorites/destroy/"
    7373
    7474/* Block URLs */
    75 #define TWITTER_BLOCKS_CREATE_URL TWITTER_API_URL "/blocks/create/"
    76 #define TWITTER_BLOCKS_DESTROY_URL TWITTER_API_URL "/blocks/destroy/"
     75#define TWITTER_BLOCKS_CREATE_URL "/blocks/create/"
     76#define TWITTER_BLOCKS_DESTROY_URL "/blocks/destroy/"
    7777
    7878void twitter_get_friends_ids(struct im_connection *ic, int next_cursor);
Note: See TracChangeset for help on using the changeset viewer.