Login Form - Custom password recovery URL

Added by Álvaro Formoso 2 months ago

Hello everyone,

I'm trying to customize the 'Password Recovery URL' that's shown on the Redmine login page to redirect to an external URL, as the instance I am working with is integrated with an external user base source.

Following the code trace we can see that the link HTML tag is something like:

  <a class="lost_password" href="/account/lost_password">Recover your password</a>

Looking for the code piece responsible for this part among the Redmine source code, on the 'app/views/account/login.html.erb' file can be found:

  <label for="password">
    <%= link_to l(:label_password_lost), lost_password_path, :class => "lost_password" if Setting.lost_password? %>
  <%= password_field_tag 'password', nil, :tabindex => '2' %>

From this code I understand that the '/account/lost_password' path that's the value of the href attribute on the HTML link comes from the lost_password_path variable. What I cannot find is where this lost_password_path is defined. Maybe someone can point me on the right direction. :)

In the end, what I'm looking for is a way to customize the password recovery URL in a clean way, not overwriting the variable with the desired value on the template, for the obvious maintainability reasons.

The versions of the instance are:

  Redmine version                3.4.6.stable
  Ruby version                   2.2.6-p396 (2016-11-15) [x86_64-linux]
  Rails version                  4.2.8
  Environment                    funandgames
  Database adapter               Mysql2

Thank you.

Replies (3)

RE: Login Form - Custom password recovery URL - Added by Mayama Takeshi 2 months ago

I don't know much about rails but out of curiosity I grepped the code and could not find the definition of lost_password_path either:

root@takeshi:redmine-3.4.2# find . -type f|xargs grep lost_password_path
./app/views/account/login.html.erb:    <%= link_to l(:label_password_lost), lost_password_path, :class => "lost_password" if Setting.lost_password? %>
./app/views/account/lost_password.html.erb:<%= form_tag(lost_password_path) do %>
./app/views/account/password_recovery.html.erb:<%= form_tag(lost_password_path) do %>
./app/controllers/account_controller.rb:          handle_inactive_user(user, lost_password_path)

Then I googled and found this:

If you append _path you will get relative URL like /school/check_teachers and if you append _url you will get absolute URL like ` local host:3000/school/check_teachers` depending on the rails environment and the host specified in the config files.

Ref: https://stackoverflow.com/questions/8477301/link-to-path-definition

So, I understand this is not configurable and you would have indeed to replace lost_password_path with the external URL you want to call (I tested changing it to "http://google.com" and it worked).
You could patch the code to check if a lost_password_url is defined in configuration file and use it instead of lost_password_path and try to have it pushed to redmine repo so to not keep patching the code every time you update your redmine version.

RE: Login Form - Custom password recovery URL - Added by Go MAEDA 2 months ago

The path of lost_password is defined on this line: source:tags/4.0.0/config/routes.rb#L24

I am not sure whether you can connect an external URL to lost_password, but this page may help you to understand config/routes.rb.

RE: Login Form - Custom password recovery URL - Added by Mayama Takeshi 2 months ago

Following Maeda's tip, I found this:

Then I tried this change in config/routes.rb and it worked:

  match 'account/lost_password' => redirect("http://yahoo.com"), :via => [:get, :post], :as => 'lost_password'