--- a/src/protocols/msn/notification.c Sun Jan 25 22:15:42 2004 +0000 +++ b/src/protocols/msn/notification.c Tue Jan 27 04:46:05 2004 +0000 @@ -128,38 +128,6 @@ return TRUE; } -static size_t -msn_ssl_read(GaimSslConnection *gsc, char **dest_buffer) -{ - size_t size = 0, s; - char *buffer = NULL; - char temp_buf[4096]; - - while ((s = gaim_ssl_read(gsc, temp_buf, sizeof(temp_buf))) > 0) - { - char *new_buffer = g_new(char, size + s + 1); - - if (buffer != NULL) - { - strncpy(new_buffer, buffer, size); - - g_free(buffer); - } - - buffer = new_buffer; - - strncpy(buffer + size, temp_buf, s); - - buffer[size + s] = '\0'; - - size += s; - } - - *dest_buffer = buffer; - - return size; -} - /************************************************************************** * Callbacks **************************************************************************/ @@ -312,300 +280,6 @@ return TRUE; } -static void -login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) -{ - MsnServConn *servconn = (MsnServConn *)data; - GaimAccount *account = servconn->session->account; - GaimConnection *gc = gaim_account_get_connection(account); - - gaim_connection_error(gc, _("Unable to connect to server")); -} - -static void -login_connect_cb(gpointer data, GaimSslConnection *gsc, - GaimInputCondition cond) -{ - MsnServConn *servconn = (MsnServConn *)data; - MsnSession *session = servconn->session; - GaimConnection *gc = gaim_account_get_connection(session->account); - char *username, *password; - char *request_str; - char *buffer = NULL; - char *tpf; - size_t s; - - username = - g_strdup(gaim_url_encode(gaim_account_get_username(session->account))); - password = - g_strdup(gaim_url_encode(gaim_account_get_password(session->account))); - - tpf = (char *)g_hash_table_lookup(session->ssl_challenge_data, "tpf"); - - request_str = g_strdup_printf( - "GET %s HTTP/1.1\r\n" - "Authorization: Passport1.4 OrgVerb=GET,OrgURL=%s,sign-in=%s,pwd=%s," - "lc=%s,id=%s,tw=%s,fs=%s,ru=%s,ct=%s,kpp=%s,kv=%s,ver=%s,tpf=%s\r\n" - "User-Agent: MSMSGS\r\n" - "Host: %s\r\n" - "Connection: Keep-Alive\r\n" - "Cache-Control: no-cache\r\n" - "\r\n", - session->ssl_login_path, - (char *)g_hash_table_lookup(session->ssl_challenge_data, "ru"), - username, password, - (char *)g_hash_table_lookup(session->ssl_challenge_data, "lc"), - (char *)g_hash_table_lookup(session->ssl_challenge_data, "id"), - (char *)g_hash_table_lookup(session->ssl_challenge_data, "tw"), - (char *)g_hash_table_lookup(session->ssl_challenge_data, "fs"), - (char *)g_hash_table_lookup(session->ssl_challenge_data, "ru"), - (char *)g_hash_table_lookup(session->ssl_challenge_data, "ct"), - (char *)g_hash_table_lookup(session->ssl_challenge_data, "kpp"), - (char *)g_hash_table_lookup(session->ssl_challenge_data, "kv"), - (char *)g_hash_table_lookup(session->ssl_challenge_data, "ver"), - (tpf == NULL ? "" : tpf), - session->ssl_login_host); - - gaim_debug(GAIM_DEBUG_MISC, "msn", "Sending: {%s}\n", request_str); - - g_free(username); - g_free(password); - - if ((s = gaim_ssl_write(gsc, request_str, strlen(request_str))) <= 0) - { - g_free(request_str); - gaim_connection_error(gc, _("Unable to write to MSN Nexus server.")); - - return; - } - - g_free(request_str); - - if ((s = msn_ssl_read(gsc, &buffer)) <= 0) - { - gaim_connection_error(gc, _("Unable to read from MSN Nexus server.")); - - if (buffer != NULL) - g_free(buffer); - - return; - } - - gaim_ssl_close(gsc); - - gaim_debug(GAIM_DEBUG_MISC, "msn", "ssl buffer: {%s}", buffer); - - if (strstr(buffer, "HTTP/1.1 302") != NULL) - { - /* Redirect. */ - char *location, *c; - - if ((location = strstr(buffer, "Location: ")) == NULL) - { - gaim_connection_error(gc, - _("MSN Nexus server returned invalid redirect information.")); - - g_free(buffer); - - return; - } - - location = strchr(location, ' ') + 1; - - if ((c = strchr(location, '\r')) != NULL) - *c = '\0'; - - /* Skip the http:// */ - if ((c = strchr(location, '/')) != NULL) - location = c + 2; - - if ((c = strchr(location, '/')) != NULL) - { - session->ssl_login_path = g_strdup(c); - - *c = '\0'; - } - - session->ssl_login_host = g_strdup(location); - - session->ssl_conn = gaim_ssl_connect(session->account, - session->ssl_login_host, - GAIM_SSL_DEFAULT_PORT, - login_connect_cb, login_error_cb, - servconn); - } - else if (strstr(buffer, "HTTP/1.1 401 Unauthorized") != NULL) - { - const char *error, *c; - char *temp; - - if ((error = strstr(buffer, "WWW-Authenticate")) != NULL) - { - if ((error = strstr(error, "cbtxt=")) != NULL) - { - error += strlen("cbtxt="); - - if ((c = strchr(error, '\n')) == NULL) - c = error + strlen(error); - - temp = g_strndup(error, c - error); - error = gaim_url_decode(temp); - g_free(temp); - } - } - - if (error == NULL) - { - gaim_connection_error(gc, - _("Unknown error when attempting to authorize with " - "MSN login server.")); - } - else - gaim_connection_error(gc, error); - } - else - { - char *base, *c; - char outparams[MSN_BUF_LEN]; - - g_free(session->ssl_login_host); - g_free(session->ssl_login_path); - g_hash_table_destroy(session->ssl_challenge_data); - - session->ssl_login_host = NULL; - session->ssl_login_path = NULL; - session->ssl_challenge_data = NULL; - -#if 0 - /* All your base are belong to us. */ - base = buffer; - - /* For great cookie! */ - while ((base = strstr(base, "Set-Cookie: ")) != NULL) - { - base += strlen("Set-Cookie: "); - - c = strchr(base, ';'); - - session->login_cookies = - g_list_append(session->login_cookies, - g_strndup(base, c - base)); - } -#endif - - if ((base = strstr(buffer, "Authentication-Info: ")) == NULL) - { - gaim_debug(GAIM_DEBUG_ERROR, "msn", - "Authentication information was not found. This did " - "not just happen, but if it did, you're screwed. " - "Report this.\n"); - - return; - } - - base = strstr(base, "from-PP='"); - base += strlen("from-PP='"); - c = strchr(base, '\''); - - session->ssl_login_params = g_strndup(base, c - base); - - g_snprintf(outparams, sizeof(outparams), - "TWN S %s", session->ssl_login_params); - - g_free(session->ssl_login_params); - session->ssl_login_params = NULL; - - if (!msn_servconn_send_command(session->notification_conn, "USR", - outparams)) - { - gaim_connection_error(gc, _("Unable to request USR\n")); - } - } - - g_free(buffer); -} - -static void -nexus_connect_cb(gpointer data, GaimSslConnection *gsc, - GaimInputCondition cond) -{ - MsnServConn *servconn = (MsnServConn *)data; - MsnSession *session = servconn->session; - GaimConnection *gc = gaim_account_get_connection(session->account); - char *request_str; - char *da_login; - char *base, *c; - char *buffer = NULL; - size_t s; - - request_str = g_strdup_printf("GET /rdr/pprdr.asp\r\n\r\n"); - - if ((s = gaim_ssl_write(gsc, request_str, strlen(request_str))) <= 0) - { - g_free(request_str); - gaim_connection_error(gc, _("Unable to write to MSN Nexus server.")); - return; - } - - g_free(request_str); - - if (session->ssl_url != NULL) - { - g_free(session->ssl_url); - session->ssl_url = NULL; - } - - /* Get the PassportURLs line. */ - if ((s = msn_ssl_read(gsc, &buffer)) <= 0) - { - gaim_connection_error(gc, _("Unable to read from MSN Nexus server.")); - - if (buffer != NULL) - g_free(buffer); - - return; - } - - if ((base = strstr(buffer, "PassportURLs")) == NULL) - { - gaim_connection_error(gc, - _("MSN Nexus server returned invalid information.")); - - g_free(buffer); - - return; - } - - if ((da_login = strstr(base, "DALogin=")) != NULL) - { - if ((da_login = strchr(da_login, '=')) != NULL) - da_login++; - - if ((c = strchr(da_login, ',')) != NULL) - *c = '\0'; - - if ((c = strchr(da_login, '/')) != NULL) - { - session->ssl_login_path = g_strdup(c); - - *c = '\0'; - } - - session->ssl_login_host = g_strdup(da_login); - } - - g_free(buffer); - - gaim_ssl_close(gsc); - - /* Now begin the connection to the login server. */ - session->ssl_conn = gaim_ssl_connect(session->account, - session->ssl_login_host, - GAIM_SSL_DEFAULT_PORT, - login_connect_cb, login_error_cb, - servconn); -} - static gboolean usr_cmd(MsnServConn *servconn, const char *command, const char **params, size_t param_count) @@ -643,75 +317,25 @@ } else if (!g_ascii_strcasecmp(params[1], "TWN")) { - /* Passport authentication */ - char *challenge_data; - char *key, *value = NULL; - char *c; + char **elems, **cur, **tokens; - if (session->ssl_challenge_data != NULL) - g_hash_table_destroy(session->ssl_challenge_data); - - session->ssl_challenge_data = - g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, g_free); + /* Passport authentication */ + session->nexus = msn_nexus_new(session); /* Parse the challenge data. */ - - challenge_data = g_strdup(params[3]); - - for (c = challenge_data, key = challenge_data; *c != '\0'; c++) - { - if (*c == '=') - { - *c = '\0'; + elems = g_strsplit(params[3], ",", 0); - value = c + 1; - } - else if (*c == ',') - { - *c = '\0'; - - g_hash_table_insert(session->ssl_challenge_data, - g_strdup(key), g_strdup(value)); - - key = c + 1; - } + for (cur = elems; *cur != NULL; cur++) + { + tokens = g_strsplit(*cur, "=", 2); + g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]); + /* Don't free each of the tokens, only the array. */ + g_free(tokens); } - if (key < value) - { - /* Let's not forget the last one, it doesn't end with a ',' */ - g_hash_table_insert(session->ssl_challenge_data, - g_strdup(key), g_strdup(value)); - } - - g_free(challenge_data); - -#if 0 - passport_str = g_strdup(gaim_url_decode(params[3])); + g_strfreev(elems); - for (c = passport_str; *c != '\0'; c++) - { - if (*c == ',') - *c = '&'; - } - - session->ssl_url = passport_str; -#endif - - session->ssl_conn = gaim_ssl_connect(session->account, - "nexus.passport.com", - GAIM_SSL_DEFAULT_PORT, - nexus_connect_cb, login_error_cb, - servconn); - - if (session->ssl_conn == NULL) - { - gaim_connection_error(gc, - _("Unable to connect to passport server")); - - return FALSE; - } + msn_nexus_connect(session->nexus); gaim_connection_update_progress(gc, _("Password sent"), 6, MSN_CONNECT_STEPS);