mirror of
https://github.com/cosmocode/dokuwiki-plugin-farmer.git
synced 2025-07-21 18:35:21 +00:00
(semi)automatic code style fixes
This commit is contained in:
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/.* export-ignore
|
||||
/_test export-ignore
|
388
3rdparty/PHPIco.php
vendored
388
3rdparty/PHPIco.php
vendored
@ -1,23 +1,23 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright 2011-2013 Chris Jean & iThemes
|
||||
Licensed under GPLv2 or above
|
||||
|
||||
Version 1.0.2
|
||||
|
||||
Adjusted for DokuWiki Farmer Plugin
|
||||
*/
|
||||
|
||||
namespace chrisbliss18\phpico;
|
||||
|
||||
class PHPIco {
|
||||
/**
|
||||
* Images in the BMP format.
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_images = array();
|
||||
/**
|
||||
* PHP Icon Library
|
||||
* Adjusted for DokuWiki Farmer Plugin
|
||||
*
|
||||
* @author Copyright 2011-2013 Chris Jean & iThemes
|
||||
* @license Licensed under GPLv2 or above
|
||||
* @version 1.0.2
|
||||
*/
|
||||
class PHPIco
|
||||
{
|
||||
/**
|
||||
* Images in the BMP format.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $images = [];
|
||||
|
||||
/**
|
||||
* Constructor - Create a new ICO generator.
|
||||
@ -26,202 +26,241 @@ class PHPIco {
|
||||
* function in order to generate an ICO file.
|
||||
*
|
||||
* @param bool|string $file Optional. Path to the source image file.
|
||||
* @param array $sizes Optional. An array of sizes (each size is an array with a width and height) that the source image should be rendered at in the generated ICO file. If sizes are not supplied, the size of the source image will be used.
|
||||
* @param array $sizes Optional. An array of sizes (each size is an array with a width and height)
|
||||
* that the source image should be rendered at in the generated ICO file.
|
||||
* If sizes are not supplied, the size of the source image will be used.
|
||||
* @throws \Exception
|
||||
*/
|
||||
function __construct( $file = false, $sizes = array() ) {
|
||||
$required_functions = array(
|
||||
'getimagesize',
|
||||
'imagecreatefromstring',
|
||||
'imagecreatetruecolor',
|
||||
'imagecolortransparent',
|
||||
'imagecolorallocatealpha',
|
||||
'imagealphablending',
|
||||
'imagesavealpha',
|
||||
'imagesx',
|
||||
'imagesy',
|
||||
'imagecopyresampled',
|
||||
);
|
||||
public function __construct($file = false, $sizes = [])
|
||||
{
|
||||
$required_functions = [
|
||||
'getimagesize',
|
||||
'imagecreatefromstring',
|
||||
'imagecreatetruecolor',
|
||||
'imagecolortransparent',
|
||||
'imagecolorallocatealpha',
|
||||
'imagealphablending',
|
||||
'imagesavealpha',
|
||||
'imagesx',
|
||||
'imagesy',
|
||||
'imagecopyresampled'
|
||||
];
|
||||
|
||||
foreach ( $required_functions as $function ) {
|
||||
if ( ! function_exists( $function ) ) {
|
||||
throw new \Exception( "The PHP_ICO class was unable to find the $function function, which is part of the GD library. Ensure that the system has the GD library installed and that PHP has access to it through a PHP interface, such as PHP's GD module. Since this function was not found, the library will be unable to create ICO files." );
|
||||
}
|
||||
}
|
||||
foreach ($required_functions as $function) {
|
||||
if (!function_exists($function)) {
|
||||
throw new \Exception(
|
||||
"The PHP_ICO class was unable to find the $function function, which is part of the GD library. " .
|
||||
"Ensure that the system has the GD library installed and that PHP has access to it through a PHP " .
|
||||
"interface, such as PHP's GD module. Since this function was not found, the library will be " .
|
||||
"unable to create ICO files."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if ( false != $file )
|
||||
$this->add_image( $file, $sizes );
|
||||
}
|
||||
if (false != $file)
|
||||
$this->addImage($file, $sizes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an image to the generator.
|
||||
*
|
||||
* This function adds a source image to the generator. It serves two main purposes: add a source image if one was
|
||||
* not supplied to the constructor and to add additional source images so that different images can be supplied for
|
||||
* different sized images in the resulting ICO file. For instance, a small source image can be used for the small
|
||||
* resolutions while a larger source image can be used for large resolutions.
|
||||
*
|
||||
* @param string $file Path to the source image file.
|
||||
* @param array $sizes Optional. An array of sizes (each size is an array with a width and height) that the source image should be rendered at in the generated ICO file. If sizes are not supplied, the size of the source image will be used.
|
||||
* @return boolean true on success and false on failure.
|
||||
*/
|
||||
function add_image( $file, $sizes = array() ) {
|
||||
if ( false === ( $im = $this->_load_image_file( $file ) ) )
|
||||
return false;
|
||||
/**
|
||||
* Add an image to the generator.
|
||||
*
|
||||
* This function adds a source image to the generator. It serves two main purposes: add a source image if one was
|
||||
* not supplied to the constructor and to add additional source images so that different images can be supplied for
|
||||
* different sized images in the resulting ICO file. For instance, a small source image can be used for the small
|
||||
* resolutions while a larger source image can be used for large resolutions.
|
||||
*
|
||||
* @param string $file Path to the source image file.
|
||||
* @param array $sizes Optional. An array of sizes (each size is an array with a width and height) that the
|
||||
* source image should be rendered at in the generated ICO file.
|
||||
* If sizes are not supplied, the size of the source image will be used.
|
||||
* @return boolean true on success and false on failure.
|
||||
*/
|
||||
public function addImage($file, $sizes = [])
|
||||
{
|
||||
if (false === ($im = $this->loadImageFile($file)))
|
||||
return false;
|
||||
|
||||
|
||||
if ( empty( $sizes ) )
|
||||
$sizes = array( imagesx( $im ), imagesy( $im ) );
|
||||
if (empty($sizes))
|
||||
$sizes = [imagesx($im), imagesy($im)];
|
||||
|
||||
// If just a single size was passed, put it in array.
|
||||
if ( ! is_array( $sizes[0] ) )
|
||||
$sizes = array( $sizes );
|
||||
// If just a single size was passed, put it in array.
|
||||
if (!is_array($sizes[0]))
|
||||
$sizes = [$sizes];
|
||||
|
||||
foreach ( (array) $sizes as $size ) {
|
||||
list( $width, $height ) = $size;
|
||||
foreach ((array)$sizes as $size) {
|
||||
[$width, $height] = $size;
|
||||
|
||||
$new_im = imagecreatetruecolor( $width, $height );
|
||||
$new_im = imagecreatetruecolor($width, $height);
|
||||
|
||||
imagecolortransparent( $new_im, imagecolorallocatealpha( $new_im, 0, 0, 0, 127 ) );
|
||||
imagealphablending( $new_im, false );
|
||||
imagesavealpha( $new_im, true );
|
||||
imagecolortransparent($new_im, imagecolorallocatealpha($new_im, 0, 0, 0, 127));
|
||||
imagealphablending($new_im, false);
|
||||
imagesavealpha($new_im, true);
|
||||
|
||||
$source_width = imagesx( $im );
|
||||
$source_height = imagesy( $im );
|
||||
$source_width = imagesx($im);
|
||||
$source_height = imagesy($im);
|
||||
|
||||
if ( false === imagecopyresampled( $new_im, $im, 0, 0, 0, 0, $width, $height, $source_width, $source_height ) )
|
||||
continue;
|
||||
|
||||
$this->_add_image_data( $new_im );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the ICO file data to a file path.
|
||||
*
|
||||
* @param string $file Path to save the ICO file data into.
|
||||
* @return boolean true on success and false on failure.
|
||||
*/
|
||||
function save_ico( $file ) {
|
||||
if ( false === ( $data = $this->_get_ico_data() ) )
|
||||
return false;
|
||||
|
||||
if ( false === ( $fh = fopen( $file, 'w' ) ) )
|
||||
return false;
|
||||
|
||||
if ( false === ( fwrite( $fh, $data ) ) ) {
|
||||
fclose( $fh );
|
||||
return false;
|
||||
}
|
||||
|
||||
fclose( $fh );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the final ICO data by creating a file header and adding the image data.
|
||||
*/
|
||||
protected function _get_ico_data() {
|
||||
if ( ! is_array( $this->_images ) || empty( $this->_images ) )
|
||||
return false;
|
||||
if (
|
||||
false === imagecopyresampled(
|
||||
$new_im,
|
||||
$im,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
$width,
|
||||
$height,
|
||||
$source_width,
|
||||
$source_height
|
||||
)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
$data = pack( 'vvv', 0, 1, count( $this->_images ) );
|
||||
$pixel_data = '';
|
||||
$this->addImageData($new_im);
|
||||
}
|
||||
|
||||
$icon_dir_entry_size = 16;
|
||||
return true;
|
||||
}
|
||||
|
||||
$offset = 6 + ( $icon_dir_entry_size * count( $this->_images ) );
|
||||
/**
|
||||
* Write the ICO file data to a file path.
|
||||
*
|
||||
* @param string $file Path to save the ICO file data into.
|
||||
* @return boolean true on success and false on failure.
|
||||
*/
|
||||
public function saveIco($file)
|
||||
{
|
||||
if (false === ($data = $this->getIcoData()))
|
||||
return false;
|
||||
|
||||
foreach ( $this->_images as $image ) {
|
||||
$data .= pack( 'CCCCvvVV', $image['width'], $image['height'], $image['color_palette_colors'], 0, 1, $image['bits_per_pixel'], $image['size'], $offset );
|
||||
$pixel_data .= $image['data'];
|
||||
if (false === ($fh = fopen($file, 'w')))
|
||||
return false;
|
||||
|
||||
$offset += $image['size'];
|
||||
}
|
||||
if (false === (fwrite($fh, $data))) {
|
||||
fclose($fh);
|
||||
return false;
|
||||
}
|
||||
|
||||
$data .= $pixel_data;
|
||||
unset( $pixel_data );
|
||||
fclose($fh);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the final ICO data by creating a file header and adding the image data.
|
||||
*/
|
||||
protected function getIcoData()
|
||||
{
|
||||
if (!is_array($this->images) || $this->images === [])
|
||||
return false;
|
||||
|
||||
|
||||
return $data;
|
||||
}
|
||||
$data = pack('vvv', 0, 1, count($this->images));
|
||||
$pixel_data = '';
|
||||
|
||||
$icon_dir_entry_size = 16;
|
||||
|
||||
$offset = 6 + ($icon_dir_entry_size * count($this->images));
|
||||
|
||||
foreach ($this->images as $image) {
|
||||
$data .= pack(
|
||||
'CCCCvvVV',
|
||||
$image['width'],
|
||||
$image['height'],
|
||||
$image['color_palette_colors'],
|
||||
0,
|
||||
1,
|
||||
$image['bits_per_pixel'],
|
||||
$image['size'],
|
||||
$offset
|
||||
);
|
||||
$pixel_data .= $image['data'];
|
||||
|
||||
$offset += $image['size'];
|
||||
}
|
||||
|
||||
$data .= $pixel_data;
|
||||
unset($pixel_data);
|
||||
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Take a GD image resource and change it into a raw BMP format.
|
||||
*
|
||||
* @param resource $im
|
||||
*/
|
||||
protected function _add_image_data( $im ) {
|
||||
$width = imagesx( $im );
|
||||
$height = imagesy( $im );
|
||||
protected function addImageData($im)
|
||||
{
|
||||
$width = imagesx($im);
|
||||
$height = imagesy($im);
|
||||
|
||||
|
||||
$pixel_data = array();
|
||||
$pixel_data = [];
|
||||
|
||||
$opacity_data = array();
|
||||
$current_opacity_val = 0;
|
||||
$opacity_data = [];
|
||||
$current_opacity_val = 0;
|
||||
|
||||
for ( $y = $height - 1; $y >= 0; $y-- ) {
|
||||
for ( $x = 0; $x < $width; $x++ ) {
|
||||
$color = imagecolorat( $im, $x, $y );
|
||||
for ($y = $height - 1; $y >= 0; $y--) {
|
||||
for ($x = 0; $x < $width; $x++) {
|
||||
$color = imagecolorat($im, $x, $y);
|
||||
|
||||
$alpha = ( $color & 0x7F000000 ) >> 24;
|
||||
$alpha = ( 1 - ( $alpha / 127 ) ) * 255;
|
||||
$alpha = ($color & 0x7F000000) >> 24;
|
||||
$alpha = (1 - ($alpha / 127)) * 255;
|
||||
|
||||
$color &= 0xFFFFFF;
|
||||
$color |= 0xFF000000 & ( $alpha << 24 );
|
||||
$color &= 0xFFFFFF;
|
||||
$color |= 0xFF000000 & ($alpha << 24);
|
||||
|
||||
$pixel_data[] = $color;
|
||||
$pixel_data[] = $color;
|
||||
|
||||
|
||||
$opacity = ( $alpha <= 127 ) ? 1 : 0;
|
||||
$opacity = ($alpha <= 127) ? 1 : 0;
|
||||
|
||||
$current_opacity_val = ( $current_opacity_val << 1 ) | $opacity;
|
||||
$current_opacity_val = ($current_opacity_val << 1) | $opacity;
|
||||
|
||||
if ( ( ( $x + 1 ) % 32 ) == 0 ) {
|
||||
$opacity_data[] = $current_opacity_val;
|
||||
$current_opacity_val = 0;
|
||||
}
|
||||
}
|
||||
if ((($x + 1) % 32) == 0) {
|
||||
$opacity_data[] = $current_opacity_val;
|
||||
$current_opacity_val = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ( $x % 32 ) > 0 ) {
|
||||
while ( ( $x++ % 32 ) > 0 )
|
||||
$current_opacity_val = $current_opacity_val << 1;
|
||||
if (($x % 32) > 0) {
|
||||
while (($x++ % 32) > 0)
|
||||
$current_opacity_val <<= 1;
|
||||
|
||||
$opacity_data[] = $current_opacity_val;
|
||||
$current_opacity_val = 0;
|
||||
}
|
||||
}
|
||||
$opacity_data[] = $current_opacity_val;
|
||||
$current_opacity_val = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$image_header_size = 40;
|
||||
$color_mask_size = $width * $height * 4;
|
||||
$opacity_mask_size = ( ceil( $width / 32 ) * 4 ) * $height;
|
||||
$image_header_size = 40;
|
||||
$color_mask_size = $width * $height * 4;
|
||||
$opacity_mask_size = (ceil($width / 32) * 4) * $height;
|
||||
|
||||
|
||||
$data = pack( 'VVVvvVVVVVV', 40, $width, ( $height * 2 ), 1, 32, 0, 0, 0, 0, 0, 0 );
|
||||
$data = pack('VVVvvVVVVVV', 40, $width, ($height * 2), 1, 32, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
foreach ( $pixel_data as $color )
|
||||
$data .= pack( 'V', $color );
|
||||
foreach ($pixel_data as $color)
|
||||
$data .= pack('V', $color);
|
||||
|
||||
foreach ( $opacity_data as $opacity )
|
||||
$data .= pack( 'N', $opacity );
|
||||
foreach ($opacity_data as $opacity)
|
||||
$data .= pack('N', $opacity);
|
||||
|
||||
|
||||
$image = array(
|
||||
'width' => $width,
|
||||
'height' => $height,
|
||||
'color_palette_colors' => 0,
|
||||
'bits_per_pixel' => 32,
|
||||
'size' => $image_header_size + $color_mask_size + $opacity_mask_size,
|
||||
'data' => $data,
|
||||
);
|
||||
$image = [
|
||||
'width' => $width,
|
||||
'height' => $height,
|
||||
'color_palette_colors' => 0,
|
||||
'bits_per_pixel' => 32,
|
||||
'size' => $image_header_size + $color_mask_size + $opacity_mask_size,
|
||||
'data' => $data
|
||||
];
|
||||
|
||||
$this->_images[] = $image;
|
||||
}
|
||||
$this->images[] = $image;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read in the source image file and convert it into a GD image resource.
|
||||
@ -229,20 +268,21 @@ class PHPIco {
|
||||
* @param string $file
|
||||
* @return bool|resource
|
||||
*/
|
||||
protected function _load_image_file( $file ) {
|
||||
// Run a cheap check to verify that it is an image file.
|
||||
if ( false === ( $size = getimagesize( $file ) ) )
|
||||
return false;
|
||||
protected function loadImageFile($file)
|
||||
{
|
||||
// Run a cheap check to verify that it is an image file.
|
||||
if (false === ($size = getimagesize($file)))
|
||||
return false;
|
||||
|
||||
if ( false === ( $file_data = file_get_contents( $file ) ) )
|
||||
return false;
|
||||
if (false === ($file_data = file_get_contents($file)))
|
||||
return false;
|
||||
|
||||
if ( false === ( $im = imagecreatefromstring( $file_data ) ) )
|
||||
return false;
|
||||
if (false === ($im = imagecreatefromstring($file_data)))
|
||||
return false;
|
||||
|
||||
unset( $file_data );
|
||||
unset($file_data);
|
||||
|
||||
|
||||
return $im;
|
||||
}
|
||||
return $im;
|
||||
}
|
||||
}
|
||||
|
51
3rdparty/RingIcon.php
vendored
51
3rdparty/RingIcon.php
vendored
@ -14,15 +14,14 @@ namespace splitbrain\RingIcon;
|
||||
*/
|
||||
class RingIcon
|
||||
{
|
||||
|
||||
protected $size;
|
||||
protected $fullsize;
|
||||
protected $rings;
|
||||
protected $rings = 4;
|
||||
protected $center;
|
||||
protected $ringwidth;
|
||||
protected $seed;
|
||||
protected $ismono = false;
|
||||
protected $monocolor = null;
|
||||
protected $monocolor;
|
||||
|
||||
/**
|
||||
* RingIcon constructor.
|
||||
@ -33,12 +32,11 @@ class RingIcon
|
||||
{
|
||||
$this->size = $size;
|
||||
$this->fullsize = $this->size * 5;
|
||||
$this->rings = 4;
|
||||
|
||||
$this->center = floor($this->fullsize / 2);
|
||||
$this->ringwidth = floor($this->fullsize / $rings);
|
||||
|
||||
$this->seed = mt_rand() . time();
|
||||
$this->seed = random_int(0, mt_getrandmax()) . time();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -52,17 +50,13 @@ class RingIcon
|
||||
public function createImage($seed = '', $file = '')
|
||||
{
|
||||
if (!$seed) {
|
||||
$seed = mt_rand() . time();
|
||||
$seed = random_int(0, mt_getrandmax()) . time();
|
||||
}
|
||||
$this->seed = $seed;
|
||||
|
||||
// monochrome wanted?
|
||||
if($this->ismono) {
|
||||
$this->monocolor = array(
|
||||
$this->rand(20,255),
|
||||
$this->rand(20,255),
|
||||
$this->rand(20,255)
|
||||
);
|
||||
if ($this->ismono) {
|
||||
$this->monocolor = [$this->rand(20, 255), $this->rand(20, 255), $this->rand(20, 255)];
|
||||
} else {
|
||||
$this->monocolor = null;
|
||||
}
|
||||
@ -93,7 +87,8 @@ class RingIcon
|
||||
*
|
||||
* @param bool $ismono
|
||||
*/
|
||||
public function setMono($ismono) {
|
||||
public function setMono($ismono)
|
||||
{
|
||||
$this->ismono = $ismono;
|
||||
}
|
||||
|
||||
@ -126,11 +121,17 @@ class RingIcon
|
||||
|
||||
$start = $this->rand(20, 360);
|
||||
$stop = $this->rand(20, 360);
|
||||
if($stop < $start) list($start, $stop) = array($stop, $start);
|
||||
if ($stop < $start) [$start, $stop] = [$stop, $start];
|
||||
|
||||
imagefilledarc($image, $this->center, $this->center, $arcwidth, $arcwidth, $stop, $start, $color, IMG_ARC_PIE);
|
||||
imagefilledellipse($image, $this->center, $this->center, $arcwidth - $this->ringwidth,
|
||||
$arcwidth - $this->ringwidth, $transparency);
|
||||
imagefilledellipse(
|
||||
$image,
|
||||
$this->center,
|
||||
$this->center,
|
||||
$arcwidth - $this->ringwidth,
|
||||
$arcwidth - $this->ringwidth,
|
||||
$transparency
|
||||
);
|
||||
|
||||
imagecolordeallocate($image, $color);
|
||||
imagecolordeallocate($image, $transparency);
|
||||
@ -155,10 +156,21 @@ class RingIcon
|
||||
*/
|
||||
protected function randomColor($image)
|
||||
{
|
||||
if($this->ismono) {
|
||||
return imagecolorallocatealpha($image, $this->monocolor[0], $this->monocolor[1], $this->monocolor[2], $this->rand(0, 96));
|
||||
if ($this->ismono) {
|
||||
return imagecolorallocatealpha(
|
||||
$image,
|
||||
$this->monocolor[0],
|
||||
$this->monocolor[1],
|
||||
$this->monocolor[2],
|
||||
$this->rand(0, 96)
|
||||
);
|
||||
}
|
||||
return imagecolorallocate($image, $this->rand(0, 255), $this->rand(0, 255), $this->rand(0, 255));
|
||||
return imagecolorallocate(
|
||||
$image,
|
||||
$this->rand(0, 255),
|
||||
$this->rand(0, 255),
|
||||
$this->rand(0, 255)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -182,5 +194,4 @@ class RingIcon
|
||||
imagesavealpha($image, true);
|
||||
return $image;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
/**
|
||||
* Core Manager for the Farm functionality
|
||||
*
|
||||
@ -12,21 +13,22 @@
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
class DokuWikiFarmCore {
|
||||
class DokuWikiFarmCore
|
||||
{
|
||||
/**
|
||||
* @var array The default config - changed by loadConfig
|
||||
*/
|
||||
protected $config = array(
|
||||
'base' => array(
|
||||
protected $config = [
|
||||
'base' => [
|
||||
'farmdir' => '',
|
||||
'farmhost' => '',
|
||||
'basedomain' => '',
|
||||
),
|
||||
'notfound' => array(
|
||||
'basedomain' => ''
|
||||
],
|
||||
'notfound' => [
|
||||
'show' => 'farmer',
|
||||
'url' => ''
|
||||
),
|
||||
'inherit' => array(
|
||||
],
|
||||
'inherit' => [
|
||||
'main' => 1,
|
||||
'acronyms' => 1,
|
||||
'entities' => 1,
|
||||
@ -41,8 +43,8 @@ class DokuWikiFarmCore {
|
||||
'userstyle' => 0,
|
||||
'userscript' => 0,
|
||||
'styleini' => 0
|
||||
)
|
||||
);
|
||||
]
|
||||
];
|
||||
|
||||
/** @var string|false The current animal, false for farmer */
|
||||
protected $animal = false;
|
||||
@ -57,10 +59,11 @@ class DokuWikiFarmCore {
|
||||
* This initializes the whole farm by loading the configuration and setting
|
||||
* DOKU_CONF depending on the requested animal
|
||||
*/
|
||||
public function __construct() {
|
||||
public function __construct()
|
||||
{
|
||||
$this->loadConfig();
|
||||
if($this->config['base']['farmdir'] === '') return; // farm setup not complete
|
||||
$this->config['base']['farmdir'] = rtrim($this->config['base']['farmdir'], '/').'/'; // trailing slash always
|
||||
if ($this->config['base']['farmdir'] === '') return; // farm setup not complete
|
||||
$this->config['base']['farmdir'] = rtrim($this->config['base']['farmdir'], '/') . '/'; // trailing slash always
|
||||
define('DOKU_FARMDIR', $this->config['base']['farmdir']);
|
||||
|
||||
// animal?
|
||||
@ -68,7 +71,7 @@ class DokuWikiFarmCore {
|
||||
|
||||
// setup defines
|
||||
define('DOKU_FARM_ANIMAL', $this->animal);
|
||||
if($this->animal) {
|
||||
if ($this->animal) {
|
||||
define('DOKU_CONF', DOKU_FARMDIR . $this->animal . '/conf/');
|
||||
} else {
|
||||
define('DOKU_CONF', DOKU_INC . '/conf/');
|
||||
@ -81,43 +84,49 @@ class DokuWikiFarmCore {
|
||||
/**
|
||||
* @return array the current farm configuration
|
||||
*/
|
||||
public function getConfig() {
|
||||
public function getConfig()
|
||||
{
|
||||
return $this->config;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return false|string
|
||||
*/
|
||||
public function getAnimal() {
|
||||
public function getAnimal()
|
||||
{
|
||||
return $this->animal;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return boolean
|
||||
*/
|
||||
public function isHostbased() {
|
||||
public function isHostbased()
|
||||
{
|
||||
return $this->hostbased;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return boolean
|
||||
*/
|
||||
public function wasNotfound() {
|
||||
public function wasNotfound()
|
||||
{
|
||||
return $this->notfound;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAnimalDataDir() {
|
||||
public function getAnimalDataDir()
|
||||
{
|
||||
return DOKU_FARMDIR . $this->getAnimal() . '/data/';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAnimalBaseDir() {
|
||||
if($this->isHostbased()) return '/';
|
||||
public function getAnimalBaseDir()
|
||||
{
|
||||
if ($this->isHostbased()) return '/';
|
||||
return getBaseURL() . '!' . $this->getAnimal();
|
||||
}
|
||||
|
||||
@ -128,7 +137,8 @@ class DokuWikiFarmCore {
|
||||
*
|
||||
* This borrows form DokuWiki's inc/farm.php but does not support a default conf dir
|
||||
*/
|
||||
protected function detectAnimal() {
|
||||
protected function detectAnimal()
|
||||
{
|
||||
$farmdir = $this->config['base']['farmdir'];
|
||||
$farmhost = $this->config['base']['farmhost'];
|
||||
|
||||
@ -144,17 +154,17 @@ class DokuWikiFarmCore {
|
||||
$_SERVER['QUERY_STRING'] = http_build_query($params);
|
||||
}
|
||||
// get animal from CLI parameter
|
||||
if('cli' == php_sapi_name() && isset($_SERVER['animal'])) $animal = $_SERVER['animal'];
|
||||
if($animal) {
|
||||
if ('cli' == PHP_SAPI && isset($_SERVER['animal'])) $animal = $_SERVER['animal'];
|
||||
if ($animal) {
|
||||
// check that $animal is a string and just a directory name and not a path
|
||||
if(!is_string($animal) || strpbrk($animal, '\\/') !== false) {
|
||||
if (!is_string($animal) || strpbrk($animal, '\\/') !== false) {
|
||||
$this->notfound = true;
|
||||
return;
|
||||
};
|
||||
$animal = strtolower($animal);
|
||||
|
||||
// check if animal exists
|
||||
if(is_dir("$farmdir/$animal/conf")) {
|
||||
if (is_dir("$farmdir/$animal/conf")) {
|
||||
$this->animal = $animal;
|
||||
return;
|
||||
} else {
|
||||
@ -164,18 +174,18 @@ class DokuWikiFarmCore {
|
||||
}
|
||||
|
||||
// no host - no host based setup. if we're still here then it's the farmer
|
||||
if(!isset($_SERVER['HTTP_HOST'])) return;
|
||||
if (!isset($_SERVER['HTTP_HOST'])) return;
|
||||
|
||||
// is this the farmer?
|
||||
if(strtolower($_SERVER['HTTP_HOST']) == $farmhost) {
|
||||
if (strtolower($_SERVER['HTTP_HOST']) == $farmhost) {
|
||||
return;
|
||||
}
|
||||
|
||||
// still here? check for host based
|
||||
$this->hostbased = true;
|
||||
$possible = $this->getAnimalNamesForHost($_SERVER['HTTP_HOST']);
|
||||
foreach($possible as $animal) {
|
||||
if(is_dir("$farmdir/$animal/conf/")) {
|
||||
foreach ($possible as $animal) {
|
||||
if (is_dir("$farmdir/$animal/conf/")) {
|
||||
$this->animal = $animal;
|
||||
return;
|
||||
}
|
||||
@ -183,7 +193,6 @@ class DokuWikiFarmCore {
|
||||
|
||||
// no hit
|
||||
$this->notfound = true;
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -192,10 +201,11 @@ class DokuWikiFarmCore {
|
||||
* @param string $host the HTTP_HOST header
|
||||
* @return array
|
||||
*/
|
||||
protected function getAnimalNamesForHost($host) {
|
||||
$animals = array();
|
||||
protected function getAnimalNamesForHost($host)
|
||||
{
|
||||
$animals = [];
|
||||
$parts = explode('.', implode('.', explode(':', rtrim($host, '.'))));
|
||||
for($j = count($parts); $j > 0; $j--) {
|
||||
for ($j = count($parts); $j > 0; $j--) {
|
||||
// strip from the end
|
||||
$animals[] = implode('.', array_slice($parts, 0, $j));
|
||||
// strip from the end without host part
|
||||
@ -208,7 +218,7 @@ class DokuWikiFarmCore {
|
||||
// compare by length, then alphabet
|
||||
function ($a, $b) {
|
||||
$ret = strlen($b) - strlen($a);
|
||||
if($ret != 0) return $ret;
|
||||
if ($ret != 0) return $ret;
|
||||
return $a <=> $b;
|
||||
}
|
||||
);
|
||||
@ -218,82 +228,95 @@ class DokuWikiFarmCore {
|
||||
/**
|
||||
* This sets up the default farming config cascade
|
||||
*/
|
||||
protected function setupCascade() {
|
||||
protected function setupCascade()
|
||||
{
|
||||
global $config_cascade;
|
||||
$config_cascade = array(
|
||||
'main' => array(
|
||||
'default' => array(DOKU_INC . 'conf/dokuwiki.php',),
|
||||
'local' => array(DOKU_CONF . 'local.php',),
|
||||
'protected' => array(DOKU_CONF . 'local.protected.php',),
|
||||
),
|
||||
'acronyms' => array(
|
||||
'default' => array(DOKU_INC . 'conf/acronyms.conf',),
|
||||
'local' => array(DOKU_CONF . 'acronyms.local.conf',),
|
||||
),
|
||||
'entities' => array(
|
||||
'default' => array(DOKU_INC . 'conf/entities.conf',),
|
||||
'local' => array(DOKU_CONF . 'entities.local.conf',),
|
||||
),
|
||||
'interwiki' => array(
|
||||
'default' => array(DOKU_INC . 'conf/interwiki.conf',),
|
||||
'local' => array(DOKU_CONF . 'interwiki.local.conf',),
|
||||
),
|
||||
'license' => array(
|
||||
'default' => array(DOKU_INC . 'conf/license.php',),
|
||||
'local' => array(DOKU_CONF . 'license.local.php',),
|
||||
),
|
||||
'manifest' => array(
|
||||
'default' => array(DOKU_INC . 'conf/manifest.json',),
|
||||
'local' => array(DOKU_CONF . 'manifest.local.json',),
|
||||
),
|
||||
'mediameta' => array(
|
||||
'default' => array(DOKU_INC . 'conf/mediameta.php',),
|
||||
'local' => array(DOKU_CONF . 'mediameta.local.php',),
|
||||
),
|
||||
'mime' => array(
|
||||
'default' => array(DOKU_INC . 'conf/mime.conf',),
|
||||
'local' => array(DOKU_CONF . 'mime.local.conf',),
|
||||
),
|
||||
'scheme' => array(
|
||||
'default' => array(DOKU_INC . 'conf/scheme.conf',),
|
||||
'local' => array(DOKU_CONF . 'scheme.local.conf',),
|
||||
),
|
||||
'smileys' => array(
|
||||
'default' => array(DOKU_INC . 'conf/smileys.conf',),
|
||||
'local' => array(DOKU_CONF . 'smileys.local.conf',),
|
||||
),
|
||||
'wordblock' => array(
|
||||
'default' => array(DOKU_INC . 'conf/wordblock.conf',),
|
||||
'local' => array(DOKU_CONF . 'wordblock.local.conf',),
|
||||
),
|
||||
'acl' => array(
|
||||
'default' => DOKU_CONF . 'acl.auth.php',
|
||||
),
|
||||
'plainauth.users' => array(
|
||||
'default' => DOKU_CONF . 'users.auth.php',
|
||||
),
|
||||
'plugins' => array(
|
||||
'default' => array(DOKU_INC . 'conf/plugins.php',),
|
||||
'local' => array(DOKU_CONF . 'plugins.local.php',),
|
||||
'protected' => array(
|
||||
$config_cascade = [
|
||||
'main' => [
|
||||
'default' => [DOKU_INC . 'conf/dokuwiki.php'],
|
||||
'local' => [DOKU_CONF . 'local.php'],
|
||||
'protected' => [DOKU_CONF . 'local.protected.php']
|
||||
],
|
||||
'acronyms' => [
|
||||
'default' => [DOKU_INC . 'conf/acronyms.conf'],
|
||||
'local' => [DOKU_CONF . 'acronyms.local.conf']
|
||||
],
|
||||
'entities' => [
|
||||
'default' => [DOKU_INC . 'conf/entities.conf'],
|
||||
'local' => [DOKU_CONF . 'entities.local.conf']
|
||||
],
|
||||
'interwiki' => [
|
||||
'default' => [DOKU_INC . 'conf/interwiki.conf'],
|
||||
'local' => [DOKU_CONF . 'interwiki.local.conf']
|
||||
],
|
||||
'license' => [
|
||||
'default' => [DOKU_INC . 'conf/license.php'],
|
||||
'local' => [DOKU_CONF . 'license.local.php']
|
||||
],
|
||||
'manifest' => [
|
||||
'default' => [DOKU_INC . 'conf/manifest.json'],
|
||||
'local' => [DOKU_CONF . 'manifest.local.json']
|
||||
],
|
||||
'mediameta' => [
|
||||
'default' => [DOKU_INC . 'conf/mediameta.php'],
|
||||
'local' => [DOKU_CONF . 'mediameta.local.php']
|
||||
],
|
||||
'mime' => [
|
||||
'default' => [DOKU_INC . 'conf/mime.conf'],
|
||||
'local' => [DOKU_CONF . 'mime.local.conf']
|
||||
],
|
||||
'scheme' => [
|
||||
'default' => [DOKU_INC . 'conf/scheme.conf'],
|
||||
'local' => [DOKU_CONF . 'scheme.local.conf']
|
||||
],
|
||||
'smileys' => [
|
||||
'default' => [DOKU_INC . 'conf/smileys.conf'],
|
||||
'local' => [DOKU_CONF . 'smileys.local.conf']
|
||||
],
|
||||
'wordblock' => [
|
||||
'default' => [DOKU_INC . 'conf/wordblock.conf'],
|
||||
'local' => [DOKU_CONF . 'wordblock.local.conf']
|
||||
],
|
||||
'acl' => [
|
||||
'default' => DOKU_CONF . 'acl.auth.php'
|
||||
],
|
||||
'plainauth.users' => [
|
||||
'default' => DOKU_CONF . 'users.auth.php'
|
||||
],
|
||||
'plugins' => [
|
||||
'default' => [DOKU_INC . 'conf/plugins.php'],
|
||||
'local' => [DOKU_CONF . 'plugins.local.php'],
|
||||
'protected' => [
|
||||
DOKU_INC . 'conf/plugins.required.php',
|
||||
DOKU_CONF . 'plugins.protected.php',
|
||||
),
|
||||
),
|
||||
'userstyle' => array(
|
||||
'screen' => array(DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less',),
|
||||
'print' => array(DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less',),
|
||||
'feed' => array(DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less',),
|
||||
'all' => array(DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less',),
|
||||
),
|
||||
'userscript' => array(
|
||||
'default' => array(DOKU_CONF . 'userscript.js',),
|
||||
),
|
||||
'styleini' => array(
|
||||
'default' => array(DOKU_INC . 'lib/tpl/%TEMPLATE%/' . 'style.ini'),
|
||||
'local' => array(DOKU_CONF . 'tpl/%TEMPLATE%/' . 'style.ini')
|
||||
),
|
||||
);
|
||||
DOKU_CONF . 'plugins.protected.php'
|
||||
]
|
||||
],
|
||||
'userstyle' => [
|
||||
'screen' => [
|
||||
DOKU_CONF . 'userstyle.css',
|
||||
DOKU_CONF . 'userstyle.less'
|
||||
],
|
||||
'print' => [
|
||||
DOKU_CONF . 'userprint.css',
|
||||
DOKU_CONF . 'userprint.less'
|
||||
],
|
||||
'feed' => [
|
||||
DOKU_CONF . 'userfeed.css',
|
||||
DOKU_CONF . 'userfeed.less'
|
||||
],
|
||||
'all' => [
|
||||
DOKU_CONF . 'userall.css',
|
||||
DOKU_CONF . 'userall.less'
|
||||
]
|
||||
],
|
||||
'userscript' => [
|
||||
'default' => [DOKU_CONF . 'userscript.js']
|
||||
],
|
||||
'styleini' => [
|
||||
'default' => [DOKU_INC . 'lib/tpl/%TEMPLATE%/' . 'style.ini'],
|
||||
'local' => [DOKU_CONF . 'tpl/%TEMPLATE%/' . 'style.ini']
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
@ -301,52 +324,71 @@ class DokuWikiFarmCore {
|
||||
*
|
||||
* These are only added for animals, not the farmer
|
||||
*/
|
||||
protected function adjustCascade() {
|
||||
protected function adjustCascade()
|
||||
{
|
||||
// nothing to do when on the farmer:
|
||||
if(!$this->animal) return;
|
||||
if (!$this->animal) return;
|
||||
|
||||
global $config_cascade;
|
||||
foreach($this->config['inherit'] as $key => $val) {
|
||||
if(!$val) continue;
|
||||
foreach ($this->config['inherit'] as $key => $val) {
|
||||
if (!$val) continue;
|
||||
|
||||
// prepare what is to append or prepend
|
||||
$append = array();
|
||||
$prepend = array();
|
||||
if($key == 'main') {
|
||||
$append = array(
|
||||
'default' => array(DOKU_INC . 'conf/local.php'),
|
||||
'protected' => array(DOKU_INC . 'lib/plugins/farmer/includes/config.php')
|
||||
);
|
||||
} elseif($key == 'license') {
|
||||
$append = array('default' => array(DOKU_INC . 'conf/' . $key . '.local.php'));
|
||||
} elseif($key == 'userscript') {
|
||||
$prepend = array('default' => array(DOKU_INC . 'conf/userscript.js'));
|
||||
} elseif($key == 'userstyle') {
|
||||
$prepend = array(
|
||||
'screen' => array(DOKU_INC . 'conf/userstyle.css', DOKU_INC . 'conf/userstyle.less',),
|
||||
'print' => array(DOKU_INC . 'conf/userprint.css', DOKU_INC . 'conf/userprint.less',),
|
||||
'feed' => array(DOKU_INC . 'conf/userfeed.css', DOKU_INC . 'conf/userfeed.less',),
|
||||
'all' => array(DOKU_INC . 'conf/userall.css', DOKU_INC . 'conf/userall.less',),
|
||||
);
|
||||
$append = [];
|
||||
$prepend = [];
|
||||
if ($key == 'main') {
|
||||
$append = [
|
||||
'default' => [DOKU_INC . 'conf/local.php'],
|
||||
'protected' => [DOKU_INC . 'lib/plugins/farmer/includes/config.php']
|
||||
];
|
||||
} elseif ($key == 'license') {
|
||||
$append = [
|
||||
'default' => [DOKU_INC . 'conf/' . $key . '.local.php']
|
||||
];
|
||||
} elseif ($key == 'userscript') {
|
||||
$prepend = [
|
||||
'default' => [DOKU_INC . 'conf/userscript.js']
|
||||
];
|
||||
} elseif ($key == 'userstyle') {
|
||||
$prepend = [
|
||||
'screen' => [
|
||||
DOKU_INC . 'conf/userstyle.css',
|
||||
DOKU_INC . 'conf/userstyle.less'
|
||||
],
|
||||
'print' => [
|
||||
DOKU_INC . 'conf/userprint.css',
|
||||
DOKU_INC . 'conf/userprint.less'
|
||||
],
|
||||
'feed' => [
|
||||
DOKU_INC . 'conf/userfeed.css',
|
||||
DOKU_INC . 'conf/userfeed.less'
|
||||
],
|
||||
'all' => [
|
||||
DOKU_INC . 'conf/userall.css',
|
||||
DOKU_INC . 'conf/userall.less'
|
||||
]
|
||||
];
|
||||
} elseif ($key == 'styleini') {
|
||||
$append = array(
|
||||
'local' => array(
|
||||
DOKU_INC . 'conf/tpl/%TEMPLATE%/style.ini'
|
||||
)
|
||||
);
|
||||
} elseif($key == 'users') {
|
||||
$append = [
|
||||
'local' => [DOKU_INC . 'conf/tpl/%TEMPLATE%/style.ini']
|
||||
];
|
||||
} elseif ($key == 'users') {
|
||||
$config_cascade['plainauth.users']['protected'] = DOKU_INC . 'conf/users.auth.php';
|
||||
} elseif($key == 'plugins') {
|
||||
$append = array('default' => array(DOKU_INC . 'conf/plugins.local.php'));
|
||||
} elseif ($key == 'plugins') {
|
||||
$append = [
|
||||
'default' => [DOKU_INC . 'conf/plugins.local.php']
|
||||
];
|
||||
} else {
|
||||
$append = array('default' => array(DOKU_INC . 'conf/' . $key . '.local.conf'));
|
||||
$append = [
|
||||
'default' => [DOKU_INC . 'conf/' . $key . '.local.conf']
|
||||
];
|
||||
}
|
||||
|
||||
// add to cascade
|
||||
foreach($prepend as $section => $data) {
|
||||
foreach ($prepend as $section => $data) {
|
||||
$config_cascade[$key][$section] = array_merge($data, $config_cascade[$key][$section]);
|
||||
}
|
||||
foreach($append as $section => $data) {
|
||||
foreach ($append as $section => $data) {
|
||||
$config_cascade[$key][$section] = array_merge($config_cascade[$key][$section], $data);
|
||||
}
|
||||
}
|
||||
@ -358,12 +400,13 @@ class DokuWikiFarmCore {
|
||||
/**
|
||||
* Loads the farm config
|
||||
*/
|
||||
protected function loadConfig() {
|
||||
protected function loadConfig()
|
||||
{
|
||||
$ini = DOKU_INC . 'conf/farm.ini';
|
||||
if(!file_exists($ini)) return;
|
||||
if (!file_exists($ini)) return;
|
||||
$config = parse_ini_file($ini, true);
|
||||
foreach(array_keys($this->config) as $section) {
|
||||
if(isset($config[$section])) {
|
||||
foreach (array_keys($this->config) as $section) {
|
||||
if (isset($config[$section])) {
|
||||
$this->config[$section] = array_merge(
|
||||
$this->config[$section],
|
||||
$config[$section]
|
||||
@ -374,11 +417,10 @@ class DokuWikiFarmCore {
|
||||
$this->config['base']['farmdir'] = trim($this->config['base']['farmdir']);
|
||||
$this->config['base']['farmhost'] = strtolower(trim($this->config['base']['farmhost']));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// initialize it globally
|
||||
if(!defined('DOKU_UNITTEST')) {
|
||||
if (!defined('DOKU_UNITTEST')) {
|
||||
global $FARMCORE;
|
||||
$FARMCORE = new DokuWikiFarmCore();
|
||||
}
|
||||
|
339
LICENSE
Normal file
339
LICENSE
Normal file
@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
@ -1,6 +1,8 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Minimal local config
|
||||
*/
|
||||
|
||||
$conf['useacl'] = 1;
|
||||
$conf['superuser'] = '@admin';
|
||||
|
137
action/ajax.php
137
action/ajax.php
@ -1,76 +1,88 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\ActionPlugin;
|
||||
use dokuwiki\Extension\EventHandler;
|
||||
use dokuwiki\Extension\Event;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Action Component)
|
||||
*
|
||||
* Manage AJAX features
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
/**
|
||||
* Manage AJAX features
|
||||
*/
|
||||
class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
|
||||
class action_plugin_farmer_ajax extends ActionPlugin
|
||||
{
|
||||
/**
|
||||
* plugin should use this method to register its handlers with the DokuWiki's event controller
|
||||
*
|
||||
* @param Doku_Event_Handler $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER
|
||||
*
|
||||
* @param EventHandler $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER
|
||||
*/
|
||||
public function register(Doku_Event_Handler $controller) {
|
||||
$controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, '_ajax_call');
|
||||
public function register(EventHandler $controller)
|
||||
{
|
||||
$controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxCall');
|
||||
}
|
||||
|
||||
/**
|
||||
* handle ajax requests
|
||||
*
|
||||
* @param Doku_Event $event
|
||||
* @param Event $event
|
||||
* @param $param
|
||||
*/
|
||||
public function _ajax_call(Doku_Event $event, $param) {
|
||||
if(substr($event->data, 0, 13) !== 'plugin_farmer') {
|
||||
public function handleAjaxCall(Event $event, $param)
|
||||
{
|
||||
if (substr($event->data, 0, 13) !== 'plugin_farmer') {
|
||||
return;
|
||||
}
|
||||
//no other ajax call handlers needed
|
||||
$event->stopPropagation();
|
||||
$event->preventDefault();
|
||||
|
||||
if(!auth_isadmin()) die('Only admins allowed');
|
||||
if (!auth_isadmin()) die('Only admins allowed');
|
||||
|
||||
if(substr($event->data, 14) === 'getPluginMatrix') {
|
||||
$this->get_plugin_matrix($event, $param);
|
||||
if (substr($event->data, 14) === 'getPluginMatrix') {
|
||||
$this->printPluginMatrix($event, $param);
|
||||
return;
|
||||
}
|
||||
if(substr($event->data, 14) === 'modPlugin') {
|
||||
$this->plugin_mod($event, $param);
|
||||
if (substr($event->data, 14) === 'modPlugin') {
|
||||
$this->togglePluginState($event, $param);
|
||||
return;
|
||||
}
|
||||
if(substr($event->data, 14, 10) === 'getPlugins') {
|
||||
$this->get_animal_plugins($event, $param);
|
||||
if (substr($event->data, 14, 10) === 'getPlugins') {
|
||||
$this->printAnimalPlugins($event, $param);
|
||||
return;
|
||||
}
|
||||
if(substr($event->data, 14, 10) === 'checkSetup') {
|
||||
$this->check_setup($event, $param);
|
||||
if (substr($event->data, 14, 10) === 'checkSetup') {
|
||||
$this->checkSetup($event, $param);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function exists in order to provide a positive (i.e. 200) response to an ajax request to a non-existing animal.
|
||||
* Always return an empty response
|
||||
*
|
||||
* @param Doku_Event $event
|
||||
* @param $param
|
||||
* This function exists in order to provide a positive (i.e. 200) response
|
||||
* to an ajax request to a non-existing animal.
|
||||
*
|
||||
* @param Event $event
|
||||
* @param $param
|
||||
*/
|
||||
public function check_setup(Doku_Event $event, $param) {
|
||||
public function checkSetup(Event $event, $param)
|
||||
{
|
||||
$data = '';
|
||||
$json = new JSON();
|
||||
header('Content-Type: application/json');
|
||||
echo $json->encode($data);
|
||||
json_encode($data);
|
||||
}
|
||||
|
||||
public function plugin_mod(Doku_Event $event, $param) {
|
||||
/**
|
||||
* Turn a plugin on or off
|
||||
*
|
||||
* @param Event $event
|
||||
* @param $param
|
||||
*/
|
||||
public function togglePluginState(Event $event, $param)
|
||||
{
|
||||
global $INPUT;
|
||||
|
||||
/** @var helper_plugin_farmer $helper */
|
||||
@ -81,11 +93,11 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
|
||||
|
||||
$plugins = $helper->getAnimalPluginRealState($animal);
|
||||
if(!isset($plugins[$pname])) die('no such plugin');
|
||||
if (!isset($plugins[$pname])) die('no such plugin');
|
||||
$plugin = $plugins[$pname];
|
||||
|
||||
// figure out what to toggle to
|
||||
if($plugin['isdefault']) {
|
||||
if ($plugin['isdefault']) {
|
||||
$new = (int) !$plugin['actual'];
|
||||
} else {
|
||||
$new = -1;
|
||||
@ -96,16 +108,17 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
$plugins = $helper->getAnimalPluginRealState($animal);
|
||||
$plugin = $plugins[$pname];
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
echo $this->plugin_matrix_cell($plugin, $animal);
|
||||
echo $this->createPluginMatrixCell($plugin, $animal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a matrix of all animals and plugin states
|
||||
*
|
||||
* @param Doku_Event $event
|
||||
* @param Event $event
|
||||
* @param $param
|
||||
*/
|
||||
public function get_plugin_matrix(Doku_Event $event, $param) {
|
||||
public function printPluginMatrix(Event $event, $param)
|
||||
{
|
||||
/** @var helper_plugin_farmer $helper */
|
||||
$helper = plugin_load('helper', 'farmer');
|
||||
|
||||
@ -119,7 +132,7 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
echo '<thead>';
|
||||
echo '<tr>';
|
||||
echo '<th></th>';
|
||||
foreach($plugins as $plugin) {
|
||||
foreach ($plugins as $plugin) {
|
||||
echo '<th><div>' . hsc($plugin['name']) . '</div></th>';
|
||||
}
|
||||
echo '</tr>';
|
||||
@ -129,17 +142,17 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
|
||||
echo '<tr>';
|
||||
echo '<th>Default</th>';
|
||||
foreach($plugins as $plugin) {
|
||||
echo $this->plugin_matrix_cell($plugin, $this->getLang('plugin_default'), true);
|
||||
foreach ($plugins as $plugin) {
|
||||
echo $this->createPluginMatrixCell($plugin, $this->getLang('plugin_default'), true);
|
||||
}
|
||||
echo '</tr>';
|
||||
|
||||
foreach($animals as $animal) {
|
||||
foreach ($animals as $animal) {
|
||||
$plugins = $helper->getAnimalPluginRealState($animal);
|
||||
echo '<tr>';
|
||||
echo '<th>' . hsc($animal) . '</th>';
|
||||
foreach($plugins as $plugin) {
|
||||
echo $this->plugin_matrix_cell($plugin, $animal);
|
||||
foreach ($plugins as $plugin) {
|
||||
echo $this->createPluginMatrixCell($plugin, $animal);
|
||||
}
|
||||
echo '</tr>';
|
||||
}
|
||||
@ -156,8 +169,9 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
* @param bool $defaults show the defaults
|
||||
* @return string
|
||||
*/
|
||||
protected function plugin_matrix_cell($plugin, $animal, $defaults=false) {
|
||||
if($defaults) {
|
||||
protected function createPluginMatrixCell($plugin, $animal, $defaults = false)
|
||||
{
|
||||
if ($defaults) {
|
||||
$current = $plugin['default'];
|
||||
$isdefault = true;
|
||||
$td = 'th';
|
||||
@ -167,32 +181,35 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
$td = 'td';
|
||||
}
|
||||
|
||||
if($current) {
|
||||
if ($current) {
|
||||
$class = 'on';
|
||||
$lbl = '✓';
|
||||
} else {
|
||||
$class = 'off';
|
||||
$lbl = '✗';
|
||||
}
|
||||
if($isdefault) $class .= ' default';
|
||||
if ($isdefault) $class .= ' default';
|
||||
|
||||
|
||||
$attrs = array(
|
||||
$attrs = [
|
||||
'class' => $class,
|
||||
'title' => $animal . ': ' . $plugin['name'],
|
||||
'data-animal' => $animal,
|
||||
'data-plugin' => $plugin['name']
|
||||
);
|
||||
];
|
||||
$attr = buildAttributes($attrs);
|
||||
|
||||
return "<$td $attr>$lbl</$td>";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Doku_Event $event
|
||||
* @param $param
|
||||
* Create an overview on all plugins for a given animal
|
||||
*
|
||||
* @param Event $event
|
||||
* @param $param
|
||||
*/
|
||||
public function get_animal_plugins(Doku_Event $event, $param) {
|
||||
public function printAnimalPlugins(Event $event, $param)
|
||||
{
|
||||
$animal = substr($event->data, 25);
|
||||
/** @var helper_plugin_farmer $helper */
|
||||
$helper = plugin_load('helper', 'farmer');
|
||||
@ -209,21 +226,21 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
echo '<th>' . $this->getLang('plugin_disabled') . '</th>';
|
||||
echo '</tr>';
|
||||
|
||||
foreach($plugins as $plugin) {
|
||||
foreach ($plugins as $plugin) {
|
||||
echo '<tr>';
|
||||
echo '<th>' . hsc($plugin['name']) . '</th>';
|
||||
|
||||
echo '<td>';
|
||||
$attr = array();
|
||||
$attr = [];
|
||||
$attr['type'] = 'radio';
|
||||
$attr['name'] = 'bulk_plugins[' . $plugin['name'] . ']';
|
||||
$attr['value'] = '-1';
|
||||
if($plugin['isdefault']) {
|
||||
if ($plugin['isdefault']) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
echo '<label>';
|
||||
echo '<input ' . buildAttributes($attr) . ' />';
|
||||
if($plugin['default']) {
|
||||
if ($plugin['default']) {
|
||||
echo ' (' . $this->getLang('plugin_on') . ')';
|
||||
} else {
|
||||
echo ' (' . $this->getLang('plugin_off') . ')';
|
||||
@ -232,11 +249,11 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
echo '</td>';
|
||||
|
||||
echo '<td>';
|
||||
$attr = array();
|
||||
$attr = [];
|
||||
$attr['type'] = 'radio';
|
||||
$attr['name'] = 'bulk_plugins[' . $plugin['name'] . ']';
|
||||
$attr['value'] = '1';
|
||||
if(!$plugin['isdefault'] && $plugin['actual']) {
|
||||
if (!$plugin['isdefault'] && $plugin['actual']) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
echo '<label>';
|
||||
@ -246,11 +263,11 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
echo '</td>';
|
||||
|
||||
echo '<td>';
|
||||
$attr = array();
|
||||
$attr = [];
|
||||
$attr['type'] = 'radio';
|
||||
$attr['name'] = 'bulk_plugins[' . $plugin['name'] . ']';
|
||||
$attr['value'] = '0';
|
||||
if(!$plugin['isdefault'] && !$plugin['actual']) {
|
||||
if (!$plugin['isdefault'] && !$plugin['actual']) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
echo '<label>';
|
||||
@ -262,6 +279,4 @@ class action_plugin_farmer_ajax extends DokuWiki_Action_Plugin {
|
||||
echo '</tr>';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,56 +1,58 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\ActionPlugin;
|
||||
use dokuwiki\Extension\EventHandler;
|
||||
use dokuwiki\Extension\Event;
|
||||
use dokuwiki\Extension\PluginController;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Action Component)
|
||||
*
|
||||
* Disable Plugins on install
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
/**
|
||||
* Disable Plugins on install
|
||||
*/
|
||||
class action_plugin_farmer_disable extends DokuWiki_Action_Plugin {
|
||||
|
||||
class action_plugin_farmer_disable extends ActionPlugin
|
||||
{
|
||||
/**
|
||||
* plugin should use this method to register its handlers with the DokuWiki's event controller
|
||||
*
|
||||
* @param Doku_Event_Handler $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER
|
||||
*
|
||||
* @param EventHandler $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER
|
||||
*/
|
||||
public function register(Doku_Event_Handler $controller) {
|
||||
public function register(EventHandler $controller)
|
||||
{
|
||||
/** @var helper_plugin_farmer $farmer */
|
||||
$farmer = plugin_load('helper', 'farmer');
|
||||
if($farmer->getAnimal()) return;
|
||||
if ($farmer->getAnimal()) return;
|
||||
|
||||
if($this->getConf('disable_new_plugins')) {
|
||||
$controller->register_hook('PLUGIN_EXTENSION_CHANGE', 'AFTER', $this, 'handle_install');
|
||||
if ($this->getConf('disable_new_plugins')) {
|
||||
$controller->register_hook('PLUGIN_EXTENSION_CHANGE', 'AFTER', $this, 'handleInstall');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* handle install of new plugin
|
||||
*
|
||||
* @param Doku_Event $event
|
||||
* @param Event $event
|
||||
* @param $param
|
||||
*/
|
||||
public function handle_install(Doku_Event $event, $param) {
|
||||
if($event->data['action'] != 'install') return;
|
||||
public function handleInstall(Event $event, $param)
|
||||
{
|
||||
if ($event->data['action'] != 'install') return;
|
||||
|
||||
/* @var Doku_Plugin_Controller $plugin_controller */
|
||||
global $plugin_controller;
|
||||
$plugin_controller = new Doku_Plugin_Controller(); // we need to refresh the status
|
||||
$plugin_controller = new PluginController(); // we need to refresh the status
|
||||
|
||||
/** @var helper_plugin_extension_extension $ext */
|
||||
$ext = $event->data['extension'];
|
||||
$disabled = $ext->disable();
|
||||
if($disabled === true) {
|
||||
if ($disabled === true) {
|
||||
msg($this->getLang('disable_new_plugins'));
|
||||
} else {
|
||||
msg(hsc($disabled), -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,41 +1,50 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\ActionPlugin;
|
||||
use dokuwiki\Extension\EventHandler;
|
||||
use dokuwiki\Extension\Event;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Action Component)
|
||||
*
|
||||
* Handles Farm mechanisms on DokuWiki startup
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
/**
|
||||
* Handles Farm mechanisms on DokuWiki startup
|
||||
*/
|
||||
class action_plugin_farmer_startup extends DokuWiki_Action_Plugin {
|
||||
|
||||
class action_plugin_farmer_startup extends ActionPlugin
|
||||
{
|
||||
/** @var helper_plugin_farmer */
|
||||
protected $helper;
|
||||
|
||||
/**
|
||||
* action_plugin_farmer_startup constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
public function __construct()
|
||||
{
|
||||
$this->helper = plugin_load('helper', 'farmer');
|
||||
}
|
||||
|
||||
/**
|
||||
* plugin should use this method to register its handlers with the DokuWiki's event controller
|
||||
*
|
||||
* @param Doku_Event_Handler $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER
|
||||
*
|
||||
* @param EventHandler $controller DokuWiki's event controller object. Also available as global $EVENT_HANDLER
|
||||
*/
|
||||
public function register(Doku_Event_Handler $controller) {
|
||||
$controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'before_start');
|
||||
public function register(EventHandler $controller)
|
||||
{
|
||||
$controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'handleStartUp');
|
||||
}
|
||||
|
||||
public function before_start(Doku_Event $event, $param) {
|
||||
if($this->helper->wasNotfound()) $this->handleNotFound();
|
||||
/**
|
||||
* Handle the startup event
|
||||
*
|
||||
* @param Event $event
|
||||
* @param $param
|
||||
*/
|
||||
public function handleStartUp(Event $event, $param)
|
||||
{
|
||||
if ($this->helper->wasNotfound()) $this->handleNotFound();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -43,20 +52,21 @@ class action_plugin_farmer_startup extends DokuWiki_Action_Plugin {
|
||||
*
|
||||
* Will abort the current script unless the farmer is wanted
|
||||
*/
|
||||
protected function handleNotFound() {
|
||||
protected function handleNotFound()
|
||||
{
|
||||
/** @noinspection PhpUnusedLocalVariableInspection */
|
||||
global $conf, $lang;
|
||||
$config = $this->helper->getConfig();
|
||||
$show = $config['notfound']['show'];
|
||||
$url = $config['notfound']['url'];
|
||||
if($show == 'farmer') return;
|
||||
if ($show == 'farmer') return;
|
||||
|
||||
if($show == '404' || $show == 'list') {
|
||||
if ($show == '404' || $show == 'list') {
|
||||
http_status(404);
|
||||
$body = $this->locale_xhtml('notfound_' . $show);
|
||||
/** @noinspection PhpUnusedLocalVariableInspection */
|
||||
$title = '404';
|
||||
if($show == 'list') {
|
||||
if ($show == 'list') {
|
||||
/** @noinspection PhpUnusedLocalVariableInspection */
|
||||
$body .= $this->animalList();
|
||||
}
|
||||
@ -65,7 +75,7 @@ class action_plugin_farmer_startup extends DokuWiki_Action_Plugin {
|
||||
exit;
|
||||
}
|
||||
|
||||
if($show == 'redirect' && $url) {
|
||||
if ($show == 'redirect' && $url) {
|
||||
send_redirect($url);
|
||||
}
|
||||
}
|
||||
@ -75,16 +85,15 @@ class action_plugin_farmer_startup extends DokuWiki_Action_Plugin {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function animalList() {
|
||||
protected function animalList()
|
||||
{
|
||||
$html = '<ul>';
|
||||
$animals = $this->helper->getAllAnimals();
|
||||
foreach($animals as $animal) {
|
||||
foreach ($animals as $animal) {
|
||||
$link = $this->helper->getAnimalURL($animal);
|
||||
$html .= '<li><div class="li"><a href="' . $link . '">' . hsc($animal) . '</a></div></li>';
|
||||
}
|
||||
$html .= '</ul>';
|
||||
return $html;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
55
admin.php
55
admin.php
@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\AdminPlugin;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Admin Component)
|
||||
*
|
||||
@ -10,83 +12,75 @@
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
class admin_plugin_farmer extends DokuWiki_Admin_Plugin {
|
||||
|
||||
class admin_plugin_farmer extends AdminPlugin
|
||||
{
|
||||
/** @var helper_plugin_farmer */
|
||||
protected $helper;
|
||||
/** @var array The available pages for the current user in the current wiki */
|
||||
protected $pages;
|
||||
/** @var string The currently selected page */
|
||||
protected $page;
|
||||
/** @var DokuWiki_Admin_Plugin the plugin to use for the current page */
|
||||
/** @var AdminPlugin the plugin to use for the current page */
|
||||
protected $adminplugin;
|
||||
|
||||
/**
|
||||
* @return bool we're available for managers and admins
|
||||
*/
|
||||
public function forAdminOnly() {
|
||||
public function forAdminOnly()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize current page
|
||||
*/
|
||||
public function __construct() {
|
||||
public function __construct()
|
||||
{
|
||||
global $INPUT;
|
||||
$this->helper = plugin_load('helper', 'farmer');
|
||||
|
||||
// set available pages depending on user and animal
|
||||
$isanimal = (bool) $this->helper->getAnimal();
|
||||
if($isanimal || !auth_isadmin()) {
|
||||
$this->pages = array(
|
||||
'info'
|
||||
);
|
||||
if ($isanimal || !auth_isadmin()) {
|
||||
$this->pages = ['info'];
|
||||
} elseif (!$this->helper->checkFarmSetup()) {
|
||||
$this->pages = ['setup'];
|
||||
} else {
|
||||
if(!$this->helper->checkFarmSetup()) {
|
||||
$this->pages = array(
|
||||
'setup'
|
||||
);
|
||||
} else {
|
||||
$this->pages = array(
|
||||
'info',
|
||||
'config',
|
||||
'new',
|
||||
'plugins',
|
||||
'delete'
|
||||
);
|
||||
}
|
||||
$this->pages = ['info', 'config', 'new', 'plugins', 'delete'];
|
||||
}
|
||||
|
||||
// make sure current page requested is available
|
||||
$this->page = $INPUT->str('sub');
|
||||
if(!in_array($this->page, $this->pages)) {
|
||||
if (!in_array($this->page, $this->pages)) {
|
||||
$this->page = $this->pages[0];
|
||||
}
|
||||
|
||||
// load the sub component
|
||||
$this->adminplugin = plugin_load('admin', 'farmer_' . $this->page);
|
||||
if(!$this->adminplugin) nice_die('Something went wrong loading the plugin component for ' . hsc($this->page));
|
||||
if (!$this->adminplugin) nice_die('Something went wrong loading the plugin component for ' . hsc($this->page));
|
||||
}
|
||||
|
||||
/**
|
||||
* handle user request
|
||||
*/
|
||||
public function handle() {
|
||||
public function handle()
|
||||
{
|
||||
$this->adminplugin->handle();
|
||||
}
|
||||
|
||||
/**
|
||||
* output appropriate tab
|
||||
*/
|
||||
public function html() {
|
||||
public function html()
|
||||
{
|
||||
global $ID;
|
||||
|
||||
echo '<div id="plugin__farmer_admin">';
|
||||
echo '<h1>' . $this->getLang('menu') . '</h1>';
|
||||
|
||||
echo '<ul class="tabs" id="plugin__farmer_tabs">';
|
||||
foreach($this->pages as $page) {
|
||||
$link = wl($ID, array('do' => 'admin', 'page' => 'farmer', 'sub' => $page));
|
||||
foreach ($this->pages as $page) {
|
||||
$link = wl($ID, ['do' => 'admin', 'page' => 'farmer', 'sub' => $page]);
|
||||
$class = ($page == $this->page) ? 'active' : '';
|
||||
|
||||
echo '<li class="' . $class . '"><a href="' . $link . '">' . $this->getLang('tab_' . $page) . '</a></li>';
|
||||
@ -107,9 +101,8 @@ class admin_plugin_farmer extends DokuWiki_Admin_Plugin {
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getMenuSort() {
|
||||
public function getMenuSort()
|
||||
{
|
||||
return 42;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,46 +1,47 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\AdminPlugin;
|
||||
use dokuwiki\Form\Form;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Admin Component)
|
||||
*
|
||||
* Configuration Interface for farm.ini
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
use dokuwiki\Form\Form;
|
||||
|
||||
// must be run within Dokuwiki
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
/**
|
||||
* Configuration Interface for farm.ini
|
||||
*/
|
||||
class admin_plugin_farmer_config extends DokuWiki_Admin_Plugin {
|
||||
|
||||
class admin_plugin_farmer_config extends AdminPlugin
|
||||
{
|
||||
/** @var helper_plugin_farmer */
|
||||
protected $helper;
|
||||
|
||||
/**
|
||||
* @return bool admin only!
|
||||
*/
|
||||
public function forAdminOnly() {
|
||||
public function forAdminOnly()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_plugin_farmer_config constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
public function __construct()
|
||||
{
|
||||
$this->helper = plugin_load('helper', 'farmer');
|
||||
}
|
||||
|
||||
/**
|
||||
* Should carry out any processing required by the plugin.
|
||||
*/
|
||||
public function handle() {
|
||||
public function handle()
|
||||
{
|
||||
global $INPUT;
|
||||
global $ID;
|
||||
if(!$INPUT->has('farmconf')) return;
|
||||
if(!checkSecurityToken()) return;
|
||||
if (!$INPUT->has('farmconf')) return;
|
||||
if (!checkSecurityToken()) return;
|
||||
|
||||
$farmconf = $this->helper->getConfig();
|
||||
$farmdir = $farmconf['base']['farmdir'];
|
||||
@ -54,42 +55,48 @@ class admin_plugin_farmer_config extends DokuWiki_Admin_Plugin {
|
||||
$data .= $this->createIni($farmconf);
|
||||
io_saveFile($ini, $data);
|
||||
|
||||
$self = wl($ID, array('do' => 'admin', 'page' => 'farmer', 'sub' => 'config'), true, '&');
|
||||
$self = wl($ID, ['do' => 'admin', 'page' => 'farmer', 'sub' => 'config'], true, '&');
|
||||
send_redirect($self);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render HTML output, e.g. helpful text and a form
|
||||
*/
|
||||
public function html() {
|
||||
public function html()
|
||||
{
|
||||
$farmconf = $this->helper->getConfig();
|
||||
|
||||
$form = new Form(array('method' => 'post'));
|
||||
$form = new Form(['method' => 'post']);
|
||||
|
||||
$form->addFieldsetOpen($this->getLang('base'));
|
||||
$form->addHTML('<label><span>' . $this->getLang('farm dir') . '</span>' . DOKU_FARMDIR);
|
||||
$form->addTextInput('farmconf[base][farmhost]', $this->getLang('farm host'))->val($farmconf['base']['farmhost']);
|
||||
$form->addTextInput('farmconf[base][basedomain]', $this->getLang('base domain'))->val($farmconf['base']['basedomain']);
|
||||
$form->addTextInput('farmconf[base][farmhost]', $this->getLang('farm host'))
|
||||
->val($farmconf['base']['farmhost']);
|
||||
$form->addTextInput('farmconf[base][basedomain]', $this->getLang('base domain'))
|
||||
->val($farmconf['base']['basedomain']);
|
||||
$form->addFieldsetClose();
|
||||
|
||||
$form->addFieldsetOpen($this->getLang('conf_inherit'));
|
||||
foreach($farmconf['inherit'] as $key => $val) {
|
||||
foreach ($farmconf['inherit'] as $key => $val) {
|
||||
$form->setHiddenField("farmconf[inherit][$key]", 0);
|
||||
$chk = $form->addCheckbox("farmconf[inherit][$key]", $this->getLang('conf_inherit_' . $key))->useInput(false);
|
||||
if($val) $chk->attr('checked', 'checked');
|
||||
$chk = $form->addCheckbox("farmconf[inherit][$key]", $this->getLang('conf_inherit_' . $key))
|
||||
->useInput(false);
|
||||
if ($val) $chk->attr('checked', 'checked');
|
||||
}
|
||||
$form->addFieldsetClose();
|
||||
|
||||
$options = array(
|
||||
$options = [
|
||||
'farmer' => $this->getLang('conf_notfound_farmer'),
|
||||
'404' => $this->getLang('conf_notfound_404'),
|
||||
'list' => $this->getLang('conf_notfound_list'),
|
||||
'redirect' => $this->getLang('conf_notfound_redirect')
|
||||
);
|
||||
];
|
||||
|
||||
$form->addFieldsetOpen($this->getLang('conf_notfound'));
|
||||
$form->addDropdown('farmconf[notfound][show]', $options, $this->getLang('conf_notfound'))->val($farmconf['notfound']['show']);
|
||||
$form->addTextInput('farmconf[notfound][url]', $this->getLang('conf_notfound_url'))->val($farmconf['notfound']['url']);
|
||||
$form->addDropdown('farmconf[notfound][show]', $options, $this->getLang('conf_notfound'))
|
||||
->val($farmconf['notfound']['show']);
|
||||
$form->addTextInput('farmconf[notfound][url]', $this->getLang('conf_notfound_url'))
|
||||
->val($farmconf['notfound']['url']);
|
||||
$form->addFieldsetClose();
|
||||
|
||||
$form->addButton('save', $this->getLang('save'));
|
||||
@ -105,13 +112,14 @@ class admin_plugin_farmer_config extends DokuWiki_Admin_Plugin {
|
||||
* @param array $data The data to transform
|
||||
* @return string
|
||||
*/
|
||||
public function createIni($data) {
|
||||
$res = array();
|
||||
foreach($data as $key => $val) {
|
||||
if(is_array($val)) {
|
||||
public function createIni($data)
|
||||
{
|
||||
$res = [];
|
||||
foreach ($data as $key => $val) {
|
||||
if (is_array($val)) {
|
||||
$res[] = '';
|
||||
$res[] = "[$key]";
|
||||
foreach($val as $skey => $sval) {
|
||||
foreach ($val as $skey => $sval) {
|
||||
$res[] = "$skey = " . (is_numeric($sval) ? $sval : '"' . $sval . '"');
|
||||
}
|
||||
} else {
|
||||
@ -119,8 +127,6 @@ class admin_plugin_farmer_config extends DokuWiki_Admin_Plugin {
|
||||
}
|
||||
}
|
||||
$res[] = '';
|
||||
return join("\n", $res);
|
||||
return implode("\n", $res);
|
||||
}
|
||||
}
|
||||
|
||||
// vim:ts=4:sw=4:et:
|
||||
|
@ -1,80 +1,81 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\AdminPlugin;
|
||||
use dokuwiki\Form\Form;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Admin Component)
|
||||
*
|
||||
* Information about the farm and the current instance
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
|
||||
// must be run within Dokuwiki
|
||||
use dokuwiki\Form\Form;
|
||||
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
/**
|
||||
* Information about the farm and the current instance
|
||||
*/
|
||||
class admin_plugin_farmer_delete extends DokuWiki_Admin_Plugin {
|
||||
|
||||
class admin_plugin_farmer_delete extends AdminPlugin
|
||||
{
|
||||
/** @var helper_plugin_farmer */
|
||||
protected $helper;
|
||||
|
||||
/**
|
||||
* admin_plugin_farmer_info constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
public function __construct()
|
||||
{
|
||||
$this->helper = plugin_load('helper', 'farmer');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool admin only!
|
||||
*/
|
||||
public function forAdminOnly() {
|
||||
public function forAdminOnly()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should carry out any processing required by the plugin.
|
||||
*/
|
||||
public function handle() {
|
||||
public function handle()
|
||||
{
|
||||
global $INPUT;
|
||||
global $ID;
|
||||
if(!$INPUT->has('delete')) return;
|
||||
if (!$INPUT->has('delete')) return;
|
||||
|
||||
if($INPUT->filter('trim')->str('delanimal') === '') {
|
||||
if ($INPUT->filter('trim')->str('delanimal') === '') {
|
||||
msg($this->getLang('delete_noanimal'), -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if($INPUT->str('delanimal') != $INPUT->str('confirm')) {
|
||||
if ($INPUT->str('delanimal') != $INPUT->str('confirm')) {
|
||||
msg($this->getLang('delete_mismatch'), -1);
|
||||
return;
|
||||
}
|
||||
|
||||
$animaldir = DOKU_FARMDIR . $INPUT->str('delanimal');
|
||||
|
||||
if(!$this->helper->isInPath($animaldir, DOKU_FARMDIR) || !is_dir($animaldir)) {
|
||||
if (!$this->helper->isInPath($animaldir, DOKU_FARMDIR) || !is_dir($animaldir)) {
|
||||
msg($this->getLang('delete_invalid'), -1);
|
||||
return;
|
||||
}
|
||||
|
||||
// let's delete it
|
||||
$ok = io_rmdir($animaldir, true);
|
||||
if($ok) {
|
||||
if ($ok) {
|
||||
msg($this->getLang('delete_success'), 1);
|
||||
} else {
|
||||
msg($this->getLang('delete_fail'), -1);
|
||||
}
|
||||
|
||||
$link = wl($ID, array('do'=>'admin', 'page'=>'farmer', 'sub' => 'delete'), true, '&');
|
||||
$link = wl($ID, ['do' => 'admin', 'page' => 'farmer', 'sub' => 'delete'], true, '&');
|
||||
send_redirect($link);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render HTML output, e.g. helpful text and a form
|
||||
*/
|
||||
public function html() {
|
||||
public function html()
|
||||
{
|
||||
|
||||
$form = new Form();
|
||||
$form->addFieldsetOpen($this->getLang('delete_animal'));
|
||||
@ -86,10 +87,5 @@ class admin_plugin_farmer_delete extends DokuWiki_Admin_Plugin {
|
||||
$form->addButton('delete', $this->getLang('delete'));
|
||||
$form->addFieldsetClose();
|
||||
echo $form->toHTML();
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// vim:ts=4:sw=4:et:
|
||||
|
@ -1,47 +1,49 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\AdminPlugin;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Admin Component)
|
||||
*
|
||||
* Information about the farm and the current instance
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
|
||||
// must be run within Dokuwiki
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
/**
|
||||
* Information about the farm and the current instance
|
||||
*/
|
||||
class admin_plugin_farmer_info extends DokuWiki_Admin_Plugin {
|
||||
|
||||
class admin_plugin_farmer_info extends AdminPlugin
|
||||
{
|
||||
/** @var helper_plugin_farmer */
|
||||
protected $helper;
|
||||
|
||||
/**
|
||||
* admin_plugin_farmer_info constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
public function __construct()
|
||||
{
|
||||
$this->helper = plugin_load('helper', 'farmer');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool admin only!
|
||||
*/
|
||||
public function forAdminOnly() {
|
||||
public function forAdminOnly()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should carry out any processing required by the plugin.
|
||||
*/
|
||||
public function handle() {
|
||||
public function handle()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Render HTML output, e.g. helpful text and a form
|
||||
*/
|
||||
public function html() {
|
||||
public function html()
|
||||
{
|
||||
global $conf;
|
||||
global $INPUT;
|
||||
|
||||
@ -51,7 +53,7 @@ class admin_plugin_farmer_info extends DokuWiki_Admin_Plugin {
|
||||
echo '<table class="inline">';
|
||||
|
||||
$this->line('thisis', $animal ? $this->getLang('thisis.animal') : $this->getLang('thisis.farmer'));
|
||||
if($animal) {
|
||||
if ($animal) {
|
||||
$this->line('animal', $animal);
|
||||
}
|
||||
$this->line('confdir', fullpath(DOKU_CONF) . '/');
|
||||
@ -62,11 +64,11 @@ class admin_plugin_farmer_info extends DokuWiki_Admin_Plugin {
|
||||
|
||||
$this->line('animals', $this->animals($INPUT->bool('list')));
|
||||
|
||||
foreach($config['inherit'] as $key => $value) {
|
||||
foreach ($config['inherit'] as $key => $value) {
|
||||
$this->line('conf_inherit_' . $key, $this->getLang($value ? 'conf_inherit_yes' : 'conf_inherit_no'));
|
||||
}
|
||||
|
||||
$this->line('plugins', join(', ', $this->helper->getAllPlugins(false)));
|
||||
$this->line('plugins', implode(', ', $this->helper->getAllPlugins(false)));
|
||||
|
||||
echo '</table>';
|
||||
}
|
||||
@ -77,20 +79,21 @@ class admin_plugin_farmer_info extends DokuWiki_Admin_Plugin {
|
||||
* @param bool $list
|
||||
* @return string
|
||||
*/
|
||||
protected function animals($list) {
|
||||
protected function animals($list)
|
||||
{
|
||||
global $ID;
|
||||
|
||||
$animals = $this->helper->getAllAnimals();
|
||||
$html = '';
|
||||
if(!$list) {
|
||||
if (!$list) {
|
||||
$html = count($animals);
|
||||
$self = wl($ID, array('do' => 'admin', 'page' => 'farmer', 'sub' => 'info', 'list' => 1));
|
||||
$self = wl($ID, ['do' => 'admin', 'page' => 'farmer', 'sub' => 'info', 'list' => 1]);
|
||||
$html .= ' [<a href="' . $self . '">' . $this->getLang('conf_notfound_list') . '</a>]';
|
||||
return $html;
|
||||
}
|
||||
|
||||
$html .= '<ol>';
|
||||
foreach($animals as $animal) {
|
||||
foreach ($animals as $animal) {
|
||||
$link = $this->helper->getAnimalURL($animal);
|
||||
$html .= '<li><div class="li"><a href="' . $link . '">' . $animal . '</a></div></li>';
|
||||
}
|
||||
@ -104,13 +107,11 @@ class admin_plugin_farmer_info extends DokuWiki_Admin_Plugin {
|
||||
* @param string $langkey
|
||||
* @param string $value
|
||||
*/
|
||||
protected function line($langkey, $value) {
|
||||
protected function line($langkey, $value)
|
||||
{
|
||||
echo '<tr>';
|
||||
echo '<th>' . $this->getLang($langkey) . '</th>';
|
||||
echo '<td>' . $value . '</td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim:ts=4:sw=4:et:
|
||||
|
206
admin/new.php
206
admin/new.php
@ -1,49 +1,65 @@
|
||||
<?php
|
||||
|
||||
use chrisbliss18\phpico\PHPIco;
|
||||
use dokuwiki\Extension\AdminPlugin;
|
||||
use dokuwiki\Form\Form;
|
||||
use splitbrain\RingIcon\RingIcon;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Admin Component)
|
||||
*
|
||||
* Create new animals
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
*/
|
||||
|
||||
// must be run within Dokuwiki
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
|
||||
class admin_plugin_farmer_new extends AdminPlugin
|
||||
{
|
||||
/** @var helper_plugin_farmer $helper */
|
||||
protected $helper;
|
||||
|
||||
/**
|
||||
* @return bool true if only access for superuser, false is for superusers and moderators
|
||||
*/
|
||||
public function forAdminOnly() {
|
||||
public function forAdminOnly()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_plugin_farmer_new constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
public function __construct()
|
||||
{
|
||||
$this->helper = plugin_load('helper', 'farmer');
|
||||
}
|
||||
|
||||
/**
|
||||
* Should carry out any processing required by the plugin.
|
||||
*/
|
||||
public function handle() {
|
||||
public function handle()
|
||||
{
|
||||
global $INPUT;
|
||||
global $ID;
|
||||
if(!$INPUT->has('farmer__submit')) return;
|
||||
if (!$INPUT->has('farmer__submit')) return;
|
||||
|
||||
$data = $this->validateAnimalData();
|
||||
if(!$data) return;
|
||||
if($this->createNewAnimal($data['name'], $data['admin'], $data['pass'], $data['template'], $data['aclpolicy'], $data['allowreg'])) {
|
||||
if (!$data) return;
|
||||
if (
|
||||
$this->createNewAnimal(
|
||||
$data['name'],
|
||||
$data['admin'],
|
||||
$data['pass'],
|
||||
$data['template'],
|
||||
$data['aclpolicy'],
|
||||
$data['allowreg']
|
||||
)
|
||||
) {
|
||||
$url = $this->helper->getAnimalURL($data['name']);
|
||||
$link = '<a href="' . $url . '">' . hsc($data['name']) . '</a>';
|
||||
|
||||
msg(sprintf($this->getLang('animal creation success'), $link), 1);
|
||||
$link = wl($ID, array('do' => 'admin', 'page' => 'farmer', 'sub' => 'new'), true, '&');
|
||||
$link = wl($ID, ['do' => 'admin', 'page' => 'farmer', 'sub' => 'new'], true, '&');
|
||||
send_redirect($link);
|
||||
}
|
||||
}
|
||||
@ -51,11 +67,12 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
/**
|
||||
* Render HTML output, e.g. helpful text and a form
|
||||
*/
|
||||
public function html() {
|
||||
public function html()
|
||||
{
|
||||
global $lang;
|
||||
$farmconfig = $this->helper->getConfig();
|
||||
|
||||
$form = new \dokuwiki\Form\Form();
|
||||
$form = new Form();
|
||||
$form->addClass('plugin_farmer')->id('farmer__create_animal_form');
|
||||
|
||||
$form->addFieldsetOpen($this->getLang('animal configuration'));
|
||||
@ -65,39 +82,53 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
$animals = $this->helper->getAllAnimals();
|
||||
array_unshift($animals, '');
|
||||
$form->addFieldsetOpen($this->getLang('animal template'));
|
||||
$form->addDropdown('animaltemplate', $animals)->addClass('farmer_chosen_animals');
|
||||
$form->addDropdown('animaltemplate', $animals)
|
||||
->addClass('farmer_chosen_animals');
|
||||
$form->addFieldsetClose();
|
||||
|
||||
$form->addFieldsetOpen($lang['i_policy'])->attr('id', 'aclPolicyFieldset');
|
||||
$policyOptions = array('open' => $lang['i_pol0'],'public' => $lang['i_pol1'], 'closed' => $lang['i_pol2']);
|
||||
$form->addDropdown('aclpolicy', $policyOptions)->addClass('acl_chosen');
|
||||
$policyOptions = ['open' => $lang['i_pol0'], 'public' => $lang['i_pol1'], 'closed' => $lang['i_pol2']];
|
||||
$form->addDropdown('aclpolicy', $policyOptions)
|
||||
->addClass('acl_chosen');
|
||||
if ($farmconfig['inherit']['main']) {
|
||||
$form->addRadioButton('allowreg',$this->getLang('inherit user registration'))->val('inherit')->attr('checked', 'checked');
|
||||
$form->addRadioButton('allowreg',$this->getLang('enable user registration'))->val('allow');
|
||||
$form->addRadioButton('allowreg',$this->getLang('disable user registration'))->val('disable');
|
||||
$form->addRadioButton('allowreg', $this->getLang('inherit user registration'))
|
||||
->val('inherit')
|
||||
->attr('checked', 'checked');
|
||||
$form->addRadioButton('allowreg', $this->getLang('enable user registration'))
|
||||
->val('allow');
|
||||
$form->addRadioButton('allowreg', $this->getLang('disable user registration'))
|
||||
->val('disable');
|
||||
} else {
|
||||
$form->addCheckbox('allowreg', $lang['i_allowreg'])->attr('checked', 'checked');
|
||||
$form->addCheckbox('allowreg', $lang['i_allowreg'])
|
||||
->attr('checked', 'checked');
|
||||
}
|
||||
|
||||
$form->addFieldsetClose();
|
||||
|
||||
$form->addFieldsetOpen($this->getLang('animal administrator'));
|
||||
$btn = $form->addRadioButton('adminsetup', $this->getLang('noUsers'))->val('noUsers');
|
||||
if($farmconfig['inherit']['users']) {
|
||||
|
||||
$btn = $form->addRadioButton('adminsetup', $this->getLang('noUsers'))
|
||||
->val('noUsers');
|
||||
if ($farmconfig['inherit']['users']) {
|
||||
$btn->attr('checked', 'checked'); // default when inherit available
|
||||
} else {
|
||||
// no user copying when inheriting
|
||||
$form->addRadioButton('adminsetup', $this->getLang('importUsers'))->val('importUsers');
|
||||
$form->addRadioButton('adminsetup', $this->getLang('currentAdmin'))->val('currentAdmin');
|
||||
$form->addRadioButton('adminsetup', $this->getLang('importUsers'))
|
||||
->val('importUsers');
|
||||
$form->addRadioButton('adminsetup', $this->getLang('currentAdmin'))
|
||||
->val('currentAdmin');
|
||||
}
|
||||
$btn = $form->addRadioButton('adminsetup', $this->getLang('newAdmin'))->val('newAdmin');
|
||||
if(!$farmconfig['inherit']['users']) {
|
||||
$btn = $form->addRadioButton('adminsetup', $this->getLang('newAdmin'))
|
||||
->val('newAdmin');
|
||||
if (!$farmconfig['inherit']['users']) {
|
||||
$btn->attr('checked', 'checked'); // default when inherit not available
|
||||
}
|
||||
$form->addPasswordInput('adminPassword', $this->getLang('admin password'));
|
||||
$form->addFieldsetClose();
|
||||
|
||||
$form->addButton('farmer__submit', $this->getLang('submit'))->attr('type', 'submit')->val('newAnimal');
|
||||
$form->addButton('farmer__submit', $this->getLang('submit'))
|
||||
->attr('type', 'submit')
|
||||
->val('newAnimal');
|
||||
echo $form->toHTML();
|
||||
}
|
||||
|
||||
@ -106,7 +137,8 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
*
|
||||
* @return array|bool false on errors, clean data otherwise
|
||||
*/
|
||||
protected function validateAnimalData() {
|
||||
protected function validateAnimalData()
|
||||
{
|
||||
global $INPUT;
|
||||
|
||||
$animalname = $INPUT->filter('trim')->str('animalname');
|
||||
@ -116,48 +148,48 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
$aclpolicy = $INPUT->filter('trim')->str('aclpolicy');
|
||||
$allowreg = $INPUT->str('allowreg');
|
||||
|
||||
$errors = array();
|
||||
$errors = [];
|
||||
|
||||
if($animalname === '') {
|
||||
if ($animalname === '') {
|
||||
$errors[] = $this->getLang('animalname_missing');
|
||||
} elseif(!$this->helper->validateAnimalName($animalname)) {
|
||||
} elseif (!$this->helper->validateAnimalName($animalname)) {
|
||||
$errors[] = $this->getLang('animalname_invalid');
|
||||
}
|
||||
|
||||
if($adminsetup === 'newAdmin' && $adminpass === '') {
|
||||
if ($adminsetup === 'newAdmin' && $adminpass === '') {
|
||||
$errors[] = $this->getLang('adminPassword_empty');
|
||||
}
|
||||
|
||||
if($animalname !== '' && file_exists(DOKU_FARMDIR . '/' . $animalname)) {
|
||||
if ($animalname !== '' && file_exists(DOKU_FARMDIR . '/' . $animalname)) {
|
||||
$errors[] = $this->getLang('animalname_preexisting');
|
||||
}
|
||||
|
||||
if (!is_dir(DOKU_FARMDIR . $template) && !in_array($aclpolicy,array('open', 'public', 'closed'))) {
|
||||
if (!is_dir(DOKU_FARMDIR . $template) && !in_array($aclpolicy, ['open', 'public', 'closed'])) {
|
||||
$errors[] = $this->getLang('aclpolicy missing/bad');
|
||||
}
|
||||
|
||||
if($errors) {
|
||||
foreach($errors as $error) {
|
||||
if ($errors) {
|
||||
foreach ($errors as $error) {
|
||||
msg($error, -1);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!is_dir(DOKU_FARMDIR . $template)) {
|
||||
if (!is_dir(DOKU_FARMDIR . $template)) {
|
||||
$template = '';
|
||||
}
|
||||
if ($template != '') {
|
||||
$aclpolicy = '';
|
||||
}
|
||||
|
||||
return array(
|
||||
return [
|
||||
'name' => $animalname,
|
||||
'admin' => $adminsetup,
|
||||
'pass' => $adminpass,
|
||||
'template' => $template,
|
||||
'aclpolicy' => $aclpolicy,
|
||||
'allowreg' => $allowreg
|
||||
);
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
@ -172,28 +204,29 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
* @return bool true if successful
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function createNewAnimal($name, $adminSetup, $adminPassword, $template, $aclpolicy, $userreg) {
|
||||
protected function createNewAnimal($name, $adminSetup, $adminPassword, $template, $aclpolicy, $userreg)
|
||||
{
|
||||
$animaldir = DOKU_FARMDIR . $name;
|
||||
|
||||
// copy basic template
|
||||
$ok = $this->helper->io_copyDir(__DIR__ . '/../_animal', $animaldir);
|
||||
if(!$ok) {
|
||||
$ok = $this->helper->copyDir(__DIR__ . '/../_animal', $animaldir);
|
||||
if (!$ok) {
|
||||
msg($this->getLang('animal creation error'), -1);
|
||||
return false;
|
||||
}
|
||||
|
||||
// copy animal template
|
||||
if($template != '') {
|
||||
foreach(array('conf', 'data/pages', 'data/media', 'data/meta', 'data/media_meta', 'index') as $dir) {
|
||||
if ($template != '') {
|
||||
foreach (['conf', 'data/pages', 'data/media', 'data/meta', 'data/media_meta', 'index'] as $dir) {
|
||||
$templatedir = DOKU_FARMDIR . $template . '/' . $dir;
|
||||
if(!is_dir($templatedir)) continue;
|
||||
if (!is_dir($templatedir)) continue;
|
||||
// do not copy changelogs in meta
|
||||
if(substr($dir, -4) == 'meta') {
|
||||
if (substr($dir, -4) == 'meta') {
|
||||
$exclude = '/\.changes$/';
|
||||
} else {
|
||||
$exclude = '';
|
||||
}
|
||||
if(!$this->helper->io_copyDir($templatedir, $animaldir . '/' . $dir, $exclude)) {
|
||||
if (!$this->helper->copyDir($templatedir, $animaldir . '/' . $dir, $exclude)) {
|
||||
msg(sprintf($this->getLang('animal template copy error'), $dir), -1);
|
||||
// we go on anyway
|
||||
}
|
||||
@ -204,37 +237,37 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
$ok &= io_saveFile($animaldir . '/conf/local.php', "\n" . '$conf[\'title\'] = \'' . $name . '\';' . "\n", true);
|
||||
|
||||
// create a random logo and favicon
|
||||
if(!class_exists('\splitbrain\RingIcon\RingIcon', false)) {
|
||||
if (!class_exists('\splitbrain\RingIcon\RingIcon', false)) {
|
||||
require(__DIR__ . '/../3rdparty/RingIcon.php');
|
||||
}
|
||||
if(!class_exists('\chrisbliss18\phpico\PHPIco', false)) {
|
||||
if (!class_exists('\chrisbliss18\phpico\PHPIco', false)) {
|
||||
require(__DIR__ . '/../3rdparty/PHPIco.php');
|
||||
}
|
||||
try {
|
||||
if(function_exists('imagecreatetruecolor')) {
|
||||
if (function_exists('imagecreatetruecolor')) {
|
||||
$logo = $animaldir . '/data/media/wiki/logo.png';
|
||||
if(!file_exists($logo)) {
|
||||
$ringicon = new \splitbrain\RingIcon\RingIcon(64);
|
||||
if (!file_exists($logo)) {
|
||||
$ringicon = new RingIcon(64);
|
||||
$ringicon->createImage($animaldir, $logo);
|
||||
}
|
||||
|
||||
$icon = $animaldir . '/data/media/wiki/favicon.ico';
|
||||
if(!file_exists($icon)) {
|
||||
$icongen = new \chrisbliss18\phpico\PHPIco($logo);
|
||||
$icongen->save_ico($icon);
|
||||
if (!file_exists($icon)) {
|
||||
$icongen = new PHPIco($logo);
|
||||
$icongen->saveIco($icon);
|
||||
}
|
||||
}
|
||||
} catch(\Exception $ignore) {
|
||||
} catch (\Exception $ignore) {
|
||||
// something went wrong, but we don't care. this is a nice to have feature only
|
||||
}
|
||||
|
||||
// create admin user
|
||||
if($adminSetup === 'newAdmin') {
|
||||
if ($adminSetup === 'newAdmin') {
|
||||
$users = "# <?php exit()?>\n" . $this->makeAdminLine($adminPassword) . "\n";
|
||||
} elseif($adminSetup === 'currentAdmin') {
|
||||
} elseif ($adminSetup === 'currentAdmin') {
|
||||
$users = "# <?php exit()?>\n" . $this->getAdminLine() . "\n";
|
||||
} elseif($adminSetup === 'noUsers') {
|
||||
if(file_exists($animaldir . '/conf/users.auth.php')) {
|
||||
} elseif ($adminSetup === 'noUsers') {
|
||||
if (file_exists($animaldir . '/conf/users.auth.php')) {
|
||||
// a user file exists already, probably from animal template - don't overwrite
|
||||
$users = '';
|
||||
} else {
|
||||
@ -244,7 +277,7 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
} else {
|
||||
$users = io_readFile(DOKU_CONF . 'users.auth.php');
|
||||
}
|
||||
if($users) {
|
||||
if ($users) {
|
||||
$ok &= io_saveFile($animaldir . '/conf/users.auth.php', $users);
|
||||
}
|
||||
|
||||
@ -267,24 +300,36 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
default:
|
||||
throw new Exception('Undefined aclpolicy given');
|
||||
}
|
||||
$ok &= io_saveFile($animaldir . '/conf/acl.auth.php', join("\n", $aclfile)."\n");
|
||||
$ok &= io_saveFile($animaldir . '/conf/acl.auth.php', implode("\n", $aclfile) . "\n");
|
||||
|
||||
global $conf;
|
||||
switch ($userreg) {
|
||||
case 'allow':
|
||||
$disableactions = join(',', array_diff(explode(',', $conf['disableactions']), array('register')));
|
||||
$ok &= io_saveFile($animaldir . '/conf/local.php', "\n" . '$conf[\'disableactions\'] = \''.$disableactions.'\';' . "\n", true);
|
||||
$disableactions = implode(',', array_diff(explode(',', $conf['disableactions']), ['register']));
|
||||
$ok &= io_saveFile(
|
||||
$animaldir . '/conf/local.php',
|
||||
"\n" . '$conf[\'disableactions\'] = \'' . $disableactions . '\';' . "\n",
|
||||
true
|
||||
);
|
||||
break;
|
||||
case 'disable':
|
||||
$disableactions = join(',', array_merge(explode(',', $conf['disableactions']), array('register')));
|
||||
$ok &= io_saveFile($animaldir . '/conf/local.php', "\n" . '$conf[\'disableactions\'] = \''.$disableactions.'\';' . "\n", true);
|
||||
$disableactions = implode(',', array_merge(explode(',', $conf['disableactions']), ['register']));
|
||||
$ok &= io_saveFile(
|
||||
$animaldir . '/conf/local.php',
|
||||
"\n" . '$conf[\'disableactions\'] = \'' . $disableactions . '\';' . "\n",
|
||||
true
|
||||
);
|
||||
break;
|
||||
case 'inherit':
|
||||
case true:
|
||||
// nothing needs to be done
|
||||
break;
|
||||
default:
|
||||
$ok &= io_saveFile($animaldir . '/conf/local.php', "\n" . '$conf[\'disableactions\'] = \'register\';' . "\n", true);
|
||||
$ok &= io_saveFile(
|
||||
$animaldir . '/conf/local.php',
|
||||
"\n" . '$conf[\'disableactions\'] = \'register\';' . "\n",
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -293,7 +338,7 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
$deactivatedPluginsList = array_map('trim', $deactivatedPluginsList);
|
||||
$deactivatedPluginsList = array_unique($deactivatedPluginsList);
|
||||
$deactivatedPluginsList = array_filter($deactivatedPluginsList);
|
||||
foreach($deactivatedPluginsList as $plugin) {
|
||||
foreach ($deactivatedPluginsList as $plugin) {
|
||||
$this->helper->setPluginState(trim($plugin), $name, 0);
|
||||
}
|
||||
|
||||
@ -306,16 +351,12 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
* @param $password
|
||||
* @return string
|
||||
*/
|
||||
protected function makeAdminLine($password) {
|
||||
protected function makeAdminLine($password)
|
||||
{
|
||||
$pass = auth_cryptPassword($password);
|
||||
$line = join(
|
||||
':', array(
|
||||
'admin',
|
||||
$pass,
|
||||
'Administrator',
|
||||
'admin@example.org',
|
||||
'admin,user'
|
||||
)
|
||||
$line = implode(
|
||||
':',
|
||||
['admin', $pass, 'Administrator', 'admin@example.org', 'admin,user']
|
||||
);
|
||||
return $line;
|
||||
}
|
||||
@ -325,14 +366,13 @@ class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getAdminLine() {
|
||||
protected function getAdminLine()
|
||||
{
|
||||
$currentAdmin = $_SERVER['REMOTE_USER'];
|
||||
$masterUsers = file_get_contents(DOKU_CONF . 'users.auth.php');
|
||||
$masterUsers = ltrim(strstr($masterUsers, "\n" . $currentAdmin . ":"));
|
||||
|
||||
$newAdmin = substr($masterUsers, 0, strpos($masterUsers, "\n") + 1);
|
||||
return $newAdmin;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim:ts=4:sw=4:et:
|
||||
|
@ -1,50 +1,51 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\AdminPlugin;
|
||||
use dokuwiki\Form\Form;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Admin Component)
|
||||
*
|
||||
* Manage Animal Plugin settings
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
|
||||
// must be run within Dokuwiki
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
/**
|
||||
* Manage Animal Plugin settings
|
||||
*/
|
||||
class admin_plugin_farmer_plugins extends DokuWiki_Admin_Plugin {
|
||||
|
||||
class admin_plugin_farmer_plugins extends AdminPlugin
|
||||
{
|
||||
/** @var helper_plugin_farmer $helper */
|
||||
private $helper;
|
||||
|
||||
public function __construct() {
|
||||
public function __construct()
|
||||
{
|
||||
$this->helper = plugin_load('helper', 'farmer');
|
||||
}
|
||||
|
||||
/**
|
||||
* handle user request
|
||||
*/
|
||||
public function handle() {
|
||||
public function handle()
|
||||
{
|
||||
global $INPUT;
|
||||
global $ID;
|
||||
|
||||
$self = wl($ID, array('do' => 'admin', 'page' => 'farmer', 'sub' => 'plugins'), true, '&');
|
||||
$self = wl($ID, ['do' => 'admin', 'page' => 'farmer', 'sub' => 'plugins'], true, '&');
|
||||
|
||||
if($INPUT->has('bulk_plugin') && $INPUT->has('state')) {
|
||||
if ($INPUT->has('bulk_plugin') && $INPUT->has('state')) {
|
||||
$animals = $this->helper->getAllAnimals();
|
||||
$plugin = $INPUT->str('bulk_plugin');
|
||||
foreach($animals as $animal) {
|
||||
foreach ($animals as $animal) {
|
||||
$this->helper->setPluginState($plugin, $animal, $INPUT->int('state'));
|
||||
}
|
||||
msg($this->getLang('plugindone'), 1);
|
||||
send_redirect($self);
|
||||
}
|
||||
|
||||
if($INPUT->has('bulk_animal') && $INPUT->has('bulk_plugins')) {
|
||||
if ($INPUT->has('bulk_animal') && $INPUT->has('bulk_plugins')) {
|
||||
$animal = $INPUT->str('bulk_animal');
|
||||
$activePlugins = $INPUT->arr('bulk_plugins');
|
||||
foreach($activePlugins as $plugin => $state) {
|
||||
foreach ($activePlugins as $plugin => $state) {
|
||||
$this->helper->setPluginState($plugin, $animal, $state);
|
||||
}
|
||||
msg($this->getLang('plugindone'), 1);
|
||||
@ -55,15 +56,22 @@ class admin_plugin_farmer_plugins extends DokuWiki_Admin_Plugin {
|
||||
/**
|
||||
* output appropriate html
|
||||
*/
|
||||
public function html() {
|
||||
public function html()
|
||||
{
|
||||
|
||||
echo $this->locale_xhtml('plugins');
|
||||
$switchForm = new \dokuwiki\Form\Form();
|
||||
$switchForm = new Form();
|
||||
$switchForm->addClass('plugin_farmer');
|
||||
$switchForm->addFieldsetOpen($this->getLang('bulkSingleSwitcher'));
|
||||
$switchForm->addRadioButton('bulkSingleSwitch', $this->getLang('bulkEdit'))->id('farmer__bulk')->attr('type', 'radio');
|
||||
$switchForm->addRadioButton('bulkSingleSwitch', $this->getLang('singleEdit'))->id('farmer__single')->attr('type', 'radio');
|
||||
$switchForm->addRadioButton('bulkSingleSwitch', $this->getLang('matrixEdit'))->id('farmer__matrix')->attr('type', 'radio');
|
||||
$switchForm->addRadioButton('bulkSingleSwitch', $this->getLang('bulkEdit'))
|
||||
->id('farmer__bulk')
|
||||
->attr('type', 'radio');
|
||||
$switchForm->addRadioButton('bulkSingleSwitch', $this->getLang('singleEdit'))
|
||||
->id('farmer__single')
|
||||
->attr('type', 'radio');
|
||||
$switchForm->addRadioButton('bulkSingleSwitch', $this->getLang('matrixEdit'))
|
||||
->id('farmer__matrix')
|
||||
->attr('type', 'radio');
|
||||
$switchForm->addFieldsetClose();
|
||||
echo $switchForm->toHTML();
|
||||
|
||||
@ -73,13 +81,22 @@ class admin_plugin_farmer_plugins extends DokuWiki_Admin_Plugin {
|
||||
array_unshift($plugins, '');
|
||||
|
||||
// All Animals at once
|
||||
$bulkForm = new \dokuwiki\Form\Form();
|
||||
$bulkForm = new Form();
|
||||
$bulkForm->id('farmer__pluginsforall');
|
||||
$bulkForm->addFieldsetOpen($this->getLang('bulkEditForm'));
|
||||
$bulkForm->addDropdown('bulk_plugin', $plugins);
|
||||
$bulkForm->addButton('state', $this->getLang('default'))->attr('value', '-1')->attr('type', 'submit')->attr('disabled', 'disabled');
|
||||
$bulkForm->addButton('state', $this->getLang('activate'))->attr('value', '1')->attr('type', 'submit')->attr('disabled', 'disabled');
|
||||
$bulkForm->addButton('state', $this->getLang('deactivate'))->attr('value', '0')->attr('type', 'submit')->attr('disabled', 'disabled');
|
||||
$bulkForm->addButton('state', $this->getLang('default'))
|
||||
->attr('value', '-1')
|
||||
->attr('type', 'submit')
|
||||
->attr('disabled', 'disabled');
|
||||
$bulkForm->addButton('state', $this->getLang('activate'))
|
||||
->attr('value', '1')
|
||||
->attr('type', 'submit')
|
||||
->attr('disabled', 'disabled');
|
||||
$bulkForm->addButton('state', $this->getLang('deactivate'))
|
||||
->attr('value', '0')
|
||||
->attr('type', 'submit')
|
||||
->attr('disabled', 'disabled');
|
||||
$bulkForm->addFieldsetClose();
|
||||
echo $bulkForm->toHTML();
|
||||
|
||||
@ -87,13 +104,14 @@ class admin_plugin_farmer_plugins extends DokuWiki_Admin_Plugin {
|
||||
array_unshift($animals, '');
|
||||
|
||||
// One Animal, all the plugins
|
||||
$singleForm = new \dokuwiki\Form\Form();
|
||||
$singleForm = new Form();
|
||||
$singleForm->id('farmer__pluginsforone');
|
||||
$singleForm->addFieldsetOpen($this->getLang('singleEditForm'));
|
||||
$singleForm->addDropdown('bulk_animal', $animals);
|
||||
$singleForm->addTagOpen('div')->addClass('output');
|
||||
$singleForm->addTagClose('div');
|
||||
$singleForm->addButton('save', $this->getLang('save'))->attr('disabled', 'disabled');
|
||||
$singleForm->addButton('save', $this->getLang('save'))
|
||||
->attr('disabled', 'disabled');
|
||||
|
||||
echo $singleForm->toHTML();
|
||||
|
||||
@ -101,4 +119,3 @@ class admin_plugin_farmer_plugins extends DokuWiki_Admin_Plugin {
|
||||
echo '<div id="farmer__pluginmatrix"></div>';
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,61 +1,62 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\AdminPlugin;
|
||||
use dokuwiki\Form\Form;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Admin Component)
|
||||
*
|
||||
* Setup the farm by creating preload.php etc
|
||||
*
|
||||
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
|
||||
// must be run within Dokuwiki
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
/**
|
||||
* Setup the farm by creating preload.php etc
|
||||
*/
|
||||
class admin_plugin_farmer_setup extends DokuWiki_Admin_Plugin {
|
||||
|
||||
class admin_plugin_farmer_setup extends AdminPlugin
|
||||
{
|
||||
/** @var helper_plugin_farmer $helper */
|
||||
private $helper;
|
||||
|
||||
/**
|
||||
* @return bool admin only!
|
||||
*/
|
||||
public function forAdminOnly() {
|
||||
public function forAdminOnly()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should carry out any processing required by the plugin.
|
||||
*/
|
||||
public function handle() {
|
||||
public function handle()
|
||||
{
|
||||
global $INPUT;
|
||||
global $ID;
|
||||
|
||||
if(!$INPUT->bool('farmdir')) return;
|
||||
if(!checkSecurityToken()) return;
|
||||
if (!$INPUT->bool('farmdir')) return;
|
||||
if (!checkSecurityToken()) return;
|
||||
|
||||
$this->helper = plugin_load('helper', 'farmer');
|
||||
|
||||
$farmdir = trim($INPUT->str('farmdir', ''));
|
||||
if($farmdir[0] !== '/') $farmdir = DOKU_INC . $farmdir;
|
||||
if ($farmdir[0] !== '/') $farmdir = DOKU_INC . $farmdir;
|
||||
$farmdir = fullpath($farmdir);
|
||||
|
||||
$errors = array();
|
||||
if($farmdir === '') {
|
||||
$errors = [];
|
||||
if ($farmdir === '') {
|
||||
$errors[] = $this->getLang('farmdir_missing');
|
||||
} elseif($this->helper->isInPath($farmdir, DOKU_INC) !== false) {
|
||||
} elseif ($this->helper->isInPath($farmdir, DOKU_INC) !== false) {
|
||||
$errors[] = sprintf($this->getLang('farmdir_in_dokuwiki'), hsc($farmdir), hsc(DOKU_INC));
|
||||
} elseif(!io_mkdir_p($farmdir)) {
|
||||
} elseif (!io_mkdir_p($farmdir)) {
|
||||
$errors[] = sprintf($this->getLang('farmdir_uncreatable'), hsc($farmdir));
|
||||
} elseif(!is_writeable($farmdir)) {
|
||||
} elseif (!is_writable($farmdir)) {
|
||||
$errors[] = sprintf($this->getLang('farmdir_unwritable'), hsc($farmdir));
|
||||
} elseif(count(scandir($farmdir)) > 2) {
|
||||
} elseif (count(scandir($farmdir)) > 2) {
|
||||
$errors[] = sprintf($this->getLang('farmdir_notEmpty'), hsc($farmdir));
|
||||
}
|
||||
|
||||
if($errors) {
|
||||
foreach($errors as $error) {
|
||||
if ($errors) {
|
||||
foreach ($errors as $error) {
|
||||
msg($error, -1);
|
||||
}
|
||||
return;
|
||||
@ -63,12 +64,12 @@ class admin_plugin_farmer_setup extends DokuWiki_Admin_Plugin {
|
||||
|
||||
// create the files
|
||||
$ok = $this->createPreloadPHP();
|
||||
if($ok && $INPUT->bool('htaccess')) $ok &= $this->createHtaccess();
|
||||
if($ok) $ok &= $this->createFarmIni($farmdir);
|
||||
if ($ok && $INPUT->bool('htaccess')) $ok &= $this->createHtaccess();
|
||||
if ($ok) $ok &= $this->createFarmIni($farmdir);
|
||||
|
||||
if($ok) {
|
||||
if ($ok) {
|
||||
msg($this->getLang('preload creation success'), 1);
|
||||
$link = wl($ID, array('do' => 'admin', 'page' => 'farmer', 'sub' => 'config'), true, '&');
|
||||
$link = wl($ID, ['do' => 'admin', 'page' => 'farmer', 'sub' => 'config'], true, '&');
|
||||
send_redirect($link);
|
||||
} else {
|
||||
msg($this->getLang('preload creation error'), -1);
|
||||
@ -78,13 +79,14 @@ class admin_plugin_farmer_setup extends DokuWiki_Admin_Plugin {
|
||||
/**
|
||||
* Render HTML output, e.g. helpful text and a form
|
||||
*/
|
||||
public function html() {
|
||||
public function html()
|
||||
{
|
||||
// Is preload.php already enabled?
|
||||
if(file_exists(DOKU_INC . 'inc/preload.php')) {
|
||||
if (file_exists(DOKU_INC . 'inc/preload.php')) {
|
||||
msg($this->getLang('overwrite_preload'), -1);
|
||||
}
|
||||
|
||||
$form = new \dokuwiki\Form\Form();
|
||||
$form = new Form();
|
||||
$form->addClass('plugin_farmer');
|
||||
$form->addFieldsetOpen($this->getLang('preloadPHPForm'));
|
||||
$form->addTextInput('farmdir', $this->getLang('farm dir'));
|
||||
@ -92,14 +94,14 @@ class admin_plugin_farmer_setup extends DokuWiki_Admin_Plugin {
|
||||
$form->addButton('farmer__submit', $this->getLang('submit'))->attr('type', 'submit');
|
||||
$form->addFieldsetClose();
|
||||
echo $form->toHTML();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the preload that loads our farm controller
|
||||
* @return bool true if saving was successful
|
||||
*/
|
||||
protected function createPreloadPHP() {
|
||||
protected function createPreloadPHP()
|
||||
{
|
||||
$content = "<?php\n";
|
||||
$content .= "# farm setup by farmer plugin\n";
|
||||
$content .= "if(file_exists(__DIR__ . '/../lib/plugins/farmer/DokuWikiFarmCore.php')) {\n";
|
||||
@ -113,11 +115,12 @@ class admin_plugin_farmer_setup extends DokuWiki_Admin_Plugin {
|
||||
*
|
||||
* @return bool true if saving was successful
|
||||
*/
|
||||
protected function createHtaccess() {
|
||||
protected function createHtaccess()
|
||||
{
|
||||
// load existing or template
|
||||
if(file_exists(DOKU_INC . '.htaccess')) {
|
||||
if (file_exists(DOKU_INC . '.htaccess')) {
|
||||
$old = io_readFile(DOKU_INC . '.htaccess');
|
||||
} elseif(file_exists(DOKU_INC . '.htaccess.dist')) {
|
||||
} elseif (file_exists(DOKU_INC . '.htaccess.dist')) {
|
||||
$old = io_readFile(DOKU_INC . '.htaccess.dist');
|
||||
} else {
|
||||
$old = '';
|
||||
@ -139,7 +142,8 @@ class admin_plugin_farmer_setup extends DokuWiki_Admin_Plugin {
|
||||
* @param $animalpath
|
||||
* @return bool true if saving was successful
|
||||
*/
|
||||
protected function createFarmIni($animalpath) {
|
||||
protected function createFarmIni($animalpath)
|
||||
{
|
||||
$content = "; farm config created by the farmer plugin\n\n";
|
||||
$content .= "[base]\n";
|
||||
$content .= "farmdir = $animalpath\n";
|
||||
@ -147,5 +151,3 @@ class admin_plugin_farmer_setup extends DokuWiki_Admin_Plugin {
|
||||
return io_saveFile(DOKU_INC . 'conf/farm.ini', $content);
|
||||
}
|
||||
}
|
||||
|
||||
// vim:ts=4:sw=4:et:
|
||||
|
@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Default settings for the farmer plugin
|
||||
*
|
||||
|
@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Options for the farmer plugin
|
||||
*
|
||||
|
155
helper.php
155
helper.php
@ -1,4 +1,7 @@
|
||||
<?php
|
||||
|
||||
use dokuwiki\Extension\Plugin;
|
||||
|
||||
/**
|
||||
* DokuWiki Plugin farmer (Helper Component)
|
||||
*
|
||||
@ -6,22 +9,19 @@
|
||||
* @author Michael Große <grosse@cosmocode.de>
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
*/
|
||||
|
||||
// must be run within Dokuwiki
|
||||
if(!defined('DOKU_INC')) die();
|
||||
|
||||
class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
|
||||
protected $defaultPluginState = null;
|
||||
protected $animalPluginState = array();
|
||||
class helper_plugin_farmer extends Plugin
|
||||
{
|
||||
protected $defaultPluginState;
|
||||
protected $animalPluginState = [];
|
||||
|
||||
/**
|
||||
* Returns the name of the current animal if any, false otherwise
|
||||
*
|
||||
* @return string|false
|
||||
*/
|
||||
public function getAnimal() {
|
||||
if(!isset($GLOBALS['FARMCORE'])) return false;
|
||||
public function getAnimal()
|
||||
{
|
||||
if (!isset($GLOBALS['FARMCORE'])) return false;
|
||||
return $GLOBALS['FARMCORE']->getAnimal();
|
||||
}
|
||||
|
||||
@ -30,8 +30,9 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig() {
|
||||
if(!isset($GLOBALS['FARMCORE'])) return array();
|
||||
public function getConfig()
|
||||
{
|
||||
if (!isset($GLOBALS['FARMCORE'])) return [];
|
||||
return $GLOBALS['FARMCORE']->getConfig();
|
||||
}
|
||||
|
||||
@ -40,8 +41,9 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isHostbased() {
|
||||
if(!isset($GLOBALS['FARMCORE'])) return false;
|
||||
public function isHostbased()
|
||||
{
|
||||
if (!isset($GLOBALS['FARMCORE'])) return false;
|
||||
return $GLOBALS['FARMCORE']->isHostbased();
|
||||
}
|
||||
|
||||
@ -50,8 +52,9 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function wasNotfound() {
|
||||
if(!isset($GLOBALS['FARMCORE'])) return false;
|
||||
public function wasNotfound()
|
||||
{
|
||||
if (!isset($GLOBALS['FARMCORE'])) return false;
|
||||
return $GLOBALS['FARMCORE']->wasNotfound();
|
||||
}
|
||||
|
||||
@ -61,12 +64,13 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
* @param $animal
|
||||
* @return string
|
||||
*/
|
||||
public function getAnimalURL($animal) {
|
||||
public function getAnimalURL($animal)
|
||||
{
|
||||
$config = $this->getConfig();
|
||||
|
||||
if(strpos($animal, '.') !== false) {
|
||||
if (strpos($animal, '.') !== false) {
|
||||
return 'http://' . $animal;
|
||||
} elseif($config['base']['basedomain']) {
|
||||
} elseif ($config['base']['basedomain']) {
|
||||
return 'http://' . $animal . '.' . $config['base']['basedomain'];
|
||||
} else {
|
||||
return DOKU_URL . '!' . $animal . '/';
|
||||
@ -78,12 +82,13 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAllAnimals() {
|
||||
$animals = array();
|
||||
public function getAllAnimals()
|
||||
{
|
||||
$animals = [];
|
||||
$list = glob(DOKU_FARMDIR . '*/conf/', GLOB_ONLYDIR);
|
||||
foreach($list as $path) {
|
||||
foreach ($list as $path) {
|
||||
$animal = basename(dirname($path));
|
||||
if($animal == '_animal') continue; // old template
|
||||
if ($animal == '_animal') continue; // old template
|
||||
$animals[] = $animal;
|
||||
}
|
||||
sort($animals);
|
||||
@ -99,10 +104,11 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
* @param string $container
|
||||
* @return bool
|
||||
*/
|
||||
public function isInPath($path, $container) {
|
||||
$path = fullpath($path).'/';
|
||||
$container = fullpath($container).'/';
|
||||
if($path == $container) return false;
|
||||
public function isInPath($path, $container)
|
||||
{
|
||||
$path = fullpath($path) . '/';
|
||||
$container = fullpath($container) . '/';
|
||||
if ($path === $container) return false;
|
||||
return (strpos($path, $container) === 0);
|
||||
}
|
||||
|
||||
@ -111,7 +117,8 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function checkFarmSetup() {
|
||||
public function checkFarmSetup()
|
||||
{
|
||||
return defined('DOKU_FARMDIR') && isset($GLOBALS['FARMCORE']);
|
||||
}
|
||||
|
||||
@ -120,7 +127,8 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function validateAnimalName($animalname) {
|
||||
public function validateAnimalName($animalname)
|
||||
{
|
||||
return preg_match("/^[a-z0-9]+([\\.\\-][a-z0-9]+)*$/i", $animalname) === 1;
|
||||
}
|
||||
|
||||
@ -139,38 +147,39 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
* @param string $exclude Regular expression to exclude files or directories (complete with delimiters)
|
||||
* @return bool Returns TRUE on success, FALSE on failure
|
||||
*/
|
||||
function io_copyDir($source, $destination, $exclude = '') {
|
||||
if($exclude && preg_match($exclude, $source)) {
|
||||
public function copyDir($source, $destination, $exclude = '')
|
||||
{
|
||||
if ($exclude && preg_match($exclude, $source)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(is_link($source)) {
|
||||
if (is_link($source)) {
|
||||
io_lock($destination);
|
||||
$result = symlink(readlink($source), $destination);
|
||||
io_unlock($destination);
|
||||
return $result;
|
||||
}
|
||||
|
||||
if(is_file($source)) {
|
||||
if (is_file($source)) {
|
||||
io_lock($destination);
|
||||
$result = copy($source, $destination);
|
||||
io_unlock($destination);
|
||||
return $result;
|
||||
}
|
||||
|
||||
if(!is_dir($destination)) {
|
||||
if (!is_dir($destination)) {
|
||||
io_mkdir_p($destination);
|
||||
}
|
||||
|
||||
$dir = @dir($source);
|
||||
if($dir === false) return false;
|
||||
while(false !== ($entry = $dir->read())) {
|
||||
if($entry == '.' || $entry == '..') {
|
||||
if ($dir === false) return false;
|
||||
while (false !== ($entry = $dir->read())) {
|
||||
if ($entry == '.' || $entry == '..') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// recurse into directories
|
||||
$this->io_copyDir("$source/$entry", "$destination/$entry", $exclude);
|
||||
$this->copyDir("$source/$entry", "$destination/$entry", $exclude);
|
||||
}
|
||||
|
||||
$dir->close();
|
||||
@ -183,7 +192,8 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
* @param bool $all get all plugins, even disabled ones
|
||||
* @return array
|
||||
*/
|
||||
public function getAllPlugins($all = true) {
|
||||
public function getAllPlugins($all = true)
|
||||
{
|
||||
|
||||
/** @var Doku_Plugin_Controller $plugin_controller */
|
||||
global $plugin_controller;
|
||||
@ -192,13 +202,14 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
|
||||
// filter out a few plugins
|
||||
$plugins = array_filter(
|
||||
$plugins, function ($item) {
|
||||
if($item == 'farmer') return false;
|
||||
if($item == 'extension') return false;
|
||||
if($item == 'upgrade') return false;
|
||||
if($item == 'testing') return false;
|
||||
return true;
|
||||
}
|
||||
$plugins,
|
||||
function ($item) {
|
||||
if ($item == 'farmer') return false;
|
||||
if ($item == 'extension') return false;
|
||||
if ($item == 'upgrade') return false;
|
||||
if ($item == 'testing') return false;
|
||||
return true;
|
||||
}
|
||||
);
|
||||
|
||||
sort($plugins);
|
||||
@ -213,12 +224,13 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
* @param $animal
|
||||
* @return array
|
||||
*/
|
||||
public function getAnimalPluginLocalStates($animal) {
|
||||
if(isset($this->animalPluginState[$animal])) return $this->animalPluginState[$animal];
|
||||
public function getAnimalPluginLocalStates($animal)
|
||||
{
|
||||
if (isset($this->animalPluginState[$animal])) return $this->animalPluginState[$animal];
|
||||
|
||||
$localfile = DOKU_FARMDIR . $animal . '/conf/plugins.local.php';
|
||||
$plugins = array();
|
||||
if(file_exists($localfile)) {
|
||||
$plugins = [];
|
||||
if (file_exists($localfile)) {
|
||||
include($localfile);
|
||||
}
|
||||
|
||||
@ -233,15 +245,16 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getDefaultPluginStates() {
|
||||
if(!is_null($this->defaultPluginState)) return $this->defaultPluginState;
|
||||
public function getDefaultPluginStates()
|
||||
{
|
||||
if (!is_null($this->defaultPluginState)) return $this->defaultPluginState;
|
||||
|
||||
$farmconf = $this->getConfig();
|
||||
$all = $this->getAllPlugins();
|
||||
|
||||
$plugins = array();
|
||||
foreach($all as $one) {
|
||||
if($farmconf['inherit']['plugins']) {
|
||||
$plugins = [];
|
||||
foreach ($all as $one) {
|
||||
if ($farmconf['inherit']['plugins']) {
|
||||
$plugins[$one] = !plugin_isdisabled($one);
|
||||
} else {
|
||||
$plugins[$one] = true; // default state is enabled
|
||||
@ -259,21 +272,17 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
* @param $animal
|
||||
* @return array
|
||||
*/
|
||||
public function getAnimalPluginRealState($animal) {
|
||||
$info = array();
|
||||
public function getAnimalPluginRealState($animal)
|
||||
{
|
||||
$info = [];
|
||||
|
||||
$defaults = $this->getDefaultPluginStates();
|
||||
$local = $this->getAnimalPluginLocalStates($animal);
|
||||
|
||||
foreach($defaults as $plugin => $set) {
|
||||
$current = array(
|
||||
'name' => $plugin,
|
||||
'default' => $set,
|
||||
'actual' => $set,
|
||||
'isdefault' => true
|
||||
);
|
||||
foreach ($defaults as $plugin => $set) {
|
||||
$current = ['name' => $plugin, 'default' => $set, 'actual' => $set, 'isdefault' => true];
|
||||
|
||||
if(isset($local[$plugin])) {
|
||||
if (isset($local[$plugin])) {
|
||||
$current['actual'] = (bool) $local[$plugin];
|
||||
$current['isdefault'] = false;
|
||||
}
|
||||
@ -292,12 +301,13 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
* @param string $animal
|
||||
* @param int $state -1 = default, 1 = enabled, 0 = disabled
|
||||
*/
|
||||
public function setPluginState($plugin, $animal, $state) {
|
||||
public function setPluginState($plugin, $animal, $state)
|
||||
{
|
||||
$state = (int) $state;
|
||||
|
||||
$plugins = $this->getAnimalPluginLocalStates($animal);
|
||||
if($state < 0) {
|
||||
if(isset($plugins[$plugin])) unset($plugins[$plugin]);
|
||||
if ($state < 0) {
|
||||
if (isset($plugins[$plugin])) unset($plugins[$plugin]);
|
||||
} else {
|
||||
$plugins[$plugin] = $state;
|
||||
}
|
||||
@ -305,7 +315,7 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
$this->writePluginConf($plugins, $animal);
|
||||
|
||||
// clear state cache
|
||||
if(isset($this->animalPluginState[$animal])) unset($this->animalPluginState[$animal]);
|
||||
if (isset($this->animalPluginState[$animal])) unset($this->animalPluginState[$animal]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -316,15 +326,16 @@ class helper_plugin_farmer extends DokuWiki_Plugin {
|
||||
* @param array $plugins associative array with the key being the plugin name and the value 0 or 1
|
||||
* @param string $animal Directory of the animal within DOKU_FARMDIR
|
||||
*/
|
||||
public function writePluginConf($plugins, $animal) {
|
||||
public function writePluginConf($plugins, $animal)
|
||||
{
|
||||
$pluginConf = '<?php' . "\n# plugins enabled and disabled by the farmer plugin\n";
|
||||
foreach($plugins as $plugin => $status) {
|
||||
foreach ($plugins as $plugin => $status) {
|
||||
$pluginConf .= '$plugins[\'' . $plugin . '\'] = ' . $status . ";\n";
|
||||
}
|
||||
io_saveFile(DOKU_FARMDIR . $animal . '/conf/plugins.local.php', $pluginConf);
|
||||
touch(DOKU_FARMDIR . $animal . '/conf/local.php');
|
||||
|
||||
if(function_exists('opcache_invalidate')) {
|
||||
if (function_exists('opcache_invalidate')) {
|
||||
opcache_invalidate(DOKU_FARMDIR . $animal . '/conf/plugins.local.php');
|
||||
opcache_invalidate(DOKU_FARMDIR . $animal . '/conf/local.php');
|
||||
}
|
||||
|
@ -1,13 +1,13 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This overrides some values for the animals without having to configure it
|
||||
*
|
||||
* This file is added to the protected cascade for animals only.
|
||||
* You should not edit it!
|
||||
*/
|
||||
|
||||
global $FARMCORE;
|
||||
$conf['savedir'] = $FARMCORE->getAnimalDataDir();
|
||||
$conf['basedir'] = $FARMCORE->getAnimalBaseDir();
|
||||
$conf['upgradecheck'] = 0;
|
||||
|
||||
|
||||
|
@ -1,10 +1,12 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This overrides some values for the animals without having to configure it
|
||||
*
|
||||
* This file is added to the protected cascade for animals only.
|
||||
* You should not edit it!
|
||||
*/
|
||||
|
||||
$plugins['extension'] = 0;
|
||||
$plugins['upgrade'] = 0;
|
||||
$plugins['testing'] = 0;
|
||||
|
@ -10,7 +10,7 @@
|
||||
})(document.documentElement)</script>
|
||||
<?php tpl_metaheaders() ?>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
||||
<?php echo tpl_favicon(array('favicon', 'mobile')) ?>
|
||||
<?php echo tpl_favicon(['favicon', 'mobile']) ?>
|
||||
<?php tpl_includeFile('meta.html') ?>
|
||||
</head>
|
||||
|
||||
|
Reference in New Issue
Block a user