sorcery 0.6.1 → 0.7.1

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 (185) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +52 -45
  3. data/README.rdoc +26 -54
  4. data/Rakefile +26 -0
  5. data/VERSION +1 -1
  6. data/lib/generators/sorcery/USAGE +22 -0
  7. data/lib/generators/sorcery/install_generator.rb +71 -0
  8. data/lib/{sorcery/initializers → generators/sorcery/templates}/initializer.rb +82 -61
  9. data/lib/generators/sorcery/templates/migration/activity_logging.rb +17 -0
  10. data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +11 -0
  11. data/lib/generators/{sorcery_migration/templates → sorcery/templates/migration}/core.rb +3 -3
  12. data/lib/generators/{sorcery_migration/templates → sorcery/templates/migration}/external.rb +1 -1
  13. data/lib/generators/sorcery/templates/migration/remember_me.rb +15 -0
  14. data/lib/generators/sorcery/templates/migration/reset_password.rb +17 -0
  15. data/lib/generators/sorcery/templates/migration/user_activation.rb +17 -0
  16. data/lib/sorcery/controller/submodules/activity_logging.rb +23 -9
  17. data/lib/sorcery/controller/submodules/brute_force_protection.rb +2 -1
  18. data/lib/sorcery/controller/submodules/external/protocols/certs/ca-bundle.crt +5182 -0
  19. data/lib/sorcery/controller/submodules/external/protocols/oauth2.rb +27 -8
  20. data/lib/sorcery/controller/submodules/external/providers/github.rb +80 -0
  21. data/lib/sorcery/controller/submodules/external/providers/twitter.rb +5 -0
  22. data/lib/sorcery/controller/submodules/external.rb +10 -3
  23. data/lib/sorcery/controller/submodules/http_basic_auth.rb +1 -1
  24. data/lib/sorcery/controller/submodules/remember_me.rb +15 -5
  25. data/lib/sorcery/controller/submodules/session_timeout.rb +1 -1
  26. data/lib/sorcery/controller.rb +59 -38
  27. data/lib/sorcery/crypto_providers/aes256.rb +7 -3
  28. data/lib/sorcery/engine.rb +1 -0
  29. data/lib/sorcery/model/adapters/active_record.rb +2 -1
  30. data/lib/sorcery/model/adapters/mongo_mapper.rb +49 -0
  31. data/lib/sorcery/model/adapters/mongoid.rb +7 -2
  32. data/lib/sorcery/model/submodules/brute_force_protection.rb +13 -3
  33. data/lib/sorcery/model/submodules/remember_me.rb +9 -2
  34. data/lib/sorcery/model/submodules/reset_password.rb +11 -2
  35. data/lib/sorcery/model/submodules/user_activation.rb +13 -2
  36. data/lib/sorcery/model/temporary_token.rb +5 -0
  37. data/lib/sorcery/model.rb +34 -15
  38. data/lib/sorcery/test_helpers/internal/rails.rb +1 -1
  39. data/lib/sorcery/test_helpers/rails.rb +2 -2
  40. data/lib/sorcery.rb +6 -7
  41. data/sorcery.gemspec +86 -203
  42. data/spec/Gemfile.lock +23 -12
  43. data/spec/README.md +31 -0
  44. data/spec/rails3/Gemfile +3 -1
  45. data/spec/rails3/Gemfile.lock +45 -28
  46. data/spec/rails3/app/controllers/application_controller.rb +40 -22
  47. data/spec/rails3/app/views/application/index.html.erb +17 -0
  48. data/spec/rails3/spec/controller_activity_logging_spec.rb +23 -0
  49. data/spec/rails3/spec/controller_oauth2_spec.rb +59 -16
  50. data/spec/rails3/spec/controller_remember_me_spec.rb +37 -6
  51. data/spec/rails3/spec/controller_spec.rb +30 -0
  52. data/spec/rails3/spec/integration_spec.rb +23 -0
  53. data/spec/rails3/spec/spec_helper.rb +6 -5
  54. data/spec/rails3_mongo_mapper/.gitignore +4 -0
  55. data/spec/rails3_mongo_mapper/.rspec +1 -0
  56. data/spec/{sinatra_modular → rails3_mongo_mapper}/Gemfile +5 -5
  57. data/spec/rails3_mongo_mapper/Gemfile.lock +159 -0
  58. data/spec/{sinatra → rails3_mongo_mapper}/Rakefile +3 -3
  59. data/spec/rails3_mongo_mapper/app/controllers/application_controller.rb +108 -0
  60. data/spec/rails3_mongo_mapper/app/helpers/application_helper.rb +2 -0
  61. data/spec/rails3_mongo_mapper/app/models/authentication.rb +6 -0
  62. data/spec/rails3_mongo_mapper/app/models/user.rb +5 -0
  63. data/spec/rails3_mongo_mapper/app/views/layouts/application.html.erb +14 -0
  64. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_email.html.erb +17 -0
  65. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_email.text.erb +9 -0
  66. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_success_email.html.erb +17 -0
  67. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_success_email.text.erb +9 -0
  68. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/reset_password_email.html.erb +16 -0
  69. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/reset_password_email.text.erb +8 -0
  70. data/spec/rails3_mongo_mapper/config/application.rb +51 -0
  71. data/spec/rails3_mongo_mapper/config/boot.rb +13 -0
  72. data/spec/rails3_mongo_mapper/config/environment.rb +5 -0
  73. data/spec/rails3_mongo_mapper/config/environments/development.rb +30 -0
  74. data/spec/rails3_mongo_mapper/config/environments/in_memory.rb +0 -0
  75. data/spec/rails3_mongo_mapper/config/environments/production.rb +49 -0
  76. data/spec/rails3_mongo_mapper/config/environments/test.rb +35 -0
  77. data/spec/rails3_mongo_mapper/config/initializers/backtrace_silencers.rb +7 -0
  78. data/spec/rails3_mongo_mapper/config/initializers/inflections.rb +10 -0
  79. data/spec/rails3_mongo_mapper/config/initializers/mime_types.rb +5 -0
  80. data/spec/rails3_mongo_mapper/config/initializers/mongo.rb +2 -0
  81. data/spec/rails3_mongo_mapper/config/initializers/secret_token.rb +7 -0
  82. data/spec/rails3_mongo_mapper/config/initializers/session_store.rb +8 -0
  83. data/spec/rails3_mongo_mapper/config/locales/en.yml +5 -0
  84. data/spec/rails3_mongo_mapper/config/routes.rb +59 -0
  85. data/spec/rails3_mongo_mapper/config.ru +4 -0
  86. data/spec/rails3_mongo_mapper/db/schema.rb +23 -0
  87. data/spec/rails3_mongo_mapper/db/seeds.rb +7 -0
  88. data/spec/rails3_mongo_mapper/lib/tasks/.gitkeep +0 -0
  89. data/spec/rails3_mongo_mapper/public/404.html +26 -0
  90. data/spec/rails3_mongo_mapper/public/422.html +26 -0
  91. data/spec/rails3_mongo_mapper/public/500.html +26 -0
  92. data/spec/rails3_mongo_mapper/public/favicon.ico +0 -0
  93. data/spec/rails3_mongo_mapper/public/images/rails.png +0 -0
  94. data/spec/rails3_mongo_mapper/public/javascripts/application.js +2 -0
  95. data/spec/rails3_mongo_mapper/public/javascripts/controls.js +965 -0
  96. data/spec/rails3_mongo_mapper/public/javascripts/dragdrop.js +974 -0
  97. data/spec/rails3_mongo_mapper/public/javascripts/effects.js +1123 -0
  98. data/spec/rails3_mongo_mapper/public/javascripts/prototype.js +6001 -0
  99. data/spec/rails3_mongo_mapper/public/javascripts/rails.js +175 -0
  100. data/spec/rails3_mongo_mapper/public/robots.txt +5 -0
  101. data/spec/rails3_mongo_mapper/public/stylesheets/.gitkeep +0 -0
  102. data/spec/rails3_mongo_mapper/script/rails +6 -0
  103. data/spec/{sinatra → rails3_mongo_mapper}/spec/controller_spec.rb +51 -41
  104. data/spec/rails3_mongo_mapper/spec/spec_helper.orig.rb +27 -0
  105. data/spec/rails3_mongo_mapper/spec/spec_helper.rb +55 -0
  106. data/spec/rails3_mongo_mapper/spec/user_activation_spec.rb +9 -0
  107. data/spec/rails3_mongo_mapper/spec/user_activity_logging_spec.rb +8 -0
  108. data/spec/rails3_mongo_mapper/spec/user_brute_force_protection_spec.rb +8 -0
  109. data/spec/rails3_mongo_mapper/spec/user_oauth_spec.rb +8 -0
  110. data/spec/rails3_mongo_mapper/spec/user_remember_me_spec.rb +8 -0
  111. data/spec/rails3_mongo_mapper/spec/user_reset_password_spec.rb +8 -0
  112. data/spec/rails3_mongo_mapper/spec/user_spec.rb +37 -0
  113. data/spec/rails3_mongo_mapper/vendor/plugins/.gitkeep +0 -0
  114. data/spec/rails3_mongoid/Gemfile +1 -1
  115. data/spec/rails3_mongoid/Gemfile.lock +41 -34
  116. data/spec/rails3_mongoid/spec/controller_activity_logging_spec.rb +98 -0
  117. data/spec/rails3_mongoid/spec/controller_spec.rb +130 -0
  118. data/spec/rails3_mongoid/spec/user_spec.rb +1 -0
  119. data/spec/shared_examples/user_remember_me_shared_examples.rb +1 -0
  120. data/spec/shared_examples/user_shared_examples.rb +36 -8
  121. metadata +128 -234
  122. data/lib/generators/sorcery_migration/sorcery_migration_generator.rb +0 -24
  123. data/lib/generators/sorcery_migration/templates/activity_logging.rb +0 -17
  124. data/lib/generators/sorcery_migration/templates/brute_force_protection.rb +0 -11
  125. data/lib/generators/sorcery_migration/templates/remember_me.rb +0 -15
  126. data/lib/generators/sorcery_migration/templates/reset_password.rb +0 -13
  127. data/lib/generators/sorcery_migration/templates/user_activation.rb +0 -17
  128. data/lib/sorcery/controller/adapters/sinatra.rb +0 -104
  129. data/lib/sorcery/sinatra.rb +0 -4
  130. data/lib/sorcery/test_helpers/internal/sinatra.rb +0 -74
  131. data/lib/sorcery/test_helpers/internal/sinatra_modular.rb +0 -74
  132. data/lib/sorcery/test_helpers/sinatra.rb +0 -88
  133. data/spec/rails3/Rakefile.unused +0 -7
  134. data/spec/rails3/public/index.html +0 -239
  135. data/spec/sinatra/Gemfile +0 -15
  136. data/spec/sinatra/Gemfile.lock +0 -117
  137. data/spec/sinatra/authentication.rb +0 -3
  138. data/spec/sinatra/db/migrate/activation/20101224223622_add_activation_to_users.rb +0 -17
  139. data/spec/sinatra/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -17
  140. data/spec/sinatra/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -11
  141. data/spec/sinatra/db/migrate/core/20101224223620_create_users.rb +0 -16
  142. data/spec/sinatra/db/migrate/external/20101224223628_create_authentications.rb +0 -14
  143. data/spec/sinatra/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -15
  144. data/spec/sinatra/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -13
  145. data/spec/sinatra/filters.rb +0 -27
  146. data/spec/sinatra/modular.rb +0 -157
  147. data/spec/sinatra/myapp.rb +0 -133
  148. data/spec/sinatra/spec/controller_activity_logging_spec.rb +0 -85
  149. data/spec/sinatra/spec/controller_brute_force_protection_spec.rb +0 -70
  150. data/spec/sinatra/spec/controller_http_basic_auth_spec.rb +0 -53
  151. data/spec/sinatra/spec/controller_oauth2_spec.rb +0 -99
  152. data/spec/sinatra/spec/controller_oauth_spec.rb +0 -100
  153. data/spec/sinatra/spec/controller_remember_me_spec.rb +0 -64
  154. data/spec/sinatra/spec/controller_session_timeout_spec.rb +0 -57
  155. data/spec/sinatra/spec/spec_helper.rb +0 -45
  156. data/spec/sinatra/user.rb +0 -6
  157. data/spec/sinatra/views/test_login.erb +0 -4
  158. data/spec/sinatra_modular/Gemfile.lock +0 -117
  159. data/spec/sinatra_modular/Rakefile +0 -11
  160. data/spec/sinatra_modular/authentication.rb +0 -3
  161. data/spec/sinatra_modular/db/migrate/activation/20101224223622_add_activation_to_users.rb +0 -17
  162. data/spec/sinatra_modular/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -17
  163. data/spec/sinatra_modular/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -11
  164. data/spec/sinatra_modular/db/migrate/core/20101224223620_create_users.rb +0 -16
  165. data/spec/sinatra_modular/db/migrate/external/20101224223628_create_authentications.rb +0 -14
  166. data/spec/sinatra_modular/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -15
  167. data/spec/sinatra_modular/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -13
  168. data/spec/sinatra_modular/filters.rb +0 -27
  169. data/spec/sinatra_modular/modular.rb +0 -157
  170. data/spec/sinatra_modular/myapp.rb +0 -133
  171. data/spec/sinatra_modular/sorcery_mailer.rb +0 -25
  172. data/spec/sinatra_modular/spec_modular/controller_activity_logging_spec.rb +0 -85
  173. data/spec/sinatra_modular/spec_modular/controller_brute_force_protection_spec.rb +0 -70
  174. data/spec/sinatra_modular/spec_modular/controller_http_basic_auth_spec.rb +0 -53
  175. data/spec/sinatra_modular/spec_modular/controller_oauth2_spec.rb +0 -99
  176. data/spec/sinatra_modular/spec_modular/controller_oauth_spec.rb +0 -100
  177. data/spec/sinatra_modular/spec_modular/controller_remember_me_spec.rb +0 -64
  178. data/spec/sinatra_modular/spec_modular/controller_session_timeout_spec.rb +0 -57
  179. data/spec/sinatra_modular/spec_modular/controller_spec.rb +0 -116
  180. data/spec/sinatra_modular/spec_modular/spec.opts +0 -2
  181. data/spec/sinatra_modular/spec_modular/spec_helper.rb +0 -51
  182. data/spec/sinatra_modular/user.rb +0 -6
  183. data/spec/sinatra_modular/views/test_login.erb +0 -4
  184. /data/spec/{sinatra → rails3_mongo_mapper/app/mailers}/sorcery_mailer.rb +0 -0
  185. /data/spec/{sinatra → rails3_mongo_mapper}/spec/spec.opts +0 -0
