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.

Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.travis.yml +75 -14
  4. data/CHANGELOG.md +23 -1
  5. data/Gemfile +1 -0
  6. data/README.md +137 -86
  7. data/gemfiles/active_record-rails40.gemfile +7 -0
  8. data/gemfiles/active_record-rails41.gemfile +3 -2
  9. data/gemfiles/mongo_mapper-rails40.gemfile +9 -0
  10. data/gemfiles/mongo_mapper-rails41.gemfile +2 -1
  11. data/gemfiles/mongoid-rails40.gemfile +9 -0
  12. data/gemfiles/mongoid-rails41.gemfile +3 -5
  13. data/gemfiles/mongoid3-rails32.gemfile +9 -0
  14. data/lib/generators/sorcery/USAGE +1 -1
  15. data/lib/generators/sorcery/install_generator.rb +19 -5
  16. data/lib/generators/sorcery/templates/initializer.rb +34 -9
  17. data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +3 -1
  18. data/lib/generators/sorcery/templates/migration/core.rb +2 -2
  19. data/lib/generators/sorcery/templates/migration/external.rb +3 -1
  20. data/lib/sorcery.rb +75 -43
  21. data/lib/sorcery/adapters/active_record_adapter.rb +120 -0
  22. data/lib/sorcery/adapters/base_adapter.rb +30 -0
  23. data/lib/sorcery/adapters/data_mapper_adapter.rb +176 -0
  24. data/lib/sorcery/adapters/mongo_mapper_adapter.rb +110 -0
  25. data/lib/sorcery/adapters/mongoid_adapter.rb +97 -0
  26. data/lib/sorcery/controller.rb +5 -64
  27. data/lib/sorcery/controller/config.rb +65 -0
  28. data/lib/sorcery/controller/submodules/activity_logging.rb +16 -21
  29. data/lib/sorcery/controller/submodules/brute_force_protection.rb +6 -6
  30. data/lib/sorcery/controller/submodules/external.rb +8 -28
  31. data/lib/sorcery/controller/submodules/remember_me.rb +4 -4
  32. data/lib/sorcery/controller/submodules/session_timeout.rb +10 -6
  33. data/lib/sorcery/model.rb +43 -175
  34. data/lib/sorcery/model/config.rb +96 -0
  35. data/lib/sorcery/model/submodules/activity_logging.rb +29 -36
  36. data/lib/sorcery/model/submodules/brute_force_protection.rb +21 -37
  37. data/lib/sorcery/model/submodules/external.rb +53 -9
  38. data/lib/sorcery/model/submodules/remember_me.rb +12 -31
  39. data/lib/sorcery/model/submodules/reset_password.rb +21 -39
  40. data/lib/sorcery/model/submodules/user_activation.rb +21 -63
  41. data/lib/sorcery/model/temporary_token.rb +4 -4
  42. data/lib/sorcery/providers/base.rb +11 -0
  43. data/lib/sorcery/providers/facebook.rb +1 -1
  44. data/lib/sorcery/providers/github.rb +1 -1
  45. data/lib/sorcery/providers/google.rb +1 -1
  46. data/lib/sorcery/providers/heroku.rb +57 -0
  47. data/lib/sorcery/providers/jira.rb +77 -0
  48. data/lib/sorcery/providers/linkedin.rb +1 -1
  49. data/lib/sorcery/providers/liveid.rb +1 -1
  50. data/lib/sorcery/providers/salesforce.rb +50 -0
  51. data/lib/sorcery/providers/twitter.rb +1 -1
  52. data/lib/sorcery/providers/vk.rb +6 -4
  53. data/lib/sorcery/providers/xing.rb +1 -1
  54. data/lib/sorcery/test_helpers/internal.rb +7 -3
  55. data/lib/sorcery/test_helpers/rails/controller.rb +5 -1
  56. data/lib/sorcery/version.rb +3 -0
  57. data/sorcery.gemspec +6 -2
  58. data/spec/active_record/user_activity_logging_spec.rb +9 -0
  59. data/spec/controllers/controller_activity_logging_spec.rb +124 -0
  60. data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
  61. data/spec/{active_record → controllers}/controller_http_basic_auth_spec.rb +14 -11
  62. data/spec/{active_record → controllers}/controller_oauth2_spec.rb +128 -56
  63. data/spec/{active_record → controllers}/controller_oauth_spec.rb +94 -70
  64. data/spec/{active_record → controllers}/controller_remember_me_spec.rb +32 -12
  65. data/spec/{active_record → controllers}/controller_session_timeout_spec.rb +15 -5
  66. data/spec/{shared_examples/controller_shared_examples.rb → controllers/controller_spec.rb} +34 -19
  67. data/spec/{datamapper → data_mapper}/user_activation_spec.rb +1 -1
  68. data/spec/data_mapper/user_activity_logging_spec.rb +14 -0
  69. data/spec/{datamapper → data_mapper}/user_brute_force_protection_spec.rb +1 -1
  70. data/spec/{datamapper → data_mapper}/user_oauth_spec.rb +1 -1
  71. data/spec/{datamapper → data_mapper}/user_remember_me_spec.rb +1 -1
  72. data/spec/{datamapper → data_mapper}/user_reset_password_spec.rb +1 -1
  73. data/spec/{datamapper → data_mapper}/user_spec.rb +1 -1
  74. data/spec/mongoid/user_spec.rb +13 -0
  75. data/spec/orm/active_record.rb +12 -0
  76. data/spec/orm/{datamapper.rb → data_mapper.rb} +16 -2
  77. data/spec/orm/mongo_mapper.rb +0 -1
  78. data/spec/orm/mongoid.rb +4 -0
  79. data/spec/rails_app/app/controllers/sorcery_controller.rb +62 -1
  80. data/spec/rails_app/app/{datamapper → data_mapper}/authentication.rb +0 -0
  81. data/spec/rails_app/app/{datamapper → data_mapper}/user.rb +0 -0
  82. data/spec/rails_app/app/mongo_mapper/user.rb +2 -0
  83. data/spec/rails_app/config/routes.rb +9 -0
  84. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +2 -2
  85. data/spec/shared_examples/user_activation_shared_examples.rb +7 -7
  86. data/spec/shared_examples/user_activity_logging_shared_examples.rb +73 -5
  87. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +127 -9
  88. data/spec/shared_examples/user_oauth_shared_examples.rb +3 -6
  89. data/spec/shared_examples/user_remember_me_shared_examples.rb +6 -3
  90. data/spec/shared_examples/user_reset_password_shared_examples.rb +10 -10
  91. data/spec/shared_examples/user_shared_examples.rb +117 -30
  92. data/spec/spec_helper.rb +7 -22
  93. metadata +36 -58
  94. data/Gemfile.rails4 +0 -22
  95. data/VERSION +0 -1
  96. data/lib/sorcery/model/adapters/active_record.rb +0 -54
  97. data/lib/sorcery/model/adapters/datamapper.rb +0 -123
  98. data/lib/sorcery/model/adapters/mongo_mapper.rb +0 -60
  99. data/lib/sorcery/model/adapters/mongoid.rb +0 -88
  100. data/lib/sorcery/test_helpers/rails.rb +0 -7
  101. data/spec/active_record/controller_activity_logging_spec.rb +0 -29
  102. data/spec/active_record/controller_brute_force_protection_spec.rb +0 -158
  103. data/spec/active_record/controller_spec.rb +0 -8
  104. data/spec/active_record/integration_spec.rb +0 -23
  105. data/spec/datamapper/controller_activity_logging_spec.rb +0 -17
  106. data/spec/datamapper/controller_spec.rb +0 -8
  107. data/spec/datamapper/user_activity_logging_spec.rb +0 -9
  108. data/spec/mongo_mapper/controller_spec.rb +0 -8
  109. data/spec/mongoid/controller_activity_logging_spec.rb +0 -16
  110. data/spec/mongoid/controller_spec.rb +0 -8
  111. data/spec/rails_app/public/404.html +0 -26
  112. data/spec/rails_app/public/422.html +0 -26
  113. data/spec/rails_app/public/500.html +0 -26
  114. data/spec/rails_app/public/favicon.ico +0 -0
  115. data/spec/rails_app/public/images/rails.png +0 -0
  116. data/spec/rails_app/public/javascripts/application.js +0 -2
  117. data/spec/rails_app/public/javascripts/controls.js +0 -965
  118. data/spec/rails_app/public/javascripts/dragdrop.js +0 -974
  119. data/spec/rails_app/public/javascripts/effects.js +0 -1123
  120. data/spec/rails_app/public/javascripts/prototype.js +0 -6001
  121. data/spec/rails_app/public/javascripts/rails.js +0 -175
  122. data/spec/rails_app/public/robots.txt +0 -5
  123. data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
  124. data/spec/shared_examples/controller_activity_logging_shared_examples.rb +0 -125
  125. data/spec/shared_examples/controller_oauth2_shared_examples.rb +0 -52
  126. data/spec/shared_examples/controller_oauth_shared_examples.rb +0 -62
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'sqlite3', platform: :mri
4
+ gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
5
+ gem 'rails', '~> 4.0.1'
6
+
7
+ gemspec path: '..'
@@ -1,6 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'sqlite3'
4
- gem 'rails', '~> 4.1'
3
+ gem 'sqlite3', platform: :mri
4
+ gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
5
+ gem 'rails', '~> 4.1.0'
5
6
 
