sorcery 0.8.1 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +56 -0
- data/.travis.yml +130 -1
- data/CHANGELOG.md +279 -0
- data/Gemfile +18 -23
- data/README.md +372 -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 +38 -20
- data/lib/generators/sorcery/templates/initializer.rb +53 -16
- 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 +27 -76
- 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 +85 -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 +74 -0
- data/lib/sorcery/providers/github.rb +60 -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 +429 -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 +370 -195
- data/spec/sorcery_crypto_providers_spec.rb +74 -72
- data/spec/spec_helper.rb +32 -4
- metadata +259 -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/vk.rb +0 -99
- 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
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
module Sorcery
|
|
2
|
+
module Adapters
|
|
3
|
+
class MongoMapperAdapter < BaseAdapter
|
|
4
|
+
module Wrapper
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
extend Sorcery::Model
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def sorcery_adapter
|
|
12
|
+
@sorcery_adapter ||= Sorcery::Adapters::MongoMapperAdapter.new(self)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module ClassMethods
|
|
16
|
+
def sorcery_adapter
|
|
17
|
+
Sorcery::Adapters::MongoMapperAdapter.from(self)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def increment(attr)
|
|
23
|
+
@model[attr] ||= 0
|
|
24
|
+
@model[attr] += 1
|
|
25
|
+
@model.class.increment(@model.id, attr => 1)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def save(options = {})
|
|
29
|
+
if options.delete(:raise_on_failure) && options[:validate] != false
|
|
30
|
+
@model.save! options
|
|
31
|
+
else
|
|
32
|
+
@model.save options
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def update_attributes(attrs)
|
|
37
|
+
@model.update_attributes(attrs)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class << self
|
|
41
|
+
def define_field(name, type, options={})
|
|
42
|
+
@klass.key name, type, options.slice(:default)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def define_callback(time, event, method_name, options={})
|
|
46
|
+
@klass.send "#{time}_#{event}", method_name, options.slice(:if)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def credential_regex(credential)
|
|
50
|
+
return { :$regex => /^#{Regexp.escape(credential)}$/i } if (@klass.sorcery_config.downcase_username_before_authenticating)
|
|
51
|
+
return credential
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def find_by_credentials(credentials)
|
|
55
|
+
user = nil
|
|
56
|
+
@klass.sorcery_config.username_attribute_names.each do |attribute|
|
|
57
|
+
user = @klass.where(attribute => credential_regex(credentials[0])).first
|
|
58
|
+
break if user
|
|
59
|
+
end
|
|
60
|
+
user
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def find_by_oauth_credentials(provider, uid)
|
|
64
|
+
@user_config ||= ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
|
|
65
|
+
@klass.where(@user_config.provider_attribute_name => provider, @user_config.provider_uid_attribute_name => uid).first
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def find_by_id(id)
|
|
69
|
+
@klass.find(id)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def find_by_username(username)
|
|
73
|
+
if @klass.sorcery_config.downcase_username_before_authenticating
|
|
74
|
+
username = username.downcase
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
@klass.sorcery_config.username_attribute_names.each do |attribute|
|
|
78
|
+
result = @klass.where(attribute => username).first
|
|
79
|
+
return result if result
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def find_by_activation_token(token)
|
|
84
|
+
@klass.where(@klass.sorcery_config.activation_token_attribute_name => token).first
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def find_by_email(email)
|
|
88
|
+
@klass.where(@klass.sorcery_config.email_attribute_name => email).first
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def find_by_token(token_attr_name, token)
|
|
92
|
+
@klass.where(token_attr_name => token).first
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def transaction(&blk)
|
|
96
|
+
@klass.tap(&blk)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def find_by_sorcery_token(token_attr_name, token)
|
|
100
|
+
@klass.where(token_attr_name => token).first
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def get_current_users
|
|
104
|
+
raise "this method is unavailable for MongoMapper"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
module Sorcery
|
|
2
|
+
module Adapters
|
|
3
|
+
class MongoidAdapter < BaseAdapter
|
|
4
|
+
def increment(attr)
|
|
5
|
+
mongoid_4? ? @model.inc(attr => 1) : @model.inc(attr, 1)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def update_attributes(attrs)
|
|
9
|
+
attrs.each do |name, value|
|
|
10
|
+
attrs[name] = value.utc if value.is_a?(ActiveSupport::TimeWithZone)
|
|
11
|
+
@model.send(:"#{name}=", value)
|
|
12
|
+
end
|
|
13
|
+
@model.class.where(:_id => @model.id).update_all(attrs)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def update_attribute(name, value)
|
|
17
|
+
update_attributes(name => value)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def save(options = {})
|
|
21
|
+
mthd = options.delete(:raise_on_failure) ? :save! : :save
|
|
22
|
+
@model.send(mthd, options)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def mongoid_4?
|
|
26
|
+
Gem::Version.new(::Mongoid::VERSION) >= Gem::Version.new("4.0.0.alpha")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class << self
|
|
30
|
+
|
|
31
|
+
def define_field(name, type, options={})
|
|
32
|
+
@klass.field name, options.slice(:default).merge(type: type)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def define_callback(time, event, method_name, options={})
|
|
36
|
+
@klass.send "#{time}_#{event}", method_name, options.slice(:if)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def credential_regex(credential)
|
|
40
|
+
return { :$regex => /^#{Regexp.escape(credential)}$/i } if (@klass.sorcery_config.downcase_username_before_authenticating)
|
|
41
|
+
credential
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def find_by_credentials(credentials)
|
|
45
|
+
@klass.sorcery_config.username_attribute_names.each do |attribute|
|
|
46
|
+
@user = @klass.where(attribute => credential_regex(credentials[0])).first
|
|
47
|
+
break if @user
|
|
48
|
+
end
|
|
49
|
+
@user
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def find_by_oauth_credentials(provider, uid)
|
|
53
|
+
@user_config ||= ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
|
|
54
|
+
@klass.where(@user_config.provider_attribute_name => provider, @user_config.provider_uid_attribute_name => uid).first
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def find_by_activation_token(token)
|
|
58
|
+
@klass.where(@klass.sorcery_config.activation_token_attribute_name => token).first
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def find_by_remember_me_token(token)
|
|
62
|
+
@klass.where(@klass.sorcery_config.remember_me_token_attribute_name => token).first
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def transaction(&blk)
|
|
66
|
+
tap(&blk)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def find_by_id(id)
|
|
70
|
+
@klass.find(id)
|
|
71
|
+
rescue ::Mongoid::Errors::DocumentNotFound
|
|
72
|
+
nil
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def find_by_username(username)
|
|
76
|
+
query = @klass.sorcery_config.username_attribute_names.map {|name| {name => username}}
|
|
77
|
+
@klass.any_of(*query).first
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def find_by_token(token_attr_name, token)
|
|
81
|
+
@klass.where(token_attr_name => token).first
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def find_by_email(email)
|
|
85
|
+
@klass.where(@klass.sorcery_config.email_attribute_name => email).first
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def get_current_users
|
|
89
|
+
config = @klass.sorcery_config
|
|
90
|
+
@klass.where(config.last_activity_at_attribute_name.ne => nil) \
|
|
91
|
+
.where("this.#{config.last_logout_at_attribute_name} == null || this.#{config.last_activity_at_attribute_name} > this.#{config.last_logout_at_attribute_name}") \
|
|
92
|
+
.where(config.last_activity_at_attribute_name.gt => config.activity_timeout.seconds.ago.utc).order_by([:_id,:asc])
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module Sorcery
|
|
2
|
+
module Controller
|
|
3
|
+
module Config
|
|
4
|
+
class << self
|
|
5
|
+
attr_accessor :submodules,
|
|
6
|
+
:user_class, # what class to use as the user class.
|
|
7
|
+
:not_authenticated_action, # what controller action to call for non-authenticated users.
|
|
8
|
+
|
|
9
|
+
:save_return_to_url, # when a non logged in user tries to enter a page that requires
|
|
10
|
+
# login, save the URL he wanted to reach,
|
|
11
|
+
# and send him there after login.
|
|
12
|
+
|
|
13
|
+
:cookie_domain, # set domain option for cookies
|
|
14
|
+
|
|
15
|
+
:login_sources,
|
|
16
|
+
:after_login,
|
|
17
|
+
:after_failed_login,
|
|
18
|
+
:before_logout,
|
|
19
|
+
:after_logout
|
|
20
|
+
|
|
21
|
+
def init!
|
|
22
|
+
@defaults = {
|
|
23
|
+
:@user_class => nil,
|
|
24
|
+
:@submodules => [],
|
|
25
|
+
:@not_authenticated_action => :not_authenticated,
|
|
26
|
+
:@login_sources => [],
|
|
27
|
+
:@after_login => [],
|
|
28
|
+
:@after_failed_login => [],
|
|
29
|
+
:@before_logout => [],
|
|
30
|
+
:@after_logout => [],
|
|
31
|
+
:@save_return_to_url => true,
|
|
32
|
+
:@cookie_domain => nil
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Resets all configuration options to their default values.
|
|
37
|
+
def reset!
|
|
38
|
+
@defaults.each do |k,v|
|
|
39
|
+
instance_variable_set(k,v)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def update!
|
|
44
|
+
@defaults.each do |k,v|
|
|
45
|
+
instance_variable_set(k,v) if !instance_variable_defined?(k)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def user_config(&blk)
|
|
50
|
+
block_given? ? @user_config = blk : @user_config
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def configure(&blk)
|
|
54
|
+
@configure_blk = blk
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def configure!
|
|
58
|
+
@configure_blk.call(self) if @configure_blk
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
init!
|
|
62
|
+
reset!
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
module Sorcery
|
|
2
2
|
module Controller
|
|
3
3
|
module Submodules
|
|
4
|
-
# This submodule keeps track of events such as login, logout,
|
|
4
|
+
# This submodule keeps track of events such as login, logout,
|
|
5
5
|
# and last activity time, per user.
|
|
6
6
|
# It helps in estimating which users are active now in the site.
|
|
7
|
-
# This cannot be determined absolutely because a user might be
|
|
7
|
+
# This cannot be determined absolutely because a user might be
|
|
8
8
|
# reading a page without clicking anything for a while.
|
|
9
|
-
# This is the controller part of the submodule, which adds hooks
|
|
10
|
-
# to register user events,
|
|
9
|
+
# This is the controller part of the submodule, which adds hooks
|
|
10
|
+
# to register user events,
|
|
11
11
|
# and methods to collect active users data for use in the app.
|
|
12
12
|
# see Socery::Model::Submodules::ActivityLogging for configuration
|
|
13
13
|
# options.
|
|
@@ -19,55 +19,61 @@ module Sorcery
|
|
|
19
19
|
attr_accessor :register_login_time
|
|
20
20
|
attr_accessor :register_logout_time
|
|
21
21
|
attr_accessor :register_last_activity_time
|
|
22
|
-
|
|
22
|
+
attr_accessor :register_last_ip_address
|
|
23
|
+
|
|
23
24
|
def merge_activity_logging_defaults!
|
|
24
25
|
@defaults.merge!(:@register_login_time => true,
|
|
25
26
|
:@register_logout_time => true,
|
|
26
|
-
:@register_last_activity_time => true
|
|
27
|
+
:@register_last_activity_time => true,
|
|
28
|
+
:@register_last_ip_address => true
|
|
29
|
+
)
|
|
27
30
|
end
|
|
28
31
|
end
|
|
29
32
|
merge_activity_logging_defaults!
|
|
30
33
|
end
|
|
31
34
|
Config.after_login << :register_login_time_to_db
|
|
35
|
+
Config.after_login << :register_last_ip_address
|
|
32
36
|
Config.before_logout << :register_logout_time_to_db
|
|
33
37
|
base.after_filter :register_last_activity_time_to_db
|
|
34
38
|
end
|
|
35
|
-
|
|
39
|
+
|
|
36
40
|
module InstanceMethods
|
|
37
41
|
# Returns an array of the active users.
|
|
38
42
|
def current_users
|
|
43
|
+
ActiveSupport::Deprecation.warn("Sorcery: `current_users` method is deprecated. Read more on Github: https://github.com/NoamB/sorcery/issues/602")
|
|
44
|
+
|
|
39
45
|
user_class.current_users
|
|
40
|
-
# A possible patch here:
|
|
41
|
-
# we'll add the current_user to the users list if he's not in it
|
|
42
|
-
# (can happen when he was inactive for more than activity timeout):
|
|
43
|
-
#
|
|
44
|
-
# users.unshift!(current_user) if logged_in? && users.find {|u| u.id == current_user.id}.nil?
|
|
45
|
-
#
|
|
46
|
-
# disadvantages: can hurt performance.
|
|
47
46
|
end
|
|
48
|
-
|
|
47
|
+
|
|
49
48
|
protected
|
|
50
|
-
|
|
49
|
+
|
|
51
50
|
# registers last login time on every login.
|
|
52
51
|
# This runs as a hook just after a successful login.
|
|
53
52
|
def register_login_time_to_db(user, credentials)
|
|
54
53
|
return unless Config.register_login_time
|
|
55
|
-
user.
|
|
54
|
+
user.set_last_login_at(Time.now.in_time_zone)
|
|
56
55
|
end
|
|
57
|
-
|
|
56
|
+
|
|
58
57
|
# registers last logout time on every logout.
|
|
59
58
|
# This runs as a hook just before a logout.
|
|
60
59
|
def register_logout_time_to_db(user)
|
|
61
60
|
return unless Config.register_logout_time
|
|
62
|
-
user.
|
|
61
|
+
user.set_last_logout_at(Time.now.in_time_zone)
|
|
63
62
|
end
|
|
64
|
-
|
|
63
|
+
|
|
65
64
|
# Updates last activity time on every request.
|
|
66
65
|
# The only exception is logout - we do not update activity on logout
|
|
67
66
|
def register_last_activity_time_to_db
|
|
68
67
|
return unless Config.register_last_activity_time
|
|
69
68
|
return unless logged_in?
|
|
70
|
-
current_user.
|
|
69
|
+
current_user.set_last_activity_at(Time.now.in_time_zone)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Updates IP address on every login.
|
|
73
|
+
# This runs as a hook just after a successful login.
|
|
74
|
+
def register_last_ip_address(user, credentials)
|
|
75
|
+
return unless Config.register_last_ip_address
|
|
76
|
+
current_user.set_last_ip_addess(request.remote_ip)
|
|
71
77
|
end
|
|
72
78
|
end
|
|
73
79
|
end
|
|
@@ -14,22 +14,22 @@ module Sorcery
|
|
|
14
14
|
Config.after_login << :reset_failed_logins_count!
|
|
15
15
|
Config.after_failed_login << :update_failed_logins_count!
|
|
16
16
|
end
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
module InstanceMethods
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
protected
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
# Increments the failed logins counter on every failed login.
|
|
23
23
|
# Runs as a hook after a failed login.
|
|
24
24
|
def update_failed_logins_count!(credentials)
|
|
25
|
-
user = user_class.find_by_credentials(credentials)
|
|
25
|
+
user = user_class.sorcery_adapter.find_by_credentials(credentials)
|
|
26
26
|
user.register_failed_login! if user
|
|
27
27
|
end
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
# Resets the failed logins counter.
|
|
30
30
|
# Runs as a hook after a successful login.
|
|
31
31
|
def reset_failed_logins_count!(user, credentials)
|
|
32
|
-
user.
|
|
32
|
+
user.sorcery_adapter.update_attribute(user_class.sorcery_config.failed_logins_count_attribute_name, 0)
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
end
|
|
@@ -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]
|
|
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
|
-
provider.callback_url = "#{host}#{provider.
|
|
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(provider_name)
|
|
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_name)
|
|
68
|
-
provider = Config.send(provider_name)
|
|
69
|
-
provider.access_token
|
|
70
|
-
end
|
|
71
|
-
|
|
72
134
|
# If user is logged, he can add all available providers into his account
|
|
73
135
|
def add_provider_to_user(provider_name)
|
|
74
|
-
|
|
75
|
-
provider = Config.send(provider_name)
|
|
76
|
-
provider.process_callback(params,session)
|
|
77
|
-
user_hash = provider.get_user_hash
|
|
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_name, 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
145
|
def create_and_validate_from(provider_name)
|
|
95
|
-
|
|
96
|
-
provider = Config.send(provider_name)
|
|
97
|
-
user_hash = provider.get_user_hash
|
|
146
|
+
sorcery_fetch_user_hash provider_name
|
|
98
147
|
config = user_class.sorcery_config
|
|
99
148
|
|
|
100
|
-
attrs = user_attrs(provider.user_info_mapping, user_hash)
|
|
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_name)
|
|
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 => provider_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(provider_name)
|
|
130
|
-
|
|
131
|
-
provider = Config.send(provider_name)
|
|
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
|
-
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_name, config.provider_uid_attribute_name => user_hash[:uid]})
|
|
149
|
-
end
|
|
150
|
-
@user
|
|
181
|
+
attrs = user_attrs(@provider.user_info_mapping, @user_hash)
|
|
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
|