kraut 0.5.6
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/.gitignore +11 -0
- data/.rspec +1 -0
- data/Gemfile +3 -0
- data/README.md +175 -0
- data/Rakefile +10 -0
- data/app/controllers/kraut/sessions_controller.rb +30 -0
- data/app/models/kraut/session.rb +67 -0
- data/app/views/kraut/sessions/new.html.haml +15 -0
- data/autotest/discover.rb +1 -0
- data/config/initializers/savon.rb +12 -0
- data/config/locales/kraut.yml +14 -0
- data/config/routes.rb +5 -0
- data/kraut.gemspec +43 -0
- data/lib/kraut.rb +3 -0
- data/lib/kraut/application.rb +31 -0
- data/lib/kraut/client.rb +63 -0
- data/lib/kraut/kraut.rb +21 -0
- data/lib/kraut/mapper.rb +20 -0
- data/lib/kraut/principal.rb +85 -0
- data/lib/kraut/rails/authentication.rb +80 -0
- data/lib/kraut/rails/engine.rb +29 -0
- data/lib/kraut/rails/spec/login_helper.rb +28 -0
- data/lib/kraut/rails/spec/protected_action.rb +68 -0
- data/lib/kraut/rails/spec/user_helper.rb +27 -0
- data/lib/kraut/rails/spec_helper.rb +15 -0
- data/lib/kraut/version.rb +6 -0
- data/spec/controllers/application_controller_spec.rb +219 -0
- data/spec/controllers/sessions_controller_spec.rb +106 -0
- data/spec/fixtures/authenticate_application/invalid_app.xml +11 -0
- data/spec/fixtures/authenticate_application/invalid_password.xml +11 -0
- data/spec/fixtures/authenticate_application/success.xml +10 -0
- data/spec/fixtures/authenticate_principal/application_access_denied.xml +11 -0
- data/spec/fixtures/authenticate_principal/invalid_password.xml +11 -0
- data/spec/fixtures/authenticate_principal/invalid_user.xml +11 -0
- data/spec/fixtures/authenticate_principal/success.xml +7 -0
- data/spec/fixtures/find_principal_by_token/invalid_token.xml +11 -0
- data/spec/fixtures/find_principal_by_token/success.xml +39 -0
- data/spec/fixtures/find_principal_with_attributes_by_name/invalid_user.xml +11 -0
- data/spec/fixtures/find_principal_with_attributes_by_name/success.xml +69 -0
- data/spec/fixtures/is_group_member/not_in_group.xml +8 -0
- data/spec/fixtures/is_group_member/success.xml +8 -0
- data/spec/kraut/application_spec.rb +99 -0
- data/spec/kraut/client_spec.rb +101 -0
- data/spec/kraut/mapper_spec.rb +48 -0
- data/spec/kraut/principal_spec.rb +142 -0
- data/spec/models/session_spec.rb +148 -0
- data/spec/rails/engine_spec.rb +24 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/views/sessions/new.html.haml_spec.rb +11 -0
- metadata +237 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Kraut::SessionsController do
|
4
|
+
|
5
|
+
describe "routing" do
|
6
|
+
it "should route to new" do
|
7
|
+
{ :get => "/sessions/new" }.
|
8
|
+
should route_to(:controller => "kraut/sessions", :action => "new")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should route to create" do
|
12
|
+
{ :post => "/sessions" }.
|
13
|
+
should route_to(:controller => "kraut/sessions", :action => "create")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should route to destroy" do
|
17
|
+
{ :delete => "/sessions" }.
|
18
|
+
should route_to(:controller => "kraut/sessions", :action => "destroy")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "GET :new" do
|
23
|
+
it "should assign a session" do
|
24
|
+
get :new
|
25
|
+
assigns[:session].should be_a(Kraut::Session)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "POST :create" do
|
30
|
+
before do
|
31
|
+
@user = Kraut::Session.new
|
32
|
+
Kraut::Session.expects(:new).returns(@user)
|
33
|
+
controller.expects(:authenticate_application)
|
34
|
+
Kraut::Rails::Engine.config.entry_url = "/blu"
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with valid credentials" do
|
38
|
+
context "and :stored_location is not set" do
|
39
|
+
before do
|
40
|
+
@user.expects(:valid?).returns(true)
|
41
|
+
post :create
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should store the new session" do
|
45
|
+
controller.user.should == @user
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should redirect to configured entry_url" do
|
49
|
+
response.should redirect_to("/blu")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "and :stored_location is set" do
|
54
|
+
before do
|
55
|
+
@user.expects(:valid?).returns(true)
|
56
|
+
session[:stored_location] = "/url/we/want"
|
57
|
+
post :create
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should store the new session" do
|
61
|
+
controller.user.should == @user
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should redirect to :stored_location" do
|
65
|
+
response.should redirect_to("/url/we/want")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should delete the :stored_location parameter" do
|
69
|
+
session[:stored_location].should be_nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "with invalid credentials" do
|
75
|
+
before do
|
76
|
+
@user.expects(:valid?).returns(false)
|
77
|
+
session[:stored_location] = "/url/we/want"
|
78
|
+
post :create
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should not store the new session" do
|
82
|
+
controller.user.should be_nil
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should render the :new action" do
|
86
|
+
response.should render_template(:new)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should not delete the :stored_location parameter" do
|
90
|
+
session[:stored_location].should_not be_nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "DELETE :destroy" do
|
96
|
+
it "should logout, reset the session and redirect to configured entry_url" do
|
97
|
+
controller.switch_user(Kraut::Session.new)
|
98
|
+
Kraut::Rails::Engine.config.entry_url = "/bla"
|
99
|
+
delete :destroy
|
100
|
+
controller.logged_in?.should == false
|
101
|
+
session.should == {}
|
102
|
+
response.should redirect_to("/bla")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<soap:Fault>
|
4
|
+
<faultcode>soap:Server</faultcode>
|
5
|
+
<faultstring>Failed to find entity of type [com.atlassian.crowd.model.application.Application] with identifier [invalid]</faultstring>
|
6
|
+
<detail>
|
7
|
+
<InvalidAuthenticationException xmlns="urn:SecurityServer"/>
|
8
|
+
</detail>
|
9
|
+
</soap:Fault>
|
10
|
+
</soap:Body>
|
11
|
+
</soap:Envelope>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<soap:Fault>
|
4
|
+
<faultcode>soap:Server</faultcode>
|
5
|
+
<faultstring>The password in the application's crowd.properties file does not match the password in Crowd. Application with invalid password: app</faultstring>
|
6
|
+
<detail>
|
7
|
+
<InvalidAuthenticationException xmlns="urn:SecurityServer"/>
|
8
|
+
</detail>
|
9
|
+
</soap:Fault>
|
10
|
+
</soap:Body>
|
11
|
+
</soap:Envelope>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<ns1:authenticateApplicationResponse xmlns:ns1="urn:SecurityServer">
|
4
|
+
<ns1:out>
|
5
|
+
<name xmlns="http://authentication.integration.crowd.atlassian.com">app</name>
|
6
|
+
<token xmlns="http://authentication.integration.crowd.atlassian.com">J8n5KCem7Djk30zel0rUdA00</token>
|
7
|
+
</ns1:out>
|
8
|
+
</ns1:authenticateApplicationResponse>
|
9
|
+
</soap:Body>
|
10
|
+
</soap:Envelope>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<soap:Fault>
|
4
|
+
<faultcode>soap:Server</faultcode>
|
5
|
+
<faultstring>com.atlassian.crowd.manager.application.ApplicationAccessDeniedException: User does not have access to application my-app</faultstring>
|
6
|
+
<detail>
|
7
|
+
<ApplicationAccessDeniedException xmlns="urn:SecurityServer" />
|
8
|
+
</detail>
|
9
|
+
</soap:Fault>
|
10
|
+
</soap:Body>
|
11
|
+
</soap:Envelope>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<soap:Fault>
|
4
|
+
<faultcode>soap:Server</faultcode>
|
5
|
+
<faultstring>Failed to authenticate principal, password was invalid</faultstring>
|
6
|
+
<detail>
|
7
|
+
<InvalidAuthenticationException xmlns="urn:SecurityServer"/>
|
8
|
+
</detail>
|
9
|
+
</soap:Fault>
|
10
|
+
</soap:Body>
|
11
|
+
</soap:Envelope>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<soap:Fault>
|
4
|
+
<faultcode>soap:Server</faultcode>
|
5
|
+
<faultstring>Failed to find entity of type [com.atlassian.crowd.model.application.Application] with identifier [unknown]</faultstring>
|
6
|
+
<detail>
|
7
|
+
<InvalidAuthenticationException xmlns="urn:SecurityServer"/>
|
8
|
+
</detail>
|
9
|
+
</soap:Fault>
|
10
|
+
</soap:Body>
|
11
|
+
</soap:Envelope>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<ns1:authenticatePrincipalResponse xmlns:ns1="urn:SecurityServer">
|
4
|
+
<ns1:out>COvlhb092poBHXi4rh4PQg00</ns1:out>
|
5
|
+
</ns1:authenticatePrincipalResponse>
|
6
|
+
</soap:Body>
|
7
|
+
</soap:Envelope>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<soap:Fault>
|
4
|
+
<faultcode>soap:Server</faultcode>
|
5
|
+
<faultstring>Failed to find entity of type [com.atlassian.crowd.model.token.Token] with identifier [0d0hWMoxDJLsO05lX06oKA02]</faultstring>
|
6
|
+
<detail>
|
7
|
+
<InvalidTokenException xmlns="urn:SecurityServer"/>
|
8
|
+
</detail>
|
9
|
+
</soap:Fault>
|
10
|
+
</soap:Body>
|
11
|
+
</soap:Envelope>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<ns1:findPrincipalByTokenResponse xmlns:ns1="urn:SecurityServer">
|
4
|
+
<ns1:out>
|
5
|
+
<ID xmlns="http://soap.integration.crowd.atlassian.com">-1</ID>
|
6
|
+
<active xmlns="http://soap.integration.crowd.atlassian.com">true</active>
|
7
|
+
<attributes xmlns="http://soap.integration.crowd.atlassian.com">
|
8
|
+
<SOAPAttribute>
|
9
|
+
<name>givenName</name>
|
10
|
+
<values>
|
11
|
+
<ns1:string>Test</ns1:string>
|
12
|
+
</values>
|
13
|
+
</SOAPAttribute>
|
14
|
+
<SOAPAttribute>
|
15
|
+
<name>sn</name>
|
16
|
+
<values>
|
17
|
+
<ns1:string>Supervisor</ns1:string>
|
18
|
+
</values>
|
19
|
+
</SOAPAttribute>
|
20
|
+
<SOAPAttribute>
|
21
|
+
<name>displayName</name>
|
22
|
+
<values>
|
23
|
+
<ns1:string>Test Supervisor</ns1:string>
|
24
|
+
</values>
|
25
|
+
</SOAPAttribute>
|
26
|
+
<SOAPAttribute>
|
27
|
+
<name>mail</name>
|
28
|
+
<values>
|
29
|
+
<ns1:string>no_reply@blau.de</ns1:string>
|
30
|
+
</values>
|
31
|
+
</SOAPAttribute>
|
32
|
+
</attributes>
|
33
|
+
<description xsi:nil="true" xmlns="http://soap.integration.crowd.atlassian.com"/>
|
34
|
+
<directoryId xmlns="http://soap.integration.crowd.atlassian.com">32769</directoryId>
|
35
|
+
<name xmlns="http://soap.integration.crowd.atlassian.com">test-supervisor</name>
|
36
|
+
</ns1:out>
|
37
|
+
</ns1:findPrincipalByTokenResponse>
|
38
|
+
</soap:Body>
|
39
|
+
</soap:Envelope>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<soap:Fault>
|
4
|
+
<faultcode>soap:Server</faultcode>
|
5
|
+
<faultstring>Failed to find entity of type [com.atlassian.crowd.integration.model.user.User] with identifier [unknown]</faultstring>
|
6
|
+
<detail>
|
7
|
+
<ObjectNotFoundException xmlns="urn:SecurityServer"/>
|
8
|
+
</detail>
|
9
|
+
</soap:Fault>
|
10
|
+
</soap:Body>
|
11
|
+
</soap:Envelope>
|
@@ -0,0 +1,69 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<ns1:findPrincipalWithAttributesByNameResponse xmlns:ns1="urn:SecurityServer">
|
4
|
+
<ns1:out>
|
5
|
+
<ID xmlns="http://soap.integration.crowd.atlassian.com">-1</ID>
|
6
|
+
<active xmlns="http://soap.integration.crowd.atlassian.com">true</active>
|
7
|
+
<attributes xmlns="http://soap.integration.crowd.atlassian.com">
|
8
|
+
<SOAPAttribute>
|
9
|
+
<name>givenName</name>
|
10
|
+
<values>
|
11
|
+
<ns1:string>Test</ns1:string>
|
12
|
+
</values>
|
13
|
+
</SOAPAttribute>
|
14
|
+
<SOAPAttribute>
|
15
|
+
<name>sn</name>
|
16
|
+
<values>
|
17
|
+
<ns1:string>User</ns1:string>
|
18
|
+
</values>
|
19
|
+
</SOAPAttribute>
|
20
|
+
<SOAPAttribute>
|
21
|
+
<name>displayName</name>
|
22
|
+
<values>
|
23
|
+
<ns1:string>Test User</ns1:string>
|
24
|
+
</values>
|
25
|
+
</SOAPAttribute>
|
26
|
+
<SOAPAttribute>
|
27
|
+
<name>mail</name>
|
28
|
+
<values>
|
29
|
+
<ns1:string>test@blau.de</ns1:string>
|
30
|
+
</values>
|
31
|
+
</SOAPAttribute>
|
32
|
+
<SOAPAttribute>
|
33
|
+
<name>requiresPasswordChange</name>
|
34
|
+
<values>
|
35
|
+
<ns1:string>false</ns1:string>
|
36
|
+
</values>
|
37
|
+
</SOAPAttribute>
|
38
|
+
<SOAPAttribute>
|
39
|
+
<name>invalidPasswordAttempts</name>
|
40
|
+
<values>
|
41
|
+
<ns1:string>0</ns1:string>
|
42
|
+
</values>
|
43
|
+
</SOAPAttribute>
|
44
|
+
<SOAPAttribute>
|
45
|
+
<name>lastAuthenticated</name>
|
46
|
+
<values>
|
47
|
+
<ns1:string>1286895918952</ns1:string>
|
48
|
+
</values>
|
49
|
+
</SOAPAttribute>
|
50
|
+
<SOAPAttribute>
|
51
|
+
<name>passwordLastChanged</name>
|
52
|
+
<values>
|
53
|
+
<ns1:string>1274258741546</ns1:string>
|
54
|
+
</values>
|
55
|
+
</SOAPAttribute>
|
56
|
+
<SOAPAttribute>
|
57
|
+
<name>inexsoUserId</name>
|
58
|
+
<values>
|
59
|
+
<ns1:string>107</ns1:string>
|
60
|
+
</values>
|
61
|
+
</SOAPAttribute>
|
62
|
+
</attributes>
|
63
|
+
<description xsi:nil="true" xmlns="http://soap.integration.crowd.atlassian.com"/>
|
64
|
+
<directoryId xmlns="http://soap.integration.crowd.atlassian.com">32769</directoryId>
|
65
|
+
<name xmlns="http://soap.integration.crowd.atlassian.com">test</name>
|
66
|
+
</ns1:out>
|
67
|
+
</ns1:findPrincipalWithAttributesByNameResponse>
|
68
|
+
</soap:Body>
|
69
|
+
</soap:Envelope>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<ns1:isGroupMemberResponse xmlns:ns1="urn:SecurityServer">
|
4
|
+
<ns1:out>false</ns1:out>
|
5
|
+
</ns1:isGroupMemberResponse>
|
6
|
+
</soap:Body>
|
7
|
+
</soap:Envelope>
|
8
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soap:Body>
|
3
|
+
<ns1:isGroupMemberResponse xmlns:ns1="urn:SecurityServer">
|
4
|
+
<ns1:out>true</ns1:out>
|
5
|
+
</ns1:isGroupMemberResponse>
|
6
|
+
</soap:Body>
|
7
|
+
</soap:Envelope>
|
8
|
+
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "kraut/application"
|
3
|
+
|
4
|
+
describe Kraut::Application do
|
5
|
+
let(:application) { Kraut::Application }
|
6
|
+
|
7
|
+
before do
|
8
|
+
savon.expects(:authenticate_application).returns(:success)
|
9
|
+
Kraut::Application.authenticate "app", "password"
|
10
|
+
end
|
11
|
+
|
12
|
+
describe ".authenticate" do
|
13
|
+
it "should return the application credentials" do
|
14
|
+
savon.expects(:authenticate_application).returns(:success)
|
15
|
+
|
16
|
+
credentials = application.authenticate "app", "password"
|
17
|
+
credentials.should == ["app", "password", "J8n5KCem7Djk30zel0rUdA00"]
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should set the application name" do
|
21
|
+
application.name.should == "app"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should set the application password" do
|
25
|
+
application.password.should == "password"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should set the authentication token" do
|
29
|
+
application.token.should == "J8n5KCem7Djk30zel0rUdA00"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should set the last authentication time" do
|
33
|
+
application.authenticated_at.should be_a(Time)
|
34
|
+
end
|
35
|
+
|
36
|
+
context "in case of an invalid application name" do
|
37
|
+
before { savon.expects(:authenticate_application).returns(:invalid_app) }
|
38
|
+
|
39
|
+
it "should raise an InvalidAuthentication error" do
|
40
|
+
lambda { Kraut::Application.authenticate "invalid", "invalid" }.
|
41
|
+
should raise_error(Kraut::InvalidAuthentication, /with identifier \[invalid\]/)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "in case of an invalid password" do
|
46
|
+
before { savon.expects(:authenticate_application).returns(:invalid_password) }
|
47
|
+
|
48
|
+
it "should raise an InvalidAuthentication error" do
|
49
|
+
lambda { Kraut::Application.authenticate "app", "invalid" }.
|
50
|
+
should raise_error(Kraut::InvalidAuthentication, /Application with invalid password/)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe ".name" do
|
56
|
+
it "should contain the application name" do
|
57
|
+
application.name.should == "app"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe ".password" do
|
62
|
+
it "should contain the application password" do
|
63
|
+
application.password.should == "password"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe ".token" do
|
68
|
+
it "should contain the authentication token" do
|
69
|
+
application.token.should == "J8n5KCem7Djk30zel0rUdA00"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe ".authentication_required?" do
|
74
|
+
context "when not authenticated" do
|
75
|
+
before { Kraut::Application.authenticated_at = nil }
|
76
|
+
|
77
|
+
it "should return true" do
|
78
|
+
application.authentication_required?.should == true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when authentication expired (default timeout = 10 min)" do
|
83
|
+
before { Kraut::Application.authenticated_at = Time.now - (60 * 11) }
|
84
|
+
|
85
|
+
it "should return true" do
|
86
|
+
application.authentication_required?.should == true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when authenticated" do
|
91
|
+
before { Kraut::Application.authenticated_at = Time.now }
|
92
|
+
|
93
|
+
it "should return false" do
|
94
|
+
application.authentication_required?.should == false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "kraut/client"
|
3
|
+
|
4
|
+
describe Kraut::Client do
|
5
|
+
|
6
|
+
shared_examples_for "a Kraut::Client" do
|
7
|
+
context "when receiving an ApplicationAccessDenied error" do
|
8
|
+
it "should raise a Kraut::ApplicationAccessDenied error" do
|
9
|
+
savon.expects(:authenticate_principal).returns(:application_access_denied)
|
10
|
+
expect { subject.request :authenticate_principal, :some => :request }.to raise_error(Kraut::ApplicationAccessDenied)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when receiving an InvalidAuthentication error" do
|
15
|
+
it "should raise a Kraut::InvalidAuthentication error" do
|
16
|
+
savon.expects(:authenticate_principal).returns(:invalid_user)
|
17
|
+
expect { subject.request :authenticate_principal, :some => :request }.to raise_error(Kraut::InvalidAuthentication)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe ".request" do
|
23
|
+
context "when successful" do
|
24
|
+
before do
|
25
|
+
savon.expects(:authenticate_application).with(
|
26
|
+
:in0 => { "aut:credential" => { "aut:credential" => "password" }, "aut:name" => "name" }
|
27
|
+
).returns(:success)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return the response as a Hash" do
|
31
|
+
result = subject.request :authenticate_application, :in0 => {
|
32
|
+
"aut:credential" => { "aut:credential" => "password" }, "aut:name" => "name"
|
33
|
+
}
|
34
|
+
|
35
|
+
result.should include(:out => { :token => "J8n5KCem7Djk30zel0rUdA00", :name => "app" })
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when Savon raises errors" do
|
40
|
+
it_should_behave_like "a Kraut::Client"
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when Savon does not raise errors" do
|
44
|
+
it_should_behave_like "a Kraut::Client"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".auth_request" do
|
49
|
+
context "when successful" do
|
50
|
+
before do
|
51
|
+
Kraut::Application.expects(:name).returns("app")
|
52
|
+
Kraut::Application.expects(:token).returns("J8n5KCem7Djk30zel0rUdA00")
|
53
|
+
|
54
|
+
savon.expects(:authenticate_principal).with(
|
55
|
+
:in0 => { "aut:name" => "app", "aut:token" => "J8n5KCem7Djk30zel0rUdA00" },
|
56
|
+
:in1 => {
|
57
|
+
"aut:application" => "app",
|
58
|
+
"aut:credential" => { "aut:credential" => "password" }, "aut:name" => "name"
|
59
|
+
},
|
60
|
+
:order! => [:in0, :in1]
|
61
|
+
).returns(:success)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should return the response as a Hash" do
|
65
|
+
result = subject.auth_request :authenticate_principal, :in1 => {
|
66
|
+
"aut:application" => "app",
|
67
|
+
"aut:credential" => { "aut:credential" => "password" }, "aut:name" => "name"
|
68
|
+
}
|
69
|
+
|
70
|
+
result.should include(:out => "COvlhb092poBHXi4rh4PQg00")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when Savon raises errors" do
|
75
|
+
it_should_behave_like "a Kraut::Client"
|
76
|
+
end
|
77
|
+
|
78
|
+
context "when Savon does not raise errors" do
|
79
|
+
it_should_behave_like "a Kraut::Client"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe ".client" do
|
84
|
+
it "should return a Savon::Client instance" do
|
85
|
+
Kraut::Client.client.should be_a(Savon::Client)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should memoize the Savon::Client instance" do
|
89
|
+
Kraut::Client.client.should equal(Kraut::Client.client)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should set the SOAP endpoint" do
|
93
|
+
Kraut::Client.client.wsdl.endpoint.should == Kraut.endpoint
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should set the target namespace" do
|
97
|
+
Kraut::Client.client.wsdl.namespace.should == "urn:SecurityServer"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|