diff --git a/.github/release.yml b/.github/release.yml index de6e982d9..b2eb4ae46 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -15,6 +15,9 @@ changelog: - title: Enhancements labels: - enhancement + - title: Translations + labels: + - lang - title: Refactoring labels: - refactor diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 8104d197e..61269b119 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,8 +1,10 @@ -name: docs +name: docs on: push: branches: - master +permissions: + contents: write jobs: deploy: runs-on: ubuntu-latest @@ -11,5 +13,5 @@ jobs: - uses: actions/setup-python@v4 with: python-version: 3.x - - run: pip install mkdocs-material + - run: pip install mkdocs-material - run: mkdocs gh-deploy --force diff --git a/docs/forcing_password_reset.md b/docs/forcing_password_reset.md index 5292a370e..927b3aec8 100644 --- a/docs/forcing_password_reset.md +++ b/docs/forcing_password_reset.md @@ -6,7 +6,7 @@ Depending on the scope of your application, there may be times when you'll decid - [Available Methods](#available-methods) - [Check if a User Requires Password Reset](#check-if-a-user-requires-password-reset) - [Force Password Reset On a User](#force-password-reset-on-a-user) - - [Removing Password Reset Flag On a User](#removing-password-reset-flag-on-a-user) + - [Remove Force Password Reset Flag On a User](#remove-force-password-reset-flag-on-a-user) - [Force Password Reset On Multiple Users](#force-password-reset-on-multiple-users) - [Force Password Reset On All Users](#force-password-reset-on-all-users) @@ -46,9 +46,8 @@ If you see the need to force password reset for more than one user, the `forceMu ```php use CodeIgniter\Shield\Models\UserIdentityModel; -... -... -... + +// ... $identities = new UserIdentityModel(); $identities->forceMultiplePasswordReset([1,2,3,4]); ``` @@ -59,9 +58,8 @@ If you suspect a security breach or compromise in the passwords of your users, y ```php use CodeIgniter\Shield\Models\UserIdentityModel; -... -... -... + +// ... $identities = new UserIdentityModel(); $identities->forceGlobalPasswordReset(); ``` diff --git a/docs/guides/strengthen_password.md b/docs/guides/strengthen_password.md index 4e5067fc4..5d9345022 100644 --- a/docs/guides/strengthen_password.md +++ b/docs/guides/strengthen_password.md @@ -94,10 +94,10 @@ and `$hashThreads`. If you use `PASSWORD_ARGON2ID`, you should use PHP's constants: ```php - public int $hashMemoryCost = PASSWORD_ARGON2_DEFAULT_MEMORY_COST; +public int $hashMemoryCost = PASSWORD_ARGON2_DEFAULT_MEMORY_COST; - public int $hashTimeCost = PASSWORD_ARGON2_DEFAULT_TIME_COST; - public int $hashThreads = PASSWORD_ARGON2_DEFAULT_THREADS; +public int $hashTimeCost = PASSWORD_ARGON2_DEFAULT_TIME_COST; +public int $hashThreads = PASSWORD_ARGON2_DEFAULT_THREADS; ``` ## Maximum Password Length diff --git a/docs/index.md b/docs/index.md index 32aed5e61..a0fa90810 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,10 +6,11 @@ * [Authentication](authentication.md) * [Authorization](authorization.md) * [Auth Actions](auth_actions.md) -* [Forcing Password Reset](forcing_password_reset.md) * [Events](events.md) * [Testing](testing.md) * [Customization](customization.md) +* [Forcing Password Reset](forcing_password_reset.md) +* [Banning Users](banning_users.md) ## Guides * [Protecting an API with Access Tokens](guides/api_tokens.md) diff --git a/mkdocs.yml b/mkdocs.yml index 36a514bf3..023b20886 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -47,6 +47,8 @@ nav: - Events: events.md - Testing: testing.md - Customization: customization.md + - Forcing Password Reset: forcing_password_reset.md + - Banning Users: banning_users.md - session_auth_event_and_logging.md - Guides: - guides/api_tokens.md diff --git a/src/Auth.php b/src/Auth.php index 35e5bd30f..4ec710a5a 100644 --- a/src/Auth.php +++ b/src/Auth.php @@ -25,6 +25,11 @@ */ class Auth { + /** + * The current version of CodeIgniter Shield + */ + public const SHIELD_VERSION = '1.0.0-beta.5'; + protected Authentication $authenticate; /** diff --git a/src/Collectors/Auth.php b/src/Collectors/Auth.php index ad19e5637..f265b2e58 100644 --- a/src/Collectors/Auth.php +++ b/src/Collectors/Auth.php @@ -56,7 +56,7 @@ public function __construct() */ public function getTitleDetails(): string { - return get_class($this->auth->getAuthenticator()); + return ShieldAuth::SHIELD_VERSION . ' | ' . get_class($this->auth->getAuthenticator()); } /** diff --git a/src/Commands/Generators/Views/usermodel.tpl.php b/src/Commands/Generators/Views/usermodel.tpl.php index 8937a2978..0ae3650ff 100644 --- a/src/Commands/Generators/Views/usermodel.tpl.php +++ b/src/Commands/Generators/Views/usermodel.tpl.php @@ -10,6 +10,8 @@ class {class} extends ShieldUserModel { protected function initialize(): void { + parent::initialize(); + $this->allowedFields = [ ...$this->allowedFields, diff --git a/src/Language/de/Auth.php b/src/Language/de/Auth.php index d763ef7d2..8e2c2476f 100644 --- a/src/Language/de/Auth.php +++ b/src/Language/de/Auth.php @@ -7,8 +7,8 @@ 'unknownAuthenticator' => '{0} ist kein gültiger Authentifikator.', 'unknownUserProvider' => 'Der zu verwendende User Provider konnte nicht ermittelt werden.', 'invalidUser' => 'Der angegebene Benutzer kann nicht gefunden werden.', - 'bannedUser' => '(To be translated) Can not log you in as you are currently banned.', - 'logOutBannedUser' => '(To be translated) You have been logged out because you have been banned.', + 'bannedUser' => 'Anmelden nicht möglich da Ihr Benutzer derzeit gesperrt ist.', + 'logOutBannedUser' => 'Ihr Benutzer wurde abgemeldet und gesperrt.', 'badAttempt' => 'Sie konnten nicht angemeldet werden. Bitte überprüfen Sie Ihre Anmeldedaten.', 'noPassword' => 'Kann einen Benutzer ohne Passwort nicht validieren.', 'invalidPassword' => 'Sie können nicht angemeldet werden. Bitte überprüfen Sie Ihr Passwort.', @@ -61,7 +61,7 @@ 'errorPasswordPwned' => 'Das Passwort {0} wurde aufgrund einer Datenschutzverletzung aufgedeckt und wurde {1, number} Mal in {2} kompromittierten Passwörtern gesehen.', 'suggestPasswordPwned' => '{0} sollte niemals als Passwort verwendet werden. Wenn Sie es irgendwo verwenden, ändern Sie es sofort.', 'errorPasswordEmpty' => 'Ein Passwort ist erforderlich.', - 'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.', + 'errorPasswordTooLongBytes' => 'Das Passwort darf die Länge von {param} Bytes nicht überschreiten.', 'passwordChangeSuccess' => 'Passwort erfolgreich geändert', 'userDoesNotExist' => 'Passwort wurde nicht geändert. Der Benutzer existiert nicht', 'resetTokenExpired' => 'Tut mir leid. Ihr Reset-Token ist abgelaufen.', diff --git a/src/Language/fa/Auth.php b/src/Language/fa/Auth.php index fb3acfce5..b3d8e4fe5 100644 --- a/src/Language/fa/Auth.php +++ b/src/Language/fa/Auth.php @@ -61,7 +61,7 @@ 'errorPasswordPwned' => 'رمز عبور {0} با توجه به نقض داده ها و دیده شدن {1, number} بارها داخل رمز های عبور {2} به پسورد های ناامن تبدیل شده و در معرض قرار گرفته است.', 'suggestPasswordPwned' => '{0} هرگز نباید به عنوان رمز عبور استفاده شود. اگر در هر جایی از آن استفاده می کنید سریعا آن را تغییر دهید.', 'errorPasswordEmpty' => 'رمز عبور الزامی است.', - 'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.', + 'errorPasswordTooLongBytes' => 'طول رمز عبور نمی تواند از {param} بایت بیشتر باشد.', 'passwordChangeSuccess' => 'رمز عبور با موفقیت تغییر کرد', 'userDoesNotExist' => 'رمز عبور تغییر نکرد. کاربر وجود ندارد.', 'resetTokenExpired' => 'متاسفانه، توکن بازنشانی شما منقضی شده است.', diff --git a/src/Language/fr/Auth.php b/src/Language/fr/Auth.php index 5c4e0bbd9..50c56881a 100644 --- a/src/Language/fr/Auth.php +++ b/src/Language/fr/Auth.php @@ -7,8 +7,8 @@ 'unknownAuthenticator' => '{0} n\'est pas un authentificateur valide.', 'unknownUserProvider' => 'Impossible de déterminer le User Provider à utiliser.', 'invalidUser' => 'Impossible de trouver l\'utilisateur.', - 'bannedUser' => '(To be translated) Can not log you in as you are currently banned.', - 'logOutBannedUser' => '(To be translated) You have been logged out because you have been banned.', + 'bannedUser' => 'Impossible de vous connecter car vous êtes actuellement banni.', + 'logOutBannedUser' => 'Vous avez été déconnecté car vous avez été banni.', 'badAttempt' => 'Connexion impossible. Veuillez vérifier les informations saisies.', 'noPassword' => 'Impossible de valider un utilisateur sans mot de passe.', 'invalidPassword' => 'Connexion impossible. Veuillez vérifier votre mot de passe.', @@ -61,7 +61,7 @@ 'errorPasswordPwned' => 'Le mot de passe {0} a été exposé à la suite d\'une violation de données et a été vu {1, number} fois dans {2} des mots de passe compromis.', 'suggestPasswordPwned' => '{0} ne devrait jamais être utilisé comme mot de passe. Si vous l\'utilisez quelque part, changez-le immédiatement.', 'errorPasswordEmpty' => 'Un mot de passe est obligatoire.', - 'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.', + 'errorPasswordTooLongBytes' => 'Le mot de passe ne doit pas dépasser {param} octets de longueur.', 'passwordChangeSuccess' => 'Mot de passe modifié avec succès', 'userDoesNotExist' => 'Le mot de passe n\'a pas été modifié. L\'utilisateur n\'existe pas', 'resetTokenExpired' => 'Désolé. Votre jeton de réinitialisation a expiré.', @@ -90,7 +90,7 @@ 'emailActivateMailBody' => 'Veuillez utiliser le code suivant pour activer votre compte et commencer à utiliser le site.', 'invalidActivateToken' => 'Le code était incorrect.', 'needActivate' => 'Complétez votre inscription en confirmant le code envoyé à votre email.', - 'activationBlocked' => '(to be translated) You must activate your account before logging in.', + 'activationBlocked' => 'Vous devez activer votre compte avant de vous connecter.', // Groups 'unknownGroup' => '{0} n\'est pas un groupe valide.', diff --git a/src/Language/ja/Auth.php b/src/Language/ja/Auth.php index 40f3624cd..e1d4870be 100644 --- a/src/Language/ja/Auth.php +++ b/src/Language/ja/Auth.php @@ -61,7 +61,7 @@ 'errorPasswordPwned' => 'パスワード {0} はデータ漏洩により公開されており、{2} の漏洩したパスワード中で {1, number} 回見られます。', // 'The password {0} has been exposed due to a data breach and has been seen {1, number} times in {2} of compromised passwords.', 'suggestPasswordPwned' => '{0} は絶対にパスワードとして使ってはいけません。もしどこかで使っていたら、すぐに変更してください。', // '{0} should never be used as a password. If you are using it anywhere change it immediately.', 'errorPasswordEmpty' => 'パスワードが必要です。', // 'A Password is required.', - 'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.', + 'errorPasswordTooLongBytes' => '{param} バイトを超えるパスワードは設定できません。', // 'Password cannot exceed {param} bytes in length.', 'passwordChangeSuccess' => 'パスワードの変更に成功しました', // 'Password changed successfully', 'userDoesNotExist' => 'パスワードは変更されていません。ユーザーは存在しません', // 'Password was not changed. User does not exist', 'resetTokenExpired' => '申し訳ありません。リセットトークンの有効期限が切れました。', // 'Sorry. Your reset token has expired.', diff --git a/src/Language/pt-BR/Auth.php b/src/Language/pt-BR/Auth.php index dda64e644..4a9c6cbf4 100644 --- a/src/Language/pt-BR/Auth.php +++ b/src/Language/pt-BR/Auth.php @@ -7,8 +7,8 @@ 'unknownAuthenticator' => '{0} não é um autenticador válido.', 'unknownUserProvider' => 'Não foi possível determinar o provedor de usuário a ser usado.', 'invalidUser' => 'Não foi possível localizar o usuário especificado.', - 'bannedUser' => '(To be translated) Can not log you in as you are currently banned.', - 'logOutBannedUser' => '(To be translated) You have been logged out because you have been banned.', + 'bannedUser' => 'Não é possível fazer login porque você está banido no momento.', + 'logOutBannedUser' => 'Você foi desconectado porque foi banido.', 'badAttempt' => 'Não foi possível fazer login. Por favor, verifique suas credenciais.', 'noPassword' => 'Não é possível validar um usuário sem uma senha.', 'invalidPassword' => 'Não foi possível fazer login. Por favor, verifique sua senha.', @@ -61,7 +61,7 @@ 'errorPasswordPwned' => 'A senha {0} foi exposta devido a uma violação de dados e foi vista {1, number} vezes em {2} de senhas comprometidas.', 'suggestPasswordPwned' => '{0} nunca deve ser usado como uma senha. Se você estiver usando em algum lugar, altere imediatamente.', 'errorPasswordEmpty' => 'É necessária uma senha.', - 'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.', + 'errorPasswordTooLongBytes' => 'A senha não pode exceder {param} bytes.', 'passwordChangeSuccess' => 'Senha alterada com sucesso', 'userDoesNotExist' => 'Senha não foi alterada. Usuário não existe', 'resetTokenExpired' => 'Desculpe. Seu token de redefinição expirou.', @@ -90,7 +90,7 @@ 'emailActivateMailBody' => 'Use o código abaixo para ativar sua conta e começar a usar o site.', 'invalidActivateToken' => 'O código estava incorreto.', 'needActivate' => 'Você deve concluir seu registro confirmando o código enviado para seu endereço de e-mail.', - 'activationBlocked' => '(to be translated) You must activate your account before logging in.', + 'activationBlocked' => 'Você deve ativar sua conta antes de fazer o login.', // Grupos 'unknownGroup' => '{0} não é um grupo válido.', diff --git a/src/Language/sk/Auth.php b/src/Language/sk/Auth.php index 5d504b5be..3617e0560 100644 --- a/src/Language/sk/Auth.php +++ b/src/Language/sk/Auth.php @@ -7,8 +7,8 @@ 'unknownAuthenticator' => '{0} nie je platný autentifikátor.', 'unknownUserProvider' => 'Nie je možné určiť poskytovateľa používateľa, ktorý sa má použiť.', 'invalidUser' => 'Nie je možné nájsť zadaného používateľa.', - 'bannedUser' => '(To be translated) Can not log you in as you are currently banned.', - 'logOutBannedUser' => '(To be translated) You have been logged out because you have been banned.', + 'bannedUser' => 'Prihlásenie zlyhalo, pretože ste dostali zákaz vstupu (ban).', + 'logOutBannedUser' => 'Boli ste odhlásení, pretože ste dostali zákaz vstupu (ban).', 'badAttempt' => 'Prihlásenie zlyhalo. Skontrolujte svoje prihlasovacie údaje.', 'noPassword' => 'Nie je možné overiť používateľa bez hesla.', 'invalidPassword' => 'Prihlásenie zlyhalo. Skontrolujte svoje heslo.', @@ -61,7 +61,7 @@ 'errorPasswordPwned' => 'Heslo {0} bolo odhalené z dôvodu porušenia ochrany údajov a bolo videné {1, number}-krát z {2} prelomených hesiel.', 'suggestPasswordPwned' => '{0} by sa nikdy nemalo používať ako heslo. Ak ho niekde používate, okamžite ho zmeňte.', 'errorPasswordEmpty' => 'Vyžaduje sa heslo.', - 'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.', + 'errorPasswordTooLongBytes' => 'Heslo nemôže presiahnuť dĺžku {param} bajtov', 'passwordChangeSuccess' => 'Heslo bolo úspešne zmenené', 'userDoesNotExist' => 'Heslo nebolo zmenené. Používateľ neexistuje', 'resetTokenExpired' => 'Prepáčte. Platnosť vášho resetovacieho tokenu vypršala.', @@ -90,7 +90,7 @@ 'emailActivateMailBody' => 'Pomocou nižšie uvedeného kódu aktivujte svoj účet a môžete začať používať stránku.', 'invalidActivateToken' => 'Kód bol nesprávny', 'needActivate' => 'Registráciu musíte dokončiť potvrdením kódu zaslaného na vašu e-mailovú adresu.', - 'activationBlocked' => '(to be translated) You must activate your account before logging in.', + 'activationBlocked' => 'Pred prihlásením si musíte aktivovať svoj účet.', // Groups 'unknownGroup' => '{0} nie je platná skupina.', diff --git a/src/Language/sr/Auth.php b/src/Language/sr/Auth.php new file mode 100644 index 000000000..22b2ecb5d --- /dev/null +++ b/src/Language/sr/Auth.php @@ -0,0 +1,101 @@ +<?php + +declare(strict_types=1); + +return [ + // Exceptions + 'unknownAuthenticator' => '{0} nije validan autentikator.', + 'unknownUserProvider' => 'Nemoguće je odlučiti koji User Provider koristiti.', + 'invalidUser' => 'Nemoguće locirati specifičnog korisnika.', + 'bannedUser' => 'Nije moguće pristupanje sistemu.Vaš nalog je banovan.', + 'logOutBannedUser' => 'Izlogovani ste jer je vaš nalog je banovan.', + 'badAttempt' => 'Neuspešan pristup. Proverite kredencijale.', + 'noPassword' => 'Neuspešna validacija korisnika bez lozinke.', + 'invalidPassword' => 'Neuspešan pristup, Proverite vašu lozinku.', + 'noToken' => 'Svaki zahtev mora imati bearer token u {0} zaglavlju.', + 'badToken' => 'Pristupni token nije validan.', + 'oldToken' => 'Pristupni token je istekao.', + 'noUserEntity' => 'Korisnički entitet mora postojati za verifikaciju naloga.', + 'invalidEmail' => 'Nije moguće potvrditi email adresu ne postoje pogodci u bazi podataka.', + 'unableSendEmailToUser' => 'Žao nam je ali slanje email poruke nije moguće. Nismo u mogućnosti poslati poruku na "{0}".', + 'throttled' => 'Preveliki broj zahteva sa vaše IP adrese. Možete pokušati ponovo za {0} secondi.', + 'notEnoughPrivilege' => 'Nemate dovoljan nivo autorizacije za zahtevanu akciju.', + + 'email' => 'E-mail Adresa', + 'username' => 'Korisničko ime', + 'password' => 'Lozinka', + 'passwordConfirm' => 'Lozinka (ponovo)', + 'haveAccount' => 'Već imate nalog?', + + // Buttons + 'confirm' => 'Potvrdi', + 'send' => 'Pošalji', + + // Registration + 'register' => 'Registracija', + 'registerDisabled' => 'Registracija trenutno nije dozvoljena.', + 'registerSuccess' => 'Dobrodošli!', + + // Login + 'login' => 'Pristup', + 'needAccount' => 'Potreban Vam je nalog?', + 'rememberMe' => 'Zapmti me?', + 'forgotPassword' => 'Zaboravljena lozinka?', + 'useMagicLink' => 'Koristi pristupni link', + 'magicLinkSubject' => 'Vaš pristupni link', + 'magicTokenNotFound' => 'Nije moguća verifikacija linka.', + 'magicLinkExpired' => 'Žao nam je, link je istekao.', + 'checkYourEmail' => 'Proverite Vaš email!', + 'magicLinkDetails' => 'Upravo smo Vam poslali pristupni link. Pristupni link će biti validan još samo {0} minuta.', + 'successLogout' => 'Uspešno ste se odjavili sa sistema.', + + // Passwords + 'errorPasswordLength' => 'Lozinka mora biti najmanje {0, number} znakova dužine.', + 'suggestPasswordLength' => 'Fraza lozinke - čak do 255 znakova dužine - napravite sigurniju lozinku koja se lako pamti.', + 'errorPasswordCommon' => 'Lozinka ne može biti na listi čestih lozinki.', + 'suggestPasswordCommon' => 'Lozinka je upoređena sa 65k čestih lozinki ili lozinki procurelih hakovanjem.', + 'errorPasswordPersonal' => 'Lozinka ne može sadržati hešovane lične podatke.', + 'suggestPasswordPersonal' => 'Varijacije bazirane na email adresi ne treba koristiti kao lozinku.', + 'errorPasswordTooSimilar' => 'Lozinka je previše slična korisničkom imenu.', + 'suggestPasswordTooSimilar' => 'Ne koristite delove korisničkog imena za lozinku.', + 'errorPasswordPwned' => 'Lozinka {0} je otkrivena prilikom napada {1, number} puta u {2} kompromitovanih lozinki.', + 'suggestPasswordPwned' => '{0} nikada ne treba biti korišćen za lozinku. Ako to koristite bilo gde promenite lozinku odmah.', + 'errorPasswordEmpty' => 'Lozinka je obavezna.', + 'errorPasswordTooLongBytes' => 'Lozinka ne može preći {param} bytova dužine.', + 'passwordChangeSuccess' => 'Lozinka je uspešno promenjena', + 'userDoesNotExist' => 'Lozinka nije promenjena. Korisnični nalog ne postoji', + 'resetTokenExpired' => 'Žao nam je ali token je istekao.', + + // Email Globals + 'emailInfo' => 'Neke informacije o osobi:', + 'emailIpAddress' => 'IP Adresa:', + 'emailDevice' => 'Uređaj:', + 'emailDate' => 'Datum:', + + // 2FA + 'email2FATitle' => 'Dvofazna autentifikacija', + 'confirmEmailAddress' => 'Potvrdite Vašu email adresu.', + 'emailEnterCode' => 'Unesite kod', + 'emailConfirmCode' => 'Unesite 6-cifreni kod koji smo Vam poslali na email.', + 'email2FASubject' => 'Vaš kod za autentifikaciju', + 'email2FAMailBody' => 'Autentifikacioni kod:', + 'invalid2FAToken' => 'Kod nije ispravan.', + 'need2FA' => 'Morate dovršiti dvofaznu autentifikaciju.', + 'needVerification' => 'Proverite email kako bi ste završili verifikaciju.', + + // Activate + 'emailActivateTitle' => 'Aktivacija email-a', + 'emailActivateBody' => 'Upravo smo Vam poslali kod za proveru email adrese. Molimo vas alepite kod ispod', + 'emailActivateSubject' => 'Baš aktivacioni kod', + 'emailActivateMailBody' => 'Koristite kod u nastavku kako bi ste aktivirali Vaš nalog i počeli korišćenje servisa.', + 'invalidActivateToken' => 'Kod nije ispravan.', + 'needActivate' => 'Morate dovršiti registraciju potvrdom koda poslatog na vašu email adresu.', + 'activationBlocked' => 'Morate aktivirati vaš nalog pre pristupanja sistemu.', + + // Groups + 'unknownGroup' => '{0} neispravna grupa.', + 'missingTitle' => 'Grupa mora imati naziv.', + + // Permissions + 'unknownPermission' => '{0} nije validno odobrenje.', +]; diff --git a/src/Language/sv-SE/Auth.php b/src/Language/sv-SE/Auth.php new file mode 100644 index 000000000..7176f650a --- /dev/null +++ b/src/Language/sv-SE/Auth.php @@ -0,0 +1,101 @@ +<?php + +declare(strict_types=1); + +return [ + // Exceptions + 'unknownAuthenticator' => '{0} är inte en giltig autentiseringsmetod.', + 'unknownUserProvider' => 'Kunde inte bestämma vilken User Provider som skall användas.', + 'invalidUser' => 'Kan inte hitta angiven användare.', + 'bannedUser' => 'Kan inte logga in dig eftersom du är avstängd.', + 'logOutBannedUser' => 'Du har blivit utloggad eftersom du har stängts av.', + 'badAttempt' => 'Kan inte logga in dig. Kontrollera dina inloggningsuppgifter.', + 'noPassword' => 'Kan inte validera användaren eftersom lösenord saknas.', + 'invalidPassword' => 'Kan inte logga in dig. Kontrollera angivet lösenord.', + 'noToken' => 'Varje förfrågan måste ha en bearer token i {0} headern.', + 'badToken' => 'Access token är ogiltig.', + 'oldToken' => 'Access token har gått ut.', + 'noUserEntity' => 'User Entity måste anges för lösenordsvalidering.', + 'invalidEmail' => 'Kan inte verifiera att epostadressen stämmer med den sparade.', + 'unableSendEmailToUser' => 'Det var inte möjligt att skicka epost. Det gick inte att skicka till "{0}".', + 'throttled' => 'För många anrop från denna IP-adress. Du kan försöka igen om {0} sekunder.', + 'notEnoughPrivilege' => 'Du har inte nödvändiga rättigheter för detta kommando.', + + 'email' => 'Epostadress', + 'username' => 'Användarnamn', + 'password' => 'Lösenord', + 'passwordConfirm' => 'Lösenord (igen)', + 'haveAccount' => 'Har du redan ett konto?', + + // Buttons + 'confirm' => 'Bekräfta', + 'send' => 'Skicka', + + // Registration + 'register' => 'Registrera', + 'registerDisabled' => 'Registrering är för närvarande inte möjlig.', + 'registerSuccess' => 'Välkommen!', + + // Login + 'login' => 'Logga in', + 'needAccount' => 'Behöver du ett konto?', + 'rememberMe' => 'Kom ihåg mig?', + 'forgotPassword' => 'Glömt ditt lösenord?', + 'useMagicLink' => 'Använd en login-länk', + 'magicLinkSubject' => 'Din login-länk', + 'magicTokenNotFound' => 'Kan inte verifiera länken.', + 'magicLinkExpired' => 'Tyvärr, länken har gått ut.', + 'checkYourEmail' => 'Kontrollera din epost!', + 'magicLinkDetails' => 'En login-länk har skickats med epost. Den gäller bara i {0} minuter.', + 'successLogout' => 'Du har loggats ut.', + + // Passwords + 'errorPasswordLength' => 'Lösenordet måste vara minst {0, number} tecken långt.', + 'suggestPasswordLength' => 'Lösenfraser - upp till 255 tecken långa - ger säkrare lösenord som är lättare att komma ihåg.', + 'errorPasswordCommon' => 'Lösenordet kan inte vara en vanligt lösenord.', + 'suggestPasswordCommon' => 'Lösenordet kontrollerades mot en lista med över 65k vanliga lösenord eller lösenord från publicerade dataläckor.', + 'errorPasswordPersonal' => 'Lösenord kan inte innehålla hashad personlig information.', + 'suggestPasswordPersonal' => 'Variationer på epostadress eller användarnamn kan inte användas som lösenord.', + 'errorPasswordTooSimilar' => 'Lösenordet är för likt användarnamnet.', + 'suggestPasswordTooSimilar' => 'Använd inte delar av ditt användarnamn i lösenordet.', + 'errorPasswordPwned' => 'Lösenordet {0} har publicerats i en dataläcka och har setts {1, number} gånger i {2} publicerade dataläckor.', + 'suggestPasswordPwned' => '{0} skall aldrig användas som lösenord. Använder du det någonstans skall du omedelbart byta.', + 'errorPasswordEmpty' => 'Ett lösenord krävs.', + 'errorPasswordTooLongBytes' => 'Lösenordet kan inte vara längre än {param} bytes.', + 'passwordChangeSuccess' => 'Lösenordet har bytts', + 'userDoesNotExist' => 'Lösenordet kunde inte bytas. Användaren existerar inte.', + 'resetTokenExpired' => 'Tyvärr. Din reset token har gått ut.', + + // Email Globals + 'emailInfo' => 'Informationen om personen:', + 'emailIpAddress' => 'IP-adress:', + 'emailDevice' => 'Enhet:', + 'emailDate' => 'Datum:', + + // 2FA + 'email2FATitle' => 'Tvåfaktorsautentisering', + 'confirmEmailAddress' => 'Validera din epost-adress.', + 'emailEnterCode' => 'Validera din epost', + 'emailConfirmCode' => 'Ange den 6 siffror långa koden som skickats till din epost-adress.', + 'email2FASubject' => 'Din engångskod', + 'email2FAMailBody' => 'Your engångskod är:', + 'invalid2FAToken' => 'Koden var fel.', + 'need2FA' => 'Du måste gör en tvåfaktorsautentisering.', + 'needVerification' => 'Kontrollera din epost för att slutföra aktiveringen av kontot.', + + // Activate + 'emailActivateTitle' => 'Verifiering av epostadress', + 'emailActivateBody' => 'Ett meddelande har just skickats för att det skall gå att verifiera din epostadress. Kopiera aktiveringskoden från meddelandet och klistra in den nedan.', + 'emailActivateSubject' => 'Din aktiveringskod', + 'emailActivateMailBody' => 'Använd koden nedan för att aktivera ditt konto för att kunna använda webplatsen.', + 'invalidActivateToken' => 'Koden var fel.', + 'needActivate' => 'Du måste slutföra registreringen genom att ange aktiveringskoden som skickats till din epostadress.', + 'activationBlocked' => 'Du måste aktivera ditt konto innan du kan logga in.', + + // Groups + 'unknownGroup' => '{0} är inte en giltig grupp.', + 'missingTitle' => 'En titel på gruppen måste anges.', + + // Permissions + 'unknownPermission' => '{0} är inte ett giltig rättighet.', +]; diff --git a/tests/Authentication/Authenticators/AccessTokenAuthenticatorTest.php b/tests/Authentication/Authenticators/AccessTokenAuthenticatorTest.php index d84e66586..c5042dbb8 100644 --- a/tests/Authentication/Authenticators/AccessTokenAuthenticatorTest.php +++ b/tests/Authentication/Authenticators/AccessTokenAuthenticatorTest.php @@ -126,9 +126,11 @@ public function testCheckOldToken(): void /** @var User $user */ $user = fake(UserModel::class); /** @var UserIdentityModel $identities */ - $identities = model(UserIdentityModel::class); - $token = $user->generateAccessToken('foo'); - $token->last_used_at = Time::now()->subYears(1)->subMinutes(1); + $identities = model(UserIdentityModel::class); + $token = $user->generateAccessToken('foo'); + // CI 4.2 uses the Chicago timezone that has Daylight Saving Time, + // so subtracts 1 hour to make sure this test passes. + $token->last_used_at = Time::now()->subYears(1)->subHours(1)->subMinutes(1); $identities->save($token); $result = $this->auth->check(['token' => $token->raw_token]); diff --git a/tests/Collectors/AuthTest.php b/tests/Collectors/AuthTest.php index 1c3c50495..45d7a5871 100644 --- a/tests/Collectors/AuthTest.php +++ b/tests/Collectors/AuthTest.php @@ -4,6 +4,7 @@ namespace Tests\Collectors; +use CodeIgniter\Shield\Auth as ShieldAuth; use CodeIgniter\Shield\Authentication\Authenticators\Session; use CodeIgniter\Shield\Collectors\Auth; use CodeIgniter\Shield\Entities\User; @@ -71,6 +72,7 @@ public function testGetTitleDetails(): void { $output = $this->collector->getTitleDetails(); + $this->assertStringContainsString(ShieldAuth::SHIELD_VERSION, $output); $this->assertStringContainsString(Session::class, $output); } diff --git a/tests/Commands/UserModelGeneratorTest.php b/tests/Commands/UserModelGeneratorTest.php index d7fbfd522..41c539593 100644 --- a/tests/Commands/UserModelGeneratorTest.php +++ b/tests/Commands/UserModelGeneratorTest.php @@ -90,6 +90,7 @@ public function testGenerateUserModel(): void $this->assertStringContainsString('class UserModel extends ShieldUserModel', $contents); $this->assertStringContainsString('use CodeIgniter\Shield\Models\UserModel as ShieldUserModel;', $contents); $this->assertStringContainsString('protected function initialize(): void', $contents); + $this->assertStringContainsString('parent::initialize();', $contents); } public function testGenerateUserModelCustomNamespace(): void diff --git a/tests/Language/AbstractTranslationTestCase.php b/tests/Language/AbstractTranslationTestCase.php index 6b8edc707..49e114184 100644 --- a/tests/Language/AbstractTranslationTestCase.php +++ b/tests/Language/AbstractTranslationTestCase.php @@ -69,8 +69,9 @@ abstract class AbstractTranslationTestCase extends TestCase BrazilianTranslationTest::class => 'pt-BR', // RussianTranslationTest::class => 'ru', // SinhalaTranslationTest::class => 'si', - SlovakTranslationTest::class => 'sk', - // SwedishTranslationTest::class => 'sv-SE', + SlovakTranslationTest::class => 'sk', + SerbianTranslationTest::class => 'sr', + SwedishTranslationTest::class => 'sv-SE', // ThaiTranslationTest::class => 'th', TurkishTranslationTest::class => 'tr', // UkrainianTranslationTest::class => 'uk', diff --git a/tests/Language/SerbianTranslationTest.php b/tests/Language/SerbianTranslationTest.php new file mode 100644 index 000000000..5dede1cf5 --- /dev/null +++ b/tests/Language/SerbianTranslationTest.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of CodeIgniter 4 framework. + * + * (c) CodeIgniter Foundation <admin@codeigniter.com> + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Tests\Language; + +/** + * @internal + */ +final class SerbianTranslationTest extends AbstractTranslationTestCase +{ +} diff --git a/tests/Language/SwedishTranslationTest.php b/tests/Language/SwedishTranslationTest.php new file mode 100644 index 000000000..2c5ed0674 --- /dev/null +++ b/tests/Language/SwedishTranslationTest.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of CodeIgniter 4 framework. + * + * (c) CodeIgniter Foundation <admin@codeigniter.com> + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Tests\Language; + +/** + * @internal + */ +final class SwedishTranslationTest extends AbstractTranslationTestCase +{ +}