mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-11-25 17:57:28 +08:00
Add support for OIDC picture
This commit is contained in:
parent
fa6d66db49
commit
67e435b2fe
|
@ -214,7 +214,8 @@ class OidcService
|
||||||
$user = $this->registrationService->findOrRegister(
|
$user = $this->registrationService->findOrRegister(
|
||||||
$userDetails->name,
|
$userDetails->name,
|
||||||
$userDetails->email,
|
$userDetails->email,
|
||||||
$userDetails->externalId
|
$userDetails->externalId,
|
||||||
|
$userDetails->picture,
|
||||||
);
|
);
|
||||||
} catch (UserRegistrationException $exception) {
|
} catch (UserRegistrationException $exception) {
|
||||||
throw new OidcException($exception->getMessage());
|
throw new OidcException($exception->getMessage());
|
||||||
|
|
|
@ -11,6 +11,7 @@ class OidcUserDetails
|
||||||
public ?string $email = null,
|
public ?string $email = null,
|
||||||
public ?string $name = null,
|
public ?string $name = null,
|
||||||
public ?array $groups = null,
|
public ?array $groups = null,
|
||||||
|
public ?string $picture = null,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,6 +41,7 @@ class OidcUserDetails
|
||||||
$this->email = $claims->getClaim('email') ?? $this->email;
|
$this->email = $claims->getClaim('email') ?? $this->email;
|
||||||
$this->name = static::getUserDisplayName($displayNameClaims, $claims) ?? $this->name;
|
$this->name = static::getUserDisplayName($displayNameClaims, $claims) ?? $this->name;
|
||||||
$this->groups = static::getUserGroups($groupsClaim, $claims) ?? $this->groups;
|
$this->groups = static::getUserGroups($groupsClaim, $claims) ?? $this->groups;
|
||||||
|
$this->picture = $claims->getClaim('picture') ?? $this->picture;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function getUserDisplayName(string $displayNameClaims, ProvidesClaims $token): string
|
protected static function getUserDisplayName(string $displayNameClaims, ProvidesClaims $token): string
|
||||||
|
|
|
@ -50,7 +50,7 @@ class RegistrationService
|
||||||
*
|
*
|
||||||
* @throws UserRegistrationException
|
* @throws UserRegistrationException
|
||||||
*/
|
*/
|
||||||
public function findOrRegister(string $name, string $email, string $externalId): User
|
public function findOrRegister(string $name, string $email, string $externalId, string $picture = null): User
|
||||||
{
|
{
|
||||||
$user = User::query()
|
$user = User::query()
|
||||||
->where('external_auth_id', '=', $externalId)
|
->where('external_auth_id', '=', $externalId)
|
||||||
|
@ -64,7 +64,7 @@ class RegistrationService
|
||||||
'external_auth_id' => $externalId,
|
'external_auth_id' => $externalId,
|
||||||
];
|
];
|
||||||
|
|
||||||
$user = $this->registerUser($userData, null, false);
|
$user = $this->registerUser($userData, null, false, $picture);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $user;
|
return $user;
|
||||||
|
@ -75,7 +75,7 @@ class RegistrationService
|
||||||
*
|
*
|
||||||
* @throws UserRegistrationException
|
* @throws UserRegistrationException
|
||||||
*/
|
*/
|
||||||
public function registerUser(array $userData, ?SocialAccount $socialAccount = null, bool $emailConfirmed = false): User
|
public function registerUser(array $userData, ?SocialAccount $socialAccount = null, bool $emailConfirmed = false, string $picture = null): User
|
||||||
{
|
{
|
||||||
$userEmail = $userData['email'];
|
$userEmail = $userData['email'];
|
||||||
$authSystem = $socialAccount ? $socialAccount->driver : auth()->getDefaultDriver();
|
$authSystem = $socialAccount ? $socialAccount->driver : auth()->getDefaultDriver();
|
||||||
|
@ -96,7 +96,7 @@ class RegistrationService
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the user
|
// Create the user
|
||||||
$newUser = $this->userRepo->createWithoutActivity($userData, $emailConfirmed);
|
$newUser = $this->userRepo->createWithoutActivity($userData, $emailConfirmed, $picture);
|
||||||
$newUser->attachDefaultRole();
|
$newUser->attachDefaultRole();
|
||||||
|
|
||||||
// Assign social account if given
|
// Assign social account if given
|
||||||
|
|
|
@ -22,7 +22,7 @@ class UserAvatars
|
||||||
/**
|
/**
|
||||||
* Fetch and assign an avatar image to the given user.
|
* Fetch and assign an avatar image to the given user.
|
||||||
*/
|
*/
|
||||||
public function fetchAndAssignToUser(User $user): void
|
public function fetchAndAssignToUser(User $user, string $picture = null): void
|
||||||
{
|
{
|
||||||
if (!$this->avatarFetchEnabled()) {
|
if (!$this->avatarFetchEnabled()) {
|
||||||
return;
|
return;
|
||||||
|
@ -30,7 +30,7 @@ class UserAvatars
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->destroyAllForUser($user);
|
$this->destroyAllForUser($user);
|
||||||
$avatar = $this->saveAvatarImage($user);
|
$avatar = $this->saveAvatarImage($user, 500, $picture);
|
||||||
$user->avatar()->associate($avatar);
|
$user->avatar()->associate($avatar);
|
||||||
$user->save();
|
$user->save();
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
@ -72,9 +72,9 @@ class UserAvatars
|
||||||
*
|
*
|
||||||
* @throws HttpFetchException
|
* @throws HttpFetchException
|
||||||
*/
|
*/
|
||||||
protected function saveAvatarImage(User $user, int $size = 500): Image
|
protected function saveAvatarImage(User $user, int $size = 500, string $picture = null): Image
|
||||||
{
|
{
|
||||||
$avatarUrl = $this->getAvatarUrl();
|
$avatarUrl = $picture ?: $this->getAvatarUrl();
|
||||||
$email = strtolower(trim($user->email));
|
$email = strtolower(trim($user->email));
|
||||||
|
|
||||||
$replacements = [
|
$replacements = [
|
||||||
|
|
|
@ -54,7 +54,7 @@ class UserRepo
|
||||||
*
|
*
|
||||||
* @param array{name: string, email: string, password: ?string, external_auth_id: ?string, language: ?string, roles: ?array} $data
|
* @param array{name: string, email: string, password: ?string, external_auth_id: ?string, language: ?string, roles: ?array} $data
|
||||||
*/
|
*/
|
||||||
public function createWithoutActivity(array $data, bool $emailConfirmed = false): User
|
public function createWithoutActivity(array $data, bool $emailConfirmed = false, string $picture = null): User
|
||||||
{
|
{
|
||||||
$user = new User();
|
$user = new User();
|
||||||
$user->name = $data['name'];
|
$user->name = $data['name'];
|
||||||
|
@ -74,7 +74,7 @@ class UserRepo
|
||||||
$this->setUserRoles($user, $data['roles']);
|
$this->setUserRoles($user, $data['roles']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->downloadAndAssignUserAvatar($user);
|
$this->downloadAndAssignUserAvatar($user, $picture);
|
||||||
|
|
||||||
return $user;
|
return $user;
|
||||||
}
|
}
|
||||||
|
@ -199,10 +199,10 @@ class UserRepo
|
||||||
* Get an avatar image for a user and set it as their avatar.
|
* Get an avatar image for a user and set it as their avatar.
|
||||||
* Returns early if avatars disabled or not set in config.
|
* Returns early if avatars disabled or not set in config.
|
||||||
*/
|
*/
|
||||||
protected function downloadAndAssignUserAvatar(User $user): void
|
protected function downloadAndAssignUserAvatar(User $user, string $picture = null): void
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$this->userAvatar->fetchAndAssignToUser($user);
|
$this->userAvatar->fetchAndAssignToUser($user, $picture);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
Log::error('Failed to save user avatar image');
|
Log::error('Failed to save user avatar image');
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user