From c976eb48c96543f600d73544bc8ab3a5c1bafa0c Mon Sep 17 00:00:00 2001
From: Johannes Meyer <johannes.meyer@icinga.com>
Date: Wed, 17 Jul 2019 11:22:46 +0200
Subject: [PATCH] storage.js: Properly handle invalid values

---
 public/js/icinga/storage.js | 33 ++++++++++++++++++++++++++++-----
 1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js
index 276b87eaf..1d0e374bb 100644
--- a/public/js/icinga/storage.js
+++ b/public/js/icinga/storage.js
@@ -46,11 +46,24 @@
         if (typeof Icinga.Storage.subscribers[event.key] !== 'undefined') {
             var newValue = null,
                 oldValue = null;
-            if (event.newValue.length) {
-                newValue = JSON.parse(event.newValue);
+            if (!! event.newValue) {
+                try {
+                    newValue = JSON.parse(event.newValue);
+                } catch(error) {
+                    icinga.logger.error('[Storage] Failed to parse new value (\`' + event.newValue
+                        + '\`) for key "' + event.key + '". Error was: ' + error);
+                    event.storageArea.removeItem(event.key);
+                    return;
+                }
             }
-            if (event.oldValue.length) {
-                oldValue = JSON.parse(event.oldValue);
+            if (!! event.oldValue) {
+                try {
+                    oldValue = JSON.parse(event.oldValue);
+                } catch(error) {
+                    icinga.logger.warn('[Storage] Failed to parse old value (\`' + event.oldValue
+                        + '\`) of key "' + event.key + '". Error was: ' + error);
+                    oldValue = null;
+                }
             }
 
             Icinga.Storage.subscribers[event.key].forEach(function (subscriber) {
@@ -108,7 +121,17 @@
          * @returns {*}
          */
         get: function(key) {
-            return JSON.parse(window.localStorage.getItem(this.prefixKey(key)));
+            key = this.prefixKey(key);
+            var value = window.localStorage.getItem(key);
+
+            try {
+                return JSON.parse(value);
+            } catch(error) {
+                icinga.logger.error('[Storage] Failed to parse value (\`' + value
+                    + '\`) of key "' + key + '". Error was: ' + error);
+                window.localStorage.removeItem(key);
+                return null;
+            }
         },
 
         /**