module Facebook::Client

Public Instance Methods

accept() click to toggle source
# File lib/rest-core/client/facebook.rb, line 81
def accept             ; headers['Accept']               ; end
accept=(val;) click to toggle source
# File lib/rest-core/client/facebook.rb, line 82
def accept=         val; headers['Accept']          = val; end
access_token() click to toggle source
# File lib/rest-core/client/facebook.rb, line 72
def access_token
  data['access_token'] || data['oauth_token'] if data.kind_of?(Hash)
end
access_token=(token) click to toggle source
# File lib/rest-core/client/facebook.rb, line 76
def access_token= token
  data['access_token'] = token if data.kind_of?(Hash)
end
authorize!(payload={}) { |data = parse_query| ... } click to toggle source
# File lib/rest-core/client/facebook.rb, line 223
def authorize! payload={}, opts={}
  p = {:client_id => app_id, :client_secret => secret}.merge(payload)
  args = ['oauth/access_token', p, {},
          {:json_response => false}.merge(opts)]

  if block_given?
    post(*args){ |r| yield(self.data = ParseQuery.parse_query(r)) }
  else
    self.data = ParseQuery.parse_query(post(*args))
  end
end
authorize_url(query={}) click to toggle source

oauth related

# File lib/rest-core/client/facebook.rb, line 217
def authorize_url query={}, opts={}
  url('dialog/oauth',
      {:client_id => app_id, :access_token => nil}.merge(query),
      {:site => 'https://www.facebook.com/'}.merge(opts))
end
authorized?() click to toggle source
# File lib/rest-core/client/facebook.rb, line 86
def authorized?        ; !!access_token                  ; end
exchange_sessions(query={}) click to toggle source
# File lib/rest-core/client/facebook.rb, line 255
def exchange_sessions query={}, opts={}, &cb
  q = {:client_id => app_id, :client_secret => secret,
       :type => 'client_cred'}.merge(query)
  post(url('oauth/exchange_sessions', q),
       {}, {}, opts, &cb)
end
fbs() click to toggle source
# File lib/rest-core/client/facebook.rb, line 195
def fbs
  "#{fbs_without_sig(data).join('&')}&sig=#{calculate_sig(data)}"
end
for_pages(hash, pages=1, opts={}) { |nil| ... } click to toggle source
# File lib/rest-core/client/facebook.rb, line 117
def for_pages hash, pages=1, opts={}, kind=:next_page, &cb
  if hash.nil?
    nil
  elsif pages <= 0
    if block_given?
      yield(nil)
      self
    else
      nil
    end
  elsif pages == 1
    if block_given?
      yield(hash)
      yield(nil)
      self
    else
      hash
    end
  else
    if block_given?
      yield(hash)
      send(kind, hash, opts){ |result|
        if result.nil?
          yield(nil)
        else
          for_pages(result, pages - 1, opts, kind, &cb)
        end
      }
    else
      merge_data(
        for_pages(send(kind, hash, opts), pages - 1, opts, kind),
        hash)
    end
  end
end
fql(code, query={}) click to toggle source
# File lib/rest-core/client/facebook.rb, line 246
def fql code, query={}, opts={}, &cb
  old_rest('fql.query', {:query => code}.merge(query), opts, &cb)
end
fql_multi(codes, query={}) click to toggle source
# File lib/rest-core/client/facebook.rb, line 250
def fql_multi codes, query={}, opts={}, &cb
  old_rest('fql.multiquery',
    {:queries => Json.encode(codes)}.merge(query), opts, &cb)
end
lang() click to toggle source
# File lib/rest-core/client/facebook.rb, line 83
def lang               ; headers['Accept-Language']      ; end
lang=(val;) click to toggle source
# File lib/rest-core/client/facebook.rb, line 84
def lang=           val; headers['Accept-Language'] = val; end
me(query={}) click to toggle source
# File lib/rest-core/client/facebook.rb, line 68
def me query={}, opts={}
  get('me', query, opts)
end
next_page(hash, opts={}) { |nil| ... } click to toggle source
# File lib/rest-core/client/facebook.rb, line 88
def next_page hash, opts={}, &cb
  if hash.nil?
    nil
  elsif hash['paging'].kind_of?(Hash) && hash['paging']['next']
    # FIXME: facebook is returning broken URI....
    get(URI.encode(hash['paging']['next']), {}, opts, &cb)
  elsif block_given?
    yield(nil)
    self
  else
    nil
  end
end
old_rest(path, query={}) click to toggle source

old rest facebook api, i will definitely love to remove them someday

# File lib/rest-core/client/facebook.rb, line 237
def old_rest path, query={}, opts={}, &cb
  get("method/#{path}", {:format => 'json'}.merge(query),
    {:site => old_site}.merge(opts), &cb)
