awurth /
silex-user
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | |||
| 3 | /* |
||
| 4 | * This file is part of the awurth/silex-user package. |
||
| 5 | * |
||
| 6 | * (c) Alexis Wurth <[email protected]> |
||
| 7 | * |
||
| 8 | * For the full copyright and license information, please view the LICENSE |
||
| 9 | * file that was distributed with this source code. |
||
| 10 | */ |
||
| 11 | |||
| 12 | namespace AWurth\Silex\User\Provider; |
||
| 13 | |||
| 14 | use AWurth\Silex\User\Controller\AuthController; |
||
| 15 | use AWurth\Silex\User\Controller\RegistrationController; |
||
| 16 | use AWurth\Silex\User\EventListener\LastLoginListener; |
||
| 17 | use AWurth\Silex\User\Model\UserManager; |
||
| 18 | use AWurth\Silex\User\EventListener\AuthenticationListener; |
||
| 19 | use AWurth\Silex\User\EventListener\EmailConfirmationListener; |
||
| 20 | use AWurth\Silex\User\EventListener\FlashListener; |
||
| 21 | use AWurth\Silex\User\Mailer\TwigSwiftMailer; |
||
| 22 | use AWurth\Silex\User\Security\LoginManager; |
||
| 23 | use AWurth\Silex\User\Util\UserManipulator; |
||
| 24 | use LogicException; |
||
| 25 | use Pimple\Container; |
||
| 26 | use Pimple\ServiceProviderInterface; |
||
| 27 | use Silex\Api\BootableProviderInterface; |
||
| 28 | use Silex\Api\ControllerProviderInterface; |
||
| 29 | use Silex\Api\EventListenerProviderInterface; |
||
| 30 | use Silex\Application; |
||
| 31 | use Silex\ControllerCollection; |
||
| 32 | use Silex\ServiceControllerResolver; |
||
| 33 | use Symfony\Component\EventDispatcher\EventDispatcherInterface; |
||
| 34 | use Symfony\Component\Translation\Loader\PhpFileLoader; |
||
| 35 | use Symfony\Component\Translation\Translator; |
||
| 36 | |||
| 37 | /** |
||
| 38 | * User Service Provider. |
||
| 39 | * |
||
| 40 | * @author Alexis Wurth <[email protected]> |
||
| 41 | */ |
||
| 42 | class UserServiceProvider implements ServiceProviderInterface, BootableProviderInterface, ControllerProviderInterface, EventListenerProviderInterface |
||
| 43 | { |
||
| 44 | /** |
||
| 45 | * @var array |
||
| 46 | */ |
||
| 47 | protected static $defaultOptions = [ |
||
| 48 | 'use_routes' => true, |
||
| 49 | 'use_templates' => true, |
||
| 50 | 'use_translations' => true, |
||
| 51 | 'use_flash_notifications' => true, |
||
| 52 | 'use_last_login_listener' => true, |
||
| 53 | 'use_authentication_listener' => false, |
||
| 54 | 'registration.confirmation.enabled' => false, |
||
| 55 | 'registration.confirmation.from_email' => '' |
||
| 56 | ]; |
||
| 57 | |||
| 58 | /** |
||
| 59 | * {@inheritdoc} |
||
| 60 | */ |
||
| 61 | public function register(Container $app) |
||
| 62 | { |
||
| 63 | $this->checkDependencies($app); |
||
| 64 | |||
| 65 | $app['silex_user.options'] = []; |
||
| 66 | |||
| 67 | // Services |
||
| 68 | $app['silex_user.user_manager'] = function ($app) { |
||
| 69 | $this->validateOptions($app); |
||
| 70 | |||
| 71 | return new UserManager( |
||
| 72 | $app[$app['silex_user.options']['object_manager']], |
||
| 73 | $app['security.encoder_factory'], |
||
| 74 | $app['silex_user.options']['user_class'] |
||
| 75 | ); |
||
| 76 | }; |
||
| 77 | |||
| 78 | $app['silex_user.login_manager'] = function ($app) { |
||
| 79 | return new LoginManager( |
||
| 80 | $app['security.token_storage'], |
||
| 81 | $app['security.user_checker'], |
||
| 82 | $app['security.session_strategy'], |
||
| 83 | $app['request_stack'] |
||
| 84 | ); |
||
| 85 | }; |
||
| 86 | |||
| 87 | $app['silex_user.user_provider.username'] = function ($app) { |
||
| 88 | return new UserProvider($app['silex_user.user_manager']); |
||
| 89 | }; |
||
| 90 | |||
| 91 | $app['silex_user.user_provider.username_email'] = function ($app) { |
||
| 92 | return new EmailUserProvider($app['silex_user.user_manager']); |
||
| 93 | }; |
||
| 94 | |||
| 95 | $app['silex_user.mailer'] = function ($app) { |
||
| 96 | if (isset($app['mailer']) && 'Swift_Mailer' === get_class($app['mailer'])) { |
||
| 97 | $parameters = [ |
||
| 98 | 'from_email' => [ |
||
| 99 | 'confirmation' => $this->getOption($app, 'registration.confirmation.from_email') |
||
| 100 | ] |
||
| 101 | ]; |
||
| 102 | |||
| 103 | return new TwigSwiftMailer($app['mailer'], $app['twig'], $app['url_generator'], $parameters); |
||
| 104 | } |
||
| 105 | |||
| 106 | return null; |
||
| 107 | }; |
||
| 108 | |||
| 109 | $app['silex_user.util.user_manipulator'] = function ($app) { |
||
| 110 | return new UserManipulator($app['silex_user.user_manager'], $app['dispatcher'], $app['request_stack']); |
||
| 111 | }; |
||
| 112 | |||
| 113 | // Controllers |
||
| 114 | $app['silex_user.auth.controller'] = function ($app) { |
||
| 115 | return new AuthController($app); |
||
| 116 | }; |
||
| 117 | |||
| 118 | $app['silex_user.registration.controller'] = function ($app) { |
||
| 119 | return new RegistrationController($app); |
||
| 120 | }; |
||
| 121 | } |
||
| 122 | |||
| 123 | /** |
||
| 124 | * {@inheritdoc} |
||
| 125 | */ |
||
| 126 | public function boot(Application $app) |
||
| 127 | { |
||
| 128 | if (true === $this->getOption($app, 'use_templates')) { |
||
| 129 | $app['twig.loader.filesystem']->addPath(dirname(__DIR__) . '/Resources/views/'); |
||
| 130 | } |
||
| 131 | |||
| 132 | if (true === $this->getOption($app, 'use_translations')) { |
||
| 133 | /** @var Translator $translator */ |
||
| 134 | $translator = $app['translator']; |
||
| 135 | $translationsDir = dirname(__DIR__) . '/Resources/translations'; |
||
| 136 | |||
| 137 | $translator->addLoader('php', new PhpFileLoader()); |
||
| 138 | |||
| 139 | $translator->addResource('php', $translationsDir . '/silex_user.en.php', 'en', 'silex_user'); |
||
| 140 | $translator->addResource('php', $translationsDir . '/silex_user.fr.php', 'fr', 'silex_user'); |
||
| 141 | $translator->addResource('php', $translationsDir . '/validators.en.php', 'en', 'validators'); |
||
| 142 | $translator->addResource('php', $translationsDir . '/validators.fr.php', 'fr', 'validators'); |
||
| 143 | } |
||
| 144 | |||
| 145 | if (true === $this->getOption($app, 'use_routes')) { |
||
| 146 | $app->mount('/', $this->connect($app)); |
||
|
0 ignored issues
–
show
|
|||
| 147 | } |
||
| 148 | } |
||
| 149 | |||
| 150 | /** |
||
| 151 | * {@inheritdoc} |
||
| 152 | */ |
||
| 153 | public function connect(Application $app) |
||
| 154 | { |
||
| 155 | /** @var ControllerCollection $controllers */ |
||
| 156 | $controllers = $app['controllers_factory']; |
||
| 157 | |||
| 158 | $controllers->get('/login', 'silex_user.auth.controller:loginAction') |
||
| 159 | ->bind('silex_user.login'); |
||
| 160 | |||
| 161 | $controllers->method('GET|POST') |
||
| 162 | ->match('/login_check') |
||
| 163 | ->bind('silex_user.login_check'); |
||
| 164 | |||
| 165 | $controllers->method('GET|POST') |
||
| 166 | ->match('/logout') |
||
| 167 | ->bind('silex_user.logout'); |
||
| 168 | |||
| 169 | $controllers->method('GET|POST') |
||
| 170 | ->match('/register', 'silex_user.registration.controller:registerAction') |
||
| 171 | ->bind('silex_user.register'); |
||
| 172 | |||
| 173 | $controllers->get('/register/confirmed', 'silex_user.registration.controller:confirmedAction') |
||
| 174 | ->bind('silex_user.registration_confirmed'); |
||
| 175 | |||
| 176 | if (true === $this->getOption($app, 'registration.confirmation.enabled')) { |
||
| 177 | $controllers->get('/register/check-email', 'silex_user.registration.controller:checkEmailAction') |
||
| 178 | ->bind('silex_user.registration_check_email'); |
||
| 179 | |||
| 180 | $controllers->get('/register/confirm/{token}', 'silex_user.registration.controller:confirmAction') |
||
| 181 | ->bind('silex_user.registration_confirm'); |
||
| 182 | } |
||
| 183 | |||
| 184 | return $controllers; |
||
| 185 | } |
||
| 186 | |||
| 187 | /** |
||
| 188 | * {@inheritdoc} |
||
| 189 | */ |
||
| 190 | public function subscribe(Container $app, EventDispatcherInterface $dispatcher) |
||
| 191 | { |
||
| 192 | $app['silex_user.options'] = array_replace(self::$defaultOptions, $app['silex_user.options']); |
||
| 193 | |||
| 194 | $this->validateOptions($app); |
||
| 195 | |||
| 196 | if (true === $this->getOption($app, 'use_last_login_listener')) { |
||
| 197 | $dispatcher->addSubscriber(new LastLoginListener($app['silex_user.user_manager'])); |
||
| 198 | } |
||
| 199 | |||
| 200 | if (true === $this->getOption($app, 'use_authentication_listener')) { |
||
| 201 | $dispatcher->addSubscriber(new AuthenticationListener($app['silex_user.login_manager'], $app['silex_user.options']['firewall_name'])); |
||
| 202 | } |
||
| 203 | |||
| 204 | if (true === $this->getOption($app, 'use_flash_notifications')) { |
||
| 205 | $dispatcher->addSubscriber(new FlashListener($app['session'], $app['translator'])); |
||
| 206 | } |
||
| 207 | |||
| 208 | if (true === $this->getOption($app, 'registration.confirmation.enabled')) { |
||
| 209 | if (null === $app['silex_user.mailer']) { |
||
| 210 | throw new LogicException('You must configure a mailer to enable email notifications'); |
||
| 211 | } |
||
| 212 | |||
| 213 | $dispatcher->addSubscriber(new EmailConfirmationListener($app['silex_user.mailer'], $app['url_generator'], $app['session'])); |
||
| 214 | } |
||
| 215 | } |
||
| 216 | |||
| 217 | /** |
||
| 218 | * Checks if all required Service Providers are enabled. |
||
| 219 | * |
||
| 220 | * @param Container $app |
||
| 221 | */ |
||
| 222 | protected function checkDependencies(Container $app) |
||
| 223 | { |
||
| 224 | $dependencies = [ |
||
| 225 | 'twig' => 'TwigServiceProvider', |
||
| 226 | 'session' => 'SessionServiceProvider', |
||
| 227 | 'translator' => 'TranslationServiceProvider', |
||
| 228 | 'validator' => 'ValidatorServiceProvider', |
||
| 229 | 'form.factory' => 'FormServiceProvider', |
||
| 230 | 'security.token_storage' => 'SecurityServiceProvider' |
||
| 231 | ]; |
||
| 232 | |||
| 233 | if (!$app['resolver'] instanceof ServiceControllerResolver) { |
||
| 234 | throw new LogicException('You must register the ServiceControllerServiceProvider to use the UserServiceProvider'); |
||
| 235 | } |
||
| 236 | |||
| 237 | foreach ($dependencies as $key => $provider) { |
||
| 238 | if (!isset($app[$key])) { |
||
| 239 | throw new LogicException(sprintf('You must register the %s to use the UserServiceProvider', $provider)); |
||
| 240 | } |
||
| 241 | } |
||
| 242 | } |
||
| 243 | |||
| 244 | /** |
||
| 245 | * Gets an option or its default value if it is not set. |
||
| 246 | * |
||
| 247 | * @param Container $app |
||
| 248 | * @param string $name |
||
| 249 | * |
||
| 250 | * @return mixed |
||
| 251 | */ |
||
| 252 | protected function getOption(Container $app, $name) |
||
| 253 | { |
||
| 254 | if (isset($app['silex_user.options'][$name])) { |
||
| 255 | return $app['silex_user.options'][$name]; |
||
| 256 | } else { |
||
| 257 | return self::$defaultOptions[$name]; |
||
| 258 | } |
||
| 259 | } |
||
| 260 | |||
| 261 | /** |
||
| 262 | * Checks if options are set correctly. |
||
| 263 | * |
||
| 264 | * @param Container $app |
||
| 265 | */ |
||
| 266 | protected function validateOptions(Container $app) |
||
| 267 | { |
||
| 268 | $requiredOptions = ['object_manager', 'user_class', 'firewall_name']; |
||
| 269 | |||
| 270 | foreach ($requiredOptions as $option) { |
||
| 271 | if (empty($app['silex_user.options'][$option])) { |
||
| 272 | throw new LogicException(sprintf('The "%s" option must be set', $option)); |
||
| 273 | } |
||
| 274 | } |
||
| 275 | |||
| 276 | if (true === $this->getOption($app, 'registration.confirmation.enabled') && empty($this->getOption($app, 'registration.confirmation.from_email'))) { |
||
| 277 | throw new LogicException('The "registration.confirmation.from_email" option must be set'); |
||
| 278 | } |
||
| 279 | } |
||
| 280 | } |
||
| 281 |
It seems like the type of the argument is not accepted by the function/method which you are calling.
In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.
We suggest to add an explicit type cast like in the following example: