<?php /** * Controls single user update panel * * @category PHP * @package VenoFileManager * @author Nicola Franchini <info@veno.it> * @license Exclusively sold on CodeCanyon * @link http://filemanager.veno.it/ */ if (!class_exists('Updater', false)) { /** * Class Updater * * @category PHP * @package VenoFileManager * @author Nicola Franchini <info@veno.it> * @license Exclusively sold on CodeCanyon * @link http://filemanager.veno.it/ */ class Updater { /** * Call update user functions * * @return $message */ public function init() { global $updater; $posteditname = filter_input(INPUT_POST, "user_new_name", FILTER_SANITIZE_SPECIAL_CHARS); $postoldname = filter_input(INPUT_POST, "user_old_name", FILTER_SANITIZE_SPECIAL_CHARS); $posteditpass = isset($_POST['user_new_pass']) ? $_POST['user_new_pass'] : false; $posteditpasscheck = isset($_POST['user_new_pass_confirm']) ? $_POST['user_new_pass_confirm'] : false; $postoldpass = isset($_POST['user_old_pass']) ? $_POST['user_old_pass'] : false; $posteditmail = filter_input(INPUT_POST, 'user_new_email', FILTER_VALIDATE_EMAIL); $postoldmail = filter_input(INPUT_POST, 'user_old_email', FILTER_VALIDATE_EMAIL); if ($postoldpass && $posteditname) { $updater->updateUser( $posteditname, $postoldname, $posteditpass, $posteditpasscheck, $postoldpass, $posteditmail, $postoldmail ); } } /** * Update user profile * * @param string $posteditname new username * @param string $postoldname current username * @param string $posteditpass new password * @param string $posteditpasscheck check password * @param string $postoldpass old password * @param string $posteditmail new email * @param string $postoldmail old email * * @return global $users updated */ public function updateUser( $posteditname, $postoldname, $posteditpass, $posteditpasscheck, $postoldpass, $posteditmail, $postoldmail ) { global $setUp; global $updater; global $gateKeeper; $passa = true; $new_users = false; if ($gateKeeper->isUser($postoldname, $postoldpass)) { // Update Username. if ($posteditname != $postoldname) { if ($updater->findUser($posteditname)) { Utils::setError('<span><strong>'.$posteditname.'</strong> '.$setUp->getString('file_exists').'</span>'); $passa = false; return; } GateKeeper::removeCookie($postoldname); Updater::updateAvatar($postoldname, $posteditname); $new_users = $updater->updateUserData($postoldname, 'name', $posteditname, $new_users); $postoldname = $posteditname; } // Update e-mail. if ($posteditmail != $postoldmail) { if ($updater->findUser($posteditmail, true)) { Utils::setError('<span><strong>'.$posteditmail.'</strong> '.$setUp->getString('file_exists').'</span>'); $passa = false; return; } $new_users = $updater->updateUserData($postoldname, 'email', $posteditmail, $new_users); } // Update password. if ($posteditpass) { if ($posteditpass === $posteditpasscheck) { $new_users = $updater->updateUserPwd($postoldname, $posteditpass, $new_users); } else { Utils::setError($setUp->getString('wrong_pass')); $passa = false; return; } } // Update custom fields $jcustomfields = isset($_POST['user-customfields']) ? $_POST['user-customfields'] : false; if ($jcustomfields) { $customfields = json_decode($jcustomfields, true); foreach ($customfields as $customkey => $customfield) { $cleanfield = false; if ($customfield['type'] == 'email') { $cleanfield = filter_input(INPUT_POST, $customkey, FILTER_VALIDATE_EMAIL); } else { $cleanfield = filter_input(INPUT_POST, $customkey, FILTER_SANITIZE_SPECIAL_CHARS); } if ($cleanfield) { $new_users = $updater->updateUserData($postoldname, $customkey, $cleanfield, $new_users); } } } if ($passa == true) { $updater->updateUserFile('', $posteditname, $new_users); } } else { Utils::setError($setUp->getString('wrong_pass')); } } /** * Update user password * * @param string $checkname username * @param string $changepass new pass * @param array $users users list to handle * * @return global $users updated */ public function updateUserPwd($checkname, $changepass, $users = false) { global $setUp; global $gateKeeper; $users = is_array($users) ? $users : $gateKeeper->getUsers(); foreach ($users as $key => $value) { if (strtolower($value['name']) === strtolower($checkname)) { $salt = $setUp->getConfig('salt'); $users[$key]['pass'] = crypt($salt.urlencode($changepass), Utils::randomString()); break; } } return $users; } /** * Update user data * * @param string $checkname username to find * @param string $info info to change * @param string $changeval new value * @param array $users users list to handle * * @return global $users updated */ public function updateUserData($checkname, $info, $changeval = false, $users = false) { global $gateKeeper; $users = is_array($users) ? $users : $gateKeeper->getUsers(); foreach ($users as $key => $value) { if (strtolower($value['name']) === strtolower($checkname)) { if (is_array($info)) { foreach ($info as $type => $value) { if ($value) { $users[$key][$type] = $value; } else { unset($users[$key][$type]); } } } else { if ($changeval) { $users[$key][$info] = $changeval; } else { unset($users[$key][$info]); } } break; } } return $users; } /** * Update user Avatar if user changes name or delete it * * @param string $checkname username to find * @param string $newname new username to assign * @param string $dir relative path to /_content/avatars/ * * @return avatar updated */ public static function updateAvatar($checkname = false, $newname = false, $dir = 'vfm-admin/') { $avatars = glob($dir.'_content/avatars/*.png'); $filename = md5($checkname); foreach ($avatars as $avatar) { $fileinfo = Utils::mbPathinfo($avatar); $avaname = $fileinfo['filename']; if ($avaname === $filename) { if ($newname) { $newname = md5($newname); rename($dir.'_content/avatars/'.$avaname.'.png', $dir.'_content/avatars/'.$newname.'.png'); } else { unlink($dir.'_content/avatars/'.$avaname.'.png'); } break; } } } /** * Delete user * * @param string $checkname username to find * * @return global $users updated */ public function deleteUser($checkname) { // global $_USERS; // global $users; global $gateKeeper; $_USERS = $gateKeeper->getUsers(); $users = $_USERS; foreach ($users as $key => $value) { if (strtolower($value['name']) === strtolower($checkname)) { unset($users[$key]); GateKeeper::removeCookie($checkname, ''); Updater::updateAvatar($checkname, false, ''); break; } } return $users; } /** * Look if user exists * * @param string $userdata username or email to look for * @param bool $email false or true to search email * * @return true/false */ public function findUser($userdata, $email = false) { global $gateKeeper; $_USERS = $gateKeeper->getUsers(); $attr = $email ? 'email' : 'name'; if (is_array($_USERS)) { foreach ($_USERS as $value) { if (isset($value[$attr])) { if (strtolower($value[$attr]) === strtolower($userdata)) { return true; } } } } return false; } /** * Look if pre-registered user exists * * @param string $userdata username or email to look for * @param bool $email false or true to search email * * @return true/false */ public function findUserPre($userdata, $email = false) { global $gateKeeper; $newusers = $gateKeeper->getUsersNew(); $attr = $email ? 'email' : 'name'; if (is_array($newusers)) { foreach ($newusers as $preuser) { if (isset($preuser[$attr])) { if (strtolower($preuser[$attr]) === strtolower($userdata)) { return $preuser; } } } } return false; } /** * Search user by specific key and value * * @param string $key key to search * @param string $value value to search * @param string $return value to return * * @return $username */ public function searchUser($key, $value, $return = 'name') { global $gateKeeper; $users = $gateKeeper->getUsers(); $filter = array_filter(array_column($users, $key, $return)); return array_search($value, $filter); } /** * Get user by activation key from users-new.php * prepare it for users.php * and create his custom dir if requested * * @param string $userdata username to look for * * @return $thisuser array or false */ public function findUserKey($userdata) { global $setUp; global $gateKeeper; $newusers = $gateKeeper->getUsersNew(); $defaultfolders = $setUp->getConfig('registration_user_folders'); if (!empty($newusers)) { foreach ($newusers as $newuser) { if ($newuser['key'] === $userdata) { $thisuser = array(); foreach ($newuser as $attrkey => $userattr) { $thisuser[$attrkey] = $userattr; } $thisuser['role'] = $setUp->getConfig('registration_role'); if ($defaultfolders) { $userdir = $defaultfolders; $arrayfolders = json_decode($defaultfolders, false); if ($setUp->getConfig('registration_user_folder')) { $userfolderpath = $thisuser['name']; $newpath = $setUp->getConfig('starting_dir').$userfolderpath; if (!is_dir($newpath)) { mkdir($newpath); } $arrayfolders[] = $userfolderpath; $userdir = json_encode(array_values($arrayfolders)); } $thisuser['dir'] = $userdir; if (strlen($setUp->getConfig('registration_user_quota')) > 0) { $thisuser['quota'] = $setUp->getConfig('registration_user_quota'); } } unset($thisuser['key']); return $thisuser; } } } return false; } /** * Update users file * * @param string $option what has been updated * @param string $postname username updated * @param array $users users list * * @return response */ public function updateUserFile($option = '', $postname = false, $users = false) { global $setUp; if ($users) { $usrs = '$_USERS = '; $filepath = dirname(__DIR__).'/_content/users/users.php'; if (false === (file_put_contents($filepath, "<?php\n\n $usrs".var_export($users, true).";\n"))) { Utils::setError('error updating users list'); } else { if ($option == 'password') { Utils::setSuccess($setUp->getString('password_reset')); } else { if ($postname) { $edited = '<strong>'.$postname.'</strong> '; Utils::setSuccess($edited.$setUp->getString('updated')); } } $_SESSION['vfm_user_name'] = null; $_SESSION['vfm_logged_in'] = null; $_SESSION['vfm_user_space'] = null; $_SESSION['vfm_user_used'] = null; $_SESSION['vfm_user_name_new'] = null; session_destroy(); $this->clearCache($filepath); } } } /** * Prepare registration user * * @param array $newusers new users list * * @return response */ public function updateRegistrationFile($newusers) { $filepath = dirname(__DIR__).'/_content/users/users-new.php'; $usrs = '$newusers = '; if (false == (file_put_contents($filepath, "<?php\n\n $usrs".var_export($newusers, true).";\n"))) { return false; } else { $this->clearCache($filepath); return true; } } /** * Remove user from value * * @param array $array array where to search * @param key $key key to search * @param string $value vluue to search * * @return null/$new_image */ public function removeUserFromValue($array, $key, $value) { foreach ($array as $subKey => $subArray) { if ($subArray[$key] == $value) { unset($array[$subKey]); } } return $array; } /** * Remove old standby registrations * * @param array $newusers array where to search * @param key $key key to search * @param string $lifetime max lifetime * * @return null/$new_image */ public function removeOldReg($newusers, $key, $lifetime) { foreach ($newusers as $subKey => $subArray) { $data = $subArray[$key]; if ($data <= $lifetime) { unset($newusers[$subKey]); $this->updateRegistrationFile($newusers); } } return $newusers; } /** * Update uploads dir * * @param string $new_dir give or not the access * * @return updated uploads directory */ public function updateUploadsDir($new_dir = false) { global $setUp; $old_dir = $setUp->getConfig('starting_dir'); $oldDir = dirname(dirname(dirname(__FILE__))).'/'.basename($old_dir); // Nothing to update if (!$new_dir && file_exists($oldDir)) { return false; } // No new dir posted, no old dir, rebuild old dir if (!$new_dir && !file_exists($oldDir) && $old_dir != "./") { mkdir($oldDir); if ($this->updateHtaccess($old_dir, $setUp->getConfig('direct_links')) === false) { Utils::setError('Error writing on: '.$oldDir.'/.htaccess, check CHMOD'); } } if (strlen($new_dir)) { $newDir = dirname(dirname(dirname(__FILE__))).'/'.$new_dir; // New dir different from old if ($oldDir !== $newDir) { if (!file_exists($newDir)) { if ($old_dir == "./" || !file_exists($oldDir)) { mkdir($newDir); } else { if (!rename($oldDir, $newDir)) { Utils::setError('Error renaming uploads directory'); return false; } } } if ($this->updateHtaccess($new_dir, $setUp->getConfig('direct_links')) === false) { Utils::setError('Error writing on: '.$newDir.'/.htaccess, check CHMOD'); } } } return true; } /** * Update .htaccess * * @param string $starting_dir selected uploads directory * @param boolean $direct_links give or not the access * * @return void */ public function updateHtaccess($starting_dir, $direct_links = false) { $htaccess = dirname(dirname(dirname(__FILE__))).'/'.rtrim(ltrim($starting_dir, './'), '/')."/.htaccess"; $start_marker = "# begin VFM rules"; $end_marker = "# end VFM rules"; // Split out the existing file into the preceeding lines, and those that appear after the marker $pre_lines = $post_lines = $existing_lines = array(); $found_marker = $found_end_marker = false; if (file_exists($htaccess)) { $hta = file_get_contents($htaccess); // Read the whole .htaccess file into mem $lines = explode(PHP_EOL, $hta); // Use newline to differentiate between records foreach ($lines as $line) { if (!$found_marker && false !== strpos($line, $start_marker)) { $found_marker = true; continue; } elseif (!$found_end_marker && false !== strpos($line, $end_marker)) { $found_end_marker = true; continue; } if (!$found_marker) { $pre_lines[] = $line; } elseif ($found_marker && $found_end_marker) { $post_lines[] = $line; } else { $existing_lines[] = $line; } } } $insertion = array(); if ($starting_dir !== './') { $insertion[] = "<Files \"*.php\">"; $insertion[] = "SetHandler none"; $insertion[] = "SetHandler default-handler"; $insertion[] = "Options -ExecCGI"; $insertion[] = "RemoveHandler .php"; $insertion[] = "</Files>"; $insertion[] = "<IfModule mod_php5.c>"; $insertion[] = "php_flag engine off"; $insertion[] = "</IfModule>"; if (!$direct_links) { $insertion[] = "Order Deny,Allow"; $insertion[] = "Deny from all"; } $insertion[] = "Options -Indexes"; } else { // if ($direct_links) { $insertion[] = "<IfModule mod_rewrite.c>"; $insertion[] = "RewriteEngine on"; $insertion[] = "RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\\2$"; $insertion[] = "RewriteRule ^(.*)$ - [E=BASE:%1]"; $insertion[] = "RewriteCond %{REQUEST_FILENAME} !-f"; $insertion[] = "RewriteCond %{REQUEST_FILENAME} !-d"; $insertion[] = "RewriteRule download/(.*)/sh/(.*)/share/(.*) %{ENV:BASE}/vfm-admin/vfm-downloader.php?q=$1&sh=$2&share=$3 [L]"; $insertion[] = "RewriteRule download/(.*)/h/(.*) %{ENV:BASE}/vfm-admin/vfm-downloader.php?q=$1&h=$2 [L]"; $insertion[] = "RewriteRule download/zip/(.*)/n/(.*) %{ENV:BASE}/vfm-admin/vfm-downloader.php?zip=$1&n=$2 [L]"; $insertion[] = "</IfModule>"; // } } // Generate the new file data $new_file_data = implode( "\n", array_merge( $pre_lines, array( $start_marker ), $insertion, array( $end_marker ), $post_lines ) ); // Check to see if there was a change if ($existing_lines === $new_file_data) { return true; } $fpp = fopen($htaccess, "w+"); if ($fpp === false) { return false; } fwrite($fpp, $new_file_data); fclose($fpp); return true; } /** * Clear php cache * * @param string $path file path * * @return void */ public function clearCache($path) { if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) { opcache_invalidate($path, true); } elseif (function_exists('apc_compile_file')) { apc_compile_file($path); } } } }