mirror of
https://code.lenaisten.de/Lenaisten/advent22.git
synced 2026-01-10 23:23:03 +00:00
🔧 improved secret handling
- BulmaSecret automatically returns to "hidden" after 2.5 seconds in "pending" - ConfigView clears the credential values if not viewed
This commit is contained in:
parent
8e8e894638
commit
811fec743e
2 changed files with 48 additions and 25 deletions
|
|
@ -139,12 +139,15 @@
|
||||||
|
|
||||||
<dt>Zugangsdaten</dt>
|
<dt>Zugangsdaten</dt>
|
||||||
<dd class="is-family-monospace">
|
<dd class="is-family-monospace">
|
||||||
<BulmaSecret @load="load_dav_credentials">
|
<BulmaSecret
|
||||||
|
@show="load_credentials(creds.dav, 'admin/dav_credentials')"
|
||||||
|
@hide="clear_credentials(creds.dav)"
|
||||||
|
>
|
||||||
<span class="tag is-danger">user</span>
|
<span class="tag is-danger">user</span>
|
||||||
{{ dav_credentials[0] }}
|
{{ creds.dav[0] }}
|
||||||
<br />
|
<br />
|
||||||
<span class="tag is-danger">pass</span>
|
<span class="tag is-danger">pass</span>
|
||||||
{{ dav_credentials[1] }}
|
{{ creds.dav[1] }}
|
||||||
</BulmaSecret>
|
</BulmaSecret>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
|
|
@ -167,12 +170,15 @@
|
||||||
|
|
||||||
<dt>UI-Admin</dt>
|
<dt>UI-Admin</dt>
|
||||||
<dd class="is-family-monospace">
|
<dd class="is-family-monospace">
|
||||||
<BulmaSecret @load="load_ui_credentials">
|
<BulmaSecret
|
||||||
|
@show="load_credentials(creds.ui, 'admin/ui_credentials')"
|
||||||
|
@hide="clear_credentials(creds.ui)"
|
||||||
|
>
|
||||||
<span class="tag is-danger">user</span>
|
<span class="tag is-danger">user</span>
|
||||||
{{ ui_credentials[0] }}
|
{{ creds.ui[0] }}
|
||||||
<br />
|
<br />
|
||||||
<span class="tag is-danger">pass</span>
|
<span class="tag is-danger">pass</span>
|
||||||
{{ ui_credentials[1] }}
|
{{ creds.ui[1] }}
|
||||||
</BulmaSecret>
|
</BulmaSecret>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
@ -237,8 +243,10 @@ const admin_config_model = ref<AdminConfigModel>({
|
||||||
});
|
});
|
||||||
|
|
||||||
const doors = ref<DoorSaved[]>([]);
|
const doors = ref<DoorSaved[]>([]);
|
||||||
const dav_credentials = ref<Credentials>(["", ""]);
|
const creds = ref<Record<string, Credentials>>({
|
||||||
const ui_credentials = ref<Credentials>(["", ""]);
|
dav: ["", ""],
|
||||||
|
ui: ["", ""],
|
||||||
|
});
|
||||||
|
|
||||||
function fmt_puzzle_date(name: keyof AdminConfigModel["puzzle"]): string {
|
function fmt_puzzle_date(name: keyof AdminConfigModel["puzzle"]): string {
|
||||||
const iso_date = admin_config_model.value.puzzle[name];
|
const iso_date = admin_config_model.value.puzzle[name];
|
||||||
|
|
@ -257,22 +265,24 @@ async function on_open(): Promise<void> {
|
||||||
void store_update; // discard value
|
void store_update; // discard value
|
||||||
admin_config_model.value = new_admin_config_model;
|
admin_config_model.value = new_admin_config_model;
|
||||||
doors.value = new_doors;
|
doors.value = new_doors;
|
||||||
|
creds.value = { dav: ["", ""], ui: ["", ""] };
|
||||||
}
|
}
|
||||||
|
|
||||||
async function load_dav_credentials(): Promise<void> {
|
async function load_credentials(
|
||||||
|
creds: Credentials,
|
||||||
|
endpoint: string,
|
||||||
|
): Promise<void> {
|
||||||
try {
|
try {
|
||||||
dav_credentials.value = await API.request<Credentials>(
|
const new_creds = await API.request<Credentials>(endpoint);
|
||||||
"admin/dav_credentials",
|
|
||||||
);
|
creds[0] = new_creds[0];
|
||||||
|
creds[1] = new_creds[1];
|
||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function load_ui_credentials(): Promise<void> {
|
function clear_credentials(creds: Credentials): void {
|
||||||
try {
|
creds[0] = "";
|
||||||
ui_credentials.value = await API.request<Credentials>(
|
creds[1] = "";
|
||||||
"admin/ui_credentials",
|
|
||||||
);
|
|
||||||
} catch {}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
<span v-else>***</span>
|
<span v-else>***</span>
|
||||||
<BulmaButton
|
<BulmaButton
|
||||||
:class="`is-small is-${record.color} ml-2`"
|
:class="`is-small is-${record.color} ml-2`"
|
||||||
:icon="['fas', `${record.icon}`]"
|
:icon="['fas', record.icon]"
|
||||||
:busy="state === 'clicked'"
|
:busy="state === 'pending'"
|
||||||
@click="on_click"
|
@click="on_click"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -16,24 +16,37 @@ import { computed, ref } from "vue";
|
||||||
import BulmaButton from "./Button.vue";
|
import BulmaButton from "./Button.vue";
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
(event: "load"): void;
|
(event: "show"): void;
|
||||||
|
(event: "hide"): void;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
type State = "hidden" | "clicked" | "visible";
|
type State = "hidden" | "pending" | "visible";
|
||||||
const state = ref<State>("hidden");
|
const state = ref<State>("hidden");
|
||||||
|
|
||||||
const state_map: Record<State, { color: string; icon: string; next: State }> = {
|
const state_map: Record<State, { color: string; icon: string; next: State }> = {
|
||||||
hidden: { color: "primary", icon: "eye-slash", next: "clicked" },
|
hidden: { color: "primary", icon: "eye-slash", next: "pending" },
|
||||||
clicked: { color: "warning", icon: "eye-slash", next: "visible" },
|
pending: { color: "warning", icon: "eye-slash", next: "visible" },
|
||||||
visible: { color: "danger", icon: "eye", next: "hidden" },
|
visible: { color: "danger", icon: "eye", next: "hidden" },
|
||||||
} as const;
|
} as const;
|
||||||
const record = computed(() => state_map[state.value] ?? state_map.hidden);
|
const record = computed(() => state_map[state.value] ?? state_map.hidden);
|
||||||
|
|
||||||
|
let pending_timeout: number | undefined;
|
||||||
|
|
||||||
function on_click(): void {
|
function on_click(): void {
|
||||||
state.value = record.value.next;
|
state.value = record.value.next;
|
||||||
|
|
||||||
|
if (state.value === "hidden") {
|
||||||
|
emit("hide");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.value === "pending") {
|
||||||
|
pending_timeout = window.setTimeout(() => (state.value = "hidden"), 2500);
|
||||||
|
} else {
|
||||||
|
window.clearTimeout(pending_timeout);
|
||||||
|
}
|
||||||
|
|
||||||
if (state.value === "visible") {
|
if (state.value === "visible") {
|
||||||
emit("load");
|
emit("show");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue