13 Commits

Author SHA1 Message Date
d359f55f39 minor changes 2023-11-01 20:16:46 +01:00
85ccc7523f Merge branch 'master' into AFLOW-36-project-support 2023-11-01 20:08:24 +01:00
c23b1b306c updated and properly implemented auth middleware AFLOW-32
Co-authored-by: Spacelord <git@spacelord.de>
2023-11-01 20:04:19 +01:00
2371089f88 updated config handler to autogenerate secrets and default user structure
Co-authored-by: Spacelord <Spacelord09@users.noreply.github.com>
2023-11-01 20:03:28 +01:00
6fa2797903 improved login screen (fixed layout, added error msg) 2023-08-27 19:04:55 +02:00
adc466e09a removed dots 2023-08-27 18:56:39 +02:00
af896a6688 Added local authentication (AFLOW-32) 2023-08-26 20:59:46 +02:00
347979bb10 Remove login demo page route 2023-08-26 20:57:16 +02:00
ddfdfc3092 Remove old demo login page 2023-08-26 20:56:48 +02:00
56cbebb36b Add form to login page 2023-08-26 20:56:26 +02:00
e307ff97ac Add passport.js dependencies 2023-08-26 20:56:03 +02:00
ddb484cac9 inital UI work on AFLOW-40 2023-07-11 17:00:34 +02:00
cd37f096ca Inital work on AFLOW-37 2023-07-11 16:38:18 +02:00
19 changed files with 822 additions and 205 deletions

591
package-lock.json generated
View File

