Defect #20420
closedauto_link in wiki_formatter fails
0%
Description
Environment:
sh: 1: darcs: not found sh: 1: hg: not found sh: 1: cvs: not found sh: 1: bzr: not found Environment: Redmine version 3.0.4.stable Ruby version 1.9.3-p448 (2013-06-27) [i686-linux] Rails version 4.2.3 Environment production Database adapter Mysql2 SCM: Subversion 1.8.10 Git 2.1.4 Filesystem Redmine plugins: redmine_ckeditor 1.1.0 redmine_contacts 4.0.1 redmine_contacts_helpdesk 3.0.0 redmine_contacts_invoices 4.0.0 redmine_finance 2.0.0
The error occures in context with the redmine_contacts and the redmine_ckeditor, but the failing code is lib/redmine/wiki_formatting.rb of the core-code.
To reproduce the error create a contact and add a note with the following content:
<p>%%[Grußformel]%% Schuttenberg,<br /> <br /> vielen Dank für die Anfrage und das nette Gespräch.<br /> <br /> Wie besprochen habe ich Ihnen eben einen Demozugang mit folgenden Zugangsdaten eingerichtet:<br /> <br /> URL: <a class="external" href="http://civihosting.systopia.de/">http://civihosting.systopia.de/</a><br /> Benutzername: XXXX<br /> Passwort: XXXXX<br /> <br /> Ich habe zusätzlich zu den Kernfunktionen wie besprochen nun zunächst folgende Module aktiviert:</p> <ul> <li><b>Versand und Auswertung von Mailings (z.B. Newslettern) </b></li> <li><b>Mitgliederverwaltung </b></li> <li><b>Spendenverwaltung</b></li> </ul> <p>Es gibt darüber hinaus noch einige weitere Funktionen (z.B. ein <b> Veranstaltungs- und Kampagnenmanagement</b>), die ich aber aus Gründen der Übersichtlichkeit zunächst nicht aktiviert habe - falls Sie diese auch testen wollen, sagen Sie gerne Bescheid.<br /> <br /> CiviCRM ist stark anpassungsf... "(weiter lesen)":/redmine/notes/88?project_id=systopia
This breaks the contact-view (not the view of the note) and produces the following log-message:
Started GET "/redmine/contacts/137?project_id=systopia" for 130.180.124.102 at 2015-07-27 14:53:12 +0200 Processing by ContactsController#show as HTML Parameters: {"project_id"=>"systopia", "id"=>"137"} Current user: thomas (id=8) Rendered plugins/redmine_contacts/app/views/contacts_tags/_tags_form.html.erb (3.0ms) Rendered plugins/redmine_contacts/app/views/contacts/_form_tags.html.erb (8.4ms) Rendered attachments/_form.html.erb (2.1ms) Rendered plugins/redmine_contacts/app/views/notes/_form.html.erb (6.7ms) Rendered plugins/redmine_contacts/app/views/notes/_add.html.erb (8.0ms) Rendered plugins/redmine_contacts/app/views/notes/_note_item.html.erb (20.1ms) Rendered plugins/redmine_contacts/app/views/contacts/_notes.html.erb (134.1ms) Rendered plugins/redmine_contacts/app/views/common/_contact_tabs.html.erb (136.6ms) Rendered plugins/redmine_contacts/app/views/contacts/show.html.erb within layouts/base (172.3ms) Completed 500 Internal Server Error in 211ms (ActiveRecord: 10.8ms) ActionView::Template::Error (undefined method `[]' for nil:NilClass): 39: <% end %> 40: </div> 41: <div class="wiki note"> 42: <%= note_content(note_item) %> 43: <%= auto_contacts_thumbnails(note_item) %> 44: <%= render :partial => 'attachments/links', :locals => {:attachments => note_item.attachments, :options => {}} if note_item.attachments.any? %> 45: </div> lib/redmine/wiki_formatting.rb:125:in `block in auto_link!' lib/redmine/wiki_formatting.rb:116:in `auto_link!' lib/redmine/wiki_formatting.rb:71:in `to_html' app/helpers/application_helper.rb:574:in `textilizable'
Further investigations shows, that for some html-code-snippets (like the one above - I actually was not able to determine the exact combination of tags/words/formatting-stuff that leads to the error) the following code of lib/redmine/wiki_formatting.rb breaks:
115 def auto_link!(text) 116 text.gsub!(AUTO_LINK_RE) do 117 all, leading, proto, url, post = $&, $1, $2, $3, $6 118 if leading =~ /<a\s/i || leading =~ /![<>=]?/ 119 # don't replace URLs that are already linked 120 # and URLs prefixed with ! !> !< != (textile images) 121 all 122 else 123 # Idea below : an URL with unbalanced parenthesis and 124 # ending by ')' is put into external parenthesis 125 if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) ) 126 url=url[0..-2] # discard closing parenthesis from url 127 post = ")"+post # add closing parenthesis to post 128 end 129 content = proto + url 130 href = "#{proto=="www."?"http://www.":proto}#{url}" 131 %(#{leading}<a class="external" href="#{ERB::Util.html_escape href}">#{ERB::Util.html_escape content}</a>#{post}).html_safe 132 end 133 end 134 end
The reason is, that the variables of line 117 (all, leading, proto, url, post) are empty, which leads to an exception in line 125.
I am not a ruby-programmer - but I wonder how it could be that $& is not set when the regular expression obviously matched? Otherwise we would not enter the loop at all, do we?