From c59f75393610a495db3bbe24a4a417a8d3f25b8e Mon Sep 17 00:00:00 2001 From: Cyril Mougel Date: Fri, 21 Jun 2013 11:22:34 +0200 Subject: [PATCH] Upgrade to Devise 2.2.x version --- Gemfile | 2 +- Gemfile.lock | 25 +++++++++++++------------ app/models/user.rb | 22 ++++++++++++++++++++++ app/views/shared/_session.html.haml | 4 ++-- config/initializers/devise.rb | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------- config/locales/en.yml | 8 ++++++++ spec/acceptance/sign_in_with_github_spec.rb | 2 +- 7 files changed, 208 insertions(+), 73 deletions(-) diff --git a/Gemfile b/Gemfile index dc8ce30..5dd9f4c 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ gem 'mongoid', '~> 2.7.1' # Mongoid rails migration > 0.0.14 is not compatible to Mongoid 2.x gem 'mongoid_rails_migrations', '~> 0.0.14' -gem 'devise', '~> 1.5.4' +gem 'devise' gem 'haml' gem 'htmlentities' gem 'rack-ssl', :require => 'rack/ssl' # force SSL diff --git a/Gemfile.lock b/Gemfile.lock index 690c402..b173b14 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -50,7 +50,7 @@ GEM better_errors (0.9.0) coderay (>= 1.0.0) erubis (>= 2.6.6) - binding_of_caller (0.7.1) + binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) bitbucket_rest_api (0.1.2) faraday (~> 0.8.1) @@ -103,12 +103,13 @@ GEM debugger-linecache (1.2.0) debugger-ruby_core_source (1.2.2) decent_exposure (2.2.0) - devise (1.5.4) + devise (2.2.4) bcrypt-ruby (~> 3.0) - orm_adapter (~> 0.0.3) - warden (~> 1.1) + orm_adapter (~> 0.1) + railties (~> 3.1) + warden (~> 1.2.1) diff-lcs (1.2.4) - dotenv (0.7.0) + dotenv (0.8.0) email_spec (1.4.0) launchy (~> 2.1) mail (~> 2.2) @@ -121,7 +122,7 @@ GEM multipart-post (~> 1.1) faraday_middleware (0.8.8) faraday (>= 0.7.4, < 0.9) - ffi (1.8.1) + ffi (1.9.0) foreman (0.63.0) dotenv (>= 0.7) thor (>= 0.13.6) @@ -191,8 +192,8 @@ GEM bundler (>= 1.0.0) rails (>= 3.0.0) railties (>= 3.0.0) - multi_json (1.7.6) - multi_xml (0.5.3) + multi_json (1.7.7) + multi_xml (0.5.4) multipart-post (1.2.0) net-scp (1.1.1) net-ssh (>= 2.6.5) @@ -201,7 +202,7 @@ GEM net-ssh (2.6.7) net-ssh-gateway (1.2.0) net-ssh (>= 2.6.5) - nokogiri (1.5.9) + nokogiri (1.5.10) nokogiri-happymapper (0.5.7) nokogiri (~> 1.5) oauth2 (0.8.1) @@ -225,7 +226,7 @@ GEM omniauth-oauth2 (1.1.1) oauth2 (~> 0.8.0) omniauth (~> 1.0) - orm_adapter (0.0.7) + orm_adapter (0.4.0) oruen_redmine_client (0.0.1) activeresource (>= 2.3.0) pivotal-tracker (0.5.10) @@ -347,7 +348,7 @@ GEM thor (0.18.1) tilt (1.4.1) timecop (0.6.1) - treetop (1.4.12) + treetop (1.4.14) polyglot polyglot (>= 0.3.1) turbo-sprockets-rails3 (0.3.6) @@ -393,7 +394,7 @@ DEPENDENCIES database_cleaner (~> 0.9.0) debugger decent_exposure - devise (~> 1.5.4) + devise email_spec execjs fabrication (~> 1.3.0) diff --git a/app/models/user.rb b/app/models/user.rb index 10cc11b..003d00c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -13,6 +13,28 @@ class User field :per_page, :type => Fixnum, :default => PER_PAGE field :time_zone, :default => "UTC" + ## Devise field + ### Database Authenticatable + field :encrypted_password, :type => String + + ### Recoverable + field :reset_password_token, :type => String + field :reset_password_sent_at, :type => Time + + ### Rememberable + field :remember_created_at, :type => Time + + ### Trackable + field :sign_in_count, :type => Integer + field :current_sign_in_at, :type => Time + field :last_sign_in_at, :type => Time + field :current_sign_in_ip, :type => String + field :last_sign_in_ip, :type => String + + ### Token_authenticatable + field :authentication_token, :type => String + + before_save :ensure_authentication_token validates_presence_of :name diff --git a/app/views/shared/_session.html.haml b/app/views/shared/_session.html.haml index d9160e7..7889bfe 100644 --- a/app/views/shared/_session.html.haml +++ b/app/views/shared/_session.html.haml @@ -1,4 +1,4 @@ - if current_user %ul#session-links - %li= link_to 'Sign out', destroy_session_path(:user), :id => 'sign-out' - %li= link_to 'Edit profile', edit_user_path(current_user), :id => 'edit-profile' \ No newline at end of file + %li= link_to 'Sign out', destroy_session_path(:user), :id => 'sign-out', :method => :delete + %li= link_to 'Edit profile', edit_user_path(current_user), :id => 'edit-profile' diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 46b8457..b5393b9 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -1,8 +1,9 @@ -# Use this hook to configure devise mailer, warden hooks and so forth. The first -# four configuration values can also be set straight in your models. +# Use this hook to configure devise mailer, warden hooks and so forth. +# Many of these configuration options can be set straight in your model. Devise.setup do |config| # ==> Mailer Configuration - # Configure the e-mail address which will be shown in DeviseMailer. + # Configure the e-mail address which will be shown in Devise::Mailer, + # note that it will be overwritten if you use your own mailer class with default "from" parameter. config.mailer_sender = Errbit::Config.email_from # Configure the class responsible to send e-mails. @@ -15,69 +16,131 @@ Devise.setup do |config| require 'devise/orm/mongoid' # ==> Configuration for any authentication mechanism - # Configure which keys are used when authenticating an user. By default is + # Configure which keys are used when authenticating a user. The default is # just :email. You can configure it to use [:username, :subdomain], so for - # authenticating an user, both parameters are required. Remember that those + # authenticating a user, both parameters are required. Remember that those # parameters are used only when authenticating and not when retrieving from # session. If you need permissions, you should implement that in a before filter. + # You can also supply a hash where the value is a boolean determining whether + # or not authentication should be aborted when the value is not present. config.authentication_keys = [ Errbit::Config.user_has_username ? :username : :email ] + # Configure parameters from the request object used for authentication. Each entry + # given should be a request method and it will automatically be passed to the + # find_for_authentication method and considered in your model lookup. For instance, + # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. + # The same considerations mentioned for authentication_keys also apply to request_keys. + # config.request_keys = [] + + # Configure which authentication keys should be case-insensitive. + # These keys will be downcased upon creating or modifying a user and when used + # to authenticate or find a user. Default is :email. + config.case_insensitive_keys = [ Errbit::Config.user_has_username ? :username : :email ] + + # Configure which authentication keys should have whitespace stripped. + # These keys will have whitespace before and after removed upon creating or + # modifying a user and when used to authenticate or find a user. Default is :email. + config.strip_whitespace_keys = [ Errbit::Config.user_has_username ? :username : :email ] + # Tell if authentication through request.params is enabled. True by default. + # It can be set to an array that will enable params authentication only for the + # given strategies, for example, `config.params_authenticatable = [:database]` will + # enable it only for database (email + password) authentication. # config.params_authenticatable = true - # Tell if authentication through HTTP Basic Auth is enabled. True by default. - # config.http_authenticatable = true - - # Set this to true to use Basic Auth for AJAX requests. True by default. + # Tell if authentication through HTTP Auth is enabled. False by default. + # It can be set to an array that will enable http authentication only for the + # given strategies, for example, `config.http_authenticatable = [:token]` will + # enable it only for token authentication. The supported strategies are: + # :database = Support basic authentication with authentication key + password + # :token = Support basic authentication with token authentication key + # :token_options = Support token authentication with options as defined in + # http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html + # config.http_authenticatable = false + + # If http headers should be returned for AJAX requests. True by default. # config.http_authenticatable_on_xhr = true - # The realm used in Http Basic Authentication + # The realm used in Http Basic Authentication. "Application" by default. # config.http_authentication_realm = "Application" + # It will change confirmation, password recovery and other workflows + # to behave the same regardless if the e-mail provided was right or wrong. + # Does not affect registerable. + # config.paranoid = true + + # By default Devise will store the user in session. You can skip storage for + # :http_auth and :token_auth by adding those symbols to the array below. + # Notice that if you are skipping storage for all authentication paths, you + # may want to disable generating routes to Devise's sessions controller by + # passing :skip => :sessions to `devise_for` in your config/routes.rb + config.skip_session_storage = [:http_auth] + # ==> Configuration for :database_authenticatable # For bcrypt, this is the cost for hashing the password and defaults to 10. If # using other encryptors, it sets how many times you want the password re-encrypted. - config.stretches = 10 - - # Define which will be the encryption algorithm. Devise also supports encryptors - # from others authentication tools as :clearance_sha1, :authlogic_sha512 (then - # you should set stretches above to 20 for default behavior) and :restful_authentication_sha1 - # (then you should set stretches to 10, and copy REST_AUTH_SITE_KEY to pepper) - config.encryptor = :bcrypt + # + # Limiting the stretches to just one in testing will increase the performance of + # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use + # a value less than 10 in other environments. + config.stretches = Rails.env.test? ? 1 : 10 # Setup a pepper to generate the encrypted password. config.pepper = "425f10f555c1a4718aff3370ef9dd2d97a21622beb0400fde6b52177375ddcbe37a2dac6af9bca835c988e00c32887ee940ba111a78eab48234d8799936d36b9" # ==> Configuration for :confirmable - # The time you want to give your user to confirm his account. During this time - # he will be able to access your application without confirming. Default is nil. - # When confirm_within is zero, the user won't be able to sign in without confirming. - # You can use this to let your user access some features of your application - # without confirming the account, but blocking it after a certain period - # (ie 2 days). - # config.confirm_within = 2.days + # A period that the user is allowed to access the website even without + # confirming his account. For instance, if set to 2.days, the user will be + # able to access the website for two days without confirming his account, + # access will be blocked just in the third day. Default is 0.days, meaning + # the user cannot access the website without confirming his account. + # config.allow_unconfirmed_access_for = 2.days + + # A period that the user is allowed to confirm their account before their + # token becomes invalid. For example, if set to 3.days, the user can confirm + # their account within 3 days after the mail was sent, but on the fourth day + # their account can't be confirmed with the token any more. + # Default is nil, meaning there is no restriction on how long a user can take + # before confirming their account. + # config.confirm_within = 3.days + + # If true, requires any email changes to be confirmed (exactly the same way as + # initial account confirmation) to be applied. Requires additional unconfirmed_email + # db field (see migrations). Until confirmed new email is stored in + # unconfirmed email column, and copied to email column on successful confirmation. + config.reconfirmable = true + + # Defines which key will be used when confirming an account + # config.confirmation_keys = [ :email ] # ==> Configuration for :rememberable # The time the user will be remembered without asking for credentials again. config.remember_for = 2.weeks - # If true, a valid remember token can be re-used between multiple browsers. - # config.remember_across_browsers = true - # If true, extends the user's remember period when remembered via cookie. # config.extend_remember_period = false + # Options to be passed to the created cookie. For instance, you can set + # :secure => true in order to force SSL only cookies. + # config.rememberable_options = {} + # ==> Configuration for :validatable - # Range for password length + # Range for password length. Default is 8..128. config.password_length = 6..1024 - # Regex to use to validate the email address + # Email regex used to validate email formats. It simply asserts that + # one (and only one) @ exists in the given string. This is mainly + # to give user feedback and not to assert the e-mail validity. + # config.email_regexp = /\A[^@]+@[^@]+\z/ config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i # ==> Configuration for :timeoutable # The time you want to timeout the user session without activity. After this - # time the user will be asked for credentials again. - # config.timeout_in = 10.minutes + # time the user will be asked for credentials again. Default is 30 minutes. + # config.timeout_in = 30.minutes + + # If true, expires auth token on session timeout. + # config.expire_auth_token_on_timeout = false # ==> Configuration for :lockable # Defines which strategy will be used to lock an account. @@ -85,6 +148,9 @@ Devise.setup do |config| # :none = No lock strategy. You should handle locking by yourself. # config.lock_strategy = :failed_attempts + # Defines which key will be used when locking and unlocking an account + # config.unlock_keys = [ :email ] + # Defines which strategy will be used to unlock an account. # :email = Sends an unlock link to the user email # :time = Re-enables login after a certain amount of time (see :unlock_in below) @@ -99,6 +165,26 @@ Devise.setup do |config| # Time interval to unlock the account if :time is enabled as unlock_strategy. # config.unlock_in = 1.hour + # ==> Configuration for :recoverable + # + # Defines which key will be used when recovering the password for an account + # config.reset_password_keys = [ :email ] + + # Time interval you can reset your password with a reset password key. + # Don't put a too small interval or your users won't have the time to + # change their passwords. + config.reset_password_within = 6.hours + + # ==> Configuration for :encryptable + # Allow you to use another encryption algorithm besides bcrypt (default). You can use + # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, + # :authlogic_sha512 (then you should set stretches above to 20 for default behavior) + # and :restful_authentication_sha1 (then you should set stretches to 10, and copy + # REST_AUTH_SITE_KEY to pepper). + # + # Require the `devise-encryptable` gem when using anything other than bcrypt + # config.encryptor = :sha512 + # ==> Configuration for :token_authenticatable # Defines name of the authentication token params key config.token_authentication_key = :auth_token @@ -107,45 +193,63 @@ Devise.setup do |config| # Turn scoped views on. Before rendering "sessions/new", it will first check for # "users/sessions/new". It's turned off by default because it's slower if you # are using only default views. - # config.scoped_views = true + # config.scoped_views = false # Configure the default scope given to Warden. By default it's the first - # devise role declared in your routes. + # devise role declared in your routes (usually :user). # config.default_scope = :user - # Configure sign_out behavior. - # By default sign_out is scoped (i.e. /users/sign_out affects only :user scope). - # In case of sign_out_all_scopes set to true any logout action will sign out all active scopes. - # config.sign_out_all_scopes = false - - if Errbit::Config.github_authentication || Rails.env.test? - config.omniauth :github, - Errbit::Config.github_client_id, - Errbit::Config.github_secret, - :scope => Errbit::Config.github_access_scope.join(","), - :skip_info => true - end + # Set this configuration to false if you want /users/sign_out to sign out + # only the current scope. By default, Devise signs out all scopes. + # config.sign_out_all_scopes = true # ==> Navigation configuration # Lists the formats that should be treated as navigational. Formats like # :html, should redirect to the sign in page when the user does not have # access, but formats like :xml or :json, should return 401. + # # If you have any extra navigational formats, like :iphone or :mobile, you - # should add them to the navigational formats lists. Default is [:html] - # config.navigational_formats = [:html, :iphone] + # should add them to the navigational formats lists. + # + # The "*/*" below is required to match Internet Explorer requests. + # config.navigational_formats = ["*/*", :html] + + # The default HTTP method used to sign out a resource. Default is :delete. + config.sign_out_via = :delete + + # ==> OmniAuth + # Add a new OmniAuth provider. Check the wiki for more information on setting + # up on your models and hooks. + # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo' + + if Errbit::Config.github_authentication || Rails.env.test? + config.omniauth :github, + Errbit::Config.github_client_id, + Errbit::Config.github_secret, + :scope => Errbit::Config.github_access_scope.join(','), + :skip_info => true + end # ==> Warden configuration - # If you want to use other strategies, that are not (yet) supported by Devise, - # you can configure them inside the config.warden block. The example below - # allows you to setup OAuth, using http://github.com/roman/warden_oauth + # If you want to use other strategies, that are not supported by Devise, or + # change the failure app, you can configure them inside the config.warden block. # # config.warden do |manager| - # manager.oauth(:twitter) do |twitter| - # twitter.consumer_secret = - # twitter.consumer_key = - # twitter.options :site => 'http://twitter.com' - # end - # manager.default_strategies(:scope => :user).unshift :twitter_oauth + # manager.intercept_401 = false + # manager.default_strategies(:scope => :user).unshift :some_external_strategy # end -end + # ==> Mountable engine configurations + # When using Devise inside an engine, let's call it `MyEngine`, and this engine + # is mountable, there are some extra configurations to be taken into account. + # The following options are available, assuming the engine is mounted as: + # + # mount MyEngine, at: "/my_engine" + # + # The router that invoked `devise_for`, in the example above, would be: + # config.router_name = :my_engine + # + # When using omniauth, Devise cannot automatically set Omniauth path, + # so you need to do it manually. For the users scope, it would be: + # config.omniauth_path_prefix = "/my_engine/users/auth" +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 79a017c..cd32e20 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -24,3 +24,11 @@ en: error: "You can't delete yourself" update: success: "%{name}'s information was successfully updated." + devise: + registrations: + signed_up_but_unconfirmed: 'A message with a confirmation link has been sent to your email address. Please open the link to activate your account.' + signed_up_but_inactive: 'You have signed up successfully. However, we could not sign you in because your account is not yet activated.' + signed_up_but_locked: 'You have signed up successfully. However, we could not sign you in because your account is locked.' + omniauth_callbacks: + failure: "Could not authenticate you from %{kind} because \"%{reason}\"." + success: "Successfully authenticated from %{kind} account." diff --git a/spec/acceptance/sign_in_with_github_spec.rb b/spec/acceptance/sign_in_with_github_spec.rb index 1ea54a6..7b760c1 100644 --- a/spec/acceptance/sign_in_with_github_spec.rb +++ b/spec/acceptance/sign_in_with_github_spec.rb @@ -11,7 +11,7 @@ feature 'Sign in with GitHub' do visit '/' click_link 'Sign in with GitHub' - page.should have_content 'Successfully authorized from GitHub account' + page.should have_content I18n.t("devise.omniauth_callbacks.success", :kind => 'GitHub') end scenario 'reject unrecognized user if authenticating via GitHub' do -- libgit2 0.21.2