]> hydra-www.ietfng.org Git - acmetensortoys-ctfws-android/commitdiff
Add length limit for handbook HTML
authorNathaniel Wesley Filardo <nwfilardo@gmail.com>
Fri, 1 Mar 2019 12:07:35 +0000 (12:07 +0000)
committerNathaniel Wesley Filardo <nwfilardo@gmail.com>
Fri, 1 Mar 2019 12:22:06 +0000 (12:22 +0000)
mobile/src/main/java/com/acmetensortoys/ctfwstimer/CheckedAsyncDownloader.java
mobile/src/main/java/com/acmetensortoys/ctfwstimer/HandbookDownloader.java

index 1b85a3c818cc997048056855ffba8883b3fb0a05..71907b50f6cf120aba6fb9a6029422e58e7864fc 100644 (file)
@@ -25,17 +25,20 @@ public class CheckedAsyncDownloader extends AsyncTask<CheckedAsyncDownloader.DL,
     public static final long ERR_HOSTUNREACH = -4; /* Could not establish connection */
     public static final long ERR_XFER        = -5; /* Error during transfer */
     public static final long ERR_CHECKSUM    = -6; /* Checksum did not match after xfer */
+    public static final long ERR_TOO_LONG    = -7; /* File longer than maximum permitted */
 
     public static class DL {
         final URL url;
         final byte[] sha256;
         final File dest;
+        final long lengthLimit; /* In bytes, or 0 for no limit */
         long result;
 
-        public DL(URL url, byte[] sha256, File dest) {
+        public DL(URL url, byte[] sha256, long lim, File dest) {
             this.url = url;
             this.sha256 = sha256;
             this.dest = dest;
+            this.lengthLimit = lim;
             this.result = ERR_UNTRIED;
         }
     }
@@ -50,7 +53,7 @@ public class CheckedAsyncDownloader extends AsyncTask<CheckedAsyncDownloader.DL,
             return null;
         }
 
-        for (DL dl : dls) {
+        dlfor: for (DL dl : dls) {
             try {
                 DigestInputStream is = new DigestInputStream(
                         new BufferedInputStream(new FileInputStream(dl.dest)),
@@ -116,6 +119,14 @@ public class CheckedAsyncDownloader extends AsyncTask<CheckedAsyncDownloader.DL,
                 while ((count = is.read(data)) != -1) {
                     xfer += count;
                     os.write(data, 0, count);
+
+                    if (dl.lengthLimit > 0 && xfer > dl.lengthLimit) {
+                        is.close();
+                        os.close();
+                        dl.result = ERR_TOO_LONG;
+                        oft.delete();
+                        continue dlfor;
+                    }
                 }
 
                 is.close();
index 990de78d13e850b102cfff4ae2e1e95240b3804a..bb2260f581c50c5b935f2b0b7c62837f5b50fc87 100644 (file)
@@ -20,6 +20,8 @@ public class HandbookDownloader implements IMqttMessageListener {
 
     private static String TAG = "HandbookDownloader";
 
+    private static final long HAND_MAX_LEN = 1024*1024; /* 1 MiB */
+
     private final Context mCtx;
     private final Runnable mDLFiniCB;
     private IMqttAsyncClient mMqc;
@@ -159,7 +161,7 @@ public class HandbookDownloader implements IMqttMessageListener {
             }
 
             this.downloader = new Task(mMqc);
-            this.download = new CheckedAsyncDownloader.DL(new URL(url), checksum,
+            this.download = new CheckedAsyncDownloader.DL(new URL(url), checksum, HAND_MAX_LEN,
                     new File(mCtx.getFilesDir(), HandbookActivity.HAND_FILE_NAME));
             this.downloader.execute(this.download);
         }