doorkeeper_sso 0.0.3 → 0.0.4

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +13 -12
  3. data/app/controllers/application_controller.rb +3 -0
  4. data/app/controllers/doorkeeper/authorizations_controller.rb +18 -0
  5. data/app/controllers/doorkeeper/tokens_controller.rb +39 -0
  6. data/app/controllers/sso/sessions_controller.rb +29 -0
  7. data/app/middleware/sso/access_token_marker.rb +103 -0
  8. data/app/middleware/sso/authorization_grant_marker.rb +87 -0
  9. data/app/middleware/sso/passport_verification.rb +25 -0
  10. data/app/models/sso/session.rb +137 -0
  11. data/app/views/layouts/doorkeeper/admin.html.erb +34 -0
  12. data/app/views/layouts/doorkeeper/application.html.erb +23 -0
  13. data/config/routes.rb +1 -0
  14. data/db/migrate/20150414102248_create_sso_sessions.rb +29 -0
  15. data/lib/doorkeeper_sso.rb +4 -1
  16. data/lib/sso/engine.rb +0 -12
  17. data/lib/sso/logging.rb +58 -0
  18. data/lib/sso/version.rb +1 -1
  19. data/lib/sso.rb +4 -0
  20. data/spec/controllers/sso/sessions_controller_spec.rb +65 -0
  21. data/spec/fabricators/api_application_fabricator.rb +16 -0
  22. data/spec/fabricators/doorkeeper_access_grant_fabricator.rb +4 -0
  23. data/spec/fabricators/doorkeeper_access_token_fabricator.rb +5 -0
  24. data/spec/fabricators/doorkeeper_application_fabricator.rb +5 -0
  25. data/spec/fabricators/sso_session_fabricator.rb +6 -0
  26. data/spec/fabricators/user_fabricator.rb +35 -0
  27. data/spec/models/sso/session_spec.rb +183 -0
  28. data/spec/rails_helper.rb +21 -6
  29. data/spec/support/devise.rb +28 -0
  30. data/spec/test_app/Rakefile +0 -4
  31. data/spec/test_app/app/models/user.rb +39 -0
  32. data/spec/test_app/config/database.yml +5 -20
  33. data/spec/test_app/config/initializers/devise.rb +259 -0
  34. data/spec/test_app/config/initializers/doorkeeper.rb +111 -0
  35. data/spec/test_app/config/routes.rb +5 -1
  36. data/spec/test_app/db/schema.rb +78 -0
  37. metadata +86 -67
  38. data/app/controllers/sso/application_controller.rb +0 -4
  39. data/spec/test_app/README.rdoc +0 -28
  40. data/spec/test_app/app/assets/javascripts/application.js +0 -13
  41. data/spec/test_app/app/assets/stylesheets/application.css +0 -15
  42. data/spec/test_app/app/controllers/application_controller.rb +0 -5
  43. data/spec/test_app/app/helpers/application_helper.rb +0 -2
  44. data/spec/test_app/app/views/layouts/application.html.erb +0 -14
  45. data/spec/test_app/bin/bundle +0 -3
  46. data/spec/test_app/bin/rails +0 -4
  47. data/spec/test_app/bin/rake +0 -4
  48. data/spec/test_app/bin/setup +0 -29
  49. data/spec/test_app/config/application.rb +0 -32
  50. data/spec/test_app/config/boot.rb +0 -5
  51. data/spec/test_app/config/environment.rb +0 -5
  52. data/spec/test_app/config/environments/development.rb +0 -41
  53. data/spec/test_app/config/environments/production.rb +0 -79
  54. data/spec/test_app/config/environments/test.rb +0 -42
  55. data/spec/test_app/config/initializers/assets.rb +0 -11
  56. data/spec/test_app/config/initializers/backtrace_silencers.rb +0 -7
  57. data/spec/test_app/config/initializers/cookies_serializer.rb +0 -3
  58. data/spec/test_app/config/initializers/filter_parameter_logging.rb +0 -4
  59. data/spec/test_app/config/initializers/inflections.rb +0 -16
  60. data/spec/test_app/config/initializers/mime_types.rb +0 -4
  61. data/spec/test_app/config/initializers/session_store.rb +0 -3
  62. data/spec/test_app/config/initializers/wrap_parameters.rb +0 -14
  63. data/spec/test_app/config/locales/en.yml +0 -23
  64. data/spec/test_app/config/secrets.yml +0 -22
  65. data/spec/test_app/config.ru +0 -4
  66. data/spec/test_app/public/404.html +0 -67
  67. data/spec/test_app/public/422.html +0 -67
  68. data/spec/test_app/public/500.html +0 -66
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9a72ba42e597b0094dc11ac27a6e9c31f291fd77
4
- data.tar.gz: d7422ffed6ac7e4b667a0e9fa32891f9c44de82b
3
+ metadata.gz: 1325cddaeea3ad9c0db0f7421de65c7d671f4e90
4
+ data.tar.gz: f0c5fe37e55ee02487802801fda7c05ff6a9e679
5
5
  SHA512:
