···303303 "confirmNewPasswordPlaceholder": "Confirm new password",
304304 "changePasswordButton": "Change Password",
305305 "changing": "Changing...",
306306+ "setPassword": "Set Password",
307307+ "setPasswordDescription": "Your account is currently passkey-only. You can add a password to enable traditional login alongside your passkeys.",
308308+ "setPasswordButton": "Set Password",
309309+ "setting": "Setting...",
306310 "exportData": "Export Data",
307311 "exportDataDescription": "Download your entire repository as a CAR (Content Addressable Archive) file. This includes all your posts, likes, follows, and other data.",
308312 "downloadRepo": "Download Repository",
···352356 "handleUpdateFailed": "Failed to update handle",
353357 "passwordChanged": "Password changed successfully",
354358 "passwordChangeFailed": "Failed to change password",
359359+ "passwordSet": "Password set successfully",
360360+ "passwordSetFailed": "Failed to set password",
355361 "passwordsMismatch": "Passwords do not match",
356362 "passwordsDoNotMatch": "Passwords do not match",
357363 "passwordLength": "Password must be at least 8 characters",
···509515 "beforeProceedingItem3": "Ensure your recovery notification channel is up to date",
510516 "addPasskeyFirst": "Add at least one passkey before you can remove your password.",
511517 "passkeyOnlyHint": "You sign in using passkeys only. If you ever lose access to your passkeys, you can recover your account using the \"Lost passkey?\" link on the login page.",
518518+ "addPasswordHint": "Want to add a password? Go to Settings to set one up.",
519519+ "goToSettings": "Go to Settings",
512520 "trustedDevices": "Trusted Devices",
513521 "trustedDevicesDescription": "Manage devices that can skip two-factor authentication when signing in. Trust is granted for 30 days and automatically extends when you use the device.",
514522 "manageTrustedDevices": "Manage Trusted Devices",
+8
frontend/src/locales/fi.json
···303303 "confirmNewPasswordPlaceholder": "Vahvista uusi salasana",
304304 "changePasswordButton": "Vaihda salasana",
305305 "changing": "Vaihdetaan...",
306306+ "setPassword": "Aseta salasana",
307307+ "setPasswordDescription": "Tilisi on tällä hetkellä vain pääsyavain-tili. Voit lisätä salasanan ottaaksesi käyttöön perinteisen kirjautumisen pääsyavainten rinnalla.",
308308+ "setPasswordButton": "Aseta salasana",
309309+ "setting": "Asetetaan...",
306310 "exportData": "Vie tiedot",
307311 "exportDataDescription": "Lataa koko tietovarastosi CAR-tiedostona (Content Addressable Archive). Tämä sisältää kaikki julkaisusi, tykkäyksesi, seuraamisesi ja muut tiedot.",
308312 "downloadRepo": "Lataa tietovarasto",
···352356 "handleUpdateFailed": "Käyttäjänimen päivitys epäonnistui",
353357 "passwordChanged": "Salasana vaihdettu",
354358 "passwordChangeFailed": "Salasanan vaihto epäonnistui",
359359+ "passwordSet": "Salasana asetettu onnistuneesti",
360360+ "passwordSetFailed": "Salasanan asettaminen epäonnistui",
355361 "passwordsMismatch": "Salasanat eivät täsmää",
356362 "passwordsDoNotMatch": "Salasanat eivät täsmää",
357363 "passwordLength": "Salasanan on oltava vähintään 8 merkkiä",
···509515 "beforeProceedingItem3": "Varmista, että palautusilmoituskanavasi on ajan tasalla",
510516 "addPasskeyFirst": "Lisää vähintään yksi pääsyavain ennen kuin voit poistaa salasanasi.",
511517 "passkeyOnlyHint": "Kirjaudut sisään vain pääsyavaimilla. Jos menetät pääsyn pääsyavaimeesi, voit palauttaa tilisi käyttämällä \"Kadotitko pääsyavaimen?\" -linkkiä kirjautumissivulla.",
518518+ "addPasswordHint": "Haluatko lisätä salasanan? Siirry Asetuksiin määrittääksesi sellaisen.",
519519+ "goToSettings": "Siirry asetuksiin",
512520 "trustedDevices": "Luotetut laitteet",
513521 "trustedDevicesDescription": "Hallitse laitteita, jotka voivat ohittaa kaksivaiheisen tunnistautumisen kirjautuessaan. Luottamus myönnetään 30 päiväksi ja jatkuu automaattisesti, kun käytät laitetta.",
514522 "manageTrustedDevices": "Hallitse luotettuja laitteita",
···296296 "confirmNewPasswordPlaceholder": "새 비밀번호 재입력",
297297 "changePasswordButton": "비밀번호 변경",
298298 "changing": "변경 중...",
299299+ "setPassword": "비밀번호 설정",
300300+ "setPasswordDescription": "현재 계정은 패스키 전용입니다. 비밀번호를 추가하면 패스키와 함께 기존 로그인 방식도 사용할 수 있습니다.",
301301+ "setPasswordButton": "비밀번호 설정",
302302+ "setting": "설정 중...",
299303 "exportData": "데이터 내보내기",
300304 "exportDataDescription": "전체 저장소를 CAR (Content Addressable Archive) 파일로 다운로드합니다. 모든 게시물, 좋아요, 팔로우 및 기타 데이터가 포함됩니다.",
301305 "downloadRepo": "저장소 다운로드",
···345349 "handleUpdateFailed": "핸들 업데이트에 실패했습니다",
346350 "passwordChanged": "비밀번호가 변경되었습니다",
347351 "passwordChangeFailed": "비밀번호 변경에 실패했습니다",
352352+ "passwordSet": "비밀번호가 설정되었습니다",
353353+ "passwordSetFailed": "비밀번호 설정에 실패했습니다",
348354 "passwordsMismatch": "비밀번호가 일치하지 않습니다",
349355 "passwordsDoNotMatch": "비밀번호가 일치하지 않습니다",
350356 "passwordLength": "비밀번호는 8자 이상이어야 합니다",
···502508 "beforeProceedingItem3": "복구 알림 채널이 최신인지 확인",
503509 "addPasskeyFirst": "비밀번호를 제거하려면 먼저 최소 하나의 패스키를 추가하세요.",
504510 "passkeyOnlyHint": "패스키로만 로그인합니다. 패스키에 액세스할 수 없게 되면 로그인 페이지의 '패스키를 분실하셨나요?' 링크를 사용하여 계정을 복구할 수 있습니다.",
511511+ "addPasswordHint": "비밀번호를 추가하시겠습니까? 설정에서 설정하세요.",
512512+ "goToSettings": "설정으로 이동",
505513 "trustedDevices": "신뢰할 수 있는 기기",
506514 "trustedDevicesDescription": "로그인 시 2단계 인증을 건너뛸 수 있는 기기를 관리합니다. 신뢰는 30일간 유효하며 기기를 사용하면 자동으로 연장됩니다.",
507515 "manageTrustedDevices": "신뢰할 수 있는 기기 관리",
+8
frontend/src/locales/sv.json
···296296 "confirmNewPasswordPlaceholder": "Bekräfta nytt lösenord",
297297 "changePasswordButton": "Ändra lösenord",
298298 "changing": "Ändrar...",
299299+ "setPassword": "Ange lösenord",
300300+ "setPasswordDescription": "Ditt konto är för närvarande endast passnycklar. Du kan lägga till ett lösenord för att aktivera traditionell inloggning tillsammans med dina passnycklar.",
301301+ "setPasswordButton": "Ange lösenord",
302302+ "setting": "Anger...",
299303 "exportData": "Exportera data",
300304 "exportDataDescription": "Ladda ner hela ditt arkiv som en CAR-fil (Content Addressable Archive). Detta inkluderar alla dina inlägg, gillanden, följningar och annan data.",
301305 "downloadRepo": "Ladda ner arkiv",
···345349 "handleUpdateFailed": "Kunde inte uppdatera användarnamn",
346350 "passwordChanged": "Lösenord ändrat",
347351 "passwordChangeFailed": "Kunde inte ändra lösenord",
352352+ "passwordSet": "Lösenord har angetts",
353353+ "passwordSetFailed": "Kunde inte ange lösenord",
348354 "passwordsMismatch": "Lösenorden matchar inte",
349355 "passwordsDoNotMatch": "Lösenorden matchar inte",
350356 "passwordLength": "Lösenordet måste vara minst 8 tecken",
···502508 "beforeProceedingItem3": "Se till att din meddelandekanal för återställning är uppdaterad",
503509 "addPasskeyFirst": "Lägg till minst en nyckel innan du kan ta bort ditt lösenord.",
504510 "passkeyOnlyHint": "Du loggar in med endast nycklar. Om du förlorar tillgång till dina nycklar kan du återställa ditt konto med länken \"Tappat bort nyckeln?\" på inloggningssidan.",
511511+ "addPasswordHint": "Vill du lägga till ett lösenord? Gå till Inställningar för att ställa in ett.",
512512+ "goToSettings": "Gå till inställningar",
505513 "trustedDevices": "Betrodda enheter",
506514 "trustedDevicesDescription": "Hantera enheter som kan hoppa över tvåfaktorsautentisering vid inloggning. Förtroende beviljas i 30 dagar och förlängs automatiskt när du använder enheten.",
507515 "manageTrustedDevices": "Hantera betrodda enheter",
···228228 .send()
229229 .await
230230 .expect("Failed to send delete request");
231231- assert_eq!(delete_res.status(), StatusCode::UNAUTHORIZED);
231231+ assert_eq!(delete_res.status(), StatusCode::BAD_REQUEST);
232232 let body: Value = delete_res.json().await.unwrap();
233233 assert_eq!(body["error"], "ExpiredToken");
234234}
+15-5
tests/import_verification.rs
···156156 .send()
157157 .await
158158 .expect("Failed to import repo");
159159- assert_eq!(import_res.status(), StatusCode::OK);
159159+ let status = import_res.status();
160160+ if status != StatusCode::OK {
161161+ let body = import_res.text().await.unwrap_or_default();
162162+ panic!(
163163+ "Import failed with status {}: {}",
164164+ status, body
165165+ );
166166+ }
160167}
161168162169#[tokio::test]
···285292async fn test_import_preserves_records_after_reimport() {
286293 let client = client();
287294 let (token, did) = create_account_and_login(&client).await;
288288- let mut rkeys = Vec::new();
295295+ let mut rkeys = Vec::with_capacity(3);
289296 for i in 0..3 {
290297 let post_payload = json!({
291298 "repo": did,
···309316 assert_eq!(res.status(), StatusCode::OK);
310317 let body: serde_json::Value = res.json().await.unwrap();
311318 let uri = body["uri"].as_str().unwrap();
312312- let rkey = uri.split('/').next_back().unwrap().to_string();
313313- rkeys.push(rkey);
319319+ rkeys.push(uri.split('/').next_back().unwrap().to_string());
314320 }
315321 for rkey in &rkeys {
316322 let get_res = client
···352358 .send()
353359 .await
354360 .expect("Failed to import repo");
355355- assert_eq!(import_res.status(), StatusCode::OK);
361361+ let status = import_res.status();
362362+ if status != StatusCode::OK {
363363+ let body = import_res.text().await.unwrap_or_default();
364364+ panic!("Import failed with status {}: {}", status, body);
365365+ }
356366 let list_res = client
357367 .get(format!(
358368 "{}/xrpc/com.atproto.repo.listRecords?repo={}&collection=app.bsky.feed.post",
+1-1
tests/password_reset.rs
···241241 .send()
242242 .await
243243 .expect("Failed to reset password");
244244- assert_eq!(res.status(), StatusCode::UNAUTHORIZED);
244244+ assert_eq!(res.status(), StatusCode::BAD_REQUEST);
245245 let body: Value = res.json().await.expect("Invalid JSON");
246246 assert_eq!(body["error"], "ExpiredToken");
247247}