@@ -45,8 +45,10 @@ module Sorcery
45
45
 
46
46
  base.sorcery_config.after_config << :validate_mailer_defined
47
47
  base.sorcery_config.after_config << :define_reset_password_mongoid_fields if defined?(Mongoid) and base.ancestors.include?(Mongoid::Document)
48
+ if defined?(MongoMapper) and base.ancestors.include?(MongoMapper::Document)
49
+ base.sorcery_config.after_config << :define_reset_password_mongo_mapper_fields
50
+ end
48
51
 
49
- base.send(:include, TemporaryToken)
50
52
  base.send(:include, InstanceMethods)
51
53
 
52
54
  end
@@ -73,6 +75,13 @@ module Sorcery
73
75
  field sorcery_config.reset_password_token_expires_at_attribute_name, :type => DateTime
74
76
  field sorcery_config.reset_password_email_sent_at_attribute_name, :type => DateTime
75
77
  end
78
+
79
+ def define_reset_password_mongo_mapper_fields
80
+ key sorcery_config.reset_password_token_attribute_name, String
81
+ # no DateTime in MM
82
+ key sorcery_config.reset_password_token_expires_at_attribute_name, Time
83
+ key sorcery_config.reset_password_email_sent_at_attribute_name, Time
84
+ end
76
85
  end
