forked from OpenServer/OpenAuth_views
155 lines
3.8 KiB
Svelte
155 lines
3.8 KiB
Svelte
<script context="module">
|
|
const TFATypes = new Map()
|
|
TFATypes.set(0, "Authenticator")
|
|
TFATypes.set(1, "Backup Codes")
|
|
TFATypes.set(2, "YubiKey")
|
|
TFATypes.set(3, "Push Notification")
|
|
</script>
|
|
|
|
<script>
|
|
import Box from "./Box.svelte";
|
|
import BoxItem from "./BoxItem.svelte";
|
|
import NextIcon from "./NextIcon.svelte";
|
|
import request from "../../request";
|
|
|
|
export let loading = false;
|
|
|
|
let twofactor = [];
|
|
|
|
async function deleteTFA(id) {
|
|
let res = await request("/api/user/twofactor/" + id, undefined, "DELETE", undefined, true);
|
|
loadTwoFactor();
|
|
}
|
|
|
|
async function loadTwoFactor() {
|
|
let res = await request("/api/user/twofactor", undefined, undefined, undefined, true);
|
|
twofactor = res.methods;
|
|
}
|
|
|
|
|
|
let token = [];
|
|
|
|
async function revoke(id) {
|
|
let res = await request("/api/user/token/" + id, undefined, "DELETE", undefined, true);
|
|
loadToken();
|
|
}
|
|
|
|
async function loadToken() {
|
|
loading = true;
|
|
let res = await request("/api/user/token", undefined, undefined, undefined, true);
|
|
token = res.token;
|
|
loading = false;
|
|
}
|
|
|
|
loadToken();
|
|
loadTwoFactor();
|
|
</script>
|
|
|
|
|
|
<Box>
|
|
<h1>Two Factor</h1>
|
|
<BoxItem name="Add new" open={false}></BoxItem>
|
|
{#each twofactor as t}
|
|
<BoxItem name={TFATypes.get(t.type)} value={t.name} highlight={t.isthis}>
|
|
<button class="btn" style="background: var(--error)" on:click={()=>deleteTFA(t.id)}>Delete</button>
|
|
</BoxItem>
|
|
{/each}
|
|
<!-- <BoxItem name="Name" value={name} open={false}>
|
|
<div class="input-container">
|
|
<div class="floating group">
|
|
<input type="text" autocomplete="username" bind:value={name}>
|
|
<span class="highlight"></span>
|
|
<span class="bar"></span>
|
|
<label>Name</label>
|
|
</div>
|
|
<button class="btn" on:click={saveName}>Save</button>
|
|
</div>
|
|
</BoxItem>
|
|
<BoxItem name="Gender" value={gender} open={true}>
|
|
<div class="input-container">
|
|
<div class="select-wrapper">
|
|
<select>
|
|
<option value="1">Male</option>
|
|
<option value="2">Female</option>
|
|
<option value="3">Other</option>
|
|
</select>
|
|
</div>
|
|
<button class="btn" on:click={saveName}>Save</button>
|
|
</div>
|
|
</BoxItem>
|
|
<BoxItem name="Birthday" value={birthday} />
|
|
<BoxItem name="Password" value="******" /> -->
|
|
</Box>
|
|
|
|
<Box>
|
|
<h1>Anmeldungen</h1>
|
|
|
|
{#each token as t}
|
|
<BoxItem name={t.browser} value={t.ip} highlight={t.isthis}>
|
|
<button class="btn" style="background: var(--error)" on:click={()=>revoke(t.id)}>Revoke</button>
|
|
</BoxItem>
|
|
{:else}
|
|
<span>No Tokens</span>
|
|
{/each}
|
|
|
|
<!-- <BoxItem name="E-Mail" value={email} />
|
|
<BoxItem name="Phone" value={phone} /> -->
|
|
</Box>
|
|
|
|
|
|
<style>
|
|
.btn {
|
|
background-color: var(--primary);
|
|
margin: auto 0;
|
|
margin-left: 1rem;
|
|
font-size: 1rem;
|
|
padding: 0 0.5rem;
|
|
}
|
|
|
|
.floating {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.input-container {
|
|
display: flex;
|
|
}
|
|
|
|
.input-container>*:first-child {
|
|
flex-grow: 1;
|
|
}
|
|
|
|
select {
|
|
background-color: unset;
|
|
border: 0;
|
|
border-radius: 0;
|
|
color: unset;
|
|
font-size: unset;
|
|
border-bottom: 1px solid #757575;
|
|
/* Firefox */
|
|
-moz-appearance: none;
|
|
/* Safari and Chrome */
|
|
-webkit-appearance: none;
|
|
appearance: none;
|
|
height: 100%;
|
|
width: 100%;
|
|
}
|
|
|
|
select>option {
|
|
background-color: unset;
|
|
}
|
|
|
|
.select-wrapper {
|
|
position: relative;
|
|
}
|
|
|
|
.select-wrapper::after {
|
|
content: ">";
|
|
display: block;
|
|
position: absolute;
|
|
right: 2rem;
|
|
top: 0;
|
|
bottom: 0;
|
|
width: 1rem;
|
|
transform: rotate(90deg) scaleY(2);
|
|
}
|
|
</style> |