]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4681 SONAR-5295 Escape HTML before markdown interpolation
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Mon, 12 May 2014 16:43:58 +0000 (18:43 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Mon, 12 May 2014 16:44:06 +0000 (18:44 +0200)
sonar-markdown/pom.xml
sonar-markdown/src/main/java/org/sonar/markdown/HtmlBlockquoteChannel.java
sonar-markdown/src/main/java/org/sonar/markdown/Markdown.java
sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java
sonar-server/src/main/java/org/sonar/server/text/RubyTextService.java

index 49f615bd35b447a038b673d3060f483555c2d7bf..d28e9542fbd58661fe78606e493b0fa935f4b0ea 100644 (file)
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-channel</artifactId>
     </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
index c236e15a19fd71b214f269e889e75e8e31971d04..286e7e58c809e101d14fd77fad0dd25b0c9be1b4 100644 (file)
@@ -65,7 +65,7 @@ class HtmlBlockquoteChannel extends Channel<MarkdownOutput> {
   private class QuotedLineElementChannel extends RegexChannel<MarkdownOutput> {
 
     protected QuotedLineElementChannel() {
-      super(">\\s[^\r\n]*+");
+      super("&gt;\\s[^\r\n]*+");
     }
 
     @Override
@@ -80,7 +80,8 @@ class HtmlBlockquoteChannel extends Channel<MarkdownOutput> {
 
     private int searchIndexOfFirstCharacter(CharSequence token) {
       for (int index = 0; index < token.length(); index++) {
-        if (token.charAt(index) == '>') {
+        if (token.charAt(index) == '&') {
+          index += 4;
           while (++ index < token.length()) {
             if (token.charAt(index) != ' ') {
               return index;
index 5323a3966d5c60d954561a7588827117765cdcfb..3d932c62bc53041ccea99a6b0786c21cff40ea00 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.markdown;
 
+import org.apache.commons.lang.StringEscapeUtils;
 import org.sonar.channel.ChannelDispatcher;
 import org.sonar.channel.CodeReader;
 
@@ -53,6 +54,6 @@ public final class Markdown {
   }
 
   public static String convertToHtml(String input) {
-    return new Markdown().convert(input);
+    return new Markdown().convert(StringEscapeUtils.escapeHtml(input));
   }
 }
index 909fda8c5395ada8c561f940d864d925a65079cb..462bee371751d25d75cc52119d7d9334fe293062 100644 (file)
@@ -67,8 +67,10 @@ public class MarkdownTest {
 
   @Test
   public void shouldDecorateBlockquote() {
-    assertThat(Markdown.convertToHtml("> Yesterday it worked\n> Today it is not working\r\n> Software is like that\r"))
-        .isEqualTo("<blockquote>Yesterday it worked<br/>\nToday it is not working<br/>\r\nSoftware is like that<br/>\r</blockquote>");
+    assertThat(Markdown.convertToHtml("> Yesterday <br/> it worked\n> Today it is not working\r\n> Software is like that\r"))
+        .isEqualTo("<blockquote>Yesterday &lt;br/&gt; it worked<br/>\nToday it is not working<br/>\r\nSoftware is like that<br/>\r</blockquote>");
+    assertThat(Markdown.convertToHtml("HTML elements should <em>not</em> be quoted!"))
+        .isEqualTo("HTML elements should &lt;em&gt;not&lt;/em&gt; be quoted!");
   }
 
   @Test
index a150c53c5b6e74f0bf46064e1705f1e0e5be46f6..7d04ecea691516683fd0bf33d9fdd2a886a88102 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.text;
 
-import org.apache.commons.lang.StringEscapeUtils;
 import org.sonar.api.ServerComponent;
 import org.sonar.markdown.Markdown;
 import org.sonar.server.source.HtmlSourceDecorator;
@@ -46,8 +45,7 @@ public class RubyTextService implements ServerComponent {
 
   // TODO add ruby example
   public String markdownToHtml(String markdown) {
-    // TODO move HTML escaping to sonar-markdown
-    return Markdown.convertToHtml(StringEscapeUtils.escapeHtml(markdown));
+    return Markdown.convertToHtml(markdown);
   }
 
   // TODO add ruby example