Skip to content

Commit 6be220b

Browse files
committed
fix: parse localstorage data safely
1 parent 6c013d4 commit 6be220b

File tree

6 files changed

+24
-7
lines changed

6 files changed

+24
-7
lines changed

src/lib/recents.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ const recents = {
88
* @returns {Array<String>}
99
*/
1010
get files() {
11-
return JSON.parse(localStorage.recentFiles || "[]");
11+
const files = helpers.parseJSON(localStorage.recentFiles);
12+
return Array.isArray(files) ? files : [];
1213
},
1314
/**
1415
* @returns {{url: String, opts: Map<String, String>}[]}
1516
*/
1617
get folders() {
17-
return JSON.parse(localStorage.recentFolders || "[]");
18+
const folders = helpers.parseJSON(localStorage.recentFolders);
19+
return Array.isArray(folders) ? folders : [];
1820
},
1921
set files(list) {
2022
if (Array.isArray(list)) localStorage.recentFiles = JSON.stringify(list);

src/pages/fileBrowser/fileBrowser.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ function FileBrowserInclude(mode, info, doesOpenLast = true) {
6262
const state = [];
6363
/**@type {Array<Storage>} */
6464
const allStorages = [];
65-
let storageList = JSON.parse(localStorage.storageList || "[]");
65+
let storageList = helpers.parseJSON(localStorage.storageList);
66+
if (!Array.isArray(storageList)) storageList = [];
6667

6768
let isSelectionMode = false;
6869
let selectedItems = new Set();

src/pages/sponsors/sponsors.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ export default function Sponsors() {
128128

129129
if (!sponsors.length && "cached_sponsors" in localStorage) {
130130
try {
131-
sponsors = JSON.parse(localStorage.getItem("cached_sponsors")) || [];
131+
const cachedSponsors = helpers.parseJSON(
132+
localStorage.getItem("cached_sponsors"),
133+
);
134+
sponsors = Array.isArray(cachedSponsors) ? cachedSponsors : [];
132135
} catch (error) {
133136
console.error("Failed to parse cached sponsors", error);
134137
}

src/palettes/changeMode/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getModes } from "cm/modelist";
22
import palette from "components/palette";
3+
import helpers from "utils/helpers";
34
import Path from "utils/Path";
45

56
export default function changeMode() {
@@ -25,7 +26,7 @@ function onselect(mode) {
2526

2627
let modeAssociated;
2728
try {
28-
modeAssociated = JSON.parse(localStorage.modeassoc || "{}");
29+
modeAssociated = helpers.parseJSON(localStorage.modeassoc) || {};
2930
} catch (error) {
3031
modeAssociated = {};
3132
}

src/utils/Uri.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
import escapeStringRegexp from "escape-string-regexp";
22
import path from "./Path";
33

4+
function parseStorageList() {
5+
try {
6+
const storageList = JSON.parse(localStorage.storageList || "[]");
7+
return Array.isArray(storageList) ? storageList : [];
8+
} catch (_) {
9+
return [];
10+
}
11+
}
12+
413
export default {
514
/**
615
* Parse content uri to rootUri and docID
@@ -81,7 +90,7 @@ export default {
8190
*/
8291
getVirtualAddress(url) {
8392
try {
84-
const storageList = JSON.parse(localStorage.storageList || "[]");
93+
const storageList = parseStorageList();
8594

8695
const matches = [];
8796
for (let storage of storageList) {

src/utils/helpers.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ export default {
242242
}
243243

244244
/**@type {string[]} */
245-
const storageList = JSON.parse(localStorage.storageList || "[]");
245+
const storageList = this.parseJSON(localStorage.storageList);
246+
if (!Array.isArray(storageList)) return url;
246247
const storageListLen = storageList.length;
247248

248249
for (let i = 0; i < storageListLen; ++i) {

0 commit comments

Comments
 (0)