@ -21,8 +21,11 @@
"eta": "^2.0.1", "eta": "^2.0.1",
"express": "^4.18.2", "express": "^4.18.2",
"express-fileupload": "^1.4.0", "express-fileupload": "^1.4.0",
"express-session": "^1.17.3",
"jquery": "^3.6.4", "jquery": "^3.6.4",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"passport": "^0.6.0",
"passport-local": "^1.0.0",
"signale": "^1.4.0", "signale": "^1.4.0",
"tsparticles-confetti": "^2.9.3" "tsparticles-confetti": "^2.9.3"
}, },
@ -30,7 +33,10 @@
"@loancrate/prisma-schema-parser": "^2.0.0", "@loancrate/prisma-schema-parser": "^2.0.0",
"@types/express": "^4.17.17", "@types/express": "^4.17.17",
"@types/express-fileupload": "^1.4.1", "@types/express-fileupload": "^1.4.1",
"@types/express-session": "^1.17.7",
"@types/lodash": "^4.14.194", "@types/lodash": "^4.14.194",
"@types/passport": "^1.0.12",
"@types/passport-local": "^1.0.35",
"@types/signale": "^1.4.4", "@types/signale": "^1.4.4",
"eslint": "^8.39.0", "eslint": "^8.39.0",
"eslint-config-prettier": "^8.8.0", "eslint-config-prettier": "^8.8.0",
@ -40,6 +46,21 @@
"typescript": "^5.0.4" "typescript": "^5.0.4"
} }
}, },
"node_modules/@antfu/ni": {
"version": "0.21.4",
"resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.4.tgz",
"integrity": "sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==",
"dev": true,
"bin": {
"na": "bin/na.mjs",
"nci": "bin/nci.mjs",
"ni": "bin/ni.mjs",
"nlx": "bin/nlx.mjs",
"nr": "bin/nr.mjs",
"nu": "bin/nu.mjs",
"nun": "bin/nun.mjs"
}
},
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.21.4", "version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
@ -427,16 +448,25 @@
} }
}, },
"node_modules/@prisma/debug": { "node_modules/@prisma/debug": {
"version": "4.13.0", "version": "4.16.2",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.16.2.tgz",
"integrity": "sha512-JrltTewF/paRb5mcM5OvcEi9DtdX0sINOAswruxKQrwOLA7Phqb52OfY38MIzGrsrJ8iUGVqQ5bpYZYpxOGCsQ==", "integrity": "sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/debug": "4.1.7", "@types/debug": "4.1.8",
"debug": "4.3.4", "debug": "4.3.4",
"strip-ansi": "6.0.1" "strip-ansi": "6.0.1"
} }
}, },
"node_modules/@prisma/debug/node_modules/@types/debug": {
"version": "4.1.8",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz",
"integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==",
"dev": true,
"dependencies": {
"@types/ms": "*"
}
},
"node_modules/@prisma/debug/node_modules/debug": { "node_modules/@prisma/debug/node_modules/debug": {
"version": "4.3.4", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -461,17 +491,17 @@
"dev": true "dev": true
}, },
"node_modules/@prisma/engine-core": { "node_modules/@prisma/engine-core": {
"version": "4.13.0", "version": "4.6.1",
"resolved": "https://registry.npmjs.org/@prisma/engine-core/-/engine-core-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@prisma/engine-core/-/engine-core-4.6.1.tgz",
"integrity": "sha512-D+jooGRXKAZcsBanhvFhqXMvNEiNaP+OaOvFOM/eKQQXM0FwtKc27l7mQFv4dd/zOufr5T+fJyrTTQhWyV8oFg==", "integrity": "sha512-JtvdEy9GeGU/xeTYOq3SEN4DiAytHoQty/4pJTZ5vNoGMnu7XF1ToprOCPzyT5oSgm3oQQuwpXMVaebJegwA4Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@opentelemetry/api": "^1.3.0", "@opentelemetry/api": "^1.1.0",
"@opentelemetry/sdk-trace-base": "^1.8.0", "@opentelemetry/sdk-trace-base": "^1.4.0",
"@prisma/debug": "4.13.0", "@prisma/debug": "4.6.1",
"@prisma/engines": "4.13.0", "@prisma/engines": "4.6.1",
"@prisma/generator-helper": "4.13.0", "@prisma/generator-helper": "4.6.1",
"@prisma/get-platform": "4.13.0", "@prisma/get-platform": "4.6.1",
"chalk": "4.1.2", "chalk": "4.1.2",
"execa": "5.1.1", "execa": "5.1.1",
"get-stream": "6.0.1", "get-stream": "6.0.1",
@ -479,8 +509,63 @@
"new-github-issue-url": "0.2.1", "new-github-issue-url": "0.2.1",
"p-retry": "4.6.2", "p-retry": "4.6.2",
"strip-ansi": "6.0.1", "strip-ansi": "6.0.1",
"ts-pattern": "4.2.2", "undici": "5.11.0"
"undici": "5.21.0" }
},
"node_modules/@prisma/engine-core/node_modules/@prisma/debug": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.6.1.tgz",
"integrity": "sha512-BezDvSenTgQDQ6WA3TdTDGcrt0Oh4vmpZtmSOYm1KaSZiSVIL2xT0P9TFM3vtOa4wn7sn/003PyTSxyHS3mShg==",
"dev": true,
"dependencies": {
"@types/debug": "4.1.7",
"debug": "4.3.4",
"strip-ansi": "6.0.1"
}
},
"node_modules/@prisma/engine-core/node_modules/@prisma/engines": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.6.1.tgz",
"integrity": "sha512-3u2/XxvxB+Q7cMXHnKU0CpBiUK1QWqpgiBv28YDo1zOIJE3FCF8DI2vrp6vuwjGt5h0JGXDSvmSf4D4maVjJdw==",
"dev": true,
"hasInstallScript": true
},
"node_modules/@prisma/engine-core/node_modules/@prisma/generator-helper": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.6.1.tgz",
"integrity": "sha512-70XBmqDhmpe8H35ttOJOgyg1OpppO/uelILB1SIwjeSI7PHHdU2+Y/+LkpnifkCEpSZKIhxEIPbHx17m2neAsA==",
"dev": true,
"dependencies": {
"@prisma/debug": "4.6.1",
"@types/cross-spawn": "6.0.2",
"chalk": "4.1.2",
"cross-spawn": "7.0.3"
}
},
"node_modules/@prisma/engine-core/node_modules/@prisma/get-platform": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.6.1.tgz",
"integrity": "sha512-JBlzN53Q00bTfk3mPxeprAx8LLN7bmEwTGZ3fFjbCKZACsHtbDaaqtIkqXwk0tv1jJ3jLYZfcq7NlvdOPyJhGw==",
"dev": true,
"dependencies": {
"@prisma/debug": "4.6.1"
}
},
"node_modules/@prisma/engine-core/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
} }
}, },
"node_modules/@prisma/engine-core/node_modules/indent-string": { "node_modules/@prisma/engine-core/node_modules/indent-string": {
@ -492,16 +577,16 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/@prisma/engine-core/node_modules/ts-pattern": { "node_modules/@prisma/engine-core/node_modules/ms": {
"version": "4.2.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-qzJMo2pbkUJWusRH5o8xR+xogn6RmvViyUgwBFTtRENLse470clCGjHDf6haWGZ1AOmk8XkEohUoBW8Uut6Scg==", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true "dev": true
}, },
"node_modules/@prisma/engines": { "node_modules/@prisma/engines": {
"version": "4.13.0", "version": "4.16.2",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz",
"integrity": "sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==", "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==",
"dev": true, "dev": true,
"hasInstallScript": true "hasInstallScript": true
}, },
@ -511,21 +596,21 @@
"integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw=="
}, },
"node_modules/@prisma/fetch-engine": { "node_modules/@prisma/fetch-engine": {
"version": "4.13.0", "version": "4.16.2",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-4.16.2.tgz",
"integrity": "sha512-khMMm3I8nMUgwd7DoM1wBFjMKn/Z5PZF27EMQGPtquM1nRt601blJbep0qodXR7oHioQolCK8gfbw5Hfdml1mg==", "integrity": "sha512-lnCnHcOaNn0kw8qTJbVcNhyfIf5Lus2GFXbj3qpkdKEIB9xLgqkkuTP+35q1xFaqwQ0vy4HFpdRUpFP7njE15g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@prisma/debug": "4.13.0", "@prisma/debug": "4.16.2",
"@prisma/get-platform": "4.13.0", "@prisma/get-platform": "4.16.2",
"chalk": "4.1.2",
"execa": "5.1.1", "execa": "5.1.1",
"find-cache-dir": "3.3.2", "find-cache-dir": "3.3.2",
"fs-extra": "11.1.1", "fs-extra": "11.1.1",
"hasha": "5.2.2", "hasha": "5.2.2",
"http-proxy-agent": "5.0.0", "http-proxy-agent": "7.0.0",
"https-proxy-agent": "5.0.1", "https-proxy-agent": "7.0.0",
"node-fetch": "2.6.9", "kleur": "4.1.5",
"node-fetch": "2.6.11",
"p-filter": "2.1.0", "p-filter": "2.1.0",
"p-map": "4.0.0", "p-map": "4.0.0",
"p-retry": "4.6.2", "p-retry": "4.6.2",
@ -535,34 +620,95 @@
"tempy": "1.0.1" "tempy": "1.0.1"
} }
}, },
"node_modules/@prisma/generator-helper": { "node_modules/@prisma/fetch-engine/node_modules/agent-base": {
"version": "4.13.0", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.13.0.tgz", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
"integrity": "sha512-Zx9rtbsEIU/9DKnGRvmjLdyeyhzeeXNFp1alkRh1w//rQ5jTcobiay/jU4Qo+EQOs2bnWEfUeiBoOjfaysdLNg==", "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@prisma/debug": "4.13.0", "debug": "^4.3.4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/@prisma/fetch-engine/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/@prisma/fetch-engine/node_modules/http-proxy-agent": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
"integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
"dev": true,
"dependencies": {
"agent-base": "^7.1.0",
"debug": "^4.3.4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/@prisma/fetch-engine/node_modules/https-proxy-agent": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz",
"integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==",
"dev": true,
"dependencies": {
"agent-base": "^7.0.2",
"debug": "4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/@prisma/fetch-engine/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node_modules/@prisma/generator-helper": {
"version": "4.16.2",
"resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.16.2.tgz",
"integrity": "sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==",
"dev": true,
"dependencies": {
"@prisma/debug": "4.16.2",
"@types/cross-spawn": "6.0.2", "@types/cross-spawn": "6.0.2",
"chalk": "4.1.2", "cross-spawn": "7.0.3",
"cross-spawn": "7.0.3" "kleur": "4.1.5"
} }
}, },
"node_modules/@prisma/get-platform": { "node_modules/@prisma/get-platform": {
"version": "4.13.0", "version": "4.16.2",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.16.2.tgz",
"integrity": "sha512-HWBgQNpRi1qEXj24w/qsWCpTW4vKP2/pdiYTyl2SSEVoK4o5izHUt0PQzNl5St5CGr4SDcSyi0C3fXINd46c6A==", "integrity": "sha512-fnDey1/iSefHJRMB+w243BhWENf+paRouPMdCqIVqu8dYkR1NqhldblsSUC4Zr2sKS7Ta2sK4OLdt9IH+PZTfw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@prisma/debug": "4.13.0", "@prisma/debug": "4.16.2",
"chalk": "4.1.2",
"escape-string-regexp": "4.0.0", "escape-string-regexp": "4.0.0",
"execa": "5.1.1", "execa": "5.1.1",
"fs-jetpack": "5.1.0", "fs-jetpack": "5.1.0",
"kleur": "4.1.5",
"replace-string": "3.1.0", "replace-string": "3.1.0",
"strip-ansi": "6.0.1", "strip-ansi": "6.0.1",
"tempy": "1.0.1", "tempy": "1.0.1",
"terminal-link": "2.1.1", "terminal-link": "2.1.1",
"ts-pattern": "4.2.2" "ts-pattern": "4.3.0"
} }
}, },
"node_modules/@prisma/get-platform/node_modules/escape-string-regexp": { "node_modules/@prisma/get-platform/node_modules/escape-string-regexp": {
@ -577,53 +723,46 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/@prisma/get-platform/node_modules/ts-pattern": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.2.tgz",
"integrity": "sha512-qzJMo2pbkUJWusRH5o8xR+xogn6RmvViyUgwBFTtRENLse470clCGjHDf6haWGZ1AOmk8XkEohUoBW8Uut6Scg==",
"dev": true
},
"node_modules/@prisma/internals": { "node_modules/@prisma/internals": {
"version": "4.13.0", "version": "4.16.2",
"resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-4.13.0.tgz", "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-4.16.2.tgz",
"integrity": "sha512-TxdTQFJO0zMCx0Tgb6UZt3WsVt+etvtWx+LaSWf4Pk1ECGte5w+9iiuypwjiLortSn7qm6n5KVWTXFOnnZr4Ww==", "integrity": "sha512-/3OiSADA3RRgsaeEE+MDsBgL6oAMwddSheXn6wtYGUnjERAV/BmF5bMMLnTykesQqwZ1s8HrISrJ0Vf6cjOxMg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@prisma/debug": "4.13.0", "@antfu/ni": "0.21.4",
"@prisma/engine-core": "4.13.0", "@opentelemetry/api": "1.4.1",
"@prisma/engines": "4.13.0", "@prisma/debug": "4.16.2",
"@prisma/fetch-engine": "4.13.0", "@prisma/engines": "4.16.2",
"@prisma/generator-helper": "4.13.0", "@prisma/fetch-engine": "4.16.2",
"@prisma/get-platform": "4.13.0", "@prisma/generator-helper": "4.16.2",
"@prisma/ni": "4.13.0", "@prisma/get-platform": "4.16.2",
"@prisma/prisma-fmt-wasm": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a", "@prisma/prisma-fmt-wasm": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81",
"archiver": "5.3.1", "archiver": "5.3.1",
"arg": "5.0.2", "arg": "5.0.2",
"chalk": "4.1.2", "checkpoint-client": "1.1.24",
"checkpoint-client": "1.1.23",
"cli-truncate": "2.1.0", "cli-truncate": "2.1.0",
"dotenv": "16.0.3", "dotenv": "16.0.3",
"escape-string-regexp": "4.0.0", "escape-string-regexp": "4.0.0",
"execa": "5.1.1", "execa": "5.1.1",
"find-up": "5.0.0", "find-up": "5.0.0",
"fp-ts": "2.13.1", "fp-ts": "2.16.0",
"fs-extra": "11.1.1", "fs-extra": "11.1.1",
"fs-jetpack": "5.1.0", "fs-jetpack": "5.1.0",
"global-dirs": "3.0.1", "global-dirs": "3.0.1",
"globby": "11.1.0", "globby": "11.1.0",
"has-yarn": "2.1.0", "indent-string": "4.0.0",
"is-windows": "^1.0.2", "is-windows": "1.0.2",
"is-wsl": "^2.2.0", "is-wsl": "2.2.0",
"kleur": "4.1.5",
"new-github-issue-url": "0.2.1", "new-github-issue-url": "0.2.1",
"node-fetch": "2.6.9", "node-fetch": "2.6.11",
"npm-packlist": "5.1.3", "npm-packlist": "5.1.3",
"open": "7", "open": "7.4.2",
"ora": "5.4.1",
"p-map": "4.0.0", "p-map": "4.0.0",
"prompts": "2.4.2", "prompts": "2.4.2",
"read-pkg-up": "7.0.1", "read-pkg-up": "7.0.1",
"replace-string": "3.1.0", "replace-string": "3.1.0",
"resolve": "1.22.1", "resolve": "1.22.2",
"string-width": "4.2.3", "string-width": "4.2.3",
"strip-ansi": "6.0.1", "strip-ansi": "6.0.1",
"strip-indent": "3.0.0", "strip-indent": "3.0.0",
@ -632,7 +771,7 @@
"tempy": "1.0.1", "tempy": "1.0.1",
"terminal-link": "2.1.1", "terminal-link": "2.1.1",
"tmp": "0.2.1", "tmp": "0.2.1",
"ts-pattern": "^4.0.1" "ts-pattern": "4.3.0"
} }
}, },
"node_modules/@prisma/internals/node_modules/escape-string-regexp": { "node_modules/@prisma/internals/node_modules/escape-string-regexp": {
@ -647,16 +786,42 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/@prisma/ni": { "node_modules/@prisma/internals/node_modules/fp-ts": {
"version": "4.13.0", "version": "2.16.0",
"resolved": "https://registry.npmjs.org/@prisma/ni/-/ni-4.13.0.tgz", "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz",
"integrity": "sha512-FN1wV1I61P6WndheLpja5oQuzIW2WkYqFViPL5GS5dhrpsO69SlyOnAsxpfCKUa5HhXINi7fowgdcngK1QDW9w==", "integrity": "sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==",
"dev": true "dev": true
}, },
"node_modules/@prisma/internals/node_modules/indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/@prisma/internals/node_modules/resolve": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
"integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
"dev": true,
"dependencies": {
"is-core-module": "^2.11.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/@prisma/prisma-fmt-wasm": { "node_modules/@prisma/prisma-fmt-wasm": {
"version": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a", "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81",
"resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a.tgz", "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz",
"integrity": "sha512-kEYSUa3XT1Oiu/MbdUkyjfVtAOQmZz69KGKFH/GWoQNLvkscrqy4J4XewEY80BrVuyC3vbV7un4kea0xklWhpA==", "integrity": "sha512-g090+dEH7wrdCw359+8J9+TGH84qK28V/dxwINjhhNCtju9lej99z9w/AVsJP9UhhcCPS4psYz4iu8d53uxVpA==",
"dev": true "dev": true
}, },
"node_modules/@sentry-internal/tracing": { "node_modules/@sentry-internal/tracing": {
@ -832,6 +997,15 @@
"@types/send": "*" "@types/send": "*"
} }
}, },
"node_modules/@types/express-session": {
"version": "1.17.7",
"resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.7.tgz",
"integrity": "sha512-L25080PBYoRLu472HY/HNCxaXY8AaGgqGC8/p/8+BYMhG0RDOLQ1wpXOpAzr4Gi5TGozTKyJv5BVODM5UNyVMw==",
"dev": true,
"dependencies": {
"@types/express": "*"
}
},
"node_modules/@types/lodash": { "node_modules/@types/lodash": {
"version": "4.14.194", "version": "4.14.194",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz",
@ -868,6 +1042,36 @@
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true "dev": true
}, },
"node_modules/@types/passport": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz",
"integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==",
"dev": true,
"dependencies": {
"@types/express": "*"
}
},
"node_modules/@types/passport-local": {
"version": "1.0.35",
"resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.35.tgz",
"integrity": "sha512-K4eLTJ8R0yYW8TvCqkjB0pTKoqfUSdl5PfZdidTjV2ETV3604fQxtY6BHKjQWAx50WUS0lqzBvKv3LoI1ZBPeA==",
"dev": true,
"dependencies": {
"@types/express": "*",
"@types/passport": "*",
"@types/passport-strategy": "*"
}
},
"node_modules/@types/passport-strategy": {
"version": "0.2.35",
"resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz",
"integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==",
"dev": true,
"dependencies": {
"@types/express": "*",
"@types/passport": "*"
}
},
"node_modules/@types/qs": { "node_modules/@types/qs": {
"version": "6.9.7", "version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
@ -1452,18 +1656,33 @@
} }
}, },
"node_modules/checkpoint-client": { "node_modules/checkpoint-client": {
"version": "1.1.23", "version": "1.1.24",
"resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.23.tgz", "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.24.tgz",
"integrity": "sha512-NrGvMiH1fUcZwrYc0Z+YTn7q9ysV0kPgVyDKZ5jrfIerFJuSllvyGsY7bHeQSEiljaIaUP1Q/xutZ8q1s7PGzg==", "integrity": "sha512-nIOlLhDS7MKs4tUzS3LCm+sE1NgTCVnVrXlD0RRxaoEkkLu8LIWSUNiNWai6a+LK5unLzTyZeTCYX1Smqy0YoA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"ci-info": "3.3.0", "ci-info": "3.8.0",
"env-paths": "2.2.1", "env-paths": "2.2.1",
"fast-write-atomic": "0.2.1", "fast-write-atomic": "0.2.1",
"make-dir": "3.1.0", "make-dir": "3.1.0",
"ms": "2.1.3", "ms": "2.1.3",
"node-fetch": "2.6.7", "node-fetch": "2.6.11",
"uuid": "8.3.2" "uuid": "9.0.0"
}
},
"node_modules/checkpoint-client/node_modules/ci-info": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
"integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/sibiraj-s"
}
],
"engines": {
"node": ">=8"
} }
}, },
"node_modules/checkpoint-client/node_modules/ms": { "node_modules/checkpoint-client/node_modules/ms": {
@ -1472,24 +1691,13 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true "dev": true
}, },
"node_modules/checkpoint-client/node_modules/node-fetch": { "node_modules/checkpoint-client/node_modules/uuid": {
"version": "2.6.7", "version": "9.0.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
"dev": true, "dev": true,
"dependencies": { "bin": {
"whatwg-url": "^5.0.0" "uuid": "dist/bin/uuid"
},
"engines": {
"node": "4.x || >=6.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
} }
}, },
"node_modules/ci-info": { "node_modules/ci-info": {
@ -2337,6 +2545,32 @@
"node": ">=12.0.0" "node": ">=12.0.0"
} }
}, },
"node_modules/express-session": {
"version": "1.17.3",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
"integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
"dependencies": {
"cookie": "0.4.2",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~2.0.0",
"on-headers": "~1.0.2",
"parseurl": "~1.3.3",
"safe-buffer": "5.2.1",
"uid-safe": "~2.1.5"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/express-session/node_modules/cookie": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
"integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/express/node_modules/body-parser": { "node_modules/express/node_modules/body-parser": {
"version": "1.20.1", "version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@ -4016,9 +4250,9 @@
"dev": true "dev": true
}, },
"node_modules/node-fetch": { "node_modules/node-fetch": {
"version": "2.6.9", "version": "2.6.11",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz",
"integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"whatwg-url": "^5.0.0" "whatwg-url": "^5.0.0"
@ -4051,9 +4285,9 @@
} }
}, },
"node_modules/normalize-package-data/node_modules/semver": { "node_modules/normalize-package-data/node_modules/semver": {
"version": "7.5.0", "version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
@ -4211,6 +4445,14 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": { "node_modules/once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@ -4422,6 +4664,42 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/passport": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
"integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
"dependencies": {
"passport-strategy": "1.x.x",
"pause": "0.0.1",
"utils-merge": "^1.0.1"
},
"engines": {
"node": ">= 0.4.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jaredhanson"
}
},
"node_modules/passport-local": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
"integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==",
"dependencies": {
"passport-strategy": "1.x.x"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/passport-strategy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
"integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/path-exists": { "node_modules/path-exists": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@ -4469,6 +4747,11 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/pause": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
},
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
@ -4720,28 +5003,6 @@
"strip-ansi": "6.0.1" "strip-ansi": "6.0.1"
} }
}, },
"node_modules/prisma-dbml-generator/node_modules/@prisma/engine-core": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/@prisma/engine-core/-/engine-core-4.6.1.tgz",
"integrity": "sha512-JtvdEy9GeGU/xeTYOq3SEN4DiAytHoQty/4pJTZ5vNoGMnu7XF1ToprOCPzyT5oSgm3oQQuwpXMVaebJegwA4Q==",
"dev": true,
"dependencies": {
"@opentelemetry/api": "^1.1.0",
"@opentelemetry/sdk-trace-base": "^1.4.0",
"@prisma/debug": "4.6.1",
"@prisma/engines": "4.6.1",
"@prisma/generator-helper": "4.6.1",
"@prisma/get-platform": "4.6.1",
"chalk": "4.1.2",
"execa": "5.1.1",
"get-stream": "6.0.1",
"indent-string": "4.0.0",
"new-github-issue-url": "0.2.1",
"p-retry": "4.6.2",
"strip-ansi": "6.0.1",
"undici": "5.11.0"
}
},
"node_modules/prisma-dbml-generator/node_modules/@prisma/engines": { "node_modules/prisma-dbml-generator/node_modules/@prisma/engines": {
"version": "4.6.1", "version": "4.6.1",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.6.1.tgz", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.6.1.tgz",
@ -4932,15 +5193,6 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/prisma-dbml-generator/node_modules/indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/prisma-dbml-generator/node_modules/ms": { "node_modules/prisma-dbml-generator/node_modules/ms": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@ -4967,18 +5219,6 @@
} }
} }
}, },
"node_modules/prisma-dbml-generator/node_modules/undici": {
"version": "5.11.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.11.0.tgz",
"integrity": "sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw==",
"dev": true,
"dependencies": {
"busboy": "^1.6.0"
},
"engines": {
"node": ">=12.18"
}
},
"node_modules/prisma-docs-generator": { "node_modules/prisma-docs-generator": {
"version": "0.7.0", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/prisma-docs-generator/-/prisma-docs-generator-0.7.0.tgz", "resolved": "https://registry.npmjs.org/prisma-docs-generator/-/prisma-docs-generator-0.7.0.tgz",
@ -5116,6 +5356,14 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
"integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/range-parser": { "node_modules/range-parser": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@ -5250,9 +5498,9 @@
} }
}, },
"node_modules/read-pkg/node_modules/semver": { "node_modules/read-pkg/node_modules/semver": {
"version": "5.7.1", "version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true, "dev": true,
"bin": { "bin": {
"semver": "bin/semver" "semver": "bin/semver"
@ -5497,9 +5745,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "6.3.0", "version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true, "dev": true,
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
@ -6065,9 +6313,9 @@
} }
}, },
"node_modules/ts-pattern": { "node_modules/ts-pattern": {
"version": "4.2.3", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.3.tgz", "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz",
"integrity": "sha512-tPg2/owaVtWiimsmXpFEzI5IcfPU2BEwzFbviuSmqqaKIGyy6hyvBF4kxcuhy8UJz+6nEKUOEeaHc43drIuvpQ==", "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==",
"dev": true "dev": true
}, },
"node_modules/ts-toolbelt": { "node_modules/ts-toolbelt": {
@ -6369,6 +6617,17 @@
"node": ">=12.20" "node": ">=12.20"
} }
}, },
"node_modules/uid-safe": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
"integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
"dependencies": {
"random-bytes": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/unbox-primitive": { "node_modules/unbox-primitive": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
@ -6385,9 +6644,9 @@
} }
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "5.21.0", "version": "5.11.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-5.11.0.tgz",
"integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", "integrity": "sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"busboy": "^1.6.0" "busboy": "^1.6.0"
@ -6552,9 +6811,9 @@
} }
}, },
"node_modules/word-wrap": { "node_modules/word-wrap": {
"version": "1.2.3", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"

View File

@ -29,8 +29,11 @@
"eta": "^2.0.1", "eta": "^2.0.1",
"express": "^4.18.2", "express": "^4.18.2",
"express-fileupload": "^1.4.0", "express-fileupload": "^1.4.0",
"express-session": "^1.17.3",
"jquery": "^3.6.4", "jquery": "^3.6.4",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"passport": "^0.6.0",
"passport-local": "^1.0.0",
"signale": "^1.4.0", "signale": "^1.4.0",
"tsparticles-confetti": "^2.9.3" "tsparticles-confetti": "^2.9.3"
}, },
@ -38,7 +41,10 @@
"@loancrate/prisma-schema-parser": "^2.0.0", "@loancrate/prisma-schema-parser": "^2.0.0",
"@types/express": "^4.17.17", "@types/express": "^4.17.17",
"@types/express-fileupload": "^1.4.1", "@types/express-fileupload": "^1.4.1",
"@types/express-session": "^1.17.7",
"@types/lodash": "^4.14.194", "@types/lodash": "^4.14.194",
"@types/passport": "^1.0.12",
"@types/passport-local": "^1.0.35",
"@types/signale": "^1.4.4", "@types/signale": "^1.4.4",
"eslint": "^8.39.0", "eslint": "^8.39.0",
"eslint-config-prettier": "^8.8.0", "eslint-config-prettier": "^8.8.0",