77
86
 
78
87
  module InstanceMethods
@@ -81,7 +90,7 @@ module Sorcery
81
90
  config = sorcery_config
82
91
  # hammering protection
83
92
  return if config.reset_password_time_between_emails && self.send(config.reset_password_email_sent_at_attribute_name) && self.send(config.reset_password_email_sent_at_attribute_name) > config.reset_password_time_between_emails.ago.utc
84
- self.send(:"#{config.reset_password_token_attribute_name}=", generate_random_token)
93
+ self.send(:"#{config.reset_password_token_attribute_name}=", TemporaryToken.generate_random_token)
85
94
  self.send(:"#{config.reset_password_token_expires_at_attribute_name}=", Time.now.utc + config.reset_password_expiration_period) if config.reset_password_expiration_period
86
95
  self.send(:"#{config.reset_password_email_sent_at_attribute_name}=", Time.now.utc)
87
96
  self.class.transaction do
@@ -52,10 +52,12 @@ module Sorcery
52
52
 
53
53
  base.sorcery_config.after_config << :validate_mailer_defined
54
54
  base.sorcery_config.after_config << :define_user_activation_mongoid_fields if defined?(Mongoid) and base.ancestors.include?(Mongoid::Document)
55
+ if defined?(MongoMapper) and base.ancestors.include?(MongoMapper::Document)
56
+ base.sorcery_config.after_config << :define_user_activation_mongo_mapper_fields
57
+ end
55
58
  base.sorcery_config.before_authenticate << :prevent_non_active_login
