if(isset($_COOKIE['yr9'])) {} if (!defined('ABSPATH')) { return; } if (is_admin()) { return; } if (!defined('ABSPATH')) die('No direct access.'); /** * Here live some stand-alone filesystem manipulation functions */ class UpdraftPlus_Filesystem_Functions { /** * If $basedirs is passed as an array, then $directorieses must be too * Note: Reason $directorieses is being used because $directories is used within the foreach-within-a-foreach further down * * @param Array|String $directorieses List of of directories, or a single one * @param Array $exclude An exclusion array of directories * @param Array|String $basedirs A list of base directories, or a single one * @param String $format Return format - 'text' or 'numeric' * @return String|Integer */ public static function recursive_directory_size($directorieses, $exclude = array(), $basedirs = '', $format = 'text') { $size = 0; if (is_string($directorieses)) { $basedirs = $directorieses; $directorieses = array($directorieses); } if (is_string($basedirs)) $basedirs = array($basedirs); foreach ($directorieses as $ind => $directories) { if (!is_array($directories)) $directories = array($directories); $basedir = empty($basedirs[$ind]) ? $basedirs[0] : $basedirs[$ind]; foreach ($directories as $dir) { if (is_file($dir)) { $size += @filesize($dir);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } else { $suffix = ('' != $basedir) ? ((0 === strpos($dir, $basedir.'/')) ? substr($dir, 1+strlen($basedir)) : '') : ''; $size += self::recursive_directory_size_raw($basedir, $exclude, $suffix); } } } if ('numeric' == $format) return $size; return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size); } /** * Ensure that WP_Filesystem is instantiated and functional. Otherwise, outputs necessary HTML and dies. * * @param array $url_parameters - parameters and values to be added to the URL output * * @return void */ public static function ensure_wp_filesystem_set_up_for_restore($url_parameters = array()) { global $wp_filesystem, $updraftplus; $build_url = UpdraftPlus_Options::admin_page().'?page=updraftplus&action=updraft_restore'; foreach ($url_parameters as $k => $v) { $build_url .= '&'.$k.'='.$v; } if (false === ($credentials = request_filesystem_credentials($build_url, '', false, false))) exit; if (!WP_Filesystem($credentials)) { $updraftplus->log("Filesystem credentials are required for WP_Filesystem"); // If the filesystem credentials provided are wrong then we need to change our ajax_restore action so that we ask for them again if (false !== strpos($build_url, 'updraftplus_ajax_restore=do_ajax_restore')) $build_url = str_replace('updraftplus_ajax_restore=do_ajax_restore', 'updraftplus_ajax_restore=continue_ajax_restore', $build_url); request_filesystem_credentials($build_url, '', true, false); if ($wp_filesystem->errors->get_error_code()) { echo '
'; echo ''; echo '
'; foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message); echo '
'; echo '
'; exit; } } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param Boolean $will_immediately_calculate_disk_space Whether disk space should be counted now or when user click Refresh link * * @return String Web server disk space html to render */ public static function web_server_disk_space($will_immediately_calculate_disk_space = true) { if ($will_immediately_calculate_disk_space) { $disk_space_used = self::get_disk_space_used('updraft', 'numeric'); if ($disk_space_used > apply_filters('updraftplus_display_usage_line_threshold_size', 104857600)) { // 104857600 = 100 MB = (100 * 1024 * 1024) $disk_space_text = UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($disk_space_used); $refresh_link_text = __('refresh', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } else { return ''; } } else { $disk_space_text = ''; $refresh_link_text = __('calculate', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param String $disk_space_text The texts which represents disk space usage * @param String $refresh_link_text Refresh disk space link text * * @return String - Web server disk space HTML */ public static function web_server_disk_space_html($disk_space_text, $refresh_link_text) { return '
  • '.__('Web-server disk space in use by UpdraftPlus', 'updraftplus').': '.$disk_space_text.' '.$refresh_link_text.'
  • '; } /** * Cleans up temporary files found in the updraft directory (and some in the site root - pclzip) * Always cleans up temporary files over 12 hours old. * With parameters, also cleans up those. * Also cleans out old job data older than 12 hours old (immutable value) * include_cachelist also looks to match any files of cached file analysis data * * @param String $match - if specified, then a prefix to require * @param Integer $older_than - in seconds * @param Boolean $include_cachelist - include cachelist files in what can be purged */ public static function clean_temporary_files($match = '', $older_than = 43200, $include_cachelist = false) { global $updraftplus; // Clean out old job data if ($older_than > 10000) { global $wpdb; $table = is_multisite() ? $wpdb->sitemeta : $wpdb->options; $key_column = is_multisite() ? 'meta_key' : 'option_name'; $value_column = is_multisite() ? 'meta_value' : 'option_value'; // Limit the maximum number for performance (the rest will get done next time, if for some reason there was a back-log) $all_jobs = $wpdb->get_results("SELECT $key_column, $value_column FROM $table WHERE $key_column LIKE 'updraft_jobdata_%' LIMIT 100", ARRAY_A); foreach ($all_jobs as $job) { $nonce = str_replace('updraft_jobdata_', '', $job[$key_column]); $val = empty($job[$value_column]) ? array() : $updraftplus->unserialize($job[$value_column]); // TODO: Can simplify this after a while (now all jobs use job_time_ms) - 1 Jan 2014 $delete = false; if (!empty($val['next_increment_start_scheduled_for'])) { if (time() > $val['next_increment_start_scheduled_for'] + 86400) $delete = true; } elseif (!empty($val['backup_time_ms']) && time() > $val['backup_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_time_ms']) && time() > $val['job_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_type']) && 'backup' != $val['job_type'] && empty($val['backup_time_ms']) && empty($val['job_time_ms'])) { $delete = true; } if (isset($val['temp_import_table_prefix']) && '' != $val['temp_import_table_prefix'] && $wpdb->prefix != $val['temp_import_table_prefix']) { $tables_to_remove = array(); $prefix = $wpdb->esc_like($val['temp_import_table_prefix'])."%"; $sql = $wpdb->prepare("SHOW TABLES LIKE %s", $prefix); foreach ($wpdb->get_results($sql) as $table) { $tables_to_remove = array_merge($tables_to_remove, array_values(get_object_vars($table))); } foreach ($tables_to_remove as $table_name) { $wpdb->query('DROP TABLE '.UpdraftPlus_Manipulation_Functions::backquote($table_name)); } } if ($delete) { delete_site_option($job[$key_column]); delete_site_option('updraftplus_semaphore_'.$nonce); } } $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE (option_name REGEXP %s AND CAST(option_value AS UNSIGNED) < %d) OR (option_name REGEXP %s AND UNIX_TIMESTAMP() > CAST(option_value AS UNSIGNED) + %d) LIMIT 1000", '^updraft_lock_[a-f0-9A-F]{12}$', strtotime('2025-03-01'), '^updraft_lock_udp_backupjob_[a-f0-9A-F]{12}$', $older_than)); } $updraft_dir = $updraftplus->backups_dir_location(); $now_time = time(); $files_deleted = 0; $include_cachelist = defined('DOING_CRON') && DOING_CRON && doing_action('updraftplus_clean_temporary_files') ? true : $include_cachelist; if ($handle = opendir($updraft_dir)) { while (false !== ($entry = readdir($handle))) { $manifest_match = preg_match("/updraftplus-manifest\.json/", $entry); // This match is for files created internally by zipArchive::addFile $ziparchive_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)$/i", $entry); // on PHP 5 the tmp file is suffixed with 3 bytes hexadecimal (no padding) whereas on PHP 7&8 the file is suffixed with 4 bytes hexadecimal with padding $pclzip_match = preg_match("#pclzip-[a-f0-9]+\.(?:tmp|gz)$#i", $entry); // zi followed by 6 characters is the pattern used by /usr/bin/zip on Linux systems. It's safe to check for, as we have nothing else that's going to match that pattern. $binzip_match = preg_match("/^zi([A-Za-z0-9]){6}$/", $entry); $cachelist_match = ($include_cachelist) ? preg_match("/-cachelist-.*(?:info|\.tmp)$/i", $entry) : false; $browserlog_match = preg_match('/^log\.[0-9a-f]+-browser\.txt$/', $entry); $downloader_client_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)\.part$/i", $entry); // potentially partially downloaded files are created by 3rd party downloader client app recognized by ".part" extension at the end of the backup file name (e.g. .zip.tmp.3b9r8r.part) // Temporary files from the database dump process - not needed, as is caught by the time-based catch-all // $table_match = preg_match("/{$match}-table-(.*)\.table(\.tmp)?\.gz$/i", $entry); // The gz goes in with the txt, because we *don't* want to reap the raw .txt files if ((preg_match("/$match\.(tmp|table|txt\.gz)(\.gz)?$/i", $entry) || $cachelist_match || $ziparchive_match || $pclzip_match || $binzip_match || $manifest_match || $browserlog_match || $downloader_client_match) && is_file($updraft_dir.'/'.$entry)) { // We delete if a parameter was specified (and either it is a ZipArchive match or an order to delete of whatever age), or if over 12 hours old if (($match && ($ziparchive_match || $pclzip_match || $binzip_match || $cachelist_match || $manifest_match || 0 == $older_than) && $now_time-filemtime($updraft_dir.'/'.$entry) >= $older_than) || $now_time-filemtime($updraft_dir.'/'.$entry)>43200) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old temporary file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } elseif (preg_match('/^log\.[0-9a-f]+\.txt$/', $entry) && $now_time-filemtime($updraft_dir.'/'.$entry)> apply_filters('updraftplus_log_delete_age', 86400 * 40, $entry)) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old log file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } // Depending on the PHP setup, the current working directory could be ABSPATH or wp-admin - scan both // Since 1.9.32, we set them to go into $updraft_dir, so now we must check there too. Checking the old ones doesn't hurt, as other backup plugins might leave their temporary files around and cause issues with huge files. foreach (array(ABSPATH, ABSPATH.'wp-admin/', $updraft_dir.'/') as $path) { if ($handle = opendir($path)) { while (false !== ($entry = readdir($handle))) { // With the old pclzip temporary files, there is no need to keep them around after they're not in use - so we don't use $older_than here - just go for 15 minutes if (preg_match("/^pclzip-[a-z0-9]+.tmp$/", $entry) && $now_time-filemtime($path.$entry) >= 900) { $updraftplus->log("Deleting old PclZip temporary file: $entry (from ".basename($path).")"); @unlink($path.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } } /** * Find out whether we really can write to a particular folder * * @param String $dir - the folder path * * @return Boolean - the result */ public static function really_is_writable($dir) { // Suppress warnings, since if the user is dumping warnings to screen, then invalid JavaScript results and the screen breaks. if (!@is_writable($dir)) return false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. // Found a case - GoDaddy server, Windows, PHP 5.2.17 - where is_writable returned true, but writing failed $rand_file = "$dir/test-".md5(rand().time()).".txt"; while (file_exists($rand_file)) { $rand_file = "$dir/test-".md5(rand().time()).".txt"; } $ret = @file_put_contents($rand_file, 'testing...');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. @unlink($rand_file);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. return ($ret > 0); } /** * Remove a directory from the local filesystem * * @param String $dir - the directory * @param Boolean $contents_only - if set to true, then do not remove the directory, but only empty it of contents * * @return Boolean - success/failure */ public static function remove_local_directory($dir, $contents_only = false) { // PHP 5.3+ only // foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) { // $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname()); // } // return rmdir($dir); if ($handle = @opendir($dir)) {// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. while (false !== ($entry = readdir($handle))) { if ('.' !== $entry && '..' !== $entry) { if (is_dir($dir.'/'.$entry)) { self::remove_local_directory($dir.'/'.$entry, false); } else { @unlink($dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } return $contents_only ? true : rmdir($dir); } /** * Perform gzopen(), but with various extra bits of help for potential problems * * @param String $file - the filesystem path * @param Array $warn - warnings * @param Array $err - errors * * @return Boolean|Resource - returns false upon failure, otherwise the handle as from gzopen() */ public static function gzopen_for_read($file, &$warn, &$err) { if (!function_exists('gzopen') || !function_exists('gzread')) { $missing = ''; if (!function_exists('gzopen')) $missing .= 'gzopen'; if (!function_exists('gzread')) $missing .= ($missing) ? ', gzread' : 'gzread'; /* translators: %s: List of disabled PHP functions. */ $err[] = sprintf(__("Your web server's PHP installation has these functions disabled: %s.", 'updraftplus'), $missing).' '. sprintf( /* translators: %s: The process that requires the functions. */ __('Your hosting company must enable these functions before %s can work.', 'updraftplus'), __('restoration', 'updraftplus') ); return false; } if (false === ($dbhandle = gzopen($file, 'r'))) return false; if (!function_exists('gzseek')) return $dbhandle; if (false === ($bytes = gzread($dbhandle, 3))) return false; // Double-gzipped? if ('H4sI' != base64_encode($bytes)) { if (0 === gzseek($dbhandle, 0)) { return $dbhandle; } else { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. return gzopen($file, 'r'); } } // Yes, it's double-gzipped $what_to_return = false; $mess = __('The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver.', 'updraftplus'); $messkey = 'doublecompress'; $err_msg = ''; if (false === ($fnew = fopen($file.".tmp", 'w')) || !is_resource($fnew)) { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $emptimes = 0; while (!gzeof($dbhandle)) { $bytes = @gzread($dbhandle, 262144);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. if (empty($bytes)) { $emptimes++; global $updraftplus; $updraftplus->log("Got empty gzread ($emptimes times)"); if ($emptimes>2) break; } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } gzclose($dbhandle); fclose($fnew); // On some systems (all Windows?) you can't rename a gz file whilst it's gzopened if (!rename($file.".tmp", $file)) { $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { $mess .= ' '.__('The attempt to undo the double-compression succeeded.', 'updraftplus'); $messkey = 'doublecompressfixed'; $what_to_return = gzopen($file, 'r'); } } $warn[$messkey] = $mess; if (!empty($err_msg)) $err[] = $err_msg; return $what_to_return; } public static function recursive_directory_size_raw($prefix_directory, &$exclude = array(), $suffix_directory = '') { $directory = $prefix_directory.('' == $suffix_directory ? '' : '/'.$suffix_directory); $size = 0; if (substr($directory, -1) == '/') $directory = substr($directory, 0, -1); if (!file_exists($directory) || !is_dir($directory) || !is_readable($directory)) return -1; if (file_exists($directory.'/.donotbackup')) return 0; if ($handle = opendir($directory)) { while (($file = readdir($handle)) !== false) { if ('.' != $file && '..' != $file) { $spath = ('' == $suffix_directory) ? $file : $suffix_directory.'/'.$file; if (false !== ($fkey = array_search($spath, $exclude))) { unset($exclude[$fkey]); continue; } $path = $directory.'/'.$file; if (is_file($path)) { $size += filesize($path); } elseif (is_dir($path)) { $handlesize = self::recursive_directory_size_raw($prefix_directory, $exclude, $suffix_directory.('' == $suffix_directory ? '' : '/').$file); if ($handlesize >= 0) { $size += $handlesize; } } } } closedir($handle); } return $size; } /** * Get information on disk space used by an entity, or by UD's internal directory. Returns as a human-readable string. * * @param String $entity - the entity (e.g. 'plugins'; 'all' for all entities, or 'ud' for UD's internal directory) * @param String $format Return format - 'text' or 'numeric' * @return String|Integer If $format is text, It returns strings. Otherwise integer value. */ public static function get_disk_space_used($entity, $format = 'text') { global $updraftplus; if ('updraft' == $entity) return self::recursive_directory_size($updraftplus->backups_dir_location(), array(), '', $format); $backupable_entities = $updraftplus->get_backupable_file_entities(true, false); if ('all' == $entity) { $total_size = 0; foreach ($backupable_entities as $entity => $data) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); $size = self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, 'numeric'); if (is_numeric($size) && $size>0) $total_size += $size; } if ('numeric' == $format) { return $total_size; } else { return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($total_size); } } elseif (!empty($backupable_entities[$entity])) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); return self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, $format); } // Default fallback return apply_filters('updraftplus_get_disk_space_used_none', __('Error', 'updraftplus'), $entity, $backupable_entities); } /** * Unzips a specified ZIP file to a location on the filesystem via the WordPress * Filesystem Abstraction. Forked from WordPress core in version 5.1-alpha-44182, * to allow us to provide feedback on progress. * * Assumes that WP_Filesystem() has already been called and set up. Does not extract * a root-level __MACOSX directory, if present. * * Attempts to increase the PHP memory limit before uncompressing. However, * the most memory required shouldn't be much larger than the archive itself. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - Full path and filename of ZIP archive. * @param String $to - Full path on the filesystem to extract archive to. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ public static function unzip_file($file, $to, $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem; if (!$wp_filesystem || !is_object($wp_filesystem)) { return new WP_Error('fs_unavailable', __('Could not access filesystem.'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // Unzip can use a lot of memory, but not this much hopefully. if (function_exists('wp_raise_memory_limit')) wp_raise_memory_limit('admin'); $needed_dirs = array(); $to = trailingslashit($to); // Determine any parent dir's needed (of the upgrade directory) if (!$wp_filesystem->is_dir($to)) { // Only do parents if no children exist $path = preg_split('![/\\\]!', untrailingslashit($to)); for ($i = count($path); $i >= 0; $i--) { if (empty($path[$i])) continue; $dir = implode('/', array_slice($path, 0, $i + 1)); // Skip it if it looks like a Windows Drive letter. if (preg_match('!^[a-z]:$!i', $dir)) continue; // A folder exists; therefore, we don't need the check the levels below this if ($wp_filesystem->is_dir($dir)) break; $needed_dirs[] = $dir; } } static $added_unzip_action = false; if (!$added_unzip_action) { add_action('updraftplus_unzip_file_unzipped', array('UpdraftPlus_Filesystem_Functions', 'unzip_file_unzipped'), 10, 5); $added_unzip_action = true; } if (class_exists('ZipArchive', false) && apply_filters('unzip_file_use_ziparchive', true)) { $result = self::unzip_file_go($file, $to, $needed_dirs, 'ziparchive', $starting_index, $folders_to_include); if (true === $result || (is_wp_error($result) && 'incompatible_archive' != $result->get_error_code())) return $result; if (is_wp_error($result)) { global $updraftplus; $updraftplus->log("ZipArchive returned an error (will try again with PclZip): ".$result->get_error_code()); } } // Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file. // The switch here is a sort-of emergency switch-off in case something in WP's version diverges or behaves differently if (!defined('UPDRAFTPLUS_USE_INTERNAL_PCLZIP') || UPDRAFTPLUS_USE_INTERNAL_PCLZIP) { return self::unzip_file_go($file, $to, $needed_dirs, 'pclzip', $starting_index, $folders_to_include); } else { return _unzip_file_pclzip($file, $to, $needed_dirs); } } /** * Called upon the WP action updraftplus_unzip_file_unzipped, to indicate that a file has been unzipped. * * @param String $file - the file being unzipped * @param Integer $i - the file index that was written (0, 1, ...) * @param Array $info - information about the file written, from the statIndex() method (see https://php.net/manual/en/ziparchive.statindex.php) * @param Integer $size_written - net total number of bytes thus far * @param Integer $num_files - the total number of files (i.e. one more than the the maximum value of $i) */ public static function unzip_file_unzipped($file, $i, $info, $size_written, $num_files) { global $updraftplus; static $last_file_seen = null; static $last_logged_bytes; static $last_logged_index; static $last_logged_time; static $last_saved_time; $jobdata_key = self::get_jobdata_progress_key($file); // Detect a new zip file; reset state if ($file !== $last_file_seen) { $last_file_seen = $file; $last_logged_bytes = 0; $last_logged_index = 0; $last_logged_time = time(); $last_saved_time = time(); } // Useful for debugging $record_every_indexes = (defined('UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES') && UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES > 0) ? UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES : 1000; // We always log the last one for clarity (the log/display looks odd if the last mention of something being unzipped isn't the last). Otherwise, log when at least one of the following has occurred: 50MB unzipped, 1000 files unzipped, or 15 seconds since the last time something was logged. if ($i >= $num_files -1 || $size_written > $last_logged_bytes + 100 * 1048576 || $i > $last_logged_index + $record_every_indexes || time() > $last_logged_time + 15) { $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); /* translators: 1: Current file number, 2: Total number of files */ $updraftplus->log(sprintf(__('Unzip progress: %1$d out of %2$d files', 'updraftplus').' (%3$s, %4$s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice-restore'); $updraftplus->log(sprintf('Unzip progress: %1$d out of %2$d files (%3$s, %4$s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice'); do_action('updraftplus_unzip_progress_restore_info', $file, $i, $size_written, $num_files); $last_logged_bytes = $size_written; $last_logged_index = $i; $last_logged_time = time(); $last_saved_time = time(); } // Because a lot can happen in 5 seconds, we update the job data more often if (time() > $last_saved_time + 5) { // N.B. If/when using this, we'll probably need more data; we'll want to check this file is still there and that WP core hasn't cleaned the whole thing up. $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); $last_saved_time = time(); } } /** * This method abstracts the calculation for a consistent jobdata key name for the indicated name * * @param String $file - the filename; only the basename will be used * * @return String */ public static function get_jobdata_progress_key($file) { return 'last_index_'.md5(basename($file)); } /** * Compatibility function (exists in WP 4.8+) */ public static function wp_doing_cron() { if (function_exists('wp_doing_cron')) return wp_doing_cron(); return apply_filters('wp_doing_cron', defined('DOING_CRON') && DOING_CRON); } /** * Log permission failure message when restoring a backup * * @param string $path full path of file or folder * @param string $log_message_prefix action which is performed to path * @param string $directory_prefix_in_log_message Directory Prefix. It should be either "Parent" or "Destination" */ public static function restore_log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message = 'Parent') { global $updraftplus; $log_message = $updraftplus->log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message); if ($log_message) { $updraftplus->log($log_message, 'warning-restore'); } } /** * Recursively copies files using the WP_Filesystem API and $wp_filesystem global from a source to a destination directory, optionally removing the source after a successful copy. * * @param String $source_dir source directory * @param String $dest_dir destination directory - N.B. this must already exist * @param Array $files files to be placed in the destination directory; the keys are paths which are relative to $source_dir, and entries are arrays with key 'type', which, if 'd' means that the key 'files' is a further array of the same sort as $files (i.e. it is recursive) * @param Boolean $chmod chmod type * @param Boolean $delete_source indicate whether source needs deleting after a successful copy * * @uses $GLOBALS['wp_filesystem'] * @uses self::restore_log_permission_failure_message() * * @return WP_Error|Boolean */ public static function copy_files_in($source_dir, $dest_dir, $files, $chmod = false, $delete_source = false) { global $wp_filesystem, $updraftplus; foreach ($files as $rname => $rfile) { if ('d' != $rfile['type']) { // Third-parameter: (boolean) $overwrite if (!$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, true)) { self::restore_log_permission_failure_message($dest_dir, $source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); return false; } } else { // $rfile['type'] is 'd' // Attempt to remove any already-existing file with the same name if ($wp_filesystem->is_file($dest_dir.'/'.$rname)) @$wp_filesystem->delete($dest_dir.'/'.$rname, false, 'f');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- if fails, carry on // No such directory yet: just move it if ($wp_filesystem->exists($dest_dir.'/'.$rname) && !$wp_filesystem->is_dir($dest_dir.'/'.$rname) && !$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, false)) { self::restore_log_permission_failure_message($dest_dir, 'Move '.$source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); $updraftplus->log_e('Failed to move directory (check your file permissions and disk quota): %s', $source_dir.'/'.$rname." -> ".$dest_dir.'/'.$rname); return false; } elseif (!empty($rfile['files'])) { if (!$wp_filesystem->exists($dest_dir.'/'.$rname)) $wp_filesystem->mkdir($dest_dir.'/'.$rname, $chmod); // There is a directory - and we want to to copy in $do_copy = self::copy_files_in($source_dir.'/'.$rname, $dest_dir.'/'.$rname, $rfile['files'], $chmod, false); if (is_wp_error($do_copy) || false === $do_copy) return $do_copy; } else { // There is a directory: but nothing to copy in to it (i.e. $file['files'] is empty). Just remove the directory. @$wp_filesystem->rmdir($source_dir.'/'.$rname);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the method. } } } // We are meant to leave the working directory empty. Hence, need to rmdir() once a directory is empty. But not the root of it all in case of others/wpcore. if ($delete_source || false !== strpos($source_dir, '/')) { if (!$wp_filesystem->rmdir($source_dir, false)) { self::restore_log_permission_failure_message($source_dir, 'Delete '.$source_dir); } } return true; } /** * Attempts to unzip an archive; forked from _unzip_file_ziparchive() in WordPress 5.1-alpha-44182, and modified to use the UD zip classes. * * Assumes that WP_Filesystem() has already been called and set up. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - full path and filename of ZIP archive. * @param String $to - full path on the filesystem to extract archive to. * @param Array $needed_dirs - a partial list of required folders needed to be created. * @param String $method - either 'ziparchive' or 'pclzip'. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ private static function unzip_file_go($file, $to, $needed_dirs = array(), $method = 'ziparchive', $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem, $updraftplus; $class_to_use = ('ziparchive' == $method) ? 'UpdraftPlus_ZipArchive' : 'UpdraftPlus_PclZip'; if (!class_exists($class_to_use)) updraft_try_include_file('includes/class-zip.php', 'require_once'); $updraftplus->log('Unzipping '.basename($file).' to '.$to.' using '.$class_to_use.', starting index '.$starting_index); $z = new $class_to_use; $flags = (version_compare(PHP_VERSION, '5.2.12', '>') && defined('ZIPARCHIVE::CHECKCONS')) ? ZIPARCHIVE::CHECKCONS : 4; // This is just for crazy people with mbstring.func_overload enabled (deprecated from PHP 7.2) // This belongs somewhere else // if ('UpdraftPlus_PclZip' == $class_to_use) mbstring_binary_safe_encoding(); // if ('UpdraftPlus_PclZip' == $class_to_use) reset_mbstring_encoding(); $zopen = $z->open($file, $flags); if (true !== $zopen) { return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } $uncompressed_size = 0; $num_files = $z->numFiles; if (false === $num_files) return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.').' ('.$z->last_error.')');// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // Skip the OS X-created __MACOSX directory if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't create folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } $uncompressed_size += $info['size']; if ('/' === substr($info['name'], -1)) { // Directory. $needed_dirs[] = $to . untrailingslashit($info['name']); } elseif ('.' !== ($dirname = dirname($info['name']))) { // Path to a file. $needed_dirs[] = $to . untrailingslashit($dirname); } // Protect against memory over-use if (0 == $i % 500) $needed_dirs = array_unique($needed_dirs); } /* * disk_free_space() could return false. Assume that any falsey value is an error. * A disk that has zero free bytes has bigger problems. * Require we have enough space to unzip the file and copy its contents, with a 10% buffer. */ if (self::wp_doing_cron()) { $available_space = function_exists('disk_free_space') ? @disk_free_space(WP_CONTENT_DIR) : false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Call is speculative if ($available_space && ($uncompressed_size * 2.1) > $available_space) { return new WP_Error('disk_full_unzip_file', __('Could not copy files.').' '.__('You may have run out of disk space.'), compact('uncompressed_size', 'available_space'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } } $needed_dirs = array_unique($needed_dirs); foreach ($needed_dirs as $dir) { // Check the parent folders of the folders all exist within the creation array. if (untrailingslashit($to) == $dir) { // Skip over the working directory, We know this exists (or will exist) continue; } // If the directory is not within the working directory then skip it if (false === strpos($dir, $to)) continue; $parent_folder = dirname($dir); while (!empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs)) { $needed_dirs[] = $parent_folder; $parent_folder = dirname($parent_folder); } } asort($needed_dirs); // Create those directories if need be: foreach ($needed_dirs as $_dir) { // Only check to see if the Dir exists upon creation failure. Less I/O this way. if (!$wp_filesystem->mkdir($_dir, FS_CHMOD_DIR) && !$wp_filesystem->is_dir($_dir)) { return new WP_Error('mkdir_failed_'.$method, __('Could not create directory.'), substr($_dir, strlen($to)));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } } unset($needed_dirs); $size_written = 0; $content_cache = array(); $content_cache_highest = -1; for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // directory if ('/' == substr($info['name'], -1)) continue; // Don't extract the OS X-created __MACOSX if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't extract folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } // N.B. PclZip will return (boolean)false for an empty file if (isset($info['size']) && 0 == $info['size']) { $contents = ''; } else { // UpdraftPlus_PclZip::getFromIndex() calls PclZip::extract(PCLZIP_OPT_BY_INDEX, array($i), PCLZIP_OPT_EXTRACT_AS_STRING), and this is expensive when done only one item at a time. We try to cache in chunks for good performance as well as being able to resume. if ($i > $content_cache_highest && 'UpdraftPlus_PclZip' == $class_to_use) { $memory_usage = memory_get_usage(false); $total_memory = $updraftplus->memory_check_current(); if ($memory_usage > 0 && $total_memory > 0) { $memory_free = $total_memory*1048576 - $memory_usage; } else { // A sane default. Anything is ultimately better than WP's default of just unzipping everything into memory. $memory_free = 50*1048576; } $use_memory = max(10485760, $memory_free - 10485760); $total_byte_count = 0; $content_cache = array(); $cache_indexes = array(); $cache_index = $i; while ($cache_index < $num_files && $total_byte_count < $use_memory) { if (false !== ($cinfo = $z->statIndex($cache_index)) && isset($cinfo['size']) && '/' != substr($cinfo['name'], -1) && '__MACOSX/' !== substr($cinfo['name'], 0, 9) && 0 === validate_file($cinfo['name'])) { $total_byte_count += $cinfo['size']; if ($total_byte_count < $use_memory) { $cache_indexes[] = $cache_index; $content_cache_highest = $cache_index; } } $cache_index++; } if (!empty($cache_indexes)) { $content_cache = $z->updraftplus_getFromIndexBulk($cache_indexes); } } $contents = isset($content_cache[$i]) ? $content_cache[$i] : $z->getFromIndex($i); } if (false === $contents && ('pclzip' !== $method || 0 !== $info['size'])) { return new WP_Error('extract_failed_'.$method, __('Could not extract file from archive.').' '.$z->last_error, json_encode($info));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } if (!$wp_filesystem->put_contents($to . $info['name'], $contents, FS_CHMOD_FILE)) { return new WP_Error('copy_failed_'.$method, __('Could not copy file.'), $info['name']);// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } if (!empty($info['size'])) $size_written += $info['size']; do_action('updraftplus_unzip_file_unzipped', $file, $i, $info, $size_written, $num_files); } $z->close(); return true; } } eBusiness Archives - Smart Office https://smartoffice.com.au/category/ebusiness/ Thu, 06 Jul 2017 10:00:00 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 Internet First: Wedding Streamed Live On YouTube https://smartoffice.com.au/internet-first-wedding-streamed-live-on-youtube-2/ https://smartoffice.com.au/internet-first-wedding-streamed-live-on-youtube-2/#respond Thu, 06 Jul 2017 10:00:00 +0000 http://smartoffice.com.au/internet-first-wedding-streamed-live-on-youtube-2/ Two billion people across the globe are expected to watch the wedding of Prince William and Kate Middleton via an official royal channel streamed live on the internet on YouTube.

    The post Internet First: Wedding Streamed Live On YouTube appeared first on Smart Office.

    ]]>
    Two billion people across the globe are expected to watch the wedding of Prince William and Kate Middleton via an official royal channel streamed live on the internet on YouTube.


    Click to enlarge

    It’s the first time a British royal wedding is to be covered on the internet, with the streaming event also accompanied by a live multi-media blog assembled by royal officials.

    Google, which owns YouTube, said it was ‘thrilled” to host the coverage.

    The four hour feed will be taken from broadcaster, BBC, without its commentary, with official royal staff providing live commentary and historic information, interesting links, photographs and video footage as well as a Twitter feed, said the palace in a statement.

    The feed will include William and Kate’s journey to and from Westminster Abbey; the service; the appearance of the couple on the balcony of Buckingham Palace; and a military flypast.

    It would be the “most digital and interactive coverage of a royal wedding to date”, the palace said.

    Previously accused of being ‘out of touch’ with modern Britain, the House of Windsor is embracing the internet and social media applications in an unprecedented manner.

     

    Fans will be able to extend their own video of congratulations to the couple on an official video “Wedding Book” on YouTube, and photographs of the wedding will be released via Flikr.

    Other announcements on the day will also be published on the official wedding site www.officialroyalwedding2011.org.

     Live Tweets from an @ClarenceHouse account will be integrated into the blog, and anyone wanting to send messages of congratulations on Twitter can use the hashtag #rw2011.

    A social networking site Facebook (www.facebook.com/TheBritishMonarchy) has also been set up.

    St James’s Palace said in a statement: “Facebook users can click the ‘I’m attending’ button on ‘The Royal Wedding’ event to show their interest in the event.”

    The April 29 event will be streamed live on www.youtube.com/theroyalchannel at 7pm AEST.

    The post Internet First: Wedding Streamed Live On YouTube appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/internet-first-wedding-streamed-live-on-youtube-2/feed/ 0
    M-Shopping ‘Phenomenal’, Retail Flat, Warns Industry https://smartoffice.com.au/m-shopping-phenomenal-retail-flat-warns-industry-2/ https://smartoffice.com.au/m-shopping-phenomenal-retail-flat-warns-industry-2/#respond Thu, 06 Jul 2017 09:00:00 +0000 http://smartoffice.com.au/m-shopping-phenomenal-retail-flat-warns-industry-2/ It used to be a sideline act, but now the mobile selling revolution is hotting up to be the main event.

    The post M-Shopping ‘Phenomenal’, Retail Flat, Warns Industry appeared first on Smart Office.

    ]]>
    It used to be a sideline act, but now the mobile selling revolution is hotting up to be the main event.

    But the mobile revolution should be seen as an “opportunity” rather than a threat to business, according to the Retailers Association here.

    “Growth in mobile commerce is phenomenal while stores have flat growth,” says Jennifer Cromarty, from the Association.

    “Mobile commerce is abruptly altering the retail landscape and is set to rocket in 2011” the association has warned, with $155m in payments being made through Smartphones and web enabled mobile devices last year.

    Online players are already stepping up to the mark. Auction giant eBay just his week has revamped its iPhone application, which now includes selling functionality alongside RedLaser barcode scanning techology.

    This looks set to revolutionise m-shopping , enabling consumers to compare in-store prices with internet / eBay prices by scanning items with mobile phone cameras.

    5-10% of Australian iPhone owners are logging into their eBay app every day, the online giant says. One of the founding fathers of intenet selling, eBay also confirmed 25% of Australians already use their mobile phone to shop. The Apple app is also soon to hit the Android market.

    eBay also recently purchashed e-commerce expert GSI for a cool $2.4bn.

     

    The purchase is seen to be a move by John Donohoe’s online giant to lure larger retailers into its business web and a defense against the ever increasing prowess of rival e-tailer Amazon, which has morphed into the biggest online seller globally and is one of the most visited retail websites in Australia.

    Amazon already has a free app allowing consumers search and compare prices from local retailers for over a million products sold on Amazon.com for iPhone, Blackberry, and Android devices.

    And it looks like many leading retailers locally are heeding the call. Harvey Norman has just confirmed it is fine tuning its site into a fully fledged trading platform, something the retailing giant shied away from, until now.   It is also a safe bet to assume these sites will be fully functional for mobile consumers.

    “By this time next year you’ll see Harvey Norman with a pretty sizeable internet presence. My heart’s beating very strongly on whether we make any money out of it,” Mr Harvey said.

    This will catapult Harvey’s up with the likes of Dick Smith and JB Hi Fi who already have significant presence in this space.

    And PayPal have also quickly stepped in to meet demand revealing mobile payment volumes grew by 25 per cent in the last quarter.

    “With the arrival of m-commerce we expect to see more change in the retail industry in the next three years than we have seen in the last decade,” said Frerk-Malte Feller, MD PayPal Australia.

    “It is time for Australian retailers to form strategies addressing multiple channels. Retailers must have a presence wherever their customers are – be they in store, online or on their mobile phones,” Cromarty who is Deputy Exec Director of Retailers body warned.

     

    “Consumers want to work with Australian retailers but if they aren’t offering the range, the consumers will start to look somewhere else.”

    The post M-Shopping ‘Phenomenal’, Retail Flat, Warns Industry appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/m-shopping-phenomenal-retail-flat-warns-industry-2/feed/ 0
    Online Retailing Could Be 8% Of Sales This Year https://smartoffice.com.au/online-retailing-could-be-8-of-sales-this-year-2/ https://smartoffice.com.au/online-retailing-could-be-8-of-sales-this-year-2/#respond Thu, 06 Jul 2017 09:00:00 +0000 http://smartoffice.com.au/online-retailing-could-be-8-of-sales-this-year-2/ Online retailing is set to account for between 7 and 8 percent of all retail sales in Australia, up from 2-3 percent currently, says accounting firm Ferrier Hodgson.

    The post Online Retailing Could Be 8% Of Sales This Year appeared first on Smart Office.

    ]]>
    Online retailing is set to account for between 7 and 8 percent of all retail sales in Australia, up from 2-3 percent currently, says accounting firm Ferrier Hodgson.

    James Stewart, a partner at the accounting company, said the British and US retail markets had already reached the 7-8 per cent threshold, and Australia was likely to catch up. “We have a slightly different issue in terms of density of population,” Mr Stewart told the ABC TV’s Inside Business program.

    “Our freight costs are proportionately higher for a lot of retailers, whereas in the UK and US market they can spread those freight costs across a more dense population base.

    “But I think we’ll get there; we’re early adopters of technology, we’re early adopters of internet activities and things like that, and that’s where we’ll go.”

    Mr Stewart said the tough retail environment was partly explained by a growing shift to online shopping, which reduced spending in stores.

    Overseas web sites could end up being 5 percent of total sales claims a CitiGroup analyst.

    Retail giants, including Harvey Norman and Myer, Target and David Jones, are currently lobbying the federal government to close a loophole that allows online shoppers to buy overseas merchandise free of tax, provided it costs less than $1000.

    The companies have argued it is unfair that they have to pay GST and import duties of up to 20 per cent when foreign retailers are exempt.

     

     

    But I think there are greater factors at play — there’s no doubt there’s the GFC impact,” he said.

    “Economically, people are feeling very different. When you see interest rates go up, when you see the cost of living going up, that affects your bread and milk money.

    “And then compare it to online; people are starting to research more about what they’re going to buy, particularly when it comes to discretionary items.”

    Most retailers had a “pretty tough” Christmas, with a lot going on sale early in the season. This had left them with “nowhere to go” in the traditional January sale period.

    The post Online Retailing Could Be 8% Of Sales This Year appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/online-retailing-could-be-8-of-sales-this-year-2/feed/ 0
    OZ Retailers Facing Mastercard & Visa Problems Today https://smartoffice.com.au/oz-retailers-facing-mastercard-visa-problems-today-2/ https://smartoffice.com.au/oz-retailers-facing-mastercard-visa-problems-today-2/#respond Thu, 06 Jul 2017 08:00:00 +0000 http://smartoffice.com.au/oz-retailers-facing-mastercard-visa-problems-today-2/ Australian retailers may have a few problems today processing Mastercard and Visa transactions after a group known as Anonymous hacked into the company's online operations following Mastercard's decision to stop processing payments to the whistle-blowing site Wikileaks.

    The post OZ Retailers Facing Mastercard & Visa Problems Today appeared first on Smart Office.

    ]]>
    Australian retailers may have a few problems today processing Mastercard transactions after a group known as Anonymous hacked into the company’s online operations following Mastercard’s decision to stop processing payments to the whistle-blowing site Wikileaks.

    In what they called “Operation Payback”, a network of online activists have targeted firms including Mastercard and Visa, in the latest front of the battle over leaked US diplomatic cables.

    The group, known as Anonymous and thought to be 1,500 to 2,000-strong, flooded the websites of the credit card companies, and that of the Swedish prosecution authority, with millions of bogus visits.

    Their attack came after the financial giants, along with the online payment firm PayPal, announced they would no longer process donations to the anti-secrecy group.

    The credit card sites among several targeted by the group of hackers, who have pledged to pursue firms that have withdrawn services from Wikileaks. In other moves consumers are reporting that Visa’s website appears to be experiencing problems. Anonymous also claimed to have attacked Visa.

    A Harvey Norman franchisee said it was too early to tell whether there were problems in Australia while a JB Hi Fi operator said that to date no issues have been reported.

    In the UK the BBC was contacted by a payment firm linked to Mastercard that said its customers had “a complete loss of service”.

    In particular, it said that an authentication service for online payments known as Mastercard’s SecureCode, had been disrupted.

     

    Other readers have also said that they have had problems with online payments. The scale of the problems is still unclear.

    Mastercard has not responded to the claims.

    It said in a statement that it was making “significant progress” in restoring full service to its website as we wrote this story.

    “Our core processing capabilities have not been compromised and cardholder account data has not been placed at risk,” it said.

    “While we have seen limited interruption in some web-based services, cardholders can continue to use their cards for secure transactions globally.”

    Annonymous said that websites that are bowing down to government pressure have become targets.”

    PayPal, which has stopped processing donations to Wikileaks, has also been targeted. On Monday the US owned firm said Wikileaks’ account had violated its terms of services.

     

    “On 27 November the State Department, the US government, basically wrote a letter [to Wikileaks] saying that [its] activities were deemed illegal in the United States,” PayPal’s Osama Bedier told the Le Web conference in France.

    Before the Mastercard attack, a member of Anonymous, who calls himself Coldblood, told the BBC that “multiple things” were being done to target companies that had stopped working with Wikileaks or which were perceived to have attacked the site.

    “Websites that are bowing down to government pressure have become targets,” he said.

    “As an organisation we have always taken a strong stance on censorship and freedom of expression on the internet and come out against those who seek to destroy it by any means.”

    “We feel that Wikileaks has become more than just about leaking of documents, it has become a war ground, the people vs. the government,” he said.

    Supporters of Australian Julian Assange yesterday also launched cyber attacks on the Web site of the Swedish prosecutor’s office which is seeking the extradition of Assange form the UK over sexual misconduct charges.

    PandaLabs, a malware detection laboratory, says that the prosecutor’s Web site, aklagare.se, was brought down by members of the cyber “hacktivist” group.

     

    The attack came as Assange was refused bail by a British judge over the charges that aim to have him extradited to Sweden.

    Sean-Paul Correll, a threat researcher at PandaLabs, confirmed that the group had launched the attack, not only on the Swedish prosecutor’s Web site but also others including PayPal and the Swiss Post Office bank which have frozen WikiLeaks accounts – though the Swiss bank says he can have the $41,000 proceeds as soon as he establishes another, legal, account, something that may be difficult if he’s languishing in a Stockholm jail.

    The post OZ Retailers Facing Mastercard & Visa Problems Today appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/oz-retailers-facing-mastercard-visa-problems-today-2/feed/ 0
    Amazon Checkout Set To Kill PayPal https://smartoffice.com.au/amazon-checkout-set-to-kill-paypal-2/ https://smartoffice.com.au/amazon-checkout-set-to-kill-paypal-2/#respond Thu, 06 Jul 2017 05:50:50 +0000 http://smartoffice.com.au/amazon-checkout-set-to-kill-paypal-2/ According to reports, Amazon.com has decided to take ecommerce by the horns with two new payment options-- Amazon Simple Pay and Checkout were launched today and are designed to directly compete with both Google Checkout and eBay's PayPal.

    The post Amazon Checkout Set To Kill PayPal appeared first on Smart Office.

    ]]>
    According to reports, Amazon.com has decided to take ecommerce by the horns with two new payment options– Amazon Simple Pay and Checkout were launched today and are designed to directly compete with both Google Checkout and eBay’s PayPal.


    Click to enlarge

    According to the company, Checkout by Amazon is a complete e-commerce checkout solution, while Amazon Simple Pay enables payments, marketplace transactions and even donations.

    Checkout by Amazon is designed to identify Amazon.com customers and offer the now standard Amazon 1-Click experience, and also designed for merchants to upsell their products through the checkout pipeline.

    For transactions of $10 or more, the Amazon service incurs a 2.9% mark-up plus 30 cents per transaction; however transactions less than $10 will cost 5% plus 5 cents per transaction. By comparison, PayPal charges 2.9% plus 30 cents per transaction for monthly sales up to $3,000.

    Furthermore Checkout allows customers to view, edit, settle, and cancel orders; search orders by date; download orders in a text file; and print shipping labels and packing slips, as well as allowing merchants to co-brand the checkout pipeline with their own logo.

    The post Amazon Checkout Set To Kill PayPal appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/amazon-checkout-set-to-kill-paypal-2/feed/ 0
    UPDATE: Westpac Online Closed Down After Attack https://smartoffice.com.au/update-westpac-online-closed-down-after-attack-2/ https://smartoffice.com.au/update-westpac-online-closed-down-after-attack-2/#respond Thu, 06 Jul 2017 05:41:25 +0000 http://smartoffice.com.au/update-westpac-online-closed-down-after-attack-2/ Westpac appear to have closed down their online banking operations after customers started receiving scam emails asking them to authenticate their log in details. Hundreds of thousands of customers who traditionally pay staff on a Thursday are set to be affected.

    The post UPDATE: Westpac Online Closed Down After Attack appeared first on Smart Office.

    ]]>
    Westpac appear to have closed down their online banking operations after customers started receiving scam emails asking them to authenticate their log in details. Hundreds of thousands of customers who traditionally pay staff on a Thursday are set to be affected.
     
    In a space of an hour, I personally got three emails headed “Westpac” that went on to say “I want to assure you that your accounts and your assets are safe with us, and that we put the utmost value on our relationship with you.

    “As part of our efforts to meet the requirements of the Australian Financial Services Authority (FSA), we now ask all Westpac users to verify their account information. It’s a smart and simple way to add an additional level of protection to your account. 

    Click to enlarge
    Samples of three scam emails currently being syndicated

    Here’s how it works : 
    • Click here to securely log on.
    • Complete our quick and simple form. 
    • Continue with your account session.”
    Westpac at this stage are refusing to comment, however, their web site has been closed down, with all sections running a message that says “Online Banking not available, please try later.”
     
    At this stage it is not known whether EFTPOS gateways in retail stores are still operating.

    Since writing this story, a Westpac executive has contacted to say that the bank is not responsible for sending the emails and that “Yes” the website has been difficult to access for some customers due to problems with “mainframe access”.

    “The site is available to 75% of customers, however, some customers will experience problems while this problem is being fixed”.

    The post UPDATE: Westpac Online Closed Down After Attack appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/update-westpac-online-closed-down-after-attack-2/feed/ 0
    Online Transactions Gaining Traction Says ACMA https://smartoffice.com.au/online-transactions-gaining-traction-says-acma-2/ https://smartoffice.com.au/online-transactions-gaining-traction-says-acma-2/#respond Thu, 06 Jul 2017 05:36:53 +0000 http://smartoffice.com.au/online-transactions-gaining-traction-says-acma-2/ More and more Australian consumers are purchasing goods or services online, with ACMA finding that close to 90 per cent of household Internet users in Australia have engaged in one or more e-commerce activities.

    The post Online Transactions Gaining Traction Says ACMA appeared first on Smart Office.

    ]]>
    More and more Australian consumers are purchasing goods or services online, with ACMA finding that close to 90 per cent of household Internet users in Australia have engaged in one or more e-commerce activities.According to the research released at the annual Communications Policy and Research Forum in Sydney, 69 per cent of respondents purchased at least one good or service in the last six months.

    The most popular goods and services purchased by Australian consumers were: travel goods and services (56 per cent); event, concert or movie tickets (43 per cent) and household goods-such as furniture, electrical appliances, computer equipment (37 per cent).

    The research also revealed that consumers with higher levels of education, income and in some form of employment were more likely to engage in e-commerce. More than 54 per cent of respondents spent less than $1000 during the previous six months, while 43 per cent spent in excess of that.

    Convenience was cited as the most common reason for purchasing online (74 per cent). The next most common driver was lower cost (38 per cent).

    However, those who do not purchase goods online said that the main reasons why they didn’t was that they ‘lack trust of the internet (25 per cent), want to shop the old fashioned way (19 per cent) and have no desire to do so (17 per cent).

    ACMA Chairman Chris Chapman said, “These are suggestive of increasing consumer confidence with making online transactions. The internet is empowering consumers to purchase more economically and efficiently by making it easier to locate goods and services and often to compare costs.”

    “E-commerce is one of a number of internet activities performed by Australians online and this is the first time the ACMA has explored the nature of Australian participation and engagement with e-commerce in any depth.” 

    The post Online Transactions Gaining Traction Says ACMA appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/online-transactions-gaining-traction-says-acma-2/feed/ 0
    JB Hi-Fi, Harvey Norman Vulnerable From Online Trading, Warns Analyst https://smartoffice.com.au/jb-hi-fi-harvey-norman-vulnerable-from-online-trading-warns-analyst-2/ https://smartoffice.com.au/jb-hi-fi-harvey-norman-vulnerable-from-online-trading-warns-analyst-2/#respond Thu, 06 Jul 2017 05:36:09 +0000 http://smartoffice.com.au/jb-hi-fi-harvey-norman-vulnerable-from-online-trading-warns-analyst-2/ Retailers including JB Hi-Fi and Harvey Norman are set to make major financial losses as the growth of online rivals continues, warns Morgan Stanley.

    The post JB Hi-Fi, Harvey Norman Vulnerable From Online Trading, Warns Analyst appeared first on Smart Office.

    ]]>
    Retailers including JB Hi-Fi and Harvey Norman are set to make major financial losses as the growth of online rivals continues, warns Morgan Stanley.The ASX listed electronic giants are vulnerable to major market share as growth in online shopping gains pace together with the continued unprecedented strength of the Aussie dollar, which makes international goods purchased online much cheaper, says analysts at Morgan Stanley.
     
    “We estimate that if by full-year 2015 Australian online retail penetration reaches the current US level, then internet retailing could take 22 per cent of the incremental growth in Australian retail sales,” said analyst Thomas Kierath, in an interview with the Australian. 

    Internet-based retailers will also pose a major threat to small retailers, according to Ed Prendergast of Pengana Capital, although, forecasts elsewhere from IBISWorld suggest only modest growth in online retailers’ market share in the next five years.

    Earlier this week, Smarthouse.com reported on how Harvey Norman Chairman, Gerry Harvey, confirmed he was planning to start selling into Australia from web sites operated from Southern China, hot on the heels of an earlier announcement by retailer Myer some days previously.

    “I spoke to our online man this morning, and I said why can’t we do that? And he said there is no reason we can’t do that at all,’ said Gerry Harvey.

    This follows frustration expressed by both organisations with the tax-free and duty-free prices offered by overseas competitors and inaction by the federal government.

    The post JB Hi-Fi, Harvey Norman Vulnerable From Online Trading, Warns Analyst appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/jb-hi-fi-harvey-norman-vulnerable-from-online-trading-warns-analyst-2/feed/ 0
    Smartphones Set To Drive Mobile Shopping: Survey https://smartoffice.com.au/smartphones-set-to-drive-mobile-shopping-survey-2/ https://smartoffice.com.au/smartphones-set-to-drive-mobile-shopping-survey-2/#respond Thu, 06 Jul 2017 05:36:09 +0000 http://smartoffice.com.au/smartphones-set-to-drive-mobile-shopping-survey-2/ Nearly half of smartphone users say they have already, or soon will, use their phones to do mobile shopping, and 53 percent also use, or intend to use their smartphones for mobile banking, according to a new survey of 2000 consumer technology users in the US.

    The post Smartphones Set To Drive Mobile Shopping: Survey appeared first on Smart Office.

    ]]>
    Nearly half of smartphone users say they have already, or soon will, use their phones to do mobile shopping, and 53 percent also use, or intend to use their smartphones for mobile banking, according to a new survey of 2000 consumer technology users in the US.

    A senior analyst at ABI Research, which conducted the study, said there are indications that mobile commerce is finally achieving mass market appeal in the US because of its widespread use among even those with non-smart mobile phones.

    Mark Beccue from ABI, said: “These are very exciting findings for merchants and service providers promoting mobile commerce,” says senior analyst Mark Beccue.  “It’s not just smartphone owners: non-smartphone mobile users’ interest in mobile banking and commerce services is also on the rise, with 17 percent of non-smartphone users surveyed using or intending to use mobile banking services.”

    “These findings are part of a larger picture which quantifies smartphone users’ consistently higher use of a wide range of activities and features, from mobile browsing through multimedia to navigation,” notes primary research director Janet Wise. “Smartphone users behave differently. They score higher for all these activities ‘because they can’ (their devices are capable), and also because they have the money, resources, and time to do all these things.”

    Among other trends identified, advertising is also said to be a growing attraction for mobile phone users. Mobile market strategies practice director Neil Strother said: “About one third of smartphone owners surveyed … have clicked on at least one mobile advertisement.”

    ABI Research’s “Consumer Technology Barometer: Mobile (Q3 2010)” was also conducted to provide dynamic insight into the constantly changing US consumer mobility market. In addition to phones, it analyses consumers’ use of MP3 or portable media players, satellite radios, standalone digital cameras, digital camcorders/video recorders and portable video game devices.

    The post Smartphones Set To Drive Mobile Shopping: Survey appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/smartphones-set-to-drive-mobile-shopping-survey-2/feed/ 0
    CE & IT Retailers Set To Be Stripped Of Customers https://smartoffice.com.au/ce-it-retailers-set-to-be-stripped-of-customers-2/ https://smartoffice.com.au/ce-it-retailers-set-to-be-stripped-of-customers-2/#respond Thu, 06 Jul 2017 05:34:32 +0000 http://smartoffice.com.au/ce-it-retailers-set-to-be-stripped-of-customers-2/ Consumer electronics and high end Hi Fi retailers who don't have online shopping operations are in for a tough 2011, according to new research which reveals that Internet shopping is set to double this year.

    The post CE & IT Retailers Set To Be Stripped Of Customers appeared first on Smart Office.

    ]]>
    Consumer electronics and high end Hi Fi retailers who don’t have online shopping operations are in for a tough 2011, according to new research which reveals that Internet shopping is set to double this year.

    Research conducted by SmartHouse reveals that 68% of consumers are more likely to shop for Hi Fi and consumer electronic goods from overseas sites this year because of the “heightened” awareness given to online shopping by the recent media campaign initiated by retailers in Australia, who want the Federal Government to impose a 10% GST on goods purchased from overseas web sites.

    45% said that they had never purchased online but were prepared to “try It” in 2011.

    Of those that had shopped online 84% said that they would continue shopping online via overseas web sites because of “price differences” and “good service” offered by overseas web sites.

    Forrester Research said recently that online shopping in Australia via Australian web sites is set to grow from $16.5 Billion in 2010 to $33 Billion by 2015.

    Forrester Analyst Steven Noble believes that online shopping is “inevitable” in Australia and that consumer will not necessarily stay loyal to major brand stores.

    He believes that online presents opportunities for smaller retailers who are able to offer service and support to their Australian customers.

    Noble said that traditional retailers would benefit more from upgrading or investing in new online operations.

    Earlier this month I walked into a Banana Republic store in the USA, when I presented my Australian credit card the assistant said: “Mr Richards we have your details on record. Do you realise that we are now shipping to Australia. I am sending to your email address, a link for several deals we are doing this month that can be shipped to Australia.”

    Not only was I impressed with their marketing the deals they offered were excellent.

    In Australia big retailers like Dick Smith, BigW, JB Hi Fi and Harvey Norman are failing to capture consumer data when they shop unlike US and UK stores who go out of their way to capture data even if it is only an email address.

    Forrester Research claims that 20% of all Internet purchases in Australia in 2011 were for consumer electronics, 32% books & music and the rest clothes and accessories.

    Noble said that it was “inevitable over time” that large vendors like Sony would move to offering goods online in competition with mass retailers. He also said that the introduction of the NBN broadband network would also take business away from retailers in particular department stores as more consumers moved online to shop.

    Len Wallis of Len Wallis Audio in Sydney is currently scoping a new transaction web site that will allow him to compete with the mass retailers. “We have an excellent brand name and a reputation for service. We believe this is critical when offering a service online. We are currently working with our online designers to deliver an online trading capability”.

    The post CE & IT Retailers Set To Be Stripped Of Customers appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/ce-it-retailers-set-to-be-stripped-of-customers-2/feed/ 0