doorkeeper_sso 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +13 -12
- data/app/controllers/application_controller.rb +3 -0
- data/app/controllers/doorkeeper/authorizations_controller.rb +18 -0
- data/app/controllers/doorkeeper/tokens_controller.rb +39 -0
- data/app/controllers/sso/sessions_controller.rb +29 -0
- data/app/middleware/sso/access_token_marker.rb +103 -0
- data/app/middleware/sso/authorization_grant_marker.rb +87 -0
- data/app/middleware/sso/passport_verification.rb +25 -0
- data/app/models/sso/session.rb +137 -0
- data/app/views/layouts/doorkeeper/admin.html.erb +34 -0
- data/app/views/layouts/doorkeeper/application.html.erb +23 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20150414102248_create_sso_sessions.rb +29 -0
- data/lib/doorkeeper_sso.rb +4 -1
- data/lib/sso/engine.rb +0 -12
- data/lib/sso/logging.rb +58 -0
- data/lib/sso/version.rb +1 -1
- data/lib/sso.rb +4 -0
- data/spec/controllers/sso/sessions_controller_spec.rb +65 -0
- data/spec/fabricators/api_application_fabricator.rb +16 -0
- data/spec/fabricators/doorkeeper_access_grant_fabricator.rb +4 -0
- data/spec/fabricators/doorkeeper_access_token_fabricator.rb +5 -0
- data/spec/fabricators/doorkeeper_application_fabricator.rb +5 -0
- data/spec/fabricators/sso_session_fabricator.rb +6 -0
- data/spec/fabricators/user_fabricator.rb +35 -0
- data/spec/models/sso/session_spec.rb +183 -0
- data/spec/rails_helper.rb +21 -6
- data/spec/support/devise.rb +28 -0
- data/spec/test_app/Rakefile +0 -4
- data/spec/test_app/app/models/user.rb +39 -0
- data/spec/test_app/config/database.yml +5 -20
- data/spec/test_app/config/initializers/devise.rb +259 -0
- data/spec/test_app/config/initializers/doorkeeper.rb +111 -0
- data/spec/test_app/config/routes.rb +5 -1
- data/spec/test_app/db/schema.rb +78 -0
- metadata +86 -67
- data/app/controllers/sso/application_controller.rb +0 -4
- data/spec/test_app/README.rdoc +0 -28
- data/spec/test_app/app/assets/javascripts/application.js +0 -13
- data/spec/test_app/app/assets/stylesheets/application.css +0 -15
- data/spec/test_app/app/controllers/application_controller.rb +0 -5
- data/spec/test_app/app/helpers/application_helper.rb +0 -2
- data/spec/test_app/app/views/layouts/application.html.erb +0 -14
- data/spec/test_app/bin/bundle +0 -3
- data/spec/test_app/bin/rails +0 -4
- data/spec/test_app/bin/rake +0 -4
- data/spec/test_app/bin/setup +0 -29
- data/spec/test_app/config/application.rb +0 -32
- data/spec/test_app/config/boot.rb +0 -5
- data/spec/test_app/config/environment.rb +0 -5
- data/spec/test_app/config/environments/development.rb +0 -41
- data/spec/test_app/config/environments/production.rb +0 -79
- data/spec/test_app/config/environments/test.rb +0 -42
- data/spec/test_app/config/initializers/assets.rb +0 -11
- data/spec/test_app/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/test_app/config/initializers/cookies_serializer.rb +0 -3
- data/spec/test_app/config/initializers/filter_parameter_logging.rb +0 -4
- data/spec/test_app/config/initializers/inflections.rb +0 -16
- data/spec/test_app/config/initializers/mime_types.rb +0 -4
- data/spec/test_app/config/initializers/session_store.rb +0 -3
- data/spec/test_app/config/initializers/wrap_parameters.rb +0 -14
- data/spec/test_app/config/locales/en.yml +0 -23
- data/spec/test_app/config/secrets.yml +0 -22
- data/spec/test_app/config.ru +0 -4
- data/spec/test_app/public/404.html +0 -67
- data/spec/test_app/public/422.html +0 -67
- data/spec/test_app/public/500.html +0 -66
data/lib/sso.rb
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe Sso::SessionsController, :type => :controller do
|
4
|
+
routes { Sso::Engine.routes }
|
5
|
+
render_views
|
6
|
+
|
7
|
+
describe "GET show" do
|
8
|
+
let(:user) { Fabricate(:user) }
|
9
|
+
|
10
|
+
context "logged_in" do
|
11
|
+
before() { sign_in user }
|
12
|
+
|
13
|
+
it "returns not authorized" do
|
14
|
+
get :show, format: :json
|
15
|
+
expect(response).to have_http_status(:ok)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "not logged_in" do
|
20
|
+
it "returns not authorized" do
|
21
|
+
get :show, format: :json
|
22
|
+
expect(response).to have_http_status(:unauthorized)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "POST create" do
|
28
|
+
let(:user) { Fabricate(:user) }
|
29
|
+
let(:params) { { :ip => "202.188.0.133", :agent => "Chrome", format: :json } }
|
30
|
+
|
31
|
+
context "not logged_in" do
|
32
|
+
it do
|
33
|
+
post :create, params
|
34
|
+
expect(response).to have_http_status(:unauthorized)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "logged_in" do
|
39
|
+
let(:user) { Fabricate(:user) }
|
40
|
+
let(:attributes) { { ip: "10.1.1.1", agent: "Safari" } }
|
41
|
+
let(:master_sso_session) { Sso::Session.generate_master(user, attributes) }
|
42
|
+
let(:access_token) { Fabricate("Doorkeeper::AccessToken",
|
43
|
+
resource_owner_id: user.id) }
|
44
|
+
let(:access_grant) { Fabricate('Doorkeeper::AccessGrant',
|
45
|
+
resource_owner_id: user.id,
|
46
|
+
redirect_uri: 'http://localhost:3002/oauth/callback'
|
47
|
+
) }
|
48
|
+
|
49
|
+
before do
|
50
|
+
master_sso_session.access_token_id = access_token.id
|
51
|
+
master_sso_session.access_grant_id = access_grant.id
|
52
|
+
master_sso_session.save
|
53
|
+
|
54
|
+
allow(controller).to receive(:doorkeeper_authorize!).and_return(true)
|
55
|
+
allow(controller).to receive(:doorkeeper_token).and_return(access_token)
|
56
|
+
|
57
|
+
post :create, params
|
58
|
+
end
|
59
|
+
|
60
|
+
it { expect(response).to have_http_status(:created) }
|
61
|
+
it { expect(assigns(:user)).to eq user }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Fabricator(:api_application) do
|
2
|
+
name { Faker::Internet.domain_word }
|
3
|
+
api_key { Faker::Lorem.characters(16) }
|
4
|
+
end
|
5
|
+
|
6
|
+
# == Schema Information
|
7
|
+
# Schema version: 20150320075507
|
8
|
+
#
|
9
|
+
# Table name: api_applications
|
10
|
+
#
|
11
|
+
# id :integer not null, primary key
|
12
|
+
# name :string
|
13
|
+
# api_key :string
|
14
|
+
# created_at :datetime not null
|
15
|
+
# updated_at :datetime not null
|
16
|
+
#
|
@@ -0,0 +1,35 @@
|
|
1
|
+
Fabricator(:user) do
|
2
|
+
first_name Faker::Name.name
|
3
|
+
email Faker::Internet.email
|
4
|
+
password Faker::Internet.password
|
5
|
+
password_confirmation { |attrs| "#{attrs[:password]}" }
|
6
|
+
end
|
7
|
+
|
8
|
+
# == Schema Information
|
9
|
+
# Schema version: 20150320075507
|
10
|
+
#
|
11
|
+
# Table name: users
|
12
|
+
#
|
13
|
+
# id :integer not null, primary key
|
14
|
+
# email :string default(""), not null
|
15
|
+
# encrypted_password :string default(""), not null
|
16
|
+
# reset_password_token :string
|
17
|
+
# reset_password_sent_at :datetime
|
18
|
+
# remember_created_at :datetime
|
19
|
+
# sign_in_count :integer default("0"), not null
|
20
|
+
# current_sign_in_at :datetime
|
21
|
+
# last_sign_in_at :datetime
|
22
|
+
# current_sign_in_ip :inet
|
23
|
+
# last_sign_in_ip :inet
|
24
|
+
# created_at :datetime
|
25
|
+
# updated_at :datetime
|
26
|
+
# first_name :string
|
27
|
+
# last_name :string
|
28
|
+
# lang :string default("EN")
|
29
|
+
# phone :string
|
30
|
+
#
|
31
|
+
# Indexes
|
32
|
+
#
|
33
|
+
# index_users_on_email (email) UNIQUE
|
34
|
+
# index_users_on_reset_password_token (reset_password_token) UNIQUE
|
35
|
+
#
|
@@ -0,0 +1,183 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe Sso::Session, :type => :model do
|
4
|
+
describe "associations" do
|
5
|
+
it { is_expected.to belong_to(:application).class_name('Doorkeeper::Application') }
|
6
|
+
it { is_expected.to belong_to(:access_grant).class_name('Doorkeeper::AccessGrant') }
|
7
|
+
it { is_expected.to belong_to(:access_token).class_name('Doorkeeper::AccessToken') }
|
8
|
+
it { is_expected.to belong_to(:owner).class_name('User') }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "validations" do
|
12
|
+
pending { is_expected.to validate_presence_of(:group_id) }
|
13
|
+
pending { is_expected.to validate_presence_of(:secret) }
|
14
|
+
pending { is_expected.to validate_uniqueness_of(:access_token_id).scoped_to([:owner_id, :revoked_at, :application_id]) }
|
15
|
+
it { is_expected.to allow_value(nil).for(:access_token_id) }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "scopes" do
|
19
|
+
let(:session) { Fabricate('Sso::Session', revoked_at: nil, application_id: nil) }
|
20
|
+
it { expect(Sso::Session.active).to eq [session] }
|
21
|
+
it { expect(Sso::Session.master).to eq [session] }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "::master_for" do
|
25
|
+
let(:user) { Fabricate(:user) }
|
26
|
+
let(:access_token) { Fabricate('Doorkeeper::AccessToken',
|
27
|
+
resource_owner_id: user.id) }
|
28
|
+
let(:access_grant) { Fabricate('Doorkeeper::AccessGrant',
|
29
|
+
application_id: nil,
|
30
|
+
resource_owner_id: user.id,
|
31
|
+
redirect_uri: 'http://localhost:3002/oauth/callback'
|
32
|
+
) }
|
33
|
+
|
34
|
+
let(:session) { Fabricate('Sso::Session',
|
35
|
+
revoked_at: nil,
|
36
|
+
application_id: nil,
|
37
|
+
access_token_id: access_token.id,
|
38
|
+
access_grant_id: access_grant.id,
|
39
|
+
owner: user) }
|
40
|
+
|
41
|
+
it do
|
42
|
+
expect(session.revoked_at).to be_nil
|
43
|
+
expect(session.application_id).to be_nil
|
44
|
+
expect(Sso::Session.master_for(access_grant.id)).to eq session
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "::generate_master" do
|
49
|
+
let(:user) { Fabricate(:user) }
|
50
|
+
let(:attributes) { { ip: "10.1.1.1", agent: "Safari" } }
|
51
|
+
|
52
|
+
context "without access token" do
|
53
|
+
it "creates a new session" do
|
54
|
+
session = Sso::Session.generate_master(user, attributes)
|
55
|
+
expect(session).to eq(Sso::Session.first)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "(failure)" do
|
60
|
+
it "raises exception" do
|
61
|
+
expect { Sso::Session.generate_master(nil) }.to raise_exception
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "::generate" do
|
67
|
+
let(:master_sso_session) { Sso::Session.generate_master(user, attributes) }
|
68
|
+
let(:user) { Fabricate(:user) }
|
69
|
+
let(:attributes) { { ip: "10.1.1.1", agent: "Safari" } }
|
70
|
+
let(:access_token) { Fabricate("Doorkeeper::AccessToken", resource_owner_id: user.id) }
|
71
|
+
let(:access_grant) { Fabricate('Doorkeeper::AccessGrant',
|
72
|
+
application_id: nil,
|
73
|
+
resource_owner_id: user.id,
|
74
|
+
redirect_uri: 'http://localhost:3002/oauth/callback'
|
75
|
+
) }
|
76
|
+
let(:session) { Sso::Session.generate(user, access_token, attributes) }
|
77
|
+
before do
|
78
|
+
# Notice: We assume our warden/doorkeeper is ok and a master with access grant/token is generated
|
79
|
+
master_sso_session.access_token_id = access_token.id
|
80
|
+
master_sso_session.access_grant_id = access_grant.id
|
81
|
+
master_sso_session.save
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "creates a new session" do
|
85
|
+
it { expect(session.access_token_id).to eq access_token.id }
|
86
|
+
it { expect(session.application_id).to eq access_token.application.id }
|
87
|
+
it { expect(session.group_id).to eq master_sso_session.group_id }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "::logout" do
|
92
|
+
let!(:sso_session) { Fabricate('Sso::Session') }
|
93
|
+
let!(:user) { sso_session.owner }
|
94
|
+
|
95
|
+
it "revokes session" do
|
96
|
+
Sso::Session.logout(sso_session.id)
|
97
|
+
new_session = Sso::Session.find(sso_session.id)
|
98
|
+
expect(new_session.revoked_at).not_to be_blank
|
99
|
+
expect(new_session.revoke_reason).to eq("logout")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "::update_master_with_grant" do
|
104
|
+
let(:user) { Fabricate(:user) }
|
105
|
+
let(:attributes) { { ip: "10.1.1.1", agent: "Safari" } }
|
106
|
+
let(:access_token) { Fabricate("Doorkeeper::AccessToken", resource_owner_id: user.id) }
|
107
|
+
let(:access_grant) { Fabricate('Doorkeeper::AccessGrant',
|
108
|
+
application_id: nil,
|
109
|
+
resource_owner_id: user.id,
|
110
|
+
redirect_uri: 'http://localhost:3002/oauth/callback'
|
111
|
+
) }
|
112
|
+
let!(:master_sso_session) { Sso::Session.generate_master(user, attributes) }
|
113
|
+
|
114
|
+
context "successful" do
|
115
|
+
it "updates master_sso_session.access_grant_id" do
|
116
|
+
expect{ Sso::Session.update_master_with_grant(master_sso_session.id, access_grant) }.to change{ master_sso_session.reload.access_grant_id }.from(nil).to(access_grant.id)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "::update_master_with_access_token" do
|
122
|
+
let(:user) { Fabricate(:user) }
|
123
|
+
let(:attributes) { { ip: "10.1.1.1", agent: "Safari" } }
|
124
|
+
let(:access_token) { Fabricate("Doorkeeper::AccessToken", resource_owner_id: user.id) }
|
125
|
+
let(:access_grant) { Fabricate('Doorkeeper::AccessGrant',
|
126
|
+
application_id: nil,
|
127
|
+
resource_owner_id: user.id,
|
128
|
+
redirect_uri: 'http://localhost:3002/oauth/callback'
|
129
|
+
) }
|
130
|
+
let!(:master) { Sso::Session.generate_master(user, attributes) }
|
131
|
+
|
132
|
+
before do
|
133
|
+
# Notice: We assume our warden/doorkeeper is ok and a master with grant is generated
|
134
|
+
master.access_grant_id = access_grant.id
|
135
|
+
master.save
|
136
|
+
end
|
137
|
+
|
138
|
+
context "oauth_token not available" do
|
139
|
+
it "returns false" do
|
140
|
+
expect( Sso::Session.update_master_with_access_token(access_token.token, 123)).to be_falsey
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
it "updates master.access_token_it" do
|
145
|
+
expect{ Sso::Session.update_master_with_access_token(access_grant.token, access_token.token) }.to change{ master.reload.access_token_id }.from(nil).to(access_token.id)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
# == Schema Information
|
152
|
+
# Schema version: 20150330031153
|
153
|
+
#
|
154
|
+
# Table name: sso_sessions
|
155
|
+
#
|
156
|
+
# id :uuid not null, primary key
|
157
|
+
# access_grant_id :integer
|
158
|
+
# access_token_id :integer
|
159
|
+
# application_id :integer
|
160
|
+
# owner_id :integer not null
|
161
|
+
# group_id :string not null
|
162
|
+
# secret :string not null
|
163
|
+
# ip :inet not null
|
164
|
+
# agent :string
|
165
|
+
# location :string
|
166
|
+
# activity_at :datetime not null
|
167
|
+
# revoked_at :datetime
|
168
|
+
# revoke_reason :string
|
169
|
+
# created_at :datetime not null
|
170
|
+
# updated_at :datetime not null
|
171
|
+
#
|
172
|
+
# Indexes
|
173
|
+
#
|
174
|
+
# index_sso_sessions_on_access_grant_id (access_grant_id)
|
175
|
+
# index_sso_sessions_on_access_token_id (access_token_id)
|
176
|
+
# index_sso_sessions_on_application_id (application_id)
|
177
|
+
# index_sso_sessions_on_group_id (group_id)
|
178
|
+
# index_sso_sessions_on_ip (ip)
|
179
|
+
# index_sso_sessions_on_owner_id (owner_id)
|
180
|
+
# index_sso_sessions_on_revoke_reason (revoke_reason)
|
181
|
+
# index_sso_sessions_on_secret (secret)
|
182
|
+
# one_access_token_per_owner (owner_id,access_token_id,application_id) UNIQUE
|
183
|
+
#
|
data/spec/rails_helper.rb
CHANGED
@@ -3,13 +3,25 @@ ENV["RAILS_ENV"] ||= 'test'
|
|
3
3
|
|
4
4
|
# SimpleCov for rails
|
5
5
|
require 'simplecov'
|
6
|
-
SimpleCov.start 'rails'
|
7
|
-
|
8
|
-
end
|
6
|
+
SimpleCov.start 'rails'
|
7
|
+
|
9
8
|
require 'spec_helper'
|
10
|
-
require File.expand_path("
|
9
|
+
# require File.expand_path("../test_app/config/environment", __FILE__)
|
10
|
+
|
11
|
+
# Combustion ordering for requires
|
12
|
+
require 'combustion'
|
13
|
+
# require 'capybara/rspec'
|
14
|
+
|
15
|
+
Combustion.path = 'spec/test_app'
|
16
|
+
Combustion.initialize! :all
|
17
|
+
|
18
|
+
|
11
19
|
require 'rspec/rails'
|
20
|
+
# require 'capybara/rails'
|
12
21
|
require 'shoulda/matchers'
|
22
|
+
require 'fabrication'
|
23
|
+
require 'vcr'
|
24
|
+
|
13
25
|
# Add additional requires below this line. Rails is not loaded until this point!
|
14
26
|
|
15
27
|
# Requires supporting ruby files with custom matchers and macros, etc, in
|
@@ -25,7 +37,10 @@ require 'shoulda/matchers'
|
|
25
37
|
# directory. Alternatively, in the individual `*_spec.rb` files, manually
|
26
38
|
# require only the support files necessary.
|
27
39
|
#
|
28
|
-
Dir[Rails.root.join("
|
40
|
+
Dir[Rails.root.join("../support/**/*.rb")].each { |f| require f }
|
41
|
+
|
42
|
+
# Require fabricators manually
|
43
|
+
Dir[Rails.root.join("../fabricators/**/*fabricator.rb")].each { |f| require f }
|
29
44
|
|
30
45
|
# Checks for pending migrations before tests are run.
|
31
46
|
# If you are not using ActiveRecord, you can remove this line.
|
@@ -33,7 +48,7 @@ ActiveRecord::Migration.maintain_test_schema!
|
|
33
48
|
|
34
49
|
RSpec.configure do |config|
|
35
50
|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
36
|
-
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
51
|
+
# config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
37
52
|
|
38
53
|
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
39
54
|
# examples within a transaction, remove the following line or assign false
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ControllerHelpers
|
2
|
+
def sign_in(user = Fabricate(:user))
|
3
|
+
if user.nil?
|
4
|
+
allow(request.env['warden']).to receive(:authenticate!).
|
5
|
+
and_throw(:warden, {:scope => :user})
|
6
|
+
allow(controller).to receive_messages :current_user => nil
|
7
|
+
else
|
8
|
+
allow(request.env['warden']).to receive_messages :authenticate! => user
|
9
|
+
allow(controller).to receive_messages :current_user => user
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.include Devise::TestHelpers, :type => :controller
|
16
|
+
config.include ControllerHelpers, :type => :controller
|
17
|
+
|
18
|
+
# rspec-rails 3 will no longer automatically infer an example group's spec type
|
19
|
+
# from the file location. You can explicitly opt-in to the feature using this
|
20
|
+
# config option.
|
21
|
+
# To explicitly tag specs without using automatic inference, set the `:type`
|
22
|
+
# metadata manually:
|
23
|
+
#
|
24
|
+
# describe ThingsController, :type => :controller do
|
25
|
+
# # Equivalent to being in spec/controllers
|
26
|
+
# end
|
27
|
+
config.infer_spec_type_from_file_location!
|
28
|
+
end
|
data/spec/test_app/Rakefile
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
class User < ActiveRecord::Base
|
2
|
+
|
3
|
+
# Include default devise modules. Others available are:
|
4
|
+
# :confirmable, :lockable, :timeoutable and :omniauthable
|
5
|
+
devise :database_authenticatable, :registerable,
|
6
|
+
:recoverable, :rememberable, :trackable, :validatable
|
7
|
+
|
8
|
+
validates :email, :first_name, presence: true
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
# == Schema Information
|
13
|
+
# Schema version: 20150320075507
|
14
|
+
#
|
15
|
+
# Table name: users
|
16
|
+
#
|
17
|
+
# id :integer not null, primary key
|
18
|
+
# email :string default(""), not null
|
19
|
+
# encrypted_password :string default(""), not null
|
20
|
+
# reset_password_token :string
|
21
|
+
# reset_password_sent_at :datetime
|
22
|
+
# remember_created_at :datetime
|
23
|
+
# sign_in_count :integer default("0"), not null
|
24
|
+
# current_sign_in_at :datetime
|
25
|
+
# last_sign_in_at :datetime
|
26
|
+
# current_sign_in_ip :inet
|
27
|
+
# last_sign_in_ip :inet
|
28
|
+
# created_at :datetime
|
29
|
+
# updated_at :datetime
|
30
|
+
# first_name :string
|
31
|
+
# last_name :string
|
32
|
+
# lang :string default("EN")
|
33
|
+
# phone :string
|
34
|
+
#
|
35
|
+
# Indexes
|
36
|
+
#
|
37
|
+
# index_users_on_email (email) UNIQUE
|
38
|
+
# index_users_on_reset_password_token (reset_password_token) UNIQUE
|
39
|
+
#
|
@@ -1,25 +1,10 @@
|
|
1
|
-
# SQLite version 3.x
|
2
|
-
# gem install sqlite3
|
3
|
-
#
|
4
|
-
# Ensure the SQLite 3 gem is defined in your Gemfile
|
5
|
-
# gem 'sqlite3'
|
6
|
-
#
|
7
1
|
default: &default
|
8
|
-
adapter:
|
2
|
+
adapter: postgresql
|
3
|
+
encoding: unicode
|
4
|
+
# For details on connection pooling, see rails configuration guide
|
5
|
+
# http://guides.rubyonrails.org/configuring.html#database-pooling
|
9
6
|
pool: 5
|
10
|
-
timeout: 5000
|
11
7
|
|
12
|
-
development:
|
13
|
-
<<: *default
|
14
|
-
database: db/development.sqlite3
|
15
|
-
|
16
|
-
# Warning: The database defined as "test" will be erased and
|
17
|
-
# re-generated from your development database when you run "rake".
|
18
|
-
# Do not set this db to the same as development or production.
|
19
8
|
test:
|
20
9
|
<<: *default
|
21
|
-
database:
|
22
|
-
|
23
|
-
production:
|
24
|
-
<<: *default
|
25
|
-
database: db/production.sqlite3
|
10
|
+
database: doorkeeper_sso_test
|