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