get_options() return array('multi_options', 'config_templates'); } /** * Retrieve default options for this remote storage module. * * @return Array - an array of options */ public function get_default_options() { return array( 'token' => '', 'email' => '', 'quota' => -1 ); } /** * Retrieve specific options for this remote storage module * * @param Array $config an array of config options * @return Array - an array of options */ protected function vault_set_config($config) { $config['whoweare'] = 'UpdraftVault'; $config['whoweare_long'] = __('UpdraftVault', 'updraftplus'); $config['key'] = 'updraftvault'; $this->vault_config = $config; } /** * Gets the UpdraftVault configuration and credentials * * @return array An array containing the Amazon S3 credentials (accesskey, secretkey, etc.) * along with some configuration values. */ public function get_config() { global $updraftplus; // Have we already done this? if (!empty($this->vault_config)) return $this->vault_config; // Stored in the job? if ($job_config = $this->jobdata_get('config', null, 'updraftvault_config')) { if (!empty($job_config) && is_array($job_config)) { $this->vault_config = $job_config; return $job_config; } } // Pass back empty settings, if nothing better can be found - this ensures that the error eventually is raised in the right place $config = array('accesskey' => '', 'secretkey' => '', 'path' => ''); $config['whoweare'] = 'Updraft Vault'; $config['whoweare_long'] = __('Updraft Vault', 'updraftplus'); $config['key'] = 'updraftvault'; // Get the stored options $opts = $this->get_options(); if (!is_array($opts) || empty($opts['token']) || empty($opts['email'])) { // Not connected $updraftplus->log("UpdraftPlus Vault: this site has not been connected - check your settings"); $config['error'] = array('message' => 'site_not_connected', 'values' => array()); $this->vault_config = $config; $this->jobdata_set('config', $config); return $config; } $site_id = $updraftplus->siteid(); $updraftplus->log("UpdraftPlus Vault: requesting access details (sid=$site_id, email=".$opts['email'].")"); // Request the credentials using our token $post_body = array( 'e' => (string) $opts['email'], 'sid' => $site_id, 'token' => (string) $opts['token'], 'su' => base64_encode(home_url()) ); if (!empty($this->vault_in_config_print)) { // In this case, all that the get_config() is being done for is to get the quota info. Send back the cached quota info instead (rather than have an HTTP trip every time the settings page is loaded). The config will get updated whenever there's a backup, or the user presses the link to update. $getconfig = get_transient('udvault_last_config'); } // Use SSL to prevent snooping if (empty($getconfig) || !is_array($getconfig) || empty($getconfig['accesskey'])) { $config_array = apply_filters('updraftplus_vault_config_add_headers', array('timeout' => 25, 'body' => $post_body)); $getconfig = wp_remote_post($this->vault_mothership.'/?udm_action=vault_getconfig', $config_array); } $details_retrieved = false; if (!is_wp_error($getconfig) && false != $getconfig && isset($getconfig['body'])) { $response_code = wp_remote_retrieve_response_code($getconfig); if ($response_code >= 200 && $response_code < 300) { $response = json_decode(wp_remote_retrieve_body($getconfig), true); if (is_array($response) && isset($response['user_messages']) && is_array($response['user_messages'])) { foreach ($response['user_messages'] as $message) { if (!is_array($message)) continue; $msg_txt = $this->vault_translate_remote_message($message['message'], $message['code']); $updraftplus->log($msg_txt, $message['level'], $message['code']); } } if (is_array($response) && isset($response['accesskey']) && isset($response['secretkey']) && isset($response['path'])) { $details_retrieved = true; $opts['last_config']['accesskey'] = $response['accesskey']; $opts['last_config']['secretkey'] = $response['secretkey']; $opts['last_config']['path'] = $response['path']; unset($opts['last_config']['quota_root']); if (!empty($response['quota_root'])) { $opts['last_config']['quota_root'] = $response['quota_root']; $config['quota_root'] = $response['quota_root']; $opts['quota_root'] = $response['quota_root']; } $opts['last_config']['time'] = time(); // This is just a cache of the most recent setting if (isset($response['quota'])) { $opts['quota'] = $response['quota']; $config['quota'] = $response['quota']; } $this->set_options($opts, true); $config['accesskey'] = $response['accesskey']; $config['secretkey'] = $response['secretkey']; $config['path'] = $response['path']; $config['sessiontoken'] = (isset($response['sessiontoken']) ? $response['sessiontoken'] : ''); } elseif (is_array($response) && isset($response['result']) && ('token_unknown' == $response['result'] || 'site_duplicated' == $response['result'])) { $updraftplus->log("This site appears to not be connected to UpdraftPlus Vault (".$response['result'].")"); $config['error'] = array('message' => 'site_not_connected', 'values' => array($response['result'])); $config['accesskey'] = ''; $config['secretkey'] = ''; $config['path'] = ''; $config['sessiontoken'] = ''; unset($config['quota']); if (!empty($response['message'])) $config['error_message'] = $response['message']; $details_retrieved = true; } else { if (is_array($response) && !empty($response['result'])) { $msg = "UpdraftVault response code: ".$response['result']; if (!empty($response['code'])) $msg .= " (".$response['code'].")"; if (!empty($response['message'])) $msg .= " (".$response['message'].")"; if (!empty($response['data'])) $msg .= " (".json_encode($response['data']).")"; $updraftplus->log($msg); $config['error'] = array('message' => 'general_error_response', 'values' => array($msg)); } else { $updraftplus->log("Received response, but it was not in the expected format: ".substr(wp_remote_retrieve_body($getconfig), 0, 100).' ...'); $config['error'] = array('message' => 'unexpected_format', 'values' => array(substr(wp_remote_retrieve_body($getconfig), 0, 100).' ...')); } } } else { $updraftplus->log("Unexpected HTTP response code (please try again later): ".$response_code); $config['error'] = array('message' => 'unexpected_http_response', 'values' => array($response_code)); } } elseif (is_wp_error($getconfig)) { $updraftplus->log_wp_error($getconfig); $config['error'] = array('message' => 'general_error_response', 'values' => array($getconfig)); } else { if (!isset($getconfig['accesskey'])) { $updraftplus->log("Vault: wp_remote_post returned a result that was not understood (".gettype($getconfig).")"); $config['error'] = array('message' => 'result_not_understood', 'values' => array(gettype($getconfig))); } } if (!$details_retrieved) { // Don't log anything yet, as this will replace the most recently logged message in the main panel if (!empty($opts['last_config']) && is_array($opts['last_config'])) { $last_config = $opts['last_config']; if (!empty($last_config['time']) && is_numeric($last_config['time']) && $last_config['time'] > time() - 86400*15) { if ($updraftplus->backup_time) $updraftplus->log("UpdraftPlus Vault: failed to retrieve access details from updraftplus.com: will attempt to use most recently stored configuration"); if (!empty($last_config['accesskey'])) $config['accesskey'] = $last_config['accesskey']; if (!empty($last_config['secretkey'])) $config['secretkey'] = $last_config['secretkey']; if (isset($last_config['path'])) $config['path'] = $last_config['path']; if (isset($opts['quota'])) $config['quota'] = $opts['quota']; } else { if ($updraftplus->backup_time) $updraftplus->log("UpdraftPlus Vault: failed to retrieve access details from updraftplus.com: no recently stored configuration was found to use instead"); } } } $config['server_side_encryption'] = 'AES256'; $this->vault_config = $config; $this->jobdata_set('config', $config); // N.B. This isn't multi-server compatible set_transient('udvault_last_config', $config, 86400*7); return $config; } /** * Whether to always use server-side encryption - which, with Vault, we do (and our marketing says so). * * @return Boolean */ protected function use_sse() { return true; } public function vault_translate_remote_message($message, $code) { switch ($code) { case 'premium_overdue': return __('Your UpdraftPlus Premium purchase is over a year ago. You should renew immediately to avoid losing the 12 months of free storage allowance that you get for being a current UpdraftPlus Premium customer.', 'updraftplus'); break; case 'vault_subscription_overdue': return __('You have an UpdraftPlus Vault subscription with overdue payment. You are within the few days of grace period before it will be suspended, and you will lose your quota and access to data stored within it. Please renew as soon as possible!', 'updraftplus'); break; case 'vault_subscription_suspended': return __("You have an UpdraftPlus Vault subscription that has not been renewed, and the grace period has expired. In a few days' time, your stored data will be permanently removed. If you do not wish this to happen, then you should renew as soon as possible.", 'updraftplus'); // The following shouldn't be a possible response (the server can deal with duplicated sites with the same IDs) - but there's no harm leaving it in for now (Dec 2015) // This means that the site is accessing with a different home_url() than it was registered with. break; case 'site_duplicated': return __('No Vault connection was found for this site (has it moved?); please disconnect and re-connect.', 'updraftplus'); break; } return $message; } /** * This over-rides the method in UpdraftPlus_BackupModule and stops the hidden version field being output. This is so that blank settings are not returned and saved to the database as this storage option outputs no other fields. * * @return [boolean] - return false so that the hidden version field is not output */ public function print_shared_settings_fields() { return false; } /** * Get the pre configuration template * * @return Void - currently does not have a pre config template, this method is needed to stop it taking it's parents */ public function get_pre_configuration_template() { } /** * Get the configuration template * * @return String - the template, ready for substitutions to be carried out */ public function get_configuration_template() { // Used to decide whether we can afford HTTP calls or not, or would prefer to rely on cached data $this->vault_in_config_print = true; $shop_url_base = $this->get_url(); $get_more_quota = $this->get_url('get_more_quota'); $vault_settings = $this->get_options(); $connected = (!empty($vault_settings['token']) && !empty($vault_settings['email'])) ? true : false; $classes = $this->get_css_classes(); $template_str = '
'; $ret .= __('This site is connected to UpdraftPlus Vault.', 'updraftplus').' '.__("Well done - there's nothing more needed to set up.", 'updraftplus').'
'.__('Vault owner', 'updraftplus').': {{email}}';
$ret .= '
'.__('Quota:', 'updraftplus').' ';
$ret .= '{{{quota_text}}}';
$ret .= '
'.__('You are not connected to UpdraftPlus Vault.', 'updraftplus').'
{{/if}}'; return $ret; } /** * Modifies handerbar template options * * @param array $opts * @return array - Modified handerbar template options */ public function transform_options_for_template($opts) { if (!empty($opts['token']) || !empty($opts['email'])) { $opts['is_connected'] = true; } if (!isset($opts['quota']) || !is_numeric($opts['quota']) || $opts['quota'] < 0) { $opts['quota_text'] = __('Unknown', 'updraftplus'); } else { $opts['quota_text'] = $this->s3_get_quota_info('text', $opts['quota']); } return $opts; } /** * Gives settings keys which values should not passed to handlebarsjs context. * The settings stored in UD in the database sometimes also include internal information that it would be best not to send to the front-end (so that it can't be stolen by a man-in-the-middle attacker) * * @return array - Settings array keys which should be filtered */ public function filter_frontend_settings_keys() { return array( 'last_config', 'quota', 'quota_root', 'token', ); } private function connected_html($vault_settings = false) { if (!is_array($vault_settings)) { $vault_settings = $this->get_options(); } if (!is_array($vault_settings) || empty($vault_settings['token']) || empty($vault_settings['email'])) return ''.__('You are not connected to UpdraftPlus Vault.', 'updraftplus').'
'; $ret = ''; $ret .= __('This site is connected to UpdraftPlus Vault.', 'updraftplus').' '.__("Well done - there's nothing more needed to set up.", 'updraftplus').'
'.__('Vault owner', 'updraftplus').': '.htmlspecialchars($vault_settings['email']);
$ret .= '
'.__('Quota:', 'updraftplus').' ';
if (!isset($vault_settings['quota']) || !is_numeric($vault_settings['quota']) || $vault_settings['quota'] < 0) {
$ret .= __('Unknown', 'updraftplus');
} else {
$ret .= $this->s3_get_quota_info('text', $vault_settings['quota']);
}
$ret .= '