mirror of
https://github.com/gchq/CyberChef
synced 2024-11-15 09:07:06 +00:00
Merge branch 'anthony-arnold-play-media'
This commit is contained in:
commit
ae28d476de
5 changed files with 163 additions and 5 deletions
|
@ -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).
|
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
|
### [8.15.0] - 2018-12-18
|
||||||
- 'Text Encoding Brute Force' operation added [@Cynser] | [#439]
|
- '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.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.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
|
[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
|
[@jarmovanlenthe]: https://github.com/jarmovanlenthe
|
||||||
[@tcode2k16]: https://github.com/tcode2k16
|
[@tcode2k16]: https://github.com/tcode2k16
|
||||||
[@Cynser]: https://github.com/Cynser
|
[@Cynser]: https://github.com/Cynser
|
||||||
|
[@anthony-arnold]: https://github.com/anthony-arnold
|
||||||
|
|
||||||
[#95]: https://github.com/gchq/CyberChef/pull/299
|
[#95]: https://github.com/gchq/CyberChef/pull/299
|
||||||
[#173]: https://github.com/gchq/CyberChef/pull/173
|
[#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
|
[#439]: https://github.com/gchq/CyberChef/pull/439
|
||||||
[#441]: https://github.com/gchq/CyberChef/pull/441
|
[#441]: https://github.com/gchq/CyberChef/pull/441
|
||||||
[#443]: https://github.com/gchq/CyberChef/pull/443
|
[#443]: https://github.com/gchq/CyberChef/pull/443
|
||||||
|
[#446]: https://github.com/gchq/CyberChef/pull/446
|
||||||
|
|
|
@ -341,23 +341,29 @@
|
||||||
"From MessagePack"
|
"From MessagePack"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Forensics",
|
||||||
|
"ops": [
|
||||||
|
"Detect File Type",
|
||||||
|
"Scan for Embedded Files",
|
||||||
|
"Remove EXIF",
|
||||||
|
"Extract EXIF",
|
||||||
|
"Render Image",
|
||||||
|
"Play Media"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Other",
|
"name": "Other",
|
||||||
"ops": [
|
"ops": [
|
||||||
"Entropy",
|
"Entropy",
|
||||||
"Frequency distribution",
|
"Frequency distribution",
|
||||||
"Chi Square",
|
"Chi Square",
|
||||||
"Detect File Type",
|
|
||||||
"Scan for Embedded Files",
|
|
||||||
"Disassemble x86",
|
"Disassemble x86",
|
||||||
"Pseudo-Random Number Generator",
|
"Pseudo-Random Number Generator",
|
||||||
"Generate UUID",
|
"Generate UUID",
|
||||||
"Generate TOTP",
|
"Generate TOTP",
|
||||||
"Generate HOTP",
|
"Generate HOTP",
|
||||||
"Haversine distance",
|
"Haversine distance",
|
||||||
"Render Image",
|
|
||||||
"Remove EXIF",
|
|
||||||
"Extract EXIF",
|
|
||||||
"Numberwang",
|
"Numberwang",
|
||||||
"XKCD Random Number"
|
"XKCD Random Number"
|
||||||
]
|
]
|
||||||
|
|
102
src/core/operations/PlayMedia.mjs
Normal file
102
src/core/operations/PlayMedia.mjs
Normal file
|
@ -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;
|
|
@ -80,6 +80,7 @@ import "./tests/operations/ToGeohash.mjs";
|
||||||
import "./tests/operations/TranslateDateTimeFormat";
|
import "./tests/operations/TranslateDateTimeFormat";
|
||||||
import "./tests/operations/Magic";
|
import "./tests/operations/Magic";
|
||||||
import "./tests/operations/ParseTLV";
|
import "./tests/operations/ParseTLV";
|
||||||
|
import "./tests/operations/Media";
|
||||||
|
|
||||||
let allTestsPassing = true;
|
let allTestsPassing = true;
|
||||||
const testStatusCounts = {
|
const testStatusCounts = {
|
||||||
|
|
43
test/tests/operations/Media.mjs
Normal file
43
test/tests/operations/Media.mjs
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue