aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/msn/soap.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-08-15 14:23:03 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-08-15 14:23:03 +0100
commit660cb00687dbe0abd37e705a2923d1cf8bf6f45c (patch)
tree42f432e33f19733b7d2e7c38255fe0071ec720a1 /protocols/msn/soap.c
parent5a7af1ba940521a65b3611e5f96ffa9306497e45 (diff)
Parse authentication errors.
Diffstat (limited to 'protocols/msn/soap.c')
-rw-r--r--protocols/msn/soap.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/protocols/msn/soap.c b/protocols/msn/soap.c
index b8762ce1..fe716d9d 100644
--- a/protocols/msn/soap.c
+++ b/protocols/msn/soap.c
@@ -172,6 +172,7 @@ struct msn_soap_passport_sso_data
char *policy;
char *nonce;
char *secret;
+ char *error;
};
static int msn_soap_passport_sso_build_request( struct msn_soap_req_data *soap_req )
@@ -216,8 +217,25 @@ static xt_status msn_soap_passport_sso_token( struct xt_node *node, gpointer dat
return XT_HANDLED;
}
+static xt_status msn_soap_passport_failure( struct xt_node *node, gpointer data )
+{
+ struct msn_soap_req_data *soap_req = data;
+ struct msn_soap_passport_sso_data *sd = soap_req->data;
+ struct xt_node *code = xt_find_node( node->children, "faultcode" );
+ struct xt_node *string = xt_find_node( node->children, "faultstring" );
+
+ if( code == NULL || code->text_len == 0 )
+ sd->error = g_strdup( "Unknown error" );
+ else
+ sd->error = g_strdup_printf( "%s (%s)", code->text, string && string->text_len ?
+ string->text : "no description available" );
+
+ return XT_HANDLED;
+}
+
static const struct xt_handler_entry msn_soap_passport_sso_parser[] = {
{ "wsse:BinarySecurityToken", "wst:RequestedSecurityToken", msn_soap_passport_sso_token },
+ { "S:Fault", "S:Envelope", msn_soap_passport_failure },
{ NULL, NULL, NULL }
};
@@ -269,6 +287,12 @@ static int msn_soap_passport_sso_handle_response( struct msn_soap_req_data *soap
GUINT32_TO_LE( 20 ),
GUINT32_TO_LE( 72 ),
};
+
+ if( sd->secret == NULL )
+ {
+ msn_auth_got_passport_token( ic, NULL, sd->error );
+ return MSN_SOAP_OK;
+ }
key1_len = base64_decode( sd->secret, (unsigned char**) &key1 );
@@ -286,7 +310,7 @@ static int msn_soap_passport_sso_handle_response( struct msn_soap_req_data *soap
memcpy( blurb.cipherbytes, des3res, 72 );
blurb64 = base64_encode( (unsigned char*) &blurb, sizeof( blurb ) );
- msn_auth_got_passport_token( ic, blurb64 );
+ msn_auth_got_passport_token( ic, blurb64, NULL );
g_free( padnonce );
g_free( blurb64 );
@@ -305,6 +329,7 @@ static int msn_soap_passport_sso_free_data( struct msn_soap_req_data *soap_req )
g_free( sd->policy );
g_free( sd->nonce );
g_free( sd->secret );
+ g_free( sd->error );
return MSN_SOAP_OK;
}