6
- metadata.gz: cf76b6854206fdb5e9bd4bf7f33b4462c000e14c6a3de190d5094b1e7cc27dd8bc3f6175dad95cab420f7b8fc3857bf84b94c8e9ffb6f29f5782e0996b9b485d
7
- data.tar.gz: 6c7fdb681c58345c65d8a822d51adccc38a4b6a47a8766985fe648fc95e828a62022d2a80f453cb2a451a1b3387420d6a5a8fc1539a69ab2da9a4b9c6f2b40f1
6
+ metadata.gz: 35345790590a3d6a0a534ae30dd7717793ef3cf12036f6baf0780ebb03c014ec51110aa97574ed7ff7e299eacfb82afa4dca32fb4e772dd8131a48655788221b
7
+ data.tar.gz: 0da08dc94ecc077d572615e0dbf0ff0194529cd4dc5a57f23be4b4fb7d835e7352ab40f74acc61abd9fe0151e27d2591472049b19331aa6f8b067d47897491b6
data/Rakefile CHANGED
@@ -1,26 +1,27 @@
1
+ #!/usr/bin/env rake
1
2
  begin
2
3
  require 'bundler/setup'
3
4
  rescue LoadError
4
5
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
6
  end
7
+ Bundler.require :default, :test
6
8
 
7
- require 'rdoc/task'
8
-
9
- RDoc::Task.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'Sso'
12
- rdoc.options << '--line-numbers'
13
- rdoc.rdoc_files.include('README.rdoc')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
9
+ require 'rake'
10
+ task :environment do
11
+ Combustion.initialize!
15
12
  end
13
+ Combustion::Application.load_tasks
16
14
 
17
15
  APP_RAKEFILE = File.expand_path("../spec/test_app/Rakefile", __FILE__)
18
16
  load 'rails/tasks/engine.rake'
17
+ require "rspec/core/rake_task"
19
18
 
19
+ Bundler::GemHelper.install_tasks
20
20
 
21
- load 'rails/tasks/statistics.rake'
22
-
23
-
21
+ task :default => :spec
24
22
 
