Skip to content

Commit 2db2947

Browse files
committed
Store authentication data in cookies
1 parent 06016a8 commit 2db2947

File tree

5 files changed

+81
-6
lines changed

5 files changed

+81
-6
lines changed

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
"version": "1.6.0",
44
"description": "API client for Jellyfin",
55
"main": "dist/jellyfin-apiclient.js",
6-
"dependencies": {},
6+
"dependencies": {
7+
"js-cookie": "^2.2.1"
8+
},
79
"devDependencies": {
810
"@babel/core": "^7.9.6",
911
"@babel/preset-env": "^7.9.6",

src/apiClient.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -497,8 +497,9 @@ class ApiClient {
497497
* Authenticates a user
498498
* @param {String} name
499499
* @param {String} password
500+
* @param {String} rememberMe
500501
*/
501-
authenticateUserByName(name, password) {
502+
authenticateUserByName(name, password, rememberMe) {
502503
if (!name) {
503504
return Promise.reject();
504505
}
@@ -525,6 +526,7 @@ class ApiClient {
525526
};
526527

527528
if (this.onAuthenticated) {
529+
result.enableAutoLogin = rememberMe;
528530
this.onAuthenticated(this, result).then(afterOnAuthenticated);
529531
} else {
530532
afterOnAuthenticated();
@@ -537,8 +539,9 @@ class ApiClient {
537539
/**
538540
* Authenticates a user using quick connect
539541
* @param {String} token
542+
* @param {String} rememberMe
540543
*/
541-
quickConnect(token) {
544+
quickConnect(token, rememberMe) {
542545
if (!token) {
543546
return Promise.reject();
544547
}
@@ -564,6 +567,7 @@ class ApiClient {
564567
};
565568

566569
if (this.onAuthenticated) {
570+
result.enableAutoLogin = rememberMe;
567571
this.onAuthenticated(this, result).then(afterOnAuthenticated);
568572
} else {
569573
afterOnAuthenticated();

src/connectionManager.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ export default class ConnectionManager {
261261

262262
apiClient.serverInfo(existingServer);
263263

264-
apiClient.onAuthenticated = (instance, result) => onAuthenticated(instance, result, {}, true);
264+
apiClient.onAuthenticated = (instance, result) => onAuthenticated(instance, result, {enableAutoLogin: result.enableAutoLogin}, true);
265265

266266
if (!existingServers.length) {
267267
const credentials = credentialProvider.credentials();
@@ -291,7 +291,7 @@ export default class ConnectionManager {
291291
apiClient.serverInfo(server);
292292

293293
apiClient.onAuthenticated = (instance, result) => {
294-
return onAuthenticated(instance, result, {}, true);
294+
return onAuthenticated(instance, result, {enableAutoLogin: result.enableAutoLogin}, true);
295295
};
296296

297297
events.trigger(self, 'apiclientcreated', [apiClient]);
@@ -333,6 +333,9 @@ export default class ConnectionManager {
333333
server.AccessToken = null;
334334
}
335335

336+
// set to true to store authentication data
337+
server.EnableAutoLogin = !!options.enableAutoLogin;
338+
336339
credentialProvider.addOrUpdateServer(credentials.Servers, server);
337340
credentialProvider.credentials(credentials);
338341

@@ -460,6 +463,8 @@ export default class ConnectionManager {
460463
server.AccessToken = null;
461464
server.ExchangeToken = null;
462465
}
466+
467+
credentialProvider.credentials(credentials);
463468
});
464469
};
465470

src/credentials.js

+60-1
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,76 @@
11
import events from './events';
22
import appStorage from './appStorage';
3+
import cookies from 'js-cookie';
4+
5+
function readSession(key, server) {
6+
const value = cookies.get(`${key}-${server.Id}`);
7+
8+
if (value) {
9+
try {
10+
const { UserId, AccessToken } = JSON.parse(value);
11+
server.UserId = UserId || server.UserId;
12+
server.AccessToken = AccessToken || server.AccessToken;
13+
} catch (e) {
14+
console.error(e);
15+
}
16+
}
17+
}
18+
19+
function saveSession(key, server) {
20+
cookies.set(`${key}-${server.Id}`, JSON.stringify({
21+
UserId: server.UserId,
22+
AccessToken: server.AccessToken
23+
}));
24+
}
25+
26+
function removeSession(key) {
27+
const prefix = `${key}-`;
28+
29+
for (const cookie in cookies.get()) {
30+
if (cookie.startsWith(prefix)) {
31+
cookies.remove(cookie);
32+
}
33+
}
34+
}
335

436
function initialize(appStorage, key) {
537
const json = appStorage.getItem(key) || '{}';
638

739
console.log(`Stored JSON credentials: ${json}`);
840
let credentials = JSON.parse(json);
941
credentials.Servers = credentials.Servers || [];
42+
43+
for (const server of credentials.Servers) {
44+
readSession(key, server);
45+
}
46+
1047
return credentials;
1148
}
1249

1350
function set(instance, data) {
1451
if (data) {
1552
instance._credentials = data;
16-
instance.appStorage.setItem(instance.key, JSON.stringify(data));
53+
54+
const dataCopy = JSON.parse(JSON.stringify(data));
55+
56+
// Remove session data so we don't leave removed servers
57+
removeSession(instance.key);
58+
59+
for (const server of dataCopy.Servers || []) {
60+
if (server.UserId && server.AccessToken) {
61+
saveSession(instance.key, server);
62+
} else {
63+
delete server.EnableAutoLogin;
64+
}
65+
66+
if (!server.EnableAutoLogin) {
67+
delete server.UserId;
68+
delete server.AccessToken;
69+
delete server.EnableAutoLogin;
70+
}
71+
}
72+
73+
instance.appStorage.setItem(instance.key, JSON.stringify(dataCopy));
1774
} else {
1875
instance.clear();
1976
}
@@ -29,6 +86,7 @@ export default class Credentials {
2986
}
3087

3188
clear() {
89+
removeSession(this.key);
3290
this._credentials = null;
3391
this.appStorage.removeItem(this.key);
3492
}
@@ -57,6 +115,7 @@ export default class Credentials {
57115
if (server.AccessToken) {
58116
existing.AccessToken = server.AccessToken;
59117
existing.UserId = server.UserId;
118+
existing.EnableAutoLogin = server.EnableAutoLogin;
60119
}
61120
if (server.ExchangeToken) {
62121
existing.ExchangeToken = server.ExchangeToken;

yarn.lock

+5
Original file line numberDiff line numberDiff line change
@@ -3958,6 +3958,11 @@ jest@^26.0.1:
39583958
import-local "^3.0.2"
39593959
jest-cli "^26.6.3"
39603960

3961+
js-cookie@^2.2.1:
3962+
version "2.2.1"
3963+
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
3964+
integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
3965+
39613966
js-tokens@^4.0.0:
39623967
version "4.0.0"
39633968
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"

0 commit comments

Comments
 (0)