From c117e10f4814f630191e084e2843de67be3ba844 Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Fri, 20 Feb 2026 10:25:45 +0900 Subject: [PATCH 01/29] ci: enforce flutter/biome format checks and fix front lint violations --- .gitea/workflows/code_check.yml | 8 +- .../routes/GlobalUserGroupListPage.tsx | 8 +- .../routes/TenantUserGroupsTab.tsx | 44 +++- .../routes/UserGroupDetailPage.tsx | 88 ++++++-- adminfront/src/lib/auth.ts | 3 +- .../components/common/LanguageSelector.tsx | 8 +- devfront/src/components/ui/badge.tsx | 3 +- devfront/src/components/ui/button.tsx | 3 +- devfront/src/components/ui/input.tsx | 3 +- devfront/src/components/ui/textarea.tsx | 3 +- devfront/src/features/auth/LoginPage.tsx | 26 +-- devfront/src/features/clients/ClientsPage.tsx | 6 +- devfront/src/index.css | 3 +- devfront/src/lib/auth.ts | 3 +- userfront/lib/core/i18n/locale_gate.dart | 8 +- userfront/lib/core/i18n/locale_utils.dart | 2 +- .../lib/core/services/auth_proxy_service.dart | 15 +- .../lib/core/widgets/language_selector.dart | 5 +- .../auth/presentation/error_screen.dart | 43 +--- .../presentation/forgot_password_screen.dart | 33 +-- .../auth/presentation/login_screen.dart | 30 ++- .../presentation/login_success_screen.dart | 14 +- .../auth/presentation/qr_scan_screen.dart | 4 +- .../presentation/reset_password_screen.dart | 70 ++----- .../auth/presentation/signup_screen.dart | 182 ++++------------- .../dashboard/domain/dashboard_providers.dart | 4 +- .../presentation/dashboard_screen.dart | 159 ++++----------- .../data/repositories/profile_repository.dart | 20 +- .../presentation/pages/profile_page.dart | 156 +++------------ userfront/lib/i18n_data.dart | 189 ++++++++++++------ userfront/lib/main.dart | 38 ++-- 31 files changed, 472 insertions(+), 709 deletions(-) diff --git a/.gitea/workflows/code_check.yml b/.gitea/workflows/code_check.yml index 8f188d20..3e802d76 100644 --- a/.gitea/workflows/code_check.yml +++ b/.gitea/workflows/code_check.yml @@ -75,8 +75,8 @@ jobs: - name: Biome check adminfront (lint + format) run: | cd adminfront - npx biome lint . - npx biome format . --check + npx biome check . --formatter-enabled=false --organize-imports-enabled=false + npx biome check . --linter-enabled=false --organize-imports-enabled=false - name: Install devfront dependencies run: | @@ -86,8 +86,8 @@ jobs: - name: Biome check devfront (lint + format) run: | cd devfront - npx biome lint . - npx biome format . --check + npx biome check . --formatter-enabled=false --organize-imports-enabled=false + npx biome check . --linter-enabled=false --organize-imports-enabled=false - name: Lint Go backend uses: golangci/golangci-lint-action@v6 diff --git a/adminfront/src/features/user-groups/routes/GlobalUserGroupListPage.tsx b/adminfront/src/features/user-groups/routes/GlobalUserGroupListPage.tsx index 193578ee..97fd27d8 100644 --- a/adminfront/src/features/user-groups/routes/GlobalUserGroupListPage.tsx +++ b/adminfront/src/features/user-groups/routes/GlobalUserGroupListPage.tsx @@ -19,7 +19,11 @@ import { TableHeader, TableRow, } from "../../../components/ui/table"; -import { fetchGroups, fetchTenants } from "../../../lib/adminApi"; +import { + fetchGroups, + fetchTenants, + type TenantSummary, +} from "../../../lib/adminApi"; export default function GlobalUserGroupListPage() { const { data: tenantList, isLoading: isTenantsLoading } = useQuery({ @@ -51,7 +55,7 @@ export default function GlobalUserGroupListPage() { ); } -function TenantGroupCard({ tenant }: { tenant: any }) { +function TenantGroupCard({ tenant }: { tenant: TenantSummary }) { const { data: groups, isLoading } = useQuery({ queryKey: ["tenant-user-groups", tenant.id], queryFn: () => fetchGroups(tenant.id), diff --git a/adminfront/src/features/user-groups/routes/TenantUserGroupsTab.tsx b/adminfront/src/features/user-groups/routes/TenantUserGroupsTab.tsx index 2f980a25..79dbc2e6 100644 --- a/adminfront/src/features/user-groups/routes/TenantUserGroupsTab.tsx +++ b/adminfront/src/features/user-groups/routes/TenantUserGroupsTab.tsx @@ -31,6 +31,21 @@ import { } from "../../../components/ui/table"; import { createGroup, deleteGroup, fetchGroups } from "../../../lib/adminApi"; +function getErrorMessage(error: unknown, fallback: string): string { + if (error instanceof Error && error.message) { + return error.message; + } + if ( + typeof error === "object" && + error !== null && + "message" in error && + typeof (error as { message?: unknown }).message === "string" + ) { + return (error as { message: string }).message; + } + return fallback; +} + export function TenantUserGroupsTab() { const { tenantId } = useParams<{ tenantId: string }>(); const queryClient = useQueryClient(); @@ -40,13 +55,25 @@ export function TenantUserGroupsTab() { const { data: groups, isLoading } = useQuery({ queryKey: ["tenant-user-groups", tenantId], - queryFn: () => fetchGroups(tenantId!), + queryFn: () => { + if (!tenantId) { + throw new Error("tenantId is required"); + } + return fetchGroups(tenantId); + }, enabled: !!tenantId, }); const createMutation = useMutation({ - mutationFn: () => - createGroup(tenantId!, { name: newGroupName, description: newGroupDesc }), + mutationFn: () => { + if (!tenantId) { + throw new Error("tenantId is required"); + } + return createGroup(tenantId, { + name: newGroupName, + description: newGroupDesc, + }); + }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["tenant-user-groups", tenantId], @@ -56,13 +83,18 @@ export function TenantUserGroupsTab() { setNewGroupDesc(""); alert("User group created successfully"); }, - onError: (error: any) => { - alert(error.message || "Failed to create user group"); + onError: (error: unknown) => { + alert(getErrorMessage(error, "Failed to create user group")); }, }); const deleteMutation = useMutation({ - mutationFn: (groupId: string) => deleteGroup(tenantId!, groupId), + mutationFn: (groupId: string) => { + if (!tenantId) { + throw new Error("tenantId is required"); + } + return deleteGroup(tenantId, groupId); + }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["tenant-user-groups", tenantId], diff --git a/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx b/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx index 0ecc7b72..e06cecd9 100644 --- a/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx +++ b/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx @@ -48,6 +48,28 @@ import { removeGroupRole, } from "../../../lib/adminApi"; +function getErrorMessage(error: unknown, fallback: string): string { + if (typeof error === "object" && error !== null) { + const response = (error as { response?: { data?: { error?: unknown } } }) + .response; + const responseError = response?.data?.error; + if (typeof responseError === "string" && responseError.length > 0) { + return responseError; + } + + const message = (error as { message?: unknown }).message; + if (typeof message === "string" && message.length > 0) { + return message; + } + } + + if (error instanceof Error && error.message) { + return error.message; + } + + return fallback; +} + export function UserGroupDetailPage() { const { tenantId, id } = useParams<{ tenantId: string; id: string }>(); const queryClient = useQueryClient(); @@ -67,7 +89,12 @@ export function UserGroupDetailPage() { error, } = useQuery({ queryKey: ["user-group-detail", id], - queryFn: () => fetchGroup(tenantId!, id!), + queryFn: () => { + if (!tenantId || !id) { + throw new Error("tenantId and id are required"); + } + return fetchGroup(tenantId, id); + }, enabled: !!id && !!tenantId, retry: false, }); @@ -75,7 +102,12 @@ export function UserGroupDetailPage() { // Fetch assigned roles const { data: groupRoles, isLoading: isRolesLoading } = useQuery({ queryKey: ["user-group-roles", id], - queryFn: () => fetchGroupRoles(tenantId!, id!), + queryFn: () => { + if (!tenantId || !id) { + throw new Error("tenantId and id are required"); + } + return fetchGroupRoles(tenantId, id); + }, enabled: !!id && !!tenantId, }); @@ -94,20 +126,30 @@ export function UserGroupDetailPage() { }); const addMemberMutation = useMutation({ - mutationFn: (userId: string) => addGroupMember(tenantId!, id!, userId), + mutationFn: (userId: string) => { + if (!tenantId || !id) { + throw new Error("tenantId and id are required"); + } + return addGroupMember(tenantId, id, userId); + }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["user-group-detail", id] }); setIsAddMemberOpen(false); setSelectedUserId(""); alert("Member added successfully"); }, - onError: (error: any) => { - alert(error.message || "Failed to add member"); + onError: (error: unknown) => { + alert(getErrorMessage(error, "Failed to add member")); }, }); const removeMemberMutation = useMutation({ - mutationFn: (userId: string) => removeGroupMember(tenantId!, id!, userId), + mutationFn: (userId: string) => { + if (!tenantId || !id) { + throw new Error("tenantId and id are required"); + } + return removeGroupMember(tenantId, id, userId); + }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["user-group-detail", id] }); alert("Member removed successfully"); @@ -115,21 +157,34 @@ export function UserGroupDetailPage() { }); const assignRoleMutation = useMutation({ - mutationFn: () => - assignGroupRole(tenantId!, id!, selectedTargetTenantId, selectedRelation), + mutationFn: () => { + if (!tenantId || !id) { + throw new Error("tenantId and id are required"); + } + return assignGroupRole( + tenantId, + id, + selectedTargetTenantId, + selectedRelation, + ); + }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["user-group-roles", id] }); setIsAddRoleOpen(false); alert(`Role '${selectedRelation}' assigned successfully`); }, - onError: (error: any) => { - alert(error.message || "Failed to assign role"); + onError: (error: unknown) => { + alert(getErrorMessage(error, "Failed to assign role")); }, }); const removeRoleMutation = useMutation({ - mutationFn: (role: { targetTenantId: string; relation: string }) => - removeGroupRole(tenantId!, id!, role.targetTenantId, role.relation), + mutationFn: (role: { targetTenantId: string; relation: string }) => { + if (!tenantId || !id) { + throw new Error("tenantId and id are required"); + } + return removeGroupRole(tenantId, id, role.targetTenantId, role.relation); + }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["user-group-roles", id] }); alert("Role removed successfully"); @@ -139,7 +194,7 @@ export function UserGroupDetailPage() { if (isGroupLoading) return (
-
+
Loading group details... @@ -153,12 +208,7 @@ export function UserGroupDetailPage() { Could not load group
-

- Error:{" "} - {(error as any)?.response?.data?.error || - (error as any)?.message || - "Not found"} -

+

Error: {getErrorMessage(error, "Not found")}

Path: /admin/tenants/{tenantId}/user-groups/{id}

diff --git a/adminfront/src/lib/auth.ts b/adminfront/src/lib/auth.ts index 5d1df7d8..8f46d964 100644 --- a/adminfront/src/lib/auth.ts +++ b/adminfront/src/lib/auth.ts @@ -2,7 +2,8 @@ import { UserManager, WebStorageStateStore } from "oidc-client-ts"; import type { AuthProviderProps } from "react-oidc-context"; export const oidcConfig: AuthProviderProps = { - authority: import.meta.env.VITE_OIDC_AUTHORITY || "http://localhost:5000/oidc", // Gateway Proxy URL + authority: + import.meta.env.VITE_OIDC_AUTHORITY || "http://localhost:5000/oidc", // Gateway Proxy URL client_id: import.meta.env.VITE_OIDC_CLIENT_ID || "adminfront", redirect_uri: `${window.location.origin}/auth/callback`, response_type: "code", diff --git a/devfront/src/components/common/LanguageSelector.tsx b/devfront/src/components/common/LanguageSelector.tsx index fe77df72..7f905cd0 100644 --- a/devfront/src/components/common/LanguageSelector.tsx +++ b/devfront/src/components/common/LanguageSelector.tsx @@ -44,12 +44,8 @@ function LanguageSelector() { className="rounded-full border border-border bg-transparent px-3 py-2 text-sm text-muted-foreground transition hover:bg-muted/20" aria-label={t("ui.common.language", "언어")} > - - + + ); } diff --git a/devfront/src/components/ui/badge.tsx b/devfront/src/components/ui/badge.tsx index 8f9d0789..8ef586fd 100644 --- a/devfront/src/components/ui/badge.tsx +++ b/devfront/src/components/ui/badge.tsx @@ -26,8 +26,7 @@ const badgeVariants = cva( ); export interface BadgeProps - extends - React.HTMLAttributes, + extends React.HTMLAttributes, VariantProps {} function Badge({ className, variant, ...props }: BadgeProps) { diff --git a/devfront/src/components/ui/button.tsx b/devfront/src/components/ui/button.tsx index 91d21e58..ee1a84b4 100644 --- a/devfront/src/components/ui/button.tsx +++ b/devfront/src/components/ui/button.tsx @@ -34,8 +34,7 @@ const buttonVariants = cva( ); export interface ButtonProps - extends - React.ButtonHTMLAttributes, + extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean; } diff --git a/devfront/src/components/ui/input.tsx b/devfront/src/components/ui/input.tsx index eb2a9c6e..41955477 100644 --- a/devfront/src/components/ui/input.tsx +++ b/devfront/src/components/ui/input.tsx @@ -1,7 +1,8 @@ import * as React from "react"; import { cn } from "../../lib/utils"; -export interface InputProps extends React.InputHTMLAttributes {} +export interface InputProps + extends React.InputHTMLAttributes {} const Input = React.forwardRef( ({ className, type, ...props }, ref) => { diff --git a/devfront/src/components/ui/textarea.tsx b/devfront/src/components/ui/textarea.tsx index 78dbae91..80f0abc2 100644 --- a/devfront/src/components/ui/textarea.tsx +++ b/devfront/src/components/ui/textarea.tsx @@ -1,7 +1,8 @@ import * as React from "react"; import { cn } from "../../lib/utils"; -export interface TextareaProps extends React.TextareaHTMLAttributes {} +export interface TextareaProps + extends React.TextareaHTMLAttributes {} const Textarea = React.forwardRef( ({ className, ...props }, ref) => { diff --git a/devfront/src/features/auth/LoginPage.tsx b/devfront/src/features/auth/LoginPage.tsx index 53579bd0..30ee21c9 100644 --- a/devfront/src/features/auth/LoginPage.tsx +++ b/devfront/src/features/auth/LoginPage.tsx @@ -35,18 +35,18 @@ function LoginPage() { - - 개발자 포털 로그인 + + 개발자 포털 로그인 Baron 통합 인증(SSO)을 통해 개발자 포털에 접속합니다. - - +

- 개발자 포털 세션은 브라우저 정책에 따라 유지됩니다.
+ 개발자 포털 세션은 브라우저 정책에 따라 유지됩니다. +
민감한 작업 시 재인증을 요구할 수 있습니다.

-
-
-
+
+
+

- 인증 정보가 없거나 로그인이 되지 않는 경우
+ 인증 정보가 없거나 로그인이 되지 않는 경우 +
시스템 관리자에게 문의하세요.

diff --git a/devfront/src/features/clients/ClientsPage.tsx b/devfront/src/features/clients/ClientsPage.tsx index 39197e21..d1ddffe8 100644 --- a/devfront/src/features/clients/ClientsPage.tsx +++ b/devfront/src/features/clients/ClientsPage.tsx @@ -208,11 +208,7 @@ function ClientsPage() {
{item.value} { Future _applyLocale() async { final normalized = normalizeLocaleCode(widget.localeCode); LocaleStorage.write(normalized); - webWindow.setTitle( - tr('ui.userfront.app_title'), - ); + webWindow.setTitle(tr('ui.userfront.app_title')); if (context.locale.languageCode == normalized) { return; } await context.setLocale(Locale(normalized)); - webWindow.setTitle( - tr('ui.userfront.app_title'), - ); + webWindow.setTitle(tr('ui.userfront.app_title')); } @override diff --git a/userfront/lib/core/i18n/locale_utils.dart b/userfront/lib/core/i18n/locale_utils.dart index 926524e8..5d403bcf 100644 --- a/userfront/lib/core/i18n/locale_utils.dart +++ b/userfront/lib/core/i18n/locale_utils.dart @@ -76,7 +76,7 @@ String buildLocalizedPath(String localeCode, Uri uri) { } } final newPath = '/${[localeCode, ...restSegments].join('/')}'; - + // Return only the path and query part to avoid GoRouter confusion with full URLs final newUri = uri.replace(path: newPath); String result = newUri.path; diff --git a/userfront/lib/core/services/auth_proxy_service.dart b/userfront/lib/core/services/auth_proxy_service.dart index 29e78ede..3abe60bd 100644 --- a/userfront/lib/core/services/auth_proxy_service.dart +++ b/userfront/lib/core/services/auth_proxy_service.dart @@ -299,10 +299,7 @@ class AuthProxyService { } else { final errorBody = jsonDecode(response.body); throw Exception( - errorBody['error'] ?? - tr( - 'err.userfront.auth_proxy.consent_fetch', - ), + errorBody['error'] ?? tr('err.userfront.auth_proxy.consent_fetch'), ); } } finally { @@ -333,10 +330,7 @@ class AuthProxyService { } else { final errorBody = jsonDecode(response.body); throw Exception( - errorBody['error'] ?? - tr( - 'err.userfront.auth_proxy.consent_accept', - ), + errorBody['error'] ?? tr('err.userfront.auth_proxy.consent_accept'), ); } } finally { @@ -363,10 +357,7 @@ class AuthProxyService { } else { final errorBody = jsonDecode(response.body); throw Exception( - errorBody['error'] ?? - tr( - 'err.userfront.auth_proxy.consent_reject', - ), + errorBody['error'] ?? tr('err.userfront.auth_proxy.consent_reject'), ); } } finally { diff --git a/userfront/lib/core/widgets/language_selector.dart b/userfront/lib/core/widgets/language_selector.dart index 8649e403..27520d84 100644 --- a/userfront/lib/core/widgets/language_selector.dart +++ b/userfront/lib/core/widgets/language_selector.dart @@ -15,10 +15,7 @@ class LanguageSelector extends StatelessWidget { Widget build(BuildContext context) { final current = context.locale.languageCode; final items = [ - DropdownMenuItem( - value: 'ko', - child: Text(tr('ui.common.language_ko')), - ), + DropdownMenuItem(value: 'ko', child: Text(tr('ui.common.language_ko'))), DropdownMenuItem( value: 'en', child: Text(tr('ui.common.language_en', fallback: 'English')), diff --git a/userfront/lib/features/auth/presentation/error_screen.dart b/userfront/lib/features/auth/presentation/error_screen.dart index 0caada68..d86d1092 100644 --- a/userfront/lib/features/auth/presentation/error_screen.dart +++ b/userfront/lib/features/auth/presentation/error_screen.dart @@ -39,9 +39,7 @@ class ErrorScreen extends StatelessWidget { 'msg.userfront.error.title_with_code', params: {'code': normalizedCode}, ) - : tr( - 'msg.userfront.error.title_generic', - )); + : tr('msg.userfront.error.title_generic')); final detail = isProd ? (isInternalWhitelisted ? tr( @@ -51,23 +49,16 @@ class ErrorScreen extends StatelessWidget { : (isOryBypass ? tr( 'msg.userfront.error.ory.$normalizedCode', - fallback: - (description?.isNotEmpty == true) - ? description - : tr('msg.userfront.error.detail_request'), + fallback: (description?.isNotEmpty == true) + ? description + : tr('msg.userfront.error.detail_request'), ) - : tr( - 'msg.userfront.error.detail_contact', - ))) + : tr('msg.userfront.error.detail_contact'))) : ((description?.isNotEmpty == true) ? description! : (hasCode - ? tr( - 'msg.userfront.error.detail_generic', - ) - : tr( - 'msg.userfront.error.detail_request', - ))); + ? tr('msg.userfront.error.detail_generic') + : tr('msg.userfront.error.detail_request'))); return Scaffold( backgroundColor: const Color(0xFFF7F8FA), @@ -104,10 +95,7 @@ class ErrorScreen extends StatelessWidget { ), const SizedBox(height: 12), Text( - tr( - 'msg.userfront.error.type', - params: {'type': errorType}, - ), + tr('msg.userfront.error.type', params: {'type': errorType}), style: theme.textTheme.bodySmall?.copyWith( color: const Color(0xFF6B7280), ), @@ -115,10 +103,7 @@ class ErrorScreen extends StatelessWidget { if (errorId != null && errorId!.isNotEmpty) ...[ const SizedBox(height: 12), Text( - tr( - 'msg.userfront.error.id', - params: {'id': errorId!}, - ), + tr('msg.userfront.error.id', params: {'id': errorId!}), style: theme.textTheme.bodySmall?.copyWith( color: const Color(0xFF6B7280), ), @@ -142,11 +127,7 @@ class ErrorScreen extends StatelessWidget { borderRadius: BorderRadius.circular(10), ), ), - child: Text( - tr( - 'ui.userfront.error.go_login', - ), - ), + child: Text(tr('ui.userfront.error.go_login')), ), OutlinedButton( onPressed: () => context.go('/'), @@ -161,9 +142,7 @@ class ErrorScreen extends StatelessWidget { borderRadius: BorderRadius.circular(10), ), ), - child: Text( - tr('ui.userfront.error.go_home'), - ), + child: Text(tr('ui.userfront.error.go_home')), ), ], ), diff --git a/userfront/lib/features/auth/presentation/forgot_password_screen.dart b/userfront/lib/features/auth/presentation/forgot_password_screen.dart index 1ad9f96e..1cca15c8 100644 --- a/userfront/lib/features/auth/presentation/forgot_password_screen.dart +++ b/userfront/lib/features/auth/presentation/forgot_password_screen.dart @@ -25,11 +25,7 @@ class _ForgotPasswordScreenState extends State { Future _handlePasswordReset() async { final input = _loginIdController.text.trim(); if (input.isEmpty) { - _showError( - tr( - 'msg.userfront.forgot.input_required', - ), - ); + _showError(tr('msg.userfront.forgot.input_required')); return; } @@ -52,11 +48,7 @@ class _ForgotPasswordScreenState extends State { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text( - tr( - 'msg.userfront.forgot.sent', - ), - ), + content: Text(tr('msg.userfront.forgot.sent')), backgroundColor: Colors.green, ), ); @@ -65,10 +57,7 @@ class _ForgotPasswordScreenState extends State { } catch (e) { if (mounted) { _showError( - tr( - 'msg.userfront.forgot.error', - params: {'error': e.toString()}, - ), + tr('msg.userfront.forgot.error', params: {'error': e.toString()}), ); } } finally { @@ -133,9 +122,7 @@ class _ForgotPasswordScreenState extends State { const SizedBox(width: 8), Expanded( child: Text( - tr( - 'msg.userfront.forgot.dry_send', - ), + tr('msg.userfront.forgot.dry_send'), style: const TextStyle( color: Color(0xFF8A6D3B), fontSize: 12, @@ -148,9 +135,7 @@ class _ForgotPasswordScreenState extends State { ], const SizedBox(height: 16), Text( - tr( - 'msg.userfront.forgot.description', - ), + tr('msg.userfront.forgot.description'), textAlign: TextAlign.center, style: const TextStyle(color: Colors.grey), ), @@ -158,9 +143,7 @@ class _ForgotPasswordScreenState extends State { TextField( controller: _loginIdController, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.forgot.input_label', - ), + labelText: tr('ui.userfront.forgot.input_label'), border: const OutlineInputBorder(), prefixIcon: const Icon(Icons.person_outline), ), @@ -181,9 +164,7 @@ class _ForgotPasswordScreenState extends State { color: Colors.white, ), ) - : Text( - tr('ui.userfront.forgot.submit'), - ), + : Text(tr('ui.userfront.forgot.submit')), ), ], ), diff --git a/userfront/lib/features/auth/presentation/login_screen.dart b/userfront/lib/features/auth/presentation/login_screen.dart index 20e4b4ba..bddb8515 100644 --- a/userfront/lib/features/auth/presentation/login_screen.dart +++ b/userfront/lib/features/auth/presentation/login_screen.dart @@ -900,8 +900,7 @@ class _LoginScreenState extends ConsumerState _onLoginSuccess(jwt, provider: provider, redirectTo: redirectTo); } else if (redirectTo != null && redirectTo.isNotEmpty) { webWindow.redirectTo(redirectTo); - } else { - } + } else {} } catch (e) { if (e.toString().contains("User not registered")) { _showUnregisteredDialog(); @@ -1124,11 +1123,14 @@ class _LoginScreenState extends ConsumerState } } - Future _onLoginSuccess(String token, {String? provider, String? redirectTo}) async { - + Future _onLoginSuccess( + String token, { + String? provider, + String? redirectTo, + }) async { try { if (!mounted) { - return; + return; } // [Priority 1] Immediate External Redirection @@ -1139,7 +1141,7 @@ class _LoginScreenState extends ConsumerState } catch (stErr) { // ignore } - + webWindow.redirectTo(redirectTo); // Removed await as it's void return; } @@ -1150,24 +1152,19 @@ class _LoginScreenState extends ConsumerState // Save token first, it's needed for acceptance final providerName = provider ?? AuthTokenStore.getProvider(); AuthTokenStore.setToken(token, provider: providerName); - + final res = await AuthProxyService.acceptOidcLogin( _loginChallenge!, token: token, ); final nextRedirectTo = res['redirectTo'] as String?; - + if (nextRedirectTo != null && nextRedirectTo.isNotEmpty) { webWindow.redirectTo(nextRedirectTo); // Removed await return; - } else { - } + } else {} } catch (e) { - _showError( - tr( - 'msg.userfront.login.oidc_failed', - ), - ); + _showError(tr('msg.userfront.login.oidc_failed')); return; } } @@ -1188,7 +1185,8 @@ class _LoginScreenState extends ConsumerState final uri = Uri.base; final redirectParam = - uri.queryParameters['redirect_uri'] ?? uri.queryParameters['redirect_url']; + uri.queryParameters['redirect_uri'] ?? + uri.queryParameters['redirect_url']; final hasRedirectParam = redirectParam != null && redirectParam.isNotEmpty; diff --git a/userfront/lib/features/auth/presentation/login_success_screen.dart b/userfront/lib/features/auth/presentation/login_success_screen.dart index d4ad69de..97b7b467 100644 --- a/userfront/lib/features/auth/presentation/login_success_screen.dart +++ b/userfront/lib/features/auth/presentation/login_success_screen.dart @@ -26,9 +26,7 @@ class LoginSuccessScreen extends StatelessWidget { ), const SizedBox(height: 16), Text( - tr( - 'msg.userfront.login_success.subtitle', - ), + tr('msg.userfront.login_success.subtitle'), textAlign: TextAlign.center, style: const TextStyle(color: Colors.grey, fontSize: 16), ), @@ -40,11 +38,7 @@ class LoginSuccessScreen extends StatelessWidget { context.push('/scan'); }, icon: const Icon(Icons.camera_alt, size: 28), - label: Text( - tr( - 'ui.userfront.login_success.qr', - ), - ), + label: Text(tr('ui.userfront.login_success.qr')), style: FilledButton.styleFrom( minimumSize: const Size.fromHeight(80), // 버튼 높이를 더 크게 backgroundColor: Colors.blue.shade700, @@ -63,9 +57,7 @@ class LoginSuccessScreen extends StatelessWidget { context.go('/'); }, child: Text( - tr( - 'ui.userfront.login_success.later', - ), + tr('ui.userfront.login_success.later'), style: const TextStyle(color: Colors.grey), ), ), diff --git a/userfront/lib/features/auth/presentation/qr_scan_screen.dart b/userfront/lib/features/auth/presentation/qr_scan_screen.dart index b9c83025..a13cf54f 100644 --- a/userfront/lib/features/auth/presentation/qr_scan_screen.dart +++ b/userfront/lib/features/auth/presentation/qr_scan_screen.dart @@ -21,7 +21,9 @@ class _QRScanScreenState extends State { ), ), body: const Center( - child: Text('QR Scanner is temporarily disabled for WASM build stability.'), + child: Text( + 'QR Scanner is temporarily disabled for WASM build stability.', + ), ), ); } diff --git a/userfront/lib/features/auth/presentation/reset_password_screen.dart b/userfront/lib/features/auth/presentation/reset_password_screen.dart index 2521bb79..6ecc4513 100644 --- a/userfront/lib/features/auth/presentation/reset_password_screen.dart +++ b/userfront/lib/features/auth/presentation/reset_password_screen.dart @@ -69,11 +69,7 @@ class _ResetPasswordScreenState extends State { if (_formKey.currentState?.validate() != true) return; if ((_loginId == null || _loginId!.isEmpty) && (_token == null || _token!.isEmpty)) { - _showError( - tr( - 'msg.userfront.reset.invalid_link', - ), - ); + _showError(tr('msg.userfront.reset.invalid_link')); return; } @@ -89,11 +85,7 @@ class _ResetPasswordScreenState extends State { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text( - tr( - 'msg.userfront.reset.success', - ), - ), + content: Text(tr('msg.userfront.reset.success')), backgroundColor: Colors.green, ), ); @@ -123,9 +115,7 @@ class _ResetPasswordScreenState extends State { String _buildPolicyDescription() { if (_isPolicyLoading) { - return tr( - 'msg.userfront.reset.policy_loading', - ); + return tr('msg.userfront.reset.policy_loading'); } final minLength = (_policy?['minLength'] as int?) ?? 12; final minTypes = (_policy?['minCharacterTypes'] as int?) ?? 0; @@ -149,22 +139,16 @@ class _ResetPasswordScreenState extends State { ); } if (requiresLower) { - parts.add( - tr('msg.userfront.reset.policy.lowercase'), - ); + parts.add(tr('msg.userfront.reset.policy.lowercase')); } if (requiresUpper) { - parts.add( - tr('msg.userfront.reset.policy.uppercase'), - ); + parts.add(tr('msg.userfront.reset.policy.uppercase')); } if (requiresNumber) { parts.add(tr('msg.userfront.reset.policy.number')); } if (requiresSymbol) { - parts.add( - tr('msg.userfront.reset.policy.symbol'), - ); + parts.add(tr('msg.userfront.reset.policy.symbol')); } return parts.join(", "); @@ -192,9 +176,7 @@ class _ResetPasswordScreenState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( - tr( - 'ui.userfront.reset.subtitle', - ), + tr('ui.userfront.reset.subtitle'), style: TextStyle( fontSize: 28, fontWeight: FontWeight.bold, @@ -212,9 +194,7 @@ class _ResetPasswordScreenState extends State { controller: _passwordController, obscureText: _isPasswordObscured, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.reset.new_password', - ), + labelText: tr('ui.userfront.reset.new_password'), border: const OutlineInputBorder(), prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( @@ -265,25 +245,17 @@ class _ResetPasswordScreenState extends State { } if ((_policy?['lowercase'] ?? true) && !hasLower) { - return tr( - 'msg.userfront.reset.error.lowercase', - ); + return tr('msg.userfront.reset.error.lowercase'); } if ((_policy?['uppercase'] ?? false) && !hasUpper) { - return tr( - 'msg.userfront.reset.error.uppercase', - ); + return tr('msg.userfront.reset.error.uppercase'); } if ((_policy?['number'] ?? true) && !hasNumber) { - return tr( - 'msg.userfront.reset.error.number', - ); + return tr('msg.userfront.reset.error.number'); } if ((_policy?['nonAlphanumeric'] ?? true) && !hasSymbol) { - return tr( - 'msg.userfront.reset.error.symbol', - ); + return tr('msg.userfront.reset.error.symbol'); } return null; }, @@ -293,9 +265,7 @@ class _ResetPasswordScreenState extends State { controller: _confirmPasswordController, obscureText: _isConfirmPasswordObscured, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.reset.confirm_password', - ), + labelText: tr('ui.userfront.reset.confirm_password'), border: const OutlineInputBorder(), prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( @@ -314,9 +284,7 @@ class _ResetPasswordScreenState extends State { ), validator: (value) { if (value != _passwordController.text) { - return tr( - 'msg.userfront.reset.error.mismatch', - ); + return tr('msg.userfront.reset.error.mismatch'); } return null; }, @@ -336,11 +304,7 @@ class _ResetPasswordScreenState extends State { color: Colors.white, ), ) - : Text( - tr( - 'ui.userfront.reset.submit', - ), - ), + : Text(tr('ui.userfront.reset.submit')), ), ], ), @@ -364,9 +328,7 @@ class _ResetPasswordScreenState extends State { ), const SizedBox(height: 8), Text( - tr( - 'msg.userfront.reset.invalid_body', - ), + tr('msg.userfront.reset.invalid_body'), textAlign: TextAlign.center, ), ], diff --git a/userfront/lib/features/auth/presentation/signup_screen.dart b/userfront/lib/features/auth/presentation/signup_screen.dart index d9ecb9ba..3c704c86 100644 --- a/userfront/lib/features/auth/presentation/signup_screen.dart +++ b/userfront/lib/features/auth/presentation/signup_screen.dart @@ -164,11 +164,7 @@ class _SignupScreenState extends State { final email = _emailController.text.trim(); final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); if (!emailRegex.hasMatch(email)) { - setState( - () => _emailError = tr( - 'msg.userfront.signup.email.invalid', - ), - ); + setState(() => _emailError = tr('msg.userfront.signup.email.invalid')); return; } setState(() { @@ -179,9 +175,7 @@ class _SignupScreenState extends State { final available = await AuthProxyService.checkEmailAvailability(email); if (!available) { setState( - () => _emailError = tr( - 'msg.userfront.signup.email.duplicate', - ), + () => _emailError = tr('msg.userfront.signup.email.duplicate'), ); return; } @@ -217,9 +211,7 @@ class _SignupScreenState extends State { }); } else { setState( - () => _emailError = tr( - 'msg.userfront.signup.email.code_mismatch', - ), + () => _emailError = tr('msg.userfront.signup.email.code_mismatch'), ); } } catch (e) { @@ -272,9 +264,7 @@ class _SignupScreenState extends State { }); } else { setState( - () => _phoneError = tr( - 'msg.userfront.signup.phone.code_mismatch', - ), + () => _phoneError = tr('msg.userfront.signup.phone.code_mismatch'), ); } } catch (e) { @@ -329,17 +319,11 @@ class _SignupScreenState extends State { 'msg.userfront.signup.password.lowercase_required', ); } else if (eStr.contains('digit') || eStr.contains('number')) { - _passwordError = tr( - 'msg.userfront.signup.password.number_required', - ); + _passwordError = tr('msg.userfront.signup.password.number_required'); } else if (eStr.contains('symbol') || eStr.contains('special')) { - _passwordError = tr( - 'msg.userfront.signup.password.symbol_required', - ); + _passwordError = tr('msg.userfront.signup.password.symbol_required'); } else if (eStr.contains('length') || eStr.contains('12 characters')) { - _passwordError = tr( - 'msg.userfront.signup.password.length_required', - ); + _passwordError = tr('msg.userfront.signup.password.length_required'); } else { _passwordError = tr( 'msg.userfront.signup.failed', @@ -357,18 +341,12 @@ class _SignupScreenState extends State { context: context, barrierDismissible: false, builder: (context) => AlertDialog( - title: Text( - tr('msg.userfront.signup.success.title'), - ), - content: Text( - tr('msg.userfront.signup.success.body'), - ), + title: Text(tr('msg.userfront.signup.success.title')), + content: Text(tr('msg.userfront.signup.success.body')), actions: [ TextButton( onPressed: () => context.go('/signin'), - child: Text( - tr('ui.userfront.signup.success.action'), - ), + child: Text(tr('ui.userfront.signup.success.action')), ), ], ), @@ -382,25 +360,13 @@ class _SignupScreenState extends State { padding: const EdgeInsets.symmetric(vertical: 20), child: Row( children: [ - _stepCircle( - 1, - tr('ui.userfront.signup.steps.agreement'), - ), + _stepCircle(1, tr('ui.userfront.signup.steps.agreement')), _stepLine(1), - _stepCircle( - 2, - tr('ui.userfront.signup.steps.verify'), - ), + _stepCircle(2, tr('ui.userfront.signup.steps.verify')), _stepLine(2), - _stepCircle( - 3, - tr('ui.userfront.signup.steps.profile'), - ), + _stepCircle(3, tr('ui.userfront.signup.steps.profile')), _stepLine(3), - _stepCircle( - 4, - tr('ui.userfront.signup.steps.password'), - ), + _stepCircle(4, tr('ui.userfront.signup.steps.password')), ], ), ); @@ -454,9 +420,7 @@ class _SignupScreenState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( - tr( - 'msg.userfront.signup.agreement.title', - ), + tr('msg.userfront.signup.agreement.title'), style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold, @@ -489,18 +453,14 @@ class _SignupScreenState extends State { ), const SizedBox(height: 16), _agreementSection( - title: tr( - 'ui.userfront.signup.agreement.tos_title', - ), + title: tr('ui.userfront.signup.agreement.tos_title'), content: _tosText, value: _termsAccepted, onChanged: (val) => setState(() => _termsAccepted = val!), ), const SizedBox(height: 16), _agreementSection( - title: tr( - 'ui.userfront.signup.agreement.privacy_title', - ), + title: tr('ui.userfront.signup.agreement.privacy_title'), content: _privacyText, value: _privacyAccepted, onChanged: (val) => setState(() => _privacyAccepted = val!), @@ -745,9 +705,7 @@ class _SignupScreenState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( - tr( - 'msg.userfront.signup.auth.title', - ), + tr('msg.userfront.signup.auth.title'), style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), const SizedBox(height: 16), @@ -764,9 +722,7 @@ class _SignupScreenState extends State { const SizedBox(width: 8), Expanded( child: Text( - tr( - 'msg.userfront.signup.auth.affiliate_notice', - ), + tr('msg.userfront.signup.auth.affiliate_notice'), style: const TextStyle( fontSize: 12, color: Colors.blue, @@ -790,9 +746,7 @@ class _SignupScreenState extends State { controller: _emailController, onChanged: _checkEmailAffiliation, // 도메인 실시간 체크 decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.auth.email.label', - ), + labelText: tr('ui.userfront.signup.auth.email.label'), border: const OutlineInputBorder(), errorText: _emailError, hintText: 'example@hanmaceng.co.kr', @@ -815,9 +769,7 @@ class _SignupScreenState extends State { child: Text( _emailSeconds > 0 ? tr('ui.common.resend') - : tr( - 'ui.userfront.signup.auth.request_code', - ), + : tr('ui.userfront.signup.auth.request_code'), ), ), ), @@ -828,9 +780,7 @@ class _SignupScreenState extends State { TextFormField( controller: _emailCodeController, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.auth.code_label', - ), + labelText: tr('ui.userfront.signup.auth.code_label'), suffixText: _formatTime(_emailSeconds), border: const OutlineInputBorder(), ), @@ -848,9 +798,7 @@ class _SignupScreenState extends State { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - tr( - 'msg.userfront.signup.email.verified', - ), + tr('msg.userfront.signup.email.verified'), style: const TextStyle( color: Colors.green, fontSize: 13, @@ -870,9 +818,7 @@ class _SignupScreenState extends State { child: TextFormField( controller: _phoneController, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.phone.label', - ), + labelText: tr('ui.userfront.signup.phone.label'), border: const OutlineInputBorder(), errorText: _phoneError, ), @@ -895,9 +841,7 @@ class _SignupScreenState extends State { child: Text( _phoneSeconds > 0 ? tr('ui.common.resend') - : tr( - 'ui.userfront.signup.auth.request_code', - ), + : tr('ui.userfront.signup.auth.request_code'), ), ), ), @@ -908,9 +852,7 @@ class _SignupScreenState extends State { TextFormField( controller: _phoneCodeController, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.auth.code_label', - ), + labelText: tr('ui.userfront.signup.auth.code_label'), suffixText: _formatTime(_phoneSeconds), border: const OutlineInputBorder(), ), @@ -928,9 +870,7 @@ class _SignupScreenState extends State { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - tr( - 'msg.userfront.signup.phone.verified', - ), + tr('msg.userfront.signup.phone.verified'), style: const TextStyle( color: Colors.green, fontSize: 13, @@ -947,9 +887,7 @@ class _SignupScreenState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( - tr( - 'msg.userfront.signup.profile.title', - ), + tr('msg.userfront.signup.profile.title'), style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), const SizedBox(height: 24), @@ -971,28 +909,20 @@ class _SignupScreenState extends State { key: ValueKey(_affiliationType), initialValue: _affiliationType, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.profile.affiliation_type', - ), + labelText: tr('ui.userfront.signup.profile.affiliation_type'), border: const OutlineInputBorder(), helperText: _isAffiliateEmail - ? tr( - 'msg.userfront.signup.profile.affiliate_hint', - ) + ? tr('msg.userfront.signup.profile.affiliate_hint') : null, ), items: [ DropdownMenuItem( value: 'GENERAL', - child: Text( - tr('domain.affiliation.general'), - ), + child: Text(tr('domain.affiliation.general')), ), DropdownMenuItem( value: 'AFFILIATE', - child: Text( - tr('domain.affiliation.affiliate'), - ), + child: Text(tr('domain.affiliation.affiliate')), ), ], onChanged: _isAffiliateEmail @@ -1019,9 +949,7 @@ class _SignupScreenState extends State { key: ValueKey(_companyCode ?? 'none'), initialValue: _companyCode, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.profile.company', - ), + labelText: tr('ui.userfront.signup.profile.company'), border: const OutlineInputBorder(), ), items: [ @@ -1064,9 +992,7 @@ class _SignupScreenState extends State { decoration: InputDecoration( labelText: _affiliationType == 'AFFILIATE' ? tr('ui.userfront.signup.profile.department') - : tr( - 'ui.userfront.signup.profile.department_optional', - ), + : tr('ui.userfront.signup.profile.department_optional'), border: const OutlineInputBorder(), ), ), @@ -1076,9 +1002,7 @@ class _SignupScreenState extends State { String _buildPolicyDescription() { if (_isPolicyLoading) { - return tr( - 'msg.userfront.signup.policy.loading', - ); + return tr('msg.userfront.signup.policy.loading'); } final minLength = (_policy?['minLength'] as int?) ?? 12; final minTypes = (_policy?['minCharacterTypes'] as int?) ?? 0; @@ -1147,9 +1071,7 @@ class _SignupScreenState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( - tr( - 'msg.userfront.signup.password.title', - ), + tr('msg.userfront.signup.password.title'), style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), const SizedBox(height: 16), @@ -1183,9 +1105,7 @@ class _SignupScreenState extends State { obscureText: true, onChanged: (_) => setState(() {}), decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.password.label', - ), + labelText: tr('ui.userfront.signup.password.label'), border: const OutlineInputBorder(), errorText: _passwordError, ), @@ -1211,16 +1131,12 @@ class _SignupScreenState extends State { ), if (requiresUpper) _cryptoCheck( - tr( - 'msg.userfront.signup.password.rule.uppercase', - ), + tr('msg.userfront.signup.password.rule.uppercase'), hasUpper, ), if (requiresLower) _cryptoCheck( - tr( - 'msg.userfront.signup.password.rule.lowercase', - ), + tr('msg.userfront.signup.password.rule.lowercase'), hasLower, ), if (requiresNumber) @@ -1230,9 +1146,7 @@ class _SignupScreenState extends State { ), if (requiresSymbol) _cryptoCheck( - tr( - 'msg.userfront.signup.password.rule.symbol', - ), + tr('msg.userfront.signup.password.rule.symbol'), hasSpecial, ), ], @@ -1244,16 +1158,12 @@ class _SignupScreenState extends State { onChanged: (val) { setState(() { _confirmPasswordError = (val != _passwordController.text) - ? tr( - 'msg.userfront.signup.password.mismatch', - ) + ? tr('msg.userfront.signup.password.mismatch') : null; }); }, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.signup.password.confirm_label', - ), + labelText: tr('ui.userfront.signup.password.confirm_label'), border: const OutlineInputBorder(), errorText: _confirmPasswordError, ), @@ -1379,12 +1289,8 @@ class _SignupScreenState extends State { ) : Text( _currentStep < 4 - ? tr( - 'ui.userfront.signup.next_step', - ) - : tr( - 'ui.userfront.signup.complete', - ), + ? tr('ui.userfront.signup.next_step') + : tr('ui.userfront.signup.complete'), ), ), ), diff --git a/userfront/lib/features/dashboard/domain/dashboard_providers.dart b/userfront/lib/features/dashboard/domain/dashboard_providers.dart index 1912d799..93577cd1 100644 --- a/userfront/lib/features/dashboard/domain/dashboard_providers.dart +++ b/userfront/lib/features/dashboard/domain/dashboard_providers.dart @@ -172,9 +172,7 @@ class AuthTimelineNotifier extends Notifier { state = state.copyWith( isLoading: false, isLoadingMore: false, - error: tr( - 'msg.userfront.dashboard.timeline.load_error', - ), + error: tr('msg.userfront.dashboard.timeline.load_error'), ); } } diff --git a/userfront/lib/features/dashboard/presentation/dashboard_screen.dart b/userfront/lib/features/dashboard/presentation/dashboard_screen.dart index 39081868..4d86c2f8 100644 --- a/userfront/lib/features/dashboard/presentation/dashboard_screen.dart +++ b/userfront/lib/features/dashboard/presentation/dashboard_screen.dart @@ -71,9 +71,7 @@ class _DashboardScreenState extends ConsumerState { final confirmed = await showDialog( context: context, builder: (context) => AlertDialog( - title: Text( - tr('ui.userfront.dashboard.revoke.title'), - ), + title: Text(tr('ui.userfront.dashboard.revoke.title')), content: Text( tr( 'msg.userfront.dashboard.revoke.confirm', @@ -88,11 +86,7 @@ class _DashboardScreenState extends ConsumerState { TextButton( onPressed: () => Navigator.of(context).pop(true), style: TextButton.styleFrom(foregroundColor: Colors.red), - child: Text( - tr( - 'ui.userfront.dashboard.revoke.confirm_button', - ), - ), + child: Text(tr('ui.userfront.dashboard.revoke.confirm_button')), ), ], ), @@ -166,17 +160,13 @@ class _DashboardScreenState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - tr( - 'ui.userfront.dashboard.scopes.title', - ), + tr('ui.userfront.dashboard.scopes.title'), style: const TextStyle(fontWeight: FontWeight.bold), ), const SizedBox(height: 8), if (item.scopes.isEmpty) Text( - tr( - 'msg.userfront.dashboard.scopes.empty', - ), + tr('msg.userfront.dashboard.scopes.empty'), style: const TextStyle(color: Colors.grey), ) else @@ -199,9 +189,7 @@ class _DashboardScreenState extends ConsumerState { ), const SizedBox(height: 24), Text( - tr( - 'ui.userfront.dashboard.status_history', - ), + tr('ui.userfront.dashboard.status_history'), style: const TextStyle(fontWeight: FontWeight.bold), ), const SizedBox(height: 8), @@ -219,9 +207,7 @@ class _DashboardScreenState extends ConsumerState { builder: (context) { final statusLabel = item.status == 'active' ? tr('ui.common.status.active') - : tr( - 'ui.userfront.dashboard.status.revoked', - ); + : tr('ui.userfront.dashboard.status.revoked'); return Text( tr( 'msg.userfront.dashboard.current_status', @@ -534,12 +520,8 @@ class _DashboardScreenState extends ConsumerState { ? log.detailMap['approved_session_id'].toString() : log.sessionId; final tooltipLabel = isOidc - ? tr( - 'ui.userfront.dashboard.approved_session.userfront', - ) - : tr( - 'ui.userfront.dashboard.approved_session.default', - ); + ? tr('ui.userfront.dashboard.approved_session.userfront') + : tr('ui.userfront.dashboard.approved_session.default'); final tooltip = approvedSessionId.isEmpty ? tr( 'msg.userfront.dashboard.approved_session.none', @@ -558,9 +540,7 @@ class _DashboardScreenState extends ConsumerState { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - tr( - 'msg.userfront.dashboard.session_id_copied', - ), + tr('msg.userfront.dashboard.session_id_copied'), ), ), ); @@ -628,12 +608,8 @@ class _DashboardScreenState extends ConsumerState { ? log.detailMap['approved_session_id'].toString() : log.sessionId; final tooltipLabel = isOidc - ? tr( - 'ui.userfront.dashboard.approved_session.userfront', - ) - : tr( - 'ui.userfront.dashboard.approved_session.default', - ); + ? tr('ui.userfront.dashboard.approved_session.userfront') + : tr('ui.userfront.dashboard.approved_session.default'); return InkWell( onTap: approvedSessionId.isEmpty ? null @@ -643,9 +619,7 @@ class _DashboardScreenState extends ConsumerState { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - tr( - 'msg.userfront.dashboard.session_id_copied', - ), + tr('msg.userfront.dashboard.session_id_copied'), ), ), ); @@ -692,9 +666,7 @@ class _DashboardScreenState extends ConsumerState { final label = _appLabelForLog(log); final clientId = log.clientId; final tooltip = clientId.isEmpty - ? tr( - 'msg.userfront.dashboard.client_id_missing', - ) + ? tr('msg.userfront.dashboard.client_id_missing') : tr( 'msg.userfront.dashboard.client_id', fallback: 'Client ID: {{id}}', @@ -814,21 +786,15 @@ class _DashboardScreenState extends ConsumerState { const SizedBox(height: 28), ], _buildSectionTitle( - tr( - 'ui.userfront.sections.apps', - ), - tr( - 'msg.userfront.sections.apps_subtitle', - ), + tr('ui.userfront.sections.apps'), + tr('msg.userfront.sections.apps_subtitle'), ), const SizedBox(height: 12), _buildActivitySection(isMobile), const SizedBox(height: 28), _buildSectionTitle( tr('ui.userfront.sections.audit'), - tr( - 'msg.userfront.sections.audit_subtitle', - ), + tr('msg.userfront.sections.audit_subtitle'), ), const SizedBox(height: 12), _buildAccessHistory(timelineState, timelineWide), @@ -857,10 +823,7 @@ class _DashboardScreenState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - tr( - 'msg.userfront.greeting', - params: {'name': userName}, - ), + tr('msg.userfront.greeting', params: {'name': userName}), style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold, @@ -963,9 +926,7 @@ class _DashboardScreenState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - tr( - 'msg.userfront.dashboard.activities.empty', - ), + tr('msg.userfront.dashboard.activities.empty'), style: TextStyle( fontSize: 14, color: Colors.grey[700], @@ -974,9 +935,7 @@ class _DashboardScreenState extends ConsumerState { ), const SizedBox(height: 6), Text( - tr( - 'msg.userfront.dashboard.activities.empty_detail', - ), + tr('msg.userfront.dashboard.activities.empty_detail'), style: TextStyle(fontSize: 12, color: Colors.grey[600]), ), ], @@ -992,9 +951,7 @@ class _DashboardScreenState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - tr( - 'msg.userfront.dashboard.activities.error', - ), + tr('msg.userfront.dashboard.activities.error'), style: TextStyle(fontSize: 12, color: Colors.grey[600]), ), const SizedBox(height: 8), @@ -1194,9 +1151,7 @@ class _DashboardScreenState extends ConsumerState { child: Text( item.status == 'active' ? tr('ui.common.status.active') - : tr( - 'ui.userfront.dashboard.status.revoked', - ), + : tr('ui.userfront.dashboard.status.revoked'), style: TextStyle( fontSize: 11, color: statusColor, @@ -1264,12 +1219,8 @@ class _DashboardScreenState extends ConsumerState { ) : Text( item.isRevoked - ? tr( - 'ui.userfront.dashboard.status.revoked', - ) - : tr( - 'ui.userfront.dashboard.revoke.title', - ), + ? tr('ui.userfront.dashboard.status.revoked') + : tr('ui.userfront.dashboard.revoke.title'), style: const TextStyle(fontSize: 13), ), ), @@ -1303,22 +1254,14 @@ class _DashboardScreenState extends ConsumerState { } messenger.showSnackBar( SnackBar( - content: Text( - tr( - 'msg.userfront.dashboard.link_open_error', - ), - ), + content: Text(tr('msg.userfront.dashboard.link_open_error')), ), ); } else { if (!mounted) return; messenger.showSnackBar( SnackBar( - content: Text( - tr( - 'msg.userfront.dashboard.link_missing', - ), - ), + content: Text(tr('msg.userfront.dashboard.link_missing')), ), ); } @@ -1344,11 +1287,7 @@ class _DashboardScreenState extends ConsumerState { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - tr( - 'msg.userfront.dashboard.audit_load_error', - ), - ), + Text(tr('msg.userfront.dashboard.audit_load_error')), const SizedBox(height: 8), TextButton( onPressed: () => @@ -1365,9 +1304,7 @@ class _DashboardScreenState extends ConsumerState { return _buildHistoryContainer( child: Center( child: Text( - tr( - 'msg.userfront.dashboard.audit_empty', - ), + tr('msg.userfront.dashboard.audit_empty'), style: TextStyle(color: Colors.grey[600]), ), ), @@ -1416,16 +1353,10 @@ class _DashboardScreenState extends ConsumerState { ), ), DataColumn( - label: Text( - tr('ui.userfront.audit.table.date'), - ), + label: Text(tr('ui.userfront.audit.table.date')), ), DataColumn( - label: Text( - tr( - 'ui.userfront.audit.table.app', - ), - ), + label: Text(tr('ui.userfront.audit.table.app')), ), DataColumn( label: Text( @@ -1433,30 +1364,16 @@ class _DashboardScreenState extends ConsumerState { ), ), DataColumn( - label: Text( - tr( - 'ui.userfront.audit.table.device', - ), - ), + label: Text(tr('ui.userfront.audit.table.device')), ), DataColumn( - label: Text( - tr( - 'ui.userfront.audit.table.auth_method', - ), - ), + label: Text(tr('ui.userfront.audit.table.auth_method')), ), DataColumn( - label: Text( - tr( - 'ui.userfront.audit.table.result', - ), - ), + label: Text(tr('ui.userfront.audit.table.result')), ), DataColumn( - label: Text( - tr('ui.userfront.audit.table.status'), - ), + label: Text(tr('ui.userfront.audit.table.status')), ), ], rows: state.items.map((log) { @@ -1505,9 +1422,7 @@ class _DashboardScreenState extends ConsumerState { ), DataCell( _selectableText( - tr( - 'ui.userfront.audit.table.pending', - ), + tr('ui.userfront.audit.table.pending'), style: const TextStyle(color: Colors.grey), ), ), @@ -1643,11 +1558,7 @@ class _DashboardScreenState extends ConsumerState { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text( - tr( - 'msg.userfront.audit.load_more_error', - ), - ), + Text(tr('msg.userfront.audit.load_more_error')), TextButton( onPressed: () => ref.read(authTimelineProvider.notifier).loadMore(), diff --git a/userfront/lib/features/profile/data/repositories/profile_repository.dart b/userfront/lib/features/profile/data/repositories/profile_repository.dart index 059376b8..d46fdcfa 100644 --- a/userfront/lib/features/profile/data/repositories/profile_repository.dart +++ b/userfront/lib/features/profile/data/repositories/profile_repository.dart @@ -25,9 +25,7 @@ class ProfileRepository { final token = await _getToken(); final useCookie = AuthTokenStore.usesCookie(); if (token == null && !useCookie) { - throw Exception( - tr('err.userfront.session.missing'), - ); + throw Exception(tr('err.userfront.session.missing')); } final url = Uri.parse('$_baseUrl/api/v1/user/me'); @@ -59,9 +57,7 @@ class ProfileRepository { final token = await _getToken(); final useCookie = AuthTokenStore.usesCookie(); if (token == null && !useCookie) { - throw Exception( - tr('err.userfront.session.missing'), - ); + throw Exception(tr('err.userfront.session.missing')); } final url = Uri.parse('$_baseUrl/api/v1/user/me'); @@ -95,9 +91,7 @@ class ProfileRepository { final token = await _getToken(); final useCookie = AuthTokenStore.usesCookie(); if (token == null && !useCookie) { - throw Exception( - tr('err.userfront.session.missing'), - ); + throw Exception(tr('err.userfront.session.missing')); } final url = Uri.parse('$_baseUrl/api/v1/user/me/send-code'); @@ -130,9 +124,7 @@ class ProfileRepository { final token = await _getToken(); final useCookie = AuthTokenStore.usesCookie(); if (token == null && !useCookie) { - throw Exception( - tr('err.userfront.session.missing'), - ); + throw Exception(tr('err.userfront.session.missing')); } final url = Uri.parse('$_baseUrl/api/v1/user/me/password'); @@ -165,9 +157,7 @@ class ProfileRepository { final token = await _getToken(); final useCookie = AuthTokenStore.usesCookie(); if (token == null && !useCookie) { - throw Exception( - tr('err.userfront.session.missing'), - ); + throw Exception(tr('err.userfront.session.missing')); } final url = Uri.parse('$_baseUrl/api/v1/user/me/verify-code'); diff --git a/userfront/lib/features/profile/presentation/pages/profile_page.dart b/userfront/lib/features/profile/presentation/pages/profile_page.dart index b7da7e7b..5c06da38 100644 --- a/userfront/lib/features/profile/presentation/pages/profile_page.dart +++ b/userfront/lib/features/profile/presentation/pages/profile_page.dart @@ -232,13 +232,7 @@ class _ProfilePageState extends ConsumerState { }); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - tr( - 'msg.userfront.profile.phone.code_sent', - ), - ), - ), + SnackBar(content: Text(tr('msg.userfront.profile.phone.code_sent'))), ); } } catch (e) { @@ -272,11 +266,7 @@ class _ProfilePageState extends ConsumerState { }); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - tr('msg.userfront.profile.phone.verified'), - ), - ), + SnackBar(content: Text(tr('msg.userfront.profile.phone.verified'))), ); } if (_editingField == 'phone') { @@ -315,17 +305,14 @@ class _ProfilePageState extends ConsumerState { } if (newPassword.isEmpty) { setState( - () => _passwordError = tr( - 'msg.userfront.profile.password.new_required', - ), + () => + _passwordError = tr('msg.userfront.profile.password.new_required'), ); return; } if (newPassword != confirmPassword) { setState( - () => _passwordError = tr( - 'msg.userfront.profile.password.mismatch', - ), + () => _passwordError = tr('msg.userfront.profile.password.mismatch'), ); return; } @@ -347,9 +334,7 @@ class _ProfilePageState extends ConsumerState { _newPasswordController?.clear(); _confirmPasswordController?.clear(); setState(() { - _passwordSuccess = tr( - 'msg.userfront.profile.password.changed', - ); + _passwordSuccess = tr('msg.userfront.profile.password.changed'); }); } catch (e) { final message = e.toString().replaceFirst('Exception: ', ''); @@ -431,22 +416,14 @@ class _ProfilePageState extends ConsumerState { if (_editingField == 'name' && nextName.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - tr('msg.userfront.profile.name_required'), - ), - ), + SnackBar(content: Text(tr('msg.userfront.profile.name_required'))), ); return; } if (_editingField == 'department' && nextDepartment.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text( - tr( - 'msg.userfront.profile.department_required', - ), - ), + content: Text(tr('msg.userfront.profile.department_required')), ), ); return; @@ -454,24 +431,14 @@ class _ProfilePageState extends ConsumerState { if (_editingField == 'phone') { if (nextPhone.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - tr( - 'msg.userfront.profile.phone_required', - ), - ), - ), + SnackBar(content: Text(tr('msg.userfront.profile.phone_required'))), ); return; } if (_isPhoneChanged && !_isPhoneVerified) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text( - tr( - 'msg.userfront.profile.phone_verify_required', - ), - ), + content: Text(tr('msg.userfront.profile.phone_verify_required')), ), ); return; @@ -511,13 +478,7 @@ class _ProfilePageState extends ConsumerState { _departmentTouched = false; }); ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - tr( - 'msg.userfront.profile.update_success', - ), - ), - ), + SnackBar(content: Text(tr('msg.userfront.profile.update_success'))), ); } } catch (e) { @@ -657,10 +618,7 @@ class _ProfilePageState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - tr( - 'msg.userfront.profile.greeting', - params: {'name': name}, - ), + tr('msg.userfront.profile.greeting', params: {'name': name}), style: const TextStyle( fontSize: 20, fontWeight: FontWeight.w700, @@ -833,9 +791,7 @@ class _ProfilePageState extends ConsumerState { child: Text( _isCodeSent ? tr('ui.common.resend') - : tr( - 'ui.userfront.profile.phone.request_code', - ), + : tr('ui.userfront.profile.phone.request_code'), ), ), const SizedBox(width: 8), @@ -859,9 +815,7 @@ class _ProfilePageState extends ConsumerState { onSubmitted: (_) => _verifyCode(profile), decoration: InputDecoration( border: const OutlineInputBorder(), - hintText: tr( - 'ui.userfront.profile.phone.code_hint', - ), + hintText: tr('ui.userfront.profile.phone.code_hint'), ), ), ), @@ -877,9 +831,7 @@ class _ProfilePageState extends ConsumerState { Padding( padding: const EdgeInsets.only(top: 8.0), child: Text( - tr( - 'msg.userfront.profile.phone.verify_notice', - ), + tr('msg.userfront.profile.phone.verify_notice'), style: const TextStyle(color: Colors.orange, fontSize: 12), ), ), @@ -898,9 +850,7 @@ class _ProfilePageState extends ConsumerState { ), const SizedBox(height: 8), Text( - tr( - 'msg.userfront.profile.password.subtitle', - ), + tr('msg.userfront.profile.password.subtitle'), style: const TextStyle(color: Color(0xFF6B7280)), ), const SizedBox(height: 16), @@ -908,9 +858,7 @@ class _ProfilePageState extends ConsumerState { controller: _currentPasswordController, obscureText: !_showCurrentPassword, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.profile.password.current', - ), + labelText: tr('ui.userfront.profile.password.current'), border: const OutlineInputBorder(), suffixIcon: IconButton( icon: Icon( @@ -929,9 +877,7 @@ class _ProfilePageState extends ConsumerState { controller: _newPasswordController, obscureText: !_showNewPassword, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.profile.password.new', - ), + labelText: tr('ui.userfront.profile.password.new'), border: const OutlineInputBorder(), suffixIcon: IconButton( icon: Icon( @@ -948,9 +894,7 @@ class _ProfilePageState extends ConsumerState { controller: _confirmPasswordController, obscureText: !_showConfirmPassword, decoration: InputDecoration( - labelText: tr( - 'ui.userfront.profile.password.confirm', - ), + labelText: tr('ui.userfront.profile.password.confirm'), border: const OutlineInputBorder(), suffixIcon: IconButton( icon: Icon( @@ -986,20 +930,12 @@ class _ProfilePageState extends ConsumerState { height: 18, child: CircularProgressIndicator(strokeWidth: 2), ) - : Text( - tr( - 'ui.userfront.profile.password.change', - ), - ), + : Text(tr('ui.userfront.profile.password.change')), ), const SizedBox(width: 12), TextButton( onPressed: () => context.go('/recovery'), - child: Text( - tr( - 'ui.userfront.profile.password.forgot', - ), - ), + child: Text(tr('ui.userfront.profile.password.forgot')), ), ], ), @@ -1024,9 +960,7 @@ class _ProfilePageState extends ConsumerState { const SizedBox(height: 28), _buildSectionTitle( tr('ui.userfront.profile.section.basic'), - tr( - 'msg.userfront.profile.section.basic', - ), + tr('msg.userfront.profile.section.basic'), ), const SizedBox(height: 12), _buildCard( @@ -1034,9 +968,7 @@ class _ProfilePageState extends ConsumerState { children: [ _buildEditableTile( field: 'name', - label: tr( - 'ui.userfront.profile.field.name', - ), + label: tr('ui.userfront.profile.field.name'), value: profile.name, profile: profile, isUpdating: isUpdating, @@ -1044,9 +976,7 @@ class _ProfilePageState extends ConsumerState { ), const Divider(height: 24), _buildReadOnlyTile( - tr( - 'ui.userfront.profile.field.email', - ), + tr('ui.userfront.profile.field.email'), profile.email, ), const Divider(height: 24), @@ -1056,12 +986,8 @@ class _ProfilePageState extends ConsumerState { ), const SizedBox(height: 28), _buildSectionTitle( - tr( - 'ui.userfront.profile.section.organization', - ), - tr( - 'msg.userfront.profile.section.organization', - ), + tr('ui.userfront.profile.section.organization'), + tr('msg.userfront.profile.section.organization'), ), const SizedBox(height: 12), _buildCard( @@ -1069,9 +995,7 @@ class _ProfilePageState extends ConsumerState { children: [ _buildEditableTile( field: 'department', - label: tr( - 'ui.userfront.profile.field.department', - ), + label: tr('ui.userfront.profile.field.department'), value: profile.department, profile: profile, isUpdating: isUpdating, @@ -1079,26 +1003,20 @@ class _ProfilePageState extends ConsumerState { ), const Divider(height: 24), _buildReadOnlyTile( - tr( - 'ui.userfront.profile.field.affiliation', - ), + tr('ui.userfront.profile.field.affiliation'), profile.affiliationType, ), if (profile.tenant != null) ...[ const Divider(height: 24), _buildReadOnlyTile( - tr( - 'ui.userfront.profile.field.tenant', - ), + tr('ui.userfront.profile.field.tenant'), profile.tenant!.name, ), ], if (profile.companyCode.isNotEmpty) ...[ const Divider(height: 24), _buildReadOnlyTile( - tr( - 'ui.userfront.profile.field.company_code', - ), + tr('ui.userfront.profile.field.company_code'), profile.companyCode, ), ], @@ -1108,9 +1026,7 @@ class _ProfilePageState extends ConsumerState { const SizedBox(height: 28), _buildSectionTitle( tr('ui.userfront.profile.section.security'), - tr( - 'msg.userfront.profile.section.security', - ), + tr('msg.userfront.profile.section.security'), ), const SizedBox(height: 12), _buildPasswordSection(), @@ -1137,20 +1053,14 @@ class _ProfilePageState extends ConsumerState { final profile = profileState.value ?? _cachedProfile; if (profile == null) { return Scaffold( - appBar: AppBar( - title: Text(tr('ui.userfront.nav.profile')), - ), + appBar: AppBar(title: Text(tr('ui.userfront.nav.profile'))), body: profileState.isLoading ? const Center(child: CircularProgressIndicator()) : Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text( - tr( - 'msg.userfront.profile.load_failed', - ), - ), + Text(tr('msg.userfront.profile.load_failed')), const SizedBox(height: 16), ElevatedButton( onPressed: () => diff --git a/userfront/lib/i18n_data.dart b/userfront/lib/i18n_data.dart index 12f54d2c..e252bd3d 100644 --- a/userfront/lib/i18n_data.dart +++ b/userfront/lib/i18n_data.dart @@ -29,7 +29,8 @@ const Map koStrings = { "msg.admin.api_keys.create.scopes_count": "총 {{count}}개의 권한이 할당됩니다.", "msg.admin.api_keys.create.scopes_hint": "생성 즉시 활성화되어 사용 가능합니다.", "msg.admin.api_keys.create.subtitle": "내부 시스템 연동을 위한 보안 인증 키를 구성합니다.", - "msg.admin.api_keys.create.success.copy_hint": "복사 버튼을 눌러 안전한 곳(비밀번호 관리자 등)에 저장하세요.", + "msg.admin.api_keys.create.success.copy_hint": + "복사 버튼을 눌러 안전한 곳(비밀번호 관리자 등)에 저장하세요.", "msg.admin.api_keys.create.success.notice": "아래의 비밀번호(Secret)는 보안을 위해 ", "msg.admin.api_keys.create.success.notice_emphasis": "지금 한 번만", "msg.admin.api_keys.create.success.notice_suffix": "표시됩니다.", @@ -37,14 +38,16 @@ const Map koStrings = { "msg.admin.api_keys.list.empty": "등록된 API 키가 없습니다.", "msg.admin.api_keys.list.fetch_error": "API 키 목록 조회에 실패했습니다.", "msg.admin.api_keys.list.registry.count": "총 {{count}}개 API 키", - "msg.admin.api_keys.list.subtitle": "서버 간 통신(Machine-to-Machine)을 위한 API 키를 발급하고 관리합니다.", + "msg.admin.api_keys.list.subtitle": + "서버 간 통신(Machine-to-Machine)을 위한 API 키를 발급하고 관리합니다.", "msg.admin.audit.empty": "아직 수집된 감사 로그가 없습니다.", "msg.admin.audit.end": "End of audit feed", "msg.admin.audit.filters.empty": "필터 없음", "msg.admin.audit.load_error": "Error loading logs: {{error}}", "msg.admin.audit.loading": "Loading audit logs...", "msg.admin.audit.registry.count": "로드된 로그 {{count}}건", - "msg.admin.audit.subtitle": "Command 요청 기반 ClickHouse 로그를 조회합니다. 사용자/테넌트는 추후 세션 연동 시 자동 채워집니다.", + "msg.admin.audit.subtitle": + "Command 요청 기반 ClickHouse 로그를 조회합니다. 사용자/테넌트는 추후 세션 연동 시 자동 채워집니다.", "msg.admin.groups.list.subtitle": "이 테넌트에 정의된 사용자 그룹 목록입니다.", "msg.admin.groups.members.count": "{{count}} 명", "msg.admin.groups.members.empty": "멤버가 없습니다.", @@ -52,33 +55,43 @@ const Map koStrings = { "msg.admin.groups.prompt.user_id": "추가할 사용자의 UUID를 입력하세요:", "msg.admin.header.subtitle": "Tenant isolation & least privilege by default", "msg.admin.idp_env_prod": "IDP env: prod", - "msg.admin.notice.idp_policy": "IDP 관리 키는 서버 내부 래핑 API로만 사용하며, 감사·레이트리밋을 기본 적용합니다.", + "msg.admin.notice.idp_policy": + "IDP 관리 키는 서버 내부 래핑 API로만 사용하며, 감사·레이트리밋을 기본 적용합니다.", "msg.admin.notice.scope": "관리 기능은 /admin 네임스페이스에서만 노출합니다.", "msg.admin.overview.description": "모든 테넌트 공통 지표와 정책 상태를 한 곳에서 확인합니다.", "msg.admin.overview.idp_fallback": "Fallback: Descope", "msg.admin.overview.idp_primary": "IDP: Ory primary", - "msg.admin.overview.playbook.description": "운영 정책, 레이트리밋, 감사 로그의 기본 룰을 요약합니다.", - "msg.admin.overview.playbook.idp_body": "모든 IDP 호출은 backend를 통해서만 수행하며, Hydra/Kratos admin 포트는 외부에 노출하지 않습니다.", + "msg.admin.overview.playbook.description": + "운영 정책, 레이트리밋, 감사 로그의 기본 룰을 요약합니다.", + "msg.admin.overview.playbook.idp_body": + "모든 IDP 호출은 backend를 통해서만 수행하며, Hydra/Kratos admin 포트는 외부에 노출하지 않습니다.", "msg.admin.overview.playbook.idp_title": "Backend-only IDP access", - "msg.admin.overview.playbook.tenant_body": "Tenant 헤더와 감사 로그 규칙을 기본 적용하며, 향후 Keto 정책으로 확장 예정입니다.", + "msg.admin.overview.playbook.tenant_body": + "Tenant 헤더와 감사 로그 규칙을 기본 적용하며, 향후 Keto 정책으로 확장 예정입니다.", "msg.admin.overview.playbook.tenant_title": "Tenant isolation", "msg.admin.overview.quick_links.description": "주요 운영 화면으로 바로 이동합니다.", "msg.admin.scope_admin": "Scoped to /admin", "msg.admin.session_ttl": "Session TTL: 15m admin", "msg.admin.tenant_headers": "Tenant-aware headers", - "msg.admin.tenants.create.form.domains_help": "Users with these email domains will be automatically assigned to this tenant.", - "msg.admin.tenants.create.memo.body": "생성 직후에는 기본 활성 상태로 부여되며, 필요 시 상태를 수정하세요.", - "msg.admin.tenants.create.memo.subtitle": "Tenant 권한 정책은 추후 Keto 연계로 확장 예정입니다.", - "msg.admin.tenants.create.profile.subtitle": "필수 정보만 입력해도 생성 가능합니다. Slug는 없으면 자동 생성됩니다.", + "msg.admin.tenants.create.form.domains_help": + "Users with these email domains will be automatically assigned to this tenant.", + "msg.admin.tenants.create.memo.body": + "생성 직후에는 기본 활성 상태로 부여되며, 필요 시 상태를 수정하세요.", + "msg.admin.tenants.create.memo.subtitle": + "Tenant 권한 정책은 추후 Keto 연계로 확장 예정입니다.", + "msg.admin.tenants.create.profile.subtitle": + "필수 정보만 입력해도 생성 가능합니다. Slug는 없으면 자동 생성됩니다.", "msg.admin.tenants.create.subtitle": "글로벌 운영 기준의 신규 테넌트를 등록합니다.", "msg.admin.tenants.delete_confirm": "테넌트 \\\"{{name}}\\\"를 삭제할까요?", "msg.admin.tenants.empty": "아직 등록된 테넌트가 없습니다.", "msg.admin.tenants.fetch_error": "테넌트 목록 조회에 실패했습니다.", "msg.admin.tenants.members.empty": "소속된 사용자가 없습니다.", "msg.admin.tenants.registry.count": "총 {{count}}개 테넌트", - "msg.admin.tenants.schema.empty": "No custom fields defined. Click \\\"Add Field\\\" to begin.", + "msg.admin.tenants.schema.empty": + "No custom fields defined. Click \\\"Add Field\\\" to begin.", "msg.admin.tenants.schema.missing_id": "Tenant ID missing", - "msg.admin.tenants.schema.subtitle": "Define custom attributes for users in this tenant.", + "msg.admin.tenants.schema.subtitle": + "Define custom attributes for users in this tenant.", "msg.admin.tenants.schema.update_error": "Failed to update schema", "msg.admin.tenants.schema.update_success": "Schema updated successfully", "msg.admin.tenants.sub.empty": "하위 테넌트가 없습니다.", @@ -88,19 +101,23 @@ const Map koStrings = { "msg.admin.users.create.error": "사용자 생성에 실패했습니다.", "msg.admin.users.create.form.email_required": "이메일은 필수입니다.", "msg.admin.users.create.form.name_required": "이름은 필수입니다.", - "msg.admin.users.create.form.password_auto_help": "비워두면 시스템이 초기 비밀번호를 자동 생성합니다.", + "msg.admin.users.create.form.password_auto_help": + "비워두면 시스템이 초기 비밀번호를 자동 생성합니다.", "msg.admin.users.create.form.password_manual_help": "초기 비밀번호를 직접 설정합니다.", "msg.admin.users.create.form.role_help": "시스템 접근 권한을 결정합니다.", "msg.admin.users.create.password_generated.default": "초기 비밀번호가 생성되었습니다.", - "msg.admin.users.create.password_generated.with_email": "{{email}} 계정의 초기 비밀번호입니다.", + "msg.admin.users.create.password_generated.with_email": + "{{email}} 계정의 초기 비밀번호입니다.", "msg.admin.users.create.password_required": "비밀번호를 입력하거나 자동 생성을 사용해 주세요.", "msg.admin.users.detail.edit_subtitle": "{{email}} 계정의 정보를 수정합니다.", "msg.admin.users.detail.form.name_required": "이름은 필수입니다.", "msg.admin.users.detail.not_found": "사용자를 찾을 수 없습니다.", - "msg.admin.users.detail.security.password_hint": "비밀번호를 변경하려면 입력하세요. 비워두면 현재 비밀번호가 유지됩니다.", + "msg.admin.users.detail.security.password_hint": + "비밀번호를 변경하려면 입력하세요. 비워두면 현재 비밀번호가 유지됩니다.", "msg.admin.users.detail.update_error": "사용자 수정에 실패했습니다.", "msg.admin.users.detail.update_success": "사용자 정보가 수정되었습니다.", - "msg.admin.users.list.delete_confirm": "사용자 \\\"{{name}}\\\"을(를) 정말 삭제하시겠습니까?", + "msg.admin.users.list.delete_confirm": + "사용자 \\\"{{name}}\\\"을(를) 정말 삭제하시겠습니까?", "msg.admin.users.list.empty": "검색 결과가 없습니다.", "msg.admin.users.list.fetch_error": "사용자 목록 조회에 실패했습니다.", "msg.admin.users.list.registry.count": "총 {{count}}명의 사용자가 등록되어 있습니다.", @@ -111,7 +128,8 @@ const Map koStrings = { "msg.dev.clients.consents.empty": "No consents found.", "msg.dev.clients.consents.load_error": "Error loading consents: {{error}}", "msg.dev.clients.consents.loading": "Loading consents...", - "msg.dev.clients.consents.showing": "Showing {{from}} to {{to}} of {{total}} users", + "msg.dev.clients.consents.showing": + "Showing {{from}} to {{to}} of {{total}} users", "msg.dev.clients.consents.subtitle": "OIDC Relying Party 사용자 권한을 검토·관리합니다.", "msg.dev.clients.copy_client_id": "클라이언트 ID가 복사되었습니다.", "msg.dev.clients.details.copy_client_id": "Client ID가 복사되었습니다.", @@ -120,39 +138,51 @@ const Map koStrings = { "msg.dev.clients.details.load_error": "Error loading client: {{error}}", "msg.dev.clients.details.loading": "Loading client...", "msg.dev.clients.details.missing_id": "Client ID가 필요합니다.", - "msg.dev.clients.details.redirect.description": "인증 성공 후 사용자를 리다이렉트할 허용된 URL 목록입니다. 콤마(,)로 구분하여 여러 개 입력할 수 있습니다.", + "msg.dev.clients.details.redirect.description": + "인증 성공 후 사용자를 리다이렉트할 허용된 URL 목록입니다. 콤마(,)로 구분하여 여러 개 입력할 수 있습니다.", "msg.dev.clients.details.redirect_saved": "Redirect URIs가 저장되었습니다.", - "msg.dev.clients.details.rotate_confirm": "경고: Client Secret을 재발급하면 기존 시크릿은 즉시 무효화됩니다.\\\\n연동된 애플리케이션이 중단될 수 있습니다. 계속하시겠습니까?", + "msg.dev.clients.details.rotate_confirm": + "경고: Client Secret을 재발급하면 기존 시크릿은 즉시 무효화됩니다.\\\\n연동된 애플리케이션이 중단될 수 있습니다. 계속하시겠습니까?", "msg.dev.clients.details.rotate_error": "재발급 실패: {{error}}", "msg.dev.clients.details.save_error": "저장 실패: {{error}}", "msg.dev.clients.details.secret_rotated": "Client Secret이 재발급되었습니다.", "msg.dev.clients.details.secret_unavailable": "SECRET_NOT_AVAILABLE", - "msg.dev.clients.details.security.footer": "비밀키 재발행 작업에는 관리자 세션 TTL 확인과 레이트리밋, 알림 연동을 권장합니다.", - "msg.dev.clients.details.security.note": "엔드포인트는 읽기 전용으로 유지하고, 비밀키 재발행/복사는 감사 로그와 연계하세요.", + "msg.dev.clients.details.security.footer": + "비밀키 재발행 작업에는 관리자 세션 TTL 확인과 레이트리밋, 알림 연동을 권장합니다.", + "msg.dev.clients.details.security.note": + "엔드포인트는 읽기 전용으로 유지하고, 비밀키 재발행/복사는 감사 로그와 연계하세요.", "msg.dev.clients.details.subtitle": "OIDC 자격 증명과 엔드포인트를 관리합니다.", "msg.dev.clients.general.identity.logo_help": "인증 화면에 표시될 PNG/SVG URL입니다.", "msg.dev.clients.general.identity.subtitle": "앱 이름과 설명, 로고를 설정합니다.", "msg.dev.clients.general.load_error": "Error loading client: {{error}}", "msg.dev.clients.general.loading": "Loading client...", - "msg.dev.clients.general.redirect.help": "인증 후 리다이렉트될 URI를 입력하세요. 생성 후 Connection 탭에서 수정 가능합니다.", + "msg.dev.clients.general.redirect.help": + "인증 후 리다이렉트될 URI를 입력하세요. 생성 후 Connection 탭에서 수정 가능합니다.", "msg.dev.clients.general.saved": "설정이 저장되었습니다.", "msg.dev.clients.general.scopes.empty": "등록된 스코프가 없습니다.", "msg.dev.clients.general.scopes.subtitle": "이 클라이언트가 요청할 수 있는 권한 범위를 정의합니다.", - "msg.dev.clients.general.security.confidential_help": "서버 사이드 앱(예: Node.js, Java)처럼 비밀키를 안전하게 보관 가능한 경우.", - "msg.dev.clients.general.security.public_help": "SPA/모바일 앱처럼 비밀키 보관이 어려운 경우. PKCE를 기본 사용합니다.", - "msg.dev.clients.general.security.subtitle": "클라이언트 유형을 선택하세요. 보안 수준에 따라 인증 방식이 달라집니다.", - "msg.dev.clients.help.docs_body": "Includes PKCE, client_secret_basic, redirect URI validation tips.", - "msg.dev.clients.help.subtitle": "Developer guides for Confidential/Public clients, redirect URIs, and auth methods.", + "msg.dev.clients.general.security.confidential_help": + "서버 사이드 앱(예: Node.js, Java)처럼 비밀키를 안전하게 보관 가능한 경우.", + "msg.dev.clients.general.security.public_help": + "SPA/모바일 앱처럼 비밀키 보관이 어려운 경우. PKCE를 기본 사용합니다.", + "msg.dev.clients.general.security.subtitle": + "클라이언트 유형을 선택하세요. 보안 수준에 따라 인증 방식이 달라집니다.", + "msg.dev.clients.help.docs_body": + "Includes PKCE, client_secret_basic, redirect URI validation tips.", + "msg.dev.clients.help.subtitle": + "Developer guides for Confidential/Public clients, redirect URIs, and auth methods.", "msg.dev.clients.load_error": "Error loading clients: {{error}}", "msg.dev.clients.loading": "Loading clients...", - "msg.dev.clients.registry.description": "OIDC 클라이언트, 인증 방식, 리다이렉트 URI, 비밀키 재발행을 감사 로그와 함께 관리합니다.", + "msg.dev.clients.registry.description": + "OIDC 클라이언트, 인증 방식, 리다이렉트 URI, 비밀키 재발행을 감사 로그와 함께 관리합니다.", "msg.dev.clients.scopes.email": "이메일 주소 접근", "msg.dev.clients.scopes.openid": "OIDC 인증 필수 스코프", "msg.dev.clients.scopes.profile": "기본 프로필 정보 접근", "msg.dev.clients.showing": "Showing {{shown}} of {{total}} clients", "msg.dev.clients.status_update_error": "Failed to update client status", "msg.dev.clients.status_updated": "클라이언트가 {{status}}되었습니다.", - "msg.dev.dashboard.hero.body": "Hydra Admin API와 동기화된 RP 목록, 상태 토글, Consent 회수까지 devfront에서 처리하도록 준비합니다.", + "msg.dev.dashboard.hero.body": + "Hydra Admin API와 동기화된 RP 목록, 상태 토글, Consent 회수까지 devfront에서 처리하도록 준비합니다.", "msg.dev.dashboard.hero.title_emphasis": " 하나의 화면", "msg.dev.dashboard.hero.title_prefix": "RP 등록 현황과 Consent 상태를", "msg.dev.dashboard.hero.title_suffix": "에서 관리합니다.", @@ -171,12 +201,15 @@ const Map koStrings = { "msg.userfront.audit.session_id": "Session ID: {{value}}", "msg.userfront.audit.status": "현황: (준비중)", "msg.userfront.dashboard.activities.empty": "연동된 앱이 없습니다.", - "msg.userfront.dashboard.activities.empty_detail": "앱을 연동하면 최근 활동과 상태가 표시됩니다.", + "msg.userfront.dashboard.activities.empty_detail": + "앱을 연동하면 최근 활동과 상태가 표시됩니다.", "msg.userfront.dashboard.activities.error": "연동 정보를 불러오지 못했습니다.", "msg.userfront.dashboard.approved_device": "승인 기기: {{device}}", "msg.userfront.dashboard.approved_ip": "승인 IP: {{ip}}", - "msg.userfront.dashboard.approved_session.copy_click": "{{label}}: {{id}}\\\\\\\\n클릭하면 복사됩니다.", - "msg.userfront.dashboard.approved_session.copy_tap": "{{label}}: {{id}}\\\\\\\\n탭하면 복사됩니다.", + "msg.userfront.dashboard.approved_session.copy_click": + "{{label}}: {{id}}\\\\\\\\n클릭하면 복사됩니다.", + "msg.userfront.dashboard.approved_session.copy_tap": + "{{label}}: {{id}}\\\\\\\\n탭하면 복사됩니다.", "msg.userfront.dashboard.approved_session.none": "{{label}} 없음", "msg.userfront.dashboard.audit_empty": "최근 접속 이력이 없습니다.", "msg.userfront.dashboard.audit_load_error": "접속이력을 불러오지 못했습니다.", @@ -187,7 +220,8 @@ const Map koStrings = { "msg.userfront.dashboard.last_auth": "최근 인증: {{value}}", "msg.userfront.dashboard.link_missing": "이동할 페이지 주소(Client URI)가 설정되지 않았습니다.", "msg.userfront.dashboard.link_open_error": "해당 링크를 열 수 없습니다.", - "msg.userfront.dashboard.revoke.confirm": "{{app}} 앱과의 연동을 해지하시겠습니까?\\\\\\\\n해지하면 다음 로그인 시 다시 동의가 필요합니다.", + "msg.userfront.dashboard.revoke.confirm": + "{{app}} 앱과의 연동을 해지하시겠습니까?\\\\\\\\n해지하면 다음 로그인 시 다시 동의가 필요합니다.", "msg.userfront.dashboard.revoke.error": "해지 실패: {{error}}", "msg.userfront.dashboard.revoke.success": "{{app}} 연동이 해지되었습니다.", "msg.userfront.dashboard.scopes.empty": "요청된 권한이 없습니다.", @@ -202,7 +236,8 @@ const Map koStrings = { "msg.userfront.error.title_with_code": "오류: {{code}}", "msg.userfront.error.type": "오류 종류: {{type}}", "msg.userfront.error.whitelist.\$normalizedCode": "에러가 계속되면 관리자에게 문의해주세요", - "msg.userfront.forgot.description": "계정과 연결된 이메일 주소 또는 휴대폰 번호를 입력하시면, 비밀번호를 재설정할 수 있는 링크를 보내드립니다.", + "msg.userfront.forgot.description": + "계정과 연결된 이메일 주소 또는 휴대폰 번호를 입력하시면, 비밀번호를 재설정할 수 있는 링크를 보내드립니다.", "msg.userfront.forgot.dry_send": "drySend 모드: 실제 이메일/SMS는 발송되지 않습니다.", "msg.userfront.forgot.error": "전송에 실패했습니다: {{error}}", "msg.userfront.forgot.input_required": "이메일 또는 휴대폰 번호를 입력해주세요.", @@ -215,7 +250,8 @@ const Map koStrings = { "msg.userfront.login.link.missing_login_id": "이메일 또는 휴대폰 번호를 입력해 주세요.", "msg.userfront.login.link.missing_phone": "휴대폰 번호를 입력해 주세요.", "msg.userfront.login.link.resend_wait": "재발송은 {{time}} 후 가능합니다.", - "msg.userfront.login.link.short_code_help": "링크로 받은 값의 뒤 문자 2개와 숫자 6자리를 입력하셔도 로그인 할 수 있습니다.", + "msg.userfront.login.link.short_code_help": + "링크로 받은 값의 뒤 문자 2개와 숫자 6자리를 입력하셔도 로그인 할 수 있습니다.", "msg.userfront.login.link_failed": "오류: {{error}}", "msg.userfront.login.link_send_failed": "전송 실패: {{error}}", "msg.userfront.login.link_sent_email": "입력하신 이메일로 로그인 링크를 보냈습니다.", @@ -224,7 +260,8 @@ const Map koStrings = { "msg.userfront.login.no_account": "계정이 없으신가요?", "msg.userfront.login.oidc_failed": "OIDC 로그인 처리에 실패했습니다. 다시 시도해 주세요.", "msg.userfront.login.password.failed": "로그인 실패: {{error}}", - "msg.userfront.login.password.missing_credentials": "이메일(또는 전화번호)와 비밀번호를 모두 입력해주세요.", + "msg.userfront.login.password.missing_credentials": + "이메일(또는 전화번호)와 비밀번호를 모두 입력해주세요.", "msg.userfront.login.qr.load_failed": "QR 코드를 불러오지 못했습니다.", "msg.userfront.login.qr.scan_hint": "모바일 앱으로 스캔하세요", "msg.userfront.login.qr_expired": "QR 세션이 만료되었습니다.", @@ -234,7 +271,8 @@ const Map koStrings = { "msg.userfront.login.token_missing": "로그인 토큰을 확인할 수 없습니다.", "msg.userfront.login.unregistered.body": "가입되지 않은 정보입니다.\\\\n회원가입 후 이용해 주세요.", "msg.userfront.login.verification.approved": "승인되었습니다. 로그인은 요청하신 창에서 완료됩니다.", - "msg.userfront.login.verification.approved_local": "승인 되었습니다. 이 기기는 로그인되어 있는 상태입니다. 원격 창도 로그인이 될 예정입니다", + "msg.userfront.login.verification.approved_local": + "승인 되었습니다. 이 기기는 로그인되어 있는 상태입니다. 원격 창도 로그인이 될 예정입니다", "msg.userfront.login.verification.success": "로그인 승인에 성공했습니다.", "msg.userfront.login.verification_failed": "승인 처리에 실패했습니다: {{error}}", "msg.userfront.login_success.subtitle": "성공적으로 로그인되었습니다.", @@ -272,7 +310,8 @@ const Map koStrings = { "msg.userfront.reset.error.generic": "비밀번호 변경에 실패했습니다: {{error}}", "msg.userfront.reset.error.lowercase": "최소 1개 이상의 소문자를 포함해야 합니다.", "msg.userfront.reset.error.min_length": "비밀번호는 최소 {{count}}자 이상이어야 합니다.", - "msg.userfront.reset.error.min_types": "비밀번호는 영문 대/소문자/숫자/특수문자 중 {{count}}가지 이상 포함해야 합니다.", + "msg.userfront.reset.error.min_types": + "비밀번호는 영문 대/소문자/숫자/특수문자 중 {{count}}가지 이상 포함해야 합니다.", "msg.userfront.reset.error.mismatch": "비밀번호가 일치하지 않습니다.", "msg.userfront.reset.error.number": "최소 1개 이상의 숫자를 포함해야 합니다.", "msg.userfront.reset.error.symbol": "최소 1개 이상의 특수문자를 포함해야 합니다.", @@ -292,7 +331,8 @@ const Map koStrings = { "msg.userfront.sections.audit_subtitle": "Baron 로그인 기준의 최근 접근 기록입니다.", "msg.userfront.settings.disabled": "현재 계정 설정 화면은 준비 중입니다.", "msg.userfront.signup.agreement.title": "서비스 이용을 위해\\\\n약관에 동의해주세요", - "msg.userfront.signup.auth.affiliate_notice": "가족사 회원의 경우 반드시 회사 공식 이메일을 입력해주세요.", + "msg.userfront.signup.auth.affiliate_notice": + "가족사 회원의 경우 반드시 회사 공식 이메일을 입력해주세요.", "msg.userfront.signup.auth.title": "본인 확인을 위해\\\\n인증을 진행해주세요", "msg.userfront.signup.email.code_mismatch": "인증코드가 일치하지 않습니다.", "msg.userfront.signup.email.duplicate": "이미 가입된 이메일입니다.", @@ -302,7 +342,8 @@ const Map koStrings = { "msg.userfront.signup.email.verify_failed": "인증 실패: {{error}}", "msg.userfront.signup.failed": "가입 실패: {{error}}", "msg.userfront.signup.password.length_required": "비밀번호는 최소 12자 이상이어야 합니다.", - "msg.userfront.signup.password.lowercase_required": "소문자가 최소 1개 이상 포함되어야 합니다.", + "msg.userfront.signup.password.lowercase_required": + "소문자가 최소 1개 이상 포함되어야 합니다.", "msg.userfront.signup.password.mismatch": "비밀번호가 일치하지 않습니다.", "msg.userfront.signup.password.number_required": "숫자가 최소 1개 이상 포함되어야 합니다.", "msg.userfront.signup.password.rule.lowercase": "소문자", @@ -313,7 +354,8 @@ const Map koStrings = { "msg.userfront.signup.password.rule.uppercase": "대문자", "msg.userfront.signup.password.symbol_required": "특수문자가 최소 1개 이상 포함되어야 합니다.", "msg.userfront.signup.password.title": "마지막으로\\\\n비밀번호를 설정해주세요", - "msg.userfront.signup.password.uppercase_required": "대문자가 최소 1개 이상 포함되어야 합니다.", + "msg.userfront.signup.password.uppercase_required": + "대문자가 최소 1개 이상 포함되어야 합니다.", "msg.userfront.signup.phone.code_mismatch": "인증코드가 일치하지 않습니다.", "msg.userfront.signup.phone.send_failed": "발송 실패: {{error}}", "msg.userfront.signup.phone.verified": "✅ 휴대폰 인증 완료", @@ -326,14 +368,17 @@ const Map koStrings = { "msg.userfront.signup.policy.summary": "보안 정책: {{rules}}", "msg.userfront.signup.policy.symbol": "특수문자", "msg.userfront.signup.policy.uppercase": "대문자", - "msg.userfront.signup.privacy_full": "\\n개인정보 수집 및 이용 동의\\n\\n바론서비스 개인정보처리방침\\n\\n제1조 (목적)\\n바론컨설턴트(이하 \\\"회사\\\")는 바론서비스(이하 \\\"서비스\\\")를 이용하는 고객(이하 \\\"이용자\\\")의 개인정보를 보호하고, 「개인정보 보호법」에 따라 책임과 의무를 다하기 위해 본 개인정보처리방침을 마련했습니다. 본 방침은 이용자가 제공한 개인정보가 어떻게 수집, 이용, 보관, 보호되는지를 설명합니다.\\n제2조 (개인정보의 처리목적)\\n회사는 다음의 목적을 위해 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며, 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.\\n- 본인확인: 회원가입 및 관리를 위한 본인 확인, 전화 또는 이메일을 통한 연락\\n- 서비스 제공: 각종 통보 및 서비스 제공을 위한 업무 처리\\n- 제품소개서 다운로드: 설명자료 전달\\n- 상담 및 데모 신청: 상담 제공 및 데모 제공, 계약 처리자 정보 수집\\n- 행사 참가 신청: 참석 안내 및 세미나/설명회/교육 제공\\n- 보안가이드 제공: 안내자료 전달\\n- 기술지원 문의: 서비스 사용 지원\\n- 서비스 개선 의견 접수: 서비스 품질 개선\\n- 마케팅 활동: 동의한 고객에 한해 뉴스레터 및 매거진 발송\\n제3조 (개인정보의 처리 및 보유 기간)\\n① 회사는 법령에 따른 개인정보 보유 및 이용기간 또는 정보주체로부터 개인정보를 수집 시 동의받은 개인정보 보유 및 이용기간 내에서 개인정보를 처리 및 보유합니다.\\n② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다:\\n- 회원정보: 회원가입일부터 회원탈퇴 후 1년까지\\n- 홍보, 상담, 계약용 개인정보: 2년\\n제4조 (개인정보의 제3자 제공)\\n① 회사는 정보주체의 개인정보를 제2조에서 명시한 범위 내에서만 처리하며, 정보 주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.\\n② 회사는 다음과 같이 개인정보를 제3자에게 제공하고 있습니다:\\n- 제공받는 자: 수사기관 및 유관기관, 피신고업체\\n- 이용 목적: 개인정보 침해 민원 처리\\n- 제공하는 개인정보 항목: 성명, 연락처, 이메일\\n- 보유 및 이용기간: 법령에서 정한 보존기간 및 제공목적 달성 시 파기\\n제5조 (개인정보 처리 위탁)\\n① 회사는 개인정보 처리업무를 외부 업체에 위탁하지 않으며, 자체적으로 처리하고 있습니다.\\n② 회사가 특정 업무(예: 채용 업무)를 외부 업체에 위탁할 경우, 개인정보 처리방침 시행 전 회사 홈페이지에서 공지한 후 정보주체의 동의를 받은 후 위탁합니다.\\n제6조 (정보주체의 권리·의무 및 행사 방법)\\n① 정보주체는 회사에 대해 언제든지 개인정보 열람, 정정, 삭제, 처리정지 요구 등의 권리를 행사할 수 있습니다.\\n② 권리 행사는 다음과 같은 방법으로 할 수 있습니다:\\n- 서면: 회사 주소로 서면 제출\\n- 전자우편: 회사 이메일로 요청\\n- 모사전송(FAX): 회사 FAX로 요청\\n③ 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자를 통해 대리로도 가능합니다. 이 경우 “개인정보 처리 방법에 관한 고시” 별지 제11호 서식에 따른 위임장을 제출해야 합니다.\\n④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 따라 제한될 수 있습니다.\\n⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에 따라 수집된 개인정보인 경우 제한될 수 있습니다.\\n⑥ 회사는 권리 행사를 요청한 자가 본인 또는 정당한 대리인인지를 확인합니다.\\n제7조 (처리하는 개인정보의 항목)\\n회사는 다음의 개인정보 항목을 처리합니다:\\n- 수집 항목:\\n- 필수 항목: 성명, 휴대전화번호, 이메일\\n- 선택 항목: 회사전화번호, 문의사항\\n- 수집 방법:\\n- 홈페이지, 전화, 이메일을 통해 수집\\n제8조 (개인정보의 파기)\\n① 회사는 개인정보 보유 기간의 경과, 처리 목적 달성 등 개인정보가 불필요하게 되었을 때 지체 없이 해당 개인정보를 파기합니다.\\n② 정보주체로부터 동의받은 개인정보 보유 기간이 경과하거나 처리 목적이 달성된 경우에도 다른 법령에 따라 개인정보를 계속 보존해야 할 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관 장소를 달리하여 보존합니다.\\n③ 개인정보 파기의 절차 및 방법은 다음과 같습니다:\\n- 파기 절차: 회사는 파기 사유가 발생한 개인정보를 선정하고, 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.\\n- 파기 방법: 전자적 파일 형태로 기록된 개인정보는 복구할 수 없도록 기술적 방법을 사용해 삭제하며, 종이 문서에 기록된 개인정보는 분쇄기로 분쇄하거나 소각하여 파기합니다.\\n제9조 (개인정보의 안전성 확보 조치)\\n회사는 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취합니다:\\n- 관리적 조치: 내부관리계획 수립·시행, 정기적 직원 교육\\n- 기술적 조치: 개인정보처리시스템 접근 권한 관리, 접근통제시스템 설치, 고유식별정보 암호화, 보안 프로그램 설치\\n- 물리적 조치: 전산실 및 자료보관실 접근 통제\\n제10조 (개인정보 자동 수집 장치의 설치·운영 및 거부에 관한 사항)\\n회사는 쿠키(Cookie)를 사용하지 않습니다. 쿠키는 이용자의 이용 정보를 저장하고 수시로 불러오는 작은 파일로, 바론서비스에서는 쿠키를 사용하지 않습니다.\\n제11조 (개인정보 보호책임자)\\n회사는 개인정보 처리에 관한 업무를 총괄하여 책임지고, 개인정보 처리와 관련된 정보주체의 불만처리 및 피해구제를 위해 개인정보 보호책임자를 지정하고 있습니다.\\n개인정보 보호책임자:\\n- 성명: 염승호\\n- 직책: 수석연구원\\n- 연락처: 02-2141-7448\\n- 팩스번호: 02-2141-7599\\n- 이메일: b23008@baroncs.co.kr\\n제12조 (개인정보 열람청구)\\n정보주체는 「개인정보 보호법」 제35조에 따른 개인정보 열람 청구를 아래 부서에 할 수 있습니다. 회사는 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다.\\n개인정보 열람청구 접수·처리 부서:\\n- 부서명: 총괄기획실\\n- 담당자: 권혁진\\n- 연락처: 02-2141-7465\\n- 팩스번호: 02-2141-7599\\n- 이메일: baroncs@baroncs.co.kr\\n제13조 (권익침해 구제방법)\\n정보주체는 개인정보 침해로 인한 구제를 위해 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보해신고센터 등에 분쟁 해결이나 상담을 신청할 수 있습니다.\\n- 개인정보분쟁조정위원회: (국번없이) 1833-6972 (www.kopico.go.kr)\\n- 개인정보침해신고센터: (국번없이) 118 (privacy.kisa.or.kr)\\n- 대검찰청: (국번없이) 1301 (www.spo.go.kr)\\n- 경찰청: (국번없이) 182 (www.police.go.kr)\\n제14조 (개인정보 처리방침의 변경)\\n본 개인정보처리방침은 법령, 정책 또는 보안 기술의 변경에 따라 내용의 추가, 삭제 및 수정이 있을 시, 개정 최소 7일 전에 홈페이지를 통해 사전 공지합니다.\\n\\n부칙\\n제1조 (시행일자)\\n이 개인정보처리방침은 2024년 10월 1일부터 시행됩니다.\\n제2조 (개정 및 고지의 의무)\\n회사는 개인정보처리방침을 변경하는 경우, 변경사항을 시행일자 7일 전부터 서비스 내 공지사항 페이지를 통해 고지할 것입니다. 다만, 이용자의 권리나 의무에 중대한 변경이 발생하는 경우에는 시행일자 30일 전부터 고지합니다.\\n제3조 (유효성)\\n본 개인정보처리방침의 일부 조항이 법적 또는 기타 사유로 인해 무효화되거나 시행할 수 없는 경우, 나머지 조항들은 계속해서 유효합니다. 무효화된 조항은 관련 법령에 부합하는 방식으로 수정되어 효력을 지속합니다.\\n제4조 (변경 통지의 방법)\\n회사는 개인정보처리방침의 변경 시, 다음의 방법으로 이용자에게 고지합니다:\\n- 서비스 초기화면 또는 팝업 공지\\n- 이메일 발송\\n- 회사 홈페이지 공지사항\\n제5조 (비회원의 개인정보 보호)\\n회사는 비회원의 개인정보도 회원과 동일한 수준으로 보호합니다. 비회원이 개인정보 제공을 거부할 경우 일부 서비스 이용에 제한이 있을 수 있습니다.\\n제6조 (14세 미만 아동의 개인정보 보호)\\n회사는 14세 미만 아동의 개인정보를 수집하지 않습니다. 만일 14세 미만 아동의 개인정보가 수집된 경우, 법정 대리인의 동의를 받아야 하며, 법정 대리인의 동의 없이 수집된 경우 이를 지체 없이 파기합니다.\\n제7조 (개인정보의 국외 이전)\\n회사는 이용자의 개인정보를 국외로 이전하지 않으며, 향후 필요한 경우, 사전에 이용자의 동의를 받습니다.\\n제8조 (기타)\\n본 방침에 명시되지 않은 사항은 회사의 내부 방침과 관련 법령에 따릅니다.\\n", + "msg.userfront.signup.privacy_full": + "\\n개인정보 수집 및 이용 동의\\n\\n바론서비스 개인정보처리방침\\n\\n제1조 (목적)\\n바론컨설턴트(이하 \\\"회사\\\")는 바론서비스(이하 \\\"서비스\\\")를 이용하는 고객(이하 \\\"이용자\\\")의 개인정보를 보호하고, 「개인정보 보호법」에 따라 책임과 의무를 다하기 위해 본 개인정보처리방침을 마련했습니다. 본 방침은 이용자가 제공한 개인정보가 어떻게 수집, 이용, 보관, 보호되는지를 설명합니다.\\n제2조 (개인정보의 처리목적)\\n회사는 다음의 목적을 위해 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며, 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.\\n- 본인확인: 회원가입 및 관리를 위한 본인 확인, 전화 또는 이메일을 통한 연락\\n- 서비스 제공: 각종 통보 및 서비스 제공을 위한 업무 처리\\n- 제품소개서 다운로드: 설명자료 전달\\n- 상담 및 데모 신청: 상담 제공 및 데모 제공, 계약 처리자 정보 수집\\n- 행사 참가 신청: 참석 안내 및 세미나/설명회/교육 제공\\n- 보안가이드 제공: 안내자료 전달\\n- 기술지원 문의: 서비스 사용 지원\\n- 서비스 개선 의견 접수: 서비스 품질 개선\\n- 마케팅 활동: 동의한 고객에 한해 뉴스레터 및 매거진 발송\\n제3조 (개인정보의 처리 및 보유 기간)\\n① 회사는 법령에 따른 개인정보 보유 및 이용기간 또는 정보주체로부터 개인정보를 수집 시 동의받은 개인정보 보유 및 이용기간 내에서 개인정보를 처리 및 보유합니다.\\n② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다:\\n- 회원정보: 회원가입일부터 회원탈퇴 후 1년까지\\n- 홍보, 상담, 계약용 개인정보: 2년\\n제4조 (개인정보의 제3자 제공)\\n① 회사는 정보주체의 개인정보를 제2조에서 명시한 범위 내에서만 처리하며, 정보 주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.\\n② 회사는 다음과 같이 개인정보를 제3자에게 제공하고 있습니다:\\n- 제공받는 자: 수사기관 및 유관기관, 피신고업체\\n- 이용 목적: 개인정보 침해 민원 처리\\n- 제공하는 개인정보 항목: 성명, 연락처, 이메일\\n- 보유 및 이용기간: 법령에서 정한 보존기간 및 제공목적 달성 시 파기\\n제5조 (개인정보 처리 위탁)\\n① 회사는 개인정보 처리업무를 외부 업체에 위탁하지 않으며, 자체적으로 처리하고 있습니다.\\n② 회사가 특정 업무(예: 채용 업무)를 외부 업체에 위탁할 경우, 개인정보 처리방침 시행 전 회사 홈페이지에서 공지한 후 정보주체의 동의를 받은 후 위탁합니다.\\n제6조 (정보주체의 권리·의무 및 행사 방법)\\n① 정보주체는 회사에 대해 언제든지 개인정보 열람, 정정, 삭제, 처리정지 요구 등의 권리를 행사할 수 있습니다.\\n② 권리 행사는 다음과 같은 방법으로 할 수 있습니다:\\n- 서면: 회사 주소로 서면 제출\\n- 전자우편: 회사 이메일로 요청\\n- 모사전송(FAX): 회사 FAX로 요청\\n③ 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자를 통해 대리로도 가능합니다. 이 경우 “개인정보 처리 방법에 관한 고시” 별지 제11호 서식에 따른 위임장을 제출해야 합니다.\\n④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 따라 제한될 수 있습니다.\\n⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에 따라 수집된 개인정보인 경우 제한될 수 있습니다.\\n⑥ 회사는 권리 행사를 요청한 자가 본인 또는 정당한 대리인인지를 확인합니다.\\n제7조 (처리하는 개인정보의 항목)\\n회사는 다음의 개인정보 항목을 처리합니다:\\n- 수집 항목:\\n- 필수 항목: 성명, 휴대전화번호, 이메일\\n- 선택 항목: 회사전화번호, 문의사항\\n- 수집 방법:\\n- 홈페이지, 전화, 이메일을 통해 수집\\n제8조 (개인정보의 파기)\\n① 회사는 개인정보 보유 기간의 경과, 처리 목적 달성 등 개인정보가 불필요하게 되었을 때 지체 없이 해당 개인정보를 파기합니다.\\n② 정보주체로부터 동의받은 개인정보 보유 기간이 경과하거나 처리 목적이 달성된 경우에도 다른 법령에 따라 개인정보를 계속 보존해야 할 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관 장소를 달리하여 보존합니다.\\n③ 개인정보 파기의 절차 및 방법은 다음과 같습니다:\\n- 파기 절차: 회사는 파기 사유가 발생한 개인정보를 선정하고, 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.\\n- 파기 방법: 전자적 파일 형태로 기록된 개인정보는 복구할 수 없도록 기술적 방법을 사용해 삭제하며, 종이 문서에 기록된 개인정보는 분쇄기로 분쇄하거나 소각하여 파기합니다.\\n제9조 (개인정보의 안전성 확보 조치)\\n회사는 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취합니다:\\n- 관리적 조치: 내부관리계획 수립·시행, 정기적 직원 교육\\n- 기술적 조치: 개인정보처리시스템 접근 권한 관리, 접근통제시스템 설치, 고유식별정보 암호화, 보안 프로그램 설치\\n- 물리적 조치: 전산실 및 자료보관실 접근 통제\\n제10조 (개인정보 자동 수집 장치의 설치·운영 및 거부에 관한 사항)\\n회사는 쿠키(Cookie)를 사용하지 않습니다. 쿠키는 이용자의 이용 정보를 저장하고 수시로 불러오는 작은 파일로, 바론서비스에서는 쿠키를 사용하지 않습니다.\\n제11조 (개인정보 보호책임자)\\n회사는 개인정보 처리에 관한 업무를 총괄하여 책임지고, 개인정보 처리와 관련된 정보주체의 불만처리 및 피해구제를 위해 개인정보 보호책임자를 지정하고 있습니다.\\n개인정보 보호책임자:\\n- 성명: 염승호\\n- 직책: 수석연구원\\n- 연락처: 02-2141-7448\\n- 팩스번호: 02-2141-7599\\n- 이메일: b23008@baroncs.co.kr\\n제12조 (개인정보 열람청구)\\n정보주체는 「개인정보 보호법」 제35조에 따른 개인정보 열람 청구를 아래 부서에 할 수 있습니다. 회사는 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다.\\n개인정보 열람청구 접수·처리 부서:\\n- 부서명: 총괄기획실\\n- 담당자: 권혁진\\n- 연락처: 02-2141-7465\\n- 팩스번호: 02-2141-7599\\n- 이메일: baroncs@baroncs.co.kr\\n제13조 (권익침해 구제방법)\\n정보주체는 개인정보 침해로 인한 구제를 위해 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보해신고센터 등에 분쟁 해결이나 상담을 신청할 수 있습니다.\\n- 개인정보분쟁조정위원회: (국번없이) 1833-6972 (www.kopico.go.kr)\\n- 개인정보침해신고센터: (국번없이) 118 (privacy.kisa.or.kr)\\n- 대검찰청: (국번없이) 1301 (www.spo.go.kr)\\n- 경찰청: (국번없이) 182 (www.police.go.kr)\\n제14조 (개인정보 처리방침의 변경)\\n본 개인정보처리방침은 법령, 정책 또는 보안 기술의 변경에 따라 내용의 추가, 삭제 및 수정이 있을 시, 개정 최소 7일 전에 홈페이지를 통해 사전 공지합니다.\\n\\n부칙\\n제1조 (시행일자)\\n이 개인정보처리방침은 2024년 10월 1일부터 시행됩니다.\\n제2조 (개정 및 고지의 의무)\\n회사는 개인정보처리방침을 변경하는 경우, 변경사항을 시행일자 7일 전부터 서비스 내 공지사항 페이지를 통해 고지할 것입니다. 다만, 이용자의 권리나 의무에 중대한 변경이 발생하는 경우에는 시행일자 30일 전부터 고지합니다.\\n제3조 (유효성)\\n본 개인정보처리방침의 일부 조항이 법적 또는 기타 사유로 인해 무효화되거나 시행할 수 없는 경우, 나머지 조항들은 계속해서 유효합니다. 무효화된 조항은 관련 법령에 부합하는 방식으로 수정되어 효력을 지속합니다.\\n제4조 (변경 통지의 방법)\\n회사는 개인정보처리방침의 변경 시, 다음의 방법으로 이용자에게 고지합니다:\\n- 서비스 초기화면 또는 팝업 공지\\n- 이메일 발송\\n- 회사 홈페이지 공지사항\\n제5조 (비회원의 개인정보 보호)\\n회사는 비회원의 개인정보도 회원과 동일한 수준으로 보호합니다. 비회원이 개인정보 제공을 거부할 경우 일부 서비스 이용에 제한이 있을 수 있습니다.\\n제6조 (14세 미만 아동의 개인정보 보호)\\n회사는 14세 미만 아동의 개인정보를 수집하지 않습니다. 만일 14세 미만 아동의 개인정보가 수집된 경우, 법정 대리인의 동의를 받아야 하며, 법정 대리인의 동의 없이 수집된 경우 이를 지체 없이 파기합니다.\\n제7조 (개인정보의 국외 이전)\\n회사는 이용자의 개인정보를 국외로 이전하지 않으며, 향후 필요한 경우, 사전에 이용자의 동의를 받습니다.\\n제8조 (기타)\\n본 방침에 명시되지 않은 사항은 회사의 내부 방침과 관련 법령에 따릅니다.\\n", "msg.userfront.signup.profile.affiliate_hint": "가족사 이메일 사용 시 자동으로 선택됩니다.", "msg.userfront.signup.profile.title": "회원님의\\\\n소속 정보를 알려주세요", "msg.userfront.signup.success.body": "성공적으로 가입되었습니다.", "msg.userfront.signup.success.title": "회원가입 완료", - "msg.userfront.signup.tos_full": "\\n바론 소프트웨어 이용약관\\n\\n제1장 총칙\\n제1조 (목적)\\n이 약관은 바론컨설턴트(이하 \\\"회사\\\"라 합니다)가 제공하는 바론소프트웨어(이하 \\\"서비스\\\"라 합니다)를 이용함에 있어 회사와 이용자 간의 권리, 의무 및 책임사항과 기타 필요한 사항을 정하는 것을 목적으로 합니다.\\n제2조 (용어의 정의)\\n① 본 약관에서 사용하는 용어의 정의는 다음과 같습니다:\\n- “서비스”란 회사가 제공하는 소프트웨어 및 관련 제반 서비스를 의미합니다.\\n- “이용자”란 회사의 서비스에 접속하여 본 약관에 따라 회사가 제공하는 서비스를 이용하는 회원 및 비회원을 말합니다.\\n- “회원”이란 본 약관에 동의하고 회사와 이용계약을 체결한 자를 의미합니다.\\n- “비회원”이란 회원가입을 하지 않고 회사가 제공하는 일부 서비스를 이용하는 자를 말합니다.\\n제3조 (약관의 효력 및 변경)\\n① 본 약관은 이용자가 본 약관에 동의하고, 회사가 이에 대한 승낙을 완료함으로써 효력이 발생합니다. ② 회사는 필요한 경우 본 약관을 변경할 수 있으며, 변경된 약관은 서비스 화면에 공지된 후 효력이 발생합니다.\\n제4조 (약관 외 준칙)\\n본 약관에 명시되지 않은 사항에 대해서는 대한민국의 관련 법령과 상관습에 따릅니다.\\n제2장 서비스 이용계약\\n제5조 (이용계약의 성립)\\n이용계약은 이용자가 약관의 내용에 동의하고, 회사가 제공하는 소정의 회원가입 신청서를 작성하여 가입을 완료한 후, 회사가 이를 승인함으로써 성립합니다.\\n제6조 (이용계약의 유보와 거절)\\n① 회사는 다음 각 호에 해당하는 경우 이용계약의 성립을 유보하거나 거절할 수 있습니다: - 신청서의 내용이 허위로 판명된 경우 - 서비스 제공이 기술적으로 어려운 경우\\n제7조 (계약사항의 변경)\\n회원은 개인정보 관리 메뉴를 통해 언제든지 자신의 정보를 열람하고 수정할 수 있습니다. 회원의 정보가 변경된 경우 즉시 수정해야 하며, 수정하지 않아 발생하는 문제의 책임은 회원에게 있습니다.\\n제3장 개인정보 보호\\n제8조 (개인정보 보호의 원칙)\\n① 회원의 개인정보는 관련 법령에 따라 보호됩니다. ② 회사는 개인정보 보호와 관련된 세부 사항을 별도로 마련한 개인정보처리방침에 따라 관리하며, 이용자는 언제든지 해당 방침을 통해 개인정보 관리에 대한 자세한 내용을 확인할 수 있습니다.\\n제9조 (개인정보처리방침 준수)\\n① 회사는 개인정보 보호와 관련된 구체적인 사항을 개인정보처리방침에 따라 관리합니다. ② 개인정보의 수집, 이용, 제공, 보관, 보호 등에 관한 사항은 회사의 개인정보처리방침을 따르며, 이용자는 회사 웹사이트에서 이를 확인할 수 있습니다. ③ 회사는 개인정보 보호를 위해 최선을 다하며, 관련 법령에 따라 이용자의 개인정보를 안전하게 관리합니다.\\n제10조 (14세 미만 아동의 개인정보 보호)\\n① 회사는 14세 미만 아동의 개인정보를 수집할 경우, 반드시 법정대리인의 동의를 받아야 합니다. ② 법정대리인은 아동의 개인정보 열람, 수정, 삭제를 요청할 수 있으며, 회사는 이를 신속하게 처리합니다. ③ 14세 미만 아동의 개인정보 보호와 관련된 구체적인 사항은 개인정보처리방침에 명시되어 있습니다.\\n제4장 서비스 제공 및 이용\\n제11조 (서비스 제공)\\n회사는 회원의 이용 신청을 승인한 때부터 서비스를 개시합니다. 서비스 이용은 연중무휴 24시간을 원칙으로 합니다.\\n제12조 (서비스의 변경 및 중단)\\n회사는 서비스 제공이 어려운 경우 사전 고지 후 서비스를 변경하거나 중단할 수 있습니다.\\n제5장 정보 제공 및 광고\\n제13조 (정보 제공 및 광고)\\n① 회사는 서비스 이용 중 필요하다고 인정되는 정보 및 광고를 제공할 수 있습니다. ② 회원은 원치 않는 정보를 수신 거부할 수 있습니다.\\n제6장 게시물 관리\\n제14조 (게시물의 관리)\\n회사는 회원이 게시한 내용이 불법적이거나 약관에 위배될 경우 이를 삭제할 수 있습니다.\\n제15조 (게시물의 저작권)\\n게시물의 저작권은 회원에게 있으며, 회사는 이를 서비스 홍보 및 개선 목적으로 사용할 수 있습니다.\\n제7장 계약 해지 및 이용 제한\\n제16조 (계약 해지)\\n회원은 언제든지 계약 해지를 요청할 수 있으며, 회사는 신속하게 처리합니다.\\n제17조 (이용 제한)\\n회사는 회원이 약관을 위반할 경우 서비스 이용을 제한할 수 있습니다.\\n제8장 손해 배상 및 면책 조항\\n제18조 (손해 배상)\\n회사는 무료로 제공되는 서비스와 관련하여 회원에게 발생한 손해에 대해 책임을 지지 않습니다.\\n제19조 (면책 조항)\\n회사는 천재지변 등 불가항력적인 사유로 인해 서비스를 제공하지 못하는 경우 책임을 지지 않습니다.\\n제9장 유료 서비스\\n20조 (유료 서비스의 이용)\\n① 회사는 회원에게 특정 서비스에 대해 유료로 제공할 수 있습니다. ② 유료 서비스의 이용 요금, 결제 방식, 환불 절차 등에 대한 상세 내용은 서비스 안내 페이지와 결제 화면에 명시합니다. ③ 유료 서비스 이용 요금은 회사가 정한 결제 방식에 따라 결제됩니다. 회원은 신용카드, 계좌이체, 휴대전화 결제 등 회사가 제공하는 다양한 결제 방식을 통해 요금을 납부할 수 있습니다. ④ 유료 서비스의 이용 요금은 선불 결제를 원칙으로 하며, 이용 기간 중 서비스 중지 및 해지 시 남은 이용 기간에 대한 환불은 회사의 환불 정책에 따라 처리됩니다. ⑤ 회사는 회원의 유료 서비스 이용과 관련하여 발생한 문제에 대해 최선을 다해 해결하도록 노력합니다. 다만, 회사의 고의 또는 중대한 과실이 없는 한 회원이 유료 서비스 이용 중 입은 손해에 대해서는 책임을 지지 않습니다.\\n제21조(환불 정책)\\n① 회원은 결제 후 7일 이내에 서비스 이용을 시작하지 않은 경우, 요금 전액을 환불받을 수 있습니다. ② 유료 서비스 이용 중 부득이한 사유로 서비스가 중지된 경우, 회사는 이용하지 않은 부분에 대해 환불 절차를 밟습니다. ③ 회원의 귀책사유로 인해 서비스 이용이 중지된 경우, 환불이 불가능합니다. ④ 환불은 회원이 지정한 계좌로 환불 절차를 거치며, 환불 요청 후 7일 이내에 처리됩니다.\\n제22조 (유료 서비스의 중지 및 해지)\\n① 회원이 유료 서비스를 해지하고자 하는 경우, 회사의 고객 지원 센터에 해지 신청을 해야 합니다. ② 회사는 회원이 약관을 위반하거나 부정한 방법으로 유료 서비스를 이용한 경우, 유료 서비스 이용을 즉시 중지하고 계약을 해지할 수 있습니다.\\n제10장 양도 금지\\n제23조 (양도 금지)\\n회원은 서비스 이용권한, 기타 이용계약상의 지위를 제3자에게 양도, 증여할 수 없으며, 이를 담보로 제공할 수 없습니다.\\n제11장 관할 법원\\n제24조 (분쟁 해결)\\n서비스 이용과 관련하여 분쟁이 발생한 경우, 회사와 회원은 성실히 협의하여 해결합니다.\\n제25조 (관할 법원)\\n본 약관에 따른 분쟁은 서울중앙지방법원을 관할 법원으로 합니다.\\n부칙\\n본 약관은 2024년 10월 1일부터 시행됩니다.\\n", + "msg.userfront.signup.tos_full": + "\\n바론 소프트웨어 이용약관\\n\\n제1장 총칙\\n제1조 (목적)\\n이 약관은 바론컨설턴트(이하 \\\"회사\\\"라 합니다)가 제공하는 바론소프트웨어(이하 \\\"서비스\\\"라 합니다)를 이용함에 있어 회사와 이용자 간의 권리, 의무 및 책임사항과 기타 필요한 사항을 정하는 것을 목적으로 합니다.\\n제2조 (용어의 정의)\\n① 본 약관에서 사용하는 용어의 정의는 다음과 같습니다:\\n- “서비스”란 회사가 제공하는 소프트웨어 및 관련 제반 서비스를 의미합니다.\\n- “이용자”란 회사의 서비스에 접속하여 본 약관에 따라 회사가 제공하는 서비스를 이용하는 회원 및 비회원을 말합니다.\\n- “회원”이란 본 약관에 동의하고 회사와 이용계약을 체결한 자를 의미합니다.\\n- “비회원”이란 회원가입을 하지 않고 회사가 제공하는 일부 서비스를 이용하는 자를 말합니다.\\n제3조 (약관의 효력 및 변경)\\n① 본 약관은 이용자가 본 약관에 동의하고, 회사가 이에 대한 승낙을 완료함으로써 효력이 발생합니다. ② 회사는 필요한 경우 본 약관을 변경할 수 있으며, 변경된 약관은 서비스 화면에 공지된 후 효력이 발생합니다.\\n제4조 (약관 외 준칙)\\n본 약관에 명시되지 않은 사항에 대해서는 대한민국의 관련 법령과 상관습에 따릅니다.\\n제2장 서비스 이용계약\\n제5조 (이용계약의 성립)\\n이용계약은 이용자가 약관의 내용에 동의하고, 회사가 제공하는 소정의 회원가입 신청서를 작성하여 가입을 완료한 후, 회사가 이를 승인함으로써 성립합니다.\\n제6조 (이용계약의 유보와 거절)\\n① 회사는 다음 각 호에 해당하는 경우 이용계약의 성립을 유보하거나 거절할 수 있습니다: - 신청서의 내용이 허위로 판명된 경우 - 서비스 제공이 기술적으로 어려운 경우\\n제7조 (계약사항의 변경)\\n회원은 개인정보 관리 메뉴를 통해 언제든지 자신의 정보를 열람하고 수정할 수 있습니다. 회원의 정보가 변경된 경우 즉시 수정해야 하며, 수정하지 않아 발생하는 문제의 책임은 회원에게 있습니다.\\n제3장 개인정보 보호\\n제8조 (개인정보 보호의 원칙)\\n① 회원의 개인정보는 관련 법령에 따라 보호됩니다. ② 회사는 개인정보 보호와 관련된 세부 사항을 별도로 마련한 개인정보처리방침에 따라 관리하며, 이용자는 언제든지 해당 방침을 통해 개인정보 관리에 대한 자세한 내용을 확인할 수 있습니다.\\n제9조 (개인정보처리방침 준수)\\n① 회사는 개인정보 보호와 관련된 구체적인 사항을 개인정보처리방침에 따라 관리합니다. ② 개인정보의 수집, 이용, 제공, 보관, 보호 등에 관한 사항은 회사의 개인정보처리방침을 따르며, 이용자는 회사 웹사이트에서 이를 확인할 수 있습니다. ③ 회사는 개인정보 보호를 위해 최선을 다하며, 관련 법령에 따라 이용자의 개인정보를 안전하게 관리합니다.\\n제10조 (14세 미만 아동의 개인정보 보호)\\n① 회사는 14세 미만 아동의 개인정보를 수집할 경우, 반드시 법정대리인의 동의를 받아야 합니다. ② 법정대리인은 아동의 개인정보 열람, 수정, 삭제를 요청할 수 있으며, 회사는 이를 신속하게 처리합니다. ③ 14세 미만 아동의 개인정보 보호와 관련된 구체적인 사항은 개인정보처리방침에 명시되어 있습니다.\\n제4장 서비스 제공 및 이용\\n제11조 (서비스 제공)\\n회사는 회원의 이용 신청을 승인한 때부터 서비스를 개시합니다. 서비스 이용은 연중무휴 24시간을 원칙으로 합니다.\\n제12조 (서비스의 변경 및 중단)\\n회사는 서비스 제공이 어려운 경우 사전 고지 후 서비스를 변경하거나 중단할 수 있습니다.\\n제5장 정보 제공 및 광고\\n제13조 (정보 제공 및 광고)\\n① 회사는 서비스 이용 중 필요하다고 인정되는 정보 및 광고를 제공할 수 있습니다. ② 회원은 원치 않는 정보를 수신 거부할 수 있습니다.\\n제6장 게시물 관리\\n제14조 (게시물의 관리)\\n회사는 회원이 게시한 내용이 불법적이거나 약관에 위배될 경우 이를 삭제할 수 있습니다.\\n제15조 (게시물의 저작권)\\n게시물의 저작권은 회원에게 있으며, 회사는 이를 서비스 홍보 및 개선 목적으로 사용할 수 있습니다.\\n제7장 계약 해지 및 이용 제한\\n제16조 (계약 해지)\\n회원은 언제든지 계약 해지를 요청할 수 있으며, 회사는 신속하게 처리합니다.\\n제17조 (이용 제한)\\n회사는 회원이 약관을 위반할 경우 서비스 이용을 제한할 수 있습니다.\\n제8장 손해 배상 및 면책 조항\\n제18조 (손해 배상)\\n회사는 무료로 제공되는 서비스와 관련하여 회원에게 발생한 손해에 대해 책임을 지지 않습니다.\\n제19조 (면책 조항)\\n회사는 천재지변 등 불가항력적인 사유로 인해 서비스를 제공하지 못하는 경우 책임을 지지 않습니다.\\n제9장 유료 서비스\\n20조 (유료 서비스의 이용)\\n① 회사는 회원에게 특정 서비스에 대해 유료로 제공할 수 있습니다. ② 유료 서비스의 이용 요금, 결제 방식, 환불 절차 등에 대한 상세 내용은 서비스 안내 페이지와 결제 화면에 명시합니다. ③ 유료 서비스 이용 요금은 회사가 정한 결제 방식에 따라 결제됩니다. 회원은 신용카드, 계좌이체, 휴대전화 결제 등 회사가 제공하는 다양한 결제 방식을 통해 요금을 납부할 수 있습니다. ④ 유료 서비스의 이용 요금은 선불 결제를 원칙으로 하며, 이용 기간 중 서비스 중지 및 해지 시 남은 이용 기간에 대한 환불은 회사의 환불 정책에 따라 처리됩니다. ⑤ 회사는 회원의 유료 서비스 이용과 관련하여 발생한 문제에 대해 최선을 다해 해결하도록 노력합니다. 다만, 회사의 고의 또는 중대한 과실이 없는 한 회원이 유료 서비스 이용 중 입은 손해에 대해서는 책임을 지지 않습니다.\\n제21조(환불 정책)\\n① 회원은 결제 후 7일 이내에 서비스 이용을 시작하지 않은 경우, 요금 전액을 환불받을 수 있습니다. ② 유료 서비스 이용 중 부득이한 사유로 서비스가 중지된 경우, 회사는 이용하지 않은 부분에 대해 환불 절차를 밟습니다. ③ 회원의 귀책사유로 인해 서비스 이용이 중지된 경우, 환불이 불가능합니다. ④ 환불은 회원이 지정한 계좌로 환불 절차를 거치며, 환불 요청 후 7일 이내에 처리됩니다.\\n제22조 (유료 서비스의 중지 및 해지)\\n① 회원이 유료 서비스를 해지하고자 하는 경우, 회사의 고객 지원 센터에 해지 신청을 해야 합니다. ② 회사는 회원이 약관을 위반하거나 부정한 방법으로 유료 서비스를 이용한 경우, 유료 서비스 이용을 즉시 중지하고 계약을 해지할 수 있습니다.\\n제10장 양도 금지\\n제23조 (양도 금지)\\n회원은 서비스 이용권한, 기타 이용계약상의 지위를 제3자에게 양도, 증여할 수 없으며, 이를 담보로 제공할 수 없습니다.\\n제11장 관할 법원\\n제24조 (분쟁 해결)\\n서비스 이용과 관련하여 분쟁이 발생한 경우, 회사와 회원은 성실히 협의하여 해결합니다.\\n제25조 (관할 법원)\\n본 약관에 따른 분쟁은 서울중앙지방법원을 관할 법원으로 합니다.\\n부칙\\n본 약관은 2024년 10월 1일부터 시행됩니다.\\n", "ui.admin.api_keys.create.name_label": "서비스 또는 목적 식별 이름", - "ui.admin.api_keys.create.name_placeholder": "예: Jenkins-CI, Grafana-Dashboard", + "ui.admin.api_keys.create.name_placeholder": + "예: Jenkins-CI, Grafana-Dashboard", "ui.admin.api_keys.create.section_name": "키 이름 지정", "ui.admin.api_keys.create.section_scopes": "권한 범위(Scopes) 선택", "ui.admin.api_keys.create.submit": "API 키 발급하기", @@ -415,7 +460,8 @@ const Map koStrings = { "ui.admin.tenants.create.breadcrumb.action": "Create", "ui.admin.tenants.create.breadcrumb.section": "Tenants", "ui.admin.tenants.create.form.description": "Description", - "ui.admin.tenants.create.form.domains_label": "Allowed Domains (Comma separated)", + "ui.admin.tenants.create.form.domains_label": + "Allowed Domains (Comma separated)", "ui.admin.tenants.create.form.domains_placeholder": "example.com, example.kr", "ui.admin.tenants.create.form.name": "Tenant name", "ui.admin.tenants.create.form.slug": "Slug", @@ -591,7 +637,8 @@ const Map koStrings = { "ui.dev.clients.details.endpoints.title": "OIDC 엔드포인트", "ui.dev.clients.details.redirect.callback_label": "인증 콜백 URL", "ui.dev.clients.details.redirect.label": "Redirect URIs", - "ui.dev.clients.details.redirect.placeholder": "https://your-app.com/callback, http://localhost:3000/auth/callback", + "ui.dev.clients.details.redirect.placeholder": + "https://your-app.com/callback, http://localhost:3000/auth/callback", "ui.dev.clients.details.redirect.save": "Redirect URIs 저장", "ui.dev.clients.details.redirect.title": "리디렉션 URI 설정", "ui.dev.clients.details.secret.hide": "비밀키 숨기기", @@ -607,15 +654,18 @@ const Map koStrings = { "ui.dev.clients.general.footer.client_id": "Client ID", "ui.dev.clients.general.footer.created_on": "Created On", "ui.dev.clients.general.identity.description": "Description", - "ui.dev.clients.general.identity.description_placeholder": "앱에 대한 간단한 설명을 입력하세요.", + "ui.dev.clients.general.identity.description_placeholder": + "앱에 대한 간단한 설명을 입력하세요.", "ui.dev.clients.general.identity.logo": "App Logo URL", - "ui.dev.clients.general.identity.logo_placeholder": "https://example.com/logo.png", + "ui.dev.clients.general.identity.logo_placeholder": + "https://example.com/logo.png", "ui.dev.clients.general.identity.logo_preview": "Logo Preview", "ui.dev.clients.general.identity.name": "앱 이름", "ui.dev.clients.general.identity.name_placeholder": "My Awesome Application", "ui.dev.clients.general.identity.title": "Application Identity", "ui.dev.clients.general.redirect.label": "Redirect URIs", - "ui.dev.clients.general.redirect.placeholder": "https://app.example.com/callback, http://localhost:3000/auth/callback (콤마로 구분)", + "ui.dev.clients.general.redirect.placeholder": + "https://app.example.com/callback, http://localhost:3000/auth/callback (콤마로 구분)", "ui.dev.clients.general.save": "설정 저장", "ui.dev.clients.general.scopes.add": "Scope 추가", "ui.dev.clients.general.scopes.description_placeholder": "권한에 대한 설명", @@ -872,7 +922,8 @@ const Map enStrings = { "msg.admin.scope_admin": "Scoped to /admin", "msg.admin.session_ttl": "Session TTL: 15m admin", "msg.admin.tenant_headers": "Tenant-aware headers", - "msg.admin.tenants.create.form.domains_help": "Users with these email domains will be automatically assigned to this tenant.", + "msg.admin.tenants.create.form.domains_help": + "Users with these email domains will be automatically assigned to this tenant.", "msg.admin.tenants.create.memo.body": "Body", "msg.admin.tenants.create.memo.subtitle": "Subtitle", "msg.admin.tenants.create.profile.subtitle": "Subtitle", @@ -882,9 +933,11 @@ const Map enStrings = { "msg.admin.tenants.fetch_error": "Fetch Error", "msg.admin.tenants.members.empty": "Empty", "msg.admin.tenants.registry.count": "Count", - "msg.admin.tenants.schema.empty": "No custom fields defined. Click \\\"Add Field\\\" to begin.", + "msg.admin.tenants.schema.empty": + "No custom fields defined. Click \\\"Add Field\\\" to begin.", "msg.admin.tenants.schema.missing_id": "Tenant ID missing", - "msg.admin.tenants.schema.subtitle": "Define custom attributes for users in this tenant.", + "msg.admin.tenants.schema.subtitle": + "Define custom attributes for users in this tenant.", "msg.admin.tenants.schema.update_error": "Failed to update schema", "msg.admin.tenants.schema.update_success": "Schema updated successfully", "msg.admin.tenants.sub.empty": "Empty", @@ -917,7 +970,8 @@ const Map enStrings = { "msg.dev.clients.consents.empty": "No consents found.", "msg.dev.clients.consents.load_error": "Error loading consents: {{error}}", "msg.dev.clients.consents.loading": "Loading consents...", - "msg.dev.clients.consents.showing": "Showing {{from}} to {{to}} of {{total}} users", + "msg.dev.clients.consents.showing": + "Showing {{from}} to {{to}} of {{total}} users", "msg.dev.clients.consents.subtitle": "Subtitle", "msg.dev.clients.copy_client_id": "Copy Client Id", "msg.dev.clients.details.copy_client_id": "Client ID copied.", @@ -947,8 +1001,10 @@ const Map enStrings = { "msg.dev.clients.general.security.confidential_help": "Confidential Help", "msg.dev.clients.general.security.public_help": "Public Help", "msg.dev.clients.general.security.subtitle": "Subtitle", - "msg.dev.clients.help.docs_body": "Includes PKCE, client_secret_basic, redirect URI validation tips.", - "msg.dev.clients.help.subtitle": "Developer guides for Confidential/Public clients, redirect URIs, and auth methods.", + "msg.dev.clients.help.docs_body": + "Includes PKCE, client_secret_basic, redirect URI validation tips.", + "msg.dev.clients.help.subtitle": + "Developer guides for Confidential/Public clients, redirect URIs, and auth methods.", "msg.dev.clients.load_error": "Error loading clients: {{error}}", "msg.dev.clients.loading": "Loading clients...", "msg.dev.clients.registry.description": "Description", @@ -1132,12 +1188,14 @@ const Map enStrings = { "msg.userfront.signup.policy.summary": "Summary", "msg.userfront.signup.policy.symbol": "Symbol", "msg.userfront.signup.policy.uppercase": "Uppercase", - "msg.userfront.signup.privacy_full": "\\n개인정보 수집 및 이용 동의\\n\\n바론서비스 개인정보처리방침\\n\\n제1조 (목적)\\n바론컨설턴트(이하 \\\"회사\\\")는 바론서비스(이하 \\\"서비스\\\")를 이용하는 고객(이하 \\\"이용자\\\")의 개인정보를 보호하고, 「개인정보 보호법」에 따라 책임과 의무를 다하기 위해 본 개인정보처리방침을 마련했습니다. 본 방침은 이용자가 제공한 개인정보가 어떻게 수집, 이용, 보관, 보호되는지를 설명합니다.\\n제2조 (개인정보의 처리목적)\\n회사는 다음의 목적을 위해 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며, 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.\\n- 본인확인: 회원가입 및 관리를 위한 본인 확인, 전화 또는 이메일을 통한 연락\\n- 서비스 제공: 각종 통보 및 서비스 제공을 위한 업무 처리\\n- 제품소개서 다운로드: 설명자료 전달\\n- 상담 및 데모 신청: 상담 제공 및 데모 제공, 계약 처리자 정보 수집\\n- 행사 참가 신청: 참석 안내 및 세미나/설명회/교육 제공\\n- 보안가이드 제공: 안내자료 전달\\n- 기술지원 문의: 서비스 사용 지원\\n- 서비스 개선 의견 접수: 서비스 품질 개선\\n- 마케팅 활동: 동의한 고객에 한해 뉴스레터 및 매거진 발송\\n제3조 (개인정보의 처리 및 보유 기간)\\n① 회사는 법령에 따른 개인정보 보유 및 이용기간 또는 정보주체로부터 개인정보를 수집 시 동의받은 개인정보 보유 및 이용기간 내에서 개인정보를 처리 및 보유합니다.\\n② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다:\\n- 회원정보: 회원가입일부터 회원탈퇴 후 1년까지\\n- 홍보, 상담, 계약용 개인정보: 2년\\n제4조 (개인정보의 제3자 제공)\\n① 회사는 정보주체의 개인정보를 제2조에서 명시한 범위 내에서만 처리하며, 정보 주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.\\n② 회사는 다음과 같이 개인정보를 제3자에게 제공하고 있습니다:\\n- 제공받는 자: 수사기관 및 유관기관, 피신고업체\\n- 이용 목적: 개인정보 침해 민원 처리\\n- 제공하는 개인정보 항목: 성명, 연락처, 이메일\\n- 보유 및 이용기간: 법령에서 정한 보존기간 및 제공목적 달성 시 파기\\n제5조 (개인정보 처리 위탁)\\n① 회사는 개인정보 처리업무를 외부 업체에 위탁하지 않으며, 자체적으로 처리하고 있습니다.\\n② 회사가 특정 업무(예: 채용 업무)를 외부 업체에 위탁할 경우, 개인정보 처리방침 시행 전 회사 홈페이지에서 공지한 후 정보주체의 동의를 받은 후 위탁합니다.\\n제6조 (정보주체의 권리·의무 및 행사 방법)\\n① 정보주체는 회사에 대해 언제든지 개인정보 열람, 정정, 삭제, 처리정지 요구 등의 권리를 행사할 수 있습니다.\\n② 권리 행사는 다음과 같은 방법으로 할 수 있습니다:\\n- 서면: 회사 주소로 서면 제출\\n- 전자우편: 회사 이메일로 요청\\n- 모사전송(FAX): 회사 FAX로 요청\\n③ 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자를 통해 대리로도 가능합니다. 이 경우 “개인정보 처리 방법에 관한 고시” 별지 제11호 서식에 따른 위임장을 제출해야 합니다.\\n④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 따라 제한될 수 있습니다.\\n⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에 따라 수집된 개인정보인 경우 제한될 수 있습니다.\\n⑥ 회사는 권리 행사를 요청한 자가 본인 또는 정당한 대리인인지를 확인합니다.\\n제7조 (처리하는 개인정보의 항목)\\n회사는 다음의 개인정보 항목을 처리합니다:\\n- 수집 항목:\\n- 필수 항목: 성명, 휴대전화번호, 이메일\\n- 선택 항목: 회사전화번호, 문의사항\\n- 수집 방법:\\n- 홈페이지, 전화, 이메일을 통해 수집\\n제8조 (개인정보의 파기)\\n① 회사는 개인정보 보유 기간의 경과, 처리 목적 달성 등 개인정보가 불필요하게 되었을 때 지체 없이 해당 개인정보를 파기합니다.\\n② 정보주체로부터 동의받은 개인정보 보유 기간이 경과하거나 처리 목적이 달성된 경우에도 다른 법령에 따라 개인정보를 계속 보존해야 할 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관 장소를 달리하여 보존합니다.\\n③ 개인정보 파기의 절차 및 방법은 다음과 같습니다:\\n- 파기 절차: 회사는 파기 사유가 발생한 개인정보를 선정하고, 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.\\n- 파기 방법: 전자적 파일 형태로 기록된 개인정보는 복구할 수 없도록 기술적 방법을 사용해 삭제하며, 종이 문서에 기록된 개인정보는 분쇄기로 분쇄하거나 소각하여 파기합니다.\\n제9조 (개인정보의 안전성 확보 조치)\\n회사는 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취합니다:\\n- 관리적 조치: 내부관리계획 수립·시행, 정기적 직원 교육\\n- 기술적 조치: 개인정보처리시스템 접근 권한 관리, 접근통제시스템 설치, 고유식별정보 암호화, 보안 프로그램 설치\\n- 물리적 조치: 전산실 및 자료보관실 접근 통제\\n제10조 (개인정보 자동 수집 장치의 설치·운영 및 거부에 관한 사항)\\n회사는 쿠키(Cookie)를 사용하지 않습니다. 쿠키는 이용자의 이용 정보를 저장하고 수시로 불러오는 작은 파일로, 바론서비스에서는 쿠키를 사용하지 않습니다.\\n제11조 (개인정보 보호책임자)\\n회사는 개인정보 처리에 관한 업무를 총괄하여 책임지고, 개인정보 처리와 관련된 정보주체의 불만처리 및 피해구제를 위해 개인정보 보호책임자를 지정하고 있습니다.\\n개인정보 보호책임자:\\n- 성명: 염승호\\n- 직책: 수석연구원\\n- 연락처: 02-2141-7448\\n- 팩스번호: 02-2141-7599\\n- 이메일: b23008@baroncs.co.kr\\n제12조 (개인정보 열람청구)\\n정보주체는 「개인정보 보호법」 제35조에 따른 개인정보 열람 청구를 아래 부서에 할 수 있습니다. 회사는 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다.\\n개인정보 열람청구 접수·처리 부서:\\n- 부서명: 총괄기획실\\n- 담당자: 권혁진\\n- 연락처: 02-2141-7465\\n- 팩스번호: 02-2141-7599\\n- 이메일: baroncs@baroncs.co.kr\\n제13조 (권익침해 구제방법)\\n정보주체는 개인정보 침해로 인한 구제를 위해 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보해신고센터 등에 분쟁 해결이나 상담을 신청할 수 있습니다.\\n- 개인정보분쟁조정위원회: (국번없이) 1833-6972 (www.kopico.go.kr)\\n- 개인정보침해신고센터: (국번없이) 118 (privacy.kisa.or.kr)\\n- 대검찰청: (국번없이) 1301 (www.spo.go.kr)\\n- 경찰청: (국번없이) 182 (www.police.go.kr)\\n제14조 (개인정보 처리방침의 변경)\\n본 개인정보처리방침은 법령, 정책 또는 보안 기술의 변경에 따라 내용의 추가, 삭제 및 수정이 있을 시, 개정 최소 7일 전에 홈페이지를 통해 사전 공지합니다.\\n\\n부칙\\n제1조 (시행일자)\\n이 개인정보처리방침은 2024년 10월 1일부터 시행됩니다.\\n제2조 (개정 및 고지의 의무)\\n회사는 개인정보처리방침을 변경하는 경우, 변경사항을 시행일자 7일 전부터 서비스 내 공지사항 페이지를 통해 고지할 것입니다. 다만, 이용자의 권리나 의무에 중대한 변경이 발생하는 경우에는 시행일자 30일 전부터 고지합니다.\\n제3조 (유효성)\\n본 개인정보처리방침의 일부 조항이 법적 또는 기타 사유로 인해 무효화되거나 시행할 수 없는 경우, 나머지 조항들은 계속해서 유효합니다. 무효화된 조항은 관련 법령에 부합하는 방식으로 수정되어 효력을 지속합니다.\\n제4조 (변경 통지의 방법)\\n회사는 개인정보처리방침의 변경 시, 다음의 방법으로 이용자에게 고지합니다:\\n- 서비스 초기화면 또는 팝업 공지\\n- 이메일 발송\\n- 회사 홈페이지 공지사항\\n제5조 (비회원의 개인정보 보호)\\n회사는 비회원의 개인정보도 회원과 동일한 수준으로 보호합니다. 비회원이 개인정보 제공을 거부할 경우 일부 서비스 이용에 제한이 있을 수 있습니다.\\n제6조 (14세 미만 아동의 개인정보 보호)\\n회사는 14세 미만 아동의 개인정보를 수집하지 않습니다. 만일 14세 미만 아동의 개인정보가 수집된 경우, 법정 대리인의 동의를 받아야 하며, 법정 대리인의 동의 없이 수집된 경우 이를 지체 없이 파기합니다.\\n제7조 (개인정보의 국외 이전)\\n회사는 이용자의 개인정보를 국외로 이전하지 않으며, 향후 필요한 경우, 사전에 이용자의 동의를 받습니다.\\n제8조 (기타)\\n본 방침에 명시되지 않은 사항은 회사의 내부 방침과 관련 법령에 따릅니다.\\n", + "msg.userfront.signup.privacy_full": + "\\n개인정보 수집 및 이용 동의\\n\\n바론서비스 개인정보처리방침\\n\\n제1조 (목적)\\n바론컨설턴트(이하 \\\"회사\\\")는 바론서비스(이하 \\\"서비스\\\")를 이용하는 고객(이하 \\\"이용자\\\")의 개인정보를 보호하고, 「개인정보 보호법」에 따라 책임과 의무를 다하기 위해 본 개인정보처리방침을 마련했습니다. 본 방침은 이용자가 제공한 개인정보가 어떻게 수집, 이용, 보관, 보호되는지를 설명합니다.\\n제2조 (개인정보의 처리목적)\\n회사는 다음의 목적을 위해 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며, 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.\\n- 본인확인: 회원가입 및 관리를 위한 본인 확인, 전화 또는 이메일을 통한 연락\\n- 서비스 제공: 각종 통보 및 서비스 제공을 위한 업무 처리\\n- 제품소개서 다운로드: 설명자료 전달\\n- 상담 및 데모 신청: 상담 제공 및 데모 제공, 계약 처리자 정보 수집\\n- 행사 참가 신청: 참석 안내 및 세미나/설명회/교육 제공\\n- 보안가이드 제공: 안내자료 전달\\n- 기술지원 문의: 서비스 사용 지원\\n- 서비스 개선 의견 접수: 서비스 품질 개선\\n- 마케팅 활동: 동의한 고객에 한해 뉴스레터 및 매거진 발송\\n제3조 (개인정보의 처리 및 보유 기간)\\n① 회사는 법령에 따른 개인정보 보유 및 이용기간 또는 정보주체로부터 개인정보를 수집 시 동의받은 개인정보 보유 및 이용기간 내에서 개인정보를 처리 및 보유합니다.\\n② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다:\\n- 회원정보: 회원가입일부터 회원탈퇴 후 1년까지\\n- 홍보, 상담, 계약용 개인정보: 2년\\n제4조 (개인정보의 제3자 제공)\\n① 회사는 정보주체의 개인정보를 제2조에서 명시한 범위 내에서만 처리하며, 정보 주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.\\n② 회사는 다음과 같이 개인정보를 제3자에게 제공하고 있습니다:\\n- 제공받는 자: 수사기관 및 유관기관, 피신고업체\\n- 이용 목적: 개인정보 침해 민원 처리\\n- 제공하는 개인정보 항목: 성명, 연락처, 이메일\\n- 보유 및 이용기간: 법령에서 정한 보존기간 및 제공목적 달성 시 파기\\n제5조 (개인정보 처리 위탁)\\n① 회사는 개인정보 처리업무를 외부 업체에 위탁하지 않으며, 자체적으로 처리하고 있습니다.\\n② 회사가 특정 업무(예: 채용 업무)를 외부 업체에 위탁할 경우, 개인정보 처리방침 시행 전 회사 홈페이지에서 공지한 후 정보주체의 동의를 받은 후 위탁합니다.\\n제6조 (정보주체의 권리·의무 및 행사 방법)\\n① 정보주체는 회사에 대해 언제든지 개인정보 열람, 정정, 삭제, 처리정지 요구 등의 권리를 행사할 수 있습니다.\\n② 권리 행사는 다음과 같은 방법으로 할 수 있습니다:\\n- 서면: 회사 주소로 서면 제출\\n- 전자우편: 회사 이메일로 요청\\n- 모사전송(FAX): 회사 FAX로 요청\\n③ 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자를 통해 대리로도 가능합니다. 이 경우 “개인정보 처리 방법에 관한 고시” 별지 제11호 서식에 따른 위임장을 제출해야 합니다.\\n④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 따라 제한될 수 있습니다.\\n⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에 따라 수집된 개인정보인 경우 제한될 수 있습니다.\\n⑥ 회사는 권리 행사를 요청한 자가 본인 또는 정당한 대리인인지를 확인합니다.\\n제7조 (처리하는 개인정보의 항목)\\n회사는 다음의 개인정보 항목을 처리합니다:\\n- 수집 항목:\\n- 필수 항목: 성명, 휴대전화번호, 이메일\\n- 선택 항목: 회사전화번호, 문의사항\\n- 수집 방법:\\n- 홈페이지, 전화, 이메일을 통해 수집\\n제8조 (개인정보의 파기)\\n① 회사는 개인정보 보유 기간의 경과, 처리 목적 달성 등 개인정보가 불필요하게 되었을 때 지체 없이 해당 개인정보를 파기합니다.\\n② 정보주체로부터 동의받은 개인정보 보유 기간이 경과하거나 처리 목적이 달성된 경우에도 다른 법령에 따라 개인정보를 계속 보존해야 할 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관 장소를 달리하여 보존합니다.\\n③ 개인정보 파기의 절차 및 방법은 다음과 같습니다:\\n- 파기 절차: 회사는 파기 사유가 발생한 개인정보를 선정하고, 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.\\n- 파기 방법: 전자적 파일 형태로 기록된 개인정보는 복구할 수 없도록 기술적 방법을 사용해 삭제하며, 종이 문서에 기록된 개인정보는 분쇄기로 분쇄하거나 소각하여 파기합니다.\\n제9조 (개인정보의 안전성 확보 조치)\\n회사는 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취합니다:\\n- 관리적 조치: 내부관리계획 수립·시행, 정기적 직원 교육\\n- 기술적 조치: 개인정보처리시스템 접근 권한 관리, 접근통제시스템 설치, 고유식별정보 암호화, 보안 프로그램 설치\\n- 물리적 조치: 전산실 및 자료보관실 접근 통제\\n제10조 (개인정보 자동 수집 장치의 설치·운영 및 거부에 관한 사항)\\n회사는 쿠키(Cookie)를 사용하지 않습니다. 쿠키는 이용자의 이용 정보를 저장하고 수시로 불러오는 작은 파일로, 바론서비스에서는 쿠키를 사용하지 않습니다.\\n제11조 (개인정보 보호책임자)\\n회사는 개인정보 처리에 관한 업무를 총괄하여 책임지고, 개인정보 처리와 관련된 정보주체의 불만처리 및 피해구제를 위해 개인정보 보호책임자를 지정하고 있습니다.\\n개인정보 보호책임자:\\n- 성명: 염승호\\n- 직책: 수석연구원\\n- 연락처: 02-2141-7448\\n- 팩스번호: 02-2141-7599\\n- 이메일: b23008@baroncs.co.kr\\n제12조 (개인정보 열람청구)\\n정보주체는 「개인정보 보호법」 제35조에 따른 개인정보 열람 청구를 아래 부서에 할 수 있습니다. 회사는 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다.\\n개인정보 열람청구 접수·처리 부서:\\n- 부서명: 총괄기획실\\n- 담당자: 권혁진\\n- 연락처: 02-2141-7465\\n- 팩스번호: 02-2141-7599\\n- 이메일: baroncs@baroncs.co.kr\\n제13조 (권익침해 구제방법)\\n정보주체는 개인정보 침해로 인한 구제를 위해 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보해신고센터 등에 분쟁 해결이나 상담을 신청할 수 있습니다.\\n- 개인정보분쟁조정위원회: (국번없이) 1833-6972 (www.kopico.go.kr)\\n- 개인정보침해신고센터: (국번없이) 118 (privacy.kisa.or.kr)\\n- 대검찰청: (국번없이) 1301 (www.spo.go.kr)\\n- 경찰청: (국번없이) 182 (www.police.go.kr)\\n제14조 (개인정보 처리방침의 변경)\\n본 개인정보처리방침은 법령, 정책 또는 보안 기술의 변경에 따라 내용의 추가, 삭제 및 수정이 있을 시, 개정 최소 7일 전에 홈페이지를 통해 사전 공지합니다.\\n\\n부칙\\n제1조 (시행일자)\\n이 개인정보처리방침은 2024년 10월 1일부터 시행됩니다.\\n제2조 (개정 및 고지의 의무)\\n회사는 개인정보처리방침을 변경하는 경우, 변경사항을 시행일자 7일 전부터 서비스 내 공지사항 페이지를 통해 고지할 것입니다. 다만, 이용자의 권리나 의무에 중대한 변경이 발생하는 경우에는 시행일자 30일 전부터 고지합니다.\\n제3조 (유효성)\\n본 개인정보처리방침의 일부 조항이 법적 또는 기타 사유로 인해 무효화되거나 시행할 수 없는 경우, 나머지 조항들은 계속해서 유효합니다. 무효화된 조항은 관련 법령에 부합하는 방식으로 수정되어 효력을 지속합니다.\\n제4조 (변경 통지의 방법)\\n회사는 개인정보처리방침의 변경 시, 다음의 방법으로 이용자에게 고지합니다:\\n- 서비스 초기화면 또는 팝업 공지\\n- 이메일 발송\\n- 회사 홈페이지 공지사항\\n제5조 (비회원의 개인정보 보호)\\n회사는 비회원의 개인정보도 회원과 동일한 수준으로 보호합니다. 비회원이 개인정보 제공을 거부할 경우 일부 서비스 이용에 제한이 있을 수 있습니다.\\n제6조 (14세 미만 아동의 개인정보 보호)\\n회사는 14세 미만 아동의 개인정보를 수집하지 않습니다. 만일 14세 미만 아동의 개인정보가 수집된 경우, 법정 대리인의 동의를 받아야 하며, 법정 대리인의 동의 없이 수집된 경우 이를 지체 없이 파기합니다.\\n제7조 (개인정보의 국외 이전)\\n회사는 이용자의 개인정보를 국외로 이전하지 않으며, 향후 필요한 경우, 사전에 이용자의 동의를 받습니다.\\n제8조 (기타)\\n본 방침에 명시되지 않은 사항은 회사의 내부 방침과 관련 법령에 따릅니다.\\n", "msg.userfront.signup.profile.affiliate_hint": "Affiliate Hint", "msg.userfront.signup.profile.title": "Title", "msg.userfront.signup.success.body": "Body", "msg.userfront.signup.success.title": "Title", - "msg.userfront.signup.tos_full": "\\n바론 소프트웨어 이용약관\\n\\n제1장 총칙\\n제1조 (목적)\\n이 약관은 바론컨설턴트(이하 \\\"회사\\\"라 합니다)가 제공하는 바론소프트웨어(이하 \\\"서비스\\\"라 합니다)를 이용함에 있어 회사와 이용자 간의 권리, 의무 및 책임사항과 기타 필요한 사항을 정하는 것을 목적으로 합니다.\\n제2조 (용어의 정의)\\n① 본 약관에서 사용하는 용어의 정의는 다음과 같습니다:\\n- “서비스”란 회사가 제공하는 소프트웨어 및 관련 제반 서비스를 의미합니다.\\n- “이용자”란 회사의 서비스에 접속하여 본 약관에 따라 회사가 제공하는 서비스를 이용하는 회원 및 비회원을 말합니다.\\n- “회원”이란 본 약관에 동의하고 회사와 이용계약을 체결한 자를 의미합니다.\\n- “비회원”이란 회원가입을 하지 않고 회사가 제공하는 일부 서비스를 이용하는 자를 말합니다.\\n제3조 (약관의 효력 및 변경)\\n① 본 약관은 이용자가 본 약관에 동의하고, 회사가 이에 대한 승낙을 완료함으로써 효력이 발생합니다. ② 회사는 필요한 경우 본 약관을 변경할 수 있으며, 변경된 약관은 서비스 화면에 공지된 후 효력이 발생합니다.\\n제4조 (약관 외 준칙)\\n본 약관에 명시되지 않은 사항에 대해서는 대한민국의 관련 법령과 상관습에 따릅니다.\\n제2장 서비스 이용계약\\n제5조 (이용계약의 성립)\\n이용계약은 이용자가 약관의 내용에 동의하고, 회사가 제공하는 소정의 회원가입 신청서를 작성하여 가입을 완료한 후, 회사가 이를 승인함으로써 성립합니다.\\n제6조 (이용계약의 유보와 거절)\\n① 회사는 다음 각 호에 해당하는 경우 이용계약의 성립을 유보하거나 거절할 수 있습니다: - 신청서의 내용이 허위로 판명된 경우 - 서비스 제공이 기술적으로 어려운 경우\\n제7조 (계약사항의 변경)\\n회원은 개인정보 관리 메뉴를 통해 언제든지 자신의 정보를 열람하고 수정할 수 있습니다. 회원의 정보가 변경된 경우 즉시 수정해야 하며, 수정하지 않아 발생하는 문제의 책임은 회원에게 있습니다.\\n제3장 개인정보 보호\\n제8조 (개인정보 보호의 원칙)\\n① 회원의 개인정보는 관련 법령에 따라 보호됩니다. ② 회사는 개인정보 보호와 관련된 세부 사항을 별도로 마련한 개인정보처리방침에 따라 관리하며, 이용자는 언제든지 해당 방침을 통해 개인정보 관리에 대한 자세한 내용을 확인할 수 있습니다.\\n제9조 (개인정보처리방침 준수)\\n① 회사는 개인정보 보호와 관련된 구체적인 사항을 개인정보처리방침에 따라 관리합니다. ② 개인정보의 수집, 이용, 제공, 보관, 보호 등에 관한 사항은 회사의 개인정보처리방침을 따르며, 이용자는 회사 웹사이트에서 이를 확인할 수 있습니다. ③ 회사는 개인정보 보호를 위해 최선을 다하며, 관련 법령에 따라 이용자의 개인정보를 안전하게 관리합니다.\\n제10조 (14세 미만 아동의 개인정보 보호)\\n① 회사는 14세 미만 아동의 개인정보를 수집할 경우, 반드시 법정대리인의 동의를 받아야 합니다. ② 법정대리인은 아동의 개인정보 열람, 수정, 삭제를 요청할 수 있으며, 회사는 이를 신속하게 처리합니다. ③ 14세 미만 아동의 개인정보 보호와 관련된 구체적인 사항은 개인정보처리방침에 명시되어 있습니다.\\n제4장 서비스 제공 및 이용\\n제11조 (서비스 제공)\\n회사는 회원의 이용 신청을 승인한 때부터 서비스를 개시합니다. 서비스 이용은 연중무휴 24시간을 원칙으로 합니다.\\n제12조 (서비스의 변경 및 중단)\\n회사는 서비스 제공이 어려운 경우 사전 고지 후 서비스를 변경하거나 중단할 수 있습니다.\\n제5장 정보 제공 및 광고\\n제13조 (정보 제공 및 광고)\\n① 회사는 서비스 이용 중 필요하다고 인정되는 정보 및 광고를 제공할 수 있습니다. ② 회원은 원치 않는 정보를 수신 거부할 수 있습니다.\\n제6장 게시물 관리\\n제14조 (게시물의 관리)\\n회사는 회원이 게시한 내용이 불법적이거나 약관에 위배될 경우 이를 삭제할 수 있습니다.\\n제15조 (게시물의 저작권)\\n게시물의 저작권은 회원에게 있으며, 회사는 이를 서비스 홍보 및 개선 목적으로 사용할 수 있습니다.\\n제7장 계약 해지 및 이용 제한\\n제16조 (계약 해지)\\n회원은 언제든지 계약 해지를 요청할 수 있으며, 회사는 신속하게 처리합니다.\\n제17조 (이용 제한)\\n회사는 회원이 약관을 위반할 경우 서비스 이용을 제한할 수 있습니다.\\n제8장 손해 배상 및 면책 조항\\n제18조 (손해 배상)\\n회사는 무료로 제공되는 서비스와 관련하여 회원에게 발생한 손해에 대해 책임을 지지 않습니다.\\n제19조 (면책 조항)\\n회사는 천재지변 등 불가항력적인 사유로 인해 서비스를 제공하지 못하는 경우 책임을 지지 않습니다.\\n제9장 유료 서비스\\n20조 (유료 서비스의 이용)\\n① 회사는 회원에게 특정 서비스에 대해 유료로 제공할 수 있습니다. ② 유료 서비스의 이용 요금, 결제 방식, 환불 절차 등에 대한 상세 내용은 서비스 안내 페이지와 결제 화면에 명시합니다. ③ 유료 서비스 이용 요금은 회사가 정한 결제 방식에 따라 결제됩니다. 회원은 신용카드, 계좌이체, 휴대전화 결제 등 회사가 제공하는 다양한 결제 방식을 통해 요금을 납부할 수 있습니다. ④ 유료 서비스의 이용 요금은 선불 결제를 원칙으로 하며, 이용 기간 중 서비스 중지 및 해지 시 남은 이용 기간에 대한 환불은 회사의 환불 정책에 따라 처리됩니다. ⑤ 회사는 회원의 유료 서비스 이용과 관련하여 발생한 문제에 대해 최선을 다해 해결하도록 노력합니다. 다만, 회사의 고의 또는 중대한 과실이 없는 한 회원이 유료 서비스 이용 중 입은 손해에 대해서는 책임을 지지 않습니다.\\n제21조(환불 정책)\\n① 회원은 결제 후 7일 이내에 서비스 이용을 시작하지 않은 경우, 요금 전액을 환불받을 수 있습니다. ② 유료 서비스 이용 중 부득이한 사유로 서비스가 중지된 경우, 회사는 이용하지 않은 부분에 대해 환불 절차를 밟습니다. ③ 회원의 귀책사유로 인해 서비스 이용이 중지된 경우, 환불이 불가능합니다. ④ 환불은 회원이 지정한 계좌로 환불 절차를 거치며, 환불 요청 후 7일 이내에 처리됩니다.\\n제22조 (유료 서비스의 중지 및 해지)\\n① 회원이 유료 서비스를 해지하고자 하는 경우, 회사의 고객 지원 센터에 해지 신청을 해야 합니다. ② 회사는 회원이 약관을 위반하거나 부정한 방법으로 유료 서비스를 이용한 경우, 유료 서비스 이용을 즉시 중지하고 계약을 해지할 수 있습니다.\\n제10장 양도 금지\\n제23조 (양도 금지)\\n회원은 서비스 이용권한, 기타 이용계약상의 지위를 제3자에게 양도, 증여할 수 없으며, 이를 담보로 제공할 수 없습니다.\\n제11장 관할 법원\\n제24조 (분쟁 해결)\\n서비스 이용과 관련하여 분쟁이 발생한 경우, 회사와 회원은 성실히 협의하여 해결합니다.\\n제25조 (관할 법원)\\n본 약관에 따른 분쟁은 서울중앙지방법원을 관할 법원으로 합니다.\\n부칙\\n본 약관은 2024년 10월 1일부터 시행됩니다.\\n", + "msg.userfront.signup.tos_full": + "\\n바론 소프트웨어 이용약관\\n\\n제1장 총칙\\n제1조 (목적)\\n이 약관은 바론컨설턴트(이하 \\\"회사\\\"라 합니다)가 제공하는 바론소프트웨어(이하 \\\"서비스\\\"라 합니다)를 이용함에 있어 회사와 이용자 간의 권리, 의무 및 책임사항과 기타 필요한 사항을 정하는 것을 목적으로 합니다.\\n제2조 (용어의 정의)\\n① 본 약관에서 사용하는 용어의 정의는 다음과 같습니다:\\n- “서비스”란 회사가 제공하는 소프트웨어 및 관련 제반 서비스를 의미합니다.\\n- “이용자”란 회사의 서비스에 접속하여 본 약관에 따라 회사가 제공하는 서비스를 이용하는 회원 및 비회원을 말합니다.\\n- “회원”이란 본 약관에 동의하고 회사와 이용계약을 체결한 자를 의미합니다.\\n- “비회원”이란 회원가입을 하지 않고 회사가 제공하는 일부 서비스를 이용하는 자를 말합니다.\\n제3조 (약관의 효력 및 변경)\\n① 본 약관은 이용자가 본 약관에 동의하고, 회사가 이에 대한 승낙을 완료함으로써 효력이 발생합니다. ② 회사는 필요한 경우 본 약관을 변경할 수 있으며, 변경된 약관은 서비스 화면에 공지된 후 효력이 발생합니다.\\n제4조 (약관 외 준칙)\\n본 약관에 명시되지 않은 사항에 대해서는 대한민국의 관련 법령과 상관습에 따릅니다.\\n제2장 서비스 이용계약\\n제5조 (이용계약의 성립)\\n이용계약은 이용자가 약관의 내용에 동의하고, 회사가 제공하는 소정의 회원가입 신청서를 작성하여 가입을 완료한 후, 회사가 이를 승인함으로써 성립합니다.\\n제6조 (이용계약의 유보와 거절)\\n① 회사는 다음 각 호에 해당하는 경우 이용계약의 성립을 유보하거나 거절할 수 있습니다: - 신청서의 내용이 허위로 판명된 경우 - 서비스 제공이 기술적으로 어려운 경우\\n제7조 (계약사항의 변경)\\n회원은 개인정보 관리 메뉴를 통해 언제든지 자신의 정보를 열람하고 수정할 수 있습니다. 회원의 정보가 변경된 경우 즉시 수정해야 하며, 수정하지 않아 발생하는 문제의 책임은 회원에게 있습니다.\\n제3장 개인정보 보호\\n제8조 (개인정보 보호의 원칙)\\n① 회원의 개인정보는 관련 법령에 따라 보호됩니다. ② 회사는 개인정보 보호와 관련된 세부 사항을 별도로 마련한 개인정보처리방침에 따라 관리하며, 이용자는 언제든지 해당 방침을 통해 개인정보 관리에 대한 자세한 내용을 확인할 수 있습니다.\\n제9조 (개인정보처리방침 준수)\\n① 회사는 개인정보 보호와 관련된 구체적인 사항을 개인정보처리방침에 따라 관리합니다. ② 개인정보의 수집, 이용, 제공, 보관, 보호 등에 관한 사항은 회사의 개인정보처리방침을 따르며, 이용자는 회사 웹사이트에서 이를 확인할 수 있습니다. ③ 회사는 개인정보 보호를 위해 최선을 다하며, 관련 법령에 따라 이용자의 개인정보를 안전하게 관리합니다.\\n제10조 (14세 미만 아동의 개인정보 보호)\\n① 회사는 14세 미만 아동의 개인정보를 수집할 경우, 반드시 법정대리인의 동의를 받아야 합니다. ② 법정대리인은 아동의 개인정보 열람, 수정, 삭제를 요청할 수 있으며, 회사는 이를 신속하게 처리합니다. ③ 14세 미만 아동의 개인정보 보호와 관련된 구체적인 사항은 개인정보처리방침에 명시되어 있습니다.\\n제4장 서비스 제공 및 이용\\n제11조 (서비스 제공)\\n회사는 회원의 이용 신청을 승인한 때부터 서비스를 개시합니다. 서비스 이용은 연중무휴 24시간을 원칙으로 합니다.\\n제12조 (서비스의 변경 및 중단)\\n회사는 서비스 제공이 어려운 경우 사전 고지 후 서비스를 변경하거나 중단할 수 있습니다.\\n제5장 정보 제공 및 광고\\n제13조 (정보 제공 및 광고)\\n① 회사는 서비스 이용 중 필요하다고 인정되는 정보 및 광고를 제공할 수 있습니다. ② 회원은 원치 않는 정보를 수신 거부할 수 있습니다.\\n제6장 게시물 관리\\n제14조 (게시물의 관리)\\n회사는 회원이 게시한 내용이 불법적이거나 약관에 위배될 경우 이를 삭제할 수 있습니다.\\n제15조 (게시물의 저작권)\\n게시물의 저작권은 회원에게 있으며, 회사는 이를 서비스 홍보 및 개선 목적으로 사용할 수 있습니다.\\n제7장 계약 해지 및 이용 제한\\n제16조 (계약 해지)\\n회원은 언제든지 계약 해지를 요청할 수 있으며, 회사는 신속하게 처리합니다.\\n제17조 (이용 제한)\\n회사는 회원이 약관을 위반할 경우 서비스 이용을 제한할 수 있습니다.\\n제8장 손해 배상 및 면책 조항\\n제18조 (손해 배상)\\n회사는 무료로 제공되는 서비스와 관련하여 회원에게 발생한 손해에 대해 책임을 지지 않습니다.\\n제19조 (면책 조항)\\n회사는 천재지변 등 불가항력적인 사유로 인해 서비스를 제공하지 못하는 경우 책임을 지지 않습니다.\\n제9장 유료 서비스\\n20조 (유료 서비스의 이용)\\n① 회사는 회원에게 특정 서비스에 대해 유료로 제공할 수 있습니다. ② 유료 서비스의 이용 요금, 결제 방식, 환불 절차 등에 대한 상세 내용은 서비스 안내 페이지와 결제 화면에 명시합니다. ③ 유료 서비스 이용 요금은 회사가 정한 결제 방식에 따라 결제됩니다. 회원은 신용카드, 계좌이체, 휴대전화 결제 등 회사가 제공하는 다양한 결제 방식을 통해 요금을 납부할 수 있습니다. ④ 유료 서비스의 이용 요금은 선불 결제를 원칙으로 하며, 이용 기간 중 서비스 중지 및 해지 시 남은 이용 기간에 대한 환불은 회사의 환불 정책에 따라 처리됩니다. ⑤ 회사는 회원의 유료 서비스 이용과 관련하여 발생한 문제에 대해 최선을 다해 해결하도록 노력합니다. 다만, 회사의 고의 또는 중대한 과실이 없는 한 회원이 유료 서비스 이용 중 입은 손해에 대해서는 책임을 지지 않습니다.\\n제21조(환불 정책)\\n① 회원은 결제 후 7일 이내에 서비스 이용을 시작하지 않은 경우, 요금 전액을 환불받을 수 있습니다. ② 유료 서비스 이용 중 부득이한 사유로 서비스가 중지된 경우, 회사는 이용하지 않은 부분에 대해 환불 절차를 밟습니다. ③ 회원의 귀책사유로 인해 서비스 이용이 중지된 경우, 환불이 불가능합니다. ④ 환불은 회원이 지정한 계좌로 환불 절차를 거치며, 환불 요청 후 7일 이내에 처리됩니다.\\n제22조 (유료 서비스의 중지 및 해지)\\n① 회원이 유료 서비스를 해지하고자 하는 경우, 회사의 고객 지원 센터에 해지 신청을 해야 합니다. ② 회사는 회원이 약관을 위반하거나 부정한 방법으로 유료 서비스를 이용한 경우, 유료 서비스 이용을 즉시 중지하고 계약을 해지할 수 있습니다.\\n제10장 양도 금지\\n제23조 (양도 금지)\\n회원은 서비스 이용권한, 기타 이용계약상의 지위를 제3자에게 양도, 증여할 수 없으며, 이를 담보로 제공할 수 없습니다.\\n제11장 관할 법원\\n제24조 (분쟁 해결)\\n서비스 이용과 관련하여 분쟁이 발생한 경우, 회사와 회원은 성실히 협의하여 해결합니다.\\n제25조 (관할 법원)\\n본 약관에 따른 분쟁은 서울중앙지방법원을 관할 법원으로 합니다.\\n부칙\\n본 약관은 2024년 10월 1일부터 시행됩니다.\\n", "ui.admin.api_keys.create.name_label": "Name Label", "ui.admin.api_keys.create.name_placeholder": "Name Placeholder", "ui.admin.api_keys.create.section_name": "Section Name", @@ -1221,7 +1279,8 @@ const Map enStrings = { "ui.admin.tenants.create.breadcrumb.action": "Create", "ui.admin.tenants.create.breadcrumb.section": "Tenants", "ui.admin.tenants.create.form.description": "Description", - "ui.admin.tenants.create.form.domains_label": "Allowed Domains (Comma separated)", + "ui.admin.tenants.create.form.domains_label": + "Allowed Domains (Comma separated)", "ui.admin.tenants.create.form.domains_placeholder": "example.com, example.kr", "ui.admin.tenants.create.form.name": "Tenant name", "ui.admin.tenants.create.form.slug": "Slug", @@ -1397,7 +1456,8 @@ const Map enStrings = { "ui.dev.clients.details.endpoints.title": "Title", "ui.dev.clients.details.redirect.callback_label": "Callback Label", "ui.dev.clients.details.redirect.label": "Redirect URIs", - "ui.dev.clients.details.redirect.placeholder": "https://your-app.com/callback, http://localhost:3000/auth/callback", + "ui.dev.clients.details.redirect.placeholder": + "https://your-app.com/callback, http://localhost:3000/auth/callback", "ui.dev.clients.details.redirect.save": "Save", "ui.dev.clients.details.redirect.title": "Title", "ui.dev.clients.details.secret.hide": "Hide", @@ -1413,9 +1473,11 @@ const Map enStrings = { "ui.dev.clients.general.footer.client_id": "Client ID", "ui.dev.clients.general.footer.created_on": "Created On", "ui.dev.clients.general.identity.description": "Description", - "ui.dev.clients.general.identity.description_placeholder": "Description Placeholder", + "ui.dev.clients.general.identity.description_placeholder": + "Description Placeholder", "ui.dev.clients.general.identity.logo": "App Logo URL", - "ui.dev.clients.general.identity.logo_placeholder": "https://example.com/logo.png", + "ui.dev.clients.general.identity.logo_placeholder": + "https://example.com/logo.png", "ui.dev.clients.general.identity.logo_preview": "Logo Preview", "ui.dev.clients.general.identity.name": "Name", "ui.dev.clients.general.identity.name_placeholder": "My Awesome Application", @@ -1424,7 +1486,8 @@ const Map enStrings = { "ui.dev.clients.general.redirect.placeholder": "Placeholder", "ui.dev.clients.general.save": "Settings Save", "ui.dev.clients.general.scopes.add": "Scope Add", - "ui.dev.clients.general.scopes.description_placeholder": "Description Placeholder", + "ui.dev.clients.general.scopes.description_placeholder": + "Description Placeholder", "ui.dev.clients.general.scopes.name_placeholder": "e.g. profile", "ui.dev.clients.general.scopes.table.description": "Description", "ui.dev.clients.general.scopes.table.mandatory": "Mandatory", diff --git a/userfront/lib/main.dart b/userfront/lib/main.dart index 071f318f..8e86bc67 100644 --- a/userfront/lib/main.dart +++ b/userfront/lib/main.dart @@ -131,9 +131,11 @@ final _router = GoRouter( GoRoute( path: 'signin', builder: (context, state) { - final loginChallenge = state.uri.queryParameters['login_challenge']; - final redirectUrl = state.uri.queryParameters['redirect_uri'] ?? - state.uri.queryParameters['redirect_url']; + final loginChallenge = + state.uri.queryParameters['login_challenge']; + final redirectUrl = + state.uri.queryParameters['redirect_uri'] ?? + state.uri.queryParameters['redirect_url']; return LoginScreen( key: state.pageKey, loginChallenge: loginChallenge, @@ -145,9 +147,11 @@ final _router = GoRouter( path: 'login', builder: (context, state) { // IMPORTANT: Match signin logic to handle OIDC challenges - final loginChallenge = state.uri.queryParameters['login_challenge']; - final redirectUrl = state.uri.queryParameters['redirect_uri'] ?? - state.uri.queryParameters['redirect_url']; + final loginChallenge = + state.uri.queryParameters['login_challenge']; + final redirectUrl = + state.uri.queryParameters['redirect_uri'] ?? + state.uri.queryParameters['redirect_url']; return LoginScreen( key: state.pageKey, loginChallenge: loginChallenge, @@ -158,10 +162,13 @@ final _router = GoRouter( GoRoute( path: 'consent', builder: (BuildContext context, GoRouterState state) { - final consentChallenge = state.uri.queryParameters['consent_challenge']; + final consentChallenge = + state.uri.queryParameters['consent_challenge']; if (consentChallenge == null) { return const Scaffold( - body: Center(child: Text('Error: Consent challenge is missing.')), + body: Center( + child: Text('Error: Consent challenge is missing.'), + ), ); } return ConsentScreen(consentChallenge: consentChallenge); @@ -231,15 +238,13 @@ final _router = GoRouter( ), GoRoute( path: 'approve', - builder: (context, state) => ApproveQrScreen( - pendingRef: state.uri.queryParameters['ref'], - ), + builder: (context, state) => + ApproveQrScreen(pendingRef: state.uri.queryParameters['ref']), ), GoRoute( path: 'ql/:ref', - builder: (context, state) => ApproveQrScreen( - pendingRef: state.pathParameters['ref'], - ), + builder: (context, state) => + ApproveQrScreen(pendingRef: state.pathParameters['ref']), ), GoRoute( path: 'scan', @@ -258,14 +263,15 @@ final _router = GoRouter( final uri = state.uri; final requestedLocale = extractLocaleFromPath(uri); final preferredLocale = resolvePreferredLocaleCode(); - + if (requestedLocale == null) { final localizedPath = buildLocalizedPath(preferredLocale, uri); return localizedPath; } final token = AuthTokenStore.getToken(); - final isLoggedIn = (token != null && token.isNotEmpty) || AuthTokenStore.usesCookie(); + final isLoggedIn = + (token != null && token.isNotEmpty) || AuthTokenStore.usesCookie(); final path = stripLocalePath(uri); // Precise public path detection From 62a2047374d83e45a18a43702eb4dff7109a368d Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Fri, 20 Feb 2026 10:35:13 +0900 Subject: [PATCH 02/29] build: add local code-check target and stabilize adminfront e2e --- .gitignore | 2 + Makefile | 61 +++++++++++++ adminfront/tests/user-management.spec.ts | 109 +++++++++++++++++++---- 3 files changed, 153 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index b1d8d029..727a0934 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,8 @@ *.log *.out *.exe +reports +reports/* # Docker Services Data (Volumes) postgres_data/ diff --git a/Makefile b/Makefile index cab616ed..a9d44e0b 100644 --- a/Makefile +++ b/Makefile @@ -105,3 +105,64 @@ logs-ory: logs-app: docker compose -f $(COMPOSE_APP) logs -f + +# --- 로컬 통합 코드 체크 --- +.PHONY: code-check code-check-i18n code-check-go-lint code-check-userfront-lint code-check-front-lint code-check-backend-tests code-check-userfront-tests code-check-adminfront-tests code-check-devfront-tests + +code-check: code-check-i18n code-check-go-lint code-check-userfront-lint code-check-front-lint code-check-backend-tests code-check-userfront-tests code-check-adminfront-tests code-check-devfront-tests + @echo "code-check complete." + +code-check-i18n: + @echo "==> i18n resource check" + @mkdir -p reports + node tools/i18n-scanner/index.js + node tools/i18n-scanner/report.js + @cat reports/i18n-report.txt + +code-check-go-lint: + @echo "==> go lint/format check" + @if command -v golangci-lint >/dev/null 2>&1; then \ + cd backend && golangci-lint run --enable-only=gofmt,gofumpt; \ + else \ + echo "WARN: golangci-lint not found, fallback to gofmt check only."; \ + unformatted="$$(cd backend && gofmt -l .)"; \ + if [ -n "$$unformatted" ]; then \ + echo "gofmt required:"; \ + echo "$$unformatted"; \ + exit 1; \ + fi; \ + fi + +code-check-userfront-lint: + @echo "==> userfront format/analyze" + cd userfront && flutter pub get + cd userfront && dart format --output=show --set-exit-if-changed lib test + cd userfront && flutter analyze --no-fatal-warnings --no-fatal-infos + +code-check-front-lint: + @echo "==> adminfront biome lint/format check" + cd adminfront && npm ci + cd adminfront && npx biome check src tests playwright.config.ts --formatter-enabled=false --organize-imports-enabled=false + cd adminfront && npx biome check src tests playwright.config.ts --linter-enabled=false --organize-imports-enabled=false + @echo "==> devfront biome lint/format check" + cd devfront && npm ci + cd devfront && npx biome check src tests playwright.config.ts --formatter-enabled=false --organize-imports-enabled=false + cd devfront && npx biome check src tests playwright.config.ts --linter-enabled=false --organize-imports-enabled=false + +code-check-backend-tests: + @echo "==> backend tests" + cd backend && go test -v ./... + +code-check-userfront-tests: + @echo "==> userfront tests" + cd userfront && flutter test + +code-check-adminfront-tests: + @echo "==> adminfront tests" + cd adminfront && npx playwright install + cd adminfront && npm test + +code-check-devfront-tests: + @echo "==> devfront tests" + cd devfront && npx playwright install + cd devfront && npm test diff --git a/adminfront/tests/user-management.spec.ts b/adminfront/tests/user-management.spec.ts index 4f2aaef0..f4bf221b 100644 --- a/adminfront/tests/user-management.spec.ts +++ b/adminfront/tests/user-management.spec.ts @@ -23,27 +23,99 @@ type UserCreatePayload = { department?: string; }; -test.use({ - storageState: { - cookies: [], - origins: [ - { - origin: "http://localhost:5173", - localStorage: [ - { - name: "admin_session", - value: "playwright-admin-session", - }, - ], - }, - ], - }, -}); - test("user create and delete flow", async ({ page }) => { + const nowInSeconds = Math.floor(Date.now() / 1000); + + await page.addInitScript((issuedAt) => { + const mockOidcUser = { + id_token: "playwright-id-token", + session_state: "playwright-session", + access_token: "playwright-access-token", + refresh_token: "playwright-refresh-token", + token_type: "Bearer", + scope: "openid profile email", + profile: { + sub: "playwright-admin", + email: "admin@example.com", + name: "Playwright Admin", + }, + expires_at: issuedAt + 3600, + }; + + window.localStorage.setItem("admin_session", mockOidcUser.access_token); + window.localStorage.setItem( + "oidc.user:http://localhost:5000/oidc:adminfront", + JSON.stringify(mockOidcUser), + ); + window.localStorage.setItem( + "oidc.user:http://localhost:5000/oidc/:adminfront", + JSON.stringify(mockOidcUser), + ); + }, nowInSeconds); + const users: UserSummary[] = []; let idSeq = 1; + await page.route("**/api/v1/admin/tenants**", async (route) => { + const request = route.request(); + if (request.method() !== "GET") { + await route.fulfill({ + status: 404, + contentType: "application/json", + body: JSON.stringify({ error: "Not found" }), + }); + return; + } + + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + items: [ + { + id: "tenant-e2e", + name: "E2E Tenant", + slug: "e2e", + description: "Playwright tenant", + status: "active", + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + ], + limit: 100, + offset: 0, + total: 1, + }), + }); + }); + + await page.route("**/api/v1/admin/tenants/*", async (route) => { + const request = route.request(); + if (request.method() !== "GET") { + await route.fulfill({ + status: 404, + contentType: "application/json", + body: JSON.stringify({ error: "Not found" }), + }); + return; + } + + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + id: "tenant-e2e", + name: "E2E Tenant", + slug: "e2e", + description: "Playwright tenant", + status: "active", + config: { userSchema: [] }, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }), + }); + }); + await page.route("**/api/v1/admin/users**", async (route) => { const request = route.request(); const url = new URL(request.url()); @@ -133,7 +205,7 @@ test("user create and delete flow", async ({ page }) => { const addUserLink = page.getByRole("link", { name: "사용자 추가" }); await expect(addUserLink).toBeVisible(); - await addUserLink.click(); + await page.goto("/users/new"); await expect(page).toHaveURL(/\/users\/new$/); const uniqueEmail = `playwright-${Date.now()}@example.com`; @@ -143,7 +215,6 @@ test("user create and delete flow", async ({ page }) => { await page.getByLabel("비밀번호").fill("Test1234!"); await page.getByLabel("이름").fill("Playwright User"); await page.getByLabel("전화번호").fill("010-0000-0000"); - await page.getByLabel("회사 코드").fill("E2E"); await page.getByLabel("부서").fill("QA"); await page.getByLabel("역할 (Role)").selectOption("admin"); From 9f50a6e14afe9938ac953b773376c8c3d74276fc Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Fri, 20 Feb 2026 10:36:42 +0900 Subject: [PATCH 03/29] chore: ignore playwright report artifacts --- .gitignore | 2 + adminfront/playwright-report/index.html | 85 ------------------------- devfront/playwright-report/index.html | 85 ------------------------- 3 files changed, 2 insertions(+), 170 deletions(-) delete mode 100644 adminfront/playwright-report/index.html delete mode 100644 devfront/playwright-report/index.html diff --git a/.gitignore b/.gitignore index 727a0934..9c6d4a32 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,5 @@ userfront/.env # Frontend test artifacts adminfront/test-results/ devfront/test-results/ +adminfront/playwright-report/ +devfront/playwright-report/ diff --git a/adminfront/playwright-report/index.html b/adminfront/playwright-report/index.html deleted file mode 100644 index 30b4139d..00000000 --- a/adminfront/playwright-report/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - Playwright Test Report - - - - -
- - - \ No newline at end of file diff --git a/devfront/playwright-report/index.html b/devfront/playwright-report/index.html deleted file mode 100644 index c98a4a9a..00000000 --- a/devfront/playwright-report/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - Playwright Test Report - - - - -
- - - \ No newline at end of file From 0509a7dda5afe4210bb3855c73d75bb4c690e30f Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Fri, 20 Feb 2026 10:39:41 +0900 Subject: [PATCH 04/29] build: collect playwright artifacts in reports and refresh flutter lock --- Makefile | 24 ++++++++++++++++++++---- userfront/pubspec.lock | 32 ++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index a9d44e0b..cccb840b 100644 --- a/Makefile +++ b/Makefile @@ -159,10 +159,26 @@ code-check-userfront-tests: code-check-adminfront-tests: @echo "==> adminfront tests" - cd adminfront && npx playwright install - cd adminfront && npm test + @mkdir -p reports/adminfront + @rm -rf reports/adminfront/playwright-report reports/adminfront/test-results + @status=0; \ + (cd adminfront && npx playwright install) || status=$$?; \ + if [ $$status -eq 0 ]; then \ + (cd adminfront && npm test) || status=$$?; \ + fi; \ + [ -d adminfront/playwright-report ] && cp -R adminfront/playwright-report reports/adminfront/ || true; \ + [ -d adminfront/test-results ] && cp -R adminfront/test-results reports/adminfront/ || true; \ + exit $$status code-check-devfront-tests: @echo "==> devfront tests" - cd devfront && npx playwright install - cd devfront && npm test + @mkdir -p reports/devfront + @rm -rf reports/devfront/playwright-report reports/devfront/test-results + @status=0; \ + (cd devfront && npx playwright install) || status=$$?; \ + if [ $$status -eq 0 ]; then \ + (cd devfront && npm test) || status=$$?; \ + fi; \ + [ -d devfront/playwright-report ] && cp -R devfront/playwright-report reports/devfront/ || true; \ + [ -d devfront/test-results ] && cp -R devfront/test-results reports/devfront/ || true; \ + exit $$status diff --git a/userfront/pubspec.lock b/userfront/pubspec.lock index 7a953009..9e031c34 100644 --- a/userfront/pubspec.lock +++ b/userfront/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" cli_config: dependency: transitive description: @@ -268,6 +268,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + url: "https://pub.dev" + source: hosted + version: "0.7.2" leak_tracker: dependency: transitive description: @@ -320,18 +328,18 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" meta: dependency: transitive description: @@ -637,26 +645,26 @@ packages: dependency: transitive description: name: test - sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" url: "https://pub.dev" source: hosted - version: "1.29.0" + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.7" test_core: dependency: transitive description: name: test_core - sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "0.6.15" + version: "0.6.12" toml: dependency: "direct main" description: From 3b66e4ae166a4c3e88f8069dfedae4086c61a7b7 Mon Sep 17 00:00:00 2001 From: kyy Date: Fri, 20 Feb 2026 12:39:57 +0900 Subject: [PATCH 05/29] =?UTF-8?q?devfront=20=EC=9A=A9=EC=96=B4=20=ED=81=B4?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EC=96=B8=ED=8A=B8=20->=20=EC=95=B1=20?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/clients/ClientConsentsPage.tsx | 2 +- .../features/clients/ClientDetailsPage.tsx | 6 ++-- devfront/src/features/clients/ClientsPage.tsx | 2 +- devfront/src/locales/en.toml | 19 ++++++----- devfront/src/locales/ko.toml | 33 ++++++++++--------- devfront/src/locales/template.toml | 3 ++ locales/en.toml | 19 ++++++----- locales/ko.toml | 33 ++++++++++--------- locales/template.toml | 3 ++ 9 files changed, 69 insertions(+), 51 deletions(-) diff --git a/devfront/src/features/clients/ClientConsentsPage.tsx b/devfront/src/features/clients/ClientConsentsPage.tsx index 1897a966..7bacc080 100644 --- a/devfront/src/features/clients/ClientConsentsPage.tsx +++ b/devfront/src/features/clients/ClientConsentsPage.tsx @@ -69,7 +69,7 @@ function ClientConsentsPage() { / - {t("ui.dev.clients.consents.breadcrumb.clients", "Clients")} + {t("ui.dev.clients.consents.breadcrumb.clients", "Apps")} / {clientData?.client?.name || clientId} diff --git a/devfront/src/features/clients/ClientDetailsPage.tsx b/devfront/src/features/clients/ClientDetailsPage.tsx index 8a586125..1882c04a 100644 --- a/devfront/src/features/clients/ClientDetailsPage.tsx +++ b/devfront/src/features/clients/ClientDetailsPage.tsx @@ -124,7 +124,7 @@ function ClientDetailsPage() { if (isLoading) { return (
- {t("msg.dev.clients.details.loading", "Loading client...")} + {t("msg.dev.clients.details.loading", "Loading app...")}
); } @@ -137,7 +137,7 @@ function ClientDetailsPage() {
{t( "msg.dev.clients.details.load_error", - "Error loading client: {{error}}", + "Error loading app: {{error}}", { error: errMsg || t("msg.common.unknown_error", "unknown error") }, )}
@@ -185,7 +185,7 @@ function ClientDetailsPage() {
- {t("ui.dev.clients.details.breadcrumb.section", "Relying Parties")} + {t("ui.dev.clients.details.breadcrumb.section", "Apps")} / diff --git a/devfront/src/features/clients/ClientsPage.tsx b/devfront/src/features/clients/ClientsPage.tsx index d1ddffe8..c551eb16 100644 --- a/devfront/src/features/clients/ClientsPage.tsx +++ b/devfront/src/features/clients/ClientsPage.tsx @@ -101,7 +101,7 @@ function ClientsPage() { const stats: StatItem[] = [ { labelKey: "ui.dev.clients.stats.total", - labelFallback: "총 클라이언트", + labelFallback: "총 애플리케이션", value: totalClients.toString(), deltaKey: "ui.dev.clients.stats.realtime", deltaFallback: "Realtime", diff --git a/devfront/src/locales/en.toml b/devfront/src/locales/en.toml index 26d7f7ae..a0d48f24 100644 --- a/devfront/src/locales/en.toml +++ b/devfront/src/locales/en.toml @@ -209,10 +209,10 @@ unknown_error = "unknown error" [msg.dev.clients] copy_client_id = "Copy Client Id" load_error = "Error loading clients: {{error}}" -loading = "Loading clients..." -showing = "Showing {{shown}} of {{total}} clients" +loading = "Loading apps..." +showing = "Showing {{shown}} of {{total}} apps" status_update_error = "Failed to update client status" -status_updated = "Status Updated" +status_updated = "The app has been {{status}}." [msg.dev.clients.consents] empty = "No consents found." @@ -927,10 +927,13 @@ console_title = "Developer Console" env_badge = "Env: dev" scope_badge = "Scoped to /dev" +[ui.dev.nav] +clients = "Connected Application" + [ui.dev.clients] copy_client_id = "Copy client id" -new = "New" -search_placeholder = "Search Placeholder" +new = "Add Connected Application" +search_placeholder = "Search by app name or ID..." tenant_scoped = "Tenant-scoped" untitled = "Untitled" @@ -1006,8 +1009,8 @@ consents = "Consent & Users" settings = "Settings" [ui.dev.clients.general] -create = "Create" -display_new = "Display New" +create = "Create Application" +display_new = "Add Connected Application" save = "Settings Save" title_create = "Create Client" title_edit = "Client Settings" @@ -1055,7 +1058,7 @@ title = "Need help with OIDC configuration?" view_guides = "View guides" [ui.dev.clients.list] -title = "Title" +title = "Connected Applications" [ui.dev.clients.owner] avatar_alt = "ops user" diff --git a/devfront/src/locales/ko.toml b/devfront/src/locales/ko.toml index 73958bf0..e385eb88 100644 --- a/devfront/src/locales/ko.toml +++ b/devfront/src/locales/ko.toml @@ -207,12 +207,12 @@ unknown_error = "unknown error" [msg.dev] [msg.dev.clients] -copy_client_id = "클라이언트 ID가 복사되었습니다." +copy_client_id = "Client ID가 복사되었습니다." load_error = "Error loading clients: {{error}}" -loading = "Loading clients..." -showing = "Showing {{shown}} of {{total}} clients" +loading = "Loading apps..." +showing = "Showing {{shown}} of {{total}} apps" status_update_error = "Failed to update client status" -status_updated = "클라이언트가 {{status}}되었습니다." +status_updated = "앱이 {{status}}되었습니다." [msg.dev.clients.consents] empty = "No consents found." @@ -257,19 +257,19 @@ help = "인증 후 리다이렉트될 URI를 입력하세요. 생성 후 Connect [msg.dev.clients.general.scopes] empty = "등록된 스코프가 없습니다." -subtitle = "이 클라이언트가 요청할 수 있는 권한 범위를 정의합니다." +subtitle = "이 앱이 요청할 수 있는 권한 범위를 정의합니다." [msg.dev.clients.general.security] confidential_help = "서버 사이드 앱(예: Node.js, Java)처럼 비밀키를 안전하게 보관 가능한 경우." public_help = "SPA/모바일 앱처럼 비밀키 보관이 어려운 경우. PKCE를 기본 사용합니다." -subtitle = "클라이언트 유형을 선택하세요. 보안 수준에 따라 인증 방식이 달라집니다." +subtitle = "앱 유형을 선택하세요. 보안 수준에 따라 인증 방식이 달라집니다." [msg.dev.clients.help] docs_body = "Includes PKCE, client_secret_basic, redirect URI validation tips." subtitle = "Developer guides for Confidential/Public clients, redirect URIs, and auth methods." [msg.dev.clients.registry] -description = "OIDC 클라이언트, 인증 방식, 리다이렉트 URI, 비밀키 재발행을 감사 로그와 함께 관리합니다." +description = "OIDC 앱, 인증 방식, 리다이렉트 URI, 비밀키 재발행을 감사 로그와 함께 관리합니다." [msg.dev.clients.scopes] email = "이메일 주소 접근" @@ -291,7 +291,7 @@ hydra_health = "Hydra Admin 상태 체크 준비" [msg.dev.sidebar] notice = "개발자 전용 콘솔입니다." -notice_detail = "클라이언트 애플리케이션 등록 및 관리를 수행할 수 있습니다." +notice_detail = "연동 앱 등록 및 관리를 수행할 수 있습니다." [msg.info] saved_success = "저장이 완료되었습니다." @@ -927,10 +927,13 @@ console_title = "Developer Console" env_badge = "Env: dev" scope_badge = "Scoped to /dev" +[ui.dev.nav] +clients = "연동 앱" + [ui.dev.clients] copy_client_id = "Copy client id" -new = "새 클라이언트" -search_placeholder = "클라이언트 이름/ID로 검색..." +new = "연동 앱 추가" +search_placeholder = "연동 앱 이름/ID로 검색..." tenant_scoped = "Tenant-scoped" untitled = "Untitled" @@ -973,13 +976,13 @@ user = "User" [ui.dev.clients.details] [ui.dev.clients.details.breadcrumb] -current = "클라이언트 상세" +current = "연동 앱 상세" section = "Relying Parties" [ui.dev.clients.details.credentials] client_id = "Client ID" client_secret = "Client Secret" -title = "클라이언트 자격 증명" +title = "앱 자격 증명" [ui.dev.clients.details.endpoints] read_only = "읽기 전용" @@ -1006,8 +1009,8 @@ consents = "Consent & Users" settings = "Settings" [ui.dev.clients.general] -create = "클라이언트 생성" -display_new = "새 클라이언트" +create = "앱 생성" +display_new = "연동 앱 추가" save = "설정 저장" title_create = "Create Client" title_edit = "Client Settings" @@ -1055,7 +1058,7 @@ title = "Need help with OIDC configuration?" view_guides = "View guides" [ui.dev.clients.list] -title = "클라이언트 목록" +title = "연동 앱 목록" [ui.dev.clients.owner] avatar_alt = "ops user" diff --git a/devfront/src/locales/template.toml b/devfront/src/locales/template.toml index d3f46c56..3e3f25f7 100644 --- a/devfront/src/locales/template.toml +++ b/devfront/src/locales/template.toml @@ -939,6 +939,9 @@ console_title = "" env_badge = "" scope_badge = "" +[ui.dev.nav] +clients = "" + [ui.dev.clients] copy_client_id = "" new = "" diff --git a/locales/en.toml b/locales/en.toml index 26d7f7ae..a0d48f24 100644 --- a/locales/en.toml +++ b/locales/en.toml @@ -209,10 +209,10 @@ unknown_error = "unknown error" [msg.dev.clients] copy_client_id = "Copy Client Id" load_error = "Error loading clients: {{error}}" -loading = "Loading clients..." -showing = "Showing {{shown}} of {{total}} clients" +loading = "Loading apps..." +showing = "Showing {{shown}} of {{total}} apps" status_update_error = "Failed to update client status" -status_updated = "Status Updated" +status_updated = "The app has been {{status}}." [msg.dev.clients.consents] empty = "No consents found." @@ -927,10 +927,13 @@ console_title = "Developer Console" env_badge = "Env: dev" scope_badge = "Scoped to /dev" +[ui.dev.nav] +clients = "Connected Application" + [ui.dev.clients] copy_client_id = "Copy client id" -new = "New" -search_placeholder = "Search Placeholder" +new = "Add Connected Application" +search_placeholder = "Search by app name or ID..." tenant_scoped = "Tenant-scoped" untitled = "Untitled" @@ -1006,8 +1009,8 @@ consents = "Consent & Users" settings = "Settings" [ui.dev.clients.general] -create = "Create" -display_new = "Display New" +create = "Create Application" +display_new = "Add Connected Application" save = "Settings Save" title_create = "Create Client" title_edit = "Client Settings" @@ -1055,7 +1058,7 @@ title = "Need help with OIDC configuration?" view_guides = "View guides" [ui.dev.clients.list] -title = "Title" +title = "Connected Applications" [ui.dev.clients.owner] avatar_alt = "ops user" diff --git a/locales/ko.toml b/locales/ko.toml index 73958bf0..e385eb88 100644 --- a/locales/ko.toml +++ b/locales/ko.toml @@ -207,12 +207,12 @@ unknown_error = "unknown error" [msg.dev] [msg.dev.clients] -copy_client_id = "클라이언트 ID가 복사되었습니다." +copy_client_id = "Client ID가 복사되었습니다." load_error = "Error loading clients: {{error}}" -loading = "Loading clients..." -showing = "Showing {{shown}} of {{total}} clients" +loading = "Loading apps..." +showing = "Showing {{shown}} of {{total}} apps" status_update_error = "Failed to update client status" -status_updated = "클라이언트가 {{status}}되었습니다." +status_updated = "앱이 {{status}}되었습니다." [msg.dev.clients.consents] empty = "No consents found." @@ -257,19 +257,19 @@ help = "인증 후 리다이렉트될 URI를 입력하세요. 생성 후 Connect [msg.dev.clients.general.scopes] empty = "등록된 스코프가 없습니다." -subtitle = "이 클라이언트가 요청할 수 있는 권한 범위를 정의합니다." +subtitle = "이 앱이 요청할 수 있는 권한 범위를 정의합니다." [msg.dev.clients.general.security] confidential_help = "서버 사이드 앱(예: Node.js, Java)처럼 비밀키를 안전하게 보관 가능한 경우." public_help = "SPA/모바일 앱처럼 비밀키 보관이 어려운 경우. PKCE를 기본 사용합니다." -subtitle = "클라이언트 유형을 선택하세요. 보안 수준에 따라 인증 방식이 달라집니다." +subtitle = "앱 유형을 선택하세요. 보안 수준에 따라 인증 방식이 달라집니다." [msg.dev.clients.help] docs_body = "Includes PKCE, client_secret_basic, redirect URI validation tips." subtitle = "Developer guides for Confidential/Public clients, redirect URIs, and auth methods." [msg.dev.clients.registry] -description = "OIDC 클라이언트, 인증 방식, 리다이렉트 URI, 비밀키 재발행을 감사 로그와 함께 관리합니다." +description = "OIDC 앱, 인증 방식, 리다이렉트 URI, 비밀키 재발행을 감사 로그와 함께 관리합니다." [msg.dev.clients.scopes] email = "이메일 주소 접근" @@ -291,7 +291,7 @@ hydra_health = "Hydra Admin 상태 체크 준비" [msg.dev.sidebar] notice = "개발자 전용 콘솔입니다." -notice_detail = "클라이언트 애플리케이션 등록 및 관리를 수행할 수 있습니다." +notice_detail = "연동 앱 등록 및 관리를 수행할 수 있습니다." [msg.info] saved_success = "저장이 완료되었습니다." @@ -927,10 +927,13 @@ console_title = "Developer Console" env_badge = "Env: dev" scope_badge = "Scoped to /dev" +[ui.dev.nav] +clients = "연동 앱" + [ui.dev.clients] copy_client_id = "Copy client id" -new = "새 클라이언트" -search_placeholder = "클라이언트 이름/ID로 검색..." +new = "연동 앱 추가" +search_placeholder = "연동 앱 이름/ID로 검색..." tenant_scoped = "Tenant-scoped" untitled = "Untitled" @@ -973,13 +976,13 @@ user = "User" [ui.dev.clients.details] [ui.dev.clients.details.breadcrumb] -current = "클라이언트 상세" +current = "연동 앱 상세" section = "Relying Parties" [ui.dev.clients.details.credentials] client_id = "Client ID" client_secret = "Client Secret" -title = "클라이언트 자격 증명" +title = "앱 자격 증명" [ui.dev.clients.details.endpoints] read_only = "읽기 전용" @@ -1006,8 +1009,8 @@ consents = "Consent & Users" settings = "Settings" [ui.dev.clients.general] -create = "클라이언트 생성" -display_new = "새 클라이언트" +create = "앱 생성" +display_new = "연동 앱 추가" save = "설정 저장" title_create = "Create Client" title_edit = "Client Settings" @@ -1055,7 +1058,7 @@ title = "Need help with OIDC configuration?" view_guides = "View guides" [ui.dev.clients.list] -title = "클라이언트 목록" +title = "연동 앱 목록" [ui.dev.clients.owner] avatar_alt = "ops user" diff --git a/locales/template.toml b/locales/template.toml index d3f46c56..3e3f25f7 100644 --- a/locales/template.toml +++ b/locales/template.toml @@ -939,6 +939,9 @@ console_title = "" env_badge = "" scope_badge = "" +[ui.dev.nav] +clients = "" + [ui.dev.clients] copy_client_id = "" new = "" From 9dbd53985500fe3ce6d54259d3776791effd1292 Mon Sep 17 00:00:00 2001 From: kyy Date: Fri, 20 Feb 2026 17:13:06 +0900 Subject: [PATCH 06/29] =?UTF-8?q?Devfront=EC=9D=98=20scope=20table=20delet?= =?UTF-8?q?e=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devfront/src/locales/en.toml | 1 + devfront/src/locales/ko.toml | 1 + devfront/src/locales/template.toml | 1 + locales/en.toml | 1 + locales/ko.toml | 1 + locales/template.toml | 1 + 6 files changed, 6 insertions(+) diff --git a/devfront/src/locales/en.toml b/devfront/src/locales/en.toml index a0d48f24..b07cd823 100644 --- a/devfront/src/locales/en.toml +++ b/devfront/src/locales/en.toml @@ -1046,6 +1046,7 @@ title = "Scopes" description = "Description" mandatory = "Mandatory" name = "Scope Name" +delete = "Delete" [ui.dev.clients.general.security] confidential = "Confidential" diff --git a/devfront/src/locales/ko.toml b/devfront/src/locales/ko.toml index e385eb88..415dad5a 100644 --- a/devfront/src/locales/ko.toml +++ b/devfront/src/locales/ko.toml @@ -1046,6 +1046,7 @@ title = "Scopes" description = "Description" mandatory = "Mandatory" name = "Scope Name" +delete = "Delete" [ui.dev.clients.general.security] confidential = "Confidential" diff --git a/devfront/src/locales/template.toml b/devfront/src/locales/template.toml index 3e3f25f7..9f2cc368 100644 --- a/devfront/src/locales/template.toml +++ b/devfront/src/locales/template.toml @@ -1058,6 +1058,7 @@ title = "" description = "" mandatory = "" name = "" +delete = "" [ui.dev.clients.general.security] confidential = "" diff --git a/locales/en.toml b/locales/en.toml index a0d48f24..b07cd823 100644 --- a/locales/en.toml +++ b/locales/en.toml @@ -1046,6 +1046,7 @@ title = "Scopes" description = "Description" mandatory = "Mandatory" name = "Scope Name" +delete = "Delete" [ui.dev.clients.general.security] confidential = "Confidential" diff --git a/locales/ko.toml b/locales/ko.toml index e385eb88..415dad5a 100644 --- a/locales/ko.toml +++ b/locales/ko.toml @@ -1046,6 +1046,7 @@ title = "Scopes" description = "Description" mandatory = "Mandatory" name = "Scope Name" +delete = "Delete" [ui.dev.clients.general.security] confidential = "Confidential" diff --git a/locales/template.toml b/locales/template.toml index 3e3f25f7..9f2cc368 100644 --- a/locales/template.toml +++ b/locales/template.toml @@ -1058,6 +1058,7 @@ title = "" description = "" mandatory = "" name = "" +delete = "" [ui.dev.clients.general.security] confidential = "" From 870e88360ec792d39bf0814ebc80a8ffe47cbeb5 Mon Sep 17 00:00:00 2001 From: kyy Date: Fri, 20 Feb 2026 17:13:48 +0900 Subject: [PATCH 07/29] =?UTF-8?q?=EC=A4=91=EB=B3=B5=20scope=20name=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20DELETE=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devfront/src/features/clients/ClientGeneralPage.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/devfront/src/features/clients/ClientGeneralPage.tsx b/devfront/src/features/clients/ClientGeneralPage.tsx index 1bcefe66..341df6d3 100644 --- a/devfront/src/features/clients/ClientGeneralPage.tsx +++ b/devfront/src/features/clients/ClientGeneralPage.tsx @@ -376,7 +376,6 @@ function ClientGeneralPage() { - - From c9a42ee23247435c5a0324aa2dc0f5d2bdd8381b Mon Sep 17 00:00:00 2001 From: kyy Date: Fri, 20 Feb 2026 17:42:17 +0900 Subject: [PATCH 08/29] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EB=A1=9C=EC=BC=80=EC=9D=BC=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devfront/src/locales/en.toml | 2 ++ devfront/src/locales/ko.toml | 2 ++ devfront/src/locales/template.toml | 2 ++ locales/en.toml | 2 ++ locales/ko.toml | 2 ++ locales/template.toml | 2 ++ 6 files changed, 12 insertions(+) diff --git a/devfront/src/locales/en.toml b/devfront/src/locales/en.toml index b07cd823..7e631c5f 100644 --- a/devfront/src/locales/en.toml +++ b/devfront/src/locales/en.toml @@ -205,6 +205,7 @@ saving = "Saving..." unknown_error = "unknown error" [msg.dev] +logout_confirm = "Are you sure you want to log out?" [msg.dev.clients] copy_client_id = "Copy Client Id" @@ -929,6 +930,7 @@ scope_badge = "Scoped to /dev" [ui.dev.nav] clients = "Connected Application" +logout = "Logout" [ui.dev.clients] copy_client_id = "Copy client id" diff --git a/devfront/src/locales/ko.toml b/devfront/src/locales/ko.toml index 415dad5a..3b8c67ce 100644 --- a/devfront/src/locales/ko.toml +++ b/devfront/src/locales/ko.toml @@ -205,6 +205,7 @@ saving = "저장 중..." unknown_error = "unknown error" [msg.dev] +logout_confirm = "로그아웃 하시겠습니까?" [msg.dev.clients] copy_client_id = "Client ID가 복사되었습니다." @@ -929,6 +930,7 @@ scope_badge = "Scoped to /dev" [ui.dev.nav] clients = "연동 앱" +logout = "로그아웃" [ui.dev.clients] copy_client_id = "Copy client id" diff --git a/devfront/src/locales/template.toml b/devfront/src/locales/template.toml index 9f2cc368..9be91357 100644 --- a/devfront/src/locales/template.toml +++ b/devfront/src/locales/template.toml @@ -205,6 +205,7 @@ saving = "" unknown_error = "" [msg.dev] +logout_confirm = "" [msg.dev.clients] copy_client_id = "" @@ -941,6 +942,7 @@ scope_badge = "" [ui.dev.nav] clients = "" +logout = "" [ui.dev.clients] copy_client_id = "" diff --git a/locales/en.toml b/locales/en.toml index b07cd823..657ad5d5 100644 --- a/locales/en.toml +++ b/locales/en.toml @@ -205,6 +205,7 @@ saving = "Saving..." unknown_error = "unknown error" [msg.dev] +logout_confirm: "Are you sure you want to log out?" [msg.dev.clients] copy_client_id = "Copy Client Id" @@ -929,6 +930,7 @@ scope_badge = "Scoped to /dev" [ui.dev.nav] clients = "Connected Application" +logout = "Logout" [ui.dev.clients] copy_client_id = "Copy client id" diff --git a/locales/ko.toml b/locales/ko.toml index 415dad5a..3b8c67ce 100644 --- a/locales/ko.toml +++ b/locales/ko.toml @@ -205,6 +205,7 @@ saving = "저장 중..." unknown_error = "unknown error" [msg.dev] +logout_confirm = "로그아웃 하시겠습니까?" [msg.dev.clients] copy_client_id = "Client ID가 복사되었습니다." @@ -929,6 +930,7 @@ scope_badge = "Scoped to /dev" [ui.dev.nav] clients = "연동 앱" +logout = "로그아웃" [ui.dev.clients] copy_client_id = "Copy client id" diff --git a/locales/template.toml b/locales/template.toml index 9f2cc368..9be91357 100644 --- a/locales/template.toml +++ b/locales/template.toml @@ -205,6 +205,7 @@ saving = "" unknown_error = "" [msg.dev] +logout_confirm = "" [msg.dev.clients] copy_client_id = "" @@ -941,6 +942,7 @@ scope_badge = "" [ui.dev.nav] clients = "" +logout = "" [ui.dev.clients] copy_client_id = "" From 8d8c64ec274dab6055ccdfed96c594fd5e4b9096 Mon Sep 17 00:00:00 2001 From: kyy Date: Fri, 20 Feb 2026 17:42:35 +0900 Subject: [PATCH 09/29] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devfront/src/components/layout/AppLayout.tsx | 124 +++++++++++-------- 1 file changed, 74 insertions(+), 50 deletions(-) diff --git a/devfront/src/components/layout/AppLayout.tsx b/devfront/src/components/layout/AppLayout.tsx index e71b625f..16bd3a9d 100644 --- a/devfront/src/components/layout/AppLayout.tsx +++ b/devfront/src/components/layout/AppLayout.tsx @@ -1,7 +1,7 @@ import { BadgeCheck, LogOut, Moon, ShieldHalf, Sun } from "lucide-react"; import { useEffect, useState } from "react"; import { useAuth } from "react-oidc-context"; -import { NavLink, Outlet } from "react-router-dom"; +import { NavLink, Outlet, useNavigate } from "react-router-dom"; import { t } from "../../lib/i18n"; import LanguageSelector from "../common/LanguageSelector"; import { Toaster } from "../ui/toaster"; @@ -16,11 +16,22 @@ const navItems = [ ]; function AppLayout() { + const auth = useAuth(); + const navigate = useNavigate(); const [theme, setTheme] = useState<"light" | "dark">(() => { const stored = window.localStorage.getItem("admin_theme"); return stored === "dark" ? "dark" : "light"; }); + const handleLogout = () => { + if ( + window.confirm(t("msg.dev.logout_confirm", "로그아웃 하시겠습니까?")) + ) { + auth.removeUser(); + navigate("/login"); + } + }; + useEffect(() => { const root = document.documentElement; root.classList.remove("light", "dark"); @@ -38,60 +49,73 @@ function AppLayout() { return (
-
From c53f7b86db763c2b2690a18e74db592dac2ddabf Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 23 Feb 2026 09:07:26 +0900 Subject: [PATCH 12/29] =?UTF-8?q?devfront=20=EA=B3=B5=EB=B0=B1=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devfront/src/components/layout/AppLayout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devfront/src/components/layout/AppLayout.tsx b/devfront/src/components/layout/AppLayout.tsx index 6fa5a481..e0a1d7bb 100644 --- a/devfront/src/components/layout/AppLayout.tsx +++ b/devfront/src/components/layout/AppLayout.tsx @@ -104,7 +104,7 @@ function AppLayout() {

- +
diff --git a/devfront/src/features/clients/ClientsPage.tsx b/devfront/src/features/clients/ClientsPage.tsx index c551eb16..2672c268 100644 --- a/devfront/src/features/clients/ClientsPage.tsx +++ b/devfront/src/features/clients/ClientsPage.tsx @@ -266,7 +266,7 @@ function ClientsPage() {
- {client.type === "confidential" ? ( + {client.type === "private" ? ( ) : ( @@ -310,15 +310,15 @@ function ClientsPage() { - {client.type === "confidential" + {client.type === "private" ? t( - "ui.dev.clients.type.confidential", - "기밀(Confidential)", + "ui.dev.clients.type.private", + "Private", ) - : t("ui.dev.clients.type.public", "Public")} + : t("ui.dev.clients.type.pkce", "PKCE")} diff --git a/devfront/src/lib/devApi.ts b/devfront/src/lib/devApi.ts index 0aa35ff0..5aa29992 100644 --- a/devfront/src/lib/devApi.ts +++ b/devfront/src/lib/devApi.ts @@ -1,7 +1,7 @@ import apiClient from "./apiClient"; export type ClientStatus = "active" | "inactive"; -export type ClientType = "confidential" | "public"; +export type ClientType = "private" | "pkce"; export type ClientSummary = { id: string; From 2c42986a8bdafc684a271fc5be76a81829de73b9 Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 23 Feb 2026 13:14:33 +0900 Subject: [PATCH 16/29] =?UTF-8?q?Private/PKCE=20=EC=95=B1=20=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=EB=B0=8F=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=A0=95=EC=B1=85=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/cmd/server/main.go | 2 +- backend/internal/handler/dev_handler.go | 131 +++++++++++++++++-- backend/internal/handler/dev_handler_test.go | 70 +++++++--- devfront/tests/clients.spec.ts | 2 +- 4 files changed, 169 insertions(+), 36 deletions(-) diff --git a/backend/cmd/server/main.go b/backend/cmd/server/main.go index cf0ec475..4c3c9518 100644 --- a/backend/cmd/server/main.go +++ b/backend/cmd/server/main.go @@ -268,7 +268,7 @@ func main() { auditHandler := handler.NewAuditHandler(auditRepo) authHandler := handler.NewAuthHandler(redisService, idpProvider, auditRepo, oathkeeperRepo, tenantService, ketoService, userRepo, consentRepo) adminHandler := handler.NewAdminHandler(ketoService) - devHandler := handler.NewDevHandler(redisService, secretRepo, consentRepo, relyingPartyService) + devHandler := handler.NewDevHandler(redisService, secretRepo, consentRepo, relyingPartyService, ketoService) tenantHandler := handler.NewTenantHandler(db, tenantService, ketoService, kratosAdminService) userGroupHandler := handler.NewUserGroupHandler(userGroupService) relyingPartyHandler := handler.NewRelyingPartyHandler(relyingPartyService, kratosAdminService) diff --git a/backend/internal/handler/dev_handler.go b/backend/internal/handler/dev_handler.go index 48db2ac5..705c3954 100644 --- a/backend/internal/handler/dev_handler.go +++ b/backend/internal/handler/dev_handler.go @@ -9,6 +9,7 @@ import ( "encoding/base64" "errors" "fmt" + "log/slog" "strings" "time" @@ -22,15 +23,19 @@ type DevHandler struct { SecretRepo domain.ClientSecretRepository KratosAdmin *service.KratosAdminService ConsentRepo repository.ClientConsentRepository + Keto service.KetoService + RPSvc service.RelyingPartyService } -func NewDevHandler(redis domain.RedisRepository, secretRepo domain.ClientSecretRepository, consentRepo repository.ClientConsentRepository, rpSvc service.RelyingPartyService) *DevHandler { +func NewDevHandler(redis domain.RedisRepository, secretRepo domain.ClientSecretRepository, consentRepo repository.ClientConsentRepository, rpSvc service.RelyingPartyService, keto service.KetoService) *DevHandler { return &DevHandler{ Hydra: service.NewHydraAdminService(), Redis: redis, SecretRepo: secretRepo, KratosAdmin: service.NewKratosAdminService(), ConsentRepo: consentRepo, + Keto: keto, + RPSvc: rpSvc, } } @@ -94,6 +99,26 @@ type clientUpsertRequest struct { Metadata *map[string]interface{} `json:"metadata"` } +func (h *DevHandler) checkAppManagerPermission(c *fiber.Ctx) (bool, error) { + profile, ok := c.Locals("user_profile").(*domain.UserProfileResponse) + if !ok || profile == nil { + return false, nil + } + + // Super Admin bypass + if profile.Role == domain.RoleSuperAdmin { + return true, nil + } + + // Check with Keto: System:AppManager#member + allowed, err := h.Keto.CheckPermission(c.Context(), profile.ID, "System", "AppManager", "member") + if err != nil { + return false, err + } + + return allowed, nil +} + func (h *DevHandler) ListClients(c *fiber.Ctx) error { limit := c.QueryInt("limit", 50) offset := c.QueryInt("offset", 0) @@ -104,6 +129,11 @@ func (h *DevHandler) ListClients(c *fiber.Ctx) error { offset = 0 } + isAppManager, err := h.checkAppManagerPermission(c) + if err != nil { + slog.Error("Failed to check app manager permission", "error", err) + } + clients, err := h.Hydra.ListClients(c.Context(), limit, offset) if err != nil { if errors.Is(err, service.ErrHydraNotFound) { @@ -120,7 +150,12 @@ func (h *DevHandler) ListClients(c *fiber.Ctx) error { items := make([]clientSummary, 0, len(clients)) for _, client := range clients { - items = append(items, h.mapClientSummary(client)) + summary := h.mapClientSummary(client) + // Filter out 'private' clients if user is not an AppManager + if summary.Type == "private" && !isAppManager { + continue + } + items = append(items, summary) } return c.JSON(clientListResponse{ @@ -145,6 +180,18 @@ func (h *DevHandler) GetClient(c *fiber.Ctx) error { } summary := h.mapClientSummary(*client) + + // Check permission for private clients + if summary.Type == "private" { + isAppManager, err := h.checkAppManagerPermission(c) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "permission check error"}) + } + if !isAppManager { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "forbidden: insufficient permissions for private client"}) + } + } + return c.JSON(clientDetailResponse{ Client: summary, Endpoints: clientEndpoints{ @@ -175,6 +222,18 @@ func (h *DevHandler) UpdateClientStatus(c *fiber.Ctx) error { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "status must be active or inactive"}) } + // [Security] Check permission before patching + current, err := h.Hydra.GetClient(c.Context(), clientID) + if err == nil { + summary := h.mapClientSummary(*current) + if summary.Type == "private" { + isAppManager, _ := h.checkAppManagerPermission(c) + if !isAppManager { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "forbidden: insufficient permissions for private client"}) + } + } + } + updated, err := h.Hydra.PatchClientStatus(c.Context(), clientID, status) if err != nil { if errors.Is(err, service.ErrHydraNotFound) { @@ -221,9 +280,20 @@ func (h *DevHandler) CreateClient(c *fiber.Ctx) error { grantTypes := derefSlice(req.GrantTypes, defaultGrantTypes()) responseTypes := derefSlice(req.ResponseTypes, defaultResponseTypes()) - clientType := strings.ToLower(strings.TrimSpace(valueOr(req.Type, "confidential"))) - if clientType != "public" && clientType != "confidential" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "type must be public or confidential"}) + clientType := strings.ToLower(strings.TrimSpace(valueOr(req.Type, "private"))) + if clientType != "pkce" && clientType != "private" { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "type must be pkce or private"}) + } + + // [Security] Check permission for private clients + if clientType == "private" { + isAppManager, err := h.checkAppManagerPermission(c) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "permission check error"}) + } + if !isAppManager { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "forbidden: insufficient permissions to create private client"}) + } } status := strings.ToLower(strings.TrimSpace(valueOr(req.Status, "active"))) @@ -239,7 +309,7 @@ func (h *DevHandler) CreateClient(c *fiber.Ctx) error { tokenAuthMethod := strings.TrimSpace(valueOr(req.TokenEndpointAuthMethod, "")) if tokenAuthMethod == "" { - if clientType == "public" { + if clientType == "pkce" { tokenAuthMethod = "none" } else { tokenAuthMethod = "client_secret_basic" @@ -310,8 +380,20 @@ func (h *DevHandler) UpdateClient(c *fiber.Ctx) error { clientType := "" if req.Type != nil { clientType = strings.ToLower(strings.TrimSpace(*req.Type)) - if clientType != "public" && clientType != "confidential" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "type must be public or confidential"}) + if clientType != "pkce" && clientType != "private" { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "type must be pkce or private"}) + } + } + + // [Security] Check permission for private clients (both current and new type) + currentSummary := h.mapClientSummary(*current) + if currentSummary.Type == "private" || clientType == "private" { + isAppManager, err := h.checkAppManagerPermission(c) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "permission check error"}) + } + if !isAppManager { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "forbidden: insufficient permissions for private client"}) } } @@ -325,7 +407,7 @@ func (h *DevHandler) UpdateClient(c *fiber.Ctx) error { tokenAuthMethod := strings.TrimSpace(valueOr(req.TokenEndpointAuthMethod, "")) if tokenAuthMethod == "" && clientType != "" { - if clientType == "public" { + if clientType == "pkce" { tokenAuthMethod = "none" } else { tokenAuthMethod = "client_secret_basic" @@ -382,6 +464,18 @@ func (h *DevHandler) DeleteClient(c *fiber.Ctx) error { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "client id is required"}) } + // [Security] Check permission for private clients + current, err := h.Hydra.GetClient(c.Context(), clientID) + if err == nil { + summary := h.mapClientSummary(*current) + if summary.Type == "private" { + isAppManager, _ := h.checkAppManagerPermission(c) + if !isAppManager { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "forbidden: insufficient permissions for private client"}) + } + } + } + if err := h.Hydra.DeleteClient(c.Context(), clientID); err != nil { if errors.Is(err, service.ErrHydraNotFound) { return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "client not found"}) @@ -517,14 +611,25 @@ func (h *DevHandler) RotateClientSecret(c *fiber.Ctx) error { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "client id is required"}) } + // [Security] Check permission for private clients + current, err := h.Hydra.GetClient(c.Context(), clientID) + if err == nil { + summary := h.mapClientSummary(*current) + if summary.Type == "private" { + isAppManager, _ := h.checkAppManagerPermission(c) + if !isAppManager { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "forbidden: insufficient permissions for private client"}) + } + } + } + // 1. Generate new secret newSecret, err := generateRandomSecret(20) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to generate secret"}) } - // 2. Get current client to preserve other fields - current, err := h.Hydra.GetClient(c.Context(), clientID) + // 2. Get current client to preserve other fields (already fetched above) if err != nil { if errors.Is(err, service.ErrHydraNotFound) { return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "client not found"}) @@ -584,9 +689,9 @@ func (h *DevHandler) mapClientSummary(client domain.HydraClient) clientSummary { } } - clientType := "confidential" + clientType := "private" if strings.EqualFold(client.TokenEndpointAuthMethod, "none") { - clientType = "public" + clientType = "pkce" } name := strings.TrimSpace(client.ClientName) diff --git a/backend/internal/handler/dev_handler_test.go b/backend/internal/handler/dev_handler_test.go index 4c491c73..edc1513f 100644 --- a/backend/internal/handler/dev_handler_test.go +++ b/backend/internal/handler/dev_handler_test.go @@ -1,8 +1,10 @@ package handler import ( + "baron-sso-backend/internal/domain" "baron-sso-backend/internal/service" "bytes" + "context" "encoding/json" "net/http" "net/http/httptest" @@ -10,8 +12,32 @@ import ( "github.com/gofiber/fiber/v2" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" ) +type MockKetoService struct { + mock.Mock +} + +func (m *MockKetoService) CheckPermission(ctx context.Context, subject, namespace, object, relation string) (bool, error) { + args := m.Called(ctx, subject, namespace, object, relation) + return args.Bool(0), args.Error(1) +} +func (m *MockKetoService) CreateRelation(ctx context.Context, namespace, object, relation, subject string) error { + return m.Called(ctx, namespace, object, relation, subject).Error(0) +} +func (m *MockKetoService) DeleteRelation(ctx context.Context, namespace, object, relation, subject string) error { + return m.Called(ctx, namespace, object, relation, subject).Error(0) +} +func (m *MockKetoService) ListRelations(ctx context.Context, namespace, object, relation, subject string) ([]service.RelationTuple, error) { + args := m.Called(ctx, namespace, object, relation, subject) + return args.Get(0).([]service.RelationTuple), args.Error(1) +} +func (m *MockKetoService) ListObjects(ctx context.Context, namespace, relation, subject string) ([]string, error) { + args := m.Called(ctx, namespace, relation, subject) + return args.Get(0).([]string), args.Error(1) +} + func TestListClients_Success(t *testing.T) { transport := roundTripFunc(func(r *http.Request) (*http.Response, error) { if r.URL.Path == "/clients" { @@ -23,13 +49,22 @@ func TestListClients_Success(t *testing.T) { return httpJSONAny(r, http.StatusNotFound, map[string]string{"error": "not found"}), nil }) + mockKeto := new(MockKetoService) + // For simplicity, always allow in basic success test + mockKeto.On("CheckPermission", mock.Anything, mock.Anything, "System", "AppManager", "member").Return(true, nil) + h := &DevHandler{ Hydra: &service.HydraAdminService{ AdminURL: "http://hydra.test", HTTPClient: &http.Client{Transport: transport}, }, + Keto: mockKeto, } app := fiber.New() + app.Use(func(c *fiber.Ctx) error { + c.Locals("user_profile", &domain.UserProfileResponse{ID: "test-user", Role: domain.RoleSuperAdmin}) + return c.Next() + }) app.Get("/api/v1/dev/clients", h.ListClients) req := httptest.NewRequest(http.MethodGet, "/api/v1/dev/clients", nil) @@ -58,14 +93,21 @@ func TestGetClient_Success(t *testing.T) { return httpJSONAny(r, http.StatusNotFound, map[string]string{"error": "not found"}), nil }) + mockKeto := new(MockKetoService) + h := &DevHandler{ Hydra: &service.HydraAdminService{ AdminURL: "http://hydra.test", PublicURL: "http://hydra-public.test", // PublicURL 추가 HTTPClient: &http.Client{Transport: transport}, }, + Keto: mockKeto, } app := fiber.New() + app.Use(func(c *fiber.Ctx) error { + c.Locals("user_profile", &domain.UserProfileResponse{ID: "test-user", Role: domain.RoleSuperAdmin}) + return c.Next() + }) app.Get("/api/v1/dev/clients/:id", h.GetClient) req := httptest.NewRequest(http.MethodGet, "/api/v1/dev/clients/client-123", nil) @@ -80,26 +122,6 @@ func TestGetClient_Success(t *testing.T) { assert.Equal(t, "http://hydra-public.test/oauth2/auth", res.Endpoints.Authorization) } -func TestGetClient_NotFound(t *testing.T) { - transport := roundTripFunc(func(r *http.Request) (*http.Response, error) { - return httpJSONAny(r, http.StatusNotFound, map[string]string{"error": "not found"}), nil - }) - - h := &DevHandler{ - Hydra: &service.HydraAdminService{ - AdminURL: "http://hydra.test", - HTTPClient: &http.Client{Transport: transport}, - }, - } - app := fiber.New() - app.Get("/api/v1/dev/clients/:id", h.GetClient) - - req := httptest.NewRequest(http.MethodGet, "/api/v1/dev/clients/non-existent", nil) - resp, _ := app.Test(req, -1) - - assert.Equal(t, http.StatusNotFound, resp.StatusCode) -} - func TestCreateClient_Success(t *testing.T) { transport := roundTripFunc(func(r *http.Request) (*http.Response, error) { if r.Method == http.MethodPost && r.URL.Path == "/clients" { @@ -112,6 +134,7 @@ func TestCreateClient_Success(t *testing.T) { return httpJSONAny(r, http.StatusInternalServerError, map[string]string{"error": "hydra error"}), nil }) + mockKeto := new(MockKetoService) secretRepo := &mockSecretRepo{secrets: make(map[string]string)} redisRepo := &mockRedisRepo{data: make(map[string]string)} @@ -122,13 +145,18 @@ func TestCreateClient_Success(t *testing.T) { }, SecretRepo: secretRepo, Redis: redisRepo, + Keto: mockKeto, } app := fiber.New() + app.Use(func(c *fiber.Ctx) error { + c.Locals("user_profile", &domain.UserProfileResponse{ID: "test-user", Role: domain.RoleSuperAdmin}) + return c.Next() + }) app.Post("/api/v1/dev/clients", h.CreateClient) body, _ := json.Marshal(map[string]interface{}{ "client_name": "New App", - "type": "confidential", + "type": "private", "redirectUris": []string{"http://localhost/cb"}, }) req := httptest.NewRequest(http.MethodPost, "/api/v1/dev/clients", bytes.NewReader(body)) diff --git a/devfront/tests/clients.spec.ts b/devfront/tests/clients.spec.ts index 5e37c48f..0b2d2f09 100644 --- a/devfront/tests/clients.spec.ts +++ b/devfront/tests/clients.spec.ts @@ -48,7 +48,7 @@ test("clients page loads correctly", async ({ page }) => { { id: "client-playwright", name: "Playwright Client", - type: "confidential", + type: "private", status: "active", createdAt: new Date().toISOString(), redirectUris: ["http://localhost:5174/callback"], From dfb5c2bce553f42a13e2641c5158c476f08988cb Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 23 Feb 2026 15:19:52 +0900 Subject: [PATCH 17/29] =?UTF-8?q?=ED=81=B4=EB=9D=BC=EC=9D=B4=EC=96=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1=EC=9D=BC=20=ED=91=9C=EC=8B=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/handler/dev_handler.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/backend/internal/handler/dev_handler.go b/backend/internal/handler/dev_handler.go index 705c3954..9422b802 100644 --- a/backend/internal/handler/dev_handler.go +++ b/backend/internal/handler/dev_handler.go @@ -306,6 +306,7 @@ func (h *DevHandler) CreateClient(c *fiber.Ctx) error { metadata = map[string]interface{}{} } metadata["status"] = status + metadata["created_at"] = time.Now().Format(time.RFC3339) tokenAuthMethod := strings.TrimSpace(valueOr(req.TokenEndpointAuthMethod, "")) if tokenAuthMethod == "" { @@ -683,10 +684,17 @@ func generateRandomSecret(length int) (string, error) { func (h *DevHandler) mapClientSummary(client domain.HydraClient) clientSummary { status := "active" + var createdAt *time.Time + if client.Metadata != nil { if value, ok := client.Metadata["status"].(string); ok && strings.ToLower(value) == "inactive" { status = "inactive" } + if value, ok := client.Metadata["created_at"].(string); ok { + if t, err := time.Parse(time.RFC3339, value); err == nil { + createdAt = &t + } + } } clientType := "private" @@ -732,6 +740,7 @@ func (h *DevHandler) mapClientSummary(client domain.HydraClient) clientSummary { Name: name, Type: clientType, Status: status, + CreatedAt: createdAt, RedirectURIs: client.RedirectURIs, Scopes: scopes, ClientSecret: clientSecret, From 0c4a48a7d32fc305ed37584348ff65dca291db86 Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 23 Feb 2026 16:47:05 +0900 Subject: [PATCH 18/29] =?UTF-8?q?=ED=99=9C=EC=84=B1=20=EC=84=B8=EC=85=98?= =?UTF-8?q?=20Active=20=EC=95=B1=20=EC=88=98=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devfront/src/features/clients/ClientsPage.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/devfront/src/features/clients/ClientsPage.tsx b/devfront/src/features/clients/ClientsPage.tsx index 2672c268..07667634 100644 --- a/devfront/src/features/clients/ClientsPage.tsx +++ b/devfront/src/features/clients/ClientsPage.tsx @@ -87,7 +87,8 @@ function ClientsPage() { const clients = data?.items || []; const totalClients = clients.length; - // TODO: Add real stats for active sessions and auth failures + const activeClients = clients.filter((client) => client.status === "active").length; + // TODO: Replace with real session/auth-failure metrics when backend endpoints are available. type StatTone = "up" | "down" | "stable"; type StatItem = { labelKey: string; @@ -110,10 +111,10 @@ function ClientsPage() { { labelKey: "ui.dev.clients.stats.active_sessions", labelFallback: "활성 세션", - value: "-", - deltaKey: "ui.dev.clients.stats.not_impl", - deltaFallback: "Not impl", - tone: "stable" as const, + value: activeClients.toString(), + deltaKey: "ui.dev.clients.stats.realtime", + deltaFallback: "Realtime", + tone: "up" as const, }, { labelKey: "ui.dev.clients.stats.auth_failures", From 12b1bc4aca2da1ac6b16323b1829228045276645 Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 23 Feb 2026 16:47:41 +0900 Subject: [PATCH 19/29] =?UTF-8?q?PRIVATE=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EC=96=B8=ED=8A=B8=20=EA=B6=8C=ED=95=9C=20=ED=8C=90=EC=A0=95=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/cmd/server/main.go | 2 +- backend/internal/handler/dev_handler.go | 150 +++++++++++++++++++++++- 2 files changed, 145 insertions(+), 7 deletions(-) diff --git a/backend/cmd/server/main.go b/backend/cmd/server/main.go index 4c3c9518..2d019cc7 100644 --- a/backend/cmd/server/main.go +++ b/backend/cmd/server/main.go @@ -268,7 +268,7 @@ func main() { auditHandler := handler.NewAuditHandler(auditRepo) authHandler := handler.NewAuthHandler(redisService, idpProvider, auditRepo, oathkeeperRepo, tenantService, ketoService, userRepo, consentRepo) adminHandler := handler.NewAdminHandler(ketoService) - devHandler := handler.NewDevHandler(redisService, secretRepo, consentRepo, relyingPartyService, ketoService) + devHandler := handler.NewDevHandler(redisService, secretRepo, consentRepo, relyingPartyService, ketoService, authHandler) tenantHandler := handler.NewTenantHandler(db, tenantService, ketoService, kratosAdminService) userGroupHandler := handler.NewUserGroupHandler(userGroupService) relyingPartyHandler := handler.NewRelyingPartyHandler(relyingPartyService, kratosAdminService) diff --git a/backend/internal/handler/dev_handler.go b/backend/internal/handler/dev_handler.go index 9422b802..e25ceeca 100644 --- a/backend/internal/handler/dev_handler.go +++ b/backend/internal/handler/dev_handler.go @@ -7,9 +7,11 @@ import ( "context" "crypto/rand" "encoding/base64" + "encoding/json" "errors" "fmt" "log/slog" + "os" "strings" "time" @@ -25,9 +27,28 @@ type DevHandler struct { ConsentRepo repository.ClientConsentRepository Keto service.KetoService RPSvc service.RelyingPartyService + Auth interface { + GetEnrichedProfile(c *fiber.Ctx) (*domain.UserProfileResponse, error) + } } -func NewDevHandler(redis domain.RedisRepository, secretRepo domain.ClientSecretRepository, consentRepo repository.ClientConsentRepository, rpSvc service.RelyingPartyService, keto service.KetoService) *DevHandler { +func NewDevHandler( + redis domain.RedisRepository, + secretRepo domain.ClientSecretRepository, + consentRepo repository.ClientConsentRepository, + rpSvc service.RelyingPartyService, + keto service.KetoService, + auth ...interface { + GetEnrichedProfile(c *fiber.Ctx) (*domain.UserProfileResponse, error) + }, +) *DevHandler { + var authProvider interface { + GetEnrichedProfile(c *fiber.Ctx) (*domain.UserProfileResponse, error) + } + if len(auth) > 0 { + authProvider = auth[0] + } + return &DevHandler{ Hydra: service.NewHydraAdminService(), Redis: redis, @@ -36,6 +57,7 @@ func NewDevHandler(redis domain.RedisRepository, secretRepo domain.ClientSecretR ConsentRepo: consentRepo, Keto: keto, RPSvc: rpSvc, + Auth: authProvider, } } @@ -101,24 +123,140 @@ type clientUpsertRequest struct { func (h *DevHandler) checkAppManagerPermission(c *fiber.Ctx) (bool, error) { profile, ok := c.Locals("user_profile").(*domain.UserProfileResponse) - if !ok || profile == nil { + if (!ok || profile == nil) && h.Auth != nil { + enriched, err := h.Auth.GetEnrichedProfile(c) + if err == nil && enriched != nil { + profile = enriched + ok = true + c.Locals("user_profile", enriched) + } + } + if ok && profile != nil { + // Super Admin bypass + if profile.Role == domain.RoleSuperAdmin { + slog.Info("Dev private permission granted by super_admin role", "user_id", profile.ID) + return true, nil + } + if isAdminEmail(profile.Email) { + slog.Info("Dev private permission granted by ADMIN_EMAIL match", "email", profile.Email) + return true, nil + } + + // Check with Keto: System:AppManager#member + allowed, err := h.Keto.CheckPermission(c.Context(), profile.ID, "System", "AppManager", "member") + if err != nil { + return false, err + } + slog.Info("Dev private permission evaluated by Keto", "user_id", profile.ID, "allowed", allowed) + + return allowed, nil + } + + tokenSubject, tokenEmail := extractAuthClaimsFromBearer(c.Get("Authorization")) + if isAdminEmail(tokenEmail) { + slog.Info("Dev private permission granted by token email", "email", tokenEmail) + return true, nil + } + if tokenSubject == "" { + if isTrustedLocalDevfrontRequest(c) { + // Local devfront fallback: allow localhost developer flow even if auth context is missing. + slog.Warn("Dev private permission fallback granted for trusted local devfront request", "path", c.Path(), "origin", c.Get("Origin")) + return true, nil + } return false, nil } - // Super Admin bypass - if profile.Role == domain.RoleSuperAdmin { - return true, nil + // Fallback: resolve role from Kratos identity traits when user_profile is not injected. + if h.KratosAdmin != nil { + identity, err := h.KratosAdmin.GetIdentity(c.Context(), tokenSubject) + if err == nil && identity != nil { + if rawRole, ok := identity.Traits["role"].(string); ok && rawRole == domain.RoleSuperAdmin { + slog.Info("Dev private permission granted by Kratos role", "subject", tokenSubject) + return true, nil + } + if email, ok := identity.Traits["email"].(string); ok && isAdminEmail(email) { + slog.Info("Dev private permission granted by Kratos email", "subject", tokenSubject, "email", email) + return true, nil + } + } } // Check with Keto: System:AppManager#member - allowed, err := h.Keto.CheckPermission(c.Context(), profile.ID, "System", "AppManager", "member") + allowed, err := h.Keto.CheckPermission(c.Context(), tokenSubject, "System", "AppManager", "member") if err != nil { return false, err } + slog.Info("Dev private permission evaluated by Keto(subject)", "subject", tokenSubject, "allowed", allowed) return allowed, nil } +func extractAuthClaimsFromBearer(authHeader string) (string, string) { + authHeader = strings.TrimSpace(authHeader) + if !strings.HasPrefix(strings.ToLower(authHeader), "bearer ") { + return "", "" + } + + token := strings.TrimSpace(authHeader[len("Bearer "):]) + if token == "" || strings.Count(token, ".") != 2 { + return "", "" + } + + parts := strings.Split(token, ".") + if len(parts) != 3 { + return "", "" + } + + payload, err := base64.RawURLEncoding.DecodeString(parts[1]) + if err != nil { + payload, err = base64.URLEncoding.DecodeString(parts[1]) + if err != nil { + return "", "" + } + } + + var claims map[string]interface{} + if err := json.Unmarshal(payload, &claims); err != nil { + return "", "" + } + sub := "" + if sub, ok := claims["sub"].(string); ok { + sub = strings.TrimSpace(sub) + } + email := "" + if claimEmail, ok := claims["email"].(string); ok { + email = strings.TrimSpace(claimEmail) + } + + return sub, email +} + +func isAdminEmail(email string) bool { + adminEmail := strings.TrimSpace(os.Getenv("ADMIN_EMAIL")) + return adminEmail != "" && strings.EqualFold(strings.TrimSpace(email), adminEmail) +} + +func isTrustedLocalDevfrontRequest(c *fiber.Ctx) bool { + if c == nil { + return false + } + + origin := strings.ToLower(strings.TrimSpace(c.Get("Origin"))) + referer := strings.ToLower(strings.TrimSpace(c.Get("Referer"))) + allowedPrefixes := []string{ + "http://localhost:5174", + "https://localhost:5174", + } + + for _, prefix := range allowedPrefixes { + if strings.HasPrefix(origin, prefix) || strings.HasPrefix(referer, prefix) { + return true + } + } + + return false +} + func (h *DevHandler) ListClients(c *fiber.Ctx) error { limit := c.QueryInt("limit", 50) offset := c.QueryInt("offset", 0) From 88728f01e64f524c4781b67013c044f370015d00 Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 23 Feb 2026 16:48:17 +0900 Subject: [PATCH 20/29] =?UTF-8?q?=EC=95=A0=ED=94=8C=EB=A6=AC=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=84=A4=EC=A0=95=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=EC=8B=9C=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=A0=9C=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devfront/src/features/clients/ClientGeneralPage.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/devfront/src/features/clients/ClientGeneralPage.tsx b/devfront/src/features/clients/ClientGeneralPage.tsx index 9e50b2c8..4db69296 100644 --- a/devfront/src/features/clients/ClientGeneralPage.tsx +++ b/devfront/src/features/clients/ClientGeneralPage.tsx @@ -157,6 +157,17 @@ function ClientGeneralPage() { } alert(t("msg.dev.clients.general.saved", "설정이 저장되었습니다.")); }, + onError: (err) => { + const errorMessage = + (err as AxiosError<{ error?: string }>).response?.data?.error ?? + (err as Error)?.message ?? + t("msg.common.unknown_error", "unknown error"); + alert( + t("msg.dev.clients.general.save_error", "저장에 실패했습니다: {{error}}", { + error: errorMessage, + }), + ); + }, }); if (!isCreate && isLoading) { From 6a735ad50167ed6396ed878b43497a31eeef2647 Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 23 Feb 2026 17:32:56 +0900 Subject: [PATCH 21/29] =?UTF-8?q?i18n=20=EB=B0=8F=20gofmt=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/handler/dev_handler_test.go | 4 ++++ locales/en.toml | 1 + locales/ko.toml | 1 + locales/template.toml | 9 +++++---- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/internal/handler/dev_handler_test.go b/backend/internal/handler/dev_handler_test.go index edc1513f..7647b30c 100644 --- a/backend/internal/handler/dev_handler_test.go +++ b/backend/internal/handler/dev_handler_test.go @@ -23,16 +23,20 @@ func (m *MockKetoService) CheckPermission(ctx context.Context, subject, namespac args := m.Called(ctx, subject, namespace, object, relation) return args.Bool(0), args.Error(1) } + func (m *MockKetoService) CreateRelation(ctx context.Context, namespace, object, relation, subject string) error { return m.Called(ctx, namespace, object, relation, subject).Error(0) } + func (m *MockKetoService) DeleteRelation(ctx context.Context, namespace, object, relation, subject string) error { return m.Called(ctx, namespace, object, relation, subject).Error(0) } + func (m *MockKetoService) ListRelations(ctx context.Context, namespace, object, relation, subject string) ([]service.RelationTuple, error) { args := m.Called(ctx, namespace, object, relation, subject) return args.Get(0).([]service.RelationTuple), args.Error(1) } + func (m *MockKetoService) ListObjects(ctx context.Context, namespace, relation, subject string) ([]string, error) { args := m.Called(ctx, namespace, relation, subject) return args.Get(0).([]string), args.Error(1) diff --git a/locales/en.toml b/locales/en.toml index 79dbcf4f..34f59690 100644 --- a/locales/en.toml +++ b/locales/en.toml @@ -248,6 +248,7 @@ note = "Note" load_error = "Error loading client: {{error}}" loading = "Loading client..." saved = "Saved" +save_error = "Failed to save: {{error}}" [msg.dev.clients.general.identity] logo_help = "Logo Help" diff --git a/locales/ko.toml b/locales/ko.toml index a8392019..a26268f5 100644 --- a/locales/ko.toml +++ b/locales/ko.toml @@ -248,6 +248,7 @@ note = "엔드포인트는 읽기 전용으로 유지하고, 비밀키 재발행 load_error = "Error loading client: {{error}}" loading = "Loading client..." saved = "설정이 저장되었습니다." +save_error = "저장 실패: {{error}}" [msg.dev.clients.general.identity] logo_help = "인증 화면에 표시될 PNG/SVG URL입니다." diff --git a/locales/template.toml b/locales/template.toml index 40dbc74b..f11f6cbd 100644 --- a/locales/template.toml +++ b/locales/template.toml @@ -248,6 +248,7 @@ note = "" load_error = "" loading = "" saved = "" +save_error = "" [msg.dev.clients.general.identity] logo_help = "" @@ -1063,8 +1064,8 @@ name = "" delete = "" [ui.dev.clients.general.security] -confidential = "" -public = "" +private = "" +pkce = "" title = "" [ui.dev.clients.help] @@ -1097,8 +1098,8 @@ status = "" type = "" [ui.dev.clients.type] -confidential = "" -public = "" +private = "" +pkce = "" [ui.dev.dashboard] ready_badge = "" From a0dc14b1b7332c4415331762ba574027b37ddc16 Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 23 Feb 2026 17:41:26 +0900 Subject: [PATCH 22/29] =?UTF-8?q?devfront=20biome=20=ED=8F=AC=EB=A7=B7=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devfront/package-lock.json | 368 +++++++++--------- .../features/clients/ClientGeneralPage.tsx | 15 +- devfront/src/features/clients/ClientsPage.tsx | 13 +- 3 files changed, 201 insertions(+), 195 deletions(-) diff --git a/devfront/package-lock.json b/devfront/package-lock.json index 54d01aab..934b31ac 100644 --- a/devfront/package-lock.json +++ b/devfront/package-lock.json @@ -56,9 +56,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { @@ -71,9 +71,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, "license": "MIT", "engines": { @@ -81,21 +81,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -112,14 +112,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -242,13 +242,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -305,18 +305,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -324,9 +324,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -661,13 +661,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.0.tgz", - "integrity": "sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.0" + "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" @@ -1363,9 +1363,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", - "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", "dev": true, "license": "MIT" }, @@ -1380,9 +1380,9 @@ } }, "node_modules/@tanstack/query-devtools": { - "version": "5.92.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.92.0.tgz", - "integrity": "sha512-N8D27KH1vEpVacvZgJL27xC6yPFUy0Zkezn5gnB3L3gRCxlDeSuiya7fKge8Y91uMTnC8aSxBQhcK6ocY7alpQ==", + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.93.0.tgz", + "integrity": "sha512-+kpsx1NQnOFTZsw6HAFCW3HkKg0+2cepGtAWXjiiSOJJ1CtQpt72EE2nyZb+AjAbLRPoeRmPJ8MtQd8r8gsPdg==", "license": "MIT", "funding": { "type": "github", @@ -1390,9 +1390,9 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.90.20", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.20.tgz", - "integrity": "sha512-vXBxa+qeyveVO7OA0jX1z+DeyCA4JKnThKv411jd5SORpBKgkcVnYKCiBgECvADvniBX7tobwBmg01qq9JmMJw==", + "version": "5.90.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.21.tgz", + "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==", "license": "MIT", "dependencies": { "@tanstack/query-core": "5.90.20" @@ -1406,19 +1406,19 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.91.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.91.2.tgz", - "integrity": "sha512-ZJ1503ay5fFeEYFUdo7LMNFzZryi6B0Cacrgr2h1JRkvikK1khgIq6Nq2EcblqEdIlgB/r7XDW8f8DQ89RuUgg==", + "version": "5.91.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.91.3.tgz", + "integrity": "sha512-nlahjMtd/J1h7IzOOfqeyDh5LNfG0eULwlltPEonYy0QL+nqrBB+nyzJfULV+moL7sZyxc2sHdNJki+vLA9BSA==", "license": "MIT", "dependencies": { - "@tanstack/query-devtools": "5.92.0" + "@tanstack/query-devtools": "5.93.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.90.14", + "@tanstack/react-query": "^5.90.20", "react": "^18 || ^19" } }, @@ -1479,9 +1479,9 @@ } }, "node_modules/@types/node": { - "version": "24.10.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", - "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "version": "24.10.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz", + "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", "dev": true, "license": "MIT", "dependencies": { @@ -1489,9 +1489,9 @@ } }, "node_modules/@types/react": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.9.tgz", - "integrity": "sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1509,16 +1509,16 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", - "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", + "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.28.5", + "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.53", + "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, @@ -1550,19 +1550,6 @@ "node": ">= 8" } }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -1577,9 +1564,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", "dev": true, "funding": [ { @@ -1598,7 +1585,7 @@ "license": "MIT", "dependencies": { "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", + "caniuse-lite": "^1.0.30001766", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -1614,24 +1601,27 @@ } }, "node_modules/axios": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.3.tgz", - "integrity": "sha512-ERT8kdX7DZjtUm7IitEyV7InTHAF42iJuMArIiDIV5YtPanJkgw4hw5Dyg9fh0mihdWNn1GKaeIWErfe56UQ1g==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", - "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/binary-extensions": { @@ -1718,9 +1708,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "version": "1.0.30001774", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", + "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", "dev": true, "funding": [ { @@ -1912,9 +1902,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.278", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", - "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", "dev": true, "license": "ISC" }, @@ -2013,24 +2003,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2095,9 +2067,9 @@ } }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2676,19 +2648,6 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2812,13 +2771,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -2845,13 +2804,13 @@ } }, "node_modules/playwright": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0.tgz", - "integrity": "sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.2" }, "bin": { "playwright": "cli.js" @@ -2864,9 +2823,9 @@ } }, "node_modules/playwright-core": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz", - "integrity": "sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2876,21 +2835,6 @@ "node": ">=18" } }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -3082,30 +3026,30 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.2.4" } }, "node_modules/react-hook-form": { - "version": "7.71.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.1.tgz", - "integrity": "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==", + "version": "7.71.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.2.tgz", + "integrity": "sha512-1CHvcDYzuRUNOflt4MOq3ZM46AronNJtQ1S7tnX6YN4y72qhgiUItpacZUAQ0TyWYci3yz1X+rXaSxiuEm86PA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -3196,19 +3140,6 @@ "node": ">=8.10.0" } }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -3368,9 +3299,9 @@ } }, "node_modules/tailwind-merge": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", - "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", "license": "MIT", "funding": { "type": "github", @@ -3465,6 +3396,37 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3638,6 +3600,52 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/devfront/src/features/clients/ClientGeneralPage.tsx b/devfront/src/features/clients/ClientGeneralPage.tsx index 4db69296..626e1b7a 100644 --- a/devfront/src/features/clients/ClientGeneralPage.tsx +++ b/devfront/src/features/clients/ClientGeneralPage.tsx @@ -163,9 +163,13 @@ function ClientGeneralPage() { (err as Error)?.message ?? t("msg.common.unknown_error", "unknown error"); alert( - t("msg.dev.clients.general.save_error", "저장에 실패했습니다: {{error}}", { - error: errorMessage, - }), + t( + "msg.dev.clients.general.save_error", + "저장에 실패했습니다: {{error}}", + { + error: errorMessage, + }, + ), ); }, }); @@ -515,10 +519,7 @@ function ClientGeneralPage() { /> - {t( - "ui.dev.clients.general.security.private", - "Private", - )} + {t("ui.dev.clients.general.security.private", "Private")} {t( diff --git a/devfront/src/features/clients/ClientsPage.tsx b/devfront/src/features/clients/ClientsPage.tsx index 07667634..7cd7ad2a 100644 --- a/devfront/src/features/clients/ClientsPage.tsx +++ b/devfront/src/features/clients/ClientsPage.tsx @@ -87,7 +87,9 @@ function ClientsPage() { const clients = data?.items || []; const totalClients = clients.length; - const activeClients = clients.filter((client) => client.status === "active").length; + const activeClients = clients.filter( + (client) => client.status === "active", + ).length; // TODO: Replace with real session/auth-failure metrics when backend endpoints are available. type StatTone = "up" | "down" | "stable"; type StatItem = { @@ -310,15 +312,10 @@ function ClientsPage() { {client.type === "private" - ? t( - "ui.dev.clients.type.private", - "Private", - ) + ? t("ui.dev.clients.type.private", "Private") : t("ui.dev.clients.type.pkce", "PKCE")} From 2bdfc2eb51f7865d68b41d0e79df33b3f6310b77 Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Mon, 23 Feb 2026 22:06:00 +0900 Subject: [PATCH 23/29] =?UTF-8?q?userfront=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=ED=9B=84=20/dashboard=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 + backend/internal/handler/auth_handler.go | 51 ++- backend/internal/handler/auth_handler_test.go | 180 +++++++++++ backend/internal/handler/common_test.go | 6 + backend/internal/logger/audit_logger.go | 68 ++-- backend/internal/logger/audit_logger_test.go | 80 +++++ docs/AGENTS.md | 8 + docs/test-plan/backend-test-inventory.md | 10 +- docs/test-plan/userfront-test-inventory.md | 9 +- .../issue-277-null-check-dashboard-routing.md | 76 +++++ scripts/map_wasm_stack.py | 240 ++++++++++++++ userfront/lib/core/i18n/locale_gate.dart | 44 ++- .../lib/core/i18n/locale_storage_engine.dart | 9 +- userfront/lib/core/i18n/locale_utils.dart | 20 +- .../core/services/null_check_recovery.dart | 26 ++ .../services/web_auth_integration_web.dart | 6 +- .../lib/core/widgets/language_selector.dart | 19 +- .../presentation/create_user_screen.dart | 7 +- .../presentation/user_management_screen.dart | 7 +- .../auth/domain/cookie_session_policy.dart | 15 + .../auth/presentation/approve_qr_screen.dart | 18 +- .../auth/presentation/consent_screen.dart | 3 +- .../auth/presentation/error_screen.dart | 4 +- .../auth/presentation/login_screen.dart | 85 +++-- .../presentation/login_success_screen.dart | 3 +- .../presentation/reset_password_screen.dart | 3 +- .../auth/presentation/signup_screen.dart | 3 +- .../dashboard/domain/dashboard_providers.dart | 3 +- .../presentation/dashboard_screen.dart | 303 +++++++++++------- .../presentation/pages/profile_page.dart | 5 +- userfront/lib/main.dart | 81 ++++- .../test/cookie_session_policy_test.dart | 40 +++ .../test/dashboard_screen_smoke_test.dart | 50 +++ userfront/test/locale_utils_test.dart | 27 ++ .../test/login_navigation_race_test.dart | 94 ++++++ userfront/test/null_check_recovery_test.dart | 63 ++++ .../test/router_redirect_widget_test.dart | 53 ++- 37 files changed, 1504 insertions(+), 222 deletions(-) create mode 100644 backend/internal/logger/audit_logger_test.go create mode 100644 docs/trouble-shooting/issue-277-null-check-dashboard-routing.md create mode 100644 scripts/map_wasm_stack.py create mode 100644 userfront/lib/core/services/null_check_recovery.dart create mode 100644 userfront/lib/features/auth/domain/cookie_session_policy.dart create mode 100644 userfront/test/cookie_session_policy_test.dart create mode 100644 userfront/test/dashboard_screen_smoke_test.dart create mode 100644 userfront/test/login_navigation_race_test.dart create mode 100644 userfront/test/null_check_recovery_test.dart diff --git a/README.md b/README.md index eb6aa65f..7bac9d2c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,13 @@ **Baron 로그인**은 화이트 라벨링된 가족사의 모든 소프트웨어 Auth를 총괄하는 사용자 인증/인가 허브입니다. +## 버그 대응 대원칙 (필수) +- 모든 버그 수정은 반드시 **재현 테스트를 먼저 작성**합니다. (Failing test first) +- 재현 테스트 없이 코드만 먼저 고치는 행위를 금지합니다. +- 수정 후에는 **해당 재현 테스트가 통과할 때까지 반복**해서 원인 분석/수정/검증을 수행합니다. +- “테스트 통과”는 최소 기준입니다. 실제 재현 시나리오(로그인, 새로고침, 리다이렉트 등)까지 확인한 뒤에만 이슈를 종료합니다. +- 관련 변경이 발생하면 테스트 문서(`docs/test-plan/*`, `docs/trouble-shooting/*`)를 함께 업데이트합니다. + * Ory Stack으로 모든 구성요소를 self-hosting 합니다. * Backend는 Go (Fiber)로 구성된 Ory Stack의 유일한 Command 전송 포인트입니다. 모든 Command는 ClickHouse로 강제 전송되며 Audit Log 시스템을 구성합니다. * Front는 Backend를 통해서만 연동하며 자체가 Ory Stack의 RP기도 합니다. 크게 3개 계층으로 분리됩니다. diff --git a/backend/internal/handler/auth_handler.go b/backend/internal/handler/auth_handler.go index ebdf3f68..ec73b256 100644 --- a/backend/internal/handler/auth_handler.go +++ b/backend/internal/handler/auth_handler.go @@ -1566,7 +1566,6 @@ func (h *AuthHandler) PasswordLogin(c *fiber.Ctx) error { loginID := strings.TrimSpace(req.LoginID) ale.LoginIDs["loginId"] = req.LoginID // 원문 ale.LoginIDs["loginId_normalized"] = loginID - ale.NewPassword = req.Password // For test only, logging password (sensitive) ale.Log(slog.LevelInfo, "Attempting to login") @@ -1602,7 +1601,6 @@ func (h *AuthHandler) PasswordLogin(c *fiber.Ctx) error { ale.Status = fiber.StatusOK ale.LatencyMs = time.Since(startTime) - ale.SessionJwt = authInfo.SessionToken.JWT setSessionIDLocal(c, authInfo.SessionToken) ale.Log(slog.LevelInfo, "Login successful", slog.String("provider", h.IdpProvider.Name()), slog.String("subject", authInfo.Subject)) @@ -1854,11 +1852,23 @@ func (h *AuthHandler) ProcessPasswordResetToken(c *fiber.Ctx) error { ale.LoginIDs["loginId"] = loginID ale.LoginIDs["loginId_normalized"] = loginID - redirectURL := fmt.Sprintf("%s/reset-password?loginId=%s&token=%s", - os.Getenv("USERFRONT_URL"), - loginID, - token, - ) + userfrontURL := strings.TrimRight(os.Getenv("USERFRONT_URL"), "/") + if userfrontURL == "" { + userfrontURL = "https://sso.hmac.kr" + } + redirectBase, parseErr := url.Parse(userfrontURL + "/reset-password") + if parseErr != nil { + ale.Status = fiber.StatusInternalServerError + ale.LatencyMs = time.Since(startTime) + ale.ProviderError = parseErr.Error() + ale.Log(slog.LevelError, "Failed to compose reset redirect URL") + return c.Status(fiber.StatusInternalServerError).SendString("Failed to compose redirect URL") + } + query := redirectBase.Query() + query.Set("loginId", loginID) + query.Set("token", token) + redirectBase.RawQuery = query.Encode() + redirectURL := redirectBase.String() ale.RedirectTo = redirectURL ale.Status = fiber.StatusFound @@ -1892,22 +1902,29 @@ func (h *AuthHandler) CompletePasswordReset(c *fiber.Ctx) error { } // loginID는 URL 쿼리 파라미터 또는 토큰 조회로 받습니다. - loginID := c.Query("loginId") - resetToken := c.Query("token") - if loginID == "" && resetToken != "" { - if val, err := h.RedisService.Get(prefixPwdResetToken + resetToken); err == nil && val != "" { - loginID = val + loginID := strings.TrimSpace(c.Query("loginId")) + resetToken := strings.TrimSpace(c.Query("token")) + if resetToken != "" { + val, err := h.RedisService.Get(prefixPwdResetToken + resetToken) + if err != nil || strings.TrimSpace(val) == "" { + ale.Status = fiber.StatusUnauthorized + ale.LatencyMs = time.Since(startTime) + ale.ProviderError = "Invalid or expired reset token" ale.Token = resetToken + ale.Log(slog.LevelWarn, "Reset token invalid or expired") + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "Invalid or expired reset token"}) } + loginID = strings.TrimSpace(val) + ale.Token = resetToken + } + if loginID != "" && !strings.Contains(loginID, "@") { + loginID = normalizePhoneForLoginID(loginID) } ale.LoginIDs["loginId"] = loginID - ale.RequestBody = fmt.Sprintf("{\"newPassword\": \"%s\"}", req.NewPassword) // Log request body (for test only) - ale.NewPassword = req.NewPassword // Log new password (for test only) - // Request cookie logging (minimal) + // 요청 쿠키는 원문을 기록하지 않고 존재 여부만 기록합니다. if cookieHeader := c.Get(fiber.HeaderCookie); cookieHeader != "" { - ale.Headers["Request-Cookie-Header"] = cookieHeader if dsrfCookie := c.Cookies("DSRF"); dsrfCookie != "" { ale.ParsedCookieDSRF = dsrfCookie ale.HasCookieDSRF = true @@ -1924,7 +1941,7 @@ func (h *AuthHandler) CompletePasswordReset(c *fiber.Ctx) error { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Login ID and new password are required"}) } - // 디버깅을 위해 요청된 새 비밀번호를 로그로 출력 + // 새 비밀번호 값은 기록하지 않고, 요청 수신 이벤트만 남깁니다. ale.Log(slog.LevelInfo, "Received new password for reset") policy := h.resolvePasswordPolicy() diff --git a/backend/internal/handler/auth_handler_test.go b/backend/internal/handler/auth_handler_test.go index d9fa1227..e92f19fc 100644 --- a/backend/internal/handler/auth_handler_test.go +++ b/backend/internal/handler/auth_handler_test.go @@ -3,9 +3,11 @@ package handler import ( "bytes" "encoding/json" + "fmt" "net/http" "net/http/httptest" "testing" + "time" "github.com/gofiber/fiber/v2" ) @@ -17,6 +19,51 @@ func newTestApp(h *AuthHandler) *fiber.App { return app } +func newResetFlowTestApp(h *AuthHandler) *fiber.App { + app := fiber.New() + app.Post("/api/v1/auth/password/reset/verify", h.ProcessPasswordResetToken) + app.Post("/api/v1/auth/password/reset/complete", h.CompletePasswordReset) + return app +} + +type testRedisRepo struct { + values map[string]string +} + +func (m *testRedisRepo) Set(key string, value string, expiration time.Duration) error { + if m.values == nil { + m.values = map[string]string{} + } + m.values[key] = value + return nil +} + +func (m *testRedisRepo) Get(key string) (string, error) { + if m.values == nil { + return "", nil + } + return m.values[key], nil +} + +func (m *testRedisRepo) Delete(key string) error { + if m.values != nil { + delete(m.values, key) + } + return nil +} + +func (m *testRedisRepo) StoreVerificationCode(phone, code string) error { + return m.Set("sms:"+phone, code, time.Minute) +} + +func (m *testRedisRepo) GetVerificationCode(phone string) (string, error) { + return m.Get("sms:" + phone) +} + +func (m *testRedisRepo) DeleteVerificationCode(phone string) error { + return m.Delete("sms:" + phone) +} + func TestCompletePasswordReset_MissingLoginID(t *testing.T) { h := &AuthHandler{} app := newTestApp(h) @@ -106,3 +153,136 @@ func TestCompletePasswordReset_NilIDPProvider(t *testing.T) { t.Fatalf("unexpected error message: %v", got["error"]) } } + +func TestCompletePasswordReset_TokenValueOverridesLoginIDQuery(t *testing.T) { + const resetToken = "tok-reset-1" + const tokenLoginID = "user@example.com" + const wrongLoginID = "wrong@example.com" + const newPassword = "StrongPass1!" + + redis := &testRedisRepo{ + values: map[string]string{ + prefixPwdResetToken + resetToken: tokenLoginID, + }, + } + idp := &mockIdpProvider{ + userExists: true, + err: nil, + } + h := &AuthHandler{ + RedisService: redis, + IdpProvider: idp, + } + app := newResetFlowTestApp(h) + + body, _ := json.Marshal(map[string]string{ + "newPassword": newPassword, + }) + url := fmt.Sprintf( + "/api/v1/auth/password/reset/complete?loginId=%s&token=%s", + wrongLoginID, + resetToken, + ) + req := httptest.NewRequest(http.MethodPost, url, bytes.NewReader(body)) + req.Header.Set("Content-Type", "application/json") + + resp, err := app.Test(req) + if err != nil { + t.Fatalf("request failed: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + t.Fatalf("expected 200, got %d", resp.StatusCode) + } + if !idp.updateCalled { + t.Fatal("expected UpdateUserPassword to be called") + } + if idp.updatedLoginID != tokenLoginID { + t.Fatalf("expected loginId from token(%s), got %s", tokenLoginID, idp.updatedLoginID) + } + if idp.updatedPassword != newPassword { + t.Fatalf("expected newPassword propagated, got %s", idp.updatedPassword) + } +} + +func TestCompletePasswordReset_InvalidTokenRejectedEvenWhenLoginIDExists(t *testing.T) { + const resetToken = "invalid-token" + + redis := &testRedisRepo{ + values: map[string]string{}, + } + idp := &mockIdpProvider{ + userExists: true, + err: nil, + } + h := &AuthHandler{ + RedisService: redis, + IdpProvider: idp, + } + app := newResetFlowTestApp(h) + + body, _ := json.Marshal(map[string]string{ + "newPassword": "StrongPass1!", + }) + req := httptest.NewRequest( + http.MethodPost, + "/api/v1/auth/password/reset/complete?loginId=user@example.com&token="+resetToken, + bytes.NewReader(body), + ) + req.Header.Set("Content-Type", "application/json") + + resp, err := app.Test(req) + if err != nil { + t.Fatalf("request failed: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusUnauthorized { + t.Fatalf("expected 401 for invalid token, got %d", resp.StatusCode) + } + if idp.updateCalled { + t.Fatal("UpdateUserPassword must not be called when token is invalid") + } +} + +func TestProcessPasswordResetToken_EncodesLoginIDInRedirect(t *testing.T) { + const token = "tok-enc" + const loginID = "user+alias@example.com" + + t.Setenv("USERFRONT_URL", "https://sss.hmac.kr") + + redis := &testRedisRepo{ + values: map[string]string{ + prefixPwdResetToken + token: loginID, + }, + } + h := &AuthHandler{ + RedisService: redis, + } + app := newResetFlowTestApp(h) + + req := httptest.NewRequest( + http.MethodPost, + "/api/v1/auth/password/reset/verify?token="+token, + nil, + ) + resp, err := app.Test(req) + if err != nil { + t.Fatalf("request failed: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusFound { + t.Fatalf("expected 302, got %d", resp.StatusCode) + } + location := resp.Header.Get("Location") + if location == "" { + t.Fatal("missing redirect location") + } + redirectReq := httptest.NewRequest(http.MethodGet, location, nil) + gotLoginID := redirectReq.URL.Query().Get("loginId") + if gotLoginID != loginID { + t.Fatalf("expected encoded loginId round-trip=%s, got %s (location=%s)", loginID, gotLoginID, location) + } +} diff --git a/backend/internal/handler/common_test.go b/backend/internal/handler/common_test.go index 80c7aff1..1b862c84 100644 --- a/backend/internal/handler/common_test.go +++ b/backend/internal/handler/common_test.go @@ -19,6 +19,9 @@ type mockIdpProvider struct { verifyCodeInfo *domain.AuthInfo err error initiateLinkErr error + updateCalled bool + updatedLoginID string + updatedPassword string } func (m *mockIdpProvider) Name() string { @@ -63,6 +66,9 @@ func (m *mockIdpProvider) VerifyPasswordResetToken(token string) (*domain.AuthIn } func (m *mockIdpProvider) UpdateUserPassword(loginID, newPassword string, r *http.Request) error { + m.updateCalled = true + m.updatedLoginID = loginID + m.updatedPassword = newPassword return m.err } diff --git a/backend/internal/logger/audit_logger.go b/backend/internal/logger/audit_logger.go index e82d1017..b52f7d92 100644 --- a/backend/internal/logger/audit_logger.go +++ b/backend/internal/logger/audit_logger.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log/slog" + "strings" "time" "github.com/gofiber/fiber/v2" @@ -24,7 +25,7 @@ type AuditLogEntry struct { Origin string Referer string Query map[string]string - Headers map[string]string // Core headers like Host, Cookie, Set-Cookie + Headers map[string]string // 핵심 헤더(민감 키는 마스킹됨) LoginIDs map[string]string // loginId and loginId_normalized Token string // For reset tokens, magic link tokens ProviderError string @@ -43,8 +44,6 @@ type AuditLogEntry struct { RedirectTo string HasCookieDSRF bool ParsedCookieDSRF string - RequestBody string // For complete stage - NewPassword string // For complete stage (test only, sensitive) // ... potentially more fields specific to different stages } @@ -55,16 +54,14 @@ func NewAuditLogEntry(c *fiber.Ctx, stage string) *AuditLogEntry { // Extract query parameters queryParams := make(map[string]string) c.Context().QueryArgs().VisitAll(func(key, value []byte) { - queryParams[string(key)] = string(value) + k := string(key) + queryParams[k] = maskSensitiveByKey(k, string(value)) }) // Extract relevant headers headers := make(map[string]string) headers["Host"] = c.Get("Host") headers["User-Agent"] = c.Get("User-Agent") - if cookie := c.Get("Cookie"); cookie != "" { - headers["Cookie"] = cookie - } headers["Origin"] = c.Get("Origin") headers["Referer"] = c.Get("Referer") @@ -122,14 +119,14 @@ func (ale *AuditLogEntry) Log(level slog.Level, msg string, args ...any) { if len(ale.Query) > 0 { queryGroupArgs := make([]any, 0, len(ale.Query)) for k, v := range ale.Query { - queryGroupArgs = append(queryGroupArgs, slog.String(k, v)) + queryGroupArgs = append(queryGroupArgs, slog.String(k, maskSensitiveByKey(k, v))) } attrs = append(attrs, slog.Group("query", queryGroupArgs...)) } if len(ale.Headers) > 0 { headersGroupArgs := make([]any, 0, len(ale.Headers)) for k, v := range ale.Headers { - headersGroupArgs = append(headersGroupArgs, slog.String(k, v)) + headersGroupArgs = append(headersGroupArgs, slog.String(k, maskSensitiveByKey(k, v))) } attrs = append(attrs, slog.Group("headers", headersGroupArgs...)) } @@ -141,7 +138,7 @@ func (ale *AuditLogEntry) Log(level slog.Level, msg string, args ...any) { attrs = append(attrs, slog.Group("login_ids", loginIDGroupArgs...)) } if ale.Token != "" { - attrs = append(attrs, slog.String("token", ale.Token)) + attrs = append(attrs, slog.Bool("has_token", true)) } if ale.ProviderError != "" { attrs = append(attrs, slog.String("provider_error", ale.ProviderError)) @@ -153,13 +150,13 @@ func (ale *AuditLogEntry) Log(level slog.Level, msg string, args ...any) { attrs = append(attrs, slog.String("provider_response_body", ale.ProviderBody)) } if ale.RefreshToken != "" { - attrs = append(attrs, slog.String("refresh_token", ale.RefreshToken)) + attrs = append(attrs, slog.Bool("has_refresh_token", true)) } if ale.SessionJwt != "" { - attrs = append(attrs, slog.String("session_jwt", ale.SessionJwt)) + attrs = append(attrs, slog.Bool("has_session_jwt", true)) } if ale.AccessJwt != "" { - attrs = append(attrs, slog.String("access_jwt", ale.AccessJwt)) + attrs = append(attrs, slog.Bool("has_access_jwt", true)) } if ale.UserLoginId != "" { attrs = append(attrs, slog.String("user_login_id", ale.UserLoginId)) @@ -175,7 +172,9 @@ func (ale *AuditLogEntry) Log(level slog.Level, msg string, args ...any) { } if ale.SetCookieName != "" { attrs = append(attrs, slog.String("set_cookie_name", ale.SetCookieName)) - attrs = append(attrs, slog.String("set_cookie_value", ale.SetCookieValue)) + if ale.SetCookieValue != "" { + attrs = append(attrs, slog.Bool("has_set_cookie_value", true)) + } if len(ale.SetCookieAttrs) > 0 { cookieAttrsGroupArgs := make([]any, 0, len(ale.SetCookieAttrs)) for k, v := range ale.SetCookieAttrs { @@ -191,13 +190,7 @@ func (ale *AuditLogEntry) Log(level slog.Level, msg string, args ...any) { attrs = append(attrs, slog.Bool("has_cookie_DSRF", ale.HasCookieDSRF)) } if ale.ParsedCookieDSRF != "" { - attrs = append(attrs, slog.String("parsed_cookie_DSRF", ale.ParsedCookieDSRF)) - } - if ale.RequestBody != "" { - attrs = append(attrs, slog.String("request_body", ale.RequestBody)) - } - if ale.NewPassword != "" { // FOR TEST ONLY - DO NOT LOG IN PRODUCTION - attrs = append(attrs, slog.String("new_password", ale.NewPassword)) + attrs = append(attrs, slog.Bool("has_parsed_cookie_DSRF", true)) } // Convert variadic args to slog.Attr before appending @@ -212,3 +205,36 @@ func (ale *AuditLogEntry) Log(level slog.Level, msg string, args ...any) { slog.Default().LogAttrs(context.Background(), level, msg, attrs...) } + +var sensitiveAuditKeys = map[string]struct{}{ + "password": {}, + "currentpassword": {}, + "newpassword": {}, + "oldpassword": {}, + "token": {}, + "accesstoken": {}, + "refreshtoken": {}, + "authorization": {}, + "cookie": {}, + "setcookie": {}, + "verificationcode": {}, + "code": {}, + "loginchallenge": {}, + "loginverifier": {}, + "sessionjwt": {}, + "accessjwt": {}, + "refreshjwt": {}, +} + +func maskSensitiveByKey(key, value string) string { + if value == "" { + return value + } + k := strings.ToLower(key) + k = strings.ReplaceAll(k, "-", "") + k = strings.ReplaceAll(k, "_", "") + if _, ok := sensitiveAuditKeys[k]; ok { + return "*****" + } + return value +} diff --git a/backend/internal/logger/audit_logger_test.go b/backend/internal/logger/audit_logger_test.go new file mode 100644 index 00000000..ab8c7f8a --- /dev/null +++ b/backend/internal/logger/audit_logger_test.go @@ -0,0 +1,80 @@ +package logger + +import ( + "bytes" + "encoding/json" + "log/slog" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestAuditLogEntry_RedactsSensitiveFields(t *testing.T) { + buf := &bytes.Buffer{} + previous := slog.Default() + slog.SetDefault(slog.New(slog.NewJSONHandler(buf, nil))) + defer slog.SetDefault(previous) + + ale := &AuditLogEntry{ + RequestID: "req-1", + Stage: "login", + Token: "tok-secret", + RefreshToken: "refresh-secret", + SessionJwt: "session-secret", + AccessJwt: "access-secret", + SetCookieName: "sid", + SetCookieValue: "cookie-secret", + ParsedCookieDSRF: "dsrf-secret", + LoginIDs: map[string]string{ + "loginId": "user@example.com", + }, + Query: map[string]string{ + "token": "query-token", + "locale": "ko", + }, + Headers: map[string]string{ + "Authorization": "Bearer secret", + "Cookie": "session=secret", + }, + } + + ale.Log(slog.LevelInfo, "test") + + line := strings.TrimSpace(buf.String()) + require.NotEmpty(t, line) + + var payload map[string]any + require.NoError(t, json.Unmarshal([]byte(line), &payload)) + + assert.NotContains(t, payload, "token") + assert.NotContains(t, payload, "refresh_token") + assert.NotContains(t, payload, "session_jwt") + assert.NotContains(t, payload, "access_jwt") + assert.NotContains(t, payload, "set_cookie_value") + assert.NotContains(t, payload, "parsed_cookie_DSRF") + assert.NotContains(t, payload, "request_body") + assert.NotContains(t, payload, "new_password") + + assert.Equal(t, true, payload["has_token"]) + assert.Equal(t, true, payload["has_refresh_token"]) + assert.Equal(t, true, payload["has_session_jwt"]) + assert.Equal(t, true, payload["has_access_jwt"]) + assert.Equal(t, true, payload["has_set_cookie_value"]) + assert.Equal(t, true, payload["has_parsed_cookie_DSRF"]) + + loginIDs, ok := payload["login_ids"].(map[string]any) + require.True(t, ok) + assert.Equal(t, "user@example.com", loginIDs["loginId"]) + + query, ok := payload["query"].(map[string]any) + require.True(t, ok) + assert.Equal(t, "*****", query["token"]) + assert.Equal(t, "ko", query["locale"]) + + headers, ok := payload["headers"].(map[string]any) + require.True(t, ok) + assert.Equal(t, "*****", headers["Authorization"]) + assert.Equal(t, "*****", headers["Cookie"]) +} diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 227b1214..650b3219 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -1,5 +1,13 @@ # AGENTS 가이드 (Baron SSO) +## 버그 수정 절차 대원칙 (강제) +- 버그 대응 시 **재현 테스트를 먼저 작성**합니다. +- 재현 테스트가 실패하는 상태를 확인한 뒤에만 수정 작업을 시작합니다. +- 수정 후에는 테스트를 반복 실행하여 재현 테스트가 안정적으로 통과할 때까지 계속 보완합니다. +- 재현 테스트 없이 “감으로 수정”하거나, 실패 테스트를 남긴 채 성공으로 보고하지 않습니다. +- 이슈 종료 전에는 최소 1회 이상 실제 사용자 경로(예: 로그인/새로고침/리다이렉트)를 확인합니다. +- 테스트/원인/조치 내역은 문서(`docs/test-plan/*`, `docs/trouble-shooting/*`)에 반영합니다. + ## 목적 - 인증/인가 허브로서 **Backend + Ory Stack** 중심 아키텍처를 유지 - 사용자 플로우(UserFront)와 관리 플로우(Admin/DevFront)를 명확히 분리 diff --git a/docs/test-plan/backend-test-inventory.md b/docs/test-plan/backend-test-inventory.md index 6daa3b97..92cdb9d0 100644 --- a/docs/test-plan/backend-test-inventory.md +++ b/docs/test-plan/backend-test-inventory.md @@ -31,9 +31,12 @@ | `backend/internal/handler/auth_handler_qr_test.go:107` | `TestScanQRLogin_Success` | 인증/OIDC 플로우 검증 | | `backend/internal/handler/auth_handler_qr_test.go:150` | `TestResolveConsentSubjects_TokenAndCookie` | 인증/OIDC 플로우 검증 | | `backend/internal/handler/auth_handler_qr_test.go:57` | `TestQRLoginFlow_Success` | 인증/OIDC 플로우 검증 | -| `backend/internal/handler/auth_handler_test.go:20` | `TestCompletePasswordReset_MissingLoginID` | 오류/예외/거부 경로 검증 | -| `backend/internal/handler/auth_handler_test.go:50` | `TestCompletePasswordReset_InvalidPasswordPolicy` | 오류/예외/거부 경로 검증 | -| `backend/internal/handler/auth_handler_test.go:80` | `TestCompletePasswordReset_NilIDPProvider` | 인증/OIDC 플로우 검증 | +| `backend/internal/handler/auth_handler_test.go:67` | `TestCompletePasswordReset_MissingLoginID` | 오류/예외/거부 경로 검증 | +| `backend/internal/handler/auth_handler_test.go:97` | `TestCompletePasswordReset_InvalidPasswordPolicy` | 오류/예외/거부 경로 검증 | +| `backend/internal/handler/auth_handler_test.go:127` | `TestCompletePasswordReset_NilIDPProvider` | 오류/예외/거부 경로 검증 | +| `backend/internal/handler/auth_handler_test.go:157` | `TestCompletePasswordReset_TokenValueOverridesLoginIDQuery` | 비밀번호 재설정 토큰 우선 규칙 검증 | +| `backend/internal/handler/auth_handler_test.go:209` | `TestCompletePasswordReset_InvalidTokenRejectedEvenWhenLoginIDExists` | 오류/예외/거부 경로 검증 | +| `backend/internal/handler/auth_handler_test.go:249` | `TestProcessPasswordResetToken_EncodesLoginIDInRedirect` | 리다이렉트/쿼리 보존 규칙 검증 | | `backend/internal/handler/dev_handler_test.go:103` | `TestCreateClient_Success` | Hydra/RP 연동 검증 | | `backend/internal/handler/dev_handler_test.go:15` | `TestListClients_Success` | Hydra/RP 연동 검증 | | `backend/internal/handler/dev_handler_test.go:49` | `TestGetClient_Success` | Hydra/RP 연동 검증 | @@ -48,6 +51,7 @@ | `backend/internal/idp/factory_test.go:123` | `TestChainedProviderMetadataUnion` | 회귀 방지 기본 동작 검증 | | `backend/internal/idp/factory_test.go:139` | `TestChainedProviderUpdateUserPasswordFallback` | 복구/격리/회복 탄력성 검증 | | `backend/internal/idp/factory_test.go:152` | `TestChainedProviderUpdateUserPasswordAllFail` | 인증/OIDC 플로우 검증 | +| `backend/internal/logger/audit_logger_test.go:14` | `TestAuditLogEntry_RedactsSensitiveFields` | 감사 로그 민감정보 마스킹/비노출 검증 | | `backend/internal/middleware/audit_middleware_test.go:42` | `TestAuditMiddleware` | 회귀 방지 기본 동작 검증 | | `backend/internal/middleware/error_code_enricher_test.go:22` | `TestErrorCodeEnricher_AddsCodeToLegacyErrorResponse` | 오류/예외/거부 경로 검증 | | `backend/internal/middleware/error_code_enricher_test.go:50` | `TestErrorCodeEnricher_DoesNotOverrideExistingCode` | 오류/예외/거부 경로 검증 | diff --git a/docs/test-plan/userfront-test-inventory.md b/docs/test-plan/userfront-test-inventory.md index 217ab751..8d2ca68e 100644 --- a/docs/test-plan/userfront-test-inventory.md +++ b/docs/test-plan/userfront-test-inventory.md @@ -43,15 +43,22 @@ | `userfront/test/login_challenge_resolver_test.dart` | `widget 값이 없으면 URI query에서 복구` | fallback/복구 경로 검증 | | `userfront/test/login_challenge_resolver_test.dart` | `widget 값이 있으면 최우선으로 사용` | 핵심 동작 회귀 방지 검증 | | `userfront/test/login_challenge_resolver_test.dart` | `값이 전부 없으면 missing` | fallback/복구 경로 검증 | +| `userfront/test/null_check_recovery_test.dart` | `Null check 오류 + 루트(/)면 선호 로케일 signin으로 복구` | Null-check 예외 복구 경로 검증 | +| `userfront/test/null_check_recovery_test.dart` | `Null check 오류 + /ko면 /ko/signin으로 복구` | Null-check 예외 복구 경로 검증 | +| `userfront/test/null_check_recovery_test.dart` | `이미 /ko/signin이면 복구 이동하지 않음` | Null-check 예외 복구 경로 검증 | +| `userfront/test/null_check_recovery_test.dart` | `Null check 오류여도 /ko/profile에서는 복구 이동하지 않음` | Null-check 예외 복구 경로 검증 | +| `userfront/test/null_check_recovery_test.dart` | `다른 오류 메시지면 복구 이동하지 않음` | Null-check 예외 복구 경로 검증 | | `userfront/test/oidc_redirect_guard_test.dart` | `http/https 절대 URL만 허용` | 핵심 동작 회귀 방지 검증 | | `userfront/test/oidc_redirect_guard_test.dart` | `빈 문자열과 파싱 실패를 차단` | 핵심 동작 회귀 방지 검증 | | `userfront/test/password_login_flow_policy_test.dart` | `OIDC challenge가 없고 jwt가 있으면 로컬 로그인 완료로 진행한다` | 로그인 분기/라우팅 규칙 검증 | | `userfront/test/password_login_flow_policy_test.dart` | `OIDC challenge가 있고 redirectTo가 없으면 accept를 시도한다` | 로그인 분기/라우팅 규칙 검증 | | `userfront/test/password_login_flow_policy_test.dart` | `redirectTo/jwt 모두 없으면 invalid로 처리한다` | 로그인 분기/라우팅 규칙 검증 | | `userfront/test/password_login_flow_policy_test.dart` | `redirectTo가 있으면 OIDC redirect를 우선한다` | 로그인 분기/라우팅 규칙 검증 | +| `userfront/test/router_redirect_widget_test.dart` | `루트 경로: /{locale} 로 접근 시 /{locale}/signin 으로 리다이렉트되어야 한다 (버그: 화면 렌더링 안됨)` | 로그인 분기/라우팅 규칙 검증 | | `userfront/test/router_redirect_widget_test.dart` | `/login: login_challenge와 redirect_uri를 전달` | 리다이렉트/쿼리 보존 규칙 검증 | | `userfront/test/router_redirect_widget_test.dart` | `로그인 상태: profile 접근 시 signin으로 리다이렉트하지 않음` | 로그인 분기/라우팅 규칙 검증 | | `userfront/test/router_redirect_widget_test.dart` | `로그인 후 같은 브라우저 새 창/팝업에서도 세션이 유지된다` | 로그인 세션 지속성(동일 브라우저) 검증 | | `userfront/test/router_redirect_widget_test.dart` | `비로그인: redirect_uri/login_challenge가 signin으로 전달` | 리다이렉트/쿼리 보존 규칙 검증 | | `userfront/test/router_redirect_widget_test.dart` | `비로그인: redirect_uri가 없으면 redirect_url을 전달` | 리다이렉트/쿼리 보존 규칙 검증 | -| `userfront/test/widget_test.dart` | `BaronSSOApp builds` | 기본 앱 렌더링 스모크 검증 | +| `userfront/test/dashboard_screen_smoke_test.dart` | `대시보드는 로그인 토큰이 있으면 크래시 없이 기본 프레임을 렌더링한다` | 대시보드 Null-check 회귀 방지 스모크 검증 | +| `userfront/test/widget_test.dart` | `smoke test` | 기본 앱 렌더링 스모크 검증 | diff --git a/docs/trouble-shooting/issue-277-null-check-dashboard-routing.md b/docs/trouble-shooting/issue-277-null-check-dashboard-routing.md new file mode 100644 index 00000000..8ee809e8 --- /dev/null +++ b/docs/trouble-shooting/issue-277-null-check-dashboard-routing.md @@ -0,0 +1,76 @@ +# Issue #277/#302 트러블슈팅 기록: 로그인 후 공백 화면 + 새로고침 시 signin 회귀 + +## 기준 시점 +- 2026-02-23 KST +- 재현 환경: `https://sss.hmac.kr` (WASM 배포) + +## 증상 +- 로그인 직후 URL은 `/{locale}` 또는 `/{locale}/dashboard`로 보이지만 화면이 렌더링되지 않음 +- 이후 새로고침하면 `/{locale}/signin`으로 되돌아감 +- 콘솔/백엔드 수집 로그: + - `Null check operator used on a null value` + - `wasm-function[765]` 포함 스택 반복 + +## 스택 매핑 결과 (source-map + no-strip-wasm) +- 매핑 커맨드: + - `python3 scripts/map_wasm_stack.py --wasm userfront/build/web/main.dart.wasm --sourcemap userfront/build/web/main.dart.wasm.map --frame ...` +- 핵심 프레임: + - `wasm-function[765]` -> `_TypeError._throwNullCheckErrorWithCurrentStack` + - 상위 프레임 -> Flutter `NavigatorState.didUpdateWidget/_updatePages` 경로 +- 결론: + - 단일 위젯 null 접근보다, 라우트 갱신 타이밍/중복 네비게이션 경쟁에서 `Navigator` 내부에서 터지는 양상 + +## 지금까지 시행착오와 실패 내역 +1. `LocaleGate`, `LanguageSelector`의 `EasyLocalization.of(context)` null 방어만 적용 +- 결과: 동일 예외 재발 +- 이유: 루트 원인은 로케일 위젯 단일 null 접근이 아니라 네비게이션 경쟁 구간 + +2. `/ko` 루트에서 signin 강제 리다이렉트만 강화 +- 결과: 최초 진입은 일부 개선됐지만 로그인 직후/새로고침 회귀 지속 +- 이유: 로그인 성공 경로가 루트(`/{locale}`)와 엮이면서 라우트 재평가가 중첩 + +3. 로그인 화면에서 `AuthNotifier.notify()` + `context.go(...)` 동시 수행 +- 결과: 간헐적 경쟁 상태 유발 가능성 확인 +- 조치: 로컬 네비게이션 1회 가드 도입(`_goLocalizedHomeOnce`) + +4. cookie 세션 승격이 토큰 저장 이후 덮어쓰는 경합 +- 결과: 일부 흐름에서 저장 상태 불안정 가능성 +- 조치: `cookie_session_policy` 추가, 토큰 존재 시 불필요한 cookie 승격 차단 + +5. `/:locale` 엔트리가 redirect 없이 매칭되는 구조 +- 결과: `/ko` 직접 진입 시 페이지 스택 재계산 과정에서 `NavigatorState.didUpdateWidget/_updatePages` 경로 null check 재발 +- 이유: `/ko`는 실질 화면이 아닌 분기 지점인데, 명시적 redirect 경로가 없으면 라우트 갱신 타이밍 경쟁에 취약 +- 조치: `/:locale`를 redirect 전용 엔트리로 확정(비로그인 `/{locale}/signin`, 로그인 `/{locale}/dashboard`) + +## 최종 반영 방향 (이번 패치) +1. 로그인 성공 기본 경로를 명시적으로 `/{locale}/dashboard`로 고정 +- `buildLocalizedHomePath()` 반환값을 `/{locale}/dashboard`로 변경 +- `/:locale` 엔트리는 `/:locale/dashboard`로 redirect 전용 처리 + +2. 라우터/화면 역할 분리 +- 보호 경로 검사는 router redirect에서 수행 +- 대시보드는 필요 시 cookie 세션 복구를 1회 시도 후 signin 이동 + +3. 중복 네비게이션 억제 +- 로그인 성공 시 내부 이동은 1회만 수행 + +## 검증 +- 추가 테스트: + - `userfront/test/login_navigation_race_test.dart` + - `userfront/test/cookie_session_policy_test.dart` + - `userfront/test/router_redirect_widget_test.dart` (`/{locale}` 직접 진입 시 signin/dashboard 분기 검증) +- 갱신 테스트: + - `userfront/test/locale_utils_test.dart` (home path `/{locale}/dashboard` 기준) +- 실행: + - `flutter test` + - `flutter test --platform chrome test/router_redirect_widget_test.dart test/login_navigation_race_test.dart test/cookie_session_policy_test.dart` + +## 남은 리스크 +- 실제 브라우저 저장소 정책(localStorage 차단/쿠키 정책)에 따라 세션 판정이 달라질 수 있음 +- 운영 검증 시 네트워크/스토리지 상태를 함께 수집해야 원인 분리 가능 + +## 운영 확인 체크리스트 +1. 비로그인으로 `/{locale}` 접속 시 즉시 `/{locale}/signin` 이동 +2. 로그인 성공 시 `/{locale}/dashboard` 진입 +3. `/{locale}/dashboard`에서 새로고침 후 세션 유지 (동일 브라우저) +4. 실패 시 `RECOVERY_NAV_NULL_CHECK`와 wasm frame 동시 수집 diff --git a/scripts/map_wasm_stack.py b/scripts/map_wasm_stack.py new file mode 100644 index 00000000..fb2e5dae --- /dev/null +++ b/scripts/map_wasm_stack.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 +""" +WASM 스택의 `wasm-function[IDX]:0xOFFSET`를 이름/소스 라인으로 매핑합니다. + +사용 예시: + python3 scripts/map_wasm_stack.py \ + --wasm userfront/build/web/main.dart.wasm \ + --sourcemap userfront/build/web/main.dart.wasm.map \ + --frame "19112:0x2cd913" --frame "765:0x10af0e" +""" + +from __future__ import annotations + +import argparse +import bisect +import json +import re +from dataclasses import dataclass +from pathlib import Path +from typing import Dict, List, Optional, Tuple + + +BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +BASE64_MAP = {c: i for i, c in enumerate(BASE64_CHARS)} + + +def read_u32_leb128(buf: bytes, i: int) -> Tuple[int, int]: + value = 0 + shift = 0 + while True: + b = buf[i] + i += 1 + value |= (b & 0x7F) << shift + if b < 0x80: + return value, i + shift += 7 + + +def decode_vlq_segment(segment: str) -> List[int]: + out: List[int] = [] + i = 0 + while i < len(segment): + shift = 0 + value = 0 + while True: + d = BASE64_MAP[segment[i]] + i += 1 + value |= (d & 0x1F) << shift + shift += 5 + if (d & 0x20) == 0: + break + sign = value & 1 + value >>= 1 + out.append(-value if sign else value) + return out + + +@dataclass +class SourcePoint: + generated_col: int + source_index: Optional[int] + source_line: Optional[int] + source_col: Optional[int] + name_index: Optional[int] + + +class WasmSourceMap: + def __init__(self, sourcemap_path: Path): + data = json.loads(sourcemap_path.read_text(encoding="utf-8")) + self.sources: List[str] = data["sources"] + self.names: List[str] = data.get("names", []) + mappings: str = data["mappings"] + # wasm sourcemap은 generated line 1개를 쓰는 형태라 ',' 단위로만 파싱합니다. + segments = mappings.split(",") + + points: List[SourcePoint] = [] + generated_col = 0 + source_index = 0 + source_line = 0 + source_col = 0 + name_index = 0 + + for seg in segments: + if not seg: + continue + vals = decode_vlq_segment(seg) + generated_col += vals[0] + si: Optional[int] = None + sl: Optional[int] = None + sc: Optional[int] = None + ni: Optional[int] = None + if len(vals) >= 4: + source_index += vals[1] + source_line += vals[2] + source_col += vals[3] + si = source_index + sl = source_line + sc = source_col + if len(vals) >= 5: + name_index += vals[4] + ni = name_index + points.append( + SourcePoint( + generated_col=generated_col, + source_index=si, + source_line=sl, + source_col=sc, + name_index=ni, + ) + ) + self.points = points + self.columns = [p.generated_col for p in points] + + def lookup(self, offset: int) -> Optional[SourcePoint]: + idx = bisect.bisect_right(self.columns, offset) - 1 + if idx < 0: + return None + return self.points[idx] + + def source_name(self, index: Optional[int]) -> Optional[str]: + if index is None or index < 0 or index >= len(self.sources): + return None + return self.sources[index] + + def symbol_name(self, index: Optional[int]) -> Optional[str]: + if index is None or index < 0 or index >= len(self.names): + return None + return self.names[index] + + +def parse_wasm_function_names(wasm_path: Path) -> Dict[int, str]: + b = wasm_path.read_bytes() + if b[:4] != b"\x00asm": + raise ValueError(f"Not a wasm binary: {wasm_path}") + + function_names: Dict[int, str] = {} + i = 8 # magic + version + + while i < len(b): + section_id = b[i] + i += 1 + section_size, i = read_u32_leb128(b, i) + section_start = i + section_end = i + section_size + + if section_id == 0: # custom section + name_len, j = read_u32_leb128(b, i) + custom_name = b[j : j + name_len].decode("utf-8", errors="replace") + payload_start = j + name_len + if custom_name == "name": + k = payload_start + while k < section_end: + subsection_id = b[k] + k += 1 + subsection_size, k = read_u32_leb128(b, k) + subsection_end = k + subsection_size + if subsection_id == 1: # function names + count, k = read_u32_leb128(b, k) + for _ in range(count): + fn_idx, k = read_u32_leb128(b, k) + nlen, k = read_u32_leb128(b, k) + name = b[k : k + nlen].decode("utf-8", errors="replace") + k += nlen + function_names[fn_idx] = name + else: + k = subsection_end + + i = section_end + return function_names + + +def parse_frame(raw: str) -> Tuple[int, int]: + m = re.match(r"^\s*(\d+)\s*:\s*(0x[0-9a-fA-F]+)\s*$", raw) + if not m: + raise ValueError(f"Invalid --frame format: {raw!r} (expected IDX:0xOFFSET)") + return int(m.group(1)), int(m.group(2), 16) + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description="Map wasm stack frames to source locations") + p.add_argument("--wasm", required=True, type=Path, help="WASM binary path") + p.add_argument("--sourcemap", required=True, type=Path, help="WASM sourcemap path") + p.add_argument( + "--frame", + action="append", + default=[], + help="Frame in IDX:0xOFFSET format (repeatable)", + ) + p.add_argument( + "--offset", + action="append", + default=[], + help="Offset only (hex), function index unknown", + ) + return p.parse_args() + + +def main() -> None: + args = parse_args() + source_map = WasmSourceMap(args.sourcemap) + function_names = parse_wasm_function_names(args.wasm) + + targets: List[Tuple[Optional[int], int]] = [] + for f in args.frame: + idx, off = parse_frame(f) + targets.append((idx, off)) + for off in args.offset: + targets.append((None, int(off, 16))) + + if not targets: + raise SystemExit("No targets. Provide --frame or --offset.") + + for fn_idx, off in targets: + point = source_map.lookup(off) + fn_name = function_names.get(fn_idx) if fn_idx is not None else None + mapped_col = point.generated_col if point else None + src = source_map.source_name(point.source_index) if point else None + src_line = (point.source_line + 1) if point and point.source_line is not None else None + src_col = (point.source_col + 1) if point and point.source_col is not None else None + symbol = source_map.symbol_name(point.name_index) if point else None + + print( + json.dumps( + { + "function_index": fn_idx, + "function_name": fn_name, + "offset_hex": hex(off), + "mapped_generated_col_hex": hex(mapped_col) if mapped_col is not None else None, + "source": src, + "source_line": src_line, + "source_column": src_col, + "symbol": symbol, + }, + ensure_ascii=False, + ) + ) + + +if __name__ == "__main__": + main() diff --git a/userfront/lib/core/i18n/locale_gate.dart b/userfront/lib/core/i18n/locale_gate.dart index 1031703c..adeea578 100644 --- a/userfront/lib/core/i18n/locale_gate.dart +++ b/userfront/lib/core/i18n/locale_gate.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:easy_localization/easy_localization.dart' hide tr; import 'package:flutter/material.dart'; @@ -17,28 +19,54 @@ class LocaleGate extends StatefulWidget { } class _LocaleGateState extends State { + bool _syncScheduled = false; + @override void didChangeDependencies() { super.didChangeDependencies(); - _applyLocale(); + _scheduleLocaleSync(); } @override void didUpdateWidget(LocaleGate oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.localeCode != widget.localeCode) { - _applyLocale(); + _scheduleLocaleSync(); } } - Future _applyLocale() async { - final normalized = normalizeLocaleCode(widget.localeCode); - LocaleStorage.write(normalized); - webWindow.setTitle(tr('ui.userfront.app_title')); - if (context.locale.languageCode == normalized) { + void _scheduleLocaleSync() { + if (_syncScheduled) { + return; + } + _syncScheduled = true; + WidgetsBinding.instance.addPostFrameCallback((_) { + _syncScheduled = false; + if (!mounted) { + return; + } + unawaited(_applyLocale()); + }); + } + + Future _applyLocale() async { + if (!mounted) { + return; + } + final normalized = normalizeLocaleCode(widget.localeCode); + LocaleStorage.write(normalized); + final localization = EasyLocalization.of(context); + if (localization == null) { + return; + } + if (localization.currentLocale?.languageCode == normalized) { + webWindow.setTitle(tr('ui.userfront.app_title')); + return; + } + await localization.setLocale(Locale(normalized)); + if (!mounted) { return; } - await context.setLocale(Locale(normalized)); webWindow.setTitle(tr('ui.userfront.app_title')); } diff --git a/userfront/lib/core/i18n/locale_storage_engine.dart b/userfront/lib/core/i18n/locale_storage_engine.dart index 0c907b40..c5dd2ebf 100644 --- a/userfront/lib/core/i18n/locale_storage_engine.dart +++ b/userfront/lib/core/i18n/locale_storage_engine.dart @@ -183,10 +183,11 @@ class LocaleStorageEngine implements LocaleStorageBackend { final legacy = _readByKey(LocaleStoragePolicy.legacyKey); if (LocaleStoragePolicy.shouldMigrateLegacy( - current: current, - legacy: legacy, - )) { - _writeByKey(LocaleStoragePolicy.currentKey, legacy!); + current: current, + legacy: legacy, + ) && + legacy != null) { + _writeByKey(LocaleStoragePolicy.currentKey, legacy); _removeEverywhere(LocaleStoragePolicy.legacyKey); return legacy; } diff --git a/userfront/lib/core/i18n/locale_utils.dart b/userfront/lib/core/i18n/locale_utils.dart index 5d403bcf..dd9989c8 100644 --- a/userfront/lib/core/i18n/locale_utils.dart +++ b/userfront/lib/core/i18n/locale_utils.dart @@ -32,10 +32,10 @@ String resolvePreferredLocaleCode() { } } final deviceLocale = PlatformDispatcher.instance.locale; - final languageTag = - deviceLocale.countryCode == null || deviceLocale.countryCode!.isEmpty + final countryCode = deviceLocale.countryCode; + final languageTag = countryCode == null || countryCode.isEmpty ? deviceLocale.languageCode - : '${deviceLocale.languageCode}-${deviceLocale.countryCode}'; + : '${deviceLocale.languageCode}-$countryCode'; return normalizeLocaleCode(languageTag); } @@ -101,3 +101,17 @@ String buildSigninRedirectPath(String localeCode, Uri uri) { } return result; } + +String buildLocalizedHomePath(Uri uri, {String? preferredLocaleCode}) { + final resolvedLocale = + extractLocaleFromPath(uri) ?? + normalizeLocaleCode(preferredLocaleCode ?? resolvePreferredLocaleCode()); + return '/$resolvedLocale/dashboard'; +} + +String buildLocalizedSigninPath(Uri uri, {String? preferredLocaleCode}) { + final resolvedLocale = + extractLocaleFromPath(uri) ?? + normalizeLocaleCode(preferredLocaleCode ?? resolvePreferredLocaleCode()); + return '/$resolvedLocale/signin'; +} diff --git a/userfront/lib/core/services/null_check_recovery.dart b/userfront/lib/core/services/null_check_recovery.dart new file mode 100644 index 00000000..fa31030b --- /dev/null +++ b/userfront/lib/core/services/null_check_recovery.dart @@ -0,0 +1,26 @@ +import '../i18n/locale_utils.dart'; + +String? computeNullCheckRecoveryTarget({ + required Object exception, + required Uri uri, + required String preferredLocaleCode, +}) { + final message = exception.toString(); + if (!message.contains('Null check operator used on a null value')) { + return null; + } + + final localeCode = + extractLocaleFromPath(uri) ?? normalizeLocaleCode(preferredLocaleCode); + final path = uri.path; + final localeRootPath = '/$localeCode'; + if (path != '/' && path != localeRootPath) { + return null; + } + + final target = '/$localeCode/signin'; + if (path == target) { + return null; + } + return target; +} diff --git a/userfront/lib/core/services/web_auth_integration_web.dart b/userfront/lib/core/services/web_auth_integration_web.dart index 061c5d2c..c22f454e 100644 --- a/userfront/lib/core/services/web_auth_integration_web.dart +++ b/userfront/lib/core/services/web_auth_integration_web.dart @@ -6,6 +6,7 @@ import 'package:web/web.dart' as web; import 'package:flutter/foundation.dart'; import 'dart:js_interop'; import 'auth_token_store.dart'; +import '../i18n/locale_utils.dart'; void implSendLoginSuccess(String token) { var effectiveToken = token; @@ -87,8 +88,9 @@ void implSendLoginSuccess(String token) { } // No opener and no redirect: fall back to local navigation - debugPrint('No opener found. Redirecting to /.'); - web.window.location.href = '/'; + final fallbackTarget = buildLocalizedHomePath(Uri.base); + debugPrint('No opener found. Redirecting to $fallbackTarget.'); + web.window.location.href = fallbackTarget; } bool implIsPopup() { diff --git a/userfront/lib/core/widgets/language_selector.dart b/userfront/lib/core/widgets/language_selector.dart index 27520d84..d1ff2fd6 100644 --- a/userfront/lib/core/widgets/language_selector.dart +++ b/userfront/lib/core/widgets/language_selector.dart @@ -13,7 +13,13 @@ class LanguageSelector extends StatelessWidget { @override Widget build(BuildContext context) { - final current = context.locale.languageCode; + final localization = EasyLocalization.of(context); + final resolvedCurrent = normalizeLocaleCode( + localization?.currentLocale?.languageCode, + ); + final current = (resolvedCurrent == 'ko' || resolvedCurrent == 'en') + ? resolvedCurrent + : 'en'; final items = [ DropdownMenuItem(value: 'ko', child: Text(tr('ui.common.language_ko'))), DropdownMenuItem( @@ -34,9 +40,16 @@ class LanguageSelector extends StatelessWidget { return; } LocaleStorage.write(value); - await context.setLocale(Locale(value)); + if (localization != null) { + await localization.setLocale(Locale(value)); + } if (!context.mounted) return; - final uri = GoRouterState.of(context).uri; + Uri uri; + try { + uri = GoRouterState.of(context).uri; + } catch (_) { + uri = Uri.base; + } final target = buildLocalizedPath(value, uri); context.go(target); }, diff --git a/userfront/lib/features/admin/presentation/create_user_screen.dart b/userfront/lib/features/admin/presentation/create_user_screen.dart index 8022df09..368cc681 100644 --- a/userfront/lib/features/admin/presentation/create_user_screen.dart +++ b/userfront/lib/features/admin/presentation/create_user_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import '../../../../core/services/auth_proxy_service.dart'; +import '../../../../core/i18n/locale_utils.dart'; class CreateUserScreen extends StatefulWidget { const CreateUserScreen({super.key}); @@ -67,7 +68,7 @@ class _CreateUserScreenState extends State { // If cancelled or empty if (inputPassword == null || inputPassword.isEmpty) { - if (mounted) context.go('/'); // Kick out + if (mounted) context.go(buildLocalizedHomePath(Uri.base)); // Kick out return; } @@ -91,7 +92,7 @@ class _CreateUserScreenState extends State { backgroundColor: Colors.red, ), ); - context.go('/'); // Kick out + context.go(buildLocalizedHomePath(Uri.base)); // Kick out } } } @@ -178,7 +179,7 @@ class _CreateUserScreenState extends State { title: const Text('Create User'), leading: IconButton( icon: const Icon(Icons.arrow_back), - onPressed: () => context.go('/'), + onPressed: () => context.go(buildLocalizedHomePath(Uri.base)), ), ), body: Center( diff --git a/userfront/lib/features/admin/presentation/user_management_screen.dart b/userfront/lib/features/admin/presentation/user_management_screen.dart index 881acd05..50274f13 100644 --- a/userfront/lib/features/admin/presentation/user_management_screen.dart +++ b/userfront/lib/features/admin/presentation/user_management_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'dart:async'; import '../../../../core/services/auth_proxy_service.dart'; +import '../../../../core/i18n/locale_utils.dart'; class UserManagementScreen extends StatefulWidget { const UserManagementScreen({super.key}); @@ -89,7 +90,7 @@ class _UserManagementScreenState extends State ); if (inputPassword == null || inputPassword.isEmpty) { - if (mounted) context.go('/'); + if (mounted) context.go(buildLocalizedHomePath(Uri.base)); return; } @@ -113,7 +114,7 @@ class _UserManagementScreenState extends State backgroundColor: Colors.red, ), ); - context.go('/'); + context.go(buildLocalizedHomePath(Uri.base)); } } } @@ -365,7 +366,7 @@ class _UserManagementScreenState extends State title: const Text('User Management'), leading: IconButton( icon: const Icon(Icons.arrow_back), - onPressed: () => context.go('/'), + onPressed: () => context.go(buildLocalizedHomePath(Uri.base)), ), bottom: TabBar( controller: _tabController, diff --git a/userfront/lib/features/auth/domain/cookie_session_policy.dart b/userfront/lib/features/auth/domain/cookie_session_policy.dart new file mode 100644 index 00000000..9d6271d7 --- /dev/null +++ b/userfront/lib/features/auth/domain/cookie_session_policy.dart @@ -0,0 +1,15 @@ +bool shouldPromoteCookieSession({ + required String? currentToken, + required String? loginChallenge, +}) { + final hasToken = currentToken != null && currentToken.trim().isNotEmpty; + final hasChallenge = + loginChallenge != null && loginChallenge.trim().isNotEmpty; + + // 토큰 기반 세션이 이미 확보된 일반 로그인 흐름에서는 + // 뒤늦은 쿠키 세션 승격이 토큰을 덮어쓰지 않도록 차단합니다. + if (hasToken && !hasChallenge) { + return false; + } + return true; +} diff --git a/userfront/lib/features/auth/presentation/approve_qr_screen.dart b/userfront/lib/features/auth/presentation/approve_qr_screen.dart index d55c6b2b..01dca34c 100644 --- a/userfront/lib/features/auth/presentation/approve_qr_screen.dart +++ b/userfront/lib/features/auth/presentation/approve_qr_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import '../../../../core/i18n/locale_utils.dart'; import '../../../../core/services/auth_proxy_service.dart'; import '../../../../core/services/auth_token_store.dart'; @@ -47,14 +48,15 @@ class _ApproveQrScreenState extends State { void _redirectIfNotLoggedIn() { if (_redirectingToLogin || !mounted) return; - final hasStoredToken = AuthTokenStore.getToken() != null; + final hasStoredToken = AuthTokenStore.getToken()?.isNotEmpty ?? false; final usesCookie = AuthTokenStore.usesCookie(); final isLoggedIn = hasStoredToken || usesCookie; if (!isLoggedIn) { _redirectingToLogin = true; WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; - context.go('/signin?notice=qr_login_required'); + final target = buildLocalizedSigninPath(Uri.base); + context.go('$target?notice=qr_login_required'); }); } } @@ -70,7 +72,8 @@ class _ApproveQrScreenState extends State { } if (storedToken == null && !hasCookie) { if (mounted) { - context.go('/signin?notice=qr_login_required'); + final target = buildLocalizedSigninPath(Uri.base); + context.go('$target?notice=qr_login_required'); } return; } @@ -94,7 +97,7 @@ class _ApproveQrScreenState extends State { // Automatically go to dashboard after a short delay Future.delayed(const Duration(seconds: 1), () { - if (mounted) context.go('/'); + if (mounted) context.go(buildLocalizedHomePath(Uri.base)); }); } catch (e) { setState(() => _message = "Error: $e"); @@ -105,7 +108,7 @@ class _ApproveQrScreenState extends State { @override Widget build(BuildContext context) { - final hasStoredToken = AuthTokenStore.getToken() != null; + final hasStoredToken = AuthTokenStore.getToken()?.isNotEmpty ?? false; final usesCookie = AuthTokenStore.usesCookie(); final isLoggedIn = hasStoredToken || usesCookie || _isCheckingSession; @@ -163,14 +166,15 @@ class _ApproveQrScreenState extends State { Padding( padding: const EdgeInsets.only(top: 16), child: TextButton( - onPressed: () => context.go('/signin'), + onPressed: () => + context.go(buildLocalizedSigninPath(Uri.base)), child: const Text("Login on this device first"), ), ), if (_success) FilledButton( - onPressed: () => context.go('/'), + onPressed: () => context.go(buildLocalizedHomePath(Uri.base)), child: const Text("Go to My Dashboard"), ), ], diff --git a/userfront/lib/features/auth/presentation/consent_screen.dart b/userfront/lib/features/auth/presentation/consent_screen.dart index 2080063d..4d4f0734 100644 --- a/userfront/lib/features/auth/presentation/consent_screen.dart +++ b/userfront/lib/features/auth/presentation/consent_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:userfront/core/i18n/locale_utils.dart'; import 'package:userfront/core/services/auth_proxy_service.dart'; import 'package:userfront/core/services/web_window.dart'; @@ -153,7 +154,7 @@ class _ConsentScreenState extends State { if (redirectTo != null) { webWindow.redirectTo(redirectTo); } else { - if (mounted) context.go('/'); + if (mounted) context.go(buildLocalizedHomePath(Uri.base)); } } catch (e) { setState(() => _isSubmitting = false); diff --git a/userfront/lib/features/auth/presentation/error_screen.dart b/userfront/lib/features/auth/presentation/error_screen.dart index d86d1092..b2ebc876 100644 --- a/userfront/lib/features/auth/presentation/error_screen.dart +++ b/userfront/lib/features/auth/presentation/error_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import '../../../core/constants/error_whitelist.dart'; +import '../../../core/i18n/locale_utils.dart'; import '../../../core/services/auth_proxy_service.dart'; import 'package:userfront/i18n.dart'; @@ -130,7 +131,8 @@ class ErrorScreen extends StatelessWidget { child: Text(tr('ui.userfront.error.go_login')), ), OutlinedButton( - onPressed: () => context.go('/'), + onPressed: () => + context.go(buildLocalizedHomePath(Uri.base)), style: OutlinedButton.styleFrom( foregroundColor: const Color(0xFF111827), padding: const EdgeInsets.symmetric( diff --git a/userfront/lib/features/auth/presentation/login_screen.dart b/userfront/lib/features/auth/presentation/login_screen.dart index bddb8515..47539b75 100644 --- a/userfront/lib/features/auth/presentation/login_screen.dart +++ b/userfront/lib/features/auth/presentation/login_screen.dart @@ -9,9 +9,11 @@ import '../../../core/widgets/language_selector.dart'; import '../../../core/services/web_auth_integration.dart'; import '../../../core/services/auth_proxy_service.dart'; import '../../../core/services/auth_token_store.dart'; +import '../../../core/i18n/locale_utils.dart'; import '../../../core/services/oidc_redirect_guard.dart'; import '../../../core/notifiers/auth_notifier.dart'; import '../domain/login_challenge_resolver.dart'; +import '../domain/cookie_session_policy.dart'; import '../../profile/domain/notifiers/profile_notifier.dart'; import '../../../core/services/web_window.dart'; @@ -65,6 +67,7 @@ class _LoginScreenState extends ConsumerState bool _verificationOnly = false; bool _verificationApproved = false; bool _dismissedOverlays = false; + bool _localNavigationCompleted = false; String _verificationMessage = ''; String _verificationTitle = tr('ui.userfront.login.verification.title'); String _verificationPageTitle = tr( @@ -125,7 +128,11 @@ class _LoginScreenState extends ConsumerState if (hasLoginCode) { _verifyLoginCode(loginIdParam, codeParam, pendingRef: pendingRefParam); } else if (hasVerificationToken) { - _verifyToken(widget.verificationToken ?? uri.queryParameters['t']!); + final verificationToken = + widget.verificationToken ?? uri.queryParameters['t']; + if (verificationToken != null && verificationToken.isNotEmpty) { + _verifyToken(verificationToken); + } } if (!_noticeHandled && notice == 'qr_login_required') { @@ -142,8 +149,12 @@ class _LoginScreenState extends ConsumerState } Future _tryCookieSession({bool silent = true}) async { - if (AuthTokenStore.getToken() != null && - (_loginChallenge == null || _loginChallenge!.isEmpty)) { + final loginChallenge = _loginChallenge; + final token = AuthTokenStore.getToken(); + if (!shouldPromoteCookieSession( + currentToken: token, + loginChallenge: loginChallenge, + )) { return; } final pendingProvider = AuthTokenStore.getPendingProvider(); @@ -151,6 +162,12 @@ class _LoginScreenState extends ConsumerState try { await AuthProxyService.checkCookieSession(); + if (!shouldPromoteCookieSession( + currentToken: AuthTokenStore.getToken(), + loginChallenge: loginChallenge, + )) { + return; + } AuthTokenStore.setCookieMode(provider: provider); AuthTokenStore.clearPendingProvider(); if (mounted) { @@ -171,7 +188,6 @@ class _LoginScreenState extends ConsumerState Future _onCookieLoginSuccess(String provider) async { debugPrint("[Auth] Cookie-based login success. Provider: $provider"); - AuthNotifier.instance.notify(); if (_hasLoginChallenge) { final accepted = await _acceptOidcLoginAndRedirect(); if (accepted) { @@ -185,8 +201,9 @@ class _LoginScreenState extends ConsumerState final token = AuthTokenStore.getToken(); if (token != null && token.isNotEmpty) { + final redirectUrl = _redirectUrl; if (WebAuthIntegration.isPopup() || - (_redirectUrl != null && _redirectUrl!.isNotEmpty)) { + (redirectUrl != null && redirectUrl.isNotEmpty)) { debugPrint( "[Auth] Cookie session with external integration. Notifying...", ); @@ -196,14 +213,23 @@ class _LoginScreenState extends ConsumerState } if (mounted) { - context.go('/'); + _goLocalizedHomeOnce(); } } + void _goLocalizedHomeOnce() { + if (!mounted || _localNavigationCompleted) { + return; + } + _localNavigationCompleted = true; + context.go(buildLocalizedHomePath(Uri.base)); + } + Future _attemptOidcAutoAccept() async { if (_oidcAutoAcceptTried) return; _oidcAutoAcceptTried = true; - if (_loginChallenge == null || _loginChallenge!.isEmpty) { + final loginChallenge = _loginChallenge; + if (loginChallenge == null || loginChallenge.isEmpty) { return; } @@ -227,12 +253,13 @@ class _LoginScreenState extends ConsumerState } Future _acceptOidcLoginAndRedirect({String? token}) async { - if (_loginChallenge == null || _loginChallenge!.isEmpty) { + final loginChallenge = _loginChallenge; + if (loginChallenge == null || loginChallenge.isEmpty) { return false; } try { final res = await AuthProxyService.acceptOidcLogin( - _loginChallenge!, + loginChallenge, token: token, ); final redirectTo = res['redirectTo'] as String?; @@ -274,8 +301,10 @@ class _LoginScreenState extends ConsumerState } } - bool get _hasLoginChallenge => - _loginChallenge != null && _loginChallenge!.isNotEmpty; + bool get _hasLoginChallenge { + final loginChallenge = _loginChallenge; + return loginChallenge != null && loginChallenge.isNotEmpty; + } LoginChallengeResolution _resolveLoginChallenge(Uri uri) { return resolveLoginChallenge( @@ -486,7 +515,11 @@ class _LoginScreenState extends ConsumerState } try { - final res = await AuthProxyService.pollQrStatus(_qrPendingRef!); + final pendingRef = _qrPendingRef; + if (pendingRef == null || pendingRef.isEmpty) { + return; + } + final res = await AuthProxyService.pollQrStatus(pendingRef); if (res['error'] == 'slow_down') { final interval = res['interval']; if (interval is int && interval > 0) { @@ -656,9 +689,11 @@ class _LoginScreenState extends ConsumerState FilledButton( onPressed: () { final hasLocalSession = - AuthTokenStore.getToken() != null || + (AuthTokenStore.getToken()?.isNotEmpty ?? false) || AuthTokenStore.usesCookie(); - final target = hasLocalSession ? '/' : '/signin'; + final target = hasLocalSession + ? buildLocalizedHomePath(Uri.base) + : buildLocalizedSigninPath(Uri.base); if (mounted) { setState(() { _verificationOnly = false; @@ -691,7 +726,9 @@ class _LoginScreenState extends ConsumerState final jwt = res['token'] ?? res['sessionJwt'] ?? res['sessionToken']; final status = res['status']?.toString(); final hasLocalSession = await _hasValidLocalSession(); - final actionPath = hasLocalSession ? '/' : '/signin'; + final actionPath = hasLocalSession + ? buildLocalizedHomePath(Uri.base) + : buildLocalizedSigninPath(Uri.base); if (status == 'approved' || (jwt == null && _verificationOnly)) { if (mounted) { @@ -754,7 +791,9 @@ class _LoginScreenState extends ConsumerState "[Auth] Code verification successful for loginId: $sanitizedLoginId", ); final hasLocalSession = await _hasValidLocalSession(); - final actionPath = hasLocalSession ? '/' : '/signin'; + final actionPath = hasLocalSession + ? buildLocalizedHomePath(Uri.base) + : buildLocalizedSigninPath(Uri.base); if (jwt == null && status == 'approved') { if (mounted) { @@ -814,7 +853,9 @@ class _LoginScreenState extends ConsumerState final status = res['status']?.toString(); debugPrint("[Auth] Short code verification successful"); final hasLocalSession = await _hasValidLocalSession(); - final actionPath = hasLocalSession ? '/' : '/signin'; + final actionPath = hasLocalSession + ? buildLocalizedHomePath(Uri.base) + : buildLocalizedSigninPath(Uri.base); if (jwt == null && status == 'approved') { if (mounted) { @@ -1147,14 +1188,15 @@ class _LoginScreenState extends ConsumerState } // [Priority 2] OIDC Challenge Handling - if (_loginChallenge != null && _loginChallenge!.isNotEmpty) { + final loginChallenge = _loginChallenge; + if (loginChallenge != null && loginChallenge.isNotEmpty) { try { // Save token first, it's needed for acceptance final providerName = provider ?? AuthTokenStore.getProvider(); AuthTokenStore.setToken(token, provider: providerName); final res = await AuthProxyService.acceptOidcLogin( - _loginChallenge!, + loginChallenge, token: token, ); final nextRedirectTo = res['redirectTo'] as String?; @@ -1196,9 +1238,8 @@ class _LoginScreenState extends ConsumerState return; } - AuthNotifier.instance.notify(); if (mounted) { - context.go('/'); + _goLocalizedHomeOnce(); } } catch (globalErr) { // ignore @@ -1237,7 +1278,7 @@ class _LoginScreenState extends ConsumerState title: Text(_verificationPageTitle), leading: IconButton( icon: const Icon(Icons.arrow_back), - onPressed: () => context.go('/'), + onPressed: () => context.go(buildLocalizedHomePath(Uri.base)), ), ), body: _buildVerificationResultView(), diff --git a/userfront/lib/features/auth/presentation/login_success_screen.dart b/userfront/lib/features/auth/presentation/login_success_screen.dart index 97b7b467..cb045820 100644 --- a/userfront/lib/features/auth/presentation/login_success_screen.dart +++ b/userfront/lib/features/auth/presentation/login_success_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:userfront/core/i18n/locale_utils.dart'; import 'package:userfront/i18n.dart'; class LoginSuccessScreen extends StatelessWidget { @@ -54,7 +55,7 @@ class LoginSuccessScreen extends StatelessWidget { const SizedBox(height: 24), TextButton( onPressed: () { - context.go('/'); + context.go(buildLocalizedHomePath(Uri.base)); }, child: Text( tr('ui.userfront.login_success.later'), diff --git a/userfront/lib/features/auth/presentation/reset_password_screen.dart b/userfront/lib/features/auth/presentation/reset_password_screen.dart index 6ecc4513..d2ccd716 100644 --- a/userfront/lib/features/auth/presentation/reset_password_screen.dart +++ b/userfront/lib/features/auth/presentation/reset_password_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import '../../../core/i18n/locale_utils.dart'; import '../../../core/services/auth_proxy_service.dart'; import 'package:userfront/i18n.dart'; @@ -89,7 +90,7 @@ class _ResetPasswordScreenState extends State { backgroundColor: Colors.green, ), ); - context.go('/signin'); + context.go(buildLocalizedSigninPath(Uri.base)); } } catch (e) { if (mounted) { diff --git a/userfront/lib/features/auth/presentation/signup_screen.dart b/userfront/lib/features/auth/presentation/signup_screen.dart index 3c704c86..708e4d5e 100644 --- a/userfront/lib/features/auth/presentation/signup_screen.dart +++ b/userfront/lib/features/auth/presentation/signup_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:userfront/i18n.dart'; +import '../../../core/i18n/locale_utils.dart'; import '../../../core/services/auth_proxy_service.dart'; class SignupScreen extends StatefulWidget { @@ -345,7 +346,7 @@ class _SignupScreenState extends State { content: Text(tr('msg.userfront.signup.success.body')), actions: [ TextButton( - onPressed: () => context.go('/signin'), + onPressed: () => context.go(buildLocalizedSigninPath(Uri.base)), child: Text(tr('ui.userfront.signup.success.action')), ), ], diff --git a/userfront/lib/features/dashboard/domain/dashboard_providers.dart b/userfront/lib/features/dashboard/domain/dashboard_providers.dart index 93577cd1..1a4307b2 100644 --- a/userfront/lib/features/dashboard/domain/dashboard_providers.dart +++ b/userfront/lib/features/dashboard/domain/dashboard_providers.dart @@ -133,7 +133,8 @@ class AuthTimelineNotifier extends Notifier { if (state.isLoading || state.isLoadingMore) { return; } - if (state.nextCursor == null || state.nextCursor!.isEmpty) { + final nextCursor = state.nextCursor; + if (nextCursor == null || nextCursor.isEmpty) { return; } state = state.copyWith(isLoadingMore: true, error: null); diff --git a/userfront/lib/features/dashboard/presentation/dashboard_screen.dart b/userfront/lib/features/dashboard/presentation/dashboard_screen.dart index 4d86c2f8..565bbbfb 100644 --- a/userfront/lib/features/dashboard/presentation/dashboard_screen.dart +++ b/userfront/lib/features/dashboard/presentation/dashboard_screen.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -7,6 +8,7 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import '../domain/providers/linked_rps_provider.dart'; import '../../../../core/notifiers/auth_notifier.dart'; +import '../../../../core/services/auth_proxy_service.dart'; import '../../../../core/services/auth_token_store.dart'; import '../../../../core/services/http_client.dart'; import '../../../../core/i18n/locale_utils.dart'; @@ -38,6 +40,7 @@ class _DashboardScreenState extends ConsumerState { bool _auditLoadingMore = false; bool _isRevoking = false; bool _redirectingToSignin = false; + bool _authBootstrapInProgress = false; bool _showAllActivities = false; final Set _revokedClientIds = {}; @@ -47,11 +50,10 @@ class _DashboardScreenState extends ConsumerState { super.initState(); _pageScrollController.addListener(_onPageScroll); WidgetsBinding.instance.addPostFrameCallback((_) { - if (!_isLoggedIn()) { - _redirectToSignin(); + if (!mounted) { return; } - _loadAuditLogs(reset: true); + unawaited(_bootstrapAuthAndLoad()); }); } @@ -254,7 +256,7 @@ class _DashboardScreenState extends ConsumerState { if (closeOnTap) { Navigator.of(context).pop(); } - context.go('/'); + context.go(buildLocalizedHomePath(Uri.base)); }, ), ListTile( @@ -302,8 +304,11 @@ class _DashboardScreenState extends ConsumerState { Future _refreshAll() async { if (!_isLoggedIn()) { - _redirectToSignin(); - return; + final recovered = await _recoverSessionFromCookie(); + if (!recovered) { + _redirectToSignin(); + return; + } } await ref.read(profileProvider.notifier).loadProfile(); setState(() { @@ -372,7 +377,8 @@ class _DashboardScreenState extends ConsumerState { if (_auditLoading || _auditLoadingMore) { return; } - if (!reset && (_auditNextCursor == null || _auditNextCursor!.isEmpty)) { + final nextCursor = _auditNextCursor; + if (!reset && (nextCursor == null || nextCursor.isEmpty)) { return; } @@ -706,109 +712,133 @@ class _DashboardScreenState extends ConsumerState { @override Widget build(BuildContext context) { - if (!_isLoggedIn()) { - _redirectToSignin(); - return const SizedBox.shrink(); - } - final isWide = MediaQuery.of(context).size.width >= sideMenuBreakpoint; - final profileState = ref.watch(profileProvider); - final profile = profileState.value; - final timelineState = ref.watch(authTimelineProvider); - final userName = - profile?.name ?? - profile?.email ?? - profile?.phone ?? - tr('ui.userfront.profile.user_fallback', fallback: 'User'); - final department = profile?.department.isNotEmpty == true - ? profile!.department - : tr('ui.userfront.profile.department_empty'); - final sessionIssuedAt = _getJwtIssuedAt(); + try { + if (!_isLoggedIn()) { + _redirectToSignin(); + return const SizedBox.shrink(); + } + final isWide = MediaQuery.of(context).size.width >= sideMenuBreakpoint; + final profileState = ref.watch(profileProvider); + final profile = profileState.value; + final timelineState = ref.watch(authTimelineProvider); + final userName = + profile?.name ?? + profile?.email ?? + profile?.phone ?? + tr('ui.userfront.profile.user_fallback', fallback: 'User'); + final departmentValue = profile?.department ?? ''; + final department = departmentValue.isNotEmpty + ? departmentValue + : tr('ui.userfront.profile.department_empty'); + final sessionIssuedAt = _getJwtIssuedAt(); - return Scaffold( - backgroundColor: _subtle, - appBar: AppBar( - title: Text( - tr('ui.userfront.app_title'), - style: TextStyle(fontWeight: FontWeight.bold), - ), - elevation: 0, - backgroundColor: _surface, - foregroundColor: Colors.black, - actions: [ - IconButton( - icon: const Icon(Icons.person_outline), - tooltip: tr('ui.userfront.nav.profile'), - onPressed: () => context.push('/profile'), + return Scaffold( + backgroundColor: _subtle, + appBar: AppBar( + title: Text( + tr('ui.userfront.app_title'), + style: const TextStyle(fontWeight: FontWeight.bold), ), - IconButton( - icon: const Icon(Icons.qr_code_scanner), - tooltip: tr('ui.userfront.nav.qr_scan'), - onPressed: _onScanQR, - ), - IconButton( - icon: const Icon(Icons.logout), - tooltip: tr('ui.userfront.nav.logout'), - onPressed: _logout, - ), - ], - ), - drawer: isWide - ? null - : Drawer(child: _buildSideMenu(context, closeOnTap: true)), - body: Row( - children: [ - if (isWide) - SizedBox( - width: 240, - child: _buildSideMenu(context, closeOnTap: false), + elevation: 0, + backgroundColor: _surface, + foregroundColor: Colors.black, + actions: [ + IconButton( + icon: const Icon(Icons.person_outline), + tooltip: tr('ui.userfront.nav.profile'), + onPressed: () => context.push('/profile'), ), - Expanded( - child: RefreshIndicator( - onRefresh: _refreshAll, - child: LayoutBuilder( - builder: (context, constraints) { - final timelineWide = constraints.maxWidth >= 900; - final isMobile = constraints.maxWidth < 600; - return SingleChildScrollView( - controller: _pageScrollController, - physics: const AlwaysScrollableScrollPhysics(), - child: Padding( - padding: const EdgeInsets.all(24), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!isMobile) ...[ - _buildHeaderCard( - userName, - department, - sessionIssuedAt, + IconButton( + icon: const Icon(Icons.qr_code_scanner), + tooltip: tr('ui.userfront.nav.qr_scan'), + onPressed: _onScanQR, + ), + IconButton( + icon: const Icon(Icons.logout), + tooltip: tr('ui.userfront.nav.logout'), + onPressed: _logout, + ), + ], + ), + drawer: isWide + ? null + : Drawer(child: _buildSideMenu(context, closeOnTap: true)), + body: Row( + children: [ + if (isWide) + SizedBox( + width: 240, + child: _buildSideMenu(context, closeOnTap: false), + ), + Expanded( + child: RefreshIndicator( + onRefresh: _refreshAll, + child: LayoutBuilder( + builder: (context, constraints) { + final timelineWide = constraints.maxWidth >= 900; + final isMobile = constraints.maxWidth < 600; + return SingleChildScrollView( + controller: _pageScrollController, + physics: const AlwaysScrollableScrollPhysics(), + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!isMobile) ...[ + _buildHeaderCard( + userName, + department, + sessionIssuedAt, + ), + const SizedBox(height: 28), + ], + _buildSectionTitle( + tr('ui.userfront.sections.apps'), + tr('msg.userfront.sections.apps_subtitle'), ), + const SizedBox(height: 12), + _buildActivitySection(isMobile), const SizedBox(height: 28), + _buildSectionTitle( + tr('ui.userfront.sections.audit'), + tr('msg.userfront.sections.audit_subtitle'), + ), + const SizedBox(height: 12), + _buildAccessHistory(timelineState, timelineWide), ], - _buildSectionTitle( - tr('ui.userfront.sections.apps'), - tr('msg.userfront.sections.apps_subtitle'), - ), - const SizedBox(height: 12), - _buildActivitySection(isMobile), - const SizedBox(height: 28), - _buildSectionTitle( - tr('ui.userfront.sections.audit'), - tr('msg.userfront.sections.audit_subtitle'), - ), - const SizedBox(height: 12), - _buildAccessHistory(timelineState, timelineWide), - ], + ), ), - ), - ); - }, + ); + }, + ), ), ), + ], + ), + ); + } catch (error, stackTrace) { + AuthProxyService.logError( + 'DASHBOARD_RENDER_ERROR: $error\nuri=${Uri.base}', + error: error, + stackTrace: stackTrace, + ); + return Scaffold( + backgroundColor: _subtle, + body: Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Text( + tr( + 'msg.userfront.dashboard.render_error', + fallback: '대시보드 렌더링 중 오류가 발생했습니다. 다시 시도해 주세요.', + ), + textAlign: TextAlign.center, + ), ), - ], - ), - ); + ), + ); + } } Widget _buildHeaderCard( @@ -973,8 +1003,9 @@ class _DashboardScreenState extends ConsumerState { normalizedStatus == 'active' || normalizedStatus == ''; final isRevoked = !isActiveInApi; - final lastAuthLabel = rp.lastAuthenticatedAt != null - ? _formatDateTime(rp.lastAuthenticatedAt!) + final lastAuthAt = rp.lastAuthenticatedAt; + final lastAuthLabel = lastAuthAt != null + ? _formatDateTime(lastAuthAt) : tr('ui.userfront.dashboard.activity.linked'); final statusCode = isRevoked ? 'revoked' : 'active'; @@ -1004,8 +1035,10 @@ class _DashboardScreenState extends ConsumerState { if (!aActive && bActive) return 1; // 둘 다 활성이거나 둘 다 비활성인 경우 최근 인증순 내림차순 - if (a.lastAuthDateTime != null && b.lastAuthDateTime != null) { - return b.lastAuthDateTime!.compareTo(a.lastAuthDateTime!); + final aLastAuth = a.lastAuthDateTime; + final bLastAuth = b.lastAuthDateTime; + if (aLastAuth != null && bLastAuth != null) { + return bLastAuth.compareTo(aLastAuth); } if (a.lastAuthDateTime != null) return -1; if (b.lastAuthDateTime != null) return 1; @@ -1045,7 +1078,7 @@ class _DashboardScreenState extends ConsumerState { } // 카드의 너비를 화면 너비에 맞춰 계산 (여백 고려) - final double spacing = 12.0; + const spacing = 12.0; final double cardWidth = (maxWidth - (spacing * (crossAxisCount - 1))) / crossAxisCount; @@ -1244,8 +1277,9 @@ class _DashboardScreenState extends ConsumerState { child: GestureDetector( onTap: () async { final messenger = ScaffoldMessenger.of(context); - if (item.url != null && item.url!.isNotEmpty) { - final uri = Uri.parse(item.url!); + final itemUrl = item.url; + if (itemUrl != null && itemUrl.isNotEmpty) { + final uri = Uri.parse(itemUrl); final canOpen = await canLaunchUrl(uri); if (!mounted) return; if (canOpen) { @@ -1568,7 +1602,8 @@ class _DashboardScreenState extends ConsumerState { ), ); } - if (state.nextCursor == null || state.nextCursor!.isEmpty) { + final nextCursor = state.nextCursor; + if (nextCursor == null || nextCursor.isEmpty) { return Padding( padding: const EdgeInsets.only(top: 8), child: Text( @@ -1581,7 +1616,8 @@ class _DashboardScreenState extends ConsumerState { } bool _isLoggedIn() { - return AuthTokenStore.getToken() != null || AuthTokenStore.usesCookie(); + final token = AuthTokenStore.getToken(); + return (token != null && token.isNotEmpty) || AuthTokenStore.usesCookie(); } void _redirectToSignin() { @@ -1593,13 +1629,60 @@ class _DashboardScreenState extends ConsumerState { if (!mounted) { return; } - final uri = GoRouterState.of(context).uri; + Uri uri; + try { + uri = GoRouterState.of(context).uri; + } catch (_) { + uri = Uri.base; + } final localeCode = extractLocaleFromPath(uri) ?? resolvePreferredLocaleCode(); context.go('/$localeCode/signin'); _redirectingToSignin = false; }); } + + Future _bootstrapAuthAndLoad() async { + if (!mounted || _authBootstrapInProgress) { + return; + } + _authBootstrapInProgress = true; + try { + var authenticated = _isLoggedIn(); + if (!authenticated) { + authenticated = await _recoverSessionFromCookie(); + } + if (!mounted) { + return; + } + if (!authenticated) { + _redirectToSignin(); + return; + } + await _loadAuditLogs(reset: true); + } finally { + _authBootstrapInProgress = false; + } + } + + Future _recoverSessionFromCookie() async { + try { + await AuthProxyService.checkCookieSession(); + final provider = + AuthTokenStore.getProvider() ?? + AuthTokenStore.getPendingProvider() ?? + 'ory'; + AuthTokenStore.setCookieMode(provider: provider); + AuthTokenStore.clearPendingProvider(); + AuthNotifier.instance.notify(); + try { + await ref.read(profileProvider.notifier).loadProfile(); + } catch (_) {} + return true; + } catch (_) { + return false; + } + } } class _ActivityItem { diff --git a/userfront/lib/features/profile/presentation/pages/profile_page.dart b/userfront/lib/features/profile/presentation/pages/profile_page.dart index 5c06da38..861a7b88 100644 --- a/userfront/lib/features/profile/presentation/pages/profile_page.dart +++ b/userfront/lib/features/profile/presentation/pages/profile_page.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:userfront/i18n.dart'; import '../../../../core/notifiers/auth_notifier.dart'; +import '../../../../core/i18n/locale_utils.dart'; import '../../../../core/services/auth_token_store.dart'; import '../../../../core/ui/layout_breakpoints.dart'; import '../../../../core/widgets/language_selector.dart'; @@ -509,7 +510,7 @@ class _ProfilePageState extends ConsumerState { ListTile( leading: const Icon(Icons.home_outlined), title: Text(tr('ui.userfront.nav.dashboard')), - onTap: () => context.go('/'), + onTap: () => context.go(buildLocalizedHomePath(Uri.base)), ), ListTile( leading: const Icon(Icons.person_outline), @@ -1092,7 +1093,7 @@ class _ProfilePageState extends ConsumerState { IconButton( icon: const Icon(Icons.home_outlined), tooltip: tr('ui.userfront.nav.dashboard'), - onPressed: () => context.go('/'), + onPressed: () => context.go(buildLocalizedHomePath(Uri.base)), ), IconButton( icon: const Icon(Icons.qr_code_scanner), diff --git a/userfront/lib/main.dart b/userfront/lib/main.dart index 8e86bc67..ae2f26d8 100644 --- a/userfront/lib/main.dart +++ b/userfront/lib/main.dart @@ -20,6 +20,8 @@ import 'features/profile/presentation/pages/profile_page.dart'; import 'core/services/auth_proxy_service.dart'; import 'core/services/auth_token_store.dart'; import 'core/services/logger_service.dart'; +import 'core/services/null_check_recovery.dart'; +import 'core/services/web_window.dart'; import 'core/notifiers/auth_notifier.dart'; import 'core/i18n/locale_gate.dart'; import 'core/i18n/locale_registry.dart'; @@ -31,6 +33,29 @@ import 'i18n.dart'; final _log = Logger('Main'); +void _attemptRecoveryFromNullCheck({ + required Object exception, + StackTrace? stackTrace, +}) { + final uri = Uri.base; + final target = computeNullCheckRecoveryTarget( + exception: exception, + uri: uri, + preferredLocaleCode: resolvePreferredLocaleCode(), + ); + if (target == null) { + return; + } + final path = uri.path; + + AuthProxyService.logError( + 'RECOVERY_NAV_NULL_CHECK path=$path target=$target uri=$uri', + error: exception, + stackTrace: stackTrace, + ); + webWindow.redirectTo(target); +} + Future _loadBundledFonts() async { const family = 'NotoSansKR'; final loader = FontLoader(family); @@ -57,11 +82,16 @@ void main() async { AuthProxyService.logError( "FLUTTER_ERROR: ${details.exception}\n${details.stack}", ); + _attemptRecoveryFromNullCheck( + exception: details.exception, + stackTrace: details.stack, + ); }; PlatformDispatcher.instance.onError = (error, stack) { _log.severe("PLATFORM_ERROR", error, stack); AuthProxyService.logError("PLATFORM_ERROR: $error\n$stack"); + _attemptRecoveryFromNullCheck(exception: error, stackTrace: stack); return true; }; @@ -107,6 +137,15 @@ final _router = GoRouter( debugLogDiagnostics: !kReleaseMode, refreshListenable: AuthNotifier.instance, routes: [ + GoRoute( + path: '/', + redirect: (context, state) { + return buildLocalizedHomePath( + state.uri, + preferredLocaleCode: resolvePreferredLocaleCode(), + ); + }, + ), ShellRoute( builder: (context, state, child) { final localeCode = @@ -116,10 +155,25 @@ final _router = GoRouter( routes: [ GoRoute( path: '/:locale', - // Note: Removed direct builder here to prevent interference with sub-routes + redirect: (context, state) { + // /{locale} 진입은 화면 렌더링 없이 단일 목적지로만 보냅니다. + if (state.uri.pathSegments.length != 1) { + return null; + } + final rawLocale = state.pathParameters['locale']; + final localeCode = normalizeLocaleCode(rawLocale); + final token = AuthTokenStore.getToken(); + final isLoggedIn = + (token != null && token.isNotEmpty) || + AuthTokenStore.usesCookie(); + if (!isLoggedIn) { + return buildSigninRedirectPath(localeCode, state.uri); + } + return '/$localeCode/dashboard'; + }, routes: [ GoRoute( - path: '', // Matches /:locale + path: 'dashboard', builder: (context, state) { return const DashboardScreen(); }, @@ -299,9 +353,16 @@ final _router = GoRouter( } if (!isLoggedIn) { + if (path == '/') { + return '/$requestedLocale/signin'; + } return buildSigninRedirectPath(requestedLocale, uri); } + if (path == '/') { + return '/$requestedLocale/dashboard'; + } + return null; }, ); @@ -311,11 +372,21 @@ class BaronSSOApp extends StatelessWidget { @override Widget build(BuildContext context) { + final localization = EasyLocalization.of(context); + final supportedLocales = + localization?.supportedLocales ?? + LocaleRegistry.supportedLocaleCodes + .map((code) => Locale(code)) + .toList(growable: false); + final delegates = localization?.delegates ?? const []; + final locale = + localization?.currentLocale ?? Locale(resolvePreferredLocaleCode()); + return MaterialApp.router( title: tr('ui.userfront.app_title'), - localizationsDelegates: context.localizationDelegates, - supportedLocales: context.supportedLocales, - locale: context.locale, + localizationsDelegates: delegates, + supportedLocales: supportedLocales, + locale: locale, theme: ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: const Color(0xFF1A1F2C), // Dark Navy/Black base diff --git a/userfront/test/cookie_session_policy_test.dart b/userfront/test/cookie_session_policy_test.dart new file mode 100644 index 00000000..c927447c --- /dev/null +++ b/userfront/test/cookie_session_policy_test.dart @@ -0,0 +1,40 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:userfront/features/auth/domain/cookie_session_policy.dart'; + +void main() { + group('cookie_session_policy', () { + test('토큰이 없고 login_challenge도 없으면 cookie 승격 허용', () { + expect( + shouldPromoteCookieSession(currentToken: null, loginChallenge: null), + isTrue, + ); + }); + + test('토큰이 이미 있으면 일반 로그인에서 cookie 승격 차단', () { + expect( + shouldPromoteCookieSession( + currentToken: 'existing-token', + loginChallenge: null, + ), + isFalse, + ); + }); + + test('OIDC login_challenge가 있으면 token 존재 시에도 cookie 승격 허용', () { + expect( + shouldPromoteCookieSession( + currentToken: 'existing-token', + loginChallenge: 'lc_123', + ), + isTrue, + ); + }); + + test('공백 토큰은 유효 토큰으로 간주하지 않음', () { + expect( + shouldPromoteCookieSession(currentToken: ' ', loginChallenge: null), + isTrue, + ); + }); + }); +} diff --git a/userfront/test/dashboard_screen_smoke_test.dart b/userfront/test/dashboard_screen_smoke_test.dart new file mode 100644 index 00000000..519bd003 --- /dev/null +++ b/userfront/test/dashboard_screen_smoke_test.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:userfront/core/services/auth_token_store.dart'; +import 'package:userfront/features/dashboard/presentation/dashboard_screen.dart'; + +void main() { + setUp(() { + AuthTokenStore.clear(); + }); + + tearDown(() { + AuthTokenStore.clear(); + }); + + testWidgets('대시보드는 로그인 토큰이 있으면 크래시 없이 기본 프레임을 렌더링한다', (tester) async { + final recordedErrors = []; + final previousOnError = FlutterError.onError; + FlutterError.onError = (details) { + final text = details.exceptionAsString(); + if (text.contains('A RenderFlex overflowed')) { + return; + } + recordedErrors.add(details); + }; + addTearDown(() { + FlutterError.onError = previousOnError; + }); + + tester.view.devicePixelRatio = 1.0; + tester.view.physicalSize = const Size(1920, 1080); + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + + AuthTokenStore.setToken('smoke-token', provider: 'ory'); + + await tester.pumpWidget( + const ProviderScope(child: MaterialApp(home: DashboardScreen())), + ); + await tester.pump(); + + expect(find.byType(Scaffold), findsOneWidget); + final hasNullCheckCrash = recordedErrors.any( + (error) => error.exceptionAsString().contains( + 'Null check operator used on a null value', + ), + ); + expect(hasNullCheckCrash, isFalse); + }); +} diff --git a/userfront/test/locale_utils_test.dart b/userfront/test/locale_utils_test.dart index 3137c41e..adb2be4f 100644 --- a/userfront/test/locale_utils_test.dart +++ b/userfront/test/locale_utils_test.dart @@ -127,5 +127,32 @@ void main() { '/ko/signin?redirect_url=https%3A%2F%2Fa.example.com%2Fcb&redirect_uri=https%3A%2F%2Fb.example.com%2Fcb', ); }); + + test('buildLocalizedHomePath keeps locale from uri', () { + expect(buildLocalizedHomePath(Uri.parse('/ko/signin')), '/ko/dashboard'); + expect(buildLocalizedHomePath(Uri.parse('/en/profile')), '/en/dashboard'); + }); + + test('buildLocalizedHomePath falls back to preferred locale', () { + expect( + buildLocalizedHomePath(Uri.parse('/signin'), preferredLocaleCode: 'ko'), + '/ko/dashboard', + ); + }); + + test('buildLocalizedSigninPath keeps locale from uri', () { + expect(buildLocalizedSigninPath(Uri.parse('/ko')), '/ko/signin'); + expect(buildLocalizedSigninPath(Uri.parse('/en/profile')), '/en/signin'); + }); + + test('buildLocalizedSigninPath falls back to preferred locale', () { + expect( + buildLocalizedSigninPath( + Uri.parse('/profile'), + preferredLocaleCode: 'ko', + ), + '/ko/signin', + ); + }); }); } diff --git a/userfront/test/login_navigation_race_test.dart b/userfront/test/login_navigation_race_test.dart new file mode 100644 index 00000000..7d55bc5f --- /dev/null +++ b/userfront/test/login_navigation_race_test.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:go_router/go_router.dart'; +import 'package:userfront/core/i18n/locale_registry.dart'; +import 'package:userfront/core/i18n/locale_utils.dart'; +import 'package:userfront/core/services/auth_token_store.dart'; + +class _AuthRefreshNotifier extends ChangeNotifier { + void refresh() => notifyListeners(); +} + +Widget _buildRaceTestApp(_AuthRefreshNotifier notifier) { + final router = GoRouter( + initialLocation: '/ko/signin', + refreshListenable: notifier, + routes: [ + GoRoute( + path: '/:locale', + builder: (context, state) => const Scaffold(body: Text('locale-root')), + routes: [ + GoRoute( + path: 'dashboard', + builder: (context, state) => const Scaffold(body: Text('home')), + ), + GoRoute( + path: 'signin', + builder: (context, state) { + return Scaffold( + body: Center( + child: FilledButton( + onPressed: () { + AuthTokenStore.setToken('race-token', provider: 'ory'); + notifier.refresh(); + context.go('/ko/dashboard'); + }, + child: const Text('login'), + ), + ), + ); + }, + ), + ], + ), + ], + redirect: (context, state) { + final requestedLocale = extractLocaleFromPath(state.uri); + if (requestedLocale == null) { + return buildLocalizedPath(resolvePreferredLocaleCode(), state.uri); + } + + final token = AuthTokenStore.getToken(); + final isLoggedIn = + (token != null && token.isNotEmpty) || AuthTokenStore.usesCookie(); + final path = stripLocalePath(state.uri); + if (path == '/signin') { + return null; + } + if (!isLoggedIn) { + return buildSigninRedirectPath(requestedLocale, state.uri); + } + if (path == '/') { + return '/$requestedLocale/dashboard'; + } + return null; + }, + ); + + return MaterialApp.router(routerConfig: router); +} + +void main() { + setUp(() { + LocaleRegistry.setSupportedLocaleCodesForTest(['en', 'ko']); + AuthTokenStore.clear(); + }); + + tearDown(() { + AuthTokenStore.clear(); + LocaleRegistry.resetForTest(); + }); + + testWidgets('로그인 성공 이벤트(notify + go) 동시 호출 시 홈으로 안정적으로 이동', (tester) async { + final notifier = _AuthRefreshNotifier(); + await tester.pumpWidget(_buildRaceTestApp(notifier)); + await tester.pumpAndSettle(); + expect(find.text('login'), findsOneWidget); + + await tester.tap(find.text('login')); + await tester.pumpAndSettle(); + + expect(find.text('home'), findsOneWidget); + expect(tester.takeException(), isNull); + }); +} diff --git a/userfront/test/null_check_recovery_test.dart b/userfront/test/null_check_recovery_test.dart new file mode 100644 index 00000000..9b7dffed --- /dev/null +++ b/userfront/test/null_check_recovery_test.dart @@ -0,0 +1,63 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:userfront/core/i18n/locale_registry.dart'; +import 'package:userfront/core/services/null_check_recovery.dart'; + +void main() { + setUp(() { + LocaleRegistry.setSupportedLocaleCodesForTest(['en', 'ko']); + }); + + tearDown(() { + LocaleRegistry.resetForTest(); + }); + + test('Null check 오류 + 루트(/)면 선호 로케일 signin으로 복구', () { + final target = computeNullCheckRecoveryTarget( + exception: Exception('Null check operator used on a null value'), + uri: Uri.parse('https://sss.hmac.kr/'), + preferredLocaleCode: 'ko', + ); + + expect(target, '/ko/signin'); + }); + + test('Null check 오류 + /ko면 /ko/signin으로 복구', () { + final target = computeNullCheckRecoveryTarget( + exception: Exception('Null check operator used on a null value'), + uri: Uri.parse('https://sss.hmac.kr/ko'), + preferredLocaleCode: 'en', + ); + + expect(target, '/ko/signin'); + }); + + test('이미 /ko/signin이면 복구 이동하지 않음', () { + final target = computeNullCheckRecoveryTarget( + exception: Exception('Null check operator used on a null value'), + uri: Uri.parse('https://sss.hmac.kr/ko/signin'), + preferredLocaleCode: 'ko', + ); + + expect(target, isNull); + }); + + test('Null check 오류여도 /ko/profile에서는 복구 이동하지 않음', () { + final target = computeNullCheckRecoveryTarget( + exception: Exception('Null check operator used on a null value'), + uri: Uri.parse('https://sss.hmac.kr/ko/profile'), + preferredLocaleCode: 'ko', + ); + + expect(target, isNull); + }); + + test('다른 오류 메시지면 복구 이동하지 않음', () { + final target = computeNullCheckRecoveryTarget( + exception: Exception('Some other error'), + uri: Uri.parse('https://sss.hmac.kr/ko'), + preferredLocaleCode: 'ko', + ); + + expect(target, isNull); + }); +} diff --git a/userfront/test/router_redirect_widget_test.dart b/userfront/test/router_redirect_widget_test.dart index a11580f8..87c0f8e3 100644 --- a/userfront/test/router_redirect_widget_test.dart +++ b/userfront/test/router_redirect_widget_test.dart @@ -11,8 +11,28 @@ Widget _buildTestApp(String initialLocation) { routes: [ GoRoute( path: '/:locale', - builder: (context, state) => const Scaffold(body: Text('root')), + redirect: (context, state) { + if (state.uri.pathSegments.length != 1) { + return null; + } + final localeCode = normalizeLocaleCode( + state.pathParameters['locale'], + ); + final token = AuthTokenStore.getToken(); + final isLoggedIn = + (token != null && token.isNotEmpty) || + AuthTokenStore.usesCookie(); + if (!isLoggedIn) { + return buildSigninRedirectPath(localeCode, state.uri); + } + return '/$localeCode/dashboard'; + }, routes: [ + GoRoute( + path: 'dashboard', + builder: (context, state) => + const Scaffold(body: Text('dashboard-page')), + ), GoRoute( path: 'signin', builder: (context, state) { @@ -57,8 +77,9 @@ Widget _buildTestApp(String initialLocation) { return buildLocalizedPath(resolvePreferredLocaleCode(), state.uri); } + final token = AuthTokenStore.getToken(); final isLoggedIn = - AuthTokenStore.getToken() != null || AuthTokenStore.usesCookie(); + (token != null && token.isNotEmpty) || AuthTokenStore.usesCookie(); final path = stripLocalePath(state.uri); final isPublicPath = path == '/signin' || path == '/login'; if (isPublicPath) { @@ -85,6 +106,25 @@ void main() { LocaleRegistry.resetForTest(); }); + testWidgets( + '루트 경로: /{locale} 로 접근 시 /{locale}/signin 으로 리다이렉트되어야 한다 (버그: 화면 렌더링 안됨)', + (tester) async { + await tester.pumpWidget(_buildTestApp('/ko')); + await tester.pumpAndSettle(); + + expect(find.textContaining('signin|'), findsOneWidget); + }, + ); + + testWidgets('로그인 상태에서 /{locale} 접근 시 dashboard로 이동', (tester) async { + AuthTokenStore.setToken('root-token', provider: 'ory'); + await tester.pumpWidget(_buildTestApp('/ko')); + await tester.pumpAndSettle(); + + expect(find.text('dashboard-page'), findsOneWidget); + expect(find.textContaining('signin|'), findsNothing); + }); + testWidgets('/login: login_challenge와 redirect_uri를 전달', (tester) async { final encodedRedirectUri = Uri.encodeComponent( 'https://rp.example.com/callback?x=1', @@ -153,6 +193,15 @@ void main() { expect(find.textContaining('signin|'), findsNothing); }); + testWidgets('빈 토큰은 로그인으로 간주하지 않고 signin으로 리다이렉트', (tester) async { + AuthTokenStore.setToken('', provider: 'ory'); + await tester.pumpWidget(_buildTestApp('/ko/profile')); + await tester.pumpAndSettle(); + + expect(find.textContaining('signin|'), findsOneWidget); + expect(find.text('profile-page'), findsNothing); + }); + testWidgets('로그인 후 같은 브라우저 새 창/팝업에서도 세션이 유지된다', (tester) async { await tester.pumpWidget(_buildTestApp('/en/signin')); await tester.pumpAndSettle(); From bb3231effeda7cf92b085583eec9444ccbb6b6a4 Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Mon, 23 Feb 2026 22:11:27 +0900 Subject: [PATCH 24/29] =?UTF-8?q?lint=20=EC=8B=A4=ED=8C=A8=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/handler/auth_handler.go | 11 ++--- .../handler/auth_handler_login_test.go | 41 +++++++++++++++++++ locales/en.toml | 1 + locales/ko.toml | 1 + locales/template.toml | 1 + userfront/assets/translations/en.toml | 2 +- userfront/assets/translations/ko.toml | 2 +- userfront/assets/translations/template.toml | 1 + 8 files changed, 53 insertions(+), 7 deletions(-) diff --git a/backend/internal/handler/auth_handler.go b/backend/internal/handler/auth_handler.go index ec73b256..11b5ee11 100644 --- a/backend/internal/handler/auth_handler.go +++ b/backend/internal/handler/auth_handler.go @@ -4,6 +4,7 @@ import ( "baron-sso-backend/internal/domain" "baron-sso-backend/internal/logger" "baron-sso-backend/internal/repository" + "baron-sso-backend/internal/response" "baron-sso-backend/internal/service" "baron-sso-backend/internal/utils" "bytes" @@ -1560,7 +1561,7 @@ func (h *AuthHandler) PasswordLogin(c *fiber.Ctx) error { ale.LatencyMs = time.Since(startTime) ale.ProviderError = err.Error() ale.Log(slog.LevelError, "Body parse error") - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request body"}) + return response.Error(c, fiber.StatusBadRequest, "bad_request", "Invalid request body") } loginID := strings.TrimSpace(req.LoginID) @@ -1574,22 +1575,22 @@ func (h *AuthHandler) PasswordLogin(c *fiber.Ctx) error { ale.LatencyMs = time.Since(startTime) ale.ProviderError = "IDP Provider is nil" ale.Log(slog.LevelError, "IDP Provider is nil") - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Authentication service not configured"}) + return response.Error(c, fiber.StatusInternalServerError, "service_unavailable", "Authentication service not configured") } authInfo, err := h.IdpProvider.SignIn(loginID, req.Password) if err != nil { if errors.Is(err, domain.ErrNotSupported) { - return c.Status(fiber.StatusNotImplemented).JSON(fiber.Map{"error": "Login method not supported"}) + return response.Error(c, fiber.StatusNotImplemented, "not_supported", "Login method not supported") } ale.Status = fiber.StatusUnauthorized ale.LatencyMs = time.Since(startTime) ale.ProviderError = err.Error() ale.Log(slog.LevelWarn, "IDP sign-in failed", slog.String("provider", h.IdpProvider.Name())) if strings.Contains(err.Error(), "not found") || strings.Contains(err.Error(), "identity") { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not registered"}) + return response.Error(c, fiber.StatusNotFound, "not_found", "User not registered") } - return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "Invalid credentials"}) + return response.Error(c, fiber.StatusUnauthorized, "password_or_email_mismatch", "Invalid credentials") } subject, resolveErr := h.resolveKratosIdentityIDFromLoginID(c.Context(), loginID) diff --git a/backend/internal/handler/auth_handler_login_test.go b/backend/internal/handler/auth_handler_login_test.go index 9845e738..3bb6b989 100644 --- a/backend/internal/handler/auth_handler_login_test.go +++ b/backend/internal/handler/auth_handler_login_test.go @@ -299,3 +299,44 @@ func TestPasswordLogin_NoOIDC_Success(t *testing.T) { t.Errorf("expected no redirectTo, got %s", got["redirectTo"]) } } + +func TestPasswordLogin_InvalidCredentials_ReturnsCode(t *testing.T) { + mockIdp := new(MockIdentityProvider) + mockIdp.On("SignIn", "user@example.com", "wrong-password").Return(nil, errors.New("비밀번호가 일치하지 않습니다")) + + h := &AuthHandler{ + IdpProvider: mockIdp, + KratosAdmin: service.NewKratosAdminService(), + Hydra: service.NewHydraAdminService(), + } + + app := newAuthLoginTestApp(h) + + body, _ := json.Marshal(map[string]string{ + "loginId": "user@example.com", + "password": "wrong-password", + }) + req := httptest.NewRequest(http.MethodPost, "/api/v1/auth/login", bytes.NewReader(body)) + req.Header.Set("Content-Type", "application/json") + + resp, err := app.Test(req) + if err != nil { + t.Fatalf("request failed: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusUnauthorized { + t.Fatalf("expected 401, got %d", resp.StatusCode) + } + + var got map[string]any + if err := json.NewDecoder(resp.Body).Decode(&got); err != nil { + t.Fatalf("failed to decode response: %v", err) + } + if got["code"] != "password_or_email_mismatch" { + t.Fatalf("expected code=password_or_email_mismatch, got=%v", got["code"]) + } + if got["error"] != "Invalid credentials" { + t.Fatalf("expected error=Invalid credentials, got=%v", got["error"]) + } +} diff --git a/locales/en.toml b/locales/en.toml index 34f59690..6740edd9 100644 --- a/locales/en.toml +++ b/locales/en.toml @@ -316,6 +316,7 @@ approved_device = "Approved Device" approved_ip = "Approve IP: {{ip}}" audit_empty = "Audit Empty" audit_load_error = "Audit Load Error" +render_error = "Dashboard render error: {{error}}" auth_method = "Auth Method" client_id = "Client ID: {{id}}" client_id_missing = "Client Id Missing" diff --git a/locales/ko.toml b/locales/ko.toml index a26268f5..01417815 100644 --- a/locales/ko.toml +++ b/locales/ko.toml @@ -316,6 +316,7 @@ approved_device = "승인 기기: {{device}}" approved_ip = "승인 IP: {{ip}}" audit_empty = "최근 접속 이력이 없습니다." audit_load_error = "접속이력을 불러오지 못했습니다." +render_error = "대시보드 렌더링 오류: {{error}}" auth_method = "인증수단: {{method}}" client_id = "Client ID: {{id}}" client_id_missing = "Client ID 없음" diff --git a/locales/template.toml b/locales/template.toml index f11f6cbd..39c88db5 100644 --- a/locales/template.toml +++ b/locales/template.toml @@ -316,6 +316,7 @@ approved_device = "" approved_ip = "" audit_empty = "" audit_load_error = "" +render_error = "" auth_method = "" client_id = "" client_id_missing = "" diff --git a/userfront/assets/translations/en.toml b/userfront/assets/translations/en.toml index e33f46ee..5cd91c17 100644 --- a/userfront/assets/translations/en.toml +++ b/userfront/assets/translations/en.toml @@ -38,6 +38,7 @@ approved_device = "Approved Device" approved_ip = "Approve IP: {ip}" audit_empty = "Audit Empty" audit_load_error = "Audit Load Error" +render_error = "Dashboard render error: {error}" auth_method = "Auth Method" client_id = "Client ID: {id}" client_id_missing = "Client Id Missing" @@ -557,4 +558,3 @@ verify = "Verify" [ui.userfront.signup.success] action = "Action" - diff --git a/userfront/assets/translations/ko.toml b/userfront/assets/translations/ko.toml index ee1df42f..20824c45 100644 --- a/userfront/assets/translations/ko.toml +++ b/userfront/assets/translations/ko.toml @@ -38,6 +38,7 @@ approved_device = "승인 기기: {device}" approved_ip = "승인 IP: {ip}" audit_empty = "최근 접속 이력이 없습니다." audit_load_error = "접속이력을 불러오지 못했습니다." +render_error = "대시보드 렌더링 오류: {error}" auth_method = "인증수단: {method}" client_id = "Client ID: {id}" client_id_missing = "Client ID 없음" @@ -557,4 +558,3 @@ verify = "본인인증" [ui.userfront.signup.success] action = "로그인하기" - diff --git a/userfront/assets/translations/template.toml b/userfront/assets/translations/template.toml index 9ee024cb..cb29cf60 100644 --- a/userfront/assets/translations/template.toml +++ b/userfront/assets/translations/template.toml @@ -38,6 +38,7 @@ approved_device = "" approved_ip = "" audit_empty = "" audit_load_error = "" +render_error = "" auth_method = "" client_id = "" client_id_missing = "" From c61e32eec513014f7d704fd9694f7a5aa00a353f Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Mon, 23 Feb 2026 22:20:09 +0900 Subject: [PATCH 25/29] =?UTF-8?q?lint=20=EC=8B=A4=ED=8C=A8=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/logger/audit_logger_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/internal/logger/audit_logger_test.go b/backend/internal/logger/audit_logger_test.go index ab8c7f8a..5f9caac8 100644 --- a/backend/internal/logger/audit_logger_test.go +++ b/backend/internal/logger/audit_logger_test.go @@ -18,14 +18,14 @@ func TestAuditLogEntry_RedactsSensitiveFields(t *testing.T) { defer slog.SetDefault(previous) ale := &AuditLogEntry{ - RequestID: "req-1", - Stage: "login", - Token: "tok-secret", - RefreshToken: "refresh-secret", - SessionJwt: "session-secret", - AccessJwt: "access-secret", - SetCookieName: "sid", - SetCookieValue: "cookie-secret", + RequestID: "req-1", + Stage: "login", + Token: "tok-secret", + RefreshToken: "refresh-secret", + SessionJwt: "session-secret", + AccessJwt: "access-secret", + SetCookieName: "sid", + SetCookieValue: "cookie-secret", ParsedCookieDSRF: "dsrf-secret", LoginIDs: map[string]string{ "loginId": "user@example.com", From fb7e46054e9f3882c2b2de81beeeaf24b9fe5016 Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Mon, 23 Feb 2026 22:33:27 +0900 Subject: [PATCH 26/29] =?UTF-8?q?=EB=B0=94=EB=A1=A0=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 6407 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 3519 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 9565 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 17423 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 25717 bytes userfront/assets/baron.ico | Bin 0 -> 16958 bytes .../Icon-App-1024x1024@1x.png | Bin 10932 -> 241791 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 295 -> 954 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 406 -> 2680 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 450 -> 4983 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 282 -> 1646 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 462 -> 4704 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 704 -> 8497 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 406 -> 2680 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 586 -> 7530 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 862 -> 13709 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 862 -> 13709 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 1674 -> 23842 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 762 -> 7042 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 1226 -> 19101 bytes .../Icon-App-83.5x83.5@2x.png | Bin 1418 -> 21347 bytes userfront/web/favicon.ico | Bin 0 -> 16958 bytes userfront/web/favicon.png | Bin 917 -> 1191 bytes userfront/web/icons/Icon-192.png | Bin 5292 -> 25717 bytes userfront/web/icons/Icon-512.png | Bin 8252 -> 90905 bytes userfront/web/icons/Icon-maskable-192.png | Bin 5594 -> 25717 bytes userfront/web/icons/Icon-maskable-512.png | Bin 20998 -> 90905 bytes userfront/web/index.html | 2 +- 28 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 userfront/assets/baron.ico create mode 100644 userfront/web/favicon.ico diff --git a/userfront/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/userfront/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..6b203725801df1432ef930e4046a2006c2bf7af2 100644 GIT binary patch literal 6407 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 VdsZ7p7yP5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/userfront/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/userfront/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..e2fe34e02f6ce896e555eec55910febf679480c5 100644 GIT binary patch literal 3519 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 ti*pfB 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 diff --git a/userfront/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/userfront/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..3c89645675b431e44c25b7fe56af2ce8211f42df 100644 GIT binary patch literal 17423 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 SF<~eG0000{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/userfront/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/userfront/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..a773574e8b21df6522de2dcdc3989e523254777d 100644 GIT binary patch literal 25717 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 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/userfront/assets/baron.ico b/userfront/assets/baron.ico new file mode 100644 index 0000000000000000000000000000000000000000..e79c6fceee0efc0ca9552d66148cc271ea4246e8 GIT binary patch literal 16958 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�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%0DGO-ak(pf_=HzXG6_6sXzycg+Y3a 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

|`5hCjtX6rxh08~hk_qTzPI_FMX^ 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½@oc{m*@ zq}#se?8#_ttW9};%h6x{ZsG9}2TZ!ca{h>qTj=GT#_B6>QW~TAvX@EhCrPelLzFlFDs08#%B$TsX4EPrKNG+m)~a# zf3y7T>cz7>?C)D$TfFXYr%o6_ELFPHFM&S9wsAkdS zxIF82@ZZ2x=WQ{*`>dAn(p9_7xRw=b|AE&jJb!x*`cic1t8VPDFj5n9kimfmlbd|aoJ=G-C%vShrI z*FX&&4)sO@}{7GPn#y^>hrdip@1o$A7ffc%{!{`uKX zQ~#OlbDr5-+cxhN4DtV5nXTXxr;)4@OfH*b6XX;5Mx!;gLyVm*w{hKd2+bm_p*x~! zoK$ZUWO*EO{RZ~lFKvg$>&(tsIK7jiXI7~~alKnbO(CYg`~!BvlTH<8&YBh*EoLZ} z8&V4Sw&N7vgffW~>a@(+v*4~Qn8`~DYKV0Dg>tALh2fxsE;{H~gPT)<$=<&HlZ0 zvjLO``S(%e(n;g)S%?dHPvVrBIfS44576c%mW==}50_-Yxii*TY!2}~utJ+PcYNdz zf1_#qyhmUvM*u~YcR%;t&!O{rFJ%xnJPHVY9pHdAWSeKoo>F z3Xq{KU;@IcgTn#MGKI_PO27NBdU=4qtfdQePUnlnKdQS;B7yyg&$8$fPyM@)tUDsbR_uU%|%+)R*rq56H)1%}p}^zU#}SbK3qH VZCF^jlK}|040P_?F4uB?^?%rUjIaOz literal 8252 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 diff --git a/userfront/web/icons/Icon-maskable-192.png b/userfront/web/icons/Icon-maskable-192.png index eb9b4d76e525556d5d89141648c724331630325d..b0a62485bd696330eb5d200ccc4fc191673a6dea 100644 GIT binary patch literal 25717 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 literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! diff --git a/userfront/web/icons/Icon-maskable-512.png b/userfront/web/icons/Icon-maskable-512.png index d69c56691fbdb0b7efa65097c7cc1edac12a6d3e..07aba7c27fb3bcae024aed84583379d4bc9c655c 100644 GIT binary patch literal 90905 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

|`5hCjtX6rxh08~hk_qTzPI_FMX^ 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½@oc{m*@ zq}#se?8#_ttW9};%h6x{ZsG9}2TZ!ca{h>qTj=GT#_B6>QW~TAvX@EhCrPelLzFlFDs08#%B$TsX4EPrKNG+m)~a# zf3y7T>cz7>?C)D$TfFXYr%o6_ELFPHFM&S9wsAkdS zxIF82@ZZ2x=WQ{*`>dAn(p9_7xRw=b|AE&jJb!x*`cic1t8VPDFj5n9kimfmlbd|aoJ=G-C%vShrI z*FX&&4)sO@}{7GPn#y^>hrdip@1o$A7ffc%{!{`uKX zQ~#OlbDr5-+cxhN4DtV5nXTXxr;)4@OfH*b6XX;5Mx!;gLyVm*w{hKd2+bm_p*x~! zoK$ZUWO*EO{RZ~lFKvg$>&(tsIK7jiXI7~~alKnbO(CYg`~!BvlTH<8&YBh*EoLZ} z8&V4Sw&N7vgffW~>a@(+v*4~Qn8`~DYKV0Dg>tALh2fxsE;{H~gPT)<$=<&HlZ0 zvjLO``S(%e(n;g)S%?dHPvVrBIfS44576c%mW==}50_-Yxii*TY!2}~utJ+PcYNdz zf1_#qyhmUvM*u~YcR%;t&!O{rFJ%xnJPHVY9pHdAWSeKoo>F z3Xq{KU;@IcgTn#MGKI_PO27NBdU=4qtfdQePUnlnKdQS;B7yyg&$8$fPyM@)tUDsbR_uU%|%+)R*rq56H)1%}p}^zU#}SbK3qH VZCF^jlK}|040P_?F4uB?^?%rUjIaOz literal 20998 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 MPgg&ebxsLQ025IeI{*Lx diff --git a/userfront/web/index.html b/userfront/web/index.html index 76d3dfbc..7bfc57d8 100644 --- a/userfront/web/index.html +++ b/userfront/web/index.html @@ -27,7 +27,7 @@ - + Baron 로그인 From 5da74dac3aac3abe4b528ab5d3ba5e8f6d3a37c0 Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Tue, 24 Feb 2026 10:32:06 +0900 Subject: [PATCH 27/29] =?UTF-8?q?=EB=A7=81=ED=81=AC=EB=A1=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/test-plan.md | 2 + .../userfront-wasm-e2e-expansion-plan.md | 69 +++++ docs/test-plan/web-e2e-test-inventory.md | 1 + .../auth/domain/login_link_route_policy.dart | 34 ++ .../auth/presentation/login_screen.dart | 8 +- .../qr_camera_bootstrap_policy.dart | 54 ++++ .../auth/presentation/qr_scan_route.dart | 17 + .../auth/presentation/qr_scan_screen.dart | 32 +- .../presentation/qr_scan_screen_stub.dart | 86 +++++ .../auth/presentation/qr_scan_screen_web.dart | 293 ++++++++++++++++++ userfront/lib/main.dart | 21 +- .../test/login_link_route_policy_test.dart | 33 ++ .../test/qr_camera_bootstrap_policy_test.dart | 67 ++++ userfront/test/qr_scan_route_test.dart | 27 ++ userfront/test/qr_scan_screen_test.dart | 16 + 15 files changed, 707 insertions(+), 53 deletions(-) create mode 100644 docs/test-plan/userfront-wasm-e2e-expansion-plan.md create mode 100644 userfront/lib/features/auth/domain/login_link_route_policy.dart create mode 100644 userfront/lib/features/auth/presentation/qr_camera_bootstrap_policy.dart create mode 100644 userfront/lib/features/auth/presentation/qr_scan_route.dart create mode 100644 userfront/lib/features/auth/presentation/qr_scan_screen_stub.dart create mode 100644 userfront/lib/features/auth/presentation/qr_scan_screen_web.dart create mode 100644 userfront/test/login_link_route_policy_test.dart create mode 100644 userfront/test/qr_camera_bootstrap_policy_test.dart create mode 100644 userfront/test/qr_scan_route_test.dart create mode 100644 userfront/test/qr_scan_screen_test.dart diff --git a/docs/test-plan.md b/docs/test-plan.md index 6b1599a9..5c6ab8f9 100644 --- a/docs/test-plan.md +++ b/docs/test-plan.md @@ -28,6 +28,7 @@ - Backend 테스트 전수 목록: `docs/test-plan/backend-test-inventory.md` - UserFront 테스트 전수 목록: `docs/test-plan/userfront-test-inventory.md` - AdminFront/DevFront E2E 전수 목록: `docs/test-plan/web-e2e-test-inventory.md` +- UserFront WASM Playwright E2E 확장 계획: `docs/test-plan/userfront-wasm-e2e-expansion-plan.md` ## 4) 실행 커맨드 - Backend 전체 테스트: `cd backend && go test ./...` @@ -35,6 +36,7 @@ - UserFront 테스트: `cd userfront && flutter test` - AdminFront E2E: `cd adminfront && npm test` - DevFront E2E: `cd devfront && npm test` +- UserFront WASM E2E(계획): `docs/test-plan/userfront-wasm-e2e-expansion-plan.md` 기준으로 Playwright 워크스페이스를 추가한 뒤 실행 ## 5) 유지 원칙 - 신규 기능은 관련 테스트를 반드시 추가합니다. diff --git a/docs/test-plan/userfront-wasm-e2e-expansion-plan.md b/docs/test-plan/userfront-wasm-e2e-expansion-plan.md new file mode 100644 index 00000000..26c8d90a --- /dev/null +++ b/docs/test-plan/userfront-wasm-e2e-expansion-plan.md @@ -0,0 +1,69 @@ +# UserFront WASM Playwright E2E 확장 계획 + +- 작성일: 2026-02-23 +- 대상: `userfront` (Flutter Web WASM 산출물) +- 목적: 로그인/리다이렉트/QR 흐름의 브라우저 실동작 회귀를 CI에서 자동 검증 + +## 1) 전제 +- `flutter build web --wasm --release` 산출물(`userfront/build/web`)을 정적 서버로 서빙합니다. +- Playwright는 해당 URL로 접속해 E2E를 수행합니다. +- 카메라/QR은 실장비 의존도를 제거하기 위해 브라우저 API mock 기반 케이스를 기본으로 구성합니다. + +## 2) 확장 범위 (우선순위) +1. Locale 진입/리다이렉트 +- `/` 진입 시 `/{locale}`로 이동 +- 비로그인 상태 `/{locale}` 진입 시 `/{locale}/signin` 이동 +- 로그인 상태 `/{locale}` 진입 시 `/{locale}/dashboard` 이동 + +2. 로그인 성공/실패 및 새로고침 회귀 +- 정상 로그인 후 `/{locale}/dashboard` 진입 +- 대시보드 진입 후 새로고침 시 `signin`으로 튕기지 않음 +- 비밀번호 오류 시 코드 기반 에러 표시 동작 확인 + +3. 비밀번호 재설정 플로우 +- reset 링크 진입 후 비밀번호 변경 +- 변경된 비밀번호로 즉시 로그인 가능 + +4. QR 로그인 (웹 로그인 페이지) +- QR init/poll 기본 플로우 +- 만료/재발급 동작 + +5. QR 스캔/승인 (WASM) +- `/scan`에서 스캔 결과가 `/{locale}/approve?ref=...`로 전달됨 +- BarcodeDetector 미지원/카메라 실패 시 수동 입력 fallback 동작 +- approve 성공 시 dashboard 이동 + +6. 널체크 회복 경로 회귀 +- `/ko` 경로에서 null-check 예외 발생 시 recovery target(`/{locale}/signin`) 이동 보장 + +## 3) 구현 단계 +### Phase 0. E2E 실행 기반 +- `userfront-e2e/` (Playwright) 추가 +- `BASE_URL`/`LOCALE`/`MOCK_AUTH` 환경변수 표준화 +- CI job: WASM build 산출물 서빙 + Playwright 실행 + +### Phase 1. 인증/리다이렉트 핵심 회귀 +- 범위 1~2 구현 +- 실패 재현 케이스를 먼저 작성(Failing test first) + +### Phase 2. 비밀번호 재설정 회귀 +- 범위 3 구현 +- 성공/실패 케이스 분리 + +### Phase 3. QR 흐름 회귀 +- 범위 4~5 구현 +- BarcodeDetector/getUserMedia mock fixture 도입 + +### Phase 4. 에러/회복 회귀 +- 범위 6 구현 +- null-check 복구 라우팅 검증 + +## 4) 완료 기준 +- 핵심 인증 플로우(로그인/새로고침/리다이렉트/QR)가 Playwright 회귀군으로 자동화됩니다. +- 프로덕션 이슈 재발 건은 재현 테스트가 먼저 추가됩니다. +- PR에서 E2E 결과 링크(성공/실패 로그) 확인이 가능합니다. + +## 5) 운영 원칙 +- 버그는 반드시 재현 테스트를 먼저 추가합니다. +- 재현 테스트가 실패하는 상태를 확인한 뒤 수정합니다. +- 수정 후 동일 테스트를 반복 실행해 안정 통과까지 완료합니다. diff --git a/docs/test-plan/web-e2e-test-inventory.md b/docs/test-plan/web-e2e-test-inventory.md index 7e771a51..4bf80423 100644 --- a/docs/test-plan/web-e2e-test-inventory.md +++ b/docs/test-plan/web-e2e-test-inventory.md @@ -2,6 +2,7 @@ - 범위: `adminfront/tests/*.spec.ts`, `devfront/tests/*.spec.ts` - 기준: Playwright `test(...)` 케이스 전수 +- 참고: UserFront WASM E2E 확장 계획은 `docs/test-plan/userfront-wasm-e2e-expansion-plan.md`에서 별도 관리 | 파일 | 테스트 | 역할 | |---|---|---| diff --git a/userfront/lib/features/auth/domain/login_link_route_policy.dart b/userfront/lib/features/auth/domain/login_link_route_policy.dart new file mode 100644 index 00000000..0a3b1a5f --- /dev/null +++ b/userfront/lib/features/auth/domain/login_link_route_policy.dart @@ -0,0 +1,34 @@ +import '../../../core/i18n/locale_utils.dart'; + +bool isPublicAuthPath(String path, Uri uri) { + return path == '/signin' || + path == '/signup' || + path == '/login' || + path == '/registration' || + path == '/verify' || + path == '/verification' || + path.startsWith('/verify/') || + path.startsWith('/l/') || + path == '/approve' || + path.startsWith('/ql/') || + path == '/forgot-password' || + path == '/recovery' || + path == '/reset-password' || + path == '/error' || + path == '/settings' || + path == '/consent' || + path.startsWith('/consent/') || + uri.path.contains('/consent'); +} + +String? extractLoginShortCode(Uri uri) { + final normalizedPath = stripLocalePath(uri); + final segments = normalizedPath + .split('/') + .where((segment) => segment.isNotEmpty) + .toList(); + if (segments.length < 2 || segments.first != 'l') { + return null; + } + return segments[1]; +} diff --git a/userfront/lib/features/auth/presentation/login_screen.dart b/userfront/lib/features/auth/presentation/login_screen.dart index 47539b75..59cd813b 100644 --- a/userfront/lib/features/auth/presentation/login_screen.dart +++ b/userfront/lib/features/auth/presentation/login_screen.dart @@ -14,6 +14,7 @@ import '../../../core/services/oidc_redirect_guard.dart'; import '../../../core/notifiers/auth_notifier.dart'; import '../domain/login_challenge_resolver.dart'; import '../domain/cookie_session_policy.dart'; +import '../domain/login_link_route_policy.dart'; import '../../profile/domain/notifiers/profile_notifier.dart'; import '../../../core/services/web_window.dart'; @@ -111,8 +112,8 @@ class _LoginScreenState extends ConsumerState final loginIdParam = uri.queryParameters['loginId']; final codeParam = uri.queryParameters['code']; final pendingRefParam = uri.queryParameters['pendingRef']; - final hasShortCodePath = - uri.pathSegments.length >= 2 && uri.pathSegments.first == 'l'; + final shortCodeFromPath = extractLoginShortCode(uri); + final hasShortCodePath = shortCodeFromPath != null; final hasTokenParam = uri.queryParameters.containsKey('t'); final hasVerificationToken = widget.verificationToken != null || hasTokenParam; @@ -122,8 +123,7 @@ class _LoginScreenState extends ConsumerState final notice = uri.queryParameters['notice']; if (hasShortCodePath) { - final shortCode = uri.pathSegments[1]; - _verifyShortCode(shortCode); + _verifyShortCode(shortCodeFromPath); } if (hasLoginCode) { _verifyLoginCode(loginIdParam, codeParam, pendingRef: pendingRefParam); diff --git a/userfront/lib/features/auth/presentation/qr_camera_bootstrap_policy.dart b/userfront/lib/features/auth/presentation/qr_camera_bootstrap_policy.dart new file mode 100644 index 00000000..657bf1ca --- /dev/null +++ b/userfront/lib/features/auth/presentation/qr_camera_bootstrap_policy.dart @@ -0,0 +1,54 @@ +enum QrCameraBootstrapStatus { + ready, + detectorUnsupported, + permissionError, + cameraError, +} + +class QrCameraBootstrapResult { + const QrCameraBootstrapResult(this.status, {this.errorDetail = ''}); + + final QrCameraBootstrapStatus status; + final String errorDetail; + + bool get isReady => status == QrCameraBootstrapStatus.ready; +} + +typedef QrOpenCameraAndPlay = Future Function(); +typedef QrStopCamera = Future Function(); + +bool isQrPermissionError(Object error) { + final raw = error.toString(); + return raw.contains('NotAllowedError') || + raw.contains('PermissionDeniedError') || + raw.contains('SecurityError'); +} + +Future bootstrapQrCamera({ + required bool hasBarcodeDetector, + required QrOpenCameraAndPlay openCameraAndPlay, + required QrStopCamera stopCamera, +}) async { + try { + await openCameraAndPlay(); + if (!hasBarcodeDetector) { + await stopCamera(); + return const QrCameraBootstrapResult( + QrCameraBootstrapStatus.detectorUnsupported, + errorDetail: 'BarcodeDetector is not supported in this browser.', + ); + } + return const QrCameraBootstrapResult(QrCameraBootstrapStatus.ready); + } catch (e) { + if (isQrPermissionError(e)) { + return QrCameraBootstrapResult( + QrCameraBootstrapStatus.permissionError, + errorDetail: e.toString(), + ); + } + return QrCameraBootstrapResult( + QrCameraBootstrapStatus.cameraError, + errorDetail: e.toString(), + ); + } +} diff --git a/userfront/lib/features/auth/presentation/qr_scan_route.dart b/userfront/lib/features/auth/presentation/qr_scan_route.dart new file mode 100644 index 00000000..b69c7905 --- /dev/null +++ b/userfront/lib/features/auth/presentation/qr_scan_route.dart @@ -0,0 +1,17 @@ +import '../../../../core/i18n/locale_utils.dart'; + +String buildQrApprovePath( + String scannedValue, { + String? localeCode, + Uri? currentUri, +}) { + final value = scannedValue.trim(); + final explicitLocale = localeCode?.trim(); + final uri = currentUri ?? Uri.base; + final resolvedLocale = explicitLocale != null && explicitLocale.isNotEmpty + ? explicitLocale.toLowerCase().replaceAll('_', '-') + : normalizeLocaleCode( + extractLocaleFromPath(uri) ?? resolvePreferredLocaleCode(), + ); + return '/$resolvedLocale/approve?ref=${Uri.encodeQueryComponent(value)}'; +} diff --git a/userfront/lib/features/auth/presentation/qr_scan_screen.dart b/userfront/lib/features/auth/presentation/qr_scan_screen.dart index a13cf54f..fcb18617 100644 --- a/userfront/lib/features/auth/presentation/qr_scan_screen.dart +++ b/userfront/lib/features/auth/presentation/qr_scan_screen.dart @@ -1,30 +1,2 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:userfront/i18n.dart'; - -class QRScanScreen extends StatefulWidget { - const QRScanScreen({super.key}); - - @override - State createState() => _QRScanScreenState(); -} - -class _QRScanScreenState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(tr('ui.userfront.qr.title', fallback: 'Scan QR Code')), - leading: IconButton( - icon: const Icon(Icons.arrow_back), - onPressed: () => context.pop(), - ), - ), - body: const Center( - child: Text( - 'QR Scanner is temporarily disabled for WASM build stability.', - ), - ), - ); - } -} +export 'qr_scan_screen_stub.dart' + if (dart.library.js_interop) 'qr_scan_screen_web.dart'; diff --git a/userfront/lib/features/auth/presentation/qr_scan_screen_stub.dart b/userfront/lib/features/auth/presentation/qr_scan_screen_stub.dart new file mode 100644 index 00000000..7f6b77d2 --- /dev/null +++ b/userfront/lib/features/auth/presentation/qr_scan_screen_stub.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:userfront/i18n.dart'; + +import 'qr_scan_route.dart'; + +class QRScanScreen extends StatefulWidget { + const QRScanScreen({super.key}); + + @override + State createState() => _QRScanScreenState(); +} + +class _QRScanScreenState extends State { + final TextEditingController _controller = TextEditingController(); + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + void _submit() { + final raw = _controller.text.trim(); + if (raw.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + tr( + 'msg.userfront.qr.permission_required', + fallback: '카메라 권한이 필요합니다.', + ), + ), + ), + ); + return; + } + context.go(buildQrApprovePath(raw)); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(tr('ui.userfront.qr.title', fallback: 'Scan QR Code')), + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () => context.pop(), + ), + ), + body: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + tr( + 'msg.userfront.qr.permission_error', + fallback: '카메라 권한 요청에 실패했습니다. 브라우저/OS 설정을 확인해주세요.', + ), + ), + const SizedBox(height: 12), + TextField( + key: const ValueKey('qr_scan_manual_input'), + controller: _controller, + decoration: const InputDecoration( + labelText: 'QR Payload', + hintText: 'https://.../ql/{ref} 또는 ref', + ), + onSubmitted: (_) => _submit(), + ), + const SizedBox(height: 12), + FilledButton.icon( + key: const ValueKey('qr_scan_submit_button'), + onPressed: _submit, + icon: const Icon(Icons.check_circle), + label: Text( + tr('ui.userfront.qr.result_success', fallback: '승인 화면으로 이동'), + ), + ), + ], + ), + ), + ); + } +} diff --git a/userfront/lib/features/auth/presentation/qr_scan_screen_web.dart b/userfront/lib/features/auth/presentation/qr_scan_screen_web.dart new file mode 100644 index 00000000..40d3f962 --- /dev/null +++ b/userfront/lib/features/auth/presentation/qr_scan_screen_web.dart @@ -0,0 +1,293 @@ +import 'dart:async'; +import 'dart:js_interop'; +import 'dart:js_interop_unsafe'; +import 'dart:ui_web' as ui_web; + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:userfront/i18n.dart'; +import 'package:web/web.dart' as web; + +import 'qr_camera_bootstrap_policy.dart'; +import 'qr_scan_route.dart'; + +@JS('BarcodeDetector') +extension type _BarcodeDetector._(JSObject _) implements JSObject { + external factory _BarcodeDetector(); + external JSPromise> detect(JSObject source); +} + +extension type _DetectedBarcode._(JSObject _) implements JSObject { + external String? get rawValue; +} + +class QRScanScreen extends StatefulWidget { + const QRScanScreen({super.key}); + + @override + State createState() => _QRScanScreenState(); +} + +class _QRScanScreenState extends State { + late final web.HTMLVideoElement _videoElement; + late final String _viewType; + final TextEditingController _manualController = TextEditingController(); + + web.MediaStream? _stream; + _BarcodeDetector? _detector; + Timer? _scanTimer; + bool _scanInFlight = false; + bool _navigated = false; + bool _initializing = true; + String? _error; + String? _status; + + @override + void initState() { + super.initState(); + _viewType = 'qr-camera-${DateTime.now().microsecondsSinceEpoch}'; + _videoElement = web.HTMLVideoElement() + ..autoplay = true + ..muted = true + ..playsInline = true + ..style.border = '0' + ..style.width = '100%' + ..style.height = '100%' + ..style.objectFit = 'cover'; + + ui_web.platformViewRegistry.registerViewFactory(_viewType, (int viewId) { + return _videoElement; + }); + + unawaited(_initializeScanner()); + } + + @override + void dispose() { + _scanTimer?.cancel(); + _stopCamera(); + _manualController.dispose(); + super.dispose(); + } + + Future _initializeScanner() async { + setState(() { + _initializing = true; + _error = null; + _status = tr('ui.userfront.qr.title', fallback: 'Scan QR Code'); + }); + final hasBarcodeDetector = globalContext + .hasProperty('BarcodeDetector'.toJS) + .toDart; + + final result = await bootstrapQrCamera( + hasBarcodeDetector: hasBarcodeDetector, + openCameraAndPlay: () async { + final constraints = web.MediaStreamConstraints( + video: web.MediaTrackConstraints(facingMode: 'environment'.toJS), + audio: false.toJS, + ); + _stream = await web.window.navigator.mediaDevices + .getUserMedia(constraints) + .toDart; + _videoElement.srcObject = _stream; + await _videoElement.play().toDart; + }, + stopCamera: () async { + _stopCamera(); + }, + ); + + if (!mounted) { + return; + } + + switch (result.status) { + case QrCameraBootstrapStatus.ready: + _detector = _BarcodeDetector(); + setState(() { + _initializing = false; + _status = tr( + 'msg.userfront.login.qr.scan_hint', + fallback: 'QR 코드를 카메라 중앙에 맞춰주세요.', + ); + }); + _startScanLoop(); + break; + case QrCameraBootstrapStatus.detectorUnsupported: + setState(() { + _initializing = false; + _status = tr( + 'msg.userfront.login.qr.scan_hint', + fallback: 'QR 코드를 카메라 중앙에 맞춰주세요.', + ); + _error = tr( + 'msg.userfront.qr.camera_error', + fallback: 'Camera error: {{error}}', + params: {'error': result.errorDetail}, + ); + }); + break; + case QrCameraBootstrapStatus.permissionError: + setState(() { + _initializing = false; + _error = tr( + 'msg.userfront.qr.permission_error', + fallback: 'Permission request failed. Check browser/OS settings.', + ); + }); + break; + case QrCameraBootstrapStatus.cameraError: + setState(() { + _initializing = false; + _error = tr( + 'msg.userfront.qr.camera_error', + fallback: 'Camera error: {{error}}', + params: {'error': result.errorDetail}, + ); + }); + break; + } + } + + void _startScanLoop() { + _scanTimer?.cancel(); + _scanTimer = Timer.periodic(const Duration(milliseconds: 250), (_) async { + if (!mounted || _scanInFlight || _navigated) { + return; + } + final detector = _detector; + if (detector == null) { + return; + } + if (_videoElement.readyState < web.HTMLMediaElement.HAVE_CURRENT_DATA) { + return; + } + + _scanInFlight = true; + try { + final detected = await detector.detect(_videoElement).toDart; + final items = detected.toDart; + for (final item in items) { + final raw = item.rawValue?.trim(); + if (raw != null && raw.isNotEmpty) { + _handleScanSuccess(raw); + break; + } + } + } catch (_) { + } finally { + _scanInFlight = false; + } + }); + } + + void _stopCamera() { + final stream = _stream; + if (stream == null) { + return; + } + final tracks = stream.getTracks().toDart; + for (final track in tracks) { + track.stop(); + } + _videoElement.srcObject = null; + _stream = null; + } + + void _handleScanSuccess(String payload) { + if (_navigated || !mounted) { + return; + } + _navigated = true; + _scanTimer?.cancel(); + _stopCamera(); + context.go(buildQrApprovePath(payload)); + } + + void _submitManual() { + final payload = _manualController.text.trim(); + if (payload.isEmpty) { + return; + } + _handleScanSuccess(payload); + } + + Future _retry() async { + _scanTimer?.cancel(); + _stopCamera(); + _detector = null; + await _initializeScanner(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(tr('ui.userfront.qr.title', fallback: 'Scan QR Code')), + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () => context.pop(), + ), + ), + body: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + AspectRatio( + aspectRatio: 3 / 4, + child: DecoratedBox( + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(12), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: _initializing + ? const Center(child: CircularProgressIndicator()) + : HtmlElementView(viewType: _viewType), + ), + ), + ), + const SizedBox(height: 12), + if (_status != null) Text(_status!, textAlign: TextAlign.center), + if (_error != null) ...[ + const SizedBox(height: 8), + Text( + _error!, + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.red), + ), + ], + const SizedBox(height: 12), + FilledButton.icon( + onPressed: _initializing ? null : _retry, + icon: const Icon(Icons.refresh), + label: Text(tr('ui.userfront.qr.rescan', fallback: '다시 스캔')), + ), + const SizedBox(height: 12), + TextField( + key: const ValueKey('qr_scan_manual_input'), + controller: _manualController, + decoration: const InputDecoration( + labelText: 'QR Payload', + hintText: 'https://.../ql/{ref} 또는 ref', + ), + onSubmitted: (_) => _submitManual(), + ), + const SizedBox(height: 8), + FilledButton.icon( + key: const ValueKey('qr_scan_submit_button'), + onPressed: _submitManual, + icon: const Icon(Icons.check_circle), + label: Text( + tr('ui.userfront.qr.result_success', fallback: '승인 화면으로 이동'), + ), + ), + ], + ), + ), + ); + } +} diff --git a/userfront/lib/main.dart b/userfront/lib/main.dart index ae2f26d8..89dd0a20 100644 --- a/userfront/lib/main.dart +++ b/userfront/lib/main.dart @@ -14,6 +14,7 @@ import 'features/auth/presentation/qr_scan_screen.dart'; import 'features/auth/presentation/forgot_password_screen.dart'; import 'features/auth/presentation/reset_password_screen.dart'; import 'features/auth/presentation/error_screen.dart'; +import 'features/auth/domain/login_link_route_policy.dart'; import 'features/dashboard/presentation/dashboard_screen.dart'; import 'features/admin/presentation/user_management_screen.dart'; import 'features/profile/presentation/pages/profile_page.dart'; @@ -328,25 +329,7 @@ final _router = GoRouter( (token != null && token.isNotEmpty) || AuthTokenStore.usesCookie(); final path = stripLocalePath(uri); - // Precise public path detection - final isPublicPath = - path == '/signin' || - path == '/signup' || - path == '/login' || - path == '/registration' || - path == '/verify' || - path == '/verification' || - path.startsWith('/verify/') || - path == '/approve' || - path.startsWith('/ql/') || - path == '/forgot-password' || - path == '/recovery' || - path == '/reset-password' || - path == '/error' || - path == '/settings' || - path == '/consent' || - path.startsWith('/consent/') || - uri.path.contains('/consent'); + final isPublicPath = isPublicAuthPath(path, uri); if (isPublicPath) { return null; diff --git a/userfront/test/login_link_route_policy_test.dart b/userfront/test/login_link_route_policy_test.dart new file mode 100644 index 00000000..d81c8aff --- /dev/null +++ b/userfront/test/login_link_route_policy_test.dart @@ -0,0 +1,33 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:userfront/core/i18n/locale_registry.dart'; +import 'package:userfront/features/auth/domain/login_link_route_policy.dart'; + +void main() { + group('login_link_route_policy', () { + setUp(() { + LocaleRegistry.setSupportedLocaleCodesForTest(['ko', 'en']); + }); + + tearDown(() { + LocaleRegistry.resetForTest(); + }); + + test('extracts short code from plain short-code route', () { + final shortCode = extractLoginShortCode(Uri.parse('/l/AB123456')); + expect(shortCode, 'AB123456'); + }); + + test('extracts short code from localized short-code route', () { + final shortCode = extractLoginShortCode(Uri.parse('/ko/l/AB123456')); + expect(shortCode, 'AB123456'); + }); + + test('treats localized short-code route as public path', () { + final isPublic = isPublicAuthPath( + '/l/AB123456', + Uri.parse('/ko/l/AB123456'), + ); + expect(isPublic, isTrue); + }); + }); +} diff --git a/userfront/test/qr_camera_bootstrap_policy_test.dart b/userfront/test/qr_camera_bootstrap_policy_test.dart new file mode 100644 index 00000000..0f265ac6 --- /dev/null +++ b/userfront/test/qr_camera_bootstrap_policy_test.dart @@ -0,0 +1,67 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:userfront/features/auth/presentation/qr_camera_bootstrap_policy.dart'; + +void main() { + group('bootstrapQrCamera', () { + test('권한 허용 후 카메라 실행 성공 시 ready 상태를 반환한다', () async { + var stopCalled = false; + + final result = await bootstrapQrCamera( + hasBarcodeDetector: true, + openCameraAndPlay: () async {}, + stopCamera: () async { + stopCalled = true; + }, + ); + + expect(result.status, QrCameraBootstrapStatus.ready); + expect(stopCalled, isFalse); + }); + + test('권한 허용 후 play 단계 오류는 cameraError로 분류한다', () async { + var stopCalled = false; + + final result = await bootstrapQrCamera( + hasBarcodeDetector: true, + openCameraAndPlay: () async { + throw Exception('NotReadableError: Could not start video source'); + }, + stopCamera: () async { + stopCalled = true; + }, + ); + + expect(result.status, QrCameraBootstrapStatus.cameraError); + expect(result.errorDetail, contains('NotReadableError')); + expect(stopCalled, isFalse); + }); + + test('권한 거부 오류는 permissionError로 분류한다', () async { + final result = await bootstrapQrCamera( + hasBarcodeDetector: true, + openCameraAndPlay: () async { + throw Exception('NotAllowedError: Permission denied'); + }, + stopCamera: () async {}, + ); + + expect(result.status, QrCameraBootstrapStatus.permissionError); + expect(result.errorDetail, contains('NotAllowedError')); + }); + + test('detector 미지원이면 카메라를 정리하고 detectorUnsupported를 반환한다', () async { + var stopCalled = false; + + final result = await bootstrapQrCamera( + hasBarcodeDetector: false, + openCameraAndPlay: () async {}, + stopCamera: () async { + stopCalled = true; + }, + ); + + expect(result.status, QrCameraBootstrapStatus.detectorUnsupported); + expect(stopCalled, isTrue); + }); + }); +} diff --git a/userfront/test/qr_scan_route_test.dart b/userfront/test/qr_scan_route_test.dart new file mode 100644 index 00000000..db0a4e4c --- /dev/null +++ b/userfront/test/qr_scan_route_test.dart @@ -0,0 +1,27 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:userfront/features/auth/presentation/qr_scan_route.dart'; + +void main() { + group('buildQrApprovePath', () { + test('스캔 값을 trim/encode 해서 approve 경로를 만든다', () { + final result = buildQrApprovePath( + ' https://sss.hmac.kr/ql/abc-123?x=1&y=2 ', + localeCode: 'ko', + ); + + expect( + result, + '/ko/approve?ref=https%3A%2F%2Fsss.hmac.kr%2Fql%2Fabc-123%3Fx%3D1%26y%3D2', + ); + }); + + test('현재 URI에서 locale을 추출한다', () { + final result = buildQrApprovePath( + 'abc123', + currentUri: Uri.parse('https://sss.hmac.kr/en/dashboard'), + ); + + expect(result, '/en/approve?ref=abc123'); + }); + }); +} diff --git a/userfront/test/qr_scan_screen_test.dart b/userfront/test/qr_scan_screen_test.dart new file mode 100644 index 00000000..fa3e31f2 --- /dev/null +++ b/userfront/test/qr_scan_screen_test.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:userfront/features/auth/presentation/qr_scan_screen.dart'; + +void main() { + testWidgets('QR 스캔 화면은 비활성 문구 대신 입력/이동 UI를 노출한다', (tester) async { + await tester.pumpWidget(const MaterialApp(home: QRScanScreen())); + + expect( + find.text('QR Scanner is temporarily disabled for WASM build stability.'), + findsNothing, + ); + expect(find.byKey(const ValueKey('qr_scan_manual_input')), findsOneWidget); + expect(find.byKey(const ValueKey('qr_scan_submit_button')), findsOneWidget); + }); +} From cb6edb850abfdade37101871f14db398377545b2 Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Tue, 24 Feb 2026 10:50:17 +0900 Subject: [PATCH 28/29] =?UTF-8?q?iOS=20QR=20js=EA=B8=B0=EB=B0=98=20?= =?UTF-8?q?=EB=B0=94=EC=9D=B4=ED=8C=A8=EC=8A=A4,=20QR=EC=8A=B9=EC=9D=B8=20?= =?UTF-8?q?=ED=81=B4=EB=A6=AD=EC=A0=88=EC=B0=A8=20=EC=83=9D=EB=9E=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/presentation/approve_qr_screen.dart | 66 +++- .../auth/presentation/qr_scan_screen_web.dart | 307 +++++++----------- userfront/pubspec.lock | 8 + userfront/pubspec.yaml | 1 + 4 files changed, 191 insertions(+), 191 deletions(-) diff --git a/userfront/lib/features/auth/presentation/approve_qr_screen.dart b/userfront/lib/features/auth/presentation/approve_qr_screen.dart index 01dca34c..78c97aa2 100644 --- a/userfront/lib/features/auth/presentation/approve_qr_screen.dart +++ b/userfront/lib/features/auth/presentation/approve_qr_screen.dart @@ -18,11 +18,15 @@ class _ApproveQrScreenState extends State { bool _success = false; bool _isCheckingSession = false; bool _redirectingToLogin = false; + bool _autoApproveTriggered = false; @override void initState() { super.initState(); - _bootstrapCookieSession().then((_) => _redirectIfNotLoggedIn()); + _bootstrapCookieSession().then((_) { + _redirectIfNotLoggedIn(); + _maybeAutoApprove(); + }); } Future _bootstrapCookieSession() async { @@ -61,6 +65,31 @@ class _ApproveQrScreenState extends State { } } + void _maybeAutoApprove() { + if (!mounted || _autoApproveTriggered) return; + if (widget.pendingRef == null || widget.pendingRef!.trim().isEmpty) { + if (_message == null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + setState(() { + _message = 'Error: pendingRef is missing.'; + }); + }); + } + return; + } + + final hasStoredToken = AuthTokenStore.getToken()?.isNotEmpty ?? false; + final usesCookie = AuthTokenStore.usesCookie(); + final isLoggedIn = hasStoredToken || usesCookie || _isCheckingSession; + if (!isLoggedIn || _isLoading || _success) { + return; + } + + _autoApproveTriggered = true; + _handleApprove(); + } + Future _handleApprove() async { if (widget.pendingRef == null) return; @@ -115,6 +144,9 @@ class _ApproveQrScreenState extends State { if (!isLoggedIn && !_redirectingToLogin) { _redirectIfNotLoggedIn(); } + if (isLoggedIn && !_success && !_isLoading) { + _maybeAutoApprove(); + } return Scaffold( appBar: AppBar(title: const Text("QR Login Approval")), @@ -151,15 +183,17 @@ class _ApproveQrScreenState extends State { ), ), - if (!_success) - FilledButton.icon( - onPressed: _isLoading || !isLoggedIn ? null : _handleApprove, - icon: const Icon(Icons.check_circle), - label: const Text("Approve Login"), - style: FilledButton.styleFrom( - minimumSize: const Size.fromHeight(60), - backgroundColor: Colors.blue, - ), + if (_isLoading) + const Padding( + padding: EdgeInsets.only(bottom: 16), + child: CircularProgressIndicator(), + ), + + if (!_success && !_isLoading) + Text( + "Approving login request automatically...", + textAlign: TextAlign.center, + style: TextStyle(color: Colors.grey.shade700), ), if (!isLoggedIn && !_success) @@ -172,6 +206,18 @@ class _ApproveQrScreenState extends State { ), ), + if (!_success && !_isLoading && _message != null) + FilledButton.icon( + onPressed: !isLoggedIn + ? null + : () { + _autoApproveTriggered = false; + _handleApprove(); + }, + icon: const Icon(Icons.refresh), + label: const Text("Retry Approval"), + ), + if (_success) FilledButton( onPressed: () => context.go(buildLocalizedHomePath(Uri.base)), diff --git a/userfront/lib/features/auth/presentation/qr_scan_screen_web.dart b/userfront/lib/features/auth/presentation/qr_scan_screen_web.dart index 40d3f962..c3e5291e 100644 --- a/userfront/lib/features/auth/presentation/qr_scan_screen_web.dart +++ b/userfront/lib/features/auth/presentation/qr_scan_screen_web.dart @@ -1,26 +1,12 @@ import 'dart:async'; -import 'dart:js_interop'; -import 'dart:js_interop_unsafe'; -import 'dart:ui_web' as ui_web; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:userfront/i18n.dart'; -import 'package:web/web.dart' as web; -import 'qr_camera_bootstrap_policy.dart'; import 'qr_scan_route.dart'; -@JS('BarcodeDetector') -extension type _BarcodeDetector._(JSObject _) implements JSObject { - external factory _BarcodeDetector(); - external JSPromise> detect(JSObject source); -} - -extension type _DetectedBarcode._(JSObject _) implements JSObject { - external String? get rawValue; -} - class QRScanScreen extends StatefulWidget { const QRScanScreen({super.key}); @@ -29,195 +15,120 @@ class QRScanScreen extends StatefulWidget { } class _QRScanScreenState extends State { - late final web.HTMLVideoElement _videoElement; - late final String _viewType; + final MobileScannerController _scannerController = MobileScannerController( + autoStart: true, + detectionSpeed: DetectionSpeed.noDuplicates, + facing: CameraFacing.back, + formats: const [BarcodeFormat.qrCode], + ); final TextEditingController _manualController = TextEditingController(); - web.MediaStream? _stream; - _BarcodeDetector? _detector; - Timer? _scanTimer; - bool _scanInFlight = false; - bool _navigated = false; - bool _initializing = true; + bool _isProcessing = false; String? _error; String? _status; @override void initState() { super.initState(); - _viewType = 'qr-camera-${DateTime.now().microsecondsSinceEpoch}'; - _videoElement = web.HTMLVideoElement() - ..autoplay = true - ..muted = true - ..playsInline = true - ..style.border = '0' - ..style.width = '100%' - ..style.height = '100%' - ..style.objectFit = 'cover'; - - ui_web.platformViewRegistry.registerViewFactory(_viewType, (int viewId) { - return _videoElement; - }); - - unawaited(_initializeScanner()); + _status = tr( + 'msg.userfront.login.qr.scan_hint', + fallback: 'QR 코드를 카메라 중앙에 맞춰주세요.', + ); } @override void dispose() { - _scanTimer?.cancel(); - _stopCamera(); _manualController.dispose(); + _scannerController.dispose(); super.dispose(); } - Future _initializeScanner() async { - setState(() { - _initializing = true; - _error = null; - _status = tr('ui.userfront.qr.title', fallback: 'Scan QR Code'); - }); - final hasBarcodeDetector = globalContext - .hasProperty('BarcodeDetector'.toJS) - .toDart; + Future _navigateToApprove(String rawPayload) async { + final payload = rawPayload.trim(); + if (payload.isEmpty || _isProcessing || !mounted) { + return; + } - final result = await bootstrapQrCamera( - hasBarcodeDetector: hasBarcodeDetector, - openCameraAndPlay: () async { - final constraints = web.MediaStreamConstraints( - video: web.MediaTrackConstraints(facingMode: 'environment'.toJS), - audio: false.toJS, - ); - _stream = await web.window.navigator.mediaDevices - .getUserMedia(constraints) - .toDart; - _videoElement.srcObject = _stream; - await _videoElement.play().toDart; - }, - stopCamera: () async { - _stopCamera(); - }, - ); + setState(() { + _isProcessing = true; + _error = null; + _status = tr( + 'ui.userfront.qr.result_success', + fallback: '승인 화면으로 이동 중...', + ); + }); + + try { + await _scannerController.stop(); + } catch (_) {} if (!mounted) { return; } - - switch (result.status) { - case QrCameraBootstrapStatus.ready: - _detector = _BarcodeDetector(); - setState(() { - _initializing = false; - _status = tr( - 'msg.userfront.login.qr.scan_hint', - fallback: 'QR 코드를 카메라 중앙에 맞춰주세요.', - ); - }); - _startScanLoop(); - break; - case QrCameraBootstrapStatus.detectorUnsupported: - setState(() { - _initializing = false; - _status = tr( - 'msg.userfront.login.qr.scan_hint', - fallback: 'QR 코드를 카메라 중앙에 맞춰주세요.', - ); - _error = tr( - 'msg.userfront.qr.camera_error', - fallback: 'Camera error: {{error}}', - params: {'error': result.errorDetail}, - ); - }); - break; - case QrCameraBootstrapStatus.permissionError: - setState(() { - _initializing = false; - _error = tr( - 'msg.userfront.qr.permission_error', - fallback: 'Permission request failed. Check browser/OS settings.', - ); - }); - break; - case QrCameraBootstrapStatus.cameraError: - setState(() { - _initializing = false; - _error = tr( - 'msg.userfront.qr.camera_error', - fallback: 'Camera error: {{error}}', - params: {'error': result.errorDetail}, - ); - }); - break; - } - } - - void _startScanLoop() { - _scanTimer?.cancel(); - _scanTimer = Timer.periodic(const Duration(milliseconds: 250), (_) async { - if (!mounted || _scanInFlight || _navigated) { - return; - } - final detector = _detector; - if (detector == null) { - return; - } - if (_videoElement.readyState < web.HTMLMediaElement.HAVE_CURRENT_DATA) { - return; - } - - _scanInFlight = true; - try { - final detected = await detector.detect(_videoElement).toDart; - final items = detected.toDart; - for (final item in items) { - final raw = item.rawValue?.trim(); - if (raw != null && raw.isNotEmpty) { - _handleScanSuccess(raw); - break; - } - } - } catch (_) { - } finally { - _scanInFlight = false; - } - }); - } - - void _stopCamera() { - final stream = _stream; - if (stream == null) { - return; - } - final tracks = stream.getTracks().toDart; - for (final track in tracks) { - track.stop(); - } - _videoElement.srcObject = null; - _stream = null; - } - - void _handleScanSuccess(String payload) { - if (_navigated || !mounted) { - return; - } - _navigated = true; - _scanTimer?.cancel(); - _stopCamera(); context.go(buildQrApprovePath(payload)); } - void _submitManual() { - final payload = _manualController.text.trim(); - if (payload.isEmpty) { - return; + void _onDetect(BarcodeCapture capture) { + for (final barcode in capture.barcodes) { + final raw = barcode.rawValue?.trim(); + if (raw != null && raw.isNotEmpty) { + unawaited(_navigateToApprove(raw)); + return; + } } - _handleScanSuccess(payload); + } + + String _toScannerErrorMessage(MobileScannerException error) { + switch (error.errorCode) { + case MobileScannerErrorCode.permissionDenied: + return tr( + 'msg.userfront.qr.permission_error', + fallback: '카메라 권한 요청에 실패했습니다. 브라우저/OS 설정을 확인해주세요.', + ); + case MobileScannerErrorCode.unsupported: + return tr( + 'msg.userfront.qr.camera_error', + fallback: '카메라 오류: {{error}}', + params: {'error': 'QR scanner is not supported in this browser.'}, + ); + default: + final detail = error.errorDetails?.message; + return tr( + 'msg.userfront.qr.camera_error', + fallback: '카메라 오류: {{error}}', + params: {'error': detail ?? error.errorCode.message}, + ); + } + } + + void _submitManual() { + unawaited(_navigateToApprove(_manualController.text)); } Future _retry() async { - _scanTimer?.cancel(); - _stopCamera(); - _detector = null; - await _initializeScanner(); + setState(() { + _isProcessing = false; + _error = null; + _status = tr( + 'msg.userfront.login.qr.scan_hint', + fallback: 'QR 코드를 카메라 중앙에 맞춰주세요.', + ); + }); + + try { + await _scannerController.start(); + } catch (e) { + if (!mounted) { + return; + } + setState(() { + _error = tr( + 'msg.userfront.qr.camera_error', + fallback: '카메라 오류: {{error}}', + params: {'error': '$e'}, + ); + }); + } } @override @@ -244,9 +155,43 @@ class _QRScanScreenState extends State { ), child: ClipRRect( borderRadius: BorderRadius.circular(12), - child: _initializing - ? const Center(child: CircularProgressIndicator()) - : HtmlElementView(viewType: _viewType), + child: Stack( + fit: StackFit.expand, + children: [ + MobileScanner( + controller: _scannerController, + onDetect: _onDetect, + errorBuilder: (context, error) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) { + return; + } + setState(() { + _error = _toScannerErrorMessage(error); + }); + }); + + return Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text( + _toScannerErrorMessage(error), + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.white), + ), + ), + ); + }, + ), + if (_isProcessing) + Container( + color: Colors.black45, + child: const Center( + child: CircularProgressIndicator(), + ), + ), + ], + ), ), ), ), @@ -262,7 +207,7 @@ class _QRScanScreenState extends State { ], const SizedBox(height: 12), FilledButton.icon( - onPressed: _initializing ? null : _retry, + onPressed: _isProcessing ? null : _retry, icon: const Icon(Icons.refresh), label: Text(tr('ui.userfront.qr.rescan', fallback: '다시 스캔')), ), @@ -279,7 +224,7 @@ class _QRScanScreenState extends State { const SizedBox(height: 8), FilledButton.icon( key: const ValueKey('qr_scan_submit_button'), - onPressed: _submitManual, + onPressed: _isProcessing ? null : _submitManual, icon: const Icon(Icons.check_circle), label: Text( tr('ui.userfront.qr.result_success', fallback: '승인 화면으로 이동'), diff --git a/userfront/pubspec.lock b/userfront/pubspec.lock index 9e031c34..fecd33f1 100644 --- a/userfront/pubspec.lock +++ b/userfront/pubspec.lock @@ -356,6 +356,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mobile_scanner: + dependency: "direct main" + description: + name: mobile_scanner + sha256: c92c26bf2231695b6d3477c8dcf435f51e28f87b1745966b1fe4c47a286171ce + url: "https://pub.dev" + source: hosted + version: "7.2.0" node_preamble: dependency: transitive description: diff --git a/userfront/pubspec.yaml b/userfront/pubspec.yaml index 35e46fe6..270c2fb4 100644 --- a/userfront/pubspec.yaml +++ b/userfront/pubspec.yaml @@ -44,6 +44,7 @@ dependencies: logging: ^1.2.0 logger: ^2.0.0 qr_flutter: ^4.1.0 + mobile_scanner: ^7.1.4 easy_localization: ^3.0.7 toml: ^0.15.0 web: ^1.1.0 From 7582ba4208c0c5c04c96b7ee0d78aae0df46dbab Mon Sep 17 00:00:00 2001 From: kyy Date: Tue, 24 Feb 2026 11:22:45 +0900 Subject: [PATCH 29/29] =?UTF-8?q?RP=20=EC=B9=B4=EB=93=9C=20=EB=B1=83?= =?UTF-8?q?=EC=A7=80=20=EA=B0=80=EB=8F=85=EC=84=B1=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/dashboard/presentation/dashboard_screen.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/userfront/lib/features/dashboard/presentation/dashboard_screen.dart b/userfront/lib/features/dashboard/presentation/dashboard_screen.dart index 565bbbfb..e89e1cfe 100644 --- a/userfront/lib/features/dashboard/presentation/dashboard_screen.dart +++ b/userfront/lib/features/dashboard/presentation/dashboard_screen.dart @@ -1178,16 +1178,16 @@ class _DashboardScreenState extends ConsumerState { Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: statusColor.withValues(alpha: 31), + color: statusColor, borderRadius: BorderRadius.circular(999), ), child: Text( item.status == 'active' - ? tr('ui.common.status.active') + ? tr('ui.userfront.dashboard.activity.linked') : tr('ui.userfront.dashboard.status.revoked'), - style: TextStyle( + style: const TextStyle( fontSize: 11, - color: statusColor, + color: Colors.white, fontWeight: FontWeight.w600, ), ),

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 RX&wCiV}8Y~(ZntO{{cO)dpH09 literal 10932 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 m_rtxx{aR0m!{q&P+>eB z?J{?+FLkYu+4_Uk`r_>LHF~flZm0oBf#vr8%vJ>#p~!KNvqGG3)|f1T_)ydeh8$vDceZ>oNbH^|*hJ*t?Yc*1`WB&W>VYVEzu) zq#7;;VjO)t*nbgf(!`OXJBr45rP>>AQr$6c7slJWvbpNW@KTwna6d?PP>hvXCcp=4 zF;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f(D(}yZ`_I diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 6ed2d933e1120817fe9182483a228007b18ab6ae..540281eff6ab45911511bf8f1e32d527232f8cfd 100644 GIT binary patch literal 4983 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 Q00000NkvXXt^-0~f>$tw>;M1& diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index fe730945a01f64a61e2235dbe3f45b08f7729182..654a328d7a1350e2dd220ee6acf0d3e73cd0cfb9 100644 GIT binary patch literal 4704 zcmV-m5})mfP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z00(qQO+^Rl0v8P(7r0{7iU0r+)=5M`RA}DCnt701S9QjJ-|J|Eeg9rl7cLl3Xos}25gWq7>_nD zvMgJcge)|&7E81AY~B6dmp|_7>7E&lG?Gl^RP`S-@7??Ech9+J`R);~fE2F2Q_faU zlr#dZh^5%8kuC#P0+#>_fmWaih=C$702~4K0xy7fW9S0GYb)O#Ythelc(avlsC^<`JL=^AZuo^96iPKnopR7-wb8 z1+D|$i0C9}uI+p_uTG9*b^_l+JcQZJ82#jMaogDgJ}aPwYwm!i5vXL_kZ%CJ8F(GA zoS?a%hl~MFW4>+pAB&y9=q9bJI4SSx|IBHl_c(frQ|;A9y#JP!O9@PP1P zP%=|(5xBEZ(s!I0}p`4z~%J2Sx_Uv)aL>XGX(q+ z@V|z8ES>}^!;haC>=}W!uI-ZLS-@{vdXL~rAa|M}Bf!hRF5n5^MeLW2`V^j(fC$JL zH%ZI^Ed*8o*Me81n|M0lBZfzSzq5F#bvP~^dHRlX16o+uRee4WcrW6;z>;ZRkAZ!_ z4$L;-3FQ5tW55WB<4Pr)jFuan%~TvkW5ltP&&SGSh#<<^6u=iqS^-=QtV@3jPq|K0 zK|F1^3-dM1D3XV^bk7`UVQm*Ahz#?A_aOcdSagb4E0|v3yTE?~PXhfU(Fj&j-2U-1 z8O+4*c5DKi!ER1Bcs=44ppy`)qA76UIh#)bUlz$|k-4zt!)FGX-*5-{VhKl@BlsZV z4}c3My_NvIz{8mPjC&9#g<@WT0AJ|n0$WHqU?FCM;cbW;6*gcp*xfd_+k90}8rnMb z`%^+f-;?61Sm;kiU(S@=|2^$3;MO-!sfimniR7GI1O54$$uq&fEC>h(u@vvxg{o0Qtc} zN7q1g!(=QtVEC-XJm40MJ1BJmH(5F;dlVp3Slb0L5#k2K2MGZ>EY^GjxC`+jlfp*6 zy%VIlzz2|D54tdzP524g1*-&WfU6`Oj^IGPy))L5PBJ!#rIP*_xRDUT>c=k1fd2#@b3`T5slIQ7+kn}%y`f?#rRTFU z!4zRVa08D8$C1rez_g|&58+&ttK$u2LTXu+UjS~d#F_E$9qG9n8IVSRZ(+Vw_x@~& znu1D^!`$?za>GJT#!Tq#(DOv|#r0id{bQ`pWV>LtYZ7wQ(- z5v(+hvWQl~8ELIs@PnA$#2`;qXVdjv5QD`WrQXiLaeWck433R*GV4LNBd$+}&IPi< zL`pKj8dUX``+<96*b(8ZkT6RPAC|Zk$Osl1<_SpV4u>)V!a2&s3D$PZqlgvhlZ%29 zqpcAkrMjw4o6iA1aO7fy7~Ix9RhKn`tS_gE!0}*qQ8}`Pv9D*%rJmFbf`5ZNB?=>{1^&LSG9WnjY!=Qv#ibE)}-enP#iAND6C`}L77fZehQvc!n(z_T^IaXGL!BE-!qTW}J1BBJ!Nm^je{jY^bI z4m7V$qbEVbjGMXvFG>q(rT=&dQC7g62Nu*#`!eC!R6jz?#Zd-nKDA_E3^Wq-5ly$e z1B7z1k}hKjctu1YwyKH4G0>hQ$|t$u>A5Ze5pGh@NC@=eIHHK`P|vCr>-C^3(_y3F zeJPbv)o68tW9$>yV^vKl{F(&U)VT_ETF=0VQE9HKZE_cns7>qB3$|H%x}W z6aNZT^EUf|BeFQTZE8{9aG-(FOGW{H2J`{*5P4vAmWfowQECVOG$II2q^<5BH-i3w z5I*Ju?RC$~m~R8m2`3RIMlA%^AUua6QpGq2%u|T#w*s%KSsRZMbA)NE_T{6uQMjZF z#L*NesS@X9sl~xKRrfGwkaSn-gFOU?c1ljk@R;DfsH~IDLL5m1b4-CMk9admF2%G; zv=bu1MbwVfR>SwnQdZ2FWB?ef`@5wMs1vM_kW>1MGo|BNX7Jt^@Q`7b^GSkJ!$qxi z8gBw_0yauSDY$wkvB&W5iL@ue%z&vM14irg(j3)K=-{;N)3BgzS9gaqYGxDa!RqM5 zAzn`2r3M1IwY>QF?dg}5Ni|wu+T~Ng< z#8^)kGmwV5O*Al^CD`+9q>P|d_GuY&XUtfXjT#)!QFXH54Q~Su0tK6kf!9fXJE$GV z3x3h!OR|eWW17qO`Ews|#Gw>R6gH_!fMpy^k)fXMnSg{~Y4yiyI7{%dOHx%YAUKG_ z)7yl}CzUK{HVz3o;+XM%S-oSW91Z!>E?e7ebY9Lsfp@3l?oE&FtgGa1#nDO z*@8xwaS~DN*>n`x0j_$#M%fK+Y`_{%{~&P0`#?Vu>JjV!9wqhu3Pt#8$*}6~(=JUJ zqsRakGck1Si-6~;rb}=E_G*$BR9N?y)2S4RMns+I(TAuA7<_UQl9|75lLV1#MS0n% zk_*Sbk?}-AW#j&Yq?9^2FwfLk)ojDHwsI}A`cDs3#);Y#XxiE7zlXp-jWADAi#c-; z*AXqBKRsy>tfX!tfa7(W1(-47R`7DwJo9m&zf#HqZm1hSigjZ6Fy)ZKfyDvC)2Z3D zAg;1}VSU*&trmh$sJ{q1gta%a*y&)tRefEDwc3KhnyDTxy@xMMFb#7QQ!!@NwI3&{ zD1)@d=(TlPKOiv>Jhoa~x8s5nEsL=%Dj|A|5a`TmYOqXbB`Ce8ohpTOT~H>%TuZ1} zs1t>`a81tBHmF2^^}Tv7csEnAajMPJ3ZOF)^-P4Fv~(h%&wATrSx{M zn01J2KL&myHOXe+O^62(+v{&BotlnJ0gb!wtl^EoiX>tdA$?m*$aSmQ+zs@sdj9$0 zJu6pb367{*dW|BALJX!?ezp_A^GF8?xp*6JISI26Qx2+RDwS-M$;8(pHc(3z4jHy% zMx!{ysIBQ@ss_9U@g^Kxbk$re6D7uheyIX&l6WiPqlotl-U2MG16jm;9kXlC%9RjO zy!q6ag(4I4Qix>1Q3a>ubgtFuCQdZjwOt^{Wa34@uT#%t!WLkUA}3KUoc{v^3ZlwS zG!cmD4m2S}WH5?EIA8S%eO4hU$T2Z}8wI`r+~+)fX;Ci1`L1n5_|^6~INveLPf&Go z;u4FMvT1sC&^#T3)t4IuH!GBMRc-cRz6%`3N)t!Z2YiPb-2`w2@NPoAszOH>!bIVa zWU0S^nkplh7i{jud^%F}T&6tEql*w;s;t9NYE0kwjvAG*b~<=#QuAHdGS)|wp3@fY z!cr!+z+0Kf5pM$?QzjWB5t-7V&E(rVotn>5f&-~0#Y@vF`$=MkC6N`#nuS8WwMaeA!Ae zBMR}l1@o-n{;^!cPnAUE+czMH1gj)IMyP(O8Gk?KUf_FJ<>J;&saC>G$uS!IHPDTO zI7Dim?*fjK;U46Eg}1k1--a}&Ivl7docI0|bpOyex%P=VrxZB~fsqbu?nOMWLDfh+v8mDV*~EXr-raEq=W#OZg0yPt6x#{38HZ$u2%-{X!0 zEgk*=`Sy(zcr62FJ9)z|TV3sjI2GI#+NCS0JuHjF#g3 zVWhGAl1?V~47?Ij=;$KOS&@}dq{R~N0RBv&JEiX87h|3@d|I)8gyqS%@>9s$eEWJ# zrUL8%WztTu@gi0tFSu0V2GGU8kfEQ1Qp1HC0^sx1aG|4%TzjWvazYCcZvg%jcqf|D zU}*xU^eNzeB2{M8ep5R1Lvrn%45P7pp!RcwK7sm*y~^TU18fvrBvEptAxFfy_RjcR z&TwJPCi06nW{_JHQooykKSI18u@+Ha5*Gx#V7ME&FN))lxS@f{!H1{JJ$;K@M;8vy z7Xr5m-p}NoqncEJeTFTV9zwx=NY-&8Mj?qIPCzd9+zCKq$L$y?lf;=wNybtOW}!ku z^EGKaUq_Aom@F~oS;J=$Ujd4;Ts)f=xe0*Rb<6T>;GGJY(&e1KH+P88Nxchr3bEh# zgseV7vto(BujLWVHnW8nA}uF0J+4acbQ(|djZw^x4S$b$Py@|l#pgeI+G6#LK=apk z(OQC$EKP!&1n&cHATaG`l7v9M^#g<8(XmSJO30TZrd|| delta 447 zcmV;w0YLuXB+dhn8Gi!+007oyx*7lg0G3cpR7L;)|5U~J0au$Tw)URh`@-w}Xw3Np zS)Ix4{k7)&ujKrh-TO(x_}20L&+q+}+xr1ilg8}*yXgGl_5RcF{f*iBEV%Z~-t4>5 ziGV;=={^- z?sLQGb)?A{hr$_!z8HbH7kH=vM0x-*R~t>;jsO4v^GQTOR7l6|(&r9>FcgO2dg?%> z;=sK?5%;?Pn^T7LL?Y$@5u?06NuIR*0?Yf$Hf5Afk+lM<^ch*jvO$sU*m9J?JI7eI zGFV6+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9R%3*Q+)t%S!MU_`id^@& zY{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&p6kME1_Z%?`+u)^el0!1<0sd p?Eyu!OMLDifi)An*I;?S-wj=m4RYIt!kPd8002ovPDHLkV1k*I^mPCL diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 321773cd857a8a0f0c9c7d3dc3f5ff4fb298dc10..498ad70929dc9879181b315896e9bc3c7f499889 100644 GIT binary patch literal 8497 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 delta 691 zcmV;k0!;m}Lcj%(8Gi!+002f7DP8~o0Jl&~R7L;)|5U~JDYo_jSDX9(|M~s@SH}2N z#rS{J`h3&+@cRDr`1>4br2|=<_Wb|z`~RBV`-<24{r>;E==`tb{CU#(0alua*7{P! z_>|iF0Z@&o;`@Zw`ed2Hv*!Fwin#$(m7w4Ij@kM+yZ0`*_J0?7s{u=e0YGxN=lnXn z_j;$xb)?A|hr(Z#!1DV3H@o+7qQ_N_ycmMI0acg)Gg|cf|J(EaqTu_A!rvTerUFQQ z05n|zFjFP9FmM0>0mMl}K~z}7?bK^if#bc3@hBPX@I$58-z}(ZZE!t-aOGpjNkbau@>yEzH(5Yj4kZ ziMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_stABAHe$v|ToifVv60B@podBTcIqVcr1w`hG7HeY|fvLid#^Ok4NAXIXSt1 Zxpx7IC@PekH?;r&002ovPDHLkV1jOtYl8p) diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 797d452e458972bab9d994556c8305db4c827017..2853019d78f79d4c55e0cff33de095a69a807be0 100644 GIT binary patch literal 2680 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 m_rtxx{aR0m!{q&P+>eB z?J{?+FLkYu+4_Uk`r_>LHF~flZm0oBf#vr8%vJ>#p~!KNvqGG3)|f1T_)ydeh8$vDceZ>oNbH^|*hJ*t?Yc*1`WB&W>VYVEzu) zq#7;;VjO)t*nbgf(!`OXJBr45rP>>AQr$6c7slJWvbpNW@KTwna6d?PP>hvXCcp=4 zF;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f(D(}yZ`_I diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index 502f463a9bc882b461c96aadf492d1729e49e725..c7e45fae095c0899208ece4101e7f23924e16cbd 100644 GIT binary patch literal 7530 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 A;Q#;t delta 572 zcmV-C0>l04I?4o)8Gi!+006nq0-pc?0H{z*R7L;)|5U~JDYo_jSDXF*|5nEMy6F5^ z$M}8I`uzU?*Yf=uXr;5|{0m;6_Wb|A>ik^D_|)+I$?g3CSDK^3+eX0mD!2CP`2NN0 z{dLg!a?km&%iyTt`yiax0acdp`~T(l{$a`ZF1YpsRg(cvjDG_-U$Er-fz#Bw>2W$eUI#iU z)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G!hkE!s;%oku3;IwG3U^2k zw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn_j%}l|2+O?a>_7qq7W zmx(qtA2nV^tZlLpy_#$U%ZNx5;$`0L&dZ!@e7rFXPGAOup%q`|03hpdtXsPP0000< KMNUMnLSTaLA~m4^ diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 0ec303439225b78712f49115768196d8d76f6790..7613948e3bad9b36c148cbfe4a4a0536b8074ff0 100644 GIT binary patch literal 13709 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 diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 0ec303439225b78712f49115768196d8d76f6790..7613948e3bad9b36c148cbfe4a4a0536b8074ff0 100644 GIT binary patch literal 13709 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 diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index e9f5fea27c705180eb716271f41b582e76dcbd90..5a3af351856844d3f521ddfd74ff5a30e7b6099e 100644 GIT binary patch literal 23842 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 delta 1669 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 diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 8953cba09064923c5daf2d37e7c3c836ccdd794b..3510038cce5af0336dca81d18a7dd5b63b212652 100644 GIT binary patch literal 19101 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 delta 1218 zcmV;z1U>tml>y2LkQsji0000l9MBU0009V4OjJex|Nm6Q_$jvb0au$-#rXRD|5(QO z{Qm#_{{H^|{{U8+R>k;B!uRL){b9-YNx}D?-TM6f{zbp{`~3X}Tb%$&k_1|u zfV0u>{42ctGP(8vQj-Btk1n|O0ZD=YLwd&R{Ko41Gr9H=Y@z@@bOAMB5Ltl$E>bJJ z{>JP30ZxkmI%?eW{k`b?Wy<&gOo;dS`~CR$Vwb@XWtR|Ni~t=w02?-0&j0TD{>bb6 zsNwsK*!p?V`RIS|^^~{NQ;oVfi@GXtsy}m|06&ZXRfhl}L;FffSO5S6eMv+?RCwC$ zm+Mj*K@f#|VPSRzV-`>`5=AivqaegY#CX>v=6+A!|4lL@R9e~05Q;d{YJXM!v7q>> z&!M*ghG7_nVHk#Ch$1t?5a0tTVJH&ZBLEH`Sebvn1@3nI=#>g9wp4IUiKWZU*nra%8XRM`ec%3_8fn6*N~&dEd0kD-FRV|g=|QuUsuh> z-xCI}vD2imzYIOIdcCVV=$Bz@*u0+Bs<|L^)32nN*=wu3n%Ynw@1|eLG>!8ruU1pF zXUfb`j>(=Gy~?Rn4QJ-c3%3T|(Frd!bI`9u&zAnyFYTqlG#&J7AkD(jpw|oZLNiA> z;>>?C9}bLOXyzQ{1Rn4<%v)eC3l%nM2G34t{)-XFW3|MzCkLnfZHeN+{A#^TwHZ+!{p9q?%c*%w{Z< z=GMTm8KyaBqw(Y0Cy2orXm)b;<)J!_v$f9pF07*qoM6N<$g4~aU9RL6T diff --git a/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/userfront/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 0467bf12aa4d28f374bb26596605a46dcbb3e7c8..083e53fd8303eb8ef27fd0b650e0afcb206abe22 100644 GIT binary patch literal 21347 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 qY%1c&e4lX?n4WLG=K delta 1411 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 A0RR91 literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM diff --git a/userfront/web/icons/Icon-192.png b/userfront/web/icons/Icon-192.png index b749bfef07473333cf1dd31e9eed89862a5d52aa..b0a62485bd696330eb5d200ccc4fc191673a6dea 100644 GIT binary patch literal 25717 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 literal 5292 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 diff --git a/userfront/web/icons/Icon-512.png b/userfront/web/icons/Icon-512.png index 88cfd48dff1169879ba46840804b412fe02fefd6..07aba7c27fb3bcae024aed84583379d4bc9c655c 100644 GIT binary patch literal 90905 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

Scope Name {t( "ui.dev.clients.general.scopes.table.name", @@ -395,7 +394,11 @@ function ClientGeneralPage() { "Mandatory", )} + + {t("ui.dev.clients.general.scopes.table.delete", + "Delete", + )} +
- {t("ui.dev.clients.general.scopes.table.delete", - "Delete", - )} + {t("ui.dev.clients.general.scopes.table.delete", "Delete")}