diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-05-17 13:29:47 +0300 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-05-17 13:29:47 +0300 |
commit | 0ce63efe966840edb6e6184cf1abcef272a24dfc (patch) | |
tree | 5a857a8ba298446325b97992098db99fac1876e8 /lib/gitlab | |
parent | f52de2f73cc9d26c26fd66c23892ac42bf973b05 (diff) |
Add extended /regexp/ scheme support to untrusted regexp
Diffstat (limited to 'lib/gitlab')
-rw-r--r-- | lib/gitlab/untrusted_regexp.rb | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/gitlab/untrusted_regexp.rb b/lib/gitlab/untrusted_regexp.rb index ce1cf737663..70d1a7c6535 100644 --- a/lib/gitlab/untrusted_regexp.rb +++ b/lib/gitlab/untrusted_regexp.rb @@ -9,6 +9,8 @@ module Gitlab # there is a strict limit on total execution time. See the RE2 documentation # at https://github.com/google/re2/wiki/Syntax for more details. class UntrustedRegexp + require_dependency 're2' + delegate :===, :source, to: :regexp def initialize(pattern, multiline: false) @@ -52,6 +54,27 @@ module Gitlab Regexp.new(pattern) end + def self.valid?(pattern) + self.fabricate(pattern) + rescue RegexpError + false + end + + def self.fabricate(pattern) + matches = pattern.match(%r{^/(?<regexp>.+)/(?<flags>[ismU]*)$}) + + if matches + expression = matches[:regexp] + flags = matches[:flags] + + expression.prepend("(?#{flags})") if flags.present? + + self.new(expression, multiline: false) + else + self.new(pattern, multiline: false) + end + end + private attr_reader :regexp |