mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-05-07 14:57:12 -04:00
poc
This commit is contained in:
parent
08d977b8cd
commit
d45637cd4f
4 changed files with 59 additions and 1 deletions
30
.devcontainer/devcontainer.json
Normal file
30
.devcontainer/devcontainer.json
Normal file
|
@ -0,0 +1,30 @@
|
|||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node
|
||||
{
|
||||
"name": "Node.js & TypeScript",
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
|
||||
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
// "forwardPorts": [],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
// "postCreateCommand": "yarn install",
|
||||
|
||||
// Configure tool-specific properties.
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"Vue.volar",
|
||||
"Lokalise.i18n-ally",
|
||||
"dbaeumer.vscode-eslint"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
}
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -13,6 +13,7 @@ dist
|
|||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
.pnpm-store
|
||||
|
||||
/cypress/videos/
|
||||
/cypress/screenshots/
|
||||
|
|
3
components.d.ts
vendored
3
components.d.ts
vendored
|
@ -98,6 +98,7 @@ declare module '@vue/runtime-core' {
|
|||
IconMdiEye: typeof import('~icons/mdi/eye')['default']
|
||||
IconMdiEyeOff: typeof import('~icons/mdi/eye-off')['default']
|
||||
IconMdiHeart: typeof import('~icons/mdi/heart')['default']
|
||||
IconMdiRefresh: typeof import('~icons/mdi/refresh')['default']
|
||||
IconMdiSearch: typeof import('~icons/mdi/search')['default']
|
||||
IconMdiTranslate: typeof import('~icons/mdi/translate')['default']
|
||||
IconMdiTriangleDown: typeof import('~icons/mdi/triangle-down')['default']
|
||||
|
@ -138,9 +139,11 @@ declare module '@vue/runtime-core' {
|
|||
NH1: typeof import('naive-ui')['NH1']
|
||||
NH3: typeof import('naive-ui')['NH3']
|
||||
NIcon: typeof import('naive-ui')['NIcon']
|
||||
NImage: typeof import('naive-ui')['NImage']
|
||||
NLayout: typeof import('naive-ui')['NLayout']
|
||||
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
|
||||
NMenu: typeof import('naive-ui')['NMenu']
|
||||
NProgress: typeof import('naive-ui')['NProgress']
|
||||
NSpace: typeof import('naive-ui')['NSpace']
|
||||
NTable: typeof import('naive-ui')['NTable']
|
||||
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
import { useTimestamp } from '@vueuse/core';
|
||||
import { useThemeVars } from 'naive-ui';
|
||||
import { useQRCode } from '../qr-code-generator/useQRCode';
|
||||
import { base32toHex, buildKeyUri, generateSecret, generateTOTP, getCounterFromTime } from './otp.service';
|
||||
import { base32toHex, buildKeyUri, generateHOTP, generateSecret, generateTOTP, getCounterFromTime } from './otp.service';
|
||||
import TokenDisplay from './token-display.vue';
|
||||
import { useStyleStore } from '@/stores/style.store';
|
||||
import InputCopyable from '@/components/InputCopyable.vue';
|
||||
|
@ -19,6 +19,16 @@ function refreshSecret() {
|
|||
secret.value = generateSecret();
|
||||
}
|
||||
|
||||
const counter = ref(0);
|
||||
|
||||
const [hotpValues] = computedRefreshable(
|
||||
() =>
|
||||
Object.fromEntries(
|
||||
Array.from({ length: 10 }, (_, i) => [+counter.value + i, generateHOTP({ key: secret.value, counter: +counter.value + i })]),
|
||||
),
|
||||
{ throttle: 500 },
|
||||
);
|
||||
|
||||
const [tokens] = computedRefreshable(
|
||||
() => ({
|
||||
previous: generateTOTP({ key: secret.value, now: now.value - 30000 }),
|
||||
|
@ -83,6 +93,20 @@ const secretValidationRules = [
|
|||
Open Key URI in new tab
|
||||
</c-button>
|
||||
</div>
|
||||
<div>
|
||||
<c-input-text
|
||||
v-model:value="counter"
|
||||
label="Counter"
|
||||
placeholder="Start counter at..."
|
||||
type="number"
|
||||
mt-5
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<p v-for="(value, currentCounter) in hotpValues" :key="currentCounter">
|
||||
{{ currentCounter }}: {{ value }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="max-width: 350px">
|
||||
<InputCopyable
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue