-
Notifications
You must be signed in to change notification settings - Fork 137
/
Application.php
117 lines (100 loc) · 4.1 KB
/
Application.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
namespace OCA\SocialLogin\AppInfo;
use OCA\SocialLogin\AlternativeLogin\DefaultLoginShow;
use OCA\SocialLogin\Db\ConnectedLoginMapper;
use OCA\SocialLogin\Service\ProviderService;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IRequest;
use OCP\ISession;
use OCP\IUserSession;
use OCP\User\Events\BeforeUserDeletedEvent;
use OCP\User\Events\UserLoggedOutEvent;
use OCP\Util;
class Application extends App implements IBootstrap
{
private $appName = 'sociallogin';
private $regContext;
public function __construct()
{
parent::__construct($this->appName);
}
public function register(IRegistrationContext $context): void
{
require __DIR__ . '/../../3rdparty/autoload.php';
$this->regContext = $context;
}
public function boot(IBootContext $context): void
{
Util::addStyle($this->appName, 'styles');
$l = $this->query(IL10N::class);
$config = $this->query(IConfig::class);
$dispatcher = $this->query(IEventDispatcher::class);
$dispatcher->addListener(BeforeUserDeletedEvent::class, [$this, 'preDeleteUser']);
$userSession = $this->query(IUserSession::class);
if ($userSession->isLoggedIn()) {
$uid = $userSession->getUser()->getUID();
$session = $this->query(ISession::class);
if ($config->getUserValue($uid, $this->appName, 'disable_password_confirmation')) {
$session->set('last-password-confirm', time());
}
if ($logoutUrl = $session->get('sociallogin_logout_url')) {
$dispatcher->addListener(UserLoggedOutEvent::class, function () use ($logoutUrl) {
header('Location: ' . $logoutUrl);
exit();
});
}
return;
}
$providerService = $this->query(ProviderService::class);
$request = $this->query(IRequest::class);
$providersCount = 0;
$loginClass = '';
$providers = json_decode($config->getAppValue($this->appName, 'oauth_providers'), true) ?: [];
foreach ($providers as $name => $provider) {
if ($provider['appid']) {
++$providersCount;
$loginClass = $providerService->getLoginClass($name);
$this->regContext->registerAlternativeLogin($loginClass);
}
}
$providers = json_decode($config->getAppValue($this->appName, 'custom_providers'), true) ?: [];
foreach ($providers as $providersType => $providerList) {
foreach ($providerList as $provider) {
++$providersCount;
$loginClass = $providerService->getLoginClass($provider['name'], $provider, $providersType);
$this->regContext->registerAlternativeLogin($loginClass);
}
}
if (PHP_SAPI !== 'cli') {
$useLoginRedirect = $providersCount === 1
&& $request->getMethod() === 'GET'
&& !$request->getParam('noredir')
&& $config->getSystemValue('social_login_auto_redirect', false);
if ($useLoginRedirect && $request->getPathInfo() === '/login') {
$login = $this->query($loginClass);
$login->load();
header('Location: ' . $login->getLink());
exit();
}
$hideDefaultLogin = $providersCount > 0 && $config->getAppValue($this->appName, 'hide_default_login');
if ($hideDefaultLogin && $request->getPathInfo() === '/login') {
$this->regContext->registerAlternativeLogin(DefaultLoginShow::class);
}
}
}
public function preDeleteUser(BeforeUserDeletedEvent $event)
{
$user = $event->getUser();
$this->query(ConnectedLoginMapper::class)->disconnectAll($user->getUID());
}
private function query($className)
{
return $this->getContainer()->get($className);
}
}