diff --git a/.dockerignore b/.dockerignore index 79bc7b2..f73b76d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,8 @@ .git/* .env -# vendor будет заполнен уже внутри контейнера +# vendor folder will be filled from the container vendor -# Все временные файлы +# Runtime data from any app module */runtime diff --git a/.env-dist b/.env-dist index 24b206c..95d87e4 100644 --- a/.env-dist +++ b/.env-dist @@ -1,42 +1,42 @@ -# Параметры приложения -## Env приложения +# Application params +## Application environment YII_DEBUG=true YII_ENV=dev DOMAIN=https://account.ely.by EMAILS_RENDERER_HOST=http://emails-renderer:3000 -## Параметры, отвечающие за безопасность +## Security params JWT_USER_SECRET= -## Внешние сервисы +## External services RECAPTCHA_PUBLIC= RECAPTCHA_SECRET= SENTRY_DSN= -## SMTP параметры +## SMTP params SMTP_USER= SMTP_PASS= SMTP_PORT= -## Параметры подключения к базе данных +## MariaDB connection params DB_HOST=db DB_DATABASE=ely_accounts DB_USER=ely_accounts_user DB_PASSWORD=ely_accounts_password -## Параметры подключения к redis +## Redis connection params REDIS_HOST=redis REDIS_PORT=6379 REDIS_DATABASE=0 REDIS_PASSWORD= -## Параметры Statsd +## StatsD metrics params STATSD_HOST=statsd.ely.by STATSD_PORT=8125 # This value can be blank STATSD_NAMESPACE= -## Конфигурация для Dev. +## Dev-only params XDEBUG_CONFIG=remote_host=10.254.254.254 PHP_IDE_CONFIG=serverName=docker diff --git a/.gitignore b/.gitignore index f90cb13..c2a1ab0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,11 +10,9 @@ # npm debug npm-debug* -# Docker и его override файлы +# Docker and related files /docker-compose.yml /docker-compose.override.yml - -# Локальный .env /.env # id_rsa diff --git a/api/aop/annotations/CollectModelMetrics.php b/api/aop/annotations/CollectModelMetrics.php index 4614c91..8689872 100644 --- a/api/aop/annotations/CollectModelMetrics.php +++ b/api/aop/annotations/CollectModelMetrics.php @@ -1,4 +1,6 @@ server->getTokenType()->setParam('access_token', $accessToken->getId()); $this->server->getTokenType()->setParam('expires_in', $this->getAccessTokenTTL()); - // Выдаём refresh_token, если запрошен offline_access + // Set refresh_token param only in case when offline_access requested if (isset($accessToken->getScopes()[ScopeStorage::OFFLINE_ACCESS])) { /** @var RefreshTokenGrant $refreshTokenGrant */ $refreshTokenGrant = $this->server->getGrantType('refresh_token'); @@ -222,8 +222,9 @@ class AuthCodeGrant extends AbstractGrant { } /** - * По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк. - * Так что оборачиваем функцию разбора скоупов, заменяя запятые на пробелы. + * In the earlier versions of Accounts Ely.by backend we had a comma-separated scopes + * list, while by OAuth2 standard it they should be separated by a space. Shit happens :) + * So override scopes validation function to reformat passed value. * * @param string $scopeParam * @param BaseClientEntity $client diff --git a/api/components/OAuth2/Grants/ClientCredentialsGrant.php b/api/components/OAuth2/Grants/ClientCredentialsGrant.php index 4fabb4f..06db2d5 100644 --- a/api/components/OAuth2/Grants/ClientCredentialsGrant.php +++ b/api/components/OAuth2/Grants/ClientCredentialsGrant.php @@ -69,8 +69,9 @@ class ClientCredentialsGrant extends AbstractGrant { } /** - * По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк. - * Так что оборачиваем функцию разбора скоупов, заменяя запятые на пробелы. + * In the earlier versions of Accounts Ely.by backend we had a comma-separated scopes + * list, while by OAuth2 standard it they should be separated by a space. Shit happens :) + * So override scopes validation function to reformat passed value. * * @param string $scopeParam * @param BaseClientEntity $client diff --git a/api/components/OAuth2/Grants/RefreshTokenGrant.php b/api/components/OAuth2/Grants/RefreshTokenGrant.php index 5c6b361..4f20ad9 100644 --- a/api/components/OAuth2/Grants/RefreshTokenGrant.php +++ b/api/components/OAuth2/Grants/RefreshTokenGrant.php @@ -48,8 +48,9 @@ class RefreshTokenGrant extends AbstractGrant { } /** - * По стандарту OAuth2 scopes должны разделяться пробелом, а не запятой. Косяк. - * Так что оборачиваем функцию разбора скоупов, заменяя запятые на пробелы. + * In the earlier versions of Accounts Ely.by backend we had a comma-separated scopes + * list, while by OAuth2 standard it they should be separated by a space. Shit happens :) + * So override scopes validation function to reformat passed value. * * @param string $scopeParam * @param BaseClientEntity $client @@ -62,9 +63,9 @@ class RefreshTokenGrant extends AbstractGrant { } /** - * Метод таки пришлось переписать по той причине, что нынче мы храним access_token в redis с expire значением, - * так что он может банально несуществовать на тот момент, когда к нему через refresh_token попытаются обратиться. - * Поэтому мы расширили логику RefreshTokenEntity и она теперь знает о сессии, в рамках которой была создана + * The method has been overridden because we stores access_tokens in Redis with expire value, + * so they might not exists at the moment, when it will be requested via refresh_token. + * That's why we extends RefreshTokenEntity to give it knowledge about related session. * * @inheritdoc * @throws \League\OAuth2\Server\Exception\OAuthException diff --git a/api/components/OAuth2/Storage/ClientStorage.php b/api/components/OAuth2/Storage/ClientStorage.php index d7cca10..fa1aae4 100644 --- a/api/components/OAuth2/Storage/ClientStorage.php +++ b/api/components/OAuth2/Storage/ClientStorage.php @@ -27,16 +27,12 @@ class ClientStorage extends AbstractStorage implements ClientInterface { return null; } - // TODO: нужно учитывать тип приложения - /* - * Для приложений типа "настольный" redirect_uri необязателем - он должен быть по умолчанию равен - * статичному редиректу на страницу сайта - * А для приложений типа "сайт" редирект должен быть всегда. - * Короче это нужно учесть - */ + // TODO: should check application type + // For "desktop" app type redirect_uri is not required and should be by default set + // to the static redirect, but for "site" it's required always. if ($redirectUri !== null) { if (in_array($redirectUri, [self::REDIRECT_STATIC_PAGE, self::REDIRECT_STATIC_PAGE_WITH_CODE], true)) { - // Тут, наверное, нужно проверить тип приложения + // I think we should check the type of application here } else { if (!StringHelper::startsWith($redirectUri, $model->redirect_uri, false)) { return null; diff --git a/api/components/OAuth2/Storage/ScopeStorage.php b/api/components/OAuth2/Storage/ScopeStorage.php index de74406..85be563 100644 --- a/api/components/OAuth2/Storage/ScopeStorage.php +++ b/api/components/OAuth2/Storage/ScopeStorage.php @@ -39,8 +39,8 @@ class ScopeStorage extends AbstractStorage implements ScopeInterface { /** * @param string $scope - * @param string $grantType передаётся, если запрос поступает из grant. В этом случае нужно отфильтровать - * только те права, которые можно получить на этом grant. + * @param string $grantType is passed on if called from the grant. + * In this case, you only need to filter out the rights that you can get on this grant. * @param string $clientId * * @return ScopeEntity|null diff --git a/api/components/OAuth2/Storage/SessionStorage.php b/api/components/OAuth2/Storage/SessionStorage.php index 2efdfe4..11e89d9 100644 --- a/api/components/OAuth2/Storage/SessionStorage.php +++ b/api/components/OAuth2/Storage/SessionStorage.php @@ -52,7 +52,7 @@ class SessionStorage extends AbstractStorage implements SessionInterface { ->andWhere([ 'client_id' => $clientId, 'owner_type' => $ownerType, - 'owner_id' => (string)$ownerId, // Переводим в строку, чтобы работали индексы, т.к. поле varchar + 'owner_id' => (string)$ownerId, // Casts as a string to make the indexes work, because the varchar field ])->scalar(); if ($sessionId === false) { diff --git a/api/components/OAuth2/Utils/Scopes.php b/api/components/OAuth2/Utils/Scopes.php index ac1adfe..b2ef88c 100644 --- a/api/components/OAuth2/Utils/Scopes.php +++ b/api/components/OAuth2/Utils/Scopes.php @@ -1,15 +1,16 @@ addClaim(new Claim\JwtId($session->id)); } else { $session = null; - // Если мы не сохраняем сессию, то токен должен жить подольше, - // чтобы не прогорала сессия во время работы с аккаунтом + // If we don't remember a session, the token should live longer + // so that the session doesn't end while working with the account $token->addClaim(new Claim\Expiration((new DateTime())->add(new DateInterval($this->sessionTimeout)))); } @@ -125,8 +125,8 @@ class Component extends YiiUserComponent { /** * @param string $jwtString - * @return Token распаршенный токен - * @throws VerificationException если один из Claims не пройдёт проверку + * @return Token + * @throws VerificationException in case when some Claim not pass the validation */ public function parseToken(string $jwtString): Token { $token = &self::$parsedTokensCache[$jwtString]; @@ -149,13 +149,13 @@ class Component extends YiiUserComponent { } /** - * Метод находит AccountSession модель, относительно которой был выдан текущий JWT токен. - * В случае, если на пути поиска встретится ошибка, будет возвращено значение null. Возможные кейсы: - * - Юзер не авторизован - * - Почему-то нет заголовка с токеном - * - Во время проверки токена возникла ошибка, что привело к исключению - * - В токене не найдено ключа сессии. Такое возможно, если юзер выбрал "не запоминать меня" - * или просто старые токены, без поддержки сохранения используемой сессии + * The method searches AccountSession model, which one has been used to create current JWT token. + * null will be returned in case when any of the following situations occurred: + * - The user isn't authorized + * - There is no header with a token + * - Token validation isn't passed and some exception has been thrown + * - No session key found in the token. This is possible if the user chose not to remember me + * or just some old tokens, without the support of saving the used session * * @return AccountSession|null */ diff --git a/api/components/User/IdentityInterface.php b/api/components/User/IdentityInterface.php index b61a0bc..47bc9b7 100644 --- a/api/components/User/IdentityInterface.php +++ b/api/components/User/IdentityInterface.php @@ -17,17 +17,17 @@ interface IdentityInterface extends \yii\web\IdentityInterface { public static function findIdentityByAccessToken($token, $type = null): IdentityInterface; /** - * Этот метод используется для получения токена, к которому привязаны права. - * У нас права привязываются к токенам, так что возвращаем именно его id. + * This method is used to obtain a token to which scopes are attached. + * Our permissions are attached to tokens itself, so we return its id. * * @return string */ public function getId(): string; /** - * Метод возвращает аккаунт, который привязан к текущему токену. - * Но не исключено, что токен был выдан и без привязки к аккаунту, так что - * следует это учитывать. + * The method returns an account that is attached to the current token. + * But it's possible that the token was issued without binding to the account, + * so you should handle it. * * @return Account|null */ diff --git a/api/controllers/Controller.php b/api/controllers/Controller.php index 626f247..7f62f4d 100644 --- a/api/controllers/Controller.php +++ b/api/controllers/Controller.php @@ -1,11 +1,13 @@ HttpBearerAuth::class, 'user' => Yii::$app->getUser(), ]; - // xml и rate limiter нам не понадобятся + // XML and rate limiter is not necessary unset( $parentBehaviors['contentNegotiator']['formats']['application/xml'], $parentBehaviors['rateLimiter'] diff --git a/api/exceptions/ThisShouldNotHappenException.php b/api/exceptions/ThisShouldNotHappenException.php index 699992b..0c18aeb 100644 --- a/api/exceptions/ThisShouldNotHappenException.php +++ b/api/exceptions/ThisShouldNotHappenException.php @@ -1,10 +1,12 @@ сколько кэшировать. + * @var array|callable array or callback, contains pairs of route => cache duration. * - * Период можно задавать 2-умя путями: - * - если значение начинается с префикса @, оно задаёт абсолютное время в unix timestamp, - * до которого ответ может быть закэширован. - * - в ином случае значение интерпретируется как количество секунд, на которое необходимо - * закэшировать ответ + * Duration can be set in 2-ways: + * - if the value starts with the @ prefix, it sets the absolute time + * in unix timestamp that the response can be cached to. + * - otherwise, the value is interpreted as the number of seconds + * for which the response must be cached */ public $rules; diff --git a/api/models/authentication/RegistrationForm.php b/api/models/authentication/RegistrationForm.php index fba45d4..a9805d2 100644 --- a/api/models/authentication/RegistrationForm.php +++ b/api/models/authentication/RegistrationForm.php @@ -116,14 +116,14 @@ class RegistrationForm extends ApiForm { } /** - * Метод проверяет, можно ли занять указанный при регистрации ник или e-mail. Так случается, - * что пользователи вводят неправильный e-mail или ник, после замечают это и пытаются вновь - * выпонить регистрацию. Мы не будем им мешать и просто удаляем существующие недозарегистрированные - * аккаунты, позволяя им зарегистрироваться. - * - * @param array $errors массив, где ключ - это поле, а значение - первая ошибка из нашего - * стандартного словаря ошибок + * The method checks whether the username or E-mail specified during registration + * can be occupied. It happens that users enter the wrong E-mail or username, + * then notice it and try to re-register. We'll not interfere with them + * and simply delete existing not-finished-registration account, + * allowing them to take it. * + * @param array $errors an array where the key is a field and the value is + * the first error from our standard error dictionary * @return bool */ protected function canContinue(array $errors): bool { diff --git a/api/modules/accounts/models/BanAccountForm.php b/api/modules/accounts/models/BanAccountForm.php index d35fec4..f3712d2 100644 --- a/api/modules/accounts/models/BanAccountForm.php +++ b/api/modules/accounts/models/BanAccountForm.php @@ -12,17 +12,16 @@ class BanAccountForm extends AccountActionForm { public const DURATION_FOREVER = -1; /** - * Нереализованный функционал блокировки аккаунта на определённый период времени. - * Сейчас установка этого параметра ничего не даст, аккаунт будет заблокирован навечно, - * но, по задумке, здесь можно передать количество секунд, на которое будет - * заблокирован аккаунт пользователя. + * Unimplemented account blocking functionality for a certain period of time. + * Setting this parameter currently will do nothing, the account will be blocked forever, + * but the idea is to pass the number of seconds for which the user's account will be blocked. * * @var int */ public $duration = self::DURATION_FOREVER; /** - * Нереализованный функционал указания причины блокировки аккаунта. + * Unimplemented functionality to indicate the reason for account blocking. * * @var string */ diff --git a/api/modules/accounts/models/SendEmailVerificationForm.php b/api/modules/accounts/models/SendEmailVerificationForm.php index cd680da..ff09c80 100644 --- a/api/modules/accounts/models/SendEmailVerificationForm.php +++ b/api/modules/accounts/models/SendEmailVerificationForm.php @@ -15,7 +15,7 @@ class SendEmailVerificationForm extends AccountActionForm { public $password; /** - * @var null meta-поле, чтобы заставить yii валидировать и публиковать ошибки, связанные с отправленными email + * @var null meta-field to force yii to validate and publish errors related to sent emails */ public $email; @@ -76,10 +76,10 @@ class SendEmailVerificationForm extends AccountActionForm { } /** - * Возвращает E-mail активацию, которая использовалась внутри процесса для перехода на следующий шаг. - * Метод предназначен для проверки, не слишком ли часто отправляются письма о смене E-mail. - * Проверяем тип подтверждения нового E-mail, поскольку при переходе на этот этап, активация предыдущего - * шага удаляется. + * Returns the E-mail activation that was used within the process to move on to the next step. + * The method is designed to check if the E-mail change messages are sent too often. + * Including checking for the confirmation of the new E-mail type, because when you go to this step, + * the activation of the previous step is removed. */ public function getEmailActivation(): ?EmailActivation { return $this->getAccount() diff --git a/api/modules/accounts/models/TwoFactorAuthInfo.php b/api/modules/accounts/models/TwoFactorAuthInfo.php index 7301516..b7544ab 100644 --- a/api/modules/accounts/models/TwoFactorAuthInfo.php +++ b/api/modules/accounts/models/TwoFactorAuthInfo.php @@ -62,13 +62,14 @@ class TwoFactorAuthInfo extends BaseAccountForm { } /** - * В используемой либе для рендеринга QR кода нет возможности указать QR code version. + * In the used library for rendering QR codes there is no possibility to specify a QR code version. * http://www.qrcode.com/en/about/version.html - * По какой-то причине 7 и 8 версии не читаются вовсе, с логотипом или без. - * Поэтому нужно иначально привести строку к длинне 9 версии (91), добавляя к концу - * строки необходимое количество символов "#". Этот символ используется, т.к. нашим - * контентом является ссылка и чтобы не вводить лишние параметры мы помечаем добавочную - * часть как хеш часть и все программы для чтения QR кодов продолжают свою работу. + * + * For some reason, generated versions 7 and 8 are not readable at all, with or without a logo. + * Therefore, it is necessary to initially append the string to the length of version 9 (91), + * adding to the end of the string the necessary number of characters "#". + * This symbol is used because our content is a link and in order not to enter unnecessary parameters + * we mark the additional part as a hash part and all application for scanning QR codes continue their work. * * @param string $content * @return string @@ -78,11 +79,11 @@ class TwoFactorAuthInfo extends BaseAccountForm { } /** - * otp_secret кодируется в Base32, но после кодирования в результурющей строке есть символы, - * которые можно перепутать (1 и l, O и 0, и т.д.). Т.к. целевая строка не предназначена для - * обратной расшифровки, то мы можем безжалостно их удалить. Итоговая строка составляет 160% - * от исходной. Поэтому, генерируя исходные случайные байты, мы должны обеспечить такую длину, - * чтобы 160% её было равно запрошенному значению. + * otp_secret is encoded in Base32, but after encoding there are characters in the result line + * that can be mixed up (1 and l, O and 0, etc.). Since the target string isn't intended for + * reverse decryption, we can safely delete them. The resulting string is 160% of the source line. + * That's why, when generating the initial random bytes, we should provide such a length that + * 160% of it is equal to the requested length. * * @param int $length * @return string @@ -91,6 +92,7 @@ class TwoFactorAuthInfo extends BaseAccountForm { $randomBytesLength = ceil($length / 1.6); $result = ''; while (strlen($result) < $length) { + /** @noinspection PhpUnhandledExceptionInspection */ $encoded = Base32::encodeUpper(random_bytes($randomBytesLength)); $encoded = trim($encoded, '='); $encoded = str_replace(['I', 'L', 'O', 'U', '1', '0'], '', $encoded); diff --git a/api/modules/authserver/Module.php b/api/modules/authserver/Module.php index 09e0026..9d242aa 100644 --- a/api/modules/authserver/Module.php +++ b/api/modules/authserver/Module.php @@ -51,9 +51,8 @@ class Module extends \yii\base\Module implements BootstrapInterface { } /** - * Поскольку это legacy метод и документации в новой среде для него не будет, - * нет смысла выставлять на показ внутренние url, так что ограничиваем доступ - * только для заходов по старому домену + * Since this is a legacy method and there will be no documentation for it in the new environment, + * there is no point in displaying the internal API, so we are limiting access only to logons from the old domain. * * @throws NotFoundHttpException */ diff --git a/api/modules/authserver/controllers/AuthenticationController.php b/api/modules/authserver/controllers/AuthenticationController.php index 728859b..d241203 100644 --- a/api/modules/authserver/controllers/AuthenticationController.php +++ b/api/modules/authserver/controllers/AuthenticationController.php @@ -42,24 +42,24 @@ class AuthenticationController extends Controller { $model = new models\ValidateForm(); $model->load(Yii::$app->request->post()); $model->validateToken(); - // В случае успеха ожидается пустой ответ. В случае ошибки же бросается исключение, - // которое обработает ErrorHandler + // If successful, an empty answer is expected. + // In case of an error, an exception is thrown which will be processed by ErrorHandler } public function actionSignout() { $model = new models\SignoutForm(); $model->load(Yii::$app->request->post()); $model->signout(); - // В случае успеха ожидается пустой ответ. В случае ошибки же бросается исключение, - // которое обработает ErrorHandler + // If successful, an empty answer is expected. + // In case of an error, an exception is thrown which will be processed by ErrorHandler } public function actionInvalidate() { $model = new models\InvalidateForm(); $model->load(Yii::$app->request->post()); $model->invalidateToken(); - // В случае успеха ожидается пустой ответ. В случае ошибки же бросается исключение, - // которое обработает ErrorHandler + // If successful, an empty answer is expected. + // In case of an error, an exception is thrown which will be processed by ErrorHandler } } diff --git a/api/modules/authserver/exceptions/AuthserverException.php b/api/modules/authserver/exceptions/AuthserverException.php index 4062983..9d831d7 100644 --- a/api/modules/authserver/exceptions/AuthserverException.php +++ b/api/modules/authserver/exceptions/AuthserverException.php @@ -7,7 +7,7 @@ use yii\web\HttpException; class AuthserverException extends HttpException { /** - * Рефлексия быстрее, как ни странно: + * Reflection is faster, weird as it may seem: * @url https://coderwall.com/p/cpxxxw/php-get-class-name-without-namespace#comment_19313 * * @return string diff --git a/api/modules/authserver/models/AuthenticateData.php b/api/modules/authserver/models/AuthenticateData.php index 68e373a..5efc34a 100644 --- a/api/modules/authserver/models/AuthenticateData.php +++ b/api/modules/authserver/models/AuthenticateData.php @@ -33,7 +33,7 @@ class AuthenticateData { ]; if ($includeAvailableProfiles) { - // Сами моянги ещё ничего не придумали с этими availableProfiles + // The Moiangs themselves haven't come up with anything yet with these availableProfiles $availableProfiles[0] = $result['selectedProfile']; $result['availableProfiles'] = $availableProfiles; } diff --git a/api/modules/authserver/models/AuthenticationForm.php b/api/modules/authserver/models/AuthenticationForm.php index 5bacab6..4accba6 100644 --- a/api/modules/authserver/models/AuthenticationForm.php +++ b/api/modules/authserver/models/AuthenticationForm.php @@ -56,7 +56,8 @@ class AuthenticationForm extends ApiForm { Authserver::error("User with login = '{$this->username}' passed wrong password."); } - // На старом сервере авторизации использовалось поле nickname, а не username, так что сохраняем эту логику + // The previous authorization server implementation used the nickname field instead of username, + // so we keep such behavior $attribute = $loginForm->getLoginAttribute(); if ($attribute === 'username') { $attribute = 'nickname'; diff --git a/api/modules/authserver/models/SignoutForm.php b/api/modules/authserver/models/SignoutForm.php index 7f4b1d7..8765b02 100644 --- a/api/modules/authserver/models/SignoutForm.php +++ b/api/modules/authserver/models/SignoutForm.php @@ -30,11 +30,12 @@ class SignoutForm extends ApiForm { if (!$loginForm->validate()) { $errors = $loginForm->getFirstErrors(); if (isset($errors['login']) && $errors['login'] === E::ACCOUNT_BANNED) { - // Считаем, что заблокированный может безболезненно выйти + // We believe that a blocked one can get out painlessly return true; } - // На старом сервере авторизации использовалось поле nickname, а не username, так что сохраняем эту логику + // The previous authorization server implementation used the nickname field instead of username, + // so we keep such behavior $attribute = $loginForm->getLoginAttribute(); if ($attribute === 'username') { $attribute = 'nickname'; diff --git a/api/modules/authserver/validators/ClientTokenValidator.php b/api/modules/authserver/validators/ClientTokenValidator.php index 8825b8f..21c336b 100644 --- a/api/modules/authserver/validators/ClientTokenValidator.php +++ b/api/modules/authserver/validators/ClientTokenValidator.php @@ -4,8 +4,8 @@ namespace api\modules\authserver\validators; use api\modules\authserver\exceptions\IllegalArgumentException; /** - * Максимальная длина clientToken для нашей базы данных составляет 255. - * После этого мы не принимаем указанный токен + * The maximum length of clientToken for our database is 255. + * If the token is longer, we do not accept the passed token at all. */ class ClientTokenValidator extends \yii\validators\RequiredValidator { diff --git a/api/modules/authserver/validators/RequiredValidator.php b/api/modules/authserver/validators/RequiredValidator.php index fe25c3c..4d38f37 100644 --- a/api/modules/authserver/validators/RequiredValidator.php +++ b/api/modules/authserver/validators/RequiredValidator.php @@ -4,8 +4,8 @@ namespace api\modules\authserver\validators; use api\modules\authserver\exceptions\IllegalArgumentException; /** - * Для данного модуля нам не принципиально, что там за ошибка: если не хватает хотя бы одного - * параметра - тут же отправляем исключение и дело с концом + * For this module, it is not important for us what the error is: if at least one parameter is missing, + * we immediately throw an exception and that's it. */ class RequiredValidator extends \yii\validators\RequiredValidator { diff --git a/api/modules/mojang/controllers/ApiController.php b/api/modules/mojang/controllers/ApiController.php index a7b19b2..be19e61 100644 --- a/api/modules/mojang/controllers/ApiController.php +++ b/api/modules/mojang/controllers/ApiController.php @@ -26,10 +26,10 @@ class ApiController extends Controller { ->andWhere(['<=', 'applied_in', $at]) ->one(); - // Запрос выше находит просто последний случай использования, не учитывая то, что ник - // мог быть сменён с тех пор. Поэтому дополнительно проводим проверку, чтобы ник находился - // в каком-либо периоде (т.е. существовала последующая запись) или последний использовавший - // ник пользователь не сменил его на нечто иное + // The query above simply finds the latest case of usage, without taking into account the fact + // that the nickname may have been changed since then. Therefore, we additionally check + // that the nickname is in some period (i.e. there is a subsequent entry) or that the last user + // who used the nickname has not changed it to something else $account = null; if ($record !== null) { if ($record->account->username === $record->username || $record->findNext($at) !== null) { @@ -76,8 +76,8 @@ class ApiController extends Controller { ]; } - // У первого элемента не должно быть времени, когда он был применён - // Хотя мы в принципе эту инфу знаем. А вот Mojang, вероятно, нет + // The first element shouldn't have time when it was applied. + // Although we know this information in fact. But Mojang probably doesn't. unset($data[0]['changedToAt']); return $data; diff --git a/api/modules/oauth/models/OauthProcess.php b/api/modules/oauth/models/OauthProcess.php index 44a14ab..d282c95 100644 --- a/api/modules/oauth/models/OauthProcess.php +++ b/api/modules/oauth/models/OauthProcess.php @@ -32,10 +32,10 @@ class OauthProcess { } /** - * Запрос, который должен проверить переданные параметры oAuth авторизации - * и сформировать ответ для нашего приложения на фронте + * A request that should check the passed OAuth2 authorization params and build a response + * for our frontend application. * - * Входными данными является стандартный список GET параметров по стандарту oAuth: + * The input data is the standard GET parameters list according to the OAuth2 standard: * $_GET = [ * client_id, * redirect_uri, @@ -44,7 +44,7 @@ class OauthProcess { * state, * ]; * - * Кроме того можно передать значения description для переопределения описания приложения. + * In addition, you can pass the description value to override the application's description. * * @return array */ @@ -67,10 +67,10 @@ class OauthProcess { } /** - * Метод выполняется генерацию авторизационного кода (authorization_code) и формирование - * ссылки для дальнейшнешл редиректа пользователя назад на сайт клиента + * This method generates authorization_code and a link + * for the user's further redirect to the client's site. * - * Входными данными является всё те же параметры, что были необходимы для валидации: + * The input data are the same parameters that were necessary for validation request: * $_GET = [ * client_id, * redirect_uri, @@ -79,9 +79,9 @@ class OauthProcess { * state, * ]; * - * А также поле accept, которое показывает, что пользователь нажал на кнопку "Принять". - * Если поле присутствует, то оно будет интерпретироваться как любое приводимое к false значение. - * В ином случае, значение будет интерпретировано, как положительный исход. + * Also, the accept field, which shows that the user has clicked on the "Accept" button. + * If the field is present, it will be interpreted as any value resulting in false positives. + * Otherwise, the value will be interpreted as "true". * * @return array */ @@ -125,9 +125,9 @@ class OauthProcess { } /** - * Метод выполняется сервером приложения, которому был выдан auth_token или refresh_token. + * The method is executed by the application server to which auth_token or refresh_token was given. * - * Входными данными является стандартный список POST параметров по стандарту oAuth: + * Input data is a standard list of POST parameters according to the OAuth2 standard: * $_POST = [ * client_id, * client_secret, @@ -135,7 +135,7 @@ class OauthProcess { * code, * grant_type, * ] - * для запроса grant_type = authentication_code. + * for request with grant_type = authentication_code: * $_POST = [ * client_id, * client_secret, @@ -170,8 +170,8 @@ class OauthProcess { } /** - * Метод проверяет, может ли текущий пользователь быть автоматически авторизован - * для указанного клиента без запроса доступа к необходимому списку прав + * The method checks whether the current user can be automatically authorized for the specified client + * without requesting access to the necessary list of scopes * * @param Account $account * @param OauthClient $client @@ -206,7 +206,7 @@ class OauthProcess { private function buildSuccessResponse(array $queryParams, OauthClient $client, array $scopes): array { return [ 'success' => true, - // Возвращаем только те ключи, которые имеют реальное отношение к oAuth параметрам + // We return only those keys which are related to the OAuth2 standard parameters 'oAuth' => array_intersect_key($queryParams, array_flip([ 'client_id', 'redirect_uri', diff --git a/api/modules/session/exceptions/SessionServerException.php b/api/modules/session/exceptions/SessionServerException.php index 98bb656..0fdd842 100644 --- a/api/modules/session/exceptions/SessionServerException.php +++ b/api/modules/session/exceptions/SessionServerException.php @@ -7,7 +7,7 @@ use yii\web\HttpException; class SessionServerException extends HttpException { /** - * Рефлексия быстрее, как ни странно: + * Reflection is faster, weird as it may seem: * @url https://coderwall.com/p/cpxxxw/php-get-class-name-without-namespace#comment_19313 * * @return string diff --git a/api/modules/session/models/protocols/LegacyJoin.php b/api/modules/session/models/protocols/LegacyJoin.php index 6b119ff..e7c8297 100644 --- a/api/modules/session/models/protocols/LegacyJoin.php +++ b/api/modules/session/models/protocols/LegacyJoin.php @@ -41,11 +41,10 @@ class LegacyJoin extends BaseJoin { } /** - * Метод проводит инициализацию значений полей для соотвествия общим канонам - * именования в проекте + * The method initializes field values to meet the general naming conventions in the project * - * Бьём по ':' для учёта авторизации в современных лаунчерах и входе на более старую - * версию игры. Там sessionId передаётся как "token:{accessToken}:{uuid}", так что это нужно обработать + * Split by ':' to take into account authorization in modern launchers and login to an legacy version of the game. + * The sessionId is passed on as "token:{accessToken}:{uuid}", so it needs to be processed */ private function parseSessionId(string $sessionId) { $parts = explode(':', $sessionId); diff --git a/api/modules/session/validators/RequiredValidator.php b/api/modules/session/validators/RequiredValidator.php index 63cae1f..6dc1e57 100644 --- a/api/modules/session/validators/RequiredValidator.php +++ b/api/modules/session/validators/RequiredValidator.php @@ -4,8 +4,8 @@ namespace api\modules\session\validators; use api\modules\session\exceptions\IllegalArgumentException; /** - * Для данного модуля нам не принципиально, что там за ошибка: если не хватает хотя бы одного - * параметра - тут же отправляем исключение и дело с концом + * For this module, it is not important for us what the error is: if at least one parameter is missing, + * we immediately throw an exception and that's it. */ class RequiredValidator extends \yii\validators\RequiredValidator { diff --git a/api/request/RequestParser.php b/api/request/RequestParser.php index 614a5fe..a63ea0c 100644 --- a/api/request/RequestParser.php +++ b/api/request/RequestParser.php @@ -6,16 +6,15 @@ use yii\web\JsonParser; use yii\web\RequestParserInterface; /** - * Т.к. Yii2 не предоставляет возможности сделать fallback для неспаршенного - * request, нужно полностью реимплементировать логику парсинга запроса. + * Since Yii2 doesn't provide an opportunity to make a fallback for an unparsed request, + * the query parsing logic must be fully reimplemented. * - * Код взят из \yii\web\Request::getBodyParams() и вывернут таким образом, - * чтобы по нисходящей пытаться спарсить запрос: - * - сначала проверяем, если PHP справился сам, то возвращаем его значение - * - дальше пробуем спарсить JSON, который закодирован в теле - * - если не вышло, то предположим, что это PUT, DELETE или иной другой запрос, - * который PHP автоматически не осиливает спарсить, так что пытаемся его спарсить - * самостоятельно + * The code is taken from \yii\web\Request::getBodyParams() and reworked in such a way + * that it tries to parse the request by the next steps: + * - first check if PHP has managed to do it by itself, then we return its value; + * - then we try to parse JSON, which is encoded in the body; + * - if it doesn't work out, let's assume it's a PUT, DELETE or other request + * that PHP doesn't automatically overpower to parse, so we try to parse it ourselves. */ class RequestParser implements RequestParserInterface { diff --git a/api/tests/functional/accounts/GetCest.php b/api/tests/functional/accounts/GetCest.php index a838a65..64c5f41 100644 --- a/api/tests/functional/accounts/GetCest.php +++ b/api/tests/functional/accounts/GetCest.php @@ -80,7 +80,7 @@ class GetCest { } public function testGetInfoWithExpiredToken(FunctionalTester $I) { - // Устанавливаем заведомо истёкший токен + // We're setting up a known expired token $I->amBearerAuthenticated( 'eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NjQ2Mjc1NDUsImV4cCI6MTQ2NDYzMTE0NSwic3ViIjoiZWx5fDEiLCJlbHktc' . '2NvcGVzIjoiYWNjb3VudHNfd2ViX3VzZXIifQ.v1u8V5wk2RkWmnZtH3jZvM3zO1Gpgbp2DQFfLfy8jHY' diff --git a/api/tests/functional/authserver/ValidateCest.php b/api/tests/functional/authserver/ValidateCest.php index 14cd4f6..b31160c 100644 --- a/api/tests/functional/authserver/ValidateCest.php +++ b/api/tests/functional/authserver/ValidateCest.php @@ -55,7 +55,7 @@ class ValidateCest { public function expiredAccessToken(AuthserverSteps $I) { $I->wantTo('get error on expired accessToken'); $this->route->validate([ - // Заведомо истёкший токен из дампа + // Knowingly expired token from the dump 'accessToken' => '6042634a-a1e2-4aed-866c-c661fe4e63e2', ]); $I->canSeeResponseCodeIs(401); diff --git a/api/tests/functional/oauth/ClientCredentialsCest.php b/api/tests/functional/oauth/ClientCredentialsCest.php index d7f25ca..5a5ff37 100644 --- a/api/tests/functional/oauth/ClientCredentialsCest.php +++ b/api/tests/functional/oauth/ClientCredentialsCest.php @@ -59,7 +59,7 @@ class ClientCredentialsCest { } public function testIssueTokenWithPublicScopes(OauthSteps $I) { - // TODO: у нас пока нет публичных скоупов, поэтому тест прогоняется с пустым набором + // TODO: we don't have any public scopes yet for this grant, so the test runs with an empty set $this->route->issueToken($this->buildParams( 'ely', 'ZuM1vGchJz-9_UZ5HC3H3Z9Hg5PzdbkM', diff --git a/api/tests/unit/TestCase.php b/api/tests/unit/TestCase.php index fe122c4..60e2a4d 100644 --- a/api/tests/unit/TestCase.php +++ b/api/tests/unit/TestCase.php @@ -19,7 +19,7 @@ class TestCase extends Unit { } /** - * Список фикстур, что будут загружены перед тестом, но после зачистки базы данных + * A list of fixtures that will be loaded before the test, but after the database is cleaned up * * @url http://codeception.com/docs/modules/Yii2#fixtures * diff --git a/api/validators/EmailActivationKeyValidator.php b/api/validators/EmailActivationKeyValidator.php index fb02ed1..e6ee696 100644 --- a/api/validators/EmailActivationKeyValidator.php +++ b/api/validators/EmailActivationKeyValidator.php @@ -6,13 +6,13 @@ use common\models\EmailActivation; use yii\validators\Validator; /** - * Валидатор для проверки полученного от пользователя кода активации. - * В случае успешной валидации подменяет значение поля на актуальную модель + * Validator to check the activation code received from the user. + * In case of success it replaces the field value with the corresponding model. */ class EmailActivationKeyValidator extends Validator { /** - * @var int тип ключа. Если не указан, то валидирует по всем ключам. + * @var int the type of key. If not specified, it validates over all keys. */ public $type; diff --git a/api/validators/TotpValidator.php b/api/validators/TotpValidator.php index ce8f6e8..f06a21f 100644 --- a/api/validators/TotpValidator.php +++ b/api/validators/TotpValidator.php @@ -17,17 +17,16 @@ class TotpValidator extends Validator { public $account; /** - * @var int|null Задаёт окно, в промежуток которого будет проверяться код. - * Позволяет избежать ситуации, когда пользователь ввёл код в последнюю секунду - * его существования и пока шёл запрос, тот протух. - * Значение задаётся в +- периодах, а не секундах. + * @var int|null Specifies the window in the interval of which the code will be checked. + * Allows you to avoid the situation when the user entered the code in the last second of its existence + * and while the request was being sent, it has changed. The value is set in +- periods, not seconds. */ public $window; /** - * @var int|callable|null Позволяет задать точное время, относительно которого будет - * выполняться проверка. Это может быть собственно время или функция, возвращающая значение. - * Если не задано, то будет использовано текущее время. + * @var int|callable|null Allows you to set the exact time against which the validation will be performed. + * It may be the unix time or a function returning a unix time. + * If not specified, the current time will be used. */ public $timestamp; diff --git a/common/behaviors/DataBehavior.php b/common/behaviors/DataBehavior.php index 967cf85..f5a52ee 100644 --- a/common/behaviors/DataBehavior.php +++ b/common/behaviors/DataBehavior.php @@ -7,7 +7,7 @@ use yii\helpers\ArrayHelper; class DataBehavior extends Behavior { /** - * @var string имя атрибута, к которому будет применяться поведение + * @var string attribute name to which this behavior will be applied */ public $attribute = '_data'; @@ -31,8 +31,8 @@ class DataBehavior extends Behavior { /** * @return array - * @throws \yii\base\ErrorException Yii2 подхватит Notice от неправильной десериализаци и превратит его - * в свой Exception, благодаря чему программа сможем продолжить нормально работать (вернее ловить Exception) + * @throws \yii\base\ErrorException Yii2 will catch Notice from the wrong deserialization and turn it + * into its own Exception, so that the program can continue to work normally (you still should catch an Exception) */ private function getData() { $data = $this->owner->{$this->attribute}; diff --git a/common/behaviors/EmailActivationExpirationBehavior.php b/common/behaviors/EmailActivationExpirationBehavior.php index d518437..9589cef 100644 --- a/common/behaviors/EmailActivationExpirationBehavior.php +++ b/common/behaviors/EmailActivationExpirationBehavior.php @@ -9,23 +9,23 @@ use yii\base\Behavior; class EmailActivationExpirationBehavior extends Behavior { /** - * @var int количество секунд, прежде чем можно будет повторить отправку кода + * @var int the number of seconds before the code can be sent again * @see EmailActivation::canRepeat() */ public $repeatTimeout; /** - * @var int количество секунд, прежде чем это подтверждение истечёт + * @var int the number of seconds before this activation expires * @see EmailActivation::isExpired() */ public $expirationTimeout; /** - * Можно ли повторить отправку письма текущего типа? - * Для проверки используется значение EmailActivation::$repeatTimeout и интерпретируется как: - * - <0 запретит повторную отправку этого кода - * - =0 позволит отправлять сообщения в любой момент - * - >0 будет проверять, сколько секунд прошло с момента создания модели + * Is it allowed to resend a message of the current type? + * The value of EmailActivation::$repeatTimeout is used for checking as follows: + * - <0 will forbid you to resend this activation + * - =0 allows you to send messages at any time + * - >0 will check how many seconds have passed since the model was created * * @see EmailActivation::compareTime() * @return bool @@ -35,11 +35,11 @@ class EmailActivationExpirationBehavior extends Behavior { } /** - * Истёк ли срок кода? - * Для проверки используется значение EmailActivation::$expirationTimeout и интерпретируется как: - * - <0 означает, что код никогда не истечёт - * - =0 всегда будет говорить, что код истёк - * - >0 будет проверять, сколько секунд прошло с момента создания модели + * Did the code expire? + * The value of EmailActivation::$expirationTimeout is used for checking as follows: + * - <0 means the code will never expire + * - =0 will always say that the code has expired + * - >0 will check how many seconds have passed since the model was created * * @see EmailActivation::compareTime() * @return bool @@ -48,25 +48,15 @@ class EmailActivationExpirationBehavior extends Behavior { return $this->compareTime($this->expirationTimeout); } - /** - * Вычисляет, во сколько можно будет выполнить повторную отправку кода - * - * @return int - */ public function canRepeatIn(): int { return $this->calculateTime($this->repeatTimeout); } - /** - * Вычисляет, во сколько код истечёт - * - * @return int - */ public function expireIn(): int { return $this->calculateTime($this->expirationTimeout); } - protected function compareTime(int $value): bool { + private function compareTime(int $value): bool { if ($value < 0) { return false; } @@ -78,7 +68,7 @@ class EmailActivationExpirationBehavior extends Behavior { return time() > $this->calculateTime($value); } - protected function calculateTime(int $value): int { + private function calculateTime(int $value): int { return $this->owner->created_at + $value; } diff --git a/common/behaviors/PrimaryKeyValueBehavior.php b/common/behaviors/PrimaryKeyValueBehavior.php index 20889a5..79c72bc 100644 --- a/common/behaviors/PrimaryKeyValueBehavior.php +++ b/common/behaviors/PrimaryKeyValueBehavior.php @@ -11,10 +11,11 @@ use yii\db\ActiveRecord; class PrimaryKeyValueBehavior extends Behavior { /** - * @var callable Функция, что будет вызвана для генерации ключа. - * Должна возвращать случайное значение, подходящее для логики модели. Функция будет вызываться - * в цикле do-while с целью избежания дубликатов строк по первичному ключу, так что если функция - * станет возвращать статичное значение, то программа зациклится и что-нибудь здохнет. Не делайте так. + * @var callable The function that will be called to generate the key. + * Must return a random value suitable for model logic. + * The function will be called in the do-while loop to avoid duplicate strings by the primary key, + * so if the function returns a static value, the program will loop forever and something will die. + * Don't do so. */ public $value; @@ -60,7 +61,6 @@ class PrimaryKeyValueBehavior extends Behavior { throw new InvalidConfigException('Current behavior don\'t support models with more then one primary key.'); } - /** @noinspection PhpIncompatibleReturnTypeInspection да как бы оно всё нормально, но шторм мне не верит */ return $primaryKeys[0]; } diff --git a/common/components/UserPass.php b/common/components/UserPass.php index 14e4bce..28da99a 100644 --- a/common/components/UserPass.php +++ b/common/components/UserPass.php @@ -2,8 +2,9 @@ namespace common\components; /** - * Этот класс был использован для изначальной генерации паролей на Ely.by и сейчас должен быть планомерно выпилен - * с проекта с целью заменить этот алгоритм каким-нибудь посерьёзнее. + * This class was used for the first generation of passwords on the Ely.by + * and should now be systematically cut from the project in order to replace this algorithm + * with a more secure one. */ class UserPass { diff --git a/common/config/ConfigLoader.php b/common/config/ConfigLoader.php index 58f4495..aa4d38e 100644 --- a/common/config/ConfigLoader.php +++ b/common/config/ConfigLoader.php @@ -24,31 +24,31 @@ class ConfigLoader { require __DIR__ . '/config.php', ]; - // Общие окружение-зависимые настройки + // Common env-dependent configuration $path = __DIR__ . '/config-' . YII_ENV . '.php'; if (file_exists($path)) { $toMerge[] = require $path; } - // Общие локальные настройки + // Common local configuration $path = __DIR__ . '/config-local.php'; if (file_exists($path)) { $toMerge[] = require $path; } - // Настройки конкретного приложения + // App-related base configuration $path = self::ROOT_PATH . '/' . $this->application . '/config/config.php'; if (file_exists($path)) { $toMerge[] = require $path; } - // Настройки конкретного приложения для действующего окружения + // App-related env-dependent configuration $path = self::ROOT_PATH . '/' . $this->application . '/config/config-' . YII_ENV . '.php'; if (file_exists($path)) { $toMerge[] = require $path; } - // Локальные настройки конкретного приложения + // App-related local configuration $path = self::ROOT_PATH . '/' . $this->application . '/config/config-local.php'; if (file_exists($path)) { $toMerge[] = require $path; diff --git a/common/helpers/StringHelper.php b/common/helpers/StringHelper.php index 1e29e61..3b8dc47 100644 --- a/common/helpers/StringHelper.php +++ b/common/helpers/StringHelper.php @@ -24,12 +24,6 @@ class StringHelper { return $mask . mb_substr($email, $usernameLength); } - /** - * Проверяет на то, что переданная строка является валидным UUID - * - * @param string $uuid - * @return bool - */ public static function isUuid(string $uuid): bool { try { Uuid::fromString($uuid); diff --git a/common/models/Account.php b/common/models/Account.php index dfc8dfc..49b240a 100644 --- a/common/models/Account.php +++ b/common/models/Account.php @@ -13,7 +13,7 @@ use yii\db\ActiveRecord; use const common\LATEST_RULES_VERSION; /** - * Поля модели: + * Fields: * @property integer $id * @property string $uuid * @property string $username @@ -30,11 +30,11 @@ use const common\LATEST_RULES_VERSION; * @property integer $updated_at * @property integer $password_changed_at * - * Геттеры-сеттеры: - * @property string $password пароль пользователя (только для записи) - * @property string $profileLink ссылка на профиль на Ely без поддержки static url (только для записи) + * Getters-setters: + * @property-write string $password plain user's password + * @property-read string $profileLink link to the user's Ely.by profile * - * Отношения: + * Relations: * @property EmailActivation[] $emailActivations * @property OauthSession[] $oauthSessions * @property OauthClient[] $oauthClients @@ -42,7 +42,7 @@ use const common\LATEST_RULES_VERSION; * @property AccountSession[] $sessions * @property MinecraftAccessKey[] $minecraftAccessKeys * - * Поведения: + * Behaviors: * @mixin TimestampBehavior */ class Account extends ActiveRecord { @@ -113,11 +113,6 @@ class Account extends ActiveRecord { return $this->hasMany(MinecraftAccessKey::class, ['account_id' => 'id']); } - /** - * Выполняет проверку, принадлежит ли этому нику аккаунт у Mojang - * - * @return bool - */ public function hasMojangUsernameCollision(): bool { return MojangUsername::find() ->andWhere(['username' => $this->username]) @@ -125,9 +120,8 @@ class Account extends ActiveRecord { } /** - * Т.к. у нас нет инфы по static_url пользователя, то пока генерируем самый простой вариант - * с ссылкой на профиль по id. На Ely он всё равно редиректнется на static, а мы так или - * иначе обеспечим отдачу этой инфы. + * Since we don't have info about the user's static_url, we still generate the simplest + * version with a link to the profile by it's id. On Ely.by, it will be redirected to static url. * * @return string */ @@ -136,10 +130,10 @@ class Account extends ActiveRecord { } /** - * При создании структуры БД все аккаунты получают null значение в это поле, однако оно - * обязательно для заполнения. Все мигрировавшие с Ely аккаунты будут иметь null значение, - * а актуальной версией будет 1 версия правил сайта (т.к. раньше их просто не было). Ну а - * дальше уже будем инкрементить. + * Initially, the table of users we got from the main site, where there were no rules. + * All existing users at the time of migration received an empty value in this field. + * They will have to confirm their agreement with the rules at the first login. + * All new users automatically agree with the current version of the rules. * * @return bool */ diff --git a/common/models/AccountSession.php b/common/models/AccountSession.php index 4cc01c2..96cd432 100644 --- a/common/models/AccountSession.php +++ b/common/models/AccountSession.php @@ -7,7 +7,7 @@ use yii\db\ActiveQuery; use yii\db\ActiveRecord; /** - * Поля модели: + * Fields: * @property integer $id * @property integer $account_id * @property string $refresh_token @@ -15,10 +15,10 @@ use yii\db\ActiveRecord; * @property integer $created_at * @property integer $last_refreshed_at * - * Отношения: + * Relations: * @property Account $account * - * Поведения: + * Behaviors: * @mixin TimestampBehavior */ class AccountSession extends ActiveRecord { diff --git a/common/models/EmailActivation.php b/common/models/EmailActivation.php index b71e4e8..566a150 100644 --- a/common/models/EmailActivation.php +++ b/common/models/EmailActivation.php @@ -11,17 +11,17 @@ use yii\db\ActiveRecord; use yii\helpers\ArrayHelper; /** - * Поля модели: + * Fields: * @property string $key * @property integer $account_id * @property integer $type * @property string $_data * @property integer $created_at * - * Отношения: + * Relations: * @property Account $account * - * Поведения: + * Behaviors: * @mixin TimestampBehavior * @mixin EmailActivationExpirationBehavior * @mixin DataBehavior diff --git a/common/models/MinecraftAccessKey.php b/common/models/MinecraftAccessKey.php index 202570a..8703f60 100644 --- a/common/models/MinecraftAccessKey.php +++ b/common/models/MinecraftAccessKey.php @@ -8,22 +8,21 @@ use yii\db\ActiveQuery; use yii\db\ActiveRecord; /** - * Это временный класс, куда мигрирует вся логика ныне существующего authserver.ely.by. - * Поскольку там допускался вход по логину и паролю, а формат хранения выданных токенов был - * иным, то на период, пока мы окончательно не мигрируем, нужно сохранить старую логику - * и структуру под неё. + * This is a temporary class where all the logic of the authserver.ely.by service. + * Since the login and password were allowed there, and the format of storage of the issued tokens was different, + * we need to keep the legacy logic and structure under it for the period until we finally migrate. * - * Поля модели: + * Fields: * @property string $access_token * @property string $client_token * @property integer $account_id * @property integer $created_at * @property integer $updated_at * - * Отношения: + * Relations: * @property Account $account * - * Поведения: + * Behaviors: * @mixin TimestampBehavior * @mixin PrimaryKeyValueBehavior */ diff --git a/common/models/MojangUsername.php b/common/models/MojangUsername.php index e5d1ca5..cd5df30 100644 --- a/common/models/MojangUsername.php +++ b/common/models/MojangUsername.php @@ -5,12 +5,12 @@ use yii\behaviors\TimestampBehavior; use yii\db\ActiveRecord; /** - * Поля модели: + * Fields: * @property string $username * @property string $uuid * @property integer $last_pulled_at * - * Поведения: + * Behaviors: * @mixin TimestampBehavior */ class MojangUsername extends ActiveRecord { diff --git a/common/models/OauthClient.php b/common/models/OauthClient.php index aabccc7..5a856b0 100644 --- a/common/models/OauthClient.php +++ b/common/models/OauthClient.php @@ -7,7 +7,7 @@ use yii\db\ActiveQuery; use yii\db\ActiveRecord; /** - * Поля модели: + * Fields: * @property string $id * @property string $secret * @property string $type @@ -21,7 +21,7 @@ use yii\db\ActiveRecord; * @property bool $is_deleted * @property integer $created_at * - * Отношения: + * Behaviors: * @property Account|null $account * @property OauthSession[] $sessions */ diff --git a/common/models/OauthOwnerType.php b/common/models/OauthOwnerType.php index 4cf529d..56b97f8 100644 --- a/common/models/OauthOwnerType.php +++ b/common/models/OauthOwnerType.php @@ -4,19 +4,19 @@ namespace common\models; final class OauthOwnerType { /** - * Используется для сессий, принадлежащих непосредственно пользователям account.ely.by, - * выполнивших парольную авторизацию и использующих web интерфейс + * Used for sessions belonging directly to account.ely.by users + * who have performed password authentication and are using the web interface */ public const ACCOUNT = 'accounts'; /** - * Используется когда пользователь по протоколу oAuth2 authorization_code - * разрешает приложению получить доступ и выполнять действия от своего имени + * Used when a user uses OAuth2 authorization_code protocol to allow an application + * to access and perform actions on its own behalf */ public const USER = 'user'; /** - * Используется для авторизованных по протоколу oAuth2 client_credentials + * Used for clients authorized via OAuth2 client_credentials protocol */ public const CLIENT = 'client'; diff --git a/common/models/OauthSession.php b/common/models/OauthSession.php index e654dcd..afdc757 100644 --- a/common/models/OauthSession.php +++ b/common/models/OauthSession.php @@ -9,15 +9,15 @@ use yii\db\ActiveQuery; use yii\db\ActiveRecord; /** - * Поля: + * Fields: * @property integer $id - * @property string $owner_type содержит одну из констант OauthOwnerType + * @property string $owner_type contains one of the OauthOwnerType constants * @property string|null $owner_id * @property string $client_id * @property string $client_redirect_uri * @property integer $created_at * - * Отношения + * Relations: * @property OauthClient $client * @property Account $account * @property Set $scopes diff --git a/common/models/UsernameHistory.php b/common/models/UsernameHistory.php index 8ffc061..177ce3a 100644 --- a/common/models/UsernameHistory.php +++ b/common/models/UsernameHistory.php @@ -5,16 +5,16 @@ use yii\behaviors\TimestampBehavior; use yii\db\ActiveRecord; /** - * Поля модели: + * Fields: * @property integer $id * @property string $username * @property integer $account_id * @property integer $applied_in * - * Отношения: + * Relations: * @property Account $account * - * Поведения: + * Behaviors: * @mixin TimestampBehavior */ class UsernameHistory extends ActiveRecord { diff --git a/common/models/confirmations/NewEmailConfirmation.php b/common/models/confirmations/NewEmailConfirmation.php index a8e4177..5f73e23 100644 --- a/common/models/confirmations/NewEmailConfirmation.php +++ b/common/models/confirmations/NewEmailConfirmation.php @@ -5,7 +5,7 @@ use common\models\EmailActivation; use yii\helpers\ArrayHelper; /** - * Поведения: + * Behaviors: * @mixin NewEmailConfirmationBehavior */ class NewEmailConfirmation extends EmailActivation { diff --git a/common/rbac/Manager.php b/common/rbac/Manager.php index 07bc91a..0565240 100644 --- a/common/rbac/Manager.php +++ b/common/rbac/Manager.php @@ -7,12 +7,11 @@ use yii\rbac\PhpManager; class Manager extends PhpManager { /** - * В нашем приложении права выдаются не пользователям, а токенам, так что ожидаем - * здесь $accessToken и извлекаем из него все присвоенные права. + * In our application the permissions are given not to users but to tokens, + * so we receive $accessToken here and extract all the assigned scopes from it. * - * По каким-то причинам, в Yii механизм рекурсивной проверки прав требует, чтобы - * массив с правами был проиндексирован по ключам этих самых прав, так что в - * конце выворачиваем массив наизнанку. + * In Yii2, the mechanism of recursive permissions checking requires that the array with permissions + * is indexed by the keys of these rights, so at the end we turn the array inside out. * * @param string $accessToken * @return string[] diff --git a/common/rbac/rules/AccountOwner.php b/common/rbac/rules/AccountOwner.php index a16b1a0..5cbeeb6 100644 --- a/common/rbac/rules/AccountOwner.php +++ b/common/rbac/rules/AccountOwner.php @@ -10,15 +10,15 @@ class AccountOwner extends Rule { public $name = 'account_owner'; /** - * В нашем приложении права выдаются не пользователям, а токенам, так что ожидаем - * здесь $accessToken, по которому дальше восстанавливаем аккаунт, если это возможно. + * In our application the permissions are given not to users but to tokens, + * so we receive $accessToken here and extract all the assigned scopes from it. * * @param string|int $accessToken * @param \yii\rbac\Item $item - * @param array $params параметр accountId нужно передать обязательно как id аккаунта, - * к которому выполняется запрос - * параметр optionalRules позволяет отключить обязательность - * принятия последней версии правил + * @param array $params the "accountId" parameter must be passed as the id of the account + * to which the request is made + * the "optionalRules" parameter allows you to disable the mandatory acceptance + * of the latest version of the rules * * @return bool a value indicating whether the rule permits the auth item it is associated with. */ diff --git a/common/tests/unit/TestCase.php b/common/tests/unit/TestCase.php index d21936e..6e5d085 100644 --- a/common/tests/unit/TestCase.php +++ b/common/tests/unit/TestCase.php @@ -19,7 +19,7 @@ class TestCase extends Unit { } /** - * Список фикстур, что будут загружены перед тестом, но после зачистки базы данных + * A list of fixtures that will be loaded before the test, but after the database is cleaned up * * @url http://codeception.com/docs/modules/Yii2#fixtures * diff --git a/common/validators/EmailValidator.php b/common/validators/EmailValidator.php index e774728..6cd5e38 100644 --- a/common/validators/EmailValidator.php +++ b/common/validators/EmailValidator.php @@ -13,8 +13,8 @@ use yii\validators\Validator; class EmailValidator extends Validator { /** - * @var \Closure функция должна возвращать id аккаунта, относительно которого проводится - * текущая валидация. Позволяет пропустить проверку email для текущего аккаунта. + * @var \Closure the function must return the account id for which the current validation is being performed. + * Allows you to skip the email check for the current account. */ public $accountCallback; diff --git a/common/validators/PasswordValidator.php b/common/validators/PasswordValidator.php index 2b9c047..fb51e33 100644 --- a/common/validators/PasswordValidator.php +++ b/common/validators/PasswordValidator.php @@ -4,9 +4,6 @@ namespace common\validators; use common\helpers\Error as E; use yii\validators\StringValidator; -/** - * Класс должен реализовывать в себе все критерии валидации пароля пользователя - */ class PasswordValidator extends StringValidator { public $min = 8; diff --git a/common/validators/UsernameValidator.php b/common/validators/UsernameValidator.php index 70cccf0..1207e85 100644 --- a/common/validators/UsernameValidator.php +++ b/common/validators/UsernameValidator.php @@ -12,8 +12,8 @@ use yii\validators\Validator; class UsernameValidator extends Validator { /** - * @var \Closure функция должна возвращать id аккаунта, относительно которого проводится - * текущая валидация. Позволяет пропустить проверку ника для текущего аккаунта. + * @var \Closure the function must return the account id for which the current validation is being performed. + * Allows you to skip the username check for the current account. */ public $accountCallback; diff --git a/console/controllers/CleanupController.php b/console/controllers/CleanupController.php index ef1bff0..85439a3 100644 --- a/console/controllers/CleanupController.php +++ b/console/controllers/CleanupController.php @@ -43,12 +43,12 @@ class CleanupController extends Controller { } /** - * Нужно удалить те сессии, которые не рефрешились 90 дней, - * а также сессии, которые ни разу не рефрешились с момента своей выписки - * более чем 2 недели назад. + * Sessions that have not been refreshed for 90 days and those + * that have not been refreshed since they were issued more than 2 weeks ago + * should be deleted. * - * У модели AccountSession нет внешних связей, так что целевые записи - * могут быть удалены без использования циклов. + * The AccountSession model doesn't have any relations, + * so the records can be deleted just with mass delete operation. */ public function actionWebSessions(): int { AccountSession::deleteAll([ @@ -89,8 +89,8 @@ class CleanupController extends Controller { /** @var \common\behaviors\EmailActivationExpirationBehavior $behavior */ $behavior = $object->getBehavior('expirationBehavior'); /** @noinspection NullPointerExceptionInspection */ - $expiration = $behavior->expirationTimeout ?? 1123200; // 13d по умолчанию - // Приращаем 1 день, чтобы пользователи ещё могли получать сообщения об истечении кода активации + $expiration = $behavior->expirationTimeout ?? 1123200; // 13d by default + // We increment 1 day so that users can still receive notifications about the expiry of the activation code /** @noinspection SummerTimeUnsafeTimeManipulationInspection */ $durationsMap[$typeId] = $expiration + 86400; } diff --git a/console/tests/unit/TestCase.php b/console/tests/unit/TestCase.php index 9c32cc3..3e9a46f 100644 --- a/console/tests/unit/TestCase.php +++ b/console/tests/unit/TestCase.php @@ -17,7 +17,7 @@ class TestCase extends Unit { } /** - * Список фикстур, что будут загружены перед тестом, но после зачистки базы данных + * A list of fixtures that will be loaded before the test, but after the database is cleaned up * * @url http://codeception.com/docs/modules/Yii2#fixtures *