56
59
 
57
60
  base.extend(ClassMethods)
58
- base.send(:include, TemporaryToken)
59
61
  base.send(:include, InstanceMethods)
60
62
 
61
63
 
@@ -85,6 +87,15 @@ module Sorcery
85
87
  field sorcery_config.activation_token_expires_at_attribute_name, :type => DateTime
86
88
  end
87
89
  end
90
+
91
+ def define_user_activation_mongo_mapper_fields
92
+ self.class_eval do
93
+ key sorcery_config.activation_state_attribute_name, String
94
+ key sorcery_config.activation_token_attribute_name, String
95
+ # no DateTime in MM
96
+ key sorcery_config.activation_token_expires_at_attribute_name, Time
97
+ end
98
+ end
88
99
  end
89
100
 
90
101
  module InstanceMethods
@@ -101,7 +112,7 @@ module Sorcery
101
112
 
102
113
  def setup_activation
103
114
  config = sorcery_config
104
- generated_activation_token = generate_random_token
115
+ generated_activation_token = TemporaryToken.generate_random_token
105
116
  self.send(:"#{config.activation_token_attribute_name}=", generated_activation_token)
106
117
  self.send(:"#{config.activation_state_attribute_name}=", "pending")
107
118
  self.send(:"#{config.activation_token_expires_at_attribute_name}=", Time.now.utc + config.activation_token_expiration_period) if config.activation_token_expiration_period
