';
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);
}
}
}
$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';
$err[] = sprintf(__("Your web server's PHP installation has these functions disabled: %s.", 'updraftplus'), $missing).' '.sprintf(__('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.'));
}
// 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));
$updraftplus->log(sprintf(__('Unzip progress: %d out of %d files', 'updraftplus').' (%s, %s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice-restore');
$updraftplus->log(sprintf('Unzip progress: %d out of %d files (%s, %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));
}
$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));
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.')');
}
// 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.', 'updraftplus').' '.__('You may have run out of disk space.'), compact('uncompressed_size', 'available_space'));
}
}
$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)));
}
}
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.'));
}
// 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));
}
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']);
}
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;
}
}
/**
* Contact Form
*
* Displays a customizable contact form
*/
if ( ! defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly
if ( !class_exists( 'avia_sc_contact' ) )
{
class avia_sc_contact extends aviaShortcodeTemplate
{
/**
* Create the config array for the shortcode button
*/
function shortcode_insert_button()
{
$this->config['self_closing'] = 'no';
$this->config['name'] = __('Contact Form', 'avia_framework' );
$this->config['tab'] = __('Content Elements', 'avia_framework' );
$this->config['icon'] = AviaBuilder::$path['imagesURL']."sc-contact.png";
$this->config['order'] = 43;
$this->config['target'] = 'avia-target-insert';
$this->config['shortcode'] = 'av_contact';
$this->config['shortcode_nested'] = array('av_contact_field');
$this->config['tooltip'] = __('Creates a customizable contact form', 'avia_framework' );
$this->config['preview'] = "large";
$this->config['disabling_allowed'] = true;
$this->config['id_name'] = 'id';
$this->config['id_show'] = 'yes';
$this->config['aria_label'] = 'yes';
$this->config['alb_desc_id'] = 'alb_description';
}
function extra_assets()
{
//load css
wp_enqueue_style( 'avia-module-contact' , AviaBuilder::$path['pluginUrlRoot'].'avia-shortcodes/contact/contact.css' , array('avia-layout'), false );
//load js
wp_enqueue_script( 'avia-module-contact' , AviaBuilder::$path['pluginUrlRoot'].'avia-shortcodes/contact/contact.js' , array('avia-shortcodes'), false, true );
}
/**
* Popup Elements
*
* If this function is defined in a child class the element automatically gets an edit button, that, when pressed
* opens a modal window that allows to edit the element properties
*
* @return void
*/
function popup_elements()
{
$link = '' . __( 'activated here', 'avia_framework' ) . '';
$captcha_desc = __( 'Do you want to display a Captcha field at the end of the form so users must prove they are human?', 'avia_framework' ) . '';
$captcha_desc .= __( 'Either by solving a simply mathematical question or by Google reCaptcha, that needs to be', 'avia_framework' ) . ' ' . $link . '. ';
$captcha_desc .= __( 'In case Google reCAPTCHA is deactivated (maybe later) in theme options, Enfold captcha will be used, if you selected to use V2 then V2 will be used for this contact form (even if you selected V3 in theme options). If you selected V3 here and the score fails or you did not selected V3 in theme options then V2 will be used to check if user is a human.', 'avia_framework' );
$captcha_desc .= '';
$captcha_desc .= __( '(It is recommended to only activate this if you receive spam from your contact form, since an invisible spam protection is also implemented that should filter most spam messages by robots anyway)', 'avia_framework' );
$default_from = parse_url( home_url() );
$default_from = ( ! empty( $default_from['host'] ) ) ? "no-reply@{$default_from['host']}" : 'no-reply@wp-message.com';
$this->elements = apply_filters( 'avf_sc_contact_popup_elements', array(
array(
"type" => "tab_container", 'nodescription' => true
),
array(
"type" => "tab",
"name" => __("Form" , 'avia_framework'),
'nodescription' => true
),
array(
"name" => __("Your email address", 'avia_framework' ),
"desc" => __("Enter one or more Email addresses (separated by comma) where mails should be delivered to.", 'avia_framework' ) ." (".__("Default:", 'avia_framework' ) ." ". get_option('admin_email').")",
"id" => "email",
'container_class' =>"avia-element-fullwidth",
"std" => get_option('admin_email'),
"type" => "input"),
array(
'name' => __( 'Your from address', 'avia_framework' ),
'desc' => sprintf( __( 'Enter your from address for the form - if left blank it will default to user email or %s', 'avia_framework' ), $default_from ),
'id' => 'from_email',
'std' => '',
'type' => 'input'
),
array(
"name" => __("Form Title", 'avia_framework' ),
"desc" => __("Enter a form title that is displayed above the form", 'avia_framework' ),
"id" => "title",
"std" => __("Send us mail", 'avia_framework' ),
"type" => "input"),
array(
'type' => 'template',
'template_id' => 'heading_tag',
'theme_default' => 'h3',
'context' => __CLASS__
),
array(
"name" => __("Add/Edit Contact Form Elements", 'avia_framework' ),
"desc" => __("Here you can add, remove and edit the form Elements of your contact form.", 'avia_framework' )." ".
__("Available form elements are: single line Input elements, Textareas, Checkboxes and Select-Dropdown menus.", 'avia_framework' )."
".
__("It is recommended to not delete the 'E-Mail' field if you want to use an auto responder.", 'avia_framework' ),
"type" => "modal_group",
"id" => "content",
"modal_title" => __("Edit Form Element", 'avia_framework' ),
"std" => array(
array('label'=>__('Name', 'avia_framework' ), 'type'=>'text', 'check'=>'is_empty'),
array('label'=>__('E-Mail', 'avia_framework' ), 'type'=>'text', 'check'=>'is_email'),
array('label'=>__('Subject', 'avia_framework' ), 'type'=>'text', 'check'=>'is_empty'),
array('label'=>__('Message', 'avia_framework' ), 'type'=>'textarea', 'check'=>'is_empty'),
),
'subelements' => array(
array(
"name" => __("Form Element Label", 'avia_framework' ),
"desc" => "",
"id" => "label",
"std" => "",
"type" => "input"),
array(
"name" => __("Form Element Type", 'avia_framework' ),
"desc" => "",
"id" => "type",
"type" => "select",
"std" => "text",
"no_first"=>true,
"subtype" => array( __('Form Element: Text Input', 'avia_framework' ) =>'text',
__('Form Element: Text Area', 'avia_framework' ) =>'textarea',
__('Form Element: Select Element', 'avia_framework' ) =>'select',
__('Form Element: Checkbox', 'avia_framework' ) =>'checkbox',
__('Form Element: Datepicker', 'avia_framework' ) =>'datepicker',
__('Custom HTML: Add a Description', 'avia_framework' ) =>'html',
)),
array(
"name" => __("Form Element Options", 'avia_framework' ) ,
"desc" => __("Enter any number of options that the visitor can choose from. Separate these Options with a comma.", 'avia_framework' ) ." ".
__("Example: Option 1, Option 2, Option 3", 'avia_framework' ).""." ".
__("Note: If you want to use a comma in the option text you have to write 2 comma.", 'avia_framework' )."" ,
"id" => "options",
"required" => array('type','equals','select'),
"std" => "",
"type" => "input"),
array(
"name" => __("Multiple answers", 'avia_framework' ),
"desc" => __("Check if you want to enable multiple answers", 'avia_framework' ) ,
"id" => "multi_select",
"required" => array('type','equals','select'),
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Preselect checkbox", 'avia_framework' ),
"desc" => __("Check if you want to preselect the checkbox", 'avia_framework' ) ,
"id" => "av_contact_preselect",
"required" => array('type','equals','checkbox'),
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Add Description", 'avia_framework' ) ,
"id" => "content",
"required" => array('type','equals','html'),
"std" => "",
"type" => "tiny_mce"),
array(
"name" => __("Form Element Validation", 'avia_framework' ),
"desc" => "When selecting "Valid E-Mail address with special characters" keep in mind, that not all E-Mail systems support this feature properly.",
"id" => "check",
"type" => "select",
"std" => "",
"no_first"=>true,
"required" => array('type','not','html'),
"subtype" => array( __('No Validation', 'avia_framework' ) =>'',
__('Is not empty', 'avia_framework' ) =>'is_empty',
__('Valid E-Mail address', 'avia_framework' ) =>'is_email',
__('Valid E-Mail address with special characters', 'avia_framework' ) =>'is_ext_email',
__('Valid Phone Number', 'avia_framework' ) =>'is_phone',
__('Valid Number', 'avia_framework' ) =>'is_number')),
array(
"name" => __("Form Element Width", 'avia_framework' ),
"desc" => __("Change the width of your elements and let them appear beside each other instead of underneath", 'avia_framework' ) ,
"id" => "width",
"type" => "select",
"std" => "",
"no_first"=>true,
"required" => array('type','not','html'),
"subtype" => array( "Fullwidth" =>'', "1/2" =>'element_half', "1/3" =>'element_third' , "2/3" =>'element_two_third', "1/4" => 'element_fourth', "3/4" => 'element_three_fourth')),
)
),
array(
"name" => __("Submit Button Label", 'avia_framework' ),
"desc" => __("Enter the submit buttons label text here", 'avia_framework' ),
"id" => "button",
"std" => __("Submit", 'avia_framework' ),
"type" => "input"),
array(
"name" => __("What should happen once the form gets sent?", 'avia_framework' ),
"desc" => "",
"id" => "on_send",
"type" => "select",
"std" => "",
"no_first"=>true,
"subtype" => array( __('Display a short message on the same page', 'avia_framework' ) =>'',
__('Redirect the user to another page', 'avia_framework' ) =>'redirect',
)),
array(
"name" => __("Message Sent label", 'avia_framework' ),
"desc" => __("What should be displayed once the message is sent?", 'avia_framework' ),
"id" => "sent",
"required" => array('on_send','not','redirect'),
"std" => __("Your message has been sent!", 'avia_framework' ),
"type" => "input"),
array(
"name" => __("Redirect", 'avia_framework' ),
"desc" => __("To which page do you want the user send to?", 'avia_framework' ),
"id" => "link",
"type" => "linkpicker",
"fetchTMPL" => true,
"std" => "",
"required" => array('on_send','equals','redirect'),
"subtype" => array(
__('Set Manually', 'avia_framework' ) =>'manually',
__('Single Entry', 'avia_framework' ) =>'single'
),
"std" => ""),
array(
"name" => __("E-Mail Subject", 'avia_framework' ),
"desc" => __("You can define a custom Email Subject for your form here. If left empty the subject will be", 'avia_framework' ).": ".__("New Message", 'avia_framework') . " (".__('sent by contact form at','avia_framework')." ".get_option('blogname').")" ,
"id" => "subject",
"std" => "",
"type" => "input"
),
array(
"name" => __("Autoresponder from email address", 'avia_framework' ),
"desc" => __("Enter the from email address for the autoresponder.", 'avia_framework' ) . " (" .__( "Default:", 'avia_framework' ) . " " . get_option( 'admin_email' ) . ")",
"id" => "autoresponder_email",
"std" => get_option('admin_email'),
"type" => "input"
),
array(
"name" => __("Autorespond Text", 'avia_framework' ),
"desc" => __("Enter a message that will be sent to the users email address once he has submitted the form.", 'avia_framework' )."
".
__("If left empty no auto-response will be sent.", 'avia_framework' ),
"id" => "autorespond",
"std" => "",
"type" => "textarea"
),
array(
'name' => __( 'Contact Form Captcha', 'avia_framework' ),
'desc' => $captcha_desc,
'id' => 'captcha',
'type' => 'select',
'std' => '',
'subtype' => array(
__( 'Don\'t display Captcha', 'avia_framework' ) => '',
__( 'Use Enfold Numeric Captcha', 'avia_framework' ) => 'active',
__( 'Use Google reCAPTCHA V2 if activated', 'avia_framework' ) => 'recaptcha_v2',
__( 'Use Google reCAPTCHA V3 if activated (fallback is V2)', 'avia_framework' ) => 'recaptcha_v3'
)
),
array(
'name' => __( 'reCAPTCHA V2 theme color', 'avia_framework' ),
'desc' => __( 'Select a theme color for this contact form widget', 'avia_framework' ),
'id' => 'captcha_theme',
'type' => 'select',
'required' => array( 'captcha', 'parent_in_array', 'recaptcha_v2 recaptcha_v3' ),
'std' => 'light',
'subtype' => array(
__( 'Light', 'avia_framework' ) => 'light',
__( 'Dark', 'avia_framework' ) => 'dark'
)
),
array(
'name' => __( 'reCAPTCHA V2 theme size', 'avia_framework' ),
'desc' => __( 'Select a size for this contact form widget', 'avia_framework' ),
'id' => 'captcha_size',
'type' => 'select',
'required' => array( 'captcha', 'parent_in_array', 'recaptcha_v2 recaptcha_v3'),
'std' => 'normal',
'subtype' => array(
__( 'Normal', 'avia_framework' ) => 'normal',
__( 'Compact', 'avia_framework' ) => 'compact'
)
),
array(
'name' => __( 'Select score for human', 'avia_framework' ),
'id' => 'captcha_score',
'desc' => __( 'A score of 1.0 is very likely a good interaction, 0.0 is very likely a bot. Google recommends a threshold of 0.5 by default. In case we encounter a non human we ask user to verify with Version 2 chckbox.', 'avia_framework' ),
'type' => 'select',
'required' => array( 'captcha', 'equals', 'recaptcha_v3' ),
'subtype' => AviaHtmlHelper::number_array( 0, 1, 0.1, array( __( 'Default', 'avia_framework' ) => '' ) ),
'std' => '0.5'
),
array(
"name" => __("Hide Form Labels", 'avia_framework' ),
"desc" => __("Check if you want to hide form labels above the form elements. The form will instead try to use an inline label (not supported on old browsers)", 'avia_framework' ) ,
"id" => "hide_labels",
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Label/Send Button alignment", 'avia_framework' ),
"desc" => __("Select how to align the form labels and the send button", 'avia_framework' ),
"id" => "form_align",
"type" => "select",
"std" => "",
"subtype" => array(
__('Default', 'avia_framework' ) =>'',
__('Centered', 'avia_framework' ) => 'centered'
),
"std" => ""),
array(
"type" => "close_div",
'nodescription' => true
),
array(
"type" => "tab",
"name" => __("Colors",'avia_framework' ),
'nodescription' => true
),
array(
"name" => __("Form Color Scheme", 'avia_framework' ),
"desc" => __("Select a form color scheme here", 'avia_framework' ),
"id" => "color",
"type" => "select",
"std" => "",
"subtype" => array( __('Default', 'avia_framework' )=>'',
__('Light transparent', 'avia_framework' )=>'av-custom-form-color av-light-form',
__('Dark transparent', 'avia_framework' ) =>'av-custom-form-color av-dark-form'),
),
array(
"type" => "close_div",
'nodescription' => true
),
array(
'type' => 'template',
'template_id' => 'screen_options_tab'
),
array(
"type" => "close_div",
'nodescription' => true
),
));
}
/**
* Editor Sub Element - this function defines the visual appearance of an element that is displayed within a modal window and on click opens its own modal window
* Works in the same way as Editor Element
* @param array $params this array holds the default values for $content and $args.
* @return $params the return array usually holds an innerHtml key that holds item specific markup.
*/
function editor_sub_element($params)
{
$template = $this->update_template("label", __("Element", 'avia_framework' ). ": {{label}}");
$params['innerHtml'] = "";
$params['innerHtml'] .= "
Fatal Findings: The Deadly Dangers on Construction Sites in New York City
The construction industry in New York City and across the country remains one of the most dangerous jobs. Each year thousands of people are injured or killed at construction sites, including dozens in NYC alone. Increased awareness and adherence to safety regulations could prevent many of these unnecessary deaths and injuries.
At the Law Office of Asaro & Associates, we represent individuals who have been hurt or killed in construction accidents throughout New York City. Our experienced legal team has obtained millions in verdicts and settlements on behalf of our clients and will fight to get you the compensation you deserve.
If you have been injured at a NYC construction site, contact our office at (718) 650-2135 for a free consultation.
Construction and Dangerous Job Sites
According to an annual report on construction fatalities by the New York Committee for Occupational Safety and Health (NYCOSH), construction is one of the most dangerous industries for workers across the country. It is even more deadly for New York City workers. Research shows that construction worker fatalities account for 30% of all worker fatalities in NYC.
Construction site accident statistics:
Falls are the top cause of construction fatalities in the city;
Non-union job sites continue to be the most dangerous, accounting for 83% of worker fatalities in NYC;
Construction workers between the ages of 55-64 have an increased risk of dying; and
20 construction workers died in NYC in 2017, rising to 22 in 2018.
Falls continue to be the number one cause of construction fatalities in the city. Over the past decade across the state, 48% of construction fatalities were due to falls. In New York City, falls accounted for 64% of all construction deaths in 2018.
Common Causes of NYC Construction Site Deaths
The United States Department of Labor Occupational Safety and Health Administration (OSHA) has identified the four leading causes of construction site fatalities.
OSHA’s “fatal four” includes:
Falls
Electrocution
Struck by Object
Caught in or between equipment or machinery
The NYCOSH found that over the past ten years, 69% of all construction fatalities in New York City could be attributed to the fatal four. The same study indicated that as many as 85% of construction deaths in the state were the result of one of the four hazards. Tragically, nearly all injuries and deaths related to the fatal four are preventable.
Calls to Improve Construction Site Safety
As part of their findings, the NYCOSH makes several safety recommendations that may help improve the conditions on construction sites. By holding negligent contractors accountable and expanding safety requirements, it is hoped that many construction accidents will be averted.
Construction site safety recommendations:
Require training and certification for workers;
Extend and protect legislation (including New York’s Scaffold Safety Law); and
Increase “Regulations, Monitoring & Enforcement.”
NYCOSH calls on the New York Department of Labor to create a registry of workplace fatalities, helping to accurately identify and track dangerous construction sites. In addition to several other suggestions, they recommend expanding the ability for prosecutors to hold contractors criminally responsible for failing to protect workers.
Injured at a NYC Construction Site? Contact Our Office
Were you injured at a construction site in New York City? Contact our office today at (718) 650-2135 for a free case consultation. You pay nothing unless we win. Call now to speak directly with an attorney.
https://asarofirm.com/wp-content/uploads/2022/03/Asaro-Associates-Blog-Images-2.png533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2022-03-21 11:29:002022-04-05 16:39:12What Are the Most Common Causes of Death on NYC Construction Sites?
How Slip and Fall Accidents Differ from Trip and Fall Accidents
While many people may use the terms interchangeably, “slip and fall accidents” and “trip and fall accidents” refer to slightly different things. Both types of accidents can result in severe, life-threatening injuries and should be taken seriously. If you are injured in a fall on another person’s property, including a sidewalk or parking lot, you might be entitled to compensation.
At the Law Office of Asaro & Associates, we know the devastation that a slip or trip and fall can cause. Our award-winning legal team will fight to ensure that you receive the largest recovery possible based on your injuries. Contact our office at (718) 650-2135 for a free, no-obligation consultation if you are injured in a slip and fall or trip and fall accident.
What Is a Slip and Fall Accident?
A slip and fall accident typically refers to when someone is injured because they fell on a slippery surface. Slip and fall accidents usually involve someone losing their balance and falling backward. An unexpected fall backward can result in severe head injury, trauma to the neck or back, and broken bones.
Common causes of slip and fall accidents:
Recently mopped or waxed floors
Spilled liquids
Ice and snow that is not timely removed
Slick or uneven stairs
Loose items on the floor such as beads or marbles
In slip and fall accidents, few people have time to brace themselves before impact with a hard surface. This means that the back of their body (often the head and spine) absorbs a significant amount of force. The injuries can be debilitating, affecting your mobility and your ability to work.
What Is a Trip and Fall Accident?
A trip and fall accident differs slightly from a slip and fall accident in that the injured person generally falls forward after tripping on something. Trip and fall accidents usually result in injury to the hands, wrists, face, and knees.
Common causes of trip and fall accidents:
Loose carpeting or floorboards
Unsecured wires
Uneven sidewalk
Items left out in aisles or walkways
Poorly lit stairwells
Trip and fall accidents that cause a fall to a lower level, referred to as an “elevated fall,” are extremely serious and may be fatal. Elevated falls often happen at construction sites, stairwells, and off stages.
What to Do If You Are Involved in a Slip & Fall or Trip & Fall Accident
Regardless of whether you are involved in a slip and fall or a trip and fall accident, you should always get your injuries checked out by a medical professional as soon as possible. Delaying treatment can exacerbate your injuries or lead to serious complications.
By following a few simple steps, you can protect your right to compensation and help ensure that you make a full recovery:
Get help for your injuries. You should not move if you suspect that your head, neck, or back was injured in the fall. Have someone call 9-1-1 so that emergency medical personnel can treat you at the scene.
Notify the property owner or manager. Always report the incident to the property owner or store manager. If you are unsure who owns the property, ask the person in charge. A manager should know the proper protocol for reporting a slip and fall accident.
Collect evidence. If you are able, collect evidence at the scene. Take pictures, obtain witness information, and document anything that you can remember about the accident.
Contact an attorney. Before making any statements or signing anything, you should consult with an experienced attorney.
Hiring an attorney as early in the process as possible can ensure that you receive the compensation you deserve after an accident with injury.
Injured in a Slip, Trip, or Fall Accident? Contact Our Office.
If you have been injured in a slip and fall or trip and fall accident, contact our office at (718) 650-2135 for a free consultation. Discuss your case with a leading attorney and pay nothing unless we win. Call today to get started.
https://asarofirm.com/wp-content/uploads/2022/03/Asaro-Associates-Blog-Images-1.png533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2022-03-14 11:11:002022-04-05 16:38:58What Is the Difference Between Slip & Fall and Trip & Fall?
Your Rights If You Are Injured in a Construction Accident
Construction workers face some of the most dangerous working conditions in the country. Thousands of people are injured on construction sites every year. Tragically, many of these accidents are preventable, caused by negligence, inadequate safety measures, and defective machinery.
At the Law Office of Asaro & Associates, we have over 50 years of combined experience fighting for our clients. We work hard to ensure that individuals injured in construction accidents receive the compensation they deserve. If you have been injured at a construction site, contact our office at (718) 650-2135 to schedule a free consultation.
Who May Be Held Liable in a Construction Accident?
Construction accident cases can be complicated because one or more parties can be held liable. To ensure that the proper parties are held legally responsible, it is vital to consult with a lawyer, well-versed in construction accidents, immediately after the incident.
Depending on the circumstances of the case, the following parties may be held accountable for your injuries:
Property owner
Workers or contractors
Manufacturer
Construction company
Engineer
Subcontractors
Government entity
It may take an independent investigation to determine what caused the accident and who is liable. In the initial aftermath, it may be unclear whether your injuries were the result of a contractor’s negligence, an unsafe property, or improper safety procedures.
Can I Sue the Building Owner?
Building owners are required to keep their property in a reasonably safe condition and to provide adequate protection for those working on the premises. Depending on the situation, a property owner may be held liable for injuries that were caused by their negligence or wrongdoing.
Can I Sue My Employer?
Under New York law, the majority of business owners are required to carry workers’ compensation insurance. Workers’ compensation benefits provide coverage if you are injured on the job. In most cases, if you suffer a work-related injury, you would file a workers’ compensation claim in lieu of suing your employer.
Can I Sue an Independent Contractor?
In some cases, your injuries may have been caused by an independent contractor’s negligence. In the event that another person, such as a subcontractor, engineer, architect, or another worker outside of your company, caused your injuries, you may be able to sue them directly.
What If I Was Injured by a Defective or Malfunctioning Machine?
If an investigation reveals that your injuries were the result of a defective or malfunctioning machine, you may be entitled to compensation from the manufacturer. An attorney can help decide whether you have a valid claim for damages and should pursue a defective product lawsuit.
What Should I Do If I Am Injured at a Construction Site?
The first thing you should do if you are injured at a construction site is seek medical attention. Construction accidents can be severe, even life-threatening. Being evaluated and treated by a medical professional can ensure that you make a full recovery and receive the compensation you deserve.
Once you are able, it is strongly recommended that you consult with a lawyer. By retaining legal representation, you can hold the right parties accountable and get the largest possible recovery based on your injuries.
Injured in a Construction Accident? Contact Our Office Today.
Were you or a loved one injured in a construction accident? Contact our office at (718) 650-2135 to request a free, no-obligation consultation. We have recovered millions of dollars in verdicts and settlements for our clients. Call now to get started today.
https://asarofirm.com/wp-content/uploads/2022/03/Asaro-Associates-Blog-Images.png533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2022-03-07 17:46:542022-04-05 16:39:04Who Can I Sue If I Was Injured on a Construction Site?
Do’s and Don’ts While Pursuing Compensation for an Injury
Whether you are injured at work or because of another person’s negligence or wrongdoing, there are ways to protect your rights and preserve your ability to receive compensation. You only have a limited amount of time to file a workers’ compensation claim or a personal injury lawsuit. Failing to file your case within the statutory timelines can affect or completely bar your ability to recover.
At the Law Office of Asaro & Associates, P.C., we have over 50 years of combined experience helping injury victims recover compensation. We give every case the personalized care and attention it deserves in order to get the best results.
If you have been injured at work or because of someone else’s wrongdoing, contact our office at (347) 231-5450 for a free consultation.
Filing an Injury Claim? Avoid These Mistakes.
In addition to failing to take immediate action after your injury, there are several things that can affect your right to recovery. It is essential to speak with an attorney as soon as possible after your injury to ensure that you receive the maximum compensation available in your case.
1. Not reporting a work injury.
Under New York law, most employers are required to carry workers’ compensation insurance. Workers’ compensation covers individuals who are injured at work but to ensure benefit eligibility; you must follow a strict set of guidelines. One of the most important is that you report your work injury to your supervisor immediately.
If you fail to notify your employer in writing of your injury within 30 days, you could lose your right to workers’ compensation benefits. You must also file a claim with the Workers’ Compensation Board. Regardless of fault, you should always consult with an experienced work site accident lawyer if you are injured while on the job.
2. Not getting a medical opinion.
A common mistake that most people make after they are injured is not seeking a medical opinion. It can be difficult to determine the extent of your injuries without a diagnosis by a doctor or health care provider.
Providing proof of your injuries is crucial to obtaining the largest possible recovery in your case. You should always seek medical treatment immediately after an accident and continue treatment until advised to stop by a doctor or provider.
3. Failing to document everything.
Whether you are seeking workers’ compensation benefits or filing a claim for damages against a responsible third party, you need to document everything. As soon as possible, you should make a note of everything that happened right before, during, and after your injury. Write down who you notified and when. Keep copies of anything you submitted to your employer, the Workers’ Compensation Board, or an insurance carrier.
4. Using social media too much.
Anything you post on social media after your accident can be used against you. It is important to avoid using social media to talk about your accident or to contact another party that may have been involved. Posting pictures can also hinder your recovery. A picture can be deceiving if taken out of context, particularly when you are awaiting compensation for your injuries.
5. Signing anything or speaking with insurance companies without a lawyer.
You should never sign anything or speak with an insurance company without first having your case reviewed by an attorney. Negligent parties or their insurance representatives may try to get you to release them from liability or use high-pressure sales tactics to get you to settle for less than your case is worth.
Early settlement offers rarely take into account the full extent of your injuries. If you accept a settlement or sign a release of reliability without first speaking with a lawyer, you may not be receiving the maximum compensation available in your case.
Contact Our Office for a Free Consultation
If you have been injured while working or as a result of another person’s wrongdoing, contact the Law Office of Asaro & Associates for a free consultation. Our attorneys will help you understand your rights and pursue compensation against any and all liable parties. It is critical that you act fast in order to ensure that you receive the recovery you deserve.
Call (347) 231-5459 or fill out our online contact form to speak directly with a member of our legal team. All consultations are 100% free of charge and confidential.
https://asarofirm.com/wp-content/uploads/2021/03/after-an-accident.jpg533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2021-04-07 13:51:092021-04-07 13:51:13Injured? Avoid These 5 Mistakes if You Want to File a Claim
Filing a Claim for Damages After a Stairway Accident
Stairwells can present a considerable danger whether they are located inside of a building or on the exterior. Under certain circumstances, a property owner may be held liable for an accident that occurs on stairs located inside or adjoining their property.
If you suffer serious injury as a result of a stairway fall, contact the Law Office of Asaro & Associates, P.C. to request a case consultation. Our experienced Bronx staircase accident lawyers may be able to help you obtain compensation for your injuries. Call (347) 231-5459 or fill out our online contact form to get started.
Who Is Liable in a Stairwell Accident?
Depending on the situation, a property owner may be liable for damages if you are injured in a stairwell accident on their property. According to New York City Administrative Code Section 27-127, “All buildings and all parts thereof shall be maintained in a safe condition.” Under this code section, staircases must be maintained in good working order.
New York City Administrative Code Section 27-128 establishes owner liability for failing to keep the premises safe. Slip and fall accidents on stairwells fall under premises liability law. In order to establish a valid claim for recovery, you must prove several things, including that there was an unsafe condition that led to your injuries.
What Do I Have to Show to Prove Liability?
Proving liability in a slip and fall case can be difficult, but with the help of a Bronx stairway accident lawyer, you can hold negligent parties responsible.
Some of the things that an attorney will consider in a staircase accident case include:
Did the owner or their agent create the dangerous condition?
Did the owner or their agent know or should have known about the hazard?
If they knew about the defective condition, did they fail to remedy it timely?
Did the owner adequately warn people about the potential hazard?
What Are Common Causes of Staircase Accidents?
Stairwell accidents can be caused by a number of different defective conditions. If you are injured because of a slip and fall on stairs, it is always in your best interest to contact a lawyer as soon as possible. An attorney can help determine the cause of the accident and whether you should pursue legal action.
Common causes of staircase accidents include:
Torn or loose carpet
Ice and snow
Spilled liquid
Broken handrails
Loose gravel or other objects
Improper construction
Inadequate maintenance
Uneven stairs
Unsuitable height or depth
How Do I Know If a Staircase Was Not Properly Constructed?
Buildings are required to be constructed in a safe condition. The New York Administrative Code sets forth requirements for both interior and exterior stairs located on a premises. Failure to comply with these or other building code statutes may result in liability.
A staircase may fail to comply with the administrative code if it is not wide enough. Width requirements are based on the occupant load, use, and capacity of the building. Injury can occur because a staircase was not properly constructed or designed.
Other stairwell construction violations that may lead to liability include:
Inadequate headroom
Inaccurate riser height and tread
Improper construction of guards or handrails
Complete lack of guards or handrails
Inappropriate building material used in construction
What Kinds of Injuries Occur From Stairwell Accidents?
According to a study published in the American Journal of Emergency Medicine, on average, over 1 million people sustain a stair-related injury requiring emergency medical treatment each year. Injuries from slip and falls on stairs can be relatively minor to catastrophic.
Common injuries related to slip and falls on stairs include:
Sprains and strains
Soft tissue injuries
Fractures
Injury to the lower extremities
Head and neck injury
In severe cases, a stairway accident can cause life-threatening injuries or deaths. Falls are a common source of traumatic brain injury (TBI) and spinal cord damage. If you are seriously injured, you need to consult with a Bronx stairway accident attorney.
How Can an Attorney Help?
If you are injured in a staircase accident, an attorney can help you hold a negligent party accountable. Without the help of a lawyer, you may not be able to get the maximum compensation available in your case. Many times, a negligent party or their insurance representative may deny responsibility or try to get you to settle your claim.
You should never sign anything without first consulting an attorney. An early settlement offer rarely reflects the full value of your claim, and you may be signing away your rights to recovery. An attorney can review your case to determine your legal options and whether you should seek additional damages based on your injuries.
How Much Does It Cost to Hire an Attorney?
At the Law Office of Asaro & Associates, you pay nothing unless we win. Our Bronx stairway accident lawyers handle matters on a contingency-fee basis, meaning there are no out-of-pocket costs. We want you to focus on your recovery while we try to get you the financial justice you deserve.
All case consultations are free and without obligation to retain our services. We will conduct a thorough review of your case to determine whether another party may be legally liable for your damages. Depending on the situation, you may be able to recover damages for your medical bills, lost wages, loss of future earnings, pain and suffering, and more.
Get the Personalized Care You Need
At the Law Office of Asaro & Associates, we have recovered millions of dollars on behalf of our clients in verdicts and settlements. We are committed to providing injury victims with the personalized care and attention you need to get a favorable outcome on your case. If you are injured in a staircase accident, you need experience you can trust. Call our office today at (347) 231-5459 to request a case consultation. Our Bronx stairway accident lawyers have over 50 years of combined experience and can help you get the money you need to be made whole again.
https://asarofirm.com/wp-content/uploads/2021/01/Slip-Fall.png6301200Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2021-01-21 14:35:062021-03-30 12:39:39I Slipped and Fell on Some Stairs. Who Is Liable?
Winter Weather Can Bring an Added Hazard to Construction Sites
A New York winter can bring bitter cold, rain, and snow, adding several potential dangers to the city’s construction zones. Employers have a duty to ensure that workers and the public are protected from hazardous conditions. Winterizing buildings and construction sites are crucial to preventing injuries. The failure to keep a work area safe during the winter can result in liability.
The attorneys at The Law Office of Asaro & Associates, P.C. share more than 50 years of experience helping injury victims obtain compensation. Each client receives the individualized, personal care they need to ensure they get the financial justice they deserve. If you have been injured in a construction zone accident, contact our office for a free consultation.
Winter-Related Hazards at Construction Zones
During the winter, poorly maintained construction sites put workers and the public at a heightened risk for injury or death. Multiple regulatory agencies require that properties and construction zones are adequately winterized to ensure everyone’s safety.
In New York City, buildings and construction zones must conform to regulations established by the following codes:
New York City Administrative Code
New York City Building Code
New York City Fire Code
Occupational Safety and Health Administration (OSHA)
Winterizing construction sites under these codes is critical to avoid injuries and death. If you were injured at a construction zone, contact our office to speak directly to an attorney. Depending on the situation, you might be entitled to recovery for your damages.
Fire Dangers at Construction Sites During Winter
All locations undergoing construction, alteration, or demolition must adhere to the New York City Fire Code. Fire safety measures are critical at construction zones, particularly during the brutal cold of winter.
Some fire code violations include:
The use and storage of portable or temporary heating devices
The storage, handling, and use of flammable and combustible liquids and gasses
Ensuring that materials are not stored near flames
Providing adequate access for emergency responders
Frozen Pipes
New York weather conditions can decline quickly during the winter months. Snowstorms, freezing rain, and temperatures well below freezing are not abnormal for this time of year. At construction sites, exposed pipes that are not properly insulated can freeze. Frozen pipes can burst, doing irreparable damage and causing injury to workers.
The city requires that pipes and sprinklers are protected from freezing. They should be tested regularly to ensure that they will withstand winter temperatures. One of the greatest threats comes from the attempt to thaw a frozen pipe with a live flame. Improper thawing can lead to a fire or steam explosion. Tragically, many of these construction accidents are preventable.
Slip, Trip, and Fall Conditions at Construction Sites
Ice and Snow can present perilous conditions at construction sites during the winter months. Construction companies and property owners are required to remove ice and snow from the area to prevent slip and fall accidents. Additionally, loose debris must be contained and removed from walkways to prevent harm to workers, the public, or emergency responders.
Slip and fall injuries can be catastrophic. Falls are one of the most common causes of fatalities in the construction industry. During the winter, when the weather can present an added menace, it is crucial that sites be kept free from potential slip and fall hazards.
Scaffolding Concerns
Under OSHA Regulation 1926.451(f)(8), construction workers are “prohibited from working on scaffolds covered with snow, ice, or other slippery material except as necessary for removal of such materials.” Improperly secured and unstable scaffolding is one of the most commonly cited OSHA violations and results in thousands of injuries each year.
During poor weather conditions, scaffolding and other equipment should not be used unless all regulatory requirements are met. The Bureau of Labor Statistics estimates that as many as 61 fatalities in a single year resulted from unsuitable scaffolding and staging.
Crane and Derrick Hazards
Ice and snow are not the other winter weather hazards that can affect construction sites. Strong winds can cause devastation. Cranes, lifts, and derricks are particularly vulnerable to windy conditions. New York City and OSHA have specific standards for crane operation; failure to follow these requirements can result in a catastrophic collapse.
In October, cold, windy conditions caused a crane in Midtown Manhattan to spin wildly. Onlookers watched debris fall from the high rise that was under construction at the time. According to reporting by CBS 2 New York, “a loose cable hanging from the crane was spinning and hitting the building, causing the debris to come crashing down.” The incident shut down several streets as they worked to secure the machine.
Hoist Violations
Personnel hoists should not be used in “heavy rain, icy/freezing conditions, or winds reaching 35 mph.” OSHA requires that hoists be inspected and maintained on a weekly basis. Additionally, if the hoisting equipment has been exposed to wind conditions over 35 mph, it must be inspected and “put in operable condition before reuse.”
High winds can do exceptional damage to personnel hoists, making them unusable. Injuries caused by a faulty hoist can include spinal cord damage, traumatic brain injury, or death. To prevent these debilitating accidents, construction companies must remove hoists from use during adverse weather conditions and inspect them regularly.
Contact Our Office for a Free Consultation
If you are injured in a construction accident, you need an attorney with experience to get the recovery you deserve. Winter can make construction sites even more dangerous than they usually are if proper safety protocols are not followed. If someone else was responsible for your injuries, you might be entitled to compensation.
At The Law Office of Asaro & Associates, we have helped injury victims recover millions in verdicts and settlements. We work hard to hold negligent parties accountable for their wrongdoing. In many cases, there may be more than one responsible party, requiring complex litigation. We are experienced trial lawyers who know what it takes to win cases.
Call our office at (347) 231-5459 or fill out our online contact form for a free consultation.
https://asarofirm.com/wp-content/uploads/2020/12/Untitled-design-5.png6301200Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2020-12-01 18:01:082020-12-01 18:02:59Why Winter Construction Zones Are So Dangerous
Uneven Surfaces, Clutter, and Lack of Safety Rails Are Common Fall Culprits at Work Sites
Falls are one of the leading causes of injury and death at construction sites. Tens of thousands of workers and pedestrians are injured in falls at worksites each year. New York City is almost constantly under construction resulting in a large number of slip, trip, and fall accidents.
If you are injured in a slip and fall accident at a construction site, contact the Law Office of Asaro & Associates, P.C. at (347) 231-5459 for a free consultation. Our attorneys have recovered millions on behalf of slip and fall victims. Get the personalized attention you need to get the results you deserve.
What Makes Construction Sites Prone to Slip and Fall Accidents?
Construction sites can have many obvious and latent hazards. Data collected by the National Safety Council (NSC) shows that the construction workers are the most at risk for falls from height. A person who falls from a higher level to a lower level is more likely to be seriously injured or killed due to the accident.
According to the most recent data available from the NSC, in 2016, there were over 24,700 injuries related to falls in the construction industry. Falls resulted in over 300 deaths that same year. As noted by the NSC, most slip and fall accidents are preventable, resulting from a lack of safety equipment, inadequate training, and poor supervision.
Are Falls at Construction Sites More Likely to Cause Serious Injury?
Falls to a lower level also referred to as falls from height, are more likely to cause serious injury or death. A fall of even a few feet can cause irreparable harm, including damage to the spinal cord, head, and neck. These catastrophic injuries can leave a victim unable to work or continue with their normal activities.
As reported by the U.S. Bureau of Labor and Statistics, a six-year study of fatal work-related falls to a lower level showed that they were substantially more likely to occur in the construction industry.
Sources of fatal falls to a lower level include:
Ladders
Roofs
Stairs and steps
Trees
Scaffolding and staging
Machinery
Vehicles
What Laws Protect Workers in New York?
As it relates to slip and fall accidents at construction sites, Labor Law Section 241(6) and Labor Law Section 200 provide significant protections.
Labor Law Section 241(6) requires that workers employed at construction sites and those lawfully frequenting the area be provided “reasonable and adequate protection and safety.” This statute requires that a worksite be free from trip hazards and that workers be provided with adequate safety equipment.
Labor Law Section 200 imposes a “general duty to protect health and safety of employees.” Failure to adhere to safety regulations, such as providing fall protection, can result in liability. Construction sites can pose an unnecessarily high degree of risk unless proper protocols are followed at all times.
What Can I Recover If I Am Injured in a Trip and Fall at a Construction Site?
If you are injured in aconstruction accident, you may be able to recover damages related to:
Current and future medical treatment
Lost wages
A Reduction in future earning capacity
Pain and suffering in some cases
A wrongful death claim if your loved one was killed
In order to get the maximum compensation available in your case, it is important to speak with an attorney before agreeing to a settlement. Trip and fall accidents can involve more than one liable party. Having your case reviewed by a lawyer can help ensure that you receive full compensation for your injuries.
Who Can Be Held Liable?
A work site accident may involve multiple defendants depending on the situation.
Common responsible parties for slip and fall accidents at construction sites may include:
General contractions
Property owners
Employers
Manufacturers
Protecting employees and visitors should be the highest priority at any work site. Too often, complacency at a job site has devastating results.
What Are the Most Frequently Cited Violations at Construction Sites?
Fall protection is regularly listed as the number one most frequently cited violation by the Occupational Safety and Health Administration (OSHA). This makes it unsurprising that falls are among the leading causes of injury and death in the industry. Failing to follow scaffolding requirements is another commonly cited standard, followed by failing to adhere to safety guidelines related to ladders.
Many construction site accidents should not occur. When employers fail to provide fall protection, serious injuries can happen. According to OSHA, many fall injuries occur because of a lack of guard rails or floor hole coverings. These simple fixes would save numerous lives each year.
What Do I Do If I Am Injured in a Trip and Fall Accident?
Active major construction continues throughout New York City. There are nearly 7,000 active permits with over 130,000 proposed dwelling units. Work sites stretch throughout the five boroughs affecting nearly every New Yorker.
Whether you are a construction worker or a pedestrian walking near a job site injured in a slip and fall accident, you might be entitled to compensation. The first thing you should do if you are injured is to seek emergency medical treatment; once you can, contact our office to discuss your case and determine your legal options.
Injured in a Slip and Fall Accident? Contact Our Office for a Free Consultation
Slip, trips, and falls are common occurrences at construction sites. If you are injured because of someone else’s negligence or wrongdoing, you deserve compensation. Employers and property owners are required to provide a safe environment, failure to do so can result in liability. Contact The Law Office of Asaro & Associates at (347) 231-5459 to speak directly with a Bronx slip and fall lawyer. Our attorneys have over 50 years of combined experience and can meet you at your home or in the hospital where you are recovering. Let us help you when you need it most. Call today for a free consultation and to get your case started.
https://asarofirm.com/wp-content/uploads/2020/10/NY-Construction2.jpg480480Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2020-10-29 04:34:052020-11-18 07:11:30Why Slip and Fall Accidents at Construction Sites Can Be the Most Dangerous
What To Do If You Are Injured in a Trip, Slip, or Fall Accident on a NYC Sidewalk
The coronavirus pandemic has resulted in substantial budget cuts throughout New York City and across the state. These budget cuts have significantly impacted the city’s ability to repair everyday hazards like uneven and cracked sidewalks. According to the New York City Department of Transportation (NY DOT), all sidewalk repairs, except for emergencies, are suspended due to COVID-19. A failure to maintain the city’s nearly 12,750 miles of sidewalk results in numerous injuries each year.
If you are injured in a trip, slip, or fall accident on a NYC sidewalk, it can be challenging to determine who is liable. There is no statewide rule in New York regarding sidewalk liability; thus, it is left up to the local municipalities. New York City has specific rules regarding a property owner’s responsibility to improve and repair the sidewalks abutting their business.
Contact The Law Office of Asaro & Associates, P.C., to speak with an experienced attorney who can help you determine who should be held accountable and how much your case is worth. Call (347) 231-5459 or request a case consultation by filling out our online contact form. Cases are handled on a contingency-fee basis, meaning you pay nothing unless we win.
Determining Liability If You Are Hurt in a Sidewalk Fall
A real property owner is responsible for keeping the sidewalk that abuts their property in a reasonably safe condition, according to New York City Administrative Code § 7-210. Pursuant to this code section, property owners may be held liable for any property damage or personal injury proximately caused by the owner’s failure to maintain the sidewalk in a reasonably safe condition. In general, if you are injured on a sidewalk or intersection quadrant, outside of a commercial property, the property owner may be held liable for your injuries.
Under New York City Administrative Code § 19-152, real property owners are required to “install, construct, repave, reconstruct and repair the sidewalk flags in front of or abutting” their property.
Common causes of sidewalk defects that cause injury include:
Uneven pavement
Exposed hardware
Patchwork
Sloping sidewalk
Tree roots
Collapsed pavement
A property owner, however, is not required to repair sidewalk defects caused by the city. If the damage to the sidewalk or intersection quadrant was done by the city, its agents, or a city employed contractor, the city may be responsible for your injuries.
Suing the City for Your Sidewalk Fall Injuries
Under most circumstances, defective conditions in the sidewalk are the responsibility of the adjoining property owner. When the property is a one-, two-, or three-family residential property that is owner-occupied, the city may be liable for your injuries.
The New York City Department of Transportation is required to repair or replace damaged sidewalks that abut residential properties that meet these standards. Typically, the NY DOT replaces “more than 2 million square feet of sidewalk a year.” The pandemic, however, has halted repairs indefinitely, making NYC sidewalks more dangerous than ever.
If you are injured on a sidewalk where the city is responsible for maintaining it in a reasonably safe condition, you may have to show that the city received prior notice of the defective condition and failed to repair it.
What To Do First After a Trip or Slip Accident
If you are injured from a NYC sidewalk fall, the first thing you need to do is seek medical attention. Injuries related to trips/slips can be severe, even life-threatening. Falls are one of the leading causes of traumatic brain injuries. Failing to have your injuries checked by a medical professional may diminish your claim to damages.
As soon as you are able, take pictures of where the incident occurred. It is best to take photos or video immediately after the accident if you are capable. Obtain names of any witnesses that were present at the time of the fall and get the information of the property owner adjoining the sidewalk where you fell. It is always a good idea to call the police if you are injured in an accident. The police can complete an accident report that may aid you in your recovery.
Finally, always consult an attorney prior to signing anything or accepting a settlement. You may be contacted by an insurance representative shortly after your accident and offered a settlement. Early settlement offers rarely reflect the true extent of your injuries and may not include the maximum damages allowed under New York law.
Contact The Law Office of Asaro & Associates for a Free Consultation
Determining liability after a fall on a NYC sidewalk can be difficult. Despite it being a public location, it may be the property owner that is responsible for your injuries. At the Law Office of Asaro & Associates, our attorneys will determine who should be held accountable and how to get the largest recovery in your case. Our attorneys are skilled litigators that have recovered millions in verdicts and settlements on behalf of clients. Call (347) 231-5459 today to get your case started.
https://asarofirm.com/wp-content/uploads/2020/09/Cracked-sidewalks-the-bronx.jpg384512Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2020-09-03 18:00:592020-09-04 21:25:55NYC Sidewalks Are More Accident-Prone Now Than Ever
Plaintiff was operating his Harley Davidson motorcycle on the Long Island Expressway when he was struck by a truck. The driver of the truck fled the scene, leaving the plaintiff with multiple fractures and other serious injuries. We were able to obtain a significant settlement against the plaintiff’s uninsured motorist policy.
Too often hit and run victims are left with few options. Despite receiving serious injuries, they are given little hope for compensation. At the Law Office of Asaro & Associates, P.C., we fight to get you every dollar you deserve. Insurance companies must be held accountable. Our team can represent you against your insurance company to get you the maximum compensation in your case.
If you are injured in a motorcycle or auto accident, contact our office today to speak with an experienced attorney. You pay nothing unless we win. Call today at (347) 231-5459 or request a free consultation by filling out our online contact form.
https://asarofirm.com/wp-content/uploads/2020/10/pexels-stitch-dias-2116475-1-1.jpg6671000Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2020-08-03 21:30:002020-10-06 21:44:32Successful Case Result Recovering Damages for Injured Motorcyclist Hit by Truck on Long Island Expressway
Recovering Damages in a Slip and Fall Case When There Was a Caution Sign
Property owners or those in control of the property are required to provide a reasonably safe premises to prevent foreseeable injuries. What happens when they put out a sign indicating a wet floor or hazardous condition? Does the presence of a warning sign mean you cannot recover compensation in a slip and fall case?
The truth is that you can still recover compensation from a slip and fall accident even when a warning sign was present if the property owner was still negligent in a significant way. A wet floor sign or other indication of a potential hazard is one piece of the puzzle, but it does not remove liability for the property owner.
There are a number of other factors to consider in a slip and fall case even when a store owner put notice of the unsafe condition. For example, the answers to the following questions will affect the outcome of a slip and fall case:
Was the sign visible and unobstructed?
Was walking through the hazard unavoidable?
Did the property owner regularly check to ensure that the sign or notice had not been moved?
Was there sufficient lighting?
Was the spill or obstacle remedied as quickly as possible?
Was an anti-slip material put down to avoid injuries?
Was the warning sign adequate given the size of the spill or defective condition?
Injured in a Slip and Fall Accident in NYC?
Even if the property owner posted a notice regarding the spill or hazard, you might still be entitled to compensation. If you have suffered serious injuries such as a broken wrist, head trauma, or a spinal cord injury resulting from a slip, trip, or fall at a retail location or other property, you need to have your case reviewed by an experienced injury lawyer.
Whether you were injured in a supermarket slipping on spilled liquid or entering a department store after a rainstorm, our injury lawyers in New York City can help. Contact the Law Office of Asaro & Associates today for a free consultation at 718.865.2467.
Recovering Damages in a Slip and Fall Case
Regardless of the circumstances, if you were seriously injured in a slip, trip, or fall, you should always have your case reviewed by a knowledgeable attorney. One factor, such as the existence of a caution sign, may not bar your ability to recover damages. It is essential to have an independent investigation done to determine liability. Contact our office at (347) 231-5459 for a free consultation. We will come to you whether you are recovering at home or in the hospital. Call today to find out how we can help.
https://asarofirm.com/wp-content/uploads/2020/07/Slip-Fall.png303691Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2020-07-29 19:00:462020-07-29 19:09:37Can You Recover Compensation from a Slip and Fall Accident in NY If There Were Warning Signs?