Passed
Pull Request — master (#5753)
by Angel Fernando Quiroz
07:14
created

FacebookAuthenticator::userLoader()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 29
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 2
eloc 16
c 1
b 0
f 1
nc 2
nop 1
dl 0
loc 29
rs 9.7333
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
declare(strict_types=1);
6
7
namespace Chamilo\CoreBundle\Security\Authenticator\OAuth2;
8
9
use Chamilo\CoreBundle\Entity\User;
10
use Chamilo\CoreBundle\Repository\Node\UserRepository;
11
use Chamilo\CoreBundle\ServiceHelper\AuthenticationConfigHelper;
12
use Cocur\Slugify\SlugifyInterface;
13
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
14
use League\OAuth2\Client\Provider\FacebookUser;
15
use League\OAuth2\Client\Token\AccessToken;
16
use Symfony\Component\HttpFoundation\Request;
17
use Symfony\Component\Routing\RouterInterface;
18
19
class FacebookAuthenticator extends AbstractAuthenticator
20
{
21
    protected string $providerName = 'facebook';
22
23
    public function __construct(
24
        ClientRegistry $clientRegistry,
25
        RouterInterface $router,
26
        UserRepository $userRepository,
27
        AuthenticationConfigHelper $authenticationConfigHelper,
28
        protected readonly SlugifyInterface $slugify,
29
    ) {
30
        parent::__construct($clientRegistry, $router, $userRepository, $authenticationConfigHelper);
31
    }
32
33
    public function supports(Request $request): ?bool
34
    {
35
        return 'chamilo.oauth2_facebook_check' === $request->attributes->get('_route');
36
    }
37
38
    protected function userLoader(AccessToken $accessToken): User
39
    {
40
        /** @var FacebookUser $resourceOwner */
41
        $resourceOwner = $this->client->fetchUserFromToken($accessToken);
42
43
        $user = $this->userRepository->findOneBy(['email' => $resourceOwner->getEmail()]);
44
45
        if (!$user) {
46
            $user = (new User())
47
                ->setCreatorId($this->userRepository->getRootUser()->getId())
48
            ;
49
        }
50
51
        $user
52
            ->setFirstname($resourceOwner->getFirstName())
53
            ->setLastname($resourceOwner->getLastName())
54
            // ->setLocale($resourceOwner->getLocale())
55
            ->setEmail($resourceOwner->getEmail())
56
            ->setUsername($this->changeToValidChamiloLogin($resourceOwner->getEmail()))
57
            ->setPlainPassword('facebook')
58
            ->setStatus(STUDENT)
59
            ->setAuthSource('facebook')
60
            ->setRoleFromStatus(STUDENT)
61
        ;
62
63
        $this->userRepository->updateUser($user);
64
        // updateAccessUrls ?
65
66
        return $user;
67
    }
68
69
    private function changeToValidChamiloLogin(string $email): string
70
    {
71
        return $this->slugify->slugify($email);
72
    }
73
}
74