137748cd8SNickeau<?php 237748cd8SNickeau/** 337748cd8SNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved. 437748cd8SNickeau * 537748cd8SNickeau * This source code is licensed under the GPL license found in the 637748cd8SNickeau * COPYING file in the root directory of this source tree. 737748cd8SNickeau * 837748cd8SNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 937748cd8SNickeau * @author ComboStrap <support@combostrap.com> 1037748cd8SNickeau * 1137748cd8SNickeau */ 1237748cd8SNickeau 1337748cd8SNickeaunamespace ComboStrap; 1437748cd8SNickeau 1537748cd8SNickeau 1637748cd8SNickeauuse Doku_Form; 17*0581ab2eSgerardnicouse dokuwiki\Form\Form; 1837748cd8SNickeauuse TestRequest; 1937748cd8SNickeau 2037748cd8SNickeauclass Identity 2137748cd8SNickeau{ 2237748cd8SNickeau 2337748cd8SNickeau const CANONICAL = "identity"; 2437748cd8SNickeau const CONF_ENABLE_LOGO_ON_IDENTITY_FORMS = "enableLogoOnIdentityForms"; 2537748cd8SNickeau const JS_NAVIGATION_ANONYMOUS_VALUE = "anonymous"; 2637748cd8SNickeau const JS_NAVIGATION_SIGNED_VALUE = "signed"; 2737748cd8SNickeau /** 2837748cd8SNickeau * A javascript indicator 2937748cd8SNickeau * to know if the user is logged in or not 3037748cd8SNickeau * (ie public or not) 3137748cd8SNickeau */ 3237748cd8SNickeau const JS_NAVIGATION_INDICATOR = "navigation"; 3337748cd8SNickeau 344cadd4f8SNickeau const FORM_IDENTITY_CLASS = "form-identity"; 354cadd4f8SNickeau 3637748cd8SNickeau /** 3737748cd8SNickeau * Is logged in 3837748cd8SNickeau * @return boolean 3937748cd8SNickeau */ 4037748cd8SNickeau public static function isLoggedIn() 4137748cd8SNickeau { 4237748cd8SNickeau $loggedIn = false; 4337748cd8SNickeau global $INPUT; 4437748cd8SNickeau if ($INPUT->server->has('REMOTE_USER')) { 4537748cd8SNickeau $loggedIn = true; 4637748cd8SNickeau } 4737748cd8SNickeau return $loggedIn; 4837748cd8SNickeau } 4937748cd8SNickeau 5037748cd8SNickeau /** 5137748cd8SNickeau * @param TestRequest $request 5237748cd8SNickeau * @param string $user 5337748cd8SNickeau */ 5437748cd8SNickeau public static function becomeSuperUser(&$request = null, $user = 'admin') 5537748cd8SNickeau { 5637748cd8SNickeau global $conf; 5737748cd8SNickeau $conf['useacl'] = 1; 5837748cd8SNickeau $conf['superuser'] = $user; 5937748cd8SNickeau $conf['remoteuser'] = $user; 6037748cd8SNickeau 6137748cd8SNickeau if ($request != null) { 6237748cd8SNickeau $request->setServer('REMOTE_USER', $user); 63918039dbSgerardnico } 64918039dbSgerardnico 65918039dbSgerardnico /** 66918039dbSgerardnico * used by {@link getSecurityToken()} 67918039dbSgerardnico */ 6837748cd8SNickeau global $INPUT; 6937748cd8SNickeau $INPUT->server->set('REMOTE_USER', $user); 701fa8c418SNickeau // same as $_SERVER['REMOTE_USER'] = $user; 71918039dbSgerardnico 7237748cd8SNickeau 7337748cd8SNickeau // $_SERVER[] = $user; 7437748cd8SNickeau // global $USERINFO; 7537748cd8SNickeau // $USERINFO['grps'] = array('admin', 'user'); 7637748cd8SNickeau 7737748cd8SNickeau // global $INFO; 7837748cd8SNickeau // $INFO['ismanager'] = true; 7937748cd8SNickeau 8037748cd8SNickeau } 8137748cd8SNickeau 8237748cd8SNickeau /** 8337748cd8SNickeau * @param $request 8437748cd8SNickeau * @param string $user - the user to login 8537748cd8SNickeau */ 8637748cd8SNickeau public static function logIn(&$request, $user = 'defaultUser') 8737748cd8SNickeau { 8837748cd8SNickeau 8937748cd8SNickeau $request->setServer('REMOTE_USER', $user); 9037748cd8SNickeau 9137748cd8SNickeau /** 9237748cd8SNickeau * The {@link getSecurityToken()} needs it 9337748cd8SNickeau */ 9437748cd8SNickeau global $INPUT; 9537748cd8SNickeau $INPUT->server->set('REMOTE_USER', $user); 9637748cd8SNickeau 9737748cd8SNickeau } 9837748cd8SNickeau 9937748cd8SNickeau /** 10037748cd8SNickeau * @return bool if edit auth 10137748cd8SNickeau */ 102c3437056SNickeau public static function isWriter($pageId = null): bool 10337748cd8SNickeau { 104c3437056SNickeau if ($pageId == null) { 105c3437056SNickeau $pageId = Page::createPageFromGlobalDokuwikiId(); 106c3437056SNickeau } 107c3437056SNickeau if ($_SERVER['REMOTE_USER']) { 108c3437056SNickeau $perm = auth_quickaclcheck($pageId); 109c3437056SNickeau } else { 110c3437056SNickeau $perm = auth_aclcheck($pageId, '', null); 111c3437056SNickeau } 11237748cd8SNickeau 113c3437056SNickeau if ($perm >= AUTH_EDIT) { 114c3437056SNickeau return true; 115c3437056SNickeau } else { 116c3437056SNickeau return false; 117c3437056SNickeau } 11837748cd8SNickeau 11937748cd8SNickeau } 12037748cd8SNickeau 12137748cd8SNickeau public static function isAdmin() 12237748cd8SNickeau { 12337748cd8SNickeau global $INFO; 12437748cd8SNickeau if (!empty($INFO)) { 12537748cd8SNickeau return $INFO['isadmin']; 12637748cd8SNickeau } else { 12737748cd8SNickeau return auth_isadmin(self::getUser(), self::getUserGroups()); 12837748cd8SNickeau } 12937748cd8SNickeau } 13037748cd8SNickeau 13137748cd8SNickeau public static function isMember($group) 13237748cd8SNickeau { 13337748cd8SNickeau 13437748cd8SNickeau return auth_isMember($group, self::getUser(), self::getUserGroups()); 13537748cd8SNickeau 13637748cd8SNickeau } 13737748cd8SNickeau 13837748cd8SNickeau public static function isManager() 13937748cd8SNickeau { 14037748cd8SNickeau global $INFO; 141c3437056SNickeau if ($INFO !== null) { 14237748cd8SNickeau return $INFO['ismanager']; 143c3437056SNickeau } else { 144c3437056SNickeau /** 145c3437056SNickeau * In test 146c3437056SNickeau */ 147c3437056SNickeau return auth_ismanager(); 148c3437056SNickeau } 14937748cd8SNickeau } 15037748cd8SNickeau 151c3437056SNickeau public static function getUser(): string 15237748cd8SNickeau { 15337748cd8SNickeau global $INPUT; 154c3437056SNickeau $user = $INPUT->server->str('REMOTE_USER'); 155c3437056SNickeau if (empty($user)) { 156c3437056SNickeau return "Anonymous"; 157c3437056SNickeau } 158c3437056SNickeau return $user; 15937748cd8SNickeau } 16037748cd8SNickeau 16137748cd8SNickeau private static function getUserGroups() 16237748cd8SNickeau { 16337748cd8SNickeau global $USERINFO; 16437748cd8SNickeau return is_array($USERINFO) ? $USERINFO['grps'] : array(); 16537748cd8SNickeau } 16637748cd8SNickeau 16737748cd8SNickeau /** 168*0581ab2eSgerardnico * @param Doku_Form|Form $form 16937748cd8SNickeau * @param string $classPrefix 17037748cd8SNickeau * @param bool $includeLogo 17137748cd8SNickeau * @return string 17237748cd8SNickeau */ 173*0581ab2eSgerardnico public static function getHeaderHTML($form, $classPrefix, $includeLogo = true) 17437748cd8SNickeau { 17537748cd8SNickeau 176*0581ab2eSgerardnico $class = get_class($form); 177*0581ab2eSgerardnico switch ($class) { 178*0581ab2eSgerardnico case Doku_Form::class: 179*0581ab2eSgerardnico /** 180*0581ab2eSgerardnico * Old one 181*0581ab2eSgerardnico * @var Doku_Form $form 182*0581ab2eSgerardnico */ 183*0581ab2eSgerardnico $legend = $form->_content[0]["_legend"]; 184*0581ab2eSgerardnico if (!isset($legend)) { 185*0581ab2eSgerardnico return ""; 186*0581ab2eSgerardnico } 187*0581ab2eSgerardnico 188*0581ab2eSgerardnico $title = $legend; 189*0581ab2eSgerardnico break; 190*0581ab2eSgerardnico case Form::class; 191*0581ab2eSgerardnico /** 192*0581ab2eSgerardnico * New One 193*0581ab2eSgerardnico * @var Form $form 194*0581ab2eSgerardnico */ 195*0581ab2eSgerardnico $pos = $form->findPositionByType("fieldsetopen"); 196*0581ab2eSgerardnico if ($pos == false) { 197*0581ab2eSgerardnico return ""; 198*0581ab2eSgerardnico } 199*0581ab2eSgerardnico 200*0581ab2eSgerardnico $title = $form->getElementAt($pos)->val(); 201*0581ab2eSgerardnico break; 202*0581ab2eSgerardnico default: 203*0581ab2eSgerardnico LogUtility::msg("Internal Error: Unknown form class " . $class); 204*0581ab2eSgerardnico return ""; 205*0581ab2eSgerardnico } 206*0581ab2eSgerardnico 20737748cd8SNickeau /** 20837748cd8SNickeau * Logo 20937748cd8SNickeau */ 21037748cd8SNickeau $logoHtmlImgTag = ""; 21137748cd8SNickeau if ( 21237748cd8SNickeau PluginUtility::getConfValue(Identity::CONF_ENABLE_LOGO_ON_IDENTITY_FORMS, 1) 21337748cd8SNickeau && 21437748cd8SNickeau $includeLogo === true 21537748cd8SNickeau ) { 2164cadd4f8SNickeau $logoHtmlImgTag = Site::getLogoHtml(); 21737748cd8SNickeau } 21837748cd8SNickeau /** 21937748cd8SNickeau * Don't use `header` in place of 22037748cd8SNickeau * div because this is a HTML5 tag 22137748cd8SNickeau * 22237748cd8SNickeau * On php 5.6, the php test library method {@link \phpQueryObject::htmlOuter()} 22337748cd8SNickeau * add the below meta tag 22437748cd8SNickeau * <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> 22537748cd8SNickeau * 22637748cd8SNickeau */ 22737748cd8SNickeau return <<<EOF 22837748cd8SNickeau<div class="$classPrefix-header"> 22937748cd8SNickeau $logoHtmlImgTag 23037748cd8SNickeau <h1>$title</h1> 23137748cd8SNickeau</div> 23237748cd8SNickeauEOF; 233*0581ab2eSgerardnico 23437748cd8SNickeau } 23537748cd8SNickeau 236c3437056SNickeau public static function isReader(string $pageId): bool 237c3437056SNickeau { 238c3437056SNickeau $perm = self::getPerm($pageId); 239c3437056SNickeau 240c3437056SNickeau if ($perm >= AUTH_READ) { 241c3437056SNickeau return true; 242c3437056SNickeau } else { 243c3437056SNickeau return false; 244c3437056SNickeau } 245c3437056SNickeau 246c3437056SNickeau } 247c3437056SNickeau 248c3437056SNickeau private static function getPerm(string $pageId) 249c3437056SNickeau { 250c3437056SNickeau if ($pageId == null) { 251c3437056SNickeau $pageId = Page::createPageFromRequestedPage()->getDokuwikiId(); 252c3437056SNickeau } 253c3437056SNickeau if ($_SERVER['REMOTE_USER']) { 254c3437056SNickeau $perm = auth_quickaclcheck($pageId); 255c3437056SNickeau } else { 256c3437056SNickeau $perm = auth_aclcheck($pageId, '', null); 257c3437056SNickeau } 258c3437056SNickeau return $perm; 259c3437056SNickeau } 260c3437056SNickeau 2614cadd4f8SNickeau public static function addPrimaryColorCssRuleIfSet(?string $content): ?string 2624cadd4f8SNickeau { 2634cadd4f8SNickeau if ($content === null) { 2644cadd4f8SNickeau return null; 2654cadd4f8SNickeau } 2664cadd4f8SNickeau $primaryColor = Site::getPrimaryColorValue(); 2674cadd4f8SNickeau if ($primaryColor !== null) { 2684cadd4f8SNickeau $identityClass = self::FORM_IDENTITY_CLASS; 2694cadd4f8SNickeau $content .= <<<EOF 2704cadd4f8SNickeau.$identityClass button[type="submit"]{ 2714cadd4f8SNickeau background-color: $primaryColor; 2724cadd4f8SNickeau border-color: $primaryColor; 2734cadd4f8SNickeau} 2744cadd4f8SNickeauEOF; 2754cadd4f8SNickeau } 2764cadd4f8SNickeau return $content; 2774cadd4f8SNickeau } 2784cadd4f8SNickeau 2794cadd4f8SNickeau public static function getHtmlStyleTag(string $componentId): string 2804cadd4f8SNickeau { 2814cadd4f8SNickeau $loginCss = Snippet::createInternalCssSnippet($componentId); 2824cadd4f8SNickeau $content = $loginCss->getInternalInlineAndFileContent(); 2834cadd4f8SNickeau $content = Identity::addPrimaryColorCssRuleIfSet($content); 2844cadd4f8SNickeau $class = $loginCss->getClass(); 2854cadd4f8SNickeau return <<<EOF 2864cadd4f8SNickeau<style class="$class"> 2874cadd4f8SNickeau$content 2884cadd4f8SNickeau</style> 2894cadd4f8SNickeauEOF; 2904cadd4f8SNickeau 2914cadd4f8SNickeau } 2924cadd4f8SNickeau 2934cadd4f8SNickeau public static function addIdentityClass(&$class, string $formClass) 2944cadd4f8SNickeau { 2954cadd4f8SNickeau 2964cadd4f8SNickeau $formClass = Identity::FORM_IDENTITY_CLASS . " " . $formClass; 2974cadd4f8SNickeau if (isset($class)) { 2984cadd4f8SNickeau $class .= " " . $formClass; 2994cadd4f8SNickeau } else { 3004cadd4f8SNickeau $class = $formClass; 3014cadd4f8SNickeau } 3024cadd4f8SNickeau 3034cadd4f8SNickeau } 3044cadd4f8SNickeau 30537748cd8SNickeau 30637748cd8SNickeau} 307