xref: /plugin/combo/ComboStrap/Identity.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
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
33*4cadd4f8SNickeau    const FORM_IDENTITY_CLASS = "form-identity";
34*4cadd4f8SNickeau
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);
6237748cd8SNickeau        } else {
6337748cd8SNickeau            global $INPUT;
6437748cd8SNickeau            $INPUT->server->set('REMOTE_USER', $user);
651fa8c418SNickeau            // same as $_SERVER['REMOTE_USER'] = $user;
6637748cd8SNickeau        }
6737748cd8SNickeau
6837748cd8SNickeau        // $_SERVER[] = $user;
6937748cd8SNickeau        // global $USERINFO;
7037748cd8SNickeau        // $USERINFO['grps'] = array('admin', 'user');
7137748cd8SNickeau
7237748cd8SNickeau        // global $INFO;
7337748cd8SNickeau        // $INFO['ismanager'] = true;
7437748cd8SNickeau
7537748cd8SNickeau    }
7637748cd8SNickeau
7737748cd8SNickeau    /**
7837748cd8SNickeau     * @param $request
7937748cd8SNickeau     * @param string $user - the user to login
8037748cd8SNickeau     */
8137748cd8SNickeau    public static function logIn(&$request, $user = 'defaultUser')
8237748cd8SNickeau    {
8337748cd8SNickeau
8437748cd8SNickeau        $request->setServer('REMOTE_USER', $user);
8537748cd8SNickeau
8637748cd8SNickeau        /**
8737748cd8SNickeau         * The {@link getSecurityToken()} needs it
8837748cd8SNickeau         */
8937748cd8SNickeau        global $INPUT;
9037748cd8SNickeau        $INPUT->server->set('REMOTE_USER', $user);
9137748cd8SNickeau
9237748cd8SNickeau    }
9337748cd8SNickeau
9437748cd8SNickeau    /**
9537748cd8SNickeau     * @return bool if edit auth
9637748cd8SNickeau     */
97c3437056SNickeau    public static function isWriter($pageId = null): bool
9837748cd8SNickeau    {
99c3437056SNickeau        if ($pageId == null) {
100c3437056SNickeau            $pageId = Page::createPageFromGlobalDokuwikiId();
101c3437056SNickeau        }
102c3437056SNickeau        if ($_SERVER['REMOTE_USER']) {
103c3437056SNickeau            $perm = auth_quickaclcheck($pageId);
104c3437056SNickeau        } else {
105c3437056SNickeau            $perm = auth_aclcheck($pageId, '', null);
106c3437056SNickeau        }
10737748cd8SNickeau
108c3437056SNickeau        if ($perm >= AUTH_EDIT) {
109c3437056SNickeau            return true;
110c3437056SNickeau        } else {
111c3437056SNickeau            return false;
112c3437056SNickeau        }
11337748cd8SNickeau
11437748cd8SNickeau    }
11537748cd8SNickeau
11637748cd8SNickeau    public static function isAdmin()
11737748cd8SNickeau    {
11837748cd8SNickeau        global $INFO;
11937748cd8SNickeau        if (!empty($INFO)) {
12037748cd8SNickeau            return $INFO['isadmin'];
12137748cd8SNickeau        } else {
12237748cd8SNickeau            return auth_isadmin(self::getUser(), self::getUserGroups());
12337748cd8SNickeau        }
12437748cd8SNickeau    }
12537748cd8SNickeau
12637748cd8SNickeau    public static function isMember($group)
12737748cd8SNickeau    {
12837748cd8SNickeau
12937748cd8SNickeau        return auth_isMember($group, self::getUser(), self::getUserGroups());
13037748cd8SNickeau
13137748cd8SNickeau    }
13237748cd8SNickeau
13337748cd8SNickeau    public static function isManager()
13437748cd8SNickeau    {
13537748cd8SNickeau        global $INFO;
136c3437056SNickeau        if ($INFO !== null) {
13737748cd8SNickeau            return $INFO['ismanager'];
138c3437056SNickeau        } else {
139c3437056SNickeau            /**
140c3437056SNickeau             * In test
141c3437056SNickeau             */
142c3437056SNickeau            return auth_ismanager();
143c3437056SNickeau        }
14437748cd8SNickeau    }
14537748cd8SNickeau
146c3437056SNickeau    public static function getUser(): string
14737748cd8SNickeau    {
14837748cd8SNickeau        global $INPUT;
149c3437056SNickeau        $user = $INPUT->server->str('REMOTE_USER');
150c3437056SNickeau        if (empty($user)) {
151c3437056SNickeau            return "Anonymous";
152c3437056SNickeau        }
153c3437056SNickeau        return $user;
15437748cd8SNickeau    }
15537748cd8SNickeau
15637748cd8SNickeau    private static function getUserGroups()
15737748cd8SNickeau    {
15837748cd8SNickeau        global $USERINFO;
15937748cd8SNickeau        return is_array($USERINFO) ? $USERINFO['grps'] : array();
16037748cd8SNickeau    }
16137748cd8SNickeau
16237748cd8SNickeau    /**
16337748cd8SNickeau     * @param Doku_Form $form
16437748cd8SNickeau     * @param string $classPrefix
16537748cd8SNickeau     * @param bool $includeLogo
16637748cd8SNickeau     * @return string
16737748cd8SNickeau     */
16837748cd8SNickeau    public static function getHeaderHTML(Doku_Form $form, $classPrefix, $includeLogo = true)
16937748cd8SNickeau    {
17037748cd8SNickeau        if (isset($form->_content[0]["_legend"])) {
17137748cd8SNickeau
17237748cd8SNickeau            $title = $form->_content[0]["_legend"];
17337748cd8SNickeau            /**
17437748cd8SNickeau             * Logo
17537748cd8SNickeau             */
17637748cd8SNickeau            $logoHtmlImgTag = "";
17737748cd8SNickeau            if (
17837748cd8SNickeau                PluginUtility::getConfValue(Identity::CONF_ENABLE_LOGO_ON_IDENTITY_FORMS, 1)
17937748cd8SNickeau                &&
18037748cd8SNickeau                $includeLogo === true
18137748cd8SNickeau            ) {
182*4cadd4f8SNickeau                $logoHtmlImgTag = Site::getLogoHtml();
18337748cd8SNickeau            }
18437748cd8SNickeau            /**
18537748cd8SNickeau             * Don't use `header` in place of
18637748cd8SNickeau             * div because this is a HTML5 tag
18737748cd8SNickeau             *
18837748cd8SNickeau             * On php 5.6, the php test library method {@link \phpQueryObject::htmlOuter()}
18937748cd8SNickeau             * add the below meta tag
19037748cd8SNickeau             * <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
19137748cd8SNickeau             *
19237748cd8SNickeau             */
19337748cd8SNickeau            return <<<EOF
19437748cd8SNickeau<div class="$classPrefix-header">
19537748cd8SNickeau    $logoHtmlImgTag
19637748cd8SNickeau    <h1>$title</h1>
19737748cd8SNickeau</div>
19837748cd8SNickeauEOF;
19937748cd8SNickeau        }
20037748cd8SNickeau        return "";
20137748cd8SNickeau    }
20237748cd8SNickeau
203c3437056SNickeau    public static function isReader(string $pageId): bool
204c3437056SNickeau    {
205c3437056SNickeau        $perm = self::getPerm($pageId);
206c3437056SNickeau
207c3437056SNickeau        if ($perm >= AUTH_READ) {
208c3437056SNickeau            return true;
209c3437056SNickeau        } else {
210c3437056SNickeau            return false;
211c3437056SNickeau        }
212c3437056SNickeau
213c3437056SNickeau    }
214c3437056SNickeau
215c3437056SNickeau    private static function getPerm(string $pageId)
216c3437056SNickeau    {
217c3437056SNickeau        if ($pageId == null) {
218c3437056SNickeau            $pageId = Page::createPageFromRequestedPage()->getDokuwikiId();
219c3437056SNickeau        }
220c3437056SNickeau        if ($_SERVER['REMOTE_USER']) {
221c3437056SNickeau            $perm = auth_quickaclcheck($pageId);
222c3437056SNickeau        } else {
223c3437056SNickeau            $perm = auth_aclcheck($pageId, '', null);
224c3437056SNickeau        }
225c3437056SNickeau        return $perm;
226c3437056SNickeau    }
227c3437056SNickeau
228*4cadd4f8SNickeau    public static function addPrimaryColorCssRuleIfSet(?string $content): ?string
229*4cadd4f8SNickeau    {
230*4cadd4f8SNickeau        if ($content === null) {
231*4cadd4f8SNickeau            return null;
232*4cadd4f8SNickeau        }
233*4cadd4f8SNickeau        $primaryColor = Site::getPrimaryColorValue();
234*4cadd4f8SNickeau        if ($primaryColor !== null) {
235*4cadd4f8SNickeau            $identityClass = self::FORM_IDENTITY_CLASS;
236*4cadd4f8SNickeau            $content .= <<<EOF
237*4cadd4f8SNickeau.$identityClass button[type="submit"]{
238*4cadd4f8SNickeau   background-color: $primaryColor;
239*4cadd4f8SNickeau   border-color: $primaryColor;
240*4cadd4f8SNickeau}
241*4cadd4f8SNickeauEOF;
242*4cadd4f8SNickeau        }
243*4cadd4f8SNickeau        return $content;
244*4cadd4f8SNickeau    }
245*4cadd4f8SNickeau
246*4cadd4f8SNickeau    public static function getHtmlStyleTag(string $componentId): string
247*4cadd4f8SNickeau    {
248*4cadd4f8SNickeau        $loginCss = Snippet::createInternalCssSnippet($componentId);
249*4cadd4f8SNickeau        $content = $loginCss->getInternalInlineAndFileContent();
250*4cadd4f8SNickeau        $content = Identity::addPrimaryColorCssRuleIfSet($content);
251*4cadd4f8SNickeau        $class = $loginCss->getClass();
252*4cadd4f8SNickeau        return <<<EOF
253*4cadd4f8SNickeau<style class="$class">
254*4cadd4f8SNickeau$content
255*4cadd4f8SNickeau</style>
256*4cadd4f8SNickeauEOF;
257*4cadd4f8SNickeau
258*4cadd4f8SNickeau    }
259*4cadd4f8SNickeau
260*4cadd4f8SNickeau    public static function addIdentityClass(&$class, string $formClass)
261*4cadd4f8SNickeau    {
262*4cadd4f8SNickeau
263*4cadd4f8SNickeau        $formClass = Identity::FORM_IDENTITY_CLASS . " " . $formClass;
264*4cadd4f8SNickeau        if (isset($class)) {
265*4cadd4f8SNickeau            $class .= " " . $formClass;
266*4cadd4f8SNickeau        } else {
267*4cadd4f8SNickeau            $class = $formClass;
268*4cadd4f8SNickeau        }
269*4cadd4f8SNickeau
270*4cadd4f8SNickeau    }
271*4cadd4f8SNickeau
27237748cd8SNickeau
27337748cd8SNickeau}
274