sorcery 0.8.6 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sorcery might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.travis.yml +75 -14
- data/CHANGELOG.md +23 -1
- data/Gemfile +1 -0
- data/README.md +137 -86
- data/gemfiles/active_record-rails40.gemfile +7 -0
- data/gemfiles/active_record-rails41.gemfile +3 -2
- data/gemfiles/mongo_mapper-rails40.gemfile +9 -0
- data/gemfiles/mongo_mapper-rails41.gemfile +2 -1
- data/gemfiles/mongoid-rails40.gemfile +9 -0
- data/gemfiles/mongoid-rails41.gemfile +3 -5
- data/gemfiles/mongoid3-rails32.gemfile +9 -0
- data/lib/generators/sorcery/USAGE +1 -1
- data/lib/generators/sorcery/install_generator.rb +19 -5
- data/lib/generators/sorcery/templates/initializer.rb +34 -9
- data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +3 -1
- data/lib/generators/sorcery/templates/migration/core.rb +2 -2
- data/lib/generators/sorcery/templates/migration/external.rb +3 -1
- data/lib/sorcery.rb +75 -43
- data/lib/sorcery/adapters/active_record_adapter.rb +120 -0
- data/lib/sorcery/adapters/base_adapter.rb +30 -0
- data/lib/sorcery/adapters/data_mapper_adapter.rb +176 -0
- data/lib/sorcery/adapters/mongo_mapper_adapter.rb +110 -0
- data/lib/sorcery/adapters/mongoid_adapter.rb +97 -0
- data/lib/sorcery/controller.rb +5 -64
- data/lib/sorcery/controller/config.rb +65 -0
- data/lib/sorcery/controller/submodules/activity_logging.rb +16 -21
- data/lib/sorcery/controller/submodules/brute_force_protection.rb +6 -6
- data/lib/sorcery/controller/submodules/external.rb +8 -28
- data/lib/sorcery/controller/submodules/remember_me.rb +4 -4
- data/lib/sorcery/controller/submodules/session_timeout.rb +10 -6
- data/lib/sorcery/model.rb +43 -175
- data/lib/sorcery/model/config.rb +96 -0
- data/lib/sorcery/model/submodules/activity_logging.rb +29 -36
- data/lib/sorcery/model/submodules/brute_force_protection.rb +21 -37
- data/lib/sorcery/model/submodules/external.rb +53 -9
- data/lib/sorcery/model/submodules/remember_me.rb +12 -31
- data/lib/sorcery/model/submodules/reset_password.rb +21 -39
- data/lib/sorcery/model/submodules/user_activation.rb +21 -63
- data/lib/sorcery/model/temporary_token.rb +4 -4
- data/lib/sorcery/providers/base.rb +11 -0
- data/lib/sorcery/providers/facebook.rb +1 -1
- data/lib/sorcery/providers/github.rb +1 -1
- data/lib/sorcery/providers/google.rb +1 -1
- data/lib/sorcery/providers/heroku.rb +57 -0
- data/lib/sorcery/providers/jira.rb +77 -0
- data/lib/sorcery/providers/linkedin.rb +1 -1
- data/lib/sorcery/providers/liveid.rb +1 -1
- data/lib/sorcery/providers/salesforce.rb +50 -0
- data/lib/sorcery/providers/twitter.rb +1 -1
- data/lib/sorcery/providers/vk.rb +6 -4
- data/lib/sorcery/providers/xing.rb +1 -1
- data/lib/sorcery/test_helpers/internal.rb +7 -3
- data/lib/sorcery/test_helpers/rails/controller.rb +5 -1
- data/lib/sorcery/version.rb +3 -0
- data/sorcery.gemspec +6 -2
- data/spec/active_record/user_activity_logging_spec.rb +9 -0
- data/spec/controllers/controller_activity_logging_spec.rb +124 -0
- data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
- data/spec/{active_record → controllers}/controller_http_basic_auth_spec.rb +14 -11
- data/spec/{active_record → controllers}/controller_oauth2_spec.rb +128 -56
- data/spec/{active_record → controllers}/controller_oauth_spec.rb +94 -70
- data/spec/{active_record → controllers}/controller_remember_me_spec.rb +32 -12
- data/spec/{active_record → controllers}/controller_session_timeout_spec.rb +15 -5
- data/spec/{shared_examples/controller_shared_examples.rb → controllers/controller_spec.rb} +34 -19
- data/spec/{datamapper → data_mapper}/user_activation_spec.rb +1 -1
- data/spec/data_mapper/user_activity_logging_spec.rb +14 -0
- data/spec/{datamapper → data_mapper}/user_brute_force_protection_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_oauth_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_remember_me_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_reset_password_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_spec.rb +1 -1
- data/spec/mongoid/user_spec.rb +13 -0
- data/spec/orm/active_record.rb +12 -0
- data/spec/orm/{datamapper.rb → data_mapper.rb} +16 -2
- data/spec/orm/mongo_mapper.rb +0 -1
- data/spec/orm/mongoid.rb +4 -0
- data/spec/rails_app/app/controllers/sorcery_controller.rb +62 -1
- data/spec/rails_app/app/{datamapper → data_mapper}/authentication.rb +0 -0
- data/spec/rails_app/app/{datamapper → data_mapper}/user.rb +0 -0
- data/spec/rails_app/app/mongo_mapper/user.rb +2 -0
- data/spec/rails_app/config/routes.rb +9 -0
- data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +2 -2
- data/spec/shared_examples/user_activation_shared_examples.rb +7 -7
- data/spec/shared_examples/user_activity_logging_shared_examples.rb +73 -5
- data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +127 -9
- data/spec/shared_examples/user_oauth_shared_examples.rb +3 -6
- data/spec/shared_examples/user_remember_me_shared_examples.rb +6 -3
- data/spec/shared_examples/user_reset_password_shared_examples.rb +10 -10
- data/spec/shared_examples/user_shared_examples.rb +117 -30
- data/spec/spec_helper.rb +7 -22
- metadata +36 -58
- data/Gemfile.rails4 +0 -22
- data/VERSION +0 -1
- data/lib/sorcery/model/adapters/active_record.rb +0 -54
- data/lib/sorcery/model/adapters/datamapper.rb +0 -123
- data/lib/sorcery/model/adapters/mongo_mapper.rb +0 -60
- data/lib/sorcery/model/adapters/mongoid.rb +0 -88
- data/lib/sorcery/test_helpers/rails.rb +0 -7
- data/spec/active_record/controller_activity_logging_spec.rb +0 -29
- data/spec/active_record/controller_brute_force_protection_spec.rb +0 -158
- data/spec/active_record/controller_spec.rb +0 -8
- data/spec/active_record/integration_spec.rb +0 -23
- data/spec/datamapper/controller_activity_logging_spec.rb +0 -17
- data/spec/datamapper/controller_spec.rb +0 -8
- data/spec/datamapper/user_activity_logging_spec.rb +0 -9
- data/spec/mongo_mapper/controller_spec.rb +0 -8
- data/spec/mongoid/controller_activity_logging_spec.rb +0 -16
- data/spec/mongoid/controller_spec.rb +0 -8
- data/spec/rails_app/public/404.html +0 -26
- data/spec/rails_app/public/422.html +0 -26
- data/spec/rails_app/public/500.html +0 -26
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/public/images/rails.png +0 -0
- data/spec/rails_app/public/javascripts/application.js +0 -2
- data/spec/rails_app/public/javascripts/controls.js +0 -965
- data/spec/rails_app/public/javascripts/dragdrop.js +0 -974
- data/spec/rails_app/public/javascripts/effects.js +0 -1123
- data/spec/rails_app/public/javascripts/prototype.js +0 -6001
- data/spec/rails_app/public/javascripts/rails.js +0 -175
- data/spec/rails_app/public/robots.txt +0 -5
- data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
- data/spec/shared_examples/controller_activity_logging_shared_examples.rb +0 -125
- data/spec/shared_examples/controller_oauth2_shared_examples.rb +0 -52
- data/spec/shared_examples/controller_oauth_shared_examples.rb +0 -62
@@ -2,10 +2,8 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'rails', '~> 4.1.0'
|
4
4
|
|
5
|
-
gem '
|
6
|
-
|
7
|
-
gem '
|
8
|
-
gem 'bson_ext'
|
9
|
-
gem 'sqlite3'
|
5
|
+
gem 'mongoid', '~> 4.0.0'
|
6
|
+
gem 'sqlite3', platform: :mri
|
7
|
+
gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
|
10
8
|
|
11
9
|
gemspec path: '..'
|
@@ -16,7 +16,7 @@ Examples:
|
|
16
16
|
This will generate the core migration file, the initializer and change the model class
|
17
17
|
(in the initializer and migration files) to the class 'Person' (and it's pluralized version, 'people')
|
18
18
|
|
19
|
-
rails generate sorcery:install http_basic_auth external remember_me --
|
19
|
+
rails generate sorcery:install http_basic_auth external remember_me --only-submodules
|
20
20
|
|
21
21
|
This will generate only the migration files for the specified submodules and will
|
22
22
|
add them to the initializer file.
|
@@ -15,12 +15,21 @@ module Sorcery
|
|
15
15
|
:desc => "Specify the model class name if you will use anything other than 'User'"
|
16
16
|
|
17
17
|
class_option :migrations, :optional => true, :type => :boolean, :banner => "migrations",
|
18
|
+
:desc => "[DEPRECATED] Please use --only-submodules option instead"
|
19
|
+
|
20
|
+
class_option :only_submodules, :optional => true, :type => :boolean, :banner => "only-submodules",
|
18
21
|
:desc => "Specify if you want to add submodules to an existing model\n\t\t\t # (will generate migrations files, and add submodules to config file)"
|
19
22
|
|
20
23
|
|
24
|
+
def check_deprecated_options
|
25
|
+
if options[:migrations]
|
26
|
+
warn("[DEPRECATED] `--migrations` option is deprecated, please use `--only-submodules` instead")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
21
30
|
# Copy the initializer file to config/initializers folder.
|
22
31
|
def copy_initializer_file
|
23
|
-
template "initializer.rb", sorcery_config_path unless
|
32
|
+
template "initializer.rb", sorcery_config_path unless only_submodules?
|
24
33
|
end
|
25
34
|
|
26
35
|
def configure_initializer_file
|
@@ -36,8 +45,8 @@ module Sorcery
|
|
36
45
|
end
|
37
46
|
|
38
47
|
def configure_model
|
39
|
-
# Generate the model and add 'authenticates_with_sorcery!' unless you passed --
|
40
|
-
unless
|
48
|
+
# Generate the model and add 'authenticates_with_sorcery!' unless you passed --only-submodules
|
49
|
+
unless only_submodules?
|
41
50
|
generate "model #{model_class_name} --skip-migration"
|
42
51
|
|
43
52
|
inject_sorcery_to_model
|
@@ -52,9 +61,9 @@ module Sorcery
|
|
52
61
|
|
53
62
|
# Copy the migrations files to db/migrate folder
|
54
63
|
def copy_migration_files
|
55
|
-
# Copy core migration file in all cases except when you pass --
|
64
|
+
# Copy core migration file in all cases except when you pass --only-submodules.
|
56
65
|
return unless defined?(Sorcery::Generators::InstallGenerator::ActiveRecord)
|
57
|
-
migration_template "migration/core.rb", "db/migrate/sorcery_core.rb" unless
|
66
|
+
migration_template "migration/core.rb", "db/migrate/sorcery_core.rb" unless only_submodules?
|
58
67
|
|
59
68
|
if submodules
|
60
69
|
submodules.each do |submodule|
|
@@ -76,6 +85,11 @@ module Sorcery
|
|
76
85
|
end
|
77
86
|
end
|
78
87
|
|
88
|
+
private
|
89
|
+
def only_submodules?
|
90
|
+
options[:migrations] || options[:only_submodules]
|
91
|
+
end
|
92
|
+
|
79
93
|
end
|
80
94
|
end
|
81
95
|
end
|
@@ -27,6 +27,12 @@ Rails.application.config.sorcery.configure do |config|
|
|
27
27
|
# config.cookie_domain =
|
28
28
|
|
29
29
|
|
30
|
+
# Allow the remember_me cookie to be set through AJAX
|
31
|
+
# Default: `true`
|
32
|
+
#
|
33
|
+
# config.remember_me_httponly =
|
34
|
+
|
35
|
+
|
30
36
|
# -- session timeout --
|
31
37
|
# How long in seconds to keep the session alive.
|
32
38
|
# Default: `3600`
|
@@ -67,7 +73,7 @@ Rails.application.config.sorcery.configure do |config|
|
|
67
73
|
|
68
74
|
|
69
75
|
# -- external --
|
70
|
-
# What providers are supported by this app, i.e. [:twitter, :facebook, :github, :linkedin, :xing, :google, :liveid] .
|
76
|
+
# What providers are supported by this app, i.e. [:twitter, :facebook, :github, :linkedin, :xing, :google, :liveid, :salesforce] .
|
71
77
|
# Default: `[]`
|
72
78
|
#
|
73
79
|
# config.external_providers =
|
@@ -101,7 +107,7 @@ Rails.application.config.sorcery.configure do |config|
|
|
101
107
|
# config.xing.user_info_mapping = {first_name: "first_name", last_name: "last_name"}
|
102
108
|
#
|
103
109
|
#
|
104
|
-
# Twitter
|
110
|
+
# Twitter will not accept any requests nor redirect uri containing localhost,
|
105
111
|
# make sure you use 0.0.0.0:3000 to access your app in development
|
106
112
|
#
|
107
113
|
# config.twitter.key = ""
|
@@ -114,6 +120,7 @@ Rails.application.config.sorcery.configure do |config|
|
|
114
120
|
# config.facebook.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=facebook"
|
115
121
|
# config.facebook.user_info_mapping = {:email => "name"}
|
116
122
|
# config.facebook.access_permissions = ["email", "publish_stream"]
|
123
|
+
# config.facebook.display = "page"
|
117
124
|
#
|
118
125
|
# config.github.key = ""
|
119
126
|
# config.github.secret = ""
|
@@ -139,6 +146,29 @@ Rails.application.config.sorcery.configure do |config|
|
|
139
146
|
# config.liveid.callback_url = "http://mydomain.com:3000/oauth/callback?provider=liveid"
|
140
147
|
# config.liveid.user_info_mapping = {:username => "name"}
|
141
148
|
|
149
|
+
# For information about JIRA API:
|
150
|
+
# https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+OAuth+authentication
|
151
|
+
# to obtain the consumer key and the public key you can use the jira-ruby gem https://github.com/sumoheavy/jira-ruby
|
152
|
+
# or run openssl req -x509 -nodes -newkey rsa:1024 -sha1 -keyout rsakey.pem -out rsacert.pem to obtain the public key
|
153
|
+
# Make sure you have configured the application link properly
|
154
|
+
|
155
|
+
# config.jira.key = "1234567"
|
156
|
+
# config.jira.secret = "jiraTest"
|
157
|
+
# config.jira.site = "http://localhost:2990/jira/plugins/servlet/oauth"
|
158
|
+
# config.jira.signature_method = "RSA-SHA1"
|
159
|
+
# config.jira.private_key_file = "rsakey.pem"
|
160
|
+
|
161
|
+
# For information about Salesforce API:
|
162
|
+
# https://developer.salesforce.com/signup &
|
163
|
+
# https://www.salesforce.com/us/developer/docs/api_rest/
|
164
|
+
# Salesforce callback_url must be https. You can run the following to generate self-signed ssl cert
|
165
|
+
# openssl req -new -newkey rsa:2048 -sha1 -days 365 -nodes -x509 -keyout server.key -out server.crt
|
166
|
+
# Make sure you have configured the application link properly
|
167
|
+
# config.salesforce.key = '123123'
|
168
|
+
# config.salesforce.secret = 'acb123'
|
169
|
+
# config.salesforce.callback_url = "https://127.0.0.1:9292/oauth/callback?provider=salesforce"
|
170
|
+
# config.salesforce.scope = "full"
|
171
|
+
# config.salesforce.user_info_mapping = {:email => "email"}
|
142
172
|
|
143
173
|
# --- user config ---
|
144
174
|
config.user_config do |user|
|
@@ -217,11 +247,6 @@ Rails.application.config.sorcery.configure do |config|
|
|
217
247
|
|
218
248
|
|
219
249
|
# -- remember_me --
|
220
|
-
# allow the remember_me cookie to settable through AJAX
|
221
|
-
# Default: `true`
|
222
|
-
#
|
223
|
-
# user.remember_me_httponly =
|
224
|
-
|
225
250
|
# How long in seconds the session length will be
|
226
251
|
# Default: `604800`
|
227
252
|
#
|
@@ -330,7 +355,7 @@ Rails.application.config.sorcery.configure do |config|
|
|
330
355
|
# user.reset_password_expiration_period =
|
331
356
|
|
332
357
|
|
333
|
-
# hammering protection, how long to wait before allowing another email to be sent.
|
358
|
+
# hammering protection, how long in seconds to wait before allowing another email to be sent.
|
334
359
|
# Default: `5 * 60`
|
335
360
|
#
|
336
361
|
# user.reset_password_time_between_emails =
|
@@ -400,7 +425,7 @@ Rails.application.config.sorcery.configure do |config|
|
|
400
425
|
# user.last_activity_at_attribute_name =
|
401
426
|
|
402
427
|
|
403
|
-
# How long since last activity is
|
428
|
+
# How long since last activity is the user defined logged out?
|
404
429
|
# Default: `10 * 60`
|
405
430
|
#
|
406
431
|
# user.activity_timeout =
|
@@ -3,5 +3,7 @@ class SorceryBruteForceProtection < ActiveRecord::Migration
|
|
3
3
|
add_column :<%= model_class_name.tableize %>, :failed_logins_count, :integer, :default => 0
|
4
4
|
add_column :<%= model_class_name.tableize %>, :lock_expires_at, :datetime, :default => nil
|
5
5
|
add_column :<%= model_class_name.tableize %>, :unlock_token, :string, :default => nil
|
6
|
+
|
7
|
+
add_index :<%= model_class_name.tableize %>, :unlock_token
|
6
8
|
end
|
7
|
-
end
|
9
|
+
end
|
@@ -2,8 +2,8 @@ class SorceryCore < ActiveRecord::Migration
|
|
2
2
|
def change
|
3
3
|
create_table :<%= model_class_name.tableize %> do |t|
|
4
4
|
t.string :email, :null => false
|
5
|
-
t.string :crypted_password
|
6
|
-
t.string :salt
|
5
|
+
t.string :crypted_password
|
6
|
+
t.string :salt
|
7
7
|
|
8
8
|
t.timestamps
|
9
9
|
end
|
data/lib/sorcery.rb
CHANGED
@@ -1,78 +1,110 @@
|
|
1
|
+
require 'sorcery/version'
|
2
|
+
|
1
3
|
module Sorcery
|
2
|
-
|
4
|
+
|
5
|
+
require 'sorcery/model'
|
6
|
+
|
7
|
+
module Adapters
|
8
|
+
require 'sorcery/adapters/base_adapter'
|
9
|
+
end
|
10
|
+
|
3
11
|
module Model
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
autoload :MongoMapper, 'sorcery/model/adapters/mongo_mapper'
|
9
|
-
autoload :DataMapper, 'sorcery/model/adapters/datamapper'
|
10
|
-
end
|
12
|
+
require 'sorcery/model/temporary_token'
|
13
|
+
require 'sorcery/model/config'
|
14
|
+
|
15
|
+
|
11
16
|
module Submodules
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
require 'sorcery/model/submodules/user_activation'
|
18
|
+
require 'sorcery/model/submodules/reset_password'
|
19
|
+
require 'sorcery/model/submodules/remember_me'
|
20
|
+
require 'sorcery/model/submodules/activity_logging'
|
21
|
+
require 'sorcery/model/submodules/brute_force_protection'
|
22
|
+
require 'sorcery/model/submodules/external'
|
18
23
|
end
|
19
24
|
end
|
20
|
-
|
25
|
+
|
26
|
+
require 'sorcery/controller'
|
27
|
+
|
21
28
|
module Controller
|
29
|
+
autoload :Config, 'sorcery/controller/config'
|
22
30
|
module Submodules
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
31
|
+
require 'sorcery/controller/submodules/remember_me'
|
32
|
+
require 'sorcery/controller/submodules/session_timeout'
|
33
|
+
require 'sorcery/controller/submodules/brute_force_protection'
|
34
|
+
require 'sorcery/controller/submodules/http_basic_auth'
|
35
|
+
require 'sorcery/controller/submodules/activity_logging'
|
36
|
+
require 'sorcery/controller/submodules/external'
|
29
37
|
end
|
30
38
|
end
|
39
|
+
|
31
40
|
module Protocols
|
32
|
-
|
33
|
-
|
41
|
+
require 'sorcery/protocols/oauth'
|
42
|
+
require 'sorcery/protocols/oauth2'
|
34
43
|
end
|
44
|
+
|
35
45
|
module CryptoProviders
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
46
|
+
require 'sorcery/crypto_providers/common'
|
47
|
+
require 'sorcery/crypto_providers/aes256'
|
48
|
+
require 'sorcery/crypto_providers/bcrypt'
|
49
|
+
require 'sorcery/crypto_providers/md5'
|
50
|
+
require 'sorcery/crypto_providers/sha1'
|
51
|
+
require 'sorcery/crypto_providers/sha256'
|
52
|
+
require 'sorcery/crypto_providers/sha512'
|
43
53
|
end
|
54
|
+
|
44
55
|
module TestHelpers
|
45
|
-
|
46
|
-
|
47
|
-
autoload :Rails, 'sorcery/test_helpers/internal/rails'
|
48
|
-
end
|
49
|
-
autoload :Rails, 'sorcery/test_helpers/rails'
|
56
|
+
require 'sorcery/test_helpers/internal'
|
57
|
+
|
50
58
|
module Rails
|
51
|
-
|
52
|
-
|
59
|
+
require 'sorcery/test_helpers/rails/controller'
|
60
|
+
require 'sorcery/test_helpers/rails/integration'
|
61
|
+
end
|
62
|
+
|
63
|
+
module Internal
|
64
|
+
require 'sorcery/test_helpers/internal/rails'
|
53
65
|
end
|
54
66
|
|
55
67
|
end
|
56
68
|
|
69
|
+
require 'sorcery/adapters/base_adapter'
|
70
|
+
|
57
71
|
if defined?(ActiveRecord)
|
72
|
+
require 'sorcery/adapters/active_record_adapter'
|
58
73
|
ActiveRecord::Base.extend Sorcery::Model
|
59
|
-
|
74
|
+
|
75
|
+
ActiveRecord::Base.send :define_method, :sorcery_adapter do
|
76
|
+
@sorcery_adapter ||= Sorcery::Adapters::ActiveRecordAdapter.new(self)
|
77
|
+
end
|
78
|
+
|
79
|
+
ActiveRecord::Base.send :define_singleton_method, :sorcery_adapter do
|
80
|
+
Sorcery::Adapters::ActiveRecordAdapter.from(self)
|
81
|
+
end
|
60
82
|
end
|
61
83
|
|
62
84
|
if defined?(Mongoid)
|
85
|
+
require 'sorcery/adapters/mongoid_adapter'
|
63
86
|
Mongoid::Document::ClassMethods.send :include, Sorcery::Model
|
64
|
-
|
65
|
-
Mongoid::Document.send :
|
87
|
+
|
88
|
+
Mongoid::Document.send :define_method, :sorcery_adapter do
|
89
|
+
@sorcery_adapter ||= Sorcery::Adapters::MongoidAdapter.new(self)
|
90
|
+
end
|
91
|
+
|
92
|
+
Mongoid::Document::ClassMethods.send :define_method, :sorcery_adapter do
|
93
|
+
Sorcery::Adapters::MongoidAdapter.from(self)
|
94
|
+
end
|
66
95
|
end
|
67
96
|
|
68
97
|
if defined?(MongoMapper)
|
69
|
-
|
98
|
+
require 'sorcery/adapters/mongo_mapper_adapter'
|
99
|
+
MongoMapper::Document.send(:plugin, Sorcery::Adapters::MongoMapperAdapter::Wrapper)
|
70
100
|
end
|
71
101
|
|
72
102
|
if defined?(DataMapper)
|
103
|
+
require 'sorcery/adapters/data_mapper_adapter'
|
73
104
|
DataMapper::Model.append_extensions(Sorcery::Model)
|
74
|
-
|
105
|
+
|
106
|
+
DataMapper::Model.append_inclusions(Sorcery::Adapters::DataMapperAdapter::Wrapper)
|
75
107
|
end
|
76
108
|
|
77
|
-
require 'sorcery/engine' if defined?(Rails)
|
109
|
+
require 'sorcery/engine' if defined?(Rails)
|
78
110
|
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module Sorcery
|
2
|
+
module Adapters
|
3
|
+
class ActiveRecordAdapter < BaseAdapter
|
4
|
+
def update_attributes(attrs)
|
5
|
+
attrs.each do |name, value|
|
6
|
+
@model.send(:"#{name}=", value)
|
7
|
+
end
|
8
|
+
primary_key = @model.class.primary_key
|
9
|
+
@model.class.where(:"#{primary_key}" => @model.send(:"#{primary_key}")).update_all(attrs)
|
10
|
+
end
|
11
|
+
|
12
|
+
def save(options = {})
|
13
|
+
mthd = options.delete(:raise_on_failure) ? :save! : :save
|
14
|
+
@model.send(mthd, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def increment(field)
|
18
|
+
@model.increment!(field)
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_authentication_by_oauth_credentials(relation_name, provider, uid)
|
22
|
+
@user_config ||= ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
|
23
|
+
conditions = {
|
24
|
+
@user_config.provider_uid_attribute_name => uid,
|
25
|
+
@user_config.provider_attribute_name => provider
|
26
|
+
}
|
27
|
+
|
28
|
+
@model.public_send(relation_name).where(conditions).first
|
29
|
+
end
|
30
|
+
|
31
|
+
class << self
|
32
|
+
def define_field(name, type, options={})
|
33
|
+
# AR fields are defined through migrations, only validator here
|
34
|
+
end
|
35
|
+
|
36
|
+
def define_callback(time, event, method_name, options={})
|
37
|
+
@klass.send "#{time}_#{event}", method_name, options.slice(:if)
|
38
|
+
end
|
39
|
+
|
40
|
+
def find_by_oauth_credentials(provider, uid)
|
41
|
+
@user_config ||= ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
|
42
|
+
conditions = {
|
43
|
+
@user_config.provider_uid_attribute_name => uid,
|
44
|
+
@user_config.provider_attribute_name => provider
|
45
|
+
}
|
46
|
+
|
47
|
+
@klass.where(conditions).first
|
48
|
+
end
|
49
|
+
|
50
|
+
def find_by_remember_me_token(token)
|
51
|
+
@klass.where(@klass.sorcery_config.remember_me_token_attribute_name => token).first
|
52
|
+
end
|
53
|
+
|
54
|
+
def find_by_credentials(credentials)
|
55
|
+
relation = nil
|
56
|
+
|
57
|
+
@klass.sorcery_config.username_attribute_names.each do |attribute|
|
58
|
+
if @klass.sorcery_config.downcase_username_before_authenticating
|
59
|
+
condition = @klass.arel_table[attribute].lower.eq(@klass.arel_table.lower(credentials[0]))
|
60
|
+
else
|
61
|
+
condition = @klass.arel_table[attribute].eq(credentials[0])
|
62
|
+
end
|
63
|
+
|
64
|
+
if relation.nil?
|
65
|
+
relation = condition
|
66
|
+
else
|
67
|
+
relation = relation.or(condition)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
@klass.where(relation).first
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_by_token(token_attr_name, token)
|
75
|
+
condition = @klass.arel_table[token_attr_name].eq(token)
|
76
|
+
|
77
|
+
@klass.where(condition).first
|
78
|
+
end
|
79
|
+
|
80
|
+
def find_by_activation_token(token)
|
81
|
+
@klass.where(@klass.sorcery_config.activation_token_attribute_name => token).first
|
82
|
+
end
|
83
|
+
|
84
|
+
def find_by_id(id)
|
85
|
+
@klass.find_by_id(id)
|
86
|
+
end
|
87
|
+
|
88
|
+
def find_by_username(username)
|
89
|
+
@klass.sorcery_config.username_attribute_names.each do |attribute|
|
90
|
+
if @klass.sorcery_config.downcase_username_before_authenticating
|
91
|
+
username = username.downcase
|
92
|
+
end
|
93
|
+
|
94
|
+
result = @klass.where(attribute => username).first
|
95
|
+
return result if result
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def find_by_email(email)
|
100
|
+
@klass.where(@klass.sorcery_config.email_attribute_name => email).first
|
101
|
+
end
|
102
|
+
|
103
|
+
def get_current_users
|
104
|
+
config = @klass.sorcery_config
|
105
|
+
|
106
|
+
@klass
|
107
|
+
.where("#{config.last_activity_at_attribute_name} IS NOT NULL") \
|
108
|
+
.where("#{config.last_logout_at_attribute_name} IS NULL OR #{config.last_activity_at_attribute_name} > #{config.last_logout_at_attribute_name}") \
|
109
|
+
.where("#{config.last_activity_at_attribute_name} > ? ", config.activity_timeout.seconds.ago.utc.to_s(:db))
|
110
|
+
end
|
111
|
+
|
112
|
+
def transaction(&blk)
|
113
|
+
@klass.tap(&blk)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|