3 namespace BookStack\Access\Oidc;
5 use Illuminate\Support\Arr;
9 public function __construct(
10 public ?string $externalId = null,
11 public ?string $email = null,
12 public ?string $name = null,
13 public ?array $groups = null,
18 * Check if the user details are fully populated for our usage.
20 public function isFullyPopulated(bool $groupSyncActive): bool
22 $hasEmpty = empty($this->externalId)
23 || empty($this->email)
25 || ($groupSyncActive && $this->groups === null);
31 * Populate user details from the given claim data.
33 public function populate(
34 ProvidesClaims $claims,
36 string $displayNameClaims,
39 $this->externalId = $claims->getClaim($idClaim) ?? $this->externalId;
40 $this->email = $claims->getClaim('email') ?? $this->email;
41 $this->name = static::getUserDisplayName($displayNameClaims, $claims) ?? $this->name;
42 $this->groups = static::getUserGroups($groupsClaim, $claims) ?? $this->groups;
45 protected static function getUserDisplayName(string $displayNameClaims, ProvidesClaims $token): string
47 $displayNameClaimParts = explode('|', $displayNameClaims);
50 foreach ($displayNameClaimParts as $claim) {
51 $component = $token->getClaim(trim($claim)) ?? '';
52 if ($component !== '') {
53 $displayName[] = $component;
57 return implode(' ', $displayName);
60 protected static function getUserGroups(string $groupsClaim, ProvidesClaims $token): ?array
62 if (empty($groupsClaim)) {
66 $groupsList = Arr::get($token->getAllClaims(), $groupsClaim);
67 if (!is_array($groupsList)) {
71 return array_values(array_filter($groupsList, function ($val) {
72 return is_string($val);