This commit is contained in:
Abdulrahman
2019-05-16 01:34:48 +03:00
parent bc1f19f140
commit 9b15e2a92e
7 changed files with 186 additions and 297 deletions

View File

@@ -144,7 +144,7 @@
<span class="p-3 font-weight-bold">{lang.ALL_PLUGINS_UPDATED}</span> <span class="p-3 font-weight-bold">{lang.ALL_PLUGINS_UPDATED}</span>
<ELSE> <ELSE>
<i class="fa fa-exclamation fa-3x text-info p-2"></i> <i class="fa fa-exclamation fa-3x text-info p-2"></i>
<span class="p-3 font-weight-bold">{lang.STORE_SERVER_ERROR}</span> <span class="p-3 font-weight-bold">{lang.NO_PLUGINS}</span>
</IF> </IF>
</div> </div>
</UNLESS> </UNLESS>

View File

@@ -59,7 +59,7 @@
<span class="p-3 font-weight-bold">{lang.ALL_STYLES_UPDATED}</span> <span class="p-3 font-weight-bold">{lang.ALL_STYLES_UPDATED}</span>
<ELSE> <ELSE>
<i class="fa fa-exclamation fa-3x text-info p-2"></i> <i class="fa fa-exclamation fa-3x text-info p-2"></i>
<span class="p-3 font-weight-bold">{lang.STORE_SERVER_ERROR}</span> <span class="p-3 font-weight-bold">{lang.NO_PLUGINS}</span>
</IF> </IF>
</div> </div>
</UNLESS> </UNLESS>
@@ -155,7 +155,7 @@ function downloadStyle(name, nextStyles) {
setTimeout(function() { setTimeout(function() {
var currentStyle = nextStyles.shift(); var currentStyle = nextStyles.shift();
downloadPlugin(currentStyle, nextStyles); downloadStyle(currentStyle, nextStyles);
}, 500); }, 500);
}) })
.fail(function(data) { .fail(function(data) {

View File

@@ -7,50 +7,41 @@
* *
*/ */
// not for directly open // not for directly open
if (! defined('IN_ADMIN')) if (! defined('IN_ADMIN')) {
{
exit(); exit();
} }
//turn time-limit off //turn time-limit off
@set_time_limit(0); @set_time_limit(0);
//get current case //get current case
$case = g('case', 'str', 'installed'); $case = g('case', 'str', 'installed');
//set _get form key //set _get form key
$GET_FORM_KEY = kleeja_add_form_key_get('adm_plugins_get'); $GET_FORM_KEY = kleeja_add_form_key_get('adm_plugins_get');
$H_FORM_KEYS = kleeja_add_form_key('adm_plugins'); $H_FORM_KEYS = kleeja_add_form_key('adm_plugins');
$action = ADMIN_PATH . '?cp=' . basename(__file__, '.php'); $action = ADMIN_PATH.'?cp='.basename(__FILE__, '.php');
$plugin_install_link = $action . '&amp;case=install&amp;' . $GET_FORM_KEY . '&amp;plg=';
$plugin_uninstall_link = $action . '&amp;case=uninstall&amp;' . $GET_FORM_KEY . '&amp;plg=';
$plugin_enable_link = $action . '&amp;case=enable&amp;' . $GET_FORM_KEY . '&amp;plg=';
$plugin_disable_link = $action . '&amp;case=disable&amp;' . $GET_FORM_KEY . '&amp;plg=';
$plugin_download_link = $action . '&amp;case=download&amp;' . $GET_FORM_KEY . '&amp;plg=';
$plugin_delete_folder_link = $action . '&amp;case=dfolder&amp;' . $GET_FORM_KEY . '&amp;plg=';
$plugin_install_link = $action.'&amp;case=install&amp;'.$GET_FORM_KEY.'&amp;plg=';
$plugin_uninstall_link = $action.'&amp;case=uninstall&amp;'.$GET_FORM_KEY.'&amp;plg=';
$plugin_enable_link = $action.'&amp;case=enable&amp;'.$GET_FORM_KEY.'&amp;plg=';
$plugin_disable_link = $action.'&amp;case=disable&amp;'.$GET_FORM_KEY.'&amp;plg=';
$plugin_download_link = $action.'&amp;case=download&amp;'.$GET_FORM_KEY.'&amp;plg=';
$plugin_delete_folder_link = $action.'&amp;case=dfolder&amp;'.$GET_FORM_KEY.'&amp;plg=';
//check _GET Csrf token //check _GET Csrf token
if (! empty($case) && in_array($case, ['install', 'uninstall', 'enable', 'disable' , 'download' , 'dfolder'])) if (! empty($case) && in_array($case, ['install', 'uninstall', 'enable', 'disable', 'download', 'dfolder'])) {
{ if (! kleeja_check_form_key_get('adm_plugins_get')) {
if (! kleeja_check_form_key_get('adm_plugins_get'))
{
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
kleeja_admin_err($lang['INVALID_GET_KEY']); kleeja_admin_err($lang['INVALID_GET_KEY']);
} }
} }
//check _POST Csrf token //check _POST Csrf token
if (ip('newplugin')) if (ip('newplugin')) {
{ if (! kleeja_check_form_key('adm_plugins')) {
if (! kleeja_check_form_key('adm_plugins'))
{
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
kleeja_admin_err($lang['INVALID_FORM_KEY'], true, $lang['ERROR'], true, $action); kleeja_admin_err($lang['INVALID_FORM_KEY'], true, $lang['ERROR'], true, $action);
} }
@@ -67,46 +58,35 @@ switch ($case):
// Get installed plugins // Get installed plugins
$query = [ $query = [
'SELECT' => 'plg_id, plg_name, plg_ver, plg_disabled, plg_author, plg_dsc', 'SELECT' => 'plg_id, plg_name, plg_ver, plg_disabled, plg_author, plg_dsc',
'FROM' => "{$dbprefix}plugins", 'FROM' => "{$dbprefix}plugins",
'ORDER BY' => 'plg_id ASC', 'ORDER BY' => 'plg_id ASC',
]; ];
$result = $SQL->build($query); $result = $SQL->build($query);
$installed_plugins = []; $installed_plugins = [];
while ($row = $SQL->fetch($result)) while ($row = $SQL->fetch($result)) {
{
$installed_plugins[$row['plg_name']] = $row; $installed_plugins[$row['plg_name']] = $row;
$installed_plugins[$row['plg_name']]['extra_info'] = Plugins::getInstance()->installed_plugin_info($row['plg_name']); $installed_plugins[$row['plg_name']]['extra_info'] = Plugins::getInstance()->installed_plugin_info($row['plg_name']);
$installed_plugins[$row['plg_name']]['icon'] = file_exists( $installed_plugins[$row['plg_name']]['icon'] = file_exists(
PATH . KLEEJA_PLUGINS_FOLDER . '/' . $row['plg_name'] . '/icon.png' PATH.KLEEJA_PLUGINS_FOLDER.'/'.$row['plg_name'].'/icon.png'
) )
? PATH . KLEEJA_PLUGINS_FOLDER . '/' . $row['plg_name'] . '/icon.png' ? PATH.KLEEJA_PLUGINS_FOLDER.'/'.$row['plg_name'].'/icon.png'
: $STYLE_PATH_ADMIN . 'images/plugin.png'; : $STYLE_PATH_ADMIN.'images/plugin.png';
foreach (['plugin_title', 'plugin_description'] as $localizedInfo) {
foreach (['plugin_title', 'plugin_description'] as $localizedInfo) if (is_array($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo])) {
{ if (! empty($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo][$config['language']])) {
if (is_array($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo]))
{
if (! empty($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo][$config['language']]))
{
$installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo] = $installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo] =
shorten_text($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo][$config['language']], 100); shorten_text($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo][$config['language']], 100);
} } elseif (! empty($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo]['en'])) {
elseif (! empty($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo]['en']))
{
$installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo] = $installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo] =
shorten_text($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo]['en'], 100); shorten_text($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo]['en'], 100);
} } else {
else
{
$installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo] = $installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo] =
shorten_text($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo][0], 100); shorten_text($installed_plugins[$row['plg_name']]['extra_info'][$localizedInfo][0], 100);
} }
@@ -115,61 +95,52 @@ switch ($case):
} }
$SQL->free($result); $SQL->free($result);
//get available plugins //get available plugins
$dh = opendir(PATH . KLEEJA_PLUGINS_FOLDER); $dh = opendir(PATH.KLEEJA_PLUGINS_FOLDER);
$available_plugins = []; $available_plugins = [];
while (false !== ($folder_name = readdir($dh))) while (false !== ($folder_name = readdir($dh))) {
{ if (is_dir(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$folder_name) && preg_match('/[a-z0-9_.]{3,}/', $folder_name)) {
if (is_dir(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $folder_name) && preg_match('/[a-z0-9_.]{3,}/', $folder_name)) if (empty($installed_plugins[$folder_name])) {
{
if (empty($installed_plugins[$folder_name]))
{
array_push($available_plugins, [ array_push($available_plugins, [
'name' => $folder_name, 'name' => $folder_name,
'icon' => file_exists(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $folder_name . '/icon.png') 'icon' => file_exists(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$folder_name.'/icon.png')
? PATH . KLEEJA_PLUGINS_FOLDER . '/' . $folder_name . '/icon.png' ? PATH.KLEEJA_PLUGINS_FOLDER.'/'.$folder_name.'/icon.png'
: $STYLE_PATH_ADMIN . 'images/plugin.png', : $STYLE_PATH_ADMIN.'images/plugin.png',
]); ]);
} }
} }
} }
@closedir($dh); @closedir($dh);
$no_plugins = sizeof($available_plugins) == 0 && sizeof($installed_plugins) == 0; $no_plugins = sizeof($available_plugins) == 0 && sizeof($installed_plugins) == 0;
$no_installed_plugins = sizeof($installed_plugins) == 0; $no_installed_plugins = sizeof($installed_plugins) == 0;
$stylee = 'admin_plugins'; $stylee = 'admin_plugins';
//do not proceed if not store case //do not proceed if not store case
if (! in_array($case, ['store', 'check'])) if (! in_array($case, ['store', 'check'])) {
{
break; break;
} }
// plugins avilable in kleeja remote catalog // plugins avilable in kleeja remote catalog
if (! ($store_catalog = $cache->get('store_catalog'))) if (! ($store_catalog = $cache->get('store_catalog'))) {
{
$store_link = 'https://raw.githubusercontent.com/kleeja-official/store-catalog/master/catalog.json'; $store_link = 'https://raw.githubusercontent.com/kleeja-official/store-catalog/master/catalog.json';
$store_catalog = fetch_remote_file($store_link); $store_catalog = fetch_remote_file($store_link);
$store_catalog = json_decode($store_catalog, true); $store_catalog = json_decode($store_catalog, true);
if (json_last_error() == JSON_ERROR_NONE) if (json_last_error() == JSON_ERROR_NONE) {
{
$cache->save('store_catalog', $store_catalog); $cache->save('store_catalog', $store_catalog);
} }
} }
// make an array for all plugins in kleeja remote catalog // make an array for all plugins in kleeja remote catalog
// that are not exsisted locally. // that are not exsisted locally.
$store_plugins = []; $store_plugins = [];
$available_plugins_names = array_column($available_plugins, 'name'); $available_plugins_names = array_column($available_plugins, 'name');
foreach ($store_catalog as $plugin_info) foreach ($store_catalog as $plugin_info) {
{ if ($plugin_info['type'] != 'plugin') {
if ($plugin_info['type'] != 'plugin')
{
continue; continue;
} }
@@ -184,23 +155,24 @@ switch ($case):
version_compare( version_compare(
strtolower($installed_plugins[$plugin_info['name']]['extra_info']['plugin_version']), strtolower($installed_plugins[$plugin_info['name']]['extra_info']['plugin_version']),
strtolower($plugin_info['file']['version']), strtolower($plugin_info['file']['version']),
'>=') || empty($installed_plugins[$plugin_info['name']])) '>='
) || empty($installed_plugins[$plugin_info['name']]))
) { ) {
continue; continue;
} }
$store_plugins[$plugin_info['name']] = [ $store_plugins[$plugin_info['name']] = [
'name' => $plugin_info['name'], 'name' => $plugin_info['name'],
'developer' => $plugin_info['developer'], 'developer' => $plugin_info['developer'],
'version' => $plugin_info['file']['version'], 'version' => $plugin_info['file']['version'],
'title' => ! empty($plugin_info['title'][$config['language']]) ? $plugin_info['title'][$config['language']] : $plugin_info['title']['en'], 'title' => ! empty($plugin_info['title'][$config['language']]) ? $plugin_info['title'][$config['language']] : $plugin_info['title']['en'],
'website' => $plugin_info['website'], 'website' => $plugin_info['website'],
'current_version' => ! empty($installed_plugins[$plugin_info['name']]) ? strtolower($installed_plugins[$plugin_info['name']]['extra_info']['plugin_version']) : '', 'current_version' => ! empty($installed_plugins[$plugin_info['name']]) ? strtolower($installed_plugins[$plugin_info['name']]['extra_info']['plugin_version']) : '',
'kj_min_version' => $plugin_info['kleeja_version']['min'], 'kj_min_version' => $plugin_info['kleeja_version']['min'],
'kj_max_version' => $plugin_info['kleeja_version']['max'], 'kj_max_version' => $plugin_info['kleeja_version']['max'],
'kj_version_cmtp' => sprintf($lang['KLJ_VER_NO_PLUGIN'], $plugin_info['kleeja_version']['min'], $plugin_info['kleeja_version']['max']), 'kj_version_cmtp' => sprintf($lang['KLJ_VER_NO_PLUGIN'], $plugin_info['kleeja_version']['min'], $plugin_info['kleeja_version']['max']),
'icon' => $plugin_info['icon'] , 'icon' => $plugin_info['icon'],
'NotCompatible' => version_compare(strtolower($plugin_info['kleeja_version']['min']), KLEEJA_VERSION, '<=') 'NotCompatible' => version_compare(strtolower($plugin_info['kleeja_version']['min']), KLEEJA_VERSION, '<=')
&& version_compare(strtolower($plugin_info['kleeja_version']['max']), KLEEJA_VERSION, '>=') && version_compare(strtolower($plugin_info['kleeja_version']['max']), KLEEJA_VERSION, '>=')
? false : true, ? false : true,
]; ];
@@ -209,125 +181,97 @@ switch ($case):
$store_plugins_count = sizeof($store_plugins); $store_plugins_count = sizeof($store_plugins);
break; break;
// //
//upload a plugin //upload a plugin
// //
case 'upload': case 'upload':
$ERRORS = []; $ERRORS = [];
if (intval($userinfo['founder']) !== 1) if (intval($userinfo['founder']) !== 1) {
{
$ERRORS[] = $lang['HV_NOT_PRVLG_ACCESS']; $ERRORS[] = $lang['HV_NOT_PRVLG_ACCESS'];
} }
//is uploaded? //is uploaded?
if (empty($_FILES['plugin_file']['tmp_name'])) if (empty($_FILES['plugin_file']['tmp_name'])) {
{
$ERRORS[] = $lang['CHOSE_F']; $ERRORS[] = $lang['CHOSE_F'];
} }
//extract it to plugins folder //extract it to plugins folder
if (! sizeof($ERRORS)) if (! sizeof($ERRORS)) {
{ if (class_exists('ZipArchive')) {
if (class_exists('ZipArchive')) $zip = new ZipArchive();
{
$zip = new ZipArchive;
if ($zip->open($_FILES['plugin_file']['tmp_name']) === true) if ($zip->open($_FILES['plugin_file']['tmp_name']) === true) {
{ if (! $zip->extractTo(PATH.KLEEJA_PLUGINS_FOLDER)) {
if (! $zip->extractTo(PATH . KLEEJA_PLUGINS_FOLDER))
{
$ERRORS[] = sprintf($lang['EXTRACT_ZIP_FAILED'], KLEEJA_PLUGINS_FOLDER); $ERRORS[] = sprintf($lang['EXTRACT_ZIP_FAILED'], KLEEJA_PLUGINS_FOLDER);
} }
$zip->close(); $zip->close();
} } else {
else
{
$ERRORS[] = sprintf($lang['EXTRACT_ZIP_FAILED'], KLEEJA_PLUGINS_FOLDER); $ERRORS[] = sprintf($lang['EXTRACT_ZIP_FAILED'], KLEEJA_PLUGINS_FOLDER);
} }
} } else {
else
{
$ERRORS[] = $lang['NO_ZIP_ARCHIVE']; $ERRORS[] = $lang['NO_ZIP_ARCHIVE'];
} }
} }
if (! empty($_FILES['plugin_file']['tmp_name'])) if (! empty($_FILES['plugin_file']['tmp_name'])) {
{
@unlink($_FILES['plugin_file']['tmp_name']); @unlink($_FILES['plugin_file']['tmp_name']);
} }
if (! sizeof($ERRORS)) if (! sizeof($ERRORS)) {
{
kleeja_admin_info($lang['NO_PROBLEM_AFTER_ZIP'], $action); kleeja_admin_info($lang['NO_PROBLEM_AFTER_ZIP'], $action);
} } else {
else kleeja_admin_err('- '.implode('<br>- ', $ERRORS), $action);
{
kleeja_admin_err('- ' . implode('<br>- ', $ERRORS), $action);
} }
break; break;
// //
//install a plugin //install a plugin
// //
case 'install': case 'install':
if (intval($userinfo['founder']) !== 1) if (intval($userinfo['founder']) !== 1) {
{
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
kleeja_admin_err($lang['HV_NOT_PRVLG_ACCESS'], $action); kleeja_admin_err($lang['HV_NOT_PRVLG_ACCESS'], $action);
} }
$plg_name = g('plg', 'str'); $plg_name = g('plg', 'str');
if (empty($plg_name)) if (empty($plg_name)) {
{ if (defined('DEBUG')) {
if (defined('DEBUG'))
{
exit('empty($plg_name)'); exit('empty($plg_name)');
} }
//no plugin selected? back //no plugin selected? back
redirect(ADMIN_PATH . '?cp=' . basename(__file__, '.php')); redirect(ADMIN_PATH.'?cp='.basename(__FILE__, '.php'));
} } else {
else if (! file_exists(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plg_name.'/init.php')) {
{ if (defined('DEBUG')) {
if (! file_exists(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plg_name . '/init.php'))
{
if (defined('DEBUG'))
{
exit('!file_exists($plg_name)'); exit('!file_exists($plg_name)');
} }
redirect(ADMIN_PATH . '?cp=' . basename(__file__, '.php')); redirect(ADMIN_PATH.'?cp='.basename(__FILE__, '.php'));
exit; exit;
} }
//if already installed, show a message //if already installed, show a message
if (! empty(Plugins::getInstance()->installed_plugin_info($plg_name))) if (! empty(Plugins::getInstance()->installed_plugin_info($plg_name))) {
{ kleeja_admin_info($lang['PLUGIN_EXISTS_BEFORE'], true, '', true, ADMIN_PATH.'?cp='.basename(__FILE__, '.php'));
kleeja_admin_info($lang['PLUGIN_EXISTS_BEFORE'], true, '', true, ADMIN_PATH . '?cp=' . basename(__file__, '.php'));
exit; exit;
} }
$kleeja_plugin = []; $kleeja_plugin = [];
include PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plg_name . '/init.php'; include PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plg_name.'/init.php';
$install_callback = $kleeja_plugin[$plg_name]['install']; $install_callback = $kleeja_plugin[$plg_name]['install'];
$plugin_info = $kleeja_plugin[$plg_name]['information']; $plugin_info = $kleeja_plugin[$plg_name]['information'];
$plugin_first_run = false; $plugin_first_run = false;
if (! empty($kleeja_plugin[$plg_name]['first_run'][$config['language']])) if (! empty($kleeja_plugin[$plg_name]['first_run'][$config['language']])) {
{
$plugin_first_run = $kleeja_plugin[$plg_name]['first_run'][$config['language']]; $plugin_first_run = $kleeja_plugin[$plg_name]['first_run'][$config['language']];
} } elseif (! empty($kleeja_plugin[$plg_name]['first_run']['en'])) {
elseif (! empty($kleeja_plugin[$plg_name]['first_run']['en']))
{
$plugin_first_run = $kleeja_plugin[$plg_name]['first_run']['en']; $plugin_first_run = $kleeja_plugin[$plg_name]['first_run']['en'];
} }
@@ -336,23 +280,26 @@ switch ($case):
// Max version of Kleeja that's required to run this plugin // Max version of Kleeja that's required to run this plugin
//'plugin_kleeja_version_max' => '3.8', //'plugin_kleeja_version_max' => '3.8',
if (version_compare(KLEEJA_VERSION, $plugin_info['plugin_kleeja_version_min'], '<')) if (version_compare(KLEEJA_VERSION, $plugin_info['plugin_kleeja_version_min'], '<')) {
{
kleeja_admin_info( kleeja_admin_info(
$lang['PACKAGE_N_CMPT_KLJ'] . '<br>k:' . KLEEJA_VERSION . '|<|p.min:' . $plugin_info['plugin_kleeja_version_min'], $lang['PACKAGE_N_CMPT_KLJ'].'<br>k:'.KLEEJA_VERSION.'|<|p.min:'.$plugin_info['plugin_kleeja_version_min'],
true, '', true, ADMIN_PATH . '?cp=' . basename(__file__, '.php') true,
'',
true,
ADMIN_PATH.'?cp='.basename(__FILE__, '.php')
); );
exit; exit;
} }
if ($plugin_info['plugin_kleeja_version_max'] != '0') if ($plugin_info['plugin_kleeja_version_max'] != '0') {
{ if (version_compare(KLEEJA_VERSION, $plugin_info['plugin_kleeja_version_max'], '>')) {
if (version_compare(KLEEJA_VERSION, $plugin_info['plugin_kleeja_version_max'], '>'))
{
kleeja_admin_info( kleeja_admin_info(
$lang['PACKAGE_N_CMPT_KLJ'] . '<br>k:' . KLEEJA_VERSION . '|>|p.max:' . $plugin_info['plugin_kleeja_version_max'], $lang['PACKAGE_N_CMPT_KLJ'].'<br>k:'.KLEEJA_VERSION.'|>|p.max:'.$plugin_info['plugin_kleeja_version_max'],
true, '', true, ADMIN_PATH . '?cp=' . basename(__file__, '.php') true,
'',
true,
ADMIN_PATH.'?cp='.basename(__FILE__, '.php')
); );
exit; exit;
@@ -361,100 +308,84 @@ switch ($case):
delete_cache('', true); delete_cache('', true);
if (is_array($plugin_info['plugin_description'])) if (is_array($plugin_info['plugin_description'])) {
{
$plugin_info['plugin_description'] = ! empty($plugin_info['plugin_description']['en']) ? $plugin_info['plugin_description']['en'] : $plugin_info['plugin_description'][0]; $plugin_info['plugin_description'] = ! empty($plugin_info['plugin_description']['en']) ? $plugin_info['plugin_description']['en'] : $plugin_info['plugin_description'][0];
} }
//add to database //add to database
$insert_query = [ $insert_query = [
'INSERT' => '`plg_name` ,`plg_ver`, `plg_author`, `plg_dsc`, `plg_icon`, `plg_uninstall`, `plg_instructions`, `plg_store`, `plg_files`', 'INSERT' => '`plg_name` ,`plg_ver`, `plg_author`, `plg_dsc`, `plg_icon`, `plg_uninstall`, `plg_instructions`, `plg_store`, `plg_files`',
'INTO' => "{$dbprefix}plugins", 'INTO' => "{$dbprefix}plugins",
'VALUES' => "'" . $SQL->escape($plg_name) . "','" . $SQL->escape($plugin_info['plugin_version']) . "', '" . $SQL->escape($plugin_info['plugin_developer']) . "','" . $SQL->escape($plugin_info['plugin_description']) . "', '', '', '', '', ''", 'VALUES' => "'".$SQL->escape($plg_name)."','".$SQL->escape($plugin_info['plugin_version'])."', '".$SQL->escape($plugin_info['plugin_developer'])."','".$SQL->escape($plugin_info['plugin_description'])."', '', '', '', '', ''",
]; ];
$SQL->build($insert_query); $SQL->build($insert_query);
//may God protect you brother. //may God protect you brother.
if (is_callable($install_callback)) if (is_callable($install_callback)) {
{
$install_callback($SQL->insert_id()); $install_callback($SQL->insert_id());
} }
//show done, msg //show done, msg
$text = '<h3>' . $lang['NEW_PLUGIN_ADDED'] . '</h3>'; $text = '<h3>'.$lang['NEW_PLUGIN_ADDED'].'</h3>';
if ($plugin_first_run) if ($plugin_first_run) {
{
$text .= $plugin_first_run; $text .= $plugin_first_run;
$text .= '<br><hr><a href="' . ADMIN_PATH . '?cp=' . basename(__file__, '.php') . '" class="btn btn-primary btn-lg">' . $lang['GO_BACK_BROWSER'] . '</a>'; $text .= '<br><hr><a href="'.ADMIN_PATH.'?cp='.basename(__FILE__, '.php').'" class="btn btn-primary btn-lg">'.$lang['GO_BACK_BROWSER'].'</a>';
} else {
$text .= '<script type="text/javascript"> setTimeout("get_kleeja_link(\''.ADMIN_PATH.'?cp='.basename(__FILE__, '.php').'\');", 2000);</script>'."\n";
} }
else
{
$text .= '<script type="text/javascript"> setTimeout("get_kleeja_link(\'' . ADMIN_PATH . '?cp=' . basename(__file__, '.php') . '\');", 2000);</script>' . "\n";
}
$stylee = 'admin_info'; $stylee = 'admin_info';
} }
break; break;
// //
//uninstall a plugin //uninstall a plugin
// //
case 'uninstall': case 'uninstall':
if (intval($userinfo['founder']) !== 1) if (intval($userinfo['founder']) !== 1) {
{
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
kleeja_admin_err($lang['HV_NOT_PRVLG_ACCESS'], $action); kleeja_admin_err($lang['HV_NOT_PRVLG_ACCESS'], $action);
} }
$plg_name = g('plg', 'str'); $plg_name = g('plg', 'str');
if (empty($plg_name)) if (empty($plg_name)) {
{ if (defined('DEV_STAGE')) {
if (defined('DEV_STAGE'))
{
exit('empty($plg_name)'); exit('empty($plg_name)');
} }
//no plugin selected? back //no plugin selected? back
redirect(ADMIN_PATH . '?cp=' . basename(__file__, '.php')); redirect(ADMIN_PATH.'?cp='.basename(__FILE__, '.php'));
} } else {
else if (! file_exists(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plg_name.'/init.php')) {
{ if (defined('DEV_STAGE')) {
if (! file_exists(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plg_name . '/init.php'))
{
if (defined('DEV_STAGE'))
{
exit('!file_exists($plg_name)'); exit('!file_exists($plg_name)');
} }
redirect(ADMIN_PATH . '?cp=' . basename(__file__, '.php')); redirect(ADMIN_PATH.'?cp='.basename(__FILE__, '.php'));
exit; exit;
} }
$kleeja_plugin = []; $kleeja_plugin = [];
include PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plg_name . '/init.php'; include PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plg_name.'/init.php';
$uninstall_callback = $kleeja_plugin[$plg_name]['uninstall']; $uninstall_callback = $kleeja_plugin[$plg_name]['uninstall'];
if (! is_callable($uninstall_callback)) if (! is_callable($uninstall_callback)) {
{ redirect(ADMIN_PATH.'?cp='.basename(__FILE__, '.php'));
redirect(ADMIN_PATH . '?cp=' . basename(__file__, '.php'));
exit; exit;
} }
$query = [ $query = [
'SELECT' => 'plg_id', 'SELECT' => 'plg_id',
'FROM' => "{$dbprefix}plugins", 'FROM' => "{$dbprefix}plugins",
'WHERE' => "plg_name='" . $SQL->escape($plg_name) . "'" 'WHERE' => "plg_name='".$SQL->escape($plg_name)."'"
]; ];
$result = $SQL->build($query); $result = $SQL->build($query);
@@ -469,72 +400,61 @@ switch ($case):
//remove from database //remove from database
$query_del = [ $query_del = [
'DELETE' => "`{$dbprefix}plugins`", 'DELETE' => "`{$dbprefix}plugins`",
'WHERE' => "plg_name='" . $SQL->escape($plg_name) . "'" 'WHERE' => "plg_name='".$SQL->escape($plg_name)."'"
]; ];
$SQL->build($query_del); $SQL->build($query_del);
//show done, msg //show done, msg
$text = '<h3>' . sprintf($lang['ITEM_DELETED'], $plg_name) . '</h3>'; $text = '<h3>'.sprintf($lang['ITEM_DELETED'], $plg_name).'</h3>';
$text .= '<script type="text/javascript"> setTimeout("get_kleeja_link(\'' . ADMIN_PATH . '?cp=' . basename(__file__, '.php') . '\');", 2000);</script>' . "\n"; $text .= '<script type="text/javascript"> setTimeout("get_kleeja_link(\''.ADMIN_PATH.'?cp='.basename(__FILE__, '.php').'\');", 2000);</script>'."\n";
$stylee = 'admin_info'; $stylee = 'admin_info';
} }
break; break;
// //
// disable a plugin // disable a plugin
// //
case 'disable': case 'disable':
case 'enable': case 'enable':
if (intval($userinfo['founder']) !== 1) if (intval($userinfo['founder']) !== 1) {
{
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
kleeja_admin_err($lang['HV_NOT_PRVLG_ACCESS'], $action); kleeja_admin_err($lang['HV_NOT_PRVLG_ACCESS'], $action);
} }
$plg_name = g('plg', 'str'); $plg_name = g('plg', 'str');
if (empty($plg_name)) if (empty($plg_name)) {
{ if (defined('DEV_STAGE')) {
if (defined('DEV_STAGE'))
{
exit('empty($plg_name)'); exit('empty($plg_name)');
} }
//no plugin selected? back //no plugin selected? back
redirect(ADMIN_PATH . '?cp=' . basename(__file__, '.php')); redirect(ADMIN_PATH.'?cp='.basename(__FILE__, '.php'));
} } else {
else
{
//update database //update database
$update_query = [ $update_query = [
'UPDATE' => "{$dbprefix}plugins", 'UPDATE' => "{$dbprefix}plugins",
'SET' => 'plg_disabled=' . ($case == 'disable' ? 1 : 0), 'SET' => 'plg_disabled='.($case == 'disable' ? 1 : 0),
'WHERE' => "plg_name='" . $SQL->escape($plg_name) . "'" 'WHERE' => "plg_name='".$SQL->escape($plg_name)."'"
]; ];
$SQL->build($update_query); $SQL->build($update_query);
delete_cache('', true); delete_cache('', true);
//show done, msg //show done, msg
$text = '<h3>' . $lang['PLGUIN_DISABLED_ENABLED'] . '</h3>'; $text = '<h3>'.$lang['PLGUIN_DISABLED_ENABLED'].'</h3>';
$text .= '<script type="text/javascript"> setTimeout("get_kleeja_link(\'' . ADMIN_PATH . '?cp=' . basename(__file__, '.php') . '\');", 2000);</script>' . "\n"; $text .= '<script type="text/javascript"> setTimeout("get_kleeja_link(\''.ADMIN_PATH.'?cp='.basename(__FILE__, '.php').'\');", 2000);</script>'."\n";
$stylee = 'admin_info'; $stylee = 'admin_info';
} }
break; break;
case 'download': case 'download':
if (intval($userinfo['founder']) !== 1) if (intval($userinfo['founder']) !== 1) {
{
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
kleeja_admin_err($lang['HV_NOT_PRVLG_ACCESS']); kleeja_admin_err($lang['HV_NOT_PRVLG_ACCESS']);
} }
@@ -544,18 +464,15 @@ switch ($case):
$is_update = false; $is_update = false;
//if plugin exists before, then trigger update action. rename folder to rollback in case of failure //if plugin exists before, then trigger update action. rename folder to rollback in case of failure
if (file_exists(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name . '/init.php')) if (file_exists(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name.'/init.php')) {
{
$is_update = true; $is_update = true;
if (! rename( if (! rename(
PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name, PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name,
PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name . '_backup' PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name.'_backup'
)) )) {
{ if (is_dir(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name)) {
if (is_dir(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name)) kleeja_unlink(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name);
{
kleeja_unlink(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name);
} }
} }
} }
@@ -565,32 +482,28 @@ switch ($case):
$catalog_plugins = fetch_remote_file($store_link); $catalog_plugins = fetch_remote_file($store_link);
if ($catalog_plugins) if ($catalog_plugins) {
{
$catalog_plugins = json_decode($catalog_plugins, true); $catalog_plugins = json_decode($catalog_plugins, true);
$store_plugins = []; $store_plugins = [];
// make an arry for all plugins in kleeja store that not included in our server // make an arry for all plugins in kleeja store that not included in our server
foreach ($catalog_plugins as $plugin_info) foreach ($catalog_plugins as $plugin_info) {
{ if ($plugin_info['type'] != 'plugin') {
if ($plugin_info['type'] != 'plugin')
{
continue; continue;
} }
$store_plugins[$plugin_info['name']] = [ $store_plugins[$plugin_info['name']] = [
'name' => $plugin_info['name'] , 'name' => $plugin_info['name'],
'plg_version' => $plugin_info['file']['version'] , 'plg_version' => $plugin_info['file']['version'],
'url' => $plugin_info['file']['url'] , 'url' => $plugin_info['file']['url'],
'kj_min_version' => $plugin_info['kleeja_version']['min'] , 'kj_min_version' => $plugin_info['kleeja_version']['min'],
'kj_max_version' => $plugin_info['kleeja_version']['max'] , 'kj_max_version' => $plugin_info['kleeja_version']['max'],
]; ];
} }
// this plugin is hosted in our store // this plugin is hosted in our store
if (isset($store_plugins[$plugin_name])) if (isset($store_plugins[$plugin_name])) {
{
// check if the version of the plugin is compatible with our kleeja version or not // check if the version of the plugin is compatible with our kleeja version or not
if ( if (
version_compare(strtolower($store_plugins[$plugin_name]['kj_min_version']), KLEEJA_VERSION, '<=') version_compare(strtolower($store_plugins[$plugin_name]['kj_min_version']), KLEEJA_VERSION, '<=')
@@ -598,110 +511,82 @@ switch ($case):
) { ) {
$plugin_name_link = $store_plugins[$plugin_name]['url']; $plugin_name_link = $store_plugins[$plugin_name]['url'];
$plugin_archive = fetch_remote_file($plugin_name_link, PATH . 'cache/' . $plugin_name . '.zip', 60, false, 10, true); $plugin_archive = fetch_remote_file($plugin_name_link, PATH.'cache/'.$plugin_name.'.zip', 60, false, 10, true);
if ($plugin_archive) if ($plugin_archive) {
{ if (file_exists(PATH.'cache/'.$plugin_name.'.zip')) {
if (file_exists(PATH . 'cache/' . $plugin_name . '.zip'))
{
$zip = new ZipArchive(); $zip = new ZipArchive();
if ($zip->open(PATH . 'cache/' . $plugin_name . '.zip') === true) if ($zip->open(PATH.'cache/'.$plugin_name.'.zip') === true) {
{ if ($zip->extractTo(PATH.KLEEJA_PLUGINS_FOLDER)) {
if ($zip->extractTo(PATH . KLEEJA_PLUGINS_FOLDER))
{
// we dont need the zip file anymore // we dont need the zip file anymore
kleeja_unlink(PATH . 'cache/' . $plugin_name . '.zip'); kleeja_unlink(PATH.'cache/'.$plugin_name.'.zip');
// uploaded plugin's archive has different name, so we change it // uploaded plugin's archive has different name, so we change it
rename( rename(
PATH . KLEEJA_PLUGINS_FOLDER . '/' . trim($zip->getNameIndex(0), '/'), PATH.KLEEJA_PLUGINS_FOLDER.'/'.trim($zip->getNameIndex(0), '/'),
PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name
); );
$zip->close(); $zip->close();
// download or update msg // download or update msg
$adminAjaxContent = '1:::' . sprintf($lang[$is_update ? 'ITEM_UPDATED' : 'ITEM_DOWNLOADED'], $plugin_name); $adminAjaxContent = '1:::'.sprintf($lang[$is_update ? 'ITEM_UPDATED' : 'ITEM_DOWNLOADED'], $plugin_name);
//in case of update, delete back up version //in case of update, delete back up version
if (is_dir(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name . '_backup')) if (is_dir(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name.'_backup')) {
{ kleeja_unlink(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name.'_backup');
kleeja_unlink(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name . '_backup');
} }
} } else {
else $adminAjaxContent = '1003:::'.sprintf($lang['EXTRACT_ZIP_FAILED'], KLEEJA_PLUGINS_FOLDER);
{
$adminAjaxContent = '1003:::' . sprintf($lang['EXTRACT_ZIP_FAILED'], KLEEJA_PLUGINS_FOLDER);
} }
} }
} else {
$adminAjaxContent = '1004:::'.$lang['DOWNLOADED_FILE_NOT_FOUND'];
} }
else } else {
{ $adminAjaxContent = '1005:::'.$lang['STORE_SERVER_ERROR'];
$adminAjaxContent = '1004:::' . $lang['DOWNLOADED_FILE_NOT_FOUND'];
}
}
else
{
$adminAjaxContent = '1005:::' . $lang['STORE_SERVER_ERROR'];
} }
} else {
$adminAjaxContent = '1006:::'.$lang['PACKAGE_N_CMPT_KLJ'];
} }
else } else {
{ $adminAjaxContent = '1007:::'.sprintf($lang['PACKAGE_REMOTE_FILE_MISSING'], $plugin_name);
$adminAjaxContent = '1006:::' . $lang['PACKAGE_N_CMPT_KLJ'];
}
}
else
{
$adminAjaxContent = '1007:::' . sprintf($lang['PACKAGE_REMOTE_FILE_MISSING'], $plugin_name);
} }
} else {
$adminAjaxContent = '1008:::'.$lang['STORE_SERVER_ERROR'];
} }
else
{
$adminAjaxContent = '1008:::' . $lang['STORE_SERVER_ERROR'];
}
//in case of update failure, rollback to current plugin version //in case of update failure, rollback to current plugin version
if (strpos($adminAjaxContent, '1:::') === false) if (strpos($adminAjaxContent, '1:::') === false) {
{ if (is_dir(PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name.'_backup')) {
if (is_dir(PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name . '_backup'))
{
rename( rename(
PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name . '_backup', PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name.'_backup',
PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name
); );
} }
} }
break; break;
case 'dfolder': case 'dfolder':
$plugin_name = preg_replace('/[^a-z0-9_\-\.]/i', '', g('plg')); $plugin_name = preg_replace('/[^a-z0-9_\-\.]/i', '', g('plg'));
$plugin_folder_path = PATH . KLEEJA_PLUGINS_FOLDER . '/' . $plugin_name; $plugin_folder_path = PATH.KLEEJA_PLUGINS_FOLDER.'/'.$plugin_name;
if (is_dir($plugin_folder_path)) {
if (is_dir($plugin_folder_path)) if (! is_writable($plugin_folder_path)) {
{ @chmod($plugin_folder_path, K_DIR_CHMOD);
if (! is_writable($plugin_folder_path))
{
chmod($plugin_folder_path, K_DIR_CHMOD);
} }
kleeja_unlink($plugin_folder_path); kleeja_unlink($plugin_folder_path);
} }
if (! is_dir($plugin_folder_path)) {
if (! is_dir($plugin_folder_path)) kleeja_admin_info(sprintf($lang['ITEM_DELETED'], $plugin_name), $action.'&amp;case=local');
{
kleeja_admin_info(sprintf($lang['ITEM_DELETED'], $plugin_name), $action . '&amp;case=local');
} }
kleeja_admin_err($lang['ERROR_TRY_AGAIN'], $action); kleeja_admin_err($lang['ERROR_TRY_AGAIN'], $action);
break; break;
endswitch; endswitch;

View File

@@ -329,7 +329,7 @@ case 'upload':
{ {
if (! is_writable($style_folder_path)) if (! is_writable($style_folder_path))
{ {
chmod($style_folder_path, K_DIR_CHMOD); @chmod($style_folder_path, K_DIR_CHMOD);
} }
kleeja_unlink($style_folder_path); kleeja_unlink($style_folder_path);
@@ -361,7 +361,7 @@ case 'download':
if (! is_writable(PATH . 'styles')) if (! is_writable(PATH . 'styles'))
{ {
chmod(PATH . 'styles', K_DIR_CHMOD); @chmod(PATH . 'styles', K_DIR_CHMOD);
} }
//if style exists before, then trigger update action. rename folder to rollback in case of failure //if style exists before, then trigger update action. rename folder to rollback in case of failure

View File

@@ -160,6 +160,8 @@ case 'check':
if (function_exists('chmod')) if (function_exists('chmod'))
{ {
@chmod(PATH . 'cache', 0755); @chmod(PATH . 'cache', 0755);
@chmod(PATH . 'plugins', 0755);
@chmod(PATH . 'styles', 0755);
@chmod(PATH . 'uploads', 0755); @chmod(PATH . 'uploads', 0755);
@chmod(PATH . 'uploads/thumbs', 0755); @chmod(PATH . 'uploads/thumbs', 0755);
} }

View File

@@ -118,7 +118,8 @@ return [
'ADD_NEW_PLUGIN' => 'أضف إضافة برمجية جديدة', 'ADD_NEW_PLUGIN' => 'أضف إضافة برمجية جديدة',
'ITEM_DELETED' => 'لقد تم حذف "%s" بنجاح...', 'ITEM_DELETED' => 'لقد تم حذف "%s" بنجاح...',
'PLGUIN_DISABLED_ENABLED' => 'لقد تم تفعيل \ تعطيل الإضافة البرمجية..', 'PLGUIN_DISABLED_ENABLED' => 'لقد تم تفعيل \ تعطيل الإضافة البرمجية..',
'NO_PLUGINS' => 'لا يوجد أي إضافات برمجية ..', 'NO_PLUGINS' => 'لا يوجد أي إضافات برمجية متوفرة..',
'NO_STYLES' => 'لا يوجد أي ستايلات متوفرة..',
'NEW_PLUGIN_ADDED' => 'لقد تمت إضافة الإضافة البرمجية .. ', 'NEW_PLUGIN_ADDED' => 'لقد تمت إضافة الإضافة البرمجية .. ',
'PLUGIN_EXISTS_BEFORE' => 'الاضافة هذه موجودة سابقاً بنفس الاصدار أو أعلى ولاتحتاج تحديث !', 'PLUGIN_EXISTS_BEFORE' => 'الاضافة هذه موجودة سابقاً بنفس الاصدار أو أعلى ولاتحتاج تحديث !',
'R_CHECK_UPDATE' => 'فحص عن تحديثات', 'R_CHECK_UPDATE' => 'فحص عن تحديثات',

View File

@@ -120,7 +120,8 @@ return [
'ITEM_DELETED' => '%s has been deleted successfully...', 'ITEM_DELETED' => '%s has been deleted successfully...',
'PLGUIN_DISABLED_ENABLED' => 'Plugin Enabled / Disabled', 'PLGUIN_DISABLED_ENABLED' => 'Plugin Enabled / Disabled',
'NO_PLUGINS' => 'No plugins found! You could start browsing plugins and installing them by clicking the tab "Kleeja Store" or upload a plugin file from the tab "Local Plugins".', 'NO_PLUGINS' => 'No available plugins found...',
'NO_STYLES' => 'No available styles found...',
'NEW_PLUGIN_ADDED' => 'Plugin added ... ', 'NEW_PLUGIN_ADDED' => 'Plugin added ... ',
'PLUGIN_EXISTS_BEFORE' => 'This plugin exists before with same version or above, so no need to update it!.', 'PLUGIN_EXISTS_BEFORE' => 'This plugin exists before with same version or above, so no need to update it!.',
'R_CHECK_UPDATE' => 'Check for updates', 'R_CHECK_UPDATE' => 'Check for updates',