From 99f904adcc37d93c90defcd8ce898598e25be212 Mon Sep 17 00:00:00 2001 From: Hugues Hiegel Date: Wed, 11 Mar 2015 16:55:04 +0100 Subject: Lot of plugins --- plugin_manager/plugin_manager.php | 4554 +++++++++++++++++++++++++++++++++++++ 1 file changed, 4554 insertions(+) create mode 100644 plugin_manager/plugin_manager.php (limited to 'plugin_manager/plugin_manager.php') diff --git a/plugin_manager/plugin_manager.php b/plugin_manager/plugin_manager.php new file mode 100644 index 0000000..65850a1 --- /dev/null +++ b/plugin_manager/plugin_manager.php @@ -0,0 +1,4554 @@ + 'Roundcube 1.0.5', + 'count' => 0, + 'date' => '2015-02-08 06:00:00', + 'comments' => 'Download required core files PATCHES for Roundcube 1.0.5 from here. Unzip the package over your Roundcube installation. For DETAILS about the additions these files provide, download a revision copy (*.PATCH) from here.', + 'PHP' => '5.3', + 'lc' => false, + ); + + public $allowed_prefs = array('plugin_manager_hmail'); + + private $rcmail; + private $log = false; + private $template; + private $admins = array(); + private $noremote = false; + private $host; + private $domain; + private $config; + private $lables; + private $plugins; + private $mirror = 'http://mirror.myroundcube.com'; + private $svn = 'http://dev.myroundcube.com'; + private $beta = 'http://beta.myroundcube.com'; + private $stable = '0.9.5'; + private $dev = '1.0.5'; + private $dev_beta = '1.0.5'; + private $rcurl = 'http://roundcube.net'; + private $guide = 'http://myroundcube.com/myroundcube-plugins/plugins-installation'; + private $replyto = 'dev-team@myroundcube.com'; + private $vlength = 5; + private $billingurl = 'http://billing.myroundcube.com/?_task=billing&_action=buycredits'; + private $dlurl = 'https://billing.myroundcube.com/pm/'; + private $delay = 8000; + private $out; + private $defaults = array(); + private $unauth = array(); + private $thirdparty = array(); + private $use_ssl = false; + private $use_hmail = false; + private $load_splitter = false; + private $maintenance_mode = false; + private $compress_html = false; + private $file_based_config = false; + private $config_permissions = false; + private $dontlist = array('plugin_server', 'global_config'); + private $skip = array('plugin_manager', 'plugin_server', 'companyaddressbook_plus', 'calendar_plus', 'carddav_plus', 'codemirror_ui', 'db_version', 'global_config', 'http_auth', 'jqueryui', 'filesystem_attachments', 'fancybox', 'package_xml', 'sabredav_migrate', 'savepassword', 'timepicker', 'jsdialogs', 'jappix4roundcube', 'db_config', 'tabbed'); + private $noselect = array('plugin_manager', 'plugin_server', 'companyaddressbook_plus', 'calendar_plus', 'carddav_plus', 'codemirror_ui', 'global_config', 'http_auth', 'jqueryui', 'filesystem_attachments', 'fancybox', 'package_xml', 'sabredav_migrate', 'savepassword','timepicker'); + private $rctasks = array('settings', 'mail', 'addressbook', 'settings', 'dummy', 'logout', 'login'); + private $db_map = array( + 'sqlite' => 'sqlite', + 'sqlite2' => 'sqlite', + 'sqlite3' => 'sqlite', + 'sybase' => 'mssql', + 'dblib' => 'mssql', + 'sqlsrv' => 'mssql', + 'mssql' => 'mssql', + 'mysql' => 'mysql', + 'mysqli' => 'mysql', + 'pgsql' => 'pgsql', + 'postgresql' => 'pgsql', + ); + private $nodocs = array( + + ); + private $docsmap = array( + //'rcguard' => 'captcha-plugin#rcguard', + ); + + /* unified plugin properties */ + static private $plugin = 'plugin_manager'; + static private $author = 'myroundcube@mail4us.net'; + static private $authors_comments = 'IMPORTANT
Related Ticket
Documentation'; + static private $download = 'http://myroundcube.com'; + static private $licence = 'All Rights reserved'; + static private $requirements = array( + 'Roundcube' => '1.0', + 'PHP' => '5.3', + 'extra' => 'PHP cURL and OpenSSL are recommended', + 'required_plugins' => array( + 'settings' => 'require_plugin', + 'libgpl' => 'require_plugin', + 'codemirror_ui' => 'require_plugin', + 'db_version' => 'require_plugin', + 'myrc_branch' => 'require_plugin', + 'myrc_sprites' => 'require_plugin', + ), + ); + static private $prefs = array( + 'plugin_manager_active', + 'plugin_manager_hash', + ); + static private $tables = array('plugin_manager'); + static private $db_version = array( + 'initial', + '20131209' + ); + + function init(){ + + $this->require_plugin('libgpl'); + + /* PHP 5.4: suppress illegal string offset warnings */ + if(version_compare(PHP_VERSION, '5.4.0', '>=') && strpos($_SERVER['HTTP_HOST'], 'myroundcube.com') === false){ + if((E_ALL & ~E_NOTICE & ~E_STRICT & ~E_WARNING & ~E_USER_WARNING) != filter_var(ini_get('error_reporting'), FILTER_VALIDATE_INT)){ + @ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT & ~E_WARNING & ~E_USER_WARNING); + if((E_ALL & ~E_NOTICE & ~E_STRICT & ~E_WARNING & ~E_USER_WARNING) != filter_var(ini_get('error_reporting'), FILTER_VALIDATE_INT)){ + write_log('errors', 'MyRoundcube Plugin Manager: Please set error_reporting to E_ALL & ~E_NOTICE & ~E_STRICT & ~E_WARNING & ~E_USER_WARNING (php.ini or .htaccess).'); + } + } + } + + /* DB versioning */ + if(is_dir(INSTALL_PATH . 'plugins/db_version')){ + $this->require_plugin('db_version'); + if(!$load = db_version::exec(self::$plugin, self::$tables, self::$db_version)){ + return; + } + } + + $this->rcmail = rcmail::get_instance(); + + $required = self::$requirements['required_plugins']; + foreach($required as $plugin => $load){ + if(!file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/' . $plugin . '.php')){ + if(get_input_value('_framed', RCUBE_INPUT_GPC)){ + $this->rcmail->output->add_script('parent.location.href="./";', 'foot'); + } + else{ + if(MYRC_BRANCH == 'stable'){ + $server = $this->svn; + } + else if(MYRC_BRANCH == 'frozen'){ + $server = $this->mirror; + } + else{ + $server = $this->beta; + } + $this->out = html::tag('div', array('style' => 'font-size: 12px; text-align: justify; position: absolute; margin-left: auto; left: 50%; margin-left: -200px; width: 400px;'), + html::tag('h3', null, 'Missing plugin: "' . html::tag('a', array('href' => 'http://myroundcube.com/myroundcube-plugins#' . $plugin, 'target' => '_blank'), $plugin) . '"
' . html::tag('span', array('style' => 'font-weight: normal; font-size: 9px'), '(' . INSTALL_PATH . $plugin . ')')) . + html::tag('span', null, 'Please ' . + html::tag('a', array('href' => $server . '/?_action=plugin.plugin_server_get_pm'), 'download') . + ' Plugin Manager package again and upload the entire package to your Roundcube\'s plugin folder.') . html::tag('br') . html::tag('br') . + html::tag('div', array('style' => 'display: inline; float: left'), + html::tag('a', array('href' => 'javascript:void(0)', 'onclick' => 'document.location.href=\'./\''), $this->gettext('done')) + ) + ); + $this->register_handler('plugin.body', array($this, 'sqlerror')); + $this->rcmail->output->send('plugin'); + } + } + } + + $this->require_plugin('myrc_sprites'); + + $rcversion = current(explode('-', RCMAIL_VERSION)); + $pmversion = self::$requirements['Roundcube']; + + if(version_compare($rcversion, $pmversion, '<')){ + $this->out = html::tag('div', array('style' => 'font-size: 12px; text-align: justify; position: absolute; margin-left: auto; left: 50%; margin-left: -200px; width: 400px;'), + html::tag('h3', null, 'Plugin Manager is incompatible with your Roundcube installation (' . RCMAIL_VERSION . ')') . + html::tag('span', null, 'Please ' . + html::tag('a', array('href' => 'http://myroundcube.com/myroundcube-plugins/plugin-manager', 'target' => '_blank'), 'download') . + ' Plugin Manager package again and upload the entire package to your Roundcube\'s plugin folder.') . html::tag('br') . html::tag('br') . + html::tag('div', array('style' => 'display: inline; float: left'), + html::tag('a', array('href' => 'javascript:void(0)', 'onclick' => 'document.location.href=\'./\''), $this->gettext('done')) + ) + ); + $this->register_handler('plugin.body', array($this, 'sqlerror')); + $this->rcmail->output->send('plugin'); + } + + $this->add_hook('login_after', array($this, 'login_after')); + + if($this->rcmail->task == 'mail' && $this->rcmail->action == 'plugin.dla'){ + if(file_exists(INSTALL_PATH . 'plugins/detach_attachments/detach_attachments.php')){ + $this->require_plugin('detach_attachments'); + } + } + + if($this->rcmail->task == 'settings' && $this->rcmail->action == 'save-pref' && get_input_value('_name', RCUBE_INPUT_POST)){ + $sql = 'DELETE FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $this->rcmail->db->query($sql, '_plugin_manager_hmail'); + $save = get_input_value('_value', RCUBE_INPUT_POST); + $sql = 'INSERT INTO ' . get_table_name('plugin_manager') . ' (conf, value, type) VALUES (?, ?, ?)'; + $this->rcmail->db->query($sql, '_plugin_manager_hmail', $save ? 1: 0, 'bool'); + $this->rcmail->session->remove('plugin_manager_settings'); + } + + if(!isset($_SESSION['plugin_manager_settings'])){ + $sql = 'SELECT * FROM ' . get_table_name('system') . ' WHERE ' . $this->q('name') . '=?'; + $res = $this->rcmail->db->query($sql, 'myrc_plugin_manager'); + $res = $this->rcmail->db->fetch_assoc($res); + if(is_array($res)){ + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . ' LIKE ?'; + $res = $this->rcmail->db->query($sql, '_plugin_manager_%'); + if($res){ + while($conf = $this->rcmail->db->fetch_assoc($res)){ + $this->rcmail->config->set(substr($conf['conf'], 1), $conf['value']); + $_SESSION['plugin_manager_settings'][substr($conf['conf'], 1)] = $conf['value']; + } + } + } + } + else{ + foreach($_SESSION['plugin_manager_settings'] as $key => $value){ + $this->rcmail->config->set($key, $value); + } + } + + $this->use_ssl = $this->rcmail->config->get('plugin_manager_use_ssl'); + $this->use_hmail = $this->rcmail->config->get('plugin_manager_hmail'); + $this->load_splitter = $this->rcmail->config->get('plugin_manager_load_splitter'); + if($this->load_splitter && file_exists(INSTALL_PATH . 'plugins/load_splitter/load_splitter.php')){ + $this->require_plugin('load_splitter'); + } + else{ + $this->load_splitter = false; + } + $this->maintenance_mode = $this->rcmail->config->get('plugin_manager_maintenance_mode'); + $this->compress_html = $this->rcmail->config->get('plugin_manager_compress_html'); + $this->file_based_config = $this->rcmail->config->get('plugin_manager_file_based_config'); + $svn = parse_url($this->svn); + if($this->file_based_config || $_SERVER['HTTP_HOST'] == $svn['host']){ + $this->file_based_config = true; + if(!in_array('global_config', $this->rcmail->config->get('plugins'))){ + $this->load_config(); + $this->require_plugin('settings'); + } + $this->defaults = $this->rcmail->config->get('plugin_manager_defaults', array()); + $this->unauth = $this->rcmail->config->get('plugin_manager_unauth', array()); + $this->thirdparty = $this->rcmail->config->get('plugin_manager_third_party_plugins', array()); + } + else{ + $this->build_defaults(); + if(!in_array('global_config', $this->rcmail->config->get('plugins'))){ + $this->require_plugin('settings'); + } + } + if($this->rcmail->config->get('plugin_manager_use_ssl', false) && defined('OPENSSL_VERSION_TEXT')){ + $this->mirror = str_replace('http://', 'https://', $this->mirror); + $this->svn = str_replace('http://', 'https://', $this->svn); + $this->beta = str_replace('http://', 'https://', $this->beta); + $this->billingurl = str_replace('http://', 'https://', $this->billingurl); + } + + if($hash = $this->rcmail->config->get('plugin_manager_hash')){ + if(file_exists(INSTALL_PATH . $hash . '.myrc')){ + $this->config_permissions = true; + } + } + $fileadmins = $this->rcmail->config->get('plugin_manager_admins'); + if($this->rcmail->task == 'settings' && $_SESSION['plugin_manager_admins']){ + $this->admins = $_SESSION['plugin_manager_admins']; + } + else if($this->rcmail->task == 'settings' && !isset($_GET['_remote'])){ + $this->admins = array(); + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'admins'); + if($res){ + $admins = $this->rcmail->db->fetch_assoc($res); + if($admins = unserialize($admins['value'])){ + $this->rcmail->config->set('plugin_manager_admins', $admins); + $this->admins = array_flip($admins); + $_SESSION['plugin_manager_admins'] = $this->admins; + } + } + if(count($this->admins) < 1 && strtolower($this->get_demo($_SESSION['username'])) != strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + if($this->rcmail->task == 'settings' && !isset($_GET['_remote'])){ + if(!$hash = $this->rcmail->config->get('plugin_manager_hash')){ + $hash = session_id(); + $this->rcmail->user->save_prefs(array('plugin_manager_hash' => $hash)); + } + else{ + if(!file_exists(INSTALL_PATH . $hash . '.myrc') && !isset($_GET['_framed'])){ + $this->register_handler('plugin.body', array($this, 'authenticate')); + $this->rcmail->output->send('plugin'); + } + else{ + $query = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($query, 0, 1, 'admins'); + $res = $this->rcmail->db->fetch_assoc($res); + if(is_array($res)){ + $admins = unserialize($res['value']); + } + else{ + $query = 'INSERT INTO ' . get_table_name('plugin_manager') . ' (' . + $this->q('conf') . ', ' . + $this->q('value') . ', ' . + $this->q('type') . + ') VALUES (?, ?, ?)'; + $superadmin = array($this->rcmail->user->data['username']); + $this->rcmail->db->query($query, 'admins', serialize($superadmin), 'array'); + $this->rcmail->config->set('plugin_manager_admins', $superadmin); + $this->admins = array_flip($superadmin); + $_SESSION['plugin_manager_admins'] = $this->admins; + } + } + } + } + } + else if($this->rcmail->task != 'logout' && strtolower($this->get_demo($_SESSION['username'])) != strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $admins = $this->rcmail->config->get('plugin_manager_admins', array()); + if($admins[0] == strtolower($this->rcmail->user->data['username'])){ + if(!$hash = $this->rcmail->config->get('plugin_manager_hash')){ + $hash = session_id(); + $this->rcmail->user->save_prefs(array('plugin_manager_hash' => $hash)); + } + else{ + if(!file_exists(INSTALL_PATH . $hash . '.myrc') && !isset($_GET['_framed'])){ + $this->register_handler('plugin.body', array($this, 'authenticate')); + $this->rcmail->output->send('plugin'); + } + } + } + } + $hash = $this->rcmail->config->get('plugin_manager_hash'); + if(is_array($fileadmins) && file_exists(INSTALL_PATH . $hash . '.myrc')){ + $this->rcmail->session->remove('plugin_manager_admins'); + $sql = 'UPDATE ' . get_table_name('plugin_manager') . ' SET ' . $this->q('value') . '=? WHERE ' . $this->q('conf') . '=?'; + $this->rcmail->db->query($sql, serialize($fileadmins), 'admins'); + $this->out = html::tag('div', array('style' => 'font-size: 12px; text-align: justify; position: absolute; margin-left: auto; left: 50%; margin-left: -200px; width: 400px;'), + html::tag('h3', null, 'Plugin Manager detected a misconfiguration') . + html::tag('span', null, 'Please remove ' . '$config[\'plugin_manager_admins\'] from your configuration file.') . html::tag('br') . html::tag('br') . + html::tag('pre', null, print_r($fileadmins, true)) . + html::tag('div', array('style' => 'display: inline; float: right'), + html::tag('a', array('href' => 'javascript:void(0)', 'onclick' => 'document.location.href=\'./?_task=settings\''), $this->gettext('done')) + ) + ); + $this->register_handler('plugin.body', array($this, 'sqlerror')); + $this->rcmail->output->send('plugin'); + } + } + + if($this->rcmail->action != 'jappix.loadmini'){ + $this->add_texts('localization/', false); + + $this->add_hook('render_page', array($this, 'render_page')); + $this->add_hook('send_page', array($this, 'send_page')); + $this->add_hook('preferences_sections_list', array($this, 'settings_link')); + $this->add_hook('preferences_list', array($this, 'settings')); + $this->add_hook('preferences_save', array($this, 'saveprefs')); + $this->add_hook('plugins_installed', array($this, 'plugins_installed')); + + $this->register_action('plugin.plugin_manager', array($this, 'navigation')); + $this->register_action('plugin.plugin_manager_save', array($this, 'save')); + $this->register_action('plugin.plugin_manager_uninstall', array($this, 'uninstall')); + $this->register_action('plugin.plugin_manager_update', array($this, 'update')); + $this->register_action('plugin.plugin_manager_bind', array($this, 'bind')); + $this->register_action('plugin.plugin_manager_unbind', array($this, 'unbind')); + $this->register_action('plugin.plugin_manager_getnew', array($this, 'getnew')); + $this->register_action('plugin.plugin_manager_deny', array($this, 'deny')); + $this->register_action('plugin.plugin_manager_show_config', array($this, 'show')); + $this->register_action('plugin.plugin_manager_save_config', array($this, 'save_config')); + $this->register_action('plugin.plugin_manager_edit_config', array($this, 'edit_config')); + $this->register_action('plugin.plugin_manager_restore_config', array($this, 'restore_config')); + $this->register_action('plugin.plugin_manager_accept', array($this, 'accept')); + $this->register_action('plugin.plugin_manager_transfer', array($this, 'transfer')); + $this->register_action('plugin.plugin_manager_getcredits', array($this, 'getcredits')); + $this->register_action('plugin.plugin_manager_buycredits', array($this, 'buycredits')); + //$this->register_action('plugin.plugin_manager_compress', array($this, 'compress')); + $this->register_action('plugin.plugin_manager_update_notifier', array($this, 'update_notifier')); + + $this->include_script('plugin_manager_fixes.js'); + if(!$_SESSION['pm_cache']['pm_version'] || $_SESSION['pm_cache']['pm_version']['time'] < time() - 3600){ + if(isset($this->admins[$this->rcmail->user->data['username']])){ + $skin = $this->rcmail->config->get('skin'); + if(!file_exists($this->home . '/skins/' . $skin . '/plugin_manager_update.css')){ + $skin = 'classic'; + } + $httpConfig['method'] = 'GET'; + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_pmversion'; + $httpConfig['timeout'] = '30'; + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + if($http->error){ + $this->mirror = str_replace('https://', 'http://', $this->mirror); + $this->svn = str_replace('https://', 'http://', $this->svn); + $this->beta = str_replace('https://', 'http://', $this->beta); + $this->billingurl = str_replace('https://', 'http://', $this->billingurl); + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_pmversion'; + $http->initialize($httpConfig); + $http->execute(); + if($http->error){ + $this->mirror = str_replace('.com', '.net', $this->mirror); + $this->svn = str_replace('.com', '.net', $this->svn); + $this->beta = str_replace('.com', '.net', $this->beta); + $this->billingurl = str_replace('.com', '.net', $this->billingurl); + $this->guide = str_replace('.com', '.net', $this->guide); + $this->dlurl = str_replace('.com', '.net', $this->dlurl); + // find me: remove when myroundcube.net SSL is available + $this->dlurl = str_replace('https://', 'http://', $this->dlurl); + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_pmversion'; + $http->initialize($httpConfig); + $http->execute(); + $this->_log($httpConfig, $http); + } + } + if(!preg_match('/^[0-9\.|]+$/', trim($http->result)) || count(explode('|', $http->result)) != 2){ + $this->mirror = str_replace('https://', 'http://', $this->mirror); + $this->svn = str_replace('https://', 'http://', $this->svn); + $this->beta = str_replace('https://', 'http://', $this->beta); + $this->billingurl = str_replace('https://', 'http://', $this->billingurl); + // find me: remove when myroundcube.net SSL is available + $this->dlurl = str_replace('https://', 'http://', $this->dlurl); + $this->mirror = str_replace('.com', '.net', $this->mirror); + $this->svn = str_replace('.com', '.net', $this->svn); + $this->beta = str_replace('.com', '.net', $this->beta); + $this->billingurl = str_replace('.com', '.net', $this->billingurl); + $this->guide = str_replace('.com', '.net', $this->guide); + $this->dlurl = str_replace('.com', '.net', $this->dlurl); + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_pmversion'; + $http->initialize($httpConfig); + $http->execute(); + $this->_log($httpConfig, $http); + } + if($this->debug){ + write_log('plugin_manager', $httpConfig); + write_log('plugin_manager', $_SERVER['SERVER_ADDR']); + write_log('plugin_manager', self::$version); + write_log('plugin_manager', $http); + } + if(!preg_match('/^[0-9\.|]+$/', trim($http->result)) || count(explode('|', $http->result)) != 2){ + $this->noremote = true; + $http->result = 'error'; + } + $response = $http->result; + $_SESSION['pm_cache']['pm_version'] = array( + 'error' => $http->error, + 'response' => $http->result, + 'urls' => array( + 'mirror' => $this->mirror, + 'svn' => $this->svn, + 'beta' => $this->beta, + 'billingurl' => $this->billingurl, + 'dlurl' => $this->dlurl, + 'guide' => $this->guide, + ), + 'time' => time(), + ); + if(is_array($_SESSION['pm_cache']['pm_version']['urls'])){ + foreach($_SESSION['pm_cache']['pm_version']['urls'] as $key => $url){ + $this->$key = $url; + } + } + if(isset($_SESSION['pm_cache']) && !$_SESSION['pm_cache']['pm_version']['error']){ + $temp = explode('|', $_SESSION['pm_cache']['pm_version']['response'], 2); + if($response == 'error'){ + $this->noremote = true; + if(!get_input_value('_remote', RCUBE_INPUT_GPC) && !get_input_value('_framed', RCUBE_INPUT_GPC)){ + $this->include_stylesheet('skins/' . $skin . '/plugin_manager_update.css'); + $this->api->output->add_footer(html::tag('div', array('class' => 'myrcerror myrcmessage'), html::tag('span', null, $this->gettext('myrcerror')))); + } + } + else if(self::$version != $temp[0]){ + if(self::$version < $temp[1]){ + $this->rcmail->session->remove('pm_update_message'); + } + if((!$_SESSION['pm_update_message']) && !get_input_value('_framed', RCUBE_INPUT_GPC) && $this->rcmail->action != 'about'){ + if(version_compare(self::$version, $temp[1], '<')){ + $this->noremote = true; + $this->delay = 500000; + $_SESSION['pm_update_message'] = true; + if(!get_input_value('_remote', RCUBE_INPUT_GPC)){ + $this->include_stylesheet('skins/' . $skin . '/plugin_manager_update.css'); + $this->api->output->add_footer(html::tag('div', array('class' => 'updatepmrequired myrcmessage', 'onclick' => 'document.location.href="' . slashify($this->svn) . '?_action=plugin.plugin_server_get_pm"; $(this).hide("slow");'), + html::tag('span', null, $this->gettext('updatepmrequired')) . + ((strpos($skin, 'litecube') !== false) ? ' ' : html::tag('br')) . + html::tag('span', array('style' => 'text-decoration:underline;'), $this->gettext('downloadnow')) + )); + } + } + else if(version_compare(self::$version, $temp[0], '<')){ + $this->delay = 30000; + //$_SESSION['pm_update_message'] = true; + if(!get_input_value('_remote', RCUBE_INPUT_GPC)){ + $this->include_stylesheet('skins/' . $skin . '/plugin_manager_update.css'); + $this->api->output->add_footer(html::tag('div', array('class' => 'updatepm myrcmessage', 'onclick' => 'document.location.href="' . slashify($this->svn) . '?_action=plugin.plugin_server_get_pm"; $(this).hide("slow");'), + html::tag('span', null, $this->gettext('updatepm')) . + ((strpos($skin, 'litecube') !== false) ? ' ' : html::tag('br')) . + html::tag('span', array('style' => 'text-decoration:underline;'), $this->gettext('downloadnow')) + )); + } + } + } + } + } + else if(isset($_SESSION['pm_cache']) && $_SESSION['pm_cache']['pm_version']['error']){ + $this->delay = 8000; + $this->noremote = true; + if(!get_input_value('_remote', RCUBE_INPUT_GPC) && !get_input_value('_framed', RCUBE_INPUT_GPC)){ + $this->include_stylesheet('skins/' . $skin . '/plugin_manager_update.css'); + $this->api->output->add_footer(html::tag('div', array('class' => 'myrcerror myrcmessage'), html::tag('span', null, $this->gettext('myrcerror')))); + } + } + $httpConfig['method'] = 'GET'; + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_branches'; + $httpConfig['timeout'] = '30'; + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + $http->execute(); + if($http->error){ + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_branches'; + $http->initialize($httpConfig); + $http->execute(); + } + if(!$http->error){ + if($branches = unserialize($http->result)){ + $this->dev = $branches['dev']; + $this->stable = $branches['stable']; + } + } + $map = array( + 'frozen' => 'mirror', + 'stable' => 'svn', + 'beta' => 'beta' + ); + foreach($map as $host => $map){ + if($host = $branches['branches'][$host]){ + $temp1 = parse_url($this->$map); + $temp2 = explode('.', $temp1['host']); + $temp3 = parse_url($host); + $subdomain = current(explode('.', $temp3['host'])); + $this->$map = $temp1['scheme'] . '://' . $subdomain . '.' . $temp2[1] . '.' . $temp2[2]; + } + else{ + $this->$map = false; + } + } + if(!$_SESSION['pm_update_message'] && $_SESSION['user_id'] && $this->rcmail->task != 'logout' && !get_input_value('_framed', RCUBE_INPUT_GPC) && $this->rcmail->config->get('plugin_manager_show_myrc_messages', false)){ + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_motd'; + $http->initialize($httpConfig); + $http->execute(); + if($http->error){ + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_motd'; + $http->initialize($httpConfig); + $http->execute(); + } + if(!$http->error){ + if($http->result != ''){ + $this->delay = 30000; + $_SESSION['pm_update_message'] = true; + if(!get_input_value('_remote', RCUBE_INPUT_GPC)){ + $this->include_stylesheet('skins/' . $skin . '/plugin_manager_update.css'); + $this->api->output->add_footer(html::tag('div', array('class' => 'motd myrcmessage'), + html::tag('span', null, html::tag('div', array('style' => 'float: right'), html::tag('small', null, '[' . html::tag('a', array('href' => '#', 'onclick' => '$(".myrcmessage").hide()', 'title' => $this->gettext('close')), 'x') .']')) . $http->result) + )); + } + } + } + } + } + if(count($this->admins) == 0 && + ($_SERVER['QUERY_STRING'] == '_task=settings&_action=edit-prefs&_section=plugin_manager_update&_framed=1' ||$_SERVER['QUERY_STRING'] == '_task=settings&_action=edit-prefs&_section=plugin_manager_customer&_framed=1') + ){ + $this->rcmail->output->add_script('parent.location.href="./?_task=settings"', 'docready'); + } + } + + /* uninstall requests */ + /* google_contacts */ + $this->register_action('plugin.google_contacts_uninstall', array($this, 'google_contacts_uninstall')); + /* automatic_addressbook */ + $this->register_action('plugin.automatic_addressbook_uninstall', array($this, 'automatic_addressbook_uninstall')); + } + + $this->plugins = $this->rcmail->config->get('plugins', array()); + + $this->host = strtolower($_SERVER['HTTP_HOST']); + $temparr = explode('@', $_SESSION['username']); + $this->domain = strtolower($temparr[1]); + if($this->domain == ''){ + $host = $this->rcmail->user->data['mail_host']; + if($host == 'localhost'){ + $host = $_SERVER['HTTP_HOST']; + } + $this->domain = $host; + } + $this->merge_config(); + $deferred = array(); + foreach($this->config as $sections => $section){ + foreach($section as $plugin => $props){ + if(isset($this->config[$sections][$plugin])){ + if($props['active']){ + $load = true; + if(is_array($props['hosts']) && count($props['hosts'] > 0)){ + $load = false; + foreach($props['hosts'] as $host){ + if($this->host == strtolower($host)){ + $load = true; + break; + } + } + } + if($this->domain){ + if($props['domain'] === true){ + $load = true; + } + else if(is_array($props['domains']) && count($props['domains'] > 0)){ + $load = false; + foreach($props['domains'] as $domain){ + if($this->domain == strtolower($domain)){ + $load = true; + break; + } + } + } + } + if(is_array($props['skins'])){ + $props['skins'] = array_flip($props['skins']); + if(!isset($props['skins'][$this->rcmail->config->get('skin', 'classic')])){ + $load = false; + } + } + if($load){ + if($file = @file_get_contents(INSTALL_PATH . '/plugins/' . $plugin . '/' . $plugin . '.php')){ + $file = str_replace(' ', '', $file); + $file = current(explode('functioninit(', $file, 2)); + $task = explode('$task', $file, 2); + $task = explode('=', $task[1], 2); + $task = explode(';', $task[1], 2); + $task = str_replace(array('"', "'"), array('', ''), trim($task[0])); + $noajax = explode('$noajax', $file, 2); + $noajax = explode('=', $noajax[1], 2); + $noajax = explode(';', $noajax[1], 2); + $noajax = str_replace(array('"', "'"), array('', ''), trim($noajax[0])); + $noframe = explode('$noframe', $file, 2); + $noframe = explode('=', $noframe[1], 2); + $noframe = explode(';', $noframe[1], 2); + $noframe = str_replace(array('"', "'"), array('', ''), trim($noajax[0])); + if($task){ + if(!preg_match('/^(' . $task . ')$/i', $this->rcmail->task)){ + $noajax = false; + $noframe = false; + $load = false; + } + } + if($noajax && ($noajax == 'true' || $noajax == '1')){ + if(isset($_REQUEST['_remote'])){ + $noframe = false; + $load = false; + } + } + if($noframe && ($noframe == 'true' || $noframe == '1')){ + if(isset($_REQUEST['_framed'])){ + $load = false; + } + } + } + } + if($load && !$this->maintenance_mode){ + if($props['browser']){ + if(!$browser) + $browser = new rcube_browser(); + eval($props['browser']); + if($test){ + if($props['defer']){ + $deferred[] = $plugin; + } + else{ + if($plugin != 'load_splitter'){ + $this->require_plugin($plugin); + } + } + } + } + else if($props['defer']){ + $deferred[] = $plugin; + } + else{ + if($plugin != 'load_splitter'){ + $this->require_plugin($plugin); + } + } + } + } + else{ + if($props['eval']){ + if(!is_array($props['eval'])){ + $eval = array($props['eval']); + } + else{ + $eval = $props['eval']; + } + foreach($eval as $code){ + eval($code); + } + } + } + } + } + } + if(!$this->maintenance_mode){ + foreach($deferred as $plugin){ + $this->require_plugin($plugin); + } + } + } + + static public function about($keys = false){ + $requirements = self::$requirements; + foreach(array('required_', 'recommended_') as $prefix){ + if(is_array($requirements[$prefix.'plugins'])){ + foreach($requirements[$prefix.'plugins'] as $plugin => $method){ + if(class_exists($plugin) && method_exists($plugin, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $plugin(false); + $requirements[$prefix.'plugins'][$plugin] = array( + 'method' => $method, + 'plugin' => $class->about($keys), + ); + } + else{ + $requirements[$prefix.'plugins'][$plugin] = array( + 'method' => $method, + 'plugin' => $plugin, + ); + } + } + } + } + $config = array(); + $ret = array( + 'plugin' => self::$plugin, + 'version' => self::$version, + 'db_version' => self::$db_version, + 'date' => self::$date, + 'author' => self::$author, + 'comments' => self::$authors_comments, + 'licence' => self::$licence, + 'download' => self::$download, + 'requirements' => $requirements, + ); + if(is_array(self::$prefs)) + $ret['config'] = array_merge($config, array_flip(self::$prefs)); + else + $ret['config'] = $config; + if(is_array($keys)){ + $return = array('plugin' => self::$plugin); + foreach($keys as $key){ + $return[$key] = $ret[$key]; + } + return $return; + } + else{ + return $ret; + } + } + + function update_notifier(){ + $_SESSION['plugin_manager_update_notifier'] = true; + $server = array(); + $updates = array(); + $dir = scandir(INSTALL_PATH . 'plugins'); + foreach($dir as $dirname){ + if($dirname != '.' && $dirname != '..' && is_dir(INSTALL_PATH . 'plugins/' . $dirname) && file_exists(INSTALL_PATH . 'plugins/' . $dirname . '/' . $dirname . '.php')){ + $server[$dirname] = 1; + } + } + if(!empty($server)){ + $params = array(); + $httpConfig['method'] = 'GET'; + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_update_notifier'; + $httpConfig['timeout'] = '30'; + $httpConfig['params'] = $params; + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + if($http->error){ + $response = false; + } + else{ + $response = $http->result; + } + if($mirror = json_decode($response, true)){ + if(is_array($mirror)){ + $sql = 'SELECT value FROM ' . get_table_name('system') . ' WHERE name=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'myrc_plugin_manager_updates_hash'); + $value = $this->rcmail->db->fetch_assoc($res); + if(is_array($value)){ + $value = current($value); + } + else{ + $value = ''; + } + if($value != md5($response)){ + $sql = 'DELETE FROM ' . get_table_name('system') . ' WHERE name=?'; + $this->rcmail->db->query($sql, 'myrc_plugin_manager_updates_hash'); + $sql = 'INSERT INTO ' . get_table_name('system') . '(name, value) VALUES (?, ?)'; + $this->rcmail->db->query($sql, 'myrc_plugin_manager_updates_hash', md5($response)); + $sql = 'DELETE FROM ' . get_table_name('system') . ' WHERE name=?'; + $this->rcmail->db->query($sql, 'myrc_plugin_manager_updates_last'); + $sql = 'INSERT INTO ' . get_table_name('system') . '(name, value) VALUES (?, ?)'; + $this->rcmail->db->query($sql, 'myrc_plugin_manager_updates_last', date('Y-m-d H:i:s')); + foreach($server as $plugin => $null){ + if(isset($mirror[$plugin])){ + if(file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/' . $plugin . '.php')){ + $this->require_plugin($plugin); + if(class_exists($plugin) && method_exists($plugin, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $plugin(false); + $props = $class->about('version', 'date'); + if(version_compare($props['version'], $mirror[$plugin]['version'], '<')){ + $updates[$plugin] = array('server' => $props['version'], 'mirror' => $mirror[$plugin]['version']); + } + } + } + } + } + } + $rows = html::tag('tr', null, html::tag('th', array('align' => 'left', 'style' => 'border: 1px solid grey'), 'Plugin') . html::tag('th', array('align' => 'right', 'style' => 'border: 1px solid grey'), 'Locale Version') . html::tag('th', array('align' => 'right', 'style' => 'border: 1px solid grey'), 'Remote Version') . html::tag('th', array('align' => 'right', 'style' => 'border: 1px solid grey'), ' ')); + if(!empty($updates)){ + foreach($updates as $plugin => $props){ + $rows .= html::tag('tr', null, html::tag('td', array('style' => 'border: 1px solid grey'), $plugin) . html::tag('td', array('align' => 'right', 'style' => 'border: 1px solid grey'), $props['server']) . html::tag('td', array('align' => 'right', 'style' => 'border: 1px solid grey'), $props['mirror']) . html::tag('td', array('align' => 'right', 'style' => 'border: 1px solid grey'), html::tag('a', array('href' => 'https://myroundcube.com/myroundcube-plugins/show-changelog?_plugin=' . $plugin), 'CHANGELOG'))); + } + $table = html::tag('table', array('cellpadding' => 4, 'cellspacing' => 0, 'style' => 'border: 1px solid grey'), $rows); + $body = 'Hello,

There are plugins updates available for your Roundcube installation at ' . $this->gethost() . ', ' . INSTALL_PATH . ':

' . $table . '

Greetings,
MyRoundcube Support
(c) '; + $body .= html::tag('a', array('href' => 'http://myroundcube.com'), 'MyRoundcube.com') . ' 2012-' . date('Y') . '

'; + $body .= html::tag('div', array('style' => 'text-align:justify;'), 'You are receiving this email notification from Plugin Manager. If you no longer wish to receive updates notifications, please disable the Update Notifications option in your Roundcube installation (Settings » Manage Plugins » Settings).'); + $body = html::tag('div', array('style' => 'width: 580px'), $body); + $sql = 'SELECT value FROM ' . get_table_name('plugin_manager') . ' WHERE conf=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'admins'); + $admins = $this->rcmail->db->fetch_assoc($res); + if(is_array($admins)){ + $admins = unserialize(current($admins)); + if(is_array($admins)){ + $subject = 'MyRoundcube Plugins Updates available'; + $cc = $this->rcmail->config->get('plugin_manager_update_notifications_cc'); + /* + $from = rcube_user::user2email($this->rcmail->user->data['username'], false, true); + if(!$from){ + $from = $this->rcmail->user->data['username']; + } + */ + foreach($admins as $admin){ + $to = rcube_user::user2email($admin, false, true); + if(!$to){ + $to = $admin; + } + $this->sendmail($to, $to, false, $subject, $body); + } + if($cc){ + $this->sendmail($to, false, $cc, $subject, $body); + } + } + } + } + } + } + } + } + + function plugins_installed($plugins){ + unset($plugins['abort']); + $conf = $this->defaults; + foreach($conf as $section){ + foreach($section as $plugin => $props){ + if($props['protected']){ + if($props['active']){ + $plugins[] = $plugin; + } + } + else{ + $plugins[] = $plugin; + } + } + } + if(file_exists(INSTALL_PATH . 'plugins/calendar_plus/calendar_plus.php') && in_array('calendar', $plugins)){ + $plugins = array_merge($plugins, array('calendar_plus')); + } + $plugs = $plugins; + foreach($plugins as $key => $plugin){ + $this->require_plugin($plugin); + if(method_exists($plugin, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $plugin(false); + $about = $class->about(); + $requirements = (array) $about['requirements']; + foreach($requirements as $requirement => $props){ + if($requirement == 'required_plugins'){ + foreach($props as $plugin => $method){ + if($method['method'] == 'require_plugin'){ + $plugs[] = $plugin; + } + } + } + } + } + } + return $plugs; + } + + function build_defaults(){ + if($_SESSION['plugin_manager_defaults'] && !isset($_SESSION['plugin_manager_admins'][strtolower($this->rcmail->user->data['username'])])){ + $this->defaults = $_SESSION['plugin_manager_defaults']; + $this->unauth = $_SESSION['plugin_manager_unauth']; + return; + } + include INSTALL_PATH . 'plugins/plugin_manager/defaults.inc.php'; + $defaults = $config['plugin_manager_defaults']; + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'defaults_overwrite'); + $overwrite = $this->rcmail->db->fetch_assoc($res); + if(is_array($overwrite)){ + if($overwrite = unserialize($overwrite['value'])){ + $depricate = false; + foreach($overwrite as $section => $plugins){ + foreach($plugins as $plugin => $props){ + if(isset($defaults[$section][$plugin]['deprecated'])){ + if(RCMAIL_VERSION > $defaults[$section][$plugin]['deprecated']){ + unset($overwrite[$section][$plugin]); + $deprecate = true; + } + } + foreach($props as $prop => $value){ + $defaults[$section][$plugin][$prop] = $value; + } + } + } + if($deprecate){ + $sql = 'UPDATE ' . get_table_name('plugin_manager') . ' SET ' . $this->q('value') . '=? WHERE ' . $this->q('conf') . '=?'; + $this->rcmail->db->query($sql, serialize($overwrite), 'defaults_overwrite'); + } + } + } + foreach($defaults as $section => $plugins){ + foreach($plugins as $plugin => $props){ + if(!file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/' . $plugin . '.php')){ + unset($defaults[$section][$plugin]); + } + else if(substr($plugin, 0, strlen('hmail_')) == 'hmail_' && !$this->use_hmail){ + unset($defaults[$section][$plugin]); + } + else{ + if(isset($config['plugin_manager_unauth'][$plugin])){ + $this->unauth[$plugin] = true; + } + } + } + } + $sql = 'SELECT ' . $this->q('value') . ' FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'defaults'); + $overwrite = $this->rcmail->db->fetch_assoc($res); + if(is_array($overwrite)){ + if($overwrite = unserialize($overwrite['value'])){ + foreach($overwrite as $section => $plugins){ + foreach($plugins as $plugin => $props){ + foreach($props as $prop => $value){ + if(isset($defaults[$section][$plugin])){ + $true = true; + if(is_bool($defaults[$section][$plugin][$prop])){ + $defaults[$section][$plugin][$prop] = $value ? true : false; + } + } + } + } + } + } + } + foreach($defaults as $section => $plugins){ + foreach($plugins as $plugin => $props){ + if(isset($defaults[$section][$plugin]['deprecated'])){ + if(RCMAIL_VERSION > $defaults[$section][$plugin]['deprecated']){ + unset($defaults[$section][$plugin]); + } + } + } + } + $this->defaults = $defaults; + $_SESSION['plugin_manager_defaults'] = $defaults; + $_SESSION['plugin_manager_unauth'] = $this->unauth; + $this->thirdparty = $config['plugin_manager_third_party_plugins']; + } + + function sqlerror($p){ + return $this->out; + } + + function authenticate($p){ + $rcmail = rcmail::get_instance(); + $this->add_texts('localization/'); + $hash = $this->rcmail->config->get('plugin_manager_hash'); + $out = html::tag('div', array('style' => 'font-size: 12px; text-align: justify; position: absolute; margin-left: auto; left: 50%; margin-left: -225px; width: 450px;'), + html::tag('h3', null, $this->gettext('welcome_to_plugin_manager')) . + $this->gettext('about_to_create_account') . ' ' . + $this->gettext('create_account_proceed') . ' ' . + $this->gettext('please_create') . html::tag('br') . html::tag('br') . + html::tag('b', null, html::tag('center', null, $hash . '.myrc')) . html::tag('br') . html::tag('br') . + html::tag('div', array('style' => 'display: block; float: left;'), $this->gettext('thank_you')) . + html::tag('div', array('style' => 'display: block; float: right;'), html::tag('a', array('href' => './?_task=settings'), $this->gettext('done'))) . html::tag('br') . + html::tag('hr') . + html::tag('div', array('style' => 'font-size: 10px;'), '© 2012 - ' . date('Y') . ' MyRoundcube.com. All rights reserved.') + ); + $this->rcmail->output->add_script('$(".button-settings").attr("onclick", "document.location.href=\'./?_task=settings\'")', 'docready'); + return $out; + } + + function login_after($args){ + $active = $this->rcmail->config->get('plugin_manager_active', array()); + if(!$active){ + $this->build_defaults(); + foreach($this->defaults as $section => $plugins){ + foreach($plugins as $plugin => $props){ + if($props['active']){ + $active[$plugin] = 1; + } + else{ + $active[$plugin] = 0; + } + } + } + $this->rcmail->user->save_prefs(array('plugin_manager_active' => $active)); + } + return $args; + } + + function render_page($p){ + $this->template = $p['template']; + if($this->template == 'settings'){ + if($next = get_input_value('_next', RCUBE_INPUT_GET)){ + $this->rcmail->output->add_script('window.setTimeout(\'$("#rcmrow' . $next . '").trigger("mousedown").trigger("mouseup")\', 500);', 'docready'); + } + } + else if($this->template == 'mail'){ + if($this->rcmail->config->get('plugin_manager_update_notifications')){ + if(!isset($_SESSION['plugin_manager_update_notifier'])){ + $sql = 'SELECT value FROM ' . get_table_name('system') . ' WHERE name=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'myrc_plugin_manager_updates_last'); + $last = $this->rcmail->db->fetch_assoc($res); + if(is_array($last)){ + $last = strtotime(current($last)); + } + else{ + $last = 0; + } + if($last + 86400 < time()){ + $this->rcmail->output->add_script("rcmail.http_request('plugin.plugin_manager_update_notifier');", 'docready'); + } + } + } + } + if(!get_input_value('_framed', RCUBE_INPUT_GET)){ + if($this->maintenance_mode){ + $this->rcmail->output->show_message($this->gettext('running_in_maintenance_mode'), 'warning'); + } + if(!$this->rcmail->config->get('plugin_manager_about_link', true)){ + $this->rcmail->output->add_script('$(".about-link").hide();', 'foot'); + } + if(!$this->rcmail->config->get('plugin_manager_support_link', true)){ + if($this->rcmail->action != 'jappix.loadmini'){ + $this->rcmail->output->add_script('$(".support-link").hide();', 'docready'); + } + } + if($section = get_input_value('_plugin_manager_settings_section', RCUBE_INPUT_GET)){ + $this->rcmail->output->set_env('section', $section); + $src = './?_task=settings&_action=edit-prefs&_section=plugin_manager_settings&_framed=1&_expand=' . get_input_value('_expand', RCUBE_INPUT_GET); + if($this->rcmail->config->get('skin', 'classic') != 'classic'){ + $this->rcmail->output->add_script("$('#rcmrowplugin_manager_settings').addClass('selected focused'); $('#preferences-frame').attr('src', '" . $src . "');", 'docready'); + } + else{ + $this->rcmail->output->add_script("$('#rcmrowplugin_manager_settings').addClass('selected focused'); $('#prefs-frame').attr('src', '" . $src . "');", 'docready'); + } + } + if(!class_exists('tabbed')){ + $this->rcmail->output->add_script('window.setTimeout("$(\'.myrcmessage\').hide(\'slow\');", ' . $this->delay . ');', 'docready'); + } + else{ + $this->rcmail->output->set_env('pm_message_delay', $this->delay); + } + if($this->rcmail->config->get('plugin_manager_myroundcube_watermark', true) || $this->rcmail->config->get('plugin_manager_remove_watermark', false)){ + if(strtolower($this->rcmail->user->data['username']) != $this->rcmail->config->get('mysql_admin') || !class_exists('mysqladmin')){ + $repl = 'myroundcube.html'; + if($this->rcmail->config->get('plugin_manager_remove_watermark', false)){ + $repl = 'blank.html'; + } + switch($p['template']){ + case 'settings': + case 'addressbook': + case 'identities': + case 'folders': + case 'mail': + $p['content'] = str_replace('skins/' . $this->rcmail->config->get('skin', 'classic') . '/watermark.html', 'plugins/plugin_manager/skins/' . $this->rcmail->config->get('skin', 'classic') . '/' . $repl, $p['content']); + $this->rcmail->output->set_env('blankpage', 'plugins/plugin_manager/skins/' . $this->rcmail->config->get('skin', 'classic') . '/' . $repl); + } + } + } + } + return $p; + } + + function send_page($p){ + if($this->compress_html){ + $p = $this->html_compress($p); + } + else{ + $temp = explode('.', $this->template); + $plugin = $temp[0]; + if(count($temp == 2)){ + if(class_exists($plugin) && method_exists($plugin, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $plugin(false); + $about = $class->about(array('version', 'date')); + if($temp[0] && $temp[1]){ + $comment = ''; + $temp = explode('rcmail->output->add_script("$(document).ready(function(){ rcmail.addEventListener('init', function(){ rcmail.sections_list.select('" . $section . "') }); })", 'foot'); + } + } + + function merge_config(){ + $this->config = $this->defaults; + if($this->rcmail->user->ID && $this->rcmail->task != 'logout'){ + $active = $this->rcmail->config->get('plugin_manager_active', array()); + } + else{ + $active = $this->unauth; + } + foreach($this->config as $sections => $section){ + foreach($section as $plugin => $props){ + if(in_array($plugin, $this->plugins)){ + $branch = $this->mirror; + if(RCMAIL_VERSION > '0.7') + $branch = $this->svn; + $error = html::tag('h3', array('align' => 'center'), 'ERROR
- Plugin Manager Center -
Branch: ' . $branch . '
(Roundcube v' . RCMAIL_VERSION . ')
') . + html::tag('p', null, 'Misconfiguration: Unregister ' . $plugin . ' in ./config/main.inc.php.') . + html::tag('p', null, 'You can\'t register a plugin in main.inc.php which is configured to be loaded by Plugin Manager.
[Done]
'); + $this->out = $error; + $this->register_handler('plugin.body', array($this, 'sqlerror')); + $this->rcmail->output->send('plugin_manager.error'); + } + if(isset($active[$plugin])){ + $overwrite = $active[$plugin]; + } + else{ + $overwrite = $props['active']; + } + if($props['protected']){ + $overwrite = $props['active']; + if(is_array($props['protected'])){ + foreach($props['protected'] as $domain){ + if($domain == $this->domain){ + $overwrite = $props['active']; + break; + } + else{ + $overwrite = $active[$plugin]; + } + } + } + else if(is_string($props['protected'])){ + $overwrite = $this->rcmail->config->get($props['protected']); + } + } + $this->config[$sections][$plugin]['active'] = $overwrite; + } + } + } + + function google_contacts_uninstall(){ + if($this->rcmail->user->ID){ + $db_table = get_table_name('google_contacts'); + $query = "DELETE FROM $db_table WHERE user_id=?"; + $this->rcmail->db->query($query, $this->rcmail->user->ID); + } + } + + function automatic_addressbook_uninstall(){ + if($this->rcmail->user->ID){ + $db_table = get_table_name('collected_contacts'); + $query = "DELETE FROM $db_table WHERE user_id=?"; + $this->rcmail->db->query($query, $this->rcmail->user->ID); + } + } + + function uninstall(){ + $uninstall = get_input_value('_uninstall', RCUBE_INPUT_POST); + $config = unserialize($this->rcmail->user->data['preferences']); + $response = ''; + foreach($this->config as $sections => $section){ + foreach($section as $plugin => $props){ + if($plugin == $uninstall){ + if($props['uninstall_request']){ + if(is_array($props['uninstall_request'])){ + if(strtolower($props['uninstall_request']['method']) == 'post'){ + $response = 'rcmail.http_post('; + } + else{ + $response = 'rcmail.http_request('; + } + $params = ''; + if($props['uninstall_request']['params']) + $params = $props['uninstall_request']['params']; + $response .= '"' . $props['uninstall_request']['action'] . '", "' . $params .'");'; + } + } + if(is_array($props['uninstall'])){ + foreach($props['uninstall'] as $prop){ + if(is_string($prop)){ + unset($config[$prop]); + } + } + } + else if($props['uninstall'] === true){ + if(method_exists($plugin, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $plugin(false); + $about = $class->about(); + if(is_array($about['config'])){ + foreach($about['config'] as $prop => $val){ + if(is_string($prop)){ + unset($config[$prop]); + } + } + } + } + } + $a_user_prefs = $config; + $config = serialize($config); + $this->rcmail->db->query( + "UPDATE ".get_table_name('users'). + " SET preferences = ?". + ", language = ?". + " WHERE user_id = ?", + $config, + $_SESSION['language'], + $this->rcmail->user->ID + ); + if($this->rcmail->db->affected_rows() !== false){ + $this->rcmail->config->set_user_prefs($a_user_prefs); + $this->rcmail->data['preferences'] = $config; + if(isset($_SESSION['preferences'])){ + $this->rcmail->session->remove('preferences'); + $this->rcmail->session->remove('preferences_time'); + } + } + break; + } + } + } + $this->rcmail->output->command('plugin.plugin_manager_success', $response); + } + + function transfer(){ + $this->register_handler('plugin.body', array($this, 'transfer_html')); + $user = $_SESSION['username']; + $admins = $this->admins; + if(isset($admins[strtolower($user)]) || strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $this->rcmail->output->send('plugin_manager.transfer'); + } + } + + function transfer_html(){ + $customer_id = $this->rcmail->config->get('customer_id'); + if(isset($_POST['_from']) && isset($_POST['_to']) && isset($_POST['_amount'])){ + $dest = get_input_value('_to', RCUBE_INPUT_POST); + $amount = get_input_value('_amount', RCUBE_INPUT_POST); + $alphanum = 'a-z0-9'; + $alpha = '0-9'; + if(strlen($dest) < 32){ + $this->rcmail->output->show_message($this->gettext('invalid_customer_id'), 'error'); + } + else if(strlen($dest) != preg_replace("/[^$alphanum]/i", '', strlen($dest))){ + $this->rcmail->output->show_message($this->gettext('invalid_customer_id'), 'error'); + } + else if(strlen($amount) != preg_replace("/[^$alpha]/", '', strlen($amount))){ + $this->rcmail->output->show_message($this->gettext('invalid_credits'), 'error'); + } + else{ + $httpConfig['method'] = 'POST'; + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_transfer'; + $httpConfig['timeout'] = '30'; + $httpConfig['params'] = array('_customer_id' => $customer_id, '_to' => $dest, '_amount' => $amount, '_ip' => $this->getVisitorIP()); + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + if($http->error){ + $this->rcmail->output->show_message($this->gettext('errorsaving'), 'error'); + } + $response = $http->result; + if($response == 'ok'){ + $this->rcmail->output->show_message($this->gettext('successfully_transferred'), 'confirmation'); + } + else{ + $this->rcmail->output->show_message($this->gettext('errorsaving'), 'error'); + } + } + } + $credits = $this->getcredits(false); + $row = html::tag('td', array('class' => 'title'), $this->gettext('from') . ':') . html::tag('td', null, html::tag('td', null, html::tag('input', array('name' => '_from', 'size' => 32, 'readonly' => 'readonly', 'value' => $customer_id)) . html::tag('td', array('class' => 'title'), '(' . $this->gettext('customer_id') . ')'))); + $rows = html::tag('tr', null, $row); + $row = html::tag('td', array('class' => 'title'), $this->gettext('to') . ':') . html::tag('td', null, html::tag('td', null, html::tag('input', array('name' => '_to', 'size' => 32, 'value' => $dest ? $dest : '')) . html::tag('td', array('class' => 'title'), '(' . $this->gettext('customer_id') . ')'))); + $rows .= html::tag('tr', null, $row); + $row = html::tag('td', array('class' => 'title'), 'MyRC$:') . html::tag('td', null, html::tag('td', null, html::tag('input', array('name' => '_amount', 'size' => 3, 'value' => $credits)) . html::tag('td', array('class' => 'title'), '(' . 'MyRC$ ' . html::tag('span', array('id' =>'cdl'), $credits) . ' ' . $this->gettext('credits') . ')'))); + $rows .= html::tag('tr', null, $row); + $content = html::tag('table', null, $rows); + $content .= html::tag('br') . html::tag('input', array('type' => 'submit', 'value' => $this->gettext('transfer'), 'class' => 'button mainaction')); + $content .= ' ' . html::tag('input', array('type' => 'button', 'value' => $this->gettext('cancel'), 'class' => 'button', 'onclick' => 'document.location.href="./?_task=settings&_action=edit-prefs&_section=plugin_manager_customer&_framed=1"')); + $fieldset = html::tag('fieldset', null, html::tag('legend', null, $this->gettext('transfer')) . $content); + $out = html::tag('form', array('action' => './?_task=settings&_action=plugin.plugin_manager_transfer&_framed=1', 'method' => 'post'), $fieldset); + return $out; + } + + function update(){ + $user = $_SESSION['username']; + $admins = $this->admins; + if(isset($admins[strtolower($user)]) || strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $this->register_handler('plugin.body', array($this, 'update_html')); + $this->rcmail->output->add_script('pm_resize();', 'docready'); + $this->rcmail->output->send('plugin'); + } + } + + function update_html(){ + $hl = get_input_value('_hl', RCUBE_INPUT_GET); + $branch = get_input_value('_branch', RCUBE_INPUT_GET); + if(strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + if(RCMAIL_VERSION > $this->stable){ + $branch = 'dev'; + } + } + if($branch == 'dev'){ + $this->mirror = $this->svn; + } + else if($branch == 'beta'){ + $this->mirror = $this->beta; + } + if($hl && $hl != $_SESSION['language']){ + $this->rcmail->load_language($hl); + $this->add_texts('localization', false); + } + $this->include_script('plugin_manager_update.js'); + $this->rcmail->output->add_label( + 'plugin_manager.noupdates', + 'plugin_manager.showall', + 'plugin_manager.hideuptodate' + ); + $skin = $this->rcmail->config->get('skin'); + if(!file_exists($this->home . '/skins/' . $skin . '/plugin_manager.css')) { + $skin = "larry"; + } + $this->include_stylesheet('skins/' . $skin . '/plugin_manager.css'); + $plugins = array_flip($this->rcmail->config->get('plugins', array())); + $dtp = $this->thirdparty; + $sections = $this->defaults; + foreach($sections as $section => $plugs){ + foreach($plugs as $plug => $props){ + $plugins[$plug] = $props; + } + } + $scope = array(); + foreach($plugins as $plugin => $props){ + if(!class_exists($plugin)){ + $this->require_plugin($plugin); + } + if(method_exists($plugin, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $plugin(false); + $p = $class->about(); + $p_sav = $p; + //$p = $plugin::about(); + $scope[$plugin] = array('version' => $p['version'], 'date'=> $p ['date']); + if(is_array($p['requirements']['required_plugins'])){ + foreach($p['requirements']['required_plugins'] as $required => $val){ + $this->require_plugin($required); + $p = $val['plugin']; + if(method_exists($required, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $required(false); + $p = $class->about(); + } + if(is_array($p)){ + $scope[$required] = array('version'=>$p['version'], 'date'=>$p['date']); + } + else{ + if($dtp[$required]){ + $scope[$required] = $dtp[$plugin]; + } + else{ + $scope[$required] = 'unknown'; + } + } + } + } + $p = $p_sav; + if(is_array($p['requirements']['recommended_plugins'])){ + foreach($p['requirements']['recommended_plugins'] as $recommended => $val){ + if(file_exists(INSTALL_PATH . 'plugins/' . $recommended . '/' . $recommended . '.php')){ + $this->require_plugin($recommended); + $p = $val['plugin']; + if(method_exists($recommended, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $recommended(false); + $p = $class->about(); + } + if(is_array($p)){ + $scope[$recommended] = array('version'=>$p['version'], 'date'=>$p['date']); + } + else{ + if($dtp[$recommended]){ + $scope[$recommended] = $dtp[$plugin]; + } + else{ + $scope[$recommended] = 'unknown'; + } + } + } + } + } + } + else{ + if($dtp[$plugin]){ + $scope[$plugin] = $dtp[$plugin]; + } + else{ + $scope[$plugin] = 'unknown'; + } + } + } + $user = $_SESSION['username']; + $temparr = explode('@', $user); + if(count($temparr) == 1){ + $host = $this->rcmail->user->data['mail_host']; + if($host == 'localhost'){ + $host = $_SERVER['HTTP_HOST']; + } + $user = $user . '@' . $host; + } + if(get_input_value('_warning', RCUBE_INPUT_GET)){ + if(MYRC_BRANCH == 'beta'){ + $betachecked = 'checked'; + $devchecked = ''; + $stablechecked = ''; + $host = $this->beta; + } + else if(MYRC_BRANCH == 'stable'){ + $betachecked = ''; + $devchecked = 'checked'; + $stablechecked = ''; + $host = $this->svn; + } + else{ + $betachecked = ''; + $devchecked = ''; + $stablechecked = 'checked'; + $host = $this->mirror; + } + $warning = html::tag('h3', null, 'We respect your privacy!') . html::tag('div', array('style' => 'text-align:justify'), 'If you proceed the following data will be submitted to our mirror servers and saved in our databases. While we consider this data as a whole not to be an invasion to your privacy, you may want to share a different email address with us. See ' . html::tag('a', array('target' => '_blank', 'href' => 'https://myroundcube.com/myroundcube-plugins/plugin-manager/administration#plugin-manager-administrators'), 'here') . ' how to add an additional administrative account to use a different email address.'); + $form = html::tag('ul', null, + html::tag('li', null, '_admin: ' . $user) . + html::tag('li', null, '_hl: ' . $_SESSION['language']) . + html::tag('li', null, '_customer_id: ' . $this->rcmail->config->get('customer_id')) . + html::tag('li', null, '_plugins:') + ); + $EMAIL_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[^&@"\'.][^@&"\']*\\.([^\\x00-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-z0-9]{2,}))'; + $display = 'none'; + if(preg_match('/' . $EMAIL_PATTERN . '/i', $user)){ + $display = 'block'; + } + $out = '
' . html::tag('div', + array('style' => 'opacity: 0.85;text-align: center; margin-left: auto; margin-left: auto; margin-right: auto; width: 600px; padding: 15px; background-color: #F7FDCB; border: 1px solid #C2D071;'), + $warning . html::tag('div', array('style' => "display:$display"), + html::tag('div', array('style' => 'text-align: right; margin-right: 80px;'), + //html::tag('span', null, 'Yes, please send me MyRoundcube Newsletters') . ' ' . html::tag('input', array('type' => 'checkbox', 'name' => '_newsletter', 'id' => 'newsletter', 'value' => 1)) . html::tag('br') . + html::tag('br') . html::tag('div', array('style' => 'display:inline;margin-right:22px'), 'Don\'t miss out ' . html::tag('a', array('href' => 'https://forum.myroundcube.com/index.php?app=core&module=global§ion=register', 'target' => '_blank'), 'on joining') . ' at MyRoundcube\'s community forum.') . html::tag('br') . + ($this->svn ? ('
' . html::tag('span', null, 'Download stable versions of plugins for Roundcube ' . $this->dev) . ' ' . html::tag('input', array('class' => 'branch', 'onclick' =>'$("#mirrorhost").html("' . $this->svn . '")', 'type' => 'radio', 'checked' => $devchecked, 'name' => '_branch', 'id' => 'devbranch', 'value' => 'dev'))) : '') . + ($this->beta ? ('
' . html::tag('span', null, 'Download beta versions of plugins for Roundcube ' . $this->dev_beta) . ' (developement in progress) ' . html::tag('input', array('class' => 'branch', 'onclick' =>'$("#mirrorhost").html("' . $this->beta . '")', 'type' => 'radio', 'checked' => $betachecked, 'name' => '_branch', 'id' => 'betabranch', 'value' => 'beta'))) : ''). + ($this->mirror ? ('
' . html::tag('span', null, 'Download stable plugins for Roundcube ' . $this->stable) . ' (developemnet frozen) ' . html::tag('input', array('class' => 'branch', 'onclick' =>'$("#mirrorhost").html("' . $this->mirror . '")', 'type' => 'radio', 'checked' => $stablechecked, 'name' => '_branch', 'id' => 'stablebranch', 'value' => 'stable'))) : '') + ) . + html::tag('div', array('style' => 'display:none;', 'id' => 'newletterdetails'), '
' . html::tag('span', null, 'First Name: ') . html::tag('input', array('type' => 'text', 'name' => '_firstname', 'id' => 'firstname', 'maxlength' => 30)) . '

' . + html::tag('span', null, 'Last Name: ') . html::tag('input', array('type' => 'text', 'name' => '_lastnamename', 'id' => 'lastname', 'maxlength' => 30)))) . + '

' . html::tag('a', array('href' => './?_task=settings&_framed=1&_action=plugin.plugin_manager_update', 'onclick' => 'return backup(this);', 'target' => '_self'), 'I agree') . ' | ' . + html::tag('a', array('href' => '#', 'onclick' => 'document.location.href="plugins/plugin_manager/skins/larry/myroundcube.html";parent.$("#rcmrowplugin_manager_update").remove()'), "I disagree") + ); + $out .= html::tag('div', array('style' => 'margin-left: auto; margin-right: auto; width: 600px; padding: 15px;'), $form); + ksort($scope); + $out .= html::tag('div', array('style' => 'margin-left: auto; margin-right: auto; width: 900px;'), html::tag('center', null, html::tag('textarea', array('cols' => 90, 'rows' => 20, 'disabled' => true), print_r($scope, true)))); + $this->rcmail->output->add_script('$(document).ready(function(){$("#tabsbar").hide()});'); + return $out; + } + if(get_input_value('_newsletter', RCUBE_INPUT_GET) == 1 && strtolower($this->get_demo($_SESSION['username'])) != strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $params = array('_hl' => $_SESSION['language'], '_admin' => $user, '_plugins' => serialize($scope), '_newsletter' => get_input_value('_newsletter', RCUBE_INPUT_GET), '_firstname' => get_input_value('_firstname', RCUBE_INPUT_GET), '_lastname' => get_input_value('_lastname', RCUBE_INPUT_GET)); + } + else{ + $params = array('_hl' => $_SESSION['language'], '_admin' => $user, '_plugins' => serialize($scope)); + } + $branch = get_input_value('_branch', RCUBE_INPUT_GET); + if($branch == 'dev'){ + $host = $this->svn; + } + else if($branch == 'stable'){ + $host = $this->mirror; + } + else{ + $host = $this->beta; + } + $httpConfig['method'] = 'POST'; + $httpConfig['target'] = $host . '?_action=plugin.plugin_server_mirror'; + $httpConfig['timeout'] = '30'; + $httpConfig['params'] = array_merge($params, array('_customer_id' => $this->rcmail->config->get('customer_id'))); + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + if($http->error){ + return html::tag('div', + array('style' => 'opacity: 0.85; text-align: center; margin-left: auto; margin-right: auto; width: 600px; padding: 8px 10px 8px 46px; background: url(./skins/classic/images/display/icons.png) 6px -97px no-repeat; background-color: #EF9398; border: 1px solid #DC5757;'), + $this->gettext('connectionerror') . '

' . html::tag('a', array('href' => './?_task=settings&_framed=1&_action=plugin.plugin_manager_update', 'target' => '_self'), $this->gettext('trylater'))); + } + $response = $http->result; + if(!$server = unserialize($response)){ + return html::tag('div', + array('style' => 'opacity: 0.85; text-align: center; margin-left: auto; margin-right: auto; width: 600px; padding: 8px 10px 8px 46px; background: url(./skins/classic/images/display/icons.png) 6px -97px no-repeat; background-color: #EF9398; border: 1px solid #DC5757;'), + $this->gettext('connectionerror') . '

' . html::tag('a', array('href' => './?_task=settings&_framed=1&_action=plugin.plugin_manager_update', 'target' => '_self'), $this->gettext('trylater'))); + } + $mirror_rc = $server['roundcube']; + $mirror = $server['scope']; + if(!isset($mirror['Branch is currently closed'])){ + $merge = array(); + foreach($dtp as $plugin => $props){ + if(!isset($mirror[$plugin])){ + $merge[$plugin] = $dtp[$plugin]; + } + } + ksort($merge); + $mirror = array_merge($mirror, $merge); + } + $temp = $mirror; + unset($mirror['plugin_manager']); + if(!isset($mirror['Branch is currently closed'])){ + $ret = array(); + $ret['Roundcube Core Patches'] = $this->core_patches; + $ret['plugin_manager'] = $temp['plugin_manager']; + foreach($mirror as $plugin => $props){ + $ret[$plugin] = $mirror[$plugin]; + } + $mirror = $ret; + } + $update = array(); + if(is_array($mirror)){ + foreach($mirror as $plugin => $props){ + if(is_array($props)){ + if($scope[$plugin] && $props['version']){ + if($props['version'] > $scope[$plugin]['version']){ + $update[$plugin] = $scope[$plugin]; + if(is_array($update[$plugin])){ + $update[$plugin]['notinstalled'] = false; + } + } + } + else{ + $update[$plugin] = $props; + if(is_array($update[$plugin])){ + $update[$plugin]['notinstalled'] = true; + } + } + } + else{ + $update[$plugin] = $scope[$plugin]; + if(is_array($update[$plugin])){ + $update[$plugin]['notinstalled'] = false; + } + } + } + } + $checked = false; + foreach($update as $plugin => $props){ + if(is_array($props)){ + $checked = true; + break; + } + } + include './program/localization/index.inc'; + $options = ''; + ksort($rcube_languages); + foreach($rcube_languages as $abbr => $lang){ + $options .= html::tag('option', array('title' => $lang, 'selected' => ($_SESSION['language'] == $abbr)?true:false, 'value' => $abbr), $abbr); + } + $select = html::tag('select', array('onchange' => 'document.location.href="./?_task=settings&_framed=1&_action=plugin.plugin_manager_update&_branch=dev&_hl=" + this.value'), $options); + $thead = html::tag('tr', null, + html::tag('th', array('width' => '220px'), $this->gettext('plugin')) . + html::tag('th', array('width' => '100px'), $this->gettext('mirrorversion')) . + html::tag('th', array('width' => '100px'), $this->gettext('serverversion')) . + html::tag('th', array('width' => '90px', 'title' => $this->gettext('language')), $select) . + html::tag('th', array('width' => '90px'), html::tag('a', array('href' => 'http://code.google.com/p/myroundcube/issues/list', 'target' => '_blank'), $this->gettext('issue'))) . + html::tag('th', array('width' => '30px', 'title' => $this->gettext('hideuptodate')), html::tag('input', array('type' => 'checkbox', 'id' => 'updatetoggle'))) . + html::tag('th', array('width' => '30px'), html::tag('input', array('id' => 'toggle', 'title' => $this->gettext('toggle'), 'type' => 'checkbox', 'checked' => $checked))) . + html::tag('th', null, $this->gettext('comments')) + ); + $tbody1 = ''; + $tbody2 = ''; + $cdlcredits = $server['credits']; + $cdlprice = 0; + foreach($mirror as $plugin => $props){ + if(in_array($plugin, $this->dontlist)){ + continue; + } + if(substr($plugin, 0, 6) == 'hmail_'){ + if(!$this->use_hmail){ + continue; + } + } + $nr = false; + if(is_array($props) && $props['version']){ + $stat = 'ok'; + $comment = ''; + $append = ''; + if($update[$plugin]){ + $stat = 'update'; + } + if($props['lr']){ + if(file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/localization/revision.inc.php')){ + $ps_localization_update = false; + $A = false; + include INSTALL_PATH . 'plugins/' . $plugin . '/localization/revision.inc.php'; + if(!$ps_localization_update){ + $ps_localization_update = $A; + } + if($ps_localization_update != $props['lr'] && $props['version'] == $scope[$plugin]['version']){ + $stat = 'update'; + $comment .= $this->gettext('languageupdate') . "
" . $this->gettext('localizationfilesonly') . "\r\n"; + } + } + } + if($props['roundcube']){ + if($props['roundcube'] > RCMAIL_VERSION){ + $stat = 'error'; + } + } + if($props['license']){ + $license = $this->gettext('terms') . ": " . html::tag('a', array('href' => $this->svn . '?_action=plugin.plugin_server_license&_plugin=' . $plugin, 'target' => '_blank', 'title' => $this->gettext('view')), $props['license']); + } + else{ + $license = false; + } + if($props['comments']){ + $props['comments'] = $this->gettext('authors_comments') . ': ' . $this->comment2ul($props['comments']); + } + $comment .= nl2br($props['comments']); + $pmsv = $scope[$plugin]['version']; + $t = explode('-', $pmsv); + $pmsv = $t[0]; + $pmcv = $props['version']; + $t = explode('-', $pmsc); + $pmsc = $t[0]; + $tmsv = explode('.', $pmsv); + $tmcv = explode('.', $pmcv); + foreach($tmsv as $tmsvk => $tmsvp){ + while(strlen($tmsvp) < $this->vlength){ + $tmsvp = '0'. $tmsvp; + } + $tmsv[$tmsvk] = $tmsvp; + } + foreach($tmcv as $tmcvk => $tmcvp){ + while(strlen($tmcvp) < $this->vlength){ + $tmcvp = '0'. $tmcvp; + } + $tmcv[$tmcvk] = $tmcvp; + } + $s = implode('.', $tmsv); + $p = implode('.', $tmcv); + if($p < $s && is_numeric(substr($scope[$plugin]['version'], 0, 1))){ + $stat = 'error'; + $comment = $this->gettext('servernewer'); + } + else if(!is_numeric(substr($scope[$plugin]['version'],0, 1))){ + if(is_dir(INSTALL_PATH . 'plugins/' . $plugin) && $plugin != 'dblog' && $this->require_plugin($plugin)){ + if(method_exists($plugin, 'about')){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $plugin(false); + $arr = $class->about(array('version', 'date')); + $scope[$plugin] = $arr; + $update[$plugin] = $scope[$plugin]; + $update[$plugin]['notinstalled'] = false; + $pmsv = $scope[$plugin]['version']; + $t = explode('-', $pmsv); + $pmsv = $t[0]; + $tmsv = explode('.', $pmsv); + foreach($tmsv as $tmsvk => $tmsvp){ + while(strlen($tmsvp) < $this->vlength){ + $tmsvp = '0'. $tmsvp; + } + $tmsv[$tmsvk] = $tmsvp; + } + $s = implode('.', $tmsv); + if($p == $s){ + $nr = true; + } + else{ + $nr = false; + } + if($p < $s && is_numeric(substr($scope[$plugin]['version'],0,1))){ + $stat = 'error'; + $comment = $this->gettext('servernewer'); + } + } + else{ + $scope[$plugin]['version'] = 'unknown'; + } + } + else{ + $scope[$plugin]['version'] = 'unknown'; + } + if($comment != '' && $stat != 'error'){ + $stat = 'edit'; + } + else if($stat != 'error'){ + $stat = 'update'; + } + } + else if($p > $s && $comment != ''){ + $stat = 'edit'; + } + else if($p > $s){ + $stat = 'update'; + } + else if (is_array($update[$plugin]) && $stat != 'error'){ + $comment = $this->gettext('justunzip') . '
' . html::tag('a', array('href' => $this->guide, 'target' => '_blank'), $this->gettext('guide'));; + } + $roundcube = ''; + if($props['roundcube']){ + $roundcube = 'Roundcube Version: ' . $props['roundcube'] . ' ' . $this->gettext('orhigher') . "\r\n"; + } + $php = ''; + if($props['PHP']){ + $php = 'PHP: ' . $props['PHP'] . "\r\n"; + $phpversion = phpversion(); + $temparr = explode('-', $phpversion); + if($props['PHP'] >= $temparr[0]){ + $stat = 'error'; + } + } + $required_plugins = ''; + if(is_array($props['requires'])){ + $required_plugins = $this->gettext('requires') . ':
'; + foreach($props['requires'] as $key => $val){ + $method = '²'; + if($val['method'] && $val['method'] == 'require_plugin'){ + $method = '¹'; + } + $required_plugins .= '- '.html::tag('a', array('href' => '#' . $key, 'class' => 'anchorLink'), $key) . $method . '
'; + } + $required_plugins = substr($required_plugins, 0, strlen($required_plugins) - 2) . "\r\n"; + } + $recommended_plugins = ''; + if(is_array($props['recommended'])){ + $recommended_plugins = $this->gettext('recommended') . ':
'; + foreach($props['recommended'] as $key => $val){ + $recommended_plugins .= '- '.html::tag('a', array('href' => '#' . $key, 'class' => 'anchorLink'), $key) . '²
'; + } + $recommended_plugins = substr($recommended_plugins, 0, strlen($recommended_plugins) - 2) . "\r\n"; + } + if(is_array($props['required'])){ + $requiredby = ''; + foreach($props['required'] as $key){ + $requiredby .= '- '.html::tag('a', array('href' => '#' . $key, 'class' => 'anchorLink'), $key) . '
'; + } + $requiredby = substr($requiredby, 0, strlen($requiredby) - 2) . "\r\n"; + $comment = $this->gettext('requiredby') . ':
' . $requiredby . "\r\n" . $comment; + } + $temparr = explode("\r\n", $roundcube . $php . $required_plugins . $recommended_plugins . $comment); + $comments = ''; + foreach($temparr as $r){ + if($r) + $comments .= html::tag('li', null, $r); + } + if($comments != '' && $plugin != 'Roundcube Core Patches' && $plugin != 'Branch is currently closed'){ + $changelog = html::tag('li', null, html::tag('a', array('href' => $this->svn . '?_action=plugin.plugin_server_changelog&_plugin=' . $plugin, 'target' => '_blank', 'title' => $this->gettext('view')), 'CHANGELOG')); + $comment = html::tag('ul', array('class' =>'pm_update'), ($license ? html::tag('li', null, $license) : '') . $changelog . $comments); + } + if($update[$plugin]['notinstalled']){ + if(is_dir('./plugins/' . $plugin)){ + $serverversion = html::tag('td', null, $this->gettext('notregistered')); + } + else{ + if($plugin == 'Roundcube Core Patches'){ + if($content = @file_get_contents(INSTALL_PATH . '.myrc.patch_version')){ + $content = explode('|', trim($content)); + $serverversion = html::tag('td', null, $content[0] . html::tag('br') . html::tag('small', null, '(' . date($this->rcmail->config->get('date_format', 'm-d-Y'), strtotime($content[1])) . ')')); + if($mirror[$plugin]['version'] . $mirror[$plugin]['date'] != $content[0] . $content[1]){ + $stat = 'edit'; + } + else{ + $stat = 'ok'; + } + } + else{ + $serverversion = html::tag('td', null, $this->gettext('notinstalled')); + } + } + else if($plugin == 'Branch is currently closed'){ + $stat = 'ok'; + $serverversion = html::tag('td', null, '--'); + } + else{ + $serverversion = html::tag('td', null, $this->gettext('notinstalled')); + } + } + } + else{ + $content = ($update[$plugin]?$update[$plugin]['version']:$scope[$plugin]['version']) . '
' . html::tag('small', null, '(' . ($update[$plugin] ? date($this->rcmail->config->get('date_format', 'm-d-Y'), strtotime($scope[$plugin]['date'])):date($this->rcmail->config->get('date_format', 'm-d-Y'), strtotime($scope[$plugin]['date']))) . ')'); + if(substr($content, 0, 1) == 'u'){ + $serverversion = html::tag('td', null, $this->gettext('unknown')); + } + else{ + $serverversion = html::tag('td', null, $content); + } + } + $translation = html::tag('td', array('align' => 'center'), '--'); + $user = $this->rcmail->config->get('plugin_manager_translation_account') ? $this->rcmail->config->get('plugin_manager_translation_account') : $_SESSION['username']; + if($mirror[$plugin]['lc'] !== false){ + $host = $_SESSION['storage_host']; + if($host == 'localhost') + $host = $_SERVER['SERVER_ADDR']; + if(!$host) + $host = $_SERVER['HTTP_HOST']; + $host = ($_SESSION['storage_ssl'] ? 'ssl://' : '') . $host . ':' . $_SESSION['storage_port']; + $port = $_SESSION['storage_port'] ? $_SESSION['storage_port'] : $this->rcmail->config->get('default_port'); + if($host = $this->rcmail->config->get('plugin_manager_translation_server')){ + $temp = parse_url($host); + $port = $temp['port'] ? $temp['port'] : $port; + } + $translation = html::tag('td', array('align' => 'right', 'title' => $plugin . ' :: ' . $this->gettext('translate') . '...'), html::tag('a', array('target' => '_blank', 'href' => $this->mirror . '?_action=plugin.plugin_server_translate&_hl=' . $_SESSION['language'] . '&_plugin=' . $plugin . '&_translator=' . $user . '&_host=' . $host . '&_port=' . $port), ($mirror[$plugin]['lc'] * 100)) . ' %'); + } + $db = $this->rcmail->config->get('db_dsnw'); + $db = parse_url($db); + $db = $db['scheme']; + $onclick = ''; + if(strtolower($this->get_demo($user)) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $onclick = 'return false'; + } + $dlprice = 0; + if($p > $s || substr($s, 0, 5) == '0000u'){ + $dlprice = $mirror[$plugin]['prices'][0]; + $background = 'lightgreen'; + if(is_dir(INSTALL_PATH . 'plugins/' . $plugin)){ + if($plugin == 'dblog'){ + $dlprice = $mirror[$plugin]['prices'][1]; + $v = explode('.', $scope[$plugin]['version']); + $mv = explode('.', $mirror[$plugin]['version']); + if(($v[1] == 0 && count($mv) == 2) || $v[0] < $mv[0]){ + $dlprice = $mirror[$plugin]['prices'][1]; + $background = 'lightblue'; + } + else if($v[0] == $mv[0] && $v[1] < $mv[1]){ + $dlprice = $mirror[$plugin]['prices'][2]; + $background = 'yellow'; + } + else{ + $dlprice = 0; + $background = 'none'; + } + } + else if($this->require_plugin($plugin)){ + $dlprice = $mirror[$plugin]['prices'][1]; + $v = explode('.', $scope[$plugin]['version']); + $mv = explode('.', $mirror[$plugin]['version']); + if(($v[1] == 0 && count($mv) == 2) || $v[0] < $mv[0]){ + $dlprice = $mirror[$plugin]['prices'][1]; + $background = 'lightblue'; + } + else if($v[0] == $mv[0] && $v[1] < $mv[1]){ + $dlprice = $mirror[$plugin]['prices'][2]; + $background = 'yellow'; + } + else{ + if(method_exists($plugin, 'about')){ + $dlprice = 0; + $background = 'none'; + } + } + } + } + } + if(!$dlprice){ + $background = 'none'; + } + if($nr){// && $scope[$plugin]['version'] + $stat = 'ok'; + } + $cdlprice = $cdlprice + $dlprice; + $prices = html::tag('td', array('style' => "background: lightgreen", 'title' => $this->gettext('initialdownload')), $mirror[$plugin]['prices'][0]); + $prices .= html::tag('td', array('style' => "background: lightblue", 'title' => $this->gettext('keyfeatureaddition')), $mirror[$plugin]['prices'][1]); + $prices .= html::tag('td', array('style' => "background: yellow", 'title' => $this->gettext('codeimprovements')), $mirror[$plugin]['prices'][2]); + $prices .= html::tag('td', null, '⇒'); + $prices .= html::tag('td', array('style' => "background: " . $background, 'title' => 'MyRC$ ' . $dlprice), 'MyRC$ ' . html::tag('span', array('id' => 'pmdlp_' . $plugin), $dlprice)); + $checked = ((is_array($update[$plugin]) && !$update[$plugin]['notinstalled'] && $stat != 'error' || $stat == 'edit' || $stat == 'update') && $stat != 'ok')?true:false; + $notinstalled = ''; + if(substr($scope[$plugin]['version'], 0, 1) == 'u'){ + $notinstalled = 'notinstalled '; + } + if($plugin == 'Roundcube Core Patches' || $plugin == 'Branch is currently closed'){ + $submitissue = html::tag('td', array('align' => 'center'), '--'); + $checkbox = html::tag('td', null, ' '); + } + else{ + $submitissue = html::tag('td', array('align' => 'center', 'title' => $plugin . ' :: ' . $this->gettext('submitissue')), html::tag('a', array('onclick' => $onclick, 'href' => 'http://code.google.com/p/myroundcube/issues/entry?summary=[' . $plugin . '] - Enter one-line summary&comment=Token:%20' . $server['token'] . "%20(Don't modify this token!)%0AVersion:%20" . $scope[$plugin]['version'] . " (" . $scope[$plugin]['date'] . ")%0APHP:%20" . phpversion() . '%0ARCMAIL:%20' . RCMAIL_VERSION . '%0ADatabase:%20' . $db . '%0ASERVER:%20' . $_SERVER['SERVER_SOFTWARE'] . '%0A----%0AI.%20%20Issue%20Description:%0A%0AII.%20Steps to reproduce the Issue:%0A1.%0A2.%0A3.', 'target' => '_blank'), $this->gettext('issue'))); + $checkbox = html::tag('td', array('align' => 'center'), html::tag('input', array('class' => 'chbox ' . $notinstalled . ($dlprice ? 'costs' : 'free'), 'value' => $plugin . '|' . ($scope[$plugin]['version'] ? $scope[$plugin]['version'] : '0') . '|' . $mirror[$plugin]['token'], 'type' => 'checkbox', 'checked'=> $checked, 'disabled' => ($stat != 'ok' && (is_array($update[$plugin]) && $stat != 'error' || $stat == 'edit' || $stat == 'update'))?false:true, 'name' => '_plugins[]', 'id' => 'chbox_' . asciiwords($plugin, false, '_'), null))); + } + $tbody1 .= html::tag('tr', null, + html::tag('td', array('id' => 'pmu_' . asciiwords($plugin, false, '_'), 'title' => $mirror[$plugin]['description']), html::tag('a', array('name' => '#' . $plugin, 'class' => 'anchorLink'), ' ') . $plugin . ($mirror[$plugin]['count'] ? ('
 ' . html::tag('small', array('title' => $mirror[$plugin]['count'] . ' ' . $this->gettext('downloads')), '(' . $mirror[$plugin]['count'] . ')')) : '') . ($dlprice ? '
' . html::tag('table', null, html::tag('tr', null, html::tag('td', null, 'MyRC$') . $prices)) : '')) . + html::tag('td', array('style' => 'background:' . $background), $props['version'] . '
' . html::tag('small', null, '(' . date($this->rcmail->config->get('date_format', 'm-d-Y'), strtotime($props['date'])) . ')')) . + $serverversion . + $translation . + $submitissue . + html::tag('td', array('class' => $stat, 'title' => $plugin . ' :: ' . $this->gettext('update_' . $stat)), ' ') . + $checkbox . + html::tag('td', array('title' => $comment?($plugin . ' :: ' . $comment):''), $comment . $append) + ); + } + else{ + if(is_array($mirror[$plugin])){ + if(is_array($mirror[$plugin]['required'])){ + $comments = ''; + if($mirror[$plugin]['comments']){ + $comments = html::tag('li', null, $mirror[$plugin]['comments']); + } + $requiredby = ''; + foreach($mirror[$plugin]['required'] as $key){ + $requiredby .= '- '.html::tag('a', array('href' => '#' . $key, 'class' => 'anchorLink'), $key) . '
'; + } + $requiredby = substr($requiredby, 0, strlen($requiredby) - 2) . "\r\n"; + $mirror[$plugin]['comments'] = html::tag('ul', array('class' =>'pm_update'), $comments . html::tag('li', null, $this->gettext('requiredby') . ':
' . $requiredby)); + } + $tbody2 .= html::tag('tr', null, + html::tag('td', array('id' => 'pmu_' . $plugin, 'title' => $mirror[$plugin]['description']), html::tag('a', array('name' => '#' . $plugin), ' ') . $plugin) . + html::tag('td', array('title' => $plugin . ' :: ' . html::tag('a', array('href' => $mirror[$plugin]['download'], 'target' => '_blank'), $this->gettext('develsite')), 'colspan' => 2), ($mirror[$plugin] != 'unknown')?html::tag('a', array('href' => $mirror[$plugin]['download'], 'target' => '_blank'), $this->gettext('homepage')):$this->gettext($mirror[$plugin])) . + html::tag('td', array('align' => 'center'), '--') . + html::tag('td', array('align' => 'center'), '--') . + html::tag('td', array('align' => 'center', 'class' => 'thirdparty'), '--') . + html::tag('td', array('align' => 'center'), html::tag('input', array('title' => $plugin . ' :: ' . $this->gettext('thirdpartywarning'), 'class' => 'chbox', 'name' => '_plugins[]', 'value' => $plugin, 'type' => 'checkbox', 'checked'=> false))) . + html::tag('td', array('title' => $mirror[$plugin]['comments']?($plugin . ' :: ' . $mirror[$plugin]['comments']):''), $mirror[$plugin]['comments']) + ); + } + else{ + // ToDo: if link is missing: http://www.google.de/search?q=roundcube+fileapi_attachments + $tbody2 .= html::tag('tr', null, + html::tag('td', array('id' => 'pmu_' . $plugin), ' ' . $plugin) . + html::tag('td', array('colspan' => 2), ($mirror[$plugin] != 'unknown')?html::tag('a', array('href' => $mirror[$plugin], 'target' => '_blank', 'title' => $mirror[$plugin]), $mirror[$plugin]):$this->gettext($mirror[$plugin])) . + html::tag('td', array('align' => 'center'), '--') . + html::tag('td', array('align' => 'center'), '--') . + html::tag('td', array('align' => 'center'), '--') . + html::tag('td', array('align' => 'center'), html::tag('input', array('title' => $plugin . ' :: ' . $this->gettext('thirdpartywarning'), 'class' => 'chbox', 'value' => $plugin, 'type' => 'checkbox', 'checked'=> false))) . + html::tag('td', null,' ') + ); + } + } + } + $boxtitle = html::tag('div', array('id' => 'prefs-title-right'), $this->gettext('plugin_manager_center')); + $rctitle = 'rc_ok'; + $rcclass = 'rcok'; + $append = html::tag('span', array('class' => 'vmatch'), ' '.$this->gettext('rc_uptodate').' '); + if($mirror_rc > RCMAIL_VERSION){ + $rctitle = 'rc_update'; + $rcclass = 'rcupdate'; + $append = html::tag('span', array('class' => 'vupdate'), ' '.$this->gettext('rc_update').' ') . ' » ' . html::tag('a', array('href' => $this->rcurl, 'target' => '_blank'), $this->gettext('roundcubeurl')) . ' '; + } + else if($mirror_rc < RCMAIL_VERSION){ + $rctitle = 'rc_newer'; + $rcclass = 'rcerror'; + $append = html::tag('span', array('class' => 'vmismatch'), ' '.sprintf($this->gettext('nottested'), RCMAIL_VERSION).' '); + } + if($branch == 'beta'){ + $append .= html::tag('span', null, '
 
SECTION: MyRoundcube plugins beta branch
'); + } + else if($branch == 'dev'){ + $append .= html::tag('span', null, '
 
SECTION: MyRoundcube plugins stable branch
'); + } + else if($branch == 'stable'){ + $append .= html::tag('span', null, '
 
SECTION: MyRoundcube plugins frozen branch
'); + } + $rctitle = $this->gettext($rctitle); + $mirrorh = parse_url($this->mirror); + $db = $this->rcmail->config->get('db_dsnw'); + $db = parse_url($db); + $db = $db['scheme']; + $web = 'http' . ($_SERVER['HTTPS']?'s':'') . '://'. $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; + $user = $_SESSION['username']; + if(is_numeric($cdlcredits) && is_numeric($cdlprice)){ + $remaining = $cdlcredits - $cdlprice; + } + else{ + $remaining = 0; + } + $link = html::tag('a', array('onclick' => 'parent.location.href="./?_task=settings&_action=preferences&_buynow=1"', 'href' => '#'), $this->gettext('customer_account')); + $hmchecked = ''; + $otherchecked = 'checked'; + if($this->use_hmail){ + $hmchecked = 'checked'; + $otherchecked = ''; + } + if($this->admins[$this->rcmail->user->data['username']] == 0){ + $hmail = html::tag('span', null, 'IMAP-Server: ') . + html::tag('input', array('type' => 'radio', 'name' => 'hmailbackend', 'id' => 'yhmail', 'checked' => $hmchecked, 'onclick' => 'pm_hmail(false)')) . html::tag('span', null, html::tag('a', array('href' => 'http://www.hmailserver.com/', 'target' => '_blank'), 'hMailserver') . ' ') . + html::tag('input', array('type' => 'radio', 'name' => 'hmailbackend', 'id' => 'nhmail', 'checked' => $otherchecked, 'onclick' => 'pm_hmail(true)')) . html::tag('span', null, 'other') . ' ⇒ '; + } + else{ + $hmail = ''; + } + $credits = html::tag('div', array('style' => 'display:block; border:1px solid lightgrey; background:lightyellow; padding:2px 2px 2px 2px; width:99%;'), ' ' . $hmail . 'MyRC$ ' . + html::tag('span', array('id' => 'cdlcredits'), ($cdlcredits ? $cdlcredits : 0)) . ' (' . $this->gettext('credits') . ') − MyRC$ ' . html::tag('span', array('id' => 'cdlprice'), $cdlprice) . ' (' . $this->gettext('forthisdownload') . ') = ' . 'MyRC$ ' . html::tag('span', array('id' => 'cdlremaining'), $remaining) . ($remaining > 0 ? ' (' . $this->gettext('remainingcredits') . ')' : ' (' . $link . ')') + ); + $controls = html::tag('div', array('style' => 'display: inline; float: right; margin-right: 5px;'), html::tag('a', array('id' => 'buycreditslink', 'href' => './?_task=settings&_action=plugin.plugin_manager_buycredits', 'target' => '_blank'), $this->gettext('buynow'))) . + html::tag('div', array('style' => 'display: inline; float: right;'), html::tag('a', array('href' => '#', 'onclick' => 'pm_discard()'), $this->gettext('discardliabletopaycosts')) . ' | ' . html::tag('a', array('href' => '#', 'onclick' => 'pm_notinstalled()'), $this->gettext('unchecknotinstalledplugins')) . ' | '); + $zipbutton = $credits . html::tag('br') . html::tag('input', array('type' => 'submit', 'class' => 'button mainaction', 'value' => $this->gettext('ziparchive'))) . $controls; + /*$paypalbutton = html::tag('form', array('action' => "https://www.paypal.com/cgi-bin/webscr", 'method' => "post", 'target' => '_blank'), + html::tag('input', array('type' => "hidden", 'name' => "cmd", 'value' => "_s-xclick")) . + html::tag('input', array('type' => "hidden", 'name' => "hosted_button_id", 'value' => "37WMD9TBQXRNG")) . + html::tag('input', array('type' => "image", 'src' => "https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif", 'border' => "0", 'name' => "submit", 'alt' => "PayPal - The safer, easier way to pay online!")) . + html::tag('img', array('alt' => "", 'border' => "0", 'src' => "https://www.paypalobjects.com/en_US/i/scr/pixel.gif", 'width' => "1", 'height' => "1")) + );*/ + if(strtolower($this->get_demo($user)) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $zipbutton = $zipbutton = html::tag('input', array('type' => 'button', 'class' => 'button mainaction', 'value' => $this->gettext('demoaccount')));; + } + $formcontent = html::tag('div', array('id' => 'rcheader'), '
Roundcube: ' . $this->gettext('serverversion') . ' ' . RCMAIL_VERSION . ' » ' . $this->gettext('mirrorversion') . ' ' . $mirror_rc . ' » ' . $append . '
'); + $formcontent .= html::tag('p', null); + $formcontent .= html::tag('div', array('id' => 'table-container', 'style' => 'height:0px; overflow:auto; margin-right:10px;'), html::tag('table', array('id' => 'table', 'border' => 0, 'cellspacing' => 0, 'cellpadding' => 0), html::tag('thead', null, $thead) . html::tag('tbody', null, $tbody1 . $tbody2))); + $formcontent .= html::tag('div', array('id' => 'update_footer'), html::tag('p', null, null) . + $zipbutton . + html::tag('input', array('type' => 'button', 'onclick' => 'document.location.href="./?_task=settings&_framed=1&_action=plugin.plugin_manager_update&_warning=1"', 'class' => 'button', 'value' => $this->gettext('cancel'))) . + html::tag('br') . html::tag('div', array('class' => 'asterix'), '¹' . $this->gettext('donotregister') . '
²' . $this->gettext('register')) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_price', 'id' => 'pm_price', 'value' => '##placeholder##')) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_customer_id', 'value' => $this->rcmail->config->get('customer_id'))) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_admin', 'value' => $user)) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_serveradmin', 'value' => $_SERVER['SERVER_ADMIN'])) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_newsletter', 'value' => get_input_value('_newsletter', RCUBE_INPUT_GPC))) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_branch', 'value' => get_input_value('_branch', RCUBE_INPUT_GPC))) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_firstname', 'value' => urldecode(get_input_value('_firstname', RCUBE_INPUT_GPC)))) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_lastname', 'value' => urldecode(get_input_value('_lastname', RCUBE_INPUT_GPC)))) . + /*html::tag('input', array('type' => 'hidden', 'name' => '_pm_self', 'value' => $web)) .*/ + html::tag('input', array('type' => 'hidden', 'name' => '_pm_serverip', 'value' => $server['ip'])) . + /*html::tag('input', array('type' => 'hidden', 'name' => '_pm_servername', 'value' => $_SERVER['SERVER_NAME'])) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_serverport', 'value' => $_SERVER['SERVER_PORT'])) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_serverprotocol', 'value' => $_SERVER['SERVER_PROTOCOL'])) .*/ + html::tag('input', array('type' => 'hidden', 'name' => '_pm_serversoftware', 'value' => $_SERVER['SERVER_SOFTWARE'])) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_rcmail', 'value' => RCMAIL_VERSION)) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_version', 'value' => self::$version)) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_db', 'value' => $db)) . + html::tag('input', array('type' => 'hidden', 'name' => '_pm_php', 'value' => phpversion())) . + html::tag('p', null, null) + ); + $formfooter = html::tag('div', array('id' => 'formfooter'), html::tag('div', array('class' => 'footerleft'), html::tag('form', array('name' => 'form', 'onsubmit' => 'return pmf();', 'method' => 'post', 'action' => str_ireplace('http:', 'https:', $this->mirror) . '?_action=plugin.plugin_server_request&_hl=' . $_SESSION['language']), $formcontent))); + $formfooter .= html::tag('script', array('type' => 'text/javascript'), '$("body").hide();'); + $this->rcmail->output->add_label( + 'plugin_manager.creditsupdated' + ); + $paypalbutton = html::tag('a', array('href' => 'http://myroundcube.com/#contact', 'target' => '_blank'), 'MyRoundcube ' . $this->gettext('support')); + $this->rcmail->output->add_script('if(screen.width < 1300){$(".pm_update").html("..."); $("#settings-sections").hide();$("#pluginbody").css("left", "5px")}', 'docready'); + return html::tag('div', array('id' =>'prefs-box', 'style' => 'width: 100%; overflow: auto;'), $boxtitle . $formfooter) . html::tag('div', array('id' => 'paypalcontainer'), html::tag('div', array('id' => 'paypal'), $paypalbutton)); + } + + function getcredits($ajax = true){ + $params = array('_customer_id' => $this->rcmail->config->get('customer_id')); + $httpConfig['method'] = 'POST'; + $httpConfig['target'] = str_replace('buycredits', 'getcredits', $this->billingurl); + $httpConfig['timeout'] = '30'; + $httpConfig['params'] = $params; + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + if($http->error){ + $response = false; + } + else{ + $response = $http->result; + } + if($response == '-0'){ + unset($httpConfig['params']); + $httpConfig['method'] = 'GET'; + $httpConfig['target'] .= '&_customer_id=' . $this->rcmail->config->get('customer_id'); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + if($http->error){ + $response = false; + } + else{ + $response = $http->result; + } + } + if($ajax) + $this->rcmail->output->command('plugin.plugin_manager_getcredits', $response); + else + return $response; + } + + function buycredits(){ + $params = array( + '_customer_id' => $this->rcmail->config->get('customer_id'), + '_clientip' => $_SERVER['REMOTE_ADDR'], + '_serverip' => $_SERVER['SERVER_ADDR'] + ); + $httpConfig['method'] = 'POST'; + $httpConfig['target'] = $this->billingurl; + $httpConfig['timeout'] = '30'; + $httpConfig['params'] = $params; + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + if($http->error){ + $this->rcmail->output->send('plugin_manager.error'); + } + else{ + $url = explode('?', $this->billingurl, 2); + $url = slashify($url[0]); + $page = $http->result; + $page = str_replace('href="plugins/', 'href="' . $url . 'plugins/', $page); + $page = str_replace('src="skins/', 'src="' . $url . 'skins/', $page); + $page = str_replace(' 0)){ + $code = ''; + foreach($sconfig as $key => $val){ + if(strpos($conf['conf'], '$config[\'' . $key . '\']') === false){ + if($comment = $scomments[$key]){ + $code .= "\r\n" . '/* ' . $comment . ' */' . "\r\n"; + } + $code .= '$config[\'' . $key . '\'] = ' . var_export($val, true) .';' . "\r\n"; + } + } + if($code){ + $prepend = '/*---- New configuration parameters since last saving ----*/' . "\r\n\r\n" . + $code . "\r\n" . + '/*----------------------------------------------------------*/' . "\r\n\r\n" . + '/* Begin currently saved parameters */' . "\r\n\r\n"; + } + } + $_POST['_save_config'] = ""; + } + else{ + if(file_exists(INSTALL_PATH . 'plugins/global_config/config.inc.php')){ + include INSTALL_PATH . 'plugins/global_config/config.inc.php'; + if(is_array($rcmail_config)){ + $global_config = $rcmail_config; + $rcmail_config = array(); + } + else{ + $global_config = $config; + $config = array(); + } + } + $source = './plugins/' . $plugin . '/config.inc.php.dist'; + $conf = file_get_contents(INSTALL_PATH . 'plugins/' . $plugin . '/config.inc.php.dist'); + if($plugin == 'register'){ + if($driver = $this->rcmail->config->get('register_driver')){ + if(file_exists(INSTALL_PATH . 'plugins/register/drivers/' . $driver . '/config.inc.php.dist')){ + $source = ', ./plugins/' . $plugin . 'drivers/' . $driver . '/config.inc.php.dist'; + $conf .= file_get_contents(INSTALL_PATH . 'plugins/register/drivers/' . $driver . '/config.inc.php.dist'); + $conf = str_replace('?>rcmail->config->get('register_driver')){ + if(file_exists(INSTALL_PATH . 'plugins/register/drivers/' . $driver . '/config.inc.php')){ + $source = ', ./plugins/' . $plugin . 'drivers/' . $driver . '/config.inc.php'; + include INSTALL_PATH . 'plugins/register/drivers/' . $driver . '/config.inc.php'; + } + } + } + if(file_exists(INSTALL_PATH . 'plugins/global_config/config.inc.php')){ + include INSTALL_PATH . 'plugins/global_config/config.inc.php'; + } + foreach($config as $key => $val){ + if(isset($global_config[$key])){ + $source = './plugins/global_config/config.inc.php'; + } + $conf = preg_replace('/\n\$config\[\'' . $key . '\'\] = \$/s', "\n" . '//***$config[' . "'" . $key . "'" . '] = $', $conf); + if(isset($config[$key])){ + $conf = preg_replace('/\n\$config\[\'' . $key . '\'\](.+?);(\r|\n)/s', "\n" . '$config[' . "'" . $key . "'" . '] = ' . var_export($config[$key], true) . ';', $conf); + } + } + $conf = str_replace("\n" . '//***$config[', "\n" . '$config[', $conf); + $_POST['_save_config'] = $conf; + } + } + $this->show($source, 'edit', $admin); + } + } + + function check_syntax($conf = false){ + $test = "if(0){\n" . $conf . "\n}"; + @ini_set('log_errors', false); + @ini_set('display_errors', true); + ob_start(); + eval($test); + $error = str_replace(': eval()\'d code ', '', strip_tags(ob_get_clean())); + ob_end_clean(); + return $error; + } + + function save_config(){ + if($this->config_permissions){ + $plugin = get_input_value('_plugin', RCUBE_INPUT_POST); + $source = get_input_value('_source', RCUBE_INPUT_POST); + $conf = trim($_POST['_save_config']); + $conf = str_replace('+', '__plus__', $conf); + $conf = urldecode($conf); + $conf = str_replace('__plus__', '+', $conf); + $conf = str_replace('/*---- New configuration parameters since last saving ----*/' . "\n\n", '', $conf); + $conf = str_replace('/*----------------------------------------------------------*/' . "\n\n", '', $conf); + $conf = str_replace('/* Begin currently saved parameters */' . "\n\n", '', $conf); + $conf = explode("\n", $conf); + if(strtolower(trim($conf[count($conf) -1])) == '?>'){ + unset($conf[count($conf) -1]); + } + if(strtolower(trim($conf[0])) == 'check_syntax($conf); + if($error){ + $conf = str_replace("\\'", '"', $conf); + $error = $this->check_syntax($conf); + } + if(!$error){ + $sql = 'DELETE FROM ' . get_table_name('db_config') . ' WHERE ' . $this->q('env') . '=?'; + $this->rcmail->db->query($sql, $plugin); + $sql = 'INSERT INTO ' . get_table_name('db_config') . '(' . $this->q('env') . ', ' . $this->q('conf') . ', ' . $this->q('admin') . ') VALUES (?, ?, ?)'; + $this->rcmail->db->query($sql, $plugin, $conf, $this->rcmail->user->data['username']); + $this->rcmail->output->command('plugin.plugin_manager_save_config', array($this->gettext('successfullysaved'), 'confirmation')); + } + else{ + $this->rcmail->output->command('plugin.plugin_manager_save_config', array($error, 'error')); + } + } + else{ + $this->rcmail->output->command('plugin.plugin_manager_save_config', array($this->gettext('errorsaving'), 'error')); + } + } + + function show($source = false, $mode = 'edit', $admin = false){ + $plugin = get_input_value('_plugin', RCUBE_INPUT_GPC); + if(!$source){ + if(file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/config.inc.php.dist')){ + $source = './plugins/' . $plugin . '/config.inc.php.dist'; + } + } + if(strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $this->out = html::tag('h3', null, '  Access denied (Demo Account)') . + html::tag('div', array('style' => 'float: left;'), '  [' . html::tag('a', array('href' => './?_task=settings&_action=edit-prefs&_section=plugin_manager_settings&_framed=1&_expand=' . $plugin), $this->gettext('back')) . ']'); + } + else if($plugin){ + $GLOBALS['codemirror'] = array( + 'mode' => 'PHP', + 'elem' => 'code', + 'readonly' => false, + 'buttons' => '["save", "undo", "redo", "jump", "search"]', + 'save' => 'function(){document.getElementById("code").value = editor.mirror.getValue(); rcmail.http_post("plugin.plugin_manager_save_config", "_plugin=' . $plugin . '&_save_config=" + urlencode($("#code").val()));}', + ); + $this->require_plugin('codemirror_ui'); + if(isset($_POST['_save_config'])){ + $content = trim($_POST['_save_config']); + } + else{ + $content = file_get_contents(INSTALL_PATH . 'plugins/' . $plugin . '/config.inc.php.dist'); + if($plugin == 'register'){ + if($driver = $this->rcmail->config->get('register_driver')){ + if(file_exists(INSTALL_PATH . 'plugins/register/drivers/' . $driver . '/config.inc.php.dist')){ + $content .= file_get_contents(INSTALL_PATH . 'plugins/register/drivers/' . $driver . '/config.inc.php.dist'); + $content = str_replace('?> './?_task=settings&_action=plugin.plugin_manager_restore_config&_framed=1&_plugin=' . $plugin), $this->gettext('restoredefaults')) . ']'; + } + else{ + $action = ' [' . html::tag('a', array('href' => './?_action=plugin.plugin_manager_edit_config&_framed=1&_plugin=' . $plugin), $this->gettext('edit')) . ']'; + } + if(in_array($plugin, $this->nodocs)){ + $instructions = html::tag('div', array('style' => 'float: left;'), + ' [' . html::tag('a', array('target' => '_blank', 'href' => 'http://myroundcube.com/myroundcube-plugins#' . $plugin), $this->gettext('instructions')) . ']'); + + } + else if(isset($this->docsmap[$plugin])){ + $instructions = html::tag('div', array('style' => 'float: left;'), + ' [' . html::tag('a', array('target' => '_blank', 'href' => 'http://myroundcube.com/myroundcube-plugins/' . $this->docsmap[$plugin]), $this->gettext('instructions')) . ']'); + } + else{ + $instructions = html::tag('div', array('style' => 'float: left;'), + ' [' . html::tag('a', array('target' => '_blank', 'href' => 'http://myroundcube.com/myroundcube-plugins/' . $plugin . '-plugin'), $this->gettext('instructions')) . ']'); + } + $this->include_script('plugin_manager.js'); + $this->out = html::tag('form', array('method' => 'post', 'name' => 'form', 'action' => './?_task=settings&_action=plugin.plugin_manager_save_config&_framed=1'), + html::tag('div', array('style' => 'position:absolute; top: 20px; bottom: 20px; left: 20px; right: 20px;'), + html::tag('div', array('style' => 'float: left;'), $this->gettext('plugin') . ': ' . $plugin) . + html::tag('div', array('style' => 'float: right;', 'id' => 'source'), ($source ? ($this->gettext('source') . ': ') : '') . ($source == 'database' ? $this->gettext('database') : $source) . ($admin ? html::tag('small', null, html::tag('span', null, ' (' . $this->gettext('configuredby') . ' ' . $admin . ')')) : '')) . + html::tag('input', array('name' => '_plugin', 'type' => 'hidden', 'value' => $plugin)) . + html::tag('input', array('name' => '_source', 'type' => 'hidden', 'value' => $source)) . + html::tag('br') . + html::tag('textarea', array('style' => 'width: 100%; height: 95%', 'name' => '_save_config', 'id' => 'code'), + $content + ) . + html::tag('br') . + html::tag('div', array('style' => 'float: left;'), + $instructions . + $action . + ' [' . html::tag('a', array('href' => './?_task=settings&_action=edit-prefs&_section=plugin_manager_settings&_framed=1&_expand=' . $plugin), $this->gettext('back')) . ']') + ) + ); + } + else{ + $GLOBALS['codemirror'] = array( + 'mode' => 'PHP', + 'elem' => 'code', + 'readonly' => true, + 'buttons' => '["jump", "search"]', + 'save' => 'function(){}', + ); + $this->require_plugin('codemirror_ui'); + $header = str_replace('##YEAR##', date('Y'), file_get_contents(INSTALL_PATH . 'plugins/plugin_manager/CONFIGHEADER')); + $example = file_get_contents(INSTALL_PATH . 'plugins/plugin_manager/EXAMPLE'); + $this->out = html::tag('div', array('style' => 'position:absolute; top: 20px; bottom: 20px; left: 20px; right: 20px;'), + html::tag('textarea', array('readonly' => true, 'style' => 'width: 100%; height: 95%', 'id' => 'code'), + "unauth, true) . ";\r\n\r\n" . + '/* Defaults */' . "\r\n" . + '$config[\'plugin_manager_defaults\'] = ' . + var_export($this->defaults, true) . ";\r\n?>" + ) . + html::tag('div', array('style' => 'float: right;'), '[' . html::tag('a', array('href' => './?_task=settings&_action=edit-prefs&_section=plugin_manager_settings&_framed=1'), $this->gettext('back')) . ']') + ); + } + $this->register_handler('plugin.body', array($this, 'sqlerror')); + $this->rcmail->output->send('plugin_manager.config'); + } + + function deny(){ + $customer_id = $this->rcmail->config->get('customer_id'); + $own_customer_id = $this->rcmail->config->get('own_customer_id'); + $a_prefs = array(); + $a_prefs['customer_id'] = $own_customer_id; + $a_prefs['shared_customer_id'] = $customer_id; + $this->rcmail->user->save_prefs($a_prefs); + header('Location: ./?_task=settings&_action=edit-prefs&_section=plugin_manager_customer&_framed=1'); + exit; + } + + function accept(){ + $customer_id = $this->rcmail->config->get('shared_customer_id'); + $a_prefs = array(); + $a_prefs['customer_id'] = $customer_id; + $this->rcmail->user->save_prefs($a_prefs); + header('Location: ./?_task=settings&_action=edit-prefs&_section=plugin_manager_customer&_framed=1'); + exit; + } + + function settings_link($args){ + $args['list']['plugin_manager'] = array( + 'id' => 'plugin_manager', + 'section' => $this->gettext('plugin_manager_title') + ); + $user = $_SESSION['username']; + $admins = $this->admins; + if(strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + if($this->rcmail->config->get('demo_target_group', 'admins') == 'admins'){ + $demo = true; + } + } + if((isset($admins[strtolower($user)]) && $admins[strtolower($user)] == 0 && file_exists(INSTALL_PATH . $this->rcmail->config->get('plugin_manager_hash') . '.myrc')) || $demo){ + $args['list']['plugin_manager_admins'] = array( + 'id' => 'plugin_manager_admins', + 'section' => $this->gettext('submenuprefix') . $this->gettext('manage_admins') + ); + } + if((isset($admins[strtolower($user)]) && file_exists(INSTALL_PATH . $this->rcmail->config->get('plugin_manager_hash') . '.myrc')) || $demo){ + $args['list']['plugin_manager_settings'] = array( + 'id' => 'plugin_manager_settings', + 'section' => $this->gettext('submenuprefix') . $this->gettext('settings') + ); + } + if(!$this->noremote && isset($admins[strtolower($user)]) || $demo){ + $args['list']['plugin_manager_update'] = array( + 'id' => 'plugin_manager_update', + 'section' => $this->gettext('submenuprefix') . $this->gettext('update_plugins') + ); + if(!$demo){ + $args['list']['plugin_manager_customer'] = array( + 'id' => 'plugin_manager_customer', + 'section' => $this->gettext('submenuprefix') . $this->gettext('customer_account') + ); + if(!$this->rcmail->config->get('customer_id')){ + $customer_id = $this->getCustomerID(); + if(is_string($customer_id) && strlen($customer_id) == 32){ + $a_prefs['customer_id'] = $customer_id; + $this->rcmail->user->save_prefs($a_prefs); + } + } + $customer_id = $this->rcmail->config->get('customer_id'); + if($_GET['_buynow'] || !$customer_id){ + if(!$customer_id){ + $customer_id = $this->getCustomerID(); + $arr['customer_id'] = $customer_id; + $this->rcmail->user->save_prefs($arr); + $this->rcmail->output->add_script('rcmail.display_message("' . $this->gettext('getnew') . '", "notice");', 'docready'); + } + $this->rcmail->output->add_script('rcmail.sections_list.select("plugin_manager_customer");', 'docready'); + } + } + } + return $args; + } + + function bind(){ + if(isset($this->admins[strtolower($_SESSION['username'])]) && file_exists(INSTALL_PATH . $this->rcmail->config->get('plugin_manager_hash') . '.myrc')){ + $target = get_input_value('_target', RCUBE_INPUT_GET); + $section = get_input_value('_section', RCUBE_INPUT_GET); + if($section && $target){ + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'defaults_overwrite'); + $overwrite = $this->rcmail->db->fetch_assoc($res); + if(is_array($overwrite)){ + $defaults = unserialize($overwrite['value']); + if(is_array($defaults)){ + include INSTALL_PATH . 'plugins/plugin_manager/defaults.inc.php'; + $defaults[$section][$target]['protected'] = $config['plugin_manager_defaults'][$section][$target]['protected']; + $sql = 'UPDATE ' . get_table_name('plugin_manager') . ' SET ' . $this->q('value') . '=?, ' . $this->q('type') . '=? WHERE ' . $this->q('conf') . '=?'; + $this->rcmail->db->query($sql, serialize($defaults), 'array', 'defaults_overwrite'); + $this->rcmail->session->remove('plugin_manager_defaults'); + } + } + header('Location: ./?_task=settings&_action=edit-prefs&_section=plugin_manager_settings&_framed=1'); + exit; + } + } + } + + function unbind(){ + if(isset($this->admins[strtolower($_SESSION['username'])]) && file_exists(INSTALL_PATH . $this->rcmail->config->get('plugin_manager_hash') . '.myrc')){ + $target = get_input_value('_target', RCUBE_INPUT_GET); + $section = get_input_value('_section', RCUBE_INPUT_GET); + if($section && $target){ + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'defaults_overwrite'); + $overwrite = $this->rcmail->db->fetch_assoc($res); + if(!is_array($overwrite)){ + include INSTALL_PATH . 'plugins/plugin_manager/defaults.inc.php'; + $overwrite = $config['plugin_manager_defaults']; + } + else{ + $overwrite = unserialize($overwrite['value']); + if(!is_array($overwrite)){ + include INSTALL_PATH . 'plugins/plugin_manager/defaults.inc.php'; + $overwrite = $config['plugin_manager_defaults']; + } + } + $overwrite[$section][$target]['protected'] = false; + $sql = 'DELETE FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $this->rcmail->db->query($sql, 'defaults_overwrite'); + $sql = 'INSERT INTO ' . get_table_name('plugin_manager') . ' (' . $this->q('conf') . ', ' . $this->q('value') . ', ' . $this->q('type') . ') VALUES(?, ?, ?)'; + $this->rcmail->db->query($sql, 'defaults_overwrite', serialize($overwrite), 'array'); + $this->rcmail->session->remove('plugin_manager_defaults'); + header('Location: ./?_task=settings&_action=edit-prefs&_section=plugin_manager_settings&_framed=1'); + exit; + } + } + } + + function settings($args){ + // Do not run the section just for building the settings section link + if(!get_input_value('_framed', RCUBE_INPUT_GPC)){ + if($args['section'] == 'plugin_manager'){ + $skin = $this->rcmail->config->get('skin'); + if(!file_exists($this->home . '/skins/' . $skin . '/plugin_manager.css')) { + $skin = "classic"; + } + $this->include_stylesheet('skins/' . $skin . '/plugin_manager.css'); + } + if(substr($args['section'], 0, strlen('plugin_manager')) == 'plugin_manager'){ + if($args['section'] != 'plugin_manager'){ + $args['blocks'][$args['section']]['options'] = array( + 'title' => '', + 'content' => html::tag('div', array('id' => 'pm_dummy'), '') + ); + return $args; + } + } + } + if($args['section'] == 'plugin_manager'){ + $this->include_script('plugin_manager.js'); + $skin = $this->rcmail->config->get('skin'); + if(!file_exists($this->home . '/skins/' . $skin . '/plugin_manager.css')) { + $skin = "classic"; + } + $this->include_stylesheet('skins/' . $skin . '/plugin_manager.css'); + $args['blocks']['plugin_manager'] = array( + 'options' => array(), + 'name' => '' + ); + $this->merge_config(); + $content = ''; + $restore = array(); + $display_section = array(); + foreach($this->config as $section => $props) { + if(count($props) > 0){ + $li = array(); + foreach($props as $plugin => $prop){ + $show = true; + if($this->domain){ + if(is_array($prop['domains']) && count($prop['domains'] > 0)){ + $show = false; + foreach($prop['domains'] as $domain){ + if($this->domain == $domain){ + $show = true; + break; + } + } + } + if(is_array($prop['hosts']) && count($prop['hosts'] > 0)){ + $show = false; + foreach($prop['hosts'] as $host){ + if($this->host == strtolower($host)){ + $show = true; + break; + } + } + } + if($prop['browser']){ + $show = false; + if(!$browser) + $browser = new rcube_browser(); + eval($prop['browser']); + if($test){ + if($prop['active']){ + $show = true; + } + } + } + if($prop['autoload']){ + $show = false; + } + if($prop['protected']){ + if($prop['protected'] === true){ + $show = false; + } + else if(is_string($prop['protected'])){ + $show = false; + } + else if(is_array($prop['protected']) && count($prop['protected']) > 0){ + foreach($prop['protected'] as $domain){ + if($this->domain == strtolower($domain)){ + $show = false; + break; + } + } + } + } + if(is_array($prop['skins'])){ + $prop['skins'] = array_flip($prop['skins']); + if(!isset($prop['skins'][$this->rcmail->config->get('skin', 'classic')])){ + $show = false; + + } + } + } + if($show){ + $display_section[$section] = true; + $defaults = $this->defaults; + $restore[$plugin] = array($plugin, $defaults[$section][$plugin]['active']); + if($user[$section][$plugin]){ + $prop = $user[$section][$plugin]; + } + if(is_array($prop['buttons'])){ + $this->rcmail->output->set_env('pm_buttons_' . $plugin, $prop['buttons']); + $this->rcmail->output->set_env('pm_plugin_' . $plugin, $prop['active']); + } + $fconfig = 'fsavedialog'; + if($prop['config']){ + $fconfig = 'fconfig'; + } + $funinstall = ''; + if($prop['uninstall']){ + $funinstall = 'funinstall'; + } + $frequest = ''; + if($prop['uninstall_request']){ + if($prop['uninstall_force']){ + $frequest = 'frequestforce'; + } + else{ + $frequest = 'frequest'; + } + } + + $input = new html_checkbox(array('style' => 'vertical-align: middle;', 'name' => '_plugin_manager_' . $plugin, 'class' => trim($fconfig . ' ' . $funinstall . ' ' . $frequest), 'value' => 1, 'id' => 'pm_chbox_' . $plugin)); + if(substr($this->labels($prop['label_name']), 0, 1) == '[' && substr($this->labels($prop['label_name']), strlen($this->labels($prop['label_name'])) - 1) == ']'){ + if(!is_dir('./plugins/' . $plugin)){ + $li[$plugin].= html::tag('li', array('class' => '_plugin_manager_li', 'id' => 'pmid_' . html::tag('i', null, $plugin)), html::tag('input', array('style' => 'vertical-align: middle;', 'type' => 'checkbox', 'disabled' => 'true')) . html::tag('span', array('style' => 'vertical-align: middle;'), ' ' . html::tag('i', null, $plugin) . ' ' . html::tag('font', array('color' => 'red'), '(' . $this->gettext('notinstalled') . ')'))); + } + } + else{ + $li[$this->labels($prop['label_name'])].= html::tag('li', array('class' => 'plugin_manager_li', 'style' => 'white-space: nowrap', 'id' => 'pmid_' . $plugin), $input->show($prop['active']?1:0) . html::tag('span', array('style' => 'vertical-align: middle;'), ' ' . str_replace(' ', ' ', $this->labels($prop['label_name'])))); + } + if($prop['label_name']){ + $this->rcmail->output->add_script('rcmail.add_label({"' . $plugin . '.pluginname":"' . $this->labels($prop['label_name']) . '"});'); + } + if($prop['label_description']){ + $s = ''; + if(is_array($prop['label_inject'])){ + switch($prop['label_inject'][0]){ + case 'string': + $s = $prop['label_inject'][1]; + break; + case 'config': + $s = $this->rcmail->config->get($prop['label_inject'][1]); + break; + case 'session': + $s = $_SESSION($prop['label_inject'][1]); + break; + case 'eval': + eval($prop['label_inject'][1]); + break; + } + } + $this->rcmail->output->add_script('rcmail.add_label({"' . $prop['label_description'] . '":"' . $this->labels($prop['label_description'], $s) . '"});'); + } + } + else{ + $input = new html_hiddenfield(array('name' => '_plugin_manager_' . $plugin, 'id' => 'pm_chbox_' . $plugin, 'value' => $prop['active']?1:0)); + $li[$this->labels($prop['label_name'])].= $input->show(); + } + } + if($display_section[$section] && count($li) > 0 && $section != 'globalplugins' && $section != 'performance'){ + ksort($li); + $li = implode('', $li); + $content .= html::tag('div', array('id' => 'pm_section_' . $section, 'class' => 'pm_section'), html::tag('fieldset', array('class' => 'pm_fieldset'), html::tag('legend', array('class' => 'title'), str_replace(' ', ' ', $this->labels($section))) . html::tag('ul', array('id' => 'pm_' . $section, 'class' => 'plugin_manager_ul'), $li))); + } + } + } + if($content != ''){ + $args['blocks']['plugin_manager']['options'][0] = array( + 'title' => '', + 'content' => html::tag('div', array('id' => 'pm_div'), $content) + ); + $input_restore = new html_checkbox(array('id' => 'pm_restore_defaults')); + $input_checkall = new html_checkbox(array('id' => 'pm_check_all')); + $input_uncheckall = new html_checkbox(array('id' => 'pm_uncheck_all')); + $input_config = new html_hiddenfield(array('name' => '_config_plugin', 'id' => 'plugin_manager_config_plugin')); + $update = ''; + $admins = $this->admins; + $user = $_SESSION['username']; + if(isset($admins[strtolower($user)]) || strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $input_update = new html_checkbox(array('id' => 'pm_update_plugins')); + $update = '  ' . $this->gettext('update_plugins') . ' ' . html::tag('span', array('class' => 'pm_control'), $input_update->show(0)); + } + $args['blocks']['plugin_manager']['options'][2] = array( + 'title' => '', + 'content' => $this->gettext('restoredefaults') . ' ' . html::tag('span', array('class' => 'pm_control'), $input_restore->show(0)) . + '  ' . $this->gettext('checkall') . ' ' . html::tag('span', array('class' => 'pm_control'), $input_checkall->show(0)) . + '  ' . $this->gettext('uncheckall') . ' ' . html::tag('span', array('class' => 'pm_control'), $input_uncheckall->show(0)) . + $input_config->show() . + $update . + html::tag('div', array('id' => 'jqdialog', 'style' => 'display: none;')) + ); + $this->rcmail->output->set_env('pm_restore', $restore); + $this->rcmail->output->add_label( + 'plugin_manager.furtherconfig', + 'plugin_manager.successfullydeleted', + 'plugin_manager.successfullysaved', + 'plugin_manager.errorsaving', + 'plugin_manager.uninstall', + 'plugin_manager.uninstallconfirm', + 'plugin_manager.savewarning', + 'plugin_manager.areyousure', + 'plugin_manager.yes', + 'plugin_manager.no', + 'plugin_manager.disable', + 'plugin_manager.remove' + ); + } + else{ + $user = $_SESSION['username']; + $admins = $this->admins; + if(isset($admins[strtolower($user)])){ + $input_update = new html_checkbox(array('id' => 'pm_update_plugins')); + $args['blocks']['plugin_manager']['options'][1] = array( + 'title' => '', + 'content' => $this->gettext('update_plugins') . ' ' . $input_update->show(0) + ); + } + } + } + else if($args['section'] == 'plugin_manager_update'){ + $warning = '&_warning=1'; + if(strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $warning = ''; + } + $args['blocks']['plugin_manager_update']['options'][0] = array( + 'title' => html::tag('script', array('type' => 'text/javascript'), '$("body").hide(); document.location.href="./?_task=settings&_framed=1&_action=plugin.plugin_manager_update' . $warning . '"'), + 'content' => '' + ); + } + else if($args['section'] == 'plugin_manager_settings'){ + if($label = get_input_value('_pmmsg', RCUBE_INPUT_GET)){ + $this->rcmail->output->show_message($this->gettext($label), 'confirmation'); + } + $args['blocks']['plugin_manager']['name'] = $this->gettext('settings'); + $checked = false; + $readonly = true; + if($this->admins[$this->rcmail->user->data['username']] == 0){ + $readonly = false; + } + if($this->file_based_config){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('file_based_config') . $append, + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_file_based_config', 'name' => '_plugin_manager_file_based_config', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ($readonly ? '' : '  - ' . html::tag('a', array('href' => 'http://myroundcube.com/myroundcube-plugins/plugin-manager/file-based-administration', 'target' => '_blank'), $this->gettext('advanced_admins'))) . ' - ' . html::tag('a', array('href' => './?_action=plugin.plugin_manager_show_config&_framed=1'), $this->gettext('show_config')) . ')') + ); + $checked = false; + if($this->use_ssl){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('use_ssl'), + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_use_ssl', 'name' => '_plugin_manager_use_ssl', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + $checked = false; + if($this->use_hmail){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('use_hmail'), + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_use_hmail', 'name' => '_plugin_manager_hmail', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + $checked = false; + if($this->load_splitter){ + $checked = true; + } + if(!file_exists(INSTALL_PATH . 'plugins/load_splitter/load_splitter.php')){ + $append = ' − ' . html::tag('font', array('color' => 'red'), html::tag('a', array('href' => '#', 'onclick' => 'document.location.href="./?_task=settings&_framed=1&_action=plugin.plugin_manager_update&_warning=1"'), 'load_splitter') . ' ' . $this->gettext('notinstalled')); + $disabled = true; + } + else{ + $append = ''; + $disabled = false; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('load_splitter') . ' ' . html::tag('small', null, html::tag('a', array('href' => '#', 'onclick' => '$("#pluginselector").val("performance").change();$("html, body").animate({ scrollTop: $("#row_load_splitter").offset().top - 40 }, 500)'), '[load_splitter]')) . ' ' . $append, + 'content' => (($readonly || $disabled) ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_load_splitter', 'name' => '_plugin_manager_load_splitter', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') . ' ' . html::tag('a', array('href' => 'https://myroundcube.com/myroundcube-plugins/load_splitter-plugin/load-splitter-service', 'target' => '_blank'), html::tag('small', null, 'MyRoundcube Load Splitter Service')) + ); + + $checked = false; + if($this->compress_html){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('compress_html'), + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_compress_html', 'name' => '_plugin_manager_compress_html', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + $checked = false; + if($this->rcmail->config->get('plugin_manager_about_link', true)){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('show_about_link'), + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); if($(this).prop("checked")){parent.$(".about-link").show()}else{parent.$(".about-link").hide()}; document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_about_link', 'name' => '_plugin_manager_about_link', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + if($this->rcmail->config->get('support_url')){ + $checked = false; + if($this->rcmail->config->get('plugin_manager_support_link', true)){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('show_support_link'), + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); if($(this).prop("checked")){parent.$(".support-link").show()}else{parent.$(".support-link").hide()}; document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_support_link', 'name' => '_plugin_manager_support_link', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + } + $checked = false; + if($this->rcmail->config->get('plugin_manager_myroundcube_watermark', true)){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('use_myroundcube_watermark'), + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_myroundcube_watermark', 'name' => '_plugin_manager_myroundcube_watermark', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + $checked = false; + if($this->rcmail->config->get('plugin_manager_remove_watermark', false)){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('remove_watermark'), + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_remove_watermark', 'name' => '_plugin_manager_remove_watermark', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + $checked = false; + if($this->rcmail->config->get('plugin_manager_show_myrc_messages')){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('show_myrc_messages'), + 'content' => html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_show_myrc_messages', 'name' => '_plugin_manager_show_myrc_messages', 'value' => 1)) + ); + $checked = false; + if($this->rcmail->config->get('plugin_manager_maintenance_mode')){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('maintenance_mode') . ':' . html::tag('br') . html::tag('small', null, $this->gettext('maintenance_mode_hint')), + 'content' => html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_maintenanceMode', 'name' => '_plugin_manager_maintenance_mode', 'value' => 1)) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + $readonly = true; + if($this->admins[$this->rcmail->user->data['username']] == 0){ + $readonly = false; + } + $checked = false; + if($this->rcmail->config->get('plugin_manager_update_notifications')){ + $checked = true; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('enable_notifications') . ':' . html::tag('br') . html::tag('small', null, $this->gettext('enable_notifications_note')), + 'content' => ($readonly ? html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => $checked)) : html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()', 'type' => 'checkbox', 'checked' => $checked, 'id' => 'pm_update_notifications', 'name' => '_plugin_manager_update_notifications', 'value' => 1))) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + $readonly = true; + if($this->admins[$this->rcmail->user->data['username']] == 0){ + $readonly = false; + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('notifications_cc') . ':' . html::tag('br') . html::tag('small', null, $this->gettext('notifications_cc_note')), + 'content' => ($readonly ? html::tag('input', array('type' => 'text', 'disabled' => true, 'value' => $this->rcmail->config->get('plugin_manager_update_notifications_cc'))) : html::tag('input', array('placeholder' => 'john.doh@gmail.com', 'size' => '30', 'type' => 'text', 'id' => 'pm_update_notifications_cc', 'name' => '_plugin_manager_update_notifications_cc', 'value' => $this->rcmail->config->get('plugin_manager_update_notifications_cc'))) . + ' ' . html::tag('small', null, '[' . html::tag('a', array('href' => '#', 'onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()'), $this->gettext('save')) . ']')) . + html::tag('small', null, ' (' . $this->gettext('serverwide') . ')') + ); + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('translationaccount'), + 'content' => html::tag('input', array('type' => 'text', 'size' => 30, 'placeholder' => 'john.doh@gmail.com', 'id' => 'pm_translation_account', 'name' => '_plugin_manager_translation_account', 'value' => $this->rcmail->config->get('plugin_manager_translation_account'))) . + ' ' . html::tag('small', null, '[' . html::tag('a', array('href' => '#', 'onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()'), $this->gettext('save')) . ']' . ' ' . html::tag('a', array('href' => 'http://myroundcube.com/myroundcube-plugins/real-time-translation', 'target' => '_blank'), $this->gettext('whatsthis')) + ) + ); + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('translationserver'), + 'content' => html::tag('input', array('type' => 'text', 'placeholder' => 'ssl://imap.gmail.com:993', 'size' => 30, 'id' => 'pm_translation_server', 'name' => '_plugin_manager_translation_server', 'value' => $this->rcmail->config->get('plugin_manager_translation_server'))) . + ' ' . html::tag('small', null, '[' . html::tag('a', array('href' => '#', 'onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.submit()'), $this->gettext('save')) . ']') + ); + if(!$this->file_based_config){ + $options = html::tag('option', null, '--'); + $plugins_sorted = array(); + foreach($this->defaults as $section => $plugins){ + foreach($plugins as $plugin => $props){ + $plugins_sorted[$plugin] = $section; + } + } + ksort($plugins_sorted); + foreach($plugins_sorted as $plugin => $section){ + if(!in_array($plugin, $this->noselect)){ + $options .= html::tag('option', array('value' => $section, 'id' => 'option_' . $plugin), $plugin); + } + } + $selector = html::tag('select', array('id' => 'pluginselector', 'onchange' => '$(".row").attr("style", ""); if(!$("#" + $(this).val()).is(":visible")){ $("#tab" + $(this).val()).trigger("click") }; $("#row_" + ($(this).find(":selected").text())).attr("style", "border-left: 7px solid #000000;"); $("html, body").animate({ scrollTop: $("#row_" + $(this).find(":selected").text()).offset().top - 40 }, 500);'), $options); + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $this->gettext('select_plugin'), + 'content' => $selector + ); + $tabs = ''; + $divs = ''; + include INSTALL_PATH . 'plugins/plugin_manager/defaults.inc.php'; + $defaults = $config['plugin_manager_defaults']; + $release_defaults = $defaults; + $conf = array(); + foreach($defaults as $section => $plugins){ + foreach($plugins as $plugin => $props){ + $conf[$plugin] = 1; + } + } + $options = array(); + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'defaults'); + $overwrite = $this->rcmail->db->fetch_assoc($res); + if($overwrite['value']){ + $overwrite = unserialize($overwrite['value']); + if(is_array($overwrite)){ + $defaults = array_merge($defaults, $overwrite); + } + } + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'defaults_overwrite'); + $overwrite = $this->rcmail->db->fetch_assoc($res); + if($overwrite['value']){ + $overwrite = unserialize($overwrite['value']); + if(is_array($overwrite)){ + foreach($overwrite as $section => $plugins){ + foreach($plugins as $plugin => $props){ + foreach($props as $key => $val){ + $defaults[$section][$plugin][$key] = $val; + } + } + } + } + } + foreach($defaults as $section => $plugins){ + foreach($plugins as $plugin => $props){ + $options[$plugin] = 1; + } + } + foreach($this->rcmail->config->get('plugins', array()) as $plugin){ + $options[$plugin] = 1; + } + $scope = scandir(INSTALL_PATH . 'plugins'); + $select = array(); + foreach($scope as $dir){ + if(file_exists(INSTALL_PATH . 'plugins/' . $dir . '/' . $dir . '.php')){ + if(!isset($options[$dir])){ + if(!in_array($dir, $this->skip)){ + $select[$dir] = 1; + } + } + else if(!isset($conf[$dir])){ + if(!in_array($dir, $this->skip)){ + $select[$dir] = -1; + } + } + } + } + $sel_add = html::tag('option', null, '--'); + ksort($options); + foreach($select as $plugin => $available){ + if($available == 1){ + $sel_add .= html::tag('option', array('value' => $plugin), $plugin); + } + } + foreach($this->defaults as $section => $plugins){ + foreach($select as $plugin => $available){ + if($available == -1 && isset($plugins[$plugin])){ + $sel_remove[$section] .= html::tag('option', array('value' => $plugin), $plugin); + } + } + if(function_exists('mb_substr')){ + $truncate = mb_substr($this->gettext($section), 0, 9); + } + else{ + $truncate = substr($this->gettext($section), 0, 9); + } + $tabs .= html::tag('li', array('onclick' => 'window.location.href="#pm_translation_server"'), + html::tag('a', array('href' => '#' . $section, 'onclick' => 'parent.rcmail.env.section="' . $section . '"', 'id' => 'tab' . $section, 'title' => $this->gettext($section)), strlen($this->gettext($section)) > 12 ? $truncate . '...' : $this->gettext($section)) + ); + $legend = html::tag('div', array('style' => 'float: left; width: 300px;'), html::tag('span', array('style' => 'font-size: 11px; font-weight: normal;'), ' ' . $this->gettext('legend') . ':') . + html::tag('table', null, + html::tag('tr', null, + html::tag('td', array('nowrap' => true, 'class' => 'pm_legend'), html::tag('input', array('type' => 'checkbox', 'disabled' => true)) . html::tag('input', array('type' => 'checkbox', 'disabled' => true))) . + html::tag('td', array('nowrap' => true, 'class' => 'pm_legend', 'style' => 'font-size: 9px; font-weight: normal; color: #188c18;'), $this->gettext('plugindisabledbydefault')) + ) . + html::tag('tr', null, + html::tag('td', array('class' => 'pm_legend'), html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => true)) . html::tag('input', array('type' => 'checkbox', 'disabled' => true))) . + html::tag('td', array('class' => 'pm_legend', 'nowrap' => true, 'style' => 'font-size: 9px; font-weight: normal; color: #188c18;'), $this->gettext('pluginenabledbydefault')) + ) . + html::tag('tr', null, + html::tag('td', array('class' => 'pm_legend'), html::tag('input', array('type' => 'checkbox', 'disabled' => true)) . html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => true))) . + html::tag('td', array('nowrap' => true, 'class' => 'pm_legend', 'style' => 'font-size: 9px; font-weight: normal; color: #8a8a8a;'), $this->gettext('loads_never')) + ) . + html::tag('tr', null, + html::tag('td', array('class' => 'pm_legend'), html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => true)) . html::tag('input', array('type' => 'checkbox', 'disabled' => true, 'checked' => true))) . + html::tag('td', array('nowrap' => true, 'class' => 'pm_legend', 'style' => 'font-size: 9px; font-weight: normal; color: #ff1b1b;'), $this->gettext('pluginmandatory')) + ) + ) + ); + $rows = array(); + $skins = array(); + $files = scandir(INSTALL_PATH . 'skins'); + foreach($files as $file){ + if(is_dir(INSTALL_PATH . 'skins/' . $file) && $file != '.' && $file != '..'){ + $skins[] = $file; + } + } + $skinoptions = html::tag('option', array('value' => 'all'), $this->gettext('all')); + $combinations = ''; + foreach($skins as $skin){ + if($combinations){ + $combinations .= '|'; + } + $combinations .= $skin; + if($combinations != implode('|', $skins)){ + $skinoptions .= html::tag('option', array('value' => $combinations), $combinations); + } + } + foreach($plugins as $plugin => $props){ + if($props['autoload']){ + continue; + } + $labels = array(); + $name = $this->gettext($plugin . '.pluginname'); + $title = $this->gettext($plugin . '.plugindescription'); + if(substr($name, 0, 1) == '['){ + $name = $this->gettext($plugin . '_pluginname'); + $title = $this->gettext($plugin . '_plugindescription'); + } + if(substr($name, 0, 1) == '['){ + if(file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/localization/en_US.inc')){ + include INSTALL_PATH . 'plugins/' . $plugin . '/localization/en_US.inc'; + $en_us_labels = $labels; + if(file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/localization/' . $_SESSION['language'] . '.inc')){ + include INSTALL_PATH . 'plugins/' . $plugin . '/localization/' . $_SESSION['language'] . '.inc'; + $labels = array_merge($en_us_labels, $labels); + } + if(isset($labels['pluginname'])){ + $name = $labels['pluginname']; + } + if(isset($labels['plugindescription'])){ + $title = $labels['plugindescription']; + } + else{ + $title = ''; + } + } + else{ + $title = ''; + } + } + $docs = false; + if(substr($name, 0, 1) == '['){ + $name = $plugin . ' ' . html::tag('small', null, html::tag('span', null, '[') . html::tag('a', array('href' => + "mailto:dev-team@myroundcube.com?subject=Third party plugin localization (" . $plugin . ")&body=Please add localization labels to the next Plugin Manager localization update.%0D%0A%0D%0APlugin: " . $plugin . "%0D%0A%0D%0ALanguage: en_US (English please)%0D%0APlugin name:%0D%0APlugin description:" + ), + html::tag('span', array('style' => 'color: #ff1b1b;'), $this->gettext('localizationmissing'))) . html::tag('span', null, ']') + ); + } + if(is_array($release_defaults[$section][$plugin])){ + $docs = true; + } + $isactive = $props['active'] ? true : false; + $isprotected = $props['protected'] ? true : false; + if(is_string($props['protected'])){ + $isprotected = $props['protected']; + } + if($disable = get_input_value('_plugin', RCUBE_INPUT_GET)){ + if($disable == $plugin){ + $isactive = false; + $isprotected = true; + if(is_array($props['protected'])){ + $isprotected = $props['protected']; + } + } + } + $status = false; + $bind = ''; + $unbind = ''; + $linked = ''; + $error = ''; + if(class_exists('db_config') && $this->defaults['globalplugins']['db_config']['active'] && RCMAIL_VERSION > '0.8.6'){ + $isconfigured = true; + if(file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/config.inc.php.dist')){ + $sql = 'SELECT * FROM ' . get_table_name('db_config') . ' WHERE ' . $this->q('env') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, $plugin); + if(!is_array($this->rcmail->db->fetch_assoc($res))){ + if($plugin != 'global_config' && file_exists(INSTALL_PATH . 'plugins/global_config/config.inc.php')){ + if(!file_exists(INSTALL_PATH . 'plugins/' . $plugin . 'config.inc.php')){ + $config = array(); + $rcmail_config = array(); + include INSTALL_PATH . 'plugins/' . $plugin . '/config.inc.php.dist'; + if(is_array($rcmail_config)){ + $config = $rcmail_config; + $rcmail_config = array(); + } + $defconf = $config; + $config = array(); + include INSTALL_PATH . 'plugins/global_config/config.inc.php'; + if(file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/config.inc.php')){ + include INSTALL_PATH . 'plugins/' . $plugin . '/config.inc.php'; + if(is_array($rcmail_config)){ + $config = $rcmail_config; + } + } + foreach($defconf as $key => $value){ + if(isset($config[$key])){ + $isconfigured = true; + break; + } + else{ + $isconfigured = false; + } + } + } + } + } + $democlick = ''; + if(strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $democlick = 'rcmail.display_message("' . $this->gettext('demoaccount') . '", "error"); return false'; + } + if(!$isconfigured){ + $error .= ' ' . html::tag('small', array('style' => 'color: #ff1b1b;'), '[' . html::tag('a', array('style' => 'color: #ff1b1b;', 'onclick' => $democlick, 'href' => './?_action=plugin.plugin_manager_show_config&_framed=1&_plugin=' . $plugin), $this->gettext('notconfigured')) . ']'); + } + else if(file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/config.inc.php.dist')){ + $error .= ' ' . html::tag('small', array('style' => 'color: #188c18;'), '[' . html::tag('a', array('style' => 'color: #188c18;', 'onclick' => $democlick, 'href' => './?_action=plugin.plugin_manager_edit_config&_framed=1&_plugin=' . $plugin), $this->gettext('editconfig')) . ']'); + } + } + } + if($this->defaults['globalplugins']['mysqladmin']['active'] && class_exists('mysqladmin') && class_exists($plugin) && method_exists($plugin, 'about') && strtolower($this->rcmail->config->get('mysql_admin')) == strtolower($this->rcmail->user->data['username'])){ + /* PHP 5.2.x workaround for $plugin::about() */ + $class = new $plugin(false); + $sqladmin = $class->about(array('sqladmin')); + if($sqladmin['sqladmin']){ + $sqladmin = $sqladmin['sqladmin']; + $error .= ' ' . html::tag('small', array('style' => 'color: #188c18;'), '[' . html::tag('a', array('style' => 'color: #188c18;', 'onclick' => 'var temp = document.location.href.split(\'&_expand\'); rcmail.set_cookie(\'PMA_referrer\', temp[0] + \'&_expand=' . $plugin . '\');', 'href' => './?_action=plugin.mysqladmin&pma_login=1&db=' . $sqladmin[0] . '&dbt=' . $sqladmin[1]), $this->gettext('PHPMyAdmin')) . ']'); + } + } + if(class_exists($plugin) && !method_exists($plugin, 'about')){ + $error .= ' ' . html::tag('small', array('style' => 'color: #8a8a8a;'), '[' . html::tag('i', null, str_replace('.', '', $this->gettext('thirdparty'))) . ']'); + } + if($plugin == 'load_splitter'){ + $isactive = $this->load_splitter; + $disabled = true; + } + else{ + $disabled = false; + } + $active = html::tag('td', array('align' => 'center'), html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.action = document.forms.form.action + "?_plugin=' . $plugin . '"; document.forms.form.submit()', 'name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][active]', 'value' => 1, 'checked' => $isactive ? true : false, 'style' => 'display:' . ($disabled ? 'none' : 'block'), 'type' => 'checkbox'))); + if(is_string($release_defaults[$section][$plugin]['protected']) && !is_string($props['protected'])){ + if(substr($this->gettext($release_defaults[$section][$plugin]['config_label']), 0, 1) != '['){ + $bind = ' ' . html::tag('small', null, '[' . html::tag('a', array('title' => $this->gettext('loads_linked') . ': ' . $this->gettext($release_defaults[$section][$plugin]['config_label']), 'href' => './?_task=settings&_action=plugin.plugin_manager_bind&_section=' . $section . '&_target=' . $plugin), $this->gettext('bind')) . ']'); + $active = html::tag('td'); + } + } + if(is_string($props['protected'])){ + $linked = $this->gettext('loads_linked') . ':' . html::tag('br') . $this->gettext($section) . html::tag('br') . '- '; + $status = $props['config_label'] ? $props['config_label'] : $props['protected']; + if(substr($this->gettext($status), 0, 1) == '['){ + $this->rcmail->output->add_script('document.location.href="./?_task=settings&_action=plugin.plugin_manager_unbind&_section=' . $section . '&_target=' . $plugin . '";', 'docready'); + } + $unbind = ' ' . html::tag('small', null, '[' . html::tag('a', array('href' => './?_task=settings&_action=plugin.plugin_manager_unbind&_section=' . $section . '&_target=' . $plugin), $this->gettext('unbind')) . ']'); + $color = '#188c18'; + $active = html::tag('td', array('align' => 'center'), html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][active]', 'value' => 0, 'type' => 'hidden'))); + } + else if($isactive && $isprotected){ + $status = 'loads_always'; + $color = '#ff1b1b'; + } + else if((!$isactive && $isprotected) || (($section == 'globalplugins' || $section == 'performance') && !$isactiv && !$isprotected)){ + $status = 'loads_never'; + $color = '#8a8a8a'; + } + else{ + $status = 'loads_by_user'; + $color = '#188c18'; + } + if($section == 'globalplugins' || $section == 'performance' || $bind){ + if($bind){ + $protected = html::tag('td'); + } + else{ + $protected = html::tag('td', array('align' => 'center'), html::tag('input', array('disabled' => true, 'checked' => true, 'type' => 'checkbox'))); + } + $protected .= html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'type' => 'hidden')); + } + else{ + if(is_string($isprotected)){ + $protected = html::tag('td', array('align' => 'center'), html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => $isprotected, 'type' => 'hidden'))); + } + else{ + $protected = html::tag('td', array('align' => 'center'), html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.action = document.forms.form.action + "?_plugin=' . $plugin . '"; document.forms.form.submit()', 'name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'checked' => $isprotected ? true : false, 'type' => 'checkbox'))); + } + } + if(!class_exists($plugin)){ + $this->require_plugin($plugin); + } + if(method_exists($plugin, 'about')){ + $class = new $plugin(false); + $requirements = $class->about(); + $required = $requirements['db_version']; + if(is_array($required)){ + $required = implode('|', $required); + $sql = 'SELECT * FROM ' . get_table_name('system') . ' WHERE ' . $this->q('name') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'myrc_' . $plugin); + $db = $this->rcmail->db->fetch_assoc($res); + $db = $db['value']; + if($db != $required && strtolower($this->get_demo($_SESSION['username'])) != strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + if(!$isactive && !$isprotected){ + $isprotected = true; + if(is_string($isprotected)){ + $protected = html::tag('td', array('align' => 'center'), html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'type' => 'hidden'))); + } + else{ + $protected = html::tag('td', array('align' => 'center'), html::tag('input', array('onclick' => '$("#plugin_manager_overlay").show(); document.forms.form.action = document.forms.form.action + "?_plugin=' . $plugin . '"; document.forms.form.submit()', 'name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'checked' => true, 'type' => 'checkbox'))); + } + $this->rcmail->output->add_script('$("#plugin_manager_overlay").show(); document.forms.form.submit();', 'docready'); + } + $status = 'errordb'; + $color = '#ff1b1b'; + $temp = explode('.', RCMAIL_VERSION); + if(($temp[0] == 0 && $temp[1] > 8) || $temp[0] > 0){ + if($isactive && $isprotected){ + if($class->task){ + foreach($this->rctasks as $task){ + if(preg_match('/^('.$class->task.')$/i', $task)){ + $link = './?_task=' . $task . '&_plugin_manager_settings_section=' . $section; + break; + } + } + } + else{ + $link = './?_task=settings&_plugin_manager_settings_section=' . $section; + } + $_SESSION['db_version_lock'] = true; + $status = 'errordb8'; + $error = html::tag('br') . html::tag('a', array('href' => 'javascript:void(0)', 'onclick' => 'window.setTimeout(\'parent.location.href="' . $link . '"\', 500);'), $this->gettext('dbautomatically')); + $this->rcmail->output->show_message('plugin_manager.dbautomatically', 'notice'); + } + } + else{ + $status = 'errordb8'; + $error = html::tag('br') . html::tag('a', array('href' => 'http://myroundcube.com/myroundcube-plugins/faqs/myroundcube-plugins-database-versioning-support', 'target' => '_blank'), $this->gettext('dbmanually')); + } + } + } + $required = $requirements['requirements']['required_plugins']; + if(is_array($required)){ + $missing = array(); + foreach($required as $key => $val){ + if(!file_exists(INSTALL_PATH . 'plugins/' . $key . '/' . $key . '.php')){ + $missing[] = $key; + } + } + if(count($missing) > 0){ + $active = html::tag('td', null, ' '); + $protected = html::tag('td', null, ' '); + $status = 'errorplugin'; + $color = '#ff1b1b'; + if(RCMAIL_VERSION > $this->stable){ + $branch = 'dev'; + } + else{ + $branch = 'stable'; + } + $error = ' (' . html::tag('a', array('href' => 'javascript:void(0)', 'onclick' => 'document.location.href="./?_task=settings&_action=plugin.plugin_manager_update&_framed=1&_branch=' . $branch . '"'), implode(', ', $missing)) . ')'; + } + } + $required = $requirements['requirements']['Roundcube']; + if(isset($required)){ + if(RCMAIL_VERSION < $required){ + $active = html::tag('td', null, html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][active]', 'value' => 0, 'type' => 'hidden'))); + $protected = html::tag('td', null, html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'type' => 'hidden'))); + $status = 'errorrcversion'; + $color = '#ff1b1b'; + $error = ' v' . $required . ' ' . $this->gettext('ornewer') . html::tag('br') . html::tag('small', array('style' => 'color: #000000;'), '[' . html::tag('a', array('href' => 'http://roundcube.net/download', 'target' => '_blank'), $this->gettext('official_releases')) . ']'); + if($isactive || !$isprotected){ + $this->rcmail->output->add_script('$("#plugin_manager_overlay").show(); document.forms.form.submit();', 'docready'); + } + } + } + $required = $requirements['requirements']['PHP']; + if(isset($required)){ + $temp = explode('+', $required); + $module = trim($temp[1]); + if(strtolower($module) == 'curl'){ + if(!function_exists('curl_init')){ + $active = html::tag('td', null, html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][active]', 'value' => 0, 'type' => 'hidden'))); + $protected = html::tag('td', null, html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'type' => 'hidden'))); + $status = 'errorphpcurl'; + $color = '#ff1b1b'; + $error = ' ' . html::tag('small', array('style' => 'color: #000000;'), '[' . html::tag('a', array('href' => 'http://php.net/manual/en/book.curl.php', 'target' => '_blank'), 'PHP cURL') . ']'); + if($isactive || !$isprotected){ + $this->rcmail->output->add_script('$("#plugin_manager_overlay").show(); document.forms.form.submit();', 'docready'); + } + } + } + if(strtolower($module) == 'finfo'){ + if(!function_exists('finfo_open')){ + $active = html::tag('td', null, html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][active]', 'value' => 0, 'type' => 'hidden'))); + $protected = html::tag('td', null, html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'type' => 'hidden'))); + $status = 'errorphpcurl'; + $status = 'errorphpfinfo'; + $color = '#ff1b1b'; + $error = ' ' . html::tag('small', array('style' => 'color: #000000;'), '[' . html::tag('a', array('href' => 'http://php.net/manual/en/book.fileinfo.php', 'target' => '_blank'), 'PHP finfo') . ']'); + if($isactive || !$isprotected){ + $this->rcmail->output->add_script('$("#plugin_manager_overlay").show(); document.forms.form.submit();', 'docready'); + } + } + } + $php = trim($temp[0]); + if(PHP_VERSION < $php){ + $active = html::tag('td', null, html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][active]', 'value' => 0, 'type' => 'hidden'))); + $protected = html::tag('td', null, html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'type' => 'hidden'))); + $status = 'errorphpversion'; + $color = '#ff1b1b'; + $error = ' v' . $required; + if($isactive || !$isprotected){ + $this->rcmail->output->add_script('$("#plugin_manager_overlay").show(); document.forms.form.submit();', 'docready'); + } + } + } + } + $skins = html::tag('td', null, html::tag('select', array('id' => 'skin_sel_' . $plugin , 'name' => '_skins[' . $section . '][' . $plugin . ']', 'onchange' => 'document.forms.form.submit()'), $skinoptions)); + if(is_array($props['skins'])){ + $skins .= html::tag('script', array('type' => 'text/javascript'), '$("#skin_sel_' . $plugin . '").val("' . implode('|', $props['skins']) . '");'); + } + if($plugin == 'db_config'){ + $skey = '_03'; + if($this->admins[$this->rcmail->user->data['username']] != 0){ + $active = html::tag('td', array('align' => 'center', 'colspan' => 3), + html::tag('span', array('style' => 'font-weight: normal; color: #8a8a8a;'), $this->gettext('systemadmin') . ' (' . $this->gettext('serverwide') . ')') . + html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][active]', 'value' => $this->defaults['globalplugins']['db_config']['active'], 'type' => 'hidden')) . + html::tag('input', array('name' => '_plugin_manager_defaults[' . $section . '][' . $plugin . '][protected]', 'value' => 1, 'type' => 'hidden')) + ); + $protected = ''; + $skins = ''; + if($isactive && $isprotected){ + $status = 'loads_always'; + $color = '#ff1b1b'; + } + else if((!$isactive && $isprotected)){ + $status = 'loads_never'; + $color = '#8a8a8a'; + } + } + } + else if(substr($this->gettext($plugin . '.pluginname'), 0, 1) != '['){ + $skey = $this->gettext($plugin . '.pluginname'); + } + else if(substr($this->gettext('plugin_manager.' . $plugin . '_pluginname'), 0, 1) != '['){ + $skey = $this->gettext('plugin_manager.' . $plugin . '_pluginname'); + } + else{ + $skey = $plugin; + } + $rows[strtolower($skey)] = html::tag('a', array('name' => $plugin), '') . html::tag('tr', array('id' => 'row_' . $plugin, 'class' => 'row'), + html::tag('td', array('style' => 'font-weight: normal;', 'class' => 'pm_config'), html::tag('span', array('title' => $title), $name) . ' ' . ($docs ? html::tag('small', null, '[' . html::tag('a', array('href' => 'http://myroundcube.com/myroundcube-plugins#'. $plugin, 'target' => '_blank', 'title' => $this->gettext('documentation')), $plugin) . ']') : '')) . + $active . + $protected . + $skins . + html::tag('td', array('style' => 'font-weight: normal; color: ' . $color), ($status ? ($linked . $this->gettext($status) . $unbind . $bind . $error) : ' ')) + ); + } + $rows['_0'] = html::tag('tr', array('id' => 'row_new_plugin_' . $section, 'class' => 'row'), + html::tag('td', array('width' => '20%'), html::tag('select', array('onchange' => 'document.forms.form.submit()', 'name' => '_new_plugin_name[' . $section . ']'), $sel_add)) . + html::tag('td', array('width' => '30%', 'colspan' => 3, 'align' => 'center', 'style' => 'font-weight: normal; color: #8a8a8a;'), $this->gettext('addplugin')) . + html::tag('td', array('width' => '50%'), ' ') + ); + if($sel_remove[$section]){ + $sel_remove[$section] = html::tag('option', null, '--') . $sel_remove[$section]; + $rows['_1'] = html::tag('tr', array('id' => 'row_remove_plugin_' . $section, 'class' => 'row'), + html::tag('td', array('width' => '20%'), html::tag('select', array('onchange' => 'document.forms.form.submit()', 'name' => '_remove_plugin_name[' . $section . ']'), $sel_remove[$section])) . + html::tag('td', array('width' => '30%', 'colspan' => 3, 'align' => 'center', 'style' => 'font-weight: normal; color: #8a8a8a;'), $this->gettext('removeplugin')) . + html::tag('td', array('width' => '50%'), ' ') + ); + } + ksort($rows); + $divs .= html::tag('div', array('id' => $section), + html::tag('table', array('class' => 'propform', 'width' => '100%'), + html::tag('tr', null, + html::tag('th', array('width' => '20%', 'style' =>'font-weight: normal;'), $this->gettext('plugin')) . + html::tag('th', array('width' => '10%', 'style' =>'font-weight: normal;'), $this->gettext('enabled')) . + html::tag('th', array('width' => '10%', 'style' =>'font-weight: normal;'), $this->gettext('protected')) . + html::tag('th', array('width' => '10%', 'align' => 'left', 'style' => 'font-weight: normal;'), '  ' . $this->gettext('skins')) . + html::tag('th', array('width' => '50%', 'align' => 'left', 'style' => 'font-weight: normal;'), '  ' . $this->gettext('status')) + ) . implode('', $rows) + ) . $legend + ); + } + $html = html::tag('div', array('id' => 'plugin_manager_defaults', 'style' => 'display: none;'), + html::tag('ul', null, + html::tag('style', array('type' => 'text/css'), '.ui-tabs .ui-tabs-nav li a { font-size: 11px; } table.propform td.title { white-space: normal; }') . $tabs . $divs + ) + ); + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => $html, + 'content' => html::tag('span', array('id' => 'remove')) + ); + $skin = $this->rcmail->config->get('skin'); + if(!file_exists($this->home . '/skins/' . $skin . '/plugin_manager.css')) { + $skin = "classic"; + } + $this->include_stylesheet('skins/' . $skin . '/plugin_manager.css'); + $this->api->output->add_footer(html::tag('div', array('id' => 'plugin_manager_overlay'))); + } + $admins = array_flip($this->admins); + $systemadmin = '$(".boxtitle").html($(".boxtitle").html() + " » ' . $this->gettext('systemadmin') . ': ' . $admins[0]; + if($admins[0] != $this->rcmail->user->data['username']){ + $systemadmin .= ' » ' . $this->gettext('admin') . ': ' . $admins[0]; + } + $systemadmin .= ' » ' . $this->gettext('serverconfiguration') . ' | ' . $this->gettext('pluginsconfiguration') . ''; + $systemadmin .= '")'; + $this->rcmail->output->add_script( + 'function pluginsconfiguration(){ + if($("#plugin_manager_defaults").tabs("option", "selected") == -1){ + $("#tabglobalplugins").trigger("click"); + return true; + } + } + $(".mainaction").hide(); + $("#remove").parent().remove(); + $("#plugin_manager_defaults").parent().attr("colspan", 2); + $("#plugin_manager_defaults").tabs({ collapsible: true, active: false }); + if(parent.rcmail.env.section){ + $("#tab" + parent.rcmail.env.section).trigger("click"); + } + $("#plugin_manager_defaults").show(); + $("td.title").css("width", "300px"); + ' . $systemadmin, + 'foot' + ); + if($plugin = get_input_value('_plugin', RCUBE_INPUT_GET)){ + if(strtolower($this->get_demo($_SESSION['username'])) != strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $this->rcmail->output->add_script('document.forms.form.action = document.forms.form.action + "?_plugin=' . $plugin . '"; document.forms.form.submit();', 'docready'); + } + } + if($plugin = get_input_value('_expand', RCUBE_INPUT_GET)){ + $this->rcmail->output->add_script('$("#option_' . $plugin . '").prop("selected", true); $("#pluginselector").change();', 'docready'); + } + } + else if($args['section'] == 'plugin_manager_admins'){ + $this->admins = array(); + $args['blocks']['plugin_manager']['name'] = $this->gettext('plugin_manager_admins'); + $content = ''; + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => '', + 'content' => html::tag('div', array('id' => 'pm_div_0'), html::tag('input', array('type' => 'hidden', 'size' => 35, 'id' => 'pma_label_0', 'name' => '_plugin_manager_admins[]', 'value' => ''))) . + ' ' . html::tag('small', null, html::tag('a', array('href' => 'javascript:var user = prompt("' . $this->gettext('username') . '", $("#pma_label_0").val()); if(user) {$("#pma_label_0").val(user); document.forms.form.submit()}'), $this->gettext('add'))) + ); + $sql = 'SELECT ' . $this->q('value') . ' FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'admins'); + if($res){ + $admins = $this->rcmail->db->fetch_assoc($res); + if($admins = unserialize($admins['value'])){ + $this->admins = array_flip($admins); + } + } + foreach($this->admins as $admin => $val){ + if($val == 0) continue; + $isadmin = false; + $isshared = false; + $sql = 'SELECT ' . $this->q('preferences') . ' FROM ' . get_table_name('users') . ' WHERE ' . $this->q('username') . '=? AND ' . $this->q('mail_host') . '=?'; + if($res = $this->rcmail->db->limitquery($sql, 0, 1, $admin, $_SESSION['storage_host'])){ + $prefs = $this->rcmail->db->fetch_assoc($res); + if($prefs = unserialize($prefs['preferences'])){ + if($prefs['plugin_manager_hash'] && $prefs['plugin_manager_hash'] == $this->rcmail->config->get('plugin_manager_hash')){ + $isadmin = true; + } + if($prefs['customer_id'] && $prefs['customer_id'] == $this->rcmail->config->get('customer_id')){ + $isshared = true; + } + else if($prefs['shared_customer_id'] && ($prefs['customer_id'] != $prefs['shared_customer_id']) && ($prefs['shared_customer_id'] == $this->rcmail->config->get('customer_id'))){ + $isshared = true; + } + } + } + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => html::tag('label', array('for' => 'pma_label_' . $val), html::tag('b', null, html::tag('i', null, $admin))), + 'content' => html::tag('div', array('id' => 'pm_div_' . $val), html::tag('input', array('type' => 'hidden', 'size' => 35, 'id' => 'pma_label_' . $val, 'name' => '_plugin_manager_admins[]', 'value' => $admin))) . + ' ' . html::tag('small', null, html::tag('a', array('href' => 'javascript:$("#pma_label_' . $val . '").val("");document.forms.form.submit()'), $this->gettext('delete')) . ' | ' . + html::tag('a', array('href' => 'javascript:var user = prompt("' . $this->gettext('username') . '", $("#pma_label_' . $val . '").val()); if(user) {$("#pma_label_' . $val . '").val(user); document.forms.form.submit()}'), $this->gettext('edit'))) + ); + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => html::tag('label', array('for' => 'pmc_label_' . $val), $this->gettext('submenuprefix') . ' ' . $this->gettext('allow_plugins_configuration')), + 'content' => html::tag('div', array('id' => 'pm_div_config_' . $val), html::tag('input', array('checked' => $isadmin, 'onclick' => 'document.forms.form.submit()', 'id' => 'pmc_label_' . $val, 'type' => 'checkbox', 'name' => '_plugin_manager_config[' . $admin . ']', 'value' => 1))) + ); + $args['blocks']['plugin_manager']['options'][] = array( + 'title' => html::tag('label', array('for' => 'pmi_label_' . $val), $this->gettext('submenuprefix') . ' ' . $this->gettext('share_credits')), + 'content' => html::tag('div', array('id' => 'pm_div_customer_' . $val), html::tag('input', array('checked' => $isshared, 'onclick' => 'document.forms.form.submit()', 'id' => 'pmi_label_' . $val, 'type' => 'checkbox', 'name' => '_plugin_manager_customer[' . $admin . ']', 'value' => 1))) + ); + } + $this->rcmail->output->add_script('$(".mainaction").hide(); $(".boxtitle").html($(".boxtitle").html() + " » ' . $this->gettext('systemadmin') . ': ' . $this->rcmail->user->data['username'] . '")', 'docready'); + } + else if($args['section'] == 'plugin_manager_customer'){ + $this->include_script('plugin_manager.js'); + $this->rcmail->output->add_label( + 'plugin_manager.creditsupdated' + ); + $customer_id = $this->rcmail->config->get('customer_id'); + if(!$customer_id){ + $customer_id = $this->getCustomerID(); + if(is_string($customer_id) && strlen($customer_id) == 32){ + $a_prefs['customer_id'] = $customer_id; + $this->rcmail->user->save_prefs($a_prefs); + } + else{ + $args['blocks']['plugin_manager_customer']['options'][0] = array( + 'title' => $this->gettext('servicenotavailable'), + 'content' => '' + ); + $this->rcmail->output->add_script('if(self.location.href != parent.location.href){$(".mainaction").remove()}', 'docready'); + } + } + if($_GET['_framed']){ + $params = array('_customer_id' => $this->rcmail->config->get('customer_id')); + $httpConfig['method'] = 'POST'; + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_account'; + $httpConfig['timeout'] = '30'; + $httpConfig['params'] = $params; + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + if(($shared = $this->rcmail->config->get('plugin_manager_shared')) && $this->rcmail->config->get('customer_id') != $this->rcmail->config->get('own_customer_id')){ + $content = html::tag('input', array('name' => '_customer_id', 'id' => 'customer_id', 'type' => 'hidden', 'value' => $customer_id)) . + html::tag('input', array('name' => '_clientip', 'id' => 'clientip', 'type' => 'hidden', 'value' => $_SERVER['REMOTE_ADDR'])) . + html::tag('input', array('name' => '_serverip', 'id' => 'serverip', 'type' => 'hidden', 'value' => $_SERVER['SERVER_ADDR'])) . + html::tag('span', array('style' => 'font-weight: normal; font-size: 13px'), $this->gettext('sharedby') . ' ' . html::tag('b', null, $shared)) . html::tag('br') . + html::tag('small', array('style' => 'font-weight: normal'), '» ' . + html::tag('a', array('href' => './?_action=plugin.plugin_manager_deny'), $this->gettext('switch')) . ' ' . $this->gettext('ownaccount') . ' ' . $this->rcmail->user->data['username'] + ) . + html::tag('br') . html::tag('br') . + html::tag('input', array('name' => '_home', 'id' => 'home', 'type' => 'hidden', 'value' => '')); + } + else{ + $accept = ''; + if($this->rcmail->config->get('shared_customer_id')){ + $accept = html::tag('br') . + html::tag('small', array('style' => 'font-weight: normal'), '» ' . html::tag('a', array('href' => './?_action=plugin.plugin_manager_accept'), $this->gettext('switch')) . ' ' . + $this->gettext('shareinvitation') . ' ' . $this->rcmail->config->get('plugin_manager_shared')); + } + $content = $this->gettext('customer_id') . ': ' . html::tag('input', array('name' => '_customer_id', 'id' => 'customer_id', 'size' => 32, 'readonly' => 'readonly', 'value' => $customer_id)) . + html::tag('input', array('name' => '_clientip', 'id' => 'clientip', 'type' => 'hidden', 'value' => $_SERVER['REMOTE_ADDR'])) . + html::tag('input', array('name' => '_serverip', 'id' => 'serverip', 'type' => 'hidden', 'value' => $_SERVER['SERVER_ADDR'])) . + ' ' . html::tag('a', array('href' => './?_task=settings&_action=plugin.plugin_manager_getnew', 'style' => 'font-size:11px;', 'title' => $this->gettext('getnew_hint')), $this->gettext('getnew')) . + $accept . + html::tag('br') . html::tag('br') . + html::tag('input', array('name' => '_home', 'id' => 'home', 'type' => 'hidden', 'value' => '')); + } + $this->rcmail->output->add_script('if(document.getElementById("home")){ $("#home").val(document.location.href) };', 'docready'); + if($http->error){ + $content .= html::tag('span', array('style' => 'font-weight: normal; font-size: 11px'), $this->gettext('trylater')); + } + else{ + $response = $http->result; + $account = unserialize($response); + if(is_array($account) && !$account['credits'] == '-0'){ + unset($httpConfig['params']); + $httpConfig['method'] = 'GET'; + $httpConfig['target'] .= '&_customer_id=' . $this->rcmail->config->get('customer_id'); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $response = $http->result; + $account = unserialize($response); + } + if(is_array($account)){ + $rows = ''; + $sum = 0; + if(is_array($account['history'])){ + $head = html::tag('tr', array('style' => 'font-weight: bold; font-size: 12px;'), + html::tag('td', array('style' => 'border: 2px solid lightgrey;'), $this->gettext('date')) . + html::tag('td', array('style' => 'border: 2px solid lightgrey;'), 'IPs') . + html::tag('td', array('style' => 'border: 2px solid lightgrey;', 'align' => 'center'), $this->gettext('download')) . + html::tag('td', array('style' => 'border: 2px solid lightgrey;', 'align' => 'center'), $this->gettext('receipt')) . + html::tag('td', array('style' => 'border: 2px solid lightgrey;'), 'MyRC$') . + html::tag('td', array('style' => 'border: 2px solid lightgrey;', 'align' => 'center'), $this->gettext('plugins')) + ); + foreach($account['history'] as $entry){ + $list = ''; + $plugins = unserialize($entry['plugins']); + if(is_array($plugins)){ + foreach($plugins as $plugin){ + $list .= html::tag('li', null, $plugin[0] . ' (' . $plugin[1] . ')'); + } + } + if($entry['action'] == 'd'){ + if($_SERVER['REMOTE_ADDR'] == $entry['clientip'] || $_SERVER['HTTP_X_FORWARDED_FOR'] == $entry['clientip'] || $_SERVER['HTTP_X_REAL_IP'] == $entry['clientip']){ + $dllink = $this->dlurl . 'index.php?_hash=' . md5($_SERVER['REMOTE_ADDR']) . '&_dl=' . $entry['dl']; + $dllabel = $this->gettext('clickhere'); + } + else{ + $dllink = '#'; + $dllabel = sprintf($this->gettext('ipmismatch'), $_SERVER['REMOTE_ADDR'], html::tag('input', array('readonly' => 'readonly', 'onclick' => 'this.select()', 'style' => 'font-size:9px', 'value' => 'wget --no-check-certificate -O plugins.zip "' . $this->dlurl . 'index.php?_hash=' . md5($entry['serverip']) . '&_dl=' . $entry['dl'] . '"')), html::tag('input', array('readonly' => 'readonly', 'onclick' => 'this.select()', 'style' => 'font-size:9px', 'value' => $this->dlurl . 'index.php?_hash=' . md5($entry['serverip']) . '&_dl=' . $entry['dl'])), $entry['serverip']); + } + if(substr($entry['dl'], 0, 1) == '_'){ + $dllink = '#'; + $dllabel = $this->gettext('expired'); + } + $rows .= html::tag('tr', null, + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), str_replace(' ', ' ', date($this->rcmail->config->get('date_format', 'Y-m-d') . ' ' . $this->rcmail->config->get('time_format', 'H:i:s') . ':s', strtotime($entry['date'])))) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), $entry['serverip'] ? ($entry['serverip'] . ' (Server)
' . $entry['clientip'] . ' (Client)') : ($entry['ip'] . ' (Client)')) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'center'), $dllink == '#' ? $dllabel : html::tag('a', array('href' => $dllink), $dllabel)) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), + html::tag('a', array('href' => 'javascript:void(0)', 'onclick' => '$(".' . $entry['dl'] . '").show()'), $this->gettext('show')) . ' | ' . + html::tag('a', array('href' => 'javascript:void(0)', 'onclick' => '$(".' . $entry['dl'] . '").hide()'), $this->gettext('hide')) . ' | ' . + html::tag('a', array('href' => 'javascript:void(0)', 'onclick' => 'var win = window.open(); win.document.write("
" + $(".' . $entry['dl'] . '").html() + "
"); win.print(); win.close()'), $this->gettext('print')) . + html::tag('pre', array('class' => 'expand ' . $entry['dl'], 'style' => 'display: none;'), base64_decode($entry['receipt']))) . + html::tag('td', array('style' => 'border: 1px solid lightgrey; color: red;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'right'), $entry['myrcd']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), html::tag('ul', null, $list)) + ); + $sum = $sum + $entry['myrcd']; + } + else if($entry['action'] == 'b'){ + $rows .= html::tag('tr', null, + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), str_replace(' ', ' ', date($this->rcmail->config->get('date_format', 'Y-m-d') . ' ' . $this->rcmail->config->get('time_format', 'H:i:s') . ':s', strtotime($entry['date'])))) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), $entry['serverip'] ? ($entry['serverip'] . ' (Server)
' . $entry['clientip'] . ' (Client)
via ' . $entry['ip']) : $entry['ip']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'center', 'colspan' => 2), $this->gettext('myrcd_bought')) . + html::tag('td', array('style' => 'border: 1px solid lightgrey; color: green;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'right'), '+' . $entry['myrcd']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), ' ') + ); + $sum = $sum + $entry['myrcd']; + } + else if($entry['action'] == 'r'){ + $rows .= html::tag('tr', null, + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), str_replace(' ', ' ', date($this->rcmail->config->get('date_format', 'Y-m-d') . ' ' . $this->rcmail->config->get('time_format', 'H:i:s') . ':s', strtotime($entry['date'])))) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), $entry['serverip'] ? ($entry['serverip'] . ' (Server)
' . $entry['clientip'] . ' (Client)
via ' . $entry['ip']) : $entry['ip']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'center', 'colspan' => 2), $this->gettext('myrcd_refunded')) . + html::tag('td', array('style' => 'border: 1px solid lightgrey; color: red;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'right'), $entry['myrcd']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), ' ') + ); + $sum = $sum + $entry['myrcd']; + } + else if($entry['action'] == 'c'){ + $rows .= html::tag('tr', null, + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), str_replace(' ', ' ', date($this->rcmail->config->get('date_format', 'Y-m-d') . ' ' . $this->rcmail->config->get('time_format', 'H:i:s') . ':s', strtotime($entry['date'])))) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), $entry['ip']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'center', 'colspan' => 2), $this->gettext('customer_id_changed')) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), ' ') . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), ' ') + ); + } + else if($entry['action'] == 't'){ + $rows .= html::tag('tr', null, + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), str_replace(' ', ' ', date($this->rcmail->config->get('date_format', 'Y-m-d') . ' ' . $this->rcmail->config->get('time_format', 'H:i:s') . ':s', strtotime($entry['date'])))) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), $entry['ip']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'center', 'colspan' => 2), $this->gettext('credits_transferred')) . + html::tag('td', array('style' => 'border: 1px solid lightgrey; color:' . ($entry['myrcd'] > 0 ? ' green;' : ' red;'), 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'right'), ($entry['myrcd'] > 0 ? '+' : '') . $entry['myrcd']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), ' ') + ); + $sum = $sum + $entry['myrcd']; + } + else if($entry['action'] == 'a'){ + $color = $entry['myrcd'] > 0 ? 'green' : 'red'; + $rows .= html::tag('tr', null, + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), str_replace(' ', ' ', date($this->rcmail->config->get('date_format', 'Y-m-d') . ' ' . $this->rcmail->config->get('time_format', 'H:i:s') . ':s', strtotime($entry['date'])))) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), $entry['ip']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'center', 'colspan' => 2), $this->gettext('account_details_compressed')) . + html::tag('td', array('style' => 'border: 1px solid lightgrey; color: ' . $color . ';', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'right'), ($entry['myrcd'] > 0 ? '+' : '') . $entry['myrcd']) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), ' ') + ); + $sum = $sum + $entry['myrcd']; + } + } + } + $free = ''; + if($account['credits'] > $sum){ + $free = html::tag('tr', null, + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'center'), '--') . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'colspan' => 3), 'Free MyRC$ granted - Enjoy!') . + html::tag('td', array('style' => 'border: 1px solid lightgrey; color: green;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'right'), '+'. ($account['credits'] - $sum)) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top'), ' ') + ); + } + $rows .= html::tag('tr', null, + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'colspan' => 4), 'MyRC$ (' . $this->gettext('credits') . ')') . + html::tag('td', array('style' => 'border: 1px solid lightgrey; font-weight: bold; color: ' . ($account['credits'] > 0 ? 'green' : 'red'), 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'right'), ($account['credits'] > 0 ? '+' : '') . html::tag('span', null, $account['credits'])) . + html::tag('td', array('style' => 'border: 1px solid lightgrey;', 'nowrap' => 'nowrap', 'valign' => 'top', 'align' => 'right'), html::tag('a', array('href' => 'javascript:document.forms.form.target="_blank";document.forms.form.action="' . $this->billingurl .'";document.forms.form.submit()', 'style' => 'font-weight:normal; font-size: 11px'), str_replace(' ', ' ', $this->gettext('buynow')))) + ); + $print = '$(".expand").show(); $("a").hide(); var content = $("#accountdetails").html(); while(content.indexOf("|") > -1){content = content.replace("|", "")}; ' . + 'var win = window.open(); win.document.write("MyRoundcube ' . $this->gettext('customer_account') . ' - ' . $this->gettext('print') . '" + content + "
"); ' . + '$("a").show(); $(".expand").hide(); win.print(); win.close();';// document.location.href="./?_task=settings&_action=plugin.plugin_manager_compress";'; + if($this->rcmail->config->get('plugin_manager_shared')){ + $priviledged = ''; + $printdetails = ''; + } + else{ + $priviledged = html::tag('li', null, html::tag('a', array('href' => './?_task=settings&_action=plugin.plugin_manager_transfer&_framed=1', 'style' => 'font-weight:normal; font-size: 12px'), str_replace(' ', ' ', $this->gettext('transfer')))) . + html::tag('li', null, html::tag('a', array('href' => 'javascript:document.forms.form.target="_blank";document.forms.form.action="' . str_replace('buycredits', 'mergecredits', $this->billingurl) .'";document.forms.form.submit()', 'style' => 'font-weight:normal; font-size: 12px'), str_replace(' ', ' ', $this->gettext('merge')))); + $printdetails = html::tag('div', array('style' => 'float:right;padding:3px;'), html::tag('a', array('href' => '#', 'onclick' => $print, 'style' => 'font-size:11px;'), $this->gettext('printdetails')) . ' '); + } + $content .= html::tag('fieldset', array('style' => 'border: 1px solid lightgrey; padding: 5px; margin-left: 0'), + html::tag('legend', array('style' => 'font-weight: normal; padding-bottom: 0;'), $this->gettext('details')) . + html::tag('ul', null, + html::tag('li', null, html::tag('a', array('href' => 'javascript:document.forms.form.target="_blank";document.forms.form.action="' . $this->billingurl .'";document.forms.form.submit()', 'style' => 'font-weight:normal; font-size: 12px'), str_replace(' ', ' ', $this->gettext('buynow')))) . + $priviledged . + html::tag('li', null, html::tag('span', array('style' => 'font-weight: bold; font-size: 12px;'), 'MyRC$ ' . ' ' . html::tag('span', array('id' => 'cdlcredits'), $account['credits']) . ' ' . html::tag('span', array('style' => 'font-weight: normal;'), '(' . $this->gettext('credits') . ')'))) . + html::tag('li', null, html::tag('span', array('style' => 'font-size: 12px;'), $this->gettext('history'))) . html::tag('br') . + html::tag('div', array('style' => 'float:left;padding:3px;'), html::tag('a', array('href' => '#', 'onclick' => 'document.location.href=document.location.href + "&_ts=' . time() . '"', 'style' => 'font-size:11px;'), $this->gettext('refresh'))) . + html::tag('div', array('style' => 'float:right;padding:3px;'), html::tag('a', array('href' => '#', 'onclick' => 'window.open("' . str_replace('?_task=billing&_action=buycredits', 'plugins/billing/prices.php?_ts=' . time(), $this->billingurl) . '")', 'style' => 'font-size:11px;'), $this->gettext('pricelist'))) . + $printdetails . + html::tag('table', array('id' => 'accountdetails', 'style' => 'font-weight: normal; font-size: 11px; border: 1px solid lightgrey;', 'border' => '0', 'cellpadding' => '0', 'cellspacing' => '0', 'width' => '100%'), $head . $free . $rows) + ) + ); + } + else{ + $content .= html::tag('span', array('style' => 'font-weight: normal; font-size: 11px'), $this->gettext('trylater')); + } + } + } + else{ + $content = ''; + } + $args['blocks']['plugin_manager_customer']['options'][0] = array( + 'title' => $content, + 'content' => '' + ); + $this->rcmail->output->add_script('if(self.location.href != parent.location.href){$(".mainaction").remove(); $("td").css("width", "1px");}', 'docready'); + } + return $args; + } + + function compress(){ + $params = array('_customer_id' => $this->rcmail->config->get('customer_id'), '_ip' => $this->getVisitorIP()); + $httpConfig['method'] = 'POST'; + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_compress'; + $httpConfig['timeout'] = '30'; + $httpConfig['params'] = $params; + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + header('Location: ./?_task=settings&_action=edit-prefs&_section=plugin_manager_customer&_framed=1'); + exit; + } + + function getCustomerID(){ + $params = array(); + $httpConfig['method'] = 'GET'; + $httpConfig['target'] = $this->svn . '?_action=plugin.plugin_server_customer_id'; + $httpConfig['timeout'] = '30'; + $httpConfig['params'] = $params; + $httpConfig['user_agent'] = 'MyRoundcube PHP/5.0'; + $http = new MyRCHttp(); + $http->initialize($httpConfig); + if(ini_get('safe_mode') || ini_get('open_basedir')){ + $http->useCurl(false); + } + $http->execute(); + $this->_log($httpConfig, $http); + if($http->error){ + $response = false; + } + else{ + $response = $http->result; + } + return $response; + } + + function save(){ + $ret = $this->saveprefs(array('section' => 'plugin_manager')); + if(class_exists('cookie_config')){ + cookie_config::plugin_manager_save($ret); + } + $saved = $this->rcmail->user->save_prefs($ret['prefs']); + $response = ''; + if($saved){ + if($ret['script']) + $response = $ret['script']; + $this->rcmail->output->command('plugin.plugin_manager_saved', $response); + } + else{ + $this->rcmail->output->command('plugin.plugin_manager_error', $response); + } + } + + function saveprefs($args){ + if($args['section'] == 'plugin_manager_settings'){ + if(strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $this->rcmail->output->show_message($this->gettext('demoaccount'), 'error'); + return $args; + } + $this->rcmail->session->remove('plugin_manager_settings'); + $defaults = get_input_value('_plugin_manager_defaults', RCUBE_INPUT_POST); + $newplugin = (array) get_input_value('_new_plugin_name', RCUBE_INPUT_POST); + $removeplugin = (array) get_input_value('_remove_plugin_name', RCUBE_INPUT_POST); + $skins = (array) get_input_value('_skins', RCUBE_INPUT_POST); + include INSTALL_PATH . 'plugins/plugin_manager/defaults.inc.php'; + $overwrite = $config['plugin_manager_defaults']; + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'defaults_overwrite'); + $overwrite = $this->rcmail->db->fetch_assoc($res); + if(is_array($overwrite)){ + $overwrite = unserialize($overwrite['value']); + if(!is_array($overwrite)){ + $overwrite = $config['plugin_manager_defaults']; + } + } + else{ + $overwrite = $config['plugin_manager_defaults']; + } + foreach($skins as $section => $plugins){ + foreach($plugins as $plugin => $skin){ + if($skin != 'all'){ + $overwrite[$section][$plugin]['skins'] = explode('|', $skin); + } + else{ + unset($overwrite[$section][$plugin]['skins']); + } + } + } + $sql = 'UPDATE ' . get_table_name('plugin_manager') . ' SET ' . $this->q('value') . '=? WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->query($sql, serialize($overwrite), 'defaults_overwrite'); + if(!$this->rcmail->db->affected_rows($res)){ + $sql = 'INSERT INTO ' . get_table_name('plugin_manager') . ' (' . $this->q('conf') . ', ' . $this->q('value') . ', ' . $this->q('type') . ') VALUES (?, ?, ?)'; + $this->rcmail->db->query($sql, 'defaults_overwrite', serialize($overwrite), 'array'); + } + foreach($removeplugin as $section => $plugin){ + if($plugin && file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/' . $plugin . '.php')){ + unset($overwrite[$section][$plugin]); + $sql = 'UPDATE ' . get_table_name('plugin_manager') . ' SET ' . $this->q('value') . '=? WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->query($sql, serialize($overwrite), 'defaults_overwrite'); + break; + } + } + foreach($newplugin as $section => $plugin){ + if($plugin && file_exists(INSTALL_PATH . 'plugins/' . $plugin . '/' . $plugin . '.php')){ + $overwrite[$section][$plugin] = array( + 'active' => false, + 'protected' => true, + 'label_name' => $plugin . '.pluginname', + 'label_description' => $plugin . '.plugindescription' + ); + $sql = 'UPDATE ' . get_table_name('plugin_manager') . ' SET ' . $this->q('value') . '=? WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->query($sql, serialize($overwrite), 'defaults_overwrite'); + break; + } + } + if(is_array($defaults)){ + foreach($this->defaults as $section => $plugins){ + foreach($plugins as $plugin => $props){ + foreach($props as $prop => $value){ + if($prop == 'active' || $prop == 'protected'){ + if(!isset($defaults[$section][$plugin][$prop])){ + $defaults[$section][$plugin][$prop] = false; + } + } + } + } + } + $defaults = serialize($defaults); + $sql = 'DELETE FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $this->rcmail->db->query($sql, 'defaults'); + $sql = 'INSERT INTO ' . get_table_name('plugin_manager') . '(' . $this->q('conf') . ', ' . $this->q('value') . ', ' . $this->q('type') . ') VALUES (?, ?, ?)'; + $this->rcmail->db->query($sql, 'defaults', $defaults, 'array'); + $this->rcmail->session->remove('plugin_manager_defaults'); + $defaults = unserialize($defaults); + if($defaults['globalplugins']['sabredav']['active'] == 1){ + $this->require_plugin('sabredav'); + } + } + if($this->admins[$this->rcmail->user->data['username']] == 0){ + $this->rcmail->user->save_prefs( + array( + 'plugin_manager_show_myrc_messages' => get_input_value('_plugin_manager_show_myrc_messages', RCUBE_INPUT_POST), + 'plugin_manager_translation_account' => trim(get_input_value('_plugin_manager_translation_account', RCUBE_INPUT_POST)), + 'plugin_manager_translation_server' => trim(get_input_value('_plugin_manager_translation_server', RCUBE_INPUT_POST)), + ) + ); + $sql = 'DELETE FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . ' LIKE ?'; + $this->rcmail->db->query($sql, '_plugin_manager_%'); + $keys = array('_plugin_manager_update_notifications', '_plugin_manager_update_notifications_cc', '_plugin_manager_maintenance_mode', '_plugin_manager_file_based_config', '_plugin_manager_use_ssl', '_plugin_manager_hmail', '_plugin_manager_load_splitter', '_plugin_manager_compress_html', '_plugin_manager_about_link', '_plugin_manager_myroundcube_watermark', '_plugin_manager_remove_watermark', '_plugin_manager_support_link'); + foreach($keys as $key){ + $save = get_input_value($key, RCUBE_INPUT_POST); + $sql = 'INSERT INTO ' . get_table_name('plugin_manager') . ' (conf, value, type) VALUES (?, ?, ?)'; + if(is_null($save) || is_numeric($save)){ + $this->rcmail->db->query($sql, $key, $save ? 1: 0, 'bool'); + } + else if(is_array($save)){ + $this->rcmail->db->query($sql, $key, serialize($save), 'array'); + } + else if(is_string($save)){ + $this->rcmail->db->query($sql, $key, trim($save), 'string'); + } + } + } + else{ + $keys = array('_plugin_manager_maintenance_mode'); + foreach($keys as $key){ + $sql = 'DELETE FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . ' LIKE ?'; + $this->rcmail->db->query($sql, $key); + $save = get_input_value($key, RCUBE_INPUT_POST); + $sql = 'INSERT INTO ' . get_table_name('plugin_manager') . ' (conf, value, type) VALUES (?, ?, ?)'; + $this->rcmail->db->query($sql, $key, $save ? 1: 0, 'bool'); + } + $this->rcmail->user->save_prefs( + array( + 'plugin_manager_show_myrc_messages' => get_input_value('_plugin_manager_show_myrc_messages', RCUBE_INPUT_POST), + 'plugin_manager_translation_account' => trim(get_input_value('_plugin_manager_translation_account', RCUBE_INPUT_POST)), + 'plugin_manager_translation_server' => trim(get_input_value('_plugin_manager_translation_server', RCUBE_INPUT_POST)) + ) + ); + } + if($plugin = get_input_value('_plugin', RCUBE_INPUT_GET)){ + $append = '&_expand='. $plugin; + } + else{ + $append = ''; + } + if(get_input_value('_plugin_manager_maintenance_mode', RCUBE_INPUT_POST)){ + $prefix = ''; + if(class_exists('tabbed')){ + $prefix = 'parent.'; + } + $this->rcmail->output->add_script($prefix . "parent.location.href='./?_task=settings&_next=plugin_manager_settings';", 'docready'); + return $args; + } + else{ + header('Location: ./?_task=settings&_action=edit-prefs&_section=plugin_manager_settings&_framed=1&_pmmsg=successfullysaved' . $append); + exit; + } + } + if($args['section'] == 'plugin_manager_admins'){ + if(strtolower($this->get_demo($_SESSION['username'])) == strtolower(sprintf($this->rcmail->config->get('demo_user_account'),""))){ + $this->rcmail->output->show_message($this->gettext('demoaccount'), 'error'); + return $args; + } + $sql = 'SELECT * FROM ' . get_table_name('plugin_manager') . ' WHERE ' . $this->q('conf') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, 'admins'); + $admins = $this->rcmail->db->fetch_assoc($res); + if(!$admins = unserialize($admins['value'])){ + $admins = array(); + } + $merge = get_input_value('_plugin_manager_admins', RCUBE_INPUT_POST); + $admins = array_merge(array($this->rcmail->user->data['username']), $merge); + $save = array(); + foreach($admins as $idx => $admin){ + if($admin){ + $sql = 'SELECT ' . $this->q('username') . ' FROM ' . get_table_name('users') . ' WHERE ' . $this->q('username') . '=?'; + $res = $this->rcmail->db->limitquery($sql, 0, 1, strtolower($admin)); + if($res){ + if(is_array($this->rcmail->db->fetch_assoc($res))){ + $save[] = $admin; + } + else{ + $this->rcmail->output->show_message($this->gettext('accountnotexists'), 'error'); + } + } + } + } + asort($save); + $save = array_merge(array($this->rcmail->user->data['username']), $save); + $save = array_unique($save); + $sql = 'UPDATE ' . get_table_name('plugin_manager') . ' SET ' . $this->q('value') . '=? WHERE ' . $this->q('conf') . '=?'; + $this->rcmail->db->query($sql, serialize($save), 'admins'); + foreach($admins as $idx => $admin){ + if($idx == 0) continue; + $config = get_input_value('_plugin_manager_config', RCUBE_INPUT_POST); + $sql = 'SELECT ' . $this->q('preferences') . ' FROM ' . get_table_name('users') . ' WHERE ' . $this->q('username') . '=? AND ' . $this->q('mail_host') . '=?'; + if($res = $this->rcmail->db->limitquery($sql, 0, 1, $admin, $_SESSION['storage_host'])){ + $prefs = $this->rcmail->db->fetch_assoc($res); + if($prefs = unserialize($prefs['preferences'])){ + if(isset($config[$admin])){ + $prefs = serialize(array_merge($prefs, array('plugin_manager_hash' => $this->rcmail->config->get('plugin_manager_hash')))); + } + else{ + unset($prefs['plugin_manager_hash']); + $prefs = serialize($prefs); + } + } + else{ + if(isset($config[$admin])){ + $prefs = serialize(array('plugin_manager_hash' => $this->rcmail->config->get('plugin_manager_hash'))); + } + else{ + $prefs = serialize(array()); + } + } + $sql = 'UPDATE ' . get_table_name('users') . ' SET ' . $this->q('preferences') . '=? WHERE ' . $this->q('username') . '=? AND ' . $this->q('mail_host') . '=?'; + $this->rcmail->db->query($sql, $prefs, $admin, $_SESSION['storage_host']); + } + } + foreach($admins as $idx => $admin){ + if($idx == 0) continue; + $config = get_input_value('_plugin_manager_customer', RCUBE_INPUT_POST); + $sql = 'SELECT ' . $this->q('preferences') . ' FROM ' . get_table_name('users') . ' WHERE ' . $this->q('username') . '=? AND ' . $this->q('mail_host') . '=?'; + if($res = $this->rcmail->db->limitquery($sql, 0, 1, $admin, $_SESSION['storage_host'])){ + $prefs = $this->rcmail->db->fetch_assoc($res); + if($prefs = unserialize($prefs['preferences'])){ + if(isset($config[$admin])){ + $prefs = serialize(array_merge($prefs, array('shared_customer_id' => $this->rcmail->config->get('customer_id'), 'plugin_manager_shared' => $this->rcmail->user->data['username'], 'own_customer_id' => $prefs['own_customer_id'] ? $prefs['own_customer_id'] : $prefs['customer_id']))); + } + else{ + if(isset($prefs['own_customer_id'])){ + $prefs['customer_id'] = $prefs['own_customer_id']; + } + unset($prefs['own_customer_id']); + unset($prefs['shared_customer_id']); + unset($prefs['plugin_manager_shared']); + $prefs = serialize($prefs); + } + } + else{ + if(isset($config[$admin])){ + $prefs = serialize(array('shared_customer_id' => $this->rcmail->config->get('customer_id'), 'plugin_manager_shared' => $this->rcmail->user->data['username'], 'own_customer_id' => $prefs['own_customer_id'] ? $prefs['own_customer_id'] : $prefs['customer_id'])); + } + else{ + $prefs = serialize(array()); + } + } + $sql = 'UPDATE ' . get_table_name('users') . ' SET ' . $this->q('preferences') . '=? WHERE ' . $this->q('username') . '=? AND ' . $this->q('mail_host') . '=?'; + $this->rcmail->db->query($sql, $prefs, $admin, $_SESSION['storage_host']); + } + } + } + else if($args['section'] == 'plugin_manager'){ + $plugins = $this->config; + $pactive = $this->rcmail->config->get('plugin_manager_active', array()); + $user = $this->rcmail->config->get('plugin_manager_user', array()); + $config_plugin = get_input_value('_config_plugin', RCUBE_INPUT_POST); + $active = array(); + $add_script = ''; + foreach($plugins as $sections => $section){ + foreach($section as $plugin => $props){ + $posted = get_input_value('_plugin_manager_' . $plugin, RCUBE_INPUT_POST); + if($posted){ + $plugins[$sections][$plugin]['active'] = 1; + $active[$plugin] = 1; + if($props['config'] && $config_plugin == $plugin){ + if($props['section']){ + $add_script .= "try{parent.rcmail.sections_list.select('" . $props['section'] . "')}catch(e){parent.rcmail.sections_list.clear_selection()};"; + if($props['config']){ + if($props['section'] == 'accountlink'){ + if($this->rcmail->config->get('skin', 'classic') == 'larry'){ + $add_script .= "parent.$('#preferences-frame').attr('src', '" . $props['config'] . "');"; + } + else{ + $add_script .= "parent.$('#prefs-frame').attr('src', '" . $props['config'] . "');"; + } + } + else + $add_script .= "document.location.href='" . $props['config'] . "';"; + } + } + } + else if($props['reload'] && !$add_script){ + if($plugins[$sections][$plugin]['active'] != $pactive[$plugin]){ + $add_script .= "parent.location.href='./?_task=settings&_action=plugin.plugin_manager&_section=plugin_manager';"; + } + } + } + else{ + $plugins[$sections][$plugin]['active'] = 0; + $active[$plugin] = 0; + if($props['reload'] && !$add_script){ + if($plugins[$sections][$plugin]['active'] != $pactive[$plugin]) + $add_script .= "parent.location.href='./?_task=settings&_action=plugin.plugin_manager&_section=plugin_manager';"; + if($plugin == 'wrapper' && $add_script) + $add_script .= 'parent.' . $add_script; + } + if(is_array($plugins[$sections][$plugin]['unset'])){ + $unsets = $plugins[$sections][$plugin]['unset']; + } + else if(is_string($plugins[$sections][$plugin]['unset'])){ + $unsets = array($plugins[$sections][$plugin]['unset']); + } + if(is_array($unsets)){ + foreach($unsets as $pref => $value){ + $new = $this->rcmail->config->get($value); + $sav = $value; + $array = $this->rcmail->config->get($pref); + if(is_array($array)){ + $new = $array; + $sav = $pref; + } + if(is_array($new)){ + $new = $this->rcmail->config->get($pref); + unset($new[$pref]); + foreach($new as $key => $val){ + if($val == $value){ + unset($new[$key]); + } + } + if(is_numeric($key)) + $new = array_values($new); + } + else{ + $new = false; + unset($prefs[$sav]); + } + $args['prefs'][$sav] = $new; + } + } + } + } + } + $remote = get_input_value('_remote', RCUBE_INPUT_POST); + if($add_script){ + if($remote) + $args['script'] = $add_script; + else + $this->rcmail->output->add_script($add_script); + } + $args['prefs']['plugin_manager_active'] = $active; + } + else if($args['section'] == 'plugin_manager_customer'){ + if($id = get_input_value('_customer_id', RCUBE_INPUT_POST)){ + $args['prefs']['customer_id'] = $id; + } + } + return $args; + } + + function labels($label, $s = false){ + $temparr = explode('.', $label); + if(count($temparr) > 1){ + // plugin label + if(!is_array($this->labels[$temparr[0]])){ + $plugins = $this->rcmail->config->get($this->plugin, array()); + foreach($plugins as $sections => $section){ + foreach($section as $plugin => $props){ + if($plugin == $temparr[0]){ + $localization = $props['localization']; + break; + } + } + if($localization){ + break; + } + } + if(!$localization) + $localization = 'localization'; + $path = INSTALL_PATH . 'plugins/' . $temparr[0] . '/' . $localization; + $file = $path . '/en_US.inc'; + @include $file; + $file = $path . '/' . $_SESSION['language'] . '.inc'; + $en_labels = $labels; + $en_msgs = $messages; + @include $file; + if(is_array($en_labels) && is_array($labels)) + $labels = array_merge($en_labels, $labels); + if(is_array($en_msgs) && is_array($messages)) + $messages = array_merge($en_msgs, $messages); + if(is_array($labels) && is_array($messages)) + $labels = array_merge($messages, $labels); + $this->labels[$temparr[0]] = $labels; + } + if($this->labels[$temparr[0]][$temparr[1]]){ + $label = $this->labels[$temparr[0]][$temparr[1]]; + } + else{ + $pm_label = $this->gettext($temparr[0] . '_' . $temparr[1]); + if(substr($label, 0, 1) == '[' && substr($label, strlen($label) - 1, 1) == ']'){ + $label = '[' . $label . ']'; + } + else{ + $label = $pm_label; + } + } + } + else{ + // default label + $label = $this->gettext($label); + } + if(substr($label, 0, 1) == '[' && substr($label, strlen($label) - 1, 1) == ']'){ + // return best hestimation + $label = ucwords(substr(str_replace('_', ' ', $label), 1,strlen($label) - 2)); + $label = '['.str_replace('.plugindescription', '', str_replace('.pluginname', '', $label)).']'; + } + if($s || strpos($label, '%s') !== false){ + if(!$s){ + $s = ''; + } + $label = sprintf($label, $s); + } + return Q($label); + } + + function q($str){ + return $this->rcmail->db->quoteIdentifier($str); + } + + function fix_table_names($sql, $tables){ + foreach($tables as $table){ + $real_table = get_table_name($table); + if($real_table != $table){ + $sql = preg_replace("/([^a-z0-9_])$table([^a-z0-9_])/i", "\\1$real_table\\2", $sql); + } + } + return $sql; + } + + function AllPermutations($InArray, $InProcessedArray = array()){ + $ReturnArray = array(); + foreach($InArray as $Key=>$value){ + $CopyArray = $InProcessedArray; + $CopyArray[$Key] = $value; + $TempArray = array_diff_key($InArray, $CopyArray); + if(count($TempArray) == 0){ + $ReturnArray[] = $CopyArray; + } + else{ + $ReturnArray = array_merge($ReturnArray, $this->AllPermutations($TempArray, $CopyArray)); + } + } + return $ReturnArray; + } + + function comment2ul($string){ + $string = '
  • ' . preg_replace('//', "
  • ", $string) . '
  • '; + return html::tag('ul', array('class' => 'pm_update'), str_replace('
  • ', '', $string)); + } + + function get_demo($string){ + $temparr = explode("@",$string); + return preg_replace ('/[0-9 ]/i', '', $temparr[0]) . "@" . $temparr[count($temparr)-1]; + } + + function getVisitorIP(){ + return rcube_utils::remote_addr(); + } + + function html_compress($p){ + $page = $p['content']; + $reg = '/<(pre|textarea|script|style|code).*?>(.*?)<(\/pre|\/textarea|\/script|\/style|\/code)>/imsu'; + $count = preg_match_all($reg, $page, $nocompress); + if($count > 0){ + foreach($nocompress[0] as $content){ + $page = str_replace($content, '', $page); + } + } + $search = array( + '/\>[^\S ]+/s', //strip whitespaces after tags, except space + '/[^\S ]+\', + '<', + '\\1' + ); + $page = preg_replace($search, $replace, $page); + if($count > 0){ + foreach($nocompress[0] as $content){ + $page = str_replace('', $content, $page); + } + } + $p['content'] = $page; + return $p; + } + + function gethost(){ + if($host = $_SERVER['HTTP_X_FORWARDED_HOST']){ + $elements = explode(',', $host); + $host = trim(end($elements)); + } + else{ + if(!$host = $_SERVER['HTTP_HOST']){ + if(!$host = $_SERVER['SERVER_NAME']){ + $host = !empty($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : ''; + } + } + } + $host = preg_replace('/:\d+$/', '', $host); + if(!$host){ + $host = 'localhost'; + } + return trim($host); + } + + function sendmail($from, $to, $cc, $subject, $body){ + $return = false; + if($from && ($to || $cc) && $subject && $body){ + $body = str_replace('&', '&', $body); + $LINE_LENGTH = $this->rcmail->config->get('line_length', 72); + $h2t = new html2text($body, false, true, 0); + $txt = rc_wordwrap($h2t->get_text(), $LINE_LENGTH, "\r\n"); + $msg = array('subject' => '=?UTF-8?B?'. base64_encode($subject) . '?=', 'htmlbody' => $body, 'txtbody' => $txt); + $ctb = md5(rand() . microtime()); + $headers = "Return-Path: $from\r\n"; + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-Type: multipart/alternative; boundary=\"=_$ctb\"\r\n"; + $headers .= "Reply-To: " . $this->replyto . "\r\n"; + $headers .= "Date: " . date('r', time()) . "\r\n"; + $headers .= "From: MyRoundcube Update Notifier <$from>\r\n"; + if($to){ + $headers .= "To: $to\r\n"; + } + if($cc){ + $headers .= "CC: $cc\r\n"; + } + $headers .= "Subject: " . $msg['subject'] . "\r\n"; + $headers .= "Reply-To: $from\r\n"; + $msg_body .= "Content-Type: multipart/alternative; boundary=\"=_$ctb\"\r\n\r\n"; + $txt_body = "--=_$ctb"; + $txt_body .= "\r\n"; + $txt_body .= "Content-Transfer-Encoding: 7bit\r\n"; + $txt_body .= "Content-Type: text/plain; charset=" . RCMAIL_CHARSET . "\r\n"; + $txt = rc_wordwrap($msg['txtbody'], $LINE_LENGTH, "\r\n"); + $txt = wordwrap($txt, 998, "\r\n", true); + $txt_body .= "$txt\r\n"; + $txt_body .= "--=_$ctb"; + $txt_body .= "\r\n"; + $msg_body .= $txt_body; + $msg_body .= "Content-Transfer-Encoding: quoted-printable\r\n"; + $msg_body .= "Content-Type: text/html; charset=" . RCMAIL_CHARSET . "\r\n\r\n"; + $msg_body .= str_replace("=","=3D",$msg['htmlbody']); + $msg_body .= "\r\n\r\n"; + $msg_body .= "--=_$ctb--"; + $msg_body .= "\r\n\r\n"; + if(!is_object($this->rcmail->smtp)){ + $this->rcmail->smtp_init(true); + } + $this->rcmail->smtp->connect(); + if(!$to){ + $to = $cc; + } + $return = $this->rcmail->smtp->send_mail($from, $to, $headers, $msg_body); + } + return $return; + } + + private function _log($config, $http){ + if($this->log){ + write_log('plugin_manager', '--- REQUEST ----'); + write_log('plugin_manager', $config); + write_log('plugin_manager', '--- RESPONSE ---'); + write_log('plugin_manager', $http->error ? $http->error : $http->result); + } + } +} +?> \ No newline at end of file -- cgit v1.2.3