xref: /template/strap/ComboStrap/Identity.php (revision 0581ab2e899a1c46658568052899346bcaa91bb5)
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;
17*0581ab2eSgerardnicouse dokuwiki\Form\Form;
1837748cd8SNickeauuse TestRequest;
1937748cd8SNickeau
2037748cd8SNickeauclass Identity
2137748cd8SNickeau{
2237748cd8SNickeau
2337748cd8SNickeau    const CANONICAL = "identity";
2437748cd8SNickeau    const CONF_ENABLE_LOGO_ON_IDENTITY_FORMS = "enableLogoOnIdentityForms";
2537748cd8SNickeau    const JS_NAVIGATION_ANONYMOUS_VALUE = "anonymous";
2637748cd8SNickeau    const JS_NAVIGATION_SIGNED_VALUE = "signed";
2737748cd8SNickeau    /**
2837748cd8SNickeau     * A javascript indicator
2937748cd8SNickeau     * to know if the user is logged in or not
3037748cd8SNickeau     * (ie public or not)
3137748cd8SNickeau     */
3237748cd8SNickeau    const JS_NAVIGATION_INDICATOR = "navigation";
3337748cd8SNickeau
344cadd4f8SNickeau    const FORM_IDENTITY_CLASS = "form-identity";
354cadd4f8SNickeau
3637748cd8SNickeau    /**
3737748cd8SNickeau     * Is logged in
3837748cd8SNickeau     * @return boolean
3937748cd8SNickeau     */
4037748cd8SNickeau    public static function isLoggedIn()
4137748cd8SNickeau    {
4237748cd8SNickeau        $loggedIn = false;
4337748cd8SNickeau        global $INPUT;
4437748cd8SNickeau        if ($INPUT->server->has('REMOTE_USER')) {
4537748cd8SNickeau            $loggedIn = true;
4637748cd8SNickeau        }
4737748cd8SNickeau        return $loggedIn;
4837748cd8SNickeau    }
4937748cd8SNickeau
5037748cd8SNickeau    /**
5137748cd8SNickeau     * @param TestRequest $request
5237748cd8SNickeau     * @param string $user
5337748cd8SNickeau     */
5437748cd8SNickeau    public static function becomeSuperUser(&$request = null, $user = 'admin')
5537748cd8SNickeau    {
5637748cd8SNickeau        global $conf;
5737748cd8SNickeau        $conf['useacl'] = 1;
5837748cd8SNickeau        $conf['superuser'] = $user;
5937748cd8SNickeau        $conf['remoteuser'] = $user;
6037748cd8SNickeau
6137748cd8SNickeau        if ($request != null) {
6237748cd8SNickeau            $request->setServer('REMOTE_USER', $user);
63918039dbSgerardnico        }
64918039dbSgerardnico
65918039dbSgerardnico        /**
66918039dbSgerardnico         * used by {@link getSecurityToken()}
67918039dbSgerardnico         */
6837748cd8SNickeau        global $INPUT;
6937748cd8SNickeau        $INPUT->server->set('REMOTE_USER', $user);
701fa8c418SNickeau        // same as $_SERVER['REMOTE_USER'] = $user;
71918039dbSgerardnico
7237748cd8SNickeau
7337748cd8SNickeau        // $_SERVER[] = $user;
7437748cd8SNickeau        // global $USERINFO;
7537748cd8SNickeau        // $USERINFO['grps'] = array('admin', 'user');
7637748cd8SNickeau
7737748cd8SNickeau        // global $INFO;
7837748cd8SNickeau        // $INFO['ismanager'] = true;
7937748cd8SNickeau
8037748cd8SNickeau    }
8137748cd8SNickeau
8237748cd8SNickeau    /**
8337748cd8SNickeau     * @param $request
8437748cd8SNickeau     * @param string $user - the user to login
8537748cd8SNickeau     */
8637748cd8SNickeau    public static function logIn(&$request, $user = 'defaultUser')
8737748cd8SNickeau    {
8837748cd8SNickeau
8937748cd8SNickeau        $request->setServer('REMOTE_USER', $user);
9037748cd8SNickeau
9137748cd8SNickeau        /**
9237748cd8SNickeau         * The {@link getSecurityToken()} needs it
9337748cd8SNickeau         */
9437748cd8SNickeau        global $INPUT;
9537748cd8SNickeau        $INPUT->server->set('REMOTE_USER', $user);
9637748cd8SNickeau
9737748cd8SNickeau    }
9837748cd8SNickeau
9937748cd8SNickeau    /**
10037748cd8SNickeau     * @return bool if edit auth
10137748cd8SNickeau     */
102c3437056SNickeau    public static function isWriter($pageId = null): bool
10337748cd8SNickeau    {
104c3437056SNickeau        if ($pageId == null) {
105c3437056SNickeau            $pageId = Page::createPageFromGlobalDokuwikiId();
106c3437056SNickeau        }
107c3437056SNickeau        if ($_SERVER['REMOTE_USER']) {
108c3437056SNickeau            $perm = auth_quickaclcheck($pageId);
109c3437056SNickeau        } else {
110c3437056SNickeau            $perm = auth_aclcheck($pageId, '', null);
111c3437056SNickeau        }
11237748cd8SNickeau
113c3437056SNickeau        if ($perm >= AUTH_EDIT) {
114c3437056SNickeau            return true;
115c3437056SNickeau        } else {
116c3437056SNickeau            return false;
117c3437056SNickeau        }
11837748cd8SNickeau
11937748cd8SNickeau    }
12037748cd8SNickeau
12137748cd8SNickeau    public static function isAdmin()
12237748cd8SNickeau    {
12337748cd8SNickeau        global $INFO;
12437748cd8SNickeau        if (!empty($INFO)) {
12537748cd8SNickeau            return $INFO['isadmin'];
12637748cd8SNickeau        } else {
12737748cd8SNickeau            return auth_isadmin(self::getUser(), self::getUserGroups());
12837748cd8SNickeau        }
12937748cd8SNickeau    }
13037748cd8SNickeau
13137748cd8SNickeau    public static function isMember($group)
13237748cd8SNickeau    {
13337748cd8SNickeau
13437748cd8SNickeau        return auth_isMember($group, self::getUser(), self::getUserGroups());
13537748cd8SNickeau
13637748cd8SNickeau    }
13737748cd8SNickeau
13837748cd8SNickeau    public static function isManager()
13937748cd8SNickeau    {
14037748cd8SNickeau        global $INFO;
141c3437056SNickeau        if ($INFO !== null) {
14237748cd8SNickeau            return $INFO['ismanager'];
143c3437056SNickeau        } else {
144c3437056SNickeau            /**
145c3437056SNickeau             * In test
146c3437056SNickeau             */
147c3437056SNickeau            return auth_ismanager();
148c3437056SNickeau        }
14937748cd8SNickeau    }
15037748cd8SNickeau
151c3437056SNickeau    public static function getUser(): string
15237748cd8SNickeau    {
15337748cd8SNickeau        global $INPUT;
154c3437056SNickeau        $user = $INPUT->server->str('REMOTE_USER');
155c3437056SNickeau        if (empty($user)) {
156c3437056SNickeau            return "Anonymous";
157c3437056SNickeau        }
158c3437056SNickeau        return $user;
15937748cd8SNickeau    }
16037748cd8SNickeau
16137748cd8SNickeau    private static function getUserGroups()
16237748cd8SNickeau    {
16337748cd8SNickeau        global $USERINFO;
16437748cd8SNickeau        return is_array($USERINFO) ? $USERINFO['grps'] : array();
16537748cd8SNickeau    }
16637748cd8SNickeau
16737748cd8SNickeau    /**
168*0581ab2eSgerardnico     * @param Doku_Form|Form $form
16937748cd8SNickeau     * @param string $classPrefix
17037748cd8SNickeau     * @param bool $includeLogo
17137748cd8SNickeau     * @return string
17237748cd8SNickeau     */
173*0581ab2eSgerardnico    public static function getHeaderHTML($form, $classPrefix, $includeLogo = true)
17437748cd8SNickeau    {
17537748cd8SNickeau
176*0581ab2eSgerardnico        $class = get_class($form);
177*0581ab2eSgerardnico        switch ($class) {
178*0581ab2eSgerardnico            case Doku_Form::class:
179*0581ab2eSgerardnico                /**
180*0581ab2eSgerardnico                 * Old one
181*0581ab2eSgerardnico                 * @var Doku_Form $form
182*0581ab2eSgerardnico                 */
183*0581ab2eSgerardnico                $legend = $form->_content[0]["_legend"];
184*0581ab2eSgerardnico                if (!isset($legend)) {
185*0581ab2eSgerardnico                    return "";
186*0581ab2eSgerardnico                }
187*0581ab2eSgerardnico
188*0581ab2eSgerardnico                $title = $legend;
189*0581ab2eSgerardnico                break;
190*0581ab2eSgerardnico            case Form::class;
191*0581ab2eSgerardnico                /**
192*0581ab2eSgerardnico                 * New One
193*0581ab2eSgerardnico                 * @var Form $form
194*0581ab2eSgerardnico                 */
195*0581ab2eSgerardnico                $pos = $form->findPositionByType("fieldsetopen");
196*0581ab2eSgerardnico                if ($pos == false) {
197*0581ab2eSgerardnico                    return "";
198*0581ab2eSgerardnico                }
199*0581ab2eSgerardnico
200*0581ab2eSgerardnico                $title = $form->getElementAt($pos)->val();
201*0581ab2eSgerardnico                break;
202*0581ab2eSgerardnico            default:
203*0581ab2eSgerardnico                LogUtility::msg("Internal Error: Unknown form class " . $class);
204*0581ab2eSgerardnico                return "";
205*0581ab2eSgerardnico        }
206*0581ab2eSgerardnico
20737748cd8SNickeau        /**
20837748cd8SNickeau         * Logo
20937748cd8SNickeau         */
21037748cd8SNickeau        $logoHtmlImgTag = "";
21137748cd8SNickeau        if (
21237748cd8SNickeau            PluginUtility::getConfValue(Identity::CONF_ENABLE_LOGO_ON_IDENTITY_FORMS, 1)
21337748cd8SNickeau            &&
21437748cd8SNickeau            $includeLogo === true
21537748cd8SNickeau        ) {
2164cadd4f8SNickeau            $logoHtmlImgTag = Site::getLogoHtml();
21737748cd8SNickeau        }
21837748cd8SNickeau        /**
21937748cd8SNickeau         * Don't use `header` in place of
22037748cd8SNickeau         * div because this is a HTML5 tag
22137748cd8SNickeau         *
22237748cd8SNickeau         * On php 5.6, the php test library method {@link \phpQueryObject::htmlOuter()}
22337748cd8SNickeau         * add the below meta tag
22437748cd8SNickeau         * <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
22537748cd8SNickeau         *
22637748cd8SNickeau         */
22737748cd8SNickeau        return <<<EOF
22837748cd8SNickeau<div class="$classPrefix-header">
22937748cd8SNickeau    $logoHtmlImgTag
23037748cd8SNickeau    <h1>$title</h1>
23137748cd8SNickeau</div>
23237748cd8SNickeauEOF;
233*0581ab2eSgerardnico
23437748cd8SNickeau    }
23537748cd8SNickeau
236c3437056SNickeau    public static function isReader(string $pageId): bool
237c3437056SNickeau    {
238c3437056SNickeau        $perm = self::getPerm($pageId);
239c3437056SNickeau
240c3437056SNickeau        if ($perm >= AUTH_READ) {
241c3437056SNickeau            return true;
242c3437056SNickeau        } else {
243c3437056SNickeau            return false;
244c3437056SNickeau        }
245c3437056SNickeau
246c3437056SNickeau    }
247c3437056SNickeau
248c3437056SNickeau    private static function getPerm(string $pageId)
249c3437056SNickeau    {
250c3437056SNickeau        if ($pageId == null) {
251c3437056SNickeau            $pageId = Page::createPageFromRequestedPage()->getDokuwikiId();
252c3437056SNickeau        }
253c3437056SNickeau        if ($_SERVER['REMOTE_USER']) {
254c3437056SNickeau            $perm = auth_quickaclcheck($pageId);
255c3437056SNickeau        } else {
256c3437056SNickeau            $perm = auth_aclcheck($pageId, '', null);
257c3437056SNickeau        }
258c3437056SNickeau        return $perm;
259c3437056SNickeau    }
260c3437056SNickeau
2614cadd4f8SNickeau    public static function addPrimaryColorCssRuleIfSet(?string $content): ?string
2624cadd4f8SNickeau    {
2634cadd4f8SNickeau        if ($content === null) {
2644cadd4f8SNickeau            return null;
2654cadd4f8SNickeau        }
2664cadd4f8SNickeau        $primaryColor = Site::getPrimaryColorValue();
2674cadd4f8SNickeau        if ($primaryColor !== null) {
2684cadd4f8SNickeau            $identityClass = self::FORM_IDENTITY_CLASS;
2694cadd4f8SNickeau            $content .= <<<EOF
2704cadd4f8SNickeau.$identityClass button[type="submit"]{
2714cadd4f8SNickeau   background-color: $primaryColor;
2724cadd4f8SNickeau   border-color: $primaryColor;
2734cadd4f8SNickeau}
2744cadd4f8SNickeauEOF;
2754cadd4f8SNickeau        }
2764cadd4f8SNickeau        return $content;
2774cadd4f8SNickeau    }
2784cadd4f8SNickeau
2794cadd4f8SNickeau    public static function getHtmlStyleTag(string $componentId): string
2804cadd4f8SNickeau    {
2814cadd4f8SNickeau        $loginCss = Snippet::createInternalCssSnippet($componentId);
2824cadd4f8SNickeau        $content = $loginCss->getInternalInlineAndFileContent();
2834cadd4f8SNickeau        $content = Identity::addPrimaryColorCssRuleIfSet($content);
2844cadd4f8SNickeau        $class = $loginCss->getClass();
2854cadd4f8SNickeau        return <<<EOF
2864cadd4f8SNickeau<style class="$class">
2874cadd4f8SNickeau$content
2884cadd4f8SNickeau</style>
2894cadd4f8SNickeauEOF;
2904cadd4f8SNickeau
2914cadd4f8SNickeau    }
2924cadd4f8SNickeau
2934cadd4f8SNickeau    public static function addIdentityClass(&$class, string $formClass)
2944cadd4f8SNickeau    {
2954cadd4f8SNickeau
2964cadd4f8SNickeau        $formClass = Identity::FORM_IDENTITY_CLASS . " " . $formClass;
2974cadd4f8SNickeau        if (isset($class)) {
2984cadd4f8SNickeau            $class .= " " . $formClass;
2994cadd4f8SNickeau        } else {
3004cadd4f8SNickeau            $class = $formClass;
3014cadd4f8SNickeau        }
3024cadd4f8SNickeau
3034cadd4f8SNickeau    }
3044cadd4f8SNickeau
30537748cd8SNickeau
30637748cd8SNickeau}
307