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