Repository: logging-log4j2
Updated Branches:
  refs/heads/master d8aa6de4a -> 85bf1bf07


LOG4J2-1203 Added Pattern encoding for CRLF only

Added a Pattern encoding format limited to just CRLF for use cases
where you do not want full HTML or JSON encoding, but do want to
protected against CR and/or LF injection attacks in logs.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6b41f589
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6b41f589
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6b41f589

Branch: refs/heads/master
Commit: 6b41f589781e8cdcaee0fac72ff4b75f538d89a6
Parents: d8aa6de
Author: Robert Turner <rtur...@e-djuster.ca>
Authored: Wed Nov 1 20:53:24 2017 -0400
Committer: Mikael Ståldal <mik...@staldal.nu>
Committed: Sun Nov 5 15:56:22 2017 +0100

----------------------------------------------------------------------
 .../core/pattern/EncodingPatternConverter.java   | 19 +++++++++++++++++++
 .../pattern/EncodingPatternConverterTest.java    | 19 +++++++++++++++++++
 src/site/xdoc/manual/layouts.xml.vm              | 15 +++++++++++++--
 3 files changed, 51 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6b41f589/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
index 38605ea..9897e9d 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
@@ -153,6 +153,25 @@ public final class EncodingPatternConverter extends 
LogEventPatternConverter {
                     }
                 }
             }
+        },
+
+        CRLF {
+            @Override
+            void escape(final StringBuilder toAppendTo, final int start) {
+                for (int i = toAppendTo.length() - 1; i >= start; i--) { // 
backwards: length may change
+                    final char c = toAppendTo.charAt(i);
+                    switch (c) {
+                        case '\r':
+                            toAppendTo.setCharAt(i, '\\');
+                            toAppendTo.insert(i + 1, 'r');
+                            break;
+                        case '\n':
+                            toAppendTo.setCharAt(i, '\\');
+                            toAppendTo.insert(i + 1, 'n');
+                            break;
+                    }
+                }
+            }
         };
 
         /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6b41f589/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
index 0e4136a..57ecbb0 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
@@ -67,4 +67,23 @@ public class EncodingPatternConverterTest {
 
         assertEquals(expected, sb.toString());
     }
+
+    @Test
+    public void testCrlfEscaping() {
+        final LogEvent event = Log4jLogEvent.newBuilder() //
+                .setLoggerName(EncodingPatternConverterTest.class.getName()) //
+                .setLevel(Level.DEBUG) //
+                .setMessage(new SimpleMessage("Test \r\n<div 
class=\"test\">this\r</div> & \n<div class='test'>that</div>"))
+                .build();
+        final StringBuilder sb = new StringBuilder();
+        final LoggerContext ctx = LoggerContext.getContext();
+        final String[] options = new String[]{"%msg", "CRLF"};
+        final EncodingPatternConverter converter = EncodingPatternConverter
+            .newInstance(ctx.getConfiguration(), options);
+        assertNotNull("Error creating converter", converter);
+        converter.format(event, sb);
+        assertEquals(
+            "Test \\r\\n<div class=\"test\">this\\r</div> & \\n<div 
class='test'>that</div>",
+            sb.toString());
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6b41f589/src/site/xdoc/manual/layouts.xml.vm
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/layouts.xml.vm 
b/src/site/xdoc/manual/layouts.xml.vm
index 1e8cfb3..9d4cd31 100644
--- a/src/site/xdoc/manual/layouts.xml.vm
+++ b/src/site/xdoc/manual/layouts.xml.vm
@@ -780,8 +780,8 @@ WARN  [main]: Message 2</pre>
             </tr>
             <tr>
               <td align="center">
-                <b>enc</b>{<i>pattern</i>}{[HTML|JSON]}<br />
-                <b>encode</b>{<i>pattern</i>}{[HTML|JSON]}
+                <b>enc</b>{<i>pattern</i>}{[HTML|JSON|CRLF]}<br />
+                <b>encode</b>{<i>pattern</i>}{[HTML|JSON|CRLF]}
               </td>
               <td>
                 <p>
@@ -841,6 +841,17 @@ WARN  [main]: Message 2</pre>
                   For example, the pattern <code>{"message": 
"%enc{%m}{JSON}"}</code> could be used to output a
                   valid JSON document containing the log message as a string 
value.
                 </p>
+                <p>Using the CRLF encoding format, the following characters 
are replaced:</p>
+                <table>
+                  <tr>
+                    <th>Character</th>
+                    <th>Replacement</th>
+                  </tr>
+                  <tr>
+                    <td>'\r', '\n'</td>
+                    <td>Converted into escaped strings "\\r" and "\\n" 
respectively</td>
+                  </tr>
+                </table>
               </td>
             </tr>
             <tr>

Reply via email to