switched to koa-session

Massimo Melina committed Dec 27, 2021 at 17:53 UTC bc49438aae95b1ca2bf9d8c95abceb27e9a7a2fd
7 files changed +233 -69
package-lock.json
+215
@@ -16,6 +16,7 @@
16 "koa-bodyparser": "^4.3.0",
17 "koa-compress": "^5.1.0",
18 "koa-mount": "^4.0.0",
19 + "koa-session": "^6.2.0",
20 "lodash": "^4.17.21",
21 "minimist": "^1.2.5",
22 "yaml": "^1.10.2"
@@ -27,6 +28,7 @@
28 "@types/koa-bodyparser": "^4.3.4",
29 "@types/koa-compress": "^4.0.3",
30 "@types/koa-mount": "^4.0.1",
31 + "@types/koa-session": "^5.10.4",
32 "@types/koa-static": "^4.0.2",
33 "@types/lodash": "^4.14.178",
34 "@types/micromatch": "^4.0.2",
@@ -328,6 +330,16 @@
330 "@types/koa": "*"
331 }
332 },
333 + "node_modules/@types/koa-session": {
334 + "version": "5.10.4",
335 + "resolved": "https://registry.npmjs.org/@types/koa-session/-/koa-session-5.10.4.tgz",
336 + "integrity": "sha512-Xz9RPq+2raVvw6UN1JzDVL9/s2qr9E5AZOiiQti328HNhEj6IqT5rcssFQPNxCzh9bNG6uqqGMsACr5bdjylXA==",
337 + "dev": true,
338 + "dependencies": {
339 + "@types/cookies": "*",
340 + "@types/koa": "*"
341 + }
342 + },
343 "node_modules/@types/koa-static": {
344 "version": "4.0.2",
345 "resolved": "https://registry.npmjs.org/@types/koa-static/-/koa-static-4.0.2.tgz",
@@ -531,6 +543,25 @@
543 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
544 "dev": true
545 },
546 + "node_modules/base64-js": {
547 + "version": "1.5.1",
548 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
549 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
550 + "funding": [
551 + {
552 + "type": "github",
553 + "url": "https://github.com/sponsors/feross"
554 + },
555 + {
556 + "type": "patreon",
557 + "url": "https://www.patreon.com/feross"
558 + },
559 + {
560 + "type": "consulting",
561 + "url": "https://feross.org/support"
562 + }
563 + ]
564 + },
565 "node_modules/binary-extensions": {
566 "version": "2.2.0",
567 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -589,6 +620,29 @@
620 "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
621 "dev": true
622 },
623 + "node_modules/buffer": {
624 + "version": "5.7.1",
625 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
626 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
627 + "funding": [
628 + {
629 + "type": "github",
630 + "url": "https://github.com/sponsors/feross"
631 + },
632 + {
633 + "type": "patreon",
634 + "url": "https://www.patreon.com/feross"
635 + },
636 + {
637 + "type": "consulting",
638 + "url": "https://feross.org/support"
639 + }
640 + ],
641 + "dependencies": {
642 + "base64-js": "^1.3.1",
643 + "ieee754": "^1.1.13"
644 + }
645 + },
646 "node_modules/bytes": {
647 "version": "3.1.1",
648 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -887,6 +941,19 @@
941 "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz",
942 "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU="
943 },
944 + "node_modules/core-util-is": {
945 + "version": "1.0.3",
946 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
947 + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
948 + },
949 + "node_modules/crc": {
950 + "version": "3.8.0",
951 + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
952 + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
953 + "dependencies": {
954 + "buffer": "^5.1.0"
955 + }
956 + },
957 "node_modules/create-require": {
958 "version": "1.1.1",
959 "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -1387,6 +1454,25 @@
1454 "node": ">=0.10.0"
1455 }
1456 },
1457 + "node_modules/ieee754": {
1458 + "version": "1.2.1",
1459 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1460 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
1461 + "funding": [
1462 + {
1463 + "type": "github",
1464 + "url": "https://github.com/sponsors/feross"
1465 + },
1466 + {
1467 + "type": "patreon",
1468 + "url": "https://www.patreon.com/feross"
1469 + },
1470 + {
1471 + "type": "consulting",
1472 + "url": "https://feross.org/support"
1473 + }
1474 + ]
1475 + },
1476 "node_modules/ignore-by-default": {
1477 "version": "1.0.1",
1478 "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
@@ -1467,6 +1553,11 @@
1553 "is-ci": "bin.js"
1554 }
1555 },
1556 + "node_modules/is-class-hotfix": {
1557 + "version": "0.0.6",
1558 + "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz",
1559 + "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ=="
1560 + },
1561 "node_modules/is-extglob": {
1562 "version": "2.1.1",
1563 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -1572,6 +1663,16 @@
1663 "node": ">=8"
1664 }
1665 },
1666 + "node_modules/is-type-of": {
1667 + "version": "1.2.1",
1668 + "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz",
1669 + "integrity": "sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==",
1670 + "dependencies": {
1671 + "core-util-is": "^1.0.2",
1672 + "is-class-hotfix": "~0.0.6",
1673 + "isstream": "~0.1.2"
1674 + }
1675 + },
1676 "node_modules/is-typedarray": {
1677 "version": "1.0.0",
1678 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -1748,6 +1849,28 @@
1849 "node": ">= 7.6.0"
1850 }
1851 },
1852 + "node_modules/koa-session": {
1853 + "version": "6.2.0",
1854 + "resolved": "https://registry.npmjs.org/koa-session/-/koa-session-6.2.0.tgz",
1855 + "integrity": "sha512-l2ZC6D1BnRkIXhWkRgpewdqKn38/9/2WScmxyShuN408TxX+J/gUzdzGBIvGZaRwmezOU819sNpGmfFGLeDckg==",
1856 + "dependencies": {
1857 + "crc": "^3.4.4",
1858 + "debug": "^3.1.0",
1859 + "is-type-of": "^1.0.0",
1860 + "uuid": "^3.3.2"
1861 + },
1862 + "engines": {
1863 + "node": ">=7.6"
1864 + }
1865 + },
1866 + "node_modules/koa-session/node_modules/debug": {
1867 + "version": "3.2.7",
1868 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1869 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1870 + "dependencies": {
1871 + "ms": "^2.1.1"
1872 + }
1873 + },
1874 "node_modules/latest-version": {
1875 "version": "5.1.0",
1876 "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
@@ -2905,6 +3028,15 @@
3028 "node": ">=4"
3029 }
3030 },
3031 + "node_modules/uuid": {
3032 + "version": "3.4.0",
3033 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
3034 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
3035 + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
3036 + "bin": {
3037 + "uuid": "bin/uuid"
3038 + }
3039 + },
3040 "node_modules/vary": {
3041 "version": "1.1.2",
3042 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -3364,6 +3496,16 @@
3496 "@types/koa": "*"
3497 }
3498 },
3499 + "@types/koa-session": {
3500 + "version": "5.10.4",
3501 + "resolved": "https://registry.npmjs.org/@types/koa-session/-/koa-session-5.10.4.tgz",
3502 + "integrity": "sha512-Xz9RPq+2raVvw6UN1JzDVL9/s2qr9E5AZOiiQti328HNhEj6IqT5rcssFQPNxCzh9bNG6uqqGMsACr5bdjylXA==",
3503 + "dev": true,
3504 + "requires": {
3505 + "@types/cookies": "*",
3506 + "@types/koa": "*"
3507 + }
3508 + },
3509 "@types/koa-static": {
3510 "version": "4.0.2",
3511 "resolved": "https://registry.npmjs.org/@types/koa-static/-/koa-static-4.0.2.tgz",
@@ -3540,6 +3682,11 @@
3682 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
3683 "dev": true
3684 },
3685 + "base64-js": {
3686 + "version": "1.5.1",
3687 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
3688 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
3689 + },
3690 "binary-extensions": {
3691 "version": "2.2.0",
3692 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -3586,6 +3733,15 @@
3733 "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
3734 "dev": true
3735 },
3736 + "buffer": {
3737 + "version": "5.7.1",
3738 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
3739 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
3740 + "requires": {
3741 + "base64-js": "^1.3.1",
3742 + "ieee754": "^1.1.13"
3743 + }
3744 + },
3745 "bytes": {
3746 "version": "3.1.1",
3747 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -3813,6 +3969,19 @@
3969 "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz",
3970 "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU="
3971 },
3972 + "core-util-is": {
3973 + "version": "1.0.3",
3974 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
3975 + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
3976 + },
3977 + "crc": {
3978 + "version": "3.8.0",
3979 + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
3980 + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
3981 + "requires": {
3982 + "buffer": "^5.1.0"
3983 + }
3984 + },
3985 "create-require": {
3986 "version": "1.1.1",
3987 "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -4175,6 +4344,11 @@
4344 "safer-buffer": ">= 2.1.2 < 3"
4345 }
4346 },
4347 + "ieee754": {
4348 + "version": "1.2.1",
4349 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
4350 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
4351 + },
4352 "ignore-by-default": {
4353 "version": "1.0.1",
4354 "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
@@ -4237,6 +4411,11 @@
4411 "ci-info": "^2.0.0"
4412 }
4413 },
4414 + "is-class-hotfix": {
4415 + "version": "0.0.6",
4416 + "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz",
4417 + "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ=="
4418 + },
4419 "is-extglob": {
4420 "version": "2.1.1",
4421 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -4303,6 +4482,16 @@
4482 "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
4483 "dev": true
4484 },
4485 + "is-type-of": {
4486 + "version": "1.2.1",
4487 + "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz",
4488 + "integrity": "sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==",
4489 + "requires": {
4490 + "core-util-is": "^1.0.2",
4491 + "is-class-hotfix": "~0.0.6",
4492 + "isstream": "~0.1.2"
4493 + }
4494 + },
4495 "is-typedarray": {
4496 "version": "1.0.0",
4497 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -4451,6 +4640,27 @@
4640 "koa-compose": "^4.1.0"
4641 }
4642 },
4643 + "koa-session": {
4644 + "version": "6.2.0",
4645 + "resolved": "https://registry.npmjs.org/koa-session/-/koa-session-6.2.0.tgz",
4646 + "integrity": "sha512-l2ZC6D1BnRkIXhWkRgpewdqKn38/9/2WScmxyShuN408TxX+J/gUzdzGBIvGZaRwmezOU819sNpGmfFGLeDckg==",
4647 + "requires": {
4648 + "crc": "^3.4.4",
4649 + "debug": "^3.1.0",
4650 + "is-type-of": "^1.0.0",
4651 + "uuid": "^3.3.2"
4652 + },
4653 + "dependencies": {
4654 + "debug": {
4655 + "version": "3.2.7",
4656 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
4657 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
4658 + "requires": {
4659 + "ms": "^2.1.1"
4660 + }
4661 + }
4662 + }
4663 + },
4664 "latest-version": {
4665 "version": "5.1.0",
4666 "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
@@ -5270,6 +5480,11 @@
5480 "prepend-http": "^2.0.0"
5481 }
5482 },
5483 + "uuid": {
5484 + "version": "3.4.0",
5485 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
5486 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
5487 + },
5488 "vary": {
5489 "version": "1.1.2",
5490 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
package.json
+2
@@ -25,6 +25,7 @@
25 "koa-bodyparser": "^4.3.0",
26 "koa-compress": "^5.1.0",
27 "koa-mount": "^4.0.0",
28 + "koa-session": "^6.2.0",
29 "lodash": "^4.17.21",
30 "minimist": "^1.2.5",
31 "yaml": "^1.10.2"
@@ -36,6 +37,7 @@
37 "@types/koa-bodyparser": "^4.3.4",
38 "@types/koa-compress": "^4.0.3",
39 "@types/koa-mount": "^4.0.1",
40 + "@types/koa-session": "^5.10.4",
41 "@types/koa-static": "^4.0.2",
42 "@types/lodash": "^4.14.178",
43 "@types/micromatch": "^4.0.2",
src/apis.ts
+6 -23
@@ -3,12 +3,9 @@ import { vfs, VfsNode, walkNode } from './vfs'
3 import { stat } from 'fs/promises'
4 import _ from 'lodash'
5 import { getCurrentUsername, getCurrentUsernameExpanded, updateAccount, verifyLogin } from './perm'
6 -import { sessions } from './sessions'
6 import createSSE from './sse'
7 import { basename } from 'path'
8
10 -export const SESSION_COOKIE = 'hfs_$id'
11 -
9 type ApiHandler = (params:any, ctx:Koa.Context) => any
10 type ApiHandlers = Record<string, ApiHandler>
11
@@ -99,34 +96,20 @@ export const frontEndApis: ApiHandlers = {
96 return ctx.status = 400
97 if (!await verifyLogin(user, password))
98 return ctx.status = 401
102 - const sess = sessions.create(user)
103 - ctx.cookies.set(SESSION_COOKIE, sess.id)
104 - return sess
99 + if (ctx.session)
100 + ctx.session.user = user
101 + return true
102 },
103
104 async logout({}, ctx) {
108 - const sid = ctx.cookies.get(SESSION_COOKIE)
109 - if (!sid)
110 - return ctx.status = 401
111 - if (!sessions.destroy(sid))
112 - return ctx.status = 500
105 + if (ctx.session)
106 + ctx.session.user = undefined
107 ctx.status = 200
114 - ctx.cookies.set(SESSION_COOKIE, null)
108 return true
109 },
110
111 async refresh_session({}, ctx) {
119 - const prevId = ctx.cookies.get(SESSION_COOKIE)
120 - if (!prevId) return
121 - const sess = sessions.refresh(prevId)
122 - if (!sess) {
123 - ctx.cookies.set(SESSION_COOKIE)
124 - ctx.status = 400
125 - ctx.message = 'session not found'
126 - return
127 - }
128 - ctx.cookies.set(SESSION_COOKIE, sess.id)
129 - return sess
112 + return { user: ctx.session?.user }
113 },
114
115 async change_pwd({ newPassword }, ctx) {
src/index.ts
+8
@@ -11,10 +11,18 @@ import proxy from 'koa-better-http-proxy'
11 import compress from 'koa-compress'
12 import { Server } from 'http'
13 import { subscribe } from './config'
14 +import session from 'koa-session'
15
16 const BUILD_TIMESTAMP = ""
17
18 const app = new Koa()
19 +app.keys = ['hfs-keys-test']
20 +app.use(session({
21 + key: 'hfs_$id',
22 + signed: true,
23 + rolling: true,
24 + maxAge: 30*60_000,
25 +}, app))
26 app.use(async (ctx, next) => {
27 // log all requests
28 console.debug(new Date().toLocaleTimeString(), ctx.request.method, ctx.url)
src/perm.ts
+1 -4
@@ -5,8 +5,6 @@ import yaml from 'yaml'
5 import { hashPassword, verifyPassword } from './crypt'
6 import { argv } from './const'
7 import { readFileBusy, setHidden, wantArray } from './misc'
8 -import { SESSION_COOKIE } from './apis'
9 -import { sessions } from './sessions'
8 import Koa from 'koa'
9
10 const PATH = argv.accounts || 'accounts.yaml'
@@ -22,8 +20,7 @@ interface Accounts { [username:string]: Account }
20 let accounts: Accounts = {}
21
22 export async function getCurrentUsername(ctx: Koa.Context) {
25 - const id = ctx.cookies.get(SESSION_COOKIE)
26 - return id && sessions.get(id)?.user || ''
23 + return ctx.session?.user || ''
24 }
25
26 export async function getCurrentUsernameExpanded(ctx: Koa.Context) {
src/sessions.ts deleted
-42
@@ -1,42 +0,0 @@
1 -import { randomUUID } from 'crypto'
2 -
3 -const EXP_TIME = 5*60_000
4 -
5 -type SessionId = string
6 -class Session {
7 - id: string
8 - user?: string
9 - exp: Date
10 - constructor(init:Session | string){
11 - if (typeof init === 'string')
12 - this.user = init
13 - else
14 - Object.assign(this, init)
15 - this.id = randomUUID()
16 - this.exp = new Date(Date.now() + EXP_TIME)
17 - }
18 -}
19 -
20 -export const sessions = {
21 - all: new Map(),
22 - create(user:string) : Session {
23 - const sess = new Session(user)
24 - this.all.set(sess.id, sess)
25 - setTimeout(()=> this.all.delete(sess.id), EXP_TIME)
26 - return sess
27 - },
28 - get(id:SessionId) : Session | undefined {
29 - return this.all.get(id)
30 - },
31 - refresh(id:SessionId) : Session | undefined {
32 - let sess = this.get(id)
33 - if (!sess) return
34 - this.all.delete(sess.id)
35 - sess = new Session(sess)
36 - this.all.set(sess.id, sess)
37 - return sess
38 - },
39 - destroy(id:SessionId) {
40 - return this.all.delete(id)
41 - }
42 -}
todo.md
+1
@@ -1,4 +1,5 @@
1 # To do
2 +- anti-csrf
3 - file sorting
4 - folders before?
5 - upload