This repository has been archived on 2024-06-26. You can view files and clone it, but cannot push or open issues or pull requests.
sakura/app/Perms.php

153 lines
3.5 KiB
PHP
Raw Normal View History

2015-12-29 01:27:49 +00:00
<?php
2016-02-03 22:22:56 +00:00
/**
* Holds the global permissions handler.
* @package Sakura
*/
2015-12-29 01:27:49 +00:00
namespace Sakura;
/**
2016-02-02 21:04:15 +00:00
* Global permissions handler.
2015-12-29 01:27:49 +00:00
* @package Sakura
2016-02-02 21:04:15 +00:00
* @author Julian van de Groep <me@flash.moe>
2015-12-29 01:27:49 +00:00
*/
class Perms
{
2016-02-02 21:04:15 +00:00
/**
* SITE permission mode, used for general permissions.
*/
2015-12-29 21:52:19 +00:00
const SITE = 'permissions\permissions_site';
2016-02-02 21:04:15 +00:00
/**
* MANAGE permission mode, used for site management actions.
*/
2015-12-29 21:52:19 +00:00
const MANAGE = 'permissions\permissions_manage';
2016-02-02 21:04:15 +00:00
/**
* FORUM permission mode, used per forum.
*/
2016-01-03 21:19:37 +00:00
const FORUM = 'forum_permissions\forum_perms';
2015-12-29 01:27:49 +00:00
2016-02-02 21:04:15 +00:00
/**
* The table containing the permissions.
* @var string
*/
2015-12-29 01:27:49 +00:00
protected $table = '';
2016-02-02 21:04:15 +00:00
/**
* The column containing the permissions.
* @var string
*/
2015-12-29 01:27:49 +00:00
protected $column = '';
2016-02-02 21:04:15 +00:00
/**
* Constructor.
2016-08-05 02:35:37 +00:00
* @param string $mode
2016-02-02 21:04:15 +00:00
*/
2015-12-29 21:52:19 +00:00
public function __construct($mode)
{
$this->mode($mode);
}
2016-02-02 21:04:15 +00:00
/**
* Set a permission mode.
2016-08-05 02:35:37 +00:00
* @param string $mode
2016-02-02 21:04:15 +00:00
*/
public function mode($mode)
{
2015-12-29 01:27:49 +00:00
// Split the mode variable
$mode = explode('\\', $mode);
// Assign $table, $column and $selectors
$this->table = $mode[0];
$this->column = $mode[1];
}
2016-02-02 21:04:15 +00:00
/**
* Compare a permission flag.
2016-08-05 02:35:37 +00:00
* @param int $flag
* @param int $perm
* @return bool
2016-02-02 21:04:15 +00:00
*/
2015-12-29 21:52:19 +00:00
public function check($flag, $perm)
{
return ($flag & $perm) > 0;
}
2016-02-02 21:04:15 +00:00
/**
* Get the permissions from a rank.
2016-08-05 02:35:37 +00:00
* @param int $rid
* @param array $conditions
* @param int $perm
* @return int
2016-02-02 21:04:15 +00:00
*/
2015-12-29 21:52:19 +00:00
public function rank($rid, $conditions = [], $perm = 0)
{
2016-02-18 23:28:44 +00:00
// Build statement
$get = DB::table($this->table)
->where('rank_id', $rid)
->where('user_id', 0);
2016-02-18 23:28:44 +00:00
// Append additional conditionals (DBWrapper v1 format, except OR is ignored)
foreach ($conditions as $column => $value) {
$get->where($column, $value[1], $value[0]);
2016-02-18 23:28:44 +00:00
}
2015-12-29 21:52:19 +00:00
// Fetch from the db
2016-09-16 19:57:51 +00:00
$get = $get->first();
2015-12-29 21:52:19 +00:00
// Check if anything was returned
if ($get) {
2016-09-16 19:57:51 +00:00
if (property_exists($get, $this->column) && $get->rank_id) {
// Perform a bitwise OR
2016-09-16 19:57:51 +00:00
$perm = $perm | bindec((string) $get->{$this->column});
}
2015-12-29 21:52:19 +00:00
}
// Return the value
return $perm;
2015-12-29 01:27:49 +00:00
}
2016-02-02 21:04:15 +00:00
/**
* Get the permissions from a user.
2016-08-05 02:35:37 +00:00
* @param int $uid
* @param array $conditions
* @param int $perm
* @return int
2016-02-02 21:04:15 +00:00
*/
2015-12-29 21:52:19 +00:00
public function user($uid, $conditions = [], $perm = 0)
{
// Create a user object
$user = User::construct($uid);
// Get data from ranks
2016-01-17 01:58:31 +00:00
foreach (array_keys($user->ranks) as $rank) {
2015-12-29 21:52:19 +00:00
$perm = $perm | $this->rank($rank, $conditions, $perm);
}
2016-02-18 23:28:44 +00:00
// Build statement
$get = DB::table($this->table)
->where('rank_id', 0)
->where('user_id', $uid);
2016-02-18 23:28:44 +00:00
// Append additional conditionals (DBWrapper v1 format, except OR is ignored)
foreach ($conditions as $column => $value) {
$get->where($column, $value[1], $value[0]);
2016-02-18 23:28:44 +00:00
}
2015-12-29 21:52:19 +00:00
// Fetch from the db
2016-09-16 19:57:51 +00:00
$get = $get->first();
2015-12-29 21:52:19 +00:00
// Check if anything was returned
if ($get) {
2016-09-16 19:57:51 +00:00
if (property_exists($get, $this->column) && $get->user_id) {
// Perform a bitwise OR
2016-09-16 19:57:51 +00:00
$perm = $perm | bindec((string) $get->{$this->column});
}
2015-12-29 21:52:19 +00:00
}
// Return the value
return $perm;
2015-12-29 01:27:49 +00:00
}
}