end
parse_cookies!(cookies) click to toggle source
# File lib/rest-core/client/facebook.rb, line 160
def parse_cookies! cookies
  self.data = if   fbsr = cookies["fbsr_#{app_id}"]
                parse_fbsr!(fbsr)
              else fbs  = cookies["fbs_#{app_id}"]
                parse_fbs!(fbs)
              end
end
parse_fbs!(fbs) click to toggle source
# File lib/rest-core/client/facebook.rb, line 168
def parse_fbs! fbs
  self.data = check_sig_and_return_data(
    # take out facebook sometimes there but sometimes not quotes in cookies
    ParseQuery.parse_query(fbs.to_s.sub(/^"/, '').sub(/"$/, '')))
end
parse_fbsr!(fbsr) click to toggle source
# File lib/rest-core/client/facebook.rb, line 174
def parse_fbsr! fbsr
  old_data = parse_signed_request!(fbsr)
  # beware! maybe facebook would take out the code someday
  return self.data = old_data unless old_data && old_data['code']
  # passing empty redirect_uri is needed!
  arg = {:code => old_data['code'], :redirect_uri => ''}

  if block_given?
    authorize!(arg){ |r| self.data = old_data.merge(r) }
  else
    self.data = old_data.merge(authorize!(arg))
  end
end
parse_json!(json) click to toggle source
# File lib/rest-core/client/facebook.rb, line 188
def parse_json! json
  self.data = json &&
    check_sig_and_return_data(Json.decode(json))
rescue Json::ParseError
  self.data = nil
end
parse_rack_env!(env) click to toggle source

cookies, app_id, secrect related below

# File lib/rest-core/client/facebook.rb, line 155
def parse_rack_env! env
  env['HTTP_COOKIE'].to_s =~ /fbs_#{app_id}=([^\;]+)/
  self.data = parse_fbs!($1)
end
parse_signed_request!(request) click to toggle source

facebook’s new signed_request…

# File lib/rest-core/client/facebook.rb, line 201
def parse_signed_request! request
  sig_encoded, json_encoded = request.split('.')
  return self.data = nil unless sig_encoded && json_encoded
  sig,  json = [sig_encoded, json_encoded].map{ |str|
    "#{str.tr('-_', '+/')}==".unpack('m').first
  }
  self.data = check_sig_and_return_data(
                Json.decode(json).merge('sig' => sig)){
                  Hmac.sha256(secret, json_encoded)
                }
rescue Json::ParseError
  self.data = nil
end
prev_page(hash, opts={}) { |nil| ... } click to toggle source
# File lib/rest-core/client/facebook.rb, line 102
def prev_page hash, opts={}, &cb
  if hash.nil?
    nil
  elsif hash['paging'].kind_of?(Hash) && hash['paging']['previous']
    # FIXME: facebook is returning broken URI....
    get(URI.encode(hash['paging']['previous']), {}, opts, &cb)
  elsif block_given?
    yield(nil)
    self
  else
    nil
  end
end
Also aliased as: previous_page
previous_page(hash, opts={})
Alias for: prev_page
secret_access_token() click to toggle source
# File lib/rest-core/client/facebook.rb, line 80
def secret_access_token; "#{app_id}|#{secret}"           ; end
secret_old_rest(path, query={}) click to toggle source
# File lib/rest-core/client/facebook.rb, line 242
def secret_old_rest path, query={}, opts={}, &cb
  old_rest(path, query, {:secret => true}.merge(opts), &cb)
end

Private Instance Methods

build_env(env={}) click to toggle source
Calls superclass method
# File lib/rest-core/client/facebook.rb, line 267
def build_env env={}
  super(env.inject({}){ |r, (k, v)|
    case k.to_s
      when 'secret'     ; r['access_token'] = secret_access_token
      else              ; r[k.to_s]         = v
    end
    r
  })
end
calculate_sig(cookies) click to toggle source
# File lib/rest-core/client/facebook.rb, line 285
def calculate_sig cookies
  Digest::MD5.hexdigest(fbs_without_sig(cookies).join + secret)
end
check_sig_and_return_data(cookies) { || ... } click to toggle source
# File lib/rest-core/client/facebook.rb, line 277
def check_sig_and_return_data cookies
  cookies if secret && if block_given?
                         yield
                       else
                         calculate_sig(cookies)
                       end == cookies['sig']
end
default_data() click to toggle source
# File lib/rest-core/client/facebook.rb, line 263
def default_data
  {}
end
fbs_without_sig(cookies) click to toggle source
# File lib/rest-core/client/facebook.rb, line 289
def fbs_without_sig cookies
  cookies.reject{ |(k, _)| k == 'sig' }.sort.map{ |a| a.join('=') }
end
merge_data(lhs, rhs) click to toggle source
# File lib/rest-core/client/facebook.rb, line 293
def merge_data lhs, rhs
  [lhs, rhs].each{ |hash|
    return rhs.reject{ |k, v| k == 'paging' } if
      !hash.kind_of?(Hash) || !hash['data'].kind_of?(Array)
  }
  lhs['data'].unshift(*rhs['data'])
  lhs
end