浏览代码

Merge branch 'anthony-arnold-play-media'

n1474335 6 年之前
父节点
当前提交
ae28d476de
共有 5 个文件被更改,包括 156 次插入5 次删除
  1. 6 0
      CHANGELOG.md
  2. 11 5
      src/core/config/Categories.json
  3. 102 0
      src/core/operations/PlayMedia.mjs
  4. 1 0
      test/index.mjs
  5. 36 0
      test/tests/operations/Media.mjs

+ 6 - 0
CHANGELOG.md

@@ -2,6 +2,9 @@
 All major and minor version changes will be documented in this file. Details of patch-level version changes can be found in [commit messages](https://github.com/gchq/CyberChef/commits/master).
 
 
+### [8.16.0] - 2018-12-19
+- 'Play Media' operation added [@anthony-arnold] | [#446]
+
 ### [8.15.0] - 2018-12-18
 - 'Text Encoding Brute Force' operation added [@Cynser] | [#439]
 
@@ -76,6 +79,7 @@ All major and minor version changes will be documented in this file. Details of
 
 
 
+[8.16.0]: https://github.com/gchq/CyberChef/releases/tag/v8.16.0
 [8.15.0]: https://github.com/gchq/CyberChef/releases/tag/v8.15.0
 [8.14.0]: https://github.com/gchq/CyberChef/releases/tag/v8.14.0
 [8.13.0]: https://github.com/gchq/CyberChef/releases/tag/v8.13.0
@@ -112,6 +116,7 @@ All major and minor version changes will be documented in this file. Details of
 [@jarmovanlenthe]: https://github.com/jarmovanlenthe
 [@tcode2k16]: https://github.com/tcode2k16
 [@Cynser]: https://github.com/Cynser
+[@anthony-arnold]: https://github.com/anthony-arnold
 
 [#95]: https://github.com/gchq/CyberChef/pull/299
 [#173]: https://github.com/gchq/CyberChef/pull/173
@@ -138,3 +143,4 @@ All major and minor version changes will be documented in this file. Details of
 [#439]: https://github.com/gchq/CyberChef/pull/439
 [#441]: https://github.com/gchq/CyberChef/pull/441
 [#443]: https://github.com/gchq/CyberChef/pull/443
+[#446]: https://github.com/gchq/CyberChef/pull/446

+ 11 - 5
src/core/config/Categories.json

@@ -341,23 +341,29 @@
             "From MessagePack"
         ]
     },
+    {
+        "name": "Forensics",
+        "ops": [
+            "Detect File Type",
+            "Scan for Embedded Files",
+            "Remove EXIF",
+            "Extract EXIF",
+            "Render Image",
+            "Play Media"
+        ]
+    },
     {
         "name": "Other",
         "ops": [
             "Entropy",
             "Frequency distribution",
             "Chi Square",
-            "Detect File Type",
-            "Scan for Embedded Files",
             "Disassemble x86",
             "Pseudo-Random Number Generator",
             "Generate UUID",
             "Generate TOTP",
             "Generate HOTP",
             "Haversine distance",
-            "Render Image",
-            "Remove EXIF",
-            "Extract EXIF",
             "Numberwang",
             "XKCD Random Number"
         ]

+ 102 - 0
src/core/operations/PlayMedia.mjs

@@ -0,0 +1,102 @@
+/**
+ * @author anthony-arnold [anthony.arnold@uqconnect.edu.au]
+ * @copyright Crown Copyright 2018
+ * @license Apache-2.0
+ */
+
+import { fromBase64, toBase64 } from "../lib/Base64";
+import { fromHex } from "../lib/Hex";
+import Operation from "../Operation";
+import OperationError from "../errors/OperationError";
+import Utils from "../Utils";
+import Magic from "../lib/Magic";
+
+/**
+ * PlayMedia operation
+ */
+class PlayMedia extends Operation {
+
+    /**
+     * PlayMedia constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "Play Media";
+        this.module = "Default";
+        this.description = "Plays the input as audio or video depending on the type.<br><br>Tags: sound, movie, mp3, mp4, mov, webm, wav, ogg";
+        this.infoURL = "";
+        this.inputType = "string";
+        this.outputType = "byteArray";
+        this.presentType = "html";
+        this.args = [
+            {
+                "name": "Input format",
+                "type": "option",
+                "value": ["Raw", "Base64", "Hex"]
+            }
+        ];
+    }
+
+    /**
+     * @param {string} input
+     * @param {Object[]} args
+     * @returns {byteArray} The multimedia data as bytes.
+     */
+    run(input, args) {
+        const [inputFormat] = args;
+
+        if (!input.length) return [];
+
+        // Convert input to raw bytes
+        switch (inputFormat) {
+            case "Hex":
+                input = fromHex(input);
+                break;
+            case "Base64":
+                // Don't trust the Base64 entered by the user.
+                // Unwrap it first, then re-encode later.
+                input = fromBase64(input, undefined, "byteArray");
+                break;
+            case "Raw":
+            default:
+                input = Utils.strToByteArray(input);
+                break;
+        }
+
+
+        // Determine file type
+        const type = Magic.magicFileType(input);
+        if (!(type && /^audio|video/.test(type.mime))) {
+            throw new OperationError("Invalid or unrecognised file type");
+        }
+
+        return input;
+    }
+
+    /**
+     * Displays an audio or video element that may be able to play the media
+     * file.
+     *
+     * @param data {byteArray} Data containing an audio or video file.
+     * @returns {string} Markup to display a media player.
+     */
+    async present(data) {
+        if (!data.length) return "";
+
+        const type = Magic.magicFileType(data);
+        const matches = /^audio|video/.exec(type.mime);
+        if (!matches) {
+            throw new OperationError("Invalid file type");
+        }
+        const dataURI = `data:${type.mime};base64,${toBase64(data)}`;
+        const element = matches[0];
+
+        let html = `<${element} src='${dataURI}' type='${type.mime}' controls>`;
+        html += "<p>Unsupported media type.</p>";
+        html += `</${element}>`;
+        return html;
+    }
+}
+
+export default PlayMedia;

+ 1 - 0
test/index.mjs

@@ -80,6 +80,7 @@ import "./tests/operations/ToGeohash.mjs";
 import "./tests/operations/TranslateDateTimeFormat";
 import "./tests/operations/Magic";
 import "./tests/operations/ParseTLV";
+import "./tests/operations/Media";
 
 let allTestsPassing = true;
 const testStatusCounts = {

文件差异内容过多而无法显示
+ 36 - 0
test/tests/operations/Media.mjs


部分文件因为文件数量过多而无法显示