137d2401aSAnna Dabrowska<?php 237d2401aSAnna Dabrowska 337d2401aSAnna Dabrowska/** 437d2401aSAnna Dabrowska * DokuWiki Plugin oauth (Action Component) 537d2401aSAnna Dabrowska * 6*74b4d4a4SAndreas Gohr * This manages profile changes and allows the user to change their oauth groups. 7*74b4d4a4SAndreas Gohr * We use group memberships to define if logins are okay with the given services. 8*74b4d4a4SAndreas Gohr * 937d2401aSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 1037d2401aSAnna Dabrowska * @author Andreas Gohr <andi@splitbrain.org> 1137d2401aSAnna Dabrowska */ 1237d2401aSAnna Dabrowskaclass action_plugin_oauth_user extends DokuWiki_Action_Plugin 1337d2401aSAnna Dabrowska{ 1437d2401aSAnna Dabrowska /** @var helper_plugin_oauth */ 1537d2401aSAnna Dabrowska protected $hlp; 1637d2401aSAnna Dabrowska 1737d2401aSAnna Dabrowska /** 1837d2401aSAnna Dabrowska * Constructor 1937d2401aSAnna Dabrowska * 2037d2401aSAnna Dabrowska * Initializes the helper 2137d2401aSAnna Dabrowska */ 2237d2401aSAnna Dabrowska public function __construct() 2337d2401aSAnna Dabrowska { 2437d2401aSAnna Dabrowska $this->hlp = plugin_load('helper', 'oauth'); 2537d2401aSAnna Dabrowska } 2637d2401aSAnna Dabrowska 2737d2401aSAnna Dabrowska /** 2837d2401aSAnna Dabrowska * Registers a callback function for a given event 2937d2401aSAnna Dabrowska * 3037d2401aSAnna Dabrowska * @param Doku_Event_Handler $controller DokuWiki's event controller object 3137d2401aSAnna Dabrowska * @return void 3237d2401aSAnna Dabrowska */ 3337d2401aSAnna Dabrowska public function register(Doku_Event_Handler $controller) 3437d2401aSAnna Dabrowska { 3537d2401aSAnna Dabrowska global $conf; 3637d2401aSAnna Dabrowska if ($conf['authtype'] != 'oauth') return; 3737d2401aSAnna Dabrowska 3837d2401aSAnna Dabrowska $conf['profileconfirm'] = false; // password confirmation doesn't work with oauth only users 3937d2401aSAnna Dabrowska 4037d2401aSAnna Dabrowska $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 'handleProfileform'); 4137d2401aSAnna Dabrowska $controller->register_hook('AUTH_USER_CHANGE', 'BEFORE', $this, 'handleUsermod'); 4237d2401aSAnna Dabrowska } 4337d2401aSAnna Dabrowska /** 4437d2401aSAnna Dabrowska * Save groups for all the services a user has enabled 4537d2401aSAnna Dabrowska * 4637d2401aSAnna Dabrowska * @param Doku_Event $event event object by reference 4737d2401aSAnna Dabrowska * @return void 4837d2401aSAnna Dabrowska */ 4937d2401aSAnna Dabrowska public function handleUsermod(Doku_Event $event) 5037d2401aSAnna Dabrowska { 5137d2401aSAnna Dabrowska global $ACT; 5237d2401aSAnna Dabrowska global $USERINFO; 5337d2401aSAnna Dabrowska global $auth; 5437d2401aSAnna Dabrowska global $INPUT; 5537d2401aSAnna Dabrowska 5637d2401aSAnna Dabrowska if ($event->data['type'] != 'modify') return; 5737d2401aSAnna Dabrowska if ($ACT != 'profile') return; 5837d2401aSAnna Dabrowska 5937d2401aSAnna Dabrowska // we want to modify the user's groups 6037d2401aSAnna Dabrowska $groups = $USERINFO['grps']; //current groups 6137d2401aSAnna Dabrowska if (isset($event->data['params'][1]['grps'])) { 6237d2401aSAnna Dabrowska // something already defined new groups 6337d2401aSAnna Dabrowska $groups = $event->data['params'][1]['grps']; 6437d2401aSAnna Dabrowska } 6537d2401aSAnna Dabrowska 6637d2401aSAnna Dabrowska // get enabled and configured services 6737d2401aSAnna Dabrowska $enabled = $INPUT->arr('oauth_group'); 6837d2401aSAnna Dabrowska $services = array_keys($this->hlp->listServices()); 6937d2401aSAnna Dabrowska $services = array_map([$auth, 'cleanGroup'], $services); 7037d2401aSAnna Dabrowska 7137d2401aSAnna Dabrowska // add all enabled services as group, remove all disabled services 7237d2401aSAnna Dabrowska foreach ($services as $service) { 7337d2401aSAnna Dabrowska if (isset($enabled[$service])) { 7437d2401aSAnna Dabrowska $groups[] = $service; 7537d2401aSAnna Dabrowska } else { 7637d2401aSAnna Dabrowska $idx = array_search($service, $groups); 7737d2401aSAnna Dabrowska if ($idx !== false) unset($groups[$idx]); 7837d2401aSAnna Dabrowska } 7937d2401aSAnna Dabrowska } 8037d2401aSAnna Dabrowska $groups = array_unique($groups); 8137d2401aSAnna Dabrowska 8237d2401aSAnna Dabrowska // add new group array to event data 8337d2401aSAnna Dabrowska $event->data['params'][1]['grps'] = $groups; 8437d2401aSAnna Dabrowska } 8537d2401aSAnna Dabrowska 8637d2401aSAnna Dabrowska /** 8737d2401aSAnna Dabrowska * Add service selection to user profile 8837d2401aSAnna Dabrowska * 8937d2401aSAnna Dabrowska * @param Doku_Event $event event object by reference 9037d2401aSAnna Dabrowska * @return void 9137d2401aSAnna Dabrowska */ 9237d2401aSAnna Dabrowska public function handleProfileform(Doku_Event $event) 9337d2401aSAnna Dabrowska { 9437d2401aSAnna Dabrowska global $USERINFO; 9537d2401aSAnna Dabrowska /** @var auth_plugin_authplain $auth */ 9637d2401aSAnna Dabrowska global $auth; 9737d2401aSAnna Dabrowska 9837d2401aSAnna Dabrowska /** @var Doku_Form $form */ 9937d2401aSAnna Dabrowska $form = $event->data; 10037d2401aSAnna Dabrowska $pos = $form->findElementByAttribute('type', 'submit'); 10137d2401aSAnna Dabrowska 10237d2401aSAnna Dabrowska $services = $this->hlp->listServices(); 10337d2401aSAnna Dabrowska if (!$services) return; 10437d2401aSAnna Dabrowska 10537d2401aSAnna Dabrowska $form->insertElement($pos, form_closefieldset()); 10637d2401aSAnna Dabrowska $form->insertElement( 10737d2401aSAnna Dabrowska ++$pos, 10837d2401aSAnna Dabrowska form_openfieldset(['_legend' => $this->getLang('loginwith'), 'class' => 'plugin_oauth']) 10937d2401aSAnna Dabrowska ); 11037d2401aSAnna Dabrowska foreach ($services as $service) { 11137d2401aSAnna Dabrowska $group = $auth->cleanGroup($service->getServiceID()); 11237d2401aSAnna Dabrowska $elem = form_makeCheckboxField( 11337d2401aSAnna Dabrowska 'oauth_group[' . $group . ']', 11437d2401aSAnna Dabrowska 1, $service->getServiceLabel(), '', 'simple', 11537d2401aSAnna Dabrowska [ 11637d2401aSAnna Dabrowska 'checked' => (in_array($group, $USERINFO['grps'])) ? 'checked' : '', 11737d2401aSAnna Dabrowska ] 11837d2401aSAnna Dabrowska ); 11937d2401aSAnna Dabrowska 12037d2401aSAnna Dabrowska $form->insertElement(++$pos, $elem); 12137d2401aSAnna Dabrowska } 12237d2401aSAnna Dabrowska $form->insertElement(++$pos, form_closefieldset()); 12337d2401aSAnna Dabrowska $form->insertElement(++$pos, form_openfieldset([])); 12437d2401aSAnna Dabrowska } 12537d2401aSAnna Dabrowska} 126