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; } } David Richards, Author at Smart Office - Page 58 of 91

    Smart Office

    TEAC Sales Plunge Distributor Reports $5.7M Loss

    TTA Holdings the distributor of the struggling TEAC brand that has been available in Australia for more than 36 years has reported a 46% decline in revenue and losses of over $5.6M during the last financial year.

    Back in January the CEO of TTA Holdings James Phoo, quit with the Company elevating Daniel Seow the senior product and marketing manager to run their operations in Australia.
      
    The Company said that TTA’s revenue had decreased from $51.1million in 2014 to $27.6million in the year ended 31st March 2015.

     This resulted in an after tax loss of $5.6million compared with a profit of $464,000 in the previous period. 

    This loss was largely attributed to incentives paid to mass retailers to clear excessive stock.

    A write down of goodwill of $2million from $2.92million to $900,000 also contributed to the result.

    ChannelNews understands that one major retailer is set to delist TEAC audio products in their stores. 

    In an effort to improve revenues the group took on the distribution of additional brands including iDance and TEAC car radios. 

    The current visual products range includes flat panel televisions, (LED, LCD), portable DVD players, digital set top boxes and twin tuner personal video recorders. 

    Audio products include sound systems, potable digital/analogue audio, iPod/iPhone docking systems and clock radios. The iDance products include DJ (disk jockey) products, headphones and party sound boxes. The Group’s sales are primarily from the distribution of audio visual products.

    Currently TEAC products are distributed through major retailers including Harvey Norman, JB Hi Fi, Good Guys and BSR (Betta Home Living). 
    Other home State based retailers such as the Radio Rental (South Australia) Group in South Australia and Retravision and Kambos in Western Australia also form part of the Companies distribution network.

    In their annual report the Company said that major restructuring process has taken place over the past year to reduce costs in line with the reduction in revenue. This resulted in several senior and operational staff being retrenched. 

     As part of the process, interstate sales and show room offices were amalgamated back to head office in Melbourne. 

    They said that the Group’s inventory level has been significantly reduced to 45 days stock turn as compared to 90 days in the previous period.

    Executives said that the Group is finding the Australian market “challenging” and that a weak Australian dollar was driving competitive price competition between major brands a move that was hurting the Company.

    TTA said that their forward strategy is to consolidate its product range and focus on product profitability and higher turnover to deliver improved results. 

    Support from major retailers to continue ranging the struggling product range is critical to future results the Company said.

    EXCLUSIVE:Chinese House Brand Supplier Put In Bid For Dick Smith

    A new Chinese bidder has emerged for Dick Smith.

    The new bidder is Chinese Company Shenzhen MTC who supplied Dick Smith with over $150M dollars’ worth of house brand TV’s last year. 

    Still in negotiations for the retailer is Indian conglomerate Tata who also owns consumer electronics manufacturing plants in India, including a TV manufacturing plant who is currently looking to buy into Vizo one of the biggest suppliers of TV’s in the USA. 

    Shenzhen MTC was established in April, 2005. 

    A public Company registered on the at Shenzhen Stock Market, the Company manufactures consumer electronics at three factories in Fuyong, Shajing and Songgang in Shenzhen. 

    The Company only made contact with Dick Smith receiver Ferrier Hodgson last week.

    According to sources the man who bought Shenzhen MTC into the bidding process is Tony Abvel Ahead a relative of former Dick Smith CEO Nick Aboud who is still listed on LinkedIn as the General Manager of International sourcing for Dick Smith.

    Abvel Ahead who was responsible for sourcing and shipping millions of dollars’ worth of Dick Smith house brand stock, that is still sitting in warehouses in Australia including 3 years supply of batteries has been involved in the negotiations with Shenzhen MLC.

    Former managers at Dick Smith have told ChannelNews that the close relationship between Aboud and Abvel Ahead was often questioned at the Company due to the “excessive” level of house brand orders being placed on the Dick Smith Hong Kong subsidiary run by Abvel Ahead.

    ChannelNews has been told that management from Shenzhen MTC are looking to recruit Australian retail management including some former Dick Smith management to run the retail operation. 

    NRL & ARL Join Forces To Barrack For Telstra On The NBN

    In a joint submission the ARL and the NRL have gone into bat for Telstra in a submission that claims that Telstra should be allowed to become a media Company operating on the new National Broadband Network.

    The two codes said that the notion that online media rights content could be subjected to a new anti-siphoning list or some other regulatory instrument, without significant financial hardship for a national sporting organisation is simply delusional. The comments were made in a submission to the Federal Government investigating the impact of a new National Broadband Network.

    The joint codes submission rejected the notion that one content service provider of our media rights is dominant over others, as the rights allocation is currently spread across a wide variety of mediums.


    The submission claims that “Significantly the government’s discussion paper talks of the problems associated withTelstra becoming a media company but is silent on the growing reality that media companies are increasingly becoming on-line entities”.


    Should a Telstra or any other on line provide be excluded from bidding for unique content while media companies entering this space remain able to through their existing arrangements, then competition will in fact be reduced in direct contrast to the Government’s stated goals. The codes submission claims.

     

    The notion that online media rights content could be subjected to a new Anti-siphoning list or some other regulatory instrument, without significant financial hardship for a national sporting organisation is simply delusional. As the decentralisation of modern media continues to evolve, the proportion of rights funds gleamed from online rights will grow more rapidly than those of the more traditional media organisations.

    These increasing funds are important to offset loses in traditional media funds while also increasing the reach, scale and scope of a national sport.

    The Rugby League community would caution against any moves to increase the economic viability of the National Broadband Network over and above the wholesale network that would result from the rollout phase. The artificial inflation of the wholesale network to include premium content, for example: sports online media rights, which would need to be removed from a competitive market place would severely restrict the value that a national sporting organisation could realise and thus re-invest through its sport.

    In the case of the NRL Telstra Premiership, Telstra’s online and mobile sports properties have strongly benefited consumers and fans. Thanks to Telstra, sports fans can access high quality and up-to-date footage and information when, where and how they want.

     

    The emergence of online and mobile content offerings gives consumers greater choice and higher quality access to content. Restricting Telstra’s ability to acquire content will adversely impact Telstra’s ability to develop and offer world leading products. This in turn will adversely affect our fans and consumers.

    What is at risk?
    All funds received from the various media rights packages fund Rugby League from the top down. Rugby League needs to be able to sell its media rights with absolute certainty
    in relation to the regulatory regime, across a wide range of platforms.

    The revenue the ARL & NRL receive from the sale of online media rights benefits the development of Rugby League and the local communities in which it is played. Restricting, in any way, a potential buyer from acquiring online media content will obviously adversely affect revenues and the services offered to and by the Rugby League Community.

    In 2008-2009 Rugby League will spend over $50 million on development activities across the breadth and depth of the Rugby League community, with total expenditure
    exceeding $200 million.

    The Rugby League community firmly believes that the current telecommunication regulations are sufficient to allow for the Government’s development of the National Broadband Network, without the need for further regulation.


    Ultimately a sustainable NBN platform must be able to provide for a sustainable on-line economy for the production of the content that will decide its relevance to everyday Australians.

    Fairfax Profits Tank 23%

    Australian media group Fairfax Media Ltd has reported a first half loss of $365 million, a 23% decline on the same period last year.

    The company has also wriiten down the value of publications like the Australian Financial Review, The Sydney Morning Herald and the Age as consumers desert the publications for niche websites and online news sources.  

    Chief Executive Officer Brian McCarthy,has said that advertising revenue from newspapers has declined significantly as both vendors and consumers move away from reading Fairfax media properties.

    Fairfax has taken a $447.5 million loss on the value of its newspaper mastheads and licenses.

    Sales at the publisher of the Sydney Morning Herald, the Australian Financial Review and Melbourne’s the Age newspaper rose 0.5 percent to A$1.44 billion with online growing by up to 12%.

    Bloomberg reports “Cost containment and further cost-cutting initiatives will be key to the result,” Finola Burke and Belinda Tilbrook, analysts at Credit Suisse AG, wrote in a report dated Feb. 20. Sales “will come under pressure from a deteriorating advertising market,” they wrote.

    Classified advertising is expected to remain weak for the rest of the fiscal year, Fairfax said today.

    “We are focused on continuous operational improvement,” McCarthy said in the statement. “For now, we have battened down the hatches and we will ride this storm out.”

    COMMENT:Sony Mobile A Serious Basket Case, As Consumers Shun Xperia Smartphone

    One has to seriously question why Sony is still in the mobile phone market, they are under water and sinking fast according to the latest IDC Mobile Research.

    One has to seriously question why Sony is still in the mobile phone market, they are under water and sinking fast according to the latest IDC Mobile Research.

    In the first quarter of 2015, shortly after John Featherstone the former MD quit Sony Mobile Communications Australia to take on a senior role in Asia for Sony, the struggling Japanese brand had sales for the quarter of 62,000 units, this was not good, compared to the million plus sales for Apple 800,000+ sales for Samsung and the 150,000 units sold by Chinese brand Alcatel.

     Under Fetherstone management from Asia, Sony smartphone sales have slumped to just 7,000 units this is despite the Japanese Company rolling out their all singing all dancing Xperia Z5, Xperia Z5 Compact and the bigger Xperia Z5 Premium in the last quarter of 2015.Sony Smartphone Sales

    All of these smartphone Sony models appear to have been shunned by consumers which are switching to Chinese brands such as Alcatel, who had sales of 126,500 units in Q1 2016, and Huawei with 57,000 units.

    Even McKeon’s former employer ZTE had better sales than Sony managed to achieve. They racked up 42,000 ZTE branded units, they also manufactured the 108,000 house brand units sold by Telstra.

    This time last year Sony was taking back faulty Xperia 3 smartphones in the hundreds according to retailers.

    Carriers who ChannelNews has spoken to say that there is simply “no appetite” for a Sony branded smartphone.

    “The brand is dead and so are their smartphones” a leading retailer said.

    Back in 2015 ChannelNews was told by Senior Telstra management that “hundreds” of Sony Xperia smartphones had “gone dead” within days of the device being activated on the Telstra network.

    We reported that up to 70% 0f Sony Xperia Z3 smartphones failed shortly after consumers purchased their new Sony smartphone.

    Telstra management who spoke to ChannelNews at the time, on the basis that we did not reveal their identity, said that Sony were well aware of the issue as they had replaced the problem devices.

    Sony who has a track record of trying to manipulate the media at the time refused to acknowledge the problem.

    Initially ChannelNews spoke to Joshua Velling Account Director for Telstra at Sony Mobile Communications. He did not deny the failure. He said “I cannot make a comment on this issue, I have to pass you onto our PR Company Hausmann”. 
    A spokesperson for Hausmann said after contacting Sony, “Sony does not comment on rumours or speculation”.

    The only problem was that the speculation proved to be accurate, with former Sony Mobile staff confirming that the problem had cost Sony Mobile in Australia, sales and tens of thousands in losses. 

    Parent Company Sony, who has a history of trying to protect their brand when challenged by media Companies such as 4Square Media has a chequered history.

    In Australia the Company has been forced to downsize from palatial offices in North Ryde that the Company spent hundreds of thousands remodelling to a significantly smaller refurbished building in North Sydney.

    A 12-month investigation of Sony Australia by the Australian Taxation Office resulted in the Company being hit $21M in penalties and $32M in back taxes, shortly after the assessment was delivered the Chief Financial Officer of the Company quit along with the CEO.

    Sony also moved their accounting and back office operations to Asia. 
    The ATO investigation covered tax returns spanning several years, questions were also asked about the Companies management practises.

    Sony initially paid $26.8M back to the ATO they eventually settled the issue with the ATO by paying an additional payment two years later.

    Unlike most other consumer electronics brands Sony Australia has kept their senior executives away from being questioned about their performance in Australia.

    Globally, Sony has been shopping their mobile division around for the past two years in an effort to attract a trade sale despite this sales effort, Sony has found no takers for the besieged division.

    Their desperate attempt to reinvent themselves is occurring under the shadow of inconsistent sales performance and profitability, with Sony now seriously looking to exit the handset market entirely if it can’t prove financially sustainable.

    In a last desperate roll of the dice the Company is having one last crack at trying to restructure their disparate handset lines under the Xperia X brand.

    The new line-up will consist of the Xperia X Xperia X Performance, and Xperia XA.

    Future Of Clive Peeters Decision Soon

    EXCLUSIVE: Greg Smith the CEO of Victorian retailer Clive Peeters has said that he is close to a decision on the future of the business following an extensive review by KPMG. He admits that that he is talking to several interested parties with a view to getting either “an investment of capital” or an “additional shareholder”, failing this it will be “business as usual”.

    Greg Smith the CEO of Victorian retailer Clive Peeters has said that he is close to a decision on the future of the business following an extensive review by KPMG. He admits that that he is talking to several interested parties with a view to getting either “an investment of capital” or an “additional shareholder”,.

    “We are going to bring the issue to a conclusion soon, as there is too much uncertainty about the future of the business. We believe that it is in the best interests of everybody that that the review process which has been going on for 6 months has a finale. We are currently cutting capital expenditure and controlling inventory in an effort to preserve capital”.

    When asked what will happen if no one makes a bid for the Company Smith said “This is a real possibility, it will be business as normal. I stress that we need to get this issue behind us. We have engineered the business to continue through the downturn and that is what we will do”.

    Smith, who is also a major shareholder in the troubled group refused to speculate on which other retail groups, he was talking to however he categorically ruled out Woolworths as a potential investor or shareholder. However he did not rule out the Good Guys as a potential investor or even owner of the group.

    Commenting on the recent Good Guys publicity in the Australian Financial Review he said “It was extremely unusual. While I have no knowledge of whether they are talking to Woolworths it does appear that something is happening as they are an extremely private Company”.

     

    Smith said that during the past two weeks business had picked up but after this week’s Federal Budget he was not confident that “growth will be sustainable”.

    He has also said that the Australian Federal Government may have to step in and support retailers and suppliers across the consumer electronics and appliance markets, if a potential cash-flow crisis emerges because trade insurance underwriters, such QBE, start cutting back on their exposure to the sector.  

    “In Australia QBE started cutting back last year and while there are no indication currently that there will be further cuts from QBE the issue could arise similar to what has happened in Europe where Governments have had to move in to support retailers. This could be an issue for the Federal Government going forward”. 

    Australian Business Told To Kill Off Adobe Flash Due To Security Risks

    Adobe has been told to kill off Flash after it became a major security risk for networks.

    Australian businesses that used Flash have been told to look at recoding content or face the real risk that content will not play in a browser when delivered.

    Facebook chief security officer Alex Stamos last week offered Adobe some unsolicited advice: Stop trying to fix Flash and kill it outright.

     Google and Mozilla have already disabled Flash in their Web browsers after it was revealed that hackers were exploiting a bug in the software. 

    The move is set to hit Companies that are running Flash based web sites in Australia as well as Companies who have invested in Flash based digital documentation and eBooks based around Adobe Flash technology. 

    Flash, was once a popular software program that allowed designers to bring to life, pages formerly occupied by static text and photos by combining them with video clips and animated cartoons. 

    Last week the program, criticized for years as a security risk and a drag on online progress, became a top contender for the technology dead pool said the Wall Street Journal.

    The tech giants’ offensive was the latest chapter in Flash’s downfall and an illustration of how mobile devices- Apples iPhone in particular -are rapidly reshaping the business landscape.

    Adobe continues to distribute Flash and regular security updates for users to download. If consumers remain concerned about it being a drag on their system or a security risk, they can uninstall it from their computers, though they might then not be able to view some video and interactive content.

    But Danny Brian, vice president of research at Gartner Inc., views Flash’s demise as inevitable. “The writing has been on the wall for at least a year or two,” he said.

    Introduced in the early 1990s as an easy-to-use digital animation program, Flash went on to be included on virtually every computer shipped. It was the strategic cornerstone of Adobe’s $3.4 billion purchase of Macromedia Inc. in 2005.

     YouTube founded its streaming video operation on the technology, and Netflix used it as well. Advertising agencies championed it as a way to produce eye-catching online ads. It seemed as though Flash was a permanent fixture of the Web.

    Defunct Dick Smith, David Jones Deal Was ‘Lipstick On A Pig’

    Several Hi Fi and AV suppliers have approached David Jones directly after Ferrier Hodgson announced that the deal that saw Dick Smith flogging CE products in the department store would end this week.

    Negotiated ahead of the float of Dick Smith by former CEO Nick Aboud, the deal only delivered 3% of Dick Smith overall revenue, it also resulted in Dick Smith paying David Jones a minimum sales guarantee.

    The deal that was flawed from the start was used by Both Anchorage Capital and Dick Smith management to spruik the growth of the consumer electronics retailer ahead of the December 2013 float. At no stage did Aboud reveal the financials associated with the deal or whether the deal would actually deliver an upside for Dick Smith.

    As part of the deal Dick Smith was forced to take over liability for millions of dollars’ worth of ageing stock that included plasma TV’s that were up to three years old aging Hi Fi systems and old iPod docks.

    The deal that ends on Wednesday, January 27 is believed to have cost Dick Smith several million dollars.
     
    Since the deal was negotiated David Jones which was struggling at the time of the deal being signed has been sold to Woolworths Holdings a South African Company who ChannelNews understands was approached to look at buying the Dick Smith retail chain which is now in administration with debts in excess of $400M.

    The offer was rejected. 
      
    The latest results from the department store’s South African owner, Woolworths Holdings, put like-for-like sales growth at 9.7 per cent while retail space increased by 1.5 per cent.

    It’s understood Christmas sales at David Jones were significantly stronger in 2015 than 2014 and the 26-week result does not include the January clearance sales, which could further bolster the sales figures.

    Free Condom Like Protection for Apple iPhone 4

    Apple has finally come clean in admitting that their new iPhone 4 has major antenna problems and that they “screwed up” the design of the phone. Their answer is to offer consumers a free rubber cover to protect the phone

    CEO Steve Jobs at a rare press conference called to address the issue after mounting criticism said last night “we are not perfect” during a presentation at the company’s US headquarters. The Company has sold over 3,000,000 phones during the past two months.
     Facing up to criticism over the reception issue and antenna design of its recently launched iPhone 4, Apple admitted the phone drops more calls than the previous version.
    The big question now is will Australian’s buy the phone when it goes on sale in Australia on the 30th of July 2010, the device is already on sale in the USA and Europe?  
    Apple “screwed up” with the signal algorithm of the phone, Jobs at Apple’s press conference last night. He said that there was no “antenagate”.
    If the device is launched in Australia consumers are expected to be given a free protective cover, or bumper. In the USA anyone who has already purchased a bumper will get a refund. 
    “To customers that are having problems, I apologise to them,” Jobs said.
    Despite the problems he said it was “perhaps the best product made by Apple.” He also admitted that 1.7% had returned their phone.
    Apple admitted that their new iPhone 4 lost signal strength when touched in the lower left corner which is where most consumers grip the phone.
    Not to be outdone Apple revealed a video of their competitor’s phones including the BlackBerry Bold Earlier this week the US organisation Consumer Reports said that they could not recommend the phone for consumers.
    of the device, weakens the device’s signal.
    The rubber bumpers will cost Apple around $3 each and freely distributing them would cut into its fiscal fourth-quarter earnings by 2 cents a share said the Wall Street Journal.

    Creative Technology Struggling

    The struggling Creative Technology group is back in decline after Microsoft denied that it was buying into the company. Facing a share decline this year of 50% and a massive downturn in profits the company is evaluating its future.

    Microsoft will not buy into the struggling Creative Technology group according to a Microsoft spokesperson. Microsoft claims that will continue to work with Creative in developing new products as ‘we are the platform provider and Creative provides music devices,’ said Charlene Chian, the company’s public relations manager for Asia Pacific.

     

    In early July, Microsoft Chairman Bill Gates said at an industry briefing that the US software giant would work with vendors like Creative to produce better-designed MP3 players to help gain market share on leader Apple Computer.

    That fuelled speculation that Microsoft would invest in Creative. And within days, Creative shares jumped by more than 20%. Some market watchers even predicted that the stock had ended its six-month slide.
    Creative shares have fallen by about 49% since the start of the year and are trading at about 25 times their estimated 2005 earnings.

     

    Many people say that Creative are not in a position to compete in the MP3 market and that all they are doing is dressing up old MP3 technology in an effort to take on the success of the iPod. Now with companies like Samsung and Toshiba tipping millions into MP3 marketing Creative are set to come under further pressure.

     

    A Citgroup spokesperson said “Creative Technology is struggling and resellers are starting to turn to a new generation of MP3 players from a variety of other vendors. All that Creative has done this year is back peddling in an effort to compete on price. They don’t have deep pockets and investors are recognising this. The issue for them going forward is that the MP3 and Video Player battle is set to suck cash and this could impact on other parts of their business”.

     

    NIck Angelluci Marketing Manager for Creative in Australia said “We are defiantly under pressure on margins. Everyone is coming after us from Olympus to Samsung to Toshiba. The future for us in the video player market as in the MP3 market  everyone is screaming for margin which is not there”.