Browse Source

Merge branch 'tlwr-feature-exif'

n1474335 8 years ago
parent
commit
526a157421

+ 1 - 0
package.json

@@ -69,6 +69,7 @@
     "escodegen": "^1.8.1",
     "esmangle": "^1.0.1",
     "esprima": "^3.1.3",
+    "exif-parser": "^0.1.9",
     "google-code-prettify": "^1.0.5",
     "jquery": "^3.1.1",
     "jsbn": "^1.1.0",

+ 1 - 0
src/core/config/Categories.js

@@ -207,6 +207,7 @@ const Categories = [
             "Regular expression",
             "XPath expression",
             "CSS selector",
+            "Extract EXIF",
         ]
     },
     {

+ 14 - 0
src/core/config/OperationConfig.js

@@ -15,6 +15,7 @@ import Endian from "../operations/Endian.js";
 import Entropy from "../operations/Entropy.js";
 import Extract from "../operations/Extract.js";
 import FileType from "../operations/FileType.js";
+import Image from "../operations/Image.js";
 import Hash from "../operations/Hash.js";
 import Hexdump from "../operations/Hexdump.js";
 import HTML from "../operations/HTML.js";
@@ -3336,6 +3337,19 @@ const OperationConfig = {
             },
         ]
     },
+    "Extract EXIF": {
+        description: [
+            "Extracts EXIF data from an image.",
+            "<br><br>",
+            "EXIF data is metadata embedded in images (JPEG, JPG, TIFF) and audio files.",
+            "<br><br>",
+            "EXIF data from photos usually contains information about the image file itself as well as the device used to create it.",
+        ].join("\n"),
+        run: Image.runEXIF,
+        inputType: "byteArray",
+        outputType: "string",
+        args: [],
+    },
 };
 
 export default OperationConfig;

+ 47 - 0
src/core/operations/Image.js

@@ -0,0 +1,47 @@
+import * as ExifParser from "exif-parser";
+import Utils from "../Utils.js";
+
+
+/**
+ * Image operations.
+ *
+ * @author tlwr [toby@toby.codes]
+ * @copyright Crown Copyright 2017
+ * @license Apache-2.0
+ *
+ * @namespace
+ */
+const Image = {
+
+    /**
+     * Extract EXIF operation.
+     *
+     * Extracts EXIF data from a byteArray, representing a JPG or a TIFF image.
+     *
+     * @param {byteArray} input
+     * @param {Object[]} args
+     * @returns {string}
+     */
+    runEXIF(input, args) {
+        try {
+            const bytes = Uint8Array.from(input);
+            const parser = ExifParser.create(bytes.buffer);
+            const result = parser.parse();
+
+            let lines = [];
+            for (let tagName in result.tags) {
+                let value = result.tags[tagName];
+                lines.push(`${tagName}: ${value}`);
+            }
+
+            const numTags = lines.length;
+            lines.unshift(`Found ${numTags} tags.\n`);
+            return lines.join("\n");
+        } catch (err) {
+            throw "Could not extract EXIF data from image: " + err;
+        }
+    },
+    
+};
+
+export default Image;

+ 1 - 0
test/index.js

@@ -16,6 +16,7 @@ import "./tests/operations/ByteRepr.js";
 import "./tests/operations/Code.js";
 import "./tests/operations/Compress.js";
 import "./tests/operations/FlowControl.js";
+import "./tests/operations/Image.js";
 import "./tests/operations/MorseCode.js";
 import "./tests/operations/StrUtils.js";
 

File diff suppressed because it is too large
+ 35 - 0
test/tests/operations/Image.js


Some files were not shown because too many files changed in this diff