Skip to content

Commit

Permalink
Merge branch hugo/master
Browse files Browse the repository at this point in the history
  • Loading branch information
pietern committed Oct 1, 2008
1 parent 631132d commit 0df7abe
Show file tree
Hide file tree
Showing 10 changed files with 1,854 additions and 0 deletions.
10 changes: 10 additions & 0 deletions lib/config/contacts.yml
@@ -0,0 +1,10 @@
windows_live:
appid: your_app_id
secret: your_app_secret_key
security_algorithm: wsignin1.0
return_url: http://yourserver.com/your_return_url
policy_url: http://yourserver.com/you_policy_url

yahoo:
appid: your_app_id
secret: your_shared_secret
165 changes: 165 additions & 0 deletions lib/contacts/windows_live.rb
@@ -0,0 +1,165 @@
require File.dirname(__FILE__) + '/../contacts'
$:.unshift File.dirname(__FILE__)
require File.dirname(__FILE__) + '/../../vendor/windowslivelogin'
require 'net/https'
require 'uri'
require 'rubygems'
require 'hpricot'
require 'yaml'

module Contacts
# = How I can fetch Windows Live Contacts?
# To gain access to a Windows Live user's data in the Live Contacts service,
# a third-party developer first must ask the owner for permission. You must
# do that through Windows Live Delegated Authentication.
#
# This library give you access to Windows Live Delegated Authentication System
# and Windows Live Contacts API. Just follow the steps below and be happy!
#
# === Registering your app
# First of all, follow the steps in this
# page[http://msdn.microsoft.com/en-us/library/cc287659.aspx] to register your
# app.
#
# === Configuring your Windows Live YAML
# After registering your app, you will have an *appid*, a <b>secret key</b> and
# a <b>return URL</b>. Use their values to fill in the config/contacts.yml file.
# The policy URL field inside the YAML config file must contain the URL
# of the privacy policy of your Web site for Delegated Authentication.
#
# === Authenticating your user and fetching his contacts
#
# wl = Contacts::WindowsLive.new
# auth_url = wl.get_authentication_url
#
# Use that *auth_url* to redirect your user to Windows Live. He will authenticate
# there and Windows Live will POST to your return URL. You have to get the
# body of that POST, let's call it post_body. (if you're using Rails, you can
# get the POST body through request.raw_post, in the context of an action inside
# ActionController)
#
# Now, to fetch his contacts, just do this:
#
# contacts = wl.contacts(post_body)
# #-> [ ['Fitzgerald', 'fubar@gmail.com', 'fubar@example.com'],
# ['William Paginate', 'will.paginate@gmail.com'], ...
# ]
#--
# This class has two responsibilities:
# 1. Access the Windows Live Contacts API through Delegated Authentication
# 2. Import contacts from Windows Live and deliver it inside an Array
#
class WindowsLive
CONFIG_FILE = File.dirname(__FILE__) + '/../config/contacts.yml'

# Initialize a new WindowsLive object.
#
# ==== Paramaters
# * config_file <String>:: The contacts YAML config file name
#--
# You can check an example of a config file inside config/ directory
#
def initialize(config_file=CONFIG_FILE)
confs = YAML.load_file(config_file)['windows_live']
@wll = WindowsLiveLogin.new(confs['appid'], confs['secret'], confs['security_algorithm'],
nil, confs['policy_url'], confs['return_url'])
end


# Windows Live Contacts API need to authenticate the user that is giving you
# access to his contacts. To do that, you must give him a URL. That method
# generates that URL. The user must access that URL, and after he has done
# authentication, hi will be redirected to your application.
#
def get_authentication_url
@wll.getConsentUrl("Contacts.Invite")
end

# After the user has been authenticaded, Windows Live Delegated Authencation
# Service redirects to your application, through a POST HTTP method. Along
# with the POST, Windows Live send to you a Consent that you must process
# to access the user's contacts. This method process the Consent
# to you.
#
# ==== Paramaters
# * consent <String>:: A string containing the Consent given to you inside
# the redirection POST from Windows Live
#
def process_consent(consent)
consent.strip!
consent = URI.unescape(consent)
@consent_token = @wll.processConsent(consent)
end

# This method return the user's contacts inside an Array in the following
# format:
#
# [
# ['Brad Fitzgerald', 'fubar@gmail.com'],
# [nil, 'nagios@hotmail.com'],
# ['William Paginate', 'will.paginate@yahoo.com'] ...
# ]
#
# ==== Paramaters
# * consent <String>:: A string containing the Consent given to you inside
# the redirection POST from Windows Live
#
def contacts(consent)
process_consent(consent)
contacts_xml = access_live_contacts_api()
contacts_list = WindowsLive.parse_xml(contacts_xml)
end

# This method access the Windows Live Contacts API Web Service to get
# the XML contacts document
#
def access_live_contacts_api
Net::HTTP.version_1_1
http = http = Net::HTTP.new('livecontacts.services.live.com', 443)
http.use_ssl = true

response = nil
http.start do |http|
request = Net::HTTP::Get.new("/users/@L@#{@consent_token.locationid}/rest/invitationsbyemail", {"Authorization" => "DelegatedToken dt=\"#{@consent_token.delegationtoken}\""})
response = http.request(request)
end

return response.body
end

# This method parses the XML Contacts document and returns the contacts
# inside an Array
#
# ==== Paramaters
# * xml <String>:: A string containing the XML contacts document
#
def self.parse_xml(xml)
doc = Hpricot::XML(xml)

contacts = []
doc.search('/livecontacts/contacts/contact').each do |contact|
email = contact.at('/preferredemail').inner_text
email.strip!

first_name = last_name = nil
if first_name = contact.at('/profiles/personal/firstname')
first_name = first_name.inner_text.strip
end

if last_name = contact.at('/profiles/personal/lastname')
last_name = last_name.inner_text.strip
end

name = nil
if !first_name.nil? || !last_name.nil?
name = "#{first_name} #{last_name}"
name.strip!
end
contacts.push([name, email])
end

return contacts
end
end

end

0 comments on commit 0df7abe

Please sign in to comment.