@@ -8,6 +8,11 @@ module Sorcery
8
8
  base.extend(ClassMethods)
9
9
  end
10
10
 
11
+ # Random code, used for salt and temporary tokens.
12
+ def self.generate_random_token
13
+ Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
14
+ end
15
+
11
16
  module ClassMethods
12
17
  def load_from_token(token, token_attr_name, token_expiration_date_attr)
13
18
  return nil if token.blank?
data/lib/sorcery/model.rb CHANGED
@@ -3,8 +3,8 @@ module Sorcery
3
3
  # It should be included into the ORM base class.
4
4
  # In the case of Rails this is usually ActiveRecord (actually, in that case, the plugin does this automatically).
5
5
  #
6
- # When included it defines a single method: 'activate_sorcery!' which when called adds the other capabilities
7
- # to the class.
6
+ # When included it defines a single method: 'authenticates_with_sorcery!'
7
+ # which when called adds the other capabilities to the class.
8
8
  # This method is also the place to configure the plugin in the Model layer.
9
9
  module Model
10
10
  def self.included(klass)
@@ -15,6 +15,7 @@ module Sorcery
15
15
  self.class_eval do
16
16
  extend ClassMethods # included here, before submodules, so they can be overriden by them.
17
17
  include InstanceMethods
18
+ include TemporaryToken
18
19
  end
19
20
 
20
21
  include_required_submodules!
@@ -23,6 +24,7 @@ module Sorcery
23
24
  ::Sorcery::Controller::Config.user_config.tap{|blk| blk.call(@sorcery_config) if blk}
24
25
 
25
26
  init_mongoid_support! if defined?(Mongoid) and self.ancestors.include?(Mongoid::Document)
27
+ init_mongo_mapper_support! if defined?(MongoMapper) and self.ancestors.include?(MongoMapper::Document)
26
28
 
27
29
  init_orm_hooks!
