@tasenor/common-node 1.9.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +4 -0
- package/LICENSE +21 -0
- package/dist/tasenor-common-node/src/cli.d.ts +81 -0
- package/dist/tasenor-common-node/src/cli.js +242 -0
- package/dist/tasenor-common-node/src/cli.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/account.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/account.js +58 -0
- package/dist/tasenor-common-node/src/commands/account.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/balance.d.ts +11 -0
- package/dist/tasenor-common-node/src/commands/balance.js +117 -0
- package/dist/tasenor-common-node/src/commands/balance.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/db.d.ts +14 -0
- package/dist/tasenor-common-node/src/commands/db.js +69 -0
- package/dist/tasenor-common-node/src/commands/db.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/entry.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/entry.js +106 -0
- package/dist/tasenor-common-node/src/commands/entry.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/import.d.ts +17 -0
- package/dist/tasenor-common-node/src/commands/import.js +140 -0
- package/dist/tasenor-common-node/src/commands/import.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/importer.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/importer.js +71 -0
- package/dist/tasenor-common-node/src/commands/importer.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/index.d.ts +191 -0
- package/dist/tasenor-common-node/src/commands/index.js +482 -0
- package/dist/tasenor-common-node/src/commands/index.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/period.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/period.js +48 -0
- package/dist/tasenor-common-node/src/commands/period.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/plugin.d.ts +15 -0
- package/dist/tasenor-common-node/src/commands/plugin.js +78 -0
- package/dist/tasenor-common-node/src/commands/plugin.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/report.d.ts +11 -0
- package/dist/tasenor-common-node/src/commands/report.js +96 -0
- package/dist/tasenor-common-node/src/commands/report.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/settings.d.ts +10 -0
- package/dist/tasenor-common-node/src/commands/settings.js +64 -0
- package/dist/tasenor-common-node/src/commands/settings.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/stock.d.ts +8 -0
- package/dist/tasenor-common-node/src/commands/stock.js +73 -0
- package/dist/tasenor-common-node/src/commands/stock.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/tag.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/tag.js +89 -0
- package/dist/tasenor-common-node/src/commands/tag.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/tx.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/tx.js +81 -0
- package/dist/tasenor-common-node/src/commands/tx.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/user.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/user.js +52 -0
- package/dist/tasenor-common-node/src/commands/user.js.map +1 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.d.ts +77 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.js +343 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.js.map +1 -0
- package/dist/tasenor-common-node/src/database/DB.d.ts +51 -0
- package/dist/tasenor-common-node/src/database/DB.js +354 -0
- package/dist/tasenor-common-node/src/database/DB.js.map +1 -0
- package/dist/tasenor-common-node/src/database/index.d.ts +7 -0
- package/dist/tasenor-common-node/src/database/index.js +8 -0
- package/dist/tasenor-common-node/src/database/index.js.map +1 -0
- package/dist/tasenor-common-node/src/doccer.d.ts +29 -0
- package/dist/tasenor-common-node/src/doccer.js +30 -0
- package/dist/tasenor-common-node/src/doccer.js.map +1 -0
- package/dist/tasenor-common-node/src/error.d.ts +30 -0
- package/dist/tasenor-common-node/src/error.js +35 -0
- package/dist/tasenor-common-node/src/error.js.map +1 -0
- package/dist/tasenor-common-node/src/export/Exporter.d.ts +69 -0
- package/dist/tasenor-common-node/src/export/Exporter.js +123 -0
- package/dist/tasenor-common-node/src/export/Exporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.d.ts +55 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.js +135 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.d.ts +71 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.js +290 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/index.d.ts +8 -0
- package/dist/tasenor-common-node/src/export/index.js +9 -0
- package/dist/tasenor-common-node/src/export/index.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.d.ts +104 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js +354 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.d.ts +38 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.js +27 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.d.ts +173 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.js +733 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.d.ts +238 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.js +522 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.d.ts +181 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.js +482 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.d.ts +324 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.js +1379 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.js.map +1 -0
- package/dist/tasenor-common-node/src/import/index.d.ts +11 -0
- package/dist/tasenor-common-node/src/import/index.js +12 -0
- package/dist/tasenor-common-node/src/import/index.js.map +1 -0
- package/dist/tasenor-common-node/src/index.d.ts +12 -0
- package/dist/tasenor-common-node/src/index.js +13 -0
- package/dist/tasenor-common-node/src/index.js.map +1 -0
- package/dist/tasenor-common-node/src/net/crypto.d.ts +33 -0
- package/dist/tasenor-common-node/src/net/crypto.js +63 -0
- package/dist/tasenor-common-node/src/net/crypto.js.map +1 -0
- package/dist/tasenor-common-node/src/net/git.d.ts +49 -0
- package/dist/tasenor-common-node/src/net/git.js +137 -0
- package/dist/tasenor-common-node/src/net/git.js.map +1 -0
- package/dist/tasenor-common-node/src/net/index.d.ts +10 -0
- package/dist/tasenor-common-node/src/net/index.js +11 -0
- package/dist/tasenor-common-node/src/net/index.js.map +1 -0
- package/dist/tasenor-common-node/src/net/middleware.d.ts +61 -0
- package/dist/tasenor-common-node/src/net/middleware.js +220 -0
- package/dist/tasenor-common-node/src/net/middleware.js.map +1 -0
- package/dist/tasenor-common-node/src/net/tokens.d.ts +50 -0
- package/dist/tasenor-common-node/src/net/tokens.js +141 -0
- package/dist/tasenor-common-node/src/net/tokens.js.map +1 -0
- package/dist/tasenor-common-node/src/net/vault.d.ts +67 -0
- package/dist/tasenor-common-node/src/net/vault.js +145 -0
- package/dist/tasenor-common-node/src/net/vault.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.d.ts +91 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.js +165 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.d.ts +13 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.js +26 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.d.ts +188 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.js +204 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.d.ts +132 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.js +393 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.d.ts +34 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.js +47 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.d.ts +80 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.js +168 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.d.ts +27 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.js +37 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/index.d.ts +13 -0
- package/dist/tasenor-common-node/src/plugins/index.js +14 -0
- package/dist/tasenor-common-node/src/plugins/index.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/plugins.d.ts +101 -0
- package/dist/tasenor-common-node/src/plugins/plugins.js +292 -0
- package/dist/tasenor-common-node/src/plugins/plugins.js.map +1 -0
- package/dist/tasenor-common-node/src/process/Process.d.ts +108 -0
- package/dist/tasenor-common-node/src/process/Process.js +335 -0
- package/dist/tasenor-common-node/src/process/Process.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.d.ts +24 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.js +28 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.d.ts +69 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.js +145 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.d.ts +60 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.js +73 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.d.ts +52 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.js +78 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.d.ts +60 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.js +182 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.js.map +1 -0
- package/dist/tasenor-common-node/src/process/index.d.ts +11 -0
- package/dist/tasenor-common-node/src/process/index.js +12 -0
- package/dist/tasenor-common-node/src/process/index.js.map +1 -0
- package/dist/tasenor-common-node/src/reports/conversions.d.ts +8 -0
- package/dist/tasenor-common-node/src/reports/conversions.js +47 -0
- package/dist/tasenor-common-node/src/reports/conversions.js.map +1 -0
- package/dist/tasenor-common-node/src/reports/index.d.ts +6 -0
- package/dist/tasenor-common-node/src/reports/index.js +7 -0
- package/dist/tasenor-common-node/src/reports/index.js.map +1 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.d.ts +43 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.js +112 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.js.map +1 -0
- package/dist/tasenor-common-node/src/server/api.d.ts +15 -0
- package/dist/tasenor-common-node/src/server/api.js +27 -0
- package/dist/tasenor-common-node/src/server/api.js.map +1 -0
- package/dist/tasenor-common-node/src/server/index.d.ts +7 -0
- package/dist/tasenor-common-node/src/server/index.js +8 -0
- package/dist/tasenor-common-node/src/server/index.js.map +1 -0
- package/dist/tasenor-common-node/src/server/router.d.ts +5 -0
- package/dist/tasenor-common-node/src/server/router.js +37 -0
- package/dist/tasenor-common-node/src/server/router.js.map +1 -0
- package/dist/tasenor-common-node/src/system.d.ts +27 -0
- package/dist/tasenor-common-node/src/system.js +95 -0
- package/dist/tasenor-common-node/src/system.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.d.ts +21 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js +33 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.d.ts +24 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js +68 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.d.ts +64 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.js +199 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/index.d.ts +4 -0
- package/dist/tasenor-common-node/src/testing/index.js +5 -0
- package/dist/tasenor-common-node/src/testing/index.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.d.ts +13 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.js +52 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.js +64 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js +80 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js +342 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js +174 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js +175 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/password.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/password.spec.js +8 -0
- package/dist/tasenor-common-node/tests/password.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/tokens.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/tokens.spec.js +49 -0
- package/dist/tasenor-common-node/tests/tokens.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/vault.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/vault.spec.js +19 -0
- package/dist/tasenor-common-node/tests/vault.spec.js.map +1 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.d.ts +11 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js +30 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.d.ts +5 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js +350 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js.map +1 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.d.ts +23 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js +83 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.d.ts +28 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js +340 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.d.ts +11 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js +39 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.d.ts +17 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js +66 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.d.ts +13 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js +241 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js.map +1 -0
- package/jest.config.js +1 -0
- package/package.json +62 -0
- package/src/cli.ts +267 -0
- package/src/commands/account.ts +69 -0
- package/src/commands/balance.ts +131 -0
- package/src/commands/db.ts +84 -0
- package/src/commands/entry.ts +117 -0
- package/src/commands/import.ts +160 -0
- package/src/commands/importer.ts +84 -0
- package/src/commands/index.ts +534 -0
- package/src/commands/period.ts +59 -0
- package/src/commands/plugin.ts +95 -0
- package/src/commands/report.ts +113 -0
- package/src/commands/settings.ts +75 -0
- package/src/commands/stock.ts +80 -0
- package/src/commands/tag.ts +102 -0
- package/src/commands/tx.ts +93 -0
- package/src/commands/user.ts +65 -0
- package/src/database/BookkeeperImporter.ts +358 -0
- package/src/database/DB.ts +396 -0
- package/src/database/index.ts +7 -0
- package/src/doccer.ts +29 -0
- package/src/error.ts +32 -0
- package/src/export/Exporter.ts +136 -0
- package/src/export/TasenorExporter.ts +144 -0
- package/src/export/TilitinExporter.ts +302 -0
- package/src/export/index.ts +8 -0
- package/src/import/TextFileProcessHandler.ts +384 -0
- package/src/import/TransactionImportConnector.ts +65 -0
- package/src/import/TransactionImportHandler.ts +819 -0
- package/src/import/TransactionRules.ts +570 -0
- package/src/import/TransactionUI.ts +520 -0
- package/src/import/TransferAnalyzer.ts +1450 -0
- package/src/import/index.ts +11 -0
- package/src/index.ts +12 -0
- package/src/net/crypto.ts +69 -0
- package/src/net/git.ts +151 -0
- package/src/net/index.ts +10 -0
- package/src/net/middleware.ts +261 -0
- package/src/net/tokens.ts +140 -0
- package/src/net/vault.ts +161 -0
- package/src/plugins/BackendPlugin.ts +188 -0
- package/src/plugins/DataPlugin.ts +29 -0
- package/src/plugins/ImportPlugin.ts +211 -0
- package/src/plugins/ReportPlugin.ts +443 -0
- package/src/plugins/SchemePlugin.ts +56 -0
- package/src/plugins/ServicePlugin.ts +188 -0
- package/src/plugins/ToolPlugin.ts +44 -0
- package/src/plugins/index.ts +13 -0
- package/src/plugins/plugins.ts +345 -0
- package/src/process/Process.ts +368 -0
- package/src/process/ProcessConnector.ts +45 -0
- package/src/process/ProcessFile.ts +169 -0
- package/src/process/ProcessHandler.ts +94 -0
- package/src/process/ProcessStep.ts +100 -0
- package/src/process/ProcessingSystem.ts +202 -0
- package/src/process/index.ts +11 -0
- package/src/reports/conversions.ts +52 -0
- package/src/reports/index.ts +6 -0
- package/src/server/ISPDemoServer.ts +122 -0
- package/src/server/api.ts +37 -0
- package/src/server/index.ts +7 -0
- package/src/server/router.ts +60 -0
- package/src/system.ts +96 -0
- package/src/testing/ProcessingSystemMock.ts +45 -0
- package/src/testing/UnitTestImportConnector.ts +86 -0
- package/src/testing/UnitTester.ts +231 -0
- package/src/testing/index.ts +4 -0
- package/src/testing/test-handlers.ts +55 -0
- package/tests/TransactionRules.spec.ts +73 -0
- package/tests/TransferAnalyzer-account-address.spec.ts +87 -0
- package/tests/TransferAnalyzer-buying-and-selling.spec.ts +354 -0
- package/tests/TransferAnalyzer-loans.spec.ts +197 -0
- package/tests/TransferAnalyzer-multiple-null-amounts.spec.ts +181 -0
- package/tests/password.spec.ts +8 -0
- package/tests/tokens.spec.ts +52 -0
- package/tests/vault.spec.ts +20 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import cors from 'cors';
|
|
2
|
+
import express from 'express';
|
|
3
|
+
import { error, log, MAX_UPLOAD_SIZE } from '@dataplug/tasenor-common';
|
|
4
|
+
import { tokens } from './tokens';
|
|
5
|
+
import { vault } from './vault';
|
|
6
|
+
import helmet from 'helmet';
|
|
7
|
+
/**
|
|
8
|
+
* Hide tokens from URL.
|
|
9
|
+
* @param url
|
|
10
|
+
*/
|
|
11
|
+
export function cleanUrl(url) {
|
|
12
|
+
return url.replace(/\btoken=[^&]+\b/, 'token=xxxx');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Construct standard initial part of stack of commonly shared middlewares.
|
|
16
|
+
*/
|
|
17
|
+
export function tasenorInitialStack(args) {
|
|
18
|
+
const stack = [];
|
|
19
|
+
// Add logger.
|
|
20
|
+
stack.push((req, res, next) => {
|
|
21
|
+
if (req.method !== 'OPTIONS') {
|
|
22
|
+
let owner;
|
|
23
|
+
const token = tokens.get(req);
|
|
24
|
+
if (token) {
|
|
25
|
+
const parsed = tokens.parse(token);
|
|
26
|
+
if (parsed && parsed.payload) {
|
|
27
|
+
const payload = parsed.payload;
|
|
28
|
+
owner = payload.data.owner;
|
|
29
|
+
let aud = payload.aud;
|
|
30
|
+
if (payload.aud === 'refresh') {
|
|
31
|
+
aud = payload.data.audience;
|
|
32
|
+
}
|
|
33
|
+
switch (aud) {
|
|
34
|
+
case 'sites':
|
|
35
|
+
owner = `Site ${owner}`;
|
|
36
|
+
break;
|
|
37
|
+
case 'bookkeeping':
|
|
38
|
+
owner = `User ${owner}`;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const user = owner ? `${owner} from ${req.ip}` : `${req.ip}`;
|
|
44
|
+
const message = `${user} ${req.method} ${req.hostname} ${cleanUrl(req.originalUrl)}`;
|
|
45
|
+
log(message);
|
|
46
|
+
}
|
|
47
|
+
next();
|
|
48
|
+
});
|
|
49
|
+
// Add cors.
|
|
50
|
+
stack.push(cors({ origin: args.origin }));
|
|
51
|
+
// Add helmet.
|
|
52
|
+
let contentSecurityPolicy;
|
|
53
|
+
if (args.api) {
|
|
54
|
+
const apiOrigin = new URL(args.api).origin;
|
|
55
|
+
contentSecurityPolicy = {
|
|
56
|
+
useDefaults: true,
|
|
57
|
+
crossOriginResourcePolicy: { policy: 'same-site' },
|
|
58
|
+
directives: {
|
|
59
|
+
defaultSrc: ["'self'", apiOrigin],
|
|
60
|
+
imgSrc: ["'self'", 'data:', apiOrigin],
|
|
61
|
+
scriptSrc: ["'self'", "'unsafe-eval'"]
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
stack.push(helmet({
|
|
65
|
+
contentSecurityPolicy
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
return stack;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Construct standard final part of stack of commonly shared middlewares.
|
|
72
|
+
*/
|
|
73
|
+
export function tasenorFinalStack() {
|
|
74
|
+
const stack = [];
|
|
75
|
+
// Add error catcher.
|
|
76
|
+
stack.push((err, req, res, next) => {
|
|
77
|
+
error('Internal error:', err);
|
|
78
|
+
if (res.headersSent) {
|
|
79
|
+
return next(err);
|
|
80
|
+
}
|
|
81
|
+
res.status(500).send({ message: 'Internal server error.' });
|
|
82
|
+
const message = `${req.ip} ${req.method} ${req.hostname} ${cleanUrl(req.originalUrl)} => ${res.statusCode}`;
|
|
83
|
+
error(message);
|
|
84
|
+
});
|
|
85
|
+
return stack;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* A constructor for tasenor middleware stack based on the arguments.
|
|
89
|
+
*
|
|
90
|
+
* Each flag adds one or more functions to the stack returned.
|
|
91
|
+
*
|
|
92
|
+
* Flags:
|
|
93
|
+
* - `url` Urlenconder parser.
|
|
94
|
+
* - `json` JSON body parser.
|
|
95
|
+
* - `token` Look for token from the request, but do not verify it yet.
|
|
96
|
+
* - `user` Check that user token is present and for bookkeeper.
|
|
97
|
+
* - `uuid` Check that UUID header is present and parse owner from the token. Verify signature of the token for ANY audience.
|
|
98
|
+
* - `admin` Check that the valid bookkeeper user token exists and has admin feat.
|
|
99
|
+
* - `superuser` Check that the valid bookkeeper user token exists and has superuser feat.
|
|
100
|
+
* - `audience` The token audience to check token against (user or admin implies 'bookkeeper' unless explicitly given).
|
|
101
|
+
* - `upload` If set, allow much bigger body for request.
|
|
102
|
+
*
|
|
103
|
+
* The output on the res.locals is:
|
|
104
|
+
*
|
|
105
|
+
* - `token` Raw token string.
|
|
106
|
+
* - `auth` Content of the token if verified.
|
|
107
|
+
* - `user` Name of the owner of the token if verified,
|
|
108
|
+
* - `uuid` If X-UUID header was found, the value of it.
|
|
109
|
+
* - `owner` Set when UUID is found and token signed for ANY audience.
|
|
110
|
+
*/
|
|
111
|
+
export function tasenorStack({ url, json, user, uuid, admin, superuser, audience, token, upload }) {
|
|
112
|
+
const stack = [];
|
|
113
|
+
// Set automatic up implications.
|
|
114
|
+
if (superuser) {
|
|
115
|
+
admin = true;
|
|
116
|
+
token = true;
|
|
117
|
+
}
|
|
118
|
+
if (admin) {
|
|
119
|
+
user = true;
|
|
120
|
+
token = true;
|
|
121
|
+
}
|
|
122
|
+
if (user && !audience) {
|
|
123
|
+
audience = 'bookkeeping';
|
|
124
|
+
}
|
|
125
|
+
if (audience) {
|
|
126
|
+
token = true;
|
|
127
|
+
}
|
|
128
|
+
if (uuid) {
|
|
129
|
+
token = true;
|
|
130
|
+
}
|
|
131
|
+
// Add some space for upload.
|
|
132
|
+
const params = {};
|
|
133
|
+
if (upload) {
|
|
134
|
+
params.limit = MAX_UPLOAD_SIZE;
|
|
135
|
+
}
|
|
136
|
+
// Add URL encoding middleware.
|
|
137
|
+
if (url || (upload && !url && !json)) {
|
|
138
|
+
stack.push(express.urlencoded({ extended: true, ...params }));
|
|
139
|
+
}
|
|
140
|
+
// Add JSON middleware.
|
|
141
|
+
if (json) {
|
|
142
|
+
stack.push(express.json({ ...params }));
|
|
143
|
+
}
|
|
144
|
+
// Find the token.
|
|
145
|
+
if (token) {
|
|
146
|
+
stack.push(async (req, res, next) => {
|
|
147
|
+
res.locals.token = tokens.get(req);
|
|
148
|
+
next();
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Set the UUID and owner.
|
|
152
|
+
if (uuid) {
|
|
153
|
+
stack.push(async (req, res, next) => {
|
|
154
|
+
if (!res.locals.token) {
|
|
155
|
+
error('There is no token in the request and we are looking for UUID.');
|
|
156
|
+
return res.status(403).send({ message: 'Forbidden.' });
|
|
157
|
+
}
|
|
158
|
+
const uuid = req.headers['x-uuid'];
|
|
159
|
+
if (!uuid) {
|
|
160
|
+
error('Cannot find UUID from the request.');
|
|
161
|
+
return res.status(403).send({ message: 'Forbidden.' });
|
|
162
|
+
}
|
|
163
|
+
const parsed = tokens.parse(res.locals.token);
|
|
164
|
+
if (!parsed) {
|
|
165
|
+
error(`Cannot parse payload from the token ${res.locals.token}`);
|
|
166
|
+
return res.status(403).send({ message: 'Forbidden.' });
|
|
167
|
+
}
|
|
168
|
+
const payload = parsed.payload;
|
|
169
|
+
const audience = payload.aud;
|
|
170
|
+
const secret = vault.getPrivateSecret();
|
|
171
|
+
const ok = tokens.verify(res.locals.token, secret, audience);
|
|
172
|
+
if (!ok) {
|
|
173
|
+
error(`Failed to verify token ${res.locals.token} for audience ${audience}.`);
|
|
174
|
+
return res.status(403).send({ message: 'Forbidden.' });
|
|
175
|
+
}
|
|
176
|
+
res.locals.uuid = uuid;
|
|
177
|
+
res.locals.owner = ok.owner;
|
|
178
|
+
next();
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// Add token check middleware.
|
|
182
|
+
if (audience) {
|
|
183
|
+
stack.push(async (req, res, next) => {
|
|
184
|
+
const token = res.locals.token;
|
|
185
|
+
if (!token) {
|
|
186
|
+
error(`Request ${req.method} ${cleanUrl(req.originalUrl)} from ${req.ip} has no token.`);
|
|
187
|
+
res.status(401).send({ message: 'Unauthorized.' });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const secret = audience === 'refresh' ? await vault.get('SECRET') : vault.getPrivateSecret();
|
|
191
|
+
if (!secret) {
|
|
192
|
+
error('Cannot find SECRET.');
|
|
193
|
+
return res.status(500).send({ message: 'Unable to handle authorized requests at the moment.' });
|
|
194
|
+
}
|
|
195
|
+
if (!audience) {
|
|
196
|
+
return res.status(500).send({ message: 'Internal error.' });
|
|
197
|
+
}
|
|
198
|
+
const payload = tokens.verify(token, secret, audience);
|
|
199
|
+
if (!payload) {
|
|
200
|
+
error(`Request from ${req.ip} has bad token ${token}`);
|
|
201
|
+
return res.status(403).send({ message: 'Forbidden.' });
|
|
202
|
+
}
|
|
203
|
+
// Check admin.
|
|
204
|
+
if (admin && !payload.feats.ADMIN && !payload.feats.SUPERUSER) {
|
|
205
|
+
error(`Request denied for admin access to ${JSON.stringify(payload)}`);
|
|
206
|
+
return res.status(403).send({ message: 'Forbidden.' });
|
|
207
|
+
}
|
|
208
|
+
// Check superuser.
|
|
209
|
+
if (superuser && !payload.feats.SUPERUSER) {
|
|
210
|
+
error(`Request denied for superuser access to ${JSON.stringify(payload)}`);
|
|
211
|
+
return res.status(403).send({ message: 'Forbidden.' });
|
|
212
|
+
}
|
|
213
|
+
res.locals.auth = payload;
|
|
214
|
+
res.locals.user = payload.owner;
|
|
215
|
+
next();
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return stack;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../src/net/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { TokenPayload, Secret, TokenAudience, Token, TokenPair } from '@dataplug/tasenor-common';
|
|
2
|
+
import { Jwt } from 'jsonwebtoken';
|
|
3
|
+
/**
|
|
4
|
+
* Find a token from the request if available.
|
|
5
|
+
* @param request A HTTP request.
|
|
6
|
+
*/
|
|
7
|
+
declare function get(request: any): Token | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Sign the payload with the given secret.
|
|
10
|
+
* @param payload
|
|
11
|
+
* @param expires
|
|
12
|
+
* @returns A JSON web token.
|
|
13
|
+
*/
|
|
14
|
+
declare function sign(payload: TokenPayload, audience: TokenAudience, expires?: number): Promise<Token>;
|
|
15
|
+
/**
|
|
16
|
+
* Sign both the normal token and refresh token for it.
|
|
17
|
+
* @param payload
|
|
18
|
+
* @param audience
|
|
19
|
+
* @param expires
|
|
20
|
+
*/
|
|
21
|
+
declare function sign2(payload: TokenPayload, audience: TokenAudience, expires?: number): Promise<TokenPair>;
|
|
22
|
+
/**
|
|
23
|
+
* Check the token validity.
|
|
24
|
+
* @param token
|
|
25
|
+
* @param secret
|
|
26
|
+
* @param quiet If set, do not trigger errors.
|
|
27
|
+
* @returns Token payload if valid.
|
|
28
|
+
*/
|
|
29
|
+
declare function verify(token: Token, secret: Secret, audience: TokenAudience | TokenAudience[], quiet?: boolean): TokenPayload | null;
|
|
30
|
+
/**
|
|
31
|
+
* Parse the payload of the token without verifying.
|
|
32
|
+
* @param token
|
|
33
|
+
*/
|
|
34
|
+
declare function parse(token: Token): Jwt | null;
|
|
35
|
+
/**
|
|
36
|
+
* A checker for token validity.
|
|
37
|
+
* @param token
|
|
38
|
+
* @param audience
|
|
39
|
+
* @param quiet If set, do not trigger errors.
|
|
40
|
+
*/
|
|
41
|
+
declare function check(token: Token, audience: TokenAudience, quiet?: boolean): Promise<boolean>;
|
|
42
|
+
export declare const tokens: {
|
|
43
|
+
check: typeof check;
|
|
44
|
+
get: typeof get;
|
|
45
|
+
parse: typeof parse;
|
|
46
|
+
sign: typeof sign;
|
|
47
|
+
sign2: typeof sign2;
|
|
48
|
+
verify: typeof verify;
|
|
49
|
+
};
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { error, REFRESH_TOKEN_EXPIRY_TIME, TOKEN_EXPIRY_TIME, TOKEN_ISSUER } from '@dataplug/tasenor-common';
|
|
2
|
+
import jwt from 'jsonwebtoken';
|
|
3
|
+
import { create } from 'ts-opaque';
|
|
4
|
+
import { vault } from './vault';
|
|
5
|
+
/**
|
|
6
|
+
* Find a token from the request if available.
|
|
7
|
+
* @param request A HTTP request.
|
|
8
|
+
*/
|
|
9
|
+
function get(request) {
|
|
10
|
+
let token;
|
|
11
|
+
if (request.query && request.query.token) {
|
|
12
|
+
token = request.query.token;
|
|
13
|
+
}
|
|
14
|
+
else if (request.headers.authorization && /^Bearer /.test(request.headers.authorization)) {
|
|
15
|
+
token = request.headers.authorization.substr(7);
|
|
16
|
+
}
|
|
17
|
+
return token;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Sign the payload with the given secret.
|
|
21
|
+
* @param payload
|
|
22
|
+
* @param expires
|
|
23
|
+
* @returns A JSON web token.
|
|
24
|
+
*/
|
|
25
|
+
async function sign(payload, audience, expires = 0) {
|
|
26
|
+
const secret = audience === 'refresh' ? await vault.get('SECRET') : vault.getPrivateSecret();
|
|
27
|
+
if (!secret) {
|
|
28
|
+
throw new Error('Cannot fins secret to sign token.');
|
|
29
|
+
}
|
|
30
|
+
if (!expires) {
|
|
31
|
+
expires = audience === 'refresh' ? REFRESH_TOKEN_EXPIRY_TIME : TOKEN_EXPIRY_TIME;
|
|
32
|
+
}
|
|
33
|
+
const options = {
|
|
34
|
+
audience,
|
|
35
|
+
expiresIn: expires,
|
|
36
|
+
issuer: TOKEN_ISSUER
|
|
37
|
+
};
|
|
38
|
+
const token = create(jwt.sign({ data: payload }, secret, options));
|
|
39
|
+
return token;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sign both the normal token and refresh token for it.
|
|
43
|
+
* @param payload
|
|
44
|
+
* @param audience
|
|
45
|
+
* @param expires
|
|
46
|
+
*/
|
|
47
|
+
async function sign2(payload, audience, expires = 0) {
|
|
48
|
+
const token = await sign(payload, audience, expires);
|
|
49
|
+
const refresh = await sign({ audience, owner: payload.owner, feats: payload.feats, plugins: payload.plugins }, 'refresh', expires * 2);
|
|
50
|
+
return { token, refresh };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check the token validity.
|
|
54
|
+
* @param token
|
|
55
|
+
* @param secret
|
|
56
|
+
* @param quiet If set, do not trigger errors.
|
|
57
|
+
* @returns Token payload if valid.
|
|
58
|
+
*/
|
|
59
|
+
function verify(token, secret, audience, quiet = false) {
|
|
60
|
+
if (!secret)
|
|
61
|
+
throw new Error('Cannot verify token since no secret given.');
|
|
62
|
+
if (!audience)
|
|
63
|
+
throw new Error('Cannot verify token since no audience given.');
|
|
64
|
+
function fail(msg) {
|
|
65
|
+
if (!quiet)
|
|
66
|
+
error(msg);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const decoded = jwt.verify(token, secret, { audience, issuer: [TOKEN_ISSUER] });
|
|
70
|
+
if (!decoded) {
|
|
71
|
+
fail('Cannot decode the token.');
|
|
72
|
+
}
|
|
73
|
+
else if (!decoded.data) {
|
|
74
|
+
fail(`Cannot find any payload from the token ${token}.`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
if (!decoded.exp) {
|
|
78
|
+
fail(`Token content ${decoded} does not have exp-field.`);
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (decoded.data.audience) {
|
|
82
|
+
const data = decoded.data;
|
|
83
|
+
if (!data.owner || !data.feats) {
|
|
84
|
+
fail(`Cannot find proper payload from the refresh token with content ${JSON.stringify(decoded)}.`);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
return data;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const data = decoded.data;
|
|
93
|
+
if (!data.owner || !data.feats) {
|
|
94
|
+
fail(`Cannot find proper payload from the token with content ${JSON.stringify(decoded)}.`);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
return data;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
fail(`Token verification failed ${err} for ${JSON.stringify(parse(token))}`);
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Parse the payload of the token without verifying.
|
|
110
|
+
* @param token
|
|
111
|
+
*/
|
|
112
|
+
function parse(token) {
|
|
113
|
+
const decoded = jwt.decode(token, { json: true, complete: true });
|
|
114
|
+
return decoded;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* A checker for token validity.
|
|
118
|
+
* @param token
|
|
119
|
+
* @param audience
|
|
120
|
+
* @param quiet If set, do not trigger errors.
|
|
121
|
+
*/
|
|
122
|
+
async function check(token, audience, quiet = false) {
|
|
123
|
+
if (!token) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const secret = audience === 'refresh' ? await vault.get('SECRET') : vault.getPrivateSecret();
|
|
127
|
+
if (!secret) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
const payload = tokens.verify(token, secret, audience, quiet);
|
|
131
|
+
return !!payload;
|
|
132
|
+
}
|
|
133
|
+
export const tokens = {
|
|
134
|
+
check,
|
|
135
|
+
get,
|
|
136
|
+
parse,
|
|
137
|
+
sign,
|
|
138
|
+
sign2,
|
|
139
|
+
verify
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../../src/net/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Secret } from '@dataplug/tasenor-common';
|
|
2
|
+
export declare const ALLOWED_VAULT_VARIABLES: string[];
|
|
3
|
+
export type VaultVariable = typeof ALLOWED_VAULT_VARIABLES[number];
|
|
4
|
+
export type VaultValue = string;
|
|
5
|
+
/**
|
|
6
|
+
* Base class for a secret vault implementations.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Vault {
|
|
9
|
+
url: string;
|
|
10
|
+
values: {
|
|
11
|
+
[key: string]: VaultValue;
|
|
12
|
+
};
|
|
13
|
+
initialized: boolean;
|
|
14
|
+
secret: Secret | null;
|
|
15
|
+
constructor(url: string);
|
|
16
|
+
/**
|
|
17
|
+
* Retrieve all secret values.
|
|
18
|
+
*/
|
|
19
|
+
initialize(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Get a secret value.
|
|
22
|
+
* @param variable
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
25
|
+
get(variable: VaultVariable, def?: undefined | VaultValue): VaultValue;
|
|
26
|
+
/**
|
|
27
|
+
* Get the internally generated secret and generate new if none yet generated.
|
|
28
|
+
*/
|
|
29
|
+
getPrivateSecret(): Secret;
|
|
30
|
+
/**
|
|
31
|
+
* Set the internal secret (use only in developement).
|
|
32
|
+
*/
|
|
33
|
+
setPrivateSecret(secret: Secret): void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A secret vault using environment variables only.
|
|
37
|
+
*/
|
|
38
|
+
export declare class EnvironmentVault extends Vault {
|
|
39
|
+
initialize(): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
export declare function getVault(): Vault;
|
|
42
|
+
/**
|
|
43
|
+
* Retrieve a value from the vault.
|
|
44
|
+
* @param variable
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
declare function get(variable: VaultVariable, def?: undefined | VaultValue): VaultValue;
|
|
48
|
+
/**
|
|
49
|
+
* Get the internally generated secret and generate new if none yet generated.
|
|
50
|
+
*/
|
|
51
|
+
declare function getPrivateSecret(): Secret;
|
|
52
|
+
/**
|
|
53
|
+
* Set the internal secret.
|
|
54
|
+
*/
|
|
55
|
+
declare function setPrivateSecret(secret: Secret): void;
|
|
56
|
+
/**
|
|
57
|
+
* Set up the vault.
|
|
58
|
+
*/
|
|
59
|
+
declare function initialize(): Promise<void>;
|
|
60
|
+
export declare const vault: {
|
|
61
|
+
get: typeof get;
|
|
62
|
+
getPrivateSecret: typeof getPrivateSecret;
|
|
63
|
+
getVault: typeof getVault;
|
|
64
|
+
initialize: typeof initialize;
|
|
65
|
+
setPrivateSecret: typeof setPrivateSecret;
|
|
66
|
+
};
|
|
67
|
+
export {};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { randomString } from './crypto';
|
|
2
|
+
export const ALLOWED_VAULT_VARIABLES = [
|
|
3
|
+
'TASENOR_API_URL',
|
|
4
|
+
'API_SITE_TOKEN',
|
|
5
|
+
'DATABASE_ROOT_PASSWORD',
|
|
6
|
+
'DATABASE_ROOT_USER',
|
|
7
|
+
'DATABASE_URL',
|
|
8
|
+
'SECRET',
|
|
9
|
+
'TASENOR_SITE_TOKEN'
|
|
10
|
+
];
|
|
11
|
+
const validVariables = new Set(ALLOWED_VAULT_VARIABLES);
|
|
12
|
+
/**
|
|
13
|
+
* Base class for a secret vault implementations.
|
|
14
|
+
*/
|
|
15
|
+
export class Vault {
|
|
16
|
+
url;
|
|
17
|
+
values;
|
|
18
|
+
initialized;
|
|
19
|
+
secret;
|
|
20
|
+
constructor(url) {
|
|
21
|
+
this.url = url;
|
|
22
|
+
this.values = {};
|
|
23
|
+
this.initialized = false;
|
|
24
|
+
this.secret = null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Retrieve all secret values.
|
|
28
|
+
*/
|
|
29
|
+
async initialize() {
|
|
30
|
+
throw new Error(`A class ${this.constructor.name} does not implement initialize().`);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get a secret value.
|
|
34
|
+
* @param variable
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
get(variable, def = undefined) {
|
|
38
|
+
if (!validVariables.has(variable))
|
|
39
|
+
throw new Error(`A variable ${variable} is not valid vault value.`);
|
|
40
|
+
if (!(variable in this.values)) {
|
|
41
|
+
if (def !== undefined) {
|
|
42
|
+
return def;
|
|
43
|
+
}
|
|
44
|
+
throw new Error(`Cannot find variable ${variable} from the vault.`);
|
|
45
|
+
}
|
|
46
|
+
return this.values[variable];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the internally generated secret and generate new if none yet generated.
|
|
50
|
+
*/
|
|
51
|
+
getPrivateSecret() {
|
|
52
|
+
if (this.secret === null) {
|
|
53
|
+
this.secret = randomString(512);
|
|
54
|
+
}
|
|
55
|
+
return this.secret;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Set the internal secret (use only in developement).
|
|
59
|
+
*/
|
|
60
|
+
setPrivateSecret(secret) {
|
|
61
|
+
this.secret = secret;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A secret vault using environment variables only.
|
|
66
|
+
*/
|
|
67
|
+
export class EnvironmentVault extends Vault {
|
|
68
|
+
async initialize() {
|
|
69
|
+
for (const variable of ALLOWED_VAULT_VARIABLES) {
|
|
70
|
+
const value = process.env[variable];
|
|
71
|
+
if (value !== undefined) {
|
|
72
|
+
this.values[variable] = value;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Instantiate and return the current vault based on the environment VAULT_URL.
|
|
79
|
+
*/
|
|
80
|
+
let currentVault;
|
|
81
|
+
export function getVault() {
|
|
82
|
+
if (currentVault && currentVault.url === process.env.VAULT_URL)
|
|
83
|
+
return currentVault;
|
|
84
|
+
if (!process.env.VAULT_URL) {
|
|
85
|
+
throw new Error('No VAULT_URL set and cannot instantiate the vault.');
|
|
86
|
+
}
|
|
87
|
+
const url = new URL(process.env.VAULT_URL);
|
|
88
|
+
switch (url.protocol) {
|
|
89
|
+
case 'env:':
|
|
90
|
+
currentVault = new EnvironmentVault(process.env.VAULT_URL);
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
throw new Error(`Cannot recognize protocol ${url.protocol} of vault URL ${process.env.VAULT_URL}`);
|
|
94
|
+
}
|
|
95
|
+
return currentVault;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Retrieve a value from the vault.
|
|
99
|
+
* @param variable
|
|
100
|
+
* @returns
|
|
101
|
+
*/
|
|
102
|
+
function get(variable, def = undefined) {
|
|
103
|
+
const vault = getVault();
|
|
104
|
+
if (!vault.initialized) {
|
|
105
|
+
throw new Error('Cannot use the vault before it is initialized.');
|
|
106
|
+
}
|
|
107
|
+
const value = vault.get(variable, def);
|
|
108
|
+
if (value === undefined) {
|
|
109
|
+
throw new Error(`Cannot find value ${variable} from the vault.`);
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get the internally generated secret and generate new if none yet generated.
|
|
115
|
+
*/
|
|
116
|
+
function getPrivateSecret() {
|
|
117
|
+
const vault = getVault();
|
|
118
|
+
if (!vault.initialized) {
|
|
119
|
+
throw new Error('Cannot use the vault before it is initialized.');
|
|
120
|
+
}
|
|
121
|
+
return vault.getPrivateSecret();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Set the internal secret.
|
|
125
|
+
*/
|
|
126
|
+
function setPrivateSecret(secret) {
|
|
127
|
+
const vault = getVault();
|
|
128
|
+
vault.setPrivateSecret(secret);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Set up the vault.
|
|
132
|
+
*/
|
|
133
|
+
async function initialize() {
|
|
134
|
+
const vault = getVault();
|
|
135
|
+
vault.initialized = true;
|
|
136
|
+
await vault.initialize();
|
|
137
|
+
}
|
|
138
|
+
export const vault = {
|
|
139
|
+
get,
|
|
140
|
+
getPrivateSecret,
|
|
141
|
+
getVault,
|
|
142
|
+
initialize,
|
|
143
|
+
setPrivateSecret
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../../src/net/vault.ts"],"names":[],"mappings":"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"}
|