about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2017-03-05 18:08:19 +0100
committerEugen Rochko <eugen@zeonfederated.com>2017-03-05 18:08:19 +0100
commit4fb95c91fbf808bafa581b8976d94ec36eee8619 (patch)
treeb371348da6ebfddb60c81794c0954d641f54a314
parent5f4e402204c9da289d1a6b5e3902bf2c9cfe61c1 (diff)
Fix wrongful matching of last period in extended usernames
Fix anchor tags in some wikipedia URLs being matches as a hashtag
-rw-r--r--app/models/account.rb2
-rw-r--r--app/models/tag.rb2
-rw-r--r--spec/models/account_spec.rb9
-rw-r--r--spec/models/tag_spec.rb10
4 files changed, 20 insertions, 3 deletions
diff --git a/app/models/account.rb b/app/models/account.rb
index 2fa6bab71..078078945 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -4,7 +4,7 @@ class Account < ApplicationRecord
   include Targetable
   include PgSearch
 
-  MENTION_RE = /(?:^|[^\/\w])@([a-z0-9_]+(?:@[a-z0-9\.\-]+)?)/i
+  MENTION_RE = /(?:^|[^\/\w])@([a-z0-9_]+(?:@[a-z0-9\.\-]+[a-z0-9]+)?)/i
   IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
 
   # Local users
diff --git a/app/models/tag.rb b/app/models/tag.rb
index 77a73cce8..0d2fe43b8 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -3,7 +3,7 @@
 class Tag < ApplicationRecord
   has_and_belongs_to_many :statuses
 
-  HASHTAG_RE = /(?:^|[^\/\w])#([[:word:]_]*[[:alpha:]_][[:word:]_]*)/i
+  HASHTAG_RE = /(?:^|[^\/\)\w])#([[:word:]_]*[[:alpha:]_][[:word:]_]*)/i
 
   validates :name, presence: true, uniqueness: true
 
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 287f389ac..91c8d75cf 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -178,7 +178,6 @@ RSpec.describe Account, type: :model do
     end
   end
 
-
   describe 'MENTION_RE' do
     subject { Account::MENTION_RE }
 
@@ -190,6 +189,14 @@ RSpec.describe Account, type: :model do
       expect(subject.match('@alice Hey how are you?')[1]).to eq 'alice'
     end
 
+    it 'matches full usernames' do
+      expect(subject.match('@alice@example.com')[1]).to eq 'alice@example.com'
+    end
+
+    it 'matches full usernames with a dot at the end' do
+      expect(subject.match('Hello @alice@example.com.')[1]).to eq 'alice@example.com'
+    end
+
     it 'matches dot-prepended usernames' do
       expect(subject.match('.@alice I want everybody to see this')[1]).to eq 'alice'
     end
diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb
index 9a7f481e4..360bbc16d 100644
--- a/spec/models/tag_spec.rb
+++ b/spec/models/tag_spec.rb
@@ -1,5 +1,15 @@
 require 'rails_helper'
 
 RSpec.describe Tag, type: :model do
+  describe 'HASHTAG_RE' do
+    subject { Tag::HASHTAG_RE }
 
+    it 'does not match URLs with anchors with non-hashtag characters' do
+      expect(subject.match('Check this out https://medium.com/@alice/some-article#.abcdef123')).to be_nil
+    end
+
+    it 'does not match URLs with hashtag-like anchors' do
+      expect(subject.match('https://en.wikipedia.org/wiki/Ghostbusters_(song)#Lawsuit')).to be_nil
+    end
+  end
 end