View File

@ -38,7 +38,7 @@ model Item {
SKU String? @unique SKU String? @unique
amount Int @default(1) amount Int @default(1)
name String name String
comment String? @db.VarChar(2048) comment String? @db.VarChar(2048)
status itemStatus @default(normal) /// TODO: Would it be better to create a separate model for this as well instead of providing several static statuses to choose from(enum)? status itemStatus @default(normal) /// TODO: Would it be better to create a separate model for this as well instead of providing several static statuses to choose from(enum)?
contactInfo contactInfo? @relation(fields: [contactInfoId], references: [id]) contactInfo contactInfo? @relation(fields: [contactInfoId], references: [id])
@ -50,13 +50,13 @@ model Item {
categoryId Int? categoryId Int?
contents Item[] @relation("items") /// Item beinhaltet.. contents Item[] @relation("items") /// Item beinhaltet..
baseItem Item[] @relation("items") /// Item zugehörig zu. baseItem Item[] @relation("items") /// Item zugehörig zu
storageLocation StorageLocation? @relation(fields: [storageLocationId], references: [id]) storageLocation StorageLocation? @relation(fields: [storageLocationId], references: [id])
storageLocationId Int? storageLocationId Int?
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
createdBy String? createdBy String?
} }
@ -99,6 +99,21 @@ model contactInfo {
StorageUnit StorageUnit[] StorageUnit StorageUnit[]
Item Item[] Item Item[]
project project[]
projectAssignedUsers project[] @relation("projectAssignedUsers")
}
model project {
id Int @id @default(autoincrement())
name String @unique
description String? @db.VarChar(2048)
// People
manager contactInfo? @relation(fields: [contactInfoId], references: [id]) // Primary, manager of the project
assignedUsers contactInfo[] @relation("projectAssignedUsers") // Secondary, assigned users to the project, stagehands, etc.
contactInfoId Int?
// When does it start and end
startTime DateTime?
endTime DateTime?
} }
/// TODO: Allow multiple types to be used? /// TODO: Allow multiple types to be used?

