Class: Gitlab::UntrustedRegexp::RubySyntax
- Inherits:
-
Object
- Object
- Gitlab::UntrustedRegexp::RubySyntax
- Defined in:
- lib/gitlab/untrusted_regexp/ruby_syntax.rb
Overview
This class implements support for Ruby syntax of regexps and converts that to RE2 representation: /<regexp>/<flags>
Constant Summary collapse
- PATTERN =
%r{^/(?<regexp>.*)/(?<flags>[ismU]*)$}.freeze
Class Method Summary collapse
- .fabricate(pattern, fallback: false) ⇒ Object
- .fabricate!(pattern, fallback: false) ⇒ Object
-
.matches_syntax?(pattern) ⇒ Boolean
Checks if pattern matches a regexp pattern but does not enforce it's validity.
-
.valid?(pattern, fallback: false) ⇒ Boolean
The regexp can match the pattern `/…/`, but may not be fabricatable: it can be invalid or incomplete: `/match ( string/`.
Class Method Details
.fabricate(pattern, fallback: false) ⇒ Object
23 24 25 26 27 |
# File 'lib/gitlab/untrusted_regexp/ruby_syntax.rb', line 23 def self.fabricate(pattern, fallback: false) self.fabricate!(pattern, fallback: fallback) rescue RegexpError nil end |
.fabricate!(pattern, fallback: false) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/gitlab/untrusted_regexp/ruby_syntax.rb', line 29 def self.fabricate!(pattern, fallback: false) raise RegexpError, 'Pattern is not string!' unless pattern.is_a?(String) matches = pattern.match(PATTERN) raise RegexpError, 'Invalid regular expression!' if matches.nil? begin create_untrusted_regexp(matches[:regexp], matches[:flags]) rescue RegexpError raise unless fallback && Feature.enabled?(:allow_unsafe_ruby_regexp, default_enabled: false) create_ruby_regexp(matches[:regexp], matches[:flags]) end end |
.matches_syntax?(pattern) ⇒ Boolean
Checks if pattern matches a regexp pattern but does not enforce it's validity
13 14 15 |
# File 'lib/gitlab/untrusted_regexp/ruby_syntax.rb', line 13 def self.matches_syntax?(pattern) pattern.is_a?(String) && pattern.match(PATTERN).present? end |
.valid?(pattern, fallback: false) ⇒ Boolean
The regexp can match the pattern `/…/`, but may not be fabricatable: it can be invalid or incomplete: `/match ( string/`
19 20 21 |
# File 'lib/gitlab/untrusted_regexp/ruby_syntax.rb', line 19 def self.valid?(pattern, fallback: false) !!self.fabricate(pattern, fallback: fallback) end |