xref: /plugin/oauth/auth.php (revision 311a66063361dab9d9371f04a01619bd95d4989e)
180852c15SAndreas Gohr<?php
23e7ac5b1SAndreas Gohr
380852c15SAndreas Gohr/**
480852c15SAndreas Gohr * DokuWiki Plugin oauth (Auth Component)
580852c15SAndreas Gohr *
680852c15SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
780852c15SAndreas Gohr * @author  Andreas Gohr <andi@splitbrain.org>
880852c15SAndreas Gohr */
93e7ac5b1SAndreas Gohrclass auth_plugin_oauth extends auth_plugin_authplain
103e7ac5b1SAndreas Gohr{
1180852c15SAndreas Gohr
123e7ac5b1SAndreas Gohr    /** @inheritDoc */
133e7ac5b1SAndreas Gohr    public function __construct()
143e7ac5b1SAndreas Gohr    {
15f10e09e2SAndreas Gohr        parent::__construct();
1680852c15SAndreas Gohr
17f10e09e2SAndreas Gohr        $this->cando['external'] = true;
1880852c15SAndreas Gohr    }
1980852c15SAndreas Gohr
203e7ac5b1SAndreas Gohr    /** @inheritDoc */
21*311a6606SAnna Dabrowska    public function trustExternal($user, $pass, $sticky = false)
223e7ac5b1SAndreas Gohr    {
23438dcc52SMichael Grosse        global $USERINFO, $INPUT;
24438dcc52SMichael Grosse
25438dcc52SMichael Grosse        if ($INPUT->has('state') && plugin_load('helper', 'farmer', false, true)) {
26438dcc52SMichael Grosse            $this->handleState($INPUT->str('state'));
27438dcc52SMichael Grosse        }
2880852c15SAndreas Gohr
29a7a8f46aSAndreas Gohr        // check session for existing oAuth login data
30a7a8f46aSAndreas Gohr        $session = $_SESSION[DOKU_COOKIE]['auth'];
31523e6571SMichael Große        if (isset($session['oauth'])) {
32a7a8f46aSAndreas Gohr            $servicename = $session['oauth'];
33a7a8f46aSAndreas Gohr            // check if session data is still considered valid
34f2e164b0SMichael Große            if ($this->isSessionValid($session)) {
35a7a8f46aSAndreas Gohr                $_SERVER['REMOTE_USER'] = $session['user'];
36a7a8f46aSAndreas Gohr                $USERINFO = $session['info'];
3780852c15SAndreas Gohr                return true;
38f10e09e2SAndreas Gohr            }
3980852c15SAndreas Gohr        }
4080852c15SAndreas Gohr
41523e6571SMichael Große        $existingLoginProcess = false;
42523e6571SMichael Große        // are we in login progress?
43523e6571SMichael Große        if (isset($_SESSION[DOKU_COOKIE]['oauth-inprogress'])) {
44523e6571SMichael Große            $servicename = $_SESSION[DOKU_COOKIE]['oauth-inprogress']['service'];
45523e6571SMichael Große            $page = $_SESSION[DOKU_COOKIE]['oauth-inprogress']['id'];
46188ba446SMichael Große            $params = $_SESSION[DOKU_COOKIE]['oauth-inprogress']['params'];
47523e6571SMichael Große
48523e6571SMichael Große            unset($_SESSION[DOKU_COOKIE]['oauth-inprogress']);
49523e6571SMichael Große            $existingLoginProcess = true;
50523e6571SMichael Große        }
51523e6571SMichael Große
52a7a8f46aSAndreas Gohr        // either we're in oauth login or a previous log needs to be rechecked
532e94f0b8SAndreas Gohr        if (isset($servicename)) {
54a7a8f46aSAndreas Gohr            /** @var helper_plugin_oauth $hlp */
55a7a8f46aSAndreas Gohr            $hlp = plugin_load('helper', 'oauth');
56827232fcSMichael Große
57827232fcSMichael Große            /** @var OAuth\Plugin\AbstractAdapter $service */
58a7a8f46aSAndreas Gohr            $service = $hlp->loadService($servicename);
59523e6571SMichael Große            if (is_null($service)) {
60523e6571SMichael Große                $this->cleanLogout();
61523e6571SMichael Große                return false;
62a7a8f46aSAndreas Gohr            }
63a7a8f46aSAndreas Gohr
64523e6571SMichael Große            if ($service->checkToken()) {
65188ba446SMichael Große                $ok = $this->processLogin($sticky, $service, $servicename, $page, $params);
66523e6571SMichael Große                if (!$ok) {
67523e6571SMichael Große                    $this->cleanLogout();
68523e6571SMichael Große                    return false;
69523e6571SMichael Große                }
70523e6571SMichael Große                return true;
71523e6571SMichael Große            } else {
72523e6571SMichael Große                if ($existingLoginProcess) {
73523e6571SMichael Große                    msg($this->getLang('oauth login failed'), 0);
74523e6571SMichael Große                    $this->cleanLogout();
75523e6571SMichael Große                    return false;
76523e6571SMichael Große                } else {
77523e6571SMichael Große                    // first time here
78523e6571SMichael Große                    $this->relogin($servicename);
79523e6571SMichael Große                }
80523e6571SMichael Große            }
81523e6571SMichael Große
82523e6571SMichael Große            $this->cleanLogout();
83a7a8f46aSAndreas Gohr            return false; // something went wrong during oAuth login
84213f4618SMichael Große        } elseif (isset($_COOKIE[DOKU_COOKIE])) {
85213f4618SMichael Große            global $INPUT;
86213f4618SMichael Große            //try cookie
87213f4618SMichael Große            list($cookieuser, $cookiesticky, $auth, $servicename) = explode('|', $_COOKIE[DOKU_COOKIE]);
88213f4618SMichael Große            $cookieuser = base64_decode($cookieuser, true);
89213f4618SMichael Große            $auth = base64_decode($auth, true);
90213f4618SMichael Große            $servicename = base64_decode($servicename, true);
91213f4618SMichael Große            if ($auth === 'oauth') {
92213f4618SMichael Große                $this->relogin($servicename);
93213f4618SMichael Große            }
9480852c15SAndreas Gohr        }
9580852c15SAndreas Gohr
96a7a8f46aSAndreas Gohr        // do the "normal" plain auth login via form
97a7a8f46aSAndreas Gohr        return auth_login($user, $pass, $sticky);
98a7a8f46aSAndreas Gohr    }
9980852c15SAndreas Gohr
100f2e164b0SMichael Große    /**
101*311a6606SAnna Dabrowska     * Enhance function to check against duplicate emails
102*311a6606SAnna Dabrowska     *
103*311a6606SAnna Dabrowska     * @param string $user
104*311a6606SAnna Dabrowska     * @param string $pwd
105*311a6606SAnna Dabrowska     * @param string $name
106*311a6606SAnna Dabrowska     * @param string $mail
107*311a6606SAnna Dabrowska     * @param null $grps
108*311a6606SAnna Dabrowska     * @return bool|null|string
109*311a6606SAnna Dabrowska     */
110*311a6606SAnna Dabrowska    public function createUser($user, $pwd, $name, $mail, $grps = null)
111*311a6606SAnna Dabrowska    {
112*311a6606SAnna Dabrowska        if ($this->getUserByEmail($mail)) {
113*311a6606SAnna Dabrowska            msg($this->getLang('emailduplicate'), -1);
114*311a6606SAnna Dabrowska            return false;
115*311a6606SAnna Dabrowska        }
116*311a6606SAnna Dabrowska
117*311a6606SAnna Dabrowska        return parent::createUser($user, $pwd, $name, $mail, $grps);
118*311a6606SAnna Dabrowska    }
119*311a6606SAnna Dabrowska
120*311a6606SAnna Dabrowska    /**
121*311a6606SAnna Dabrowska     * Enhance function to check against duplicate emails
122*311a6606SAnna Dabrowska     *
123*311a6606SAnna Dabrowska     * @param string $user
124*311a6606SAnna Dabrowska     * @param array $changes
125*311a6606SAnna Dabrowska     * @return bool
126*311a6606SAnna Dabrowska     */
127*311a6606SAnna Dabrowska    public function modifyUser($user, $changes)
128*311a6606SAnna Dabrowska    {
129*311a6606SAnna Dabrowska        global $conf;
130*311a6606SAnna Dabrowska
131*311a6606SAnna Dabrowska        if (isset($changes['mail'])) {
132*311a6606SAnna Dabrowska            $found = $this->getUserByEmail($changes['mail']);
133*311a6606SAnna Dabrowska            if ($found && $found != $user) {
134*311a6606SAnna Dabrowska                msg($this->getLang('emailduplicate'), -1);
135*311a6606SAnna Dabrowska                return false;
136*311a6606SAnna Dabrowska            }
137*311a6606SAnna Dabrowska        }
138*311a6606SAnna Dabrowska
139*311a6606SAnna Dabrowska        $ok = parent::modifyUser($user, $changes);
140*311a6606SAnna Dabrowska
141*311a6606SAnna Dabrowska        // refresh session cache
142*311a6606SAnna Dabrowska        touch($conf['cachedir'] . '/sessionpurge');
143*311a6606SAnna Dabrowska
144*311a6606SAnna Dabrowska        return $ok;
145*311a6606SAnna Dabrowska    }
146*311a6606SAnna Dabrowska
147*311a6606SAnna Dabrowska    /**
148*311a6606SAnna Dabrowska     * Unset additional stuff in session on logout
149*311a6606SAnna Dabrowska     */
150*311a6606SAnna Dabrowska    public function logOff()
151*311a6606SAnna Dabrowska    {
152*311a6606SAnna Dabrowska        parent::logOff();
153*311a6606SAnna Dabrowska
154*311a6606SAnna Dabrowska        $this->cleanLogout();
155*311a6606SAnna Dabrowska    }
156*311a6606SAnna Dabrowska
157*311a6606SAnna Dabrowska    /**
158f2e164b0SMichael Große     * @param array $session cookie auth session
159f2e164b0SMichael Große     *
160f2e164b0SMichael Große     * @return bool
161f2e164b0SMichael Große     */
1623e7ac5b1SAndreas Gohr    protected function isSessionValid($session)
1633e7ac5b1SAndreas Gohr    {
164f2e164b0SMichael Große        /** @var helper_plugin_oauth $hlp */
165f2e164b0SMichael Große        $hlp = plugin_load('helper', 'oauth');
166f2e164b0SMichael Große        if ($hlp->validBrowserID($session)) {
167f2e164b0SMichael Große            if (!$hlp->isSessionTimedOut($session)) {
168f2e164b0SMichael Große                return true;
169f2e164b0SMichael Große            } elseif (!($hlp->isGETRequest() && $hlp->isDokuPHP())) {
170f2e164b0SMichael Große                // only force a recheck on a timed-out session during a GET request on the main script doku.php
171f2e164b0SMichael Große                return true;
172f2e164b0SMichael Große            }
173f2e164b0SMichael Große        }
174f2e164b0SMichael Große        return false;
175f2e164b0SMichael Große    }
176f2e164b0SMichael Große
1773e7ac5b1SAndreas Gohr    protected function relogin($servicename)
1783e7ac5b1SAndreas Gohr    {
179213f4618SMichael Große        global $INPUT;
180213f4618SMichael Große
181213f4618SMichael Große        /** @var helper_plugin_oauth $hlp */
182213f4618SMichael Große        $hlp = plugin_load('helper', 'oauth');
183213f4618SMichael Große        $service = $hlp->loadService($servicename);
184213f4618SMichael Große        if (is_null($service)) return false;
185213f4618SMichael Große
186213f4618SMichael Große        // remember service in session
187213f4618SMichael Große        session_start();
188213f4618SMichael Große        $_SESSION[DOKU_COOKIE]['oauth-inprogress']['service'] = $servicename;
189213f4618SMichael Große        $_SESSION[DOKU_COOKIE]['oauth-inprogress']['id'] = $INPUT->str('id');
190188ba446SMichael Große        $_SESSION[DOKU_COOKIE]['oauth-inprogress']['params'] = $_GET;
191213f4618SMichael Große
19209623faaSMichael Große        $_SESSION[DOKU_COOKIE]['oauth-done']['$_REQUEST'] = $_REQUEST;
193213f4618SMichael Große
194213f4618SMichael Große        if (is_array($INPUT->post->param('do'))) {
195213f4618SMichael Große            $doPost = key($INPUT->post->arr('do'));
196213f4618SMichael Große        } else {
197213f4618SMichael Große            $doPost = $INPUT->post->str('do');
198213f4618SMichael Große        }
199213f4618SMichael Große        $doGet = $INPUT->get->str('do');
200213f4618SMichael Große        if (!empty($doPost)) {
201213f4618SMichael Große            $_SESSION[DOKU_COOKIE]['oauth-done']['do'] = $doPost;
202213f4618SMichael Große        } elseif (!empty($doGet)) {
203213f4618SMichael Große            $_SESSION[DOKU_COOKIE]['oauth-done']['do'] = $doGet;
204213f4618SMichael Große        }
205213f4618SMichael Große
206213f4618SMichael Große        session_write_close();
207213f4618SMichael Große
208213f4618SMichael Große        $service->login();
209213f4618SMichael Große    }
210213f4618SMichael Große
211a7a8f46aSAndreas Gohr    /**
212b2b9fbc7SMichael Große     * @param                              $sticky
213b2b9fbc7SMichael Große     * @param OAuth\Plugin\AbstractAdapter $service
2149928f5efSMichael Große     * @param string $servicename
215b2b9fbc7SMichael Große     * @param string $page
216188ba446SMichael Große     * @param array $params
217f07c7607SMichael Große     *
218f07c7607SMichael Große     * @return bool
219f07c7607SMichael Große     */
2203e7ac5b1SAndreas Gohr    protected function processLogin($sticky, $service, $servicename, $page, $params = array())
2213e7ac5b1SAndreas Gohr    {
222b2b9fbc7SMichael Große        $uinfo = $service->getUser();
223b2b9fbc7SMichael Große        $ok = $this->processUser($uinfo, $servicename);
224f07c7607SMichael Große        if (!$ok) {
225f07c7607SMichael Große            return false;
226f07c7607SMichael Große        }
227b2b9fbc7SMichael Große        $this->setUserSession($uinfo, $servicename);
228b2b9fbc7SMichael Große        $this->setUserCookie($uinfo['user'], $sticky, $servicename);
229b2b9fbc7SMichael Große        if (isset($page)) {
230188ba446SMichael Große            if (!empty($params['id'])) unset($params['id']);
231188ba446SMichael Große            send_redirect(wl($page, $params, false, '&'));
232b2b9fbc7SMichael Große        }
233f07c7607SMichael Große        return true;
234f07c7607SMichael Große    }
235f07c7607SMichael Große
2369928f5efSMichael Große    /**
2379928f5efSMichael Große     * process the user and update the $uinfo array
2389928f5efSMichael Große     *
2399928f5efSMichael Große     * @param $uinfo
2409928f5efSMichael Große     * @param $servicename
2419928f5efSMichael Große     *
2429928f5efSMichael Große     * @return bool
2439928f5efSMichael Große     */
2443e7ac5b1SAndreas Gohr    protected function processUser(&$uinfo, $servicename)
2453e7ac5b1SAndreas Gohr    {
2469928f5efSMichael Große        $uinfo['user'] = $this->cleanUser((string)$uinfo['user']);
2479928f5efSMichael Große        if (!$uinfo['name']) $uinfo['name'] = $uinfo['user'];
2489928f5efSMichael Große
2499928f5efSMichael Große        if (!$uinfo['user'] || !$uinfo['mail']) {
2509928f5efSMichael Große            msg("$servicename did not provide the needed user info. Can't log you in", -1);
2519928f5efSMichael Große            return false;
2529928f5efSMichael Große        }
2539928f5efSMichael Große
2549928f5efSMichael Große        // see if the user is known already
2559928f5efSMichael Große        $user = $this->getUserByEmail($uinfo['mail']);
2569928f5efSMichael Große        if ($user) {
2579928f5efSMichael Große            $sinfo = $this->getUserData($user);
2589928f5efSMichael Große            // check if the user allowed access via this service
2599928f5efSMichael Große            if (!in_array($this->cleanGroup($servicename), $sinfo['grps'])) {
2609928f5efSMichael Große                msg(sprintf($this->getLang('authnotenabled'), $servicename), -1);
2619928f5efSMichael Große                return false;
2629928f5efSMichael Große            }
2639928f5efSMichael Große            $uinfo['user'] = $user;
2649928f5efSMichael Große            $uinfo['name'] = $sinfo['name'];
2659928f5efSMichael Große            $uinfo['grps'] = array_merge((array)$uinfo['grps'], $sinfo['grps']);
266d313403cSAnna Dabrowska        } elseif (actionOK('register') || $this->getConf('register-on-auth')) {
2679928f5efSMichael Große            $ok = $this->addUser($uinfo, $servicename);
2689928f5efSMichael Große            if (!$ok) {
2699928f5efSMichael Große                msg('something went wrong creating your user account. please try again later.', -1);
2709928f5efSMichael Große                return false;
2719928f5efSMichael Große            }
2729928f5efSMichael Große        } else {
2739928f5efSMichael Große            msg($this->getLang('addUser not possible'), -1);
2749928f5efSMichael Große            return false;
2759928f5efSMichael Große        }
2769928f5efSMichael Große        return true;
2779928f5efSMichael Große    }
2789928f5efSMichael Große
2799928f5efSMichael Große    /**
280b2b9fbc7SMichael Große     * new user, create him - making sure the login is unique by adding a number if needed
281b2b9fbc7SMichael Große     *
282b2b9fbc7SMichael Große     * @param array $uinfo user info received from the oAuth service
283b2b9fbc7SMichael Große     * @param string $servicename
284b2b9fbc7SMichael Große     *
285b2b9fbc7SMichael Große     * @return bool
286b2b9fbc7SMichael Große     */
2873e7ac5b1SAndreas Gohr    protected function addUser(&$uinfo, $servicename)
2883e7ac5b1SAndreas Gohr    {
289b2b9fbc7SMichael Große        global $conf;
290b2b9fbc7SMichael Große        $user = $uinfo['user'];
291b2b9fbc7SMichael Große        $count = '';
292b2b9fbc7SMichael Große        while ($this->getUserData($user . $count)) {
293b2b9fbc7SMichael Große            if ($count) {
294b2b9fbc7SMichael Große                $count++;
295b2b9fbc7SMichael Große            } else {
296b2b9fbc7SMichael Große                $count = 1;
297b2b9fbc7SMichael Große            }
298b2b9fbc7SMichael Große        }
299b2b9fbc7SMichael Große        $user = $user . $count;
300b2b9fbc7SMichael Große        $uinfo['user'] = $user;
301b2b9fbc7SMichael Große        $groups_on_creation = array();
302b2b9fbc7SMichael Große        $groups_on_creation[] = $conf['defaultgroup'];
303b2b9fbc7SMichael Große        $groups_on_creation[] = $this->cleanGroup($servicename); // add service as group
304b2b9fbc7SMichael Große        $uinfo['grps'] = array_merge((array)$uinfo['grps'], $groups_on_creation);
305b2b9fbc7SMichael Große
306b2b9fbc7SMichael Große        $ok = $this->triggerUserMod(
307b2b9fbc7SMichael Große            'create',
308b2b9fbc7SMichael Große            array($user, auth_pwgen($user), $uinfo['name'], $uinfo['mail'], $groups_on_creation,)
309b2b9fbc7SMichael Große        );
310b2b9fbc7SMichael Große        if (!$ok) {
311b2b9fbc7SMichael Große            return false;
312b2b9fbc7SMichael Große        }
313b2b9fbc7SMichael Große
314b2b9fbc7SMichael Große        // send notification about the new user
315b2b9fbc7SMichael Große        $subscription = new Subscription();
316b2b9fbc7SMichael Große        $subscription->send_register($user, $uinfo['name'], $uinfo['mail']);
317b2b9fbc7SMichael Große        return true;
318b2b9fbc7SMichael Große    }
319b2b9fbc7SMichael Große
320b2b9fbc7SMichael Große    /**
321b2b9fbc7SMichael Große     * Find a user by his email address
322b2b9fbc7SMichael Große     *
323b2b9fbc7SMichael Große     * @param $mail
324b2b9fbc7SMichael Große     * @return bool|string
325b2b9fbc7SMichael Große     */
3263e7ac5b1SAndreas Gohr    protected function getUserByEmail($mail)
3273e7ac5b1SAndreas Gohr    {
3288b214edcSAndreas Gohr        if ($this->users === null) {
3298b214edcSAndreas Gohr            if (is_callable([$this, '_loadUserData'])) {
3308b214edcSAndreas Gohr                $this->_loadUserData();
3318b214edcSAndreas Gohr            } else {
3328b214edcSAndreas Gohr                $this->loadUserData();
3338b214edcSAndreas Gohr            }
3348b214edcSAndreas Gohr        }
335b2b9fbc7SMichael Große        $mail = strtolower($mail);
336b2b9fbc7SMichael Große
337b2b9fbc7SMichael Große        foreach ($this->users as $user => $uinfo) {
338b2b9fbc7SMichael Große            if (strtolower($uinfo['mail']) == $mail) return $user;
339b2b9fbc7SMichael Große        }
340b2b9fbc7SMichael Große
341b2b9fbc7SMichael Große        return false;
342b2b9fbc7SMichael Große    }
343b2b9fbc7SMichael Große
344b2b9fbc7SMichael Große    /**
345b2b9fbc7SMichael Große     * @param array $data
346b2b9fbc7SMichael Große     * @param string $service
347b2b9fbc7SMichael Große     */
3483e7ac5b1SAndreas Gohr    protected function setUserSession($data, $service)
3493e7ac5b1SAndreas Gohr    {
350b2b9fbc7SMichael Große        global $USERINFO;
351b2b9fbc7SMichael Große
352b2b9fbc7SMichael Große        // set up groups
353b2b9fbc7SMichael Große        if (!is_array($data['grps'])) {
354b2b9fbc7SMichael Große            $data['grps'] = array();
355b2b9fbc7SMichael Große        }
356b2b9fbc7SMichael Große        $data['grps'][] = $this->cleanGroup($service);
357b2b9fbc7SMichael Große        $data['grps'] = array_unique($data['grps']);
358b2b9fbc7SMichael Große
359b2b9fbc7SMichael Große        $USERINFO = $data;
360b2b9fbc7SMichael Große        $_SERVER['REMOTE_USER'] = $data['user'];
361b2b9fbc7SMichael Große        $_SESSION[DOKU_COOKIE]['auth']['user'] = $data['user'];
362b2b9fbc7SMichael Große        $_SESSION[DOKU_COOKIE]['auth']['pass'] = $data['pass'];
363b2b9fbc7SMichael Große        $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
364b2b9fbc7SMichael Große        $_SESSION[DOKU_COOKIE]['auth']['buid'] = auth_browseruid();
365b2b9fbc7SMichael Große        $_SESSION[DOKU_COOKIE]['auth']['time'] = time();
366b2b9fbc7SMichael Große        $_SESSION[DOKU_COOKIE]['auth']['oauth'] = $service;
367b2b9fbc7SMichael Große    }
368b2b9fbc7SMichael Große
369b2b9fbc7SMichael Große    /**
3709928f5efSMichael Große     * @param string $user
371523e6571SMichael Große     * @param bool $sticky
3729928f5efSMichael Große     * @param string $servicename
373523e6571SMichael Große     * @param int $validityPeriodInSeconds optional, per default 1 Year
3749928f5efSMichael Große     */
3753e7ac5b1SAndreas Gohr    private function setUserCookie($user, $sticky, $servicename, $validityPeriodInSeconds = 31536000)
3763e7ac5b1SAndreas Gohr    {
3779928f5efSMichael Große        $cookie = base64_encode($user) . '|' . ((int)$sticky) . '|' . base64_encode('oauth') . '|' . base64_encode($servicename);
3789928f5efSMichael Große        $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
379523e6571SMichael Große        $time = $sticky ? (time() + $validityPeriodInSeconds) : 0;
3809928f5efSMichael Große        setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
3819928f5efSMichael Große    }
3829928f5efSMichael Große
383827232fcSMichael Große    /**
384b2b9fbc7SMichael Große     * unset auth cookies and session information
385b2b9fbc7SMichael Große     */
3863e7ac5b1SAndreas Gohr    private function cleanLogout()
3873e7ac5b1SAndreas Gohr    {
388af2a4e8fSMichael Große        if (isset($_SESSION[DOKU_COOKIE]['oauth-done'])) {
389b2b9fbc7SMichael Große            unset($_SESSION[DOKU_COOKIE]['oauth-done']);
390af2a4e8fSMichael Große        }
391af2a4e8fSMichael Große        if (isset($_SESSION[DOKU_COOKIE]['auth'])) {
392b2b9fbc7SMichael Große            unset($_SESSION[DOKU_COOKIE]['auth']);
393af2a4e8fSMichael Große        }
394b2b9fbc7SMichael Große        $this->setUserCookie('', true, '', -60);
395b2b9fbc7SMichael Große    }
396b2b9fbc7SMichael Große
397b2b9fbc7SMichael Große    /**
398*311a6606SAnna Dabrowska     * Farmer plugin
399b2b9fbc7SMichael Große     *
400*311a6606SAnna Dabrowska     * @param $state
401b2b9fbc7SMichael Große     */
402*311a6606SAnna Dabrowska    private function handleState($state)
4033e7ac5b1SAndreas Gohr    {
404*311a6606SAnna Dabrowska        /** @var \helper_plugin_farmer $farmer */
405*311a6606SAnna Dabrowska        $farmer = plugin_load('helper', 'farmer', false, true);
406*311a6606SAnna Dabrowska        $data = json_decode(base64_decode(urldecode($state)));
407*311a6606SAnna Dabrowska        if (empty($data->animal) || $farmer->getAnimal() == $data->animal) {
408*311a6606SAnna Dabrowska            return;
409827232fcSMichael Große        }
410*311a6606SAnna Dabrowska        $animal = $data->animal;
411*311a6606SAnna Dabrowska        $allAnimals = $farmer->getAllAnimals();
412*311a6606SAnna Dabrowska        if (!in_array($animal, $allAnimals)) {
413*311a6606SAnna Dabrowska            msg('Animal ' . $animal . ' does not exist!');
414*311a6606SAnna Dabrowska            return;
415827232fcSMichael Große        }
416*311a6606SAnna Dabrowska        global $INPUT;
417*311a6606SAnna Dabrowska        $url = $farmer->getAnimalURL($animal) . '/doku.php?' . $INPUT->server->str('QUERY_STRING');
418*311a6606SAnna Dabrowska        send_redirect($url);
419b2b9fbc7SMichael Große    }
420b2b9fbc7SMichael Große}
421b2b9fbc7SMichael Große
42280852c15SAndreas Gohr// vim:ts=4:sw=4:et:
423