View File

@ -1,5 +1,6 @@
import fs from 'node:fs'; import fs from 'node:fs';
import _ from 'lodash'; import _ from 'lodash';
import { randomUUID, randomBytes } from 'crypto';
export type configObject = Record<any, any>; export type configObject = Record<any, any>;
@ -14,6 +15,7 @@ export default class config {
#configPath: string; #configPath: string;
//global = {[key: string] : string} //global = {[key: string] : string}
global: configObject; global: configObject;
replaceSecrets: boolean;
/** /**
* Creates an instance of config. * Creates an instance of config.
@ -22,9 +24,10 @@ export default class config {
* @param {string} configPath Path to config file. * @param {string} configPath Path to config file.
* @param {object} configPreset Default config object with default values. * @param {object} configPreset Default config object with default values.
*/ */
constructor(configPath: string, configPreset: object) { constructor(configPath: string, replaceSecrets: boolean, configPreset: object) {
this.#configPath = configPath; this.#configPath = configPath;
this.global = configPreset; this.global = configPreset;
this.replaceSecrets = replaceSecrets;
try { try {
// Read config // Read config
@ -52,6 +55,12 @@ export default class config {
*/ */
save_config() { save_config() {
try { try {
// If enabled replace tokens defines as "gen" with random token
if (this.replaceSecrets) {
// Replace tokens with value "gen"
this.generate_secrets(this.global, 'gen')
}
fs.writeFileSync(this.#configPath, JSON.stringify(this.global, null, 8)); fs.writeFileSync(this.#configPath, JSON.stringify(this.global, null, 8));
} catch (err) { } catch (err) {
console.error(`Could not write config file at ${this.#configPath} due to: ${err}`); console.error(`Could not write config file at ${this.#configPath} due to: ${err}`);
@ -59,31 +68,73 @@ export default class config {
} }
console.log(`Successfully written config file to ${this.#configPath}`); console.log(`Successfully written config file to ${this.#configPath}`);
} }
/**
* Replaces each item matching the value of placeholder with a random UUID.
* Thanks to https://stackoverflow.com/questions/8085004/iterate-through-nested-javascript-objects
* @param {configObject} obj
*/
generate_secrets(obj: configObject, placeholder: string) {
const stack = [obj];
while (stack?.length > 0) {
const currentObj = stack.pop();
Object.keys(currentObj).forEach((key) => {
if (currentObj[key] === placeholder) {
console.log('Generating secret: ' + key);
currentObj[key] = randomBytes(48).toString('base64').replace(/\W/g, '');
}
if (typeof currentObj[key] === 'object' && currentObj[key] !== null) {
stack.push(currentObj[key]);
}
});
}
}
} }
/* /*
**** Example **** **** Example ****
import configHandler from './assets/configHandler.js'; import ConfigHandlerNG from './assets/configHandlerNG.js';
// Create a new config instance. // Create a new config instance.
export const config = new ConfigHandler(__path + '/config.json', { export const config = new ConfigHandler(__path + '/config.json', true, {
db_connection_string: 'mysql://USER:PASSWORD@HOST:3306/DATABASE', test1: 't1',
http_listen_address: '127.0.0.1', test2: 't2',
http_port: 3000, test3: 'gen',
sentry_dsn: 'https://ID@sentry.example.com/PROJECTID', test4: 't4',
debug: false test5: 'gen',
}); testObj: {
local: {
active: true,
users: {
user1: 'gen',
user2: 'gen',
user3: 'gen',
user4: 'gen',
}
},
oidc: {
active: false
}
}
});
console.log('Base Config:'); console.log('Base Config:');
console.log(config.global); console.log(config.global);
console.log('Add some new key to config and call save_config.'); console.log('Add some new key to config and call save_config().');
config.global.NewKey = 'ThisIsANewKey!' config.global.NewKey = 'ThisIsANewKey!'
config.save_config() config.save_config()
console.log('This will add a new key with value gen, but gen gets replaced with a random UUID when save_config() is called.');
config.global.someSecret = 'gen'
config.save_config() // global.someSecret is getting replaced with some random UUID since it was set to 'gen'.
console.log('Complete Config:'); console.log('Complete Config:');
console.log(config.global); console.log(config.global);
*/ */

View File

@ -4,9 +4,33 @@
<div class="background text-center"> <div class="background text-center">
<div class="row align-items-start"> <div class="row align-items-start">
<div class="col-9"></div> <div class="col-9"></div>
<div class="col-3 sidePanel ps-4 text-black"> <div class="col-3 sidePanel ps-4 pe-4 text-black">
<h1>Log into AssetFlow</h1> <h1>Log into AssetFlow</h1>
<div class="alert alert-danger" role="alert" id="passwordAlarm">
User does not exist or password is incorrect.
</div>
<form action="/auth/login" method="post">
<div class="mb-3">
<label for="userName" class="form-label">Username</label>
<input name="username" type="text" class="form-control" id="userName" aria-describedby="userNameHelp" />
<!-- <div id="userNameHelp" class="form-text">We'll never share your email with anyone else.</div> -->
</div>
<div class="mb-3">
<label for="userPassword" class="form-label">Password</label>
<input name="password" type="password" class="form-control" id="userPassword" />
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div> </div>
</div> </div>
<script>
// if url parameter ?failed is set, show the password alarm
if (window.location.search.includes("failed")) {
document.getElementById("passwordAlarm").style.display = "block";
} else {
document.getElementById("passwordAlarm").style.display = "none";
}
</script>
<%~ E.includeFile("../partials/foot.eta.html") %> <%~ E.includeFile("../partials/foot.eta.html") %>
</div> </div>

View File

@ -81,15 +81,37 @@
</li> --> </li> -->
</ul> </ul>
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted">
<a href="/projects/" class="nav-link"
>Projects<span class="badge rounded-pill bg-primary" >
Alpha
<span class="visually-hidden">Alpha feature</span>
</span>
</a>
</h6>
<ul class="nav flex-column mb-2">
<li class="nav-item">
<a class="nav-link <%= it.active == 'PROJ_HOME' ? 'active' : ''%>" href="/projects/"><i class="bi bi-kanban"></i> Manage Projects </a>
</li>
<li class="nav-item">
<a class="nav-link <%= it.active == 'PROJ_LIST' ? 'active' : ''%>" href="/projects/lists"><i class="bi bi-card-checklist"></i> Packaging Lists </a>
</li>
<li class="nav-item">
<a class="nav-link <%= it.active == 'PROJ_PEPS' ? 'active' : ''%>" href="/projects/people"><i class="bi bi-people-fill"></i> People </a>
</li>
</ul>
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted"> <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted">
<a href="/manage/" class="nav-link" <a href="/manage/" class="nav-link"
>Settings >Settings
<span class="badge rounded-pill bg-danger invisible"> <span class="badge rounded-pill bg-danger invisible" id="notifcationInfo">
2 1
<span class="visually-hidden">changes or updates</span> <span class="visually-hidden">changes or updates</span>
</span> </span>
</a> </a>
</h6> </h6>
<ul class="nav flex-column mb-2"> <ul class="nav flex-column mb-2">
<a class="nav-link <%= it.active == 'SETT_STORE' ? 'active' : ''%>" href="/manage/storages" <a class="nav-link <%= it.active == 'SETT_STORE' ? 'active' : ''%>" href="/manage/storages"
@ -187,6 +209,11 @@
dataType: 'json', dataType: 'json',
success: function (data) { success: function (data) {
$('#versionInfo').text(`AssetFlow Alpha ${data.version} ${data.commit}`); $('#versionInfo').text(`AssetFlow Alpha ${data.version} ${data.commit}`);
if(data.updateAvailable ){
$('#notifcationInfo').show();
} else {
$('#notifcationInfo').hide();
}
}, },
error: function (data) { error: function (data) {
createNewToast('<i class="bi bi-exclamation-triangle-fill"></i> Unable to load version information', "text-bg-danger", 3000, false) createNewToast('<i class="bi bi-exclamation-triangle-fill"></i> Unable to load version information', "text-bg-danger", 3000, false)

View File

@ -0,0 +1,49 @@
<%~ E.includeFile("../partials/head.eta.html", {"title": "Projects"}) %> <%~ E.includeFile("../partials/controls.eta.html", {"active": "PROJ_HOME"}) %>
<h1>Projectmanager</h1>
<div class="container text-center">
<div class="row">
<a class="card col m-2" href="/manage/categories">
<div class="card-body">
<h1 class="card-title"><i class="bi bi-tag"></i></h1>
<p class="card-text">Manage categories</p>
</div>
</a>
<a class="card col m-2" href="/manage/storages">
<div class="card-body">
<h1 class="card-title"><i class="bi bi-box-seam"></i></h1>
<p class="card-text">Manage storages</p>
</div>
</a>
<a class="card col m-2" href="/manage/import/csv">
<div class="card-body">
<h1 class="card-title"><i class="bi bi-filetype-csv"></i></h1>
<p class="card-text">Import data via CSV</p>
</div>
</a>
<a class="card col m-2" href="/manage/import/json">
<div class="card-body">
<h1 class="card-title"><i class="bi bi-filetype-json"></i></h1>
<p class="card-text">Import data via JSON</p>
</div>
</a>
</div>
</div>
<h2>Recent projects</h2>
<div class="container">
<table class="table">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Status</th>
<!--<th scope="col">Actions</th>-->
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<%~ E.includeFile("../partials/controlsFoot.eta.html") %> <%~ E.includeFile("../partials/foot.eta.html") %>

View File

@ -5,6 +5,9 @@ import fileUpload from 'express-fileupload';
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
import * as eta from 'eta'; import * as eta from 'eta';
import bodyParser from 'body-parser'; import bodyParser from 'body-parser';
import session from 'express-session';
import passport from 'passport';
import _ from 'lodash';
// Sentry // Sentry
import * as Sentry from '@sentry/node'; import * as Sentry from '@sentry/node';
@ -28,18 +31,40 @@ export const log = {
core: coreLogger, core: coreLogger,
db: coreLogger.scope('DB'), db: coreLogger.scope('DB'),
web: coreLogger.scope('WEB'), web: coreLogger.scope('WEB'),
auth: coreLogger.scope('AUTH'),
helper: coreLogger.scope('HELPER') helper: coreLogger.scope('HELPER')
}; };
// Create a new config instance. // Create a new config instance.
export const config = new ConfigHandler(__path + '/config.json', { export const config = new ConfigHandler(__path + '/config.json', true, {
db_connection_string: 'mysql://USER:PASSWORD@HOST:3306/DATABASE', db_connection_string: 'mysql://USER:PASSWORD@HOST:3306/DATABASE',
http_listen_address: '127.0.0.1', http_listen_address: '127.0.0.1',
http_port: 3000, http_port: 3000,
sentry_dsn: 'https://ID@sentry.example.com/PROJECTID', sentry_dsn: 'https://ID@sentry.example.com/PROJECTID',
debug: false debug: false,
auth: {
cookie_secret: 'gen',
cookie_secure: true,
local: {
active: true,
users: {}
},
oidc: {
active: false
}
}
}); });
// If no local User exists, create the default with a generated password
if (_.isEqual(config.global.auth.local.users, {})) {
config.global.auth.local.users = {
'flowAdmin': 'gen',
};
config.save_config();
}
// TODO: Add errorhandling with some sort of message.
export const prisma = new PrismaClient({ export const prisma = new PrismaClient({
datasources: { datasources: {
db: { db: {
@ -67,16 +92,16 @@ Sentry.init({
environment: config.global.debug ? 'development' : 'production' environment: config.global.debug ? 'development' : 'production'
}); });
app.locals.versionRevLong = require('child_process') // TODO: Version check need to be rewritten.
.execSync('git rev-parse HEAD') app.locals.versionRevLong = require('child_process').execSync('git rev-parse HEAD').toString().trim();
.toString().trim() app.locals.versionRev = require('child_process').execSync('git rev-parse --short HEAD').toString().trim();
app.locals.versionRev = require('child_process') app.locals.versionRevLatest = require('child_process').execSync('git ls-remote --refs -q').toString().trim().split('\t')[0];
.execSync('git rev-parse --short HEAD')
.toString().trim() if (app.locals.versionRevLong === app.locals.versionRevLatest) {
app.locals.versionRevLatest = require('child_process') log.core.info(`Running Latest Version (${app.locals.versionRevLong})`);
.execSync('git ls-remote --refs -q') } else {
.toString().trim().split("\t")[0] log.core.info(`Running Version: ${app.locals.versionRevLong} (Latest: ${app.locals.versionRevLatest})`);
log.core.info(`Running revision ${app.locals.versionRevLong} (${app.locals.versionRevLatest} latest)`); }
// RequestHandler creates a separate execution context using domains, so that every // RequestHandler creates a separate execution context using domains, so that every
// transaction/span/breadcrumb is attached to its own Hub instance // transaction/span/breadcrumb is attached to its own Hub instance
@ -93,14 +118,23 @@ app.use(bodyParser.urlencoded({ extended: false }));
// Using bodyParser to parse JSON bodies into JS objects // Using bodyParser to parse JSON bodies into JS objects
app.use(bodyParser.json()); app.use(bodyParser.json());
// Session store
// TODO: Move secret to config -> Autogenerate.
app.use(
session({
secret: config.global.auth.cookie_secret,
resave: false,
saveUninitialized: false,
cookie: { secure: config.global.auth.cookie_secure }
})
);
app.use(passport.authenticate('session'));
app.use(fileUpload()); app.use(fileUpload());
app.use(express.static(__path + '/static')); app.use(express.static(__path + '/static'));
app.use(routes); app.use(routes);
// The error handler must be before any other error middleware and after all controllers
app.use(Sentry.Handlers.errorHandler());
app.listen(config.global.http_port, config.global.http_listen_address, () => { app.listen(config.global.http_port, config.global.http_listen_address, () => {
log.web.info(`Listening at http://${config.global.http_listen_address}:${config.global.http_port}`); log.web.info(`Listening at http://${config.global.http_listen_address}:${config.global.http_port}`);
}); });

21
src/middleware/auth.mw.ts Normal file
View File

@ -0,0 +1,21 @@
export function checkAuthentication(req: any, res: any, next: Function) {
if (req.isAuthenticated()) {
//req.isAuthenticated() will return true if user is logged in
next();
} else {
res.redirect('/auth/login');
}
}
// const checkIsInRole = (...roles) => (req, res, next) => {
// if (!req.user) {
// return res.redirect('/login')
// }
// const hasRole = roles.find(role => req.user.role === role)
// if (!hasRole) {
// return res.redirect('/login')
// }
// return next()
// }

View File

@ -1,4 +1,5 @@
import express from 'express'; import express from 'express';
import passport from 'passport';
// Route imports // Route imports
import testRoute from './test.js'; import testRoute from './test.js';

90
src/routes/auth/index.ts Normal file
View File

@ -0,0 +1,90 @@
import passport from 'passport';
import { Strategy as LocalStrategy } from 'passport-local';
import express, { Request, Response } from 'express';
import { prisma, __path, log, config, app } from '../../index.js';
// Middleware Imports
import { checkAuthentication } from '../../middleware/auth.mw.js'
/* Configure password authentication strategy.
*
* The `LocalStrategy` authenticates users by verifying a username and password.
* The strategy parses the username and password from the request and calls the
* `verify` function.
*
* The `verify` function queries the database for the user record and verifies
* the password by hashing the password supplied by the user and comparing it to
* the hashed password stored in the database. If the comparison succeeds, the
* user is authenticated; otherwise, not.
*/
passport.use(
new LocalStrategy(function verify(username, password, cb) {
//log.auth.debug('LocalStrategy:', username, password);
for (const [user, pass] of Object.entries(config.global.auth.local.users)) {
//log.auth.debug('Loop(REQ):', username, password);
//log.auth.debug('Loop(CFG):', user, pass);
if (user.toLowerCase() === username.toLowerCase() && pass === password) {
log.auth.debug('LocalStrategy: success');
return cb(null, { username: username }); // This is the user object.
}
}
log.auth.debug('LocalStrategy: failed');
return cb(null, false, { message: 'Incorrect username or password.' });
})
/*
1. If the user not found in DB,
done (null, false)
2. If the user found in DB, but password does not match,
done (null, false)
3. If user found in DB and password match,
done (null, {authenticated_user})
*/
);
/* Configure session management.
*
* When a login session is established, information about the user will be
* stored in the session. This information is supplied by the `serializeUser`
* function, which is yielding the user ID and username.
*
* As the user interacts with the app, subsequent requests will be authenticated
* by verifying the session. The same user information that was serialized at
* session establishment will be restored when the session is authenticated by
* the `deserializeUser` function.
*
*/
passport.serializeUser(function (user: any, cb) {
process.nextTick(function () {
// log.auth.debug('Called seriealizeUser');
// log.auth.debug('user:', user);
return cb(null, {
username: user.username
});
});
});
passport.deserializeUser(function (user, cb) {
process.nextTick(function () {
// log.auth.debug('Called deseriealizeUser');
return cb(null, user);
});
});
// Route imports
import testRoute from './test.js';
import loginRoute from './login.js';
//import logoutRoute from './login.js'
// Router base is '/auth'
const Router = express.Router({ strict: false });
Router.route('/login').get(loginRoute.get);
Router.route('/login').post(passport.authenticate('local', { successRedirect: '/', failureRedirect: '/auth/login?failed' }));
Router.route('/test').get(checkAuthentication, testRoute.get);
export default Router;

View File

@ -1,5 +1,7 @@
import passport from 'passport';
import express, { Request, Response } from 'express'; import express, { Request, Response } from 'express';
import { prisma, __path } from '../../../index.js'; import { prisma, __path, log } from '../../index.js';
function get(req: Request, res: Response) { function get(req: Request, res: Response) {
res.render(__path + '/src/frontend/auth/login.eta.html'); //, { items: items }); res.render(__path + '/src/frontend/auth/login.eta.html'); //, { items: items });

7
src/routes/auth/test.ts Normal file
View File

@ -0,0 +1,7 @@
import express, { Request, Response } from 'express';
function get(req: Request, res: Response) {
res.status(200).send('Auth Test Successful!');
};
export default { get };

View File

@ -7,6 +7,7 @@ import testRoute from './test.js';
import dashboardRoute from './dashboard.js'; import dashboardRoute from './dashboard.js';
import itemsRoute from './items.js'; import itemsRoute from './items.js';
import manage_routes from './manage/index.js'; import manage_routes from './manage/index.js';
import project_routes from './projects/index.js';
// Router base is '/' // Router base is '/'
const Router = express.Router({ strict: false }); const Router = express.Router({ strict: false });
@ -14,11 +15,13 @@ const Router = express.Router({ strict: false });
Router.route('/test').get(testRoute.get); Router.route('/test').get(testRoute.get);
Router.route('/items').get(itemsRoute.get); Router.route('/items').get(itemsRoute.get);
Router.route('/:id(\\w{8})').get(skuRoute.get); Router.use('/projects', project_routes); // has to be before skuRoute
Router.route('/:id(\\w{8})').get(skuRoute.get); // we should probably deprecate this
Router.route('/s/:id').get(skuRouteDash.get); Router.route('/s/:id').get(skuRouteDash.get);
Router.use('/manage', manage_routes); Router.use('/manage', manage_routes);
Router.route('/').get(dashboardRoute.get); Router.route('/').get(dashboardRoute.get);
export default Router; export default Router;

View File

@ -8,7 +8,7 @@ function post(req: Request, res: Response) {
// Handle file upload and import // Handle file upload and import
console.log(req.files); console.log(req.files);
if (!req.files || Object.keys(req.files).length === 0) { if (!req.files || Object.keys(req.files).length === 0) {
return res.status(400).send('No files were uploaded.'); return res.status(400).send('No files were uploaded');
} }
const file: UploadedFile = req.files.formFile as UploadedFile; const file: UploadedFile = req.files.formFile as UploadedFile;

View File

@ -7,7 +7,6 @@ import jsonImportRoute from './import/jsonImport.js';
import categoryManager from './categoryManager.js'; import categoryManager from './categoryManager.js';
import storageManager from './storageManager.js'; import storageManager from './storageManager.js';
import startpageRoute from './startpage.js'; import startpageRoute from './startpage.js';
import demoLoginRoute from './demo.js'
// Router base is '/manage' // Router base is '/manage'
const Router = express.Router({ strict: false }); const Router = express.Router({ strict: false });
@ -17,7 +16,6 @@ Router.route('/categories').get(categoryManager.get);
Router.route('/storages').get(storageManager.get); Router.route('/storages').get(storageManager.get);
Router.route('/import/csv').get(csvImportRoute.get).post(csvImportRoute.post); Router.route('/import/csv').get(csvImportRoute.get).post(csvImportRoute.post);
Router.route('/import/json').get(jsonImportRoute.get).post(jsonImportRoute.post); Router.route('/import/json').get(jsonImportRoute.get).post(jsonImportRoute.post);
Router.route('/demo/login').get(demoLoginRoute.get);
Router.route('/').get(startpageRoute.get); Router.route('/').get(startpageRoute.get);
export default Router; export default Router;

View File

@ -0,0 +1,9 @@
import express, { Request, Response } from 'express';
import { prisma, __path, log } from '../../../index.js';
function get(req: Request, res: Response) {
res.render(__path + '/src/frontend/projects/dashboard.eta.html');
}
export default { get };

View File

@ -0,0 +1,11 @@
import express from 'express';
// Route imports
import dashboard from './dashboard.js';
// Router base is '/manage'
const Router = express.Router({ strict: false });
Router.route('/').get(dashboard.get);
export default Router;

View File

@ -1,16 +1,25 @@
import express, { Express } from 'express'; import express, { Express } from 'express';
import { __path, prisma } from '../index.js'; import { __path, prisma } from '../index.js';
import * as Sentry from '@sentry/node';
// Middleware Imports
import { checkAuthentication } from '../middleware/auth.mw.js'
// Route imports // Route imports
import frontend_routes from './frontend/index.js'; import frontend_routes from './frontend/index.js';
import static_routes from './static/index.js'; import static_routes from './static/index.js';
import api_routes from './api/index.js'; import api_routes from './api/index.js';
import auth_routes from './auth/index.js';
const Router = express.Router({ strict: false }); const Router = express.Router({ strict: false });
Router.use('/static', static_routes); Router.use('/static', static_routes);
Router.use('/api', api_routes); Router.use('/api', checkAuthentication, api_routes);
Router.use('/', frontend_routes); Router.use('/auth', auth_routes);
Router.use('/', checkAuthentication, frontend_routes);
// The error handler must be before any other error middleware and after all controllers
Router.use(Sentry.Handlers.errorHandler());
// Default route. // Default route.
Router.all('*', function (req, res) { Router.all('*', function (req, res) {
@ -23,3 +32,4 @@ Router.all('*', function (req, res) {
}); });
export default Router; export default Router;