first attempt at namespace

2.28
Jean-Christian Paul Denis 2022-12-17 22:12:10 +01:00
parent c529e76c52
commit 81d49adf53
Signed by: JcDenis
GPG Key ID: 1B5B8C5B90B6C951
9 changed files with 646 additions and 476 deletions

View File

@ -10,26 +10,48 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1);
namespace plugins\pacKman;
if (!defined('DC_CONTEXT_ADMIN')) { if (!defined('DC_CONTEXT_ADMIN')) {
return null; return null;
} }
dcCore::app()->blog->settings->addNamespace(basename(__DIR__)); /* dotclear ns */
use dcAdmin;
use dcCore;
use dcFavorites;
use dcPage;
dcCore::app()->addBehavior('adminDashboardFavoritesV2', function (dcFavorites $favs): void { class admin
$favs->register(basename(__DIR__), [ {
'title' => __('Packages repository'), public static function init()
'url' => dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__)) . '#packman-repository-repository', {
'small-icon' => [dcPage::getPF(basename(__DIR__) . '/icon.svg'), dcPage::getPF(basename(__DIR__) . '/icon-dark.svg')], dcCore::app()->blog->settings->addNamespace(basename(__DIR__));
'large-icon' => [dcPage::getPF(basename(__DIR__) . '/icon.svg'), dcPage::getPF(basename(__DIR__) . '/icon-dark.svg')], }
//'permissions' => dcCore::app()->auth->isSuperAdmin(),
]);
});
dcCore::app()->menu[dcAdmin::MENU_PLUGINS]->addItem( public static function process()
__('Packages repository'), {
dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__)) . '#packman-repository-repository', dcCore::app()->addBehavior('adminDashboardFavoritesV2', function (dcFavorites $favs): void {
[dcPage::getPF(basename(__DIR__) . '/icon.svg'), dcPage::getPF(basename(__DIR__) . '/icon-dark.svg')], $favs->register(basename(__DIR__), [
preg_match('/' . preg_quote(dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__))) . '(&.*)?$/', $_SERVER['REQUEST_URI']), 'title' => __('Packages repository'),
dcCore::app()->auth->isSuperAdmin() 'url' => dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__), [], '#packman-repository-repository'),
); 'small-icon' => [dcPage::getPF(basename(__DIR__) . '/icon.svg'), dcPage::getPF(basename(__DIR__) . '/icon-dark.svg')],
'large-icon' => [dcPage::getPF(basename(__DIR__) . '/icon.svg'), dcPage::getPF(basename(__DIR__) . '/icon-dark.svg')],
//'permissions' => dcCore::app()->auth->isSuperAdmin(),
]);
});
dcCore::app()->menu[dcAdmin::MENU_PLUGINS]->addItem(
__('Packages repository'),
dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__)) . '#packman-repository-repository',
[dcPage::getPF(basename(__DIR__) . '/icon.svg'), dcPage::getPF(basename(__DIR__) . '/icon-dark.svg')],
preg_match('/' . preg_quote(dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__))) . '(&.*)?$/', $_SERVER['REQUEST_URI']),
dcCore::app()->auth->isSuperAdmin()
);
}
}
admin::init();
admin::process();

View File

