From d6f1c3d9ec41199c9ffd76f4f85854cd443b84c2 Mon Sep 17 00:00:00 2001 From: Ryan Lue Date: Fri, 22 Jun 2018 18:38:56 +0800 Subject: [PATCH] Fix word boundary check in Ticket::Number::{Date,Increment}#check --- app/models/ticket/number/date.rb | 6 ++++-- app/models/ticket/number/increment.rb | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/models/ticket/number/date.rb b/app/models/ticket/number/date.rb index a939e3297..244609cb7 100644 --- a/app/models/ticket/number/date.rb +++ b/app/models/ticket/number/date.rb @@ -86,12 +86,14 @@ module Ticket::Number::Date end # probe format - string.scan(/\b#{Regexp.quote(ticket_hook)}#{Regexp.quote(ticket_hook_divider)}(\d{4,10}#{system_id}\d{2,40})\b/i) do + # NOTE: we use `(?<=\W|^)` at the start of the regular expressions below + # because `\b` fails when ticket_hook begins with a non-word character (like '#') + string.scan(/(?<=\W|^)#{Regexp.quote(ticket_hook)}#{Regexp.quote(ticket_hook_divider)}(\d{4,10}#{system_id}\d{2,40})\b/i) do ticket = Ticket.find_by(number: $1) break if ticket end if !ticket - string.scan(/\b#{Regexp.quote(ticket_hook)}\s{0,2}(\d{4,10}#{system_id}\d{2,40})\b/i) do + string.scan(/(?<=\W|^)#{Regexp.quote(ticket_hook)}\s{0,2}(\d{4,10}#{system_id}\d{2,40})\b/i) do ticket = Ticket.find_by(number: $1) break if ticket end diff --git a/app/models/ticket/number/increment.rb b/app/models/ticket/number/increment.rb index adbc39281..d104f6ed1 100644 --- a/app/models/ticket/number/increment.rb +++ b/app/models/ticket/number/increment.rb @@ -83,12 +83,14 @@ module Ticket::Number::Increment end # probe format - string.scan(/\b#{Regexp.quote(ticket_hook)}#{Regexp.quote(ticket_hook_divider)}(#{system_id}\d{2,48})\b/i) do + # NOTE: we use `(?<=\W|^)` at the start of the regular expressions below + # because `\b` fails when ticket_hook begins with a non-word character (like '#') + string.scan(/(?<=\W|^)#{Regexp.quote(ticket_hook)}#{Regexp.quote(ticket_hook_divider)}(#{system_id}\d{2,48})\b/i) do ticket = Ticket.find_by(number: $1) break if ticket end if !ticket - string.scan(/\b#{Regexp.quote(ticket_hook)}\s{0,2}(#{system_id}\d{2,48})\b/i) do + string.scan(/(?<=\W|^)#{Regexp.quote(ticket_hook)}\s{0,2}(#{system_id}\d{2,48})\b/i) do ticket = Ticket.find_by(number: $1) break if ticket end