diff --git a/client/package.json b/client/package.json index 551dd0e..8a358fb 100644 --- a/client/package.json +++ b/client/package.json @@ -12,17 +12,19 @@ }, "dependencies": { "@intlify/unplugin-vue-i18n": "^0.8.2", - "@open-rpc/client-js": "^1.8.1", "@vueuse/core": "^9.13.0", "@vueuse/head": "^1.1.15", + "axios": "^1.3.4", "events": "^3.3.0", "focus-trap": "^7.3.1", "focus-trap-vue": "^4.0.2", "markdown-it-link-attributes": "^4.0.1", "markdown-it-shiki": "^0.8.0", + "simple-jsonrpc-js": "^1.2.0", "vue": "^3.2.45", "vue-i18n": "9", - "vue-router": "4" + "vue-router": "4", + "ws": "^8.13.0" }, "devDependencies": { "@iconify/json": "^2.2.30", diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 64a3ad2..2ad3418 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -3,7 +3,6 @@ lockfileVersion: 5.4 specifiers: '@iconify/json': ^2.2.30 '@intlify/unplugin-vue-i18n': ^0.8.2 - '@open-rpc/client-js': ^1.8.1 '@types/events': ^3.0.0 '@types/markdown-it-link-attributes': ^3.0.1 '@typescript-eslint/parser': ^5.54.1 @@ -12,6 +11,7 @@ specifiers: '@vue-macros/volar': ^0.8.4 '@vueuse/core': ^9.13.0 '@vueuse/head': ^1.1.15 + axios: ^1.3.4 eslint: ^8.35.0 eslint-plugin-vue: ^9.9.0 events: ^3.3.0 @@ -19,6 +19,7 @@ specifiers: focus-trap-vue: ^4.0.2 markdown-it-link-attributes: ^4.0.1 markdown-it-shiki: ^0.8.0 + simple-jsonrpc-js: ^1.2.0 typescript: ^4.9.3 unplugin-auto-import: ^0.15.0 unplugin-icons: ^0.15.3 @@ -31,20 +32,23 @@ specifiers: vue-i18n: '9' vue-router: '4' vue-tsc: ^1.0.24 + ws: ^8.13.0 dependencies: '@intlify/unplugin-vue-i18n': 0.8.2_vue-i18n@9.2.2 - '@open-rpc/client-js': 1.8.1 '@vueuse/core': 9.13.0_vue@3.2.47 '@vueuse/head': 1.1.15_vue@3.2.47 + axios: 1.3.4 events: 3.3.0 focus-trap: 7.3.1 focus-trap-vue: 4.0.2_oggptlzwchqpaguemspe4ract4 markdown-it-link-attributes: 4.0.1 markdown-it-shiki: 0.8.0 + simple-jsonrpc-js: 1.2.0 vue: 3.2.47 vue-i18n: 9.2.2_vue@3.2.47 vue-router: 4.1.6_vue@3.2.47 + ws: 8.13.0 devDependencies: '@iconify/json': 2.2.30 @@ -775,19 +779,6 @@ packages: - supports-color dev: true - /@open-rpc/client-js/1.8.1: - resolution: {integrity: sha512-vV+Hetl688nY/oWI9IFY0iKDrWuLdYhf7OIKI6U1DcnJV7r4gAgwRJjEr1QVYszUc0gjkHoQJzqevmXMGLyA0g==} - dependencies: - isomorphic-fetch: 3.0.0 - isomorphic-ws: 5.0.0_ws@7.5.9 - strict-event-emitter-types: 2.0.0 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - /@pkgr/utils/2.3.1: resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -1507,11 +1498,25 @@ packages: '@babel/types': 7.21.2 dev: true + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /available-typed-arrays/1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true + /axios/1.3.4: + resolution: {integrity: sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -1646,6 +1651,13 @@ packages: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true @@ -1741,6 +1753,11 @@ packages: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} dev: true + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /destr/1.2.2: resolution: {integrity: sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==} dev: true @@ -2140,12 +2157,31 @@ packages: tabbable: 6.1.1 dev: false + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /fs-minipass/2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -2572,23 +2608,6 @@ packages: /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /isomorphic-fetch/3.0.0: - resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} - dependencies: - node-fetch: 2.6.9 - whatwg-fetch: 3.6.2 - transitivePeerDependencies: - - encoding - dev: false - - /isomorphic-ws/5.0.0_ws@7.5.9: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - dependencies: - ws: 7.5.9 - dev: false - /jiti/1.17.1: resolution: {integrity: sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==} hasBin: true @@ -2800,6 +2819,18 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2894,18 +2925,6 @@ packages: resolution: {integrity: sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==} dev: true - /node-fetch/2.6.9: - resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - /node-releases/2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true @@ -3086,6 +3105,10 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /prr/1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true @@ -3235,6 +3258,10 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true + /simple-jsonrpc-js/1.2.0: + resolution: {integrity: sha512-owkAmh7fjSYBUZVestTPCZMKYQvNiDejqZ/iGfVaKs1nrC1ZBDA3qGraf94+JNFJmu536Tb8oPe8PSPuq7GO6Q==} + dev: false + /sirv/2.0.2: resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} engines: {node: '>= 10'} @@ -3281,10 +3308,6 @@ packages: internal-slot: 1.0.5 dev: true - /strict-event-emitter-types/2.0.0: - resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} - dev: false - /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -3393,10 +3416,6 @@ packages: engines: {node: '>=6'} dev: true - /tr46/0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true @@ -3846,10 +3865,6 @@ packages: '@vue/server-renderer': 3.2.47_vue@3.2.47 '@vue/shared': 3.2.47 - /webidl-conversions/3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false - /webpack-sources/3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -3857,17 +3872,6 @@ packages: /webpack-virtual-modules/0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - /whatwg-fetch/3.6.2: - resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} - dev: false - - /whatwg-url/5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -3915,12 +3919,12 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws/7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} + /ws/8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true diff --git a/client/src/App.vue b/client/src/App.vue index e23dff6..53c4243 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -3,22 +3,76 @@ import IDashboard from '~icons/ri/dashboard-2-line'; import IRule from '~icons/material-symbols/rule-folder-outline-sharp'; import IAddress from '~icons/eos-icons/ip'; - +import { authenticate, logout, checkAuthentication, setup } from "./api"; enum NavState { Open, Reduced, Collapsed }; const NavStateCount = 3; let navState = $ref(NavState.Open); -let loggedOut = $ref(false); - const navRoutes = { "/": { icon: IDashboard, caption: "Dashboard" }, - "/rules": { icon: IRule, caption: "Rules" }, + "/firewall/rules": { icon: IRule, caption: "Rules" }, "/addresses": { icon: IAddress, caption: "Addresses" }, }; + +enum AuthState { Unauthenticated, MfaRequired, Authenticated }; +let authState = $ref(AuthState.Unauthenticated); +let loginDisabled = $ref(true); + +let username = $ref(""); +let password = $ref(""); + + +async function tryLogin() { + loginDisabled = true; + const res = await authenticate(username, password); + password = ""; + loginDisabled = false; + if (res.error != null) { + console.info("authentication error"); + } else { + // TODO Check for MFA here + authState = AuthState.Authenticated; + } +} + +async function tryLogout() { + console.info("Logging out..."); + authState = AuthState.Unauthenticated; + logout(); +} + +function UnauthorizedCallback() { + console.info("Unauthenticated"); + authState = AuthState.Unauthenticated; +} + +async function checkAuth() { + console.info("Checking Auth State..."); + let res = await checkAuthentication(); + authState = res.auth; + loginDisabled = false; + if (authState === AuthState.Authenticated) { + console.info("Already Authenticated ", authState); + } else if (res.error == null) { + console.info("Unauthorized"); + } + else console.info("Check Authentication error",res.error); +} + +onMounted(async() => { + setup(UnauthorizedCallback); + await checkAuth(); + setInterval(function () { + if (authState === AuthState.Authenticated && !document.hidden) { + checkAuth(); + } + }.bind(this), 120000); +}); +