xref: /template/strap/ComboStrap/Identity.php (revision 918039db4917787782d4545087ae34a1f6bf9204)
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;
1737748cd8SNickeauuse TestRequest;
1837748cd8SNickeau
1937748cd8SNickeauclass Identity
2037748cd8SNickeau{
2137748cd8SNickeau
2237748cd8SNickeau    const CANONICAL = "identity";
2337748cd8SNickeau    const CONF_ENABLE_LOGO_ON_IDENTITY_FORMS = "enableLogoOnIdentityForms";
2437748cd8SNickeau    const JS_NAVIGATION_ANONYMOUS_VALUE = "anonymous";
2537748cd8SNickeau    const JS_NAVIGATION_SIGNED_VALUE = "signed";
2637748cd8SNickeau    /**
2737748cd8SNickeau     * A javascript indicator
2837748cd8SNickeau     * to know if the user is logged in or not
2937748cd8SNickeau     * (ie public or not)
3037748cd8SNickeau     */
3137748cd8SNickeau    const JS_NAVIGATION_INDICATOR = "navigation";
3237748cd8SNickeau
334cadd4f8SNickeau    const FORM_IDENTITY_CLASS = "form-identity";
344cadd4f8SNickeau
3537748cd8SNickeau    /**
3637748cd8SNickeau     * Is logged in
3737748cd8SNickeau     * @return boolean
3837748cd8SNickeau     */
3937748cd8SNickeau    public static function isLoggedIn()
4037748cd8SNickeau    {
4137748cd8SNickeau        $loggedIn = false;
4237748cd8SNickeau        global $INPUT;
4337748cd8SNickeau        if ($INPUT->server->has('REMOTE_USER')) {
4437748cd8SNickeau            $loggedIn = true;
4537748cd8SNickeau        }
4637748cd8SNickeau        return $loggedIn;
4737748cd8SNickeau    }
4837748cd8SNickeau
4937748cd8SNickeau    /**
5037748cd8SNickeau     * @param TestRequest $request
5137748cd8SNickeau     * @param string $user
5237748cd8SNickeau     */
5337748cd8SNickeau    public static function becomeSuperUser(&$request = null, $user = 'admin')
5437748cd8SNickeau    {
5537748cd8SNickeau        global $conf;
5637748cd8SNickeau        $conf['useacl'] = 1;
5737748cd8SNickeau        $conf['superuser'] = $user;
5837748cd8SNickeau        $conf['remoteuser'] = $user;
5937748cd8SNickeau
6037748cd8SNickeau        if ($request != null) {
6137748cd8SNickeau            $request->setServer('REMOTE_USER', $user);
62*918039dbSgerardnico        }
63*918039dbSgerardnico
64*918039dbSgerardnico        /**
65*918039dbSgerardnico         * used by {@link getSecurityToken()}
66*918039dbSgerardnico         */
6737748cd8SNickeau        global $INPUT;
6837748cd8SNickeau        $INPUT->server->set('REMOTE_USER', $user);
691fa8c418SNickeau        // same as $_SERVER['REMOTE_USER'] = $user;
70*918039dbSgerardnico
7137748cd8SNickeau
7237748cd8SNickeau        // $_SERVER[] = $user;
7337748cd8SNickeau        // global $USERINFO;
7437748cd8SNickeau        // $USERINFO['grps'] = array('admin', 'user');
7537748cd8SNickeau
7637748cd8SNickeau        // global $INFO;
7737748cd8SNickeau        // $INFO['ismanager'] = true;
7837748cd8SNickeau
7937748cd8SNickeau    }
8037748cd8SNickeau
8137748cd8SNickeau    /**
8237748cd8SNickeau     * @param $request
8337748cd8SNickeau     * @param string $user - the user to login
8437748cd8SNickeau     */
8537748cd8SNickeau    public static function logIn(&$request, $user = 'defaultUser')
8637748cd8SNickeau    {
8737748cd8SNickeau
8837748cd8SNickeau        $request->setServer('REMOTE_USER', $user);
8937748cd8SNickeau
9037748cd8SNickeau        /**
9137748cd8SNickeau         * The {@link getSecurityToken()} needs it
9237748cd8SNickeau         */
9337748cd8SNickeau        global $INPUT;
9437748cd8SNickeau        $INPUT->server->set('REMOTE_USER', $user);
9537748cd8SNickeau
9637748cd8SNickeau    }
9737748cd8SNickeau
9837748cd8SNickeau    /**
9937748cd8SNickeau     * @return bool if edit auth
10037748cd8SNickeau     */
101c3437056SNickeau    public static function isWriter($pageId = null): bool
10237748cd8SNickeau    {
103c3437056SNickeau        if ($pageId == null) {
104c3437056SNickeau            $pageId = Page::createPageFromGlobalDokuwikiId();
105c3437056SNickeau        }
106c3437056SNickeau        if ($_SERVER['REMOTE_USER']) {
107c3437056SNickeau            $perm = auth_quickaclcheck($pageId);
108c3437056SNickeau        } else {
109c3437056SNickeau            $perm = auth_aclcheck($pageId, '', null);
110c3437056SNickeau        }
11137748cd8SNickeau
112c3437056SNickeau        if ($perm >= AUTH_EDIT) {
113c3437056SNickeau            return true;
114c3437056SNickeau        } else {
115c3437056SNickeau            return false;
116c3437056SNickeau        }
11737748cd8SNickeau
11837748cd8SNickeau    }
11937748cd8SNickeau
12037748cd8SNickeau    public static function isAdmin()
12137748cd8SNickeau    {
12237748cd8SNickeau        global $INFO;
12337748cd8SNickeau        if (!empty($INFO)) {
12437748cd8SNickeau            return $INFO['isadmin'];
12537748cd8SNickeau        } else {
12637748cd8SNickeau            return auth_isadmin(self::getUser(), self::getUserGroups());
12737748cd8SNickeau        }
12837748cd8SNickeau    }
12937748cd8SNickeau
13037748cd8SNickeau    public static function isMember($group)
13137748cd8SNickeau    {
13237748cd8SNickeau
13337748cd8SNickeau        return auth_isMember($group, self::getUser(), self::getUserGroups());
13437748cd8SNickeau
13537748cd8SNickeau    }
13637748cd8SNickeau
13737748cd8SNickeau    public static function isManager()
13837748cd8SNickeau    {
13937748cd8SNickeau        global $INFO;
140c3437056SNickeau        if ($INFO !== null) {
14137748cd8SNickeau            return $INFO['ismanager'];
142c3437056SNickeau        } else {
143c3437056SNickeau            /**
144c3437056SNickeau             * In test
145c3437056SNickeau             */
146c3437056SNickeau            return auth_ismanager();
147c3437056SNickeau        }
14837748cd8SNickeau    }
14937748cd8SNickeau
150c3437056SNickeau    public static function getUser(): string
15137748cd8SNickeau    {
15237748cd8SNickeau        global $INPUT;
153c3437056SNickeau        $user = $INPUT->server->str('REMOTE_USER');
154c3437056SNickeau        if (empty($user)) {
155c3437056SNickeau            return "Anonymous";
156c3437056SNickeau        }
157c3437056SNickeau        return $user;
15837748cd8SNickeau    }
15937748cd8SNickeau
16037748cd8SNickeau    private static function getUserGroups()
16137748cd8SNickeau    {
16237748cd8SNickeau        global $USERINFO;
16337748cd8SNickeau        return is_array($USERINFO) ? $USERINFO['grps'] : array();
16437748cd8SNickeau    }
16537748cd8SNickeau
16637748cd8SNickeau    /**
16737748cd8SNickeau     * @param Doku_Form $form
16837748cd8SNickeau     * @param string $classPrefix
16937748cd8SNickeau     * @param bool $includeLogo
17037748cd8SNickeau     * @return string
17137748cd8SNickeau     */
17237748cd8SNickeau    public static function getHeaderHTML(Doku_Form $form, $classPrefix, $includeLogo = true)
17337748cd8SNickeau    {
17437748cd8SNickeau        if (isset($form->_content[0]["_legend"])) {
17537748cd8SNickeau
17637748cd8SNickeau            $title = $form->_content[0]["_legend"];
17737748cd8SNickeau            /**
17837748cd8SNickeau             * Logo
17937748cd8SNickeau             */
18037748cd8SNickeau            $logoHtmlImgTag = "";
18137748cd8SNickeau            if (
18237748cd8SNickeau                PluginUtility::getConfValue(Identity::CONF_ENABLE_LOGO_ON_IDENTITY_FORMS, 1)
18337748cd8SNickeau                &&
18437748cd8SNickeau                $includeLogo === true
18537748cd8SNickeau            ) {
1864cadd4f8SNickeau                $logoHtmlImgTag = Site::getLogoHtml();
18737748cd8SNickeau            }
18837748cd8SNickeau            /**
18937748cd8SNickeau             * Don't use `header` in place of
19037748cd8SNickeau             * div because this is a HTML5 tag
19137748cd8SNickeau             *
19237748cd8SNickeau             * On php 5.6, the php test library method {@link \phpQueryObject::htmlOuter()}
19337748cd8SNickeau             * add the below meta tag
19437748cd8SNickeau             * <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
19537748cd8SNickeau             *
19637748cd8SNickeau             */
19737748cd8SNickeau            return <<<EOF
19837748cd8SNickeau<div class="$classPrefix-header">
19937748cd8SNickeau    $logoHtmlImgTag
20037748cd8SNickeau    <h1>$title</h1>
20137748cd8SNickeau</div>
20237748cd8SNickeauEOF;
20337748cd8SNickeau        }
20437748cd8SNickeau        return "";
20537748cd8SNickeau    }
20637748cd8SNickeau
207c3437056SNickeau    public static function isReader(string $pageId): bool
208c3437056SNickeau    {
209c3437056SNickeau        $perm = self::getPerm($pageId);
210c3437056SNickeau
211c3437056SNickeau        if ($perm >= AUTH_READ) {
212c3437056SNickeau            return true;
213c3437056SNickeau        } else {
214c3437056SNickeau            return false;
215c3437056SNickeau        }
216c3437056SNickeau
217c3437056SNickeau    }
218c3437056SNickeau
219c3437056SNickeau    private static function getPerm(string $pageId)
220c3437056SNickeau    {
221c3437056SNickeau        if ($pageId == null) {
222c3437056SNickeau            $pageId = Page::createPageFromRequestedPage()->getDokuwikiId();
223c3437056SNickeau        }
224c3437056SNickeau        if ($_SERVER['REMOTE_USER']) {
225c3437056SNickeau            $perm = auth_quickaclcheck($pageId);
226c3437056SNickeau        } else {
227c3437056SNickeau            $perm = auth_aclcheck($pageId, '', null);
228c3437056SNickeau        }
229c3437056SNickeau        return $perm;
230c3437056SNickeau    }
231c3437056SNickeau
2324cadd4f8SNickeau    public static function addPrimaryColorCssRuleIfSet(?string $content): ?string
2334cadd4f8SNickeau    {
2344cadd4f8SNickeau        if ($content === null) {
2354cadd4f8SNickeau            return null;
2364cadd4f8SNickeau        }
2374cadd4f8SNickeau        $primaryColor = Site::getPrimaryColorValue();
2384cadd4f8SNickeau        if ($primaryColor !== null) {
2394cadd4f8SNickeau            $identityClass = self::FORM_IDENTITY_CLASS;
2404cadd4f8SNickeau            $content .= <<<EOF
2414cadd4f8SNickeau.$identityClass button[type="submit"]{
2424cadd4f8SNickeau   background-color: $primaryColor;
2434cadd4f8SNickeau   border-color: $primaryColor;
2444cadd4f8SNickeau}
2454cadd4f8SNickeauEOF;
2464cadd4f8SNickeau        }
2474cadd4f8SNickeau        return $content;
2484cadd4f8SNickeau    }
2494cadd4f8SNickeau
2504cadd4f8SNickeau    public static function getHtmlStyleTag(string $componentId): string
2514cadd4f8SNickeau    {
2524cadd4f8SNickeau        $loginCss = Snippet::createInternalCssSnippet($componentId);
2534cadd4f8SNickeau        $content = $loginCss->getInternalInlineAndFileContent();
2544cadd4f8SNickeau        $content = Identity::addPrimaryColorCssRuleIfSet($content);
2554cadd4f8SNickeau        $class = $loginCss->getClass();
2564cadd4f8SNickeau        return <<<EOF
2574cadd4f8SNickeau<style class="$class">
2584cadd4f8SNickeau$content
2594cadd4f8SNickeau</style>
2604cadd4f8SNickeauEOF;
2614cadd4f8SNickeau
2624cadd4f8SNickeau    }
2634cadd4f8SNickeau
2644cadd4f8SNickeau    public static function addIdentityClass(&$class, string $formClass)
2654cadd4f8SNickeau    {
2664cadd4f8SNickeau
2674cadd4f8SNickeau        $formClass = Identity::FORM_IDENTITY_CLASS . " " . $formClass;
2684cadd4f8SNickeau        if (isset($class)) {
2694cadd4f8SNickeau            $class .= " " . $formClass;
2704cadd4f8SNickeau        } else {
2714cadd4f8SNickeau            $class = $formClass;
2724cadd4f8SNickeau        }
2734cadd4f8SNickeau
2744cadd4f8SNickeau    }
2754cadd4f8SNickeau
27637748cd8SNickeau
27737748cd8SNickeau}
278