137d2401aSAnna Dabrowska<?php 237d2401aSAnna Dabrowska 3*b0c07e15SAndreas Gohruse dokuwiki\Form\Form; 4*b0c07e15SAndreas Gohr 537d2401aSAnna Dabrowska/** 637d2401aSAnna Dabrowska * DokuWiki Plugin oauth (Action Component) 737d2401aSAnna Dabrowska * 874b4d4a4SAndreas Gohr * This manages profile changes and allows the user to change their oauth groups. 974b4d4a4SAndreas Gohr * We use group memberships to define if logins are okay with the given services. 1074b4d4a4SAndreas Gohr * 1137d2401aSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 1237d2401aSAnna Dabrowska * @author Andreas Gohr <andi@splitbrain.org> 1337d2401aSAnna Dabrowska */ 1437d2401aSAnna Dabrowskaclass action_plugin_oauth_user extends DokuWiki_Action_Plugin 1537d2401aSAnna Dabrowska{ 1637d2401aSAnna Dabrowska /** @var helper_plugin_oauth */ 1737d2401aSAnna Dabrowska protected $hlp; 1837d2401aSAnna Dabrowska 1937d2401aSAnna Dabrowska /** 2037d2401aSAnna Dabrowska * Constructor 2137d2401aSAnna Dabrowska * 2237d2401aSAnna Dabrowska * Initializes the helper 2337d2401aSAnna Dabrowska */ 2437d2401aSAnna Dabrowska public function __construct() 2537d2401aSAnna Dabrowska { 2637d2401aSAnna Dabrowska $this->hlp = plugin_load('helper', 'oauth'); 2737d2401aSAnna Dabrowska } 2837d2401aSAnna Dabrowska 2937d2401aSAnna Dabrowska /** 3037d2401aSAnna Dabrowska * Registers a callback function for a given event 3137d2401aSAnna Dabrowska * 3237d2401aSAnna Dabrowska * @param Doku_Event_Handler $controller DokuWiki's event controller object 3337d2401aSAnna Dabrowska * @return void 3437d2401aSAnna Dabrowska */ 3537d2401aSAnna Dabrowska public function register(Doku_Event_Handler $controller) 3637d2401aSAnna Dabrowska { 3737d2401aSAnna Dabrowska global $conf; 3837d2401aSAnna Dabrowska if ($conf['authtype'] != 'oauth') return; 3937d2401aSAnna Dabrowska 4037d2401aSAnna Dabrowska $conf['profileconfirm'] = false; // password confirmation doesn't work with oauth only users 4137d2401aSAnna Dabrowska 42*b0c07e15SAndreas Gohr $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 43*b0c07e15SAndreas Gohr 'handleOldProfileform'); // deprecated 44*b0c07e15SAndreas Gohr $controller->register_hook('FORM_UPDATEPROFILE_OUTPUT', 'BEFORE', $this, 'handleProfileform'); 4537d2401aSAnna Dabrowska $controller->register_hook('AUTH_USER_CHANGE', 'BEFORE', $this, 'handleUsermod'); 4637d2401aSAnna Dabrowska } 47*b0c07e15SAndreas Gohr 4837d2401aSAnna Dabrowska /** 4937d2401aSAnna Dabrowska * Save groups for all the services a user has enabled 5037d2401aSAnna Dabrowska * 5137d2401aSAnna Dabrowska * @param Doku_Event $event event object by reference 5237d2401aSAnna Dabrowska * @return void 5337d2401aSAnna Dabrowska */ 5437d2401aSAnna Dabrowska public function handleUsermod(Doku_Event $event) 5537d2401aSAnna Dabrowska { 5637d2401aSAnna Dabrowska global $ACT; 5737d2401aSAnna Dabrowska global $USERINFO; 5837d2401aSAnna Dabrowska global $auth; 5937d2401aSAnna Dabrowska global $INPUT; 6037d2401aSAnna Dabrowska 6137d2401aSAnna Dabrowska if ($event->data['type'] != 'modify') return; 6237d2401aSAnna Dabrowska if ($ACT != 'profile') return; 6337d2401aSAnna Dabrowska 6437d2401aSAnna Dabrowska // we want to modify the user's groups 6537d2401aSAnna Dabrowska $groups = $USERINFO['grps']; //current groups 6637d2401aSAnna Dabrowska if (isset($event->data['params'][1]['grps'])) { 6737d2401aSAnna Dabrowska // something already defined new groups 6837d2401aSAnna Dabrowska $groups = $event->data['params'][1]['grps']; 6937d2401aSAnna Dabrowska } 7037d2401aSAnna Dabrowska 7137d2401aSAnna Dabrowska // get enabled and configured services 7237d2401aSAnna Dabrowska $enabled = $INPUT->arr('oauth_group'); 7337d2401aSAnna Dabrowska $services = array_keys($this->hlp->listServices()); 7437d2401aSAnna Dabrowska $services = array_map([$auth, 'cleanGroup'], $services); 7537d2401aSAnna Dabrowska 7637d2401aSAnna Dabrowska // add all enabled services as group, remove all disabled services 7737d2401aSAnna Dabrowska foreach ($services as $service) { 7837d2401aSAnna Dabrowska if (isset($enabled[$service])) { 7937d2401aSAnna Dabrowska $groups[] = $service; 8037d2401aSAnna Dabrowska } else { 8137d2401aSAnna Dabrowska $idx = array_search($service, $groups); 8237d2401aSAnna Dabrowska if ($idx !== false) unset($groups[$idx]); 8337d2401aSAnna Dabrowska } 8437d2401aSAnna Dabrowska } 8537d2401aSAnna Dabrowska $groups = array_unique($groups); 8637d2401aSAnna Dabrowska 8737d2401aSAnna Dabrowska // add new group array to event data 8837d2401aSAnna Dabrowska $event->data['params'][1]['grps'] = $groups; 8937d2401aSAnna Dabrowska } 9037d2401aSAnna Dabrowska 9137d2401aSAnna Dabrowska /** 9237d2401aSAnna Dabrowska * Add service selection to user profile 9337d2401aSAnna Dabrowska * 9437d2401aSAnna Dabrowska * @param Doku_Event $event event object by reference 9537d2401aSAnna Dabrowska * @return void 96*b0c07e15SAndreas Gohr * @deprecated 9737d2401aSAnna Dabrowska */ 98*b0c07e15SAndreas Gohr public function handleOldProfileform(Doku_Event $event) 9937d2401aSAnna Dabrowska { 10037d2401aSAnna Dabrowska global $USERINFO; 10137d2401aSAnna Dabrowska /** @var auth_plugin_authplain $auth */ 10237d2401aSAnna Dabrowska global $auth; 10337d2401aSAnna Dabrowska 10437d2401aSAnna Dabrowska /** @var Doku_Form $form */ 10537d2401aSAnna Dabrowska $form = $event->data; 10637d2401aSAnna Dabrowska $pos = $form->findElementByAttribute('type', 'submit'); 10737d2401aSAnna Dabrowska 10837d2401aSAnna Dabrowska $services = $this->hlp->listServices(); 10937d2401aSAnna Dabrowska if (!$services) return; 11037d2401aSAnna Dabrowska 11137d2401aSAnna Dabrowska $form->insertElement($pos, form_closefieldset()); 11237d2401aSAnna Dabrowska $form->insertElement( 11337d2401aSAnna Dabrowska ++$pos, 11437d2401aSAnna Dabrowska form_openfieldset(['_legend' => $this->getLang('loginwith'), 'class' => 'plugin_oauth']) 11537d2401aSAnna Dabrowska ); 11637d2401aSAnna Dabrowska foreach ($services as $service) { 11737d2401aSAnna Dabrowska $group = $auth->cleanGroup($service->getServiceID()); 11837d2401aSAnna Dabrowska $elem = form_makeCheckboxField( 11937d2401aSAnna Dabrowska 'oauth_group[' . $group . ']', 12037d2401aSAnna Dabrowska 1, $service->getServiceLabel(), '', 'simple', 12137d2401aSAnna Dabrowska [ 12237d2401aSAnna Dabrowska 'checked' => (in_array($group, $USERINFO['grps'])) ? 'checked' : '', 12337d2401aSAnna Dabrowska ] 12437d2401aSAnna Dabrowska ); 12537d2401aSAnna Dabrowska 12637d2401aSAnna Dabrowska $form->insertElement(++$pos, $elem); 12737d2401aSAnna Dabrowska } 12837d2401aSAnna Dabrowska $form->insertElement(++$pos, form_closefieldset()); 12937d2401aSAnna Dabrowska $form->insertElement(++$pos, form_openfieldset([])); 13037d2401aSAnna Dabrowska } 131*b0c07e15SAndreas Gohr 132*b0c07e15SAndreas Gohr /** 133*b0c07e15SAndreas Gohr * Add service selection to user profile 134*b0c07e15SAndreas Gohr * 135*b0c07e15SAndreas Gohr * @param Doku_Event $event event object by reference 136*b0c07e15SAndreas Gohr * @return void 137*b0c07e15SAndreas Gohr */ 138*b0c07e15SAndreas Gohr public function handleProfileform(Doku_Event $event) 139*b0c07e15SAndreas Gohr { 140*b0c07e15SAndreas Gohr global $USERINFO; 141*b0c07e15SAndreas Gohr /** @var auth_plugin_authplain $auth */ 142*b0c07e15SAndreas Gohr global $auth; 143*b0c07e15SAndreas Gohr 144*b0c07e15SAndreas Gohr /** @var Form $form */ 145*b0c07e15SAndreas Gohr $form = $event->data; 146*b0c07e15SAndreas Gohr $pos = $form->findPositionByAttribute('type', 'submit'); 147*b0c07e15SAndreas Gohr 148*b0c07e15SAndreas Gohr $services = $this->hlp->listServices(); 149*b0c07e15SAndreas Gohr if (!$services) return; 150*b0c07e15SAndreas Gohr 151*b0c07e15SAndreas Gohr $form->addFieldsetOpen($this->getLang('loginwith'), $pos)->addClass('plugin_oauth'); 152*b0c07e15SAndreas Gohr 153*b0c07e15SAndreas Gohr foreach ($services as $service) { 154*b0c07e15SAndreas Gohr $group = $auth->cleanGroup($service->getServiceID()); 155*b0c07e15SAndreas Gohr $cb = $form->addCheckbox( 156*b0c07e15SAndreas Gohr 'oauth_group[' . $group . ']', 157*b0c07e15SAndreas Gohr $service->getServiceLabel(), 158*b0c07e15SAndreas Gohr ++$pos 159*b0c07e15SAndreas Gohr ); 160*b0c07e15SAndreas Gohr if (in_array($group, $USERINFO['grps'])) { 161*b0c07e15SAndreas Gohr $cb->attr('checked', 'checked'); 162*b0c07e15SAndreas Gohr } 163*b0c07e15SAndreas Gohr } 164*b0c07e15SAndreas Gohr $form->addFieldsetClose(++$pos); 165*b0c07e15SAndreas Gohr } 16637d2401aSAnna Dabrowska} 167