crowd_client 0.0.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.
@@ -0,0 +1,21 @@
1
+ class CrowdClientGenerator < Rails::Generator::Base
2
+
3
+ def banner
4
+ "Usage #{$0} #{spec.name}"
5
+ end
6
+
7
+ def manifest
8
+ record do |m|
9
+ # copy the session controller
10
+ m.directory('app/controllers')
11
+ m.file('sessions_controller.rb', 'app/controllers/sessions_controller.rb')
12
+
13
+ # copy the default login (session/new) view
14
+ m.directory('app/views/sessions')
15
+ m.file('new.html.erb', 'app/views/sessions/new.html.erb')
16
+
17
+ # copy the initializer
18
+ m.file 'initializers_crowd_client.rb', 'config/initializers/crowd_client.rb'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ # Configuration Parameters for crowd client gem
2
+
3
+ Crowd::Client::Config.service_base_url = 'https://crowd.gnoso.com/'
4
+ Crowd::Client::Config.api_key = 'replace-with-crowd-api-key'
5
+ Crowd::Client::Config.realm = 'replace-with-crowd-realm'
6
+ Crowd::Client::Config.application_name = 'replace-with-crowd-application-name'
7
+
8
+ # Apply the settings across the application
9
+ Crowd::Client::Config.apply_configuration
@@ -0,0 +1,12 @@
1
+
2
+ <% form_tag sessions_resource_url do -%>
3
+ <%= hidden_field_tag 'realm', crowd_realm %>
4
+ <%= hidden_field_tag 'redirect_url', sessions_create_url %>
5
+
6
+ <div><%= label_tag "username" %><%= text_field_tag "username" %></div>
7
+ <div><%= label_tag "password" %><%= password_field_tag "password" %></div>
8
+
9
+ <div><%= check_box_tag 'save_login'%><%= label_tag 'save_login', 'Remember me.'%></div>
10
+
11
+ <%= submit_tag "Login" %>
12
+ <% end -%>
@@ -0,0 +1,27 @@
1
+ #
2
+ # This file was generated by the crowd_client gem.
3
+ #
4
+ # To regenerate:
5
+ #
6
+ # script/generate crowd_client
7
+ #
8
+ class SessionsController < ApplicationController
9
+
10
+ skip_before_filter :must_authenticate
11
+
12
+ def create
13
+ if create_session(params) then
14
+ flash[:message] = "Logged in."
15
+ redirect_to after_login_url || root_url
16
+ else
17
+ flash[:error] = "Unsuccessful login."
18
+ redirect_to :action => "new"
19
+ end
20
+ end
21
+
22
+ def destroy
23
+ destroy_session
24
+ redirect_to :action => "new"
25
+ end
26
+
27
+ end
@@ -0,0 +1,16 @@
1
+ module Crowd
2
+ module Client
3
+
4
+ class Config
5
+
6
+ cattr_accessor :service_base_url # base url of the crowd service: default => "https://crowd.gnoso.com"
7
+ cattr_accessor :api_key # api-key from crowd to allow api access
8
+ cattr_accessor :realm # name of the crowd realm that this site will use for authentication
9
+ cattr_accessor :application_name # name of the application (used to verify API keys)
10
+
11
+ def self.apply_configuration
12
+ CrowdUser.apply_configuration
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,114 @@
1
+ # Add authentication methods to the application controller
2
+ #
3
+ # Usually you would include this in your Application Controller Class like so
4
+ #
5
+ # class ApplicationController < ActionController::Base
6
+ # include Crowd::Client::ApplicationControllerMethods
7
+ #
8
+ # .......
9
+ #
10
+ # end
11
+
12
+ module Crowd
13
+ module Client
14
+ module ApplicationControllerMethods
15
+
16
+ def logged_in?
17
+ session[:logged_in]
18
+ end
19
+
20
+ def logged_in_name
21
+ session[:name]
22
+ end
23
+
24
+ def after_login_url=(url)
25
+ session[:after_login_url] = url
26
+ end
27
+
28
+ def after_login_url
29
+ session[:after_login_url]
30
+ end
31
+
32
+ def authenticated_with_api?
33
+ @authenticated_with_api
34
+ end
35
+
36
+ def must_authenticate
37
+ return if authenticated_with_api?
38
+ crowd_realm = Crowd::Client::Config.realm
39
+
40
+ if logged_in?
41
+ return true
42
+ elsif (token = params.delete(:c_token))
43
+ register_login(token)
44
+ redirect_to params
45
+ elsif !checked_with_crowd?
46
+ session[:checked_crowd] = true
47
+ redirect_to "https://crowd.gnoso.com/sessions/check?realm=#{crowd_realm}&redirect_url=#{url_for(params.merge(:only_path => false))}"
48
+ else
49
+ after_login_url = params
50
+ redirect_to :controller => :sessions, :action => :new
51
+ end
52
+ end
53
+
54
+ def verify_api_key
55
+ key = authenticate_with_http_basic { |api_key, ignore| api_key }
56
+ logger.info "Key: #{key}"
57
+
58
+ if key then
59
+ # check the key against the crowd server
60
+ client = HTTPClient.new
61
+ response = client.get crowd_auth_url(key)
62
+ logger.info "Crowd Response Status: #{response.status}"
63
+ logger.info "Crowd Response: #{response.body.content}"
64
+
65
+ @authenticated_with_api = (response.status == 200)
66
+ end
67
+
68
+ true # continue filter chain
69
+ end
70
+
71
+ def crowd_auth_url(key)
72
+ crowd_application_name = Crowd::Client::Config.application_name
73
+ crowd_realm = Crowd::Client::Config.realm
74
+ URI.join( Crowd::Client::Config.service_base_url, "/api_keys/authenticate?realm=#{crowd_realm}&key=#{key}&application_name=#{crowd_application_name}")
75
+ end
76
+
77
+ def register_login(token)
78
+ session[:logged_in] = true
79
+ crowd_user = CrowdUser.find(token)
80
+ session[:name] = "#{crowd_user.first_name} #{crowd_user.last_name}"
81
+ end
82
+
83
+ def checked_with_crowd?
84
+ session[:checked_crowd]
85
+ end
86
+
87
+ def create_session(params)
88
+ status = params[:c_status]
89
+ access_token = params[:c_token]
90
+
91
+ case status
92
+ when "SUCCESS":
93
+ register_login(access_token)
94
+ return true
95
+ when "INVALID_LOGIN":
96
+ return false
97
+ else
98
+ raise "Something is configured wrong. Invalid status for session.", :status => 500
99
+ end
100
+ end
101
+
102
+ # handler intended to be used within the create_session block
103
+ def has_status(status, &block)
104
+ status == @session_status
105
+ end
106
+
107
+ def destroy_session
108
+ session[:logged_in] = false
109
+ session[:name] = nil
110
+ end
111
+
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,44 @@
1
+ module Crowd
2
+ module Client
3
+ module ViewHelpers
4
+
5
+ def logged_in?
6
+ controller.logged_in?
7
+ end
8
+
9
+ def logged_in_name
10
+ controller.logged_in_name
11
+ end
12
+
13
+ def crowd_realm
14
+ Crowd::Client::Config.realm
15
+ end
16
+
17
+ def crowd_application_name
18
+ Crowd::Client::Config.application_name
19
+ end
20
+
21
+ def sessions_resource_url
22
+ URI.join( Crowd::Client::Config.service_base_url, 'sessions' ).to_s
23
+ end
24
+
25
+ def sessions_create_url
26
+ url_for(:controller => 'sessions', :action => 'create', :only_path => false)
27
+ end
28
+
29
+ def sessions_destroy_url
30
+ url_for(:controller => 'sessions', :action => 'destroy', :only_path => false)
31
+ end
32
+
33
+ def crowd_logout_url
34
+ URI.join( Crowd::Client::Config.service_base_url, "/sessions/0?realm=#{crowd_realm}&redirect_url=#{sessions_destroy_url}").to_s
35
+ end
36
+
37
+ def link_to_logout(text = nil)
38
+ link_to text || "Log Out", crowd_logout_url, :method => "delete"
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,11 @@
1
+ class CrowdUser < ActiveResource::Base
2
+
3
+ # This is called after the configuraion settings are set in the initializer
4
+ def self.apply_configuration
5
+ self.site = Crowd::Client::Config.service_base_url
6
+ self.element_name = "user"
7
+ self.user = Crowd::Client::Config.api_key
8
+ self.password = ""
9
+ end
10
+
11
+ end
@@ -0,0 +1,12 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'crowd_client')
2
+
3
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'mixins', 'application_controller')
4
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'mixins', 'crowd_helpers')
5
+
6
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'models', 'crowd_user')
7
+
8
+ #require File.join(File.dirname(__FILE__), '..', 'generators', 'crowd_client', 'crowd_client_generator')
9
+
10
+ # Hook our helpers into rails
11
+ ActionView::Base.send :include, Crowd::Client::ViewHelpers
12
+ ActionController::Base.send :include, Crowd::Client::ApplicationControllerMethods
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crowd_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ platform: ruby
6
+ authors:
7
+ - Gnoso, Inc.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-18 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Crowd is a service for authenticating and tracking user accounts. This is the client library for crowd.
17
+ email: conversation@gnoso.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - rails/init.rb
26
+ - generators/crowd_client/crowd_client_generator.rb
27
+ - generators/crowd_client/templates/initializers_crowd_client.rb
28
+ - generators/crowd_client/templates/new.html.erb
29
+ - generators/crowd_client/templates/sessions_controller.rb
30
+ - lib/crowd_client.rb
31
+ - lib/mixins/application_controller.rb
32
+ - lib/mixins/crowd_helpers.rb
33
+ - lib/models/crowd_user.rb
34
+ has_rdoc: true
35
+ homepage: http://www.gnoso.com
36
+ licenses: []
37
+
38
+ post_install_message:
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ requirements: []
56
+
57
+ rubyforge_project:
58
+ rubygems_version: 1.3.5
59
+ signing_key:
60
+ specification_version: 3
61
+ summary: Client library for the crowd user account system.
62
+ test_files: []
63
+