aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/msn
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-09-04 16:54:52 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-09-04 16:54:52 +0100
commit4aa8a046968bff0a08dc5ae96e228861fa21fcbe (patch)
tree99927daf2e094c7de4c60a7ed6298cf503b5882a /protocols/msn
parentbae06178bbe3863b39ec307c34d2781a53472272 (diff)
This works (includes some token sabotage code to ease testing), but I just
realised there's probably no need for the additional temporary NS connection.
Diffstat (limited to 'protocols/msn')
-rw-r--r--protocols/msn/msn.c7
-rw-r--r--protocols/msn/msn.h4
-rw-r--r--protocols/msn/ns.c15
-rw-r--r--protocols/msn/soap.c40
-rw-r--r--protocols/msn/soap.h2
5 files changed, 54 insertions, 14 deletions
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c
index c5c05087..1467f033 100644
--- a/protocols/msn/msn.c
+++ b/protocols/msn/msn.c
@@ -63,6 +63,7 @@ static void msn_login( account_t *acc )
md->ic = ic;
md->away_state = msn_away_state_list;
md->domaintree = g_tree_new( msn_domaintree_cmp );
+ md->ns->fd = md->auth->fd = -1;
msn_connections = g_slist_prepend( msn_connections, ic );
@@ -179,6 +180,8 @@ static void msn_set_away( struct im_connection *ic, char *state, char *message )
char *uux;
struct msn_data *md = ic->proto_data;
+ strcpy( md->tokens[1], md->tokens[2] );
+
if( state == NULL )
md->away_state = msn_away_state_list;
else if( ( md->away_state = msn_away_state_by_name( state ) ) == NULL )
@@ -280,7 +283,7 @@ static void msn_add_permit( struct im_connection *ic, char *who )
static void msn_rem_permit( struct im_connection *ic, char *who )
{
- msn_buddy_list_remove( ic, MSN_BUDDY_AL, who, NULL );
+ //msn_buddy_list_remove( ic, MSN_BUDDY_AL, who, NULL );
}
static void msn_add_deny( struct im_connection *ic, char *who )
@@ -298,7 +301,7 @@ static void msn_add_deny( struct im_connection *ic, char *who )
static void msn_rem_deny( struct im_connection *ic, char *who )
{
- msn_buddy_list_remove( ic, MSN_BUDDY_BL, who, NULL );
+ //msn_buddy_list_remove( ic, MSN_BUDDY_BL, who, NULL );
}
static int msn_send_typing( struct im_connection *ic, char *who, int typing )
diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h
index 5a195348..3def01a4 100644
--- a/protocols/msn/msn.h
+++ b/protocols/msn/msn.h
@@ -107,9 +107,9 @@ struct msn_data
int trId;
char *tokens[4];
- char *lock_key;
+ char *lock_key, *pp_policy;
- GSList *msgq, *grpq;
+ GSList *msgq, *grpq, *soapq;
GSList *switchboards;
int sb_failures;
time_t first_sb_failure;
diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c
index 6260e300..401461b2 100644
--- a/protocols/msn/ns.c
+++ b/protocols/msn/ns.c
@@ -110,7 +110,7 @@ static gboolean msn_ns_connected( gpointer data, gint source, b_input_condition
handler->rxlen = 0;
handler->rxq = g_new0( char, 1 );
- if( msn_ns_write( ic, -1, "VER %d %s CVR0\r\n", ++md->trId, MSNP_VER ) )
+ if( msn_ns_write( ic, source, "VER %d %s CVR0\r\n", ++md->trId, MSNP_VER ) )
{
handler->inpa = b_input_add( handler->fd, B_EV_IO_READ, msn_ns_callback, handler );
imcb_log( ic, "Connected to server, waiting for reply" );
@@ -172,13 +172,13 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num
return( 0 );
}
- return( msn_ns_write( ic, -1, "CVR %d 0x0409 mac 10.2.0 ppc macmsgs 3.5.1 macmsgs %s\r\n",
+ return( msn_ns_write( ic, handler->fd, "CVR %d 0x0409 mac 10.2.0 ppc macmsgs 3.5.1 macmsgs %s\r\n",
++md->trId, ic->acc->user ) );
}
else if( strcmp( cmd[0], "CVR" ) == 0 )
{
/* We don't give a damn about the information we just received */
- return msn_ns_write( ic, -1, "USR %d SSO I %s\r\n", ++md->trId, ic->acc->user );
+ return msn_ns_write( ic, handler->fd, "USR %d SSO I %s\r\n", ++md->trId, ic->acc->user );
}
else if( strcmp( cmd[0], "XFR" ) == 0 )
{
@@ -271,7 +271,14 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num
if( num_parts >= 6 && strcmp( cmd[2], "SSO" ) == 0 &&
strcmp( cmd[3], "S" ) == 0 )
{
- msn_soap_passport_sso_request( ic, cmd[4], cmd[5] );
+ g_free( md->pp_policy );
+ md->pp_policy = g_strdup( cmd[4] );
+ msn_soap_passport_sso_request( ic, cmd[5] );
+ if( handler == md->auth )
+ {
+ msn_ns_close( md->auth );
+ return 0;
+ }
}
else if( strcmp( cmd[2], "OK" ) == 0 )
{
diff --git a/protocols/msn/soap.c b/protocols/msn/soap.c
index 8d276108..592dbd4f 100644
--- a/protocols/msn/soap.c
+++ b/protocols/msn/soap.c
@@ -136,9 +136,24 @@ static void msn_soap_handle_response( struct http_request *http_req )
if( http_req->body_size > 0 )
{
struct xt_parser *parser;
+ struct xt_node *err;
parser = xt_new( soap_req->xml_parser, soap_req );
xt_feed( parser, http_req->reply_body, http_req->body_size );
+ if( http_req->status_code == 500 &&
+ ( err = xt_find_path( parser->root, "soap:Body/soap:Fault/detail/errorcode" ) ) &&
+ err->text_len > 0 && strcmp( err->text, "PassportAuthFail" ) == 0 )
+ {
+ struct msn_data *md = soap_req->ic->proto_data;
+
+ xt_free( parser );
+ if( md->auth->fd == -1 )
+ msn_ns_connect( soap_req->ic, md->auth, MSN_NS_HOST, MSN_NS_PORT );
+ md->soapq = g_slist_prepend( md->soapq, soap_req );
+
+ return;
+ }
+
xt_handle( parser, NULL, -1 );
xt_free( parser );
}
@@ -201,12 +216,24 @@ static void msn_soap_debug_print( const char *headers, const char *payload )
#endif
}
+static int msn_soapq_empty( struct im_connection *ic )
+{
+ struct msn_data *md = ic->proto_data;
+
+ while( md->soapq )
+ {
+ msn_soap_send_request( (struct msn_soap_req_data*) md->soapq->data );
+ md->soapq = g_slist_remove( md->soapq, md->soapq->data );
+ }
+
+ return MSN_SOAP_OK;
+}
+
/* passport_sso: Authentication MSNP15+ */
struct msn_soap_passport_sso_data
{
- char *policy;
char *nonce;
char *secret;
char *error;
@@ -216,6 +243,7 @@ static int msn_soap_passport_sso_build_request( struct msn_soap_req_data *soap_r
{
struct msn_soap_passport_sso_data *sd = soap_req->data;
struct im_connection *ic = soap_req->ic;
+ struct msn_data *md = ic->proto_data;
if( g_str_has_suffix( ic->acc->user, "@msn.com" ) )
soap_req->url = g_strdup( SOAP_PASSPORT_SSO_URL_MSN );
@@ -223,7 +251,7 @@ static int msn_soap_passport_sso_build_request( struct msn_soap_req_data *soap_r
soap_req->url = g_strdup( SOAP_PASSPORT_SSO_URL );
soap_req->payload = g_markup_printf_escaped( SOAP_PASSPORT_SSO_PAYLOAD,
- ic->acc->user, ic->acc->pass, sd->policy );
+ ic->acc->user, ic->acc->pass, md->pp_policy );
return MSN_SOAP_OK;
}
@@ -300,6 +328,7 @@ static int msn_soap_passport_sso_handle_response( struct msn_soap_req_data *soap
{
struct msn_soap_passport_sso_data *sd = soap_req->data;
struct im_connection *ic = soap_req->ic;
+ struct msn_data *md = ic->proto_data;
char *key1, *key2, *key3, *blurb64;
int key1_len;
unsigned char *padnonce, *des3res;
@@ -325,6 +354,9 @@ static int msn_soap_passport_sso_handle_response( struct msn_soap_req_data *soap
GUINT32_TO_LE( 72 ),
};
+ if( md->soapq )
+ return msn_soapq_empty( ic );
+
if( sd->secret == NULL )
{
msn_auth_got_passport_token( ic, NULL, sd->error );
@@ -363,7 +395,6 @@ static int msn_soap_passport_sso_free_data( struct msn_soap_req_data *soap_req )
{
struct msn_soap_passport_sso_data *sd = soap_req->data;
- g_free( sd->policy );
g_free( sd->nonce );
g_free( sd->secret );
g_free( sd->error );
@@ -371,11 +402,10 @@ static int msn_soap_passport_sso_free_data( struct msn_soap_req_data *soap_req )
return MSN_SOAP_OK;
}
-int msn_soap_passport_sso_request( struct im_connection *ic, const char *policy, const char *nonce )
+int msn_soap_passport_sso_request( struct im_connection *ic, const char *nonce )
{
struct msn_soap_passport_sso_data *sd = g_new0( struct msn_soap_passport_sso_data, 1 );
- sd->policy = g_strdup( policy );
sd->nonce = g_strdup( nonce );
return msn_soap_start( ic, sd, msn_soap_passport_sso_build_request,
diff --git a/protocols/msn/soap.h b/protocols/msn/soap.h
index 9fba5366..3a46af46 100644
--- a/protocols/msn/soap.h
+++ b/protocols/msn/soap.h
@@ -138,7 +138,7 @@
"</Body>" \
"</Envelope>"
-int msn_soap_passport_sso_request( struct im_connection *ic, const char *policy, const char *nonce );
+int msn_soap_passport_sso_request( struct im_connection *ic, const char *nonce );
#define SOAP_OIM_SEND_URL "https://ows.messenger.msn.com/OimWS/oim.asmx"