PageRenderTime 62ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/inc/module/admin/adminModule.class.php

http://github.com/KrynLabs/Kryn.cms
PHP | 1133 lines | 804 code | 257 blank | 72 comment | 176 complexity | bcd92afe8d030e814bce1bb157893785 MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause, MIT
  1. <?php
  2. class adminModule {
  3. public static function init() {
  4. global $cfg;
  5. if (!$cfg['repoServer']) {
  6. $cfg['repoServer'] = 'http://download.kryn.org';
  7. }
  8. switch (getArgv(4)) {
  9. case 'deactivate':
  10. return self::deactivate($_REQUEST['name']);
  11. case 'activate':
  12. return self::activate($_REQUEST['name']);
  13. /* not in use
  14. case 'dev-install':
  15. return self::devInstall(getArgv(5));
  16. case 'dev-update':
  17. return self::devUpdate(getArgv(5));
  18. case 'dev-remove':
  19. return self::devRemove(getArgv(5));
  20. case 'new':
  21. return self::listTopModules();
  22. */
  23. case 'managerSearch':
  24. return self::managerSearch(getArgv('q'));
  25. case 'managerGetCategoryItems':
  26. return self::getCategoryItems(getArgv('category') + 0, getArgv('lang'));
  27. case 'managerGetBox':
  28. return self::getBox(getArgv('code'));
  29. // for pluginchooser
  30. case 'getModules':
  31. return self::getModules();
  32. case 'check4updates':
  33. return self::check4updates();
  34. case 'getInstallInfo': #step 1
  35. return self::getInstallInfo(getArgv('name', 2), getArgv('type'));
  36. case 'getPrepareInstall': #step 2
  37. return self::getPrepareInstall(getArgv('name', 2), getArgv('type'));
  38. case 'getDependExtension':
  39. json(self::getDependExtension(getArgv('name', 2), getArgv('file'), getArgv('version')));
  40. case 'installModule': # step 3
  41. return json(self::installModule(getArgv('name', 2), getArgv('type')));
  42. case 'loadLocal':
  43. return self::loadLocal();
  44. case 'loadInstalled':
  45. return self::loadInstalled();
  46. case 'getPublishInfo':
  47. return self::getPublishInfo(getArgv('name', 2));
  48. case 'publish':
  49. json(self::publish(getArgv('pw'), getArgv('name', 2), getArgv('message')));
  50. case 'getVersion':
  51. json(self::getVersion(getArgv('name', 2)));
  52. case 'getPackage':
  53. json(self::getPackage(getArgv('name', 2)));
  54. case 'getChangedFiles':
  55. json(self::getChangedFiles(getArgv('name', 2)));
  56. case 'remove':
  57. json(self::removeModule(getArgv('name', 2)));
  58. case 'dbInit':
  59. return self::dbInit(getArgv('name', 2));
  60. //edit module
  61. case 'extractLanguage':
  62. json(krynLanguage::extractLanguage(getArgv('name', 2)));
  63. case 'getLanguage':
  64. json(krynLanguage::getLanguage(getArgv('name', 2), getArgv('lang', 2)));
  65. case 'saveLanguage':
  66. json(krynLanguage::saveLanguage(getArgv('name', 2), getArgv('lang', 2), getArgv('langs')));
  67. case 'getConfig':
  68. json(self::loadInfo(getArgv('name', 2)));
  69. case 'getForms':
  70. json(self::loadForms(getArgv('name', 2)));
  71. case 'getHelp':
  72. json(self::getHelp(getArgv('name', 2), getArgv('lang', 2)));
  73. case 'saveHelp':
  74. json(self::saveHelp(getArgv('name', 2), getArgv('lang', 2), getArgv('help')));
  75. case 'saveLayouts':
  76. json(self::saveLayouts());
  77. case 'saveGeneral':
  78. json(self::saveGeneral());
  79. case 'saveLinks':
  80. json(self::saveLinks());
  81. case 'saveDb':
  82. json(self::saveDb());
  83. case 'saveDocu':
  84. json(self::saveDocu());
  85. case 'getDocu':
  86. json(self::getDocu());
  87. case 'savePlugins':
  88. json(self::savePlugins());
  89. case 'getPlugins':
  90. json(self::getPlugins(getArgv('name', 2)));
  91. case 'addCheckCode':
  92. json(self::addCheckCode(getArgv('name', 2)));
  93. }
  94. }
  95. public static function getDependExtension($pName, $pFile, $pNeedVersion) {
  96. $res = array('ok' => false);
  97. $del = false;
  98. $del = (strpos($pNeedVersion, '>') === false) ? $del : '>';
  99. $del = (strpos($pNeedVersion, '=') === false) ? $del : '=';
  100. $del = (strpos($pNeedVersion, '=>') === false) ? $del : '=>';
  101. $del = (strpos($pNeedVersion, '>=') === false) ? $del : '>=';
  102. $del = (strpos($pNeedVersion, '<') === false) ? $del : '<';
  103. $del = (strpos($pNeedVersion, '<=') === false) ? $del : '<=';
  104. $del = (strpos($pNeedVersion, '=<') === false) ? $del : '=<';
  105. $needVersion = str_replace($del, '', $pNeedVersion);
  106. $pFile = str_replace('..', '', $pFile);
  107. if (!file_exists($pFile)) {
  108. $info = self::loadInfo($pName, $pFile);
  109. if (!$info['noConfig'] && $info['extensionCode'] == getArgv('name')) {
  110. if (kryn::compareVersion($info['version'], $del, $needVersion)) {
  111. $res = array('ok' => true);
  112. }
  113. }
  114. }
  115. return $res;
  116. }
  117. public static function getPlugins($pName) {
  118. $config = self::loadConfig($pName);
  119. return $config['plugins'];
  120. }
  121. public static function getCategoryItems($pId, $pLang) {
  122. global $cfg;
  123. $res = wget($cfg['repoServer'] . "/?exGetCategoryList=1&id=$pId&lang=" . $pLang);
  124. print $res;
  125. exit;
  126. }
  127. public static function getBox($pCode) {
  128. global $cfg;
  129. $res = wget($cfg['repoServer'] . "/?exGetBox=1&code=$pCode");
  130. print $res;
  131. exit;
  132. }
  133. public static function managerSearch($q) {
  134. global $cfg;
  135. $res = wget($cfg['repoServer'] . "/?exSearch=$q");
  136. print $res;
  137. exit;
  138. }
  139. function getHelp($pName, $pLang) {
  140. $helpFile = PATH_MODULE . "$pName/lang/help_$pLang.json";
  141. $res = array();
  142. if (!file_exists($helpFile))
  143. json($res);
  144. else {
  145. $json = kryn::fileRead($helpFile);
  146. $help = json_decode($json, 1);
  147. json($help);
  148. }
  149. }
  150. public static function saveHelp($pName, $pLang, $pHelp) {
  151. $helpFile = PATH_MODULE . "$pName/lang/help_$pLang.json";
  152. $json = json_format($pHelp);
  153. kryn::fileWrite($helpFile, $json);
  154. json(1);
  155. }
  156. public static function getDocu() {
  157. $lang = getArgv('lang', 2);
  158. $name = getArgv('name', 2);
  159. $text = kryn::fileRead(PATH_MODULE . "$name/docu/$lang.html");
  160. json($text);
  161. }
  162. public static function saveDocu() {
  163. $lang = getArgv('lang', 2);
  164. $text = getArgv('text');
  165. $name = getArgv('name', 2);
  166. if (!is_dir(PATH_MODULE . "$name/docu/"))
  167. mkdir(PATH_MODULE . "$name/docu/");
  168. kryn::fileWrite(PATH_MODULE . "$name/docu/$lang.html", $text);
  169. json(1);
  170. }
  171. public static function loadForms($pName) {
  172. if (!is_dir(PATH_MODULE . "$pName/forms")) return false;
  173. $h = opendir(PATH_MODULE . "$pName/forms");
  174. $res = array();
  175. while ($file = readdir($h)) {
  176. if ($file == '.' || $file == '..' || $file == '.svn') continue;
  177. $class = substr($file, 0, -5);
  178. $res[] = $class;
  179. }
  180. return $res;
  181. }
  182. public static function addCheckCode($pName) {
  183. global $cfg;
  184. if (file_exists(PATH_MODULE . '' . $pName)) {
  185. $res['status'] = 'exist';
  186. } else {
  187. $res = wget('http://www.kryn.org/rpc?t=checkExtensionCode&code=' . $pName);
  188. $res = json_decode($res, 1);
  189. }
  190. if ($res['status'] == 'ok') {
  191. @mkdir(PATH_MODULE . "$pName");
  192. @mkdir("inc/template/$pName");
  193. $config = array(
  194. 'version' => '0.0.1',
  195. 'owner' => $cfg['communityId'],
  196. 'community' => 0,
  197. 'category' => 0,
  198. 'writableFiles' => 'inc/template/' . $pName . '/*',
  199. 'title' => array(
  200. 'en' => 'Enter here a title for ' . $pName
  201. ),
  202. 'desc' => array(
  203. 'en' => 'Enter here a description about your extension'
  204. )
  205. );
  206. self::writeConfig($pName, $config);
  207. }
  208. return $res;
  209. }
  210. public static function saveDb() {
  211. $name = getArgv('name', 2);
  212. $config = self::loadConfig($name);
  213. $db = json_decode(getArgv('tables'), true);
  214. $config['db'] = $db;
  215. self::writeConfig($name, $config);
  216. json(1);
  217. }
  218. public static function saveLinks() {
  219. $name = getArgv('name', 2);
  220. $config = self::loadConfig($name);
  221. $admin = json_decode(getArgv('admin'), true);
  222. $config['admin'] = $admin;
  223. self::writeConfig($name, $config);
  224. json(1);
  225. }
  226. public static function saveGeneral() {
  227. $name = getArgv('name', 2);
  228. $config = self::loadConfig($name);
  229. if (getArgv('owner') > 0)
  230. $config['owner'] = getArgv('owner');
  231. $config['title'][getArgv('lang')] = getArgv('title');
  232. $config['desc'][getArgv('lang')] = getArgv('desc');
  233. $config['tags'][getArgv('lang')] = getArgv('tags');
  234. $config['version'] = getArgv('version');
  235. $config['community'] = getArgv('community');
  236. $config['writableFiles'] = getArgv('writableFiles');
  237. $config['category'] = getArgv('category');
  238. $config['depends'] = getArgv('depends');
  239. self::writeConfig($name, $config);
  240. json(1);
  241. }
  242. public static function saveLayouts() {
  243. $themes = json_decode(getArgv('themes'), true);
  244. $name = getArgv('name', 2);
  245. $config = self::loadConfig($name);
  246. $config['themes'] = $themes;
  247. self::writeConfig($name, $config);
  248. json(1);
  249. }
  250. public static function writeConfig($pName, $pConfig) {
  251. $json = json_format(json_encode($pConfig));
  252. if ($pName == 'kryn')
  253. kryn::fileWrite("inc/kryn/config.json", $json);
  254. else
  255. kryn::fileWrite(PATH_MODULE . "$pName/config.json", $json);
  256. }
  257. public static function removeModule($pModuleName) {
  258. $files = json_decode($_REQUEST['files'], true);
  259. $pModuleName = esc(str_replace("..", "", $pModuleName));
  260. $h = fopen(PATH_MODULE . '' . $pModuleName . '/files.md5', 'r');
  261. mkdirr('data/packages/modules/removeMod/');
  262. $id = time() . $pModuleName;
  263. $folders = array();
  264. $copyBack = array();
  265. if ($h) {
  266. while ($line = @fgets($h)) {
  267. $temp = explode(" ", $line);
  268. $md5 = substr($temp[1], 0, -1);
  269. $filename = $temp[0];
  270. $save = false;
  271. if (is_array($files)) {
  272. foreach ($files as $file => $delete) {
  273. //if not checked
  274. if ($file == $filename && $delete != 1)
  275. $save = true;
  276. }
  277. }
  278. if ($save) {
  279. mkdirr("data/packages/modules/removeMod/$id/" . dirname($filename));
  280. rename($filename, "data/packages/modules/removeMod/$id/" . $filename);
  281. $copyBack[] = $filename;
  282. } else {
  283. unlink($filename);
  284. }
  285. $folders[dirname($filename)] = 1;
  286. }
  287. }
  288. unlink(PATH_MODULE . '' . $pModuleName . '/files.md5');
  289. foreach ($folders as $folder => $dummy) {
  290. @rmdir($folder); //only remove if empty folder
  291. }
  292. if (count($copyBack) > 0)
  293. foreach ($copyBack as $file) {
  294. mkdirr(dirname($file));
  295. rename("data/packages/modules/removeMod/$id/" . $file, $file);
  296. }
  297. delDir("data/packages/modules/removeMod/$id/");
  298. adminDb::remove(kryn::$configs[$pModuleName]);
  299. dbDelete('system_modules', "name = '$pModuleName'");
  300. kryn::clearLanguageCache();
  301. return true;
  302. }
  303. public static function getChangedFiles($pModuleName) {
  304. $res = array();
  305. $res['modifiedFiles'] = array();
  306. $pModuleName = str_replace("..", "", $pModuleName);
  307. $config = kryn::getModuleConfig($pModuleName);
  308. $writableFiles = explode("\n", $config['writableFiles']);
  309. if (is_array($writableFiles)) {
  310. $h = fopen(PATH_MODULE . '' . $pModuleName . '/files.md5', 'r');
  311. if (!$h) return $res;
  312. $md5s = array();
  313. while ($line = @fgets($h)) {
  314. $temp = explode(" ", $line);
  315. $temp[1] = substr($temp[1], 0, -1);
  316. $md5s[$temp[0]] = $temp[1];
  317. }
  318. foreach ($md5s as $file => $md5) {
  319. foreach ($writableFiles as $path) {
  320. if ($path != "" && preg_match('/' . str_replace('/', '\/', $path) . '/', $file) != 0) {
  321. if (file_exists($file) && $md5 != md5(kryn::fileRead($file)))
  322. $res['modifiedFiles'][] = $file;
  323. }
  324. }
  325. }
  326. }
  327. return $res;
  328. }
  329. public static function getVersion($pName) {
  330. global $cfg;
  331. return wget($cfg['repoServer'] . '/?version=' . $pName);
  332. }
  333. public static function getPackage($pModuleName) {
  334. $res['file'] = self::createArchive($pModuleName);
  335. json($res);
  336. }
  337. public static function publish($pPw, $pModuleName, $pMessage) {
  338. global $cfg;
  339. $res = wget($cfg['repoServer'] . '/?checkPw=1&id=' . $cfg['communityId'] . "&pw=$pPw");
  340. if ($res != "1")
  341. json(0);
  342. $file = self::createArchive($pModuleName);
  343. $res = array();
  344. $status = wget('http://www.kryn.org/rpc?t=publish&id=' . $cfg['communityId'] . "&pw=$pPw&message=" .
  345. urlencode($pMessage), null, $file);
  346. $res['file'] = $file;
  347. $res['status'] = $status;
  348. json($res);
  349. }
  350. public static function createArchive($pModuleName) {
  351. $config = self::loadInfo($pModuleName);
  352. $temp = 'data/packages/modules/createArchive_' . $pModuleName . '/';
  353. if (file_exists($temp))
  354. delDir($temp);
  355. mkdirr($temp);
  356. if ($pModuleName != 'kryn') {
  357. mkdirr($temp . 'inc/module/' . $pModuleName);
  358. copyr(PATH_MODULE . '' . $pModuleName, $temp . 'inc/module/' . $pModuleName);
  359. }
  360. $template = 'inc/template/' . $pModuleName;
  361. if (file_exists($template)) {
  362. mkdirr($temp . $template);
  363. copyr($template, $temp . $template);
  364. }
  365. if ($config['extraFiles']) {
  366. foreach ($config['extraFiles'] as $item) {
  367. mkdirr(dirname($temp . $item));
  368. copyr($item, $temp . $item);
  369. }
  370. }
  371. include_once('File/Archive.php');
  372. #generate md5 of each file
  373. chdir($temp);
  374. $files = find('./*');
  375. chdir('../../../../'); //to PATH
  376. $md5s = "";
  377. if ($pModuleName == 'kryn')
  378. $files[] = './.htaccess';
  379. $files2Compress = array();
  380. foreach ($files as $file) {
  381. if (is_dir($temp . $file) && is_dir($temp . $file . '/.svn')) {
  382. delDir($temp . $file . '/.svn');
  383. } else if (!is_dir($temp . $file) && strpos($file, 'files.md5') === false) {
  384. $file = substr($file, 2);
  385. $md5s .= $file . ' ' . md5(kryn::fileRead($temp . $file)) . "\n";
  386. if (!class_exists('ZipArchive')){
  387. $reads[] = File_Archive::read($file, $file);
  388. }
  389. }
  390. }
  391. if ($pModuleName == 'kryn')
  392. $md5File = 'inc/kryn/files.md5';
  393. else
  394. $md5File = 'inc/module/' . $pModuleName . '/files.md5';
  395. kryn::fileWrite($temp . $md5File, $md5s);
  396. $archive = "data/packages/modules/$pModuleName-" . $config['version'] . '_' . date("ymdhis") . ".zip";
  397. if (!is_writeable('data/packages/modules/')){
  398. klog('core', 'data/packages/modules is not writeable. Can not create the extension archive.');
  399. return;
  400. }
  401. if (class_exists('ZipArchive')){
  402. $zip = new ZipArchive();
  403. $zip->open($archive, ZIPARCHIVE::CREATE);
  404. foreach ($files as $file)
  405. if (!is_dir($file)){
  406. $zip->addFile($file, $file);
  407. }
  408. $zip->addFile($temp . $md5File, $md5File);
  409. $zip->close();
  410. } else {
  411. $reads[] = File_Archive::read($temp . $md5File, $md5File);
  412. File_Archive::setOption('zipCompressionLevel', 9);
  413. // File_Archive::setOption('appendRemoveDuplicates', true);
  414. $source = File_Archive::readMulti(
  415. $reads
  416. );
  417. File_Archive::extract(
  418. $source,
  419. $archive
  420. );
  421. }
  422. return $archive;
  423. }
  424. public static function dbInit($pName) {
  425. $config = kryn::getModuleConfig($pName);
  426. $res = adminDb::install($config);
  427. if ($config['extendConfig']) {
  428. foreach ($config['extendConfig'] as $extendExt => $extendConfig) {
  429. if ($extendConfig['db']) {
  430. $res .= "\n\nExtend: " . $extendExt . "\n";
  431. $res .= adminDb::install($extendConfig);
  432. }
  433. }
  434. }
  435. if ($config['depends']) {
  436. $depends = explode(',', $config['depends']);
  437. foreach ($depends as $depend) {
  438. $del = false;
  439. $del = (strpos($depend, '>') === false) ? $del : '>';
  440. $del = (strpos($depend, '=') === false) ? $del : '=';
  441. $del = (strpos($depend, '=>') === false) ? $del : '=>';
  442. $del = (strpos($depend, '>=') === false) ? $del : '>=';
  443. $del = (strpos($depend, '<') === false) ? $del : '<';
  444. $del = (strpos($depend, '<=') === false) ? $del : '<=';
  445. $del = (strpos($depend, '=<') === false) ? $del : '=<';
  446. $temp = explode($del, $depend);
  447. $depName = $temp[0];
  448. $depConfig = kryn::getModuleConfig($depName);
  449. $res .= "\n\nDepend: " . $depName . "\n";
  450. $res .= adminDb::install($depConfig);
  451. }
  452. }
  453. json($res);
  454. }
  455. public static function getPublishInfo($pName) {
  456. $config = kryn::getModuleConfig($pName);
  457. $res['config'] = $config;
  458. $res['serverVersion'] = self::getVersion($pName);
  459. $files = array();
  460. if (count($config['extraFiles']) > 0) {
  461. foreach ($config['extraFiles'] as $extraFile) {
  462. foreach (glob($extraFile) as $file) {
  463. $files[$file] = is_dir($file) ? readFolder($file) : $file;
  464. }
  465. }
  466. }
  467. if ($pName != 'kryn')
  468. $files[PATH_MODULE . '' . $pName . '/'] = readFolder(PATH_MODULE . '' . $pName . '/');
  469. $files['inc/template/' . $pName . '/'] = readFolder('inc/template/' . $pName . '/');
  470. $res['files'] = $files;
  471. json($res);
  472. }
  473. public static function loadInstalled() {
  474. global $cfg;
  475. $res = array();
  476. $mods = dbTableFetch("system_modules", -1);
  477. $installed = array('kryn', 'admin', 'users');
  478. foreach ($mods as $mod) {
  479. $installed[] = $mod['name'];
  480. }
  481. foreach ($installed as $mod) {
  482. $config = self::loadInfo($mod);
  483. $res[$mod] = $config;
  484. $res[$mod]['activated'] = (kryn::$configs[$mod]) ? 1 : 0;
  485. $res[$mod]['serverVersion'] = wget($cfg['repoServer'] . "/?version=" . $mod);
  486. $res[$mod]['serverCompare'] =
  487. self::versionCompareToServer($res[$mod]['version'], $res[$mod]['serverVersion']);
  488. }
  489. json($res);
  490. }
  491. static public function loadLocal() {
  492. $modules = kryn::readFolder(PATH_MODULE . '');
  493. $modules[] = 'kryn';
  494. $res = array();
  495. foreach ($modules as $module) {
  496. $config = self::loadInfo($module);
  497. $res[$module] = $config;
  498. $res[$module]['activated'] = (kryn::$configs[$module]) ? 1 : 0;
  499. }
  500. json($res);
  501. }
  502. static public function loadConfig($pModuleName) {
  503. if ($pModuleName == 'kryn')
  504. $configFile = "inc/kryn/config.json";
  505. else
  506. $configFile = PATH_MODULE . "$pModuleName/config.json";
  507. $json = kryn::fileRead($configFile);
  508. $config = json_decode($json, true);
  509. return $config;
  510. }
  511. static public function loadInfo($pModuleName, $pType = false, $pExtract = false) {
  512. global $cfg;
  513. /*
  514. * pType: false => load from local (dev) inc/module/$pModuleName
  515. * pType: path => load from zip (module upload)
  516. * pType: true => load from inet
  517. */
  518. $pModuleName = str_replace(".", "", $pModuleName);
  519. $configFile = PATH_MODULE . "$pModuleName/config.json";
  520. if ($pModuleName == 'kryn')
  521. $configFile = "inc/kryn/config.json";
  522. $extract = false;
  523. // inet
  524. if ($pType === true || $pType == 1) {
  525. $res = wget($cfg['repoServer'] . "/?install=$pModuleName");
  526. if ($res === false)
  527. return array('cannotConnect' => 1);
  528. $info = json_decode($res, 1);
  529. if (!$info['rsn'] > 0) {
  530. return array('notExist' => 1);
  531. }
  532. if (!@file_exists('inc/upload'))
  533. if (!@mkdir('inc/upload'))
  534. klog('core', _l('FATAL ERROR: Can not create folder inc/upload.'));
  535. if (!@file_exists('data/packages/modules'))
  536. if (!@mkdir('data/packages/modules'))
  537. klog('core', _l('FATAL ERROR: Can not create folder data/packages/modules.'));
  538. $configFile = "data/packages/modules/$pModuleName.config.json";
  539. @unlink($configFile);
  540. wget($cfg['repoServer'] . "/modules/$pModuleName/config.json", $configFile);
  541. if ($pExtract) {
  542. $extract = true;
  543. $zipFile = 'data/packages/modules/' . $info['filename'];
  544. wget($cfg['repoServer'] . "/modules/$pModuleName/" . $info['filename'], $zipFile);
  545. }
  546. }
  547. //local zip
  548. if (($pType !== false && $pType != "0") && ($pType !== true && $pType != "1")) {
  549. if (file_exists("inc/template/" . $pType)) {
  550. $pType = 'inc/template/' . $pType;
  551. }
  552. $zipFile = $pType;
  553. $bname = basename($pType);
  554. $t = explode("-", $bname);
  555. $pModuleName = $t[0];
  556. $extract = true;
  557. }
  558. if ($extract) {
  559. @mkdir("data/packages/modules/$pModuleName");
  560. include_once('File/Archive.php');
  561. $toDir = "data/packages/modules/$pModuleName/";
  562. $zipFile .= "/";
  563. $res = File_Archive::extract($zipFile, $toDir);
  564. $configFile = "data/packages/modules/$pModuleName/inc/module/$pModuleName/config.json";
  565. if ($pModuleName == 'kryn')
  566. $configFile = "data/packages/modules/kryn/inc/kryn/config.json";
  567. }
  568. if ($configFile) {
  569. if (!file_exists($configFile)) {
  570. return array('noConfig' => 1);
  571. }
  572. $json = kryn::fileRead($configFile);
  573. $config = json_decode($json, true);
  574. if (!$pExtract) {
  575. @rmDir("data/packages/modules/$pModuleName");
  576. @unlink($zipFile);
  577. }
  578. //if locale
  579. if ($pType == false) {
  580. if (is_dir("inc/template/$pModuleName/_screenshots")) {
  581. $config['screenshots'] = kryn::readFolder("inc/template/$pModuleName/_screenshots");
  582. }
  583. }
  584. $config['__path'] = dirname($configFile);
  585. if (is_array(kryn::$configs) && array_key_exists($pModuleName, kryn::$configs))
  586. $config['installed'] = true;
  587. $config['extensionCode'] = $pModuleName;
  588. if (kryn::$configs)
  589. foreach (kryn::$configs as $extender => &$modConfig) {
  590. if (is_array($modConfig['extendConfig'])) {
  591. foreach ($modConfig['extendConfig'] as $extendModule => $extendConfig) {
  592. if ($extendModule == $pModuleName) {
  593. $config['extendedFrom'][$extender] = $extendConfig;
  594. }
  595. }
  596. }
  597. }
  598. return $config;
  599. }
  600. }
  601. public static function getChangedFilesForUpdate($pConfig) {
  602. $writableFiles = explode("\n", $pConfig['writableFiles']);
  603. $modFiles = array();
  604. if (is_array($writableFiles)) {
  605. $filename = $pConfig['__path'] . '/files.md5';
  606. $h = fopen($filename, 'r');
  607. $md5s = array();
  608. while ($line = @fgets($h)) {
  609. $temp = explode(' ', $line);
  610. $temp[1] = substr($temp[1], 0, -1);
  611. $md5s[$temp[0]] = $temp[1];
  612. }
  613. foreach ($md5s as $file => $md5) {
  614. foreach ($writableFiles as $path) {
  615. if ($path != "" && preg_match('/' . str_replace('/', '\/', $path) . '/', $file) != 0) {
  616. if (file_exists($file) && $md5 != md5(kryn::fileRead($file)))
  617. $modFiles[] = $file;
  618. }
  619. }
  620. }
  621. }
  622. return $modFiles;
  623. }
  624. public static function getPrepareInstall($pModuleName, $pType) {
  625. global $cfg;
  626. if ($pType != "0" && $pType != "1") {
  627. $temp = explode("-", basename($pType));
  628. $pModuleName = preg_replace('/\W/', '', $temp[0]);
  629. }
  630. $info = self::loadInfo($pModuleName, $pType, true);
  631. $res['module'] = $info;
  632. $modFiles = self::getChangedFilesForUpdate($info);
  633. if ($info['depends']) {
  634. $res['depends_ext'] = array();
  635. $depends = explode(',', str_replace(' ', '', $info['depends']));
  636. foreach ($depends as $depend) {
  637. $del = false;
  638. $del = (strpos($depend, '=') === false) ? $del : '=';
  639. $del = (strpos($depend, '>') === false) ? $del : '>';
  640. $del = (strpos($depend, '=>') === false) ? $del : '=>';
  641. $del = (strpos($depend, '>=') === false) ? $del : '>=';
  642. $del = (strpos($depend, '<') === false) ? $del : '<';
  643. $del = (strpos($depend, '<=') === false) ? $del : '<=';
  644. $del = (strpos($depend, '=<') === false) ? $del : '=<';
  645. $dependInfo = explode($del, $depend);
  646. $dependKey = $dependInfo[0];
  647. $res['depends_ext'][$dependKey]['installed'] = false;
  648. $res['depends_ext'][$dependKey]['needVersion'] = $del . $dependInfo[1];
  649. if (!kryn::$configs[$dependInfo[0]]) {
  650. $res['needPackages'] = true;
  651. } else {
  652. $dependConfig = kryn::$configs[$dependInfo[0]];
  653. $res['depends_ext'][$dependKey]['installedVersion'] = $dependConfig['version'];
  654. $res['depends_ext'][$dependKey]['toVersion'] = $dependInfo[1];
  655. if (kryn::compareVersion($dependConfig['version'], $del, $dependInfo[1])) {
  656. $res['depends_ext'][$dependKey]['installed'] = true;
  657. } else {
  658. $res['depends_ext'][$dependKey]['needUpdate'] = true;
  659. //todo here we need files.md5 ...
  660. $res['depends_ext'][$dependKey]['modifiedFiles'] = self::getChangedFilesForUpdate($dependKey);
  661. }
  662. }
  663. if (!$res['depends_ext'][$dependKey]['installed'] || $res['depends_ext'][$dependKey]['needUpdate']) {
  664. $res['needPackages'] = true;
  665. $res['depends_ext'][$dependKey]['server_version'] = false;
  666. $serverRes = wget($cfg['repoServer'] . '/?version=' . $dependKey);
  667. if ($serverRes && $serverRes != '') {
  668. $res['depends_ext'][$dependKey]['server_version'] = true;
  669. if (!kryn::compareVersion($serverRes, $del, $dependInfo[1])) {
  670. $res['depends_ext'][$dependKey]['server_version_not_ok_version'] = $serverRes;
  671. $res['depends_ext'][$dependKey]['server_version_not_ok'] = true;
  672. }
  673. }
  674. }
  675. }
  676. }
  677. $newFiles = array();
  678. $res['modifiedFiles'] = $modFiles;
  679. $res['newFiles'] = $newFiles;
  680. json($res);
  681. }
  682. private static function versionCompareToServer($local, $server) {
  683. list($major, $minor, $patch) = explode(".", $local);
  684. $lversion = $major * 1000 * 1000 + $minor * 1000 + $patch;
  685. list($major, $minor, $patch) = explode(".", $server);
  686. $sversion = $major * 1000 * 1000 + $minor * 1000 + $patch;
  687. if ($lversion == $sversion)
  688. return '='; // Same version
  689. else if ($lversion < $sversion)
  690. return '<'; // Local older
  691. else
  692. return '>'; // Local newer
  693. }
  694. public static function getInstallInfo($pModuleName, $pType) {
  695. global $cfg;
  696. if ($pType != "0" && $pType != "1") {
  697. $temp = explode("-", basename($pType));
  698. $pModuleName = preg_replace('/\W/', '', $temp[0]);
  699. }
  700. $info = self::loadInfo($pModuleName, $pType);
  701. if ($info['cannotConnect'])
  702. json($info);
  703. $res = json_decode(wget($cfg['repoServer'] . "/?getAdditionalInfo=$pModuleName"), 1);
  704. $res['installed'] = false;
  705. //$serverVersion = wget("http://download.kryn.org/?version=$pModuleName");
  706. //$res['serverVersion'] = $serverVersion;
  707. $res['module'] = $info;
  708. $res['serverCompare'] = self::versionCompareToServer($info['version'], $res['serverVersion']);
  709. if (kryn::$configs[$pModuleName] || $pModuleName == 'kryn-core') {
  710. $res['installed'] = true;
  711. $res['installedModule'] = self::loadInfo($pModuleName); //fetch local installed module infos
  712. $res['activated'] = (kryn::$configs[$pModuleName]) ? 1 : 0;
  713. }
  714. json($res);
  715. }
  716. public static function installModule($pModuleName, $pType) {
  717. global $cfg;
  718. if ($pType != "0" && $pType != "1") {
  719. $temp = explode("-", basename($pType));
  720. $pModuleName = preg_replace('/\W/', '', $temp[0]);
  721. }
  722. $res = wget($cfg['repoServer'] . "/?install2=$pModuleName");
  723. $info = self::loadInfo($pModuleName, $pType, true);
  724. $files = json_decode($_REQUEST['files'], true);
  725. foreach ($files as $file => $delete) {
  726. if ($delete != 1) { //delete new file, so the old file won't overwrite
  727. unlink("data/packages/modules/$pModuleName/$file");
  728. }
  729. }
  730. if ($pModuleName == 'kryn')
  731. @unlink("data/packages/modules/$pModuleName/install.php");
  732. $oldInfo = self::loadInfo($pModuleName);
  733. # copy files
  734. copyr("data/packages/modules/$pModuleName/.", ".");
  735. deldir("data/packages/modules/$pModuleName");
  736. //update script
  737. $updateScript = 'inc/module/' . $pModuleName . '/update.php';
  738. if (file_exists($updateScript)) {
  739. $GLOBALS['oldVersion'][$pModuleName] = $oldInfo;
  740. include($updateScript);
  741. }
  742. @rename('install.php', 'install.php.' . rand(123, 5123) . rand(585, 2319293) . rand(9384394, 313213133));
  743. # db install
  744. if ($pModuleName != 'kryn') {
  745. dbDelete('system_modules', "name = '$pModuleName'");
  746. dbExec("INSERT INTO %pfx%system_modules VALUES('" . $pModuleName . "', 1)");
  747. adminDb::install($info);
  748. }
  749. if ($info['extendConfig']) {
  750. foreach ($info['extendConfig'] as $extendConfig) {
  751. if ($extendConfig['db']) {
  752. adminDb::install($extendConfig);
  753. }
  754. }
  755. }
  756. if (file_exists(PATH_MODULE . "$pModuleName/$pModuleName.class.php")) {
  757. require_once(PATH_MODULE . "$pModuleName/$pModuleName.class.php");
  758. $m = new $pModuleName();
  759. $m->install();
  760. }
  761. require_once(PATH_MODULE . 'admin/admin.class.php');
  762. admin::clearCache();
  763. return true;
  764. }
  765. //list all modules which have plugins -> for pluginChoooser
  766. public static function getModules() {
  767. global $user;
  768. $lang = $user->user['settings']['adminLanguage'] ? $user->user['settings']['adminLanguage'] : 'en';
  769. foreach (kryn::$configs as $key => $config) {
  770. if (!$config['plugins']) continue;
  771. $config['title'] = $config['title'][$lang] ? $config['title'][$lang] : $config['title']['en'];
  772. $config['name'] = $key;
  773. $res[] = $config;
  774. }
  775. json($res);
  776. }
  777. public static function check4updates() {
  778. global $cfg;
  779. $res['found'] = false;
  780. # add kryn-core
  781. $tmodules = kryn::$configs;
  782. foreach ($tmodules as $key => $config) {
  783. $version = '0';
  784. $name = $key;
  785. $version = wget($cfg['repoServer'] . "/?version=$name");
  786. if ($version && $version != '' && self::versionCompareToServer($config['version'], $version) == '<') {
  787. $res['found'] = true;
  788. $temp = array();
  789. $temp['newVersion'] = $version;
  790. $temp['name'] = $name;
  791. $res['modules'][] = $temp;
  792. }
  793. }
  794. json($res);
  795. }
  796. /*
  797. function devRemove( $pModule ){
  798. dbExec( "DELETE FROM %pfx%system_modules WHERE name = '$pModule'" );
  799. adminDb::remove( $pModule );
  800. return 'Ok';
  801. }
  802. function devUpdate( $pModule ){
  803. self::create2ndClass( $pModule );
  804. require( PATH_MODULE."$pModule/$pModule.class.php.new" );
  805. $module = new $pModule();
  806. $module->update();
  807. return 'ok';
  808. }
  809. function devInstall( $pModule ){
  810. dbExec( "INSERT INTO %pfx%system_modules VALUES('$pModule', 1)" );
  811. return '<pre>'.adminDb::install( $pModule ).'</pre>';
  812. }
  813. */
  814. public static function deactivate($pName) {
  815. dbUpdate('system_modules', array('name' => $pName), array('activated' => 0));
  816. kryn::clearLanguageCache();
  817. kryn::deleteCache('activeModules');
  818. json(1);
  819. }
  820. public static function exists($pModule) {
  821. if (kryn::$configs[$pModule])
  822. return true;
  823. return false;
  824. }
  825. public static function activate($pName) {
  826. $row = dbTableFetch('system_modules', 1, "name = '" . esc($pName) . "'");
  827. if ($row['name'] == '')
  828. dbInsert('system_modules', array('name' => $pName, 'activated' => 1));
  829. else
  830. dbUpdate('system_modules', array('name' => $pName), array('activated' => 1));
  831. kryn::clearLanguageCache();
  832. kryn::deleteCache('activeModules');
  833. json(1);
  834. }
  835. /*
  836. function deinstall($pName, $pLinks = array()){
  837. $info = self::loadInfo( $pName );
  838. $filename = $info['__path'].'/files.md5';
  839. $h = @fopen($filename, 'r');
  840. $md5s = array();
  841. while($line = @fgets($h)) {
  842. $temp = explode( ' ', $line );
  843. $temp[1] = substr( $temp[1], 0, -1);
  844. @unlink( $temp[1] );
  845. }
  846. dbDelete('system_modules',"`name` = '".strtolower($pName)."'");
  847. delDir(PATH_MODULE."$pName/");
  848. delDir("inc/template/$pName/");
  849. json(1);
  850. }
  851. */
  852. public static function readDirRekursiv($pDir) {
  853. global $step2;
  854. $res = array();
  855. $file = $pDir;
  856. if (!is_dir($file)) {
  857. $res[] = $file;
  858. }
  859. if (is_dir($file) === TRUE) {
  860. $dir = opendir($file);
  861. while (($_file = readdir($dir)) !== false) {
  862. if ($_file != '..' && $_file != '.' && $_file != '.svn') {
  863. $res = array_merge($res, self::readDirRekursiv($file . '/' . $_file));
  864. }
  865. }
  866. }
  867. return $res;
  868. }
  869. }
  870. ?>