password_hash_strategy; } switch ($passwordHashStrategy) { case self::PASS_HASH_STRATEGY_OLD_ELY: return UserPass::make($this->email, $password) === $this->password_hash; case self::PASS_HASH_STRATEGY_YII2: return Yii::$app->security->validatePassword($password, $this->password_hash); default: throw new InvalidConfigException('You must set valid password_hash_strategy before you can validate password'); } } public function setPassword(string $password): void { $this->password_hash_strategy = self::PASS_HASH_STRATEGY_YII2; $this->password_hash = Yii::$app->security->generatePasswordHash($password); $this->password_changed_at = time(); } public function getEmailActivations(): ActiveQuery { return $this->hasMany(EmailActivation::class, ['account_id' => 'id']); } public function getOauthSessions(): ActiveQuery { return $this->hasMany(OauthSession::class, ['owner_id' => 'id'])->andWhere(['owner_type' => 'user']); } public function getOauthClients(): OauthClientQuery { /** @noinspection PhpIncompatibleReturnTypeInspection */ return $this->hasMany(OauthClient::class, ['account_id' => 'id']); } public function getUsernameHistory(): ActiveQuery { return $this->hasMany(UsernameHistory::class, ['account_id' => 'id']); } public function getSessions(): ActiveQuery { return $this->hasMany(AccountSession::class, ['account_id' => 'id']); } public function getMinecraftAccessKeys(): ActiveQuery { return $this->hasMany(MinecraftAccessKey::class, ['account_id' => 'id']); } /** * Выполняет проверку, принадлежит ли этому нику аккаунт у Mojang * * @return bool */ public function hasMojangUsernameCollision(): bool { return MojangUsername::find() ->andWhere(['username' => $this->username]) ->exists(); } /** * Т.к. у нас нет инфы по static_url пользователя, то пока генерируем самый простой вариант * с ссылкой на профиль по id. На Ely он всё равно редиректнется на static, а мы так или * иначе обеспечим отдачу этой инфы. * * @return string */ public function getProfileLink(): string { return 'http://ely.by/u' . $this->id; } /** * При создании структуры БД все аккаунты получают null значение в это поле, однако оно * обязательно для заполнения. Все мигрировавшие с Ely аккаунты будут иметь null значение, * а актуальной версией будет 1 версия правил сайта (т.к. раньше их просто не было). Ну а * дальше уже будем инкрементить. * * @return bool */ public function isAgreedWithActualRules(): bool { return $this->rules_agreement_version === LATEST_RULES_VERSION; } public function setRegistrationIp($ip): void { $this->registration_ip = $ip === null ? null : inet_pton($ip); } public function getRegistrationIp(): ?string { return $this->registration_ip === null ? null : inet_ntop($this->registration_ip); } public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); if ($insert) { return; } $meaningfulFields = ['username', 'email', 'uuid', 'status', 'lang']; $meaningfulChangedAttributes = array_filter($changedAttributes, function(string $key) use ($meaningfulFields) { return in_array($key, $meaningfulFields, true); }, ARRAY_FILTER_USE_KEY); if (empty($meaningfulChangedAttributes)) { return; } Yii::$app->queue->push(CreateWebHooksDeliveries::createAccountEdit($this, $meaningfulChangedAttributes)); } }