debian-mirror-gitlab/lib/gitlab/untrusted_regexp/ruby_syntax.rb

47 lines
1.4 KiB
Ruby
Raw Normal View History

2019-04-03 18:18:56 +05:30
# frozen_string_literal: true
module Gitlab
class UntrustedRegexp
# This class implements support for Ruby syntax of regexps
# and converts that to RE2 representation:
# /<regexp>/<flags>
class RubySyntax
2019-07-07 11:18:12 +05:30
PATTERN = %r{^/(?<regexp>.*)/(?<flags>[ismU]*)$}.freeze
2019-04-03 18:18:56 +05:30
# Checks if pattern matches a regexp pattern
# but does not enforce it's validity
def self.matches_syntax?(pattern)
pattern.is_a?(String) && pattern.match(PATTERN).present?
end
# The regexp can match the pattern `/.../`, but may not be fabricatable:
# it can be invalid or incomplete: `/match ( string/`
2022-05-07 20:08:51 +05:30
def self.valid?(pattern)
!!self.fabricate(pattern)
2019-04-03 18:18:56 +05:30
end
2022-05-07 20:08:51 +05:30
def self.fabricate(pattern, project: nil)
self.fabricate!(pattern, project: project)
2019-04-03 18:18:56 +05:30
rescue RegexpError
nil
end
2022-05-07 20:08:51 +05:30
def self.fabricate!(pattern, project: nil)
2019-04-03 18:18:56 +05:30
raise RegexpError, 'Pattern is not string!' unless pattern.is_a?(String)
matches = pattern.match(PATTERN)
raise RegexpError, 'Invalid regular expression!' if matches.nil?
2022-05-07 20:08:51 +05:30
create_untrusted_regexp(matches[:regexp], matches[:flags])
2019-04-03 18:18:56 +05:30
end
2019-07-07 11:18:12 +05:30
def self.create_untrusted_regexp(pattern, flags)
pattern.prepend("(?#{flags})") if flags.present?
UntrustedRegexp.new(pattern, multiline: false)
end
private_class_method :create_untrusted_regexp
2019-04-03 18:18:56 +05:30
end
end
end