@ -10,112 +10,145 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1);
namespace plugins\pacKman;
if (!defined('DC_CONTEXT_MODULE')) { if (!defined('DC_CONTEXT_MODULE')) {
return null; return null;
} }
$redir = empty($_REQUEST['redir']) ? /* dotclear ns */
dcCore::app()->admin->__get('list')->getURL() . '#plugins' : $_REQUEST['redir']; use dcCore;
use dcPage;
# -- Get settings -- /* clearbricks ns */
dcCore::app()->blog->settings->addNamespace(basename(__DIR__)); use form;
$s = dcCore::app()->blog->settings->__get(basename(__DIR__)); use http;
use path;
$packman_pack_nocomment = $s->packman_pack_nocomment; /* php ns */
$packman_pack_fixnewline = $s->packman_pack_fixnewline; use Exception;
$packman_pack_overwrite = $s->packman_pack_overwrite;
$packman_pack_filename = $s->packman_pack_filename;
$packman_secondpack_filename = $s->packman_secondpack_filename;
$packman_pack_repository = $s->packman_pack_repository;
$packman_pack_excludefiles = $s->packman_pack_excludefiles;
# -- Set settings -- class config
if (!empty($_POST['save'])) { {
try { public static function init(): void
$packman_pack_nocomment = !empty($_POST['packman_pack_nocomment']); {
$packman_pack_fixnewline = !empty($_POST['packman_pack_fixnewline']); dcCore::app()->blog->settings->addNamespace(basename(__DIR__));
$packman_pack_overwrite = !empty($_POST['packman_pack_overwrite']); }
$packman_pack_filename = (string) $_POST['packman_pack_filename'];
$packman_secondpack_filename = (string) $_POST['packman_secondpack_filename'];
$packman_pack_repository = (string) path::real($_POST['packman_pack_repository'], false);
$packman_pack_excludefiles = (string) $_POST['packman_pack_excludefiles'];
$check = libPackman::is_configured( public static function process(): void
$packman_pack_repository, {
$packman_pack_filename, if (empty($_POST['save'])) {
$packman_secondpack_filename return;
);
if ($check) {
$s->put('packman_pack_nocomment', $packman_pack_nocomment);
$s->put('packman_pack_fixnewline', $packman_pack_fixnewline);
$s->put('packman_pack_overwrite', $packman_pack_overwrite);
$s->put('packman_pack_filename', $packman_pack_filename);
$s->put('packman_secondpack_filename', $packman_secondpack_filename);
$s->put('packman_pack_repository', $packman_pack_repository);
$s->put('packman_pack_excludefiles', $packman_pack_excludefiles);
dcPage::addSuccessNotice(
__('Configuration has been successfully updated.')
);
http::redirect(
dcCore::app()->admin->__get('list')->getURL('module=' . basename(__DIR__) . '&conf=1&redir=' .
dcCore::app()->admin->__get('list')->getRedir())
);
} }
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); # -- Set settings --
try {
$packman_pack_nocomment = !empty($_POST['packman_pack_nocomment']);
$packman_pack_fixnewline = !empty($_POST['packman_pack_fixnewline']);
$packman_pack_overwrite = !empty($_POST['packman_pack_overwrite']);
$packman_pack_filename = (string) $_POST['packman_pack_filename'];
$packman_secondpack_filename = (string) $_POST['packman_secondpack_filename'];
$packman_pack_repository = (string) path::real($_POST['packman_pack_repository'], false);
$packman_pack_excludefiles = (string) $_POST['packman_pack_excludefiles'];
$check = Utils::is_configured(
$packman_pack_repository,
$packman_pack_filename,
$packman_secondpack_filename
);
if ($check) {
$s = dcCore::app()->blog->settings->__get(basename(__DIR__));
$s->put('packman_pack_nocomment', $packman_pack_nocomment);
$s->put('packman_pack_fixnewline', $packman_pack_fixnewline);
$s->put('packman_pack_overwrite', $packman_pack_overwrite);
$s->put('packman_pack_filename', $packman_pack_filename);
$s->put('packman_secondpack_filename', $packman_secondpack_filename);
$s->put('packman_pack_repository', $packman_pack_repository);
$s->put('packman_pack_excludefiles', $packman_pack_excludefiles);
dcPage::addSuccessNotice(
__('Configuration has been successfully updated.')
);
http::redirect(
dcCore::app()->admin->__get('list')->getURL('module=' . basename(__DIR__) . '&conf=1&redir=' .
dcCore::app()->admin->__get('list')->getRedir())
);
}
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage());
}
}
public static function render(): void
{
# -- Get settings --
$s = dcCore::app()->blog->settings->__get(basename(__DIR__));
$packman_pack_nocomment = $s->packman_pack_nocomment;
$packman_pack_fixnewline = $s->packman_pack_fixnewline;
$packman_pack_overwrite = $s->packman_pack_overwrite;
$packman_pack_filename = $s->packman_pack_filename;
$packman_secondpack_filename = $s->packman_secondpack_filename;
$packman_pack_repository = $s->packman_pack_repository;
$packman_pack_excludefiles = $s->packman_pack_excludefiles;
# -- Display form --
echo '
<div class="fieldset">
<h4>' . __('Root') . '</h4>
<p><label for="packman_pack_repository">' . __('Path to repository:') . ' ' .
form::field('packman_pack_repository', 65, 255, $packman_pack_repository, 'maximal') .
'</label></p>' .
'<p class="form-note">' . sprintf(
__('Preconization: %s'),
dcCore::app()->blog->public_path ?
dcCore::app()->blog->public_path : __("Blog's public directory")
) . '</p>
</div>
<div class="fieldset">
<h4>' . __('Files') . '</h4>
<p><label for="packman_pack_filename">' . __('Name of exported package:') . ' ' .
form::field('packman_pack_filename', 65, 255, $packman_pack_filename, 'maximal') .
'</label></p>
<p class="form-note">' . sprintf(__('Preconization: %s'), '%type%-%id%') . '</p>
<p><label for="packman_secondpack_filename">' . __('Name of second exported package:') . ' ' .
form::field('packman_secondpack_filename', 65, 255, $packman_secondpack_filename, 'maximal') .
'</label></p>
<p class="form-note">' . sprintf(__('Preconization: %s'), '%type%-%id%-%version%') . '</p>
<p><label class="classic" for="packman_pack_overwrite">' .
form::checkbox('packman_pack_overwrite', 1, $packman_pack_overwrite) . ' ' .
__('Overwrite existing package') . '</label></p>
</div>
<div class="fieldset">
<h4>' . __('Content') . '</h4>
<p><label for="packman_pack_excludefiles">' . __('Extra files to exclude from package:') . ' ' .
form::field('packman_pack_excludefiles', 65, 255, $packman_pack_excludefiles, 'maximal') .
'</label></p>
<p class="form-note">' . sprintf(__('Preconization: %s'), '*.zip,*.tar,*.tar.gz') . '</p>
<p><label class="classic" for="packman_pack_nocomment">' .
form::checkbox('packman_pack_nocomment', 1, $packman_pack_nocomment) . ' ' .
__('Remove comments from files') . '</label></p>
<p><label class="classic" for="packman_pack_fixnewline">' .
form::checkbox('packman_pack_fixnewline', 1, $packman_pack_fixnewline) . ' ' .
__('Fix newline style from files content') . '</label></p>
</div>';
} }
} }
# -- Display form -- config::init();
echo ' config::process();
<div class="fieldset"> config::render();
<h4>' . __('Root') . '</h4>
<p><label for="packman_pack_repository">' . __('Path to repository:') . ' ' .
form::field('packman_pack_repository', 65, 255, $packman_pack_repository, 'maximal') .
'</label></p>' .
'<p class="form-note">' . sprintf(
__('Preconization: %s'),
dcCore::app()->blog->public_path ?
dcCore::app()->blog->public_path : __("Blog's public directory")
) . '</p>
</div>
<div class="fieldset">
<h4>' . __('Files') . '</h4>
<p><label for="packman_pack_filename">' . __('Name of exported package:') . ' ' .
form::field('packman_pack_filename', 65, 255, $packman_pack_filename, 'maximal') .
'</label></p>
<p class="form-note">' . sprintf(__('Preconization: %s'), '%type%-%id%') . '</p>
<p><label for="packman_secondpack_filename">' . __('Name of second exported package:') . ' ' .
form::field('packman_secondpack_filename', 65, 255, $packman_secondpack_filename, 'maximal') .
'</label></p>
<p class="form-note">' . sprintf(__('Preconization: %s'), '%type%-%id%-%version%') . '</p>
<p><label class="classic" for="packman_pack_overwrite">' .
form::checkbox('packman_pack_overwrite', 1, $packman_pack_overwrite) . ' ' .
__('Overwrite existing package') . '</label></p>
</div>
<div class="fieldset">
<h4>' . __('Content') . '</h4>
<p><label for="packman_pack_excludefiles">' . __('Extra files to exclude from package:') . ' ' .
form::field('packman_pack_excludefiles', 65, 255, $packman_pack_excludefiles, 'maximal') .
'</label></p>
<p class="form-note">' . sprintf(__('Preconization: %s'), '*.zip,*.tar,*.tar.gz') . '</p>
<p><label class="classic" for="packman_pack_nocomment">' .
form::checkbox('packman_pack_nocomment', 1, $packman_pack_nocomment) . ' ' .
__('Remove comments from files') . '</label></p>
<p><label class="classic" for="packman_pack_fixnewline">' .
form::checkbox('packman_pack_fixnewline', 1, $packman_pack_fixnewline) . ' ' .
__('Fix newline style from files content') . '</label></p>
</div>';

