Skip to content
Snippets Groups Projects
Seminar_Perm.class.php 11.1 KiB
Newer Older
<?php

/**
 * Seminar_Perm.class.php
 *
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * @author      André Noack <noack@data-quest.de>
 * @copyright   2000 Stud.IP Core-Group
 * @license     http://www.gnu.org/licenses/gpl-2.0.html GPL version 2
 */
class Seminar_Perm
{

    /**
     * @var array
     */
    public $permissions = [
        "user"   => 1,
        "autor"  => 3,
        "tutor"  => 7,
        "dozent" => 15,
        "admin"  => 31,
        "root"   => 63
    ];
    /**
     * @var array
     */
    private $studip_perms = [];
    /**
     * @var array
     */
    private $fak_admins = [];

    /**
     * @return Seminar_Perm
     */
    public static function get()
    {
        if (is_object($GLOBALS['perm'])) {
            return $GLOBALS['perm'];
        } else {
            return new Seminar_Perm();
        }
    }

    /**
     * @param $must_have
     * @throws AccessDeniedException
     */
    public function check($must_have)
    {
        if (!$this->have_perm($must_have)) {
            if ($GLOBALS['user']->id === 'nobody') {
                $message = _('Sie sind nicht im System angemeldet und können daher nicht auf diesen Teil des Systems zugreifen. '
                           . 'Um den vollen Funktionsumfang des Systems benutzen zu können, müssen Sie sich mit Ihrem Nutzernamen und Passwort anmelden.');
                throw new AccessDeniedException($message);
            } else {
                throw new AccessDeniedException();
            }
        }
    }

    /**
     * @param bool $user_id
     * @return string
     */
    public function get_perm($user_id = false)
    {
        global $user;
        if (!$user_id) {
            $user_id = $user->id;
        }
        if ($user_id && $user_id == $user->id) {
            return $user->perms;
        }
        if ($user_id && isset($this->studip_perms['studip'][$user_id])) {
            return $this->studip_perms['studip'][$user_id];
        }
        if ($user_id && $user_id !== 'nobody') {
            $query = "SELECT perms FROM auth_user_md5 WHERE user_id = :user_id";
            $statement = DBManager::get()->prepare($query);
            $statement->bindValue(':user_id', $user_id);
            $statement->execute();
            $perms = $statement->fetchColumn();

            return $this->studip_perms['studip'][$user_id] = $perms;
        }
    }

    /**
     * @param $perm
     * @param bool $user_id
     * @return bool
     */
    public function have_perm($perm, $user_id = false)
    {
Moritz Strohm's avatar
Moritz Strohm committed
        $page_perm_value = $this->permissions[$perm] ?? 0;
        $user_perm_value = $this->permissions[$this->get_perm($user_id)] ?? 0;

        return $page_perm_value <= $user_perm_value;
    }


    /**
     * @param $range_id
     * @param bool $user_id
     * @return mixed
     */
    public function get_studip_perm($range_id, $user_id = false)
    {

        if (!$user_id) {
            $user_id = $GLOBALS['user']->id;
        }

        if (!isset($this->studip_perms[$range_id][$user_id])) {
            $this->studip_perms[$range_id][$user_id] = $this->get_uncached_studip_perm($range_id, $user_id);
        }
        return $this->studip_perms[$range_id][$user_id];
    }

