diff --git a/backend/atlas_portal/routes/access_requests.py b/backend/atlas_portal/routes/access_requests.py index 4fe8ebb..f79c7c1 100644 --- a/backend/atlas_portal/routes/access_requests.py +++ b/backend/atlas_portal/routes/access_requests.py @@ -858,12 +858,14 @@ def register(app) -> None: response["tasks"] = tasks response["automation_complete"] = provision_tasks_complete(conn, code) response["blocked"] = blocked - if status in {"awaiting_onboarding", "ready"} and reveal_initial_password: - password = row.get("initial_password") + if status in {"awaiting_onboarding", "ready"}: revealed_at = row.get("initial_password_revealed_at") - if isinstance(password, str) and password: - response["initial_password"] = password - if revealed_at is None: + if isinstance(revealed_at, datetime): + response["initial_password_revealed_at"] = revealed_at.astimezone(timezone.utc).isoformat() + if reveal_initial_password: + password = row.get("initial_password") + if isinstance(password, str) and password and revealed_at is None: + response["initial_password"] = password conn.execute( "UPDATE access_requests SET initial_password_revealed_at = NOW() WHERE request_code = %s AND initial_password_revealed_at IS NULL", (code,), diff --git a/frontend/scripts/build_media_manifest.mjs b/frontend/scripts/build_media_manifest.mjs index 8994835..36d7cb4 100644 --- a/frontend/scripts/build_media_manifest.mjs +++ b/frontend/scripts/build_media_manifest.mjs @@ -1,6 +1,7 @@ import { promises as fs } from "fs"; import path from "path"; +const SOURCE = path.resolve("..", "media", "onboarding"); const ROOT = path.resolve("public", "media", "onboarding"); const MANIFEST = path.join(ROOT, "manifest.json"); const EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".webp"]); @@ -27,7 +28,13 @@ async function ensureDir(dir) { async function main() { try { await ensureDir(ROOT); - const files = await walk(ROOT).catch(() => []); + const files = await walk(SOURCE).catch(() => []); + for (const file of files) { + const src = path.join(SOURCE, file); + const dest = path.join(ROOT, file); + await ensureDir(path.dirname(dest)); + await fs.copyFile(src, dest); + } const payload = { generated_at: new Date().toISOString(), files: files.sort(), diff --git a/frontend/src/views/OnboardingView.vue b/frontend/src/views/OnboardingView.vue index b04ec9c..55331c6 100644 --- a/frontend/src/views/OnboardingView.vue +++ b/frontend/src/views/OnboardingView.vue @@ -125,22 +125,25 @@ -
+
Temporary password
- -
+

+ This password was already revealed and cannot be shown again. Ask an admin to reset it if you missed it. +

@@ -204,6 +207,12 @@ +

+ +
+
+
+ +
+ +
@@ -300,6 +339,7 @@ const loading = ref(false); const error = ref(""); const onboarding = ref({ required_steps: [], optional_steps: [], completed_steps: [] }); const initialPassword = ref(""); +const initialPasswordRevealedAt = ref(""); const revealPassword = ref(false); const passwordCopied = ref(false); const usernameCopied = ref(false); @@ -309,6 +349,10 @@ const elementRecoveryKey = ref(""); const keycloakPasswordRotationRequested = ref(false); const activeSectionId = ref("vaultwarden"); const guideShots = ref({}); +const guidePage = ref({}); + +const showPasswordCard = computed(() => Boolean(initialPassword.value || initialPasswordRevealedAt.value)); +const passwordRevealLocked = computed(() => Boolean(!initialPassword.value && initialPasswordRevealedAt.value)); const STEP_PREREQS = { vaultwarden_master_password: [], @@ -738,6 +782,37 @@ function guideGroups(step) { return Object.values(stepShots); } +function guideKey(step, group) { + const service = step.guide?.service || "unknown"; + const stepKey = step.guide?.step || "unknown"; + return `${service}:${stepKey}:${group.id}`; +} + +function guideIndex(step, group) { + const key = guideKey(step, group); + const index = guidePage.value[key] ?? 0; + const maxIndex = Math.max(group.shots.length - 1, 0); + return Math.min(Math.max(index, 0), maxIndex); +} + +function guideSet(step, group, index) { + const key = guideKey(step, group); + const next = Math.min(Math.max(index, 0), group.shots.length - 1); + guidePage.value = { ...guidePage.value, [key]: next }; +} + +function guidePrev(step, group) { + guideSet(step, group, guideIndex(step, group) - 1); +} + +function guideNext(step, group) { + guideSet(step, group, guideIndex(step, group) + 1); +} + +function guideShot(step, group) { + return group.shots[guideIndex(step, group)] || {}; +} + function taskPillClass(value) { const key = (value || "").trim(); if (key === "ok") return "pill-ok"; @@ -773,6 +848,7 @@ async function check() { tasks.value = Array.isArray(data.tasks) ? data.tasks : []; blocked.value = Boolean(data.blocked); initialPassword.value = data.initial_password || ""; + initialPasswordRevealedAt.value = data.initial_password_revealed_at || ""; if (showOnboarding.value) { selectDefaultSection(); } @@ -1370,7 +1446,6 @@ button.secondary { .guide-images { display: grid; - grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 10px; } @@ -1387,6 +1462,35 @@ button.secondary { border-radius: 8px; } +.guide-pagination { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + flex-wrap: wrap; +} + +.guide-dots { + display: flex; + gap: 6px; + flex-wrap: wrap; +} + +.guide-dot { + border: 1px solid rgba(255, 255, 255, 0.18); + background: rgba(0, 0, 0, 0.3); + color: var(--text-muted); + border-radius: 999px; + padding: 4px 8px; + cursor: pointer; + font-size: 12px; +} + +.guide-dot.active { + border-color: rgba(120, 180, 255, 0.5); + color: var(--text-strong); +} + .ready-box { margin-top: 18px; padding: 14px; diff --git a/media/onboarding/budget/step1_encrypt_data/1_Encrypt your financial data - storre your key in VaultWarden.png b/media/onboarding/budget/step1_encrypt_data/1_Encrypt your financial data - storre your key in VaultWarden.png new file mode 100644 index 0000000..4be7969 Binary files /dev/null and b/media/onboarding/budget/step1_encrypt_data/1_Encrypt your financial data - storre your key in VaultWarden.png differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/!0_You may get this or not - if you do choose Enter Recover Key.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/!0_You may get this or not - if you do choose Enter Recover Key.jpg new file mode 100644 index 0000000..6541587 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/!0_You may get this or not - if you do choose Enter Recover Key.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/11_Again you may have skipped this for your first time but if not enter the recovery key you saved into VaultWarden.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/11_Again you may have skipped this for your first time but if not enter the recovery key you saved into VaultWarden.jpg new file mode 100644 index 0000000..99b56f8 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/11_Again you may have skipped this for your first time but if not enter the recovery key you saved into VaultWarden.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/12_Just hit continue here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/12_Just hit continue here.jpg new file mode 100644 index 0000000..611dda4 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/12_Just hit continue here.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/13_Just hit Not now here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/13_Just hit Not now here.jpg new file mode 100644 index 0000000..7ec1e2f Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/13_Just hit Not now here.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/14_You are in - come say hi in Othrys.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/14_You are in - come say hi in Othrys.jpg new file mode 100644 index 0000000..936e47d Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/14_You are in - come say hi in Othrys.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/1_If you have a QR code from the website - use that, if not Signin manually.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/1_If you have a QR code from the website - use that, if not Signin manually.jpg new file mode 100644 index 0000000..2d1bfe1 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/1_If you have a QR code from the website - use that, if not Signin manually.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/2_Just hit continue here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/2_Just hit continue here.jpg new file mode 100644 index 0000000..0af0447 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/2_Just hit continue here.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/3_Choose other.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/3_Choose other.jpg new file mode 100644 index 0000000..57ca8e4 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/3_Choose other.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/4_Search for live.bstein.dev.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/4_Search for live.bstein.dev.jpg new file mode 100644 index 0000000..5aef15e Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/4_Search for live.bstein.dev.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/5_Select live.bstein.dev when it comes up below the search field.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/5_Select live.bstein.dev when it comes up below the search field.jpg new file mode 100644 index 0000000..9529edf Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/5_Select live.bstein.dev when it comes up below the search field.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/6_Just hit continue here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/6_Just hit continue here.jpg new file mode 100644 index 0000000..839bed0 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/6_Just hit continue here.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/7_Hit Continue with Keycloak.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/7_Hit Continue with Keycloak.jpg new file mode 100644 index 0000000..76fe7d8 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/7_Hit Continue with Keycloak.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/8_Login with your keycloak account.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/8_Login with your keycloak account.jpg new file mode 100644 index 0000000..49bacf6 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/8_Login with your keycloak account.jpg differ diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/9_Just hit continue here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/9_Just hit continue here.jpg new file mode 100644 index 0000000..25bca86 Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/9_Just hit continue here.jpg differ diff --git a/media/onboarding/vaultwarden/step1_website/1_Accept the VaultWarden email invite.png b/media/onboarding/vaultwarden/step1_website/1_Accept the VaultWarden email invite.png new file mode 100644 index 0000000..72fe5f3 Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/1_Accept the VaultWarden email invite.png differ diff --git a/media/onboarding/vaultwarden/step1_website/2_Create a VaultWarden master password.png b/media/onboarding/vaultwarden/step1_website/2_Create a VaultWarden master password.png new file mode 100644 index 0000000..b6cd911 Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/2_Create a VaultWarden master password.png differ diff --git a/media/onboarding/vaultwarden/step1_website/3_Login to VaultWarden.png b/media/onboarding/vaultwarden/step1_website/3_Login to VaultWarden.png new file mode 100644 index 0000000..80b8b3e Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/3_Login to VaultWarden.png differ diff --git a/media/onboarding/vaultwarden/step1_website/4_Use your new master password.png b/media/onboarding/vaultwarden/step1_website/4_Use your new master password.png new file mode 100644 index 0000000..fa60c4b Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/4_Use your new master password.png differ diff --git a/media/onboarding/vaultwarden/step1_website/6_Store your temporary keycloak password - TEMPORARY - you WILL change this.png b/media/onboarding/vaultwarden/step1_website/6_Store your temporary keycloak password - TEMPORARY - you WILL change this.png new file mode 100644 index 0000000..6ac4c99 Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/6_Store your temporary keycloak password - TEMPORARY - you WILL change this.png differ diff --git a/media/onboarding/vaultwarden/step2_browser_extension/1_Go to your browsers store page and install the BITWARDEN addon or extension.png b/media/onboarding/vaultwarden/step2_browser_extension/1_Go to your browsers store page and install the BITWARDEN addon or extension.png new file mode 100644 index 0000000..c3c722e Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/1_Go to your browsers store page and install the BITWARDEN addon or extension.png differ diff --git a/media/onboarding/vaultwarden/step2_browser_extension/2_Open the addon and go to the server configuration - note the addon may initially be inside your addon folder.png b/media/onboarding/vaultwarden/step2_browser_extension/2_Open the addon and go to the server configuration - note the addon may initially be inside your addon folder.png new file mode 100644 index 0000000..c058cad Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/2_Open the addon and go to the server configuration - note the addon may initially be inside your addon folder.png differ diff --git a/media/onboarding/vaultwarden/step2_browser_extension/3_Select the self-hosted option.png b/media/onboarding/vaultwarden/step2_browser_extension/3_Select the self-hosted option.png new file mode 100644 index 0000000..4e01b45 Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/3_Select the self-hosted option.png differ diff --git a/media/onboarding/vaultwarden/step2_browser_extension/4_Enter the server address - vault.bstein.dev and save settings.png b/media/onboarding/vaultwarden/step2_browser_extension/4_Enter the server address - vault.bstein.dev and save settings.png new file mode 100644 index 0000000..1f27083 Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/4_Enter the server address - vault.bstein.dev and save settings.png differ diff --git a/media/onboarding/vaultwarden/step2_browser_extension/5_Enter your account email.png b/media/onboarding/vaultwarden/step2_browser_extension/5_Enter your account email.png new file mode 100644 index 0000000..835dca8 Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/5_Enter your account email.png differ diff --git a/media/onboarding/vaultwarden/step2_browser_extension/6_Enter your master password.png b/media/onboarding/vaultwarden/step2_browser_extension/6_Enter your master password.png new file mode 100644 index 0000000..ec20e94 Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/6_Enter your master password.png differ diff --git a/media/onboarding/vaultwarden/step2_browser_extension/7_You now have auto complete in the browser for your passwords - Do Not use the password manager of your browswer.png b/media/onboarding/vaultwarden/step2_browser_extension/7_You now have auto complete in the browser for your passwords - Do Not use the password manager of your browswer.png new file mode 100644 index 0000000..2f2b3d3 Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/7_You now have auto complete in the browser for your passwords - Do Not use the password manager of your browswer.png differ diff --git a/media/onboarding/vaultwarden/step3_mobile_app/1_Download BITWARDEN mobile app and change server settings.jpg b/media/onboarding/vaultwarden/step3_mobile_app/1_Download BITWARDEN mobile app and change server settings.jpg new file mode 100644 index 0000000..b7f77c2 Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/1_Download BITWARDEN mobile app and change server settings.jpg differ diff --git a/media/onboarding/vaultwarden/step3_mobile_app/2_Choose the self-hosted server option.jpg b/media/onboarding/vaultwarden/step3_mobile_app/2_Choose the self-hosted server option.jpg new file mode 100644 index 0000000..3459e59 Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/2_Choose the self-hosted server option.jpg differ diff --git a/media/onboarding/vaultwarden/step3_mobile_app/3_Change the server url to vault.bstein.dev and hit continue.jpg b/media/onboarding/vaultwarden/step3_mobile_app/3_Change the server url to vault.bstein.dev and hit continue.jpg new file mode 100644 index 0000000..efc0a9b Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/3_Change the server url to vault.bstein.dev and hit continue.jpg differ diff --git a/media/onboarding/vaultwarden/step3_mobile_app/4_Enter you account email address.jpg b/media/onboarding/vaultwarden/step3_mobile_app/4_Enter you account email address.jpg new file mode 100644 index 0000000..4f37112 Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/4_Enter you account email address.jpg differ diff --git a/media/onboarding/vaultwarden/step3_mobile_app/5_Enter settings.jpg b/media/onboarding/vaultwarden/step3_mobile_app/5_Enter settings.jpg new file mode 100644 index 0000000..53106a0 Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/5_Enter settings.jpg differ diff --git a/media/onboarding/vaultwarden/step3_mobile_app/5_Enter your master password.jpg b/media/onboarding/vaultwarden/step3_mobile_app/5_Enter your master password.jpg new file mode 100644 index 0000000..b7a4c52 Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/5_Enter your master password.jpg differ diff --git a/media/onboarding/vaultwarden/step3_mobile_app/6_Enter Account Security.jpg b/media/onboarding/vaultwarden/step3_mobile_app/6_Enter Account Security.jpg new file mode 100644 index 0000000..b604110 Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/6_Enter Account Security.jpg differ diff --git a/media/onboarding/vaultwarden/step3_mobile_app/7_Turn on biometric unlock to make your life easier.jpg b/media/onboarding/vaultwarden/step3_mobile_app/7_Turn on biometric unlock to make your life easier.jpg new file mode 100644 index 0000000..9f6e04a Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/7_Turn on biometric unlock to make your life easier.jpg differ diff --git a/media/onboarding/wger/step2_mobile_app/1_Select custom server.jpg b/media/onboarding/wger/step2_mobile_app/1_Select custom server.jpg new file mode 100644 index 0000000..c19165a Binary files /dev/null and b/media/onboarding/wger/step2_mobile_app/1_Select custom server.jpg differ diff --git a/media/onboarding/wger/step2_mobile_app/2_Search for live.bstein.dev and connect with your username and password.jpg b/media/onboarding/wger/step2_mobile_app/2_Search for live.bstein.dev and connect with your username and password.jpg new file mode 100644 index 0000000..a51612b Binary files /dev/null and b/media/onboarding/wger/step2_mobile_app/2_Search for live.bstein.dev and connect with your username and password.jpg differ