mirror of
https://github.com/redmine/redmine.git
synced 2025-11-10 07:16:03 +01:00
Stricter validation of given revisions of repositories (#35085).
Patch by Holger Just. git-svn-id: http://svn.redmine.org/redmine/trunk@20962 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -330,7 +330,7 @@ class RepositoriesController < ApplicationController
|
|||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
REV_PARAM_RE = %r{\A[a-f0-9]*\Z}i
|
REV_PARAM_RE = %r{\A[a-f0-9]*\z}i
|
||||||
|
|
||||||
def find_project_repository
|
def find_project_repository
|
||||||
@project = Project.find(params[:id])
|
@project = Project.find(params[:id])
|
||||||
@@ -341,14 +341,12 @@ class RepositoriesController < ApplicationController
|
|||||||
end
|
end
|
||||||
(render_404; return false) unless @repository
|
(render_404; return false) unless @repository
|
||||||
@path = params[:path].is_a?(Array) ? params[:path].join('/') : params[:path].to_s
|
@path = params[:path].is_a?(Array) ? params[:path].join('/') : params[:path].to_s
|
||||||
@rev = params[:rev].blank? ? @repository.default_branch : params[:rev].to_s.strip
|
|
||||||
@rev_to = params[:rev_to]
|
|
||||||
|
|
||||||
unless REV_PARAM_RE.match?(@rev.to_s) && REV_PARAM_RE.match?(@rev_to.to_s)
|
@rev = params[:rev].to_s.strip.presence || @repository.default_branch
|
||||||
if @repository.branches.blank?
|
raise InvalidRevisionParam unless valid_name?(@rev)
|
||||||
raise InvalidRevisionParam
|
|
||||||
end
|
@rev_to = params[:rev_to].to_s.strip.presence
|
||||||
end
|
raise InvalidRevisionParam unless valid_name?(@rev_to)
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
render_404
|
render_404
|
||||||
rescue InvalidRevisionParam
|
rescue InvalidRevisionParam
|
||||||
@@ -433,4 +431,11 @@ class RepositoriesController < ApplicationController
|
|||||||
'attachment'
|
'attachment'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def valid_name?(rev)
|
||||||
|
return true if rev.nil?
|
||||||
|
return true if REV_PARAM_RE.match?(rev)
|
||||||
|
|
||||||
|
@repository ? @repository.valid_name?(rev) : true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -463,6 +463,10 @@ class Repository < ActiveRecord::Base
|
|||||||
scope
|
scope
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def valid_name?(name)
|
||||||
|
scm.valid_name?(name)
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
# Validates repository url based against an optional regular expression
|
# Validates repository url based against an optional regular expression
|
||||||
|
|||||||
@@ -176,6 +176,14 @@ module Redmine
|
|||||||
(path[-1, 1] == "/") ? path[0..-2] : path
|
(path[-1, 1] == "/") ? path[0..-2] : path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def valid_name?(name)
|
||||||
|
return true if name.nil?
|
||||||
|
return true if name.is_a?(Integer) && name > 0
|
||||||
|
return true if name.is_a?(String) && name =~ /\A[0-9]*\z/
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def retrieve_root_url
|
def retrieve_root_url
|
||||||
|
|||||||
@@ -420,6 +420,18 @@ module Redmine
|
|||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def valid_name?(name)
|
||||||
|
return false unless name.is_a?(String)
|
||||||
|
|
||||||
|
return false if name.start_with?('-', '/', 'refs/heads/', 'refs/remotes/')
|
||||||
|
return false if name == 'HEAD'
|
||||||
|
|
||||||
|
git_cmd ['show-ref', '--heads', '--tags', '--quiet', '--', name]
|
||||||
|
true
|
||||||
|
rescue ScmCommandAborted
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
class Revision < Redmine::Scm::Adapters::Revision
|
class Revision < Redmine::Scm::Adapters::Revision
|
||||||
# Returns the readable identifier
|
# Returns the readable identifier
|
||||||
def format_identifier
|
def format_identifier
|
||||||
|
|||||||
@@ -296,6 +296,15 @@ module Redmine
|
|||||||
Annotate.new
|
Annotate.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def valid_name?(name)
|
||||||
|
return false unless name.nil? || name.is_a?(String)
|
||||||
|
|
||||||
|
# Mercurials names don't need to be checked further as its CLI
|
||||||
|
# interface is restrictive enough to reject any invalid names on its
|
||||||
|
# own.
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
class Revision < Redmine::Scm::Adapters::Revision
|
class Revision < Redmine::Scm::Adapters::Revision
|
||||||
# Returns the readable identifier
|
# Returns the readable identifier
|
||||||
def format_identifier
|
def format_identifier
|
||||||
|
|||||||
Reference in New Issue
Block a user