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

FacebookAuthenticator::supports()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

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