From 6e2ad50e162d8c65e3ca88745ffc71c65e416db7 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 12 Nov 2019 20:20:07 +0000
Subject: [PATCH] i2psnark: Disable HTML5 for playlist files Another escaping
 fix

---
 .../org/klomp/snark/web/I2PSnarkServlet.java  | 37 +++++++++++++++----
 .../java/src/org/klomp/snark/web/URIUtil.java |  7 ++++
 2 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index 7a81e86ea6..d6ddb02559 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -3348,10 +3348,8 @@ public class I2PSnarkServlet extends BasicServlet {
             // unless audio or video...
             if (storage != null && storage.complete()) {
                 String mime = getMimeType(r.getName());
-                boolean isAudio = mime != null && (mime.startsWith("audio/") || mime.equals("application/ogg"));
-                boolean isVideo = mime != null && mime.startsWith("video/") &&
-                                  !mime.equals("video/x-msvideo") && !mime.equals("video/x-matroska") &&
-                                  !mime.equals("video/quicktime");
+                boolean isAudio = mime != null && isAudio(mime);
+                boolean isVideo = mime != null && isVideo(mime);
                 if (isAudio || isVideo) {
                     // HTML5
                     if (isAudio)
@@ -3552,10 +3550,8 @@ public class I2PSnarkServlet extends BasicServlet {
             boolean isVideo = false;
             buf.append("<td class=\"snarkFileIcon\">");
             if (complete) {
-                isAudio = mime.startsWith("audio/") || mime.equals("application/ogg");
-                isVideo = mime.startsWith("video/") &&
-                          !mime.equals("video/x-msvideo") && !mime.equals("video/x-matroska") &&
-                          !mime.equals("video/quicktime");
+                isAudio = isAudio(mime);
+                isVideo = isVideo(mime);
                 if (isAudio || isVideo) {
                     // HTML5
                     if (isAudio)
@@ -3655,6 +3651,31 @@ public class I2PSnarkServlet extends BasicServlet {
         return buf.toString();
     }
 
+    /**
+     * @param mime non-null
+     * @since 0.9.44
+     */
+    private static boolean isAudio(String mime) {
+        // don't include playlist files as the browser doesn't support them
+        // in the HTML5 player,
+        // and if it did and prefetched, that could be a security issue
+        return (mime.startsWith("audio/") &&
+                !mime.equals("audio/mpegurl") &&
+                !mime.equals("audio/x-scpls")) ||
+               mime.equals("application/ogg");
+    }
+
+    /**
+     * @param mime non-null
+     * @since 0.9.44
+     */
+    private static boolean isVideo(String mime) {
+        return mime.startsWith("video/") &&
+               !mime.equals("video/x-msvideo") &&
+               !mime.equals("video/x-matroska") &&
+               !mime.equals("video/quicktime");
+    }
+
     /**
      * Is there at least one complete audio file in this directory or below?
      * Recursive.
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java b/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java
index 71b70c5ae4..b82c4a35a9 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java
@@ -88,6 +88,7 @@ class URIUtil
                     case '[':
                     case ']':
                     case '&':
+                    case '|':
                         buf=new StringBuilder(path.length()*2);
                         break loop;
                     default:
@@ -156,6 +157,9 @@ class URIUtil
                       case '&':
                           buf.append("%26");
                           continue;
+                      case '|':
+                          buf.append("%7C");
+                          continue;
                       default:
                           if (c <= 0x1f) // includes negative
                               toHex(c,buf);
@@ -212,6 +216,9 @@ class URIUtil
                         case '&':
                             buf.append("%26");
                             continue;
+                        case '|':
+                            buf.append("%7C");
+                            continue;
                         default:
                             if (c <= 0x1f || (c >= 0x7f && c <= 0x9f) || Character.isSpaceChar(c))
                                 toHex(c,buf);
-- 
GitLab