141 lines
3.0 KiB
PHP
141 lines
3.0 KiB
PHP
|
<?php
|
||
|
namespace ShortPixel\Model;
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit; // Exit if accessed directly.
|
||
|
}
|
||
|
|
||
|
use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
|
||
|
use ShortPixel\Controller\QuotaController as QuotaController;
|
||
|
|
||
|
// Central place for user / access checking, roles etc.
|
||
|
class AccessModel
|
||
|
{
|
||
|
|
||
|
// Instance of class
|
||
|
private static $instance;
|
||
|
|
||
|
// Array of known SPIO Capabilities mapped to WordPress variants
|
||
|
private $caps;
|
||
|
|
||
|
// int . The current user id
|
||
|
private $current_user_id;
|
||
|
|
||
|
|
||
|
public function __construct()
|
||
|
{
|
||
|
$this->setDefaultPermissions();
|
||
|
}
|
||
|
|
||
|
protected function setDefaultPermissions()
|
||
|
{
|
||
|
|
||
|
$spioCaps = array(
|
||
|
'notices' => 'activate_plugins', // used in AdminNoticesController
|
||
|
'quota-warning' => 'manage_options', // used in AdminController
|
||
|
'image_all' => 'edit_others_posts',
|
||
|
'image_user' => 'edit_post',
|
||
|
'custom_all' => 'edit_others_posts',
|
||
|
'is_admin_user' => 'manage_options',
|
||
|
'actions' => array(),
|
||
|
);
|
||
|
|
||
|
$spioCaps = apply_filters('shortpixel/init/permissions', $spioCaps);
|
||
|
// $this->cap_actions = bla.
|
||
|
$this->caps = $spioCaps;
|
||
|
|
||
|
}
|
||
|
|
||
|
public static function getInstance()
|
||
|
{
|
||
|
if (is_null(self::$instance))
|
||
|
{
|
||
|
self::$instance = new AccessModel();
|
||
|
}
|
||
|
|
||
|
return self::$instance;
|
||
|
}
|
||
|
|
||
|
/** Check for allowing a notice
|
||
|
* @param $notice Object of type notice.
|
||
|
*/
|
||
|
public function noticeIsAllowed($notice)
|
||
|
{
|
||
|
$cap = $this->getCap('notices');
|
||
|
return $this->user()->has_cap($cap);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
@param SPIO capability to check again the user WordPress permissions.
|
||
|
*/
|
||
|
public function userIsAllowed($cap)
|
||
|
{
|
||
|
$cap = $this->getCap($cap);
|
||
|
return $this->user()->has_cap($cap);
|
||
|
}
|
||
|
|
||
|
public function imageIsEditable($mediaItem)
|
||
|
{
|
||
|
$type = $mediaItem->get('type');
|
||
|
if ($type == 'custom' )
|
||
|
{
|
||
|
return $this->user()->has_cap($this->getCap('custom_all'), $mediaItem->get('id'));
|
||
|
}
|
||
|
elseif ($type == 'media') // media
|
||
|
{
|
||
|
if ($this->user()->has_cap($this->getCap('image_all'), $mediaItem->get('id')) || $this->user()->has_cap($this->getCap('image_user'), $mediaItem->get('id')) )
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public function isFeatureAvailable($name)
|
||
|
{
|
||
|
$available = true;
|
||
|
|
||
|
switch($name)
|
||
|
{
|
||
|
case 'avif':
|
||
|
$quotaControl = QuotaController::getInstance();
|
||
|
$quota = $quotaControl->getQuota();
|
||
|
|
||
|
if (property_exists($quota, 'unlimited') && $quota->unlimited === true)
|
||
|
{
|
||
|
$available = false;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 'webp':
|
||
|
default:
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
return $available;
|
||
|
}
|
||
|
|
||
|
|
||
|
protected function user()
|
||
|
{
|
||
|
return wp_get_current_user();
|
||
|
}
|
||
|
|
||
|
/** Find the needed capability
|
||
|
*
|
||
|
* This translates a SPIO capability into the associated cap that is registered within WordPress.
|
||
|
*
|
||
|
* @param $cap The required Capability
|
||
|
* @param $default The default value if not found. This is defaults to an admin cap to prevent access leaking.
|
||
|
*/
|
||
|
protected function getCap($cap, $default = 'manage_options')
|
||
|
{
|
||
|
if (isset($this->caps[$cap]))
|
||
|
return $this->caps[$cap];
|
||
|
else
|
||
|
return $default;
|
||
|
}
|
||
|
|
||
|
|
||
|
} // CLASS
|