Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 5th, 2012  |  syntax: None  |  size: 9.95 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #ifndef G_GNUC_NULL_TERMINATED
  2. # if __GNUC__ >= 4
  3. #  define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
  4. # else
  5. #  define G_GNUC_NULL_TERMINATED
  6. # endif
  7. #endif
  8.  
  9. // GNU C libraries
  10. #include <stdio.h>
  11. #include <string.h>
  12.  
  13. // Glib
  14. #include <glib.h>
  15.  
  16. // Jabber functions
  17. #include "jabber.h"
  18. #include "message.h"
  19. #include "presence.h"
  20. #include "roster.h"
  21. #include "si.h"
  22. #include "usermood.h"
  23.  
  24. // Libpurple functions
  25. #include "util.h"
  26. #include "request.h"
  27. #include "accountopt.h"
  28. #include "debug.h"
  29. #include "cipher.h"
  30. #include "xmlnode.h"
  31.  
  32. #ifndef _
  33. #define _(a) (a)
  34. #define N_(a) (a)
  35. #endif
  36.  
  37. #define MSN_XMPP_CLIENT_ID "000000004C07035A"
  38.  
  39. static void msn_oauth_set_access_token_cb(gpointer data, const gchar *access_token)
  40. {
  41.         PurpleAccount *account = data;
  42.         gchar *real_access_token;
  43.         const gchar *access_token_start;
  44.         gchar *url;
  45.        
  46.         if((access_token_start = strstr(access_token, "access_token=")))
  47.         {
  48.                 access_token_start += 13;
  49.                 real_access_token = g_strndup(access_token_start, strchr(access_token_start, '&') - access_token_start);
  50.         } else {
  51.                 real_access_token = g_strdup(access_token);
  52.         }
  53.        
  54.         purple_account_set_string(account, "access_token", purple_url_decode(real_access_token));
  55.        
  56.         g_free(real_access_token);
  57. }
  58.  
  59. static void msn_oauth_request_access_token(PurpleAccount *account)
  60. {
  61.        
  62.         purple_request_input(NULL, NULL, _("Set your Access Token"),
  63.                                         _("Copy the Pidgin URL you are sent to after you accept"), NULL,
  64.                                         FALSE, FALSE, "http://pidgin.im/#access_token=...", _("OK"),
  65.                                         G_CALLBACK(msn_oauth_set_access_token_cb), _("Cancel"),
  66.                                         NULL, account, NULL, NULL, account);
  67. }
  68.  
  69. static void msn_oauth_set_access_token(PurplePluginAction *action)
  70. {
  71.         PurpleConnection *pc = action->context;
  72.         msn_oauth_request_access_token(pc->account);
  73. }
  74.  
  75. static void msn_oauth_request_auth()
  76. {
  77.         PurplePlugin *handle = NULL;
  78.        
  79.         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/");
  80. }
  81.  
  82. static JabberSaslState
  83. msn_oauth_sasl_start(JabberStream *js, xmlnode *packet, xmlnode **response, char **error)
  84. {
  85.         xmlnode *auth;
  86.         const gchar *access_token;
  87.        
  88.         access_token = purple_account_get_string(purple_connection_get_account(js->gc), "access_token", NULL);
  89.        
  90.         if (!access_token)
  91.         {
  92.                 msn_oauth_request_auth();
  93.                 msn_oauth_request_access_token(js->gc->account);
  94.                 return JABBER_SASL_STATE_FAIL;
  95.         }
  96.  
  97.         auth = xmlnode_new("auth");
  98.         xmlnode_set_namespace(auth, "urn:ietf:params:xml:ns:xmpp-sasl");
  99.         xmlnode_set_attrib(auth, "mechanism", "X-MESSENGER-OAUTH2");
  100.         xmlnode_insert_data(auth, access_token, -1);
  101.  
  102.         *response = auth;
  103.         return JABBER_SASL_STATE_CONTINUE;
  104. }
  105.  
  106. static JabberSaslState
  107. msn_oauth_sasl_handle_failure(JabberStream *js, xmlnode *packet, xmlnode **reply, char **error)
  108. {
  109.         purple_account_set_string(purple_connection_get_account(js->gc), "access_token", NULL);
  110.        
  111.         msn_oauth_request_auth();
  112.         msn_oauth_request_access_token(js->gc->account);
  113.        
  114.         /* Nothing to send */
  115.         return JABBER_SASL_STATE_FAIL;
  116. }
  117.  
  118. static JabberSaslMech msn_oauth_sasl_mech = {
  119.         120, /* priority */
  120.         "X-MESSENGER-OAUTH2", /* name */
  121.         msn_oauth_sasl_start,
  122.         NULL, /* handle_challenge */
  123.         NULL, /* handle_success */
  124.         msn_oauth_sasl_handle_failure, /* handle_failure */
  125.         NULL  /* dispose */
  126. };
  127.  
  128. static gboolean load_msn_plugin(PurplePlugin *plugin)
  129. {
  130.         purple_debug_info("facebook", "plugin_load %s\n", purple_plugin_get_id(plugin));
  131.         jabber_auth_add_mech(&msn_oauth_sasl_mech);
  132.        
  133.         return TRUE;
  134. }
  135.  
  136. static gboolean unload_msn_plugin(PurplePlugin *plugin)
  137. {
  138.         purple_signals_unregister_by_instance(plugin);
  139.         purple_signals_disconnect_by_handle(plugin);
  140.        
  141.         jabber_auth_remove_mech(&msn_oauth_sasl_mech);
  142.        
  143.         return TRUE;
  144. }
  145.  
  146. static const char *msn_list_icon(PurpleAccount *account, PurpleBuddy *buddy)
  147. {
  148.         return "msn";
  149. }
  150.  
  151. static void plugin_msn_init(PurplePlugin *plugin)
  152. {
  153.         PurpleAccountOption *option;
  154.         PurplePluginInfo *info = plugin->info;
  155.         /*PurplePluginProtocolInfo *prpl_info = info->extra_info;
  156.        
  157.         option = purple_account_option_string_new(_("Access Token"), "access_token", "");
  158.         prpl_info->protocol_options = g_list_append(prpl_info->protocol_options, option);*/
  159.        
  160.         info->dependencies = g_list_prepend(info->dependencies, "prpl-jabber");
  161. }
  162.  
  163. static PurplePluginProtocolInfo prpl_info =
  164. {
  165.         sizeof(PurplePluginProtocolInfo),   /* struct_size */
  166.         OPT_PROTO_MAIL_CHECK |
  167.         OPT_PROTO_PASSWORD_OPTIONAL |
  168.         OPT_PROTO_SLASH_COMMANDS_NATIVE,
  169.         NULL,                               /* user_splits */
  170.         NULL,                               /* protocol_options */
  171.         {"png", 32, 32, 96, 96, 0, PURPLE_ICON_SCALE_SEND | PURPLE_ICON_SCALE_DISPLAY}, /* icon_spec */
  172.         jabber_list_icon,                   /* list_icon */
  173.         jabber_list_emblem,                 /* list_emblems */
  174.         jabber_status_text,                 /* status_text */
  175.         jabber_tooltip_text,                /* tooltip_text */
  176.         jabber_status_types,                /* status_types */
  177.         jabber_blist_node_menu,             /* blist_node_menu */
  178.         jabber_chat_info,                   /* chat_info */
  179.         jabber_chat_info_defaults,          /* chat_info_defaults */
  180.         jabber_login,                       /* login */
  181.         jabber_close,                       /* close */
  182.         jabber_message_send_im,             /* send_im */
  183.         jabber_set_info,                    /* set_info */
  184.         jabber_send_typing,                 /* send_typing */
  185.         jabber_buddy_get_info,              /* get_info */
  186.         jabber_set_status,                  /* set_status */
  187.         jabber_idle_set,                    /* set_idle */
  188.         NULL,                               /* change_passwd */
  189.         jabber_roster_add_buddy,            /* add_buddy */
  190.         NULL,                               /* add_buddies */
  191.         jabber_roster_remove_buddy,         /* remove_buddy */
  192.         NULL,                               /* remove_buddies */
  193.         NULL,                               /* add_permit */
  194.         jabber_add_deny,                    /* add_deny */
  195.         NULL,                               /* rem_permit */
  196.         jabber_rem_deny,                    /* rem_deny */
  197.         NULL,                               /* set_permit_deny */
  198.         jabber_chat_join,                   /* join_chat */
  199.         NULL,                               /* reject_chat */
  200.         jabber_get_chat_name,               /* get_chat_name */
  201.         jabber_chat_invite,                 /* chat_invite */
  202.         jabber_chat_leave,                  /* chat_leave */
  203.         NULL,                               /* chat_whisper */
  204.         jabber_message_send_chat,           /* chat_send */
  205.         jabber_keepalive,                   /* keepalive */
  206.         jabber_register_account,            /* register_user */
  207.         NULL,                               /* get_cb_info */
  208.         jabber_roster_alias_change,         /* alias_buddy */
  209.         jabber_roster_group_change,         /* group_buddy */
  210.         jabber_roster_group_rename,         /* rename_group */
  211.         NULL,                               /* buddy_free */
  212.         jabber_convo_closed,                /* convo_closed */
  213.         jabber_normalize,                   /* normalize */
  214.         jabber_set_buddy_icon,              /* set_buddy_icon */
  215.         NULL,                               /* remove_group */
  216.         jabber_chat_buddy_real_name,        /* get_cb_real_name */
  217.         jabber_chat_set_topic,              /* set_chat_topic */
  218.         jabber_find_blist_chat,             /* find_blist_chat */
  219.         jabber_roomlist_get_list,           /* roomlist_get_list */
  220.         jabber_roomlist_cancel,             /* roomlist_cancel */
  221.         NULL,                               /* roomlist_expand_category */
  222.         jabber_can_receive_file,            /* can_receive_file */
  223.         jabber_si_xfer_send,                /* send_file */
  224.         jabber_si_new_xfer,                 /* new_xfer */
  225.         jabber_offline_message,             /* offline_message */
  226.         NULL,                               /* whiteboard_prpl_ops */
  227.         jabber_prpl_send_raw,               /* send_raw */
  228.         jabber_roomlist_room_serialize,     /* roomlist_room_serialize */
  229.         jabber_unregister_account,          /* unregister_user */
  230.         jabber_send_attention,              /* send_attention */
  231.         jabber_attention_types,             /* attention_types */
  232.         NULL,                               /* get_account_text_table */
  233.         jabber_initiate_media,              /* initiate_media */
  234.         jabber_get_media_caps,              /* get_media_caps */
  235.         jabber_get_moods,                   /* get_moods */
  236.         NULL,                               /* set_public_alias */
  237.         NULL                                /* get_public_alias */
  238. };
  239.  
  240. static PurplePluginInfo info =
  241. {
  242.         PURPLE_PLUGIN_MAGIC,
  243.         2,
  244.         10,
  245.         PURPLE_PLUGIN_PROTOCOL,                           /**< type           */
  246.         NULL,                                             /**< ui_requirement */
  247.         0,                                                /**< flags          */
  248.         NULL,                                             /**< dependencies   */
  249.         PURPLE_PRIORITY_DEFAULT,                          /**< priority       */
  250.  
  251.         "prpl-msn-xmpp",                                  /**< id             */
  252.         "MSN (XMPP)",                                     /**< name           */
  253.         "1.0",                                            /**< version        */
  254.         N_("MSN (XMPP) Protocol Plugin"),                 /**< summary        */
  255.         N_("MSN (XMPP) Protocol Plugin"),                 /**< description    */
  256.         "Eion Robb <eionrobb@gmail.com>",                 /**< author         */
  257.         PURPLE_WEBSITE,                                   /**< homepage       */
  258.  
  259.         load_msn_plugin,                                  /**< load           */
  260.         unload_msn_plugin,                                /**< unload         */
  261.         NULL,                                             /**< destroy        */
  262.  
  263.         NULL,                                             /**< ui_info        */
  264.         &prpl_info,                                       /**< extra_info     */
  265.         NULL,                                             /**< prefs_info     */
  266.         NULL,
  267.  
  268.         /* padding */
  269.         NULL,
  270.         NULL,
  271.         NULL,
  272.         NULL
  273. };
  274.  
  275. PURPLE_INIT_PLUGIN(msnxmpp, plugin_msn_init, info);