1*37d2401aSAnna Dabrowska<?php 2*37d2401aSAnna Dabrowska 3*37d2401aSAnna Dabrowska/** 4*37d2401aSAnna Dabrowska * DokuWiki Plugin oauth (Action Component) 5*37d2401aSAnna Dabrowska * 6*37d2401aSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 7*37d2401aSAnna Dabrowska * @author Andreas Gohr <andi@splitbrain.org> 8*37d2401aSAnna Dabrowska */ 9*37d2401aSAnna Dabrowskaclass action_plugin_oauth_user extends DokuWiki_Action_Plugin 10*37d2401aSAnna Dabrowska{ 11*37d2401aSAnna Dabrowska /** @var helper_plugin_oauth */ 12*37d2401aSAnna Dabrowska protected $hlp; 13*37d2401aSAnna Dabrowska 14*37d2401aSAnna Dabrowska /** 15*37d2401aSAnna Dabrowska * Constructor 16*37d2401aSAnna Dabrowska * 17*37d2401aSAnna Dabrowska * Initializes the helper 18*37d2401aSAnna Dabrowska */ 19*37d2401aSAnna Dabrowska public function __construct() 20*37d2401aSAnna Dabrowska { 21*37d2401aSAnna Dabrowska $this->hlp = plugin_load('helper', 'oauth'); 22*37d2401aSAnna Dabrowska } 23*37d2401aSAnna Dabrowska 24*37d2401aSAnna Dabrowska /** 25*37d2401aSAnna Dabrowska * Registers a callback function for a given event 26*37d2401aSAnna Dabrowska * 27*37d2401aSAnna Dabrowska * @param Doku_Event_Handler $controller DokuWiki's event controller object 28*37d2401aSAnna Dabrowska * @return void 29*37d2401aSAnna Dabrowska */ 30*37d2401aSAnna Dabrowska public function register(Doku_Event_Handler $controller) 31*37d2401aSAnna Dabrowska { 32*37d2401aSAnna Dabrowska global $conf; 33*37d2401aSAnna Dabrowska if ($conf['authtype'] != 'oauth') return; 34*37d2401aSAnna Dabrowska 35*37d2401aSAnna Dabrowska $conf['profileconfirm'] = false; // password confirmation doesn't work with oauth only users 36*37d2401aSAnna Dabrowska 37*37d2401aSAnna Dabrowska $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 'handleProfileform'); 38*37d2401aSAnna Dabrowska $controller->register_hook('AUTH_USER_CHANGE', 'BEFORE', $this, 'handleUsermod'); 39*37d2401aSAnna Dabrowska } 40*37d2401aSAnna Dabrowska /** 41*37d2401aSAnna Dabrowska * Save groups for all the services a user has enabled 42*37d2401aSAnna Dabrowska * 43*37d2401aSAnna Dabrowska * @param Doku_Event $event event object by reference 44*37d2401aSAnna Dabrowska * @return void 45*37d2401aSAnna Dabrowska */ 46*37d2401aSAnna Dabrowska public function handleUsermod(Doku_Event $event) 47*37d2401aSAnna Dabrowska { 48*37d2401aSAnna Dabrowska global $ACT; 49*37d2401aSAnna Dabrowska global $USERINFO; 50*37d2401aSAnna Dabrowska global $auth; 51*37d2401aSAnna Dabrowska global $INPUT; 52*37d2401aSAnna Dabrowska 53*37d2401aSAnna Dabrowska if ($event->data['type'] != 'modify') return; 54*37d2401aSAnna Dabrowska if ($ACT != 'profile') return; 55*37d2401aSAnna Dabrowska 56*37d2401aSAnna Dabrowska // we want to modify the user's groups 57*37d2401aSAnna Dabrowska $groups = $USERINFO['grps']; //current groups 58*37d2401aSAnna Dabrowska if (isset($event->data['params'][1]['grps'])) { 59*37d2401aSAnna Dabrowska // something already defined new groups 60*37d2401aSAnna Dabrowska $groups = $event->data['params'][1]['grps']; 61*37d2401aSAnna Dabrowska } 62*37d2401aSAnna Dabrowska 63*37d2401aSAnna Dabrowska // get enabled and configured services 64*37d2401aSAnna Dabrowska $enabled = $INPUT->arr('oauth_group'); 65*37d2401aSAnna Dabrowska $services = array_keys($this->hlp->listServices()); 66*37d2401aSAnna Dabrowska $services = array_map([$auth, 'cleanGroup'], $services); 67*37d2401aSAnna Dabrowska 68*37d2401aSAnna Dabrowska // add all enabled services as group, remove all disabled services 69*37d2401aSAnna Dabrowska foreach ($services as $service) { 70*37d2401aSAnna Dabrowska if (isset($enabled[$service])) { 71*37d2401aSAnna Dabrowska $groups[] = $service; 72*37d2401aSAnna Dabrowska } else { 73*37d2401aSAnna Dabrowska $idx = array_search($service, $groups); 74*37d2401aSAnna Dabrowska if ($idx !== false) unset($groups[$idx]); 75*37d2401aSAnna Dabrowska } 76*37d2401aSAnna Dabrowska } 77*37d2401aSAnna Dabrowska $groups = array_unique($groups); 78*37d2401aSAnna Dabrowska 79*37d2401aSAnna Dabrowska // add new group array to event data 80*37d2401aSAnna Dabrowska $event->data['params'][1]['grps'] = $groups; 81*37d2401aSAnna Dabrowska } 82*37d2401aSAnna Dabrowska 83*37d2401aSAnna Dabrowska /** 84*37d2401aSAnna Dabrowska * Add service selection to user profile 85*37d2401aSAnna Dabrowska * 86*37d2401aSAnna Dabrowska * @param Doku_Event $event event object by reference 87*37d2401aSAnna Dabrowska * @return void 88*37d2401aSAnna Dabrowska */ 89*37d2401aSAnna Dabrowska public function handleProfileform(Doku_Event $event) 90*37d2401aSAnna Dabrowska { 91*37d2401aSAnna Dabrowska global $USERINFO; 92*37d2401aSAnna Dabrowska /** @var auth_plugin_authplain $auth */ 93*37d2401aSAnna Dabrowska global $auth; 94*37d2401aSAnna Dabrowska 95*37d2401aSAnna Dabrowska /** @var Doku_Form $form */ 96*37d2401aSAnna Dabrowska $form = $event->data; 97*37d2401aSAnna Dabrowska $pos = $form->findElementByAttribute('type', 'submit'); 98*37d2401aSAnna Dabrowska 99*37d2401aSAnna Dabrowska $services = $this->hlp->listServices(); 100*37d2401aSAnna Dabrowska if (!$services) return; 101*37d2401aSAnna Dabrowska 102*37d2401aSAnna Dabrowska $form->insertElement($pos, form_closefieldset()); 103*37d2401aSAnna Dabrowska $form->insertElement( 104*37d2401aSAnna Dabrowska ++$pos, 105*37d2401aSAnna Dabrowska form_openfieldset(['_legend' => $this->getLang('loginwith'), 'class' => 'plugin_oauth']) 106*37d2401aSAnna Dabrowska ); 107*37d2401aSAnna Dabrowska foreach ($services as $service) { 108*37d2401aSAnna Dabrowska $group = $auth->cleanGroup($service->getServiceID()); 109*37d2401aSAnna Dabrowska $elem = form_makeCheckboxField( 110*37d2401aSAnna Dabrowska 'oauth_group[' . $group . ']', 111*37d2401aSAnna Dabrowska 1, $service->getServiceLabel(), '', 'simple', 112*37d2401aSAnna Dabrowska [ 113*37d2401aSAnna Dabrowska 'checked' => (in_array($group, $USERINFO['grps'])) ? 'checked' : '', 114*37d2401aSAnna Dabrowska ] 115*37d2401aSAnna Dabrowska ); 116*37d2401aSAnna Dabrowska 117*37d2401aSAnna Dabrowska $form->insertElement(++$pos, $elem); 118*37d2401aSAnna Dabrowska } 119*37d2401aSAnna Dabrowska $form->insertElement(++$pos, form_closefieldset()); 120*37d2401aSAnna Dabrowska $form->insertElement(++$pos, form_openfieldset([])); 121*37d2401aSAnna Dabrowska } 122*37d2401aSAnna Dabrowska} 123