Passed
Push — dependabot/npm_and_yarn/microm... ( e84ba6...f2f212 )
by
unknown
10:03
created

FacebookAuthenticator::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

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