aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-05-01 14:53:59 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-05-01 14:53:59 +0100
commitc2ecadc08daa5163f4c90aef36de0e33d0d44f16 (patch)
treea88c01b58c6ec593f47b6efffec5be6d80555737 /protocols
parent85ef57f94436f23447c0d8603b52977824381854 (diff)
Cleaned up OAuth stuff: consumer key/secret should *not* be in lib/oauth.c.
Keep it in the Twitter module, and use the oauth_info struct through the whole session to keep all this together.
Diffstat (limited to 'protocols')
-rw-r--r--protocols/twitter/twitter.c46
-rw-r--r--protocols/twitter/twitter.h5
-rw-r--r--protocols/twitter/twitter_http.c10
-rw-r--r--protocols/twitter/twitter_http.h4
-rw-r--r--protocols/twitter/twitter_lib.c12
5 files changed, 42 insertions, 35 deletions
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c
index f5baeeea..6d43d819 100644
--- a/protocols/twitter/twitter.c
+++ b/protocols/twitter/twitter.c
@@ -27,7 +27,6 @@
#include "twitter_http.h"
#include "twitter_lib.h"
-
/**
* Main loop function
*/
@@ -65,6 +64,16 @@ static void twitter_main_loop_start( struct im_connection *ic )
td->main_loop_id = b_timeout_add(60000, twitter_main_loop, ic);
}
+
+static struct oauth_service twitter_oauth =
+{
+ "http://api.twitter.com/oauth/request_token",
+ "http://api.twitter.com/oauth/access_token",
+ "http://api.twitter.com/oauth/authorize",
+ .consumer_key = "xsDNKJuNZYkZyMcu914uEA",
+ .consumer_secret = "FCxqcr0pXKzsF9ajmP57S3VQ8V6Drk4o2QYtqMcOszo",
+};
+
static gboolean twitter_oauth_callback( struct oauth_info *info );
static void twitter_oauth_start( struct im_connection *ic )
@@ -73,8 +82,7 @@ static void twitter_oauth_start( struct im_connection *ic )
imcb_log( ic, "Requesting OAuth request token" );
- td->oauth_info = oauth_request_token(
- TWITTER_OAUTH_REQUEST_TOKEN, twitter_oauth_callback, ic );
+ td->oauth_info = oauth_request_token( &twitter_oauth, twitter_oauth_callback, ic );
}
static gboolean twitter_oauth_callback( struct oauth_info *info )
@@ -99,26 +107,24 @@ static gboolean twitter_oauth_callback( struct oauth_info *info )
sprintf( name, "twitter_%s", ic->acc->user );
msg = g_strdup_printf( "To finish OAuth authentication, please visit "
- "%s?%s and respond with the resulting PIN code.",
- TWITTER_OAUTH_AUTHORIZE, info->auth_params );
+ "%s and respond with the resulting PIN code.",
+ info->auth_url );
imcb_buddy_msg( ic, name, msg, 0, 0 );
g_free( msg );
}
else if( info->stage == OAUTH_ACCESS_TOKEN )
{
- if( info->access_token == NULL )
+ if( info->token == NULL )
{
imcb_error( ic, "OAuth error: %s", info->http->status_string );
imc_logout( ic, TRUE );
return FALSE;
}
- td->oauth = g_strdup( info->access_token );
-
/* IM mods didn't do this so far and it's ugly but I should
be able to get away with it... */
- g_free( ic->acc->pass );
- ic->acc->pass = g_strdup( info->access_token );
+ //g_free( ic->acc->pass );
+ //ic->acc->pass = g_strdup( info->access_token );
twitter_main_loop_start( ic );
}
@@ -126,6 +132,7 @@ static gboolean twitter_oauth_callback( struct oauth_info *info )
return TRUE;
}
+
static char *set_eval_mode( set_t *set, char *value )
{
if( g_strcasecmp( value, "one" ) == 0 ||
@@ -163,15 +170,15 @@ static void twitter_login( account_t *acc )
td->user = acc->user;
if( !set_getbool( &acc->set, "oauth" ) )
td->pass = g_strdup( acc->pass );
- else if( strstr( acc->pass, "oauth_token=" ) )
- td->oauth = g_strdup( acc->pass );
+ //else if( strstr( acc->pass, "oauth_token=" ) )
+ // td->oauth = g_strdup( acc->pass );
td->home_timeline_id = 0;
sprintf( name, "twitter_%s", acc->user );
imcb_add_buddy( ic, name, NULL );
imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL );
- if( td->pass || td->oauth )
+ if( td->pass || td->oauth_info )
twitter_main_loop_start( ic );
else
twitter_oauth_start( ic );
@@ -196,9 +203,7 @@ static void twitter_logout( struct im_connection *ic )
if( td )
{
oauth_info_free( td->oauth_info );
-
g_free( td->pass );
- g_free( td->oauth );
g_free( td );
}
@@ -215,10 +220,15 @@ static int twitter_buddy_msg( struct im_connection *ic, char *who, char *message
if (g_strncasecmp(who, "twitter_", 8) == 0 &&
g_strcasecmp(who + 8, ic->acc->user) == 0)
{
- if( set_getbool( &ic->acc->set, "oauth" ) && td->oauth_info )
+ if( set_getbool( &ic->acc->set, "oauth" ) &&
+ td->oauth_info && td->oauth_info->token == NULL )
{
- oauth_access_token( TWITTER_OAUTH_ACCESS_TOKEN, message, td->oauth_info );
- td->oauth_info = NULL;
+ if( !oauth_access_token( message, td->oauth_info ) )
+ {
+ imcb_error( ic, "OAuth error: %s", "Failed to send access token request" );
+ imc_logout( ic, TRUE );
+ return FALSE;
+ }
}
else
twitter_post_status(ic, message);
diff --git a/protocols/twitter/twitter.h b/protocols/twitter/twitter.h
index 9c046b66..24f61e42 100644
--- a/protocols/twitter/twitter.h
+++ b/protocols/twitter/twitter.h
@@ -36,7 +36,6 @@ struct twitter_data
{
char* user;
char* pass;
- char* oauth;
struct oauth_info *oauth_info;
guint64 home_timeline_id;
gint main_loop_id;
@@ -51,8 +50,4 @@ struct twitter_data
*/
GSList *twitter_connections;
-#define TWITTER_OAUTH_REQUEST_TOKEN "http://api.twitter.com/oauth/request_token"
-#define TWITTER_OAUTH_ACCESS_TOKEN "http://api.twitter.com/oauth/access_token"
-#define TWITTER_OAUTH_AUTHORIZE "http://api.twitter.com/oauth/authorize"
-
#endif //_TWITTER_H
diff --git a/protocols/twitter/twitter_http.c b/protocols/twitter/twitter_http.c
index 93e315fa..51f437df 100644
--- a/protocols/twitter/twitter_http.c
+++ b/protocols/twitter/twitter_http.c
@@ -28,7 +28,6 @@
* *
****************************************************************************/
-#include "twitter_http.h"
#include "twitter.h"
#include "bitlbee.h"
#include "url.h"
@@ -38,6 +37,8 @@
#include <ctype.h>
#include <errno.h>
+#include "twitter_http.h"
+
char *twitter_url_append(char *url, char *key, char* value);
@@ -45,7 +46,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* oauth_token, char** arguments, int arguments_len)
+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)
{
url_t *url = g_new0( url_t, 1 );
char *tmp;
@@ -110,12 +111,11 @@ 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 (oauth_token)
+ if (oi)
{
char *full_header;
- full_header = oauth_http_header(oauth_token,
- is_post ? "POST" : "GET",
+ full_header = oauth_http_header(oi, is_post ? "POST" : "GET",
url_string, url_arguments);
tmp = g_strdup_printf("%sAuthorization: %s\r\n", request, full_header);
diff --git a/protocols/twitter/twitter_http.h b/protocols/twitter/twitter_http.h
index 1e29fb99..5ef2530f 100644
--- a/protocols/twitter/twitter_http.h
+++ b/protocols/twitter/twitter_http.h
@@ -27,8 +27,10 @@
#include "nogaim.h"
#include "http_client.h"
+struct oauth_info;
+
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);
+ char* user, char* pass, struct oauth_info *oi, char** arguments, int arguments_len);
#endif //_TWITTER_HTTP_H
diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c
index c91f8bbf..ee6e39fe 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, td->oauth, args, 2);
+ twitter_http(TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, td->user, td->pass, td->oauth_info, 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, td->oauth, 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_info, args, td->home_timeline_id ? 4 : 2);
g_free(args[1]);
if (td->home_timeline_id) {
@@ -509,7 +509,7 @@ static void twitter_http_get_home_timeline(struct http_request *req)
if (req->status_code == 200)
{
td->http_fails = 0;
- if (!ic->flags & OPT_LOGGED_IN)
+ if (!(ic->flags & OPT_LOGGED_IN))
imcb_connected(ic);
}
else if (req->status_code == 401)
@@ -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, td->oauth, args, 2);
+ twitter_http(TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, td->oauth_info, 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, td->oauth, args, 2);
+ twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth_info, 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, td->oauth, args, 4);
+ twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth_info, args, 4);
// g_free(args[1]);
// g_free(args[3]);
}