2014-08-05 13:06:38 -07:00
|
|
|
<?php
|
|
|
|
|
namespace Grav\Plugin;
|
|
|
|
|
|
2016-05-10 13:32:17 -06:00
|
|
|
use DateTime;
|
2015-08-11 18:30:27 -06:00
|
|
|
use Grav\Common\Data;
|
2014-10-07 12:12:21 +03:00
|
|
|
use Grav\Common\File\CompiledYamlFile;
|
2015-08-11 18:30:27 -06:00
|
|
|
use Grav\Common\GPM\GPM;
|
2014-08-05 13:06:38 -07:00
|
|
|
use Grav\Common\Grav;
|
2015-08-17 18:22:15 -06:00
|
|
|
use Grav\Common\Language\LanguageCodes;
|
2015-08-11 18:30:27 -06:00
|
|
|
use Grav\Common\Page\Page;
|
|
|
|
|
use Grav\Common\Page\Pages;
|
2014-08-05 13:06:38 -07:00
|
|
|
use Grav\Common\Plugins;
|
|
|
|
|
use Grav\Common\Themes;
|
|
|
|
|
use Grav\Common\Uri;
|
2015-08-11 18:30:27 -06:00
|
|
|
use Grav\Common\User\User;
|
2015-11-21 16:15:23 +01:00
|
|
|
use Grav\Common\Utils;
|
2014-10-01 22:28:16 +03:00
|
|
|
use RocketTheme\Toolbox\File\File;
|
2015-04-27 13:37:22 +02:00
|
|
|
use RocketTheme\Toolbox\File\JsonFile;
|
2016-01-22 21:52:25 +02:00
|
|
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceIterator;
|
2014-10-07 12:12:21 +03:00
|
|
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
2014-10-01 22:28:16 +03:00
|
|
|
use RocketTheme\Toolbox\Session\Message;
|
|
|
|
|
use RocketTheme\Toolbox\Session\Session;
|
2014-09-26 14:10:32 +03:00
|
|
|
use Symfony\Component\Yaml\Yaml;
|
2014-08-05 13:06:38 -07:00
|
|
|
|
2015-07-28 11:11:43 -06:00
|
|
|
define('LOGIN_REDIRECT_COOKIE', 'grav-login-redirect');
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
class Admin
|
|
|
|
|
{
|
2014-08-29 11:27:53 +03:00
|
|
|
/**
|
|
|
|
|
* @var Grav
|
|
|
|
|
*/
|
|
|
|
|
public $grav;
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
/**
|
|
|
|
|
* @var Uri $uri
|
|
|
|
|
*/
|
|
|
|
|
protected $uri;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var array
|
|
|
|
|
*/
|
|
|
|
|
protected $pages = array();
|
|
|
|
|
|
|
|
|
|
/**
|
2014-10-01 22:28:16 +03:00
|
|
|
* @var Session
|
2014-08-05 13:06:38 -07:00
|
|
|
*/
|
|
|
|
|
protected $session;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var Data\Blueprints
|
|
|
|
|
*/
|
|
|
|
|
protected $blueprints;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
public $base;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
public $location;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
public $route;
|
|
|
|
|
|
|
|
|
|
/**
|
2014-09-09 06:10:31 +03:00
|
|
|
* @var User
|
2014-08-05 13:06:38 -07:00
|
|
|
*/
|
|
|
|
|
public $user;
|
|
|
|
|
|
2015-08-14 15:05:33 +02:00
|
|
|
/**
|
2016-01-21 09:46:38 +02:00
|
|
|
* @var GPM
|
2014-10-02 12:14:13 -07:00
|
|
|
*/
|
2015-04-04 14:49:40 +02:00
|
|
|
protected $gpm;
|
2014-10-02 12:14:13 -07:00
|
|
|
|
2016-01-28 14:03:53 +01:00
|
|
|
/**
|
|
|
|
|
* @var int
|
|
|
|
|
*/
|
|
|
|
|
protected $pages_count;
|
|
|
|
|
|
2016-05-04 14:26:27 -06:00
|
|
|
/**
|
|
|
|
|
* @var Array
|
|
|
|
|
*/
|
|
|
|
|
protected $permissions;
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
/**
|
|
|
|
|
* Constructor.
|
|
|
|
|
*
|
2014-08-29 11:27:53 +03:00
|
|
|
* @param Grav $grav
|
2014-08-05 13:06:38 -07:00
|
|
|
* @param string $base
|
|
|
|
|
* @param string $location
|
|
|
|
|
* @param string $route
|
|
|
|
|
*/
|
2014-08-29 11:27:53 +03:00
|
|
|
public function __construct(Grav $grav, $base, $location, $route)
|
2014-08-05 13:06:38 -07:00
|
|
|
{
|
2014-08-29 11:27:53 +03:00
|
|
|
$this->grav = $grav;
|
2014-08-05 13:06:38 -07:00
|
|
|
$this->base = $base;
|
|
|
|
|
$this->location = $location;
|
|
|
|
|
$this->route = $route;
|
2014-08-29 11:27:53 +03:00
|
|
|
$this->uri = $this->grav['uri'];
|
2014-09-09 06:10:31 +03:00
|
|
|
$this->session = $this->grav['session'];
|
|
|
|
|
$this->user = $this->grav['user'];
|
2016-05-04 14:26:27 -06:00
|
|
|
$this->permissions = [];
|
2015-08-14 19:12:04 +02:00
|
|
|
$language = $this->grav['language'];
|
2015-08-18 21:07:11 +02:00
|
|
|
|
2015-08-14 19:12:04 +02:00
|
|
|
if ($language->enabled()) {
|
|
|
|
|
$this->multilang = true;
|
|
|
|
|
$this->languages_enabled = $this->grav['config']->get('system.languages.supported', []);
|
|
|
|
|
|
|
|
|
|
//Set the currently active language for the admin
|
|
|
|
|
$language = $this->grav['uri']->param('lang');
|
|
|
|
|
if (!$language) {
|
2016-04-25 10:18:24 +02:00
|
|
|
if (!$this->session->admin_lang) {
|
2016-05-03 13:36:06 -06:00
|
|
|
$this->session->admin_lang = $this->grav['language']->getLanguage();
|
2016-04-25 10:18:24 +02:00
|
|
|
}
|
2015-08-14 19:12:04 +02:00
|
|
|
$language = $this->session->admin_lang;
|
|
|
|
|
}
|
|
|
|
|
$this->grav['language']->setActive($language ?: 'en');
|
|
|
|
|
} else {
|
|
|
|
|
$this->grav['language']->setActive('en');
|
|
|
|
|
$this->multilang = false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get current session.
|
|
|
|
|
*
|
2014-10-01 22:28:16 +03:00
|
|
|
* @return Session
|
2014-08-05 13:06:38 -07:00
|
|
|
*/
|
|
|
|
|
public function session()
|
|
|
|
|
{
|
|
|
|
|
return $this->session;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add message into the session queue.
|
|
|
|
|
*
|
|
|
|
|
* @param string $msg
|
|
|
|
|
* @param string $type
|
|
|
|
|
*/
|
|
|
|
|
public function setMessage($msg, $type = 'info')
|
|
|
|
|
{
|
2014-10-01 22:28:16 +03:00
|
|
|
/** @var Message $messages */
|
2014-09-09 06:10:31 +03:00
|
|
|
$messages = $this->grav['messages'];
|
2014-08-05 13:06:38 -07:00
|
|
|
$messages->add($msg, $type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Fetch and delete messages from the session queue.
|
|
|
|
|
*
|
|
|
|
|
* @param string $type
|
2015-08-11 18:30:27 -06:00
|
|
|
*
|
2014-09-09 06:10:31 +03:00
|
|
|
* @return array
|
2014-08-05 13:06:38 -07:00
|
|
|
*/
|
|
|
|
|
public function messages($type = null)
|
|
|
|
|
{
|
2014-10-01 22:28:16 +03:00
|
|
|
/** @var Message $messages */
|
2014-09-09 06:10:31 +03:00
|
|
|
$messages = $this->grav['messages'];
|
2015-08-11 18:30:27 -06:00
|
|
|
|
2014-09-09 06:10:31 +03:00
|
|
|
return $messages->fetch($type);
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Authenticate user.
|
|
|
|
|
*
|
2016-04-07 13:09:22 +02:00
|
|
|
* @param array $data Form data.
|
|
|
|
|
* @param array $post Additional form fields.
|
2015-08-11 18:30:27 -06:00
|
|
|
*
|
2014-08-05 13:06:38 -07:00
|
|
|
* @return bool
|
|
|
|
|
*/
|
2016-04-07 13:09:22 +02:00
|
|
|
public function authenticate($data, $post)
|
2014-08-05 13:06:38 -07:00
|
|
|
{
|
2016-04-07 13:09:22 +02:00
|
|
|
if (!$this->user->authenticated && isset($data['username']) && isset($data['password'])) {
|
|
|
|
|
$user = User::load($data['username']);
|
2015-08-20 11:29:37 -06:00
|
|
|
|
|
|
|
|
//default to english if language not set
|
|
|
|
|
if (empty($user->language)) {
|
|
|
|
|
$user->set('language', 'en');
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-11 17:47:37 +02:00
|
|
|
if ($user->exists()) {
|
2014-09-09 06:10:31 +03:00
|
|
|
$user->authenticated = true;
|
2014-08-05 13:06:38 -07:00
|
|
|
|
|
|
|
|
// Authenticate user.
|
2016-04-07 13:09:22 +02:00
|
|
|
$result = $user->authenticate($data['password']);
|
2014-08-05 13:06:38 -07:00
|
|
|
|
|
|
|
|
if ($result) {
|
|
|
|
|
$this->user = $this->session->user = $user;
|
|
|
|
|
|
|
|
|
|
/** @var Grav $grav */
|
2014-08-29 11:27:53 +03:00
|
|
|
$grav = $this->grav;
|
2015-07-28 11:11:43 -06:00
|
|
|
|
2016-05-03 13:36:06 -06:00
|
|
|
unset($this->grav['user']);
|
|
|
|
|
$this->grav['user'] = $user;
|
|
|
|
|
|
2016-01-28 14:38:01 +01:00
|
|
|
$this->setMessage($this->translate('PLUGIN_ADMIN.LOGIN_LOGGED_IN'), 'info');
|
2016-04-07 13:09:22 +02:00
|
|
|
$grav->redirect($post['redirect']);
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-11 15:00:03 +02:00
|
|
|
return $this->authorize();
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Checks user authorisation to the action.
|
|
|
|
|
*
|
2015-08-11 18:30:27 -06:00
|
|
|
* @param string $action
|
|
|
|
|
*
|
2014-08-05 13:06:38 -07:00
|
|
|
* @return bool
|
|
|
|
|
*/
|
2015-09-11 15:00:03 +02:00
|
|
|
public function authorize($action = 'admin.login')
|
2014-08-05 13:06:38 -07:00
|
|
|
{
|
2015-08-11 18:30:27 -06:00
|
|
|
$action = (array)$action;
|
2015-05-11 16:35:23 +02:00
|
|
|
|
|
|
|
|
foreach ($action as $a) {
|
2015-09-11 15:00:03 +02:00
|
|
|
if ($this->user->authorize($a)) {
|
2015-05-11 16:35:23 +02:00
|
|
|
return true;
|
2015-08-11 18:30:27 -06:00
|
|
|
}
|
2015-05-11 16:35:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns edited page.
|
|
|
|
|
*
|
|
|
|
|
* @param bool $route
|
2015-08-11 18:30:27 -06:00
|
|
|
*
|
2014-08-05 13:06:38 -07:00
|
|
|
* @return Page
|
|
|
|
|
*/
|
2016-05-26 14:49:45 -06:00
|
|
|
public function page($route = false, $path = null)
|
2014-08-05 13:06:38 -07:00
|
|
|
{
|
2016-05-26 14:49:45 -06:00
|
|
|
if (!$path) {
|
|
|
|
|
$path = $this->route;
|
|
|
|
|
}
|
2014-08-05 13:06:38 -07:00
|
|
|
|
|
|
|
|
if ($route && !$path) {
|
|
|
|
|
$path = '/';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isset($this->pages[$path])) {
|
|
|
|
|
$this->pages[$path] = $this->getPage($path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this->pages[$path];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns blueprints for the given type.
|
|
|
|
|
*
|
|
|
|
|
* @param string $type
|
2015-08-11 18:30:27 -06:00
|
|
|
*
|
2014-08-05 13:06:38 -07:00
|
|
|
* @return Data\Blueprint
|
|
|
|
|
*/
|
|
|
|
|
public function blueprints($type)
|
|
|
|
|
{
|
|
|
|
|
if ($this->blueprints === null) {
|
2015-08-20 11:58:14 +03:00
|
|
|
$this->blueprints = new Data\Blueprints('blueprints://');
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
2015-08-11 18:30:27 -06:00
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
return $this->blueprints->get($type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets configuration data.
|
|
|
|
|
*
|
|
|
|
|
* @param string $type
|
2015-08-11 18:30:27 -06:00
|
|
|
* @param array $post
|
|
|
|
|
*
|
2014-08-05 13:06:38 -07:00
|
|
|
* @return Data\Data|null
|
|
|
|
|
* @throws \RuntimeException
|
|
|
|
|
*/
|
2016-03-16 11:09:48 +02:00
|
|
|
public function data($type, array $post = [])
|
2014-08-05 13:06:38 -07:00
|
|
|
{
|
2014-10-10 13:26:39 +03:00
|
|
|
static $data = [];
|
2014-08-05 13:06:38 -07:00
|
|
|
|
|
|
|
|
if (isset($data[$type])) {
|
|
|
|
|
return $data[$type];
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-10 13:26:39 +03:00
|
|
|
if (!$post) {
|
2016-03-16 11:09:48 +02:00
|
|
|
$post = isset($_POST['data']) ? $_POST['data'] : [];
|
2014-10-10 13:26:39 +03:00
|
|
|
}
|
|
|
|
|
|
2016-05-26 14:49:45 -06:00
|
|
|
/** @var UniformResourceLocator $locator */
|
|
|
|
|
$locator = $this->grav['locator'];
|
|
|
|
|
$filename = $locator->findResource("config://{$type}.yaml", true, true);
|
|
|
|
|
$file = CompiledYamlFile::instance($filename);
|
|
|
|
|
|
|
|
|
|
if (preg_match('|plugins/|', $type)) {
|
|
|
|
|
/** @var Plugins $plugins */
|
|
|
|
|
$plugins = $this->grav['plugins'];
|
|
|
|
|
$obj = $plugins->get(preg_replace('|plugins/|', '', $type));
|
|
|
|
|
|
|
|
|
|
if (!$obj) { return []; }
|
|
|
|
|
|
|
|
|
|
$obj->merge($post);
|
|
|
|
|
$obj->file($file);
|
|
|
|
|
|
|
|
|
|
$data[$type] = $obj;
|
|
|
|
|
} elseif (preg_match('|themes/|', $type)) {
|
|
|
|
|
/** @var Themes $themes */
|
|
|
|
|
$themes = $this->grav['themes'];
|
|
|
|
|
$obj = $themes->get(preg_replace('|themes/|', '', $type));
|
|
|
|
|
|
|
|
|
|
if (!$obj) { return []; }
|
|
|
|
|
|
|
|
|
|
$obj->merge($post);
|
|
|
|
|
$obj->file($file);
|
|
|
|
|
|
|
|
|
|
$data[$type] = $obj;
|
|
|
|
|
} elseif (preg_match('|users/|', $type)) {
|
|
|
|
|
$obj = User::load(preg_replace('|users/|', '', $type));
|
|
|
|
|
$obj->merge($post);
|
|
|
|
|
|
|
|
|
|
$data[$type] = $obj;
|
|
|
|
|
} elseif (preg_match('|user/|', $type)) {
|
|
|
|
|
$obj = User::load(preg_replace('|user/|', '', $type));
|
|
|
|
|
$obj->merge($post);
|
|
|
|
|
|
|
|
|
|
$data[$type] = $obj;
|
|
|
|
|
} elseif (preg_match('|config/|', $type)) {
|
|
|
|
|
$type = preg_replace('|config/|', '', $type);
|
|
|
|
|
$blueprints = $this->blueprints("config/{$type}");
|
|
|
|
|
$config = $this->grav['config'];
|
|
|
|
|
$obj = new Data\Data($config->get($type, []), $blueprints);
|
|
|
|
|
$obj->merge($post);
|
|
|
|
|
// FIXME: We shouldn't allow user to change configuration files in system folder!
|
|
|
|
|
$filename = $this->grav['locator']->findResource("config://{$type}.yaml")
|
|
|
|
|
?: $this->grav['locator']->findResource("config://{$type}.yaml", true, true);
|
|
|
|
|
$file = CompiledYamlFile::instance($filename);
|
|
|
|
|
$obj->file($file);
|
|
|
|
|
$data[$type] = $obj;
|
|
|
|
|
} else {
|
|
|
|
|
throw new \RuntimeException("Data type '{$type}' doesn't exist!");
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $data[$type];
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-30 11:22:24 +02:00
|
|
|
/**
|
|
|
|
|
* Get the GPM instance
|
|
|
|
|
*
|
|
|
|
|
* @return GPM The GPM instance
|
|
|
|
|
*/
|
2015-04-04 14:49:40 +02:00
|
|
|
public function gpm()
|
|
|
|
|
{
|
|
|
|
|
if (!$this->gpm) {
|
2015-09-01 18:14:54 +02:00
|
|
|
try {
|
2016-03-26 18:06:28 +01:00
|
|
|
$this->gpm = new GPM();
|
2015-09-01 18:14:54 +02:00
|
|
|
} catch (\Exception $e) {}
|
2015-04-04 14:49:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this->gpm;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
/**
|
|
|
|
|
* Converts dot notation to array notation.
|
|
|
|
|
*
|
|
|
|
|
* @param string $name
|
2015-08-11 18:30:27 -06:00
|
|
|
*
|
2014-08-05 13:06:38 -07:00
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function field($name)
|
|
|
|
|
{
|
|
|
|
|
$path = explode('.', $name);
|
|
|
|
|
|
|
|
|
|
return array_shift($path) . ($path ? '[' . implode('][', $path) . ']' : '');
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-05 22:27:30 -06:00
|
|
|
/**
|
|
|
|
|
* Get all routes.
|
|
|
|
|
*
|
2016-01-28 14:38:01 +01:00
|
|
|
* @param bool $unique
|
|
|
|
|
*
|
2014-09-05 22:27:30 -06:00
|
|
|
* @return array
|
|
|
|
|
*/
|
2015-08-20 14:55:24 -06:00
|
|
|
public function routes($unique = false)
|
2014-09-05 22:27:30 -06:00
|
|
|
{
|
2014-10-01 22:28:16 +03:00
|
|
|
/** @var Pages $pages */
|
|
|
|
|
$pages = $this->grav['pages'];
|
2015-08-11 18:30:27 -06:00
|
|
|
|
2015-08-20 14:55:24 -06:00
|
|
|
if ($unique) {
|
|
|
|
|
$routes = array_unique($pages->routes());
|
|
|
|
|
} else {
|
|
|
|
|
$routes = $pages->routes();
|
|
|
|
|
}
|
|
|
|
|
return $routes;
|
2014-09-05 22:27:30 -06:00
|
|
|
}
|
2015-10-20 19:32:33 +02:00
|
|
|
|
2015-10-02 11:47:26 +02:00
|
|
|
/**
|
|
|
|
|
* Count the pages
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
2016-01-28 14:03:53 +01:00
|
|
|
public function pagesCount()
|
2015-10-02 11:47:26 +02:00
|
|
|
{
|
2016-01-28 14:03:53 +01:00
|
|
|
if (!$this->pages_count) {
|
|
|
|
|
$this->pages_count = count($this->grav['pages']->all());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this->pages_count;
|
2015-10-02 11:47:26 +02:00
|
|
|
}
|
2014-09-05 22:27:30 -06:00
|
|
|
|
2015-09-08 11:13:52 -06:00
|
|
|
/**
|
2015-10-21 18:41:49 +02:00
|
|
|
* Get all template types
|
2015-09-08 11:31:39 -06:00
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function types()
|
|
|
|
|
{
|
|
|
|
|
return Pages::types();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2015-10-21 18:41:49 +02:00
|
|
|
* Get all modular template types
|
2015-09-08 11:13:52 -06:00
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function modularTypes()
|
|
|
|
|
{
|
|
|
|
|
return Pages::modularTypes();
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-21 18:41:49 +02:00
|
|
|
/**
|
|
|
|
|
* Get all access levels
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function accessLevels()
|
|
|
|
|
{
|
2015-11-30 19:00:12 +01:00
|
|
|
if (method_exists($this->grav['pages'], 'accessLevels')) {
|
|
|
|
|
return $this->grav['pages']->accessLevels();
|
|
|
|
|
} else {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
2015-10-21 18:41:49 +02:00
|
|
|
}
|
|
|
|
|
|
2014-09-05 22:27:30 -06:00
|
|
|
/**
|
|
|
|
|
* Get all plugins.
|
|
|
|
|
*
|
2016-01-28 14:38:01 +01:00
|
|
|
* @param bool $local
|
|
|
|
|
*
|
2014-09-05 22:27:30 -06:00
|
|
|
* @return array
|
|
|
|
|
*/
|
2015-04-04 14:49:40 +02:00
|
|
|
public function plugins($local = true)
|
2014-09-05 22:27:30 -06:00
|
|
|
{
|
2015-04-04 14:49:40 +02:00
|
|
|
$gpm = $this->gpm();
|
2015-08-11 18:30:27 -06:00
|
|
|
|
2015-09-13 20:27:01 +02:00
|
|
|
if (!$gpm) {
|
2016-01-21 09:46:38 +02:00
|
|
|
return false;
|
2015-09-13 20:27:01 +02:00
|
|
|
}
|
|
|
|
|
|
2015-08-11 18:30:27 -06:00
|
|
|
return $local ? $gpm->getInstalledPlugins() : $gpm->getRepositoryPlugins()->filter(function (
|
|
|
|
|
$package,
|
|
|
|
|
$slug
|
|
|
|
|
) use ($gpm) {
|
2015-04-04 14:49:40 +02:00
|
|
|
return !$gpm->isPluginInstalled($slug);
|
|
|
|
|
});
|
2014-10-03 15:40:58 -06:00
|
|
|
}
|
|
|
|
|
|
2016-03-05 18:46:41 +01:00
|
|
|
public function getPackageFromGPM($package_slug)
|
2016-03-04 19:20:57 +01:00
|
|
|
{
|
|
|
|
|
$package = $this->plugins(true)[$package_slug];
|
|
|
|
|
if (!$package) {
|
|
|
|
|
$package = $this->themes(true)[$package_slug];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $package;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-01 19:52:24 +01:00
|
|
|
/**
|
2016-03-07 11:31:18 +01:00
|
|
|
* Generate an array of dependencies for a package, used to generate a list of
|
|
|
|
|
* packages that can be removed when removing a package.
|
2016-03-01 19:52:24 +01:00
|
|
|
*
|
2016-03-04 19:20:48 +01:00
|
|
|
* @param string $slug The package slug
|
2016-03-01 19:52:24 +01:00
|
|
|
*
|
|
|
|
|
* @return array|bool
|
|
|
|
|
*/
|
2016-03-05 18:46:41 +01:00
|
|
|
public function dependenciesThatCanBeRemovedWhenRemoving($slug)
|
2016-03-01 19:52:24 +01:00
|
|
|
{
|
|
|
|
|
$gpm = $this->gpm();
|
|
|
|
|
if (!$gpm) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-05 18:46:41 +01:00
|
|
|
$dependencies = [];
|
|
|
|
|
|
2016-03-04 19:20:57 +01:00
|
|
|
$package = $this->getPackageFromGPM($slug);
|
2016-03-01 19:52:24 +01:00
|
|
|
|
|
|
|
|
if ($package) {
|
|
|
|
|
if ($package->dependencies) {
|
|
|
|
|
foreach ($package->dependencies as $dependency) {
|
2016-03-04 19:20:48 +01:00
|
|
|
if (count($gpm->getPackagesThatDependOnPackage($dependency)) > 1) {
|
|
|
|
|
continue;
|
2016-03-01 19:52:24 +01:00
|
|
|
}
|
|
|
|
|
|
2016-03-04 19:20:48 +01:00
|
|
|
if (!in_array($dependency, $dependencies)) {
|
2016-05-27 14:41:33 +02:00
|
|
|
if (!in_array($dependency, ['admin', 'form', 'login', 'email'])) {
|
|
|
|
|
$dependencies[] = $dependency;
|
|
|
|
|
}
|
2016-03-04 19:20:48 +01:00
|
|
|
}
|
2016-03-01 19:52:24 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $dependencies;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-17 15:57:10 +01:00
|
|
|
/**
|
|
|
|
|
* Get list of packages that depend on the passed package slug
|
|
|
|
|
*
|
|
|
|
|
* @param string $slug The package slug
|
|
|
|
|
*
|
|
|
|
|
* @return array|bool
|
|
|
|
|
*/
|
|
|
|
|
public function getPackagesThatDependOnPackage($slug)
|
|
|
|
|
{
|
|
|
|
|
$gpm = $this->gpm();
|
|
|
|
|
if (!$gpm) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $gpm->getPackagesThatDependOnPackage($slug);
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-15 19:36:00 +01:00
|
|
|
/**
|
|
|
|
|
* Check the passed packages list can be updated
|
|
|
|
|
*
|
|
|
|
|
* @param $packages
|
|
|
|
|
*
|
|
|
|
|
* @throws \Exception
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
public function checkPackagesCanBeInstalled($packages)
|
|
|
|
|
{
|
|
|
|
|
$gpm = $this->gpm();
|
|
|
|
|
if (!$gpm) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->gpm->checkPackagesCanBeInstalled($packages);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-07 11:31:18 +01:00
|
|
|
/**
|
2016-03-09 19:40:23 +01:00
|
|
|
* Get an array of dependencies needed to be installed or updated for a list of packages
|
2016-03-07 11:31:18 +01:00
|
|
|
* to be installed.
|
|
|
|
|
*
|
2016-03-09 19:40:23 +01:00
|
|
|
* @param array $packages The packages slugs
|
2016-03-07 11:31:18 +01:00
|
|
|
*
|
|
|
|
|
* @return array|bool
|
|
|
|
|
*/
|
2016-03-09 19:40:23 +01:00
|
|
|
public function getDependenciesNeededToInstall($packages)
|
2016-03-07 11:31:18 +01:00
|
|
|
{
|
|
|
|
|
$gpm = $this->gpm();
|
|
|
|
|
if (!$gpm) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-09 19:40:23 +01:00
|
|
|
$dependencies = $this->gpm->getDependencies($packages);
|
|
|
|
|
|
2016-03-07 11:31:18 +01:00
|
|
|
return $dependencies;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-03 15:40:58 -06:00
|
|
|
/**
|
|
|
|
|
* Get all themes.
|
|
|
|
|
*
|
2016-01-28 15:07:54 +01:00
|
|
|
* @param bool $local
|
|
|
|
|
*
|
2014-10-03 15:40:58 -06:00
|
|
|
* @return array
|
|
|
|
|
*/
|
2015-04-04 14:49:40 +02:00
|
|
|
public function themes($local = true)
|
2014-10-03 15:40:58 -06:00
|
|
|
{
|
2015-04-04 14:49:40 +02:00
|
|
|
$gpm = $this->gpm();
|
2015-08-11 18:30:27 -06:00
|
|
|
|
2015-09-13 20:27:01 +02:00
|
|
|
if (!$gpm) {
|
2016-01-21 09:46:38 +02:00
|
|
|
return false;
|
2015-09-13 20:27:01 +02:00
|
|
|
}
|
2015-10-20 19:32:33 +02:00
|
|
|
|
2015-08-11 18:30:27 -06:00
|
|
|
return $local ? $gpm->getInstalledThemes() : $gpm->getRepositoryThemes()->filter(function ($package, $slug) use
|
|
|
|
|
(
|
|
|
|
|
$gpm
|
|
|
|
|
) {
|
2015-04-04 14:49:40 +02:00
|
|
|
return !$gpm->isThemeInstalled($slug);
|
|
|
|
|
});
|
2014-09-05 22:27:30 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Used by the Dashboard in the admin to display the X latest pages
|
|
|
|
|
* that have been modified
|
|
|
|
|
*
|
|
|
|
|
* @param integer $count number of pages to pull back
|
2015-08-11 18:30:27 -06:00
|
|
|
*
|
2016-01-21 09:46:38 +02:00
|
|
|
* @return array|null
|
2014-09-05 22:27:30 -06:00
|
|
|
*/
|
2014-10-02 12:14:13 -07:00
|
|
|
public function latestPages($count = 10)
|
2014-09-05 22:27:30 -06:00
|
|
|
{
|
2014-10-01 22:28:16 +03:00
|
|
|
/** @var Pages $pages */
|
|
|
|
|
$pages = $this->grav['pages'];
|
|
|
|
|
|
2014-09-05 22:27:30 -06:00
|
|
|
$latest = array();
|
2016-01-10 17:17:04 +01:00
|
|
|
|
2015-11-29 09:49:51 -05:00
|
|
|
if(is_null($pages->routes())){
|
2016-01-21 09:46:38 +02:00
|
|
|
return null;
|
2015-11-29 09:49:51 -05:00
|
|
|
}
|
2014-09-05 22:27:30 -06:00
|
|
|
|
2014-10-01 22:28:16 +03:00
|
|
|
foreach ($pages->routes() as $url => $path) {
|
2015-09-11 10:47:54 -06:00
|
|
|
$page = $pages->dispatch($url, true);
|
2014-12-10 10:23:22 -07:00
|
|
|
if ($page && $page->routable()) {
|
2015-08-11 18:30:27 -06:00
|
|
|
$latest[$page->route()] = ['modified' => $page->modified(), 'page' => $page];
|
2014-12-10 10:23:22 -07:00
|
|
|
}
|
2014-09-05 22:27:30 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// sort based on modified
|
2014-10-02 12:14:13 -07:00
|
|
|
uasort($latest, function ($a, $b) {
|
2014-09-05 22:27:30 -06:00
|
|
|
if ($a['modified'] == $b['modified']) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2015-08-11 18:30:27 -06:00
|
|
|
|
2014-09-05 22:27:30 -06:00
|
|
|
return ($a['modified'] > $b['modified']) ? -1 : 1;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// build new array with just pages in it
|
2014-10-01 22:28:16 +03:00
|
|
|
$list = array();
|
2014-09-05 22:27:30 -06:00
|
|
|
foreach ($latest as $item) {
|
2014-10-01 22:28:16 +03:00
|
|
|
$list[] = $item['page'];
|
2014-09-05 22:27:30 -06:00
|
|
|
}
|
|
|
|
|
|
2014-10-01 22:28:16 +03:00
|
|
|
return array_slice($list, 0, $count);
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get log file for fatal errors.
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function logEntry()
|
|
|
|
|
{
|
2015-01-11 00:47:27 +01:00
|
|
|
$file = File::instance($this->grav['locator']->findResource("log://{$this->route}.html"));
|
2014-08-05 13:06:38 -07:00
|
|
|
$content = $file->content();
|
|
|
|
|
|
|
|
|
|
return $content;
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-30 11:22:24 +02:00
|
|
|
/**
|
|
|
|
|
* Search in the logs when was the latest backup made
|
|
|
|
|
*
|
|
|
|
|
* @return array Array containing the latest backup information
|
|
|
|
|
*/
|
2015-04-27 13:37:22 +02:00
|
|
|
public function lastBackup()
|
|
|
|
|
{
|
|
|
|
|
$file = JsonFile::instance($this->grav['locator']->findResource("log://backup.log"));
|
|
|
|
|
$content = $file->content();
|
|
|
|
|
if (empty($content)) {
|
|
|
|
|
return [
|
2015-08-11 18:30:27 -06:00
|
|
|
'days' => '∞',
|
|
|
|
|
'chart_fill' => 100,
|
2015-04-27 13:37:22 +02:00
|
|
|
'chart_empty' => 0
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$backup = new \DateTime();
|
|
|
|
|
$backup->setTimestamp($content['time']);
|
|
|
|
|
$diff = $backup->diff(new \DateTime());
|
|
|
|
|
|
|
|
|
|
$days = $diff->days;
|
|
|
|
|
$chart_fill = $days > 30 ? 100 : round($days / 30 * 100);
|
|
|
|
|
|
|
|
|
|
return [
|
2015-08-11 18:30:27 -06:00
|
|
|
'days' => $days,
|
|
|
|
|
'chart_fill' => $chart_fill,
|
2015-04-27 13:37:22 +02:00
|
|
|
'chart_empty' => 100 - $chart_fill
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-26 12:13:07 +01:00
|
|
|
/**
|
|
|
|
|
* Returns the list of available backups
|
|
|
|
|
*
|
|
|
|
|
* @return array Array containing the latest backups
|
|
|
|
|
*/
|
|
|
|
|
public function backups()
|
|
|
|
|
{
|
2015-11-26 12:49:21 +01:00
|
|
|
return [];
|
2015-11-26 12:13:07 +01:00
|
|
|
}
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
/**
|
|
|
|
|
* Returns the page creating it if it does not exist.
|
|
|
|
|
*
|
|
|
|
|
* @param $path
|
2015-08-11 18:30:27 -06:00
|
|
|
*
|
2014-08-05 13:06:38 -07:00
|
|
|
* @return Page
|
|
|
|
|
*/
|
2015-09-11 12:22:15 -06:00
|
|
|
public function getPage($path)
|
2014-08-05 13:06:38 -07:00
|
|
|
{
|
|
|
|
|
/** @var Pages $pages */
|
2014-08-29 11:27:53 +03:00
|
|
|
$pages = $this->grav['pages'];
|
2014-08-05 13:06:38 -07:00
|
|
|
|
|
|
|
|
if ($path && $path[0] != '/') {
|
|
|
|
|
$path = "/{$path}";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$page = $path ? $pages->dispatch($path, true) : $pages->root();
|
|
|
|
|
|
|
|
|
|
if (!$page) {
|
|
|
|
|
$slug = basename($path);
|
2015-08-07 12:05:34 +02:00
|
|
|
|
|
|
|
|
if ($slug == '') {
|
2015-08-11 18:30:27 -06:00
|
|
|
return null;
|
2015-08-07 12:05:34 +02:00
|
|
|
}
|
|
|
|
|
|
2015-08-19 12:51:55 -06:00
|
|
|
$ppath = str_replace('\\', '/' , dirname($path));
|
2014-08-05 13:06:38 -07:00
|
|
|
|
|
|
|
|
// Find or create parent(s).
|
|
|
|
|
$parent = $this->getPage($ppath != '/' ? $ppath : '');
|
|
|
|
|
|
|
|
|
|
// Create page.
|
|
|
|
|
$page = new Page;
|
|
|
|
|
$page->parent($parent);
|
2015-08-11 18:30:27 -06:00
|
|
|
$page->filePath($parent->path() . '/' . $slug . '/' . $page->name());
|
2014-08-05 13:06:38 -07:00
|
|
|
|
2014-09-09 06:10:31 +03:00
|
|
|
// Add routing information.
|
2014-08-05 13:06:38 -07:00
|
|
|
$pages->addPage($page, $path);
|
|
|
|
|
|
2015-08-05 18:07:55 -06:00
|
|
|
// Set if Modular
|
|
|
|
|
$page->modularTwig($slug[0] == '_');
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
// Determine page type.
|
|
|
|
|
if (isset($this->session->{$page->route()})) {
|
2014-09-17 11:54:57 +03:00
|
|
|
// Found the type and header from the session.
|
|
|
|
|
$data = $this->session->{$page->route()};
|
2015-08-05 19:04:55 -06:00
|
|
|
|
2015-08-14 06:23:16 -06:00
|
|
|
$header = ['title' => $data['title']];
|
|
|
|
|
|
|
|
|
|
if (isset($data['visible'])) {
|
2015-08-14 14:28:24 -06:00
|
|
|
if ($data['visible'] == '' || $data['visible']) {
|
2015-08-14 06:23:16 -06:00
|
|
|
// if auto (ie '')
|
|
|
|
|
$children = $page->parent()->children();
|
|
|
|
|
foreach ($children as $child) {
|
|
|
|
|
if ($child->order()) {
|
|
|
|
|
// set page order
|
|
|
|
|
$page->order(1000);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-05-03 10:35:11 -06:00
|
|
|
if ($data['visible'] == 1 && !$page->order()) {
|
|
|
|
|
$header['visible'] = $data['visible'];
|
|
|
|
|
}
|
2015-08-14 06:23:16 -06:00
|
|
|
|
|
|
|
|
}
|
2015-08-05 19:04:55 -06:00
|
|
|
|
2015-08-29 10:43:58 -06:00
|
|
|
if ($data['name'] == 'modular') {
|
2015-08-05 19:04:55 -06:00
|
|
|
$header['body_classes'] = 'modular';
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-29 10:43:58 -06:00
|
|
|
$name = $page->modular() ? str_replace('modular/', '', $data['name']) : $data['name'];
|
2015-08-05 18:07:55 -06:00
|
|
|
$page->name($name . '.md');
|
2015-08-05 19:04:55 -06:00
|
|
|
$page->header($header);
|
2015-08-20 18:11:54 -06:00
|
|
|
$page->frontmatter(Yaml::dump((array)$page->header(), 10, 2, false));
|
2014-08-05 13:06:38 -07:00
|
|
|
} else {
|
|
|
|
|
// Find out the type by looking at the parent.
|
2015-08-11 18:30:27 -06:00
|
|
|
$type = $parent->childType() ? $parent->childType() : $parent->blueprints()->get('child_type',
|
|
|
|
|
'default');
|
|
|
|
|
$page->name($type . CONTENT_EXT);
|
2014-09-17 11:54:57 +03:00
|
|
|
$page->header();
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
2014-10-10 11:57:57 +03:00
|
|
|
$page->modularTwig($slug[0] == '_');
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $page;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-18 19:44:07 +02:00
|
|
|
/**
|
|
|
|
|
* Return the languages available in the admin
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
2015-08-17 18:22:15 -06:00
|
|
|
public static function adminLanguages()
|
|
|
|
|
{
|
|
|
|
|
$languages = [];
|
2015-12-18 17:28:31 -07:00
|
|
|
|
|
|
|
|
$path = Grav::instance()['locator']->findResource('plugins://admin/languages');
|
|
|
|
|
|
|
|
|
|
/** @var \DirectoryIterator $directory */
|
|
|
|
|
foreach (new \DirectoryIterator($path) as $file) {
|
|
|
|
|
if ($file->isDir() || $file->isDot()) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$lang = basename($file->getBasename(), '.yaml');
|
|
|
|
|
|
2015-08-17 18:22:15 -06:00
|
|
|
$languages[$lang] = LanguageCodes::getNativeName($lang);
|
2015-12-18 17:28:31 -07:00
|
|
|
|
2015-08-17 18:22:15 -06:00
|
|
|
}
|
|
|
|
|
return $languages;
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-03 17:53:04 +01:00
|
|
|
/**
|
2016-01-22 21:52:25 +02:00
|
|
|
* Return the found configuration blueprints
|
2016-01-03 17:53:04 +01:00
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public static function configurations()
|
|
|
|
|
{
|
|
|
|
|
$configurations = [];
|
2016-01-10 17:17:04 +01:00
|
|
|
|
2016-01-22 21:52:25 +02:00
|
|
|
/** @var UniformResourceIterator $iterator */
|
|
|
|
|
$iterator = Grav::instance()['locator']->getIterator('blueprints://config');
|
|
|
|
|
|
|
|
|
|
foreach ($iterator as $file) {
|
|
|
|
|
if ($file->isDir() || !preg_match('/^[^.].*.yaml$/', $file->getFilename())) {
|
2016-01-03 17:53:04 +01:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
$configurations[] = basename($file->getBasename(), '.yaml');
|
|
|
|
|
}
|
2016-01-10 17:17:04 +01:00
|
|
|
|
2016-01-03 17:53:04 +01:00
|
|
|
return $configurations;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-18 19:44:07 +02:00
|
|
|
/**
|
|
|
|
|
* Return the languages available in the site
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public static function siteLanguages()
|
|
|
|
|
{
|
|
|
|
|
$languages = [];
|
|
|
|
|
$lang_data = Grav::instance()['config']->get('system.languages.supported', []);
|
|
|
|
|
|
|
|
|
|
foreach ($lang_data as $index => $lang) {
|
|
|
|
|
$languages[$lang] = LanguageCodes::getNativeName($lang);
|
|
|
|
|
}
|
|
|
|
|
return $languages;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
/**
|
|
|
|
|
* Static helper method to return current route.
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public static function route()
|
|
|
|
|
{
|
2015-08-20 18:11:54 -06:00
|
|
|
$pages = Grav::instance()['pages'];
|
|
|
|
|
$route = '/' . ltrim(Grav::instance()['admin']->route, '/');
|
|
|
|
|
|
2016-01-28 14:38:01 +01:00
|
|
|
/** @var Page $page */
|
2015-08-20 18:11:54 -06:00
|
|
|
$page = $pages->dispatch($route);
|
2015-08-28 16:02:32 +02:00
|
|
|
$parent_route = null;
|
|
|
|
|
if ($page) {
|
|
|
|
|
$parent = $page->parent();
|
|
|
|
|
$parent_route = $parent->rawRoute();
|
|
|
|
|
}
|
2015-08-20 18:11:54 -06:00
|
|
|
|
|
|
|
|
return $parent_route;
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|
2015-07-27 19:33:52 -06:00
|
|
|
|
2015-11-21 16:15:23 +01:00
|
|
|
/**
|
|
|
|
|
* Static helper method to return the admin form nonce
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public static function getNonce()
|
|
|
|
|
{
|
|
|
|
|
$action = 'admin-form';
|
|
|
|
|
return Utils::getNonce($action);
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-01 15:33:33 +02:00
|
|
|
/**
|
|
|
|
|
* Static helper method to return the last used page name
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public static function getLastPageName()
|
|
|
|
|
{
|
|
|
|
|
return Grav::instance()['session']->lastPageName ?: 'default';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Static helper method to return the last used page route
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public static function getLastPageRoute()
|
|
|
|
|
{
|
|
|
|
|
return Grav::instance()['session']->lastPageRoute ?: self::route();
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-30 11:16:05 +02:00
|
|
|
/**
|
|
|
|
|
* Determine if the plugin or theme info passed is from Team Grav
|
|
|
|
|
*
|
|
|
|
|
* @param object $info Plugin or Theme info object
|
2015-08-11 18:30:27 -06:00
|
|
|
*
|
2015-07-30 11:16:05 +02:00
|
|
|
* @return bool
|
|
|
|
|
*/
|
2015-07-27 19:33:52 -06:00
|
|
|
public function isTeamGrav($info)
|
|
|
|
|
{
|
|
|
|
|
if (isset($info['author']['name']) && $info['author']['name'] == 'Team Grav') {
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-08-11 18:30:27 -06:00
|
|
|
|
2015-08-14 15:05:33 +02:00
|
|
|
/**
|
|
|
|
|
* Renders phpinfo
|
|
|
|
|
*
|
|
|
|
|
* @return string The phpinfo() output
|
|
|
|
|
*/
|
2016-01-10 17:17:04 +01:00
|
|
|
function phpinfo()
|
|
|
|
|
{
|
2015-09-15 16:23:57 -06:00
|
|
|
if (function_exists('phpinfo')) {
|
|
|
|
|
ob_start();
|
|
|
|
|
phpinfo();
|
|
|
|
|
$pinfo = ob_get_contents();
|
|
|
|
|
ob_end_clean();
|
|
|
|
|
|
|
|
|
|
$pinfo = preg_replace('%^.*<body>(.*)</body>.*$%ms', '$1', $pinfo);
|
|
|
|
|
return $pinfo;
|
|
|
|
|
} else {
|
|
|
|
|
return 'phpinfo() method is not available on this server.';
|
|
|
|
|
}
|
2015-08-11 18:30:27 -06:00
|
|
|
}
|
2015-08-14 15:05:33 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Translate a string to the user-defined language
|
|
|
|
|
*
|
2016-01-21 09:46:38 +02:00
|
|
|
* @param array|mixed $args
|
2016-01-28 15:07:41 +01:00
|
|
|
*
|
2016-05-03 13:36:06 -06:00
|
|
|
* @param mixed $languages
|
2016-01-21 09:46:38 +02:00
|
|
|
* @return string
|
|
|
|
|
*/
|
2016-05-03 13:36:06 -06:00
|
|
|
public function translate($args, $languages = null)
|
2015-08-18 18:48:15 +02:00
|
|
|
{
|
|
|
|
|
if (is_array($args)) {
|
|
|
|
|
$lookup = array_shift($args);
|
|
|
|
|
} else {
|
|
|
|
|
$lookup = $args;
|
|
|
|
|
$args = [];
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-03 13:36:06 -06:00
|
|
|
if (!$languages) {
|
|
|
|
|
$languages = [$this->grav['user']->authenticated ? $this->grav['user']->language : ($this->grav['language']->getLanguage() ?: 'en')];
|
|
|
|
|
} else {
|
|
|
|
|
$languages = (array) $languages;
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-28 15:07:41 +01:00
|
|
|
|
2015-08-18 18:48:15 +02:00
|
|
|
if ($lookup) {
|
2015-08-19 10:17:50 +02:00
|
|
|
if (empty($languages) || reset($languages) == null) {
|
2015-08-18 18:48:15 +02:00
|
|
|
if ($this->grav['config']->get('system.languages.translations_fallback', true)) {
|
|
|
|
|
$languages = $this->grav['language']->getFallbackLanguages();
|
|
|
|
|
} else {
|
|
|
|
|
$languages = (array)$this->grav['language']->getDefault();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ((array)$languages as $lang) {
|
2016-01-28 15:07:41 +01:00
|
|
|
$translation = $this->grav['language']->getTranslation($lang, $lookup);
|
2015-08-18 18:48:15 +02:00
|
|
|
|
2015-08-24 19:09:07 +02:00
|
|
|
if (!$translation) {
|
2015-08-29 14:39:37 +02:00
|
|
|
$language = $this->grav['language']->getDefault() ?: 'en';
|
2016-01-28 15:07:41 +01:00
|
|
|
$translation = $this->grav['language']->getTranslation($language, $lookup);
|
2015-08-24 19:09:07 +02:00
|
|
|
}
|
|
|
|
|
|
2015-11-30 16:10:54 +01:00
|
|
|
if (!$translation) {
|
|
|
|
|
$language = 'en';
|
2016-01-28 15:07:41 +01:00
|
|
|
$translation = $this->grav['language']->getTranslation($language, $lookup);
|
2015-11-30 16:10:54 +01:00
|
|
|
}
|
|
|
|
|
|
2015-08-18 18:48:15 +02:00
|
|
|
if ($translation) {
|
|
|
|
|
if (count($args) >= 1) {
|
|
|
|
|
return vsprintf($translation, $args);
|
|
|
|
|
} else {
|
|
|
|
|
return $translation;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $lookup;
|
|
|
|
|
}
|
2015-09-08 14:58:31 -06:00
|
|
|
|
2016-05-10 13:32:17 -06:00
|
|
|
/**
|
|
|
|
|
* Guest date format based on euro/US
|
|
|
|
|
*
|
|
|
|
|
* @param $date
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function guessDateFormat($date)
|
|
|
|
|
{
|
|
|
|
|
static $guess;
|
|
|
|
|
|
2016-05-10 16:53:19 -06:00
|
|
|
if (!isset($guess[$date])) {
|
2016-05-10 13:32:17 -06:00
|
|
|
if (Utils::contains($date, '/')) {
|
|
|
|
|
if ($this->validateDate($date, 'm/d/Y H:i')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'm/d/Y H:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'm/d/y H:i')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'm/d/y H:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'm/d/Y G:i')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'm/d/Y G:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'm/d/y G:i')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'm/d/y G:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'm/d/Y h:ia')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'm/d/Y h:ia';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'm/d/y h:ia')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'm/d/y h:ia';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'm/d/Y g:ia')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'm/d/Y g:ia';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'm/d/y g:ia')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'm/d/y g:ia';
|
2016-05-10 13:32:17 -06:00
|
|
|
}
|
|
|
|
|
} elseif (Utils::contains($date, '-')) {
|
|
|
|
|
if ($this->validateDate($date, 'd-m-Y H:i')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-Y H:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'd-m-y H:i')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-y H:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'd-m-Y G:i')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-Y G:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'd-m-y G:i')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-y G:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'd-m-Y h:ia')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-Y h:ia';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'd-m-y h:ia')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-y h:ia';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'd-m-Y g:ia')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-Y g:ia';
|
2016-05-10 13:32:17 -06:00
|
|
|
} elseif ($this->validateDate($date, 'd-m-y g:ia')) {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-y g:ia';
|
2016-05-10 13:32:17 -06:00
|
|
|
}
|
|
|
|
|
} else {
|
2016-05-10 16:53:19 -06:00
|
|
|
$guess[$date] = 'd-m-Y H:i';
|
2016-05-10 13:32:17 -06:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-10 16:53:19 -06:00
|
|
|
return $guess[$date];
|
2016-05-10 13:32:17 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function validateDate($date, $format)
|
|
|
|
|
{
|
|
|
|
|
$d = DateTime::createFromFormat($format, $date);
|
|
|
|
|
return $d && $d->format($format) == $date;
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-21 09:46:38 +02:00
|
|
|
/**
|
|
|
|
|
* @param string $php_format
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2016-05-10 13:32:17 -06:00
|
|
|
public function dateformatToMomentJS($php_format)
|
2015-09-08 14:58:31 -06:00
|
|
|
{
|
|
|
|
|
$SYMBOLS_MATCHING = array(
|
|
|
|
|
// Day
|
2016-02-05 23:49:39 -08:00
|
|
|
'd' => 'DD',
|
2015-09-08 14:58:31 -06:00
|
|
|
'D' => 'ddd',
|
2016-02-05 23:49:39 -08:00
|
|
|
'j' => 'D',
|
2015-09-08 14:58:31 -06:00
|
|
|
'l' => 'dddd',
|
2016-02-05 23:49:39 -08:00
|
|
|
'N' => 'E',
|
|
|
|
|
'S' => 'Do',
|
|
|
|
|
'w' => 'd',
|
|
|
|
|
'z' => 'DDD',
|
2015-09-08 14:58:31 -06:00
|
|
|
// Week
|
2016-02-05 23:49:39 -08:00
|
|
|
'W' => 'W',
|
2015-09-08 14:58:31 -06:00
|
|
|
// Month
|
|
|
|
|
'F' => 'MMMM',
|
|
|
|
|
'm' => 'MM',
|
|
|
|
|
'M' => 'MMM',
|
|
|
|
|
'n' => 'M',
|
|
|
|
|
't' => '',
|
|
|
|
|
// Year
|
|
|
|
|
'L' => '',
|
2016-02-05 23:49:39 -08:00
|
|
|
'o' => 'GGGG',
|
|
|
|
|
'Y' => 'YYYY',
|
2015-09-08 14:58:31 -06:00
|
|
|
'y' => 'yy',
|
|
|
|
|
// Time
|
2016-02-05 23:49:39 -08:00
|
|
|
'a' => 'a',
|
|
|
|
|
'A' => 'A',
|
|
|
|
|
'B' => 'SSS',
|
2015-09-08 14:58:31 -06:00
|
|
|
'g' => 'h',
|
|
|
|
|
'G' => 'H',
|
|
|
|
|
'h' => 'hh',
|
|
|
|
|
'H' => 'HH',
|
|
|
|
|
'i' => 'mm',
|
|
|
|
|
's' => 'ss',
|
2016-02-05 23:49:39 -08:00
|
|
|
'u' => '',
|
|
|
|
|
// Timezone
|
|
|
|
|
'e' => '',
|
|
|
|
|
'I' => '',
|
|
|
|
|
'O' => 'ZZ',
|
|
|
|
|
'P' => 'Z',
|
|
|
|
|
'T' => 'z',
|
|
|
|
|
'Z' => '',
|
|
|
|
|
// Full Date/Time
|
|
|
|
|
'c' => '',
|
|
|
|
|
'r' => 'llll ZZ',
|
|
|
|
|
'U' => 'X'
|
2015-09-08 14:58:31 -06:00
|
|
|
);
|
|
|
|
|
$js_format = "";
|
|
|
|
|
$escaping = false;
|
|
|
|
|
for($i = 0; $i < strlen($php_format); $i++)
|
|
|
|
|
{
|
|
|
|
|
$char = $php_format[$i];
|
|
|
|
|
if($char === '\\') // PHP date format escaping character
|
|
|
|
|
{
|
|
|
|
|
$i++;
|
|
|
|
|
if($escaping) $js_format .= $php_format[$i];
|
|
|
|
|
else $js_format .= '\'' . $php_format[$i];
|
|
|
|
|
$escaping = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if($escaping) { $js_format .= "'"; $escaping = false; }
|
|
|
|
|
if(isset($SYMBOLS_MATCHING[$char]))
|
|
|
|
|
$js_format .= $SYMBOLS_MATCHING[$char];
|
|
|
|
|
else
|
|
|
|
|
$js_format .= $char;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $js_format;
|
|
|
|
|
}
|
2016-05-04 14:26:27 -06:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the entire permissions array
|
|
|
|
|
*
|
|
|
|
|
* @param $permissions
|
|
|
|
|
*/
|
|
|
|
|
public function setPermissions($permissions)
|
|
|
|
|
{
|
|
|
|
|
$this->permissions = $permissions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets the entire permissions array
|
|
|
|
|
*
|
|
|
|
|
* @return Array
|
|
|
|
|
*/
|
|
|
|
|
public function getPermissions()
|
|
|
|
|
{
|
|
|
|
|
return $this->permissions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Adds a permission to the permissions array
|
|
|
|
|
*
|
|
|
|
|
* @param $permissions
|
|
|
|
|
*/
|
|
|
|
|
public function addPermissions($permissions)
|
|
|
|
|
{
|
|
|
|
|
$this->permissions = array_merge($this->permissions, $permissions);
|
|
|
|
|
}
|
2016-05-26 14:49:45 -06:00
|
|
|
|
|
|
|
|
public function findFormFields($type, $fields, $found_fields = [])
|
|
|
|
|
{
|
|
|
|
|
foreach ($fields as $key => $field) {
|
|
|
|
|
|
|
|
|
|
if (isset($field['type']) && $field['type'] == $type) {
|
|
|
|
|
$found_fields[$key] = $field;
|
|
|
|
|
} elseif (isset($field['fields'])) {
|
|
|
|
|
$result = $this->findFormFields($type, $field['fields'], $found_fields);
|
|
|
|
|
if (!empty($result)) {
|
|
|
|
|
$found_fields = array_merge($found_fields, $result);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $found_fields;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getPagePathFromToken($path)
|
|
|
|
|
{
|
|
|
|
|
$path_parts = pathinfo($path);
|
|
|
|
|
|
|
|
|
|
$basename = '';
|
|
|
|
|
if (isset($path_parts['extension'])) {
|
|
|
|
|
$basename = '/'.$path_parts['basename'];
|
|
|
|
|
$path = $path_parts['dirname'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$regex = '/(@self|self@)|((?:@page|page@):(?:.*))|((?:@theme|theme@):(?:.*))/';
|
|
|
|
|
preg_match($regex, $path, $matches);
|
|
|
|
|
|
|
|
|
|
if ($matches) {
|
|
|
|
|
if ($matches[1]) {
|
|
|
|
|
// self@
|
|
|
|
|
$page = $this->page(true);
|
|
|
|
|
} elseif ($matches[2]) {
|
|
|
|
|
// page@
|
|
|
|
|
$parts = explode(':', $path);
|
|
|
|
|
$route = $parts[1];
|
|
|
|
|
$page = $this->grav['page']->find($route);
|
|
|
|
|
} elseif ($matches[3]) {
|
|
|
|
|
// theme@
|
|
|
|
|
$parts = explode(':', $path);
|
|
|
|
|
$route = $parts[1];
|
|
|
|
|
$theme = str_replace(ROOT_DIR, '', $this->grav['locator']->findResource("theme://"));
|
|
|
|
|
return $theme . $route . $basename;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return $path . $basename;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!$page) {
|
|
|
|
|
throw new \RuntimeException('Page route not found: ' . $path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$path = str_replace($matches[0], rtrim($page->relativePagePath(), '/'), $path);
|
|
|
|
|
|
|
|
|
|
return $path . $basename;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-05 13:06:38 -07:00
|
|
|
}
|