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; 170581ab2eSgerardnicouse dokuwiki\Form\Form; 1804fd306cSNickeauuse dokuwiki\Form\InputElement; 1904fd306cSNickeauuse dokuwiki\Ui\UserProfile; 2037748cd8SNickeauuse TestRequest; 2137748cd8SNickeau 2237748cd8SNickeauclass Identity 2337748cd8SNickeau{ 2437748cd8SNickeau 2537748cd8SNickeau const CANONICAL = "identity"; 2637748cd8SNickeau const CONF_ENABLE_LOGO_ON_IDENTITY_FORMS = "enableLogoOnIdentityForms"; 2737748cd8SNickeau const JS_NAVIGATION_ANONYMOUS_VALUE = "anonymous"; 2837748cd8SNickeau const JS_NAVIGATION_SIGNED_VALUE = "signed"; 2937748cd8SNickeau /** 3037748cd8SNickeau * A javascript indicator 3137748cd8SNickeau * to know if the user is logged in or not 3237748cd8SNickeau * (ie public or not) 3337748cd8SNickeau */ 3437748cd8SNickeau const JS_NAVIGATION_INDICATOR = "navigation"; 3537748cd8SNickeau 364cadd4f8SNickeau const FORM_IDENTITY_CLASS = "form-identity"; 3704fd306cSNickeau public const FIELD_SET_TO_DELETE = ["fieldsetopen", "fieldsetclose"]; 3804fd306cSNickeau public const CONF_DESIGNER_GROUP_NAME = "combo-conf-006"; 394cadd4f8SNickeau 4037748cd8SNickeau /** 4137748cd8SNickeau * Is logged in 4237748cd8SNickeau * @return boolean 4337748cd8SNickeau */ 4404fd306cSNickeau public static function isLoggedIn(): bool 4537748cd8SNickeau { 4604fd306cSNickeau global $_SERVER; 4704fd306cSNickeau if (empty($_SERVER['REMOTE_USER'])) { 4804fd306cSNickeau return false; 4937748cd8SNickeau } 5004fd306cSNickeau return true; 5137748cd8SNickeau } 5237748cd8SNickeau 5337748cd8SNickeau /** 5437748cd8SNickeau * @param TestRequest $request 5537748cd8SNickeau * @param string $user 5637748cd8SNickeau */ 5737748cd8SNickeau public static function becomeSuperUser(&$request = null, $user = 'admin') 5837748cd8SNickeau { 5937748cd8SNickeau global $conf; 6037748cd8SNickeau $conf['useacl'] = 1; 6137748cd8SNickeau $conf['superuser'] = $user; 6237748cd8SNickeau $conf['remoteuser'] = $user; 6337748cd8SNickeau 6437748cd8SNickeau if ($request != null) { 6537748cd8SNickeau $request->setServer('REMOTE_USER', $user); 66918039dbSgerardnico } 67918039dbSgerardnico 68918039dbSgerardnico /** 69918039dbSgerardnico * used by {@link getSecurityToken()} 70918039dbSgerardnico */ 7104fd306cSNickeau // same as 7204fd306cSNickeau // global $INPUT; 7304fd306cSNickeau // $INPUT->server->set('REMOTE_USER', $user); 7404fd306cSNickeau $_SERVER['REMOTE_USER'] = $user; 7537748cd8SNickeau 7637748cd8SNickeau // global $INFO; 7737748cd8SNickeau // $INFO['ismanager'] = true; 7837748cd8SNickeau 7904fd306cSNickeau 8004fd306cSNickeau /** 8104fd306cSNickeau * 8204fd306cSNickeau * Userinfo 8304fd306cSNickeau * 8404fd306cSNickeau * Email is Mandatory otherwise the {@link UserProfile} 8504fd306cSNickeau * does not work 8604fd306cSNickeau * 8704fd306cSNickeau * USERINFO is also available via $INFO['userinfo'] 8804fd306cSNickeau * See {@link basicinfo()} 8904fd306cSNickeau */ 9004fd306cSNickeau global $USERINFO; 9104fd306cSNickeau $USERINFO['mail'] = "email@example.com"; 92*70bbd7f1Sgerardnico $USERINFO['grps'] = array('admin', 'user'); 9304fd306cSNickeau 9404fd306cSNickeau 9537748cd8SNickeau } 9637748cd8SNickeau 9737748cd8SNickeau /** 9837748cd8SNickeau * @param $request 9937748cd8SNickeau * @param string $user - the user to login 10037748cd8SNickeau */ 10137748cd8SNickeau public static function logIn(&$request, $user = 'defaultUser') 10237748cd8SNickeau { 10337748cd8SNickeau 10437748cd8SNickeau $request->setServer('REMOTE_USER', $user); 10537748cd8SNickeau 10637748cd8SNickeau /** 10737748cd8SNickeau * The {@link getSecurityToken()} needs it 10837748cd8SNickeau */ 10937748cd8SNickeau global $INPUT; 11037748cd8SNickeau $INPUT->server->set('REMOTE_USER', $user); 11137748cd8SNickeau 11237748cd8SNickeau } 11337748cd8SNickeau 11437748cd8SNickeau /** 11537748cd8SNickeau * @return bool if edit auth 11637748cd8SNickeau */ 11704fd306cSNickeau public static function isWriter($wikiId = null): bool 11837748cd8SNickeau { 11904fd306cSNickeau 12004fd306cSNickeau if ($wikiId === null) { 12104fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 12204fd306cSNickeau try { 12304fd306cSNickeau $wikiId = $executionContext->getRequestedPath()->getWikiId(); 12404fd306cSNickeau } catch (ExceptionNotFound $e) { 12504fd306cSNickeau return false; 126c3437056SNickeau } 12704fd306cSNickeau } 12804fd306cSNickeau /** 12904fd306cSNickeau * There is also 13004fd306cSNickeau * $INFO['writable'] === true 13104fd306cSNickeau * See true if writable See https://www.dokuwiki.org/devel:environment#info 13204fd306cSNickeau */ 133*70bbd7f1Sgerardnico $remoteUser = $_SERVER['REMOTE_USER'] ?? null; 134*70bbd7f1Sgerardnico if ($remoteUser !== null) { 13504fd306cSNickeau $perm = auth_quickaclcheck($wikiId); 136c3437056SNickeau } else { 13704fd306cSNickeau $perm = auth_aclcheck($wikiId, '', null); 138c3437056SNickeau } 13937748cd8SNickeau 140c3437056SNickeau if ($perm >= AUTH_EDIT) { 141c3437056SNickeau return true; 142c3437056SNickeau } else { 143c3437056SNickeau return false; 144c3437056SNickeau } 14537748cd8SNickeau 14637748cd8SNickeau } 14737748cd8SNickeau 14837748cd8SNickeau public static function isAdmin() 14937748cd8SNickeau { 15037748cd8SNickeau global $INFO; 15137748cd8SNickeau if (!empty($INFO)) { 152be61a7dfSgerardnico $isAdmin = $INFO['isadmin'] ?? null; 153be61a7dfSgerardnico if ($isAdmin === null) { 154be61a7dfSgerardnico return false; 155be61a7dfSgerardnico } 156be61a7dfSgerardnico return $isAdmin; 15737748cd8SNickeau } else { 15837748cd8SNickeau return auth_isadmin(self::getUser(), self::getUserGroups()); 15937748cd8SNickeau } 16037748cd8SNickeau } 16137748cd8SNickeau 16237748cd8SNickeau public static function isMember($group) 16337748cd8SNickeau { 16437748cd8SNickeau 16537748cd8SNickeau return auth_isMember($group, self::getUser(), self::getUserGroups()); 16637748cd8SNickeau 16737748cd8SNickeau } 16837748cd8SNickeau 16904fd306cSNickeau public static function isManager(): bool 17037748cd8SNickeau { 17104fd306cSNickeau 172c3437056SNickeau return auth_ismanager(); 17304fd306cSNickeau 17437748cd8SNickeau } 17537748cd8SNickeau 176c3437056SNickeau public static function getUser(): string 17737748cd8SNickeau { 17837748cd8SNickeau global $INPUT; 179c3437056SNickeau $user = $INPUT->server->str('REMOTE_USER'); 180c3437056SNickeau if (empty($user)) { 181c3437056SNickeau return "Anonymous"; 182c3437056SNickeau } 183c3437056SNickeau return $user; 18437748cd8SNickeau } 18537748cd8SNickeau 18637748cd8SNickeau private static function getUserGroups() 18737748cd8SNickeau { 18837748cd8SNickeau global $USERINFO; 18904fd306cSNickeau return is_array($USERINFO) && isset($USERINFO['grps']) ? $USERINFO['grps'] : array(); 19037748cd8SNickeau } 19137748cd8SNickeau 19204fd306cSNickeau public static function isReader(string $wikiId): bool 19337748cd8SNickeau { 19404fd306cSNickeau $perm = self::getPermissions($wikiId); 195c3437056SNickeau 196c3437056SNickeau if ($perm >= AUTH_READ) { 197c3437056SNickeau return true; 198c3437056SNickeau } else { 199c3437056SNickeau return false; 200c3437056SNickeau } 201c3437056SNickeau 202c3437056SNickeau } 203c3437056SNickeau 20404fd306cSNickeau private static function getPermissions(string $wikiId): int 205c3437056SNickeau { 20604fd306cSNickeau if ($wikiId == null) { 20704fd306cSNickeau $wikiId = MarkupPath::createFromRequestedPage()->getWikiId(); 208c3437056SNickeau } 209*70bbd7f1Sgerardnico if ($_SERVER['REMOTE_USER'] ?? null) { 21004fd306cSNickeau $perm = auth_quickaclcheck($wikiId); 211c3437056SNickeau } else { 21204fd306cSNickeau $perm = auth_aclcheck($wikiId, '', null); 213c3437056SNickeau } 214c3437056SNickeau return $perm; 215c3437056SNickeau } 216c3437056SNickeau 21704fd306cSNickeau public static function getSecurityTokenForAdminUser(): string 2184cadd4f8SNickeau { 21904fd306cSNickeau $request = null; 22004fd306cSNickeau Identity::becomeSuperUser($request, 'admin'); 22104fd306cSNickeau return getSecurityToken(); 2224cadd4f8SNickeau } 2234cadd4f8SNickeau 22404fd306cSNickeau public static function isAnonymous(): bool 2254cadd4f8SNickeau { 22604fd306cSNickeau return !self::isLoggedIn(); 2274cadd4f8SNickeau } 2284cadd4f8SNickeau 22937748cd8SNickeau 23037748cd8SNickeau} 231