2018-12-05 23:21:45 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module RuboCop
|
|
|
|
module Cop
|
|
|
|
# Checks for a leading '/' in route redirects
|
2019-12-04 20:38:33 +05:30
|
|
|
# For more information see: https://gitlab.com/gitlab-org/gitlab-foss/issues/50645
|
2018-12-05 23:21:45 +05:30
|
|
|
#
|
|
|
|
# @example
|
|
|
|
# # bad
|
2020-11-24 15:15:51 +05:30
|
|
|
# root to: redirect('/-/autocomplete/users')
|
2018-12-05 23:21:45 +05:30
|
|
|
#
|
|
|
|
# # good
|
2020-11-24 15:15:51 +05:30
|
|
|
# root to: redirect('-/autocomplete/users')
|
2018-12-05 23:21:45 +05:30
|
|
|
#
|
|
|
|
|
2022-10-11 01:57:18 +05:30
|
|
|
class AvoidRouteRedirectLeadingSlash < RuboCop::Cop::Base
|
|
|
|
extend RuboCop::Cop::AutoCorrector
|
|
|
|
|
2018-12-05 23:21:45 +05:30
|
|
|
MSG = 'Do not use a leading "/" in route redirects'
|
|
|
|
|
|
|
|
def_node_matcher :leading_slash_in_redirect?, <<~PATTERN
|
|
|
|
(send nil? :redirect (str #has_leading_slash?))
|
|
|
|
PATTERN
|
|
|
|
|
|
|
|
def on_send(node)
|
|
|
|
return unless in_routes?(node)
|
|
|
|
return unless leading_slash_in_redirect?(node)
|
|
|
|
|
2022-10-11 01:57:18 +05:30
|
|
|
add_offense(node) do |corrector|
|
|
|
|
corrector.replace(node.loc.expression, remove_leading_slash(node))
|
|
|
|
end
|
2018-12-05 23:21:45 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def has_leading_slash?(str)
|
|
|
|
str.start_with?("/")
|
|
|
|
end
|
|
|
|
|
|
|
|
def in_routes?(node)
|
|
|
|
path = node.location.expression.source_buffer.name
|
|
|
|
dirname = File.dirname(path)
|
|
|
|
filename = File.basename(path)
|
|
|
|
dirname.end_with?('config/routes') || filename.end_with?('routes.rb')
|
|
|
|
end
|
|
|
|
|
|
|
|
def remove_leading_slash(node)
|
|
|
|
node.source.sub('/', '')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|