$value) { $configStr .= '$GLOBALS[\'config\'][\''. $key .'\'] = '.var_export($config['config'][$key], true).';'. PHP_EOL; } if (isset($config['plugins'])) { foreach ($config['plugins'] as $key => $value) { $configStr .= '$GLOBALS[\'plugins\'][\''. $key .'\'] = '.var_export($config['plugins'][$key], true).';'. PHP_EOL; } } if (!file_put_contents($config['config']['CONFIG_FILE'], $configStr) || strcmp(file_get_contents($config['config']['CONFIG_FILE']), $configStr) != 0 ) { throw new Exception( 'Shaarli could not create the config file. Please make sure Shaarli has the right to write in the folder is it installed in.' ); } } /** * Process plugin administration form data and save it in an array. * * @param array $formData Data sent by the plugin admin form. * * @return array New list of enabled plugin, ordered. * * @throws PluginConfigOrderException Plugins can't be sorted because their order is invalid. */ function save_plugin_config($formData) { // Make sure there are no duplicates in orders. if (!validate_plugin_order($formData)) { throw new PluginConfigOrderException(); } $plugins = array(); $newEnabledPlugins = array(); foreach ($formData as $key => $data) { if (startsWith($key, 'order')) { continue; } // If there is no order, it means a disabled plugin has been enabled. if (isset($formData['order_' . $key])) { $plugins[(int) $formData['order_' . $key]] = $key; } else { $newEnabledPlugins[] = $key; } } // New enabled plugins will be added at the end of order. $plugins = array_merge($plugins, $newEnabledPlugins); // Sort plugins by order. if (!ksort($plugins)) { throw new PluginConfigOrderException(); } $finalPlugins = array(); // Make plugins order continuous. foreach ($plugins as $plugin) { $finalPlugins[] = $plugin; } return $finalPlugins; } /** * Validate plugin array submitted. * Will fail if there is duplicate orders value. * * @param array $formData Data from submitted form. * * @return bool true if ok, false otherwise. */ function validate_plugin_order($formData) { $orders = array(); foreach ($formData as $key => $value) { // No duplicate order allowed. if (in_array($value, $orders)) { return false; } if (startsWith($key, 'order')) { $orders[] = $value; } } return true; } /** * Affect plugin parameters values into plugins array. * * @param mixed $plugins Plugins array ($plugins[]['parameters']['param_name'] = . * @param mixed $config Plugins configuration. * * @return mixed Updated $plugins array. */ function load_plugin_parameter_values($plugins, $config) { $out = $plugins; foreach ($plugins as $name => $plugin) { if (empty($plugin['parameters'])) { continue; } foreach ($plugin['parameters'] as $key => $param) { if (!empty($config[$key])) { $out[$name]['parameters'][$key] = $config[$key]; } } } return $out; } /** * Exception used if a mandatory field is missing in given configuration. */ class MissingFieldConfigException extends Exception { public $field; /** * Construct exception. * * @param string $field field name missing. */ public function __construct($field) { $this->field = $field; $this->message = 'Configuration value is required for '. $this->field; } } /** * Exception used if an unauthorized attempt to edit configuration has been made. */ class UnauthorizedConfigException extends Exception { /** * Construct exception. */ public function __construct() { $this->message = 'You are not authorized to alter config.'; } } /** * Exception used if an error occur while saving plugin configuration. */ class PluginConfigOrderException extends Exception { /** * Construct exception. */ public function __construct() { $this->message = 'An error occurred while trying to save plugins loading order.'; } }