mitrobill/system/controllers/pluginmanager.php

380 lines
17 KiB
PHP
Raw Normal View History

2023-01-31 14:26:49 +07:00
<?php
2024-02-26 14:38:04 +07:00
2023-01-31 14:26:49 +07:00
/**
2023-10-12 15:55:42 +07:00
* PHP Mikrotik Billing (https://github.com/hotspotbilling/phpnuxbill/)
* by https://t.me/ibnux
2023-01-31 14:26:49 +07:00
**/
2023-10-12 15:55:42 +07:00
2023-01-31 14:26:49 +07:00
_admin();
2024-01-18 17:24:21 +07:00
$ui->assign('_title', 'Plugin Manager');
2023-01-31 14:26:49 +07:00
$ui->assign('_system_menu', 'settings');
2023-03-08 11:08:56 +07:00
$plugin_repository = 'https://hotspotbilling.github.io/Plugin-Repository/repository.json';
2023-01-31 14:26:49 +07:00
$action = $routes['1'];
$ui->assign('_admin', $admin);
if (!in_array($admin['user_type'], ['SuperAdmin', 'Admin'])) {
2024-02-26 14:38:04 +07:00
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
2023-01-31 14:26:49 +07:00
}
2024-02-26 14:38:04 +07:00
$cache = $CACHE_PATH . File::pathFixer('/plugin_repository.json');
2023-07-28 15:38:52 +07:00
if (file_exists($cache) && time() - filemtime($cache) < (24 * 60 * 60)) {
2023-09-13 10:07:58 +07:00
$txt = file_get_contents($cache);
$json = json_decode($txt, true);
2024-02-26 14:38:04 +07:00
if (empty($json['plugins']) && empty($json['payment_gateway'])) {
2023-09-13 10:07:58 +07:00
unlink($cache);
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'));
2023-09-13 10:07:58 +07:00
}
2023-03-08 11:08:56 +07:00
} else {
$data = Http::getData($plugin_repository);
2023-03-08 11:08:56 +07:00
file_put_contents($cache, $data);
$json = json_decode($data, true);
}
2023-01-31 14:26:49 +07:00
switch ($action) {
2024-06-19 14:00:04 +07:00
case 'refresh':
if (file_exists($cache))
unlink($cache);
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 's', 'Refresh success');
2024-06-19 14:00:04 +07:00
break;
2024-06-12 17:02:52 +07:00
case 'dlinstall':
2025-02-09 18:37:19 +01:00
if ($_app_stage == 'Demo') {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Demo Mode cannot install as it Security risk');
}
2024-06-12 17:02:52 +07:00
if (!is_writeable($CACHE_PATH)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Folder cache/ is not writable');
2024-06-12 17:02:52 +07:00
}
if (!is_writeable($PLUGIN_PATH)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Folder plugin/ is not writable');
2024-06-12 17:02:52 +07:00
}
if (!is_writeable($DEVICE_PATH)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Folder devices/ is not writable');
2024-06-12 17:02:52 +07:00
}
if (!is_writeable($UI_PATH . DIRECTORY_SEPARATOR . 'themes')) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Folder themes/ is not writable');
2024-06-12 17:02:52 +07:00
}
$cache = $CACHE_PATH . DIRECTORY_SEPARATOR . 'installer' . DIRECTORY_SEPARATOR;
if (!file_exists($cache)) {
mkdir($cache);
}
if (file_exists($_FILES['zip_plugin']['tmp_name'])) {
$zip = new ZipArchive();
$zip->open($_FILES['zip_plugin']['tmp_name']);
$zip->extractTo($cache);
$zip->close();
$plugin = basename($_FILES['zip_plugin']['name']);
2024-06-12 17:02:52 +07:00
unlink($_FILES['zip_plugin']['tmp_name']);
$success = 0;
2024-06-12 17:02:52 +07:00
//moving
if (file_exists($cache . 'plugin')) {
File::copyFolder($cache . 'plugin' . DIRECTORY_SEPARATOR, $PLUGIN_PATH . DIRECTORY_SEPARATOR);
$success++;
2024-06-12 17:02:52 +07:00
}
if (file_exists($cache . 'paymentgateway')) {
File::copyFolder($cache . 'paymentgateway' . DIRECTORY_SEPARATOR, $PAYMENTGATEWAY_PATH . DIRECTORY_SEPARATOR);
$success++;
2024-06-12 17:02:52 +07:00
}
if (file_exists($cache . 'theme')) {
File::copyFolder($cache . 'theme' . DIRECTORY_SEPARATOR, $UI_PATH . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR);
$success++;
2024-06-12 17:02:52 +07:00
}
if (file_exists($cache . 'device')) {
File::copyFolder($cache . 'device' . DIRECTORY_SEPARATOR, $DEVICE_PATH . DIRECTORY_SEPARATOR);
$success++;
}
if ($success == 0) {
// old plugin and theme using this
$check = strtolower($ghUrl);
if (strpos($check, 'plugin') !== false) {
File::copyFolder($folder, $PLUGIN_PATH . DIRECTORY_SEPARATOR);
} else if (strpos($check, 'payment') !== false) {
File::copyFolder($folder, $PAYMENTGATEWAY_PATH . DIRECTORY_SEPARATOR);
} else if (strpos($check, 'theme') !== false) {
rename($folder, $UI_PATH . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $plugin);
} else if (strpos($check, 'device') !== false) {
File::copyFolder($folder, $DEVICE_PATH . DIRECTORY_SEPARATOR);
}
2024-06-12 17:02:52 +07:00
}
//Cleaning
File::deleteFolder($cache);
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 's', 'Installation success');
2024-06-12 17:02:52 +07:00
} else if (_post('gh_url', '') != '') {
$ghUrl = _post('gh_url', '');
if (!empty($config['github_token']) && !empty($config['github_username'])) {
$ghUrl = str_replace('https://github.com', 'https://' . $config['github_username'] . ':' . $config['github_token'] . '@github.com', $ghUrl);
}
2024-06-12 17:02:52 +07:00
$plugin = basename($ghUrl);
$file = $cache . $plugin . '.zip';
$fp = fopen($file, 'w+');
$ch = curl_init($ghUrl . '/archive/refs/heads/master.zip');
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
$zip = new ZipArchive();
$zip->open($file);
$zip->extractTo($cache);
$zip->close();
$folder = $cache . DIRECTORY_SEPARATOR . $plugin . '-main' . DIRECTORY_SEPARATOR;
if (!file_exists($folder)) {
2024-08-02 15:48:31 +07:00
$folder = $cache . DIRECTORY_SEPARATOR . $plugin . '-master' . DIRECTORY_SEPARATOR;
}
$success = 0;
2024-06-12 17:02:52 +07:00
if (file_exists($folder . 'plugin')) {
File::copyFolder($folder . 'plugin' . DIRECTORY_SEPARATOR, $PLUGIN_PATH . DIRECTORY_SEPARATOR);
$success++;
2024-06-12 17:02:52 +07:00
}
if (file_exists($folder . 'paymentgateway')) {
File::copyFolder($folder . 'paymentgateway' . DIRECTORY_SEPARATOR, $PAYMENTGATEWAY_PATH . DIRECTORY_SEPARATOR);
$success++;
2024-06-12 17:02:52 +07:00
}
if (file_exists($folder . 'theme')) {
File::copyFolder($folder . 'theme' . DIRECTORY_SEPARATOR, $UI_PATH . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR);
$success++;
2024-06-12 17:02:52 +07:00
}
if (file_exists($folder . 'device')) {
File::copyFolder($folder . 'device' . DIRECTORY_SEPARATOR, $DEVICE_PATH . DIRECTORY_SEPARATOR);
$success++;
}
if ($success == 0) {
// old plugin and theme using this
$check = strtolower($ghUrl);
if (strpos($check, 'plugin') !== false) {
File::copyFolder($folder, $PLUGIN_PATH . DIRECTORY_SEPARATOR);
} else if (strpos($check, 'payment') !== false) {
File::copyFolder($folder, $PAYMENTGATEWAY_PATH . DIRECTORY_SEPARATOR);
} else if (strpos($check, 'theme') !== false) {
rename($folder, $UI_PATH . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $plugin);
} else if (strpos($check, 'device') !== false) {
File::copyFolder($folder, $DEVICE_PATH . DIRECTORY_SEPARATOR);
}
2024-06-12 17:02:52 +07:00
}
File::deleteFolder($cache);
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 's', 'Installation success');
2024-06-12 17:02:52 +07:00
} else {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Nothing Installed');
2024-06-12 17:02:52 +07:00
}
break;
2024-03-12 10:42:42 +07:00
case 'delete':
if ($_app_stage == 'Demo') {
r2(getUrl('pluginmanager'), 'e', 'You cannot perform this action in Demo mode');
}
2024-02-26 14:38:04 +07:00
if (!is_writeable($CACHE_PATH)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Folder cache/ is not writable');
2023-03-08 11:08:56 +07:00
}
2024-02-26 14:38:04 +07:00
if (!is_writeable($PLUGIN_PATH)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Folder plugin/ is not writable');
2023-03-08 11:08:56 +07:00
}
set_time_limit(-1);
$tipe = $routes['2'];
$plugin = $routes['3'];
2024-03-12 10:42:42 +07:00
$file = $CACHE_PATH . DIRECTORY_SEPARATOR . $plugin . '.zip';
if (file_exists($file))
unlink($file);
2024-03-12 10:42:42 +07:00
if ($tipe == 'plugin') {
foreach ($json['plugins'] as $plg) {
if ($plg['id'] == $plugin) {
if (!empty($config['github_token']) && !empty($config['github_username'])) {
$plg['github'] = str_replace('https://github.com', 'https://' . $config['github_username'] . ':' . $config['github_token'] . '@github.com', $plg['github']);
}
2024-03-12 10:42:42 +07:00
$fp = fopen($file, 'w+');
$ch = curl_init($plg['github'] . '/archive/refs/heads/master.zip');
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
$zip = new ZipArchive();
$zip->open($file);
$zip->extractTo($CACHE_PATH);
$zip->close();
$folder = $CACHE_PATH . File::pathFixer('/' . $plugin . '-main/');
if (!file_exists($folder)) {
$folder = $CACHE_PATH . File::pathFixer('/' . $plugin . '-master/');
}
if (!file_exists($folder)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Extracted Folder is unknown');
2024-03-12 10:42:42 +07:00
}
scanAndRemovePath($folder, $PLUGIN_PATH . DIRECTORY_SEPARATOR);
File::deleteFolder($folder);
unlink($file);
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 's', 'Plugin ' . $plugin . ' has been deleted');
2024-03-12 10:42:42 +07:00
break;
}
}
break;
}
break;
case 'install':
if ($_app_stage == 'Demo') {
r2(getUrl('pluginmanager'), 'e', 'You cannot perform this action in Demo mode');
}
2024-03-12 10:42:42 +07:00
if (!is_writeable($CACHE_PATH)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Folder cache/ is not writable');
2024-03-12 10:42:42 +07:00
}
if (!is_writeable($PLUGIN_PATH)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Folder plugin/ is not writable');
2024-03-12 10:42:42 +07:00
}
2024-03-13 09:37:45 +07:00
set_time_limit(-1);
$tipe = $routes['2'];
$plugin = $routes['3'];
2024-03-12 10:42:42 +07:00
$file = $CACHE_PATH . DIRECTORY_SEPARATOR . $plugin . '.zip';
if (file_exists($file))
unlink($file);
2023-03-08 11:08:56 +07:00
if ($tipe == 'plugin') {
foreach ($json['plugins'] as $plg) {
if ($plg['id'] == $plugin) {
if (!empty($config['github_token']) && !empty($config['github_username'])) {
$plg['github'] = str_replace('https://github.com', 'https://' . $config['github_username'] . ':' . $config['github_token'] . '@github.com', $plg['github']);
}
2023-03-08 11:08:56 +07:00
$fp = fopen($file, 'w+');
2024-02-26 14:38:04 +07:00
$ch = curl_init($plg['github'] . '/archive/refs/heads/master.zip');
2023-03-08 11:08:56 +07:00
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
$zip = new ZipArchive();
$zip->open($file);
2024-02-26 14:38:04 +07:00
$zip->extractTo($CACHE_PATH);
2023-03-08 11:08:56 +07:00
$zip->close();
2024-02-26 14:38:04 +07:00
$folder = $CACHE_PATH . File::pathFixer('/' . $plugin . '-main/');
if (!file_exists($folder)) {
$folder = $CACHE_PATH . File::pathFixer('/' . $plugin . '-master/');
2023-03-08 11:08:56 +07:00
}
2024-02-26 14:38:04 +07:00
if (!file_exists($folder)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Extracted Folder is unknown');
2023-03-08 11:08:56 +07:00
}
2024-02-26 14:38:04 +07:00
File::copyFolder($folder, $PLUGIN_PATH . DIRECTORY_SEPARATOR, ['README.md', 'LICENSE']);
2023-03-08 11:08:56 +07:00
File::deleteFolder($folder);
unlink($file);
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 's', 'Plugin ' . $plugin . ' has been installed');
2023-03-08 11:08:56 +07:00
break;
}
}
break;
} else if ($tipe == 'payment') {
foreach ($json['payment_gateway'] as $plg) {
if ($plg['id'] == $plugin) {
if (!empty($config['github_token']) && !empty($config['github_username'])) {
$plg['github'] = str_replace('https://github.com', 'https://' . $config['github_username'] . ':' . $config['github_token'] . '@github.com', $plg['github']);
}
2023-03-08 11:08:56 +07:00
$fp = fopen($file, 'w+');
2024-02-26 14:38:04 +07:00
$ch = curl_init($plg['github'] . '/archive/refs/heads/master.zip');
2023-03-08 11:08:56 +07:00
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
$zip = new ZipArchive();
$zip->open($file);
2024-02-26 14:38:04 +07:00
$zip->extractTo($CACHE_PATH);
2023-03-08 11:08:56 +07:00
$zip->close();
2024-02-26 14:38:04 +07:00
$folder = $CACHE_PATH . File::pathFixer('/' . $plugin . '-main/');
if (!file_exists($folder)) {
$folder = $CACHE_PATH . File::pathFixer('/' . $plugin . '-master/');
2023-03-08 11:08:56 +07:00
}
2024-02-26 14:38:04 +07:00
if (!file_exists($folder)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Extracted Folder is unknown');
2023-03-08 11:08:56 +07:00
}
2024-02-26 14:38:04 +07:00
File::copyFolder($folder, $PAYMENTGATEWAY_PATH . DIRECTORY_SEPARATOR, ['README.md', 'LICENSE']);
2023-03-08 11:08:56 +07:00
File::deleteFolder($folder);
unlink($file);
2025-01-31 16:22:58 +07:00
r2(getUrl('paymentgateway'), 's', 'Payment Gateway ' . $plugin . ' has been installed');
2023-03-08 11:08:56 +07:00
break;
}
}
break;
} else if ($tipe == 'device') {
foreach ($json['devices'] as $d) {
if ($d['id'] == $plugin) {
if (!empty($config['github_token']) && !empty($config['github_username'])) {
$d['github'] = str_replace('https://github.com', 'https://' . $config['github_username'] . ':' . $config['github_token'] . '@github.com', $d['github']);
}
$fp = fopen($file, 'w+');
$ch = curl_init($d['github'] . '/archive/refs/heads/master.zip');
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
$zip = new ZipArchive();
$zip->open($file);
$zip->extractTo($CACHE_PATH);
$zip->close();
$folder = $CACHE_PATH . File::pathFixer('/' . $plugin . '-main/');
if (!file_exists($folder)) {
$folder = $CACHE_PATH . File::pathFixer('/' . $plugin . '-master/');
}
if (!file_exists($folder)) {
2025-01-31 16:22:58 +07:00
r2(getUrl('pluginmanager'), 'e', 'Extracted Folder is unknown');
}
File::copyFolder($folder, $DEVICE_PATH . DIRECTORY_SEPARATOR, ['README.md', 'LICENSE']);
File::deleteFolder($folder);
unlink($file);
2025-01-31 16:22:58 +07:00
r2(getUrl('settings/devices'), 's', 'Device ' . $plugin . ' has been installed');
break;
2023-03-08 11:08:56 +07:00
}
}
break;
}
2023-01-31 14:26:49 +07:00
default:
2023-03-08 11:08:56 +07:00
if (class_exists('ZipArchive')) {
$zipExt = true;
} else {
$zipExt = false;
2023-01-31 14:26:49 +07:00
}
2023-03-08 11:08:56 +07:00
$ui->assign('zipExt', $zipExt);
2023-01-31 14:26:49 +07:00
$ui->assign('plugins', $json['plugins']);
$ui->assign('pgs', $json['payment_gateway']);
2024-08-08 15:35:40 +07:00
$ui->assign('dvcs', $json['devices']);
2025-02-04 10:56:02 +07:00
$ui->display('admin/settings/plugin-manager.tpl');
2023-01-31 14:26:49 +07:00
}
2024-03-12 10:42:42 +07:00
function scanAndRemovePath($source, $target)
{
$files = scandir($source);
foreach ($files as $file) {
if (is_file($source . $file)) {
2024-06-12 17:02:52 +07:00
if (file_exists($target . $file)) {
2024-03-12 10:42:42 +07:00
unlink($target . $file);
}
} else if (is_dir($source . $file) && !in_array($file, ['.', '..'])) {
2024-06-12 17:02:52 +07:00
scanAndRemovePath($source . $file . DIRECTORY_SEPARATOR, $target . $file . DIRECTORY_SEPARATOR);
if (file_exists($target . $file)) {
2024-03-12 10:42:42 +07:00
rmdir($target . $file);
}
}
}
2024-06-12 17:02:52 +07:00
if (file_exists($target)) {
2024-03-12 10:42:42 +07:00
rmdir($target);
}
2024-06-12 17:02:52 +07:00
}