diff --git a/docs/authorization.md b/docs/authorization.md index 977884adc..552bedb89 100644 --- a/docs/authorization.md +++ b/docs/authorization.md @@ -129,6 +129,23 @@ if (! $user->hasPermission('users.create')) { } ``` +<<<<<<< HEAD +<<<<<<< HEAD +======= +#### Authorizing via Filters + +You can restrict access to multiple routes through a [Controller Filter](https://codeigniter.com/user_guide/incoming/filters.html). One is provided for both restricting via groups the user belongs to, as well as which permission they need. The filters are automatically registered with the system under the `group` and `permission` aliases, respectively. You can define the protections within **app/Config/Filters.php**: + +```php +public $filters = [ + 'group:admin,superadmin' => ['before' => ['admin/*']], + 'permission:users.manage' => ['before' => ['admin/users/*']], +]; +``` + +>>>>>>> 39f1a58 (docs: make file paths bold) +======= +>>>>>>> 9981e4e (docs: remove unsupported code sample) #### Authorizing via Routes You can restrict access to a route or route group through a diff --git a/src/Language/pt-BR/Auth.php b/src/Language/pt-BR/Auth.php new file mode 100644 index 000000000..3afcb3837 --- /dev/null +++ b/src/Language/pt-BR/Auth.php @@ -0,0 +1,97 @@ + '{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.', + '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.', + 'noToken' => 'Toda requisição deve ter um token portador no cabeçalho {0}.', + 'badToken' => 'O token de acesso é inválido.', + 'oldToken' => 'O token de acesso expirou.', + 'noUserEntity' => 'A entidade de usuário deve ser fornecida para validação de senha.', + 'invalidEmail' => 'Não foi possível verificar se o endereço de email corresponde ao e-mail registrado.', + 'unableSendEmailToUser' => 'Desculpe, houve um problema ao enviar o email. Não pudemos enviar um email para {0}.', + 'throttled' => 'Muitas solicitações feitas a partir deste endereço IP. Você pode tentar novamente em {0} segundos.', + 'notEnoughPrivilege' => 'Você não tem a permissão necessária para realizar a operação desejada.', + + 'email' => 'Endereço de Email', + 'username' => 'Nome de usuário', + 'password' => 'Senha', + 'passwordConfirm' => 'Senha (novamente)', + 'haveAccount' => 'Já tem uma conta?', + + // Botões + 'confirm' => 'Confirmar', + 'send' => 'Enviar', + + // Registro + 'register' => 'Registrar', + 'registerDisabled' => 'O registro não está permitido no momento.', + 'registerSuccess' => 'Bem-vindo a bordo!', + + // Login + 'login' => 'Login', + 'needAccount' => 'Precisa de uma conta?', + 'rememberMe' => 'Lembrar de mim?', + 'forgotPassword' => 'Esqueceu sua senha?', + 'useMagicLink' => 'Use um Link de Login', + 'magicLinkSubject' => 'Seu Link de Login', + 'magicTokenNotFound' => 'Não foi possível verificar o link.', + 'magicLinkExpired' => 'Desculpe, o link expirou.', + 'checkYourEmail' => 'Verifique seu e-mail!', + 'magicLinkDetails' => 'Acabamos de enviar um e-mail com um link de Login. Ele é válido apenas por {0} minutos.', + 'successLogout' => 'Você saiu com sucesso.', + + // Senhas + 'errorPasswordLength' => 'As senhas devem ter pelo menos {0, number} caracteres.', + 'suggestPasswordLength' => 'Frases de senha - até 255 caracteres - criam senhas mais seguras que são fáceis de lembrar.', + 'errorPasswordCommon' => 'A senha não deve ser uma senha comum.', + 'suggestPasswordCommon' => 'A senha foi verificada contra mais de 65k senhas comuns ou senhas que foram vazadas por invasões.', + 'errorPasswordPersonal' => 'As senhas não podem conter informações pessoais re-criptografadas.', + 'suggestPasswordPersonal' => 'Variações do seu endereço de e-mail ou nome de usuário não devem ser usadas como senhas.', + 'errorPasswordTooSimilar' => 'A senha é muito semelhante ao nome de usuário.', + 'suggestPasswordTooSimilar' => 'Não use partes do seu nome de usuário na sua senha.', + '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.', + 'passwordChangeSuccess' => 'Senha alterada com sucesso', + 'userDoesNotExist' => 'Senha não foi alterada. Usuário não existe', + 'resetTokenExpired' => 'Desculpe. Seu token de redefinição expirou.', + + // E-mails Globais + 'emailInfo' => 'Algumas informações sobre a pessoa:', + 'emailIpAddress' => 'Endereço IP:', + 'emailDevice' => 'Dispositivo:', + 'emailDate' => 'Data:', + + // 2FA + 'email2FATitle' => 'Autenticação de dois fatores', + 'confirmEmailAddress' => 'Confirme seu endereço de e-mail.', + 'emailEnterCode' => 'Confirme seu email', + 'emailConfirmCode' => 'Insira o código de 6 dígitos que acabamos de enviar para seu endereço de e-mail.', + 'email2FASubject' => 'Seu código de autenticação', + 'email2FAMailBody' => 'Seu código de autenticação é:', + 'invalid2FAToken' => 'O código estava incorreto.', + 'need2FA' => 'Você deve concluir uma verificação de dois fatores.', + 'needVerification' => 'Verifique seu e-mail para concluir a ativação da conta.', + + // Ativar + 'emailActivateTitle' => 'Ativação de email', + 'emailActivateBody' => 'Acabamos de enviar um email para você com um código para confirmar seu endereço de e-mail. Copie esse código e cole abaixo.', + 'emailActivateSubject' => 'Seu código de ativação', + '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.', + + // Grupos + 'unknownGroup' => '{0} não é um grupo válido.', + 'missingTitle' => 'Os grupos devem ter um título.', + + // Permissões + 'unknownPermission' => '{0} não é uma permissão válida.', +]; diff --git a/src/Models/UserModel.php b/src/Models/UserModel.php index 91ed28948..1587b7b9e 100644 --- a/src/Models/UserModel.php +++ b/src/Models/UserModel.php @@ -261,6 +261,8 @@ public function insert($data = null, bool $returnID = true) * @param array|int|string|null $id * @param array|User $data * + * @return true if the update is successful + * * @throws ValidationException */ public function update($id = null, $data = null): bool @@ -301,6 +303,8 @@ public function update($id = null, $data = null): bool * * @param array|User $data * + * @return true if the save is successful + * * @throws ValidationException */ public function save($data): bool diff --git a/tests/Language/AbstractTranslationTestCase.php b/tests/Language/AbstractTranslationTestCase.php index ef768f884..6b8edc707 100644 --- a/tests/Language/AbstractTranslationTestCase.php +++ b/tests/Language/AbstractTranslationTestCase.php @@ -66,7 +66,7 @@ abstract class AbstractTranslationTestCase extends TestCase // NorwegianTranslationTest::class => 'no', // PolishTranslationTest::class => 'pl', // PortugueseTranslationTest::class => 'pt', - // BrazilianTranslationTest::class => 'pt-BR', + BrazilianTranslationTest::class => 'pt-BR', // RussianTranslationTest::class => 'ru', // SinhalaTranslationTest::class => 'si', SlovakTranslationTest::class => 'sk', diff --git a/tests/Language/BrazilianTranslationTest.php b/tests/Language/BrazilianTranslationTest.php new file mode 100644 index 000000000..65e3fa093 --- /dev/null +++ b/tests/Language/BrazilianTranslationTest.php @@ -0,0 +1,16 @@ +