koala 0.7.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +9 -1
- data/Manifest +1 -14
- data/Rakefile +1 -1
- data/koala.gemspec +3 -3
- data/lib/koala/realtime_updates.rb +1 -1
- data/lib/koala.rb +13 -44
- data/spec/koala/api_base_tests.rb +0 -31
- data/spec/koala/oauth/oauth_tests.rb +8 -62
- metadata +5 -19
- data/examples/oauth_playground/Capfile +0 -2
- data/examples/oauth_playground/LICENSE +0 -22
- data/examples/oauth_playground/Rakefile +0 -4
- data/examples/oauth_playground/config/deploy.rb +0 -39
- data/examples/oauth_playground/config/facebook.yml +0 -13
- data/examples/oauth_playground/config.ru +0 -27
- data/examples/oauth_playground/lib/load_facebook.rb +0 -3
- data/examples/oauth_playground/lib/oauth_playground.rb +0 -187
- data/examples/oauth_playground/readme.md +0 -8
- data/examples/oauth_playground/spec/oauth_playground_spec.rb +0 -35
- data/examples/oauth_playground/spec/spec_helper.rb +0 -36
- data/examples/oauth_playground/tmp/restart.txt +0 -0
- data/examples/oauth_playground/views/index.erb +0 -206
- data/examples/oauth_playground/views/layout.erb +0 -39
data/CHANGELOG
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
v0.8.0
|
|
2
|
+
-- Breaking interface changes
|
|
3
|
+
-- Removed string overloading for the methods, per 0.7.3, which caused Marshaling issues
|
|
4
|
+
-- Removed ability to provide a string as the second argument to url_for_access_token, per 0.5.0
|
|
5
|
+
|
|
6
|
+
v0.7.4
|
|
7
|
+
-- Fixed bug with get_user_from_cookies
|
|
8
|
+
|
|
1
9
|
v0.7.3
|
|
2
10
|
-- Added support for picture sizes -- thanks thhermansen for the patch!
|
|
3
11
|
-- Adjusted the return values for several methods (get_access_token, get_app_access_token, get_token_from_session_key, get_tokens_from_session_keys, get_user_from_cookies)
|
|
@@ -8,7 +16,7 @@ v0.7.3
|
|
|
8
16
|
-- There are new info methods (get_access_token_info, get_app_access_token_info, get_token_info_from_session_keys, and get_user_info_from_cookies) that natively return hashes, for when you want the expiration date
|
|
9
17
|
-- Responses with HTTP status 500+ now properly throw errors under Net::HTTP
|
|
10
18
|
-- Updated changelog
|
|
11
|
-
-- Added license
|
|
19
|
+
-- Added license
|
|
12
20
|
|
|
13
21
|
v0.7.2
|
|
14
22
|
-- Added support for exchanging session keys for OAuth access tokens (get_token_from_session_key for single keys, get_tokens_from_session_keys for multiple)
|
data/Manifest
CHANGED
|
@@ -2,21 +2,8 @@ CHANGELOG
|
|
|
2
2
|
LICENSE
|
|
3
3
|
Manifest
|
|
4
4
|
Rakefile
|
|
5
|
-
examples/oauth_playground/Capfile
|
|
6
|
-
examples/oauth_playground/LICENSE
|
|
7
|
-
examples/oauth_playground/Rakefile
|
|
8
|
-
examples/oauth_playground/config.ru
|
|
9
|
-
examples/oauth_playground/config/deploy.rb
|
|
10
|
-
examples/oauth_playground/config/facebook.yml
|
|
11
|
-
examples/oauth_playground/lib/load_facebook.rb
|
|
12
|
-
examples/oauth_playground/lib/oauth_playground.rb
|
|
13
|
-
examples/oauth_playground/readme.md
|
|
14
|
-
examples/oauth_playground/spec/oauth_playground_spec.rb
|
|
15
|
-
examples/oauth_playground/spec/spec_helper.rb
|
|
16
|
-
examples/oauth_playground/tmp/restart.txt
|
|
17
|
-
examples/oauth_playground/views/index.erb
|
|
18
|
-
examples/oauth_playground/views/layout.erb
|
|
19
5
|
init.rb
|
|
6
|
+
koala.gemspec
|
|
20
7
|
lib/koala.rb
|
|
21
8
|
lib/koala/graph_api.rb
|
|
22
9
|
lib/koala/http_services.rb
|
data/Rakefile
CHANGED
|
@@ -4,7 +4,7 @@ require 'rake'
|
|
|
4
4
|
require 'echoe'
|
|
5
5
|
|
|
6
6
|
# gem management
|
|
7
|
-
Echoe.new('koala', '0.
|
|
7
|
+
Echoe.new('koala', '0.8.0') do |p|
|
|
8
8
|
p.summary = "A lightweight, flexible library for Facebook with support for the Graph API, the old REST API, realtime updates, and OAuth validation."
|
|
9
9
|
p.description = "Koala is a lightweight, flexible Ruby SDK for Facebook. It allows read/write access to the social graph via the Graph API and the older REST API, as well as support for realtime updates and OAuth and Facebook Connect authentication. Koala is fully tested and supports Net::HTTP and Typhoeus connections out of the box and can accept custom modules for other services."
|
|
10
10
|
p.url = "http://github.com/arsduo/koala"
|
data/koala.gemspec
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |s|
|
|
4
4
|
s.name = %q{koala}
|
|
5
|
-
s.version = "0.
|
|
5
|
+
s.version = "0.8.0"
|
|
6
6
|
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
|
8
8
|
s.authors = ["Alex Koppel, Chris Baclig, Rafi Jacoby, Context Optional"]
|
|
9
|
-
s.date = %q{2010-06-
|
|
9
|
+
s.date = %q{2010-06-27}
|
|
10
10
|
s.description = %q{Koala is a lightweight, flexible Ruby SDK for Facebook. It allows read/write access to the social graph via the Graph API and the older REST API, as well as support for realtime updates and OAuth and Facebook Connect authentication. Koala is fully tested and supports Net::HTTP and Typhoeus connections out of the box and can accept custom modules for other services.}
|
|
11
11
|
s.email = %q{alex@alexkoppel.com}
|
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "lib/koala.rb", "lib/koala/graph_api.rb", "lib/koala/http_services.rb", "lib/koala/realtime_updates.rb", "lib/koala/rest_api.rb"]
|
|
13
|
-
s.files = ["CHANGELOG", "LICENSE", "Manifest", "Rakefile", "
|
|
13
|
+
s.files = ["CHANGELOG", "LICENSE", "Manifest", "Rakefile", "init.rb", "koala.gemspec", "lib/koala.rb", "lib/koala/graph_api.rb", "lib/koala/http_services.rb", "lib/koala/realtime_updates.rb", "lib/koala/rest_api.rb", "readme.md", "spec/facebook_data.yml", "spec/koala/api_base_tests.rb", "spec/koala/graph_and_rest_api/graph_and_rest_api_no_token_tests.rb", "spec/koala/graph_and_rest_api/graph_and_rest_api_with_token_tests.rb", "spec/koala/graph_api/graph_api_no_access_token_tests.rb", "spec/koala/graph_api/graph_api_with_access_token_tests.rb", "spec/koala/live_testing_data_helper.rb", "spec/koala/net_http_service_tests.rb", "spec/koala/oauth/oauth_tests.rb", "spec/koala/realtime_updates/realtime_updates_tests.rb", "spec/koala/rest_api/rest_api_no_access_token_tests.rb", "spec/koala/rest_api/rest_api_with_access_token_tests.rb", "spec/koala_spec.rb", "spec/koala_spec_helper.rb", "spec/koala_spec_without_mocks.rb", "spec/mock_facebook_responses.yml", "spec/mock_http_service.rb"]
|
|
14
14
|
s.homepage = %q{http://github.com/arsduo/koala}
|
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Koala", "--main", "readme.md"]
|
|
16
16
|
s.require_paths = ["lib"]
|
|
@@ -44,7 +44,7 @@ module Koala
|
|
|
44
44
|
# fetch the access token if we're provided a secret
|
|
45
45
|
if @secret && !@app_access_token
|
|
46
46
|
oauth = Koala::Facebook::OAuth.new(@app_id, @secret)
|
|
47
|
-
@app_access_token = oauth.get_app_access_token
|
|
47
|
+
@app_access_token = oauth.get_app_access_token
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
|
data/lib/koala.rb
CHANGED
|
@@ -107,7 +107,7 @@ module Koala
|
|
|
107
107
|
@app_secret = app_secret
|
|
108
108
|
@oauth_callback_url = oauth_callback_url
|
|
109
109
|
end
|
|
110
|
-
|
|
110
|
+
|
|
111
111
|
def get_user_info_from_cookie(cookie_hash)
|
|
112
112
|
# Parses the cookie set by the official Facebook JavaScript SDK.
|
|
113
113
|
#
|
|
@@ -139,12 +139,9 @@ module Koala
|
|
|
139
139
|
alias_method :get_user_info_from_cookies, :get_user_info_from_cookie
|
|
140
140
|
|
|
141
141
|
def get_user_from_cookie(cookies)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
string = info["uid"]
|
|
146
|
-
|
|
147
|
-
overload_as_hash(string, info)
|
|
142
|
+
if info = get_user_info_from_cookies(cookies)
|
|
143
|
+
string = info["uid"]
|
|
144
|
+
end
|
|
148
145
|
end
|
|
149
146
|
alias_method :get_user_from_cookies, :get_user_from_cookie
|
|
150
147
|
|
|
@@ -164,10 +161,6 @@ module Koala
|
|
|
164
161
|
|
|
165
162
|
def url_for_access_token(code, options = {})
|
|
166
163
|
# Creates the URL for the token corresponding to a given code generated by Facebook
|
|
167
|
-
if options.is_a?(String) # changing the arguments
|
|
168
|
-
puts "Deprecation warning: url_for_access_token now takes an options hash as the second argument; pass the callback as :callback."
|
|
169
|
-
options = {:callback => options}
|
|
170
|
-
end
|
|
171
164
|
callback = options[:callback] || @oauth_callback_url
|
|
172
165
|
raise ArgumentError, "url_for_access_token must get a callback either from the OAuth object or in the parameters!" unless callback
|
|
173
166
|
"https://#{GRAPH_SERVER}/oauth/access_token?client_id=#{@app_id}&redirect_uri=#{callback}&client_secret=#{@app_secret}&code=#{code}"
|
|
@@ -180,11 +173,10 @@ module Koala
|
|
|
180
173
|
end
|
|
181
174
|
|
|
182
175
|
def get_access_token(code)
|
|
183
|
-
info = get_access_token_info(code)
|
|
184
176
|
# upstream methods will throw errors if needed
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
177
|
+
if info = get_access_token_info(code)
|
|
178
|
+
string = info["access_token"]
|
|
179
|
+
end
|
|
188
180
|
end
|
|
189
181
|
|
|
190
182
|
def get_app_access_token_info
|
|
@@ -193,12 +185,11 @@ module Koala
|
|
|
193
185
|
end
|
|
194
186
|
|
|
195
187
|
def get_app_access_token
|
|
196
|
-
info = get_app_access_token_info
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
overload_as_hash(string, info)
|
|
188
|
+
if info = get_app_access_token_info
|
|
189
|
+
string = info["access_token"]
|
|
190
|
+
end
|
|
200
191
|
end
|
|
201
|
-
|
|
192
|
+
|
|
202
193
|
# from session keys
|
|
203
194
|
def get_token_info_from_session_keys(sessions)
|
|
204
195
|
# fetch the OAuth tokens from Facebook
|
|
@@ -219,13 +210,8 @@ module Koala
|
|
|
219
210
|
def get_tokens_from_session_keys(sessions)
|
|
220
211
|
# get the original hash results
|
|
221
212
|
results = get_token_info_from_session_keys(sessions)
|
|
222
|
-
# now recollect them as
|
|
223
|
-
|
|
224
|
-
results.collect do |r|
|
|
225
|
-
string = r["access_token"]
|
|
226
|
-
|
|
227
|
-
overload_as_hash string, r
|
|
228
|
-
end
|
|
213
|
+
# now recollect them as just the access tokens
|
|
214
|
+
results.collect { |r| string = r["access_token"] }
|
|
229
215
|
end
|
|
230
216
|
|
|
231
217
|
def get_token_from_session_key(session)
|
|
@@ -261,23 +247,6 @@ module Koala
|
|
|
261
247
|
:client_secret => @app_secret
|
|
262
248
|
}.merge!(args), post ? "post" : "get").body
|
|
263
249
|
end
|
|
264
|
-
|
|
265
|
-
# overload the object to be accessible as a hash
|
|
266
|
-
# used to make get_*_token methods backward compatible
|
|
267
|
-
# icky ruby magic, but it's _really_ cool we can do this
|
|
268
|
-
def overload_as_hash(obj, hash)
|
|
269
|
-
command = <<-EOS
|
|
270
|
-
def [](index)
|
|
271
|
-
puts "WARNING: get_app_access_token now provides the access token as a string; use get_app_access_token_info if you want the hash with expirations. Otherwise you no longer need to call [] to get the token itself."
|
|
272
|
-
hash = #{hash.inspect}
|
|
273
|
-
hash[index]
|
|
274
|
-
end
|
|
275
|
-
EOS
|
|
276
|
-
|
|
277
|
-
(class << obj; self; end).class_eval command
|
|
278
|
-
|
|
279
|
-
obj
|
|
280
|
-
end
|
|
281
250
|
end
|
|
282
251
|
end
|
|
283
252
|
|
|
@@ -77,35 +77,4 @@ class ApiBaseTests < Test::Unit::TestCase
|
|
|
77
77
|
@service.api('anything').should be_false
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
shared_examples_for "methods that return overloaded strings" do
|
|
83
|
-
before :each do
|
|
84
|
-
@key ||= "access_token"
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
it "should be overloaded to be backward compatible" do
|
|
88
|
-
@result.respond_to?(:[]).should be_true
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
it "should allow hash access to the access token info" do
|
|
92
|
-
@result[@key].should == @result
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
it "should output a deprecation warning when the result is used as a hash" do
|
|
96
|
-
out = nil
|
|
97
|
-
|
|
98
|
-
begin
|
|
99
|
-
# we want to capture the deprecation warning as well as the output
|
|
100
|
-
# credit to http://thinkingdigitally.com/archive/capturing-output-from-puts-in-ruby/ for the technique
|
|
101
|
-
out = StringIO.new
|
|
102
|
-
$stdout = out
|
|
103
|
-
@result[@key]
|
|
104
|
-
ensure
|
|
105
|
-
$stdout = STDOUT
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# ensure we got a warning
|
|
109
|
-
out.should_not be_nil
|
|
110
|
-
end
|
|
111
80
|
end
|
|
@@ -97,19 +97,17 @@ class FacebookOAuthTests < Test::Unit::TestCase
|
|
|
97
97
|
@oauth.get_user_from_cookies(data)
|
|
98
98
|
end
|
|
99
99
|
|
|
100
|
-
it "should use return a string" do
|
|
100
|
+
it "should use return a string if the cookies are valid" do
|
|
101
101
|
result = @oauth.get_user_from_cookies(@oauth_data["valid_cookies"])
|
|
102
102
|
result.should be_a(String)
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
it_should_behave_like "methods that return overloaded strings"
|
|
112
|
-
end
|
|
105
|
+
it "should return nil if the cookies are invalid" do
|
|
106
|
+
# make an invalid string by replacing some values
|
|
107
|
+
bad_cookie_hash = @oauth_data["valid_cookies"].inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
|
|
108
|
+
result = @oauth.get_user_from_cookies(bad_cookie_hash)
|
|
109
|
+
result.should be_nil
|
|
110
|
+
end
|
|
113
111
|
end
|
|
114
112
|
end
|
|
115
113
|
|
|
@@ -163,25 +161,6 @@ class FacebookOAuthTests < Test::Unit::TestCase
|
|
|
163
161
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/access_token?client_id=#{@app_id}&redirect_uri=#{callback}&client_secret=#{@secret}&code=#{@code}"
|
|
164
162
|
end
|
|
165
163
|
|
|
166
|
-
it "should output a deprecation warning but generate a properly formatted OAuth token URL when provided a callback in the deprecated fashion" do
|
|
167
|
-
callback = "foo.com"
|
|
168
|
-
url = out = nil
|
|
169
|
-
|
|
170
|
-
begin
|
|
171
|
-
# we want to capture the deprecation warning as well as the output
|
|
172
|
-
# credit to http://thinkingdigitally.com/archive/capturing-output-from-puts-in-ruby/ for the technique
|
|
173
|
-
out = StringIO.new
|
|
174
|
-
$stdout = out
|
|
175
|
-
url = @oauth.url_for_access_token(@code, callback)
|
|
176
|
-
ensure
|
|
177
|
-
$stdout = STDOUT
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
# two assertions may be bad test writing, but this is for a deprecated method
|
|
181
|
-
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/access_token?client_id=#{@app_id}&redirect_uri=#{callback}&client_secret=#{@secret}&code=#{@code}"
|
|
182
|
-
out.should_not be_nil
|
|
183
|
-
end
|
|
184
|
-
|
|
185
164
|
describe "get_access_token_info" do
|
|
186
165
|
it "should properly get and parse an access token token results into a hash" do
|
|
187
166
|
result = @oauth.get_access_token_info(@code)
|
|
@@ -209,18 +188,10 @@ class FacebookOAuthTests < Test::Unit::TestCase
|
|
|
209
188
|
original = @oauth.get_access_token_info(@code)
|
|
210
189
|
result.should == original["access_token"]
|
|
211
190
|
end
|
|
212
|
-
|
|
191
|
+
|
|
213
192
|
it "should raise an error when get_access_token is called with a bad code" do
|
|
214
193
|
lambda { @oauth.get_access_token("foo") }.should raise_error(Koala::Facebook::APIError)
|
|
215
194
|
end
|
|
216
|
-
|
|
217
|
-
describe "backwards compatibility" do
|
|
218
|
-
before :each do
|
|
219
|
-
@result = @oauth.get_access_token(@code)
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
it_should_behave_like "methods that return overloaded strings"
|
|
223
|
-
end
|
|
224
195
|
end
|
|
225
196
|
|
|
226
197
|
describe "get_app_access_token_info" do
|
|
@@ -246,14 +217,6 @@ class FacebookOAuthTests < Test::Unit::TestCase
|
|
|
246
217
|
original = @oauth.get_app_access_token_info
|
|
247
218
|
result.should == original["access_token"]
|
|
248
219
|
end
|
|
249
|
-
|
|
250
|
-
describe "backwards compatibility" do
|
|
251
|
-
before :each do
|
|
252
|
-
@result = @oauth.get_app_access_token
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
it_should_behave_like "methods that return overloaded strings"
|
|
256
|
-
end
|
|
257
220
|
end
|
|
258
221
|
|
|
259
222
|
describe "exchanging session keys" do
|
|
@@ -288,15 +251,6 @@ class FacebookOAuthTests < Test::Unit::TestCase
|
|
|
288
251
|
result = @oauth.get_tokens_from_session_keys(args)
|
|
289
252
|
result.each {|r| r.should be_a(String) }
|
|
290
253
|
end
|
|
291
|
-
|
|
292
|
-
describe "backwards compatibility" do
|
|
293
|
-
before :each do
|
|
294
|
-
args = @oauth_data["multiple_session_keys"]
|
|
295
|
-
@result = @oauth.get_tokens_from_session_keys(args)[0]
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
it_should_behave_like "methods that return overloaded strings"
|
|
299
|
-
end
|
|
300
254
|
end
|
|
301
255
|
|
|
302
256
|
describe "get_token_from_session_key" do
|
|
@@ -316,14 +270,6 @@ class FacebookOAuthTests < Test::Unit::TestCase
|
|
|
316
270
|
array = @oauth.get_tokens_from_session_keys([@oauth_data["session_key"]])
|
|
317
271
|
result.should == array[0]
|
|
318
272
|
end
|
|
319
|
-
|
|
320
|
-
describe "backwards compatibility" do
|
|
321
|
-
before :each do
|
|
322
|
-
@result = @oauth.get_token_from_session_key(@oauth_data["session_key"])
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
it_should_behave_like "methods that return overloaded strings"
|
|
326
|
-
end
|
|
327
273
|
end
|
|
328
274
|
end
|
|
329
275
|
|
metadata
CHANGED
|
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
|
4
4
|
prerelease: false
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
version: 0.
|
|
7
|
+
- 8
|
|
8
|
+
- 0
|
|
9
|
+
version: 0.8.0
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Alex Koppel, Chris Baclig, Rafi Jacoby, Context Optional
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date: 2010-06-
|
|
17
|
+
date: 2010-06-27 00:00:00 -07:00
|
|
18
18
|
default_executable:
|
|
19
19
|
dependencies: []
|
|
20
20
|
|
|
@@ -37,21 +37,8 @@ files:
|
|
|
37
37
|
- LICENSE
|
|
38
38
|
- Manifest
|
|
39
39
|
- Rakefile
|
|
40
|
-
- examples/oauth_playground/Capfile
|
|
41
|
-
- examples/oauth_playground/LICENSE
|
|
42
|
-
- examples/oauth_playground/Rakefile
|
|
43
|
-
- examples/oauth_playground/config.ru
|
|
44
|
-
- examples/oauth_playground/config/deploy.rb
|
|
45
|
-
- examples/oauth_playground/config/facebook.yml
|
|
46
|
-
- examples/oauth_playground/lib/load_facebook.rb
|
|
47
|
-
- examples/oauth_playground/lib/oauth_playground.rb
|
|
48
|
-
- examples/oauth_playground/readme.md
|
|
49
|
-
- examples/oauth_playground/spec/oauth_playground_spec.rb
|
|
50
|
-
- examples/oauth_playground/spec/spec_helper.rb
|
|
51
|
-
- examples/oauth_playground/tmp/restart.txt
|
|
52
|
-
- examples/oauth_playground/views/index.erb
|
|
53
|
-
- examples/oauth_playground/views/layout.erb
|
|
54
40
|
- init.rb
|
|
41
|
+
- koala.gemspec
|
|
55
42
|
- lib/koala.rb
|
|
56
43
|
- lib/koala/graph_api.rb
|
|
57
44
|
- lib/koala/http_services.rb
|
|
@@ -75,7 +62,6 @@ files:
|
|
|
75
62
|
- spec/koala_spec_without_mocks.rb
|
|
76
63
|
- spec/mock_facebook_responses.yml
|
|
77
64
|
- spec/mock_http_service.rb
|
|
78
|
-
- koala.gemspec
|
|
79
65
|
has_rdoc: true
|
|
80
66
|
homepage: http://github.com/arsduo/koala
|
|
81
67
|
licenses: []
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
Copyright (c) 2010 Alex Koppel
|
|
2
|
-
|
|
3
|
-
Permission is hereby granted, free of charge, to any person
|
|
4
|
-
obtaining a copy of this software and associated documentation
|
|
5
|
-
files (the "Software"), to deal in the Software without
|
|
6
|
-
restriction, including without limitation the rights to use,
|
|
7
|
-
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
-
copies of the Software, and to permit persons to whom the
|
|
9
|
-
Software is furnished to do so, subject to the following
|
|
10
|
-
conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be
|
|
13
|
-
included in all copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
17
|
-
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
19
|
-
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
20
|
-
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
21
|
-
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
22
|
-
OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
set :application, "oauth_playground"
|
|
2
|
-
set :repository, "git://github.com/arsduo/oauth_playground.git"
|
|
3
|
-
set :domain, "oauth.twoalex.com"
|
|
4
|
-
set :deploy_to, "$HOME/rails_apps/#{application}/"
|
|
5
|
-
|
|
6
|
-
# authentication
|
|
7
|
-
set :scm, "git"
|
|
8
|
-
set :user, "alexkm"
|
|
9
|
-
set :use_sudo, false
|
|
10
|
-
ssh_options[:forward_agent] = true
|
|
11
|
-
|
|
12
|
-
# web server
|
|
13
|
-
role :web, "oauth.twoalex.com" # Your HTTP server, Apache/etc
|
|
14
|
-
role :app, "oauth.twoalex.com" # This may be the same as your `Web` server
|
|
15
|
-
role :db, "oauth.twoalex.com", :primary => true # This is where Rails migrations will run
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# other git-related commands
|
|
19
|
-
set :branch, "master"
|
|
20
|
-
default_run_options[:pty] = true
|
|
21
|
-
# cache the repository locally to speed updates
|
|
22
|
-
set :repository_cache, "git_cache"
|
|
23
|
-
set :deploy_via, :remote_cache
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
# passenger-specific deploy tasks
|
|
27
|
-
namespace :deploy do
|
|
28
|
-
task :start do
|
|
29
|
-
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
task :stop do
|
|
33
|
-
# nothing
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
task :restart, :roles => :app, :except => { :no_release => true } do
|
|
37
|
-
run "touch #{File.join(current_path,'tmp','restart.txt')}"
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
development:
|
|
2
|
-
api_key: 171e3563d4fee42e0ba27450838bba32
|
|
3
|
-
secret_key: c81302ccef57cbdd2e68b2229e54cd2f
|
|
4
|
-
app_id: 119347844754245
|
|
5
|
-
|
|
6
|
-
test:
|
|
7
|
-
api_key:
|
|
8
|
-
secret_key:
|
|
9
|
-
|
|
10
|
-
production:
|
|
11
|
-
api_key: 25e1cec0df2b3bfa781da3ed78da3a1e
|
|
12
|
-
secret_key: e45e55a333eec232d4206d2703de1307
|
|
13
|
-
app_id: 119908831367602
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# gems
|
|
2
|
-
require 'sinatra'
|
|
3
|
-
require 'logger'
|
|
4
|
-
require 'yaml'
|
|
5
|
-
|
|
6
|
-
# app files
|
|
7
|
-
require 'koala'
|
|
8
|
-
require File.join(File.dirname(__FILE__), 'lib', 'load_facebook.rb')
|
|
9
|
-
require File.join(File.dirname(__FILE__), 'lib', 'oauth_playground.rb')
|
|
10
|
-
|
|
11
|
-
# LOGGING
|
|
12
|
-
# set up the logfile
|
|
13
|
-
Dir.mkdir('log') unless File.exists?('log')
|
|
14
|
-
log_filename = File.join(File.dirname(__FILE__), "log", "sinatra.log")
|
|
15
|
-
log = File.new(log_filename, "a+")
|
|
16
|
-
|
|
17
|
-
# log requests
|
|
18
|
-
use Rack::CommonLogger, log
|
|
19
|
-
# log application-generated code
|
|
20
|
-
LOGGER = Logger.new(log_filename)
|
|
21
|
-
# log output to stdout and stderr as well
|
|
22
|
-
$stdout.reopen(log)
|
|
23
|
-
$stderr.reopen(log)
|
|
24
|
-
|
|
25
|
-
# activate the app
|
|
26
|
-
disable :run
|
|
27
|
-
run OAuthPlayground
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
2
|
-
|
|
3
|
-
require 'rubygems'
|
|
4
|
-
require 'sinatra'
|
|
5
|
-
require 'erb'
|
|
6
|
-
|
|
7
|
-
class OAuthPlayground < Sinatra::Application
|
|
8
|
-
|
|
9
|
-
set :root, APP_ROOT
|
|
10
|
-
|
|
11
|
-
include Koala
|
|
12
|
-
|
|
13
|
-
layout :layout
|
|
14
|
-
|
|
15
|
-
get "/" do
|
|
16
|
-
@app_data = FACEBOOK_INFO.merge("callback_url" => "#{request.scheme}://#{request.host}/")
|
|
17
|
-
@oauth = Facebook::OAuth.new(@app_data["app_id"], @app_data["secret_key"], @app_data["callback_url"])
|
|
18
|
-
|
|
19
|
-
# get authentication info
|
|
20
|
-
set_facebook_cookies
|
|
21
|
-
set_oauth_data
|
|
22
|
-
set_access_token
|
|
23
|
-
|
|
24
|
-
unless (@permissions = params[:permissions]) && @permissions.length > 0
|
|
25
|
-
@active_permissions = (get_active_permissions || {}).inject([]) do |active, perm|
|
|
26
|
-
# collect our active permissions
|
|
27
|
-
active << perm[0].to_sym if perm[1] == 1
|
|
28
|
-
active
|
|
29
|
-
end
|
|
30
|
-
@fetched_permissions = true
|
|
31
|
-
else
|
|
32
|
-
@active_permissions = @permissions.collect {|p| p.to_sym}
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
@available_permissions = [
|
|
36
|
-
{:name => "User Activity", :perms => ACTIVITY_PERMISSIONS},
|
|
37
|
-
{:name => "User Info", :perms => USER_PERMISSIONS},
|
|
38
|
-
{:name => "Friend Info", :perms => FRIEND_PERMISSIONS}
|
|
39
|
-
]
|
|
40
|
-
|
|
41
|
-
erb :index
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
get "/subscriptions" do
|
|
45
|
-
# validate that this is a valid response
|
|
46
|
-
# it will automatically render the result of the verification
|
|
47
|
-
# e.g. either the challenge phrase or false
|
|
48
|
-
subscription = Facebook::RealtimeUpdates.meet_challenge(params) do |verification_token|
|
|
49
|
-
token_parts = verification_token.split("|")
|
|
50
|
-
expected = Digest::MD5.hexdigest("#{token_parts.first}~koala")
|
|
51
|
-
logger.info "expected: #{expected}"
|
|
52
|
-
logger.info "got: #{token_parts.last}"
|
|
53
|
-
# determine if this is a valid token -- that is, if the send part is a properly encoding of the first
|
|
54
|
-
expected == token_parts.last
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
helpers do
|
|
59
|
-
def logger
|
|
60
|
-
LOGGER
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# helpers
|
|
65
|
-
|
|
66
|
-
# set up our understanding of the user's session
|
|
67
|
-
|
|
68
|
-
def set_access_token
|
|
69
|
-
# get the access token from wherever we can
|
|
70
|
-
@access_token ||= (set_oauth_data && @oauth_access_token) || (set_facebook_cookies && @cookie_access_token)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def set_oauth_data
|
|
74
|
-
unless @oauth_access_token
|
|
75
|
-
if (@code = params[:code]) && @raw_access_response = @oauth.send(:fetch_token_string, {:code => @code, :redirect_uri => @app_data["callback_url"]})
|
|
76
|
-
parsed = @oauth.send(:parse_access_token, @raw_access_response)
|
|
77
|
-
@oauth_access_token = parsed["access_token"]
|
|
78
|
-
@expiration = parsed["expires"] || "Does not expire (offline)"
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
@oauth_access_token
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def set_facebook_cookies
|
|
86
|
-
unless @facebook_cookies
|
|
87
|
-
if @facebook_cookies = @oauth.get_user_from_cookie(request.cookies)
|
|
88
|
-
@cookie_access_token = @facebook_cookies["access_token"]
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
@facebook_cookies
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def set_uid
|
|
96
|
-
# get the OAuth data, including fetching the access token, if available and necessary
|
|
97
|
-
# e.g. if we have an OAuth token and no cookie data
|
|
98
|
-
unless @uid
|
|
99
|
-
if @facebook_cookies
|
|
100
|
-
@uid = @facebook_cookies["uid"]
|
|
101
|
-
elsif token = set_access_token
|
|
102
|
-
# we have to fetch the info
|
|
103
|
-
@graph = Facebook::GraphAPI.new(token)
|
|
104
|
-
result = @graph.get_object("me")
|
|
105
|
-
@uid = result["id"]
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
@uid
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# fetch the active permissions about the user
|
|
112
|
-
def get_active_permissions
|
|
113
|
-
set_access_token
|
|
114
|
-
if @access_token && !@permissions && set_uid
|
|
115
|
-
# if we don't have permissions set but have an access token
|
|
116
|
-
# grab the user's info
|
|
117
|
-
@rest = Facebook::RestAPI.new(@access_token)
|
|
118
|
-
result = @rest.fql_query("select #{all_permissions.join(",")} from permissions where uid = #{@uid.to_s}")
|
|
119
|
-
result.first
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
# list of permissions
|
|
124
|
-
|
|
125
|
-
def all_permissions
|
|
126
|
-
ACTIVITY_PERMISSIONS + USER_PERMISSIONS + FRIEND_PERMISSIONS
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
ACTIVITY_PERMISSIONS = [
|
|
130
|
-
:publish_stream, # Enables your application to post content, comments, and likes to a user's stream and to the streams of the user's friends, without prompting the user each time.
|
|
131
|
-
:create_event, # Enables your application to create and modify events on the user's behalf
|
|
132
|
-
:rsvp_event, # Enables your application to RSVP to events on the user's behalf
|
|
133
|
-
:sms, # Enables your application to send messages to the user and respond to messages from the user via text message
|
|
134
|
-
:offline_access # Enables your application to perform authorized requests on behalf of the user at any time. By default, most access tokens expire after a short time period to ensure applications only make requests on behalf of the user when the are actively using the application. This permission makes the access token returned by our OAuth endpoint long-lived.
|
|
135
|
-
]
|
|
136
|
-
|
|
137
|
-
USER_PERMISSIONS = [
|
|
138
|
-
:email, # Provides access to the user's primary email address in the email property. Do not spam users. Your use of email must comply both with Facebook policies and with the CAN-SPAM Act.
|
|
139
|
-
:read_insights, # Provides read access to the Insights data for pages, applications, and domains the user owns.
|
|
140
|
-
:read_stream, # Provides access to all the posts in the user's News Feed and enables your application to perform searches against the user's News Feed
|
|
141
|
-
:user_about_me, # Provides access to the "About Me" section of the profile in the about property
|
|
142
|
-
:user_activities, # Provides access to the user's list of activities as the activities connection
|
|
143
|
-
:user_birthday, # Provides access to the full birthday with year as the birthday_date property
|
|
144
|
-
:user_education_history, # Provides access to education history as the education property
|
|
145
|
-
:user_events, # Provides access to the list of events the user is attending as the events connection
|
|
146
|
-
:user_groups, # Provides access to the list of groups the user is a member of as the groups connection
|
|
147
|
-
:user_hometown, # Provides access to the user's hometown in the hometown property
|
|
148
|
-
:user_interests, # Provides access to the user's list of interests as the interests connection
|
|
149
|
-
:user_likes, # Provides access to the list of all of the pages the user has liked as the likes connection
|
|
150
|
-
:user_location, # Provides access to the user's current location as the current_location property
|
|
151
|
-
:user_notes, # Provides access to the user's notes as the notes connection
|
|
152
|
-
:user_online_presence, # Provides access to the user's online/offline presence
|
|
153
|
-
:user_photo_video_tags, # Provides access to the photos the user has been tagged in as the photos connection
|
|
154
|
-
:user_photos, # Provides access to the photos the user has uploaded
|
|
155
|
-
:user_relationships, # Provides access to the user's family and personal relationships and relationship status
|
|
156
|
-
:user_religion_politics, # Provides access to the user's religious and political affiliations
|
|
157
|
-
:user_status, # Provides access to the user's most recent status message
|
|
158
|
-
:user_videos, # Provides access to the videos the user has uploaded
|
|
159
|
-
:user_website, # Provides access to the user's web site URL
|
|
160
|
-
:user_work_history # Provides access to work history as the work property
|
|
161
|
-
]
|
|
162
|
-
|
|
163
|
-
FRIEND_PERMISSIONS = [
|
|
164
|
-
:read_friendlists, # Provides read access to the user's friend lists
|
|
165
|
-
:read_requests, # Provides read access to the user's friend requests
|
|
166
|
-
:friends_about_me, # Provides access to the "About Me" section of the profile in the about property
|
|
167
|
-
:friends_activities, # Provides access to the user's list of activities as the activities connection
|
|
168
|
-
:friends_birthday, # Provides access to the full birthday with year as the birthday_date property
|
|
169
|
-
:friends_education_history, # Provides access to education history as the education property
|
|
170
|
-
:friends_events, # Provides access to the list of events the user is attending as the events connection
|
|
171
|
-
:friends_groups, # Provides access to the list of groups the user is a member of as the groups connection
|
|
172
|
-
:friends_hometown, # Provides access to the user's hometown in the hometown property
|
|
173
|
-
:friends_interests, # Provides access to the user's list of interests as the interests connection
|
|
174
|
-
:friends_likes, # Provides access to the list of all of the pages the user has liked as the likes connection
|
|
175
|
-
:friends_location, # Provides access to the user's current location as the current_location property
|
|
176
|
-
:friends_notes, # Provides access to the user's notes as the notes connection
|
|
177
|
-
:friends_online_presence, # Provides access to the user's online/offline presence
|
|
178
|
-
:friends_photo_video_tags, # Provides access to the photos the user has been tagged in as the photos connection
|
|
179
|
-
:friends_photos, # Provides access to the photos the user has uploaded
|
|
180
|
-
:friends_relationships, # Provides access to the user's family and personal relationships and relationship status
|
|
181
|
-
:friends_religion_politics, # Provides access to the user's religious and political affiliations
|
|
182
|
-
:friends_status, # Provides access to the user's most recent status message
|
|
183
|
-
:friends_videos, # Provides access to the videos the user has uploaded
|
|
184
|
-
:friends_website, # Provides access to the user's web site URL
|
|
185
|
-
:friends_work_history # Provides access to work history as the work property
|
|
186
|
-
]
|
|
187
|
-
end
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
A simple OAuth Playground chock full of the info you need to test your OAuth-based Facebook application.
|
|
2
|
-
|
|
3
|
-
To Do's
|
|
4
|
-
=======
|
|
5
|
-
|
|
6
|
-
* Extend the permissions controls to cover all available permissions
|
|
7
|
-
* Make expiration dates human-readable
|
|
8
|
-
* Let people plug in their own app (updating the app's connect properties through setAppProperties)
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'ruby-debug'
|
|
3
|
-
|
|
4
|
-
describe 'OAuthPlayground' do
|
|
5
|
-
before :each do
|
|
6
|
-
@hydra = Typhoeus::Hydra.hydra
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
after :each do
|
|
10
|
-
@hydra.clear_stubs
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it 'should load the index' do
|
|
14
|
-
get '/'
|
|
15
|
-
last_response.should be_ok
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
=begin
|
|
19
|
-
# unfortunately, this fails when you pass the get method a param named code!
|
|
20
|
-
# fixing this will require some mucking around in Rack::Test
|
|
21
|
-
|
|
22
|
-
it "should make a request to Facebook's OAuth server when passed a code" do
|
|
23
|
-
test_string = Regexp.new("The time is #{Time.now.to_i}")
|
|
24
|
-
|
|
25
|
-
# stub out the request and make sure it's returned
|
|
26
|
-
@hydra.stub("https://#{Koala::Facebook::GRAPH_SERVER}/oauth/access_token", "get").and_return(test_string)
|
|
27
|
-
|
|
28
|
-
get "/", {"code" => "foo_bar"}
|
|
29
|
-
|
|
30
|
-
# make sure the body includes the request string
|
|
31
|
-
last_response.body.should =~ test_string
|
|
32
|
-
end
|
|
33
|
-
=end
|
|
34
|
-
end
|
|
35
|
-
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
require 'rubygems'
|
|
2
|
-
require 'sinatra'
|
|
3
|
-
require 'rack/test'
|
|
4
|
-
require 'typhoeus'
|
|
5
|
-
require 'koala'
|
|
6
|
-
|
|
7
|
-
require File.join(File.dirname(__FILE__), '..', 'lib', 'oauth_playground.rb')
|
|
8
|
-
require File.join(File.dirname(__FILE__), '..', 'lib', 'load_facebook.rb')
|
|
9
|
-
|
|
10
|
-
OAuthPlayground.set(
|
|
11
|
-
:environment => :test,
|
|
12
|
-
:run => false,
|
|
13
|
-
:raise_errors => true,
|
|
14
|
-
:logging => false
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
module TestHelper
|
|
18
|
-
|
|
19
|
-
def app
|
|
20
|
-
# change to your app class if using the 'classy' style
|
|
21
|
-
OAuthPlayground
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def body
|
|
25
|
-
last_response.body
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def status
|
|
29
|
-
last_response.status
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
include Rack::Test::Methods
|
|
33
|
-
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
include TestHelper
|
|
File without changes
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
<div id="header">
|
|
2
|
-
<h1>Facebook OAuth Playground</h1>
|
|
3
|
-
<h4>Powered by <a href="http://github.com/arsduo/koala" target="_blank">Koala</a></h2>
|
|
4
|
-
<h4>For novelty use only. Remember, the application's secret key is public.</h4>
|
|
5
|
-
</div>
|
|
6
|
-
|
|
7
|
-
<style>
|
|
8
|
-
#header {
|
|
9
|
-
text-align: center;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
h1, h2, h3, h4 { margin: 0; }
|
|
13
|
-
|
|
14
|
-
.section {
|
|
15
|
-
border: 1px solid black;
|
|
16
|
-
padding: 10px;
|
|
17
|
-
-moz-border-radius: 9px;
|
|
18
|
-
-webkit-border-radius: 9px;
|
|
19
|
-
margin-bottom: 10px;
|
|
20
|
-
width: 100%;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
#contents {
|
|
24
|
-
border: 2px solid #CCC;
|
|
25
|
-
border-width: 2px 0;
|
|
26
|
-
background-color: #EEE;
|
|
27
|
-
padding: 14px 3px 8px 8px;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
#configurationInfo {
|
|
31
|
-
float:left;
|
|
32
|
-
margin-right: 2.5%;
|
|
33
|
-
width: 25%;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
#configurationInfo .section {
|
|
37
|
-
background-color: #CCC;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
#permissions .header {
|
|
41
|
-
margin-bottom: 5px;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
#permissions .list {
|
|
45
|
-
height: 380px;
|
|
46
|
-
overflow: auto;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
#generatedInfo {
|
|
50
|
-
float: left;
|
|
51
|
-
width: 70%;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
#generatedInfo .section {
|
|
55
|
-
border-color: gray;
|
|
56
|
-
background: #DDD;
|
|
57
|
-
overflow: auto;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.clearFloat {
|
|
61
|
-
height: 1px;
|
|
62
|
-
height: 0px;
|
|
63
|
-
clear: both;
|
|
64
|
-
overflow: hidden;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
ul, li { margin: 0; padding: 0; list-style: none; }
|
|
68
|
-
ul { margin: 12px 0; }
|
|
69
|
-
|
|
70
|
-
.code {
|
|
71
|
-
font-family: Courier, fixed;
|
|
72
|
-
font-size: 1.15em;
|
|
73
|
-
width: 100%;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
.explanation {
|
|
77
|
-
font-size: 0.9em;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.datumName {
|
|
81
|
-
font-weight: bold;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.permissionType {
|
|
85
|
-
font-style: italic;
|
|
86
|
-
}
|
|
87
|
-
</style>
|
|
88
|
-
|
|
89
|
-
</style>
|
|
90
|
-
|
|
91
|
-
<div id="contents">
|
|
92
|
-
|
|
93
|
-
<div id="configurationInfo">
|
|
94
|
-
<div id="fbApp" class="section">
|
|
95
|
-
<h3>Facebook App Info</h3>
|
|
96
|
-
<ul>
|
|
97
|
-
<% @app_data.each_pair do |key, value| %>
|
|
98
|
-
<li><span class="datumName"><%= key %>:</span> <%= value %></li>
|
|
99
|
-
<% end %>
|
|
100
|
-
</ul>
|
|
101
|
-
</div>
|
|
102
|
-
|
|
103
|
-
<div id="permissions" class="section">
|
|
104
|
-
<form method="get">
|
|
105
|
-
<div class="header">
|
|
106
|
-
<h3>Permissions</h3>
|
|
107
|
-
<input type="submit" value="Update permissions" />
|
|
108
|
-
<a href="/">Reset Selection</a>
|
|
109
|
-
<div class="explanation">Choose permissions for the OAuth URL and the fb:login button.</div>
|
|
110
|
-
<% if @fetched_permissions %>
|
|
111
|
-
<div class="permissionType">Showing currently-active permissions</div>
|
|
112
|
-
<div class="explanation">(These were fetched by Koala as the page loaded!)</div>
|
|
113
|
-
<% else %>
|
|
114
|
-
<div class="permissionType">Showing selected permissions</div>
|
|
115
|
-
<% end %>
|
|
116
|
-
</div>
|
|
117
|
-
|
|
118
|
-
<div class="list">
|
|
119
|
-
<% @available_permissions.each do |permissions| %>
|
|
120
|
-
<h4><%= permissions[:name] %> Permissions</h4>
|
|
121
|
-
<ul>
|
|
122
|
-
<% permissions[:perms].each do |p| %>
|
|
123
|
-
<li>
|
|
124
|
-
<input type="checkbox" id="permission<%= p %>" name="permissions[]" value="<%= p %>" <%= @active_permissions.include?(p) ? "checked='checked'" : "" %> />
|
|
125
|
-
<label for="permission<%= p %>"><%= p %></a> (<a href="#" onclick="FB.api({method: 'auth.revokeExtendedPermission', perm: '<%= p %>'}, function(response) { alert(response) }); return false;">revoke</a>)
|
|
126
|
-
</li>
|
|
127
|
-
<% end %>
|
|
128
|
-
</ul>
|
|
129
|
-
<% end %>
|
|
130
|
-
</div>
|
|
131
|
-
</form>
|
|
132
|
-
</div>
|
|
133
|
-
</div>
|
|
134
|
-
|
|
135
|
-
<div id="generatedInfo">
|
|
136
|
-
<div id="oauthURLs" class="section">
|
|
137
|
-
<h3>OAuth URLs</h3>
|
|
138
|
-
<ul>
|
|
139
|
-
<li><span class="datumName">Generate a code:</span> <a href="<%= @oauth.url_for_oauth_code(:permissions => @permissions) %>"><%= @oauth.url_for_oauth_code(:permissions => @permissions) %></a></li>
|
|
140
|
-
<li><span class="datumName">OAuth code:</span> <%= @code || "click on the link above" %></li>
|
|
141
|
-
<li>
|
|
142
|
-
<span class="datumName">Access token:</span> <%= @oauth_access_token || "click on the link above" %>
|
|
143
|
-
<% if @oauth_access_token %><div class="explanation">This was fetched by Koala as the page loaded!</div><% end %>
|
|
144
|
-
</li>
|
|
145
|
-
<li><span class="datumName">Expiration:</span> <%= @expiration || "click on the link above" %></li>
|
|
146
|
-
<li><span class="datumName">Raw access response:</span> <%= @raw_access_response || "click on the link above" %></li>
|
|
147
|
-
<li><span class="datumName">URL for access code:</span>
|
|
148
|
-
<% if @code %>
|
|
149
|
-
<a href="<%= @oauth.url_for_access_token(@code) %>"><%= @oauth.url_for_access_token(@code) %></a>
|
|
150
|
-
<% else %>
|
|
151
|
-
click on the link above
|
|
152
|
-
<% end %>
|
|
153
|
-
</li>
|
|
154
|
-
</ul>
|
|
155
|
-
</div>
|
|
156
|
-
|
|
157
|
-
<div id="jsLogin" class="section">
|
|
158
|
-
<h3>Javascript Login (e.g. Facebook Connect)</h3>
|
|
159
|
-
<p>
|
|
160
|
-
<fb:login-button onlogin="location.reload()" perms="<%= (@permissions || []).join(",") %>"></fb:login-button>
|
|
161
|
-
<% if @permissions %>
|
|
162
|
-
and prompt for <%= @permissions.join(", ") %>
|
|
163
|
-
<% end %>
|
|
164
|
-
<% if @facebook_cookies %>
|
|
165
|
-
<div class="logout">
|
|
166
|
-
<a href="#" onclick="FB.logout(function() { location.reload() }); return false;">Logout</a>
|
|
167
|
-
</div>
|
|
168
|
-
<% end %>
|
|
169
|
-
</p>
|
|
170
|
-
</div>
|
|
171
|
-
|
|
172
|
-
<div id="cookieInfo" class="section">
|
|
173
|
-
<h3>Cookie info</h3>
|
|
174
|
-
<ul>
|
|
175
|
-
<% if @facebook_cookies %>
|
|
176
|
-
<% @facebook_cookies.each_pair do |key, value| %>
|
|
177
|
-
<li><span class="datumName"><%= key %>:</span> <%= value %></li>
|
|
178
|
-
<% end %>
|
|
179
|
-
<% else %>
|
|
180
|
-
<li>You're not signed in via Javascript. Login below.</li>
|
|
181
|
-
<% end %>
|
|
182
|
-
<li><span class="datumName">Raw hash</span>:
|
|
183
|
-
<div class="code"><%= request.cookies.inspect %></div>
|
|
184
|
-
</li>
|
|
185
|
-
</ul>
|
|
186
|
-
</div>
|
|
187
|
-
|
|
188
|
-
<div id="koala" class="section">
|
|
189
|
-
<h3>Koala</h3>
|
|
190
|
-
<ul>
|
|
191
|
-
<li><span class="datumName">GraphAPI:</span>
|
|
192
|
-
<div class="code"><%= @access_token ? "@graph = Koala::Facebook::GraphAPI.new(\"#{@access_token}\")" : "sign in above" %></div>
|
|
193
|
-
</li>
|
|
194
|
-
<li><span class="datumName">OAuth:</span>
|
|
195
|
-
<div class="code">@oauth = Koala::Facebook::OAuth.new(<%= @app_data["app_id"] %>, "<%= @app_data["secret_key"] %>", "<%= @app_data["callback_url"] %>")</div>
|
|
196
|
-
</li>
|
|
197
|
-
</ul>
|
|
198
|
-
</div>
|
|
199
|
-
</div>
|
|
200
|
-
|
|
201
|
-
<div class="clearFloat"> </div>
|
|
202
|
-
</div>
|
|
203
|
-
|
|
204
|
-
<center>
|
|
205
|
-
<h5>Check out the playground's code at <a href="http://github.com/arsduo/oauth_playground">http://github.com/arsduo/oauth_playground</a>!</h5>
|
|
206
|
-
</center>
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
<head>
|
|
3
|
-
<title>Facebook OAuth Playground</title>
|
|
4
|
-
<meta name="description" content="Making it easier to play with Facebook's new Graph API and OAuth authentication."></meta>
|
|
5
|
-
<style>
|
|
6
|
-
body {
|
|
7
|
-
font-family: verdana, arial, sans-serif;
|
|
8
|
-
font-size: 12px;
|
|
9
|
-
margin: 0px;
|
|
10
|
-
}
|
|
11
|
-
</style>
|
|
12
|
-
</head>
|
|
13
|
-
<body>
|
|
14
|
-
|
|
15
|
-
<script type="text/javascript">
|
|
16
|
-
|
|
17
|
-
var _gaq = _gaq || [];
|
|
18
|
-
_gaq.push(['_setAccount', 'UA-16395421-1']);
|
|
19
|
-
_gaq.push(['_trackPageview']);
|
|
20
|
-
|
|
21
|
-
(function() {
|
|
22
|
-
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
|
23
|
-
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
|
24
|
-
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
|
25
|
-
})();
|
|
26
|
-
|
|
27
|
-
</script>
|
|
28
|
-
|
|
29
|
-
<%= yield %>
|
|
30
|
-
|
|
31
|
-
<div id="fb-root"></div>
|
|
32
|
-
<script src="http://connect.facebook.net/en_US/all.js"></script>
|
|
33
|
-
<script>
|
|
34
|
-
FB.init({ appId: <%= @app_data["app_id"] %>, cookie: true, status: true, xfbml: true });
|
|
35
|
-
</script>
|
|
36
|
-
|
|
37
|
-
</body>
|
|
38
|
-
|
|
39
|
-
</html>
|