| Server IP : 62.173.141.34 / Your IP : 216.73.217.88 Web Server : Apache/2.4.63 (Ubuntu) mod_fcgid/2.3.9 OpenSSL/3.0.2 System : Linux server7.msonline.ru 5.15.0-179-generic #189-Ubuntu SMP Tue May 5 18:20:56 UTC 2026 x86_64 User : izihss ( 1005) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,exec,system,passthru,shell_exec,proc_open,popen MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/izihss/web/izihss.ru/public_html/wp-content/plugins/wp-filebase/classes/ |
Upload File : |
<?php
class WPFB_Item {
var $is_file;
var $is_category;
var $last_parent_id = 0;
var $last_parent = null;
protected $locked = 0;
private $_read_permissions = null;
static $tpl_uid = 0;
function __construct($db_row = null) {
if (!empty($db_row)) {
foreach ($db_row as $col => $val) {
$this->$col = $val;
}
$this->is_file = isset($this->file_id);
$this->is_category = isset($this->cat_id);
}
}
function __toString() {
return $this->GetLocalPathRel() . ' (' . ($this->is_file ? 'file' : 'cat') . ' ' . $this->GetId() . ')';
}
function GetId() {
return 0 + ($this->is_file ? $this->file_id : $this->cat_id);
}
function GetName() {
return $this->is_file ? $this->file_name : $this->cat_folder;
}
function GetTitle($maxlen = 0) {
$t = $this->is_file ? $this->file_display_name : $this->cat_name;
if ($maxlen > 3 && strlen($t) > $maxlen)
$t = (function_exists('mb_substr') ? mb_substr($t, 0, $maxlen - 3, 'utf8') : substr($t, 0, $maxlen - 3)) . '...';
return $t;
}
function Equals($item) {
return (isset($item->is_file) && $this->is_file == $item->is_file && $this->GetId() > 0 && $this->GetId() == $item->GetId());
}
function GetParentId() {
return ($this->is_file ? $this->file_category : $this->cat_parent);
}
/**
*
* @return WPFB_Category
*/
function GetParent() {
if (($pid = $this->GetParentId()) != $this->last_parent_id) { // caching
if ($pid > 0)
$this->last_parent = WPFB_Category::GetCat($pid);
else
$this->last_parent = null;
$this->last_parent_id = $pid;
}
return $this->last_parent;
}
function GetParents() {
$p = $this;
$parents = array();
while (!is_null($p = $p->GetParent()))
$parents[] = $p;
return $parents;
}
function GetOwnerId() {
return (int) ($this->is_file ? $this->file_added_by : $this->cat_owner);
}
function Lock($lock = true) {
if ($lock)
$this->locked++;
else
$this->locked = max(0, $this->locked - 1);
}
/**
* Get Cat or File by Name
*
* @return WPFB_Item
*/
static function GetByName($name, $parent_id = 0) {
global $wpdb;
$name = esc_sql($name);
$parent_id = intval($parent_id);
$items = WPFB_Category::GetCats("WHERE cat_folder = '$name' AND cat_parent = $parent_id LIMIT 1");
if (empty($items)) {
$items = WPFB_File::GetFiles2(array('file_name' => $name, 'file_category' => $parent_id), false, null, 1);
if (empty($items))
return null;
}
return reset($items);
}
static function GetByPath($path) {
global $wpdb;
$path = trim(str_replace('\\', '/', $path), '/');
$items = WPFB_Category::GetCats("WHERE cat_path = '" . esc_sql($path) . "' LIMIT 1");
if (empty($items)) {
$items = WPFB_File::GetFiles2(array('file_path' => $path), false, null, 1);
if (empty($items))
return null;
}
return reset($items);
}
/**
* Get Cat or File by Name
*
* @return WPFB_Item
*/
static function GetById($id, $cat_or_file) {
return ($cat_or_file === 'cat') ? WPFB_Category::GetCat($id) : WPFB_File::GetFile($id);
}
// Sorts an array of Items by SQL ORDER Clause ( or shortcode order clause (<file_name) )
static function Sort(&$items, $order_sql) {
$order_sql = strtr($order_sql, array('>' => '>', '<' => '<'));
if (($desc = ($order_sql{0} == '>')) || $order_sql{0} == '<')
$on = substr($order_sql, 1);
else {
$p = strpos($order_sql, ','); // strip multi order clauses
if ($p !== false)
$order_sql = substr($order_sql, $p + 1);
$sort = explode(" ", trim($order_sql));
$on = trim($sort[0], '`');
$desc = (trim($sort[1]) == "DESC");
}
$on = preg_replace('/[^0-9a-z_]/i', '', $on); //strip hacking
$comparer = $desc ? "return -strcmp(\$a->{$on},\$b->{$on});" : "return strcmp(\$a->{$on},\$b->{$on});";
usort($items, create_function('$a,$b', $comparer));
}
function GetEditUrl() {
$fc = ($this->is_file ? 'file' : 'cat');
return admin_url("admin.php?page=wpfilebase_{$fc}s&action=edit{$fc}&{$fc}_id=" . $this->GetId() . (defined('DOING_AJAX') ? "&redirect_referer=1" : ""));
}
function GetLocalPath($refresh = false) {
return WPFB_Core::UploadDir() . '/' . $this->GetLocalPathRel($refresh);
}
function GetLocalPathRel($refresh = false) {
if ($this->is_file)
$cur_path = & $this->file_path;
else
$cur_path = & $this->cat_path;
if ($refresh) {
if (($parent = $this->GetParent()) != null)
$path = $parent->GetLocalPathRel($refresh) . '/';
else
$path = '';
$path .= $this->is_file ? $this->file_name : $this->cat_folder;
if ($cur_path != $path) {
$cur_path = $path; // by ref!!
if (!$this->locked)
$this->DBSave();
}
return $path;
} else {
if (empty($cur_path))
return $this->GetLocalPathRel(true);
return $cur_path;
}
}
protected function TriggerLockedError($throw_on_error=false) {
if($throw_on_error)
throw new Exception("Cannot save locked $this to database!");
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
array_shift($trace);
array_shift($trace);
$backtrace = print_r($trace, true);
trigger_error("Cannot save locked $this to database! ($backtrace)",
E_USER_WARNING);
return false;
}
// TODO: this should be protected, locking logic not public!
public function IsLocked() {
return $this->locked;
}
function DBSave($throw_on_error=false) {
global $wpdb;
if ($this->locked > 0) {
$this->TriggerLockedError($throw_on_error);
return array('error' => 'Item locked.');
}
$values = array();
$id_var = ($this->is_file ? 'file_id' : 'cat_id');
$vars = get_class_vars(get_class($this));
foreach ($vars as $var => $def) {
$pos = strpos($var, ($this->is_file ? 'file_' : 'cat_'));
if ($pos === false || $pos != 0 || $var == $id_var || is_array($this->$var) || is_object($this->$var) || $var == 'file_scan_lock' || $var == 'cat_scan_lock')
continue;
$values[$var] = $this->$var; // no & ref here, this causes esc of actual objects data!!!!
}
if ($this->is_file) {
$cvars = WPFB_Core::GetCustomFields(true);
foreach ($cvars as $var => $cn)
$values[$var] = empty($this->$var) ? '' : $this->$var;
}
//var_dump($values);
//exit;
$update = !empty($this->$id_var);
$tbl = $this->is_file ? $wpdb->wpfilebase_files : $wpdb->wpfilebase_cats;
if ($update) {
if (!$wpdb->update($tbl, $values, array($id_var => $this->$id_var))) {
if (!empty($wpdb->last_error)) {
if($throw_on_error)
throw new Exception("Failed to update $this's DB entry! $wpdb->last_error");
return array(
'error' => "Failed to update $this's DB entry! $wpdb->last_error"
);
}
}
} else {
if (!$wpdb->insert($tbl, $values)) {
if($throw_on_error)
throw new Exception("Unable to insert item $this into DB! $wpdb->last_error");
return array(
'error' => "Unable to insert item $this into DB! $wpdb->last_error"
);
}
$this->$id_var = (int) $wpdb->insert_id;
}
return array('error' => false, $id_var => $this->$id_var, 'id' => $this->$id_var);
}
function IsAncestorOf($item) {
$p = $item->GetParent();
if ($p == null)
return false;
if ($this->Equals($p))
return true;
return $this->IsAncestorOf($p);
}
/**
*
* @staticvar WP_User $current_user
* @param type $for_tpl
* @param WP_User $user
* @return boolean
*/
function CurUserCanAccess($for_tpl = false, $user = null) {
static $current_user = null;
if (!$current_user) {
$current_user = wp_get_current_user();
$current_user->get_role_caps();
}
if (!is_null($user)) {
if (empty($user->roles))
$user = new WP_User($user);
if ($user->ID == $current_user->ID)
$user = $current_user;
else
$user->get_role_caps();
} else
$user = $current_user;
if (($for_tpl && !WPFB_Core::$settings->hide_inaccessible) || in_array('administrator', $user->roles) || ($this->is_file && $this->CurUserIsOwner($user)))
return true;
if (WPFB_Core::$settings->private_files && $this->is_file && $this->GetOwnerId() != 0 && !$this->CurUserIsOwner($user)) // check private files
return false;
$frs = $this->GetReadPermissions();
if (empty($frs))
return true; // item is for everyone!
foreach ($user->roles as $ur) { // check user roles against item roles
if (in_array($ur, $frs))
return true;
}
return false;
}
function CurUserCanEdit($user = null) {
if (is_null($user))
$user = wp_get_current_user();
// current_user_can('manage_options') checks if user is admin!
return $this->CurUserIsOwner($user) || user_can($user, 'manage_options') || (!WPFB_Core::$settings->private_files && user_can($user, $this->is_file ? 'edit_others_posts' : 'manage_categories'));
}
function GetUrl($rel = false, $to_file_page = false) { // TODO: rawurlencode??
static $esc = array('#' => '%23', ' ' => '%20', '%' => '%25', "'" => '%27');
$ps = WPFB_Core::$settings->disable_permalinks ? null : get_option('permalink_structure');
if ($this->is_category || $to_file_page) {
$url = get_permalink(WPFB_Core::$settings->file_browser_post_id);
// todo: rawurlencode here?
if (!empty($ps))
$url .= strtr($this->GetLocalPathRel(), $esc) . '/';
elseif ($this->GetId() > 0)
$url = add_query_arg(array(($this->is_file ? "wpfb_file" : "wpfb_cat") => $this->GetId()), $url);
if ($this->is_category)
$url .= "#wpfb-cat-$this->cat_id";
} else {
if (!empty($ps))
$url = home_url(strtr(WPFB_Core::$settings->download_base . '/' . $this->GetLocalPathRel(), $esc));
else
$url = home_url('?wpfb_dl=' . $this->file_id);
//if($signed) $url = add_query_arg ('s', wp_create_nonce('wpfb-dl'.$this->file_id.'-'.$_SERVER['REMOTE_ADDR']), $url);
}
if ($rel) {
$url = substr($url, strlen(home_url()));
if ($url{0} == '?')
$url = 'index.php' . $url;
else
$url = substr($url, 0); // remove trailing slash! TODO?!
}
return $url;
}
function GenTpl($parsed_tpl = null, $context = '') {
if ($context != 'ajax')
WPFB_Core::$load_js = true;
if (empty($parsed_tpl)) {
$tpo = $this->is_file ? 'template_file_parsed' : 'template_cat_parsed';
$parsed_tpl = WPFB_Core::GetOpt($tpo);
if (empty($parsed_tpl)) {
$parsed_tpl = wpfb_call('TplLib', 'Parse', WPFB_Core::GetOpt($this->is_file ? 'template_file' : 'template_cat'));
WPFB_Core::UpdateOption($tpo, $parsed_tpl);
}
}
/*
if($this->is_file) {
global $wpfb_file_paths;
if(empty($wpfb_file_paths)) $wpfb_file_paths = array();
$wpfb_file_paths[(int)$this->file_id] = $this->GetLocalPathRel();
}
*/
self::$tpl_uid++;
$f = & $this;
$e = null; // extra data
return eval("return ($parsed_tpl);");
}
function GenTpl2($tpl_tag = null, $load_js = true, $extra_data = null) {
static $tpl_funcs = array('file' => array(), 'cat' => array());
if (empty($tpl_tag))
$tpl_tag = 'default';
if ($load_js)
WPFB_Core::$load_js = true;
$type = $this->is_file ? 'file' : 'cat';
if (empty($tpl_funcs[$type][$tpl_tag])) {
$parsed_tpl = WPFB_Core::GetParsedTpl($this->is_file ? 'file' : 'cat', $tpl_tag);
if (empty($parsed_tpl))
return "Template $type :: $tpl_tag does not exist!";
$tpl_funcs[$type][$tpl_tag] = WPFB_Core::CreateTplFunc($parsed_tpl);
}
self::$tpl_uid = (defined('DOING_AJAX') && DOING_AJAX) ? ($this->GetId() . '' . (round(microtime() * 1000) % 1000)) : (self::$tpl_uid + 1);
if ($extra_data && !is_object($extra_data))
$extra_data = (object) $extra_data;
return $tpl_funcs[$type][$tpl_tag]($this, $extra_data);
}
function GetThumbPath($refresh = false) {
static $base_dir = '';
if (empty($base_dir) || $refresh)
$base_dir = (empty(WPFB_Core::$settings->thumbnail_path) ? WPFB_Core::UploadDir() : path_join(ABSPATH, WPFB_Core::$settings->thumbnail_path)) . '/';
if ($this->is_file) {
if (empty($this->file_thumbnail))
return null;
return dirname($base_dir . $this->GetLocalPathRel()) . '/' . $this->file_thumbnail;
} else {
if (empty($this->cat_icon))
return null;
return $base_dir . $this->GetLocalPathRel() . '/' . $this->cat_icon;
}
}
function GetIconUrl($size = null) {
// todo: remove file operations!
if ($this->is_category) {
// add mtime for cache updates
return empty($this->cat_icon) ? (WP_CONTENT_URL . WPFB_Core::$settings->folder_icon) : home_url("?wpfilebase_thumbnail=1&cid=$this->cat_id&t=" . @filemtime($this->GetThumbPath()));
}
if (!empty($this->file_thumbnail) /* && file_exists($this->GetThumbPath()) */) { // speedup
return home_url('?wpfilebase_thumbnail=1&fid=' . $this->file_id . '&name=' . $this->file_thumbnail); // name var only for correct caching!
}
$type = $this->GetType();
$ext = substr($this->GetExtension(), 1);
$img_path = ABSPATH . WPINC . '/images/';
$img_url = get_option('siteurl') . '/' . WPINC . '/images/';
$custom_folder = '/images/fileicons/';
// check for custom icons
if (file_exists(WP_CONTENT_DIR . $custom_folder . $ext . '.png'))
return WP_CONTENT_URL . $custom_folder . $ext . '.png';
if (file_exists(WP_CONTENT_DIR . $custom_folder . $type . '.png'))
return WP_CONTENT_URL . $custom_folder . $type . '.png';
// todo: cache file_exists
if (file_exists($img_path . 'crystal/' . $ext . '.png'))
return $img_url . 'crystal/' . $ext . '.png';
if (file_exists($img_path . 'crystal/' . $type . '.png'))
return $img_url . 'crystal/' . $type . '.png';
if (file_exists($img_path . $ext . '.png'))
return $img_url . $ext . '.png';
if (file_exists($img_path . $type . '.png'))
return $img_url . $type . '.png';
// fallback to default
if (file_exists($img_path . 'crystal/default.png'))
return $img_url . 'crystal/default.png';
if (file_exists($img_path . 'default.png'))
return $img_url . 'default.png';
// fallback to blank :(
return $img_url . 'blank.gif';
}
// for a category this return an array of child files
// for a file an array with a single element, the file itself
/**
* Get child files
*
* @access public
*
* @param $recursive Optional
* @return WPFB_File[] Files
*/
function GetChildFiles($recursive = false, $sorting = null, $check_permissions = false, $local_only = false) {
if ($this->is_file)
return array($this->GetId() => $this);
if ($check_permissions && !$this->CurUserCanAccess())
return array();
// if recursive, include secondary category links with GetSqlCatWhereStr
$where = $recursive ? WPFB_File::GetSqlCatWhereStr($this->cat_id) : '(file_category = ' . $this->cat_id . ')';
if($local_only) $where = "(file_remote_uri = '' AND $where)";
$files = WPFB_File::GetFiles2($where, $check_permissions, $sorting);
if ($recursive) {
$cats = $this->GetChildCats(true);
foreach (array_keys($cats) as $i)
$files += $cats[$i]->GetChildFiles(false, $sorting, $check_permissions, $local_only);
}
return $files;
}
/**
*
* @staticvar function $parent_walker
* @param boolean $recursive
* @return WPFB_File[]
*/
function GetChildFilesFast($recursive = false) {
static $parent_walker = false;
if (!$parent_walker)
$parent_walker = create_function('&$f,$fid,$pid', 'if($f->file_category != $pid) $f = null;');
if ($this->is_file)
return array($this->GetId() => $this);
// get all direct child files (including secondary)
if (!isset($this->cat_child_files))
$this->cat_child_files = WPFB_File::GetFiles2(WPFB_File::GetSqlCatWhereStr($this->cat_id));
$files = $this->cat_child_files;
// if not recursive, exclude secondary category links with GetSqlCatWhereStr
if (!$recursive) {
array_walk($files, $parent_walker, $this->cat_id);
return array_filter($files);
}
$cats = $this->GetChildCats(false);
foreach (array_keys($cats) as $i)
$files += $cats[$i]->GetChildFilesFast(true);
return $files;
}
function GetReadPermissions() {
if (!is_null($this->_read_permissions))
return $this->_read_permissions; //caching
$rs = $this->is_file ? $this->file_user_roles : $this->cat_user_roles;
return ($this->_read_permissions = empty($rs) ? array() : array_filter((is_string($rs) ? explode('|', $rs) : (array) $rs)));
}
function SetReadPermissions($roles) {
if (!is_array($roles))
$roles = explode('|', $roles);
$this->_read_permissions = $roles = array_filter(array_filter(array_map('trim', $roles), 'strlen')); // remove empty
$roles = implode('|', $roles);
if ($this->is_file)
$this->file_user_roles = $roles;
else
$this->cat_user_roles = $roles;
if (!$this->locked)
$this->DBSave();
}
function CurUserIsOwner($user = null) {
global $current_user;
$uid = empty($user) ? (empty($current_user->ID) ? 0 : $current_user->ID) : $user->ID;
return ($uid > 0 && $this->GetOwnerId() == $uid);
}
function ChangeCategoryOrName($new_cat_id, $new_name = null, $add_existing = false, $overwrite = false) {
// 1. apply new values (inherit permissions if nothing (Everyone) set!)
// 2. check for name collision and rename
// 3. move stuff
// 4. notify parents
// 5. update child paths
if (empty($new_name))
$new_name = $this->GetName();
elseif (!$add_existing)
$new_name = sanitize_file_name($new_name); // also removes ()!
$this->Lock(true);
$new_cat_id = intval($new_cat_id);
$old_cat_id = $this->GetParentId();
$old_path_rel = $this->GetLocalPathRel(true);
$old_path = $this->GetLocalPath();
$old_name = $this->GetName();
if ($this->is_file)
$old_thumb_path = $this->GetThumbPath();
$old_cat = $this->GetParent();
$new_cat = WPFB_Category::GetCat($new_cat_id);
if (!$new_cat)
$new_cat_id = 0;
$cat_changed = $new_cat_id != $old_cat_id;
if ($cat_changed && $new_cat_id > 0 && $this->IsAncestorOf($new_cat)) {
return array('error' => __('Cannot move category into a sub-category of itself.', 'wp-filebase'));
}
// strip accents/umlauts
if ($new_name != $old_name) {
if ($this->is_file && $add_existing) {
$this->file_name_original = rawurldecode($new_name); // expect utf8 chars to be urlencoded on disk, so decode them
} else {
$prev_new_name = $new_name;
$new_name = remove_accents($new_name);
// sanitize, but make sure not to strip too much
$sani = sanitize_file_name($new_name);
if(strlen($sani) >= 6)
$new_name = $sani;
if (wpfb_call('Misc', 'IsUtf8', $new_name))
$new_name = rawurlencode($new_name);
if ($this->is_file)
$this->file_name_original = $prev_new_name;
}
}
// unset original name if equal to actual
if ($this->is_file && $new_name === $this->file_name_original)
$this->file_name_original = '';
if ($this->is_file) {
$this->file_category = $new_cat_id;
$this->file_name = $new_name;
$this->file_category_name = ($new_cat_id == 0) ? '' : $new_cat->GetTitle();
} else {
$this->cat_parent = $new_cat_id;
$this->cat_folder = $new_name;
}
// inherit user roles
if (count($this->GetReadPermissions()) == 0)
$this->SetReadPermissions(($new_cat_id != 0) ? $new_cat->GetReadPermissions() : WPFB_Core::$settings->default_roles);
// flush cache
$this->last_parent_id = -1;
$new_path_rel = $this->GetLocalPathRel(true);
$new_path = $this->GetLocalPath();
if ($new_path_rel != $old_path_rel) {
$i = 1;
if (!$add_existing) {
$name = $this->GetName();
if ($overwrite) {
if (@file_exists($new_path)) {
$ex_file = WPFB_File::GetByPath($new_path_rel);
if (!is_null($ex_file))
$ex_file->Remove();
else
@unlink($new_path);
}
} else {
// rename item if filename collision (ignore if coliding with $this and ignore existing folders that does not belong to categories)
while ((@file_exists($new_path) && ($this->is_file || !is_dir($new_path) || !is_null(WPFB_Item::GetByPath($new_path_rel)))) || (!is_null($ex_file = WPFB_Item::GetByPath($new_path_rel)) && !$this->Equals($ex_file))) {
$i++;
if ($this->is_file) {
$p = strrpos($name, '.');
$this->file_name = ($p <= 0) ? "{$name}_{$i}" : (substr($name, 0, $p) . "_$i" . substr($name, $p));
} else
$this->cat_folder = "{$name}_{$i}";
$new_path_rel = $this->GetLocalPathRel(true);
$new_path = $this->GetLocalPath();
}
}
}
// finally move it!
if (!empty($old_name) && @file_exists($old_path)) {
//echo "MOVING! $old_path -> $new_path";
if ($this->is_file) {
if (!@rename($old_path, $new_path))
return array('error' => sprintf('Unable to move file %s!', $old_path));
@chmod($new_path, octdec(WPFB_PERM_FILE));
} else {
if (!@is_dir($new_path))
wp_mkdir_p($new_path);
wpfb_loadclass('FileUtils');
if (!@WPFB_FileUtils::MoveDir($old_path, $new_path))
return array('error' => sprintf('Could not move folder %s to %s', $old_path, $new_path));
}
} else {
if ($this->is_category) {
if (!@is_dir($new_path) && !wp_mkdir_p($new_path))
return array('error' => sprintf(__('Unable to create directory %s. Is it\'s parent directory writable?'), $new_path));
}
}
// move thumb
if ($this->is_file && !empty($old_thumb_path) && @is_file($old_thumb_path)) {
$thumb_path = $this->GetThumbPath();
if ($i > 1) {
$p = strrpos($thumb_path, '-');
if ($p <= 0)
$p = strrpos($thumb_path, '.');
$thumb_path = substr($thumb_path, 0, $p) . "_$i" . substr($thumb_path, $p);
$this->file_thumbnail = basename($thumb_path);
}
if (!is_dir(dirname($thumb_path)))
WPFB_Admin::Mkdir(dirname($thumb_path));
if (!@rename($old_thumb_path, $thumb_path))
return array('error' => 'Unable to move thumbnail! ' . $thumb_path);
@chmod($thumb_path, octdec(WPFB_PERM_FILE));
}
$all_files = ($this->is_file || $this->GetId() > 0) ? $this->GetChildFiles(true) : array(); // all children files (recursively)
if (!empty($all_files))
foreach ($all_files as $file) {
if ($cat_changed) {
if ($old_cat)
$old_cat->NotifyFileRemoved($file); // notify parent cat to remove files
if ($new_cat)
$new_cat->NotifyFileAdded($file);
}
$file->GetLocalPathRel(true); // update file's path
}
unset($all_files);
if ($this->is_category && $this->GetId() > 0) {
$cats = $this->GetChildCats(true);
if (!empty($cats))
foreach ($cats as $cat) {
$cat->GetLocalPathRel(true); // update cats's path
}
unset($cats);
}
}
$this->Lock(false);
if (!$this->locked)
$this->DBSave();
return array('error' => false);
/*
* // create the directory if it doesnt exist
// move file
if($this->IsLocal() && !empty($old_file_path) && @is_file($old_file_path) && $new_file_path != $old_file_path) {
if(!@rename($old_file_path, $new_file_path)) return array( 'error' => sprintf('Unable to move file %s!', $this->GetLocalPath()));
@chmod($new_file_path, octdec(WPFB_PERM_FILE));
}
*/
}
function DBReload() {
global $wpdb;
if ($this->locked) $this->TriggerLockedError();
$tbl = $this->is_file ? $wpdb->wpfilebase_files : $wpdb->wpfilebase_cats;
$id_field = $this->is_file ? 'file_id' : 'cat_id';
$id = 0+$this->GetId();
$db_row = $wpdb->get_row("SELECT * FROM $tbl WHERE $id_field = $id");
if(!$db_row) // item has been deleted?
return null;
foreach ($db_row as $col => $val) {
$this->$col = $val;
}
if(!empty($this->cat_childs)) {
foreach($this->cat_childs as $i => $c) {
$c->DBReload();
}
}
unset($this->childs_complete, $this->cat_childs);
return $this;
}
protected static function GetPermissionWhere($owner_field, $permissions_field, $user = null) {
//$user = is_null($user) ? wp_get_current_user() : (empty($user->roles) ? new WP_User($user) : $user);
$user = is_null($user) ? wp_get_current_user() : $user;
$user->get_role_caps();
static $permission_sql = '';
if (empty($permission_sql)) { // only generate once per request
if (in_array('administrator', $user->roles))
$permission_sql = '1=1'; // administrator can access everything!
elseif (WPFB_Core::$settings->private_files) {
$permission_sql = "$owner_field = 0 OR $owner_field = " . (int) $user->ID;
} else {
$permission_sql = "$permissions_field = ''";
$roles = $user->roles;
foreach ($roles as $ur) {
$ur = esc_sql($ur);
// assuming mysql ft_min_word_len is 4:
$permission_sql .= (strlen($ur) < 4) ? " OR $permissions_field LIKE '%$ur|%' OR $permissions_field LIKE '%|$ur|%' OR $permissions_field LIKE '%|$ur%'" : " OR MATCH($permissions_field) AGAINST ('{$ur}' IN BOOLEAN MODE)";
}
if ($user->ID > 0)
$permission_sql .= " OR ($owner_field = " . (int) $user->ID . ")";
}
}
return $permission_sql;
}
/**
Own database based locking (don't rely on flock() (requires disk writes) or sem_acquire() or mysql GET_LCOK)
Acquire locks with TryScanLock(), they will be unlocked on script end (no need of manual unlocks)
If a fatal exception prevents automatic unlocking locks will timeout after 10 mins
*/
const SCAN_LOCK_TIMEOUT = 600;
static $_file_scan_locks, $_cat_scan_locks, $_scan_lock_init;
static function _removeScanLocks() {
global $wpdb;
foreach (self::$_file_scan_locks as $id => $lock_time) {
$wpdb->update($wpdb->wpfilebase_files, array('file_scan_lock' => 0), array('file_id' => $id, 'file_scan_lock' => $lock_time));
}
foreach (self::$_cat_scan_locks as $id => $lock_time) {
$wpdb->update($wpdb->wpfilebase_cats, array('cat_scan_lock' => 0), array('cat_id' => $id, 'cat_scan_lock' => $lock_time));
}
}
/**
*
* @global wpdb $wpdb
* @staticvar boolean $init
* @return type
*/
function TryScanLock() {
global $wpdb;
if (!self::$_scan_lock_init) {
self::$_scan_lock_init = true;
self::$_file_scan_locks = array();
self::$_cat_scan_locks = array();
register_shutdown_function(array(__CLASS__, '_removeScanLocks'));
}
if ($this->is_file)
$sla = &self::$_file_scan_locks;
else
$sla = &self::$_cat_scan_locks;
$table = $this->is_file ? $wpdb->wpfilebase_files : $wpdb->wpfilebase_cats;
$prefix = $this->is_file ? 'file' : 'cat';
$slf = "{$prefix}_scan_lock";
$now = time();
$lock_time = $now + self::SCAN_LOCK_TIMEOUT;
$id = $this->GetId();
// first check if we own the lock and update if necessary
if (isset($sla[$id])) {
//echo "TryLock $this @".__LINE__." isset";
return ($lock_time > $sla[$id]) ?
($wpdb->update($table, array($slf => $lock_time), array("{$prefix}_id" => $id, $slf => $sla[$id])) && ($sla[$id] = $this->$slf = $lock_time )) : true;
}
// actually try to set the lock and store it in $sla if success
return $wpdb->query($wpdb->prepare("
UPDATE `{$table}`
SET `$slf` = %d
WHERE (`{$prefix}_id` = %d) AND (`$slf` < %d)
", $lock_time, $id, $now)) && ($sla[$id] = $this->$slf = $lock_time);
}
/**
* If false, this does not mean that a lock cannot be acquired
*
* @return bool
*/
function IsScanLocked() {
return ($this->is_file ? $this->file_scan_lock : $this->cat_scan_lock) >= time();
}
function GetScanLockDebug() {
$prefix = $this->is_file ? 'file' : 'cat';
$slf = "{$prefix}_scan_lock";
if ($this->is_file)
$sla = &self::$_file_scan_locks;
else
$sla = &self::$_cat_scan_locks;
return '<pre>' . print_r(array(
'id' => $this->GetId(),
$slf => $this->$slf,
'locks' => $sla,
'flocks' => self::$_file_scan_locks
), true) . '</pre>';
}
}
?>