    /**
     * @param $range_id
     * @param $user_id
     * @return bool|string
     */
    public function get_uncached_studip_perm($range_id, $user_id)
    {
        global $user;
        $db = DBManager::get();
        $status = false;
        if ($user_id && $user_id == $user->id) {
            $user_perm = $user->perms;
        } else {
            $user_perm = $this->get_perm($user_id);
            if (!$user_perm) {
                return false;
            }
        }
        if ($user_perm == "root") {
        } elseif ($user_perm == "admin") {
            if (Config::get()->ALLOW_ADMIN_RELATED_INST) {
                $sem_inst = 'seminar_inst';
            } else {
                $sem_inst = 'seminare';
            }
            $st = $db->prepare("SELECT Seminar_id
                          FROM user_inst
                          LEFT JOIN $sem_inst USING (Institut_id)
                          WHERE inst_perms='admin' AND user_id = ? AND Seminar_id = ? LIMIT 1");
            $st->execute([$user_id, $range_id]);
            if ($st->fetchColumn()) {
                $status = "admin";
            } else {
                $st = $db->prepare("SELECT Seminar_id FROM user_inst a
                            LEFT JOIN Institute b ON(a.Institut_id=b.Institut_id AND b.Institut_id=b.fakultaets_id)
                            LEFT JOIN Institute c ON (b.Institut_id=c.fakultaets_id)
                            LEFT JOIN $sem_inst d ON (d.Institut_id=c.Institut_id)
                            WHERE a.user_id = ? AND a.inst_perms='admin' AND d.Seminar_id = ? LIMIT 1");
                $st->execute([$user_id, $range_id]);
                if ($st->fetchColumn()) {
                    $status = "admin";
                } else {
                    $st = $db->prepare("SELECT a.Institut_id FROM user_inst a
                                LEFT JOIN Institute b ON(a.Institut_id=b.fakultaets_id)
                                WHERE user_id = ? AND a.inst_perms='admin'
                                AND b.Institut_id = ? LIMIT 1");
                    $st->execute([$user_id, $range_id]);
                    if ($st->fetchColumn()) {
                        $status = "admin";
                    }
                }
            }
        }

        if (isset($_SESSION['seminar_change_view_' . $range_id])) {
            $status = $_SESSION['seminar_change_view_' . $range_id];
        }

        if ($status) {
            return $status;
        }

        if (Config::get()->DEPUTIES_ENABLE && Deputy::isDeputy($user_id, $range_id)) {
        } else {
            $st = $db->prepare("SELECT status FROM seminar_user
                          WHERE user_id = ? AND Seminar_id = ?");
            $st->execute([$user_id, $range_id]);
            $status = $st->fetchColumn();

            if (!$status) {
                $st = $db->prepare("SELECT inst_perms FROM user_inst
                              WHERE user_id = ? AND Institut_id = ?");
                $st->execute([$user_id, $range_id]);
                $status = $st->fetchColumn();
            }
        }
        return $status;
    }

    /**
     * @param $perm
     * @param $range_id
     * @param bool $user_id
     * @return bool
     */
    public function have_studip_perm($perm, $range_id, $user_id = false)
    {
Moritz Strohm's avatar
Moritz Strohm committed
        $pageperm = $this->permissions[$perm] ?? 0;
        $userperm = $this->permissions[$this->get_studip_perm($range_id, $user_id)] ?? 0;
    }

    /**
     * @param $range_id
     * @param bool $user_id
     * @return mixed
     */
    public function get_profile_perm($range_id, $user_id = false)
    {
        if (!$user_id) {
            $user_id = $GLOBALS['user']->id;
        }

        if (!isset($this->studip_perms[$range_id][$user_id])) {
            $this->studip_perms[$range_id][$user_id] = $this->get_uncached_profile_perm($range_id, $user_id);
        }
        return $this->studip_perms[$range_id][$user_id];
    }

    /**
     * @param $range_id
     * @param $user_id
     * @return bool|string
     */
    public function get_uncached_profile_perm($range_id, $user_id)
    {
        $status = false;

        if ($range_id === $user_id && $this->have_perm('autor', $user_id)) {
            // user on his own profile
            $status = 'user';
        } else if (Deputy::isEditActivated() && Deputy::isDeputy($user_id, $range_id, true)) {
            // user is an assigned deputy
            $status = 'user';
        } else if ($this->have_perm('root', $user_id)) {
            // respect root's authority
            $status = 'admin';
        } else if ($this->have_perm('admin', $user_id)) {
            // institute admin may have permission
            $db = DBManager::get();
            $stmt = $db->prepare("SELECT a.inst_perms FROM user_inst AS a " .
                "LEFT JOIN user_inst AS b USING (Institut_id) " .
                "WHERE a.user_id = ? AND a.inst_perms = 'admin' " .
                "  AND b.user_id = ? AND b.inst_perms IN ('autor', 'tutor', 'dozent')");
            $stmt->execute([$user_id, $range_id]);

            if ($stmt->fetchColumn()) {
                $status = 'admin';
            } else if ($this->is_fak_admin($user_id)) {
                $stmt = $db->prepare("SELECT a.inst_perms FROM user_inst a " .
                    "LEFT JOIN Institute i ON a.Institut_id = i.fakultaets_id " .
                    "LEFT JOIN user_inst b ON b.Institut_id = i.Institut_id " .
                    "WHERE a.user_id = ? AND a.inst_perms = 'admin' " .
                    "  AND b.user_id = ? AND b.inst_perms != 'user'");
                $stmt->execute([$user_id, $range_id]);

                if ($stmt->fetchColumn()) {
                    $status = 'admin';
                }
            }
        }

        return $status;
    }

    /**
     * @param $perm
     * @param $range_id
     * @param bool $user_id
     * @return bool
     */
    public function have_profile_perm($perm, $range_id, $user_id = false)
    {

Moritz Strohm's avatar
Moritz Strohm committed
        $pageperm = $this->permissions[$perm] ?? 0;
        $userperm = $this->permissions[$this->get_profile_perm($range_id, $user_id)] ?? 0;
    }

    /**
     * @param bool $user_id
     * @return bool
     */
    public function is_fak_admin($user_id = false)
    {
        global $user;
        if (!$user_id) $user_id = $user->id;
        $user_perm = $this->get_perm($user_id);
        if ($user_perm == "root") {
            return true;
        }
        if ($user_perm != "admin") {
            return false;
        }
        if (isset($this->fak_admins[$user_id])) {
            return $this->fak_admins[$user_id];
        } else {
            $db = DBManager::get();
            $st = $db->prepare("SELECT a.Institut_id FROM user_inst a
                          LEFT JOIN Institute b ON(a.Institut_id=b.Institut_id AND b.Institut_id=b.fakultaets_id)
                          WHERE a.user_id = ? AND a.inst_perms='admin' AND NOT ISNULL(b.Institut_id) LIMIT 1");
            $st->execute([$user_id]);
            return $this->fak_admins[$user_id] = (bool)$st->fetchColumn();
        }
    }

    /**
     * @param bool $user_id
     * @return bool
     */
    public function is_staff_member($user_id = false)
    {
        global $user;
        if (!$user_id) $user_id = $user->id;
        $user_perm = $this->get_perm($user_id);
        if ($user_perm == "root") {
            return true;
        }
        if (!$this->have_perm('autor', $user_id)) {
            return false;
        }
        $db = DBManager::get();
        $st = $db->prepare("SELECT 1 FROM user_inst
                            WHERE user_id = ? AND inst_perms <> 'user' LIMIT 1");
        $st->execute([$user_id]);
        return (bool)$st->fetchColumn();
    }
}