Skip to content

Commit cd8add4

Browse files
committed
Add prefix to localStorage settings adapter (#159)
Avoid parsing of localStorage entries that does not contains a configured prefix because it could contain data that has been set in other applications under the same host.
1 parent 1a031af commit cd8add4

File tree

3 files changed

+43
-29
lines changed

3 files changed

+43
-29
lines changed

__tests__/adapters/settings/localstorage.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import adapter from '../../../src/adapters/settings/localstorage.js';
33
let core;
44

55
describe('LocalStorage Settings Adapter', () => {
6-
beforeAll(() => {
7-
localStorage.setItem('failure', '{failure}');
6+
beforeAll(async () => {
7+
localStorage.setItem('osjs__failure', '{failure}');
88

9-
createInstance().then(c => (core = c));
9+
core = await createInstance();
1010
});
1111

1212
afterAll(() => {
13-
localStorage.removeItem('failure');
13+
localStorage.removeItem('osjs__failure');
1414
core.destroy();
1515
});
1616

src/adapters/settings/localstorage.js

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -35,36 +35,49 @@ import logger from '../../logger';
3535
* @param {Core} core Core reference
3636
* @param {object} [options] Adapter options
3737
*/
38-
const localStorageSettings = core => ({
39-
clear: ns => {
40-
if (ns) {
41-
localStorage.removeItem(ns);
42-
} else {
43-
localStorage.clear();
44-
}
38+
const localStorageSettings = (core) => {
39+
const prefix = core.config('settings.prefix', '');
4540

46-
return Promise.resolve(true);
47-
},
41+
return {
42+
clear(ns) {
43+
if (ns) {
44+
localStorage.removeItem(prefix + ns);
45+
} else {
46+
localStorage.clear();
47+
}
4848

49-
save: settings => {
50-
Object.keys(settings).forEach((k) => {
51-
localStorage.setItem(k, JSON.stringify(settings[k]));
52-
});
49+
return Promise.resolve(true);
50+
},
5351

54-
return Promise.resolve(true);
55-
},
52+
save(settings) {
53+
Object.keys(settings).forEach((k) => {
54+
localStorage.setItem(prefix + k, JSON.stringify(settings[k]));
55+
});
5656

57-
load: () => Promise.resolve(Object.keys(localStorage).reduce((o, v) => {
58-
let value = localStorage.getItem(v);
59-
try {
60-
value = JSON.parse(value);
61-
} catch (e) {
62-
logger.warn('localStorageAdapter parse error', e);
63-
}
57+
return Promise.resolve(true);
58+
},
59+
60+
load() {
61+
const entries = Object
62+
.keys(localStorage)
63+
.filter(k => prefix ? k.startsWith(prefix) : true)
64+
.map((k) => {
65+
const v = localStorage.getItem(k);
66+
const kk = prefix ? k.substr(prefix.length) : k;
6467

65-
return Object.assign(o, {[v]: value});
66-
}, {}))
67-
});
68+
try {
69+
return [kk, JSON.parse(v)];
70+
} catch (e) {
71+
logger.warn(`localStorageAdapter parse failed for '${k}'`, e);
72+
}
73+
74+
return [kk, v];
75+
});
76+
77+
return Promise.resolve(Object.fromEntries(entries));
78+
}
79+
};
80+
};
6881

6982

7083
export default localStorageSettings;

src/config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ export const defaultConfiguration = {
171171

172172
settings: {
173173
lock: [],
174+
prefix: 'osjs__', // localStorage settings adapter key prefix
174175

175176
defaults: {
176177
'osjs/default-application': {},

0 commit comments

Comments
 (0)