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; 18*04fd306cSNickeauuse dokuwiki\Form\InputElement; 19*04fd306cSNickeauuse 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"; 37*04fd306cSNickeau public const FIELD_SET_TO_DELETE = ["fieldsetopen", "fieldsetclose"]; 38*04fd306cSNickeau public const CONF_DESIGNER_GROUP_NAME = "combo-conf-006"; 394cadd4f8SNickeau 4037748cd8SNickeau /** 4137748cd8SNickeau * Is logged in 4237748cd8SNickeau * @return boolean 4337748cd8SNickeau */ 44*04fd306cSNickeau public static function isLoggedIn(): bool 4537748cd8SNickeau { 46*04fd306cSNickeau global $_SERVER; 47*04fd306cSNickeau if (empty($_SERVER['REMOTE_USER'])) { 48*04fd306cSNickeau return false; 4937748cd8SNickeau } 50*04fd306cSNickeau 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 */ 71*04fd306cSNickeau // same as 72*04fd306cSNickeau // global $INPUT; 73*04fd306cSNickeau // $INPUT->server->set('REMOTE_USER', $user); 74*04fd306cSNickeau $_SERVER['REMOTE_USER'] = $user; 7537748cd8SNickeau 7637748cd8SNickeau // global $INFO; 7737748cd8SNickeau // $INFO['ismanager'] = true; 7837748cd8SNickeau 79*04fd306cSNickeau 80*04fd306cSNickeau /** 81*04fd306cSNickeau * 82*04fd306cSNickeau * Userinfo 83*04fd306cSNickeau * 84*04fd306cSNickeau * Email is Mandatory otherwise the {@link UserProfile} 85*04fd306cSNickeau * does not work 86*04fd306cSNickeau * 87*04fd306cSNickeau * USERINFO is also available via $INFO['userinfo'] 88*04fd306cSNickeau * See {@link basicinfo()} 89*04fd306cSNickeau */ 90*04fd306cSNickeau global $USERINFO; 91*04fd306cSNickeau $USERINFO['mail'] = "email@example.com"; 92*04fd306cSNickeau // $USERINFO['grps'] = array('admin', 'user'); 93*04fd306cSNickeau 94*04fd306cSNickeau 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 */ 117*04fd306cSNickeau public static function isWriter($wikiId = null): bool 11837748cd8SNickeau { 119*04fd306cSNickeau 120*04fd306cSNickeau if ($wikiId === null) { 121*04fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 122*04fd306cSNickeau try { 123*04fd306cSNickeau $wikiId = $executionContext->getRequestedPath()->getWikiId(); 124*04fd306cSNickeau } catch (ExceptionNotFound $e) { 125*04fd306cSNickeau return false; 126c3437056SNickeau } 127*04fd306cSNickeau } 128*04fd306cSNickeau /** 129*04fd306cSNickeau * There is also 130*04fd306cSNickeau * $INFO['writable'] === true 131*04fd306cSNickeau * See true if writable See https://www.dokuwiki.org/devel:environment#info 132*04fd306cSNickeau */ 133c3437056SNickeau if ($_SERVER['REMOTE_USER']) { 134*04fd306cSNickeau $perm = auth_quickaclcheck($wikiId); 135c3437056SNickeau } else { 136*04fd306cSNickeau $perm = auth_aclcheck($wikiId, '', null); 137c3437056SNickeau } 13837748cd8SNickeau 139c3437056SNickeau if ($perm >= AUTH_EDIT) { 140c3437056SNickeau return true; 141c3437056SNickeau } else { 142c3437056SNickeau return false; 143c3437056SNickeau } 14437748cd8SNickeau 14537748cd8SNickeau } 14637748cd8SNickeau 14737748cd8SNickeau public static function isAdmin() 14837748cd8SNickeau { 14937748cd8SNickeau global $INFO; 15037748cd8SNickeau if (!empty($INFO)) { 15137748cd8SNickeau return $INFO['isadmin']; 15237748cd8SNickeau } else { 15337748cd8SNickeau return auth_isadmin(self::getUser(), self::getUserGroups()); 15437748cd8SNickeau } 15537748cd8SNickeau } 15637748cd8SNickeau 15737748cd8SNickeau public static function isMember($group) 15837748cd8SNickeau { 15937748cd8SNickeau 16037748cd8SNickeau return auth_isMember($group, self::getUser(), self::getUserGroups()); 16137748cd8SNickeau 16237748cd8SNickeau } 16337748cd8SNickeau 164*04fd306cSNickeau public static function isManager(): bool 16537748cd8SNickeau { 166*04fd306cSNickeau 167c3437056SNickeau return auth_ismanager(); 168*04fd306cSNickeau 16937748cd8SNickeau } 17037748cd8SNickeau 171c3437056SNickeau public static function getUser(): string 17237748cd8SNickeau { 17337748cd8SNickeau global $INPUT; 174c3437056SNickeau $user = $INPUT->server->str('REMOTE_USER'); 175c3437056SNickeau if (empty($user)) { 176c3437056SNickeau return "Anonymous"; 177c3437056SNickeau } 178c3437056SNickeau return $user; 17937748cd8SNickeau } 18037748cd8SNickeau 18137748cd8SNickeau private static function getUserGroups() 18237748cd8SNickeau { 18337748cd8SNickeau global $USERINFO; 184*04fd306cSNickeau return is_array($USERINFO) && isset($USERINFO['grps']) ? $USERINFO['grps'] : array(); 18537748cd8SNickeau } 18637748cd8SNickeau 187*04fd306cSNickeau public static function isReader(string $wikiId): bool 18837748cd8SNickeau { 189*04fd306cSNickeau $perm = self::getPermissions($wikiId); 190c3437056SNickeau 191c3437056SNickeau if ($perm >= AUTH_READ) { 192c3437056SNickeau return true; 193c3437056SNickeau } else { 194c3437056SNickeau return false; 195c3437056SNickeau } 196c3437056SNickeau 197c3437056SNickeau } 198c3437056SNickeau 199*04fd306cSNickeau private static function getPermissions(string $wikiId): int 200c3437056SNickeau { 201*04fd306cSNickeau if ($wikiId == null) { 202*04fd306cSNickeau $wikiId = MarkupPath::createFromRequestedPage()->getWikiId(); 203c3437056SNickeau } 204c3437056SNickeau if ($_SERVER['REMOTE_USER']) { 205*04fd306cSNickeau $perm = auth_quickaclcheck($wikiId); 206c3437056SNickeau } else { 207*04fd306cSNickeau $perm = auth_aclcheck($wikiId, '', null); 208c3437056SNickeau } 209c3437056SNickeau return $perm; 210c3437056SNickeau } 211c3437056SNickeau 212*04fd306cSNickeau public static function getSecurityTokenForAdminUser(): string 2134cadd4f8SNickeau { 214*04fd306cSNickeau $request = null; 215*04fd306cSNickeau Identity::becomeSuperUser($request, 'admin'); 216*04fd306cSNickeau return getSecurityToken(); 2174cadd4f8SNickeau } 2184cadd4f8SNickeau 219*04fd306cSNickeau public static function isAnonymous(): bool 2204cadd4f8SNickeau { 221*04fd306cSNickeau return !self::isLoggedIn(); 2224cadd4f8SNickeau } 2234cadd4f8SNickeau 22437748cd8SNickeau 22537748cd8SNickeau} 226