View File

@ -10,6 +10,11 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1);
// can not use namespace as it is included inside a class method,
// and also can be included in third party plugins class methods.
if (!defined('DC_RC_PATH')) { if (!defined('DC_RC_PATH')) {
return null; return null;
} }

View File

@ -10,84 +10,100 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1);
namespace plugins\pacKman;
if (!defined('DC_CONTEXT_ADMIN')) { if (!defined('DC_CONTEXT_ADMIN')) {
return null; return null;
} }
# -- Module specs -- /* dotclear ns */
use dcCore;
$mod_conf = [ /* php ns */
[ use Exception;
'packman_menu_plugins',
'Add link to pacKman in plugins page',
false,
'boolean',
],
[
'packman_pack_nocomment',
'Remove comments from files',
false,
'boolean',
],
[
'packman_pack_overwrite',
'Overwrite existing package',
false,
'boolean',
],
[
'packman_pack_filename',
'Name of package',
'%type%-%id%',
'string',
],
[
'packman_secondpack_filename',
'Name of second package',
'%type%-%id%-%version%',
'string',
],
[
'packman_pack_repository',
'Path to package repository',
'',
'string',
],
[
'packman_pack_excludefiles',
'Extra files to exclude from package',
'*.zip,*.tar,*.tar.gz,.directory,.hg',
'string',
],
];
# -- Nothing to change below -- class install
{
try { # -- Module specs --
# Check module version private static $mod_conf = [
if (!dcCore::app()->newVersion( [
basename(__DIR__), 'packman_menu_plugins',
dcCore::app()->plugins->moduleInfo(basename(__DIR__), 'version') 'Add link to pacKman in plugins page',
)) {
return null;
}
# Set module settings
dcCore::app()->blog->settings->addNamespace(basename(__DIR__));
foreach ($mod_conf as $v) {
dcCore::app()->blog->settings->__get(basename(__DIR__))->put(
$v[0],
$v[2],
$v[3],
$v[1],
false, false,
true 'boolean',
); ],
[
'packman_pack_nocomment',
'Remove comments from files',
false,
'boolean',
],
[
'packman_pack_overwrite',
'Overwrite existing package',
false,
'boolean',
],
[
'packman_pack_filename',
'Name of package',
'%type%-%id%',
'string',
],
[
'packman_secondpack_filename',
'Name of second package',
'%type%-%id%-%version%',
'string',
],
[
'packman_pack_repository',
'Path to package repository',
'',
'string',
],
[
'packman_pack_excludefiles',
'Extra files to exclude from package',
'*.zip,*.tar,*.tar.gz,.directory,.hg',
'string',
],
];
# -- Nothing to change below --
public static function process()
{
try {
# Check module version
if (!dcCore::app()->newVersion(
basename(__DIR__),
dcCore::app()->plugins->moduleInfo(basename(__DIR__), 'version')
)) {
return null;
}
# Set module settings
dcCore::app()->blog->settings->addNamespace(basename(__DIR__));
foreach (self::$mod_conf as $v) {
dcCore::app()->blog->settings->__get(basename(__DIR__))->put(
$v[0],
$v[2],
$v[3],
$v[1],
false,
true
);
}
return true;
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage());
return false;
}
} }
return true;
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage());
return false;
} }
return install::process();

