Passed
Push — master ( 5e96c0...23583c )
by Angel Fernando Quiroz
08:21
created

FacebookAuthenticator   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 74
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 33
dl 0
loc 74
rs 10
c 0
b 0
f 0
wmc 6

5 Methods

Rating   Name   Duplication   Size   Complexity  
A userLoader() 0 36 2
A getCustomBadge() 0 3 1
A supports() 0 3 1
A changeToValidChamiloLogin() 0 3 1
A __construct() 0 16 1
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\Entity\UserAuthSource;
11
use Chamilo\CoreBundle\Helpers\AccessUrlHelper;
12
use Chamilo\CoreBundle\Helpers\AuthenticationConfigHelper;
13
use Chamilo\CoreBundle\Repository\Node\UserRepository;
14
use Chamilo\CoreBundle\Security\Badge\OAuth2Badge;
15
use Cocur\Slugify\SlugifyInterface;
16
use Doctrine\ORM\EntityManagerInterface;
17
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
18
use League\OAuth2\Client\Provider\FacebookUser;
19
use League\OAuth2\Client\Token\AccessToken;
20
use Symfony\Component\HttpFoundation\Request;
21
use Symfony\Component\Routing\RouterInterface;
22
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\BadgeInterface;
23
24
class FacebookAuthenticator extends AbstractAuthenticator
25
{
26
    protected string $providerName = 'facebook';
27
28
    public function __construct(
29
        ClientRegistry $clientRegistry,
30
        RouterInterface $router,
31
        UserRepository $userRepository,
32
        AuthenticationConfigHelper $authenticationConfigHelper,
33
        AccessUrlHelper $urlHelper,
34
        EntityManagerInterface $entityManager,
35
        protected readonly SlugifyInterface $slugify,
36
    ) {
37
        parent::__construct(
38
            $clientRegistry,
39
            $router,
40
            $userRepository,
41
            $authenticationConfigHelper,
42
            $urlHelper,
43
            $entityManager,
44
        );
45
    }
46
47
    public function supports(Request $request): ?bool
48
    {
49
        return 'chamilo.oauth2_facebook_check' === $request->attributes->get('_route');
50
    }
51
52
    protected function userLoader(AccessToken $accessToken): User
53
    {
54
        /** @var FacebookUser $resourceOwner */
55
        $resourceOwner = $this->client->fetchUserFromToken($accessToken);
56
57
        $user = $this->userRepository->findOneBy(['email' => $resourceOwner->getEmail()]);
58
59
        if (!$user) {
60
            $user = (new User())
61
                ->setCreatorId($this->userRepository->getRootUser()->getId())
62
            ;
63
        }
64
65
        $user
66
            ->setFirstname($resourceOwner->getFirstName())
67
            ->setLastname($resourceOwner->getLastName())
68
            // ->setLocale($resourceOwner->getLocale())
69
            ->setEmail($resourceOwner->getEmail())
70
            ->setUsername($this->changeToValidChamiloLogin($resourceOwner->getEmail()))
71
            ->setPlainPassword('facebook')
72
            ->setStatus(STUDENT)
73
            ->addAuthSourceByAuthentication(
74
                UserAuthSource::FACEBOOK,
75
                $this->accessUrlHelper->getCurrent()
76
            )
77
            ->setRoleFromStatus(STUDENT)
78
        ;
79
80
        $this->userRepository->updateUser($user);
81
82
        $url = $this->accessUrlHelper->getCurrent();
83
        $url->addUser($user);
84
85
        $this->entityManager->flush();
86
87
        return $user;
88
    }
89
90
    private function changeToValidChamiloLogin(string $email): string
91
    {
92
        return $this->slugify->slugify($email);
93
    }
94
95
    protected function getCustomBadge(): ?BadgeInterface
96
    {
97
        return new Oauth2Badge(UserAuthSource::FACEBOOK);
98
    }
99
}
100