xref: /template/strap/ComboStrap/Identity.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
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