Defect #26443 » 26443_fix_user_link_syntax.patch
| lib/redmine/wiki_formatting.rb | ||
|---|---|---|
| 153 | 153 | |
| 154 | 154 |
# Destructively replaces email addresses into clickable links |
| 155 | 155 |
def auto_mailto!(text) |
| 156 |
text.gsub!(/((?<!@)\b[\w\.!#\$%\-+.\/]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do
|
|
| 156 |
text.gsub!(/([\w\.!#\$%\-+.\/]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do |
|
| 157 | 157 |
mail = $1 |
| 158 | 158 |
if text.match(/<a\b[^>]*>(.*)(#{Regexp.escape(mail)})(.*)<\/a>/)
|
| 159 | 159 |
|
| ... | ... | |
| 162 | 162 |
end |
| 163 | 163 |
end |
| 164 | 164 |
end |
| 165 | ||
| 166 |
def restore_redmine_links(html) |
|
| 167 |
# restore wiki links eg. [[Foo]] |
|
| 168 |
html.gsub!(%r{\[<a href="(.*?)">(.*?)</a>\]}) do
|
|
| 169 |
"[[#{$2}]]"
|
|
| 170 |
end |
|
| 171 |
# restore Redmine links with double-quotes, eg. version:"1.0" |
|
| 172 |
html.gsub!(/(\w):"(.+?)"/) do |
|
| 173 |
"#{$1}:\"#{$2}\""
|
|
| 174 |
end |
|
| 175 |
# restore user links with @ in login name eg. [@jsmith@somenet.foo] |
|
| 176 |
html.gsub!(%r{[@\A]<a(\sclass="email")? href="mailto:(.*?)">(.*?)</a>}) do
|
|
| 177 |
"@#{$2}"
|
|
| 178 |
end |
|
| 179 |
# restore user links with @ in login name eg. [user:jsmith@somenet.foo] |
|
| 180 |
html.gsub!(%r{\buser:<a(\sclass="email")? href="mailto:(.*?)">(.*?)<\/a>}) do
|
|
| 181 |
"user:#{$2}"
|
|
| 182 |
end |
|
| 183 |
html |
|
| 184 |
end |
|
| 165 | 185 |
end |
| 166 | 186 | |
| 167 | 187 |
# Default formatter module |
| ... | ... | |
| 180 | 200 |
t = CGI::escapeHTML(@text) |
| 181 | 201 |
auto_link!(t) |
| 182 | 202 |
auto_mailto!(t) |
| 203 |
restore_redmine_links(t) |
|
| 183 | 204 |
simple_format(t, {}, :sanitize => false)
|
| 184 | 205 |
end |
| 185 | 206 |
end |
| lib/redmine/wiki_formatting/markdown/formatter.rb | ||
|---|---|---|
| 52 | 52 |
end |
| 53 | 53 | |
| 54 | 54 |
class Formatter |
| 55 |
include Redmine::WikiFormatting::LinksHelper |
|
| 56 |
alias :inline_restore_redmine_links :restore_redmine_links |
|
| 57 | ||
| 55 | 58 |
def initialize(text) |
| 56 | 59 |
@text = text |
| 57 | 60 |
end |
| 58 | 61 | |
| 59 | 62 |
def to_html(*args) |
| 60 | 63 |
html = formatter.render(@text) |
| 61 |
# restore wiki links eg. [[Foo]] |
|
| 62 |
html.gsub!(%r{\[<a href="(.*?)">(.*?)</a>\]}) do
|
|
| 63 |
"[[#{$2}]]"
|
|
| 64 |
end |
|
| 65 |
# restore Redmine links with double-quotes, eg. version:"1.0" |
|
| 66 |
html.gsub!(/(\w):"(.+?)"/) do |
|
| 67 |
"#{$1}:\"#{$2}\""
|
|
| 68 |
end |
|
| 69 |
# restore user links with @ in login name eg. [@jsmith@somenet.foo] |
|
| 70 |
html.gsub!(%r{[@\A]<a href="mailto:(.*?)">(.*?)</a>}) do
|
|
| 71 |
"@#{$2}"
|
|
| 72 |
end |
|
| 64 |
html = inline_restore_redmine_links(html) |
|
| 73 | 65 |
html |
| 74 | 66 |
end |
| 75 | 67 | |
| lib/redmine/wiki_formatting/textile/formatter.rb | ||
|---|---|---|
| 27 | 27 | |
| 28 | 28 |
alias :inline_auto_link :auto_link! |
| 29 | 29 |
alias :inline_auto_mailto :auto_mailto! |
| 30 |
alias :inline_restore_redmine_links :restore_redmine_links |
|
| 30 | 31 | |
| 31 | 32 |
# auto_link rule after textile rules so that it doesn't break !image_url! tags |
| 32 |
RULES = [:textile, :block_markdown_rule, :inline_auto_link, :inline_auto_mailto] |
|
| 33 |
RULES = [:textile, :block_markdown_rule, :inline_auto_link, :inline_auto_mailto, :inline_restore_redmine_links]
|
|
| 33 | 34 | |
| 34 | 35 |
def initialize(*args) |
| 35 | 36 |
super |
| test/helpers/application_helper_test.rb | ||
|---|---|---|
| 282 | 282 |
end |
| 283 | 283 | |
| 284 | 284 |
def test_redmine_links |
| 285 |
user_with_email_login = User.generate!(:login => 'abcd@example.com') |
|
| 286 |
user_with_email_login_2 = User.generate!(:login => 'foo.bar@example.com') |
|
| 287 |
u_email_id = user_with_email_login.id |
|
| 288 |
u_email_id_2 = user_with_email_login_2.id |
|
| 289 | ||
| 285 | 290 |
issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3},
|
| 286 | 291 |
:class => Issue.find(3).css_classes, :title => 'Bug: Error 281 when updating a recipe (New)') |
| 287 | 292 |
note_link = link_to('#3-14', {:controller => 'issues', :action => 'show', :id => 3, :anchor => 'note-14'},
|
| ... | ... | |
| 388 | 393 |
'user:jsmith' => link_to_user(User.find_by_id(2)), |
| 389 | 394 |
'user#2' => link_to_user(User.find_by_id(2)), |
| 390 | 395 |
'@jsmith' => link_to_user(User.find_by_id(2)), |
| 396 |
'@abcd@example.com' => link_to_user(User.find_by_id(u_email_id)), |
|
| 397 |
'user:abcd@example.com' => link_to_user(User.find_by_id(u_email_id)), |
|
| 398 |
'@foo.bar@example.com' => link_to_user(User.find_by_id(u_email_id_2)), |
|
| 399 |
'user:foo.bar@example.com' => link_to_user(User.find_by_id(u_email_id_2)), |
|
| 391 | 400 |
# invalid user |
| 392 | 401 |
'user:foobar' => 'user:foobar', |
| 393 | 402 |
} |
| ... | ... | |
| 395 | 404 |
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text), "#{text} failed" }
|
| 396 | 405 |
end |
| 397 | 406 | |
| 398 |
def test_user_links_with_email_as_login_name_should_not_be_parsed |
|
| 399 |
u = User.generate!(:login => 'jsmith@somenet.foo')
|
|
| 400 |
raw = "@jsmith@somenet.foo should not be parsed in jsmith@somenet.foo"
|
|
| 407 |
def test_user_links_with_email_as_login_name_should_not_be_parsed_textile
|
|
| 408 |
with_settings :text_formatting => 'textile' do
|
|
| 409 |
u = User.generate!(:login => 'jsmith@somenet.foo')
|
|
| 401 | 410 | |
| 402 |
assert_match %r{<p><a class="user active".*>#{u.name}</a> should not be parsed in <a class="email" href="mailto:jsmith@somenet.foo">jsmith@somenet.foo</a></p>},
|
|
| 403 |
textilizable(raw, :project => Project.find(1)) |
|
| 411 |
# user link format: @jsmith@somenet.foo |
|
| 412 |
raw = "@jsmith@somenet.foo should not be parsed in jsmith@somenet.foo" |
|
| 413 |
assert_match %r{<p><a class="user active".*>#{u.name}</a> should not be parsed in <a class="email" href="mailto:jsmith@somenet.foo">jsmith@somenet.foo</a></p>},
|
|
| 414 |
textilizable(raw, :project => Project.find(1)) |
|
| 415 | ||
| 416 |
# user link format: user:jsmith@somenet.foo |
|
| 417 |
raw = "user:jsmith@somenet.foo should not be parsed in jsmith@somenet.foo" |
|
| 418 |
assert_match %r{<p><a class="user active".*>#{u.name}</a> should not be parsed in <a class="email" href="mailto:jsmith@somenet.foo">jsmith@somenet.foo</a></p>},
|
|
| 419 |
textilizable(raw, :project => Project.find(1)) |
|
| 420 |
end |
|
| 421 |
end |
|
| 422 | ||
| 423 |
def test_user_links_with_email_as_login_name_should_not_be_parsed_markdown |
|
| 424 |
with_settings :text_formatting => 'markdown' do |
|
| 425 |
u = User.generate!(:login => 'jsmith@somenet.foo') |
|
| 426 | ||
| 427 |
# user link format: @jsmith@somenet.foo |
|
| 428 |
raw = "@jsmith@somenet.foo should not be parsed in jsmith@somenet.foo" |
|
| 429 |
assert_match %r{<p><a class=\"user active\".*>#{u.name}</a> should not be parsed in <a href=\"mailto:jsmith@somenet.foo\">jsmith@somenet.foo</a></p>},
|
|
| 430 |
textilizable(raw, :project => Project.find(1)) |
|
| 431 | ||
| 432 |
# user link format: user:jsmith@somenet.foo |
|
| 433 |
raw = "user:jsmith@somenet.foo should not be parsed in jsmith@somenet.foo" |
|
| 434 |
assert_match %r{<p><a class=\"user active\".*>#{u.name}</a> should not be parsed in <a href=\"mailto:jsmith@somenet.foo\">jsmith@somenet.foo</a></p>},
|
|
| 435 |
textilizable(raw, :project => Project.find(1)) |
|
| 436 |
end |
|
| 404 | 437 |
end |
| 405 | 438 | |
| 406 | 439 |
def test_should_not_parse_redmine_links_inside_link |
- « Previous
- 1
- 2
- Next »