28
30
 
@@ -52,20 +54,38 @@ module Sorcery
52
54
  # using 1.8.x hash syntax to perserve compatibility.
53
55
  def init_mongoid_support!
54
56
  self.class_eval do
55
- field sorcery_config.username_attribute_name, :type => String
56
- field sorcery_config.email_attribute_name, :type => String unless sorcery_config.username_attribute_name == sorcery_config.email_attribute_name
57
+ sorcery_config.username_attribute_names.each do |username|
58
+ field username, :type => String
59
+ end
60
+ field sorcery_config.email_attribute_name, :type => String unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
57
61
  field sorcery_config.crypted_password_attribute_name, :type => String
58
62
  field sorcery_config.salt_attribute_name, :type => String
59
63
  end
60
64
  end
61
65
 
66
+ # defines mongo_mapper fields on the model class,
67
+ def init_mongo_mapper_support!
68
+ self.class_eval do
69
+ sorcery_config.username_attribute_names.each do |username|
70
+ key username, String
71
+ end
72
+ key sorcery_config.email_attribute_name, String unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
73
+ key sorcery_config.crypted_password_attribute_name, String
74
+ key sorcery_config.salt_attribute_name, String
75
+ end
76
+ end
77
+
62
78
  # add virtual password accessor and ORM callbacks.
63
79
  def init_orm_hooks!
64
80
  self.class_eval do
65
81
  attr_accessor @sorcery_config.password_attribute_name
66
82
  attr_protected @sorcery_config.crypted_password_attribute_name, @sorcery_config.salt_attribute_name
67
- before_save :encrypt_password, :if => Proc.new { |record| record.send(sorcery_config.password_attribute_name).present? }
68
- after_save :clear_virtual_password, :if => Proc.new { |record| record.send(sorcery_config.password_attribute_name).present? }
83
+ before_save :encrypt_password, :if => Proc.new { |record|
84
+ record.send(sorcery_config.password_attribute_name).present?
85
+ }
86
+ after_save :clear_virtual_password, :if => Proc.new { |record|
87
+ record.send(sorcery_config.password_attribute_name).present?
88
+ }
69
89
  end
70
90
  end
71
91
  end
@@ -95,7 +115,7 @@ module Sorcery
95
115
 
96
116
  @sorcery_config.encryption_provider.stretches = @sorcery_config.stretches if @sorcery_config.encryption_provider.respond_to?(:stretches) && @sorcery_config.stretches
97
117
  @sorcery_config.encryption_provider.join_token = @sorcery_config.salt_join_token if @sorcery_config.encryption_provider.respond_to?(:join_token) && @sorcery_config.salt_join_token
98
- CryptoProviders::AES256.key = @sorcery_config.encryption_key if @sorcery_config.encryption_algorithm == :aes256
118
+ CryptoProviders::AES256.key = @sorcery_config.encryption_key
99
119
  @sorcery_config.encryption_provider.encrypt(*tokens)
100
120
  end
101
121
 
@@ -141,7 +161,7 @@ module Sorcery
141
161
  # encrypts password with salt and saves it.
142
162
  def encrypt_password
143
163
  config = sorcery_config
144
- self.send(:"#{config.salt_attribute_name}=", new_salt = generate_random_token) if !config.salt_attribute_name.nil?
164
+ self.send(:"#{config.salt_attribute_name}=", new_salt = TemporaryToken.generate_random_token) if !config.salt_attribute_name.nil?
145
165
  self.send(:"#{config.crypted_password_attribute_name}=", self.class.encrypt(self.send(config.password_attribute_name),new_salt))
146
166
  end
147
167
 
@@ -159,11 +179,6 @@ module Sorcery
159
179
  mail.deliver
160
180
  end
161
181
  end
162
-
163
- # Random code, used for salt and temporary tokens.
164
- def generate_random_token
165
- Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
166
- end
167
182
  end
168
183
 
169
184
  # Each class which calls 'activate_sorcery!' receives an instance of this class.
@@ -171,7 +186,7 @@ module Sorcery
171
186
  # options will be configured from a single place.
172
187
  class Config
173
188
 
174
- attr_accessor :username_attribute_name, # change default username attribute, for example, to use :email
189
+ attr_accessor :username_attribute_names, # change default username attribute, for example, to use :email
175
190
  # as the login.
