';
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'] .= "
Most birth injuries present themselves right away, such as broken bones or serious brain injuries that require immediate surgery. However, some injuries don’t show up for weeks, months, or even years. Sadly, this means that many parents don’t realize their baby has suffered a serious injury at the hands of negligent doctors or other healthcare providers until well after the fact. But do these parents lose the right to take legal action simply because they are unaware of their child’s injury?
If your child suffered an injury at birth, you may have the right to seek compensation from those responsible. To learn more about your rights and legal options, contact the Bronx birth injury lawyers at Asaro & Associates. We are dedicated to helping victims of birth injuries get the justice they deserve. Call (347) 231-5459 today to arrange a free consultation.
What Is Considered a Birth Injury?
A birth injury is any injury that occurs before, during, or shortly after the birthing process. Examples include:
Broken bones
Traumatic brain injury
Spinal cord injuries
Brachial plexus injuries (Erb’s palsy)
Shoulder dystocia
Cerebral palsy
Klumpke’s palsy
Vision, hearing, or motor impairment
Hydrocephalus
Facial injuries
Birth Injuries That May Have Delayed Symptoms
Birth injuries that go undiagnosed are typically those that affect a child’s cognitive function and/or his or her mental or physical development and often involve injuries that cause damage to a baby’s brain, spinal cord, or nerves. Causes of these injuries include but are not limited to hypoxia (oxygen deprivation,) undiagnosed or untreated infections, the improper use of forceps or other birth-aiding tools, and the improper administration of medication.
Birth Injury Claims
While some birth injuries are not preventable, many are a direct cause of a healthcare provider’s negligent actions. In these cases, the injured victim or a family member acting on their behalf can seek damages by filing a birth injury claim against the negligent party.
Types of damages include:
Past and future medical expenses
Rehabilitation
Assistive care
Home and vehicle modifications
Pain and suffering
Mental anguish
Disability
Disfigurement
Diminished quality of life
Wrongful death damages
New York’s Birth Injury Statute of Limitations
A statute of limitations sets forth the maximum amount of time a party has to file a lawsuit after an alleged offense. In the majority of personal injury cases, this time begins on the date the injury occurred. Once the statute of limitations runs out, the injured party loses their right to take legal action against the negligent party.
But with many birth injury and medical malpractice cases, victims don’t learn of their injuries for months or even years. In these circumstances, New York allows victims to retain the right to take legal action through a modified statute of limitations. It states that an injured party must file a claim for damages within 30 months of the date of injury or from the date the injured victim became aware of their injury.
If the injured victim is under the age of 18, they have ten years from the date they learned of their injury to file a claim and up to 30 months after they turn 18. However, most parents choose to take legal action on their child’s behalf well before the time afforded by the statute.
Speak with a Birth Injury Lawyer in The Bronx
Healthcare providers have a duty to prevent harm or injury to their patients by providing adequate care. When they fail to do so, they must be held accountable for their actions.
While no amount of money can make up for your child’s injury, taking legal action and seeing that justice is served can bring peace of mind to you and your family.
At Asaro & Associates, we understand the devastating and far-reaching effects of a serious birth injury. Birth injuries can lead to endless surgeries and costly ongoing care, taking a significant toll on victims and their families. That is why we fight so hard to secure full and fair compensation on behalf of our clients, ensuring they have the means to provide the care their children need. To determine whether you still have the right to seek compensation for your child’s birth injury, contact us online or call (347) 231-5459 to schedule a free case review.
https://asarofirm.com/wp-content/uploads/2023/10/Birth-Injuries.jpg533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2023-10-10 09:12:322023-10-10 09:12:34Can Birth Injuries Appear Later in Life?
Hey there, city livers and Big Apple enthusiasts! If you’re a New Yorker, you’re probably familiar with the barrage of traffic and taxis that make up our urban playground. But not all boroughs are created equal when it comes to car accidents. It’s helpful to know that New York has five different boroughs, and all five have different rates of car accidents. So, which borough is the worst for car accidents?
We should always buckle up, but be extra aware of clipping in that safety belt while you’re driving in Brooklyn because it has the most dangerous drivers– by a landslide! According to statistics from the New York Police Department, from June 2021, 10,355 car accidents were reported in New York. Of course, there could have been plenty that went unreported. Of that 10,355, 3,546 were in Brooklyn alone. Below are the numbers from that study.
Manhattan: 1,667
Bronx: 1,903
Brooklyn: 3,546
Queens: 2,744
Staten Island: 495
The digits reveal that in that action-packed month of June, Brooklyn had the highest accident rate. Even though the NYPD generated these statistics in only one month in 2021, they reflect what is true on average. While it has some competition, Brooklyn remains at the top.
Brooklyn Bravado: The Hard Numbers
Alas, there’s more. June of 2021 was a month that saw some of the highest car accident rates in New York City. Injuries from these fender-bender accidents increased very quickly. 1,756 people were left nursing their bumps, bruises, broken bones, and shaken nerves– motorists, passengers, cyclists, and pedestrians. That is nearly 400 more injuries than its closest contender, Queens. So, if you’re cruising through Brooklyn, wear that seat belt! Here’s how the numbers shaped up for injuries in an accident for the five boroughs.
Manhattan: 684
Bronx: 893
Brooklyn: 1,756
Queens: 1,395
Staten Island: 224
Again, this time, Brooklyn has the most accidents that result in injury. Out of these accidents, injuries may have ranged from severe or minor. But no matter how small the injury, it could still warrant litigation.
An experienced and skilled attorney, like the personal injury attorneys at Asaro & Associates, can help you recover damages. It’s evident that many people are injured in car accidents in Brooklyn, so it’s wise to always stay alert while operating a vehicle or walking as a pedestrian in that particular borough. Even though being cautious, you may be injured by a negligent driver and require compensation.
Which Borough Has the Most Fatalities?
Fatalities are the worst of the worst when it comes to car accidents. Let’s give credit where it’s due – at least Brooklyn takes a step back in this category.
Manhattan: 6
Bronx: 6
Brooklyn: 5
Queens: 6
Staten Island: 0
The other boroughs (almost all of them) hold their own in the fatality department. Staten Island gets a gold star for not having any fatalities during this time. Way to go, Staten Island!
Why Brooklyn’s the “Daredevil” Borough
Why does Brooklyn lead the charge with the most car accidents? The factors contributing to these automotive incidents include drivers not paying attention (a whopping 970 cases), failing to yield the right-of-way, tailgating, and treating the road like their personal playground.
Hiring an Experienced Attorney
If you’ve been caught in this chaotic mess, there’s hope. The experienced and consistently winning attorneys at Asaro & Associates, fellow New Yorkers, got your back. If you’re injured, not at fault, and feeling like a pawn in a Brooklyn bumper car game, we’ll take your call.
Brooklyn: Beware and Take Care
To all the Brooklyn-living New Yorkers out there, whether you’re walking, cycling, or driving – keep your heads on a swivel and your wits about you. The streets might not be paved with gold, but this city is full of surprises. Be cautious, stay alert, and ensure your fellow New Yorkers do the same.
When the road gets bumpy, our trusted and experienced winning attorneys at Asaro & Associates will always cover your six. Give us a call at (718) 865-3192 for assistance or any legal support.
Stay safe out there, NYC!
https://asarofirm.com/wp-content/uploads/2023/08/Worst-Drivers.jpg533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2023-08-25 09:14:462023-08-25 09:20:18Which Borough Has The Worst Drivers?
Receiving Financial Recovery After a Traumatic Brain Injury
Thousands of people suffer non-fatal traumatic brain injuries each year in New York. In some cases, those traumatic brain injuries or TBIs are caused by another person’s negligence or wrongdoing. In those instances, the TBI survivor may be entitled to compensation for their injuries.
At Asaro & Associates, we provide dedicated advocacy for traumatic brain injury survivors. Our lawyers have secured millions of dollars on behalf of clients throughout New York. We work tirelessly to ensure that TBI survivors and their families receive the maximum compensation allowed by law.
If you sustained a TBI after an accident, contact our office at (718) 865-3192 to request a free consultation.
What Kinds of Damages Will I Receive After a TBI?
One of the first questions you may have as a survivor of a traumatic brain injury is what kind of damages you will receive. TBIs can affect nearly every aspect of your life, making it difficult for you to take care of yourself or your family. You might be unable to work or be in extensive therapy. Without assistance, the financial burden is often too much for most people to bear.
In TBI cases caused by another person’s negligence or wrongdoing, you may be entitled to economic and non-economic damages. The best way to ensure that you receive the compensation you deserve is by hiring a traumatic brain injury lawyer to represent you.
What Are Economic Damages in a TBI Case?
Economic damages are designed to compensate you for your out-of-pocket, injury-related losses. They are generally quantifiable and easy to calculate.
Economic damages in a TBI case may include compensation for:
Current and future medical bills. Many people assume that they are only entitled to their current medical bills, but a skilled attorney can help determine what the future cost for care and treatment may be for your TBI.
Lost wages. Traumatic brain injury survivors are usually entitled to financial recovery if they are unable to return to work. Lost wages can be proved through income documents such as a W2 or pay stub.
Property damage. If your vehicle, home, or other property was damaged in the accident that caused your TBI, you may be entitled to compensation for the cost to repair.
Loss of earning capacity. As with medical bills, TBI survivors are not only entitled to their current lost wages they are also able to collect damages related to a loss of future earnings if they are not able to fully return to work or have a diminished capacity.
While calculating economic damages may seem straightforward, it is in your best interest to have your claim reviewed by an attorney as early as possible. Unrepresented injury victims often end up settling their cases for less than they are worth.
What Are Non-Economic Damages?
Non-economic damages in a traumatic brain injury case are harder to calculate. They are damages designed to compensate an individual for personal losses. These damages usually must be determined by an expert in the field.
Non-economic damages in a TBI case may include compensation for:
Pain and suffering. TBI survivors may be entitled to compensation for their physical pain and emotional suffering.
Mental anguish. A traumatic brain injury may deeply affect a person’s mental health and well-being including causing depression, anxiety disorders, fear, and more.
Disability. If the brain injury left you temporarily or permanently disabled, you might be able to collect damages related to the severity of the impairment.
Loss of enjoyment of life. Due to the widespread impact that a TBI can have on a person, they are often entitled to compensation for loss of enjoyment of life. It is usually awarded in cases where the injured victim is unable to return to the activities or lifestyle they had before their injury.
In limited circumstances, a TBI survivor may be entitled to punitive damages in addition to compensation for their economic and non-economic losses. Punitive damages are designed to punish the defendant for their egregious behavior.
Contact Our Office to Speak with a TBI Lawyer Today
Did you or a loved one sustain a TBI due to someone else’s wrongdoing? Contact our office at (718) 865-3192 to schedule a free consultation. Let us help you get the compensation you need and deserve after a brain injury.
https://asarofirm.com/wp-content/uploads/2023/07/Asaro-Associates-Blog-Images-8.png533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2023-07-12 08:54:392023-07-14 12:08:02What Types of Damages Can TBI Victims Receive?
What to Do If You Are the Victim of Nursing Home Violence
Few people expect that when they put their loved one in a nursing home or long-term care facility, they will be the victim of a violent attack. But, patient-on-patient abuse is more common than most people think. If your loved one is attacked at a nursing home, the facility might be liable for damages if they fail to provide adequate supervision or prevent foreseeable harm.
At the Law Office of Asaro & Associates, P.C., we represent nursing home patients who have suffered an injury in a fight with another resident. Our experienced legal team will work tirelessly to ensure you receive the largest possible recovery. If you or your loved one has been injured in a resident fight at a nursing home in New York City, contact our office at (347) 231-5459 to schedule a free consultation.
When a Nursing Home May Be Held Liable for a Resident Fight
Resident fights can happen at nursing home facilities, particularly if patients are left unattended or if they are not properly screened. If a nursing home fails to provide a reasonable standard of care by not properly supervising residents or by failing to isolate patients with violent tendencies, they may be held liable if someone is injured in a resident fight.
A nursing home might face liability if a resident is injured in a fight when:
There was a lack of proper supervision.
There were red flags that a patient had violent tendencies.
The staff was not adequately trained.
There was inadequate staff on site.
They did not properly screen a resident to determine if they had a violent history.
They knew or should have known that a fight would occur and did not stop it.
They knew of a patient’s mental health disorder that could make them violent and did not intervene.
If you believe that a nursing home was negligent in the care and treatment of you or your loved one resulting in harm, you need to speak with an attorney. Depending on the situation, the nursing home facility may be liable for damages, even if the injuries were caused during a resident fight.
What Types of Injuries Are Common in Resident Fights?
Resident fights at nursing homes can result in serious injury or even death. Therefore, fights must be broken up quickly or prevented, to begin with, in order to avoid a potentially life-threatening situation.
Common injuries in nursing home resident fights include:
Broken bones and fractures
Traumatic brain injuries (TBIs)
Concussions
Sprains, strains, or muscle tears
Nerve damage
Cuts and lacerations
It is essential for nursing home facilities to be proactive if they suspect that a resident may have a propensity for violence. Staff should be fully trained in de-escalation strategies and constantly supervise patients to ensure safety.
Injured in a Nursing Home Resident Fight?
Were you or a loved one injured in a nursing home resident fight? Contact our office at (347) 231-5459 to schedule a free consultation. Let us help you hold the facility accountable for failing to put the safety of its residents as their top priority.
https://asarofirm.com/wp-content/uploads/2023/06/Blog2Social-Size-15.png6301200Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2023-06-08 09:44:332023-06-09 16:08:39Is a Nursing Home Liable for Resident Fights?
When you place an elder loved one in a nursing home, you expect them to receive good care. Yet, nursing home abuse and neglect are rampant in New York. Disturbingly, only an estimated 23 cases are reported to authorities. Elder abuse and neglect can take many forms, sometimes making it difficult to ascertain what happened.
The Law Office of Asaro & Associates represents nursing home residents and their families in abuse and neglect cases. Our staff works tirelessly to help you understand your rights and get the best possible outcome if your loved one has experienced mistreatment. If you believe your loved one has been abused or neglected at a nursing home, contact our office at (347) 231-5459 for a no-obligation consultation.
Understanding Elder Abuse vs. Neglect
Both abuse and neglect are forms of mistreatment, yet are fundamentally different. Abuse is intentional, involving deliberate acts resulting in serious risk and can be physical or emotional.
Neglect is either passive or active, depending on the caregiver’s intent, and is often characterized by a lack of action to fulfill caretaking tasks. It is often unintentional, especially when caretakers are overwhelmed or undertrained. However, even unintentional neglect can have serious consequences, such as when a resident receives an incorrect medication.
What is Nursing Home Elder Abuse?
Acts considered elder abuse in nursing homes must be intentional, according to the Centers for Disease Control (CDC). Types of elder abuse occurring in nursing homes include:
Physical abuse, including restraining a senior physically or chemically with medication.
Emotional or psychological abuse, which ranges from ignoring to intimidation or making threats.
Sexual abuse involving any non-consensual sexual contact.
Financial exploitation, such as the authorized taking, misuse or concealing of assets and property or charging for care that was not given.
Healthcare fraud performed by unethical medical personnel or professional care providers.
What is Nursing Home Elder Neglect?
Neglect occurs when the nursing home doesn’t meet its caretaking obligations to a resident. It is more common than abuse and can take many different forms. The CDC notes that 15.3% of complaints in nursing homes are for elder neglect.
Examples of nursing home neglect are:
Medical neglect – failing to address or prevent medical issues like not administering medications, improper care for existing conditions like dementia or diabetes, not managing infections or bedsores.
Basic needs neglect – not providing food and water, or a clean and safe environment.
Personal hygiene neglect – failing to give adequate assistance with bathing, hair care, brushing teeth, changing soiled clothing and linens, etc.
Social/emotional neglect – repeatedly ignoring the senior, preventing them from interacting with others, and frequently yelling at them.
Consequences of Nursing Home Abuse and Neglect
Abuse or neglect can significantly impact an elder’s physical and emotional well-being and personal hygiene. Nursing home residents can suffer consequences like anemia, dehydration, undiagnosed illnesses, weight loss or malnutrition. Sometimes, those issues can lead to death, but they can also result in declining health.
When a nursing home resident’s hygiene needs are unmet, they may smell unpleasant, have dirty skin, and have unclean, ill-fitting or missing clothes. Emotional consequences often result in a change in behavior, including insomnia, isolation, loneliness, loss of trust, depression, anxiety, fear or suicidal thoughts and actions.
Who is Responsible for Nursing Home Abuse and Neglect?
The nursing home and individual staff members may be liable for abuse and neglect. Long-term care facilities have a duty to properly hire and train workers to give proper care. They also should maintain sufficient staff to provide adequate care. Lawsuits against nursing homes often result from inadequate staffing.
Stressed and overworked employees may be unable to provide the needed quality of care. Many facilities also don’t properly screen or run background checks on their hires. Not screening potential employees for drug or alcohol abuse endangers residents as these individuals are more apt to commit abusive acts.
Understaffing reduces the overall quality of the facility. Impossible workloads lead to overworked staff, who are more likely to make poor decisions. There is little room for error in nursing homes. According to a U.S. Public Interest Research Group report, 20% of American nursing homes are understaffed.
Contact Our Office for a Complimentary Consultation
Nursing homes and their employees can face criminal and civil penalties for abusing or neglecting those in their care. Always report suspected incidents to local authorities for investigation. In addition, victims and their families can file an injury lawsuit to collect possible financial compensation for their suffering. If you or a loved one have suffered at the hands of a nursing home, contact our office at (347) 231-5459 to discuss your case with our legal team.
https://asarofirm.com/wp-content/uploads/2023/04/Nursing-Home-Abuse.jpg533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2023-04-24 09:16:272023-04-24 09:18:57Nursing Home Abuse vs. Neglect
Construction Site Safety Tips for Pedestrians in NYC
New York City has thousands of active construction sites. From affordable housing projects to highrise renovations, the city is filled with potentially hazardous areas. While these workplaces present a danger to their employees, they also can result in injuries or deaths to pedestrians nearby.
At the Law Office of Asaro & Associates, we represent pedestrians who have been hurt or killed in construction accidents throughout New York City. Our experienced legal team can help you understand your rights and fight to get the results you deserve. If you were injured while walking in NYC, contact our office at +13472315459 to schedule a free consultation.
How Are Pedestrians Injured at Construction Sites?
Construction sites can be extremely dangerous, particularly for pedestrians who are not in safety gear and may be unaware of any risks. From falling objects to obstructed walkways, construction sites can cause serious injury or death to passersby.
Common causes of pedestrian injuries at construction sites:
Falling objects
Unsecured machinery, tools, or ladders
Slip and fall hazards
Obstructed walkways
Unsecured stairways
Exposed wiring
Malfunctioning machinery
Transportation incidents
Crane accidents
Unsafe scaffolding
If you were injured while walking near a construction site, you might be entitled to compensation. It is important to contact an attorney as soon as possible as you may only have a limited amount of time to file a claim for damages.
How Can These Accidents Be Prevented?
Preventing construction accidents requires diligence by the pedestrian, but also by the construction company and its employees. Unfortunately, many pedestrian injuries at construction sites are caused by another person’s negligence.
Tips on how pedestrians can avoid construction accidents:
Avoid distractions. Put away your cell phone and take out your earbuds. The more alert and aware you are the quicker you will be able to react if there is a hazard at a construction site.
Use designated walkways. While they may get crowded, it is always safer to use the designated pedestrian walkway than to attempt to circumvent it. The walkways are usually covered to prevent falling objects from hitting the walkers below.
Securing a site. Construction companies must work to keep their sites secure. Unlocked gates or a lack of barricades can result in serious harm to passersby.
Marking the site. Construction companies should also clearly mark the construction site and use signage to direct pedestrians to any walkways or detours.
Adequate training. A common reason for construction accidents is inadequate training. Companies must invest in training their employees in order to avoid serious harm.
If you are injured in a pedestrian accident at a construction site, you need to seek medical attention immediately. Failure to receive treatment could negatively impact your case and your recovery.
Contact Our Office to Learn More
Were you or a loved one injured while walking near a construction site in NYC? contact our office at +13472315459 to schedule a free case consultation. There are no fees unless we win. We have recovered millions for our clients and will work hard to get you the compensation you deserve. Call now to get started.
https://asarofirm.com/wp-content/uploads/2023/03/Avoiding-Construction-Accidents-as-a-Pedestrian.jpg533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2023-03-08 10:32:292023-03-08 10:37:32Avoiding Construction Accidents as a Pedestrian
How an Attorney Can Help You Get the Maximum Compensation for Your Injuries
If you are seriously injured in a car accident, you may need multiple doctor appointments, rehabilitation, and other forms of treatment, such as chiropractic therapy. Unfortunately, without the help of an attorney, you may not receive the compensation you need to cover all of these injury-related expenses.
At the Law Office of Asaro & Associates, P.C., our attorneys have over 50 years of collective experience representing individuals who have been injured in car accidents throughout the Bronx. Our knowledgeable legal team will help to get you the maximum recovery available based on the circumstances of your case. If you or a loved one were injured in a car wreck, contact our office at (718) 650-2135 to schedule a free consultation.
Getting Compensation for Your Chiropractic Treatments
Depending on your injuries, you may need treatment beyond what your primary care doctor may offer. In some cases, your healthcare provider may recommend physical therapy, rehabilitation, acupuncture, or chiropractic therapy.
These treatments can be expensive, and without the help of a car accident attorney, you may not receive enough money through insurance to cover all of these costs. This means you may end up paying out of pocket or having to sacrifice your well-being because the treatments are unaffordable.
What to Do If You Are Involved in an Accident
If you are involved in an accident with injuries, you need to get medical attention immediately. Failing to seek or continue treatment can directly impact your case. Once you are able, you should consider consulting with an attorney, particularly if you were seriously injured.
The quicker you act, the more likely you will receive the compensation you deserve after an accident. You should not have to settle for less than your case is worth. Do not make any statements to the insurance company without first consulting an attorney, and be sure to keep detailed records about your injuries and the recommendations of your doctors.
Steps You Can Take to Protect Your Rights
There are several things you can do to protect your right to compensation after a car accident. If you are injured, even if you are unsure of the severity, you should still get checked out by a medical professional.
After an auto accident, you need to:
Call 911 from the scene of the accident;
Take photos and videos of any damage, weather and road conditions, and your injuries;
Do not admit fault or make statements to the insurance company;
Obtain contact information for any eyewitnesses;
Be straightforward and honest with the police;
Secure your medical records and follow doctor recommendations;
Contact our office to speak with an attorney.
In order to get compensation for all of your accident-related losses, you need to speak with an attorney. An attorney can help determine your legal options and provide you with the resources you need to move forward.
Contact Our Office to Get Started
Were you recently injured in a car accident? Do you need chiropractic therapy but are unsure if insurance will cover the expense? Contact our office today at (718) 650-2135 for a free consultation. There are no fees unless we win. Call now to get started.
https://asarofirm.com/wp-content/uploads/2022/08/Untitled-design-19.png533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2022-08-25 11:35:002022-08-11 11:38:42Will My Insurance Cover Chiropractic Therapy After a Car Accident?
Nursing Home Abuse and Neglect Red Flags that Should Not Be Ignored
Nursing home abuse is widespread in New York and throughout the United States. It is important to look for any signs of abuse or neglect and report them to the authorities. In addition to criminal penalties, a nursing home or long-term care facility could also face a civil lawsuit for their wrongdoing. A civil lawsuit can help victims get the compensation they deserve and hold liable parties accountable.
At the Law Office of Asaro & Associates, we represent individuals and their families in nursing home neglect and abuse cases. We work tirelessly to get justice for victims of elder abuse, never stopping until we receive the best possible outcome for our clients. If you suspect your loved one is being abused or neglected at a nursing home, contact our office at (718) 650-2135 for a free consultation.
Consider these top 5 signs of nursing home abuse and neglect:
Bedsores
Bedsores or pressure ulcers occur when blood supply is cut off to the skin. When a body is immobile, significant pressure is placed on areas of the skin. Prolonged pressure results in the blood flow being cut off and can cause the skin to die. Left untreated, bedsores may become infected.
It is essential for bedsores to be diagnosed and treated as early as possible. The earlier a bedsore is caught, the more likely a person will make a complete recovery. Bedsores can be prevented by regularly turning and repositioning an immobile or bedridden person. If you see a bedsore developing, you need to speak with a nursing home abuse attorney as it may be a sign of neglect.
Malnutrition
Malnutrition and dehydration are other common signs of elder abuse that should be taken seriously. If your loved one experiences sudden, unexplained weight loss or seems disoriented, they may be malnourished.
Nursing homes have a duty to ensure that patients receive reasonable care. Not providing enough food or depriving a patient of water is abuse.
Change in Behavior
If your loved one begins to act aggressive, aloof, or another unusual behavior, it is a cause for concern. Sudden changes in behavior may be an indication that they are not being properly cared for in the nursing home or long-term care facility.
Check-in with your loved one regularly. If they are upset or fearful for any reason, plan a visit. If for any reason, you are denied visitation, you need to consult with an attorney.
Unexplained Bruises, Burns, or Injuries
Signs of physical abuse should be reported to the police to be investigated. A nursing home patient should never have unexplained injuries. Bruises, burns, or welts may be indicative of severe mistreatment.
Poor Living Conditions
When you visit your loved one, pay attention to their living conditions. Are the linens clean? Does your loved one have good hygiene? Is the room too hot? Any signs of substandard living conditions should be investigated and reported.
Contacting a Nursing Home Abuse Lawyer
Are there signs of abuse or neglect at your loved one’s nursing home? Contact our office at (718) 650-2135 for a free, no-obligation consultation. Let us help you understand your rights. There are no fees unless we win. Call now to speak directly with an attorney.
https://asarofirm.com/wp-content/uploads/2022/07/Asaro-Associates-Blog-Images-6.png533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2022-08-11 14:32:002022-07-28 14:39:01Top 5 Signs of Elder Abuse in Nursing Homes
Obtaining Compensation for Dog Bite-Related Injuries
If you suffer serious injuries after a dog attack, you need to consider filing a claim for damages against the animal’s owner. Dog bite injuries can be serious, even life-threatening. By pursuing compensation for your injuries, you can help to ensure that you receive quality medical care and treatment. In order to get the largest recovery possible, it is strongly recommended that you speak with an attorney as soon as possible.
At the Law Office of Asaro & Associates, we represent individuals who have suffered injuries from a dog attack. Whether you or your loved one was bit, we can help take legal action against a negligent owner. Damages in dog bite cases may include compensation for medical bills, lost wages, disfigurement, pain and suffering, and more. If you sustained harm after a dog bite, contact our office at (718) 650-2135 for a free consultation.
What to Do If You Are Attacked by a Dog
If you are attacked by a dog in the Bronx, the first thing you need to do is to seek medical attention. A dog bite may be more severe than it initially seems. A dog’s jaw and teeth are designed to rip through the flesh of another animal. You could have significant damage to your nerves and tendons, even though the wound seems innocuous from the outside.
Getting emergency medical treatment can also help prevent infection. The inside of a dog’s mouth is filled with bacteria and potentially dangerous diseases that can be transferred to your blood through the open laceration. Deadly viruses like rabies are generally transmitted through an animal’s saliva and moved to a person during a bite. To protect yourself, you need to be seen by a doctor immediately after any dog bite.
Once you are able, contact a dog bite lawyer to determine your legal options, including pursuing a lawsuit against a negligent owner.
Determining Liability in a Dog Bite Case
It can be difficult to determine liability in a dog bite case unless you know who the owner is. However, gathering as much information as possible from where the incident occurred can help your attorney, who can be held legally responsible for your injuries.
Types of Dog Bite Injuries
Dog bite injuries can range in severity, but many require medical attention. Tragically, children are the most common dog bite victims and are the most susceptible to injury.
Common types of dog bite injuries include:
Deep cuts and lacerations
Nerve or tissue damage
Blood loss
Infection or disease including rabies, Pasteurella, MRSA, and tetanus
Permanent scarring or disfigurement
Emotional trauma
Any bite-related injury should be taken seriously and looked at by a medical professional. Delaying treatment can result in dangerous side effects and complications. It can also directly affect your right to compensation.
Hiring a Dog Bite Attorney in the Bronx
If you were injured from a dog bite in the Bronx, contact our office at (718) 650-2135 for a free consultation. Get the legal help you need to get the results you deserve. Call now to get started.
https://asarofirm.com/wp-content/uploads/2022/07/Asaro-Associates-Blog-Images-5.png533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2022-07-28 14:31:162022-11-17 11:42:49What to Do If a Dog Bites You in the Bronx
Understanding Your Rights in a Bedsore Injury Claim
Bedsores or pressure sores are serious medical conditions that can become life-threatening if left untreated. Many times bedsores are preventable, caused by negligence or inadequate care at a nursing home. If your loved one has developed a bedsore, it is strongly recommended that you seek legal counsel immediately.
At the Law Office of Asaro & Associates, P.C., our experienced lawyers can help you understand your rights if your loved one was diagnosed with a bedsore. It is important to act fast as bedsores can quickly become worse, leading to dangerous complications, including potentially fatal infections.
Contact our office today at (718) 650-2135 for a free, no-obligation consultation if you or your loved one has developed a bedsore while at a nursing home.
How Prevalent Are Bedsores in Nursing Homes?
Studies reported by the U.S. Centers for Disease Control and Prevention (CDC) indicated that over 1 in 10 nursing home residents had a bedsore. Bedsores, also referred to as pressure sores or pressure ulcers, can be extremely painful, resulting in a diminished quality of life for the patient. Inadequate or substandard care is often the cause of these debilitating injuries.
A nursing home patient at risk for developing bedsores should be moved frequently to alleviate the contact pressure. Caregivers should also maintain a high level of cleanliness for an individual who is less mobile or confined to a wheelchair. Many bedsores can be prevented through due diligence.
What Should I Do If My Loved One Develops a Bedsore?
If your loved one develops a bedsore, you need to get it treated as soon as possible. Do not wait until it gets worse or infected. An infection could prove fatal. Treating a pressure sore as early as possible can help avoid serious complications.
In addition to seeking emergency medical treatment, you should contact an attorney well-versed in nursing home abuse cases. Bedsores may be indicative of negligence or mistreatment. It is essential to discuss your legal options with an experienced attorney to hold responsible parties liable for their wrongdoing.
How Serious Are Bedsores?
As noted by the CDC, bedsores are classified into stages based on their severity. There are four stages of bedsores, with stage 4 being the most critical.
Stages of bedsores:
Stage 1: Reddening of the skin that does not disappear once pressure is relieved. Skin remains intact.
Stage 2: Skin is broken and may appear as a blister or abrasion. Stage 1 and stage 2 bedsores are highly treatable.
Stage 3: Subcutaneous tissue is exposed with a full thickness of skin lost. Generally presents as a deep crater.
Stage 4: Muscle or bone is exposed due to loss of a full-thickness of skin and subcutaneous tissues. Stage 4 bedsores are at high risk for infection.
Regardless of the stage of you or your loved one’s pressure ulcer, it is vital to contact a nursing home abuse attorney as early as possible.
Who Can I Sue If My Loved One Gets a Bedsore?
Depending on the circumstances of your bedsore injury claim, you or your loved one might be entitled to compensation. Liable parties may include a negligent healthcare provider as well as the nursing home or assisted living facility where the bedsore occurred.
Contact Our Office for a Free Consultation
If you or a loved one have developed a bedsore while at a nursing home, contact our office for a free consultation. Call (718) 650-2135 to discuss your case with a knowledgeable member of our legal team.
https://asarofirm.com/wp-content/uploads/2022/04/Asaro-Associates-Blog-Images-4.png533800Salvatore Asarohttps://asarofirm.com/wp-content/uploads/2020/01/logo-1.pngSalvatore Asaro2022-05-11 13:58:002022-04-26 14:01:17Who is Liable for Bedsores in a Nursing Home?