25
- Bundler::GemHelper.install_tasks
23
+ # RSpec::Core::RakeTask.new(:spec) do |spec|
24
+ # spec.pattern = 'spec/**/*_spec.rb'
25
+ # # spec.rspec_opts = ['-cfs --backtrace']
26
+ # end
26
27
 
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+
3
+ end
@@ -0,0 +1,18 @@
1
+ module Doorkeeper
2
+ class AuthorizationsController < Doorkeeper::ApplicationController
3
+
4
+ after_action :after_grant_create, only: [:new, :create]
5
+
6
+ protected
7
+
8
+ def after_grant_create
9
+ Rails.logger.info "AuthorizationsController#Create : after_action"
10
+ code_response = authorization.instance_variable_get("@response")
11
+ if code_response
12
+ warden_session = session["warden.user.user.session"]
13
+ Rails.logger.debug "Sso::Session.update_master_with_grant - #{warden_session["sso_session_id"].inspect}, #{code_response.auth.token.inspect}"
14
+ Sso::Session.update_master_with_grant(warden_session["sso_session_id"], code_response.auth.token)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,39 @@
1
+ module Doorkeeper
2
+ class TokensController < Doorkeeper::ApplicationMetalController
3
+ include AbstractController::Callbacks
4
+
5
+ after_action :after_token_create, only: :create
6
+
7
+ protected
8
+
9
+ def after_token_create
10
+ Rails.logger.info "TokensController#Create : after_action"
11
+ handle_authorization_grant_flow
12
+ end
13
+
14
+ def handle_authorization_grant_flow
15
+ # We cannot rely on session[:sso_session_id] here because the end-user might have cookies disabled.
16
+ # The only thing we can rely on to identify the user/Passport is the incoming grant token.
17
+ Rails.logger.debug { %(Detected outgoing "Access Token" #{outgoing_access_token.inspect}) }
18
+ if sso_session = Sso::Session.update_master_with_access_token(grant_token, outgoing_access_token)
19
+ Rails.logger.debug "::Sso::Session.register_access_token success for access_token: #{outgoing_access_token}"
20
+ else
21
+ Rails.logger.debug "::Sso::Session.register_access_token failed. #{sso_session.errors.inspect}"
22
+ warden.logout
23
+ end
24
+ end
25
+
26
+ def grant_token
27
+ params["code"]
28
+ end
29
+
30
+ def grant_type
31
+ params["grant_type"]
32
+ end
33
+
34
+ def outgoing_access_token
35
+ @response_hash ||= JSON.parse(response.body)
36
+ @response_hash["access_token"]
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,29 @@
1
+ class Sso::SessionsController < ApplicationController
2
+
3
+ before_action :authenticate_user!, only: :show
4
+ before_action :doorkeeper_authorize!, only: :create
5
+ before_action :find_user, only: :create
6
+
7
+ # TODO: Security issue?
8
+ protect_from_forgery with: :null_session
9
+
10
+ respond_to :json
11
+
12
+ # Returns a 200 if access is granted
13
+ def show
14
+ render :nothing => true
15
+ end
16
+
17
+ # Generate an SSO:Session
18
+ def create
19
+ @session = Sso::Session.generate(@user, doorkeeper_token, params )
20
+ respond_with @session, :location => sso.sessions_url
21
+ end
22
+
23
+ protected
24
+
25
+ def find_user
26
+ @user = User.find(doorkeeper_token.resource_owner_id)
27
+ end
28
+
29
+ end
@@ -0,0 +1,103 @@
1
+ # app/middleware/sso/access_token_marker.rb
2
+ # Middleware that catches outgoing Doorkeeper access tokens
3
+
4
+ module Sso
5
+ class AccessTokenMarker
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ @env = env
13
+ @request = ::ActionDispatch::Request.new @env
14
+ @response = @app.call @env
15
+
16
+ return response unless request.method == 'POST'
17
+ return response unless authorization_grant_flow? || password_credential_flow?
18
+ return response unless response_code == 200
19
+ return response unless response_body
20
+ return response unless outgoing_access_token
21
+
22
+ if authorization_grant_flow?
23
+ Rails.logger.debug { %{Detected outgoing "Access Token" #{outgoing_access_token.inspect} of the "Authorization Code Grant" flow (belonging to "Authorization Grant Token" #{grant_token.inspect}). Augmenting related Passport with it.} }
24
+ registration = ::Passports.register_access_token grant_token: grant_token, access_token: outgoing_access_token
25
+
26
+ if registration.failure?
27
+ Rails.logger.warn { "The passport could not be augmented. Destroying warden session." }
28
+ warden.logout
29
+ end
30
+
31
+ elsif password_credential_flow?
32
+ Rails.logger.debug { %{Detected outgoing "Access Token" #{outgoing_access_token.inspect} of the "Resource Owner Password Credentials Grant" flow. Generating new Passport with it.} }
33
+ generation = ::Passports.generate_with_access_token access_token_string: outgoing_access_token, ip: request.ip, agent: request.user_agent
34
+
35
+ if generation.failure?
36
+ Rails.logger.warn { "The passport could not be generated. Destroying warden session." }
37
+ warden.logout
38
+ end
39
+
40
+ else
41
+ fail NotImplementedError
42
+ end
43
+
44
+ response
45
+ end
46
+
47
+ def request
48
+ @request
49
+ end
50
+
51
+ def response
52
+ @response
53
+ end
54
+
55
+ def response_body
56
+ response.last.first.presence
57
+ # raise response.last.inspect
58
+ end
59
+
60
+ def response_code
61
+ response.first
62
+ end
63
+
64
+ def parsed_response_body
65
+ # raise response_body.inspect
66
+ return unless response_body
67
+ ::JSON.parse response_body
68
+ rescue JSON::ParserError => exception
69
+ Trouble.notify exception
70
+ nil
71
+ end
72
+
73
+ def outgoing_access_token
74
+ return unless parsed_response_body
75
+ parsed_response_body['access_token']
76
+ end
77
+
78
+ def warden
79
+ request.env['warden']
80
+ end
81
+
82
+ def params
83
+ request.params
84
+ end
85
+
86
+ def authorization_grant_flow?
87
+ grant_token.present?
88
+ end
89
+
90
+ def password_credential_flow?
91
+ grant_type == 'password'
92
+ end
93
+
94
+ def grant_token
95
+ params['code']
96
+ end
97
+
98
+ def grant_type
99
+ params['grant_type']
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,87 @@
1
+ # app/middleware/sso/authorization_grant_maker.rb
2
+ # Middleware that catches outgoing Doorkeeper authorization grants
3
+
4
+ module Sso
5
+ class AuthorizationGrantMarker
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ @env = env
13
+ @response = @app.call @env
14
+
15
+ return response unless outgoing_grant_token
16
+
17
+ if passport_id
18
+ Rails.logger.debug { %{Detected outgoing "Authorization Grant Token" #{outgoing_grant_token.inspect} of the "Authorization Code Grant" flow. Augmenting Passport #{passport_id.inspect} with it.} }
19
+ registration = ::Passports.register_authorization_grant passport_id: passport_id, token: outgoing_grant_token
20
+
21
+ if registration.failure?
22
+ Rails.logger.warn { "The passport could not be augmented. Destroying warden session." }
23
+ warden.logout
24
+ end
25
+ end
26
+
27
+ response
28
+ end
29
+
30
+ def request
31
+ ::ActionDispatch::Request.new @env
32
+ end
33
+
34
+ def response
35
+ @response
36
+ end
37
+
38
+ def code
39
+ response.first
40
+ end
41
+
42
+ def session
43
+ request.session
44
+ end
45
+
46
+ def warden
47
+ request.env['warden']
48
+ end
49
+
50
+ def passport_id
51
+ session['passport_id']
52
+ end
53
+
54
+ def location_header
55
+ unless code == 302
56
+ #logger.debug { "Uninteresting response, because it is not a redirect" }
57
+ return
58
+ end
59
+
60
+ response.second['Location']
61
+ end
62
+
63
+ def redirect_uri
64
+ unless location_header
65
+ #logger.debug { "Uninteresting response, because there is no Location header" }
66
+ return
67
+ end
68
+
69
+ ::URI.parse location_header
70
+ end
71
+
72
+ def redirect_uri_params
73
+ return unless redirect_uri
74
+ ::Rack::Utils.parse_query redirect_uri.query
75
+ end
76
+
77
+ def outgoing_grant_token
78
+ unless redirect_uri_params && redirect_uri_params['code']
79
+ #logger.debug { "Uninteresting response, because there is no code parameter sent" }
80
+ return
81
+ end
82
+
83
+ redirect_uri_params['code']
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,25 @@
1
+ # app/middleware/sso/passport_verification.rb
2
+ # A Middleware to verify incoming requests by client applications
3
+ # which would like to verify the passport a user presented to them
4
+
5
+ module Sso
6
+ class PassportVerification
7
+
8
+ def initialize(app)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ request = Rack::Request.new(env)
14
+
15
+ if request.path == '/api/v1/passports/verify'
16
+ logger.debug { "Detected Passport verification request." }
17
+ env['warden'].authenticate! :passport
18
+ else
19
+ # logger.debug { "I'm not interested in this request to #{request.path}" }
20
+ @app.call(env)
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,137 @@
1
+ module Sso
2
+ class Session < ActiveRecord::Base
3
+ include ::Sso::Logging
4
+ # FIXME: Not sure to use application or doorkeeper_application_id
5
+ belongs_to :application, class_name: 'Doorkeeper::Application' #, inverse_of: :sso_sessions
6
+ belongs_to :access_grant, class_name: 'Doorkeeper::AccessGrant' #, inverse_of: :sso_sessions
7
+ belongs_to :access_token, class_name: 'Doorkeeper::AccessToken' #, inverse_of: :sso_sessions
8
+ belongs_to :owner, class_name: 'User' #, inverse_of: :sso_sessions
9
+
10
+ validates :group_id, presence: true
11
+ validates :owner_id, presence: true
12
+ validates :ip, presence: true
13
+ validates :secret, presence: true
14
+ validates :access_token_id, uniqueness: { scope: [:owner_id, :revoked_at, :application_id], allow_blank: true }
15
+ validates :revoke_reason, allow_blank: true, format: { with: /\A[a-z_]+\z/ }
16
+
17
+ scope :active, -> { where(revoked_at: nil) }
18
+ scope :master, -> { where(application_id: nil) }
19
+
20
+ before_validation :ensure_secret
21
+ before_validation :ensure_group_id
22
+ before_validation :ensure_activity_at
23
+
24
+ class << self
25
+ def master_for(grant_id)
26
+ active.master.find_by!(access_grant_id: grant_id)
27
+ end
28
+
29
+ def generate_master(user, options)
30
+ relations = { owner: user }
31
+ attributes = ActionController::Parameters.new(options).permit(:ip, :agent, :location)
32
+ debug { "Sso::Session::generate_master for #{user.inspect} - #{attributes.inspect}" }
33
+ create!(relations.merge(attributes))
34
+ end
35
+
36
+ def generate(user, access_token, options = {})
37
+ master_sso_session = active.master.find_by!(owner_id: user.id, access_token_id: access_token.id)
38
+ attributes = ActionController::Parameters.new(options).permit(:ip, :agent, :location)
39
+ relations = { owner: user, application: access_token.application, access_token: access_token, group_id: master_sso_session.group_id }
40
+
41
+ debug { "Sso::Session::generate for #{user.inspect} - #{access_token.inspect} - #{attributes.inspect}" }
42
+ create!(relations.merge(attributes))
43
+ end
44
+
45
+ def logout(sso_session_id)
46
+ sso_session = find(sso_session_id)
47
+ group_id = sso_session.group_id
48
+
49
+ debug { "Sso::Session#logout - Revoking Session Group #{sso_session.group_id.inspect} from Session #{sso_session.id.inspect}" }
50
+ count = where(group_id: group_id).update_all revoked_at: Time.current, revoke_reason: "logout"
51
+ debug { "Successfully removed #{count.inspect} sessions." }
52
+ count
53
+ end
54
+
55
+ def update_master_with_grant(master_sso_session_id, oauth_grant)
56
+ master_sso_session = active.master.find(master_sso_session_id)
57
+
58
+ if master_sso_session.update_attribute(:access_grant_id, oauth_grant.id)
59
+ debug { "#update_master_with_grant : #{master_sso_session.id} with Access Grant ID #{oauth_grant.id} which is #{oauth_grant.token}" }
60
+ else
61
+ error { "#update_master_with_grant : FAILED to update oauth_grant" }
62
+ end
63
+ end
64
+
65
+ def update_master_with_access_token(grant_token, access_token)
66
+ oauth_grant = Doorkeeper::AccessGrant.by_token(grant_token)
67
+ oauth_token = Doorkeeper::AccessToken.by_token(access_token)
68
+ return false if oauth_token.blank? or oauth_grant.blank?
69
+
70
+ master_sso_session = active.master.find_by!(access_grant_id: oauth_grant.id)
71
+
72
+ if master_sso_session.update_attribute(:access_token_id, oauth_token.id)
73
+ debug { "#register_access_token : #{master_sso_session.id} with Access Token ID #{oauth_token.id} which is #{oauth_token.token}" }
74
+ else
75
+ error { "#register_access_token : FAILED to update oauth_access_token_id" }
76
+ end
77
+ master_sso_session
78
+ end
79
+ end
80
+
81
+ def create_session(token, options = {})
82
+ create(access_token_id)
83
+ end
84
+ # def to_s
85
+ # ['Sso:Session', owner_id, ip, activity_at].join ', '
86
+ # end
87
+
88
+ private
89
+
90
+ def ensure_secret
91
+ self.secret ||= SecureRandom.uuid
92
+ end
93
+
94
+ def ensure_group_id
95
+ self.group_id ||= SecureRandom.uuid
96
+ end
97
+
98
+ def ensure_activity_at
99
+ self.activity_at ||= Time.current
100
+ end
101
+ end
102
+ end # Sso
103
+
104
+
105
+ # == Schema Information
106
+ # Schema version: 20150330031153
107
+ #
108
+ # Table name: sso_sessions
109
+ #
110
+ # id :uuid not null, primary key
111
+ # access_grant_id :integer
112
+ # access_token_id :integer
113
+ # application_id :integer
114
+ # owner_id :integer not null
115
+ # group_id :string not null
116
+ # secret :string not null
117
+ # ip :inet not null
118
+ # agent :string
119
+ # location :string
120
+ # activity_at :datetime not null
121
+ # revoked_at :datetime
122
+ # revoke_reason :string
123
+ # created_at :datetime not null
124
+ # updated_at :datetime not null
125
+ #
126
+ # Indexes
127
+ #
128
+ # index_sso_sessions_on_access_grant_id (access_grant_id)
129
+ # index_sso_sessions_on_access_token_id (access_token_id)
130
+ # index_sso_sessions_on_application_id (application_id)
131
+ # index_sso_sessions_on_group_id (group_id)
132
+ # index_sso_sessions_on_ip (ip)
133
+ # index_sso_sessions_on_owner_id (owner_id)
134
+ # index_sso_sessions_on_revoke_reason (revoke_reason)
135
+ # index_sso_sessions_on_secret (secret)
136
+ # one_access_token_per_owner (owner_id,access_token_id,application_id) UNIQUE
137
+ #
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Doorkeeper</title>
8
+ <%= stylesheet_link_tag "doorkeeper/admin/application" %>
9
+ <%= csrf_meta_tags %>
10
+ </head>
11
+ <body>
12
+ <div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
13
+ <div class="container">
14
+ <div class="navbar-header">
15
+ <%= link_to t('doorkeeper.layouts.admin.nav.oauth2_provider'), oauth_applications_path, class: 'navbar-brand' %>
16
+ </div>
17
+ <ul class="nav navbar-nav">
18
+ <%= content_tag :li, class: "#{'active' if request.path == oauth_applications_path}" do %>
19
+ <%= link_to t('doorkeeper.layouts.admin.nav.applications'), oauth_applications_path %>
20
+ <% end %>
21
+ </ul>
22
+ </div>
23
+ </div>
24
+ <div class="container">
25
+ <%- if flash[:notice].present? %>
26
+ <div class="alert alert-info">
27
+ <%= flash[:notice] %>
28
+ </div>
29
+ <% end -%>
30
+
31
+ <%= yield %>
32
+ </div>
33
+ </body>
34
+ </html>
@@ -0,0 +1,23 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= t('doorkeeper.layouts.application.title') %></title>
5
+ <meta charset="utf-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+
9
+ <%= stylesheet_link_tag "doorkeeper/application" %>
10
+ <%= csrf_meta_tags %>
11
+ </head>
12
+ <body>
13
+ <div id="container">
14
+ <%- if flash[:notice].present? %>
15
+ <div class="alert alert-info">
16
+ <%= flash[:notice] %>
17
+ </div>
18
+ <% end -%>
19
+
20
+ <%= yield %>
21
+ </div>
22
+ </body>
23
+ </html>
data/config/routes.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  Sso::Engine.routes.draw do
2
+ resource :sessions, :only => [:show, :create]
2
3
  end
@@ -0,0 +1,29 @@
1
+ class CreateSsoSessions < ActiveRecord::Migration
2
+ def change
3
+ enable_extension 'uuid-ossp'
4
+
5
+ create_table :sso_sessions, id: :uuid do |t|
6
+ t.references "access_grant", index: true
7
+ t.references "access_token", index: true
8
+ t.references "application", index: true
9
+ t.integer "owner_id", null: false
10
+ t.string "group_id", null: false
11
+ t.string "secret", null: false
12
+ t.inet "ip", null: false
13
+ t.string "agent"
14
+ t.string "location"
15
+ t.datetime "activity_at", null: false
16
+ t.datetime "revoked_at"
17
+ t.string "revoke_reason"
18
+ t.timestamps
19
+ end
20
+
21
+ add_index :sso_sessions, [:owner_id, :access_token_id, :application_id], where: 'revoked_at IS NULL AND access_token_id IS NOT NULL', unique: true, name: :one_access_token_per_owner
22
+ add_index :sso_sessions, :owner_id
23
+ add_index :sso_sessions, :group_id
24
+ add_index :sso_sessions, :secret
25
+ add_index :sso_sessions, :ip
26
+ add_index :sso_sessions, :revoke_reason
27
+
28
+ end
29
+ end
@@ -1 +1,4 @@
1
- require 'sso'
1
+ require "sso"
2
+
3
+ module DoorkeeperSso
4
+ end
data/lib/sso/engine.rb CHANGED
@@ -1,17 +1,5 @@
1
1
  module Sso
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace Sso
4
-
5
- # Generators for Rspec and Fabrication
6
- config.generators do |g|
7
- g.test_framework :rspec,
8
- :fixtures => true,
9
- :view_specs => false,
10
- :helper_specs => false,
11
- :routing_specs => false,
12
- :controller_specs => true,
13
- :request_specs => false
14
- g.fixture_replacement :fabrication
15
- end
16
4
  end
17
5
  end
@@ -0,0 +1,58 @@
1
+ module Sso
2
+ # One thing tha bugs me is when I cannot see which part of the code caused a log message.
3
+ # This mixin will include the current class name as Logger `progname` so you can show that it in your logfiles.
4
+ #
5
+ module Logging
6
+ extend ActiveSupport::Concern
7
+
8
+ class_methods do
9
+ def debug(&block)
10
+ logger && logger.debug(progname, &block)
11
+ end
12
+
13
+ def info(&block)
14
+ logger && logger.info(progname, &block)
15
+ end
16
+
17
+ def warn(&block)
18
+ logger && logger.warn(progname, &block)
19
+ end
20
+
21
+ def error(&block)
22
+ logger && logger.error(progname, &block)
23
+ end
24
+
25
+ def fatal(&block)
26
+ logger && logger.fatal(progname, &block)
27
+ end
28
+
29
+ def progname
30
+ self.to_s
31
+ end
32
+
33
+ def logger
34
+ Rails.logger
35
+ end
36
+ end #class_methods
37
+
38
+ def debug(&block)
39
+ self.class.debug(&block)
40
+ end
41
+
42
+ def info(&block)
43
+ self.class.info(&block)
44
+ end
45
+
46
+ def warn(&block)
47
+ self.class.warn(&block)
48
+ end
49
+
50
+ def error(&block)
51
+ self.class.error(&block)
52
+ end
53
+
54
+ def fatal(&block)
55
+ self.class.fatal(&block)
56
+ end
57
+ end
58
+ end
data/lib/sso/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sso
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end