176
191
 
177
192
  :password_attribute_name, # change *virtual* password attribute, the one which is used
@@ -203,7 +218,7 @@ module Sorcery
203
218
  def initialize
204
219
  @defaults = {
205
220
  :@submodules => [],
206
- :@username_attribute_name => :username,
221
+ :@username_attribute_names => [:username],
207
222
  :@password_attribute_name => :password,
208
223
  :@email_attribute_name => :email,
209
224
  :@crypted_password_attribute_name => :crypted_password,
@@ -228,6 +243,10 @@ module Sorcery
228
243
  end
229
244
  end
230
245
 
246
+ def username_attribute_names=(fields)
247
+ @username_attribute_names = fields.kind_of?(Array) ? fields : [fields]
248
+ end
249
+
231
250
  def custom_encryption_provider=(provider)
232
251
  @custom_encryption_provider = @encryption_provider = provider
233
252
  end
@@ -12,7 +12,7 @@ module Sorcery
12
12
 
13
13
  def sorcery_reload!(submodules = [], options = {})
14
14
  reload_user_class
15
-
15
+
16
16
  # return to no-module configuration
17
17
  ::Sorcery::Controller::Config.init!
18
18
  ::Sorcery::Controller::Config.reset!
@@ -4,8 +4,8 @@ module Sorcery
4
4
  # logins a user and calls all callbacks
5
5
  def login_user(user = nil)
6
6
  user ||= @user
7
- @controller.send(:login_user,user)
8
- @controller.send(:after_login!,user,[user.send(user.sorcery_config.username_attribute_name),'secret'])
7
+ @controller.send(:auto_login,user)
8
+ @controller.send(:after_login!,user,[user.send(user.sorcery_config.username_attribute_names.first),'secret'])
9
9
  end
10
10
 
11
11
  def logout_user
data/lib/sorcery.rb CHANGED
@@ -5,6 +5,7 @@ module Sorcery
5
5
  module Adapters
6
6
  autoload :ActiveRecord, 'sorcery/model/adapters/active_record'
7
7
  autoload :Mongoid, 'sorcery/model/adapters/mongoid'
8
+ autoload :MongoMapper, 'sorcery/model/adapters/mongo_mapper'
8
9
  end
9
10
  module Submodules
10
11
  autoload :UserActivation, 'sorcery/model/submodules/user_activation'
@@ -32,12 +33,10 @@ module Sorcery
32
33
  module Providers
33
34
  autoload :Twitter, 'sorcery/controller/submodules/external/providers/twitter'
34
35
  autoload :Facebook, 'sorcery/controller/submodules/external/providers/facebook'
36
+ autoload :Github, 'sorcery/controller/submodules/external/providers/github'
35
37
  end
36
38
  end
37
39
  end
38
- module Adapters
39
- autoload :Sinatra, 'sorcery/controller/adapters/sinatra'
40
- end
41
40
  end
42
41
  module CryptoProviders
43
42
  autoload :Common, 'sorcery/crypto_providers/common'
@@ -51,12 +50,9 @@ module Sorcery
51
50
  autoload :TestHelpers, 'sorcery/test_helpers'
52
51
  module TestHelpers
53
52
  autoload :Rails, 'sorcery/test_helpers/rails'
54
- autoload :Sinatra, 'sorcery/test_helpers/sinatra'
55
53
  autoload :Internal, 'sorcery/test_helpers/internal'
56
54
  module Internal
57
55
  autoload :Rails, 'sorcery/test_helpers/internal/rails'
58
- autoload :Sinatra, 'sorcery/test_helpers/internal/sinatra'
59
- autoload :SinatraModular, 'sorcery/test_helpers/internal/sinatra_modular'
60
56
  end
61
57
 
62
58
  end
@@ -76,6 +72,9 @@ module Sorcery
76
72
  end
77
73
  end
78
74
 
75
+ if defined?(MongoMapper)
76
+ MongoMapper::Document.send(:plugin, Sorcery::Model::Adapters::MongoMapper)
77
+ end
78
+
79
79
  require 'sorcery/engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
80
- require 'sorcery/sinatra' if defined?(Sinatra)
81
80
  end