6
7
  gemspec path: '..'
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.0.0'
4
+
5
+ gem 'mongo_mapper', github: 'mongomapper/mongomapper'
6
+ gem 'sqlite3', platform: :mri
7
+ gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
8
+
9
+ gemspec path: '..'
@@ -3,6 +3,7 @@ source 'https://rubygems.org'
3
3
  gem 'rails', '~> 4.1.0'
4
4
 
5
5
  gem 'mongo_mapper', github: 'mongomapper/mongomapper'
6
- gem 'sqlite3'
6
+ gem 'sqlite3', platform: :mri
7
+ gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
7
8
 
8
9
  gemspec path: '..'
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.0.0'
4
+
5
+ gem 'mongoid', '~> 4.0.0'
6
+ gem 'sqlite3', platform: :mri
7
+ gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
8
+
9
+ gemspec path: '..'
@@ -2,10 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 4.1.0'
4
4
 
5
- gem 'pry'
6
-
7
- gem 'mongoid', github: 'mongoid/mongoid'
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: '..'
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 3.2.0'
4
+
5
+ gem 'mongoid', '~> 3.0'
6
+ gem 'bson_ext'
7
+ gem 'sqlite3'
8
+
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 --migrations
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 options[:migrations]
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 --migrations
40
- unless options[:migrations]
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 --migrations.
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 options[:migrations]
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 wil not accept any requests nor redirect uri containing localhost,
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 he user defined logged out?
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, :null => false
6
- t.string :salt, :null => false
5
+ t.string :crypted_password
6
+ t.string :salt
7
7
 
