Pārlūkot izejas kodu

Merge branch 'master' into feature-magic

n1474335 7 gadi atpakaļ
vecāks
revīzija
57314b77e5

+ 1 - 1
package-lock.json

@@ -1,6 +1,6 @@
 {
   "name": "cyberchef",
-  "version": "7.5.1",
+  "version": "7.5.4",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "cyberchef",
-  "version": "7.5.1",
+  "version": "7.5.4",
   "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
   "author": "n1474335 <n1474335@gmail.com>",
   "homepage": "https://gchq.github.io/CyberChef",

+ 7 - 8
src/core/Utils.js

@@ -903,9 +903,9 @@ const Utils = {
      * "Pretty" CyberChef recipe formats are designed to be included in the fragment (#) or query (?)
      * parts of the URL. They can also be loaded into CyberChef through the 'Load' interface. In order
      * to make this format as readable as possible, various special characters are used unescaped. This
-     * reduces the amount of percent-encoding included in the URL which is typically difficult to read,
-     * as well as substantially increasing the overall length. These characteristics can be quite
-     * offputting for users.
+     * reduces the amount of percent-encoding included in the URL which is typically difficult to read
+     * and substantially increases the overall length. These characteristics can be quite off-putting
+     * for users.
      *
      * @param {Object[]} recipeConfig
      * @param {boolean} newline - whether to add a newline after each operation
@@ -922,12 +922,11 @@ const Utils = {
             name = op.op.replace(/ /g, "_");
             args = JSON.stringify(op.args)
                 .slice(1, -1) // Remove [ and ] as they are implied
-                // We now need to switch double-quoted (") strings to single-quotes (') as these do not
-                // need to be percent-encoded.
+                // We now need to switch double-quoted (") strings to single quotes (') as single quotes
+                // do not need to be percent-encoded.
                 .replace(/'/g, "\\'") // Escape single quotes
-                .replace(/\\"/g, '"') // Unescape double quotes
-                .replace(/(^|,|{|:)"/g, "$1'") // Replace opening " with '
-                .replace(/"(,|:|}|$)/g, "'$1"); // Replace closing " with '
+                .replace(/"((?:[^"\\]|\\.)*)"/g, "'$1'") // Replace opening and closing " with '
+                .replace(/\\"/g, '"'); // Unescape double quotes
 
             disabled = op.disabled ? "/disabled": "";
             bp = op.breakpoint ? "/breakpoint" : "";

+ 5 - 5
src/core/config/OperationConfig.js

@@ -2411,13 +2411,13 @@ const OperationConfig = {
         args: [
             {
                 name: "Split delimiter",
-                type: "binaryShortString",
-                value: StrUtils.SPLIT_DELIM
+                type: "editableOption",
+                value: StrUtils.SPLIT_DELIM_OPTIONS
             },
             {
                 name: "Join delimiter",
-                type: "option",
-                value: StrUtils.DELIMITER_OPTIONS
+                type: "editableOption",
+                value: StrUtils.JOIN_DELIM_OPTIONS
             }
         ]
     },
@@ -2440,7 +2440,7 @@ const OperationConfig = {
             {
                 name: "Invert condition",
                 type: "boolean",
-                value: SeqUtils.SORT_REVERSE
+                value: false
             },
         ]
     },

+ 26 - 4
src/core/operations/StrUtils.js

@@ -65,12 +65,28 @@ const StrUtils = {
      * @constant
      * @default
      */
-    SPLIT_DELIM: ",",
+    SPLIT_DELIM_OPTIONS: [
+        {name: "Comma", value: ","},
+        {name: "Space", value: " "},
+        {name: "Line feed", value: "\\n"},
+        {name: "CRLF", value: "\\r\\n"},
+        {name: "Semi-colon", value: ";"},
+        {name: "Colon", value: ":"},
+        {name: "Nothing (separate chars)", value: ""}
+    ],
     /**
      * @constant
      * @default
      */
-    DELIMITER_OPTIONS: ["Line feed", "CRLF", "Space", "Comma", "Semi-colon", "Colon", "Nothing (separate chars)"],
+    JOIN_DELIM_OPTIONS: [
+        {name: "Line feed", value: "\\n"},
+        {name: "CRLF", value: "\\r\\n"},
+        {name: "Space", value: " "},
+        {name: "Comma", value: ","},
+        {name: "Semi-colon", value: ";"},
+        {name: "Colon", value: ":"},
+        {name: "Nothing (join chars)", value: ""}
+    ],
 
     /**
      * Split operation.
@@ -80,14 +96,20 @@ const StrUtils = {
      * @returns {string}
      */
     runSplit: function(input, args) {
-        let splitDelim = args[0] || StrUtils.SPLIT_DELIM,
-            joinDelim = Utils.charRep[args[1]],
+        let splitDelim = args[0],
+            joinDelim = args[1],
             sections = input.split(splitDelim);
 
         return sections.join(joinDelim);
     },
 
 
+    /**
+     * @constant
+     * @default
+     */
+    DELIMITER_OPTIONS: ["Line feed", "CRLF", "Space", "Comma", "Semi-colon", "Colon", "Nothing (separate chars)"],
+
     /**
      * Filter operation.
      *

+ 2 - 0
src/web/App.js

@@ -443,6 +443,7 @@ App.prototype.getRecipeConfig = function() {
 /**
  * Given a recipe configuration, sets the recipe to that configuration.
  *
+ * @fires Manager#statechange
  * @param {Object[]} recipeConfig - The recipe configuration
  */
 App.prototype.setRecipeConfig = function(recipeConfig) {
@@ -487,6 +488,7 @@ App.prototype.setRecipeConfig = function(recipeConfig) {
 
     // Unpause auto bake
     this.autoBakePause = false;
+    window.disptchEent(this.manager.statechange);
 };
 
 

+ 1 - 0
src/web/InputWaiter.js

@@ -64,6 +64,7 @@ InputWaiter.prototype.set = function(input) {
         this.setInputInfo(input.size, null);
     } else {
         inputText.value = input;
+        this.closeFile();
         window.dispatchEvent(this.manager.statechange);
         const lines = input.length < (this.app.options.ioDisplayThreshold * 1024) ?
             input.count("\n") + 1 : null;

+ 3 - 2
src/web/OperationsWaiter.js

@@ -167,7 +167,8 @@ OperationsWaiter.prototype.opListCreate = function(e) {
 OperationsWaiter.prototype.enableOpsListPopovers = function(el) {
     $(el).find("[data-toggle=popover]").addBack("[data-toggle=popover]")
         .popover({trigger: "manual"})
-        .on("mouseenter", function() {
+        .on("mouseenter", function(e) {
+            if (e.buttons > 0) return; // Mouse button held down - likely dragging an opertion
             const _this = this;
             $(this).popover("show");
             $(".popover").on("mouseleave", function () {
@@ -178,7 +179,7 @@ OperationsWaiter.prototype.enableOpsListPopovers = function(el) {
             setTimeout(function() {
                 // Determine if the popover associated with this element is being hovered over
                 if ($(_this).data("bs.popover") &&
-                    !$(_this).data("bs.popover").$tip.is(":hover")) {
+                    ($(_this).data("bs.popover").$tip && !$(_this).data("bs.popover").$tip.is(":hover"))) {
                     $(_this).popover("hide");
                 }
             }, 50);