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; 1737748cd8SNickeauuse TestRequest; 1837748cd8SNickeau 1937748cd8SNickeauclass Identity 2037748cd8SNickeau{ 2137748cd8SNickeau 2237748cd8SNickeau const CANONICAL = "identity"; 2337748cd8SNickeau const CONF_ENABLE_LOGO_ON_IDENTITY_FORMS = "enableLogoOnIdentityForms"; 2437748cd8SNickeau const JS_NAVIGATION_ANONYMOUS_VALUE = "anonymous"; 2537748cd8SNickeau const JS_NAVIGATION_SIGNED_VALUE = "signed"; 2637748cd8SNickeau /** 2737748cd8SNickeau * A javascript indicator 2837748cd8SNickeau * to know if the user is logged in or not 2937748cd8SNickeau * (ie public or not) 3037748cd8SNickeau */ 3137748cd8SNickeau const JS_NAVIGATION_INDICATOR = "navigation"; 3237748cd8SNickeau 33*4cadd4f8SNickeau const FORM_IDENTITY_CLASS = "form-identity"; 34*4cadd4f8SNickeau 3537748cd8SNickeau /** 3637748cd8SNickeau * Is logged in 3737748cd8SNickeau * @return boolean 3837748cd8SNickeau */ 3937748cd8SNickeau public static function isLoggedIn() 4037748cd8SNickeau { 4137748cd8SNickeau $loggedIn = false; 4237748cd8SNickeau global $INPUT; 4337748cd8SNickeau if ($INPUT->server->has('REMOTE_USER')) { 4437748cd8SNickeau $loggedIn = true; 4537748cd8SNickeau } 4637748cd8SNickeau return $loggedIn; 4737748cd8SNickeau } 4837748cd8SNickeau 4937748cd8SNickeau /** 5037748cd8SNickeau * @param TestRequest $request 5137748cd8SNickeau * @param string $user 5237748cd8SNickeau */ 5337748cd8SNickeau public static function becomeSuperUser(&$request = null, $user = 'admin') 5437748cd8SNickeau { 5537748cd8SNickeau global $conf; 5637748cd8SNickeau $conf['useacl'] = 1; 5737748cd8SNickeau $conf['superuser'] = $user; 5837748cd8SNickeau $conf['remoteuser'] = $user; 5937748cd8SNickeau 6037748cd8SNickeau if ($request != null) { 6137748cd8SNickeau $request->setServer('REMOTE_USER', $user); 6237748cd8SNickeau } else { 6337748cd8SNickeau global $INPUT; 6437748cd8SNickeau $INPUT->server->set('REMOTE_USER', $user); 651fa8c418SNickeau // same as $_SERVER['REMOTE_USER'] = $user; 6637748cd8SNickeau } 6737748cd8SNickeau 6837748cd8SNickeau // $_SERVER[] = $user; 6937748cd8SNickeau // global $USERINFO; 7037748cd8SNickeau // $USERINFO['grps'] = array('admin', 'user'); 7137748cd8SNickeau 7237748cd8SNickeau // global $INFO; 7337748cd8SNickeau // $INFO['ismanager'] = true; 7437748cd8SNickeau 7537748cd8SNickeau } 7637748cd8SNickeau 7737748cd8SNickeau /** 7837748cd8SNickeau * @param $request 7937748cd8SNickeau * @param string $user - the user to login 8037748cd8SNickeau */ 8137748cd8SNickeau public static function logIn(&$request, $user = 'defaultUser') 8237748cd8SNickeau { 8337748cd8SNickeau 8437748cd8SNickeau $request->setServer('REMOTE_USER', $user); 8537748cd8SNickeau 8637748cd8SNickeau /** 8737748cd8SNickeau * The {@link getSecurityToken()} needs it 8837748cd8SNickeau */ 8937748cd8SNickeau global $INPUT; 9037748cd8SNickeau $INPUT->server->set('REMOTE_USER', $user); 9137748cd8SNickeau 9237748cd8SNickeau } 9337748cd8SNickeau 9437748cd8SNickeau /** 9537748cd8SNickeau * @return bool if edit auth 9637748cd8SNickeau */ 97c3437056SNickeau public static function isWriter($pageId = null): bool 9837748cd8SNickeau { 99c3437056SNickeau if ($pageId == null) { 100c3437056SNickeau $pageId = Page::createPageFromGlobalDokuwikiId(); 101c3437056SNickeau } 102c3437056SNickeau if ($_SERVER['REMOTE_USER']) { 103c3437056SNickeau $perm = auth_quickaclcheck($pageId); 104c3437056SNickeau } else { 105c3437056SNickeau $perm = auth_aclcheck($pageId, '', null); 106c3437056SNickeau } 10737748cd8SNickeau 108c3437056SNickeau if ($perm >= AUTH_EDIT) { 109c3437056SNickeau return true; 110c3437056SNickeau } else { 111c3437056SNickeau return false; 112c3437056SNickeau } 11337748cd8SNickeau 11437748cd8SNickeau } 11537748cd8SNickeau 11637748cd8SNickeau public static function isAdmin() 11737748cd8SNickeau { 11837748cd8SNickeau global $INFO; 11937748cd8SNickeau if (!empty($INFO)) { 12037748cd8SNickeau return $INFO['isadmin']; 12137748cd8SNickeau } else { 12237748cd8SNickeau return auth_isadmin(self::getUser(), self::getUserGroups()); 12337748cd8SNickeau } 12437748cd8SNickeau } 12537748cd8SNickeau 12637748cd8SNickeau public static function isMember($group) 12737748cd8SNickeau { 12837748cd8SNickeau 12937748cd8SNickeau return auth_isMember($group, self::getUser(), self::getUserGroups()); 13037748cd8SNickeau 13137748cd8SNickeau } 13237748cd8SNickeau 13337748cd8SNickeau public static function isManager() 13437748cd8SNickeau { 13537748cd8SNickeau global $INFO; 136c3437056SNickeau if ($INFO !== null) { 13737748cd8SNickeau return $INFO['ismanager']; 138c3437056SNickeau } else { 139c3437056SNickeau /** 140c3437056SNickeau * In test 141c3437056SNickeau */ 142c3437056SNickeau return auth_ismanager(); 143c3437056SNickeau } 14437748cd8SNickeau } 14537748cd8SNickeau 146c3437056SNickeau public static function getUser(): string 14737748cd8SNickeau { 14837748cd8SNickeau global $INPUT; 149c3437056SNickeau $user = $INPUT->server->str('REMOTE_USER'); 150c3437056SNickeau if (empty($user)) { 151c3437056SNickeau return "Anonymous"; 152c3437056SNickeau } 153c3437056SNickeau return $user; 15437748cd8SNickeau } 15537748cd8SNickeau 15637748cd8SNickeau private static function getUserGroups() 15737748cd8SNickeau { 15837748cd8SNickeau global $USERINFO; 15937748cd8SNickeau return is_array($USERINFO) ? $USERINFO['grps'] : array(); 16037748cd8SNickeau } 16137748cd8SNickeau 16237748cd8SNickeau /** 16337748cd8SNickeau * @param Doku_Form $form 16437748cd8SNickeau * @param string $classPrefix 16537748cd8SNickeau * @param bool $includeLogo 16637748cd8SNickeau * @return string 16737748cd8SNickeau */ 16837748cd8SNickeau public static function getHeaderHTML(Doku_Form $form, $classPrefix, $includeLogo = true) 16937748cd8SNickeau { 17037748cd8SNickeau if (isset($form->_content[0]["_legend"])) { 17137748cd8SNickeau 17237748cd8SNickeau $title = $form->_content[0]["_legend"]; 17337748cd8SNickeau /** 17437748cd8SNickeau * Logo 17537748cd8SNickeau */ 17637748cd8SNickeau $logoHtmlImgTag = ""; 17737748cd8SNickeau if ( 17837748cd8SNickeau PluginUtility::getConfValue(Identity::CONF_ENABLE_LOGO_ON_IDENTITY_FORMS, 1) 17937748cd8SNickeau && 18037748cd8SNickeau $includeLogo === true 18137748cd8SNickeau ) { 182*4cadd4f8SNickeau $logoHtmlImgTag = Site::getLogoHtml(); 18337748cd8SNickeau } 18437748cd8SNickeau /** 18537748cd8SNickeau * Don't use `header` in place of 18637748cd8SNickeau * div because this is a HTML5 tag 18737748cd8SNickeau * 18837748cd8SNickeau * On php 5.6, the php test library method {@link \phpQueryObject::htmlOuter()} 18937748cd8SNickeau * add the below meta tag 19037748cd8SNickeau * <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> 19137748cd8SNickeau * 19237748cd8SNickeau */ 19337748cd8SNickeau return <<<EOF 19437748cd8SNickeau<div class="$classPrefix-header"> 19537748cd8SNickeau $logoHtmlImgTag 19637748cd8SNickeau <h1>$title</h1> 19737748cd8SNickeau</div> 19837748cd8SNickeauEOF; 19937748cd8SNickeau } 20037748cd8SNickeau return ""; 20137748cd8SNickeau } 20237748cd8SNickeau 203c3437056SNickeau public static function isReader(string $pageId): bool 204c3437056SNickeau { 205c3437056SNickeau $perm = self::getPerm($pageId); 206c3437056SNickeau 207c3437056SNickeau if ($perm >= AUTH_READ) { 208c3437056SNickeau return true; 209c3437056SNickeau } else { 210c3437056SNickeau return false; 211c3437056SNickeau } 212c3437056SNickeau 213c3437056SNickeau } 214c3437056SNickeau 215c3437056SNickeau private static function getPerm(string $pageId) 216c3437056SNickeau { 217c3437056SNickeau if ($pageId == null) { 218c3437056SNickeau $pageId = Page::createPageFromRequestedPage()->getDokuwikiId(); 219c3437056SNickeau } 220c3437056SNickeau if ($_SERVER['REMOTE_USER']) { 221c3437056SNickeau $perm = auth_quickaclcheck($pageId); 222c3437056SNickeau } else { 223c3437056SNickeau $perm = auth_aclcheck($pageId, '', null); 224c3437056SNickeau } 225c3437056SNickeau return $perm; 226c3437056SNickeau } 227c3437056SNickeau 228*4cadd4f8SNickeau public static function addPrimaryColorCssRuleIfSet(?string $content): ?string 229*4cadd4f8SNickeau { 230*4cadd4f8SNickeau if ($content === null) { 231*4cadd4f8SNickeau return null; 232*4cadd4f8SNickeau } 233*4cadd4f8SNickeau $primaryColor = Site::getPrimaryColorValue(); 234*4cadd4f8SNickeau if ($primaryColor !== null) { 235*4cadd4f8SNickeau $identityClass = self::FORM_IDENTITY_CLASS; 236*4cadd4f8SNickeau $content .= <<<EOF 237*4cadd4f8SNickeau.$identityClass button[type="submit"]{ 238*4cadd4f8SNickeau background-color: $primaryColor; 239*4cadd4f8SNickeau border-color: $primaryColor; 240*4cadd4f8SNickeau} 241*4cadd4f8SNickeauEOF; 242*4cadd4f8SNickeau } 243*4cadd4f8SNickeau return $content; 244*4cadd4f8SNickeau } 245*4cadd4f8SNickeau 246*4cadd4f8SNickeau public static function getHtmlStyleTag(string $componentId): string 247*4cadd4f8SNickeau { 248*4cadd4f8SNickeau $loginCss = Snippet::createInternalCssSnippet($componentId); 249*4cadd4f8SNickeau $content = $loginCss->getInternalInlineAndFileContent(); 250*4cadd4f8SNickeau $content = Identity::addPrimaryColorCssRuleIfSet($content); 251*4cadd4f8SNickeau $class = $loginCss->getClass(); 252*4cadd4f8SNickeau return <<<EOF 253*4cadd4f8SNickeau<style class="$class"> 254*4cadd4f8SNickeau$content 255*4cadd4f8SNickeau</style> 256*4cadd4f8SNickeauEOF; 257*4cadd4f8SNickeau 258*4cadd4f8SNickeau } 259*4cadd4f8SNickeau 260*4cadd4f8SNickeau public static function addIdentityClass(&$class, string $formClass) 261*4cadd4f8SNickeau { 262*4cadd4f8SNickeau 263*4cadd4f8SNickeau $formClass = Identity::FORM_IDENTITY_CLASS . " " . $formClass; 264*4cadd4f8SNickeau if (isset($class)) { 265*4cadd4f8SNickeau $class .= " " . $formClass; 266*4cadd4f8SNickeau } else { 267*4cadd4f8SNickeau $class = $formClass; 268*4cadd4f8SNickeau } 269*4cadd4f8SNickeau 270*4cadd4f8SNickeau } 271*4cadd4f8SNickeau 27237748cd8SNickeau 27337748cd8SNickeau} 274