View File

@ -10,12 +10,27 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1);
namespace plugins\pacKman;
if (!defined('DC_RC_PATH')) { if (!defined('DC_RC_PATH')) {
return null; return null;
} }
Clearbricks::lib()->autoload([ /* clearbricks ns */
'dcPackman' => __DIR__ . '/inc/class.dc.packman.php', use Clearbricks;
'libPackman' => __DIR__ . '/inc/lib.packman.php',
'packmanFileZip' => __DIR__ . '/inc/lib.packman.filezip.php', class Prepend
]); {
public static function init()
{
Clearbricks::lib()->autoload([
'plugins\\pacKman\\Core' => __DIR__ . '/inc/class.core.php',
'plugins\\pacKman\\Utils' => __DIR__ . '/inc/class.utils.php',
'plugins\\pacKman\\FileZip' => __DIR__ . '/inc/class.filezip.php',
]);
}
}
Prepend::init();

View File

@ -10,11 +10,29 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1);
namespace plugins\pacKman;
if (!defined('DC_CONTEXT_ADMIN')) { if (!defined('DC_CONTEXT_ADMIN')) {
return null; return null;
} }
class dcPackman /* dotclear ns */
use dcModules;
use dcThemes;
/* clearbricks ns */
use files;
use fileUnzip;
use path;
/* packman ns */
/* php ns */
use Exception;
class Core
{ {
/** @var array Excluded files */ /** @var array Excluded files */
public static $exclude = [ public static $exclude = [
@ -129,12 +147,12 @@ class dcPackman
$fp = fopen($dest, 'wb'); $fp = fopen($dest, 'wb');
if ($nocomment) { if ($nocomment) {
packmanFileZip::$remove_comment = true; FileZip::$remove_comment = true;
} }
if ($fixnewline) { if ($fixnewline) {
packmanFileZip::$fix_newline = true; FileZip::$fix_newline = true;
} }
$zip = new packmanFileZip($fp); $zip = new FileZip($fp);
foreach ($exclude as $e) { foreach ($exclude as $e) {
$zip->addExclusion($e); $zip->addExclusion($e);

View File

@ -10,7 +10,18 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class packmanFileZip extends fileZip declare(strict_types=1);
namespace plugins\pacKman;
if (!defined('DC_CONTEXT_ADMIN')) {
return null;
}
/* clearbricks ns */
use fileZip;
class FileZip extends fileZip
{ {
/** @var boolean Remove comments from files content */ /** @var boolean Remove comments from files content */
public static $remove_comment = false; public static $remove_comment = false;

View File

@ -10,11 +10,23 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1);
namespace plugins\pacKman;
if (!defined('DC_CONTEXT_ADMIN')) { if (!defined('DC_CONTEXT_ADMIN')) {
return null; return null;
} }
class libPackman /* dotclear ns */
use dcCore;
/* clearbricks ns */
use form;
use html;
use path;
class Utils
{ {
public static function is_configured(string $repo, string $file_a, string $file_b): bool public static function is_configured(string $repo, string $file_a, string $file_b): bool
{ {
@ -206,7 +218,7 @@ class libPackman
'<a class="packman-download" href="' . '<a class="packman-download" href="' .
dcCore::app()->adminurl->get('admin.plugin.' . basename(dirname('../' . __DIR__)), [ dcCore::app()->adminurl->get('admin.plugin.' . basename(dirname('../' . __DIR__)), [
'package' => basename($module['root']), 'package' => basename($module['root']),
'repo' => $type, 'repo' => $type,
]) . '" title="' . __('Download') . '">' . ]) . '" title="' . __('Download') . '">' .
html::escapeHTML(basename($module['root'])) . '</a>' . html::escapeHTML(basename($module['root'])) . '</a>' .
'</td>' . '</td>' .

592
index.php
View File

@ -10,302 +10,340 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1);
namespace plugins\pacKman;
if (!defined('DC_CONTEXT_ADMIN')) { if (!defined('DC_CONTEXT_ADMIN')) {
return null; return null;
} }
dcPage::checkSuper(); /* dotclear ns */
use dcCore;
use dcPage;
use dcThemes;
# Queries /* clearbricks ns */
$action = $_POST['action'] ?? ''; use files;
$type = isset($_POST['type']) && in_array($_POST['type'], ['plugins', 'themes', 'repository']) ? $_POST['type'] : ''; use http;
use path;
# Settings /* php ns */
dcCore::app()->blog->settings->addNamespace(basename(__DIR__)); use Exception;
$s = dcCore::app()->blog->settings->__get(basename(__DIR__));
# Modules class index
if (!(dcCore::app()->themes instanceof dcThemes)) { {
dcCore::app()->themes = new dcThemes(); private static $plugins_path = '';
dcCore::app()->themes->loadModules(dcCore::app()->blog->themes_path, null); private static $themes_path = '';
}
$themes = dcCore::app()->themes;
$plugins = dcCore::app()->plugins;
# Paths public static function init()
$ppexp = explode(PATH_SEPARATOR, DC_PLUGINS_ROOT); {
$pppop = array_pop($ppexp); dcPage::checkSuper();
$plugins_path = (string) path::real($pppop); dcCore::app()->blog->settings->addNamespace(basename(__DIR__));
$themes_path = dcCore::app()->blog->themes_path;
$repo_path = $s->packman_pack_repository;
# Rights # Paths
$is_writable = libPackman::is_writable( $e = explode(PATH_SEPARATOR, DC_PLUGINS_ROOT);
$s->packman_pack_repository, $p = array_pop($e);
$s->packman_pack_filename self::$plugins_path = (string) path::real($p);
); self::$themes_path = dcCore::app()->blog->themes_path;
$is_editable = !empty($type) }
&& !empty($_POST['modules'])
&& is_array($_POST['modules']);
$is_configured = libPackman::is_configured( public static function process()
$s->packman_pack_repository, {
$s->packman_pack_filename, # Queries
$s->packman_secondpack_filename $action = $_POST['action'] ?? '';
); $type = isset($_POST['type']) && in_array($_POST['type'], ['plugins', 'themes', 'repository']) ? $_POST['type'] : '';
# Actions # Settings
try { $s = dcCore::app()->blog->settings->__get(basename(__DIR__));
# Download
if (isset($_REQUEST['package']) && empty($type)) { # Modules
$modules = []; if (!(dcCore::app()->themes instanceof dcThemes)) {
if ($type == 'plugins') { dcCore::app()->themes = new dcThemes();
$modules = dcPackman::getPackages($plugins_path); dcCore::app()->themes->loadModules(dcCore::app()->blog->themes_path, null);
} elseif ($type == 'themes') {
$modules = dcPackman::getPackages($themes_path);
} else {
$modules = array_merge(
dcPackman::getPackages(dirname($repo_path . '/' . $s->packman_pack_filename)),
dcPackman::getPackages(dirname($repo_path . '/' . $s->packman_secondpack_filename))
);
} }
$themes = dcCore::app()->themes;
$plugins = dcCore::app()->plugins;
foreach ($modules as $f) { # Rights
if (preg_match('/' . preg_quote($_REQUEST['package']) . '$/', $f['root']) $is_writable = Utils::is_writable(
&& is_file($f['root']) && is_readable($f['root']) $s->packman_pack_repository,
) { $s->packman_pack_filename
# --BEHAVIOR-- packmanBeforeDownloadPackage );
dcCore::app()->callBehavior('packmanBeforeDownloadPackage', $f, $type); $is_editable = !empty($type)
&& !empty($_POST['modules'])
&& is_array($_POST['modules']);
header('Content-Type: application/zip'); # Actions
header('Content-Length: ' . filesize($f['root'])); try {
header('Content-Disposition: attachment; filename="' . basename($f['root']) . '"'); # Download
readfile($f['root']); if (isset($_REQUEST['package']) && empty($type)) {
$modules = [];
if ($type == 'plugins') {
$modules = Core::getPackages(self::$plugins_path);
} elseif ($type == 'themes') {
$modules = Core::getPackages(self::$themes_path);
} else {
$modules = array_merge(
Core::getPackages(dirname($s->packman_pack_repository . '/' . $s->packman_pack_filename)),
Core::getPackages(dirname($s->packman_pack_repository . '/' . $s->packman_secondpack_filename))
);
}
# --BEHAVIOR-- packmanAfterDownloadPackage foreach ($modules as $f) {
dcCore::app()->callBehavior('packmanAfterDownloadPackage', $f, $type); if (preg_match('/' . preg_quote($_REQUEST['package']) . '$/', $f['root'])
&& is_file($f['root']) && is_readable($f['root'])
) {
# --BEHAVIOR-- packmanBeforeDownloadPackage
dcCore::app()->callBehavior('packmanBeforeDownloadPackage', $f, $type);
header('Content-Type: application/zip');
header('Content-Length: ' . filesize($f['root']));
header('Content-Disposition: attachment; filename="' . basename($f['root']) . '"');
readfile($f['root']);
# --BEHAVIOR-- packmanAfterDownloadPackage
dcCore::app()->callBehavior('packmanAfterDownloadPackage', $f, $type);
exit;
}
}
# Not found
header('Content-Type: text/plain');
http::head(404, 'Not Found');
exit; exit;
} elseif (!empty($action) && !$is_editable) {
throw new Exception('No selected modules');
# Pack
} elseif ($action == 'packup') {
foreach ($_POST['modules'] as $root => $id) {
if (!Utils::moduleExists($type, $id)) {
throw new Exception('No such module');
}
$module = Utils::getModules($type, $id);
$module['id'] = $id;
$module['type'] = $type == 'themes' ? 'theme' : 'plugin';
$root = (string) $s->packman_pack_repository;
$files = [
(string) $s->packman_pack_filename,
(string) $s->packman_secondpack_filename,
];
$nocomment = (bool) $s->packman_pack_nocomment;
$fixnewline = (bool) $s->packman_pack_fixnewline;
$overwrite = (bool) $s->packman_pack_overwrite;
$exclude = explode(',', (string) $s->packman_pack_excludefiles);
# --BEHAVIOR-- packmanBeforeCreatePackage
dcCore::app()->callBehavior('packmanBeforeCreatePackage', $module);
Core::pack($module, $root, $files, $overwrite, $exclude, $nocomment, $fixnewline);
# --BEHAVIOR-- packmanAfterCreatePackage
dcCore::app()->callBehavior('packmanAfterCreatePackage', $module);
}
dcPage::addSuccessNotice(
__('Package successfully created.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-' . $type);
}
# Delete
} elseif ($action == 'delete') {
foreach ($_POST['modules'] as $root => $id) {
if (!file_exists($root) || !files::isDeletable($root)) {
throw new Exception('Undeletable file: ' . $root);
}
unlink($root);
}
dcPage::addSuccessNotice(
__('Package successfully deleted.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-repository-' . $type);
}
# Install
} elseif ($action == 'install') {
foreach ($_POST['modules'] as $root => $id) {
# --BEHAVIOR-- packmanBeforeInstallPackage
dcCore::app()->callBehavior('packmanBeforeInstallPackage', $type, $id, $root);
if ($type == 'plugins') {
$plugins->installPackage($root, $plugins);
}
if ($type == 'themes') {
$themes->installPackage($root, $themes);
}
# --BEHAVIOR-- packmanAfterInstallPackage
dcCore::app()->callBehavior('packmanAfterInstallPackage', $type, $id, $root);
}
dcPage::addSuccessNotice(
__('Package successfully installed.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-repository-' . $type);
}
# Copy
} elseif (strpos($action, 'copy_to_') !== false) {
$dest = $s->packman_pack_repository;
if ($action == 'copy_to_plugins') {
$dest = self::$plugins_path;
} elseif ($action == 'copy_to_themes') {
$dest = self::$themes_path;
}
foreach ($_POST['modules'] as $root => $id) {
file_put_contents(
$dest . '/' . basename($root),
file_get_contents($root)
);
}
dcPage::addSuccessNotice(
__('Package successfully copied.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-repository-' . $type);
}
# Move
} elseif (strpos($action, 'move_to_') !== false) {
$dest = $s->packman_pack_repository;
if ($action == 'move_to_plugins') {
$dest = self::$plugins_path;
} elseif ($action == 'move_to_themes') {
$dest = self::$themes_path;
}
foreach ($_POST['modules'] as $root => $id) {
file_put_contents(
$dest . '/' . basename($root),
file_get_contents($root)
);
unlink($root);
}
dcPage::addSuccessNotice(
__('Package successfully moved.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-repository-' . $type);
}
} }
} } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage());
# Not found
header('Content-Type: text/plain');
http::head(404, 'Not Found');
exit;
} elseif (!empty($action) && !$is_editable) {
throw new Exception('No selected modules');
# Pack
} elseif ($action == 'packup') {
foreach ($_POST['modules'] as $root => $id) {
if (!libPackman::moduleExists($type, $id)) {
throw new Exception('No such module');
}
$module = libPackman::getModules($type, $id);
$module['id'] = $id;
$module['type'] = $type == 'themes' ? 'theme' : 'plugin';
$root = $s->packman_pack_repository;
$files = [
$s->packman_pack_filename,
$s->packman_secondpack_filename,
];
$nocomment = $s->packman_pack_nocomment;
$fixnewline = $s->packman_pack_fixnewline;
$overwrite = $s->packman_pack_overwrite;
$exclude = explode(',', $s->packman_pack_excludefiles);
# --BEHAVIOR-- packmanBeforeCreatePackage
dcCore::app()->callBehavior('packmanBeforeCreatePackage', $module);
dcPackman::pack($module, $root, $files, $overwrite, $exclude, $nocomment, $fixnewline);
# --BEHAVIOR-- packmanAfterCreatePackage
dcCore::app()->callBehavior('packmanAfterCreatePackage', $module);
}
dcPage::addSuccessNotice(
__('Package successfully created.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-' . $type);
}
# Delete
} elseif ($action == 'delete') {
foreach ($_POST['modules'] as $root => $id) {
if (!file_exists($root) || !files::isDeletable($root)) {
throw new Exception('Undeletable file: ' . $root);
}
unlink($root);
}
dcPage::addSuccessNotice(
__('Package successfully deleted.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-repository-' . $type);
}
# Install
} elseif ($action == 'install') {
foreach ($_POST['modules'] as $root => $id) {
# --BEHAVIOR-- packmanBeforeInstallPackage
dcCore::app()->callBehavior('packmanBeforeInstallPackage', $type, $id, $root);
if ($type == 'plugins') {
$plugins->installPackage($root, $plugins);
}
if ($type == 'themes') {
$themes->installPackage($root, $themes);
}
# --BEHAVIOR-- packmanAfterInstallPackage
dcCore::app()->callBehavior('packmanAfterInstallPackage', $type, $id, $root);
}
dcPage::addSuccessNotice(
__('Package successfully installed.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-repository-' . $type);
}
# Copy
} elseif (strpos($action, 'copy_to_') !== false) {
$dest = $repo_path;
if ($action == 'copy_to_plugins') {
$dest = $plugins_path;
} elseif ($action == 'copy_to_themes') {
$dest = $themes_path;
}
foreach ($_POST['modules'] as $root => $id) {
file_put_contents(
$dest . '/' . basename($root),
file_get_contents($root)
);
}
dcPage::addSuccessNotice(
__('Package successfully copied.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-repository-' . $type);
}
# Move
} elseif (strpos($action, 'move_to_') !== false) {
$dest = $repo_path;
if ($action == 'move_to_plugins') {
$dest = $plugins_path;
} elseif ($action == 'move_to_themes') {
$dest = $themes_path;
}
foreach ($_POST['modules'] as $root => $id) {
file_put_contents(
$dest . '/' . basename($root),
file_get_contents($root)
);
unlink($root);
}
dcPage::addSuccessNotice(
__('Package successfully moved.')
);
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
dcCore::app()->adminurl->redirect('admin.plugin.' . basename(__DIR__), [], '#packman-repository-' . $type);
} }
} }
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); public static function render()
{
# Settings
$s = dcCore::app()->blog->settings->__get(basename(__DIR__));
$is_configured = Utils::is_configured(
$s->packman_pack_repository,
$s->packman_pack_filename,
$s->packman_secondpack_filename
);
# Display
echo
'<html><head><title>' . __('pacKman') . '</title>' .
dcPage::jsPageTabs() .
dcPage::jsLoad(dcPage::getPF(basename(__DIR__) . '/js/packman.js'));
# --BEHAVIOR-- packmanAdminHeader
dcCore::app()->callBehavior('packmanAdminHeader');
echo
'</head><body>' .
dcPage::breadcrumb([
__('Plugins') => '',
__('pacKman') => '',
]) .
dcPage::notices();
if (dcCore::app()->error->flag() || !$is_configured) {
echo
'<div class="warning">' . __('pacKman is not well configured.') . ' ' .
'<a href="' . dcCore::app()->adminurl->get('admin.plugins', ['module' => basename(__DIR__), 'conf' => '1', 'redir' => dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__))]) . '">' . __('Configuration') . '</a>' .
'</div>';
} else {
$repo_path_modules = array_merge(
Core::getPackages(dirname($s->packman_pack_repository . '/' . $s->packman_pack_filename)),
Core::getPackages(dirname($s->packman_pack_repository . '/' . $s->packman_secondpack_filename))
);
$plugins_path_modules = Core::getPackages(self::$plugins_path);
$themes_path_modules = Core::getPackages(self::$themes_path);
Utils::modules(
Utils::getModules('plugins'),
'plugins',
__('Installed plugins')
);
Utils::modules(
Utils::getModules('themes'),
'themes',
__('Installed themes')
);
Utils::repository(
$plugins_path_modules,
'plugins',
__('Plugins root')
);
Utils::repository(
$themes_path_modules,
'themes',
__('Themes root')
);
Utils::repository(
$repo_path_modules,
'repository',
__('Packages repository')
);
}
# --BEHAVIOR-- packmanAdminTabs
dcCore::app()->callBehavior('packmanAdminTabs');
dcPage::helpBlock('pacKman');
echo
'</body></html>';
}
} }
# Display index::init();
echo index::process();
'<html><head><title>' . __('pacKman') . '</title>' . index::render();
dcPage::jsPageTabs() .
dcPage::jsLoad(dcPage::getPF(basename(__DIR__) . '/js/packman.js'));
# --BEHAVIOR-- packmanAdminHeader
dcCore::app()->callBehavior('packmanAdminHeader');
echo
'</head><body>' .
dcPage::breadcrumb([
__('Plugins') => '',
__('pacKman') => '',
]) .
dcPage::notices();
if (dcCore::app()->error->flag() || !$is_configured) {
echo
'<div class="warning">' . __('pacKman is not well configured.') . ' ' .
'<a href="' . dcCore::app()->adminurl->get('admin.plugins', ['module' => basename(__DIR__), 'conf' => '1', 'redir' => dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__))]) . '">' . __('Configuration') . '</a>' .
'</div>';
} else {
$repo_path_modules = array_merge(
dcPackman::getPackages(dirname($repo_path . '/' . $s->packman_pack_filename)),
dcPackman::getPackages(dirname($repo_path . '/' . $s->packman_secondpack_filename))
);
$plugins_path_modules = dcPackman::getPackages($plugins_path);
$themes_path_modules = dcPackman::getPackages($themes_path);
libPackman::modules(
libPackman::getModules('plugins'),
'plugins',
__('Installed plugins')
);
libPackman::modules(
libPackman::getModules('themes'),
'themes',
__('Installed themes')
);
libPackman::repository(
$plugins_path_modules,
'plugins',
__('Plugins root')
);
libPackman::repository(
$themes_path_modules,
'themes',
__('Themes root')
);
libPackman::repository(
$repo_path_modules,
'repository',
__('Packages repository')
);
}
# --BEHAVIOR-- packmanAdminTabs
dcCore::app()->callBehavior('packmanAdminTabs');
dcPage::helpBlock('pacKman');
echo
'</body></html>';