f1api 0.9.11 → 0.10.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/lib/f1api/activeresource/connection.rb +8 -7
- data/lib/f1api/client.rb +2 -2
- data/lib/f1api/configuration.rb +69 -57
- data/lib/f1api/oauth.rb +5 -4
- data/lib/f1api/oauth/credentials_authentication.rb +37 -17
- data/test/fixtures/http.rb +8 -6
- data/test/unit/credentials_test.rb +28 -4
- data/test/unit/oauth_test.rb +0 -1
- metadata +9 -20
@@ -26,14 +26,15 @@ module FellowshipOneAPI
|
|
26
26
|
def transform_response(response_body, path)
|
27
27
|
json = JSON.parse(response_body)
|
28
28
|
if json.keys.first == "results"
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
ret << person
|
29
|
+
results = json["results"]["person"]
|
30
|
+
(json["results"].keys.find_all {|key| key[0] == '@' && key != '@array'}).each do |key|
|
31
|
+
results.each do |result|
|
32
|
+
result.merge!({key => json["results"][key]})
|
33
|
+
end
|
35
34
|
end
|
36
|
-
JSON.dump(
|
35
|
+
JSON.dump(results)
|
36
|
+
elsif !json[json.keys.first][json.keys.first.singularize].nil?
|
37
|
+
JSON.dump(json[json.keys.first][json.keys.first.singularize])
|
37
38
|
else
|
38
39
|
JSON.dump(json[json.keys.first])
|
39
40
|
end
|
data/lib/f1api/client.rb
CHANGED
@@ -48,9 +48,9 @@ module FellowshipOneAPI
|
|
48
48
|
end
|
49
49
|
|
50
50
|
if(args[:auth_against])
|
51
|
-
load_consumer_config args[:auth_against]
|
51
|
+
load_consumer_config args[:auth_against], args[:site_url]
|
52
52
|
else
|
53
|
-
load_consumer_config
|
53
|
+
load_consumer_config :portal, args[:site_url]
|
54
54
|
end
|
55
55
|
|
56
56
|
if(args[:oauth_token] and args[:oauth_token_secret])
|
data/lib/f1api/configuration.rb
CHANGED
@@ -3,72 +3,84 @@ module FellowshipOneAPI # :nodoc:
|
|
3
3
|
#
|
4
4
|
# This class was written to take rails environment variables like +RAILS_ENV+ and +Rails.root+ into account
|
5
5
|
class Configuration
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
class <<self
|
7
|
+
# Explictly defines where the configuration file is
|
8
|
+
def file_path=(path)
|
9
|
+
@config_yaml = nil
|
10
|
+
@file_path = path
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
# Reload the configuration file
|
14
|
+
def reload
|
15
|
+
load_yaml
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
# Gets the specified key from the configuration file
|
19
|
+
# [Example] FellowshipTechAPIClient.Configuration["consumer_key"] <i># "2"</i>
|
20
|
+
#
|
21
|
+
# FellowshipTechAPIClient.Configuration["consumer_secret"] <i># "12345678-9abc-def0-1234-567890abcdef"</i>
|
22
|
+
def [](value)
|
23
|
+
load_yaml if @config_yaml.nil?
|
24
|
+
val = @config_yaml[self.environment][value]
|
25
|
+
# if we have the string has "{church_code}" then we'll substitute it
|
26
|
+
if val =~ /\{church_code\}/ and value != "church_code"
|
27
|
+
return val.gsub("{church_code}", self["church_code"])
|
28
|
+
end
|
29
|
+
return val
|
27
30
|
end
|
28
|
-
return val
|
29
|
-
end
|
30
31
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
# Gets the current environment
|
33
|
+
def environment
|
34
|
+
@environment ||= "development"
|
35
|
+
@environment ||= ::Rails.env if defined? ::Rails
|
36
|
+
@environment
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
# Set the current environment
|
40
|
+
def environment=(env_value)
|
41
|
+
@environment = env_value
|
42
|
+
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
# Overridden method_missing to facilitate a more pleasing ruby-like syntax for accessing
|
45
|
+
# configuration values
|
46
|
+
def method_missing(name, *args, &block)
|
47
|
+
return self[name.to_s] unless self[name.to_s].nil?
|
48
|
+
super
|
49
|
+
end
|
50
|
+
|
51
|
+
# Replace the "{church_code}" string with a custom string
|
52
|
+
# Meant for 1st party implementations
|
53
|
+
def url_with_church_code(church_code)
|
54
|
+
val = @config_yaml[self.environment]["url"]
|
55
|
+
# if we have the string has "{church_code}" then we'll substitute it
|
56
|
+
if val =~ /\{church_code\}/ and value != "church_code"
|
57
|
+
return val.gsub("{church_code}", church_code)
|
58
|
+
end
|
59
|
+
end
|
49
60
|
|
50
|
-
|
61
|
+
private
|
51
62
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
63
|
+
# Loads the YAML file
|
64
|
+
#
|
65
|
+
# Starts by looking to see if file_path is defined then checks in current directory (.) and then your Rails.root and then the config
|
66
|
+
# directory off of the base directory of the gem
|
67
|
+
def load_yaml
|
68
|
+
begin
|
69
|
+
if not @file_path.nil?
|
70
|
+
@config_yaml = YAML.load_file(@file_path)
|
71
|
+
elsif File.exists? "./f1-oauth.yml"
|
72
|
+
@config_yaml = YAML.load_file("./f1-oauth.yml")
|
73
|
+
elsif defined? ::Rails
|
74
|
+
@config_yaml = YAML.load_file("#{::Rails.root.to_s}/config/f1-oauth.yml")
|
75
|
+
else
|
76
|
+
path = File.dirname(__FILE__) + "/../../config/f1-oauth.yml"
|
77
|
+
@config_yaml = YAML.load_file(path)
|
78
|
+
end
|
79
|
+
true
|
80
|
+
rescue Exception => ex
|
81
|
+
puts "There was an error: #{ex.message}"
|
82
|
+
false
|
67
83
|
end
|
68
|
-
true
|
69
|
-
rescue Exception => ex
|
70
|
-
puts "There was an error: #{ex.message}"
|
71
|
-
false
|
72
84
|
end
|
73
85
|
end
|
74
86
|
end
|
data/lib/f1api/oauth.rb
CHANGED
@@ -19,7 +19,7 @@ module FellowshipOneAPI # :nodoc:
|
|
19
19
|
alias :consumer_secret= :oauth_consumer_secret=
|
20
20
|
|
21
21
|
# The OAuth access token object where all requests are made off of
|
22
|
-
|
22
|
+
attr_accessor :oauth_access_token
|
23
23
|
alias :access_token :oauth_access_token
|
24
24
|
|
25
25
|
# The OAuth consumer object
|
@@ -30,7 +30,7 @@ module FellowshipOneAPI # :nodoc:
|
|
30
30
|
attr_reader :authenticated_user_uri
|
31
31
|
|
32
32
|
# Creates the OAuth consumer object
|
33
|
-
def load_consumer_config(type = :portal)
|
33
|
+
def load_consumer_config(type = :portal, site_url = nil)
|
34
34
|
case type
|
35
35
|
when :portal
|
36
36
|
authorize_path = FellowshipOneAPI::Configuration.portal_authorize_path
|
@@ -41,9 +41,10 @@ module FellowshipOneAPI # :nodoc:
|
|
41
41
|
@oauth_consumer_key ||= FellowshipOneAPI::Configuration.consumer_key
|
42
42
|
@oauth_consumer_secret ||= FellowshipOneAPI::Configuration.consumer_secret
|
43
43
|
|
44
|
-
|
44
|
+
url = site_url.nil? ? FellowshipOneAPI::Configuration.site_url : site_url
|
45
|
+
@oauth_consumer = ::OAuth::Consumer.new(@oauth_consumer_key,
|
45
46
|
@oauth_consumer_secret,
|
46
|
-
{:site =>
|
47
|
+
{:site => url,
|
47
48
|
:request_token_path => FellowshipOneAPI::Configuration.request_token_path,
|
48
49
|
:access_token_path => FellowshipOneAPI::Configuration.access_token_path,
|
49
50
|
:authorize_path => authorize_path })
|
@@ -3,34 +3,39 @@ module FellowshipOneAPI # :nodoc:
|
|
3
3
|
# Implements the Credentials method of authentication. You must manage the credentials.
|
4
4
|
module CredentialsAuthentication
|
5
5
|
include OAuth
|
6
|
-
#
|
6
|
+
# Authenticates a user and throws and error if unable
|
7
7
|
# +username+:: The username of the user
|
8
8
|
# +password+:: The password of the user
|
9
9
|
# +type+:: Can be :portal or :weblink based on which credentials you want to authenticate against
|
10
10
|
# Returns the URI for the authenticated user
|
11
11
|
def authenticate!(username, password, type = :portal)
|
12
|
-
|
13
|
-
|
14
|
-
cred = URI.encode(Base64.encode64("#{username} #{password}"))
|
15
|
-
|
16
|
-
case type
|
17
|
-
when :portal
|
18
|
-
auth_url = FellowshipOneAPI::Configuration.portal_credential_token_path
|
19
|
-
when :weblink
|
20
|
-
auth_url = FellowshipOneAPI::Configuration.weblink_credential_token_path
|
21
|
-
end
|
22
|
-
|
23
|
-
response = @oauth_consumer.request(:post, auth_url, nil, {}, "ec=#{cred}", {'Content-Type' => 'application/x-www-form-urlencoded'})
|
24
|
-
|
12
|
+
response = get_api_response(username, password, type)
|
13
|
+
|
25
14
|
handle_response_code(response)
|
26
|
-
|
27
15
|
# Gettting the URI of the authenticated user
|
28
16
|
@authenticated_user_uri = response["Content-Location"]
|
29
17
|
end
|
30
18
|
alias :authorize! :authenticate!
|
31
19
|
|
20
|
+
# Authenticates a user and returns true if successful
|
21
|
+
# +username+:: The username of the user
|
22
|
+
# +password+:: The password of the user
|
23
|
+
# +type+:: Can be :portal or :weblink based on which credentials you want to authenticate against
|
24
|
+
# Returns _true_ if was able to authenticate, _false_ if not
|
25
|
+
def authenticate(username, password, type = :portal)
|
26
|
+
response = get_api_response(username, password, type)
|
27
|
+
|
28
|
+
if(response.code.to_i == 400)
|
29
|
+
return false
|
30
|
+
end
|
31
|
+
handle_response_code(response)
|
32
|
+
@authenticated_user_uri = response["Content-Location"]
|
33
|
+
return true
|
34
|
+
end
|
35
|
+
alias :authorize :authenticate
|
36
|
+
|
32
37
|
private
|
33
|
-
|
38
|
+
def handle_response_code(response)
|
34
39
|
case response.code.to_i
|
35
40
|
when (200..299)
|
36
41
|
@oauth_access_token = ::OAuth::AccessToken.from_hash(@oauth_consumer, parse_access_token(response.body))
|
@@ -44,7 +49,22 @@ module FellowshipOneAPI # :nodoc:
|
|
44
49
|
response.error!
|
45
50
|
end
|
46
51
|
end
|
47
|
-
|
52
|
+
|
53
|
+
def get_api_response(username, password, type)
|
54
|
+
load_consumer_config(type) if @oauth_consumer.nil?
|
55
|
+
|
56
|
+
cred = URI.encode(Base64.encode64("#{username} #{password}"))
|
57
|
+
|
58
|
+
case type
|
59
|
+
when :portal
|
60
|
+
auth_url = FellowshipOneAPI::Configuration.portal_credential_token_path
|
61
|
+
when :weblink
|
62
|
+
auth_url = FellowshipOneAPI::Configuration.weblink_credential_token_path
|
63
|
+
end
|
64
|
+
|
65
|
+
@oauth_consumer.request(:post, auth_url, nil, {}, "ec=#{cred}", {'Content-Type' => 'application/x-www-form-urlencoded'})
|
66
|
+
end
|
67
|
+
|
48
68
|
# Parse returned OAuth access token key/secret pair
|
49
69
|
def parse_access_token(response)
|
50
70
|
oauth_hash = {}
|
data/test/fixtures/http.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
class HttpFixture
|
2
|
+
attr_accessor :code
|
3
|
+
|
4
|
+
def initialize(code = "200")
|
5
|
+
self.code = code
|
6
|
+
end
|
7
|
+
|
2
8
|
def body
|
3
9
|
"oauth_token=access&oauth_token_secret=token"
|
4
10
|
end
|
5
|
-
|
11
|
+
|
6
12
|
def [](value)
|
7
13
|
{'Content-Location' => "#{FellowshipOneAPI::Configuration.site_url}/V1/People/123456"}[value]
|
8
14
|
end
|
9
|
-
|
10
|
-
def code
|
11
|
-
"200"
|
12
|
-
end
|
13
|
-
end
|
15
|
+
end
|
@@ -10,18 +10,18 @@ class CredentialsTest < Test::Unit::TestCase
|
|
10
10
|
def setup
|
11
11
|
Configuration.environment = "test"
|
12
12
|
Configuration.file_path = "#{File.dirname(__FILE__)}/../../config/f1-oauth.yml"
|
13
|
-
|
13
|
+
|
14
14
|
@test_username = "testuser"
|
15
15
|
@test_password = "testpass"
|
16
|
-
|
16
|
+
|
17
17
|
@cred_test = CredentialsAuthenticationTest.new
|
18
18
|
@cred_test.load_consumer_config
|
19
19
|
@mocked_access_token = AccessTokenFixture.get(@cred_test.oauth_consumer)
|
20
20
|
@mocked_request_token = RequestTokenFixture.get(@cred_test.oauth_consumer)
|
21
21
|
cred = URI.encode(Base64.encode64("#{@test_username} #{@test_password}"))
|
22
|
-
|
22
|
+
|
23
23
|
@mocked_user_uri = "#{Configuration.site_url}/V1/People/123456"
|
24
|
-
|
24
|
+
|
25
25
|
@cred_test.oauth_consumer.stubs(:get_request_token).returns(@mocked_request_token)
|
26
26
|
|
27
27
|
@cred_test.oauth_consumer.stubs(:request).with(:post, ::FellowshipOneAPI::Configuration.portal_credential_token_path,
|
@@ -57,4 +57,28 @@ class CredentialsTest < Test::Unit::TestCase
|
|
57
57
|
|
58
58
|
assert_equal(@mocked_user_uri, @cred_test.authenticated_user_uri)
|
59
59
|
end
|
60
|
+
|
61
|
+
def test_bool_authenticate_with_valid_creds
|
62
|
+
val = @cred_test.authenticate @test_username, @test_password
|
63
|
+
|
64
|
+
assert(val)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_bool_authenticate_with_invalid_creds
|
68
|
+
@cred_test.oauth_consumer.unstub(:request)
|
69
|
+
@cred_test.oauth_consumer.unstub(:get_request_token)
|
70
|
+
cred = URI.encode(Base64.encode64("#{@test_username} badpassword"))
|
71
|
+
|
72
|
+
@cred_test.oauth_consumer.expects(:request).with(:post, ::FellowshipOneAPI::Configuration.portal_credential_token_path,
|
73
|
+
nil, {}, "ec=#{cred}", {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(
|
74
|
+
HttpFixture.new("400")).at_least_once
|
75
|
+
val = @cred_test.authenticate @test_username, "badpassword"
|
76
|
+
assert val == false
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_site_url
|
80
|
+
@cred_test.load_consumer_config :portal, "http://foo.com"
|
81
|
+
|
82
|
+
assert_equal "http://foo.com", @cred_test.oauth_consumer.site
|
83
|
+
end
|
60
84
|
end
|
data/test/unit/oauth_test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: f1api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-05-06 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: oauth
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157161600 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.4.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157161600
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activeresource
|
27
|
-
requirement: &
|
27
|
+
requirement: &2157161160 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,21 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: oauth
|
38
|
-
requirement: &2156899280 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ! '>='
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: 0.4.4
|
44
|
-
type: :runtime
|
45
|
-
prerelease: false
|
46
|
-
version_requirements: *2156899280
|
35
|
+
version_requirements: *2157161160
|
47
36
|
- !ruby/object:Gem::Dependency
|
48
37
|
name: mocha
|
49
|
-
requirement: &
|
38
|
+
requirement: &2157160520 !ruby/object:Gem::Requirement
|
50
39
|
none: false
|
51
40
|
requirements:
|
52
41
|
- - ! '>='
|
@@ -54,10 +43,10 @@ dependencies:
|
|
54
43
|
version: '0'
|
55
44
|
type: :development
|
56
45
|
prerelease: false
|
57
|
-
version_requirements: *
|
46
|
+
version_requirements: *2157160520
|
58
47
|
- !ruby/object:Gem::Dependency
|
59
48
|
name: activeresource
|
60
|
-
requirement: &
|
49
|
+
requirement: &2157160000 !ruby/object:Gem::Requirement
|
61
50
|
none: false
|
62
51
|
requirements:
|
63
52
|
- - ! '>='
|
@@ -65,7 +54,7 @@ dependencies:
|
|
65
54
|
version: '0'
|
66
55
|
type: :runtime
|
67
56
|
prerelease: false
|
68
|
-
version_requirements: *
|
57
|
+
version_requirements: *2157160000
|
69
58
|
description: ! 'Consumes the Fellowship One API in your apps using ActiveResource. Implements
|
70
59
|
2nd party credentials-based authenticaion and full OAuth implementation. '
|
71
60
|
email: jesse.dearing@activenetwork.com
|