sorcery 0.8.2 → 0.8.6
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.
- checksums.yaml +7 -0
- data/.gitignore +55 -0
- data/.travis.yml +69 -1
- data/CHANGELOG.md +248 -0
- data/Gemfile +16 -22
- data/Gemfile.rails4 +22 -0
- data/README.md +320 -0
- data/Rakefile +3 -79
- data/VERSION +1 -1
- data/gemfiles/active_record-rails41.gemfile +6 -0
- data/gemfiles/mongo_mapper-rails41.gemfile +8 -0
- data/gemfiles/mongoid-rails41.gemfile +11 -0
- data/lib/generators/sorcery/helpers.rb +40 -0
- data/lib/generators/sorcery/install_generator.rb +21 -17
- data/lib/generators/sorcery/templates/initializer.rb +1 -1
- data/lib/generators/sorcery/templates/migration/activity_logging.rb +2 -11
- data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +1 -7
- data/lib/generators/sorcery/templates/migration/core.rb +5 -8
- data/lib/generators/sorcery/templates/migration/external.rb +1 -5
- data/lib/generators/sorcery/templates/migration/remember_me.rb +2 -9
- data/lib/generators/sorcery/templates/migration/reset_password.rb +2 -10
- data/lib/generators/sorcery/templates/migration/user_activation.rb +2 -10
- data/lib/sorcery/controller/submodules/external.rb +39 -20
- data/lib/sorcery/controller/submodules/remember_me.rb +1 -1
- data/lib/sorcery/controller/submodules/session_timeout.rb +2 -2
- data/lib/sorcery/controller.rb +18 -11
- data/lib/sorcery/model/adapters/active_record.rb +7 -2
- data/lib/sorcery/model/adapters/datamapper.rb +123 -0
- data/lib/sorcery/model/adapters/mongo_mapper.rb +8 -4
- data/lib/sorcery/model/adapters/mongoid.rb +8 -8
- data/lib/sorcery/model/submodules/activity_logging.rb +24 -0
- data/lib/sorcery/model/submodules/brute_force_protection.rb +22 -8
- data/lib/sorcery/model/submodules/remember_me.rb +19 -4
- data/lib/sorcery/model/submodules/reset_password.rb +35 -14
- data/lib/sorcery/model/submodules/user_activation.rb +69 -24
- data/lib/sorcery/model.rb +111 -73
- data/lib/sorcery/protocols/oauth.rb +42 -0
- data/lib/sorcery/protocols/oauth2.rb +47 -0
- data/lib/sorcery/providers/base.rb +27 -0
- data/lib/sorcery/providers/facebook.rb +63 -0
- data/lib/sorcery/providers/github.rb +51 -0
- data/lib/sorcery/providers/google.rb +51 -0
- data/lib/sorcery/providers/linkedin.rb +66 -0
- data/lib/sorcery/providers/liveid.rb +53 -0
- data/lib/sorcery/providers/twitter.rb +59 -0
- data/lib/sorcery/providers/vk.rb +61 -0
- data/lib/sorcery/providers/xing.rb +64 -0
- data/lib/sorcery/test_helpers/internal/rails.rb +17 -6
- data/lib/sorcery/test_helpers/internal.rb +23 -6
- data/lib/sorcery/test_helpers/rails/controller.rb +17 -0
- data/lib/sorcery/test_helpers/rails/integration.rb +26 -0
- data/lib/sorcery/test_helpers/rails.rb +1 -10
- data/lib/sorcery.rb +20 -28
- data/sorcery.gemspec +21 -363
- data/spec/active_record/controller_activity_logging_spec.rb +29 -0
- data/spec/active_record/controller_brute_force_protection_spec.rb +158 -0
- data/spec/active_record/controller_http_basic_auth_spec.rb +65 -0
- data/spec/active_record/controller_oauth2_spec.rb +342 -0
- data/spec/{rails3/spec → active_record}/controller_oauth_spec.rb +69 -59
- data/spec/active_record/controller_remember_me_spec.rb +97 -0
- data/spec/active_record/controller_session_timeout_spec.rb +70 -0
- data/spec/active_record/controller_spec.rb +8 -0
- data/spec/{rails3/spec → active_record}/integration_spec.rb +3 -3
- data/spec/active_record/user_activation_spec.rb +18 -0
- data/spec/active_record/user_activity_logging_spec.rb +8 -0
- data/spec/{rails3/spec → active_record}/user_brute_force_protection_spec.rb +6 -5
- data/spec/{rails3/spec → active_record}/user_oauth_spec.rb +6 -5
- data/spec/{rails3/spec → active_record}/user_remember_me_spec.rb +5 -4
- data/spec/{rails3/spec → active_record}/user_reset_password_spec.rb +7 -7
- data/spec/active_record/user_spec.rb +37 -0
- data/spec/datamapper/controller_activity_logging_spec.rb +17 -0
- data/spec/datamapper/controller_spec.rb +8 -0
- data/spec/datamapper/user_activation_spec.rb +10 -0
- data/spec/datamapper/user_activity_logging_spec.rb +9 -0
- data/spec/datamapper/user_brute_force_protection_spec.rb +9 -0
- data/spec/datamapper/user_oauth_spec.rb +9 -0
- data/spec/datamapper/user_remember_me_spec.rb +8 -0
- data/spec/datamapper/user_reset_password_spec.rb +8 -0
- data/spec/datamapper/user_spec.rb +27 -0
- data/spec/mongo_mapper/controller_spec.rb +8 -0
- data/spec/mongo_mapper/user_activation_spec.rb +9 -0
- data/spec/mongo_mapper/user_activity_logging_spec.rb +8 -0
- data/spec/mongo_mapper/user_brute_force_protection_spec.rb +8 -0
- data/spec/mongo_mapper/user_oauth_spec.rb +8 -0
- data/spec/mongo_mapper/user_remember_me_spec.rb +8 -0
- data/spec/mongo_mapper/user_reset_password_spec.rb +8 -0
- data/spec/mongo_mapper/user_spec.rb +37 -0
- data/spec/mongoid/controller_activity_logging_spec.rb +16 -0
- data/spec/mongoid/controller_spec.rb +8 -0
- data/spec/mongoid/user_activation_spec.rb +9 -0
- data/spec/mongoid/user_activity_logging_spec.rb +8 -0
- data/spec/mongoid/user_brute_force_protection_spec.rb +8 -0
- data/spec/mongoid/user_oauth_spec.rb +8 -0
- data/spec/mongoid/user_remember_me_spec.rb +8 -0
- data/spec/mongoid/user_reset_password_spec.rb +8 -0
- data/spec/mongoid/user_spec.rb +38 -0
- data/spec/orm/active_record.rb +9 -0
- data/spec/orm/datamapper.rb +34 -0
- data/spec/orm/mongo_mapper.rb +11 -0
- data/spec/orm/mongoid.rb +18 -0
- data/spec/{rails3/app/models → rails_app/app/active_record}/user.rb +1 -2
- data/spec/rails_app/app/active_record/user_provider.rb +3 -0
- data/spec/rails_app/app/controllers/sorcery_controller.rb +224 -0
- data/spec/rails_app/app/datamapper/authentication.rb +8 -0
- data/spec/rails_app/app/datamapper/user.rb +7 -0
- data/spec/{rails3_mongoid/app/models → rails_app/app/mongoid}/user.rb +2 -0
- data/spec/{rails3_mongo_mapper → rails_app}/config/application.rb +13 -8
- data/spec/rails_app/config/boot.rb +4 -0
- data/spec/rails_app/config/database.yml +22 -0
- data/spec/{rails3_mongo_mapper → rails_app}/config/environments/test.rb +2 -0
- data/spec/{rails3_mongoid → rails_app}/config/initializers/session_store.rb +4 -0
- data/spec/rails_app/config/routes.rb +42 -0
- data/spec/{rails3_mongo_mapper → rails_app}/config.ru +1 -1
- data/spec/{rails3 → rails_app}/db/migrate/activation/20101224223622_add_activation_to_users.rb +3 -3
- data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +22 -0
- data/spec/rails_app/log/development.log +1791 -0
- data/spec/shared_examples/controller_activity_logging_shared_examples.rb +125 -0
- data/spec/shared_examples/controller_oauth2_shared_examples.rb +32 -36
- data/spec/shared_examples/controller_oauth_shared_examples.rb +35 -28
- data/spec/shared_examples/controller_shared_examples.rb +203 -0
- data/spec/shared_examples/user_activation_shared_examples.rb +136 -97
- data/spec/shared_examples/user_activity_logging_shared_examples.rb +10 -10
- data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +14 -13
- data/spec/shared_examples/user_oauth_shared_examples.rb +23 -15
- data/spec/shared_examples/user_remember_me_shared_examples.rb +32 -23
- data/spec/shared_examples/user_reset_password_shared_examples.rb +162 -129
- data/spec/shared_examples/user_shared_examples.rb +265 -190
- data/spec/sorcery_crypto_providers_spec.rb +74 -72
- data/spec/spec_helper.rb +47 -4
- metadata +277 -501
- data/Gemfile.lock +0 -175
- data/README.rdoc +0 -261
- data/lib/sorcery/controller/submodules/external/protocols/oauth1.rb +0 -46
- data/lib/sorcery/controller/submodules/external/protocols/oauth2.rb +0 -49
- data/lib/sorcery/controller/submodules/external/providers/base.rb +0 -21
- data/lib/sorcery/controller/submodules/external/providers/facebook.rb +0 -98
- data/lib/sorcery/controller/submodules/external/providers/github.rb +0 -92
- data/lib/sorcery/controller/submodules/external/providers/google.rb +0 -91
- data/lib/sorcery/controller/submodules/external/providers/linkedin.rb +0 -102
- data/lib/sorcery/controller/submodules/external/providers/liveid.rb +0 -92
- data/lib/sorcery/controller/submodules/external/providers/twitter.rb +0 -93
- data/lib/sorcery/controller/submodules/external/providers/vk.rb +0 -100
- data/lib/sorcery/controller/submodules/external/providers/xing.rb +0 -97
- data/lib/sorcery/test_helpers.rb +0 -5
- data/spec/Gemfile +0 -12
- data/spec/Gemfile.lock +0 -129
- data/spec/README.md +0 -31
- data/spec/Rakefile +0 -12
- data/spec/rails3/.gitignore +0 -4
- data/spec/rails3/.rspec +0 -1
- data/spec/rails3/Gemfile +0 -15
- data/spec/rails3/Gemfile.lock +0 -162
- data/spec/rails3/README +0 -256
- data/spec/rails3/Rakefile +0 -11
- data/spec/rails3/app/controllers/application_controller.rb +0 -208
- data/spec/rails3/config/application.rb +0 -46
- data/spec/rails3/config/boot.rb +0 -13
- data/spec/rails3/config/database.yml +0 -27
- data/spec/rails3/config/environments/development.rb +0 -26
- data/spec/rails3/config/environments/in_memory.rb +0 -35
- data/spec/rails3/config/environments/production.rb +0 -49
- data/spec/rails3/config/environments/test.rb +0 -35
- data/spec/rails3/config/initializers/session_store.rb +0 -8
- data/spec/rails3/config/routes.rb +0 -59
- data/spec/rails3/config.ru +0 -4
- data/spec/rails3/db/migrate/external/20101224223628_create_authentications.rb +0 -14
- data/spec/rails3/public/stylesheets/.gitkeep +0 -0
- data/spec/rails3/script/rails +0 -6
- data/spec/rails3/spec/controller_activity_logging_spec.rb +0 -130
- data/spec/rails3/spec/controller_brute_force_protection_spec.rb +0 -96
- data/spec/rails3/spec/controller_http_basic_auth_spec.rb +0 -50
- data/spec/rails3/spec/controller_oauth2_spec.rb +0 -380
- data/spec/rails3/spec/controller_remember_me_spec.rb +0 -96
- data/spec/rails3/spec/controller_session_timeout_spec.rb +0 -55
- data/spec/rails3/spec/controller_spec.rb +0 -182
- data/spec/rails3/spec/spec.opts +0 -2
- data/spec/rails3/spec/spec_helper.orig.rb +0 -27
- data/spec/rails3/spec/spec_helper.rb +0 -71
- data/spec/rails3/spec/user_activation_spec.rb +0 -16
- data/spec/rails3/spec/user_activity_logging_spec.rb +0 -8
- data/spec/rails3/spec/user_spec.rb +0 -36
- data/spec/rails3/vendor/plugins/.gitkeep +0 -0
- data/spec/rails3_mongo_mapper/.gitignore +0 -4
- data/spec/rails3_mongo_mapper/.rspec +0 -1
- data/spec/rails3_mongo_mapper/Gemfile +0 -16
- data/spec/rails3_mongo_mapper/Gemfile.lock +0 -156
- data/spec/rails3_mongo_mapper/Rakefile +0 -11
- data/spec/rails3_mongo_mapper/app/controllers/application_controller.rb +0 -122
- data/spec/rails3_mongo_mapper/app/helpers/application_helper.rb +0 -2
- data/spec/rails3_mongo_mapper/app/mailers/sorcery_mailer.rb +0 -25
- data/spec/rails3_mongo_mapper/app/views/layouts/application.html.erb +0 -14
- data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_email.html.erb +0 -17
- data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_email.text.erb +0 -9
- data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
- data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
- data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
- data/spec/rails3_mongo_mapper/config/boot.rb +0 -13
- data/spec/rails3_mongo_mapper/config/environment.rb +0 -5
- data/spec/rails3_mongo_mapper/config/environments/development.rb +0 -30
- data/spec/rails3_mongo_mapper/config/environments/in_memory.rb +0 -0
- data/spec/rails3_mongo_mapper/config/environments/production.rb +0 -49
- data/spec/rails3_mongo_mapper/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/rails3_mongo_mapper/config/initializers/inflections.rb +0 -10
- data/spec/rails3_mongo_mapper/config/initializers/mime_types.rb +0 -5
- data/spec/rails3_mongo_mapper/config/initializers/mongo.rb +0 -2
- data/spec/rails3_mongo_mapper/config/initializers/secret_token.rb +0 -7
- data/spec/rails3_mongo_mapper/config/initializers/session_store.rb +0 -8
- data/spec/rails3_mongo_mapper/config/locales/en.yml +0 -5
- data/spec/rails3_mongo_mapper/config/routes.rb +0 -59
- data/spec/rails3_mongo_mapper/db/schema.rb +0 -23
- data/spec/rails3_mongo_mapper/db/seeds.rb +0 -7
- data/spec/rails3_mongo_mapper/lib/tasks/.gitkeep +0 -0
- data/spec/rails3_mongo_mapper/public/404.html +0 -26
- data/spec/rails3_mongo_mapper/public/422.html +0 -26
- data/spec/rails3_mongo_mapper/public/500.html +0 -26
- data/spec/rails3_mongo_mapper/public/favicon.ico +0 -0
- data/spec/rails3_mongo_mapper/public/images/rails.png +0 -0
- data/spec/rails3_mongo_mapper/public/javascripts/application.js +0 -2
- data/spec/rails3_mongo_mapper/public/javascripts/controls.js +0 -965
- data/spec/rails3_mongo_mapper/public/javascripts/dragdrop.js +0 -974
- data/spec/rails3_mongo_mapper/public/javascripts/effects.js +0 -1123
- data/spec/rails3_mongo_mapper/public/javascripts/prototype.js +0 -6001
- data/spec/rails3_mongo_mapper/public/javascripts/rails.js +0 -175
- data/spec/rails3_mongo_mapper/public/robots.txt +0 -5
- data/spec/rails3_mongo_mapper/public/stylesheets/.gitkeep +0 -0
- data/spec/rails3_mongo_mapper/script/rails +0 -6
- data/spec/rails3_mongo_mapper/spec/controller_spec.rb +0 -175
- data/spec/rails3_mongo_mapper/spec/spec.opts +0 -2
- data/spec/rails3_mongo_mapper/spec/spec_helper.orig.rb +0 -27
- data/spec/rails3_mongo_mapper/spec/spec_helper.rb +0 -55
- data/spec/rails3_mongo_mapper/spec/user_activation_spec.rb +0 -9
- data/spec/rails3_mongo_mapper/spec/user_activity_logging_spec.rb +0 -8
- data/spec/rails3_mongo_mapper/spec/user_brute_force_protection_spec.rb +0 -8
- data/spec/rails3_mongo_mapper/spec/user_oauth_spec.rb +0 -8
- data/spec/rails3_mongo_mapper/spec/user_remember_me_spec.rb +0 -8
- data/spec/rails3_mongo_mapper/spec/user_reset_password_spec.rb +0 -8
- data/spec/rails3_mongo_mapper/spec/user_spec.rb +0 -37
- data/spec/rails3_mongo_mapper/vendor/plugins/.gitkeep +0 -0
- data/spec/rails3_mongoid/.gitignore +0 -4
- data/spec/rails3_mongoid/.rspec +0 -1
- data/spec/rails3_mongoid/Gemfile +0 -15
- data/spec/rails3_mongoid/Gemfile.lock +0 -146
- data/spec/rails3_mongoid/Rakefile +0 -11
- data/spec/rails3_mongoid/app/controllers/application_controller.rb +0 -127
- data/spec/rails3_mongoid/app/helpers/application_helper.rb +0 -2
- data/spec/rails3_mongoid/app/mailers/sorcery_mailer.rb +0 -25
- data/spec/rails3_mongoid/app/views/layouts/application.html.erb +0 -14
- data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_email.html.erb +0 -17
- data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_email.text.erb +0 -9
- data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_success_email.html.erb +0 -17
- data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
- data/spec/rails3_mongoid/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
- data/spec/rails3_mongoid/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
- data/spec/rails3_mongoid/config/application.rb +0 -51
- data/spec/rails3_mongoid/config/boot.rb +0 -13
- data/spec/rails3_mongoid/config/environment.rb +0 -5
- data/spec/rails3_mongoid/config/environments/development.rb +0 -26
- data/spec/rails3_mongoid/config/environments/in_memory.rb +0 -0
- data/spec/rails3_mongoid/config/environments/production.rb +0 -49
- data/spec/rails3_mongoid/config/environments/test.rb +0 -35
- data/spec/rails3_mongoid/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/rails3_mongoid/config/initializers/inflections.rb +0 -10
- data/spec/rails3_mongoid/config/initializers/mime_types.rb +0 -5
- data/spec/rails3_mongoid/config/initializers/secret_token.rb +0 -7
- data/spec/rails3_mongoid/config/locales/en.yml +0 -5
- data/spec/rails3_mongoid/config/mongoid.yml +0 -7
- data/spec/rails3_mongoid/config/routes.rb +0 -59
- data/spec/rails3_mongoid/config.ru +0 -4
- data/spec/rails3_mongoid/db/schema.rb +0 -23
- data/spec/rails3_mongoid/db/seeds.rb +0 -7
- data/spec/rails3_mongoid/lib/tasks/.gitkeep +0 -0
- data/spec/rails3_mongoid/public/404.html +0 -26
- data/spec/rails3_mongoid/public/422.html +0 -26
- data/spec/rails3_mongoid/public/500.html +0 -26
- data/spec/rails3_mongoid/public/favicon.ico +0 -0
- data/spec/rails3_mongoid/public/images/rails.png +0 -0
- data/spec/rails3_mongoid/public/javascripts/application.js +0 -2
- data/spec/rails3_mongoid/public/javascripts/controls.js +0 -965
- data/spec/rails3_mongoid/public/javascripts/dragdrop.js +0 -974
- data/spec/rails3_mongoid/public/javascripts/effects.js +0 -1123
- data/spec/rails3_mongoid/public/javascripts/prototype.js +0 -6001
- data/spec/rails3_mongoid/public/javascripts/rails.js +0 -175
- data/spec/rails3_mongoid/public/robots.txt +0 -5
- data/spec/rails3_mongoid/public/stylesheets/.gitkeep +0 -0
- data/spec/rails3_mongoid/script/rails +0 -6
- data/spec/rails3_mongoid/spec/controller_activity_logging_spec.rb +0 -111
- data/spec/rails3_mongoid/spec/controller_spec.rb +0 -186
- data/spec/rails3_mongoid/spec/spec.opts +0 -2
- data/spec/rails3_mongoid/spec/spec_helper.orig.rb +0 -27
- data/spec/rails3_mongoid/spec/spec_helper.rb +0 -55
- data/spec/rails3_mongoid/spec/user_activation_spec.rb +0 -9
- data/spec/rails3_mongoid/spec/user_activity_logging_spec.rb +0 -8
- data/spec/rails3_mongoid/spec/user_brute_force_protection_spec.rb +0 -8
- data/spec/rails3_mongoid/spec/user_oauth_spec.rb +0 -8
- data/spec/rails3_mongoid/spec/user_remember_me_spec.rb +0 -8
- data/spec/rails3_mongoid/spec/user_reset_password_spec.rb +0 -8
- data/spec/rails3_mongoid/spec/user_spec.rb +0 -38
- data/spec/rails3_mongoid/vendor/plugins/.gitkeep +0 -0
- /data/lib/sorcery/{controller/submodules/external/protocols → protocols}/certs/ca-bundle.crt +0 -0
- /data/spec/{rails3/app/models → rails_app/app/active_record}/authentication.rb +0 -0
- /data/spec/{rails3 → rails_app}/app/helpers/application_helper.rb +0 -0
- /data/spec/{rails3 → rails_app}/app/mailers/sorcery_mailer.rb +0 -0
- /data/spec/{rails3_mongo_mapper/app/models → rails_app/app/mongo_mapper}/authentication.rb +0 -0
- /data/spec/{rails3_mongo_mapper/app/models → rails_app/app/mongo_mapper}/user.rb +0 -0
- /data/spec/{rails3_mongoid/app/models → rails_app/app/mongoid}/authentication.rb +0 -0
- /data/spec/{rails3 → rails_app}/app/views/application/index.html.erb +0 -0
- /data/spec/{rails3 → rails_app}/app/views/layouts/application.html.erb +0 -0
- /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_email.html.erb +0 -0
- /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_email.text.erb +0 -0
- /data/spec/{rails3/app/views/sorcery_mailer/activation_success_email.html.erb → rails_app/app/views/sorcery_mailer/activation_needed_email.html.erb} +0 -0
- /data/spec/{rails3_mongo_mapper → rails_app}/app/views/sorcery_mailer/activation_success_email.html.erb +0 -0
- /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_success_email.text.erb +0 -0
- /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/reset_password_email.html.erb +0 -0
- /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/reset_password_email.text.erb +0 -0
- /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -0
- /data/spec/{rails3 → rails_app}/config/environment.rb +0 -0
- /data/spec/{rails3 → rails_app}/config/initializers/backtrace_silencers.rb +0 -0
- /data/spec/{rails3 → rails_app}/config/initializers/inflections.rb +0 -0
- /data/spec/{rails3 → rails_app}/config/initializers/mime_types.rb +0 -0
- /data/spec/{rails3 → rails_app}/config/initializers/secret_token.rb +0 -0
- /data/spec/{rails3 → rails_app}/config/locales/en.yml +0 -0
- /data/spec/{rails3 → rails_app}/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -0
- /data/spec/{rails3 → rails_app}/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -0
- /data/spec/{rails3 → rails_app}/db/migrate/core/20101224223620_create_users.rb +0 -0
- /data/spec/{rails3 → rails_app}/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -0
- /data/spec/{rails3 → rails_app}/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -0
- /data/spec/{rails3 → rails_app}/db/schema.rb +0 -0
- /data/spec/{rails3 → rails_app}/db/seeds.rb +0 -0
- /data/spec/{rails3 → rails_app}/public/404.html +0 -0
- /data/spec/{rails3 → rails_app}/public/422.html +0 -0
- /data/spec/{rails3 → rails_app}/public/500.html +0 -0
- /data/spec/{rails3 → rails_app}/public/favicon.ico +0 -0
- /data/spec/{rails3 → rails_app}/public/images/rails.png +0 -0
- /data/spec/{rails3 → rails_app}/public/javascripts/application.js +0 -0
- /data/spec/{rails3 → rails_app}/public/javascripts/controls.js +0 -0
- /data/spec/{rails3 → rails_app}/public/javascripts/dragdrop.js +0 -0
- /data/spec/{rails3 → rails_app}/public/javascripts/effects.js +0 -0
- /data/spec/{rails3 → rails_app}/public/javascripts/prototype.js +0 -0
- /data/spec/{rails3 → rails_app}/public/javascripts/rails.js +0 -0
- /data/spec/{rails3 → rails_app}/public/robots.txt +0 -0
- /data/spec/{rails3/lib/tasks → rails_app/public/stylesheets}/.gitkeep +0 -0
|
@@ -9,14 +9,14 @@ module Sorcery
|
|
|
9
9
|
# he will be able to reset his password via a form.
|
|
10
10
|
#
|
|
11
11
|
# When using this submodule, supplying a mailer is mandatory.
|
|
12
|
-
module ResetPassword
|
|
12
|
+
module ResetPassword
|
|
13
13
|
def self.included(base)
|
|
14
14
|
base.sorcery_config.class_eval do
|
|
15
15
|
attr_accessor :reset_password_token_attribute_name, # reset password code attribute name.
|
|
16
16
|
:reset_password_token_expires_at_attribute_name, # expires at attribute name.
|
|
17
17
|
:reset_password_email_sent_at_attribute_name, # when was email sent, used for hammering
|
|
18
18
|
# protection.
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
:reset_password_mailer, # mailer class. Needed.
|
|
21
21
|
|
|
22
22
|
:reset_password_mailer_disabled, # when true sorcery will not automatically
|
|
@@ -25,15 +25,15 @@ module Sorcery
|
|
|
25
25
|
|
|
26
26
|
:reset_password_email_method_name, # reset password email method on your
|
|
27
27
|
# mailer class.
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
:reset_password_expiration_period, # how many seconds before the reset request
|
|
30
30
|
# expires. nil for never expires.
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
:reset_password_time_between_emails # hammering protection, how long to wait
|
|
33
33
|
# before allowing another email to be sent.
|
|
34
34
|
|
|
35
35
|
end
|
|
36
|
-
|
|
36
|
+
|
|
37
37
|
base.sorcery_config.instance_eval do
|
|
38
38
|
@defaults.merge!(:@reset_password_token_attribute_name => :reset_password_token,
|
|
39
39
|
:@reset_password_token_expires_at_attribute_name => :reset_password_token_expires_at,
|
|
@@ -54,11 +54,14 @@ module Sorcery
|
|
|
54
54
|
if defined?(MongoMapper) and base.ancestors.include?(MongoMapper::Document)
|
|
55
55
|
base.sorcery_config.after_config << :define_reset_password_mongo_mapper_fields
|
|
56
56
|
end
|
|
57
|
+
if defined?(DataMapper) and base.ancestors.include?(DataMapper::Resource)
|
|
58
|
+
base.sorcery_config.after_config << :define_reset_password_datamapper_fields
|
|
59
|
+
end
|
|
57
60
|
|
|
58
61
|
base.send(:include, InstanceMethods)
|
|
59
62
|
|
|
60
63
|
end
|
|
61
|
-
|
|
64
|
+
|
|
62
65
|
module ClassMethods
|
|
63
66
|
# Find user by token, also checks for expiration.
|
|
64
67
|
# Returns the user if token found and is valid.
|
|
@@ -67,9 +70,9 @@ module Sorcery
|
|
|
67
70
|
token_expiration_date_attr = @sorcery_config.reset_password_token_expires_at_attribute_name
|
|
68
71
|
load_from_token(token, token_attr_name, token_expiration_date_attr)
|
|
69
72
|
end
|
|
70
|
-
|
|
73
|
+
|
|
71
74
|
protected
|
|
72
|
-
|
|
75
|
+
|
|
73
76
|
# This submodule requires the developer to define his own mailer class to be used by it
|
|
74
77
|
# when reset_password_mailer_disabled is false
|
|
75
78
|
def validate_mailer_defined
|
|
@@ -82,14 +85,28 @@ module Sorcery
|
|
|
82
85
|
field sorcery_config.reset_password_token_expires_at_attribute_name, :type => Time
|
|
83
86
|
field sorcery_config.reset_password_email_sent_at_attribute_name, :type => Time
|
|
84
87
|
end
|
|
85
|
-
|
|
88
|
+
|
|
86
89
|
def define_reset_password_mongo_mapper_fields
|
|
87
90
|
key sorcery_config.reset_password_token_attribute_name, String
|
|
88
91
|
key sorcery_config.reset_password_token_expires_at_attribute_name, Time
|
|
89
92
|
key sorcery_config.reset_password_email_sent_at_attribute_name, Time
|
|
90
93
|
end
|
|
94
|
+
|
|
95
|
+
def define_reset_password_datamapper_fields
|
|
96
|
+
property sorcery_config.reset_password_token_attribute_name, String
|
|
97
|
+
property sorcery_config.reset_password_token_expires_at_attribute_name, Time
|
|
98
|
+
property sorcery_config.reset_password_email_sent_at_attribute_name, Time
|
|
99
|
+
[sorcery_config.reset_password_token_expires_at_attribute_name,
|
|
100
|
+
sorcery_config.reset_password_email_sent_at_attribute_name].each do |sym|
|
|
101
|
+
alias_method "orig_#{sym}", sym
|
|
102
|
+
define_method(sym) do
|
|
103
|
+
t = send("orig_#{sym}")
|
|
104
|
+
t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
91
108
|
end
|
|
92
|
-
|
|
109
|
+
|
|
93
110
|
module InstanceMethods
|
|
94
111
|
# generates a reset code with expiration and sends an email to the user.
|
|
95
112
|
def deliver_reset_password_instructions!
|
|
@@ -101,18 +118,22 @@ module Sorcery
|
|
|
101
118
|
attributes[config.reset_password_token_expires_at_attribute_name] = Time.now.in_time_zone + config.reset_password_expiration_period if config.reset_password_expiration_period
|
|
102
119
|
self.class.transaction do
|
|
103
120
|
self.update_many_attributes(attributes)
|
|
104
|
-
|
|
121
|
+
send_reset_password_email! unless sorcery_config.reset_password_mailer_disabled
|
|
105
122
|
end
|
|
106
123
|
end
|
|
107
|
-
|
|
124
|
+
|
|
108
125
|
# Clears token and tries to update the new password for the user.
|
|
109
126
|
def change_password!(new_password)
|
|
110
127
|
clear_reset_password_token
|
|
111
128
|
self.send(:"#{sorcery_config.password_attribute_name}=", new_password)
|
|
112
|
-
|
|
129
|
+
sorcery_save
|
|
113
130
|
end
|
|
114
131
|
|
|
115
132
|
protected
|
|
133
|
+
|
|
134
|
+
def send_reset_password_email!
|
|
135
|
+
generic_send_email(:reset_password_email_method_name, :reset_password_mailer)
|
|
136
|
+
end
|
|
116
137
|
|
|
117
138
|
# Clears the token.
|
|
118
139
|
def clear_reset_password_token
|
|
@@ -121,7 +142,7 @@ module Sorcery
|
|
|
121
142
|
self.send(:"#{config.reset_password_token_expires_at_attribute_name}=", nil) if config.reset_password_expiration_period
|
|
122
143
|
end
|
|
123
144
|
end
|
|
124
|
-
|
|
145
|
+
|
|
125
146
|
end
|
|
126
147
|
end
|
|
127
148
|
end
|
|
@@ -10,16 +10,16 @@ module Sorcery
|
|
|
10
10
|
base.sorcery_config.class_eval do
|
|
11
11
|
attr_accessor :activation_state_attribute_name, # the attribute name to hold activation state
|
|
12
12
|
# (active/pending).
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
:activation_token_attribute_name, # the attribute name to hold activation code
|
|
15
15
|
# (sent by email).
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
:activation_token_expires_at_attribute_name, # the attribute name to hold activation code
|
|
18
18
|
# expiration date.
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
:activation_token_expiration_period, # how many seconds before the activation code
|
|
21
21
|
# expires. nil for never expires.
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
:user_activation_mailer, # your mailer class. Required when
|
|
24
24
|
# activation_mailer_disabled == false.
|
|
25
25
|
|
|
@@ -29,14 +29,14 @@ module Sorcery
|
|
|
29
29
|
|
|
30
30
|
:activation_needed_email_method_name, # activation needed email method on your
|
|
31
31
|
# mailer class.
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
:activation_success_email_method_name, # activation success email method on your
|
|
34
34
|
# mailer class.
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
:prevent_non_active_users_to_login # do you want to prevent or allow users that
|
|
37
37
|
# did not activate by email to login?
|
|
38
38
|
end
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
base.sorcery_config.instance_eval do
|
|
41
41
|
@defaults.merge!(:@activation_state_attribute_name => :activation_state,
|
|
42
42
|
:@activation_token_attribute_name => :activation_token,
|
|
@@ -49,27 +49,43 @@ module Sorcery
|
|
|
49
49
|
:@prevent_non_active_users_to_login => true)
|
|
50
50
|
reset!
|
|
51
51
|
end
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
base.class_eval do
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
if defined?(DataMapper) && self.ancestors.include?(DataMapper::Resource)
|
|
55
|
+
before :valid? do
|
|
56
|
+
if self.send(sorcery_config.password_attribute_name).present?
|
|
57
|
+
setup_activation
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
after :create do
|
|
61
|
+
if send_activation_needed_email?
|
|
62
|
+
send_activation_needed_email!
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
else
|
|
66
|
+
# don't setup activation if no password supplied - this user is created automatically
|
|
67
|
+
before_create :setup_activation, :if => Proc.new { |user| user.send(sorcery_config.password_attribute_name).present? }
|
|
68
|
+
# don't send activation needed email if no crypted password created - this user is external (OAuth etc.)
|
|
69
|
+
after_create :send_activation_needed_email!, :if => :send_activation_needed_email?
|
|
70
|
+
end
|
|
58
71
|
end
|
|
59
|
-
|
|
72
|
+
|
|
60
73
|
base.sorcery_config.after_config << :validate_mailer_defined
|
|
61
74
|
base.sorcery_config.after_config << :define_user_activation_mongoid_fields if defined?(Mongoid) and base.ancestors.include?(Mongoid::Document)
|
|
62
75
|
if defined?(MongoMapper) and base.ancestors.include?(MongoMapper::Document)
|
|
63
76
|
base.sorcery_config.after_config << :define_user_activation_mongo_mapper_fields
|
|
64
77
|
end
|
|
78
|
+
if defined?(DataMapper) and base.ancestors.include?(DataMapper::Resource)
|
|
79
|
+
base.sorcery_config.after_config << :define_user_activation_datamapper_fields
|
|
80
|
+
end
|
|
65
81
|
base.sorcery_config.before_authenticate << :prevent_non_active_login
|
|
66
|
-
|
|
82
|
+
|
|
67
83
|
base.extend(ClassMethods)
|
|
68
84
|
base.send(:include, InstanceMethods)
|
|
69
85
|
|
|
70
86
|
|
|
71
87
|
end
|
|
72
|
-
|
|
88
|
+
|
|
73
89
|
module ClassMethods
|
|
74
90
|
# Find user by token, also checks for expiration.
|
|
75
91
|
# Returns the user if token found and is valid.
|
|
@@ -78,9 +94,9 @@ module Sorcery
|
|
|
78
94
|
token_expiration_date_attr = @sorcery_config.activation_token_expires_at_attribute_name
|
|
79
95
|
load_from_token(token, token_attr_name, token_expiration_date_attr)
|
|
80
96
|
end
|
|
81
|
-
|
|
97
|
+
|
|
82
98
|
protected
|
|
83
|
-
|
|
99
|
+
|
|
84
100
|
# This submodule requires the developer to define his own mailer class to be used by it
|
|
85
101
|
# when activation_mailer_disabled is false
|
|
86
102
|
def validate_mailer_defined
|
|
@@ -103,18 +119,33 @@ module Sorcery
|
|
|
103
119
|
key sorcery_config.activation_token_expires_at_attribute_name, Time
|
|
104
120
|
end
|
|
105
121
|
end
|
|
122
|
+
|
|
123
|
+
def define_user_activation_datamapper_fields
|
|
124
|
+
self.class_eval do
|
|
125
|
+
property sorcery_config.activation_state_attribute_name, String
|
|
126
|
+
property sorcery_config.activation_token_attribute_name, String
|
|
127
|
+
property sorcery_config.activation_token_expires_at_attribute_name, Time
|
|
128
|
+
[sorcery_config.activation_token_expires_at_attribute_name].each do |sym|
|
|
129
|
+
alias_method "orig_#{sym}", sym
|
|
130
|
+
define_method(sym) do
|
|
131
|
+
t = send("orig_#{sym}")
|
|
132
|
+
t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
106
137
|
end
|
|
107
|
-
|
|
138
|
+
|
|
108
139
|
module InstanceMethods
|
|
109
140
|
# clears activation code, sets the user as 'active' and optionaly sends a success email.
|
|
110
141
|
def activate!
|
|
111
142
|
config = sorcery_config
|
|
112
143
|
self.send(:"#{config.activation_token_attribute_name}=", nil)
|
|
113
144
|
self.send(:"#{config.activation_state_attribute_name}=", "active")
|
|
114
|
-
send_activation_success_email!
|
|
115
|
-
|
|
145
|
+
send_activation_success_email! if send_activation_success_email?
|
|
146
|
+
sorcery_save(:validate => false, :raise_on_failure => true)
|
|
116
147
|
end
|
|
117
|
-
|
|
148
|
+
|
|
118
149
|
protected
|
|
119
150
|
|
|
120
151
|
def setup_activation
|
|
@@ -127,13 +158,27 @@ module Sorcery
|
|
|
127
158
|
|
|
128
159
|
# called automatically after user initial creation.
|
|
129
160
|
def send_activation_needed_email!
|
|
130
|
-
generic_send_email(:activation_needed_email_method_name, :user_activation_mailer)
|
|
161
|
+
generic_send_email(:activation_needed_email_method_name, :user_activation_mailer)
|
|
131
162
|
end
|
|
132
163
|
|
|
133
164
|
def send_activation_success_email!
|
|
134
|
-
generic_send_email(:activation_success_email_method_name, :user_activation_mailer)
|
|
165
|
+
generic_send_email(:activation_success_email_method_name, :user_activation_mailer)
|
|
135
166
|
end
|
|
136
167
|
|
|
168
|
+
def send_activation_success_email?
|
|
169
|
+
!external? && (
|
|
170
|
+
!(sorcery_config.activation_success_email_method_name.nil? ||
|
|
171
|
+
sorcery_config.activation_mailer_disabled == true)
|
|
172
|
+
)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def send_activation_needed_email?
|
|
176
|
+
!external? && (
|
|
177
|
+
!(sorcery_config.activation_needed_email_method_name.nil? ||
|
|
178
|
+
sorcery_config.activation_mailer_disabled == true)
|
|
179
|
+
)
|
|
180
|
+
end
|
|
181
|
+
|
|
137
182
|
def prevent_non_active_login
|
|
138
183
|
config = sorcery_config
|
|
139
184
|
config.prevent_non_active_users_to_login ? self.send(config.activation_state_attribute_name) == "active" : true
|
|
@@ -143,4 +188,4 @@ module Sorcery
|
|
|
143
188
|
end
|
|
144
189
|
end
|
|
145
190
|
end
|
|
146
|
-
end
|
|
191
|
+
end
|
data/lib/sorcery/model.rb
CHANGED
|
@@ -7,86 +7,114 @@ module Sorcery
|
|
|
7
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
|
-
def
|
|
11
|
-
|
|
12
|
-
class << self
|
|
13
|
-
def authenticates_with_sorcery!
|
|
14
|
-
@sorcery_config = Config.new
|
|
15
|
-
self.class_eval do
|
|
16
|
-
extend ClassMethods # included here, before submodules, so they can be overriden by them.
|
|
17
|
-
include InstanceMethods
|
|
18
|
-
include TemporaryToken
|
|
19
|
-
end
|
|
10
|
+
def authenticates_with_sorcery!
|
|
11
|
+
@sorcery_config = Config.new
|
|
20
12
|
|
|
21
|
-
|
|
13
|
+
extend ClassMethods # included here, before submodules, so they can be overriden by them.
|
|
14
|
+
include InstanceMethods
|
|
15
|
+
include TemporaryToken
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
::Sorcery::Controller::Config.user_config.tap{|blk| blk.call(@sorcery_config) if blk}
|
|
17
|
+
include_required_submodules!
|
|
25
18
|
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
# This runs the options block set in the initializer on the model class.
|
|
20
|
+
::Sorcery::Controller::Config.user_config.tap{|blk| blk.call(@sorcery_config) if blk}
|
|
28
21
|
|
|
29
|
-
|
|
22
|
+
init_mongoid_support! if defined?(Mongoid) and self.ancestors.include?(Mongoid::Document)
|
|
23
|
+
init_mongo_mapper_support! if defined?(MongoMapper) and self.ancestors.include?(MongoMapper::Document)
|
|
24
|
+
init_datamapper_support! if defined?(DataMapper) and self.ancestors.include?(DataMapper::Resource)
|
|
30
25
|
|
|
31
|
-
|
|
32
|
-
@sorcery_config.after_config.each { |c| send(c) }
|
|
33
|
-
end
|
|
26
|
+
init_orm_hooks!
|
|
34
27
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
# which usually is called User.
|
|
39
|
-
def include_required_submodules!
|
|
40
|
-
self.class_eval do
|
|
41
|
-
@sorcery_config.submodules = ::Sorcery::Controller::Config.submodules
|
|
42
|
-
@sorcery_config.submodules.each do |mod|
|
|
43
|
-
begin
|
|
44
|
-
include Submodules.const_get(mod.to_s.split("_").map {|p| p.capitalize}.join(""))
|
|
45
|
-
rescue NameError
|
|
46
|
-
# don't stop on a missing submodule. Needed because some submodules are only defined
|
|
47
|
-
# in the controller side.
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
28
|
+
@sorcery_config.after_config << :add_config_inheritance if @sorcery_config.subclasses_inherit_config
|
|
29
|
+
@sorcery_config.after_config.each { |c| send(c) }
|
|
30
|
+
end
|
|
52
31
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
32
|
+
protected
|
|
33
|
+
|
|
34
|
+
# includes required submodules into the model class,
|
|
35
|
+
# which usually is called User.
|
|
36
|
+
def include_required_submodules!
|
|
37
|
+
self.class_eval do
|
|
38
|
+
@sorcery_config.submodules = ::Sorcery::Controller::Config.submodules
|
|
39
|
+
@sorcery_config.submodules.each do |mod|
|
|
40
|
+
begin
|
|
41
|
+
include Submodules.const_get(mod.to_s.split('_').map {|p| p.capitalize}.join)
|
|
42
|
+
rescue NameError
|
|
43
|
+
# don't stop on a missing submodule. Needed because some submodules are only defined
|
|
44
|
+
# in the controller side.
|
|
64
45
|
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
65
49
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
50
|
+
# defines mongoid fields on the model class,
|
|
51
|
+
# using 1.8.x hash syntax to perserve compatibility.
|
|
52
|
+
def init_mongoid_support!
|
|
53
|
+
self.class_eval do
|
|
54
|
+
sorcery_config.username_attribute_names.each do |username|
|
|
55
|
+
field username, :type => String
|
|
56
|
+
end
|
|
57
|
+
field sorcery_config.email_attribute_name, :type => String unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
|
|
58
|
+
field sorcery_config.crypted_password_attribute_name, :type => String
|
|
59
|
+
field sorcery_config.salt_attribute_name, :type => String
|
|
60
|
+
end
|
|
61
|
+
end
|
|
77
62
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
63
|
+
# defines mongo_mapper fields on the model class,
|
|
64
|
+
def init_mongo_mapper_support!
|
|
65
|
+
self.class_eval do
|
|
66
|
+
sorcery_config.username_attribute_names.each do |username|
|
|
67
|
+
key username, String
|
|
68
|
+
end
|
|
69
|
+
key sorcery_config.email_attribute_name, String unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
|
|
70
|
+
key sorcery_config.crypted_password_attribute_name, String
|
|
71
|
+
key sorcery_config.salt_attribute_name, String
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# defines datamapper fields on the model class
|
|
76
|
+
def init_datamapper_support!
|
|
77
|
+
self.class_eval do
|
|
78
|
+
sorcery_config.username_attribute_names.each do |username|
|
|
79
|
+
property username, String, :length => 255
|
|
80
|
+
end
|
|
81
|
+
unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
|
|
82
|
+
property sorcery_config.email_attribute_name, String, :length => 255
|
|
83
|
+
end
|
|
84
|
+
property sorcery_config.crypted_password_attribute_name, String, :length => 255
|
|
85
|
+
property sorcery_config.salt_attribute_name, String, :length => 255
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# add virtual password accessor and ORM callbacks.
|
|
90
|
+
def init_orm_hooks!
|
|
91
|
+
if defined?(DataMapper) and self.ancestors.include?(DataMapper::Resource)
|
|
92
|
+
init_datamapper_hooks!
|
|
93
|
+
return
|
|
94
|
+
end
|
|
95
|
+
self.class_eval do
|
|
96
|
+
attr_accessor @sorcery_config.password_attribute_name
|
|
97
|
+
#attr_protected @sorcery_config.crypted_password_attribute_name, @sorcery_config.salt_attribute_name
|
|
98
|
+
before_save :encrypt_password, :if => Proc.new { |record|
|
|
99
|
+
record.send(sorcery_config.password_attribute_name).present?
|
|
100
|
+
}
|
|
101
|
+
after_save :clear_virtual_password, :if => Proc.new { |record|
|
|
102
|
+
record.send(sorcery_config.password_attribute_name).present?
|
|
103
|
+
}
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def init_datamapper_hooks!
|
|
108
|
+
self.class_eval do
|
|
109
|
+
attr_accessor @sorcery_config.password_attribute_name
|
|
110
|
+
before :valid? do
|
|
111
|
+
if self.send(sorcery_config.password_attribute_name).present?
|
|
112
|
+
encrypt_password
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
after :save do
|
|
116
|
+
if self.send(sorcery_config.password_attribute_name).present?
|
|
117
|
+
clear_virtual_password
|
|
90
118
|
end
|
|
91
119
|
end
|
|
92
120
|
end
|
|
@@ -104,10 +132,16 @@ module Sorcery
|
|
|
104
132
|
# returns the user if success, nil otherwise.
|
|
105
133
|
def authenticate(*credentials)
|
|
106
134
|
raise ArgumentError, "at least 2 arguments required" if credentials.size < 2
|
|
107
|
-
|
|
135
|
+
|
|
136
|
+
return false if credentials[0].blank?
|
|
137
|
+
|
|
138
|
+
if @sorcery_config.downcase_username_before_authenticating
|
|
139
|
+
credentials[0].downcase!
|
|
140
|
+
end
|
|
141
|
+
|
|
108
142
|
user = find_by_credentials(credentials)
|
|
109
143
|
|
|
110
|
-
set_encryption_attributes
|
|
144
|
+
set_encryption_attributes
|
|
111
145
|
|
|
112
146
|
_salt = user.send(@sorcery_config.salt_attribute_name) if user && !@sorcery_config.salt_attribute_name.nil? && !@sorcery_config.encryption_provider.nil?
|
|
113
147
|
user if user && @sorcery_config.before_authenticate.all? {|c| user.send(c)} && credentials_match?(user.send(@sorcery_config.crypted_password_attribute_name),credentials[1],_salt)
|
|
@@ -177,6 +211,10 @@ module Sorcery
|
|
|
177
211
|
def clear_virtual_password
|
|
178
212
|
config = sorcery_config
|
|
179
213
|
self.send(:"#{config.password_attribute_name}=", nil)
|
|
214
|
+
|
|
215
|
+
if respond_to?(:"#{config.password_attribute_name}_confirmation=")
|
|
216
|
+
self.send(:"#{config.password_attribute_name}_confirmation=", nil)
|
|
217
|
+
end
|
|
180
218
|
end
|
|
181
219
|
|
|
182
220
|
# calls the requested email method on the configured mailer
|
|
@@ -230,7 +268,7 @@ module Sorcery
|
|
|
230
268
|
def initialize
|
|
231
269
|
@defaults = {
|
|
232
270
|
:@submodules => [],
|
|
233
|
-
:@username_attribute_names => [:
|
|
271
|
+
:@username_attribute_names => [:email],
|
|
234
272
|
:@password_attribute_name => :password,
|
|
235
273
|
:@downcase_username_before_authenticating => false,
|
|
236
274
|
:@email_attribute_name => :email,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'oauth'
|
|
2
|
+
|
|
3
|
+
module Sorcery
|
|
4
|
+
module Protocols
|
|
5
|
+
module Oauth
|
|
6
|
+
|
|
7
|
+
def oauth_version
|
|
8
|
+
'1.0'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def get_request_token(token=nil,secret=nil)
|
|
12
|
+
return ::OAuth::RequestToken.new(get_consumer, token, secret) if token && secret
|
|
13
|
+
get_consumer.get_request_token(oauth_callback: @callback_url)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def authorize_url(args)
|
|
17
|
+
get_request_token(
|
|
18
|
+
args[:request_token],
|
|
19
|
+
args[:request_token_secret]
|
|
20
|
+
).authorize_url({
|
|
21
|
+
oauth_callback: @callback_url
|
|
22
|
+
})
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def get_access_token(args)
|
|
26
|
+
get_request_token(
|
|
27
|
+
args[:request_token],
|
|
28
|
+
args[:request_token_secret]
|
|
29
|
+
).get_access_token({
|
|
30
|
+
oauth_verifier: args[:oauth_verifier]
|
|
31
|
+
})
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
protected
|
|
35
|
+
|
|
36
|
+
def get_consumer
|
|
37
|
+
::OAuth::Consumer.new(@key, @secret, site: @site)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'oauth2'
|
|
2
|
+
|
|
3
|
+
module Sorcery
|
|
4
|
+
module Protocols
|
|
5
|
+
module Oauth2
|
|
6
|
+
|
|
7
|
+
def oauth_version
|
|
8
|
+
'2.0'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def authorize_url(options = {})
|
|
12
|
+
client = build_client(options)
|
|
13
|
+
client.auth_code.authorize_url(
|
|
14
|
+
redirect_uri: @callback_url,
|
|
15
|
+
scope: @scope,
|
|
16
|
+
display: @display,
|
|
17
|
+
state: @state
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def get_access_token(args, options = {})
|
|
22
|
+
client = build_client(options)
|
|
23
|
+
client.auth_code.get_token(
|
|
24
|
+
args[:code],
|
|
25
|
+
{
|
|
26
|
+
redirect_uri: @callback_url,
|
|
27
|
+
parse: options.delete(:parse)
|
|
28
|
+
},
|
|
29
|
+
options
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def build_client(options = {})
|
|
34
|
+
defaults = {
|
|
35
|
+
site: @site,
|
|
36
|
+
ssl: { ca_file: Sorcery::Controller::Config.ca_file }
|
|
37
|
+
}
|
|
38
|
+
::OAuth2::Client.new(
|
|
39
|
+
@key,
|
|
40
|
+
@secret,
|
|
41
|
+
defaults.merge!(options)
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Sorcery
|
|
2
|
+
module Providers
|
|
3
|
+
class Base
|
|
4
|
+
|
|
5
|
+
attr_reader :access_token
|
|
6
|
+
|
|
7
|
+
attr_accessor :callback_url, :key, :original_callback_url, :secret,
|
|
8
|
+
:site, :state, :user_info_mapping
|
|
9
|
+
|
|
10
|
+
def has_callback?; true; end
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
@user_info_mapping = {}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.name
|
|
17
|
+
super.gsub(/Sorcery::Providers::/, '').downcase
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Ensure that all descendant classes are loaded before run this
|
|
21
|
+
def self.descendants
|
|
22
|
+
ObjectSpace.each_object(Class).select { |klass| klass < self }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|