- #ifndef G_GNUC_NULL_TERMINATED
- # if __GNUC__ >= 4
- # define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
- # else
- # define G_GNUC_NULL_TERMINATED
- # endif
- #endif
- // GNU C libraries
- #include <stdio.h>
- #include <string.h>
- // Glib
- #include <glib.h>
- // Jabber functions
- #include "jabber.h"
- #include "message.h"
- #include "presence.h"
- #include "roster.h"
- #include "si.h"
- #include "usermood.h"
- // Libpurple functions
- #include "util.h"
- #include "request.h"
- #include "accountopt.h"
- #include "debug.h"
- #include "cipher.h"
- #include "xmlnode.h"
- #ifndef _
- #define _(a) (a)
- #define N_(a) (a)
- #endif
- #define MSN_XMPP_CLIENT_ID "000000004C07035A"
- static void msn_oauth_set_access_token_cb(gpointer data, const gchar *access_token)
- {
- PurpleAccount *account = data;
- gchar *real_access_token;
- const gchar *access_token_start;
- gchar *url;
- if((access_token_start = strstr(access_token, "access_token=")))
- {
- access_token_start += 13;
- real_access_token = g_strndup(access_token_start, strchr(access_token_start, '&') - access_token_start);
- } else {
- real_access_token = g_strdup(access_token);
- }
- purple_account_set_string(account, "access_token", purple_url_decode(real_access_token));
- g_free(real_access_token);
- }
- static void msn_oauth_request_access_token(PurpleAccount *account)
- {
- purple_request_input(NULL, NULL, _("Set your Access Token"),
- _("Copy the Pidgin URL you are sent to after you accept"), NULL,
- FALSE, FALSE, "http://pidgin.im/#access_token=...", _("OK"),
- G_CALLBACK(msn_oauth_set_access_token_cb), _("Cancel"),
- NULL, account, NULL, NULL, account);
- }
- static void msn_oauth_set_access_token(PurplePluginAction *action)
- {
- PurpleConnection *pc = action->context;
- msn_oauth_request_access_token(pc->account);
- }
- static void msn_oauth_request_auth()
- {
- PurplePlugin *handle = NULL;
- purple_notify_uri(handle, "https://oauth.live.com/authorize?client_id=" MSN_XMPP_CLIENT_ID "&scope=wl.messenger,wl.basic,wl.offline_access,wl.contacts_create,wl.share&response_type=token&redirect_uri=http://pidgin.im/");
- }
- static JabberSaslState
- msn_oauth_sasl_start(JabberStream *js, xmlnode *packet, xmlnode **response, char **error)
- {
- xmlnode *auth;
- const gchar *access_token;
- access_token = purple_account_get_string(purple_connection_get_account(js->gc), "access_token", NULL);
- if (!access_token)
- {
- msn_oauth_request_auth();
- msn_oauth_request_access_token(js->gc->account);
- return JABBER_SASL_STATE_FAIL;
- }
- auth = xmlnode_new("auth");
- xmlnode_set_namespace(auth, "urn:ietf:params:xml:ns:xmpp-sasl");
- xmlnode_set_attrib(auth, "mechanism", "X-MESSENGER-OAUTH2");
- xmlnode_insert_data(auth, access_token, -1);
- *response = auth;
- return JABBER_SASL_STATE_CONTINUE;
- }
- static JabberSaslState
- msn_oauth_sasl_handle_failure(JabberStream *js, xmlnode *packet, xmlnode **reply, char **error)
- {
- purple_account_set_string(purple_connection_get_account(js->gc), "access_token", NULL);
- msn_oauth_request_auth();
- msn_oauth_request_access_token(js->gc->account);
- /* Nothing to send */
- return JABBER_SASL_STATE_FAIL;
- }
- static JabberSaslMech msn_oauth_sasl_mech = {
- 120, /* priority */
- "X-MESSENGER-OAUTH2", /* name */
- msn_oauth_sasl_start,
- NULL, /* handle_challenge */
- NULL, /* handle_success */
- msn_oauth_sasl_handle_failure, /* handle_failure */
- NULL /* dispose */
- };
- static gboolean load_msn_plugin(PurplePlugin *plugin)
- {
- purple_debug_info("facebook", "plugin_load %s\n", purple_plugin_get_id(plugin));
- jabber_auth_add_mech(&msn_oauth_sasl_mech);
- return TRUE;
- }
- static gboolean unload_msn_plugin(PurplePlugin *plugin)
- {
- purple_signals_unregister_by_instance(plugin);
- purple_signals_disconnect_by_handle(plugin);
- jabber_auth_remove_mech(&msn_oauth_sasl_mech);
- return TRUE;
- }
- static const char *msn_list_icon(PurpleAccount *account, PurpleBuddy *buddy)
- {
- return "msn";
- }
- static void plugin_msn_init(PurplePlugin *plugin)
- {
- PurpleAccountOption *option;
- PurplePluginInfo *info = plugin->info;
- /*PurplePluginProtocolInfo *prpl_info = info->extra_info;
- option = purple_account_option_string_new(_("Access Token"), "access_token", "");
- prpl_info->protocol_options = g_list_append(prpl_info->protocol_options, option);*/
- info->dependencies = g_list_prepend(info->dependencies, "prpl-jabber");
- }
- static PurplePluginProtocolInfo prpl_info =
- {
- sizeof(PurplePluginProtocolInfo), /* struct_size */
- OPT_PROTO_MAIL_CHECK |
- OPT_PROTO_PASSWORD_OPTIONAL |
- OPT_PROTO_SLASH_COMMANDS_NATIVE,
- NULL, /* user_splits */
- NULL, /* protocol_options */
- {"png", 32, 32, 96, 96, 0, PURPLE_ICON_SCALE_SEND | PURPLE_ICON_SCALE_DISPLAY}, /* icon_spec */
- jabber_list_icon, /* list_icon */
- jabber_list_emblem, /* list_emblems */
- jabber_status_text, /* status_text */
- jabber_tooltip_text, /* tooltip_text */
- jabber_status_types, /* status_types */
- jabber_blist_node_menu, /* blist_node_menu */
- jabber_chat_info, /* chat_info */
- jabber_chat_info_defaults, /* chat_info_defaults */
- jabber_login, /* login */
- jabber_close, /* close */
- jabber_message_send_im, /* send_im */
- jabber_set_info, /* set_info */
- jabber_send_typing, /* send_typing */
- jabber_buddy_get_info, /* get_info */
- jabber_set_status, /* set_status */
- jabber_idle_set, /* set_idle */
- NULL, /* change_passwd */
- jabber_roster_add_buddy, /* add_buddy */
- NULL, /* add_buddies */
- jabber_roster_remove_buddy, /* remove_buddy */
- NULL, /* remove_buddies */
- NULL, /* add_permit */
- jabber_add_deny, /* add_deny */
- NULL, /* rem_permit */
- jabber_rem_deny, /* rem_deny */
- NULL, /* set_permit_deny */
- jabber_chat_join, /* join_chat */
- NULL, /* reject_chat */
- jabber_get_chat_name, /* get_chat_name */
- jabber_chat_invite, /* chat_invite */
- jabber_chat_leave, /* chat_leave */
- NULL, /* chat_whisper */
- jabber_message_send_chat, /* chat_send */
- jabber_keepalive, /* keepalive */
- jabber_register_account, /* register_user */
- NULL, /* get_cb_info */
- jabber_roster_alias_change, /* alias_buddy */
- jabber_roster_group_change, /* group_buddy */
- jabber_roster_group_rename, /* rename_group */
- NULL, /* buddy_free */
- jabber_convo_closed, /* convo_closed */
- jabber_normalize, /* normalize */
- jabber_set_buddy_icon, /* set_buddy_icon */
- NULL, /* remove_group */
- jabber_chat_buddy_real_name, /* get_cb_real_name */
- jabber_chat_set_topic, /* set_chat_topic */
- jabber_find_blist_chat, /* find_blist_chat */
- jabber_roomlist_get_list, /* roomlist_get_list */
- jabber_roomlist_cancel, /* roomlist_cancel */
- NULL, /* roomlist_expand_category */
- jabber_can_receive_file, /* can_receive_file */
- jabber_si_xfer_send, /* send_file */
- jabber_si_new_xfer, /* new_xfer */
- jabber_offline_message, /* offline_message */
- NULL, /* whiteboard_prpl_ops */
- jabber_prpl_send_raw, /* send_raw */
- jabber_roomlist_room_serialize, /* roomlist_room_serialize */
- jabber_unregister_account, /* unregister_user */
- jabber_send_attention, /* send_attention */
- jabber_attention_types, /* attention_types */
- NULL, /* get_account_text_table */
- jabber_initiate_media, /* initiate_media */
- jabber_get_media_caps, /* get_media_caps */
- jabber_get_moods, /* get_moods */
- NULL, /* set_public_alias */
- NULL /* get_public_alias */
- };
- static PurplePluginInfo info =
- {
- PURPLE_PLUGIN_MAGIC,
- 2,
- 10,
- PURPLE_PLUGIN_PROTOCOL, /**< type */
- NULL, /**< ui_requirement */
- 0, /**< flags */
- NULL, /**< dependencies */
- PURPLE_PRIORITY_DEFAULT, /**< priority */
- "prpl-msn-xmpp", /**< id */
- "MSN (XMPP)", /**< name */
- "1.0", /**< version */
- N_("MSN (XMPP) Protocol Plugin"), /**< summary */
- N_("MSN (XMPP) Protocol Plugin"), /**< description */
- "Eion Robb <eionrobb@gmail.com>", /**< author */
- PURPLE_WEBSITE, /**< homepage */
- load_msn_plugin, /**< load */
- unload_msn_plugin, /**< unload */
- NULL, /**< destroy */
- NULL, /**< ui_info */
- &prpl_info, /**< extra_info */
- NULL, /**< prefs_info */
- NULL,
- /* padding */
- NULL,
- NULL,
- NULL,
- NULL
- };
- PURPLE_INIT_PLUGIN(msnxmpp, plugin_msn_init, info);