Browse Source

[CORE][Nickname] Properly set nickname for existing accounts

oauth1
José Marques 4 months ago
parent
commit
d713429d88
Signed by: diogo <mail@diogo.site> GPG Key ID: 18D2D35001FBFAB0
6 changed files with 53 additions and 15 deletions
  1. +1
    -1
      components/Group/Controller/Group.php
  2. +31
    -0
      components/Group/Entity/LocalGroup.php
  3. +1
    -1
      src/Controller/UserPanel.php
  4. +5
    -5
      src/Entity/LocalUser.php
  5. +3
    -4
      src/Util/Form/ActorForms.php
  6. +12
    -4
      src/Util/Nickname.php

+ 1
- 1
components/Group/Controller/Group.php View File

@@ -166,7 +166,7 @@ class Group extends FeedController
return [
'_template' => 'group/settings.html.twig',
'group' => $group,
'personal_info_form' => ActorForms::personalInfo($request, $group)->createView(),
'personal_info_form' => ActorForms::personalInfo($request, $actor, $group)->createView(),
'open_details_query' => $this->string('open'),
];
} else {


+ 31
- 0
components/Group/Entity/LocalGroup.php View File

@@ -21,10 +21,18 @@ declare(strict_types = 1);

namespace Component\Group\Entity;

use App\Core\Cache;
use App\Core\DB\DB;
use App\Core\Entity;

use App\Entity\Actor;
use App\Util\Exception\NicknameEmptyException;
use App\Util\Exception\NicknameException;
use App\Util\Exception\NicknameInvalidException;
use App\Util\Exception\NicknameNotAllowedException;
use App\Util\Exception\NicknameTakenException;
use App\Util\Exception\NicknameTooLongException;
use App\Util\Nickname;
use DateTimeInterface;

/**
@@ -114,6 +122,29 @@ class LocalGroup extends Entity
return $res === [] ? null : $res[0];
}

/**
* Checks if desired nickname is allowed, and in case it is, it sets Actor's nickname cache to newly set nickname
*
* @param string $nickname Desired NEW nickname (do not use in local user creation)
*
* @throws NicknameEmptyException
* @throws NicknameException
* @throws NicknameInvalidException
* @throws NicknameNotAllowedException
* @throws NicknameTakenException
* @throws NicknameTooLongException
*
* @return $this
*/
public function setNicknameSanitizedAndCached(string $nickname): self
{
$nickname = Nickname::normalize($nickname, check_already_used: true, which: Nickname::CHECK_LOCAL_GROUP, check_is_allowed: true);
$this->setNickname($nickname);
$this->getActor()->setNickname($nickname);
/// XXX: cache?
return $this;
}

public static function schemaDef(): array
{
return [


+ 1
- 1
src/Controller/UserPanel.php View File

@@ -77,7 +77,7 @@ class UserPanel extends Controller
$user = Common::ensureLoggedIn();
$actor = $user->getActor();

$personal_form = ActorForms::personalInfo($request, $actor);
$personal_form = ActorForms::personalInfo($request, $actor, $user);
$email_form = self::email($request);
$password_form = self::password($request);
$notifications_form_array = self::notifications($request);


+ 5
- 5
src/Entity/LocalUser.php View File

@@ -29,6 +29,7 @@ use App\Core\Entity;
use App\Core\UserRoles;
use App\Util\Common;
use App\Util\Exception\NicknameEmptyException;
use App\Util\Exception\NicknameException;
use App\Util\Exception\NicknameInvalidException;
use App\Util\Exception\NicknameNotAllowedException;
use App\Util\Exception\NicknameTakenException;
@@ -349,19 +350,18 @@ class LocalUser extends Entity implements UserInterface, PasswordAuthenticatedUs
/**
* Checks if desired nickname is allowed, and in case it is, it sets Actor's nickname cache to newly set nickname
*
* @param string $nickname Desired new nickname
*
* @param string $nickname Desired NEW nickname (do not use in local user creation)
* @return $this
* @throws NicknameEmptyException
* @throws NicknameInvalidException
* @throws NicknameNotAllowedException
* @throws NicknameTakenException
* @throws NicknameTooLongException
*
* @return $this
* @throws NicknameException
*/
public function setNicknameSanitizedAndCached(string $nickname): self
{
$nickname = Nickname::normalize($nickname, check_already_used: false, which: Nickname::CHECK_LOCAL_USER, check_is_allowed: true);
$nickname = Nickname::normalize($nickname, check_already_used: true, which: Nickname::CHECK_LOCAL_USER, check_is_allowed: true);
$this->setNickname($nickname);
$this->getActor()->setNickname($nickname);
Cache::delete(self::cacheKeys($this->getId())['nickname']);


+ 3
- 4
src/Util/Form/ActorForms.php View File

@@ -46,6 +46,7 @@ use App\Util\Exception\NicknameTakenException;
use App\Util\Exception\NicknameTooLongException;
use App\Util\Exception\NoLoggedInUser;
use App\Util\Exception\ServerException;
use Component\Group\Entity\LocalGroup;
use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
@@ -65,7 +66,7 @@ class ActorForms
* @throws NoLoggedInUser
* @throws ServerException
*/
public static function personalInfo(Request $request, Actor $target, ?LocalUser $user = null): mixed
public static function personalInfo(Request $request, Actor $target, LocalUser|LocalGroup $user): mixed
{
// Defining the various form fields
$form_definition = [
@@ -80,9 +81,7 @@ class ActorForms

// Setting nickname normalised and setting actor cache
$extra_step = function ($data, $extra_args) use ($user, $target) {
if (!\is_null($user)) {
$user->setNicknameSanitizedAndCached($data['nickname']);
}
$user->setNicknameSanitizedAndCached($data['nickname']);

$cache_keys = Actor::cacheKeys($target->getId());
foreach (['id', 'nickname', 'fullname'] as $key) {


+ 12
- 4
src/Util/Nickname.php View File

@@ -24,6 +24,7 @@ declare(strict_types = 1);
namespace App\Util;

use App\Core\DB\DB;
use App\Entity\LocalUser;
use App\Util\Exception\BugFoundException;
use App\Util\Exception\DuplicateFoundException;
use App\Util\Exception\NicknameEmptyException;
@@ -33,7 +34,7 @@ use App\Util\Exception\NicknameNotAllowedException;
use App\Util\Exception\NicknameTakenException;
use App\Util\Exception\NicknameTooLongException;
use App\Util\Exception\NotFoundException;
use App\Util\Exception\NotImplementedException;
use Component\Group\Entity\LocalGroup;
use Functional as F;
use InvalidArgumentException;

@@ -150,7 +151,7 @@ class Nickname
switch ($which) {
case self::CHECK_LOCAL_USER:
try {
$lu = DB::findOneBy('local_user', ['nickname' => $nickname]);
$lu = DB::findOneBy(LocalUser::class, ['nickname' => $nickname]);
throw new NicknameTakenException($lu->getActor());
} catch (NotFoundException) {
// continue
@@ -158,9 +159,16 @@ class Nickname
throw new BugFoundException("Duplicate entry in `local_user` for nickname={$nickname}");
}
break;
// @codeCoverageIgnoreStart
case self::CHECK_LOCAL_GROUP:
throw new NotImplementedException();
try {
$lg = DB::findOneBy(LocalGroup::class, ['nickname' => $nickname]);
throw new NicknameTakenException($lg->getActor());
} catch (NotFoundException) {
// continue
} catch (DuplicateFoundException) {
throw new BugFoundException("Duplicate entry in `local_group` for nickname={$nickname}");
}
break; // @codeCoverageIgnoreStart
default:
throw new InvalidArgumentException();
// @codeCoverageIgnoreEnd


Loading…
Cancel
Save