| | |
| | | 'SQLite (v2)' => 'pdo_sqlite2', |
| | | 'SQL Server (SQLSRV)' => 'pdo_sqlsrv', |
| | | 'SQL Server (DBLIB)' => 'pdo_dblib', |
| | | 'Oracle' => 'oci8', |
| | | ); |
| | | |
| | | |
| | |
| | | $value = $this->config[$name]; |
| | | |
| | | if ($name == 'des_key' && !$this->configured && !isset($_REQUEST["_$name"])) |
| | | $value = self::random_key(24); |
| | | $value = rcube_utils::random_bytes(24); |
| | | |
| | | return $value !== null && $value !== '' ? $value : $default; |
| | | } |
| | |
| | | |
| | | // generate new encryption key, never use the default value |
| | | if ($prop == 'des_key' && $value == $this->defaults[$prop]) |
| | | $value = $this->random_key(24); |
| | | $value = rcube_utils::random_bytes(24); |
| | | |
| | | // convert some form data |
| | | if ($prop == 'debug_level' && !$is_default) { |
| | |
| | | } |
| | | else if (is_numeric($value)) { |
| | | $value = intval($value); |
| | | } |
| | | else if ($prop == 'plugins' && !empty($_POST['submit'])) { |
| | | $value = array(); |
| | | foreach (array_keys($_POST) as $key) { |
| | | if (preg_match('/^_plugins_*/', $key)) |
| | | array_push($value, $_POST[$key]); |
| | | } |
| | | } |
| | | |
| | | // skip this property |
| | |
| | | $out = $seen = array(); |
| | | |
| | | // iterate over the current configuration |
| | | foreach ($this->config as $prop => $value) { |
| | | foreach (array_keys($this->config) as $prop) { |
| | | if ($replacement = $this->replaced_config[$prop]) { |
| | | $out['replaced'][] = array('prop' => $prop, 'replacement' => $replacement); |
| | | $seen[$replacement] = true; |
| | |
| | | $types = array( |
| | | 'application/zip' => 'zip', |
| | | 'application/x-tar' => 'tar', |
| | | 'application/java-archive' => 'jar', |
| | | 'application/pdf' => 'pdf', |
| | | 'image/gif' => 'gif', |
| | | 'image/svg+xml' => 'svg', |
| | | ); |
| | |
| | | $errors = array(); |
| | | foreach ($types as $mimetype => $expected) { |
| | | $ext = rcube_mime::get_mime_extensions($mimetype); |
| | | if ($ext[0] != $expected) { |
| | | if (!in_array($expected, (array) $ext)) { |
| | | $errors[] = array($mimetype, $ext, $expected); |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | return $skins; |
| | | } |
| | | |
| | | /** |
| | | * Return a list with available subfolders of the plugins directory |
| | | * (with their associated description in composer.json) |
| | | */ |
| | | function list_plugins() |
| | | { |
| | | $plugins = array(); |
| | | $plugin_dir = INSTALL_PATH . 'plugins/'; |
| | | |
| | | foreach (glob($plugin_dir . '*') as $path) |
| | | { |
| | | |
| | | if (is_dir($path) && is_readable($path.'/composer.json')) |
| | | { |
| | | $file_json = json_decode(file_get_contents($path.'/composer.json')); |
| | | $plugin_desc = $file_json->description ?: 'N/A'; |
| | | } |
| | | else |
| | | { |
| | | $plugin_desc = 'N/A'; |
| | | } |
| | | |
| | | $name = substr($path, strlen($plugin_dir)); |
| | | $plugins[] = array('name' => $name, 'desc' => $plugin_desc, 'enabled' => in_array($name, $this->config['plugins'])); |
| | | } |
| | | |
| | | return $plugins; |
| | | } |
| | | |
| | | /** |
| | |
| | | // read schema file from /SQL/* |
| | | $fname = INSTALL_PATH . "SQL/$engine.initial.sql"; |
| | | if ($sql = @file_get_contents($fname)) { |
| | | $this->exec_sql($sql, $DB); |
| | | $DB->set_option('table_prefix', $this->config['db_prefix']); |
| | | $DB->exec_script($sql); |
| | | } |
| | | else { |
| | | $this->fail('DB Schema', "Cannot read the schema file: $fname"); |
| | |
| | | |
| | | |
| | | /** |
| | | * Execute the given SQL queries on the database connection |
| | | * |
| | | * @param string SQL queries to execute |
| | | * @param object rcube_db Database connection |
| | | * @return boolen True on success, False on error |
| | | */ |
| | | function exec_sql($sql, $DB) |
| | | { |
| | | $sql = $this->fix_table_names($sql, $DB); |
| | | $buff = ''; |
| | | foreach (explode("\n", $sql) as $line) { |
| | | if (preg_match('/^--/', $line) || trim($line) == '') |
| | | continue; |
| | | |
| | | $buff .= $line . "\n"; |
| | | if (preg_match('/(;|^GO)$/', trim($line))) { |
| | | $DB->query($buff); |
| | | $buff = ''; |
| | | if ($DB->is_error()) |
| | | break; |
| | | } |
| | | } |
| | | |
| | | return !$DB->is_error(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Parse SQL file and fix table names according to db_prefix |
| | | * Note: This need to be a complete database initial file |
| | | */ |
| | | private function fix_table_names($sql, $DB) |
| | | { |
| | | if (empty($this->config['db_prefix'])) { |
| | | return $sql; |
| | | } |
| | | |
| | | // replace table names |
| | | if (preg_match_all('/CREATE TABLE (\[dbo\]\.|IF NOT EXISTS )?[`"\[\]]*([^`"\[\] \r\n]+)/i', $sql, $matches)) { |
| | | foreach ($matches[2] as $table) { |
| | | $real_table = $this->config['db_prefix'] . $table; |
| | | $sql = preg_replace("/([^a-zA-Z0-9_])$table([^a-zA-Z0-9_])/", "\\1$real_table\\2", $sql); |
| | | } |
| | | } |
| | | // replace sequence names |
| | | if ($DB->db_provider == 'postgres' && preg_match_all('/CREATE SEQUENCE (IF NOT EXISTS )?"?([^" \n\r]+)/i', $sql, $matches)) { |
| | | foreach ($matches[2] as $sequence) { |
| | | $real_sequence = $this->config['db_prefix'] . $sequence; |
| | | $sql = preg_replace("/([^a-zA-Z0-9_])$sequence([^a-zA-Z0-9_])/", "\\1$real_sequence\\2", $sql); |
| | | } |
| | | } |
| | | |
| | | return $sql; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Handler for Roundcube errors |
| | | */ |
| | | function raise_error($p) |
| | | { |
| | | $this->last_error = $p; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Generarte a ramdom string to be used as encryption key |
| | | * |
| | | * @param int Key length |
| | | * @return string The generated random string |
| | | * @static |
| | | */ |
| | | function random_key($length) |
| | | { |
| | | $alpha = 'ABCDEFGHIJKLMNOPQERSTUVXYZabcdefghijklmnopqrtsuvwxyz0123456789+*%&?!$-_='; |
| | | $out = ''; |
| | | |
| | | for ($i=0; $i < $length; $i++) |
| | | $out .= $alpha{rand(0, strlen($alpha)-1)}; |
| | | |
| | | return $out; |
| | | } |
| | | |
| | | } |
| | | |