137d2401aSAnna Dabrowska<?php 237d2401aSAnna Dabrowska 3*290e9b1fSAndreas Gohruse dokuwiki\Extension\ActionPlugin; 4*290e9b1fSAndreas Gohruse dokuwiki\Extension\EventHandler; 5*290e9b1fSAndreas Gohruse dokuwiki\Extension\Event; 6b0c07e15SAndreas Gohruse dokuwiki\Form\Form; 7b0c07e15SAndreas Gohr 837d2401aSAnna Dabrowska/** 937d2401aSAnna Dabrowska * DokuWiki Plugin oauth (Action Component) 1037d2401aSAnna Dabrowska * 1174b4d4a4SAndreas Gohr * This manages profile changes and allows the user to change their oauth groups. 1274b4d4a4SAndreas Gohr * We use group memberships to define if logins are okay with the given services. 1374b4d4a4SAndreas Gohr * 1437d2401aSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 1537d2401aSAnna Dabrowska * @author Andreas Gohr <andi@splitbrain.org> 1637d2401aSAnna Dabrowska */ 17*290e9b1fSAndreas Gohrclass action_plugin_oauth_user extends ActionPlugin 1837d2401aSAnna Dabrowska{ 1937d2401aSAnna Dabrowska /** @var helper_plugin_oauth */ 2037d2401aSAnna Dabrowska protected $hlp; 2137d2401aSAnna Dabrowska 2237d2401aSAnna Dabrowska /** 2337d2401aSAnna Dabrowska * Constructor 2437d2401aSAnna Dabrowska * 2537d2401aSAnna Dabrowska * Initializes the helper 2637d2401aSAnna Dabrowska */ 2737d2401aSAnna Dabrowska public function __construct() 2837d2401aSAnna Dabrowska { 2937d2401aSAnna Dabrowska $this->hlp = plugin_load('helper', 'oauth'); 3037d2401aSAnna Dabrowska } 3137d2401aSAnna Dabrowska 3237d2401aSAnna Dabrowska /** 3337d2401aSAnna Dabrowska * Registers a callback function for a given event 3437d2401aSAnna Dabrowska * 35*290e9b1fSAndreas Gohr * @param EventHandler $controller DokuWiki's event controller object 3637d2401aSAnna Dabrowska * @return void 3737d2401aSAnna Dabrowska */ 38*290e9b1fSAndreas Gohr public function register(EventHandler $controller) 3937d2401aSAnna Dabrowska { 4037d2401aSAnna Dabrowska global $conf; 4137d2401aSAnna Dabrowska if ($conf['authtype'] != 'oauth') return; 4237d2401aSAnna Dabrowska 4337d2401aSAnna Dabrowska $conf['profileconfirm'] = false; // password confirmation doesn't work with oauth only users 4437d2401aSAnna Dabrowska 45*290e9b1fSAndreas Gohr $controller->register_hook( 46*290e9b1fSAndreas Gohr 'HTML_UPDATEPROFILEFORM_OUTPUT', 47*290e9b1fSAndreas Gohr 'BEFORE', 48*290e9b1fSAndreas Gohr $this, 49*290e9b1fSAndreas Gohr 'handleOldProfileform' 50*290e9b1fSAndreas Gohr ); // deprecated 51b0c07e15SAndreas Gohr $controller->register_hook('FORM_UPDATEPROFILE_OUTPUT', 'BEFORE', $this, 'handleProfileform'); 5237d2401aSAnna Dabrowska $controller->register_hook('AUTH_USER_CHANGE', 'BEFORE', $this, 'handleUsermod'); 5337d2401aSAnna Dabrowska } 54b0c07e15SAndreas Gohr 5537d2401aSAnna Dabrowska /** 5637d2401aSAnna Dabrowska * Save groups for all the services a user has enabled 5737d2401aSAnna Dabrowska * 58*290e9b1fSAndreas Gohr * @param Event $event event object by reference 5937d2401aSAnna Dabrowska * @return void 6037d2401aSAnna Dabrowska */ 61*290e9b1fSAndreas Gohr public function handleUsermod(Event $event) 6237d2401aSAnna Dabrowska { 6337d2401aSAnna Dabrowska global $ACT; 6437d2401aSAnna Dabrowska global $USERINFO; 6537d2401aSAnna Dabrowska global $auth; 6637d2401aSAnna Dabrowska global $INPUT; 6737d2401aSAnna Dabrowska 6837d2401aSAnna Dabrowska if ($event->data['type'] != 'modify') return; 6937d2401aSAnna Dabrowska if ($ACT != 'profile') return; 7037d2401aSAnna Dabrowska 7137d2401aSAnna Dabrowska // we want to modify the user's groups 7237d2401aSAnna Dabrowska $groups = $USERINFO['grps']; //current groups 7337d2401aSAnna Dabrowska if (isset($event->data['params'][1]['grps'])) { 7437d2401aSAnna Dabrowska // something already defined new groups 7537d2401aSAnna Dabrowska $groups = $event->data['params'][1]['grps']; 7637d2401aSAnna Dabrowska } 7737d2401aSAnna Dabrowska 7837d2401aSAnna Dabrowska // get enabled and configured services 7937d2401aSAnna Dabrowska $enabled = $INPUT->arr('oauth_group'); 8037d2401aSAnna Dabrowska $services = array_keys($this->hlp->listServices()); 8137d2401aSAnna Dabrowska $services = array_map([$auth, 'cleanGroup'], $services); 8237d2401aSAnna Dabrowska 8337d2401aSAnna Dabrowska // add all enabled services as group, remove all disabled services 8437d2401aSAnna Dabrowska foreach ($services as $service) { 8537d2401aSAnna Dabrowska if (isset($enabled[$service])) { 8637d2401aSAnna Dabrowska $groups[] = $service; 8737d2401aSAnna Dabrowska } else { 8837d2401aSAnna Dabrowska $idx = array_search($service, $groups); 8937d2401aSAnna Dabrowska if ($idx !== false) unset($groups[$idx]); 9037d2401aSAnna Dabrowska } 9137d2401aSAnna Dabrowska } 9237d2401aSAnna Dabrowska $groups = array_unique($groups); 9337d2401aSAnna Dabrowska 9437d2401aSAnna Dabrowska // add new group array to event data 9537d2401aSAnna Dabrowska $event->data['params'][1]['grps'] = $groups; 9637d2401aSAnna Dabrowska } 9737d2401aSAnna Dabrowska 9837d2401aSAnna Dabrowska /** 9937d2401aSAnna Dabrowska * Add service selection to user profile 10037d2401aSAnna Dabrowska * 101*290e9b1fSAndreas Gohr * @param Event $event event object by reference 10237d2401aSAnna Dabrowska * @return void 103b0c07e15SAndreas Gohr * @deprecated 10437d2401aSAnna Dabrowska */ 105*290e9b1fSAndreas Gohr public function handleOldProfileform(Event $event) 10637d2401aSAnna Dabrowska { 10737d2401aSAnna Dabrowska global $USERINFO; 10837d2401aSAnna Dabrowska /** @var auth_plugin_authplain $auth */ 10937d2401aSAnna Dabrowska global $auth; 11037d2401aSAnna Dabrowska 11137d2401aSAnna Dabrowska /** @var Doku_Form $form */ 11237d2401aSAnna Dabrowska $form = $event->data; 11337d2401aSAnna Dabrowska $pos = $form->findElementByAttribute('type', 'submit'); 11437d2401aSAnna Dabrowska 11537d2401aSAnna Dabrowska $services = $this->hlp->listServices(); 11637d2401aSAnna Dabrowska if (!$services) return; 11737d2401aSAnna Dabrowska 11837d2401aSAnna Dabrowska $form->insertElement($pos, form_closefieldset()); 11937d2401aSAnna Dabrowska $form->insertElement( 12037d2401aSAnna Dabrowska ++$pos, 12137d2401aSAnna Dabrowska form_openfieldset(['_legend' => $this->getLang('loginwith'), 'class' => 'plugin_oauth']) 12237d2401aSAnna Dabrowska ); 12337d2401aSAnna Dabrowska foreach ($services as $service) { 12437d2401aSAnna Dabrowska $group = $auth->cleanGroup($service->getServiceID()); 12537d2401aSAnna Dabrowska $elem = form_makeCheckboxField( 12637d2401aSAnna Dabrowska 'oauth_group[' . $group . ']', 127*290e9b1fSAndreas Gohr 1, 128*290e9b1fSAndreas Gohr $service->getLabel(), 129*290e9b1fSAndreas Gohr '', 130*290e9b1fSAndreas Gohr 'simple', 13137d2401aSAnna Dabrowska [ 13237d2401aSAnna Dabrowska 'checked' => (in_array($group, $USERINFO['grps'])) ? 'checked' : '', 13337d2401aSAnna Dabrowska ] 13437d2401aSAnna Dabrowska ); 13537d2401aSAnna Dabrowska 13637d2401aSAnna Dabrowska $form->insertElement(++$pos, $elem); 13737d2401aSAnna Dabrowska } 13837d2401aSAnna Dabrowska $form->insertElement(++$pos, form_closefieldset()); 13937d2401aSAnna Dabrowska $form->insertElement(++$pos, form_openfieldset([])); 14037d2401aSAnna Dabrowska } 141b0c07e15SAndreas Gohr 142b0c07e15SAndreas Gohr /** 143b0c07e15SAndreas Gohr * Add service selection to user profile 144b0c07e15SAndreas Gohr * 145*290e9b1fSAndreas Gohr * @param Event $event event object by reference 146b0c07e15SAndreas Gohr * @return void 147b0c07e15SAndreas Gohr */ 148*290e9b1fSAndreas Gohr public function handleProfileform(Event $event) 149b0c07e15SAndreas Gohr { 150b0c07e15SAndreas Gohr global $USERINFO; 151b0c07e15SAndreas Gohr /** @var auth_plugin_authplain $auth */ 152b0c07e15SAndreas Gohr global $auth; 153b0c07e15SAndreas Gohr 154b0c07e15SAndreas Gohr /** @var Form $form */ 155b0c07e15SAndreas Gohr $form = $event->data; 156b0c07e15SAndreas Gohr $pos = $form->findPositionByAttribute('type', 'submit'); 157b0c07e15SAndreas Gohr 158b0c07e15SAndreas Gohr $services = $this->hlp->listServices(); 159b0c07e15SAndreas Gohr if (!$services) return; 160b0c07e15SAndreas Gohr 161b0c07e15SAndreas Gohr $form->addFieldsetOpen($this->getLang('loginwith'), $pos)->addClass('plugin_oauth'); 162b0c07e15SAndreas Gohr 163b0c07e15SAndreas Gohr foreach ($services as $service) { 164b0c07e15SAndreas Gohr $group = $auth->cleanGroup($service->getServiceID()); 165b0c07e15SAndreas Gohr $cb = $form->addCheckbox( 166b0c07e15SAndreas Gohr 'oauth_group[' . $group . ']', 16704a78b87SAndreas Gohr $service->getLabel(), 168b0c07e15SAndreas Gohr ++$pos 169b0c07e15SAndreas Gohr ); 170b0c07e15SAndreas Gohr if (in_array($group, $USERINFO['grps'])) { 171b0c07e15SAndreas Gohr $cb->attr('checked', 'checked'); 172b0c07e15SAndreas Gohr } 173b0c07e15SAndreas Gohr } 174b0c07e15SAndreas Gohr $form->addFieldsetClose(++$pos); 175b0c07e15SAndreas Gohr } 17637d2401aSAnna Dabrowska} 177