@@ -235,18 +235,7 @@ class AgentsController < ApplicationController |
||
| 235 | 235 |
|
| 236 | 236 |
# Sanitize params[:return] to prevent open redirect attacks, a common security issue. |
| 237 | 237 |
def redirect_back(message, options = {})
|
| 238 |
- case ret = params[:return] || options[:return] |
|
| 239 |
- when "show" |
|
| 240 |
- if @agent && !@agent.destroyed? |
|
| 241 |
- path = agent_path(@agent) |
|
| 242 |
- else |
|
| 243 |
- path = agents_path |
|
| 244 |
- end |
|
| 245 |
- when /\A#{Regexp::escape scenarios_path}\/\d+\z/, agents_path
|
|
| 246 |
- path = ret |
|
| 247 |
- end |
|
| 248 |
- |
|
| 249 |
- if path |
|
| 238 |
+ if path = filtered_agent_return_link(options) |
|
| 250 | 239 |
redirect_to path, notice: message |
| 251 | 240 |
else |
| 252 | 241 |
super agents_path, notice: message |
@@ -30,6 +30,20 @@ class ApplicationController < ActionController::Base |
||
| 30 | 30 |
basecamp_auth_check |
| 31 | 31 |
end |
| 32 | 32 |
|
| 33 |
+ def filtered_agent_return_link(options = {})
|
|
| 34 |
+ case ret = params[:return].presence || options[:return] |
|
| 35 |
+ when "show" |
|
| 36 |
+ if @agent && !@agent.destroyed? |
|
| 37 |
+ agent_path(@agent) |
|
| 38 |
+ else |
|
| 39 |
+ agents_path |
|
| 40 |
+ end |
|
| 41 |
+ when /\A#{Regexp::escape scenarios_path}\/\d+\z/, agents_path
|
|
| 42 |
+ ret |
|
| 43 |
+ end |
|
| 44 |
+ end |
|
| 45 |
+ helper_method :filtered_agent_return_link |
|
| 46 |
+ |
|
| 33 | 47 |
private |
| 34 | 48 |
|
| 35 | 49 |
def twitter_oauth_check |
@@ -12,7 +12,7 @@ |
||
| 12 | 12 |
<% end %> |
| 13 | 13 |
|
| 14 | 14 |
<li> |
| 15 |
- <%= link_to icon_tag('glyphicon-eye-open') + ' Show'.html_safe, agent_path(agent) %>
|
|
| 15 |
+ <%= link_to icon_tag('glyphicon-eye-open') + ' Show'.html_safe, agent_path(agent, return: return_to) %>
|
|
| 16 | 16 |
</li> |
| 17 | 17 |
|
| 18 | 18 |
<li class="divider"></li> |
@@ -14,7 +14,7 @@ |
||
| 14 | 14 |
<% @agents.each do |agent| %> |
| 15 | 15 |
<tr> |
| 16 | 16 |
<td class='<%= "agent-unavailable" if agent.unavailable? %>'> |
| 17 |
- <%= link_to agent.name, agent_path(agent) %> |
|
| 17 |
+ <%= link_to agent.name, agent_path(agent, return: (defined?(return_to) && return_to) || request.path) %> |
|
| 18 | 18 |
<br/> |
| 19 | 19 |
<span class='text-muted'><%= agent.short_type.titleize %></span> |
| 20 | 20 |
<% if agent.scenarios.present? %> |
@@ -64,7 +64,7 @@ |
||
| 64 | 64 |
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown"> |
| 65 | 65 |
<span class="glyphicon glyphicon-th-list"></span> Actions <span class="caret"></span> |
| 66 | 66 |
</button> |
| 67 |
- <%= render 'agents/action_menu', :agent => agent, :return_to => (defined?(return_to) && return_to) || request.path %> |
|
| 67 |
+ <%= render 'agents/action_menu', agent: agent, return_to: (defined?(return_to) && return_to) || request.path %> |
|
| 68 | 68 |
</div> |
| 69 | 69 |
</td> |
| 70 | 70 |
</tr> |
@@ -2,7 +2,7 @@ |
||
| 2 | 2 |
<div class='row'> |
| 3 | 3 |
<div class='col-md-2'> |
| 4 | 4 |
<ul class="nav nav-pills nav-stacked" id="show-tabs"> |
| 5 |
- <li><%= link_to icon_tag('glyphicon-chevron-left') + ' Back'.html_safe, agents_path %></li>
|
|
| 5 |
+ <li><%= link_to icon_tag('glyphicon-chevron-left') + ' Back'.html_safe, filtered_agent_return_link || agents_path %></li>
|
|
| 6 | 6 |
|
| 7 | 7 |
<% if agent_show_view(@agent).present? %> |
| 8 | 8 |
<li class='active'><a href="#summary" data-toggle="tab"><span class='glyphicon glyphicon-picture'></span> Summary</a></li> |
@@ -16,7 +16,7 @@ |
||
| 16 | 16 |
|
| 17 | 17 |
<div class="btn-group"> |
| 18 | 18 |
<%= link_to icon_tag('glyphicon-chevron-left') + ' Back', scenarios_path, class: "btn btn-default" %>
|
| 19 |
- <%= link_to icon_tag('glyphicon-plus') + ' New Agent', new_agent_path(scenario_id: @scenario.id), class: "btn btn-default" %>
|
|
| 19 |
+ <%= link_to icon_tag('glyphicon-plus') + ' New Agent', new_agent_path(scenario_id: @scenario.id, return: request.path), class: "btn btn-default" %>
|
|
| 20 | 20 |
<%= link_to icon_tag('glyphicon-random') + ' View Diagram', scenario_diagram_path(@scenario), class: "btn btn-default" %>
|
| 21 | 21 |
<%= link_to icon_tag('glyphicon-edit') + ' Edit', edit_scenario_path(@scenario), class: "btn btn-default" %>
|
| 22 | 22 |
<% if @scenario.source_url.present? %> |