PageRenderTime 46ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/html/AppCode/expressionengine/controllers/cp/addons_extensions.php

https://github.com/w3bg/www.hsifin.com
PHP | 628 lines | 447 code | 86 blank | 95 comment | 45 complexity | ef54cc4eff4f307c634d6660e7a0a0d9 MD5 | raw file
Possible License(s): AGPL-3.0
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2. /**
  3. * ExpressionEngine - by EllisLab
  4. *
  5. * @package ExpressionEngine
  6. * @author ExpressionEngine Dev Team
  7. * @copyright Copyright (c) 2003 - 2010, EllisLab, Inc.
  8. * @license http://expressionengine.com/user_guide/license.html
  9. * @link http://expressionengine.com
  10. * @since Version 2.0
  11. * @filesource
  12. */
  13. // ------------------------------------------------------------------------
  14. /**
  15. * ExpressionEngine CP Home Page Class
  16. *
  17. * @package ExpressionEngine
  18. * @subpackage Control Panel
  19. * @category Control Panel
  20. * @author ExpressionEngine Dev Team
  21. * @link http://expressionengine.com
  22. */
  23. class Addons_extensions extends Controller {
  24. /**
  25. * Constructor
  26. *
  27. * @access public
  28. */
  29. function Addons_extensions()
  30. {
  31. parent::Controller();
  32. if ( ! $this->cp->allowed_group('can_access_addons') OR ! $this->cp->allowed_group('can_access_extensions'))
  33. {
  34. show_error($this->lang->line('unauthorized_access'));
  35. }
  36. $this->lang->loadfile('addons');
  37. $this->load->model('addons_model');
  38. }
  39. // --------------------------------------------------------------------
  40. /**
  41. * Index function
  42. *
  43. * @access public
  44. * @return void
  45. */
  46. function index()
  47. {
  48. if ( ! $this->cp->allowed_group('can_access_addons') OR ! $this->cp->allowed_group('can_access_extensions'))
  49. {
  50. show_error($this->lang->line('unauthorized_access'));
  51. }
  52. $this->lang->loadfile('admin');
  53. $this->load->library('extensions');
  54. $this->load->library('table');
  55. $this->load->helper('form');
  56. $this->cp->set_variable('cp_page_title', $this->lang->line('extensions'));
  57. $this->cp->set_breadcrumb(BASE.AMP.'C=addons', $this->lang->line('addons'));
  58. $this->jquery->tablesorter('.mainTable', '{
  59. widgets: ["zebra"]
  60. }');
  61. $this->javascript->compile();
  62. $this->load->library('addons');
  63. $this->load->model('addons_model');
  64. $installed_ext = array();
  65. $extension_files = $this->addons->get_files('extensions');
  66. $installed_ext_q = $this->addons_model->get_installed_extensions();
  67. foreach ($installed_ext_q->result_array() as $row)
  68. {
  69. // Check the meta data
  70. $installed_ext[$row['class']] = $row;
  71. }
  72. $installed_ext_q->free_result();
  73. $names = array();
  74. $extcount = 1;
  75. foreach($extension_files as $ext_name => $ext)
  76. {
  77. // Include the file so we can grab its meta data
  78. $class_name = $ext['class'];
  79. if ( ! class_exists($class_name))
  80. {
  81. if (DEBUG)
  82. {
  83. include($ext['path'].$ext['file']);
  84. }
  85. else
  86. {
  87. @include($ext['path'].$ext['file']);
  88. }
  89. if ( ! class_exists($class_name))
  90. {
  91. trigger_error(str_replace(array('%c', '%f'), array(htmlentities($class_name), htmlentities($ext['path'].$ext['file'])), $this->lang->line('extension_class_does_not_exist')));
  92. unset($extension_files[$ext_name]);
  93. continue;
  94. }
  95. }
  96. $OBJ = new $class_name();
  97. $meta_keys = array('version', 'name', 'docs_url', 'settings_exist', 'description');
  98. foreach($meta_keys as $meta)
  99. {
  100. if ( ! isset($OBJ->$meta))
  101. {
  102. $OBJ->meta = '';
  103. }
  104. }
  105. // Compare Versions
  106. if ($this->config->item('allow_extensions') == 'y' && isset($installed_ext[$class_name]))
  107. {
  108. if (version_compare($OBJ->version, $installed_ext[$class_name]['version'], '>') && method_exists($OBJ, 'update_extension') === TRUE)
  109. {
  110. $update = $OBJ->update_extension($installed_ext[$class_name]['version']);
  111. $this->extensions->version_numbers[$class_name] = $OBJ->version;
  112. }
  113. }
  114. // View Table Columns
  115. $extension_files[$ext_name]['name'] = (isset($OBJ->name)) ? $OBJ->name : $extension_files[$ext_name]['name'];
  116. $names[$ext_name] = strtolower($extension_files[$ext_name]['name']);
  117. $extension_files[$ext_name]['status'] = ( ! isset($installed_ext[$ext['class']]) ) ? 'extension_disabled' : 'extension_enabled';
  118. $extension_files[$ext_name]['status_switch'] = ( ! isset($installed_ext[$ext['class']]) ) ? 'enable_extension' : 'disable_extension';
  119. $extension_files[$ext_name]['settings_enabled'] = (isset($installed_ext[$ext['class']]) AND $this->config->item('allow_extensions') == 'y' AND $OBJ->settings_exist == 'y');
  120. $extension_files[$ext_name]['no_settings'] = $OBJ->settings_exist == 'y' ? $this->lang->line('settings') : '--';
  121. $extension_files[$ext_name]['settings_url'] = BASE.AMP.'C=addons_extensions'.AMP.'M=extension_settings'.AMP.'file='.$ext_name;
  122. $extension_files[$ext_name]['documentation'] = ($OBJ->docs_url) ? $this->config->item('base_url').$this->config->item('index_page').'?URL='.urlencode($OBJ->docs_url) : '';
  123. if ($this->config->item('allow_extensions') != 'y')
  124. {
  125. $extension_files[$ext_name]['status'] = 'extension_disabled';
  126. }
  127. }
  128. $vars['extensions_enabled'] = ($this->config->item('allow_extensions') == 'y');
  129. $vars['extensions_toggle'] = ($this->config->item('allow_extensions') == 'y') ? 'disable_extensions' : 'enable_extensions';
  130. // Let's order by name just in case
  131. asort($names);
  132. $vars['extension_info'] = array();
  133. foreach ($names as $k => $v)
  134. {
  135. $vars['extension_info'][$k] = $extension_files[$k];
  136. }
  137. $extensions_toggle = ($this->config->item('allow_extensions') == 'y') ? 'disable_extensions' : 'enable_extensions';
  138. $this->cp->set_right_nav(array(
  139. $extensions_toggle => BASE.AMP.'C=addons_extensions'.AMP.'M=toggle_extension_confirm'
  140. ));
  141. $this->load->view('addons/extensions', $vars);
  142. }
  143. // --------------------------------------------------------------------
  144. /**
  145. * Toggle Extension Confirmation
  146. *
  147. * Shows a confirmation screen when toggling _all_ extensions
  148. *
  149. * @access public
  150. * @return mixed
  151. */
  152. function toggle_extension_confirm()
  153. {
  154. if ( ! $this->cp->allowed_group('can_access_addons') OR ! $this->cp->allowed_group('can_access_extensions'))
  155. {
  156. show_error($this->lang->line('unauthorized_access'));
  157. }
  158. $this->load->helper('form');
  159. $this->lang->loadfile('admin');
  160. $message = ($this->config->item('allow_extensions') == 'y') ? 'disable_extensions_conf' : 'enable_extensions_conf';
  161. $vars = array();
  162. $vars['form_action'] = 'C=addons_extensions'.AMP.'M=toggle_extension';
  163. $vars['form_hidden'] = array('which' => 'all');
  164. $vars['message'] = $this->lang->line($message);
  165. $this->cp->set_variable('cp_page_title', $this->lang->line($message));
  166. $this->cp->set_variable('cp_breadcrumbs', array(
  167. BASE.AMP.'C=addons' => $this->lang->line('addons'),
  168. BASE.AMP.'C=addons_extensions'=> $this->lang->line('extensions')
  169. ));
  170. $this->javascript->compile();
  171. $this->load->view('addons/toggle_confirm', $vars);
  172. }
  173. // --------------------------------------------------------------------
  174. /**
  175. * Toggle an extension
  176. *
  177. * If the hidden _which_ field is set - toggle them all
  178. *
  179. * @access public
  180. * @return mixed
  181. */
  182. function toggle_extension()
  183. {
  184. if ( ! $this->cp->allowed_group('can_access_addons') OR ! $this->cp->allowed_group('can_access_extensions'))
  185. {
  186. show_error($this->lang->line('unauthorized_access'));
  187. }
  188. if ($this->input->post('which') == 'all')
  189. {
  190. $new_val = ($this->config->item('allow_extensions') == 'y') ? 'n' : 'y';
  191. $this->config->_update_config(array('allow_extensions' => $new_val));
  192. $cp_message = ($new_val == 'y') ? $this->lang->line('extensions_enabled'): $this->lang->line('extensions_disabled');
  193. }
  194. else
  195. {
  196. $file = $this->input->get('which');
  197. $this->load->library('addons');
  198. $installed = $this->addons->get_installed('extensions');
  199. $extension_files = $this->addons->get_files('extensions');
  200. // It needs to exist and pass the basic security check
  201. if (isset($extension_files[$file]) AND preg_match("/^[a-z0-9][\w.-]*$/i", $file))
  202. {
  203. $this->load->library('addons/addons_installer');
  204. // Which way?
  205. if (isset($installed[$file]))
  206. {
  207. $this->addons_installer->uninstall($file, 'extension');
  208. $cp_message = $this->lang->line('extension_disabled');
  209. }
  210. else
  211. {
  212. $this->addons_installer->install($file, 'extension');
  213. $cp_message = $this->lang->line('extension_enabled');
  214. }
  215. }
  216. }
  217. $this->session->set_flashdata('message_success', $cp_message);
  218. $this->functions->redirect(BASE.AMP.'C=addons_extensions');
  219. }
  220. // --------------------------------------------------------------------
  221. /**
  222. * Extension Settings
  223. *
  224. * Displays the extension settings form
  225. *
  226. * @access public
  227. * @param message
  228. * @return void
  229. */
  230. function extension_settings($message = '')
  231. {
  232. if ( ! $this->cp->allowed_group('can_access_addons') OR ! $this->cp->allowed_group('can_access_extensions'))
  233. {
  234. show_error($this->lang->line('unauthorized_access'));
  235. }
  236. if ($this->config->item('allow_extensions') != 'y')
  237. {
  238. show_error($this->lang->line('unauthorized_access'));
  239. }
  240. $file = $this->security->sanitize_filename($this->input->get_post('file'));
  241. if ($this->input->get_post('file') === FALSE
  242. OR ! preg_match("/^[a-z0-9][\w.-]*$/i", $file))
  243. {
  244. show_error(lang('not_authorized'));
  245. }
  246. $this->lang->loadfile('admin');
  247. $this->load->helper('form');
  248. $this->load->library('table');
  249. $this->cp->set_variable('cp_page_title', $this->lang->line('extension_settings'));
  250. $this->cp->set_breadcrumb(BASE.AMP.'C=addons_extensions', $this->lang->line('extensions'));
  251. $vars['message'] = $message;
  252. $vars['file'] = $file;
  253. $class_name = ucfirst($vars['file']).'_ext';
  254. $current = array();
  255. /** ---------------------------------------
  256. /** Extensions Enabled
  257. /** ---------------------------------------*/
  258. $this->db->select('settings');
  259. $this->db->where('enabled', 'y');
  260. $this->db->where('class', $class_name);
  261. $this->db->limit(1);
  262. $query = $this->db->get('extensions');
  263. if ($query->num_rows() > 0 && $query->row('settings') != '')
  264. {
  265. // Load the string helper
  266. $this->load->helper('string');
  267. $current = strip_slashes(unserialize($query->row('settings') ));
  268. }
  269. /** -----------------------------
  270. /** Call Extension File
  271. /** -----------------------------*/
  272. if ( ! class_exists($class_name))
  273. {
  274. if (file_exists(APPPATH.'extensions/ext.'.strtolower($vars['file']).EXT))
  275. {
  276. @include_once(APPPATH.'extensions/ext.'.strtolower($vars['file']).EXT);
  277. }
  278. elseif (file_exists(PATH_THIRD.strtolower($vars['file']).'/ext.'.strtolower($vars['file']).EXT))
  279. {
  280. @include_once(PATH_THIRD.strtolower($vars['file']).'/ext.'.strtolower($vars['file']).EXT);
  281. }
  282. if ( ! class_exists($class_name))
  283. {
  284. show_error(lang('not_authorized'));
  285. }
  286. }
  287. $OBJ = new $class_name();
  288. foreach(array('description', 'settings_exist', 'docs_url', 'name', 'version') as $meta_item)
  289. {
  290. ${$meta_item} = ( ! isset($OBJ->{$meta_item})) ? '' : $OBJ->{$meta_item};
  291. }
  292. if ($name == '')
  293. {
  294. $name = ucwords(str_replace('_',' ',$extension_name));
  295. }
  296. $vars['name'] = $name;
  297. // -----------------------------------
  298. // Fetch Extension Language file
  299. //
  300. // If there are settings, then there is a language file
  301. // because we need to know all the various variable names in the settings
  302. // form. I was tempted to give these language files a prefix but I
  303. // decided against it for the sake of simplicity and the fact that
  304. // a module might have extension's bundled with them and it would make
  305. // sense to have the same language file for both.
  306. // -----------------------------------
  307. $this->lang->loadfile(strtolower($vars['file']));
  308. /** ---------------------------------------
  309. /** Creating Their Own Settings Form?
  310. /** ---------------------------------------*/
  311. if (method_exists($OBJ, 'settings_form') === TRUE)
  312. {
  313. // we're going to wipe the view vars here in a sec
  314. $file = $vars['file'];
  315. // add the package and view paths
  316. $this->load->add_package_path(PATH_THIRD.strtolower($file).'/');
  317. $orig_view_path = $this->load->_ci_view_path;
  318. $this->load->_ci_view_path = PATH_THIRD.strtolower($file).'/views/';
  319. // reset view variables
  320. $vars = array('_extension_name' => $name);
  321. // fetch the content
  322. $vars['_extension_settings_body'] = $OBJ->settings_form($current);
  323. // restore our package and view paths
  324. $this->load->_ci_view_path = $orig_view_path;
  325. $this->load->remove_package_path(PATH_THIRD.strtolower($file).'/');
  326. // load it up, kapowpow!
  327. $this->javascript->compile();
  328. $this->load->view('addons/extensions_settings_custom', $vars);
  329. return;
  330. }
  331. foreach ($OBJ->settings() as $key => $options)
  332. {
  333. if (isset($current[$key]))
  334. {
  335. $value = $current[$key];
  336. }
  337. elseif (is_array($options))
  338. {
  339. $value = $options[2];
  340. }
  341. elseif (is_string($options))
  342. {
  343. $value = $options;
  344. }
  345. else
  346. {
  347. $value = '';
  348. }
  349. $sub = '';
  350. $details = '';
  351. $selected = '';
  352. if (isset($subtext[$key]))
  353. {
  354. foreach ($subtext[$key] as $txt)
  355. {
  356. $sub .= $this->lang->line($txt);
  357. }
  358. }
  359. if ( ! is_array($options))
  360. {
  361. $vars['fields'][$key] = array('type' => 'i', 'value' => array('name' => $key, 'value' => str_replace("\\'", "'", $value), 'id' => $key),
  362. 'subtext' => $sub, 'selected' => $selected);
  363. continue;
  364. }
  365. switch ($options[0])
  366. {
  367. case 's':
  368. case 'ms':
  369. // Select fields
  370. foreach ($options[1] as $k => $v)
  371. {
  372. $details[$k] = $this->lang->line($v);
  373. }
  374. $selected = $value;
  375. break;
  376. case 'r':
  377. case 'c':
  378. // Radio buttons and checkboxes
  379. foreach ($options[1] as $k => $v)
  380. {
  381. $checked = ($k == $value OR (is_array($value) && in_array($k, $value))) ? TRUE : FALSE;
  382. $details[] = array('name' => (($options[0] == 'c') ? $key.'[]' : $key), 'value' => $k, 'id' => $key.'_'.$k, 'label' => $v, 'checked' => $checked);
  383. }
  384. break;
  385. case 't':
  386. // Textareas
  387. // The "kill_pipes" index instructs us to turn pipes into newlines
  388. if (isset($options['1']['kill_pipes']) && $options['1']['kill_pipes'] === TRUE)
  389. {
  390. $text = str_replace('|', NL, $value);
  391. }
  392. else
  393. {
  394. $text = $value;
  395. }
  396. $rows = (isset($options['1']['rows'])) ? $options['1']['rows'] : '20';
  397. $text = str_replace("\\'", "'", $text);
  398. $details = array('name' => $key, 'value' => $text, 'rows' => $rows, 'id' => $key);
  399. break;
  400. case 'i':
  401. // Input fields
  402. $details = array('name' => $key, 'value' => str_replace("\\'", "'", $value), 'id' => $key);
  403. break;
  404. }
  405. $vars['fields'][$key] = array('type' => $options[0], 'value' => $details, 'subtext' => $sub, 'selected' => $selected);
  406. }
  407. $vars['hidden'] = array('file' => $vars['file']);
  408. $this->load->helper('form');
  409. $this->javascript->compile();
  410. $this->load->view('addons/extensions_settings', $vars);
  411. }
  412. // --------------------------------------------------------------------
  413. /**
  414. * Save Extension Settings
  415. *
  416. * @access public
  417. * @param type
  418. * @return void
  419. */
  420. function save_extension_settings()
  421. {
  422. if ( ! $this->cp->allowed_group('can_access_addons') OR ! $this->cp->allowed_group('can_access_extensions'))
  423. {
  424. show_error($this->lang->line('unauthorized_access'));
  425. }
  426. if ($this->config->item('allow_extensions') != 'y')
  427. {
  428. show_error($this->lang->line('unauthorized_access'));
  429. }
  430. if ($this->input->get_post('file') === FALSE OR ! preg_match("/^[a-z0-9][\w.-]*$/i",$this->input->get_post('file')))
  431. {
  432. return FALSE;
  433. }
  434. $this->lang->loadfile('admin');
  435. $this->cp->set_variable('cp_page_title', $this->lang->line('extension_settings'));
  436. $vars['file'] = $this->input->get_post('file');
  437. $class_name = ucfirst($vars['file']).'_ext';
  438. /** -----------------------------
  439. /** Call Extension File
  440. /** -----------------------------*/
  441. if ( ! class_exists($class_name))
  442. {
  443. if (file_exists(APPPATH.'extensions/ext.'.strtolower($vars['file']).EXT))
  444. {
  445. @include_once(APPPATH.'extensions/ext.'.strtolower($vars['file']).EXT);
  446. }
  447. elseif (file_exists(PATH_THIRD.strtolower($vars['file']).'/ext.'.strtolower($vars['file']).EXT))
  448. {
  449. @include_once(PATH_THIRD.strtolower($vars['file']).'/ext.'.strtolower($vars['file']).EXT);
  450. }
  451. if ( ! class_exists($class_name)) return FALSE;
  452. }
  453. $OBJ = new $class_name();
  454. /** ---------------------------------------
  455. /** Processing Their Own Settings Form?
  456. /** ---------------------------------------*/
  457. if (method_exists($OBJ, 'settings_form') === TRUE)
  458. {
  459. $OBJ->save_settings();
  460. $this->functions->redirect(BASE.AMP.'C=addons_extensions');
  461. }
  462. if (method_exists($OBJ, 'settings') === TRUE)
  463. {
  464. $settings = $OBJ->settings();
  465. }
  466. $insert = array();
  467. foreach($settings as $key => $value)
  468. {
  469. if ( ! is_array($value))
  470. {
  471. $insert[$key] = ($this->input->post($key) !== FALSE) ? $this->input->get_post($key) : $value;
  472. }
  473. elseif (is_array($value) && isset($value['1']) && is_array($value['1']))
  474. {
  475. if(is_array($this->input->post($key)) OR $value[0] == 'ms' OR $value[0] == 'c')
  476. {
  477. $data = (is_array($this->input->post($key))) ? $this->input->get_post($key) : array();
  478. $data = array_intersect($data, array_keys($value['1']));
  479. }
  480. else
  481. {
  482. if ($this->input->post($key) === FALSE)
  483. {
  484. $data = ( ! isset($value['2'])) ? '' : $value['2'];
  485. }
  486. else
  487. {
  488. $data = $this->input->post($key);
  489. }
  490. }
  491. $insert[$key] = $data;
  492. }
  493. else
  494. {
  495. $insert[$key] = ($this->input->post($key) !== FALSE) ? $this->input->get_post($key) : '';
  496. }
  497. }
  498. $this->db->where('class', $class_name);
  499. $this->db->update('extensions', array('settings' => serialize($insert)));
  500. $this->session->set_flashdata('message_success', $this->lang->line('preferences_updated'));
  501. $this->functions->redirect(BASE.AMP.'C=addons_extensions');
  502. }
  503. // --------------------------------------------------------------------
  504. }
  505. // END CLASS
  506. /* End of file addons.php */
  507. /* Location: ./system/expressionengine/controllers/cp/addons.php */