static void ver_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnSession *session; gboolean protocol_supported = FALSE; const gchar *proto_str; guint i; session = cmdproc->session; proto_str = "MSNP12"; for (i = 1; i < cmd->param_count; i++) { if (!strcmp(cmd->params[i], proto_str)) { protocol_supported = TRUE; break; } } if (!protocol_supported) { msn_session_set_error(session, MSN_ERROR_UNSUPPORTED_PROTOCOL, NULL); return; } msn_cmdproc_send(cmdproc, "CVR", "0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS %s", msn_session_get_username(session)); }
static void login_open_cb(PnNode *conn, gpointer data) { MsnNexus *nexus = data; MsnSession *session; const char *username, *password; char *req, *head, *tail; guint32 ctint; GIOStatus status = G_IO_STATUS_NORMAL; g_return_if_fail(conn); g_signal_handler_disconnect(conn, nexus->open_handler); nexus->open_handler = 0; session = nexus->session; username = msn_session_get_username(session); password = msn_session_get_password(session); ctint = strtoul((char *) g_hash_table_lookup(nexus->challenge_data, "ct"), NULL, 10) + 200; head = g_strdup_printf("GET %s HTTP/1.1\r\n" "Authorization: Passport1.4 OrgVerb=GET,OrgURL=%s,sign-in=%s", nexus->login_path, (char *) g_hash_table_lookup(nexus->challenge_data, "ru"), purple_url_encode(username)); tail = g_strdup_printf("lc=%s,id=%s,tw=%s,fs=%s,ru=%s,ct=%" G_GUINT32_FORMAT ",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", get_key(nexus->challenge_data, "lc"), get_key(nexus->challenge_data, "id"), get_key(nexus->challenge_data, "tw"), get_key(nexus->challenge_data, "fs"), get_key(nexus->challenge_data, "ru"), ctint, get_key(nexus->challenge_data, "kpp"), get_key(nexus->challenge_data, "kv"), get_key(nexus->challenge_data, "ver"), get_key(nexus->challenge_data, "tpf"), nexus->login_host); req = g_strdup_printf("%s,pwd=%s,%s\r\n", head, purple_url_encode(password), tail); g_free(head); g_free(tail); status = pn_node_write(conn, req, strlen(req), NULL, NULL); if (status != G_IO_STATUS_NORMAL) { msn_session_set_error(nexus->session, MSN_ERROR_AUTH, _("nexus stream error")); } g_free(req); }
void msn_session_set_public_alias (MsnSession *session, const gchar *value) { msn_session_set_prp (session, "MFN", value ? value : msn_session_get_username (session)); }
MsnSlpLink * msn_slplink_new(MsnSession *session, const char *username) { MsnSlpLink *slplink; g_return_val_if_fail(session != NULL, NULL); slplink = g_new0(MsnSlpLink, 1); #ifdef PECAN_DEBUG_SLPLINK pecan_info ("slplink_new: slplink(%p)", slplink); #endif slplink->session = session; slplink->slp_seq_id = rand() % 0xFFFFFF00 + 4; slplink->slp_session_id = rand() % 0xFFFFFF00 + 4; slplink->local_user = g_strdup(msn_session_get_username(session)); slplink->remote_user = g_strdup(username); slplink->slp_msg_queue = g_queue_new(); session->slplinks = g_list_append(session->slplinks, slplink); return slplink; }
void msn_session_set_public_alias (MsnSession *session, const gchar *value) { msn_session_set_prp (session, "MFN", value ? value : msn_session_get_username (session)); pn_roaming_session_request (session->roaming_session, PN_UPDATE_PROFILE, value, NULL); }
static void email_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { MsnSession *session; PurpleConnection *gc; GHashTable *table; char *from, *subject, *tmp; session = cmdproc->session; gc = session->account->gc; if (!purple_account_get_check_mail (session->account)) return; if (strcmp(msg->remote_user, "Hotmail")) { pecan_warning ("unofficial message"); return; } if (!session->passport_info.mail_url) { pecan_error ("no url"); return; } table = msn_message_get_hashtable_from_body(msg); from = subject = NULL; tmp = g_hash_table_lookup(table, "From"); if (tmp != NULL) from = purple_mime_decode_field(tmp); tmp = g_hash_table_lookup(table, "Subject"); if (tmp != NULL) subject = purple_mime_decode_field(tmp); /** @todo go to the extact email */ purple_notify_email(gc, (subject != NULL ? subject : ""), (from != NULL ? from : ""), msn_session_get_username (session), session->passport_info.mail_url, NULL, NULL); g_free(from); g_free(subject); g_hash_table_destroy(table); }
static void cvr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { msn_cmdproc_send(cmdproc, "USR", "TWN I %s", msn_session_get_username(cmdproc->session)); }
static void url_cmd (MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnSession *session; PurpleConnection *connection; const gchar *rru; const gchar *url; gchar creds[64]; glong tmp_timestamp; session = cmdproc->session; connection = purple_account_get_connection (session->account); rru = cmd->params[1]; url = cmd->params[2]; session->passport_info.mail_url_timestamp = time (NULL); tmp_timestamp = session->passport_info.mail_url_timestamp - session->passport_info.sl; { PurpleCipher *cipher; PurpleCipherContext *context; guchar digest[16]; gchar *buf; buf = pecan_strdup_printf ("%s%ld%s", session->passport_info.mspauth ? session->passport_info.mspauth : "BOGUS", tmp_timestamp, purple_connection_get_password (connection)); cipher = purple_ciphers_find_cipher ("md5"); context = purple_cipher_context_new (cipher, NULL); purple_cipher_context_append (context, (const guchar *) buf, strlen (buf)); purple_cipher_context_digest (context, sizeof (digest), digest, NULL); purple_cipher_context_destroy (context); g_free (buf); memset (creds, 0, sizeof (creds)); { gchar buf2[3]; gint i; for (i = 0; i < 16; i++) { g_snprintf (buf2, sizeof (buf2), "%02x", digest[i]); strcat (creds, buf2); } } } g_free (session->passport_info.mail_url); session->passport_info.mail_url = g_strdup_printf ("%s&auth=%s&creds=%s&sl=%ld&username=%s&mode=ttl&sid=%s&id=2&rru=%ssvc_mail&js=yes", url, session->passport_info.mspauth, creds, tmp_timestamp, msn_session_get_username (session), session->passport_info.sid, rru); /* The user wants to check his email */ if (cmd->trans && cmd->trans->data) { purple_notify_uri (connection, session->passport_info.mail_url); return; } if (purple_account_get_check_mail (session->account)) { static gboolean is_initial = TRUE; if (!is_initial) return; if (session->inbox_unread_count > 0) { const gchar *passport; const gchar *main_url; passport = msn_session_get_username (session); main_url = session->passport_info.mail_url; purple_notify_emails (connection, session->inbox_unread_count, FALSE, NULL, NULL, &passport, &main_url, NULL, NULL); } is_initial = FALSE; } }
void login_connect_cb(gpointer data, PurpleSslConnection *gsc, PurpleInputCondition cond) { MsnNexus *nexus; MsnSession *session; char *username, *password; char *request_str, *head, *tail; char *buffer = NULL; guint32 ctint; nexus = data; g_return_if_fail(nexus != NULL); session = nexus->session; g_return_if_fail(session != NULL); msn_session_set_login_step(session, PECAN_LOGIN_STEP_GET_COOKIE); username = g_strdup(purple_url_encode(msn_session_get_username(session))); password = g_strdup(purple_url_encode(msn_session_get_password(session))); ctint = strtoul((char *)g_hash_table_lookup(nexus->challenge_data, "ct"), NULL, 10) + 200; head = pecan_strdup_printf( "GET %s HTTP/1.1\r\n" "Authorization: Passport1.4 OrgVerb=GET,OrgURL=%s,sign-in=%s", nexus->login_path, (char *)g_hash_table_lookup(nexus->challenge_data, "ru"), username); tail = pecan_strdup_printf( "lc=%s,id=%s,tw=%s,fs=%s,ru=%s,ct=%" G_GUINT32_FORMAT ",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", nexus_challenge_data_lookup(nexus->challenge_data, "lc"), nexus_challenge_data_lookup(nexus->challenge_data, "id"), nexus_challenge_data_lookup(nexus->challenge_data, "tw"), nexus_challenge_data_lookup(nexus->challenge_data, "fs"), nexus_challenge_data_lookup(nexus->challenge_data, "ru"), ctint, nexus_challenge_data_lookup(nexus->challenge_data, "kpp"), nexus_challenge_data_lookup(nexus->challenge_data, "kv"), nexus_challenge_data_lookup(nexus->challenge_data, "ver"), nexus_challenge_data_lookup(nexus->challenge_data, "tpf"), nexus->login_host); buffer = pecan_strdup_printf("%s,pwd=XXXXXXXX,%s\r\n", head, tail); request_str = pecan_strdup_printf("%s,pwd=%s,%s\r\n", head, password, tail); pecan_log ("sending: [%s]", buffer); g_free(buffer); g_free(head); g_free(tail); g_free(username); g_free(password); nexus->write_buf = request_str; nexus->written_len = 0; nexus->read_len = 0; nexus->written_cb = nexus_login_written_cb; nexus->input_handler = purple_input_add(gsc->fd, PURPLE_INPUT_WRITE, nexus_write_cb, nexus); nexus_write_cb(nexus, gsc->fd, PURPLE_INPUT_WRITE); return; }