Spaces:
No application file
No application file
| namespace Mautic\PluginBundle\Integration; | |
| use Mautic\CoreBundle\Form\Type\YesNoButtonGroupType; | |
| use Mautic\UserBundle\Entity\Role; | |
| use Mautic\UserBundle\Form\Type\RoleListType; | |
| use Symfony\Component\Security\Core\Exception\AuthenticationException; | |
| /** | |
| * Used by SSO auth plugins that use OAuth2, etc means of logins. | |
| */ | |
| abstract class AbstractSsoServiceIntegration extends AbstractIntegration | |
| { | |
| /** | |
| * Called after the user is authenticated with the 3rd party service to obtain the users | |
| * details. | |
| * | |
| * @param $response mixed Typically the response from request to authenticating service | |
| * | |
| * @return mixed | |
| */ | |
| abstract public function getUser($response); | |
| /** | |
| * Get the user role for new users. | |
| * | |
| * @return bool|\Doctrine\Common\Proxy\Proxy|object|null | |
| * | |
| * @throws \Doctrine\ORM\ORMException | |
| */ | |
| public function getUserRole() | |
| { | |
| $featureSettings = $this->settings->getFeatureSettings(); | |
| $role = $featureSettings['new_user_role'] ?? false; | |
| if ($role) { | |
| return $this->em->getReference(Role::class, $role); | |
| } | |
| throw new AuthenticationException('mautic.integration.sso.error.no_role'); | |
| } | |
| /** | |
| * Returns if a new user should be created if authenticated and not found locally. | |
| */ | |
| public function shouldAutoCreateNewUser(): bool | |
| { | |
| $featureSettings = $this->settings->getFeatureSettings(); | |
| return isset($featureSettings['auto_create_user']) && (bool) $featureSettings['auto_create_user']; | |
| } | |
| /** | |
| * Set the callback URL to sso_login. | |
| */ | |
| public function getAuthCallbackUrl() | |
| { | |
| return $this->router->generate('mautic_sso_login_check', | |
| ['integration' => $this->getName()], | |
| \Symfony\Component\Routing\Generator\UrlGeneratorInterface::ABSOLUTE_URL // absolute | |
| ); | |
| } | |
| /** | |
| * @param array $settings | |
| * @param array $parameters | |
| * | |
| * @return bool|string | |
| */ | |
| public function ssoAuthCallback($settings = [], $parameters = []) | |
| { | |
| $response = $this->authCallback($settings, $parameters); | |
| // Get user data | |
| return $this->getUser($response); | |
| } | |
| /** | |
| * Don't save the keys as they are only used to validate user login. | |
| * | |
| * @return array | |
| */ | |
| public function extractAuthKeys($data, $tokenOverride = null) | |
| { | |
| // Prepare the keys for extraction such as renaming, setting expiry, etc | |
| $data = $this->prepareResponseForExtraction($data); | |
| // parse the response | |
| $authTokenKey = $tokenOverride ?: $this->getAuthTokenKey(); | |
| if (is_array($data) && isset($data[$authTokenKey])) { | |
| return $data; | |
| } | |
| $error = $this->getErrorsFromResponse($data); | |
| if (empty($error)) { | |
| $error = $this->translator->trans('mautic.integration.error.genericerror', [], 'flashes'); | |
| } | |
| throw new AuthenticationException($error); | |
| } | |
| /** | |
| * @return array | |
| */ | |
| public function getSupportedFeatures() | |
| { | |
| return [ | |
| 'sso_service', | |
| ]; | |
| } | |
| /** | |
| * Get form settings; authorization is not needed since it is done when a user logs in. | |
| * | |
| * @return array<string, mixed> | |
| */ | |
| public function getFormSettings(): array | |
| { | |
| return [ | |
| 'requires_callback' => true, | |
| 'requires_authorization' => false, | |
| ]; | |
| } | |
| /** | |
| * @param Form|\Symfony\Component\Form\FormBuilder $builder | |
| * @param array $data | |
| * @param string $formArea | |
| */ | |
| public function appendToForm(&$builder, $data, $formArea): void | |
| { | |
| if ('features' == $formArea) { | |
| $builder->add('auto_create_user', | |
| YesNoButtonGroupType::class, | |
| [ | |
| 'label' => 'mautic.integration.sso.auto_create_user', | |
| 'data' => isset($data['auto_create_user']) && (bool) $data['auto_create_user'], | |
| 'attr' => [ | |
| 'tooltip' => 'mautic.integration.sso.auto_create_user.tooltip', | |
| ], | |
| ] | |
| ); | |
| $builder->add( | |
| 'new_user_role', | |
| RoleListType::class, | |
| [ | |
| 'label' => 'mautic.integration.sso.new_user_role', | |
| 'label_attr' => ['class' => 'control-label'], | |
| 'attr' => [ | |
| 'class' => 'form-control', | |
| 'tooltip' => 'mautic.integration.sso.new_user_role.tooltip', | |
| ], | |
| ] | |
| ); | |
| } | |
| } | |
| } | |