pacKman/index.php

333 lines
9.3 KiB
PHP
Raw Normal View History

2021-08-16 20:48:26 +00:00
<?php
2021-09-02 20:14:32 +00:00
/**
* @brief pacKman, a plugin for Dotclear 2
2021-11-01 10:39:02 +00:00
*
2021-09-02 20:14:32 +00:00
* @package Dotclear
* @subpackage Plugin
2021-11-01 10:39:02 +00:00
*
2021-09-02 20:14:32 +00:00
* @author Jean-Christian Denis
2021-11-01 10:39:02 +00:00
*
2021-09-02 20:14:32 +00:00
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
2021-08-16 20:48:26 +00:00
if (!defined('DC_CONTEXT_ADMIN')) {
2021-08-17 21:12:33 +00:00
return null;
2021-08-16 20:48:26 +00:00
}
dcPage::checkSuper();
# Queries
2021-11-01 10:39:02 +00:00
$action = $_POST['action'] ?? '';
$type = isset($_POST['type']) && in_array($_POST['type'], ['plugins', 'themes', 'repository']) ? $_POST['type'] : '';
2021-08-16 20:48:26 +00:00
# Settings
$core->blog->settings->addNamespace('pacKman');
$s = $core->blog->settings->pacKman;
# Modules
if (!isset($core->themes)) {
2021-08-17 21:12:33 +00:00
$core->themes = new dcThemes($core);
$core->themes->loadModules($core->blog->themes_path, null);
2021-08-16 20:48:26 +00:00
}
2021-11-01 10:39:02 +00:00
$themes = $core->themes;
2021-08-16 20:48:26 +00:00
$plugins = $core->plugins;
# Paths
2021-11-01 10:39:02 +00:00
$ppexp = explode(PATH_SEPARATOR, DC_PLUGINS_ROOT);
$pppop = array_pop($ppexp);
2021-11-08 21:19:07 +00:00
$plugins_path = (string) path::real($pppop);
2021-11-01 10:39:02 +00:00
$themes_path = $core->blog->themes_path;
$repo_path = $s->packman_pack_repository;
2021-08-16 20:48:26 +00:00
# Rights
$is_writable = libPackman::is_writable(
2021-08-17 21:12:33 +00:00
$s->packman_pack_repository,
$s->packman_pack_filename
2021-08-16 20:48:26 +00:00
);
2021-11-01 10:39:02 +00:00
$is_editable = !empty($type)
&& !empty($_POST['modules'])
2021-08-17 21:12:33 +00:00
&& is_array($_POST['modules']);
2021-08-16 20:48:26 +00:00
$is_configured = libPackman::is_configured(
2021-08-17 21:12:33 +00:00
$core,
$s->packman_pack_repository,
$s->packman_pack_filename,
$s->packman_secondpack_filename
2021-08-16 20:48:26 +00:00
);
# Actions
2021-10-23 14:46:03 +00:00
try {
2021-08-17 21:12:33 +00:00
# Download
if (isset($_REQUEST['package']) && empty($type)) {
2021-08-23 13:07:29 +00:00
$modules = [];
2021-08-17 21:12:33 +00:00
if ($type == 'plugins') {
$modules = dcPackman::getPackages($core, $plugins_path);
2021-08-23 13:07:29 +00:00
} elseif ($type == 'themes') {
2021-08-17 21:12:33 +00:00
$modules = dcPackman::getPackages($core, $themes_path);
2021-08-23 13:07:29 +00:00
} else {
2021-08-17 21:12:33 +00:00
$modules = array_merge(
dcPackman::getPackages($core, dirname($repo_path . '/' . $s->packman_pack_filename)),
dcPackman::getPackages($core, dirname($repo_path . '/' . $s->packman_secondpack_filename))
);
}
2021-11-01 10:39:02 +00:00
foreach ($modules as $f) {
2021-08-17 21:12:33 +00:00
if (preg_match('/' . preg_quote($_REQUEST['package']) . '$/', $f['root'])
2021-10-23 14:46:03 +00:00
&& is_file($f['root']) && is_readable($f['root'])
) {
2021-08-17 21:12:33 +00:00
# --BEHAVIOR-- packmanBeforeDownloadPackage
$core->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
$core->callBehavior('packmanAfterDownloadPackage', $f, $type);
exit;
}
}
# Not found
header('Content-Type: text/plain');
http::head(404, 'Not Found');
exit;
2021-08-23 13:07:29 +00:00
} elseif (!empty($action) && !$is_editable) {
2021-08-17 21:12:33 +00:00
throw new Exception('No selected modules');
# Pack
2021-08-23 13:07:29 +00:00
} elseif ($action == 'packup') {
2021-08-17 21:12:33 +00:00
foreach ($_POST['modules'] as $root => $id) {
if (!${$type}->moduleExists($id)) {
throw new Exception('No such module');
}
2021-11-01 10:39:02 +00:00
$module = ${$type}->getModules($id);
$module['id'] = $id;
2021-08-17 21:12:33 +00:00
$module['type'] = $type == 'themes' ? 'theme' : 'plugin';
2021-11-01 10:39:02 +00:00
$root = $s->packman_pack_repository;
2021-08-23 13:07:29 +00:00
$files = [
2021-08-17 21:12:33 +00:00
$s->packman_pack_filename,
$s->packman_secondpack_filename
2021-08-23 13:07:29 +00:00
];
2021-11-01 10:39:02 +00:00
$nocomment = $s->packman_pack_nocomment;
$fixnewline = $s->packman_pack_fixnewline;
2021-11-01 10:39:02 +00:00
$overwrite = $s->packman_pack_overwrite;
$exclude = explode(',', $s->packman_pack_excludefiles);
2021-08-17 21:12:33 +00:00
# --BEHAVIOR-- packmanBeforeCreatePackage
$core->callBehavior('packmanBeforeCreatePackage', $core, $module);
dcPackman::pack($module, $root, $files, $overwrite, $exclude, $nocomment, $fixnewline);
2021-08-17 21:12:33 +00:00
# --BEHAVIOR-- packmanAfterCreatePackage
$core->callBehavior('packmanAfterCreatePackage', $core, $module);
}
dcPage::addSuccessNotice(
__('Package successfully created.')
);
2021-10-23 14:46:03 +00:00
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
$core->adminurl->redirect('admin.plugin.pacKman', [], '#packman-' . $type);
}
2021-08-17 21:12:33 +00:00
2021-11-01 10:39:02 +00:00
# Delete
2021-08-23 13:07:29 +00:00
} elseif ($action == 'delete') {
2021-08-17 21:12:33 +00:00
foreach ($_POST['modules'] as $root => $id) {
2021-11-01 10:39:02 +00:00
if (!file_exists($root) || !files::isDeletable($root)) {
2021-08-17 21:12:33 +00:00
throw new Exception('Undeletable file: ' . $root);
}
unlink($root);
}
dcPage::addSuccessNotice(
__('Package successfully deleted.')
);
2021-10-23 14:46:03 +00:00
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
$core->adminurl->redirect('admin.plugin.pacKman', [], '#packman-repository-' . $type);
}
2021-08-17 21:12:33 +00:00
2021-11-01 10:39:02 +00:00
# Install
2021-08-23 13:07:29 +00:00
} elseif ($action == 'install') {
2021-08-17 21:12:33 +00:00
foreach ($_POST['modules'] as $root => $id) {
# --BEHAVIOR-- packmanBeforeInstallPackage
$core->callBehavior('packmanBeforeInstallPackage', $type, $id, $root);
if ($type == 'plugins') {
$plugins->installPackage($root, $plugins);
}
if ($type == 'themes') {
$themes->installPackage($root, $themes);
}
# --BEHAVIOR-- packmanAfterInstallPackage
$core->callBehavior('packmanAfterInstallPackage', $type, $id, $root);
}
dcPage::addSuccessNotice(
__('Package successfully installed.')
);
2021-10-23 14:46:03 +00:00
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
$core->adminurl->redirect('admin.plugin.pacKman', [], '#packman-repository-' . $type);
}
2021-08-17 21:12:33 +00:00
2021-11-01 10:39:02 +00:00
# Copy
2021-08-23 13:07:29 +00:00
} elseif (strpos($action, 'copy_to_') !== false) {
2021-11-08 21:19:07 +00:00
$dest = $repo_path;
2021-08-17 21:12:33 +00:00
if ($action == 'copy_to_plugins') {
$dest = $plugins_path;
2021-08-23 13:07:29 +00:00
} elseif ($action == 'copy_to_themes') {
2021-08-17 21:12:33 +00:00
$dest = $themes_path;
}
foreach ($_POST['modules'] as $root => $id) {
file_put_contents(
$dest . '/' . basename($root),
file_get_contents($root)
);
}
dcPage::addSuccessNotice(
__('Package successfully copied.')
);
2021-10-23 14:46:03 +00:00
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
$core->adminurl->redirect('admin.plugin.pacKman', [], '#packman-repository-' . $type);
}
2021-08-17 21:12:33 +00:00
2021-11-01 10:39:02 +00:00
# Move
2021-08-23 13:07:29 +00:00
} elseif (strpos($action, 'move_to_') !== false) {
2021-11-08 21:19:07 +00:00
$dest = $repo_path;
2021-08-17 21:12:33 +00:00
if ($action == 'move_to_plugins') {
$dest = $plugins_path;
2021-08-23 13:07:29 +00:00
} elseif ($action == 'move_to_themes') {
2021-08-17 21:12:33 +00:00
$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.')
);
2021-10-23 14:46:03 +00:00
if (!empty($_POST['redir'])) {
http::redirect($_POST['redir']);
} else {
$core->adminurl->redirect('admin.plugin.pacKman', [], '#packman-repository-' . $type);
}
2021-08-17 21:12:33 +00:00
}
2021-11-01 10:39:02 +00:00
} catch (Exception $e) {
2021-08-17 21:12:33 +00:00
$core->error->add($e->getMessage());
2021-08-16 20:48:26 +00:00
}
# Display
2021-11-01 10:39:02 +00:00
echo
2021-08-17 21:12:33 +00:00
'<html><head><title>' . __('pacKman') . '</title>' .
dcPage::jsPageTabs() .
2021-10-23 14:46:03 +00:00
dcPage::jsLoad(dcPage::getPF('pacKman/js/packman.js'));
2021-08-16 20:48:26 +00:00
# --BEHAVIOR-- packmanAdminHeader
$core->callBehavior('packmanAdminHeader', $core);
2021-11-01 10:39:02 +00:00
echo
2021-08-17 21:12:33 +00:00
'</head><body>' .
2021-08-16 20:48:26 +00:00
2021-08-23 13:07:29 +00:00
dcPage::breadcrumb([
2021-11-01 10:39:02 +00:00
__('Plugins') => '',
__('pacKman') => ''
]) .
2021-08-16 20:48:26 +00:00
dcPage::notices();
if ($core->error->flag()) {
2021-08-17 21:12:33 +00:00
echo
'<p class="warning">' . __('pacKman is not well configured.') . ' ' .
'<a href="plugins.php?module=pacKman&amp;conf=1&amp;redir=' .
urlencode('plugin.php?p=pacKman') . '">' . __('Configuration') . '</a>' .
'</p>';
2021-08-23 13:07:29 +00:00
} else {
2021-08-17 21:12:33 +00:00
$repo_path_modules = array_merge(
dcPackman::getPackages(
$core,
dirname($repo_path . '/' . $s->packman_pack_filename)
),
dcPackman::getPackages(
$core,
dirname($repo_path . '/' . $s->packman_secondpack_filename)
)
);
$plugins_path_modules = dcPackman::getPackages(
$core,
$plugins_path
);
$themes_path_modules = dcPackman::getPackages(
$core,
$themes_path
);
libPackman::modules(
$core,
$plugins->getModules(),
'plugins',
__('Installed plugins')
);
libPackman::modules(
$core,
$themes->getModules(),
'themes',
__('Installed themes')
);
libPackman::repository(
$core,
$plugins_path_modules,
'plugins',
__('Plugins root')
);
libPackman::repository(
$core,
$themes_path_modules,
'themes',
__('Themes root')
);
libPackman::repository(
$core,
$repo_path_modules,
'repository',
__('Packages repository')
);
2021-08-16 20:48:26 +00:00
}
# --BEHAVIOR-- packmanAdminTabs
$core->callBehavior('packmanAdminTabs', $core);
dcPage::helpBlock('pacKman');
2021-11-01 10:39:02 +00:00
echo
2021-11-06 13:56:29 +00:00
'</body></html>';