sorcery 0.8.0 → 0.9.0
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 +56 -0
- data/.travis.yml +130 -1
- data/CHANGELOG.md +270 -0
- data/Gemfile +18 -23
- data/README.md +371 -0
- data/Rakefile +3 -78
- data/gemfiles/active_record-rails40.gemfile +7 -0
- data/gemfiles/active_record-rails41.gemfile +7 -0
- data/gemfiles/mongo_mapper-rails40.gemfile +9 -0
- data/gemfiles/mongo_mapper-rails41.gemfile +9 -0
- data/gemfiles/mongoid-rails40.gemfile +9 -0
- data/gemfiles/mongoid-rails41.gemfile +9 -0
- data/gemfiles/mongoid3-rails32.gemfile +9 -0
- data/lib/generators/sorcery/USAGE +1 -1
- data/lib/generators/sorcery/helpers.rb +40 -0
- data/lib/generators/sorcery/install_generator.rb +39 -21
- data/lib/generators/sorcery/templates/initializer.rb +56 -11
- data/lib/generators/sorcery/templates/migration/activity_logging.rb +3 -10
- data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +3 -7
- data/lib/generators/sorcery/templates/migration/core.rb +5 -8
- data/lib/generators/sorcery/templates/migration/external.rb +3 -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/adapters/active_record_adapter.rb +120 -0
- data/lib/sorcery/adapters/base_adapter.rb +30 -0
- data/lib/sorcery/adapters/data_mapper_adapter.rb +176 -0
- data/lib/sorcery/adapters/mongo_mapper_adapter.rb +110 -0
- data/lib/sorcery/adapters/mongoid_adapter.rb +97 -0
- data/lib/sorcery/controller/config.rb +65 -0
- data/lib/sorcery/controller/submodules/activity_logging.rb +27 -21
- data/lib/sorcery/controller/submodules/brute_force_protection.rb +6 -6
- data/lib/sorcery/controller/submodules/external.rb +107 -75
- data/lib/sorcery/controller/submodules/remember_me.rb +5 -5
- data/lib/sorcery/controller/submodules/session_timeout.rb +11 -7
- data/lib/sorcery/controller.rb +29 -78
- data/lib/sorcery/model/config.rb +96 -0
- data/lib/sorcery/model/submodules/activity_logging.rb +32 -12
- data/lib/sorcery/model/submodules/brute_force_protection.rb +36 -36
- data/lib/sorcery/model/submodules/external.rb +53 -9
- data/lib/sorcery/model/submodules/remember_me.rb +15 -19
- data/lib/sorcery/model/submodules/reset_password.rb +36 -33
- data/lib/sorcery/model/submodules/user_activation.rb +51 -48
- data/lib/sorcery/model/temporary_token.rb +4 -4
- data/lib/sorcery/model.rb +81 -175
- data/lib/sorcery/protocols/oauth.rb +42 -0
- data/lib/sorcery/protocols/oauth2.rb +47 -0
- data/lib/sorcery/providers/base.rb +38 -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/heroku.rb +57 -0
- data/lib/sorcery/providers/jira.rb +77 -0
- data/lib/sorcery/providers/linkedin.rb +66 -0
- data/lib/sorcery/providers/liveid.rb +53 -0
- data/lib/sorcery/providers/salesforce.rb +50 -0
- data/lib/sorcery/providers/twitter.rb +59 -0
- data/lib/sorcery/providers/vk.rb +63 -0
- data/lib/sorcery/providers/xing.rb +64 -0
- data/lib/sorcery/railties/tasks.rake +1 -7
- data/lib/sorcery/test_helpers/internal/rails.rb +17 -6
- data/lib/sorcery/test_helpers/internal.rb +27 -6
- data/lib/sorcery/test_helpers/rails/controller.rb +21 -0
- data/lib/sorcery/test_helpers/rails/integration.rb +26 -0
- data/lib/sorcery/version.rb +3 -0
- data/lib/sorcery.rb +83 -57
- data/sorcery.gemspec +24 -363
- data/spec/active_record/user_activation_spec.rb +18 -0
- data/spec/active_record/user_activity_logging_spec.rb +17 -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/controllers/controller_activity_logging_spec.rb +124 -0
- data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
- data/spec/controllers/controller_http_basic_auth_spec.rb +68 -0
- data/spec/controllers/controller_oauth2_spec.rb +414 -0
- data/spec/controllers/controller_oauth_spec.rb +240 -0
- data/spec/controllers/controller_remember_me_spec.rb +117 -0
- data/spec/controllers/controller_session_timeout_spec.rb +80 -0
- data/spec/controllers/controller_spec.rb +218 -0
- data/spec/data_mapper/user_activation_spec.rb +10 -0
- data/spec/data_mapper/user_activity_logging_spec.rb +14 -0
- data/spec/data_mapper/user_brute_force_protection_spec.rb +9 -0
- data/spec/data_mapper/user_oauth_spec.rb +9 -0
- data/spec/data_mapper/user_remember_me_spec.rb +8 -0
- data/spec/data_mapper/user_reset_password_spec.rb +8 -0
- data/spec/data_mapper/user_spec.rb +27 -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/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 +51 -0
- data/spec/orm/active_record.rb +21 -0
- data/spec/orm/data_mapper.rb +48 -0
- data/spec/orm/mongo_mapper.rb +10 -0
- data/spec/orm/mongoid.rb +22 -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 +285 -0
- data/spec/rails_app/app/data_mapper/authentication.rb +8 -0
- data/spec/rails_app/app/data_mapper/user.rb +7 -0
- data/spec/{rails3_mongo_mapper/app/models → rails_app/app/mongo_mapper}/user.rb +2 -0
- data/spec/{rails3_mongoid/app/models → rails_app/app/mongoid}/user.rb +2 -0
- data/spec/rails_app/app/views/sorcery_mailer/send_unlock_token_email.text.erb +1 -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 +51 -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/{rails3 → rails_app}/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +2 -0
- data/spec/{rails3 → rails_app}/db/migrate/core/20101224223620_create_users.rb +2 -2
- 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/user_activation_shared_examples.rb +137 -98
- data/spec/shared_examples/user_activity_logging_shared_examples.rb +86 -13
- data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +140 -21
- data/spec/shared_examples/user_oauth_shared_examples.rb +21 -16
- data/spec/shared_examples/user_remember_me_shared_examples.rb +36 -24
- data/spec/shared_examples/user_reset_password_shared_examples.rb +163 -130
- data/spec/shared_examples/user_shared_examples.rb +355 -193
- data/spec/sorcery_crypto_providers_spec.rb +74 -72
- data/spec/spec_helper.rb +32 -4
- metadata +258 -425
- data/Gemfile.lock +0 -192
- data/README.rdoc +0 -261
- data/VERSION +0 -1
- data/lib/sorcery/controller/submodules/external/protocols/oauth1.rb +0 -35
- data/lib/sorcery/controller/submodules/external/protocols/oauth2.rb +0 -45
- data/lib/sorcery/controller/submodules/external/providers/facebook.rb +0 -97
- data/lib/sorcery/controller/submodules/external/providers/github.rb +0 -91
- data/lib/sorcery/controller/submodules/external/providers/google.rb +0 -90
- data/lib/sorcery/controller/submodules/external/providers/linkedin.rb +0 -101
- data/lib/sorcery/controller/submodules/external/providers/liveid.rb +0 -91
- data/lib/sorcery/controller/submodules/external/providers/twitter.rb +0 -92
- data/lib/sorcery/controller/submodules/external/providers/vkontakte.rb +0 -94
- data/lib/sorcery/model/adapters/active_record.rb +0 -49
- data/lib/sorcery/model/adapters/mongo_mapper.rb +0 -56
- data/lib/sorcery/model/adapters/mongoid.rb +0 -88
- data/lib/sorcery/test_helpers/rails.rb +0 -16
- 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/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -1
- 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/lib/tasks/.gitkeep +0 -0
- data/spec/rails3/public/404.html +0 -26
- data/spec/rails3/public/422.html +0 -26
- data/spec/rails3/public/500.html +0 -26
- data/spec/rails3/public/favicon.ico +0 -0
- data/spec/rails3/public/images/rails.png +0 -0
- data/spec/rails3/public/javascripts/application.js +0 -2
- data/spec/rails3/public/javascripts/controls.js +0 -965
- data/spec/rails3/public/javascripts/dragdrop.js +0 -974
- data/spec/rails3/public/javascripts/effects.js +0 -1123
- data/spec/rails3/public/javascripts/prototype.js +0 -6001
- data/spec/rails3/public/javascripts/rails.js +0 -175
- data/spec/rails3/public/robots.txt +0 -5
- 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 -115
- data/spec/rails3/spec/controller_brute_force_protection_spec.rb +0 -88
- 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_oauth_spec.rb +0 -206
- 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 -177
- data/spec/rails3/spec/integration_spec.rb +0 -23
- 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 -170
- 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 -105
- data/spec/rails3_mongoid/spec/controller_spec.rb +0 -181
- 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/spec/shared_examples/controller_oauth2_shared_examples.rb +0 -56
- data/spec/shared_examples/controller_oauth_shared_examples.rb +0 -55
- /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_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}/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/brute_force_protection/20101224223626_add_brute_force_protection_to_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
|
@@ -2,25 +2,45 @@ module Sorcery
|
|
|
2
2
|
module Controller
|
|
3
3
|
module Submodules
|
|
4
4
|
# This submodule helps you login users from external auth providers such as Twitter.
|
|
5
|
-
# This is the controller part which handles the http requests and tokens passed between the app and the provider.
|
|
5
|
+
# This is the controller part which handles the http requests and tokens passed between the app and the @provider.
|
|
6
6
|
module External
|
|
7
7
|
def self.included(base)
|
|
8
8
|
base.send(:include, InstanceMethods)
|
|
9
|
+
|
|
10
|
+
require 'sorcery/providers/base'
|
|
11
|
+
require 'sorcery/providers/facebook'
|
|
12
|
+
require 'sorcery/providers/twitter'
|
|
13
|
+
require 'sorcery/providers/vk'
|
|
14
|
+
require 'sorcery/providers/linkedin'
|
|
15
|
+
require 'sorcery/providers/liveid'
|
|
16
|
+
require 'sorcery/providers/xing'
|
|
17
|
+
require 'sorcery/providers/github'
|
|
18
|
+
require 'sorcery/providers/heroku'
|
|
19
|
+
require 'sorcery/providers/google'
|
|
20
|
+
require 'sorcery/providers/jira'
|
|
21
|
+
require 'sorcery/providers/salesforce'
|
|
22
|
+
|
|
9
23
|
Config.module_eval do
|
|
10
24
|
class << self
|
|
11
|
-
attr_reader :external_providers
|
|
12
|
-
attr_accessor :ca_file
|
|
13
|
-
|
|
14
|
-
def merge_external_defaults!
|
|
15
|
-
@defaults.merge!(:@external_providers => [],
|
|
16
|
-
:@ca_file => File.join(File.expand_path(File.dirname(__FILE__)), 'external/protocols/certs/ca-bundle.crt'))
|
|
17
|
-
end
|
|
25
|
+
attr_reader :external_providers
|
|
26
|
+
attr_accessor :ca_file
|
|
18
27
|
|
|
19
28
|
def external_providers=(providers)
|
|
20
|
-
|
|
21
|
-
|
|
29
|
+
@external_providers = providers
|
|
30
|
+
|
|
31
|
+
providers.each do |name|
|
|
32
|
+
class_eval <<-E
|
|
33
|
+
def self.#{name}
|
|
34
|
+
@#{name} ||= Sorcery::Providers.const_get('#{name}'.to_s.capitalize).new
|
|
35
|
+
end
|
|
36
|
+
E
|
|
22
37
|
end
|
|
23
38
|
end
|
|
39
|
+
|
|
40
|
+
def merge_external_defaults!
|
|
41
|
+
@defaults.merge!(:@external_providers => [],
|
|
42
|
+
:@ca_file => File.join(File.expand_path(File.dirname(__FILE__)), '../../protocols/certs/ca-bundle.crt'))
|
|
43
|
+
end
|
|
24
44
|
end
|
|
25
45
|
merge_external_defaults!
|
|
26
46
|
end
|
|
@@ -29,83 +49,111 @@ module Sorcery
|
|
|
29
49
|
module InstanceMethods
|
|
30
50
|
protected
|
|
31
51
|
|
|
32
|
-
#
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
52
|
+
# save the singleton ProviderClient instance into @provider
|
|
53
|
+
def sorcery_get_provider(provider_name)
|
|
54
|
+
return unless Config.external_providers.include?(provider_name.to_sym)
|
|
55
|
+
Config.send(provider_name.to_sym)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# get the login URL from the provider, if applicable. Returns nil if the provider
|
|
59
|
+
# does not provide a login URL. (as of v0.8.1 all providers provide a login URL)
|
|
60
|
+
def sorcery_login_url(provider_name, args = {})
|
|
61
|
+
@provider = sorcery_get_provider provider_name
|
|
62
|
+
sorcery_fixup_callback_url @provider
|
|
63
|
+
if @provider.respond_to?(:login_url) && @provider.has_callback?
|
|
64
|
+
@provider.state = args[:state] if args[:state]
|
|
65
|
+
return @provider.login_url(params, session)
|
|
66
|
+
else
|
|
67
|
+
return nil
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# get the user hash from a provider using information from the params and session.
|
|
72
|
+
def sorcery_fetch_user_hash(provider_name)
|
|
73
|
+
# the application should never ask for user hashes from two different providers
|
|
74
|
+
# on the same request. But if they do, we should be ready: on the second request,
|
|
75
|
+
# clear out the instance variables if the provider is different
|
|
76
|
+
provider = sorcery_get_provider provider_name
|
|
77
|
+
if @provider.nil? || @provider != provider
|
|
78
|
+
@provider = provider
|
|
79
|
+
@access_token = nil
|
|
80
|
+
@user_hash = nil
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# delegate to the provider for the access token and the user hash.
|
|
84
|
+
# cache them in instance variables.
|
|
85
|
+
@access_token ||= @provider.process_callback(params, session) # sends request to oauth agent to get the token
|
|
86
|
+
@user_hash ||= @provider.get_user_hash(@access_token) # uses the token to send another request to the oauth agent requesting user info
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# for backwards compatibility
|
|
90
|
+
def access_token(*args)
|
|
91
|
+
@access_token
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# this method should be somewhere else. It only does something once per application per provider.
|
|
96
|
+
def sorcery_fixup_callback_url(provider)
|
|
97
|
+
provider.original_callback_url ||= provider.callback_url
|
|
98
|
+
if provider.original_callback_url.present? && provider.original_callback_url[0] == '/'
|
|
37
99
|
uri = URI.parse(request.url.gsub(/\?.*$/,''))
|
|
38
100
|
uri.path = ''
|
|
39
101
|
uri.query = nil
|
|
40
102
|
uri.scheme = 'https' if(request.env['HTTP_X_FORWARDED_PROTO'] == 'https')
|
|
41
103
|
host = uri.to_s
|
|
42
|
-
|
|
43
|
-
end
|
|
44
|
-
if @provider.has_callback?
|
|
45
|
-
redirect_to @provider.login_url(params,session)
|
|
46
|
-
else
|
|
47
|
-
#@provider.login(args)
|
|
104
|
+
provider.callback_url = "#{host}#{@provider.original_callback_url}"
|
|
48
105
|
end
|
|
49
106
|
end
|
|
50
107
|
|
|
108
|
+
# sends user to authenticate at the provider's website.
|
|
109
|
+
# after authentication the user is redirected to the callback defined in the provider config
|
|
110
|
+
def login_at(provider_name, args = {})
|
|
111
|
+
redirect_to sorcery_login_url(provider_name, args)
|
|
112
|
+
end
|
|
113
|
+
|
|
51
114
|
# tries to login the user from provider's callback
|
|
52
|
-
def login_from(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
115
|
+
def login_from(provider_name, should_remember = false)
|
|
116
|
+
sorcery_fetch_user_hash provider_name
|
|
117
|
+
|
|
118
|
+
if user = user_class.load_from_provider(provider_name, @user_hash[:uid].to_s)
|
|
119
|
+
# we found the user.
|
|
120
|
+
# clear the session
|
|
57
121
|
return_to_url = session[:return_to_url]
|
|
58
|
-
|
|
122
|
+
reset_sorcery_session
|
|
59
123
|
session[:return_to_url] = return_to_url
|
|
60
|
-
|
|
124
|
+
|
|
125
|
+
# sign in the user
|
|
126
|
+
auto_login(user, should_remember)
|
|
61
127
|
after_login!(user)
|
|
128
|
+
|
|
129
|
+
# return the user
|
|
62
130
|
user
|
|
63
131
|
end
|
|
64
132
|
end
|
|
65
133
|
|
|
66
|
-
# get provider access account
|
|
67
|
-
def access_token(provider)
|
|
68
|
-
@provider = Config.send(provider)
|
|
69
|
-
@provider.access_token
|
|
70
|
-
end
|
|
71
|
-
|
|
72
134
|
# If user is logged, he can add all available providers into his account
|
|
73
|
-
def add_provider_to_user(
|
|
74
|
-
provider_name
|
|
75
|
-
@provider = Config.send(provider_name)
|
|
76
|
-
@provider.process_callback(params,session)
|
|
77
|
-
@user_hash = @provider.get_user_hash
|
|
135
|
+
def add_provider_to_user(provider_name)
|
|
136
|
+
sorcery_fetch_user_hash provider_name
|
|
78
137
|
config = user_class.sorcery_config
|
|
79
138
|
|
|
80
|
-
|
|
81
|
-
unless (current_user.send(config.authentications_class.to_s.downcase.pluralize).send("find_by_#{config.provider_attribute_name}_and_#{config.provider_uid_attribute_name}", provider, @user_hash[:uid].to_s))
|
|
82
|
-
user = current_user.send(config.authentications_class.to_s.downcase.pluralize).build(config.provider_uid_attribute_name => @user_hash[:uid], config.provider_attribute_name => provider_name.to_s)
|
|
83
|
-
user.save(:validate => false)
|
|
84
|
-
else
|
|
85
|
-
user = false
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
return user
|
|
139
|
+
current_user.add_provider_to_user(provider_name.to_s, @user_hash[:uid].to_s)
|
|
89
140
|
end
|
|
90
141
|
|
|
91
142
|
# Initialize new user from provider informations.
|
|
92
143
|
# If a provider doesn't give required informations or username/email is already taken,
|
|
93
144
|
# we store provider/user infos into a session and can be rendered into registration form
|
|
94
|
-
def create_and_validate_from(
|
|
95
|
-
|
|
96
|
-
@provider = Config.send(provider)
|
|
97
|
-
@user_hash = @provider.get_user_hash
|
|
145
|
+
def create_and_validate_from(provider_name)
|
|
146
|
+
sorcery_fetch_user_hash provider_name
|
|
98
147
|
config = user_class.sorcery_config
|
|
99
148
|
|
|
100
149
|
attrs = user_attrs(@provider.user_info_mapping, @user_hash)
|
|
101
150
|
|
|
102
|
-
user = user_class.
|
|
103
|
-
user.send(config.authentications_class.to_s.downcase.pluralize).build(config.provider_uid_attribute_name => @user_hash[:uid], config.provider_attribute_name => provider)
|
|
151
|
+
user, saved = user_class.create_and_validate_from_provider(provider_name, @user_hash[:uid], attrs)
|
|
104
152
|
|
|
105
153
|
session[:incomplete_user] = {
|
|
106
|
-
:provider => {config.provider_uid_attribute_name => @user_hash[:uid], config.provider_attribute_name =>
|
|
154
|
+
:provider => {config.provider_uid_attribute_name => @user_hash[:uid], config.provider_attribute_name => provider_name},
|
|
107
155
|
:user_hash => attrs
|
|
108
|
-
} unless
|
|
156
|
+
} unless saved
|
|
109
157
|
|
|
110
158
|
return user
|
|
111
159
|
end
|
|
@@ -126,28 +174,12 @@ module Sorcery
|
|
|
126
174
|
#
|
|
127
175
|
# create_from(provider) {|user| user.some_check }
|
|
128
176
|
#
|
|
129
|
-
def create_from(
|
|
130
|
-
|
|
131
|
-
@provider = Config.send(provider)
|
|
132
|
-
@user_hash = @provider.get_user_hash
|
|
177
|
+
def create_from(provider_name, &block)
|
|
178
|
+
sorcery_fetch_user_hash provider_name
|
|
133
179
|
config = user_class.sorcery_config
|
|
134
180
|
|
|
135
181
|
attrs = user_attrs(@provider.user_info_mapping, @user_hash)
|
|
136
|
-
|
|
137
|
-
user_class.transaction do
|
|
138
|
-
@user = user_class.new()
|
|
139
|
-
attrs.each do |k,v|
|
|
140
|
-
@user.send(:"#{k}=", v)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
if block_given?
|
|
144
|
-
return false unless yield @user
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
@user.save(:validate => false)
|
|
148
|
-
user_class.sorcery_config.authentications_class.create!({config.authentications_user_id_attribute_name => @user.id, config.provider_attribute_name => provider, config.provider_uid_attribute_name => @user_hash[:uid]})
|
|
149
|
-
end
|
|
150
|
-
@user
|
|
182
|
+
@user = user_class.create_from_provider(provider_name, @user_hash[:uid], attrs, &block)
|
|
151
183
|
end
|
|
152
184
|
|
|
153
185
|
def user_attrs(user_info_mapping, user_hash)
|
|
@@ -31,14 +31,14 @@ module Sorcery
|
|
|
31
31
|
|
|
32
32
|
# Clears the cookie and clears the token from the db.
|
|
33
33
|
def forget_me!
|
|
34
|
-
|
|
34
|
+
current_user.forget_me!
|
|
35
35
|
cookies.delete(:remember_me_token, :domain => Config.cookie_domain)
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
# Override.
|
|
39
39
|
# logins a user instance, and optionally remembers him.
|
|
40
40
|
def auto_login(user, should_remember = false)
|
|
41
|
-
session[:user_id] = user.id
|
|
41
|
+
session[:user_id] = user.id.to_s
|
|
42
42
|
@current_user = user
|
|
43
43
|
remember_me! if should_remember
|
|
44
44
|
end
|
|
@@ -55,10 +55,10 @@ module Sorcery
|
|
|
55
55
|
# and logs the user in if found.
|
|
56
56
|
# Runs as a login source. See 'current_user' method for how it is used.
|
|
57
57
|
def login_from_cookie
|
|
58
|
-
user = cookies.signed[:remember_me_token] && user_class.find_by_remember_me_token(cookies.signed[:remember_me_token])
|
|
59
|
-
if user && user.
|
|
58
|
+
user = cookies.signed[:remember_me_token] && user_class.sorcery_adapter.find_by_remember_me_token(cookies.signed[:remember_me_token])
|
|
59
|
+
if user && user.has_remember_me_token?
|
|
60
60
|
set_remember_me_cookie!(user)
|
|
61
|
-
session[:user_id] = user.id
|
|
61
|
+
session[:user_id] = user.id.to_s
|
|
62
62
|
@current_user = user
|
|
63
63
|
else
|
|
64
64
|
@current_user = false
|
|
@@ -9,10 +9,10 @@ module Sorcery
|
|
|
9
9
|
Config.module_eval do
|
|
10
10
|
class << self
|
|
11
11
|
attr_accessor :session_timeout, # how long in seconds to keep the session alive.
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
:session_timeout_from_last_action # use the last action as the beginning of session
|
|
14
14
|
# timeout.
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
def merge_session_timeout_defaults!
|
|
17
17
|
@defaults.merge!(:@session_timeout => 3600, # 1.hour
|
|
18
18
|
:@session_timeout_from_last_action => false)
|
|
@@ -23,28 +23,32 @@ module Sorcery
|
|
|
23
23
|
Config.after_login << :register_login_time
|
|
24
24
|
base.prepend_before_filter :validate_session
|
|
25
25
|
end
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
module InstanceMethods
|
|
28
28
|
protected
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
# Registers last login to be used as the timeout starting point.
|
|
31
31
|
# Runs as a hook after a successful login.
|
|
32
32
|
def register_login_time(user, credentials)
|
|
33
33
|
session[:login_time] = session[:last_action_time] = Time.now.in_time_zone
|
|
34
34
|
end
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
# Checks if session timeout was reached and expires the current session if so.
|
|
37
37
|
# To be used as a before_filter, before require_login
|
|
38
38
|
def validate_session
|
|
39
39
|
session_to_use = Config.session_timeout_from_last_action ? session[:last_action_time] : session[:login_time]
|
|
40
|
-
if session_to_use && (
|
|
41
|
-
|
|
40
|
+
if session_to_use && sorcery_session_expired?(session_to_use.to_time)
|
|
41
|
+
reset_sorcery_session
|
|
42
42
|
@current_user = nil
|
|
43
43
|
else
|
|
44
44
|
session[:last_action_time] = Time.now.in_time_zone
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
+
def sorcery_session_expired?(time)
|
|
49
|
+
Time.now.in_time_zone - time > Config.session_timeout
|
|
50
|
+
end
|
|
51
|
+
|
|
48
52
|
end
|
|
49
53
|
end
|
|
50
54
|
end
|
data/lib/sorcery/controller.rb
CHANGED
|
@@ -5,7 +5,7 @@ module Sorcery
|
|
|
5
5
|
include InstanceMethods
|
|
6
6
|
Config.submodules.each do |mod|
|
|
7
7
|
begin
|
|
8
|
-
include Submodules.const_get(mod.to_s.split(
|
|
8
|
+
include Submodules.const_get(mod.to_s.split('_').map { |p| p.capitalize }.join)
|
|
9
9
|
rescue NameError
|
|
10
10
|
# don't stop on a missing submodule.
|
|
11
11
|
end
|
|
@@ -28,15 +28,17 @@ module Sorcery
|
|
|
28
28
|
|
|
29
29
|
# Takes credentials and returns a user on successful authentication.
|
|
30
30
|
# Runs hooks after login or failed login.
|
|
31
|
-
|
|
31
|
+
def login(*credentials)
|
|
32
32
|
@current_user = nil
|
|
33
33
|
user = user_class.authenticate(*credentials)
|
|
34
34
|
if user
|
|
35
|
-
old_session = session.dup
|
|
36
|
-
|
|
37
|
-
old_session.
|
|
35
|
+
old_session = session.dup.to_hash
|
|
36
|
+
reset_sorcery_session
|
|
37
|
+
old_session.each_pair do |k,v|
|
|
38
38
|
session[k.to_sym] = v
|
|
39
39
|
end
|
|
40
|
+
form_authenticity_token
|
|
41
|
+
|
|
40
42
|
auto_login(user)
|
|
41
43
|
after_login!(user, credentials)
|
|
42
44
|
current_user
|
|
@@ -46,11 +48,20 @@ module Sorcery
|
|
|
46
48
|
end
|
|
47
49
|
end
|
|
48
50
|
|
|
51
|
+
# put this into the catch block to rescue undefined method `destroy_session'
|
|
52
|
+
# hotfix for https://github.com/NoamB/sorcery/issues/464
|
|
53
|
+
# can be removed when Rails 4.1 is out
|
|
54
|
+
def reset_sorcery_session
|
|
55
|
+
reset_session # protect from session fixation attacks
|
|
56
|
+
rescue NoMethodError
|
|
57
|
+
end
|
|
58
|
+
|
|
49
59
|
# Resets the session and runs hooks before and after.
|
|
50
60
|
def logout
|
|
51
61
|
if logged_in?
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
@current_user = current_user if @current_user.nil?
|
|
63
|
+
before_logout!(@current_user)
|
|
64
|
+
reset_sorcery_session
|
|
54
65
|
after_logout!
|
|
55
66
|
@current_user = nil
|
|
56
67
|
end
|
|
@@ -61,9 +72,12 @@ module Sorcery
|
|
|
61
72
|
end
|
|
62
73
|
|
|
63
74
|
# attempts to auto-login from the sources defined (session, basic_auth, cookie, etc.)
|
|
64
|
-
# returns the logged in user if found,
|
|
75
|
+
# returns the logged in user if found, nil if not
|
|
65
76
|
def current_user
|
|
66
|
-
|
|
77
|
+
unless defined?(@current_user)
|
|
78
|
+
@current_user = login_from_session || login_from_other_sources || nil
|
|
79
|
+
end
|
|
80
|
+
@current_user
|
|
67
81
|
end
|
|
68
82
|
|
|
69
83
|
def current_user=(user)
|
|
@@ -88,8 +102,8 @@ module Sorcery
|
|
|
88
102
|
#
|
|
89
103
|
# @param [<User-Model>] user the user instance.
|
|
90
104
|
# @return - do not depend on the return value.
|
|
91
|
-
def auto_login(user)
|
|
92
|
-
session[:user_id] = user.id
|
|
105
|
+
def auto_login(user, should_remember = false)
|
|
106
|
+
session[:user_id] = user.id.to_s
|
|
93
107
|
@current_user = user
|
|
94
108
|
end
|
|
95
109
|
|
|
@@ -112,11 +126,9 @@ module Sorcery
|
|
|
112
126
|
end
|
|
113
127
|
|
|
114
128
|
def login_from_session
|
|
115
|
-
@current_user =
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return false if defined?(ActiveRecord) and exception.is_a?(ActiveRecord::RecordNotFound)
|
|
119
|
-
raise exception
|
|
129
|
+
@current_user = if session[:user_id]
|
|
130
|
+
user_class.sorcery_adapter.find_by_id(session[:user_id])
|
|
131
|
+
end
|
|
120
132
|
end
|
|
121
133
|
|
|
122
134
|
def after_login!(user, credentials = [])
|
|
@@ -141,66 +153,5 @@ module Sorcery
|
|
|
141
153
|
|
|
142
154
|
end
|
|
143
155
|
|
|
144
|
-
|
|
145
|
-
class << self
|
|
146
|
-
attr_accessor :submodules,
|
|
147
|
-
:user_class, # what class to use as the user class.
|
|
148
|
-
:not_authenticated_action, # what controller action to call for non-authenticated users.
|
|
149
|
-
|
|
150
|
-
:save_return_to_url, # when a non logged in user tries to enter a page that requires
|
|
151
|
-
# login, save the URL he wanted to reach,
|
|
152
|
-
# and send him there after login.
|
|
153
|
-
|
|
154
|
-
:cookie_domain, # set domain option for cookies
|
|
155
|
-
|
|
156
|
-
:login_sources,
|
|
157
|
-
:after_login,
|
|
158
|
-
:after_failed_login,
|
|
159
|
-
:before_logout,
|
|
160
|
-
:after_logout
|
|
161
|
-
|
|
162
|
-
def init!
|
|
163
|
-
@defaults = {
|
|
164
|
-
:@user_class => nil,
|
|
165
|
-
:@submodules => [],
|
|
166
|
-
:@not_authenticated_action => :not_authenticated,
|
|
167
|
-
:@login_sources => [],
|
|
168
|
-
:@after_login => [],
|
|
169
|
-
:@after_failed_login => [],
|
|
170
|
-
:@before_logout => [],
|
|
171
|
-
:@after_logout => [],
|
|
172
|
-
:@save_return_to_url => true,
|
|
173
|
-
:@cookie_domain => nil
|
|
174
|
-
}
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
# Resets all configuration options to their default values.
|
|
178
|
-
def reset!
|
|
179
|
-
@defaults.each do |k,v|
|
|
180
|
-
instance_variable_set(k,v)
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
def update!
|
|
185
|
-
@defaults.each do |k,v|
|
|
186
|
-
instance_variable_set(k,v) if !instance_variable_defined?(k)
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def user_config(&blk)
|
|
191
|
-
block_given? ? @user_config = blk : @user_config
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
def configure(&blk)
|
|
195
|
-
@configure_blk = blk
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def configure!
|
|
199
|
-
@configure_blk.call(self) if @configure_blk
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
init!
|
|
203
|
-
reset!
|
|
204
|
-
end
|
|
205
|
-
end
|
|
156
|
+
end
|
|
206
157
|
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Each class which calls 'activate_sorcery!' receives an instance of this class.
|
|
2
|
+
# Every submodule which gets loaded may add accessors to this class so that all
|
|
3
|
+
# options will be configured from a single place.
|
|
4
|
+
module Sorcery
|
|
5
|
+
module Model
|
|
6
|
+
class Config
|
|
7
|
+
|
|
8
|
+
attr_accessor :username_attribute_names, # change default username attribute, for example, to use :email
|
|
9
|
+
# as the login.
|
|
10
|
+
|
|
11
|
+
:password_attribute_name, # change *virtual* password attribute, the one which is used
|
|
12
|
+
# until an encrypted one is generated.
|
|
13
|
+
|
|
14
|
+
:email_attribute_name, # change default email attribute.
|
|
15
|
+
|
|
16
|
+
:downcase_username_before_authenticating, # downcase the username before trying to authenticate, default is false
|
|
17
|
+
|
|
18
|
+
:crypted_password_attribute_name, # change default crypted_password attribute.
|
|
19
|
+
:salt_join_token, # what pattern to use to join the password with the salt
|
|
20
|
+
:salt_attribute_name, # change default salt attribute.
|
|
21
|
+
:stretches, # how many times to apply encryption to the password.
|
|
22
|
+
:encryption_key, # encryption key used to encrypt reversible encryptions such as
|
|
23
|
+
# AES256.
|
|
24
|
+
|
|
25
|
+
:subclasses_inherit_config, # make this configuration inheritable for subclasses. Useful for
|
|
26
|
+
# ActiveRecord's STI.
|
|
27
|
+
|
|
28
|
+
:submodules, # configured in config/application.rb
|
|
29
|
+
:before_authenticate, # an array of method names to call before authentication
|
|
30
|
+
# completes. used internally.
|
|
31
|
+
|
|
32
|
+
:after_config # an array of method names to call after configuration by user.
|
|
33
|
+
# used internally.
|
|
34
|
+
|
|
35
|
+
attr_reader :encryption_provider, # change default encryption_provider.
|
|
36
|
+
:custom_encryption_provider, # use an external encryption class.
|
|
37
|
+
:encryption_algorithm # encryption algorithm name. See 'encryption_algorithm=' below
|
|
38
|
+
# for available options.
|
|
39
|
+
|
|
40
|
+
def initialize
|
|
41
|
+
@defaults = {
|
|
42
|
+
:@submodules => [],
|
|
43
|
+
:@username_attribute_names => [:email],
|
|
44
|
+
:@password_attribute_name => :password,
|
|
45
|
+
:@downcase_username_before_authenticating => false,
|
|
46
|
+
:@email_attribute_name => :email,
|
|
47
|
+
:@crypted_password_attribute_name => :crypted_password,
|
|
48
|
+
:@encryption_algorithm => :bcrypt,
|
|
49
|
+
:@encryption_provider => CryptoProviders::BCrypt,
|
|
50
|
+
:@custom_encryption_provider => nil,
|
|
51
|
+
:@encryption_key => nil,
|
|
52
|
+
:@salt_join_token => "",
|
|
53
|
+
:@salt_attribute_name => :salt,
|
|
54
|
+
:@stretches => nil,
|
|
55
|
+
:@subclasses_inherit_config => false,
|
|
56
|
+
:@before_authenticate => [],
|
|
57
|
+
:@after_config => []
|
|
58
|
+
}
|
|
59
|
+
reset!
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Resets all configuration options to their default values.
|
|
63
|
+
def reset!
|
|
64
|
+
@defaults.each do |k,v|
|
|
65
|
+
instance_variable_set(k,v)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def username_attribute_names=(fields)
|
|
70
|
+
@username_attribute_names = fields.kind_of?(Array) ? fields : [fields]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def custom_encryption_provider=(provider)
|
|
74
|
+
@custom_encryption_provider = @encryption_provider = provider
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def encryption_algorithm=(algo)
|
|
78
|
+
@encryption_algorithm = algo
|
|
79
|
+
@encryption_provider = case @encryption_algorithm.to_sym
|
|
80
|
+
when :none then nil
|
|
81
|
+
when :md5 then CryptoProviders::MD5
|
|
82
|
+
when :sha1 then CryptoProviders::SHA1
|
|
83
|
+
when :sha256 then CryptoProviders::SHA256
|
|
84
|
+
when :sha512 then CryptoProviders::SHA512
|
|
85
|
+
when :aes256 then CryptoProviders::AES256
|
|
86
|
+
when :bcrypt then CryptoProviders::BCrypt
|
|
87
|
+
when :custom then @custom_encryption_provider
|
|
88
|
+
else raise ArgumentError.new("Encryption algorithm supplied, #{algo}, is invalid")
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
@@ -3,45 +3,65 @@ module Sorcery
|
|
|
3
3
|
module Submodules
|
|
4
4
|
# This submodule keeps track of events such as login, logout, and last activity time, per user.
|
|
5
5
|
# It helps in estimating which users are active now in the site.
|
|
6
|
-
# This cannot be determined absolutely because a user might be reading a page without clicking anything
|
|
6
|
+
# This cannot be determined absolutely because a user might be reading a page without clicking anything
|
|
7
7
|
# for a while.
|
|
8
8
|
# This is the model part of the submodule, which provides configuration options.
|
|
9
9
|
module ActivityLogging
|
|
10
10
|
def self.included(base)
|
|
11
11
|
base.extend(ClassMethods)
|
|
12
|
+
base.send(:include, InstanceMethods)
|
|
12
13
|
|
|
13
14
|
base.sorcery_config.class_eval do
|
|
14
15
|
attr_accessor :last_login_at_attribute_name, # last login attribute name.
|
|
15
16
|
:last_logout_at_attribute_name, # last logout attribute name.
|
|
16
17
|
:last_activity_at_attribute_name, # last activity attribute name.
|
|
17
|
-
:
|
|
18
|
+
:last_login_from_ip_address_name, # last activity login source
|
|
19
|
+
:activity_timeout # how long since last activity is
|
|
18
20
|
#the user defined logged out?
|
|
19
21
|
end
|
|
20
|
-
|
|
22
|
+
|
|
21
23
|
base.sorcery_config.instance_eval do
|
|
22
24
|
@defaults.merge!(:@last_login_at_attribute_name => :last_login_at,
|
|
23
25
|
:@last_logout_at_attribute_name => :last_logout_at,
|
|
24
26
|
:@last_activity_at_attribute_name => :last_activity_at,
|
|
27
|
+
:@last_login_from_ip_address_name => :last_login_from_ip_address,
|
|
25
28
|
:@activity_timeout => 10 * 60)
|
|
26
29
|
reset!
|
|
27
30
|
end
|
|
28
31
|
|
|
29
|
-
base.sorcery_config.after_config << :
|
|
32
|
+
base.sorcery_config.after_config << :define_activity_logging_fields
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
module InstanceMethods
|
|
36
|
+
def set_last_login_at(time)
|
|
37
|
+
sorcery_adapter.update_attribute(sorcery_config.last_login_at_attribute_name, time)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def set_last_logout_at(time)
|
|
41
|
+
sorcery_adapter.update_attribute(sorcery_config.last_logout_at_attribute_name, time)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def set_last_activity_at(time)
|
|
45
|
+
sorcery_adapter.update_attribute(sorcery_config.last_activity_at_attribute_name, time)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def set_last_ip_addess(ip_address)
|
|
49
|
+
sorcery_adapter.update_attribute(sorcery_config.last_login_from_ip_address_name, ip_address)
|
|
50
|
+
end
|
|
30
51
|
end
|
|
31
|
-
|
|
52
|
+
|
|
32
53
|
module ClassMethods
|
|
33
54
|
# get all users with last_activity within timeout
|
|
34
55
|
def current_users
|
|
35
|
-
|
|
36
|
-
get_current_users
|
|
56
|
+
sorcery_adapter.get_current_users
|
|
37
57
|
end
|
|
38
58
|
|
|
39
59
|
protected
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
60
|
+
def define_activity_logging_fields
|
|
61
|
+
sorcery_adapter.define_field sorcery_config.last_login_at_attribute_name, Time
|
|
62
|
+
sorcery_adapter.define_field sorcery_config.last_logout_at_attribute_name, Time
|
|
63
|
+
sorcery_adapter.define_field sorcery_config.last_activity_at_attribute_name, Time
|
|
64
|
+
sorcery_adapter.define_field sorcery_config.last_login_from_ip_address_name, String
|
|
45
65
|
end
|
|
46
66
|
end
|
|
47
67
|
end
|