8
8
  t.timestamps
9
9
  end
@@ -6,5 +6,7 @@ class SorceryExternal < ActiveRecord::Migration
6
6
 
7
7
  t.timestamps
8
8
  end
9
+
10
+ add_index :<%= model_class_name.tableize %>, [:provider, :uid]
9
11
  end
10
- end
12
+ end
@@ -1,78 +1,110 @@
1
+ require 'sorcery/version'
2
+
1
3
  module Sorcery
2
- autoload :Model, 'sorcery/model'
4
+
5
+ require 'sorcery/model'
6
+
7
+ module Adapters
8
+ require 'sorcery/adapters/base_adapter'
9
+ end
10
+
3
11
  module Model
4
- autoload :TemporaryToken, 'sorcery/model/temporary_token'
5
- module Adapters
6
- autoload :ActiveRecord, 'sorcery/model/adapters/active_record'
7
- autoload :Mongoid, 'sorcery/model/adapters/mongoid'
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
- autoload :UserActivation, 'sorcery/model/submodules/user_activation'
13
- autoload :ResetPassword, 'sorcery/model/submodules/reset_password'
14
- autoload :RememberMe, 'sorcery/model/submodules/remember_me'
15
- autoload :ActivityLogging, 'sorcery/model/submodules/activity_logging'
16
- autoload :BruteForceProtection, 'sorcery/model/submodules/brute_force_protection'
17
- autoload :External, 'sorcery/model/submodules/external'
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
- autoload :Controller, 'sorcery/controller'
25
+
26
+ require 'sorcery/controller'
27
+
21
28
  module Controller
29
+ autoload :Config, 'sorcery/controller/config'
22
30
  module Submodules
23
- autoload :RememberMe, 'sorcery/controller/submodules/remember_me'
24
- autoload :SessionTimeout, 'sorcery/controller/submodules/session_timeout'
25
- autoload :BruteForceProtection, 'sorcery/controller/submodules/brute_force_protection'
26
- autoload :HttpBasicAuth, 'sorcery/controller/submodules/http_basic_auth'
27
- autoload :ActivityLogging, 'sorcery/controller/submodules/activity_logging'
28
- autoload :External, 'sorcery/controller/submodules/external'
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
- autoload :Oauth, 'sorcery/protocols/oauth'
33
- autoload :Oauth2, 'sorcery/protocols/oauth2'
41
+ require 'sorcery/protocols/oauth'
42
+ require 'sorcery/protocols/oauth2'
34
43
  end
44
+
35
45
  module CryptoProviders
36
- autoload :Common, 'sorcery/crypto_providers/common'
37
- autoload :AES256, 'sorcery/crypto_providers/aes256'
38
- autoload :BCrypt, 'sorcery/crypto_providers/bcrypt'
39
- autoload :MD5, 'sorcery/crypto_providers/md5'
40
- autoload :SHA1, 'sorcery/crypto_providers/sha1'
41
- autoload :SHA256, 'sorcery/crypto_providers/sha256'
42
- autoload :SHA512, 'sorcery/crypto_providers/sha512'
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
- autoload :Internal, 'sorcery/test_helpers/internal'
46
- module Internal
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
- autoload :Controller, 'sorcery/test_helpers/rails/controller'
52
- autoload :Integration, 'sorcery/test_helpers/rails/integration'
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
- ActiveRecord::Base.send :include, Sorcery::Model::Adapters::ActiveRecord
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
- Mongoid::Document::ClassMethods.send :include, Sorcery::Model::Adapters::Mongoid::ClassMethods
65
- Mongoid::Document.send :include, Sorcery::Model::Adapters::Mongoid::InstanceMethods
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
- MongoMapper::Document.send(:plugin, Sorcery::Model::Adapters::MongoMapper)
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
- DataMapper::Model.append_inclusions(Sorcery::Model::Adapters::DataMapper)
105
+
106
+ DataMapper::Model.append_inclusions(Sorcery::Adapters::DataMapperAdapter::Wrapper)
75
107
  end
76
108
 
77
- require 'sorcery/engine' if defined?(Rails) && Rails::VERSION::MAJOR >= 3
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