welcome back to dyb-tech
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* The default implementation of the authentication trust resolver.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
class AuthenticationTrustResolver implements AuthenticationTrustResolverInterface
|
||||
{
|
||||
public function isAuthenticated(?TokenInterface $token = null): bool
|
||||
{
|
||||
return $token && $token->getUser();
|
||||
}
|
||||
|
||||
public function isRememberMe(?TokenInterface $token = null): bool
|
||||
{
|
||||
return $token && $token instanceof RememberMeToken;
|
||||
}
|
||||
|
||||
public function isFullFledged(?TokenInterface $token = null): bool
|
||||
{
|
||||
return $this->isAuthenticated($token) && !$this->isRememberMe($token);
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* Interface for resolving the authentication status of a given token.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
interface AuthenticationTrustResolverInterface
|
||||
{
|
||||
/**
|
||||
* Resolves whether the passed token implementation is authenticated.
|
||||
*/
|
||||
public function isAuthenticated(?TokenInterface $token = null): bool;
|
||||
|
||||
/**
|
||||
* Resolves whether the passed token implementation is authenticated
|
||||
* using remember-me capabilities.
|
||||
*/
|
||||
public function isRememberMe(?TokenInterface $token = null): bool;
|
||||
|
||||
/**
|
||||
* Resolves whether the passed token implementation is fully authenticated.
|
||||
*/
|
||||
public function isFullFledged(?TokenInterface $token = null): bool;
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\RememberMe;
|
||||
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
|
||||
/**
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
*/
|
||||
class CacheTokenVerifier implements TokenVerifierInterface
|
||||
{
|
||||
private CacheItemPoolInterface $cache;
|
||||
private int $outdatedTokenTtl;
|
||||
private string $cacheKeyPrefix;
|
||||
|
||||
/**
|
||||
* @param int $outdatedTokenTtl How long the outdated token should still be considered valid. Defaults
|
||||
* to 60, which matches how often the PersistentRememberMeHandler will at
|
||||
* most refresh tokens. Increasing to more than that is not recommended,
|
||||
* but you may use a lower value.
|
||||
*/
|
||||
public function __construct(CacheItemPoolInterface $cache, int $outdatedTokenTtl = 60, string $cacheKeyPrefix = 'rememberme-stale-')
|
||||
{
|
||||
$this->cache = $cache;
|
||||
$this->outdatedTokenTtl = $outdatedTokenTtl;
|
||||
$this->cacheKeyPrefix = $cacheKeyPrefix;
|
||||
}
|
||||
|
||||
public function verifyToken(PersistentTokenInterface $token, #[\SensitiveParameter] string $tokenValue): bool
|
||||
{
|
||||
if (hash_equals($token->getTokenValue(), $tokenValue)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$cacheKey = $this->getCacheKey($token);
|
||||
$item = $this->cache->getItem($cacheKey);
|
||||
if (!$item->isHit()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$outdatedToken = $item->get();
|
||||
|
||||
return hash_equals($outdatedToken, $tokenValue);
|
||||
}
|
||||
|
||||
public function updateExistingToken(PersistentTokenInterface $token, #[\SensitiveParameter] string $tokenValue, \DateTimeInterface $lastUsed): void
|
||||
{
|
||||
// When a token gets updated, persist the outdated token for $outdatedTokenTtl seconds so we can
|
||||
// still accept it as valid in verifyToken
|
||||
$item = $this->cache->getItem($this->getCacheKey($token));
|
||||
$item->set($token->getTokenValue());
|
||||
$item->expiresAfter($this->outdatedTokenTtl);
|
||||
$this->cache->save($item);
|
||||
}
|
||||
|
||||
private function getCacheKey(PersistentTokenInterface $token): string
|
||||
{
|
||||
return $this->cacheKeyPrefix.rawurlencode($token->getSeries());
|
||||
}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\RememberMe;
|
||||
|
||||
use Symfony\Component\Security\Core\Exception\TokenNotFoundException;
|
||||
|
||||
/**
|
||||
* This class is used for testing purposes, and is not really suited for production.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
class InMemoryTokenProvider implements TokenProviderInterface
|
||||
{
|
||||
private array $tokens = [];
|
||||
|
||||
public function loadTokenBySeries(string $series): PersistentTokenInterface
|
||||
{
|
||||
if (!isset($this->tokens[$series])) {
|
||||
throw new TokenNotFoundException('No token found.');
|
||||
}
|
||||
|
||||
return $this->tokens[$series];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function updateToken(string $series, #[\SensitiveParameter] string $tokenValue, \DateTime $lastUsed)
|
||||
{
|
||||
if (!isset($this->tokens[$series])) {
|
||||
throw new TokenNotFoundException('No token found.');
|
||||
}
|
||||
|
||||
$token = new PersistentToken(
|
||||
$this->tokens[$series]->getClass(),
|
||||
$this->tokens[$series]->getUserIdentifier(),
|
||||
$series,
|
||||
$tokenValue,
|
||||
$lastUsed
|
||||
);
|
||||
$this->tokens[$series] = $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function deleteTokenBySeries(string $series)
|
||||
{
|
||||
unset($this->tokens[$series]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function createNewToken(PersistentTokenInterface $token)
|
||||
{
|
||||
$this->tokens[$token->getSeries()] = $token;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\RememberMe;
|
||||
|
||||
/**
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class PersistentToken implements PersistentTokenInterface
|
||||
{
|
||||
private string $class;
|
||||
private string $userIdentifier;
|
||||
private string $series;
|
||||
private string $tokenValue;
|
||||
private \DateTime $lastUsed;
|
||||
|
||||
public function __construct(string $class, string $userIdentifier, string $series, #[\SensitiveParameter] string $tokenValue, \DateTime $lastUsed)
|
||||
{
|
||||
if (empty($class)) {
|
||||
throw new \InvalidArgumentException('$class must not be empty.');
|
||||
}
|
||||
if ('' === $userIdentifier) {
|
||||
throw new \InvalidArgumentException('$userIdentifier must not be empty.');
|
||||
}
|
||||
if (empty($series)) {
|
||||
throw new \InvalidArgumentException('$series must not be empty.');
|
||||
}
|
||||
if (empty($tokenValue)) {
|
||||
throw new \InvalidArgumentException('$tokenValue must not be empty.');
|
||||
}
|
||||
|
||||
$this->class = $class;
|
||||
$this->userIdentifier = $userIdentifier;
|
||||
$this->series = $series;
|
||||
$this->tokenValue = $tokenValue;
|
||||
$this->lastUsed = $lastUsed;
|
||||
}
|
||||
|
||||
public function getClass(): string
|
||||
{
|
||||
return $this->class;
|
||||
}
|
||||
|
||||
public function getUserIdentifier(): string
|
||||
{
|
||||
return $this->userIdentifier;
|
||||
}
|
||||
|
||||
public function getSeries(): string
|
||||
{
|
||||
return $this->series;
|
||||
}
|
||||
|
||||
public function getTokenValue(): string
|
||||
{
|
||||
return $this->tokenValue;
|
||||
}
|
||||
|
||||
public function getLastUsed(): \DateTime
|
||||
{
|
||||
return $this->lastUsed;
|
||||
}
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\RememberMe;
|
||||
|
||||
/**
|
||||
* Interface to be implemented by persistent token classes (such as
|
||||
* Doctrine entities representing a remember-me token).
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
interface PersistentTokenInterface
|
||||
{
|
||||
/**
|
||||
* Returns the class of the user.
|
||||
*/
|
||||
public function getClass(): string;
|
||||
|
||||
/**
|
||||
* Returns the series.
|
||||
*/
|
||||
public function getSeries(): string;
|
||||
|
||||
/**
|
||||
* Returns the token value.
|
||||
*/
|
||||
public function getTokenValue(): string;
|
||||
|
||||
/**
|
||||
* Returns the time the token was last used.
|
||||
*/
|
||||
public function getLastUsed(): \DateTime;
|
||||
|
||||
/**
|
||||
* Returns the identifier used to authenticate (e.g. their email address or username).
|
||||
*/
|
||||
public function getUserIdentifier(): string;
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\RememberMe;
|
||||
|
||||
use Symfony\Component\Security\Core\Exception\TokenNotFoundException;
|
||||
|
||||
/**
|
||||
* Interface for TokenProviders.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
interface TokenProviderInterface
|
||||
{
|
||||
/**
|
||||
* Loads the active token for the given series.
|
||||
*
|
||||
* @return PersistentTokenInterface
|
||||
*
|
||||
* @throws TokenNotFoundException if the token is not found
|
||||
*/
|
||||
public function loadTokenBySeries(string $series);
|
||||
|
||||
/**
|
||||
* Deletes all tokens belonging to series.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function deleteTokenBySeries(string $series);
|
||||
|
||||
/**
|
||||
* Updates the token according to this data.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws TokenNotFoundException if the token is not found
|
||||
*/
|
||||
public function updateToken(string $series, #[\SensitiveParameter] string $tokenValue, \DateTime $lastUsed);
|
||||
|
||||
/**
|
||||
* Creates a new token.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function createNewToken(PersistentTokenInterface $token);
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\RememberMe;
|
||||
|
||||
/**
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
*/
|
||||
interface TokenVerifierInterface
|
||||
{
|
||||
/**
|
||||
* Verifies that the given $token is valid.
|
||||
*
|
||||
* This lets you override the token check logic to for example accept slightly outdated tokens.
|
||||
*
|
||||
* Do not forget to implement token comparisons using hash_equals for a secure implementation.
|
||||
*/
|
||||
public function verifyToken(PersistentTokenInterface $token, #[\SensitiveParameter] string $tokenValue): bool;
|
||||
|
||||
/**
|
||||
* Updates an existing token with a new token value and lastUsed time.
|
||||
*/
|
||||
public function updateExistingToken(PersistentTokenInterface $token, #[\SensitiveParameter] string $tokenValue, \DateTimeInterface $lastUsed): void;
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token;
|
||||
|
||||
use Symfony\Component\Security\Core\User\InMemoryUser;
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
/**
|
||||
* Base class for Token instances.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
abstract class AbstractToken implements TokenInterface, \Serializable
|
||||
{
|
||||
private ?UserInterface $user = null;
|
||||
private array $roleNames = [];
|
||||
private array $attributes = [];
|
||||
|
||||
/**
|
||||
* @param string[] $roles An array of roles
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __construct(array $roles = [])
|
||||
{
|
||||
foreach ($roles as $role) {
|
||||
$this->roleNames[] = $role;
|
||||
}
|
||||
}
|
||||
|
||||
public function getRoleNames(): array
|
||||
{
|
||||
return $this->roleNames;
|
||||
}
|
||||
|
||||
public function getUserIdentifier(): string
|
||||
{
|
||||
return $this->user ? $this->user->getUserIdentifier() : '';
|
||||
}
|
||||
|
||||
public function getUser(): ?UserInterface
|
||||
{
|
||||
return $this->user;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setUser(UserInterface $user)
|
||||
{
|
||||
$this->user = $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function eraseCredentials()
|
||||
{
|
||||
if ($this->getUser() instanceof UserInterface) {
|
||||
$this->getUser()->eraseCredentials();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all the necessary state of the object for serialization purposes.
|
||||
*
|
||||
* There is no need to serialize any entry, they should be returned as-is.
|
||||
* If you extend this method, keep in mind you MUST guarantee parent data is present in the state.
|
||||
* Here is an example of how to extend this method:
|
||||
* <code>
|
||||
* public function __serialize(): array
|
||||
* {
|
||||
* return [$this->childAttribute, parent::__serialize()];
|
||||
* }
|
||||
* </code>
|
||||
*
|
||||
* @see __unserialize()
|
||||
*/
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [$this->user, true, null, $this->attributes, $this->roleNames];
|
||||
}
|
||||
|
||||
/**
|
||||
* Restores the object state from an array given by __serialize().
|
||||
*
|
||||
* There is no need to unserialize any entry in $data, they are already ready-to-use.
|
||||
* If you extend this method, keep in mind you MUST pass the parent data to its respective class.
|
||||
* Here is an example of how to extend this method:
|
||||
* <code>
|
||||
* public function __unserialize(array $data): void
|
||||
* {
|
||||
* [$this->childAttribute, $parentData] = $data;
|
||||
* parent::__unserialize($parentData);
|
||||
* }
|
||||
* </code>
|
||||
*
|
||||
* @see __serialize()
|
||||
*/
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[$user, , , $this->attributes, $this->roleNames] = $data;
|
||||
$this->user = \is_string($user) ? new InMemoryUser($user, '', $this->roleNames, false) : $user;
|
||||
}
|
||||
|
||||
public function getAttributes(): array
|
||||
{
|
||||
return $this->attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setAttributes(array $attributes)
|
||||
{
|
||||
$this->attributes = $attributes;
|
||||
}
|
||||
|
||||
public function hasAttribute(string $name): bool
|
||||
{
|
||||
return \array_key_exists($name, $this->attributes);
|
||||
}
|
||||
|
||||
public function getAttribute(string $name): mixed
|
||||
{
|
||||
if (!\array_key_exists($name, $this->attributes)) {
|
||||
throw new \InvalidArgumentException(sprintf('This token has no "%s" attribute.', $name));
|
||||
}
|
||||
|
||||
return $this->attributes[$name];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setAttribute(string $name, mixed $value)
|
||||
{
|
||||
$this->attributes[$name] = $value;
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
$class = static::class;
|
||||
$class = substr($class, strrpos($class, '\\') + 1);
|
||||
|
||||
$roles = [];
|
||||
foreach ($this->roleNames as $role) {
|
||||
$roles[] = $role;
|
||||
}
|
||||
|
||||
return sprintf('%s(user="%s", roles="%s")', $class, $this->getUserIdentifier(), implode(', ', $roles));
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final public function serialize(): string
|
||||
{
|
||||
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final public function unserialize(string $serialized): void
|
||||
{
|
||||
$this->__unserialize(unserialize($serialized));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
/**
|
||||
* @author Wouter de Jong <wouter@wouterj.nl>
|
||||
*/
|
||||
class NullToken implements TokenInterface
|
||||
{
|
||||
public function __toString(): string
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
public function getRoleNames(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function getUser(): ?UserInterface
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return never
|
||||
*/
|
||||
public function setUser(UserInterface $user)
|
||||
{
|
||||
throw new \BadMethodCallException('Cannot set user on a NullToken.');
|
||||
}
|
||||
|
||||
public function getUserIdentifier(): string
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function eraseCredentials()
|
||||
{
|
||||
}
|
||||
|
||||
public function getAttributes(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return never
|
||||
*/
|
||||
public function setAttributes(array $attributes)
|
||||
{
|
||||
throw new \BadMethodCallException('Cannot set attributes of NullToken.');
|
||||
}
|
||||
|
||||
public function hasAttribute(string $name): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getAttribute(string $name): mixed
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return never
|
||||
*/
|
||||
public function setAttribute(string $name, mixed $value)
|
||||
{
|
||||
throw new \BadMethodCallException('Cannot add attribute to NullToken.');
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
/**
|
||||
* PreAuthenticatedToken implements a pre-authenticated token.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class PreAuthenticatedToken extends AbstractToken
|
||||
{
|
||||
private string $firewallName;
|
||||
|
||||
/**
|
||||
* @param string[] $roles
|
||||
*/
|
||||
public function __construct(UserInterface $user, string $firewallName, array $roles = [])
|
||||
{
|
||||
parent::__construct($roles);
|
||||
|
||||
if ('' === $firewallName) {
|
||||
throw new \InvalidArgumentException('$firewallName must not be empty.');
|
||||
}
|
||||
|
||||
$this->setUser($user);
|
||||
$this->firewallName = $firewallName;
|
||||
}
|
||||
|
||||
public function getFirewallName(): string
|
||||
{
|
||||
return $this->firewallName;
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [null, $this->firewallName, parent::__serialize()];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[, $this->firewallName, $parentData] = $data;
|
||||
$parentData = \is_array($parentData) ? $parentData : unserialize($parentData);
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
/**
|
||||
* Authentication Token for "Remember-Me".
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
class RememberMeToken extends AbstractToken
|
||||
{
|
||||
private string $secret;
|
||||
private string $firewallName;
|
||||
|
||||
/**
|
||||
* @param string $secret A secret used to make sure the token is created by the app and not by a malicious client
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __construct(UserInterface $user, string $firewallName, #[\SensitiveParameter] string $secret)
|
||||
{
|
||||
parent::__construct($user->getRoles());
|
||||
|
||||
if (empty($secret)) {
|
||||
throw new \InvalidArgumentException('$secret must not be empty.');
|
||||
}
|
||||
|
||||
if ('' === $firewallName) {
|
||||
throw new \InvalidArgumentException('$firewallName must not be empty.');
|
||||
}
|
||||
|
||||
$this->firewallName = $firewallName;
|
||||
$this->secret = $secret;
|
||||
|
||||
$this->setUser($user);
|
||||
}
|
||||
|
||||
public function getFirewallName(): string
|
||||
{
|
||||
return $this->firewallName;
|
||||
}
|
||||
|
||||
public function getSecret(): string
|
||||
{
|
||||
return $this->secret;
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [$this->secret, $this->firewallName, parent::__serialize()];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[$this->secret, $this->firewallName, $parentData] = $data;
|
||||
$parentData = \is_array($parentData) ? $parentData : unserialize($parentData);
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token\Storage;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Contracts\Service\ResetInterface;
|
||||
|
||||
/**
|
||||
* TokenStorage contains a TokenInterface.
|
||||
*
|
||||
* It gives access to the token representing the current user authentication.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
class TokenStorage implements TokenStorageInterface, ResetInterface
|
||||
{
|
||||
private ?TokenInterface $token = null;
|
||||
private ?\Closure $initializer = null;
|
||||
|
||||
public function getToken(): ?TokenInterface
|
||||
{
|
||||
if ($initializer = $this->initializer) {
|
||||
$this->initializer = null;
|
||||
$initializer();
|
||||
}
|
||||
|
||||
return $this->token;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setToken(?TokenInterface $token = null)
|
||||
{
|
||||
if (1 > \func_num_args()) {
|
||||
trigger_deprecation('symfony/security-core', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
|
||||
}
|
||||
|
||||
if ($token) {
|
||||
// ensure any initializer is called
|
||||
$this->getToken();
|
||||
}
|
||||
|
||||
$this->initializer = null;
|
||||
$this->token = $token;
|
||||
}
|
||||
|
||||
public function setInitializer(?callable $initializer): void
|
||||
{
|
||||
$this->initializer = null === $initializer ? null : $initializer(...);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
$this->setToken(null);
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token\Storage;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* The TokenStorageInterface.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
interface TokenStorageInterface
|
||||
{
|
||||
/**
|
||||
* Returns the current security token.
|
||||
*/
|
||||
public function getToken(): ?TokenInterface;
|
||||
|
||||
/**
|
||||
* Sets the authentication token.
|
||||
*
|
||||
* @param TokenInterface|null $token A TokenInterface token, or null if no further authentication information should be stored
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setToken(?TokenInterface $token);
|
||||
}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token\Storage;
|
||||
|
||||
use Psr\Container\ContainerInterface;
|
||||
use Symfony\Component\HttpFoundation\RequestStack;
|
||||
use Symfony\Component\HttpFoundation\Session\SessionInterface;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Contracts\Service\ServiceSubscriberInterface;
|
||||
|
||||
/**
|
||||
* A token storage that increments the session usage index when the token is accessed.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
final class UsageTrackingTokenStorage implements TokenStorageInterface, ServiceSubscriberInterface
|
||||
{
|
||||
private TokenStorageInterface $storage;
|
||||
private ContainerInterface $container;
|
||||
private bool $enableUsageTracking = false;
|
||||
|
||||
public function __construct(TokenStorageInterface $storage, ContainerInterface $container)
|
||||
{
|
||||
$this->storage = $storage;
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
public function getToken(): ?TokenInterface
|
||||
{
|
||||
if ($this->shouldTrackUsage()) {
|
||||
// increments the internal session usage index
|
||||
$this->getSession()->getMetadataBag();
|
||||
}
|
||||
|
||||
return $this->storage->getToken();
|
||||
}
|
||||
|
||||
public function setToken(?TokenInterface $token = null): void
|
||||
{
|
||||
$this->storage->setToken($token);
|
||||
|
||||
if ($token && $this->shouldTrackUsage()) {
|
||||
// increments the internal session usage index
|
||||
$this->getSession()->getMetadataBag();
|
||||
}
|
||||
}
|
||||
|
||||
public function enableUsageTracking(): void
|
||||
{
|
||||
$this->enableUsageTracking = true;
|
||||
}
|
||||
|
||||
public function disableUsageTracking(): void
|
||||
{
|
||||
$this->enableUsageTracking = false;
|
||||
}
|
||||
|
||||
public static function getSubscribedServices(): array
|
||||
{
|
||||
return [
|
||||
'request_stack' => RequestStack::class,
|
||||
];
|
||||
}
|
||||
|
||||
private function getSession(): SessionInterface
|
||||
{
|
||||
return $this->container->get('request_stack')->getSession();
|
||||
}
|
||||
|
||||
private function shouldTrackUsage(): bool
|
||||
{
|
||||
return $this->enableUsageTracking && $this->container->get('request_stack')->getMainRequest();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
/**
|
||||
* Token representing a user who temporarily impersonates another one.
|
||||
*
|
||||
* @author Christian Flothmann <christian.flothmann@sensiolabs.de>
|
||||
*/
|
||||
class SwitchUserToken extends UsernamePasswordToken
|
||||
{
|
||||
private TokenInterface $originalToken;
|
||||
private ?string $originatedFromUri = null;
|
||||
|
||||
/**
|
||||
* @param $user The username (like a nickname, email address, etc.), or a UserInterface instance or an object implementing a __toString method
|
||||
* @param $originatedFromUri The URI where was the user at the switch
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __construct(UserInterface $user, string $firewallName, array $roles, TokenInterface $originalToken, ?string $originatedFromUri = null)
|
||||
{
|
||||
parent::__construct($user, $firewallName, $roles);
|
||||
|
||||
$this->originalToken = $originalToken;
|
||||
$this->originatedFromUri = $originatedFromUri;
|
||||
}
|
||||
|
||||
public function getOriginalToken(): TokenInterface
|
||||
{
|
||||
return $this->originalToken;
|
||||
}
|
||||
|
||||
public function getOriginatedFromUri(): ?string
|
||||
{
|
||||
return $this->originatedFromUri;
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [$this->originalToken, $this->originatedFromUri, parent::__serialize()];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
if (3 > \count($data)) {
|
||||
// Support for tokens serialized with version 5.1 or lower of symfony/security-core.
|
||||
[$this->originalToken, $parentData] = $data;
|
||||
} else {
|
||||
[$this->originalToken, $this->originatedFromUri, $parentData] = $data;
|
||||
}
|
||||
$parentData = \is_array($parentData) ? $parentData : unserialize($parentData);
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
/**
|
||||
* TokenInterface is the interface for the user authentication information.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
interface TokenInterface
|
||||
{
|
||||
/**
|
||||
* Returns a string representation of the Token.
|
||||
*
|
||||
* This is only to be used for debugging purposes.
|
||||
*/
|
||||
public function __toString(): string;
|
||||
|
||||
/**
|
||||
* Returns the user identifier used during authentication (e.g. a user's email address or username).
|
||||
*/
|
||||
public function getUserIdentifier(): string;
|
||||
|
||||
/**
|
||||
* Returns the user roles.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
public function getRoleNames(): array;
|
||||
|
||||
/**
|
||||
* Returns a user representation.
|
||||
*
|
||||
* @see AbstractToken::setUser()
|
||||
*/
|
||||
public function getUser(): ?UserInterface;
|
||||
|
||||
/**
|
||||
* Sets the authenticated user in the token.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function setUser(UserInterface $user);
|
||||
|
||||
/**
|
||||
* Removes sensitive information from the token.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function eraseCredentials();
|
||||
|
||||
public function getAttributes(): array;
|
||||
|
||||
/**
|
||||
* @param array $attributes The token attributes
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setAttributes(array $attributes);
|
||||
|
||||
public function hasAttribute(string $name): bool;
|
||||
|
||||
/**
|
||||
* @throws \InvalidArgumentException When attribute doesn't exist for this token
|
||||
*/
|
||||
public function getAttribute(string $name): mixed;
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setAttribute(string $name, mixed $value);
|
||||
|
||||
/**
|
||||
* Returns all the necessary state of the object for serialization purposes.
|
||||
*/
|
||||
public function __serialize(): array;
|
||||
|
||||
/**
|
||||
* Restores the object state from an array given by __serialize().
|
||||
*/
|
||||
public function __unserialize(array $data): void;
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Token;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
/**
|
||||
* UsernamePasswordToken implements a username and password token.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class UsernamePasswordToken extends AbstractToken
|
||||
{
|
||||
private string $firewallName;
|
||||
|
||||
public function __construct(UserInterface $user, string $firewallName, array $roles = [])
|
||||
{
|
||||
parent::__construct($roles);
|
||||
|
||||
if ('' === $firewallName) {
|
||||
throw new \InvalidArgumentException('$firewallName must not be empty.');
|
||||
}
|
||||
|
||||
$this->setUser($user);
|
||||
$this->firewallName = $firewallName;
|
||||
}
|
||||
|
||||
public function getFirewallName(): string
|
||||
{
|
||||
return $this->firewallName;
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [null, $this->firewallName, parent::__serialize()];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[, $this->firewallName, $parentData] = $data;
|
||||
$parentData = \is_array($parentData) ? $parentData : unserialize($parentData);
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core;
|
||||
|
||||
use Symfony\Component\Security\Core\Event\AuthenticationSuccessEvent;
|
||||
|
||||
final class AuthenticationEvents
|
||||
{
|
||||
/**
|
||||
* The AUTHENTICATION_SUCCESS event occurs after a user is authenticated
|
||||
* by one provider.
|
||||
*
|
||||
* @Event("Symfony\Component\Security\Core\Event\AuthenticationSuccessEvent")
|
||||
*/
|
||||
public const AUTHENTICATION_SUCCESS = 'security.authentication.success';
|
||||
|
||||
/**
|
||||
* Event aliases.
|
||||
*
|
||||
* These aliases can be consumed by RegisterListenersPass.
|
||||
*/
|
||||
public const ALIASES = [
|
||||
AuthenticationSuccessEvent::class => self::AUTHENTICATION_SUCCESS,
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Component\Security\Core\Authorization\Strategy\AccessDecisionStrategyInterface;
|
||||
use Symfony\Component\Security\Core\Authorization\Strategy\AffirmativeStrategy;
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\CacheableVoterInterface;
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
|
||||
use Symfony\Component\Security\Core\Exception\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* AccessDecisionManager is the base class for all access decision managers
|
||||
* that use decision voters.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
final class AccessDecisionManager implements AccessDecisionManagerInterface
|
||||
{
|
||||
private const VALID_VOTES = [
|
||||
VoterInterface::ACCESS_GRANTED => true,
|
||||
VoterInterface::ACCESS_DENIED => true,
|
||||
VoterInterface::ACCESS_ABSTAIN => true,
|
||||
];
|
||||
|
||||
private iterable $voters;
|
||||
private array $votersCacheAttributes = [];
|
||||
private array $votersCacheObject = [];
|
||||
private AccessDecisionStrategyInterface $strategy;
|
||||
|
||||
/**
|
||||
* @param iterable<mixed, VoterInterface> $voters An array or an iterator of VoterInterface instances
|
||||
*/
|
||||
public function __construct(iterable $voters = [], ?AccessDecisionStrategyInterface $strategy = null)
|
||||
{
|
||||
$this->voters = $voters;
|
||||
$this->strategy = $strategy ?? new AffirmativeStrategy();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $allowMultipleAttributes Whether to allow passing multiple values to the $attributes array
|
||||
*/
|
||||
public function decide(TokenInterface $token, array $attributes, mixed $object = null, bool $allowMultipleAttributes = false): bool
|
||||
{
|
||||
// Special case for AccessListener, do not remove the right side of the condition before 6.0
|
||||
if (\count($attributes) > 1 && !$allowMultipleAttributes) {
|
||||
throw new InvalidArgumentException(sprintf('Passing more than one Security attribute to "%s()" is not supported.', __METHOD__));
|
||||
}
|
||||
|
||||
return $this->strategy->decide(
|
||||
$this->collectResults($token, $attributes, $object)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Traversable<int, int>
|
||||
*/
|
||||
private function collectResults(TokenInterface $token, array $attributes, mixed $object): \Traversable
|
||||
{
|
||||
foreach ($this->getVoters($attributes, $object) as $voter) {
|
||||
$result = $voter->vote($token, $object, $attributes);
|
||||
if (!\is_int($result) || !(self::VALID_VOTES[$result] ?? false)) {
|
||||
throw new \LogicException(sprintf('"%s::vote()" must return one of "%s" constants ("ACCESS_GRANTED", "ACCESS_DENIED" or "ACCESS_ABSTAIN"), "%s" returned.', get_debug_type($voter), VoterInterface::class, var_export($result, true)));
|
||||
}
|
||||
|
||||
yield $result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return iterable<mixed, VoterInterface>
|
||||
*/
|
||||
private function getVoters(array $attributes, $object = null): iterable
|
||||
{
|
||||
$keyAttributes = [];
|
||||
foreach ($attributes as $attribute) {
|
||||
$keyAttributes[] = \is_string($attribute) ? $attribute : null;
|
||||
}
|
||||
// use `get_class` to handle anonymous classes
|
||||
$keyObject = \is_object($object) ? $object::class : get_debug_type($object);
|
||||
foreach ($this->voters as $key => $voter) {
|
||||
if (!$voter instanceof CacheableVoterInterface) {
|
||||
yield $voter;
|
||||
continue;
|
||||
}
|
||||
|
||||
$supports = true;
|
||||
// The voter supports the attributes if it supports at least one attribute of the list
|
||||
foreach ($keyAttributes as $keyAttribute) {
|
||||
if (null === $keyAttribute) {
|
||||
$supports = true;
|
||||
} elseif (!isset($this->votersCacheAttributes[$keyAttribute][$key])) {
|
||||
$this->votersCacheAttributes[$keyAttribute][$key] = $supports = $voter->supportsAttribute($keyAttribute);
|
||||
} else {
|
||||
$supports = $this->votersCacheAttributes[$keyAttribute][$key];
|
||||
}
|
||||
if ($supports) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$supports) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($this->votersCacheObject[$keyObject][$key])) {
|
||||
$this->votersCacheObject[$keyObject][$key] = $supports = $voter->supportsType($keyObject);
|
||||
} else {
|
||||
$supports = $this->votersCacheObject[$keyObject][$key];
|
||||
}
|
||||
if (!$supports) {
|
||||
continue;
|
||||
}
|
||||
yield $voter;
|
||||
}
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* AccessDecisionManagerInterface makes authorization decisions.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
interface AccessDecisionManagerInterface
|
||||
{
|
||||
/**
|
||||
* Decides whether the access is possible or not.
|
||||
*
|
||||
* @param array $attributes An array of attributes associated with the method being invoked
|
||||
* @param mixed $object The object to secure
|
||||
*/
|
||||
public function decide(TokenInterface $token, array $attributes, mixed $object = null): bool;
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\NullToken;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||
|
||||
/**
|
||||
* AuthorizationChecker is the main authorization point of the Security component.
|
||||
*
|
||||
* It gives access to the token representing the current user authentication.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
class AuthorizationChecker implements AuthorizationCheckerInterface
|
||||
{
|
||||
private TokenStorageInterface $tokenStorage;
|
||||
private AccessDecisionManagerInterface $accessDecisionManager;
|
||||
|
||||
public function __construct(TokenStorageInterface $tokenStorage, AccessDecisionManagerInterface $accessDecisionManager, bool $exceptionOnNoToken = false)
|
||||
{
|
||||
if ($exceptionOnNoToken) {
|
||||
throw new \LogicException(sprintf('Argument $exceptionOnNoToken of "%s()" must be set to "false".', __METHOD__));
|
||||
}
|
||||
|
||||
$this->tokenStorage = $tokenStorage;
|
||||
$this->accessDecisionManager = $accessDecisionManager;
|
||||
}
|
||||
|
||||
final public function isGranted(mixed $attribute, mixed $subject = null): bool
|
||||
{
|
||||
$token = $this->tokenStorage->getToken();
|
||||
|
||||
if (!$token || !$token->getUser()) {
|
||||
$token = new NullToken();
|
||||
}
|
||||
|
||||
return $this->accessDecisionManager->decide($token, [$attribute], $subject);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization;
|
||||
|
||||
/**
|
||||
* The AuthorizationCheckerInterface.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
interface AuthorizationCheckerInterface
|
||||
{
|
||||
/**
|
||||
* Checks if the attribute is granted against the current authentication token and optionally supplied subject.
|
||||
*
|
||||
* @param mixed $attribute A single attribute to vote on (can be of any type, string and instance of Expression are supported by the core)
|
||||
*/
|
||||
public function isGranted(mixed $attribute, mixed $subject = null): bool;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization;
|
||||
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;
|
||||
|
||||
if (!class_exists(BaseExpressionLanguage::class)) {
|
||||
throw new \LogicException(sprintf('The "%s" class requires the "ExpressionLanguage" component. Try running "composer require symfony/expression-language".', ExpressionLanguage::class));
|
||||
} else {
|
||||
// Help opcache.preload discover always-needed symbols
|
||||
class_exists(ExpressionLanguageProvider::class);
|
||||
|
||||
/**
|
||||
* Adds some function to the default ExpressionLanguage.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* @see ExpressionLanguageProvider
|
||||
*/
|
||||
class ExpressionLanguage extends BaseExpressionLanguage
|
||||
{
|
||||
public function __construct(?CacheItemPoolInterface $cache = null, array $providers = [])
|
||||
{
|
||||
// prepend the default provider to let users override it easily
|
||||
array_unshift($providers, new ExpressionLanguageProvider());
|
||||
|
||||
parent::__construct($cache, $providers);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization;
|
||||
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
|
||||
|
||||
/**
|
||||
* Define some ExpressionLanguage functions.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface
|
||||
{
|
||||
public function getFunctions(): array
|
||||
{
|
||||
return [
|
||||
new ExpressionFunction('is_authenticated', fn () => '$auth_checker->isGranted("IS_AUTHENTICATED")', fn (array $variables) => $variables['auth_checker']->isGranted('IS_AUTHENTICATED')),
|
||||
|
||||
new ExpressionFunction('is_fully_authenticated', fn () => '$token && $auth_checker->isGranted("IS_AUTHENTICATED_FULLY")', fn (array $variables) => $variables['token'] && $variables['auth_checker']->isGranted('IS_AUTHENTICATED_FULLY')),
|
||||
|
||||
new ExpressionFunction('is_granted', fn ($attributes, $object = 'null') => sprintf('$auth_checker->isGranted(%s, %s)', $attributes, $object), fn (array $variables, $attributes, $object = null) => $variables['auth_checker']->isGranted($attributes, $object)),
|
||||
|
||||
new ExpressionFunction('is_remember_me', fn () => '$token && $auth_checker->isGranted("IS_REMEMBERED")', fn (array $variables) => $variables['token'] && $variables['auth_checker']->isGranted('IS_REMEMBERED')),
|
||||
];
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Strategy;
|
||||
|
||||
/**
|
||||
* A strategy for turning a stream of votes into a final decision.
|
||||
*
|
||||
* @author Alexander M. Turek <me@derrabus.de>
|
||||
*/
|
||||
interface AccessDecisionStrategyInterface
|
||||
{
|
||||
/**
|
||||
* @param \Traversable<int> $results
|
||||
*/
|
||||
public function decide(\Traversable $results): bool;
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Strategy;
|
||||
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
|
||||
|
||||
/**
|
||||
* Grants access if any voter returns an affirmative response.
|
||||
*
|
||||
* If all voters abstained from voting, the decision will be based on the
|
||||
* allowIfAllAbstainDecisions property value (defaults to false).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander M. Turek <me@derrabus.de>
|
||||
*/
|
||||
final class AffirmativeStrategy implements AccessDecisionStrategyInterface, \Stringable
|
||||
{
|
||||
private bool $allowIfAllAbstainDecisions;
|
||||
|
||||
public function __construct(bool $allowIfAllAbstainDecisions = false)
|
||||
{
|
||||
$this->allowIfAllAbstainDecisions = $allowIfAllAbstainDecisions;
|
||||
}
|
||||
|
||||
public function decide(\Traversable $results): bool
|
||||
{
|
||||
$deny = 0;
|
||||
foreach ($results as $result) {
|
||||
if (VoterInterface::ACCESS_GRANTED === $result) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (VoterInterface::ACCESS_DENIED === $result) {
|
||||
++$deny;
|
||||
}
|
||||
}
|
||||
|
||||
if ($deny > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $this->allowIfAllAbstainDecisions;
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return 'affirmative';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Strategy;
|
||||
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
|
||||
|
||||
/**
|
||||
* Grants access if there is consensus of granted against denied responses.
|
||||
*
|
||||
* Consensus means majority-rule (ignoring abstains) rather than unanimous
|
||||
* agreement (ignoring abstains). If you require unanimity, see
|
||||
* UnanimousBased.
|
||||
*
|
||||
* If there were an equal number of grant and deny votes, the decision will
|
||||
* be based on the allowIfEqualGrantedDeniedDecisions property value
|
||||
* (defaults to true).
|
||||
*
|
||||
* If all voters abstained from voting, the decision will be based on the
|
||||
* allowIfAllAbstainDecisions property value (defaults to false).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander M. Turek <me@derrabus.de>
|
||||
*/
|
||||
final class ConsensusStrategy implements AccessDecisionStrategyInterface, \Stringable
|
||||
{
|
||||
private bool $allowIfAllAbstainDecisions;
|
||||
private bool $allowIfEqualGrantedDeniedDecisions;
|
||||
|
||||
public function __construct(bool $allowIfAllAbstainDecisions = false, bool $allowIfEqualGrantedDeniedDecisions = true)
|
||||
{
|
||||
$this->allowIfAllAbstainDecisions = $allowIfAllAbstainDecisions;
|
||||
$this->allowIfEqualGrantedDeniedDecisions = $allowIfEqualGrantedDeniedDecisions;
|
||||
}
|
||||
|
||||
public function decide(\Traversable $results): bool
|
||||
{
|
||||
$grant = 0;
|
||||
$deny = 0;
|
||||
foreach ($results as $result) {
|
||||
if (VoterInterface::ACCESS_GRANTED === $result) {
|
||||
++$grant;
|
||||
} elseif (VoterInterface::ACCESS_DENIED === $result) {
|
||||
++$deny;
|
||||
}
|
||||
}
|
||||
|
||||
if ($grant > $deny) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($deny > $grant) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($grant > 0) {
|
||||
return $this->allowIfEqualGrantedDeniedDecisions;
|
||||
}
|
||||
|
||||
return $this->allowIfAllAbstainDecisions;
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return 'consensus';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Strategy;
|
||||
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
|
||||
|
||||
/**
|
||||
* Grant or deny access depending on the first voter that does not abstain.
|
||||
* The priority of voters can be used to overrule a decision.
|
||||
*
|
||||
* If all voters abstained from voting, the decision will be based on the
|
||||
* allowIfAllAbstainDecisions property value (defaults to false).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander M. Turek <me@derrabus.de>
|
||||
*/
|
||||
final class PriorityStrategy implements AccessDecisionStrategyInterface, \Stringable
|
||||
{
|
||||
private bool $allowIfAllAbstainDecisions;
|
||||
|
||||
public function __construct(bool $allowIfAllAbstainDecisions = false)
|
||||
{
|
||||
$this->allowIfAllAbstainDecisions = $allowIfAllAbstainDecisions;
|
||||
}
|
||||
|
||||
public function decide(\Traversable $results): bool
|
||||
{
|
||||
foreach ($results as $result) {
|
||||
if (VoterInterface::ACCESS_GRANTED === $result) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (VoterInterface::ACCESS_DENIED === $result) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->allowIfAllAbstainDecisions;
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return 'priority';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Strategy;
|
||||
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
|
||||
|
||||
/**
|
||||
* Grants access if only grant (or abstain) votes were received.
|
||||
*
|
||||
* If all voters abstained from voting, the decision will be based on the
|
||||
* allowIfAllAbstainDecisions property value (defaults to false).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander M. Turek <me@derrabus.de>
|
||||
*/
|
||||
final class UnanimousStrategy implements AccessDecisionStrategyInterface, \Stringable
|
||||
{
|
||||
private bool $allowIfAllAbstainDecisions;
|
||||
|
||||
public function __construct(bool $allowIfAllAbstainDecisions = false)
|
||||
{
|
||||
$this->allowIfAllAbstainDecisions = $allowIfAllAbstainDecisions;
|
||||
}
|
||||
|
||||
public function decide(\Traversable $results): bool
|
||||
{
|
||||
$grant = 0;
|
||||
foreach ($results as $result) {
|
||||
if (VoterInterface::ACCESS_DENIED === $result) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (VoterInterface::ACCESS_GRANTED === $result) {
|
||||
++$grant;
|
||||
}
|
||||
}
|
||||
|
||||
// no deny votes
|
||||
if ($grant > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return $this->allowIfAllAbstainDecisions;
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return 'unanimous';
|
||||
}
|
||||
}
|
||||
+109
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Component\Security\Core\Authorization\Strategy\AccessDecisionStrategyInterface;
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
|
||||
|
||||
/**
|
||||
* Decorates the original AccessDecisionManager class to log information
|
||||
* about the security voters and the decisions made by them.
|
||||
*
|
||||
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
class TraceableAccessDecisionManager implements AccessDecisionManagerInterface
|
||||
{
|
||||
private AccessDecisionManagerInterface $manager;
|
||||
private ?AccessDecisionStrategyInterface $strategy = null;
|
||||
/** @var iterable<mixed, VoterInterface> */
|
||||
private iterable $voters = [];
|
||||
private array $decisionLog = []; // All decision logs
|
||||
private array $currentLog = []; // Logs being filled in
|
||||
|
||||
public function __construct(AccessDecisionManagerInterface $manager)
|
||||
{
|
||||
$this->manager = $manager;
|
||||
|
||||
// The strategy and voters are stored in a private properties of the decorated service
|
||||
if (property_exists($manager, 'strategy')) {
|
||||
$reflection = new \ReflectionProperty($manager::class, 'strategy');
|
||||
$this->strategy = $reflection->getValue($manager);
|
||||
}
|
||||
if (property_exists($manager, 'voters')) {
|
||||
$reflection = new \ReflectionProperty($manager::class, 'voters');
|
||||
$this->voters = $reflection->getValue($manager);
|
||||
}
|
||||
}
|
||||
|
||||
public function decide(TokenInterface $token, array $attributes, mixed $object = null, bool $allowMultipleAttributes = false): bool
|
||||
{
|
||||
$currentDecisionLog = [
|
||||
'attributes' => $attributes,
|
||||
'object' => $object,
|
||||
'voterDetails' => [],
|
||||
];
|
||||
|
||||
$this->currentLog[] = &$currentDecisionLog;
|
||||
|
||||
$result = $this->manager->decide($token, $attributes, $object, $allowMultipleAttributes);
|
||||
|
||||
$currentDecisionLog['result'] = $result;
|
||||
|
||||
$this->decisionLog[] = array_pop($this->currentLog); // Using a stack since decide can be called by voters
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds voter vote and class to the voter details.
|
||||
*
|
||||
* @param array $attributes attributes used for the vote
|
||||
* @param int $vote vote of the voter
|
||||
*/
|
||||
public function addVoterVote(VoterInterface $voter, array $attributes, int $vote): void
|
||||
{
|
||||
$currentLogIndex = \count($this->currentLog) - 1;
|
||||
$this->currentLog[$currentLogIndex]['voterDetails'][] = [
|
||||
'voter' => $voter,
|
||||
'attributes' => $attributes,
|
||||
'vote' => $vote,
|
||||
];
|
||||
}
|
||||
|
||||
public function getStrategy(): string
|
||||
{
|
||||
if (null === $this->strategy) {
|
||||
return '-';
|
||||
}
|
||||
if (method_exists($this->strategy, '__toString')) {
|
||||
return (string) $this->strategy;
|
||||
}
|
||||
|
||||
return get_debug_type($this->strategy);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return iterable<mixed, VoterInterface>
|
||||
*/
|
||||
public function getVoters(): iterable
|
||||
{
|
||||
return $this->voters;
|
||||
}
|
||||
|
||||
public function getDecisionLog(): array
|
||||
{
|
||||
return $this->decisionLog;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Voter;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* AuthenticatedVoter votes if an attribute like IS_AUTHENTICATED_FULLY,
|
||||
* IS_AUTHENTICATED_REMEMBERED, IS_AUTHENTICATED is present.
|
||||
*
|
||||
* This list is most restrictive to least restrictive checking.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
class AuthenticatedVoter implements CacheableVoterInterface
|
||||
{
|
||||
public const IS_AUTHENTICATED_FULLY = 'IS_AUTHENTICATED_FULLY';
|
||||
public const IS_AUTHENTICATED_REMEMBERED = 'IS_AUTHENTICATED_REMEMBERED';
|
||||
public const IS_AUTHENTICATED = 'IS_AUTHENTICATED';
|
||||
public const IS_IMPERSONATOR = 'IS_IMPERSONATOR';
|
||||
public const IS_REMEMBERED = 'IS_REMEMBERED';
|
||||
public const PUBLIC_ACCESS = 'PUBLIC_ACCESS';
|
||||
|
||||
private AuthenticationTrustResolverInterface $authenticationTrustResolver;
|
||||
|
||||
public function __construct(AuthenticationTrustResolverInterface $authenticationTrustResolver)
|
||||
{
|
||||
$this->authenticationTrustResolver = $authenticationTrustResolver;
|
||||
}
|
||||
|
||||
public function vote(TokenInterface $token, mixed $subject, array $attributes): int
|
||||
{
|
||||
if ($attributes === [self::PUBLIC_ACCESS]) {
|
||||
return VoterInterface::ACCESS_GRANTED;
|
||||
}
|
||||
|
||||
$result = VoterInterface::ACCESS_ABSTAIN;
|
||||
foreach ($attributes as $attribute) {
|
||||
if (null === $attribute || (self::IS_AUTHENTICATED_FULLY !== $attribute
|
||||
&& self::IS_AUTHENTICATED_REMEMBERED !== $attribute
|
||||
&& self::IS_AUTHENTICATED !== $attribute
|
||||
&& self::IS_IMPERSONATOR !== $attribute
|
||||
&& self::IS_REMEMBERED !== $attribute)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$result = VoterInterface::ACCESS_DENIED;
|
||||
|
||||
if (self::IS_AUTHENTICATED_FULLY === $attribute
|
||||
&& $this->authenticationTrustResolver->isFullFledged($token)) {
|
||||
return VoterInterface::ACCESS_GRANTED;
|
||||
}
|
||||
|
||||
if (self::IS_AUTHENTICATED_REMEMBERED === $attribute
|
||||
&& ($this->authenticationTrustResolver->isRememberMe($token)
|
||||
|| $this->authenticationTrustResolver->isFullFledged($token))) {
|
||||
return VoterInterface::ACCESS_GRANTED;
|
||||
}
|
||||
|
||||
if (self::IS_AUTHENTICATED === $attribute && $this->authenticationTrustResolver->isAuthenticated($token)) {
|
||||
return VoterInterface::ACCESS_GRANTED;
|
||||
}
|
||||
|
||||
if (self::IS_REMEMBERED === $attribute && $this->authenticationTrustResolver->isRememberMe($token)) {
|
||||
return VoterInterface::ACCESS_GRANTED;
|
||||
}
|
||||
|
||||
if (self::IS_IMPERSONATOR === $attribute && $token instanceof SwitchUserToken) {
|
||||
return VoterInterface::ACCESS_GRANTED;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function supportsAttribute(string $attribute): bool
|
||||
{
|
||||
return \in_array($attribute, [
|
||||
self::IS_AUTHENTICATED_FULLY,
|
||||
self::IS_AUTHENTICATED_REMEMBERED,
|
||||
self::IS_AUTHENTICATED,
|
||||
self::IS_IMPERSONATOR,
|
||||
self::IS_REMEMBERED,
|
||||
self::PUBLIC_ACCESS,
|
||||
], true);
|
||||
}
|
||||
|
||||
public function supportsType(string $subjectType): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Voter;
|
||||
|
||||
/**
|
||||
* Let voters expose the attributes and types they care about.
|
||||
*
|
||||
* By returning false to either `supportsAttribute` or `supportsType`, the
|
||||
* voter will never be called for the specified attribute or subject.
|
||||
*
|
||||
* @author Jérémy Derussé <jeremy@derusse.com>
|
||||
*/
|
||||
interface CacheableVoterInterface extends VoterInterface
|
||||
{
|
||||
public function supportsAttribute(string $attribute): bool;
|
||||
|
||||
/**
|
||||
* @param string $subjectType The type of the subject inferred by `get_class` or `get_debug_type`
|
||||
*/
|
||||
public function supportsType(string $subjectType): bool;
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Voter;
|
||||
|
||||
use Symfony\Component\ExpressionLanguage\Expression;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
|
||||
use Symfony\Component\Security\Core\Authorization\ExpressionLanguage;
|
||||
use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
|
||||
|
||||
/**
|
||||
* ExpressionVoter votes based on the evaluation of an expression.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class ExpressionVoter implements CacheableVoterInterface
|
||||
{
|
||||
private ExpressionLanguage $expressionLanguage;
|
||||
private AuthenticationTrustResolverInterface $trustResolver;
|
||||
private AuthorizationCheckerInterface $authChecker;
|
||||
private ?RoleHierarchyInterface $roleHierarchy;
|
||||
|
||||
public function __construct(ExpressionLanguage $expressionLanguage, AuthenticationTrustResolverInterface $trustResolver, AuthorizationCheckerInterface $authChecker, ?RoleHierarchyInterface $roleHierarchy = null)
|
||||
{
|
||||
$this->expressionLanguage = $expressionLanguage;
|
||||
$this->trustResolver = $trustResolver;
|
||||
$this->authChecker = $authChecker;
|
||||
$this->roleHierarchy = $roleHierarchy;
|
||||
}
|
||||
|
||||
public function supportsAttribute(string $attribute): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function supportsType(string $subjectType): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function vote(TokenInterface $token, mixed $subject, array $attributes): int
|
||||
{
|
||||
$result = VoterInterface::ACCESS_ABSTAIN;
|
||||
$variables = null;
|
||||
foreach ($attributes as $attribute) {
|
||||
if (!$attribute instanceof Expression) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$variables ??= $this->getVariables($token, $subject);
|
||||
|
||||
$result = VoterInterface::ACCESS_DENIED;
|
||||
if ($this->expressionLanguage->evaluate($attribute, $variables)) {
|
||||
return VoterInterface::ACCESS_GRANTED;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function getVariables(TokenInterface $token, mixed $subject): array
|
||||
{
|
||||
$roleNames = $token->getRoleNames();
|
||||
|
||||
if (null !== $this->roleHierarchy) {
|
||||
$roleNames = $this->roleHierarchy->getReachableRoleNames($roleNames);
|
||||
}
|
||||
|
||||
$variables = [
|
||||
'token' => $token,
|
||||
'user' => $token->getUser(),
|
||||
'object' => $subject,
|
||||
'subject' => $subject,
|
||||
'role_names' => $roleNames,
|
||||
'trust_resolver' => $this->trustResolver,
|
||||
'auth_checker' => $this->authChecker,
|
||||
];
|
||||
|
||||
// this is mainly to propose a better experience when the expression is used
|
||||
// in an access control rule, as the developer does not know that it's going
|
||||
// to be handled by this voter
|
||||
if ($subject instanceof Request) {
|
||||
$variables['request'] = $subject;
|
||||
}
|
||||
|
||||
return $variables;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Voter;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
|
||||
|
||||
/**
|
||||
* RoleHierarchyVoter uses a RoleHierarchy to determine the roles granted to
|
||||
* the user before voting.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class RoleHierarchyVoter extends RoleVoter
|
||||
{
|
||||
private RoleHierarchyInterface $roleHierarchy;
|
||||
|
||||
public function __construct(RoleHierarchyInterface $roleHierarchy, string $prefix = 'ROLE_')
|
||||
{
|
||||
$this->roleHierarchy = $roleHierarchy;
|
||||
|
||||
parent::__construct($prefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function extractRoles(TokenInterface $token)
|
||||
{
|
||||
return $this->roleHierarchy->getReachableRoleNames($token->getRoleNames());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Voter;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* RoleVoter votes if any attribute starts with a given prefix.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class RoleVoter implements CacheableVoterInterface
|
||||
{
|
||||
private string $prefix;
|
||||
|
||||
public function __construct(string $prefix = 'ROLE_')
|
||||
{
|
||||
$this->prefix = $prefix;
|
||||
}
|
||||
|
||||
public function vote(TokenInterface $token, mixed $subject, array $attributes): int
|
||||
{
|
||||
$result = VoterInterface::ACCESS_ABSTAIN;
|
||||
$roles = $this->extractRoles($token);
|
||||
|
||||
foreach ($attributes as $attribute) {
|
||||
if (!\is_string($attribute) || !str_starts_with($attribute, $this->prefix)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$result = VoterInterface::ACCESS_DENIED;
|
||||
foreach ($roles as $role) {
|
||||
if ($attribute === $role) {
|
||||
return VoterInterface::ACCESS_GRANTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function supportsAttribute(string $attribute): bool
|
||||
{
|
||||
return str_starts_with($attribute, $this->prefix);
|
||||
}
|
||||
|
||||
public function supportsType(string $subjectType): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function extractRoles(TokenInterface $token)
|
||||
{
|
||||
return $token->getRoleNames();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Voter;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Component\Security\Core\Event\VoteEvent;
|
||||
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
|
||||
|
||||
/**
|
||||
* Decorates voter classes to send result events.
|
||||
*
|
||||
* @author Laurent VOULLEMIER <laurent.voullemier@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
class TraceableVoter implements CacheableVoterInterface
|
||||
{
|
||||
private VoterInterface $voter;
|
||||
private EventDispatcherInterface $eventDispatcher;
|
||||
|
||||
public function __construct(VoterInterface $voter, EventDispatcherInterface $eventDispatcher)
|
||||
{
|
||||
$this->voter = $voter;
|
||||
$this->eventDispatcher = $eventDispatcher;
|
||||
}
|
||||
|
||||
public function vote(TokenInterface $token, mixed $subject, array $attributes): int
|
||||
{
|
||||
$result = $this->voter->vote($token, $subject, $attributes);
|
||||
|
||||
$this->eventDispatcher->dispatch(new VoteEvent($this->voter, $subject, $attributes, $result), 'debug.security.authorization.vote');
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getDecoratedVoter(): VoterInterface
|
||||
{
|
||||
return $this->voter;
|
||||
}
|
||||
|
||||
public function supportsAttribute(string $attribute): bool
|
||||
{
|
||||
return !$this->voter instanceof CacheableVoterInterface || $this->voter->supportsAttribute($attribute);
|
||||
}
|
||||
|
||||
public function supportsType(string $subjectType): bool
|
||||
{
|
||||
return !$this->voter instanceof CacheableVoterInterface || $this->voter->supportsType($subjectType);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Voter;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* Voter is an abstract default implementation of a voter.
|
||||
*
|
||||
* @author Roman Marintšenko <inoryy@gmail.com>
|
||||
* @author Grégoire Pineau <lyrixx@lyrixx.info>
|
||||
*
|
||||
* @template TAttribute of string
|
||||
* @template TSubject of mixed
|
||||
*/
|
||||
abstract class Voter implements VoterInterface, CacheableVoterInterface
|
||||
{
|
||||
public function vote(TokenInterface $token, mixed $subject, array $attributes): int
|
||||
{
|
||||
// abstain vote by default in case none of the attributes are supported
|
||||
$vote = self::ACCESS_ABSTAIN;
|
||||
|
||||
foreach ($attributes as $attribute) {
|
||||
try {
|
||||
if (!$this->supports($attribute, $subject)) {
|
||||
continue;
|
||||
}
|
||||
} catch (\TypeError $e) {
|
||||
if (str_contains($e->getMessage(), 'supports(): Argument #1')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
throw $e;
|
||||
}
|
||||
|
||||
// as soon as at least one attribute is supported, default is to deny access
|
||||
$vote = self::ACCESS_DENIED;
|
||||
|
||||
if ($this->voteOnAttribute($attribute, $subject, $token)) {
|
||||
// grant access as soon as at least one attribute returns a positive response
|
||||
return self::ACCESS_GRANTED;
|
||||
}
|
||||
}
|
||||
|
||||
return $vote;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return false if your voter doesn't support the given attribute. Symfony will cache
|
||||
* that decision and won't call your voter again for that attribute.
|
||||
*/
|
||||
public function supportsAttribute(string $attribute): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return false if your voter doesn't support the given subject type. Symfony will cache
|
||||
* that decision and won't call your voter again for that subject type.
|
||||
*
|
||||
* @param string $subjectType The type of the subject inferred by `get_class()` or `get_debug_type()`
|
||||
*/
|
||||
public function supportsType(string $subjectType): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the attribute and subject are supported by this voter.
|
||||
*
|
||||
* @param mixed $subject The subject to secure, e.g. an object the user wants to access or any other PHP type
|
||||
*
|
||||
* @psalm-assert-if-true TSubject $subject
|
||||
* @psalm-assert-if-true TAttribute $attribute
|
||||
*/
|
||||
abstract protected function supports(string $attribute, mixed $subject): bool;
|
||||
|
||||
/**
|
||||
* Perform a single access check operation on a given attribute, subject and token.
|
||||
* It is safe to assume that $attribute and $subject already passed the "supports()" method check.
|
||||
*
|
||||
* @param TAttribute $attribute
|
||||
* @param TSubject $subject
|
||||
*/
|
||||
abstract protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Authorization\Voter;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* VoterInterface is the interface implemented by all voters.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
interface VoterInterface
|
||||
{
|
||||
public const ACCESS_GRANTED = 1;
|
||||
public const ACCESS_ABSTAIN = 0;
|
||||
public const ACCESS_DENIED = -1;
|
||||
|
||||
/**
|
||||
* Returns the vote for the given parameters.
|
||||
*
|
||||
* This method must return one of the following constants:
|
||||
* ACCESS_GRANTED, ACCESS_DENIED, or ACCESS_ABSTAIN.
|
||||
*
|
||||
* @param mixed $subject The subject to secure
|
||||
* @param array $attributes An array of attributes associated with the method being invoked
|
||||
*
|
||||
* @return int either ACCESS_GRANTED, ACCESS_ABSTAIN, or ACCESS_DENIED
|
||||
*
|
||||
* @psalm-return self::ACCESS_* must be transformed into @return on Symfony 7
|
||||
*/
|
||||
public function vote(TokenInterface $token, mixed $subject, array $attributes);
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
CHANGELOG
|
||||
=========
|
||||
|
||||
6.3
|
||||
---
|
||||
|
||||
* Add `AttributesBasedUserProviderInterface` to allow `$attributes` optional argument on `loadUserByIdentifier`
|
||||
* Add `OidcUser` with OIDC support for `OidcUserInfoTokenHandler`
|
||||
|
||||
6.2
|
||||
---
|
||||
|
||||
* Deprecate the `Security` class, use `Symfony\Bundle\SecurityBundle\Security` instead
|
||||
* Change the signature of `TokenStorageInterface::setToken()` to `setToken(?TokenInterface $token)`
|
||||
* Deprecate calling `TokenStorage::setToken()` without arguments
|
||||
* Add a `ChainUserChecker` to allow calling multiple user checkers for a firewall
|
||||
|
||||
6.0
|
||||
---
|
||||
|
||||
* `TokenInterface` does not extend `Serializable` anymore
|
||||
* Remove all classes in the `Core\Encoder\` sub-namespace, use the `PasswordHasher` component instead
|
||||
* Remove methods `getPassword()` and `getSalt()` from `UserInterface`, use `PasswordAuthenticatedUserInterface`
|
||||
or `LegacyPasswordAuthenticatedUserInterface` instead
|
||||
* `AccessDecisionManager` requires the strategy to be passed as in instance of `AccessDecisionStrategyInterface`
|
||||
|
||||
5.4.21
|
||||
------
|
||||
|
||||
* [BC BREAK] `AccessDecisionStrategyTestCase::provideStrategyTests()` is now static
|
||||
|
||||
5.4
|
||||
---
|
||||
|
||||
* Add a `CacheableVoterInterface` for voters that vote only on identified attributes and subjects
|
||||
* Deprecate `AuthenticationEvents::AUTHENTICATION_FAILURE`, use the `LoginFailureEvent` instead
|
||||
* Deprecate `AnonymousToken`, as the related authenticator was deprecated in 5.3
|
||||
* Deprecate `Token::getCredentials()`, tokens should no longer contain credentials (as they represent authenticated sessions)
|
||||
* Deprecate returning `string|\Stringable` from `Token::getUser()` (it must return a `UserInterface`)
|
||||
* Deprecate `AuthenticatedVoter::IS_AUTHENTICATED_ANONYMOUSLY` and `AuthenticatedVoter::IS_ANONYMOUS`,
|
||||
use `AuthenticatedVoter::IS_AUTHENTICATED_FULLY` or `AuthenticatedVoter::IS_AUTHENTICATED` instead.
|
||||
* Deprecate `AuthenticationTrustResolverInterface::isAnonymous()` and the `is_anonymous()` expression
|
||||
function as anonymous no longer exists in version 6, use the `isFullFledged()` or the new
|
||||
`isAuthenticated()` instead if you want to check if the request is (fully) authenticated.
|
||||
* Deprecate the `$authenticationManager` argument of the `AuthorizationChecker` constructor
|
||||
* Deprecate setting the `$alwaysAuthenticate` argument to `true` and not setting the
|
||||
`$exceptionOnNoToken` argument to `false` of `AuthorizationChecker`
|
||||
* Deprecate methods `TokenInterface::isAuthenticated()` and `setAuthenticated`,
|
||||
return null from "getUser()" instead when a token is not authenticated
|
||||
* Add `AccessDecisionStrategyInterface` to allow custom access decision strategies
|
||||
* Add access decision strategies `AffirmativeStrategy`, `ConsensusStrategy`, `PriorityStrategy`, `UnanimousStrategy`
|
||||
* Deprecate passing the strategy as string to `AccessDecisionManager`,
|
||||
pass an instance of `AccessDecisionStrategyInterface` instead
|
||||
* Flag `AccessDecisionManager` as `@final`
|
||||
|
||||
5.3
|
||||
---
|
||||
|
||||
The CHANGELOG for version 5.3 and earlier can be found at https://github.com/symfony/symfony/blob/5.3/src/Symfony/Component/Security/CHANGELOG.md
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Event;
|
||||
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Contracts\EventDispatcher\Event;
|
||||
|
||||
/**
|
||||
* This is a general purpose authentication event.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
class AuthenticationEvent extends Event
|
||||
{
|
||||
private TokenInterface $authenticationToken;
|
||||
|
||||
public function __construct(TokenInterface $token)
|
||||
{
|
||||
$this->authenticationToken = $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TokenInterface
|
||||
*/
|
||||
public function getAuthenticationToken()
|
||||
{
|
||||
return $this->authenticationToken;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Event;
|
||||
|
||||
final class AuthenticationSuccessEvent extends AuthenticationEvent
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Event;
|
||||
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
|
||||
use Symfony\Contracts\EventDispatcher\Event;
|
||||
|
||||
/**
|
||||
* This event is dispatched on voter vote.
|
||||
*
|
||||
* @author Laurent VOULLEMIER <laurent.voullemier@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class VoteEvent extends Event
|
||||
{
|
||||
private VoterInterface $voter;
|
||||
private mixed $subject;
|
||||
private array $attributes;
|
||||
private int $vote;
|
||||
|
||||
public function __construct(VoterInterface $voter, mixed $subject, array $attributes, int $vote)
|
||||
{
|
||||
$this->voter = $voter;
|
||||
$this->subject = $subject;
|
||||
$this->attributes = $attributes;
|
||||
$this->vote = $vote;
|
||||
}
|
||||
|
||||
public function getVoter(): VoterInterface
|
||||
{
|
||||
return $this->voter;
|
||||
}
|
||||
|
||||
public function getSubject(): mixed
|
||||
{
|
||||
return $this->subject;
|
||||
}
|
||||
|
||||
public function getAttributes(): array
|
||||
{
|
||||
return $this->attributes;
|
||||
}
|
||||
|
||||
public function getVote(): int
|
||||
{
|
||||
return $this->vote;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
use Symfony\Component\HttpKernel\Attribute\WithHttpStatus;
|
||||
|
||||
/**
|
||||
* AccessDeniedException is thrown when the account has not the required role.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
#[WithHttpStatus(403)]
|
||||
class AccessDeniedException extends RuntimeException
|
||||
{
|
||||
private array $attributes = [];
|
||||
private mixed $subject = null;
|
||||
|
||||
public function __construct(string $message = 'Access Denied.', ?\Throwable $previous = null, int $code = 403)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
|
||||
public function getAttributes(): array
|
||||
{
|
||||
return $this->attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setAttributes(array|string $attributes)
|
||||
{
|
||||
$this->attributes = (array) $attributes;
|
||||
}
|
||||
|
||||
public function getSubject(): mixed
|
||||
{
|
||||
return $this->subject;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setSubject(mixed $subject)
|
||||
{
|
||||
$this->subject = $subject;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* AccountExpiredException is thrown when the user account has expired.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class AccountExpiredException extends AccountStatusException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Account has expired.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
/**
|
||||
* AccountStatusException is the base class for authentication exceptions
|
||||
* caused by the user account status.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
abstract class AccountStatusException extends AuthenticationException
|
||||
{
|
||||
private ?UserInterface $user = null;
|
||||
|
||||
/**
|
||||
* Get the user.
|
||||
*/
|
||||
public function getUser(): ?UserInterface
|
||||
{
|
||||
return $this->user;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setUser(UserInterface $user)
|
||||
{
|
||||
$this->user = $user;
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [$this->user, parent::__serialize()];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[$this->user, $parentData] = $data;
|
||||
$parentData = \is_array($parentData) ? $parentData : unserialize($parentData);
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* AuthenticationCredentialsNotFoundException is thrown when an authentication is rejected
|
||||
* because no Token is available.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class AuthenticationCredentialsNotFoundException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Authentication credentials could not be found.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
use Symfony\Component\HttpKernel\Attribute\WithHttpStatus;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
|
||||
/**
|
||||
* AuthenticationException is the base class for all authentication exceptions.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
#[WithHttpStatus(401)]
|
||||
class AuthenticationException extends RuntimeException
|
||||
{
|
||||
/** @internal */
|
||||
protected $serialized;
|
||||
|
||||
private ?TokenInterface $token = null;
|
||||
|
||||
public function __construct(string $message = '', int $code = 0, ?\Throwable $previous = null)
|
||||
{
|
||||
unset($this->serialized);
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
|
||||
public function getToken(): ?TokenInterface
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function setToken(TokenInterface $token)
|
||||
{
|
||||
$this->token = $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all the necessary state of the object for serialization purposes.
|
||||
*
|
||||
* There is no need to serialize any entry, they should be returned as-is.
|
||||
* If you extend this method, keep in mind you MUST guarantee parent data is present in the state.
|
||||
* Here is an example of how to extend this method:
|
||||
* <code>
|
||||
* public function __serialize(): array
|
||||
* {
|
||||
* return [$this->childAttribute, parent::__serialize()];
|
||||
* }
|
||||
* </code>
|
||||
*
|
||||
* @see __unserialize()
|
||||
*/
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [$this->token, $this->code, $this->message, $this->file, $this->line];
|
||||
}
|
||||
|
||||
/**
|
||||
* Restores the object state from an array given by __serialize().
|
||||
*
|
||||
* There is no need to unserialize any entry in $data, they are already ready-to-use.
|
||||
* If you extend this method, keep in mind you MUST pass the parent data to its respective class.
|
||||
* Here is an example of how to extend this method:
|
||||
* <code>
|
||||
* public function __unserialize(array $data): void
|
||||
* {
|
||||
* [$this->childAttribute, $parentData] = $data;
|
||||
* parent::__unserialize($parentData);
|
||||
* }
|
||||
* </code>
|
||||
*
|
||||
* @see __serialize()
|
||||
*/
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[$this->token, $this->code, $this->message, $this->file, $this->line] = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Message key to be used by the translation component.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getMessageKey()
|
||||
{
|
||||
return 'An authentication exception occurred.';
|
||||
}
|
||||
|
||||
/**
|
||||
* Message data to be used by the translation component.
|
||||
*/
|
||||
public function getMessageData(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public function __sleep(): array
|
||||
{
|
||||
$this->serialized = $this->__serialize();
|
||||
|
||||
return ['serialized'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public function __wakeup(): void
|
||||
{
|
||||
$this->__unserialize($this->serialized);
|
||||
unset($this->serialized);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* AuthenticationExpiredException is thrown when an authentication token becomes un-authenticated between requests.
|
||||
*
|
||||
* In practice, this is due to the User changing between requests (e.g. password changes),
|
||||
* causes the token to become un-authenticated.
|
||||
*
|
||||
* @author Ryan Weaver <ryan@knpuniversity.com>
|
||||
*/
|
||||
class AuthenticationExpiredException extends AccountStatusException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Authentication expired because your account information has changed.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* AuthenticationServiceException is thrown when an authentication request could not be processed due to a system problem.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class AuthenticationServiceException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Authentication request could not be processed due to a system problem.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* BadCredentialsException is thrown when the user credentials are invalid.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class BadCredentialsException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Invalid credentials.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* This exception is thrown when the RememberMeServices implementation
|
||||
* detects that a presented cookie has already been used by someone else.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class CookieTheftException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Cookie has already been used by someone else.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* CredentialsExpiredException is thrown when the user account credentials have expired.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class CredentialsExpiredException extends AccountStatusException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Credentials have expired.';
|
||||
}
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* An authentication exception caused by the user account status
|
||||
* where you can control the message shown to the user.
|
||||
*
|
||||
* Be sure that the message passed to this exception is something that
|
||||
* can be shown safely to your user. In other words, avoid catching
|
||||
* other exceptions and passing their message directly to this class.
|
||||
*
|
||||
* @author Vincent Langlet <vincentlanglet@github.com>
|
||||
*/
|
||||
class CustomUserMessageAccountStatusException extends AccountStatusException
|
||||
{
|
||||
private string $messageKey;
|
||||
private array $messageData = [];
|
||||
|
||||
public function __construct(string $message = '', array $messageData = [], int $code = 0, ?\Throwable $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
|
||||
$this->setSafeMessage($message, $messageData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a message that will be shown to the user.
|
||||
*
|
||||
* @param string $messageKey The message or message key
|
||||
* @param array $messageData Data to be passed into the translator
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setSafeMessage(string $messageKey, array $messageData = [])
|
||||
{
|
||||
$this->messageKey = $messageKey;
|
||||
$this->messageData = $messageData;
|
||||
}
|
||||
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return $this->messageKey;
|
||||
}
|
||||
|
||||
public function getMessageData(): array
|
||||
{
|
||||
return $this->messageData;
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [parent::__serialize(), $this->messageKey, $this->messageData];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[$parentData, $this->messageKey, $this->messageData] = $data;
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* An authentication exception where you can control the message shown to the user.
|
||||
*
|
||||
* Be sure that the message passed to this exception is something that
|
||||
* can be shown safely to your user. In other words, avoid catching
|
||||
* other exceptions and passing their message directly to this class.
|
||||
*
|
||||
* @author Ryan Weaver <ryan@knpuniversity.com>
|
||||
*/
|
||||
class CustomUserMessageAuthenticationException extends AuthenticationException
|
||||
{
|
||||
private string $messageKey;
|
||||
private array $messageData = [];
|
||||
|
||||
public function __construct(string $message = '', array $messageData = [], int $code = 0, ?\Throwable $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
|
||||
$this->setSafeMessage($message, $messageData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a message that will be shown to the user.
|
||||
*
|
||||
* @param string $messageKey The message or message key
|
||||
* @param array $messageData Data to be passed into the translator
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setSafeMessage(string $messageKey, array $messageData = [])
|
||||
{
|
||||
$this->messageKey = $messageKey;
|
||||
$this->messageData = $messageData;
|
||||
}
|
||||
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return $this->messageKey;
|
||||
}
|
||||
|
||||
public function getMessageData(): array
|
||||
{
|
||||
return $this->messageData;
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [parent::__serialize(), $this->messageKey, $this->messageData];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[$parentData, $this->messageKey, $this->messageData] = $data;
|
||||
$parentData = \is_array($parentData) ? $parentData : unserialize($parentData);
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* DisabledException is thrown when the user account is disabled.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class DisabledException extends AccountStatusException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Account is disabled.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* Base ExceptionInterface for the Security component.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
interface ExceptionInterface extends \Throwable
|
||||
{
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* InsufficientAuthenticationException is thrown if the user credentials are not sufficiently trusted.
|
||||
*
|
||||
* This is the case when a user is anonymous and the resource to be displayed has an access role.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class InsufficientAuthenticationException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Not privileged to request the resource.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* Base InvalidArgumentException for the Security component.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* This exception is thrown when the csrf token is invalid.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class InvalidCsrfTokenException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Invalid CSRF token.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
/**
|
||||
* A signaling exception that wraps a lazily computed response.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
class LazyResponseException extends \Exception implements ExceptionInterface
|
||||
{
|
||||
private Response $response;
|
||||
|
||||
public function __construct(Response $response)
|
||||
{
|
||||
$this->response = $response;
|
||||
}
|
||||
|
||||
public function getResponse(): Response
|
||||
{
|
||||
return $this->response;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* LockedException is thrown if the user account is locked.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class LockedException extends AccountStatusException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Account is locked.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* Base LogicException for the Security component.
|
||||
*
|
||||
* @author Iltar van der Berg <kjarli@gmail.com>
|
||||
*/
|
||||
class LogicException extends \LogicException implements ExceptionInterface
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* LogoutException is thrown when the account cannot be logged out.
|
||||
*
|
||||
* @author Jeremy Mikola <jmikola@gmail.com>
|
||||
*/
|
||||
class LogoutException extends RuntimeException
|
||||
{
|
||||
public function __construct(string $message = 'Logout Exception', ?\Throwable $previous = null)
|
||||
{
|
||||
parent::__construct($message, 403, $previous);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* ProviderNotFoundException is thrown when no AuthenticationProviderInterface instance
|
||||
* supports an authentication Token.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class ProviderNotFoundException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'No authentication provider found to support the authentication token.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* Base RuntimeException for the Security component.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class RuntimeException extends \RuntimeException implements ExceptionInterface
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* This exception is thrown when no session is available.
|
||||
*
|
||||
* Possible reasons for this are:
|
||||
*
|
||||
* a) The session timed out because the user waited too long.
|
||||
* b) The user has disabled cookies, and a new session is started on each
|
||||
* request.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class SessionUnavailableException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'No session available, it either timed out or cookies are not enabled.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* TokenNotFoundException is thrown if a Token cannot be found.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class TokenNotFoundException extends AuthenticationException
|
||||
{
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'No token could be found.';
|
||||
}
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* This exception is thrown if there where too many failed login attempts in
|
||||
* this session.
|
||||
*
|
||||
* @author Wouter de Jong <wouter@wouterj.nl>
|
||||
*/
|
||||
class TooManyLoginAttemptsAuthenticationException extends AuthenticationException
|
||||
{
|
||||
private ?int $threshold;
|
||||
|
||||
public function __construct(?int $threshold = null)
|
||||
{
|
||||
$this->threshold = $threshold;
|
||||
}
|
||||
|
||||
public function getMessageData(): array
|
||||
{
|
||||
return [
|
||||
'%minutes%' => $this->threshold,
|
||||
'%count%' => (int) $this->threshold,
|
||||
];
|
||||
}
|
||||
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Too many failed login attempts, please try again '.($this->threshold ? 'in %minutes% minute'.($this->threshold > 1 ? 's' : '').'.' : 'later.');
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [$this->threshold, parent::__serialize()];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[$this->threshold, $parentData] = $data;
|
||||
$parentData = \is_array($parentData) ? $parentData : unserialize($parentData);
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* This exception is thrown when an account is reloaded from a provider which
|
||||
* doesn't support the passed implementation of UserInterface.
|
||||
*
|
||||
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
|
||||
*/
|
||||
class UnsupportedUserException extends AuthenticationServiceException
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Exception;
|
||||
|
||||
/**
|
||||
* UserNotFoundException is thrown if a User cannot be found for the given identifier.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Alexander <iam.asm89@gmail.com>
|
||||
*/
|
||||
class UserNotFoundException extends AuthenticationException
|
||||
{
|
||||
private ?string $identifier = null;
|
||||
|
||||
public function getMessageKey(): string
|
||||
{
|
||||
return 'Username could not be found.';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the user identifier (e.g. username or email address).
|
||||
*/
|
||||
public function getUserIdentifier(): ?string
|
||||
{
|
||||
return $this->identifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the user identifier (e.g. username or email address).
|
||||
*/
|
||||
public function setUserIdentifier(string $identifier): void
|
||||
{
|
||||
$this->identifier = $identifier;
|
||||
}
|
||||
|
||||
public function getMessageData(): array
|
||||
{
|
||||
return ['{{ username }}' => $this->identifier, '{{ user_identifier }}' => $this->identifier];
|
||||
}
|
||||
|
||||
public function __serialize(): array
|
||||
{
|
||||
return [$this->identifier, parent::__serialize()];
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
[$this->identifier, $parentData] = $data;
|
||||
$parentData = \is_array($parentData) ? $parentData : unserialize($parentData);
|
||||
parent::__unserialize($parentData);
|
||||
}
|
||||
}
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
Copyright (c) 2004-present Fabien Potencier
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
Security Component - Core
|
||||
=========================
|
||||
|
||||
Security provides an infrastructure for sophisticated authorization systems,
|
||||
which makes it possible to easily separate the actual authorization logic from
|
||||
so called user providers that hold the users credentials.
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
```
|
||||
$ composer require symfony/security-core
|
||||
```
|
||||
|
||||
```php
|
||||
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
|
||||
use Symfony\Component\Security\Core\Authorization\AccessDecisionManager;
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\RoleVoter;
|
||||
use Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter;
|
||||
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
|
||||
use Symfony\Component\Security\Core\Role\RoleHierarchy;
|
||||
|
||||
$accessDecisionManager = new AccessDecisionManager([
|
||||
new AuthenticatedVoter(new AuthenticationTrustResolver()),
|
||||
new RoleVoter(),
|
||||
new RoleHierarchyVoter(new RoleHierarchy([
|
||||
'ROLE_ADMIN' => ['ROLE_USER'],
|
||||
]))
|
||||
]);
|
||||
|
||||
$user = new \App\Entity\User(...);
|
||||
$token = new UsernamePasswordToken($user, 'main', $user->getRoles());
|
||||
|
||||
if (!$accessDecisionManager->decide($token, ['ROLE_ADMIN'])) {
|
||||
throw new AccessDeniedException();
|
||||
}
|
||||
```
|
||||
|
||||
Sponsor
|
||||
-------
|
||||
|
||||
The Security component for Symfony 6.3 is [backed][1] by [SymfonyCasts][2].
|
||||
|
||||
Learn Symfony faster by watching real projects being built and actively coding
|
||||
along with them. SymfonyCasts bridges that learning gap, bringing you video
|
||||
tutorials and coding challenges. Code on!
|
||||
|
||||
Help Symfony by [sponsoring][3] its development!
|
||||
|
||||
Resources
|
||||
---------
|
||||
|
||||
* [Documentation](https://symfony.com/doc/current/components/security.html)
|
||||
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
|
||||
* [Report issues](https://github.com/symfony/symfony/issues) and
|
||||
[send Pull Requests](https://github.com/symfony/symfony/pulls)
|
||||
in the [main Symfony repository](https://github.com/symfony/symfony)
|
||||
|
||||
[1]: https://symfony.com/backers
|
||||
[2]: https://symfonycasts.com
|
||||
[3]: https://symfony.com/sponsor
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="af" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>'n Verifikasie probleem het voorgekom.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Verifikasiebewyse kon nie gevind word nie.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Verifikasieversoek kon weens 'n stelselprobleem nie verwerk word nie.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Ongedige verifikasiebewyse.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Die koekie is alreeds deur iemand anders gebruik.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Nie bevoorreg om die hulpbron aan te vra nie.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Ongeldige CSRF-teken.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Geen verifikasieverskaffer is gevind wat die verifikasietoken kan ondersteun nie.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Geen sessie is beskikbaar, die het verval of koekies is nie geaktiveer nie.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Geen teken kon gevind word nie.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Gebruikersnaam kon nie gevind word nie.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Rekening het verval.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Verifikasiebewyse het verval.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Rekening is deaktiveer.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Rekening is gesluit.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Te veel mislukte aanmeldpogings, probeer asseblief later weer.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Ongeldige of vervalde aanmeldskakel.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target state="needs-review-translation">Te veel mislukte aanmeldpogings, probeer asseblief weer oor %minutes% minuut.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="ar" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>حدث خطأ اثناء الدخول.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>لم استطع العثور على معلومات الدخول.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>لم يكتمل طلب الدخول نتيجه عطل فى النظام.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>معلومات الدخول خاطئة.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>ملفات تعريف الارتباط(cookies) تم استخدامها من قبل شخص اخر.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>ليست لديك الصلاحيات الكافية لهذا الطلب.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>رمز الموقع غير صحيح.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>لا يوجد معرف للدخول يدعم الرمز المستخدم للدخول.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>لا يوجد صلة بينك و بين الموقع اما انها انتهت او ان متصفحك لا يدعم خاصية ملفات تعريف الارتباط (cookies).</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>لم استطع العثور على الرمز.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>لم استطع العثور على اسم الدخول.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>انتهت صلاحية الحساب.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>انتهت صلاحية معلومات الدخول.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>الحساب موقوف.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>الحساب مغلق.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>عدد كبير جدا من محاولات الدخول الفاشلة، يرجى المحاولة مرة أخرى في وقت لاحق.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>رابط تسجيل الدخول غير صالح أو منتهي الصلاحية.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>عدد كبير جدا من محاولات الدخول الفاشلة، يرجى اعادة المحاولة بعد %minutes% دقيقة.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="az" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Doğrulama istisnası baş verdi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Doğrulama məlumatları tapılmadı.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Sistem xətası səbəbilə doğrulama istəyi emal edilə bilmədi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Yanlış məlumat.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Kuki başqası tərəfindən istifadə edilib.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Resurs istəyi üçün imtiyaz yoxdur.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Yanlış CSRF nişanı.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Doğrulama nişanını dəstəkləyəcək provayder tapılmadı.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Uyğun seans yoxdur, vaxtı keçib və ya kuki aktiv deyil.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Nişan tapılmadı.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>İstifadəçi adı tapılmadı.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Hesabın istifadə müddəti bitib.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Məlumatların istifadə müddəti bitib.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Hesab qeyri-aktiv edilib.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Hesab kilitlənib.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Çoxlu uğursuz giriş təşəbbüsü, zəhmət olmasa daha sonra yeniden yoxlayın.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Yanlış və ya müddəti keçmiş giriş keçidi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Həddindən artıq uğursuz giriş cəhdi, lütfən %minutes% dəqiqə ərzində yenidən yoxlayın.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="be" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Памылка аўтэнтыфікацыі.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Дадзеныя аўтэнтыфікацыі не знойдзены.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Запыт аўтэнтыфікацыі не можа быць апрацаваны ў сувязі з праблемай у сістэме.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Несапраўдныя дадзеныя аўтэнтыфікацыі.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Нехта іншы ўжо выкарыстаў гэтыя кукі (cookie).</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Адсутнічаюць правы на запыт гэтага рэсурсу.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Несапраўдны CSRF-токен.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Не знойдзен правайдар аўтэнтыфікацыі, які можа падтрымліваць гэты токен аўтэнтыфікацыі.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Сесія не даступна, яе час скончыўся, або кукі (cookies) выключаны.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Токен не знойдзен.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Імя карыстальніка не знойдзена.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Скончыўся тэрмін дзеяння акаўнта.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Скончыўся тэрмін дзеяння дадзеных аўтэнтыфікацыі.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Акаўнт адключан.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Акаўнт заблакіраван.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Зашмат няўдалых спроб уваходу, калі ласка, паспрабуйце пазней.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Спасылка для ўваходу несапраўдная або пратэрмінаваная.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Занадта шмат няўдалых спроб уваходу ў сістэму, паспрабуйце спробу праз %minutes% хвіліну.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="bg" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Грешка при автентикация.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Удостоверението за автентикация не е открито.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Заявката за автентикация не може да бъде обработената поради системна грешка.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Невалидно удостоверение за автентикация.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Тази бисквитка вече се ползва от някой друг.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Нямате права за достъп до този ресурс.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Невалиден CSRF токен.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Не е открит провайдър, който да поддържа този токен за автентикация.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Сесията не е достъпна, или времето за достъп е изтекло, или бисквитките не са разрешени.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Токенът не е открит.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Потребителското име не е открито.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Акаунтът е изтекъл.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Удостоверението за автентикация е изтекло.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Акаунтът е деактивиран.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Акаунтът е заключен.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Твърде много неуспешни опити за вход, моля опитайте по-късно.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Невалиден или изтекъл линк за вход.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Твърде много неуспешни опити за вход, моля опитайте отново след %minutes% минута.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="bs" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Došlo je do autentifikacijskog izuzetka (exception).</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Autentifikacijski podaci nisu pronađeni.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Autentifikacijski zahtjev ne može biti obrađen zbog sistemskog problema.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Autentifikacijski podaci su neispravni.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Neko drugi je već iskoristio ovaj kolačić (cookie).</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Nemate privilegije potrebne za pristup ovom resursu.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>CSRF žeton (token) je neispravan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Nije pronađen autentifikacijski provajder koji bi podržao dati autentifikacijski žeton (token).</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Nema dostupnih sesija; ili je istekla ili su kolačići (cookies) iksljučeni.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Nije pronađen nijedan žeton (token).</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Korisničko ime nije pronađeno.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Nalog je istekao.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Autentifikacijski podaci su istekli.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Nalog je onemogućen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Nalog je zaključan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Previše neuspješnih pokušaja prijavljivanja, molim pokušajte ponovo kasnije.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Link za prijavljivanje je istekao ili je neispravan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Previše neuspjelih pokušaja prijave, pokušajte ponovo za %minutes% minuta.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="ca" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Ha succeït un error d'autenticació.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>No s'han trobat les credencials d'autenticació.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>La solicitud d'autenticació no s'ha pogut processar per un problema del sistema.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Credencials no vàlides.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>La cookie ja ha estat utilitzada per una altra persona.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>No té privilegis per solicitar el recurs.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Token CSRF no vàlid.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>No s'ha trobat un proveïdor d'autenticació que suporti el token d'autenticació.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>No hi ha sessió disponible, ha expirat o les cookies no estan habilitades.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>No s'ha trobat cap token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>No s'ha trobat el nom d'usuari.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>El compte ha expirat.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Les credencials han expirat.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>El compte està deshabilitat.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>El compte està bloquejat.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Massa intents d'inici de sessió fallits, torneu-ho a provar més tard.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Enllaç d'inici de sessió no vàlid o caducat.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Massa intents d'inici de sessió fallits, torneu-ho a provar en %minutes% minut.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="cs" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Při ověřování došlo k chybě.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Ověřovací údaje nebyly nalezeny.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Požadavek na ověření nemohl být zpracován kvůli systémové chybě.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Neplatné přihlašovací údaje.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie již bylo použité někým jiným.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Nemáte oprávnění přistupovat k prostředku.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Neplatný CSRF token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Poskytovatel pro ověřovací token nebyl nalezen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Session není k dispozici, vypršela její platnost, nebo jsou zakázané cookies.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Token nebyl nalezen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Přihlašovací jméno nebylo nalezeno.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Platnost účtu vypršela.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Platnost přihlašovacích údajů vypršela.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Účet je zakázaný.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Účet je zablokovaný.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Příliš mnoho nepovedených pokusů přihlášení. Zkuste to prosím později.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Neplatný nebo expirovaný odkaz na přihlášení.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Příliš mnoho neúspěšných pokusů o přihlášení, zkuste to prosím znovu za %minutes% minutu.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="cy" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target state="needs-review-translation">Digwyddodd eithriad dilysu.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target state="needs-review-translation">Ni ellid dod o hyd i ddogfennau dilysu.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target state="needs-review-translation">Ni ellid prosesu cais dilysu oherwydd problem gyda'r system.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target state="needs-review-translation">Dogfennau annilys.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target state="needs-review-translation">Mae rhywun arall eisoes wedi defnyddio'r cwcis.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target state="needs-review-translation">Heb y fraint i ofyn am yr adnodd.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target state="needs-review-translation">Tocyn CSRF annilys.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target state="needs-review-translation">Heb ddod o hyd i ddarparwr dilysu i gefnogi'r tocyn dilysu.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target state="needs-review-translation">Dim sesiwn ar gael, naill ai mae wedi dod i ben neu nid yw cwcis wedi'u galluogi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target state="needs-review-translation">Heb ddod o hyd i docyn.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target state="needs-review-translation">Heb ddod o hyd i enw defnyddiwr.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target state="needs-review-translation">Mae'r cyfrif wedi dod i ben.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target state="needs-review-translation">Mae'r dogfennau wedi dod i ben.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target state="needs-review-translation">Mae'r cyfrif wedi'i analluogi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target state="needs-review-translation">Mae'r cyfrif wedi'i gloi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target state="needs-review-translation">Gormod o ymdrechion mewngofnodi wedi methu, ceisiwch eto'n hwyrach.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target state="needs-review-translation">Dolen mewngofnodi annilys neu wedi dod i ben.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target state="needs-review-translation">Gormod o ymdrechion mewngofnodi wedi methu, ceisiwch eto ymhen %minutes% munud.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="da" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>En fejl indtraf ved godkendelse.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Loginoplysninger kan ikke findes.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Godkendelsesanmodning kan ikke behandles på grund af et systemfejl.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Ugyldige loginoplysninger.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie er allerede brugt af en anden.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Ingen adgang til at forespørge ressourcen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Ugyldig CSRF-token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Ingen godkendelsesudbyder er fundet til understøttelsen af godkendelsestoken.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Ingen session tilgængelig, sessionen er enten udløbet eller cookies er ikke aktiveret.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Ingen token kan findes.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Brugernavn kan ikke findes.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Brugerkonto er udløbet.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Loginoplysninger er udløbet.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Brugerkonto er deaktiveret.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Brugerkonto er låst.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>For mange fejlede login forsøg, prøv venligst senere.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Ugyldigt eller udløbet login link.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>For mange fejlede login forsøg, prøv igen om %minutes% minut.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="de" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Es ist ein Fehler bei der Authentifikation aufgetreten.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Es konnten keine Zugangsdaten gefunden werden.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Die Authentifikation konnte wegen eines Systemproblems nicht bearbeitet werden.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Fehlerhafte Zugangsdaten.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie wurde bereits von jemand anderem verwendet.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Keine Rechte, um die Ressource anzufragen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Ungültiges CSRF-Token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Es wurde kein Authentifizierungs-Provider gefunden, der das Authentifizierungs-Token unterstützt.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Keine Session verfügbar, entweder ist diese abgelaufen oder Cookies sind nicht aktiviert.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Es wurde kein Token gefunden.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Der Benutzername wurde nicht gefunden.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Der Account ist abgelaufen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Die Zugangsdaten sind abgelaufen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Der Account ist deaktiviert.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Der Account ist gesperrt.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Zu viele fehlgeschlagene Anmeldeversuche, bitte versuchen Sie es später noch einmal.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Ungültiger oder abgelaufener Anmelde-Link.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Zu viele fehlgeschlagene Anmeldeversuche, bitte versuchen Sie es in einer Minute noch einmal.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="el" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Συνέβη ένα σφάλμα πιστοποίησης.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Τα στοιχεία πιστοποίησης δε βρέθηκαν.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Το αίτημα πιστοποίησης δε μπορεί να επεξεργαστεί λόγω σφάλματος του συστήματος.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Λανθασμένα στοιχεία σύνδεσης.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Το Cookie έχει ήδη χρησιμοποιηθεί από κάποιον άλλο.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Δεν είστε εξουσιοδοτημένος για πρόσβαση στο συγκεκριμένο περιεχόμενο.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Μη έγκυρο CSRF token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Δε βρέθηκε κάποιος πάροχος πιστοποίησης που να υποστηρίζει το token πιστοποίησης.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Δεν υπάρχει ενεργή σύνοδος (session), είτε έχει λήξει ή τα cookies δεν είναι ενεργοποιημένα.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Δεν ήταν δυνατόν να βρεθεί κάποιο token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Το όνομα χρήστη δε βρέθηκε.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Ο λογαριασμός έχει λήξει.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Τα στοιχεία σύνδεσης έχουν λήξει.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Ο λογαριασμός είναι απενεργοποιημένος.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Ο λογαριασμός είναι κλειδωμένος.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Πολλαπλές αποτυχημένες απόπειρες σύνδεσης, παρακαλούμε ξαναδοκιμάστε αργότερα.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Μη έγκυρος ή ληγμένος σύνδεσμος σύνδεσης.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Πολλαπλές αποτυχημένες απόπειρες σύνδεσης, παρακαλούμε ξαναδοκιμάστε σε %minutes% λεπτό.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="en" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>An authentication exception occurred.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Authentication credentials could not be found.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Authentication request could not be processed due to a system problem.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Invalid credentials.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie has already been used by someone else.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Not privileged to request the resource.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Invalid CSRF token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>No authentication provider found to support the authentication token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>No session available, it either timed out or cookies are not enabled.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>No token could be found.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Username could not be found.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Account has expired.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Credentials have expired.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Account is disabled.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Account is locked.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Too many failed login attempts, please try again later.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Invalid or expired login link.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Too many failed login attempts, please try again in %minutes% minute.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="es" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Ocurrió un error de autenticación.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>No se encontraron las credenciales de autenticación.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>La solicitud de autenticación no se pudo procesar debido a un problema del sistema.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Credenciales no válidas.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>La cookie ya ha sido usada por otra persona.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>No tiene privilegios para solicitar el recurso.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Token CSRF no válido.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>No se encontró un proveedor de autenticación que soporte el token de autenticación.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>No hay ninguna sesión disponible, ha expirado o las cookies no están habilitados.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>No se encontró ningún token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>No se encontró el nombre de usuario.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>La cuenta ha expirado.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Las credenciales han expirado.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>La cuenta está deshabilitada.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>La cuenta está bloqueada.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Demasiados intentos fallidos de inicio de sesión, inténtelo de nuevo más tarde.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Enlace de inicio de sesión inválido o expirado.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Demasiados intentos fallidos de inicio de sesión, inténtelo de nuevo en %minutes% minuto.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="et" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Autentimisel juhtus ootamatu viga.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Autentimisandmeid ei leitud.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Autentimispäring ei õnnestunud süsteemi probleemi tõttu.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Vigased autentimisandmed.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Küpsis on juba kellegi teise poolt kasutuses.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Ressursi pärimiseks pole piisavalt õiguseid.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Vigane CSRF märgis.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Ei leitud sobivat autentimismeetodit, mis toetaks autentimismärgist.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Seanss puudub, see on kas aegunud või pole küpsised lubatud.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Identsustõendit ei leitud.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Kasutajanime ei leitud.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Kasutajakonto on aegunud.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Autentimistunnused on aegunud.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Kasutajakonto on keelatud.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Kasutajakonto on lukustatud.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Liiga palju ebaõnnestunud autentimise katseid, palun proovi hiljem uuesti.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Vigane või aegunud sisselogimise link.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Liiga palju ebaõnnestunud autentimise katseid, palun proovi uuesti %minutes% minuti pärast.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="eu" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Autentifikazio-errorea gertatu da.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Ez dira aurkitu autentifikazio-kredentzialak.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Ezin izan da autentifikazio-eskaera prozesatu, sistema-arazo bat gertatu da eta.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Kredentzialak okerrak dira.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Dagoeneko beste pertsona batek erabili du cookiea.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Ez duzu baliabidea eskatzeko aukerarik.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>CSRF tokena okerra da.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Ez da aurkitu autentifikazio-tokena eutsi dezakeen autentifikazio-hornitzailerik.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Ez dago saiorik erabilgarri, iraungi egin da edo cookieak ez daude gaituta.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Ez da tokenik aurkitu.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Ez da erabiltzaile-izena aurkitu.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Kontua iraungi da.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Kredentzialak iraungi dira.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Kontua desgaituta dago.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Kontua blokeatuta dago.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Saioa hasteko saio huts gehiegi, saiatu berriro geroago.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Sartzeko esteka baliogabea edo iraungia.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Saioa hasteko huts gehiegi egin dira, saiatu berriro minutu %minutes% geroago.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="fa" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>خطایی هنگام احراز هویت رخ داده است.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>شرایط احراز هویت یافت نشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>درخواست احراز هویت به دلیل وجود مشکل در سیستم قابل پردازش نمی باشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>احراز هویت نامعتبر می باشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie قبلا توسط شخص دیگری استفاده گردیده است.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>دسترسی لازم برای درخواست از این منبع را دارا نمی باشید.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>توکن CSRF معتبر نمی باشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>هیچ ارائه دهنده احراز هویتی برای پشتیبانی از توکن احراز هویت پیدا نشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>هیچ جلسهای در دسترس نمی باشد. این میتواند به دلیل پایان یافتن زمان و یا فعال نبودن کوکی ها باشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>هیچ توکنی پیدا نشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>نام کاربری پیدا نشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>حساب کاربری منقضی گردیده است.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>مجوزهای احراز هویت منقضی گردیدهاند.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>حساب کاربری غیرفعال می باشد.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>حساب کاربری قفل گردیده است.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>تلاشهای ناموفق زیادی برای ورود صورت گرفته است، لطفاً بعداً دوباره امتحان کنید.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>لینک ورود نامعتبر یا تاریخگذشته است.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>تلاشهای ناموفق زیادی برای ورود صورت گرفته است، لطفاً %minutes% دقیقه دیگر دوباره امتحان کنید.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="fi" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Autentikointi poikkeus tapahtui.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Autentikoinnin tunnistetietoja ei löydetty.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Autentikointipyyntöä ei voitu käsitellä järjestelmäongelman vuoksi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Virheelliset tunnistetiedot.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Eväste on jo jonkin muun käytössä.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Ei oikeutta resurssiin.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Virheellinen CSRF tunnus.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Autentikointi tunnukselle ei löydetty tuettua autentikointi tarjoajaa.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Sessio ei ole saatavilla, se on joko vanhentunut tai evästeet eivät ole käytössä.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Tunnusta ei löytynyt.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Käyttäjätunnusta ei löydetty.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Tili on vanhentunut.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Tunnistetiedot ovat vanhentuneet.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Tili on poistettu käytöstä.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Tili on lukittu.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Liian monta epäonnistunutta kirjautumisyritystä, yritä myöhemmin uudelleen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Virheellinen tai vanhentunut kirjautumislinkki.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Liian monta epäonnistunutta kirjautumisyritystä, yritä uudelleen %minutes% minuutin kuluttua.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="fr" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Une exception d'authentification s'est produite.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Les identifiants d'authentification n'ont pas pu être trouvés.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>La requête d'authentification n'a pas pu être executée à cause d'un problème système.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Identifiants invalides.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Le cookie a déjà été utilisé par quelqu'un d'autre.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Privilèges insuffisants pour accéder à la ressource.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Jeton CSRF invalide.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Aucun fournisseur d'authentification n'a été trouvé pour supporter le jeton d'authentification.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Aucune session disponible, celle-ci a expiré ou les cookies ne sont pas activés.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Aucun jeton n'a pu être trouvé.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Le nom d'utilisateur n'a pas pu être trouvé.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Le compte a expiré.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Les identifiants ont expiré.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Le compte est désactivé.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Le compte est bloqué.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Plusieurs tentatives de connexion ont échoué, veuillez réessayer plus tard.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Lien de connexion invalide ou expiré.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Plusieurs tentatives de connexion ont échoué, veuillez réessayer dans %minutes% minute.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="gl" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Ocorreu un erro de autenticación.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Non se atoparon as credenciais de autenticación.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>A solicitude de autenticación no puido ser procesada debido a un problema do sistema.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Credenciais non válidas.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>A cookie xa foi empregado por outro usuario.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Non ten privilexios para solicitar o recurso.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Token CSRF non válido.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Non se atopou un provedor de autenticación que soporte o token de autenticación.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Non hai ningunha sesión dispoñible, expirou ou as cookies non están habilitadas.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Non se atopou ningún token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Non se atopou o nome de usuario.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>A conta expirou.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>As credenciais expiraron.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>A conta está deshabilitada.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>A conta está bloqueada.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Demasiados intentos de inicio de sesión fallados. Téntao de novo máis tarde.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Ligazón de inicio de sesión non válida ou caducada.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Demasiados intentos de inicio de sesión errados, por favor, ténteo de novo en %minutes% minuto.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="he" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>שגיאה באימות</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>פרטי זיהוי לא נמצאו.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>לא ניתן היה לעבד את בקשת אימות בגלל בעיית מערכת.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>שם משתמש או סיסמא שגויים.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>עוגיה כבר שומשה.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>אין הרשאה מתאימה.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>אסימון CSRF לא חוקי.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>לא נמצא ספק אימות המתאימה לבקשה.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>אין סיישן זמין, או שתם הזמן הקצוב או העוגיות אינן מופעלות.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>הטוקן לא נמצא.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>שם משתמש לא נמצא.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>החשבון פג תוקף.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>פרטי התחברות פקעו תוקף.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>החשבון מבוטל.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>החשבון נעול.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>יותר מדי ניסיונות כניסה כושלים, אנא נסה שוב מאוחר יותר.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>קישור כניסה לא חוקי או שפג תוקפו.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>יותר מדי ניסיונות כניסה כושלים, אנא נסה שוב בוד %minutes% דקה.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="hr" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Dogodila se autentifikacijske iznimka.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Autentifikacijski podaci nisu pronađeni.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Autentifikacijski zahtjev nije moguće provesti uslijed sistemskog problema.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Neispravni akreditacijski podaci.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie je već netko drugi iskoristio.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Nemate privilegije zahtijevati resurs.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Neispravan CSRF token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Nije pronađen autentifikacijski provider koji bi podržao autentifikacijski token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Sesija nije dostupna, ili je istekla ili cookies nisu omogućeni.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Token nije pronađen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Korisničko ime nije pronađeno.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Račun je isteko.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Akreditacijski podaci su istekli.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Račun je onemogućen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Račun je zaključan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Previše neuspjelih pokušaja prijave, molim pokušajte ponovo kasnije.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Link za prijavu je isteako ili je neispravan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Previše neuspjelih pokušaja prijave, molim pokušajte ponovo za %minutes% minutu.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="hu" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Hitelesítési hiba lépett fel.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Nem találhatók hitelesítési információk.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>A hitelesítési kérést rendszerhiba miatt nem lehet feldolgozni.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Érvénytelen hitelesítési információk.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Ezt a sütit valaki más már felhasználta.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Nem rendelkezik az erőforrás eléréséhez szükséges jogosultsággal.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Érvénytelen CSRF token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Nem található a hitelesítési tokent támogató hitelesítési szolgáltatás.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Munkamenet nem áll rendelkezésre, túllépte az időkeretet vagy a sütik le vannak tiltva.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Nem található token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>A felhasználónév nem található.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>A fiók lejárt.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>A hitelesítési információk lejártak.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Felfüggesztett fiók.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Zárolt fiók.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Túl sok sikertelen bejelentkezési kísérlet, kérjük próbálja újra később.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Érvénytelen vagy lejárt bejelentkezési link.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Túl sok sikertelen bejelentkezési kísérlet, kérjük próbálja újra %minutes% perc múlva.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="hy" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Նույնականացման սխալ։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Նույնականացման տվյալները չեն գտնվել։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Համակարգային սխալ՝ նույնականացման հացրման պրոցեսինգի ժամանակ։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Սխալ մուտքային տվյալներ</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie-ն արդեն օգտագործվում է ուրիշի կողմից։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Ռեսուրսի հարցման համար չկա թույլատվություն։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Անվավեր CSRF թոքեն։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Նույնականացման ոչ մի մատակարար չի գտնվել, որ աջակցի նույնականացման թոքենը։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Հասանելի սեսիա չկա, կամ այն սպառվել է կամ cookie-ները անջատված են:</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Թոքենը չի գտնվել։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Օգտանունը չի գտնվել։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Հաշիվը ժամկետանց է։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Մուտքային տվյալները ժամկետանց են։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Հաշիվը դեկատիվացված է։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Հաշիվն արգելափակված է։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Չափից շատ մուտքի փորձեր, խնդրում ենք փորձել մի փոքր ուշ</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Անվավեր կամ ժամկետանց մուտքի հղում։</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Մուտքի չափազանց շատ անհաջող փորձեր: Խնդրում ենք կրկին փորձել %minutes րոպե:</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="id" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Terjadi sebuah pengecualian otentikasi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Kredensial otentikasi tidak bisa ditemukan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>Permintaan otentikasi tidak bisa diproses karena masalah sistem.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Kredensial salah.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie sudah digunakan oleh orang lain.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Tidak berhak untuk meminta sumber daya.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>Token CSRF salah.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Tidak ditemukan penyedia otentikasi untuk mendukung token otentikasi.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Tidak ada sesi yang tersedia, mungkin waktu sudah habis atau cookie tidak diaktifkan</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Tidak ada token yang bisa ditemukan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Username tidak bisa ditemukan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Akun telah berakhir.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Kredensial telah berakhir.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>Akun dinonaktifkan.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>Akun terkunci.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Terlalu banyak percobaan login yang salah, silahkan coba lagi nanti.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Link login salah atau sudah kedaluwarsa.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Terlalu banyak percobaan login yang salah, silahkan coba lagi dalam %minutes% menit.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="it" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>Si è verificato un errore di autenticazione.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>Impossibile trovare le credenziali di autenticazione.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>La richiesta di autenticazione non può essere processata a causa di un errore di sistema.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>Credenziali non valide.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Il cookie è già stato usato da qualcun altro.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>Non hai i privilegi per richiedere questa risorsa.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>CSRF token non valido.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>Non è stato trovato un valido fornitore di autenticazione per supportare il token.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>Nessuna sessione disponibile, può essere scaduta o i cookie non sono abilitati.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>Nessun token trovato.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>Username non trovato.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>Account scaduto.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>Credenziali scadute.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>L'account è disabilitato.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>L'account è bloccato.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>Troppi tentativi di login falliti, riprova tra un po'.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>Link di login scaduto o non valido.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>Troppi tentativi di login falliti, riprova tra %minutes% minuto.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="ja" datatype="plaintext" original="file.ext">
|
||||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>An authentication exception occurred.</source>
|
||||
<target>認証エラーが発生しました。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>Authentication credentials could not be found.</source>
|
||||
<target>認証資格がありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>Authentication request could not be processed due to a system problem.</source>
|
||||
<target>システムの問題により認証要求を処理できませんでした。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>Invalid credentials.</source>
|
||||
<target>資格が無効です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>Cookie has already been used by someone else.</source>
|
||||
<target>Cookie が別のユーザーで使用されています。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>Not privileged to request the resource.</source>
|
||||
<target>リソースをリクエストする権限がありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="7">
|
||||
<source>Invalid CSRF token.</source>
|
||||
<target>CSRF トークンが無効です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>No authentication provider found to support the authentication token.</source>
|
||||
<target>認証トークンをサポートする認証プロバイダーが見つかりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>No session available, it either timed out or cookies are not enabled.</source>
|
||||
<target>利用可能なセッションがありません。タイムアウトしたか、Cookie が無効になっています。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>No token could be found.</source>
|
||||
<target>トークンが見つかりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>Username could not be found.</source>
|
||||
<target>ユーザー名が見つかりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>Account has expired.</source>
|
||||
<target>アカウントが有効期限切れです。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>Credentials have expired.</source>
|
||||
<target>資格が有効期限切れです。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>Account is disabled.</source>
|
||||
<target>アカウントが無効です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>Account is locked.</source>
|
||||
<target>アカウントはロックされています。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>Too many failed login attempts, please try again later.</source>
|
||||
<target>ログイン試行回数を超えました。しばらくして再度お試しください。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>Invalid or expired login link.</source>
|
||||
<target>ログインリンクが有効期限切れ、もしくは無効です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
|
||||
<target>ログイン試行回数が多すぎます。%minutes%分後に再度お試しください。</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user