aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/oauth.c40
-rw-r--r--lib/oauth.h2
-rw-r--r--protocols/twitter/twitter.c7
-rw-r--r--protocols/twitter/twitter.h1
-rw-r--r--protocols/twitter/twitter_http.c18
-rw-r--r--protocols/twitter/twitter_http.h2
-rw-r--r--protocols/twitter/twitter_lib.c10
7 files changed, 54 insertions, 26 deletions
diff --git a/lib/oauth.c b/lib/oauth.c
index c166d96a..6731fe7e 100644
--- a/lib/oauth.c
+++ b/lib/oauth.c
@@ -174,9 +174,8 @@ const char *oauth_params_get( GSList **params, const char *key )
return NULL;
}
-GSList *oauth_params_parse( char *in )
+static void oauth_params_parse( GSList **params, char *in )
{
- GSList *ret = NULL;
char *amp, *eq;
while( in && *in )
@@ -189,7 +188,7 @@ GSList *oauth_params_parse( char *in )
if( ( amp = strchr( eq + 1, '&' ) ) )
*amp = '\0';
- oauth_params_add( &ret, in, eq + 1 );
+ oauth_params_add( params, in, eq + 1 );
*eq = '=';
if( amp == NULL )
@@ -198,8 +197,6 @@ GSList *oauth_params_parse( char *in )
*amp = '&';
in = amp + 1;
}
-
- return ret;
}
void oauth_params_free( GSList **params )
@@ -311,10 +308,10 @@ static void oauth_request_token_done( struct http_request *req )
if( req->status_code == 200 )
{
- GSList *params;
+ GSList *params = NULL;
st->auth_params = g_strdup( req->reply_body );
- params = oauth_params_parse( st->auth_params );
+ oauth_params_parse( &params, st->auth_params );
st->token = g_strdup( oauth_params_get( &params, "oauth_token" ) );
oauth_params_free( &params );
}
@@ -344,13 +341,13 @@ static void oauth_access_token_done( struct http_request *req )
//st->func( st );
}
-char *oauth_http_header( char *access_token, const char *method, const char *url )
+char *oauth_http_header( char *access_token, const char *method, const char *url, char *args )
{
- GSList *params, *l;
- char *token_secret, *sig, *params_s;
+ GSList *params = NULL, *l;
+ char *token_secret, *sig, *params_s, *s;
GString *ret = NULL;
- params = oauth_params_parse( access_token );
+ oauth_params_parse( &params, access_token );
if( params == NULL )
goto err;
token_secret = g_strdup( oauth_params_get( &params, "oauth_token_secret" ) );
@@ -360,12 +357,6 @@ char *oauth_http_header( char *access_token, const char *method, const char *url
oauth_add_default_params( &params );
- 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 );
-
ret = g_string_new( "OAuth " );
for( l = params; l; l = l->next )
{
@@ -385,6 +376,21 @@ char *oauth_http_header( char *access_token, const char *method, const char *url
g_string_append( ret, "\", " );
}
+ if( args )
+ oauth_params_parse( &params, args );
+ if( ( s = strchr( url, '?' ) ) )
+ {
+ s = g_strdup( s + 1 );
+ oauth_params_parse( &params, s + 1 );
+ g_free( s );
+ }
+
+ 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 );
err:
diff --git a/lib/oauth.h b/lib/oauth.h
index 160e30f1..98e58c64 100644
--- a/lib/oauth.h
+++ b/lib/oauth.h
@@ -20,3 +20,5 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
* *
\***************************************************************************/
+
+char *oauth_http_header( char *access_token, const char *method, const char *url, char *args );
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c
index 726c7cb1..ead03c56 100644
--- a/protocols/twitter/twitter.c
+++ b/protocols/twitter/twitter.c
@@ -81,7 +81,10 @@ static void twitter_login( account_t *acc )
twitter_connections = g_slist_append( twitter_connections, ic );
td->user = acc->user;
- td->pass = acc->pass;
+ if( strstr( acc->pass, "oauth_token=" ) == NULL )
+ td->pass = g_strdup( acc->pass );
+ else
+ td->oauth = g_strdup( acc->pass );
td->home_timeline_id = 0;
ic->proto_data = td;
@@ -118,6 +121,8 @@ static void twitter_logout( struct im_connection *ic )
if( td )
{
+ g_free( td->pass );
+ g_free( td->oauth );
g_free( td );
}
diff --git a/protocols/twitter/twitter.h b/protocols/twitter/twitter.h
index 88caa104..16620e1d 100644
--- a/protocols/twitter/twitter.h
+++ b/protocols/twitter/twitter.h
@@ -36,6 +36,7 @@ struct twitter_data
{
char* user;
char* pass;
+ char* oauth;
guint64 home_timeline_id;
gint main_loop_id;
struct groupchat *home_timeline_gc;
diff --git a/protocols/twitter/twitter_http.c b/protocols/twitter/twitter_http.c
index 3632140f..93e315fa 100644
--- a/protocols/twitter/twitter_http.c
+++ b/protocols/twitter/twitter_http.c
@@ -34,6 +34,7 @@
#include "url.h"
#include "misc.h"
#include "base64.h"
+#include "oauth.h"
#include <ctype.h>
#include <errno.h>
@@ -44,7 +45,7 @@ char *twitter_url_append(char *url, char *key, char* value);
* Do a request.
* This is actually pretty generic function... Perhaps it should move to the lib/http_client.c
*/
-void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post, char* user, char* pass, char** arguments, int arguments_len)
+void *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)
{
url_t *url = g_new0( url_t, 1 );
char *tmp;
@@ -109,7 +110,20 @@ void *twitter_http(char *url_string, http_input_function func, gpointer data, in
is_post ? "POST" : "GET", url->file, url->host );
// If a pass and user are given we append them to the request.
- if (userpass_base64)
+ if (oauth_token)
+ {
+ char *full_header;
+
+ full_header = oauth_http_header(oauth_token,
+ is_post ? "POST" : "GET",
+ url_string, url_arguments);
+
+ tmp = g_strdup_printf("%sAuthorization: %s\r\n", request, full_header);
+ g_free(request);
+ g_free(full_header);
+ request = tmp;
+ }
+ else if (userpass_base64)
{
tmp = g_strdup_printf("%sAuthorization: Basic %s\r\n", request, userpass_base64);
g_free(request);
diff --git a/protocols/twitter/twitter_http.h b/protocols/twitter/twitter_http.h
index ec4a0b7c..1e29fb99 100644
--- a/protocols/twitter/twitter_http.h
+++ b/protocols/twitter/twitter_http.h
@@ -28,7 +28,7 @@
#include "http_client.h"
void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post,
- char* user, char* pass, char** arguments, int arguments_len);
+ char* user, char* pass, char *oauth_token, char** arguments, int arguments_len);
#endif //_TWITTER_HTTP_H
diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c
index d58afd73..c91f8bbf 100644
--- a/protocols/twitter/twitter_lib.c
+++ b/protocols/twitter/twitter_lib.c
@@ -129,7 +129,7 @@ void twitter_get_friends_ids(struct im_connection *ic, int next_cursor)
char* args[2];
args[0] = "cursor";
args[1] = g_strdup_printf ("%d", next_cursor);
- twitter_http(TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, td->user, td->pass, args, 2);
+ twitter_http(TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, td->user, td->pass, td->oauth, args, 2);
g_free(args[1]);
}
@@ -395,7 +395,7 @@ void twitter_get_home_timeline(struct im_connection *ic, int next_cursor)
args[3] = g_strdup_printf ("%llu", (long long unsigned int) td->home_timeline_id);
}
- twitter_http(TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, td->user, td->pass, args, td->home_timeline_id ? 4 : 2);
+ 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);
g_free(args[1]);
if (td->home_timeline_id) {
@@ -619,7 +619,7 @@ void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor)
args[0] = "cursor";
args[1] = g_strdup_printf ("%d", next_cursor);
- twitter_http(TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, args, 2);
+ twitter_http(TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, td->oauth, args, 2);
g_free(args[1]);
}
@@ -653,7 +653,7 @@ void twitter_post_status(struct im_connection *ic, char* msg)
char* args[2];
args[0] = "status";
args[1] = msg;
- twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, args, 2);
+ twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth, args, 2);
// g_free(args[1]);
}
@@ -671,7 +671,7 @@ void twitter_direct_messages_new(struct im_connection *ic, char *who, char *msg)
args[2] = "text";
args[3] = msg;
// Use the same callback as for twitter_post_status, since it does basically the same.
- twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, args, 4);
+ twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth, args, 4);
// g_free(args[1]);
// g_free(args[3]);
}