'$2y$12$6iyKwObB3zokmhwUuBhXxuB3/ZenHS4aosToHJJK0Yl3JgY1S80sy', 
);

// Readonly users
// e.g. array('users', 'guest', ...)
$readonly_users = array(
    'user'
);

// Global readonly, including when auth is not being used
$global_readonly = false;

// user specific directories
// array('Username' => 'Directory path', 'Username2' => 'Directory path', ...)
$directories_users = array();

// Enable highlight.js (https://highlightjs.org/) on view's page
$use_highlightjs = true;

// highlight.js style
// for dark theme use 'ir-black'
$highlightjs_style = 'vs';

// Enable ace.js (https://ace.c9.io/) on view's page
$edit_files = true;

// Default timezone for date() and time()
// Doc - http://php.net/manual/en/timezones.php
$default_timezone = 'Etc/UTC'; // UTC

// Root path for file manager
// use absolute path of directory i.e: '/var/www/folder' or $_SERVER['DOCUMENT_ROOT'].'/folder'
$root_path = $_SERVER['DOCUMENT_ROOT'];

// Root url for links in file manager.Relative to $http_host. Variants: '', 'path/to/subfolder'
// Will not working if $root_path will be outside of server document root
$root_url = '';

// Server hostname. Can set manually if wrong
// $_SERVER['HTTP_HOST'].'/folder'
$http_host = $_SERVER['HTTP_HOST'];

// input encoding for iconv
$iconv_input_encoding = 'UTF-8';

// date() format for file modification date
// Doc - https://www.php.net/manual/en/function.date.php
$datetime_format = 'm/d/Y g:i A';

// Path display mode when viewing file information
// 'full' => show full path
// 'relative' => show path relative to root_path
// 'host' => show path on the host
$path_display_mode = 'full';

// Allowed file extensions for create and rename files
// e.g. 'txt,html,css,js'
$allowed_file_extensions = '';

// Allowed file extensions for upload files
// e.g. 'gif,png,jpg,html,txt'
$allowed_upload_extensions = '';

// Favicon path. This can be either a full url to an .PNG image, or a path based on the document root.
// full path, e.g http://example.com/favicon.png
// local path, e.g images/icons/favicon.png
$favicon_path = '';

// Files and folders to excluded from listing
// e.g. array('myfile.html', 'personal-folder', '*.php', ...)
$exclude_items = array();

// Online office Docs Viewer
// Availabe rules are 'google', 'microsoft' or false
// Google => View documents using Google Docs Viewer
// Microsoft => View documents using Microsoft Web Apps Viewer
// false => disable online doc viewer
$online_viewer = 'google';

// Sticky Nav bar
// true => enable sticky header
// false => disable sticky header
$sticky_navbar = true;

// Maximum file upload size
// Increase the following values in php.ini to work properly
// memory_limit, upload_max_filesize, post_max_size
$max_upload_size_bytes = 5000000000; // size 5,000,000,000 bytes (~5GB)

// chunk size used for upload
// eg. decrease to 1MB if nginx reports problem 413 entity too large
$upload_chunk_size_bytes = 2000000; // chunk size 2,000,000 bytes (~2MB)

// Possible rules are 'OFF', 'AND' or 'OR'
// OFF => Don't check connection IP, defaults to OFF
// AND => Connection must be on the whitelist, and not on the blacklist
// OR => Connection must be on the whitelist, or not on the blacklist
$ip_ruleset = 'OFF';

// Should users be notified of their block?
$ip_silent = true;

// IP-addresses, both ipv4 and ipv6
$ip_whitelist = array(
    '127.0.0.1',    // local ipv4
    '::1'           // local ipv6
);

// IP-addresses, both ipv4 and ipv6
$ip_blacklist = array(
    '0.0.0.0',      // non-routable meta ipv4
    '::'            // non-routable meta ipv6
);

// if User has the external config file, try to use it to override the default config above [config.php]
// sample config - https://tinyfilemanager.github.io/config-sample.txt
$config_file = __DIR__.'/config.php';
if (is_readable($config_file)) {
    @include($config_file);
}

// External CDN resources that can be used in the HTML (replace for GDPR compliance)
$external = array(
    'css-bootstrap' => '',
    'css-dropzone' => '',
    'css-font-awesome' => '',
    'css-highlightjs' => '',
    'js-ace' => '',
    'js-bootstrap' => '',
    'js-dropzone' => '',
    'js-jquery' => '',
    'js-jquery-datatables' => '',
    'js-highlightjs' => '',
    'pre-jsdelivr' => '',
    'pre-cloudflare' => ''
);

// --- EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL ---

// max upload file size
define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);

// upload chunk size
define('UPLOAD_CHUNK_SIZE', $upload_chunk_size_bytes);

// private key and session name to store to the session
if ( !defined( 'FM_SESSION_ID')) {
    define('FM_SESSION_ID', 'filemanager');
}

// Configuration
$cfg = new FM_Config();

// Default language
$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en';

// Show or hide files and folders that starts with a dot
$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true;

// PHP error reporting - false = Turns off Errors, true = Turns on Errors
$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true;

// Hide Permissions and Owner cols in file-listing
$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true;

// Theme
$theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light';

define('FM_THEME', $theme);

//available languages
$lang_list = array(
    'en' => 'English'
);

if ($report_errors == true) {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 1);
} else {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 0);
}

// if fm included
if (defined('FM_EMBED')) {
    $use_auth = false;
    $sticky_navbar = false;
} else {
    @set_time_limit(600);

    date_default_timezone_set($default_timezone);

    ini_set('default_charset', 'UTF-8');
    if (version_compare(PHP_VERSION, '5.6.0', '<') && function_exists('mb_internal_encoding')) {
        mb_internal_encoding('UTF-8');
    }
    if (function_exists('mb_regex_encoding')) {
        mb_regex_encoding('UTF-8');
    }

    session_cache_limiter('nocache'); // Prevent logout issue after page was cached
    session_name(FM_SESSION_ID );
    function session_error_handling_function($code, $msg, $file, $line) {
        // Permission denied for default session, try to create a new one
        if ($code == 2) {
            session_abort();
            session_id(session_create_id());
            @session_start();
        }
    }
    set_error_handler('session_error_handling_function');
    session_start();
    restore_error_handler();
}

//Generating CSRF Token
if (empty($_SESSION['token'])) {
    if (function_exists('random_bytes')) {
        $_SESSION['token'] = bin2hex(random_bytes(32));
    } else {
        $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
    }
}

if (empty($auth_users)) {
    $use_auth = false;
}

$is_https = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)
    || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https';

// update $root_url based on user specific directories
if (isset($_SESSION[FM_SESSION_ID]['logged']) && !empty($directories_users[$_SESSION[FM_SESSION_ID]['logged']])) {
    $wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));
    $root_url =  $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[FM_SESSION_ID]['logged']];
}
// clean $root_url
$root_url = fm_clean_path($root_url);

// abs path for site
defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : ''));
defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']);

// logout
if (isset($_GET['logout'])) {
    unset($_SESSION[FM_SESSION_ID]['logged']);
    unset( $_SESSION['token']); 
    fm_redirect(FM_SELF_URL);
}

// Validate connection IP
if ($ip_ruleset != 'OFF') {
    function getClientIP() {
        if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) {
            return  $_SERVER["HTTP_CF_CONNECTING_IP"];
        }else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
            return  $_SERVER["HTTP_X_FORWARDED_FOR"];
        }else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
            return $_SERVER['REMOTE_ADDR'];
        }else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
            return $_SERVER['HTTP_CLIENT_IP'];
        }
        return '';
    }

    $clientIp = getClientIP();
    $proceed = false;
    $whitelisted = in_array($clientIp, $ip_whitelist);
    $blacklisted = in_array($clientIp, $ip_blacklist);

    if($ip_ruleset == 'AND'){
        if($whitelisted == true && $blacklisted == false){
            $proceed = true;
        }
    } else
    if($ip_ruleset == 'OR'){
         if($whitelisted == true || $blacklisted == false){
            $proceed = true;
        }
    }

    if($proceed == false){
        trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);

        if($ip_silent == false){
            fm_set_msg(lng('Access denied. IP restriction applicable'), 'error');
            fm_show_header_login();
            fm_show_message();
        }
        exit();
    }
}

// Checking if the user is logged in or not. If not, it will show the login form.
if ($use_auth) {
    if (isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']])) {
        // Logged
    } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) {
        // Logging In
        sleep(1);
        if(function_exists('password_verify')) {
            if (isset($auth_users[$_POST['fm_usr']]) && isset($_POST['fm_pwd']) && password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) && verifyToken($_POST['token'])) {
                $_SESSION[FM_SESSION_ID]['logged'] = $_POST['fm_usr'];
                fm_set_msg(lng('You are logged in'));
                fm_redirect(FM_SELF_URL);
            } else {
                unset($_SESSION[FM_SESSION_ID]['logged']);
                fm_set_msg(lng('Login failed. Invalid username or password'), 'error');
                fm_redirect(FM_SELF_URL);
            }
        } else {
            fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;
        }
    } else {
        // Form
        unset($_SESSION[FM_SESSION_ID]['logged']);
        fm_show_header_login();
        ?>
        
".lng('Root path')." \"{$root_path}\" ".lng('not found!')." "; exit; } defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files); defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path); defined('FM_LANG') || define('FM_LANG', $lang); defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions); defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions); defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items)); defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer); define('FM_READONLY', $global_readonly || ($use_auth && !empty($readonly_users) && isset($_SESSION[FM_SESSION_ID]['logged']) && in_array($_SESSION[FM_SESSION_ID]['logged'], $readonly_users))); define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\'); // always use ?p= if (!isset($_GET['p']) && empty($_FILES)) { fm_redirect(FM_SELF_URL . '?p='); } // get path $p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : ''); // clean path $p = fm_clean_path($p); // for ajax request - save $input = file_get_contents('php://input'); $_POST = (strpos($input, 'ajax') != FALSE && strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST; // instead globals vars define('FM_PATH', $p); define('FM_USE_AUTH', $use_auth); define('FM_EDIT_FILE', $edit_files); defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding); defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs); defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style); defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format); unset($p, $use_auth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style); /*************************** ACTIONS ***************************/ // Handle all AJAX Request if ((isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']]) || !FM_USE_AUTH) && isset($_POST['ajax'], $_POST['token']) && !FM_READONLY) { if(!verifyToken($_POST['token'])) { header('HTTP/1.0 401 Unauthorized'); die("Invalid Token."); } //search : get list of files from the current folder if(isset($_POST['type']) && $_POST['type']=="search") { $dir = $_POST['path'] == "." ? '': $_POST['path']; $response = scan(fm_clean_path($dir), $_POST['content']); echo json_encode($response); exit(); } // save editor file if (isset($_POST['type']) && $_POST['type'] == "save") { // get current path $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // check path if (!is_dir($path)) { fm_redirect(FM_SELF_URL . '?p='); } $file = $_GET['edit']; $file = fm_clean_path($file); $file = str_replace('/', '', $file); if ($file == '' || !is_file($path . '/' . $file)) { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } header('X-XSS-Protection:0'); $file_path = $path . '/' . $file; $writedata = $_POST['content']; $fd = fopen($file_path, "w"); $write_results = @fwrite($fd, $writedata); fclose($fd); if ($write_results === false){ header("HTTP/1.1 500 Internal Server Error"); die("Could Not Write File! - Check Permissions / Ownership"); } die(true); } // backup files if (isset($_POST['type']) && $_POST['type'] == "backup" && !empty($_POST['file'])) { $fileName = fm_clean_path($_POST['file']); $fullPath = FM_ROOT_PATH . '/'; if (!empty($_POST['path'])) { $relativeDirPath = fm_clean_path($_POST['path']); $fullPath .= "{$relativeDirPath}/"; } $date = date("dMy-His"); $newFileName = "{$fileName}-{$date}.bak"; $fullyQualifiedFileName = $fullPath . $fileName; try { if (!file_exists($fullyQualifiedFileName)) { throw new Exception("File {$fileName} not found"); } if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) { echo "Backup {$newFileName} created"; } else { throw new Exception("Could not copy file {$fileName}"); } } catch (Exception $e) { echo $e->getMessage(); } } // Save Config if (isset($_POST['type']) && $_POST['type'] == "settings") { global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme; $newLng = $_POST['js-language']; fm_get_translations([]); if (!array_key_exists($newLng, $lang_list)) { $newLng = 'en'; } $erp = isset($_POST['js-error-report']) && $_POST['js-error-report'] == "true" ? true : false; $shf = isset($_POST['js-show-hidden']) && $_POST['js-show-hidden'] == "true" ? true : false; $hco = isset($_POST['js-hide-cols']) && $_POST['js-hide-cols'] == "true" ? true : false; $te3 = $_POST['js-theme-3']; if ($cfg->data['lang'] != $newLng) { $cfg->data['lang'] = $newLng; $lang = $newLng; } if ($cfg->data['error_reporting'] != $erp) { $cfg->data['error_reporting'] = $erp; $report_errors = $erp; } if ($cfg->data['show_hidden'] != $shf) { $cfg->data['show_hidden'] = $shf; $show_hidden_files = $shf; } if ($cfg->data['show_hidden'] != $shf) { $cfg->data['show_hidden'] = $shf; $show_hidden_files = $shf; } if ($cfg->data['hide_Cols'] != $hco) { $cfg->data['hide_Cols'] = $hco; $hide_Cols = $hco; } if ($cfg->data['theme'] != $te3) { $cfg->data['theme'] = $te3; $theme = $te3; } $cfg->save(); echo true; } // new password hash if (isset($_POST['type']) && $_POST['type'] == "pwdhash") { $res = isset($_POST['inputPassword2']) && !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : ''; echo $res; } //upload using url if(isset($_POST['type']) && $_POST['type'] == "upload" && !empty($_REQUEST["uploadurl"])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } function event_callback ($message) { global $callback; echo json_encode($message); } function get_file_path () { global $path, $fileinfo, $temp_file; return $path."/".basename($fileinfo->name); } $url = !empty($_REQUEST["uploadurl"]) && preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null; //prevent 127.* domain and known ports $domain = parse_url($url, PHP_URL_HOST); $port = parse_url($url, PHP_URL_PORT); $knownPorts = [22, 23, 25, 3306]; if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) { $err = array("message" => "URL is not allowed"); event_callback(array("fail" => $err)); exit(); } $use_curl = false; $temp_file = tempnam(sys_get_temp_dir(), "upload-"); $fileinfo = new stdClass(); $fileinfo->name = trim(basename($url), ".\x00..\x20"); $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false; $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION)); $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; $err = false; if(!$isFileAllowed) { $err = array("message" => "File extension is not allowed"); event_callback(array("fail" => $err)); exit(); } if (!$url) { $success = false; } else if ($use_curl) { @$fp = fopen($temp_file, "w"); @$ch = curl_init($url); curl_setopt($ch, CURLOPT_NOPROGRESS, false ); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FILE, $fp); @$success = curl_exec($ch); $curl_info = curl_getinfo($ch); if (!$success) { $err = array("message" => curl_error($ch)); } @curl_close($ch); fclose($fp); $fileinfo->size = $curl_info["size_download"]; $fileinfo->type = $curl_info["content_type"]; } else { $ctx = stream_context_create(); @$success = copy($url, $temp_file, $ctx); if (!$success) { $err = error_get_last(); } } if ($success) { $success = rename($temp_file, strtok(get_file_path(), '?')); } if ($success) { event_callback(array("done" => $fileinfo)); } else { unlink($temp_file); if (!$err) { $err = array("message" => "Invalid url parameter"); } event_callback(array("fail" => $err)); } } exit(); } // Delete file / folder if (isset($_GET['del'], $_POST['token']) && !FM_READONLY) { $del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) ); if ($del != '' && $del != '..' && $del != '.' && verifyToken($_POST['token'])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $is_dir = is_dir($path . '/' . $del); if (fm_rdelete($path . '/' . $del)) { $msg = $is_dir ? lng('Folder').' %s '.lng('Deleted') : lng('File').' %s '.lng('Deleted'); fm_set_msg(sprintf($msg, fm_enc($del))); } else { $msg = $is_dir ? lng('Folder').' %s '.lng('not deleted') : lng('File').' %s '.lng('not deleted'); fm_set_msg(sprintf($msg, fm_enc($del)), 'error'); } } else { fm_set_msg(lng('Invalid file or folder name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Create a new file/folder if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) && !FM_READONLY) { $type = urldecode($_POST['newfile']); $new = str_replace( '/', '', fm_clean_path( strip_tags( $_POST['newfilename'] ) ) ); if (fm_isvalid_filename($new) && $new != '' && $new != '..' && $new != '.' && verifyToken($_POST['token'])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($type == "file") { if (!file_exists($path . '/' . $new)) { if(fm_is_valid_ext($new)) { @fopen($path . '/' . $new, 'w') or die('Cannot open file: ' . $new); fm_set_msg(sprintf(lng('File').' %s '.lng('Created'), fm_enc($new))); } else { fm_set_msg(lng('File extension is not allowed'), 'error'); } } else { fm_set_msg(sprintf(lng('File').' %s '.lng('already exists'), fm_enc($new)), 'alert'); } } else { if (fm_mkdir($path . '/' . $new, false) === true) { fm_set_msg(sprintf(lng('Folder').' %s '.lng('Created'), $new)); } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) { fm_set_msg(sprintf(lng('Folder').' %s '.lng('already exists'), fm_enc($new)), 'alert'); } else { fm_set_msg(sprintf(lng('Folder').' %s '.lng('not created'), fm_enc($new)), 'error'); } } } else { fm_set_msg(lng('Invalid characters in file or folder name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Copy folder / file if (isset($_GET['copy'], $_GET['finish']) && !FM_READONLY) { // from $copy = urldecode($_GET['copy']); $copy = fm_clean_path($copy); // empty path if ($copy == '') { fm_set_msg(lng('Source path not defined'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // abs path from $from = FM_ROOT_PATH . '/' . $copy; // abs path to $dest = FM_ROOT_PATH; if (FM_PATH != '') { $dest .= '/' . FM_PATH; } $dest .= '/' . basename($from); // move? $move = isset($_GET['move']); $move = fm_clean_path(urldecode($move)); // copy/move/duplicate if ($from != $dest) { $msg_from = trim(FM_PATH . '/' . basename($from), '/'); if ($move) { // Move and to != from so just perform move $rename = fm_rename($from, $dest); if ($rename) { fm_set_msg(sprintf(lng('Moved from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from))); } elseif ($rename === null) { fm_set_msg(lng('File or folder with this path already exists'), 'alert'); } else { fm_set_msg(sprintf(lng('Error while moving from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from)), 'error'); } } else { // Not move and to != from so copy with original name if (fm_rcopy($from, $dest)) { fm_set_msg(sprintf(lng('Copied from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from))); } else { fm_set_msg(sprintf(lng('Error while copying from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from)), 'error'); } } } else { if (!$move){ //Not move and to = from so duplicate $msg_from = trim(FM_PATH . '/' . basename($from), '/'); $fn_parts = pathinfo($from); $extension_suffix = ''; if(!is_dir($from)){ $extension_suffix = '.'.$fn_parts['extension']; } //Create new name for duplicate $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix; $loop_count = 0; $max_loop = 1000; // Check if a file with the duplicate name already exists, if so, make new name (edge case...) while(file_exists($fn_duplicate) & $loop_count < $max_loop){ $fn_parts = pathinfo($fn_duplicate); $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix; $loop_count++; } if (fm_rcopy($from, $fn_duplicate, False)) { fm_set_msg(sprintf('Copied from %s to %s', fm_enc($copy), fm_enc($fn_duplicate))); } else { fm_set_msg(sprintf('Error while copying from %s to %s', fm_enc($copy), fm_enc($fn_duplicate)), 'error'); } } else{ fm_set_msg(lng('Paths must be not equal'), 'alert'); } } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Mass copy files/ folders if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) && !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng('Invalid Token.'), 'error'); } // from $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // to $copy_to_path = FM_ROOT_PATH; $copy_to = fm_clean_path($_POST['copy_to']); if ($copy_to != '') { $copy_to_path .= '/' . $copy_to; } if ($path == $copy_to_path) { fm_set_msg(lng('Paths must be not equal'), 'alert'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (!is_dir($copy_to_path)) { if (!fm_mkdir($copy_to_path, true)) { fm_set_msg('Unable to create destination folder', 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } } // move? $move = isset($_POST['move']); // copy/move $errors = 0; $files = $_POST['file']; if (is_array($files) && count($files)) { foreach ($files as $f) { if ($f != '') { $f = fm_clean_path($f); // abs path from $from = $path . '/' . $f; // abs path to $dest = $copy_to_path . '/' . $f; // do if ($move) { $rename = fm_rename($from, $dest); if ($rename === false) { $errors++; } } else { if (!fm_rcopy($from, $dest)) { $errors++; } } } } if ($errors == 0) { $msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied'; fm_set_msg($msg); } else { $msg = $move ? 'Error while moving items' : 'Error while copying items'; fm_set_msg($msg, 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Rename if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) && !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg("Invalid Token.", 'error'); } // old name $old = urldecode($_POST['rename_from']); $old = fm_clean_path($old); $old = str_replace('/', '', $old); // new name $new = urldecode($_POST['rename_to']); $new = fm_clean_path(strip_tags($new)); $new = str_replace('/', '', $new); // path $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // rename if (fm_isvalid_filename($new) && $old != '' && $new != '') { if (fm_rename($path . '/' . $old, $path . '/' . $new)) { fm_set_msg(sprintf(lng('Renamed from').' %s '. lng('to').' %s', fm_enc($old), fm_enc($new))); } else { fm_set_msg(sprintf(lng('Error while renaming from').' %s '. lng('to').' %s', fm_enc($old), fm_enc($new)), 'error'); } } else { fm_set_msg(lng('Invalid characters in file name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Download if (isset($_GET['dl'], $_POST['token'])) { if(!verifyToken($_POST['token'])) { fm_set_msg("Invalid Token.", 'error'); } $dl = urldecode($_GET['dl']); $dl = fm_clean_path($dl); $dl = str_replace('/', '', $dl); $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($dl != '' && is_file($path . '/' . $dl)) { fm_download_file($path . '/' . $dl, $dl, 1024); exit; } else { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } } // Upload if (!empty($_FILES) && !FM_READONLY) { if(isset($_POST['token'])) { if(!verifyToken($_POST['token'])) { $response = array ('status' => 'error','info' => "Invalid Token."); echo json_encode($response); exit(); } } else { $response = array ('status' => 'error','info' => "Token Missing."); echo json_encode($response); exit(); } $chunkIndex = $_POST['dzchunkindex']; $chunkTotal = $_POST['dztotalchunkcount']; $fullPathInput = fm_clean_path($_REQUEST['fullpath']); $f = $_FILES; $path = FM_ROOT_PATH; $ds = DIRECTORY_SEPARATOR; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $errors = 0; $uploads = 0; $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false; $response = array ( 'status' => 'error', 'info' => 'Oops! Try again' ); $filename = $f['file']['name']; $tmp_name = $f['file']['tmp_name']; $ext = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : ''; $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; if(!fm_isvalid_filename($filename) && !fm_isvalid_filename($fullPathInput)) { $response = array ( 'status' => 'error', 'info' => "Invalid File name!", ); echo json_encode($response); exit(); } $targetPath = $path . $ds; if ( is_writable($targetPath) ) { $fullPath = $path . '/' . basename($fullPathInput); $folder = substr($fullPath, 0, strrpos($fullPath, "/")); if (!is_dir($folder)) { $old = umask(0); mkdir($folder, 0777, true); umask($old); } if (empty($f['file']['error']) && !empty($tmp_name) && $tmp_name != 'none' && $isFileAllowed) { if ($chunkTotal){ $out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab"); if ($out) { $in = @fopen($tmp_name, "rb"); if ($in) { if (PHP_VERSION_ID < 80009) { // workaround https://bugs.php.net/bug.php?id=81145 do { for (;;) { $buff = fread($in, 4096); if ($buff === false || $buff === '') { break; } fwrite($out, $buff); } } while (!feof($in)); } else { stream_copy_to_stream($in, $out); } $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => "failed to open output stream", 'errorDetails' => error_get_last() ); } @fclose($in); @fclose($out); @unlink($tmp_name); $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => "failed to open output stream" ); } if ($chunkIndex == $chunkTotal - 1) { if (file_exists ($fullPath)) { $ext_1 = $ext ? '.'.$ext : ''; $fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1; } else { $fullPathTarget = $fullPath; } rename("{$fullPath}.part", $fullPathTarget); } } else if (move_uploaded_file($tmp_name, $fullPath)) { // Be sure that the file has been uploaded if ( file_exists($fullPath) ) { $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => 'Couldn\'t upload the requested file.' ); } } else { $response = array ( 'status' => 'error', 'info' => "Error while uploading files. Uploaded files $uploads", ); } } } else { $response = array ( 'status' => 'error', 'info' => 'The specified folder for upload isn\'t writeable.' ); } // Return the response echo json_encode($response); exit(); } // Mass deleting if (isset($_POST['group'], $_POST['delete'], $_POST['token']) && !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $errors = 0; $files = $_POST['file']; if (is_array($files) && count($files)) { foreach ($files as $f) { if ($f != '') { $new_path = $path . '/' . $f; if (!fm_rdelete($new_path)) { $errors++; } } } if ($errors == 0) { fm_set_msg(lng('Selected files and folder deleted')); } else { fm_set_msg(lng('Error while deleting items'), 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Pack files zip, tar if (isset($_POST['group'], $_POST['token']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; $ext = 'zip'; if (FM_PATH != '') { $path .= '/' . FM_PATH; } //set pack type $ext = isset($_POST['tar']) ? 'tar' : 'zip'; if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) { fm_set_msg(lng('Operations with archives are not available'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $files = $_POST['file']; $sanitized_files = array(); // clean path foreach($files as $file){ array_push($sanitized_files, fm_clean_path($file)); } $files = $sanitized_files; if (!empty($files)) { chdir($path); if (count($files) == 1) { $one_file = reset($files); $one_file = basename($one_file); $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext; } else { $zipname = 'archive_' . date('ymd_His') . '.'.$ext; } if($ext == 'zip') { $zipper = new FM_Zipper(); $res = $zipper->create($zipname, $files); } elseif ($ext == 'tar') { $tar = new FM_Zipper_Tar(); $res = $tar->create($zipname, $files); } if ($res) { fm_set_msg(sprintf(lng('Archive').' %s '.lng('Created'), fm_enc($zipname))); } else { fm_set_msg(lng('Archive not created'), 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Unpack zip, tar if (isset($_POST['unzip'], $_POST['token']) && !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $unzip = urldecode($_POST['unzip']); $unzip = fm_clean_path($unzip); $unzip = str_replace('/', '', $unzip); $isValid = false; $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($unzip != '' && is_file($path . '/' . $unzip)) { $zip_path = $path . '/' . $unzip; $ext = pathinfo($zip_path, PATHINFO_EXTENSION); $isValid = true; } else { fm_set_msg(lng('File not found'), 'error'); } if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) { fm_set_msg(lng('Operations with archives are not available'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if ($isValid) { //to folder $tofolder = ''; if (isset($_POST['tofolder'])) { $tofolder = pathinfo($zip_path, PATHINFO_FILENAME); if (fm_mkdir($path . '/' . $tofolder, true)) { $path .= '/' . $tofolder; } } if($ext == "zip") { $zipper = new FM_Zipper(); $res = $zipper->unzip($zip_path, $path); } elseif ($ext == "tar") { try { $gzipper = new PharData($zip_path); if (@$gzipper->extractTo($path,null, true)) { $res = true; } else { $res = false; } } catch (Exception $e) { //TODO:: need to handle the error $res = true; } } if ($res) { fm_set_msg(lng('Archive unpacked')); } else { fm_set_msg(lng('Archive not unpacked'), 'error'); } } else { fm_set_msg(lng('File not found'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Change Perms (not for Windows) if (isset($_POST['chmod'], $_POST['token']) && !FM_READONLY && !FM_IS_WIN) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $file = $_POST['chmod']; $file = fm_clean_path($file); $file = str_replace('/', '', $file); if ($file == '' || (!is_file($path . '/' . $file) && !is_dir($path . '/' . $file))) { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $mode = 0; if (!empty($_POST['ur'])) { $mode |= 0400; } if (!empty($_POST['uw'])) { $mode |= 0200; } if (!empty($_POST['ux'])) { $mode |= 0100; } if (!empty($_POST['gr'])) { $mode |= 0040; } if (!empty($_POST['gw'])) { $mode |= 0020; } if (!empty($_POST['gx'])) { $mode |= 0010; } if (!empty($_POST['or'])) { $mode |= 0004; } if (!empty($_POST['ow'])) { $mode |= 0002; } if (!empty($_POST['ox'])) { $mode |= 0001; } if (@chmod($path . '/' . $file, $mode)) { fm_set_msg(lng('Permissions changed')); } else { fm_set_msg(lng('Permissions not changed'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } /*************************** ACTIONS ***************************/ // get current path $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // check path if (!is_dir($path)) { fm_redirect(FM_SELF_URL . '?p='); } // get parent folder $parent = fm_get_parent_path(FM_PATH); $objects = is_readable($path) ? scandir($path) : array(); $folders = array(); $files = array(); $current_path = array_slice(explode("/",$path), -1)[0]; if (is_array($objects) && fm_is_exclude_items($current_path)) { foreach ($objects as $file) { if ($file == '.' || $file == '..') { continue; } if (!FM_SHOW_HIDDEN && substr($file, 0, 1) === '.') { continue; } $new_path = $path . '/' . $file; if (@is_file($new_path) && fm_is_exclude_items($file)) { $files[] = $file; } elseif (@is_dir($new_path) && $file != '.' && $file != '..' && fm_is_exclude_items($file)) { $folders[] = $file; } } } if (!empty($files)) { natcasesort($files); } if (!empty($folders)) { natcasesort($folders); } // upload form if (isset($_GET['upload']) && !FM_READONLY) { fm_show_header(); // HEADER fm_show_nav_path(FM_PATH); // current path //get the allowed file extensions function getUploadExt() { $extArr = explode(',', FM_UPLOAD_EXTENSION); if(FM_UPLOAD_EXTENSION && $extArr) { array_walk($extArr, function(&$x) {$x = ".$x";}); return implode(',', $extArr); } return ''; } ?>
' . PHP_EOL; } ?>

: , ', $copy_files) ?>

:
/

 

Copying

Source path:
Destination folder:

Copy   Move   Cancel

/>
/>
/>

""

:
File size:
MIME-type:
:
:
:
: %
'.lng('Image size').': ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '
'; } // Text info if ($is_text) { $is_utf8 = fm_is_utf8($content); if (function_exists('iconv')) { if (!$is_utf8) { $content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content); } } echo ''.lng('Charset').': ' . ($is_utf8 ? 'utf-8' : '8 bit') . '
'; } ?>

 
 
     
'; } else if($online_viewer == 'microsoft') { echo ''; } } elseif ($is_zip) { // ZIP content if ($filenames !== false) { echo ''; foreach ($filenames as $fn) { if ($fn['folder']) { echo '' . fm_enc($fn['name']) . '
'; } else { echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')
'; } } echo '
'; } else { echo '

'.lng('Error while fetching archive info').'

'; } } elseif ($is_image) { // Image content if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) { echo '

'; } } elseif ($is_audio) { // Audio content echo '

'; } elseif ($is_video) { // Video content echo '
'; } elseif ($is_text) { if (FM_USE_HIGHLIGHTJS) { // highlight $hljs_classes = array( 'shtml' => 'xml', 'htaccess' => 'apache', 'phtml' => 'php', 'lock' => 'json', 'svg' => 'xml', ); $hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext; if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) { $hljs_class = 'nohighlight'; } $content = '
' . fm_enc($content) . '
'; } elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) { // php highlight $content = highlight_string($content, true); } else { $content = '
' . fm_enc($content) . '
'; } echo $content; } ?>
'. $file. ''; header('X-XSS-Protection:0'); fm_show_header(); // HEADER fm_show_nav_path(FM_PATH); // current path $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file); $file_path = $path . '/' . $file; // normal editer $isNormalEditor = true; if (isset($_GET['env'])) { if ($_GET['env'] == "ace") { $isNormalEditor = false; } } // Save File if (isset($_POST['savedata'])) { $writedata = $_POST['savedata']; $fd = fopen($file_path, "w"); @fwrite($fd, $writedata); fclose($fd); fm_set_msg(lng('File Saved Successfully')); } $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION)); $mime_type = fm_get_mime_type($file_path); $filesize = filesize($file_path); $is_text = false; $content = ''; // for text if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) { $is_text = true; $content = file_get_contents($file_path); } ?>
' . htmlspecialchars($content) . ''; echo ''; } elseif ($is_text) { echo '
' . htmlspecialchars($content) . '
'; } else { fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error'); } ?>

:

 

'?'); } if ($group === false) { $group = array('name' => '?'); } } else { $owner = array('name' => '?'); $group = array('name' => '?'); } ?> '?'); } if ($group === false) { $group = array('name' => '?'); } } else { $owner = array('name' => '?'); $group = array('name' => '?'); } ?>
..
>
' . readlink($path . '/' . $f) . '' : '') ?>
">
>
' . readlink($path . '/' . $f) . '' : '') ?>
">
'.fm_get_filesize($all_files_size).'' ?> '.$num_files.'' ?> '.$num_folders.'' ?>
"; return; } echo "$external[$key]"; } /** * Verify CSRF TOKEN and remove after cerify * @param string $token * @return bool */ function verifyToken($token) { if (hash_equals($_SESSION['token'], $token)) { return true; } return false; } /** * Delete file or folder (recursively) * @param string $path * @return bool */ function fm_rdelete($path) { if (is_link($path)) { return unlink($path); } elseif (is_dir($path)) { $objects = scandir($path); $ok = true; if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' && $file != '..') { if (!fm_rdelete($path . '/' . $file)) { $ok = false; } } } } return ($ok) ? rmdir($path) : false; } elseif (is_file($path)) { return unlink($path); } return false; } /** * Recursive chmod * @param string $path * @param int $filemode * @param int $dirmode * @return bool * @todo Will use in mass chmod */ function fm_rchmod($path, $filemode, $dirmode) { if (is_dir($path)) { if (!chmod($path, $dirmode)) { return false; } $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' && $file != '..') { if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) { return false; } } } } return true; } elseif (is_link($path)) { return true; } elseif (is_file($path)) { return chmod($path, $filemode); } return false; } /** * Check the file extension which is allowed or not * @param string $filename * @return bool */ function fm_is_valid_ext($filename) { $allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false; $ext = pathinfo($filename, PATHINFO_EXTENSION); $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; return ($isFileAllowed) ? true : false; } /** * Safely rename * @param string $old * @param string $new * @return bool|null */ function fm_rename($old, $new) { $isFileAllowed = fm_is_valid_ext($new); if(!is_dir($old)) { if (!$isFileAllowed) return false; } return (!file_exists($new) && file_exists($old)) ? rename($old, $new) : null; } /** * Copy file or folder (recursively). * @param string $path * @param string $dest * @param bool $upd Update files * @param bool $force Create folder with same names instead file * @return bool */ function fm_rcopy($path, $dest, $upd = true, $force = true) { if (is_dir($path)) { if (!fm_mkdir($dest, $force)) { return false; } $objects = scandir($path); $ok = true; if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' && $file != '..') { if (!fm_rcopy($path . '/' . $file, $dest . '/' . $file)) { $ok = false; } } } } return $ok; } elseif (is_file($path)) { return fm_copy($path, $dest, $upd); } return false; } /** * Safely create folder * @param string $dir * @param bool $force * @return bool */ function fm_mkdir($dir, $force) { if (file_exists($dir)) { if (is_dir($dir)) { return $dir; } elseif (!$force) { return false; } unlink($dir); } return mkdir($dir, 0777, true); } /** * Safely copy file * @param string $f1 * @param string $f2 * @param bool $upd Indicates if file should be updated with new content * @return bool */ function fm_copy($f1, $f2, $upd) { $time1 = filemtime($f1); if (file_exists($f2)) { $time2 = filemtime($f2); if ($time2 >= $time1 && $upd) { return false; } } $ok = copy($f1, $f2); if ($ok) { touch($f2, $time1); } return $ok; } /** * Get mime type * @param string $file_path * @return mixed|string */ function fm_get_mime_type($file_path) { if (function_exists('finfo_open')) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $file_path); finfo_close($finfo); return $mime; } elseif (function_exists('mime_content_type')) { return mime_content_type($file_path); } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) { $file = escapeshellarg($file_path); $mime = shell_exec('file -bi ' . $file); return $mime; } else { return '--'; } } /** * HTTP Redirect * @param string $url * @param int $code */ function fm_redirect($url, $code = 302) { header('Location: ' . $url, true, $code); exit; } /** * Path traversal prevention and clean the url * It replaces (consecutive) occurrences of / and \\ with whatever is in DIRECTORY_SEPARATOR, and processes /. and /.. fine. * @param $path * @return string */ function get_absolute_path($path) { $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); $absolutes = array(); foreach ($parts as $part) { if ('.' == $part) continue; if ('..' == $part) { array_pop($absolutes); } else { $absolutes[] = $part; } } return implode(DIRECTORY_SEPARATOR, $absolutes); } /** * Clean path * @param string $path * @return string */ function fm_clean_path($path, $trim = true) { $path = $trim ? trim($path) : $path; $path = trim($path, '\\/'); $path = str_replace(array('../', '..\\'), '', $path); $path = get_absolute_path($path); if ($path == '..') { $path = ''; } return str_replace('\\', '/', $path); } /** * Get parent path * @param string $path * @return bool|string */ function fm_get_parent_path($path) { $path = fm_clean_path($path); if ($path != '') { $array = explode('/', $path); if (count($array) > 1) { $array = array_slice($array, 0, -1); return implode('/', $array); } return ''; } return false; } function fm_get_display_path($file_path) { global $path_display_mode, $root_path, $root_url; switch ($path_display_mode) { case 'relative': return array( 'label' => 'Path', 'path' => fm_enc(fm_convert_win(str_replace($root_path, '', $file_path))) ); case 'host': $relative_path = str_replace($root_path, '', $file_path); return array( 'label' => 'Host Path', 'path' => fm_enc(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/'))) ); case 'full': default: return array( 'label' => 'Full Path', 'path' => fm_enc(fm_convert_win($file_path)) ); } } /** * Check file is in exclude list * @param string $file * @return bool */ function fm_is_exclude_items($file) { $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (isset($exclude_items) and sizeof($exclude_items)) { unset($exclude_items); } $exclude_items = FM_EXCLUDE_ITEMS; if (version_compare(PHP_VERSION, '7.0.0', '<')) { $exclude_items = unserialize($exclude_items); } if (!in_array($file, $exclude_items) && !in_array("*.$ext", $exclude_items)) { return true; } return false; } /** * get language translations from json file * @param int $tr * @return array */ function fm_get_translations($tr) { try { $content = @file_get_contents('translation.json'); if($content !== FALSE) { $lng = json_decode($content, TRUE); global $lang_list; foreach ($lng["language"] as $key => $value) { $code = $value["code"]; $lang_list[$code] = $value["name"]; if ($tr) $tr[$code] = $value["translation"]; } return $tr; } } catch (Exception $e) { echo $e; } } /** * @param string $file * Recover all file sizes larger than > 2GB. * Works on php 32bits and 64bits and supports linux * @return int|string */ function fm_get_size($file) { static $iswin; static $isdarwin; if (!isset($iswin)) { $iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'); } if (!isset($isdarwin)) { $isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN"); } static $exec_works; if (!isset($exec_works)) { $exec_works = (function_exists('exec') && !ini_get('safe_mode') && @exec('echo EXEC') == 'EXEC'); } // try a shell command if ($exec_works) { $arg = escapeshellarg($file); $cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg"); @exec($cmd, $output); if (is_array($output) && ctype_digit($size = trim(implode("\n", $output)))) { return $size; } } // try the Windows COM interface if ($iswin && class_exists("COM")) { try { $fsobj = new COM('Scripting.FileSystemObject'); $f = $fsobj->GetFile( realpath($file) ); $size = $f->Size; } catch (Exception $e) { $size = null; } if (ctype_digit($size)) { return $size; } } // if all else fails return filesize($file); } /** * Get nice filesize * @param int $size * @return string */ function fm_get_filesize($size) { $size = (float) $size; $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); $power = ($size > 0) ? floor(log($size, 1024)) : 0; $power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power; return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]); } /** * Get total size of directory tree. * * @param string $directory Relative or absolute directory name. * @return int Total number of bytes. */ function fm_get_directorysize($directory) { $bytes = 0; $directory = realpath($directory); if ($directory !== false && $directory != '' && file_exists($directory)){ foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS)) as $file){ $bytes += $file->getSize(); } } return $bytes; } /** * Get info about zip archive * @param string $path * @return array|bool */ function fm_get_zif_info($path, $ext) { if ($ext == 'zip' && function_exists('zip_open')) { $arch = @zip_open($path); if ($arch) { $filenames = array(); while ($zip_entry = @zip_read($arch)) { $zip_name = @zip_entry_name($zip_entry); $zip_folder = substr($zip_name, -1) == '/'; $filenames[] = array( 'name' => $zip_name, 'filesize' => @zip_entry_filesize($zip_entry), 'compressed_size' => @zip_entry_compressedsize($zip_entry), 'folder' => $zip_folder //'compression_method' => zip_entry_compressionmethod($zip_entry), ); } @zip_close($arch); return $filenames; } } elseif($ext == 'tar' && class_exists('PharData')) { $archive = new PharData($path); $filenames = array(); foreach(new RecursiveIteratorIterator($archive) as $file) { $parent_info = $file->getPathInfo(); $zip_name = str_replace("phar://".$path, '', $file->getPathName()); $zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0); $zip_folder = $parent_info->getFileName(); $zip_info = new SplFileInfo($file); $filenames[] = array( 'name' => $zip_name, 'filesize' => $zip_info->getSize(), 'compressed_size' => $file->getCompressedSize(), 'folder' => $zip_folder ); } return $filenames; } return false; } /** * Encode html entities * @param string $text * @return string */ function fm_enc($text) { return htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); } /** * Prevent XSS attacks * @param string $text * @return string */ function fm_isvalid_filename($text) { return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false; } /** * Save message in session * @param string $msg * @param string $status */ function fm_set_msg($msg, $status = 'ok') { $_SESSION[FM_SESSION_ID]['message'] = $msg; $_SESSION[FM_SESSION_ID]['status'] = $status; } /** * Check if string is in UTF-8 * @param string $string * @return int */ function fm_is_utf8($string) { return preg_match('//u', $string); } /** * Convert file name to UTF-8 in Windows * @param string $filename * @return string */ function fm_convert_win($filename) { if (FM_IS_WIN && function_exists('iconv')) { $filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename); } return $filename; } /** * @param $obj * @return array */ function fm_object_to_array($obj) { if (!is_object($obj) && !is_array($obj)) { return $obj; } if (is_object($obj)) { $obj = get_object_vars($obj); } return array_map('fm_object_to_array', $obj); } /** * Get CSS classname for file * @param string $path * @return string */ function fm_get_file_icon_class($path) { // get extension $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION)); switch ($ext) { case 'ico': case 'gif': case 'jpg': case 'jpeg': case 'jpc': case 'jp2': case 'jpx': case 'xbm': case 'wbmp': case 'png': case 'bmp': case 'tif': case 'tiff': case 'webp': case 'avif': case 'svg': $img = 'fa fa-picture-o'; break; case 'passwd': case 'ftpquota': case 'sql': case 'js': case 'ts': case 'jsx': case 'tsx': case 'hbs': case 'json': case 'sh': case 'config': case 'twig': case 'tpl': case 'md': case 'gitignore': case 'c': case 'cpp': case 'cs': case 'py': case 'rs': case 'map': case 'lock': case 'dtd': $img = 'fa fa-file-code-o'; break; case 'txt': case 'ini': case 'conf': case 'log': case 'htaccess': case 'yaml': case 'yml': case 'toml': case 'tmp': case 'top': case 'bot': case 'dat': case 'bak': case 'htpasswd': case 'pl': $img = 'fa fa-file-text-o'; break; case 'css': case 'less': case 'sass': case 'scss': $img = 'fa fa-css3'; break; case 'bz2': case 'zip': case 'rar': case 'gz': case 'tar': case '7z': case 'xz': $img = 'fa fa-file-archive-o'; break; case 'php': case 'php4': case 'php5': case 'phps': case 'phtml': $img = 'fa fa-code'; break; case 'htm': case 'html': case 'shtml': case 'xhtml': $img = 'fa fa-html5'; break; case 'xml': case 'xsl': $img = 'fa fa-file-excel-o'; break; case 'wav': case 'mp3': case 'mp2': case 'm4a': case 'aac': case 'ogg': case 'oga': case 'wma': case 'mka': case 'flac': case 'ac3': case 'tds': $img = 'fa fa-music'; break; case 'm3u': case 'm3u8': case 'pls': case 'cue': case 'xspf': $img = 'fa fa-headphones'; break; case 'avi': case 'mpg': case 'mpeg': case 'mp4': case 'm4v': case 'flv': case 'f4v': case 'ogm': case 'ogv': case 'mov': case 'mkv': case '3gp': case 'asf': case 'wmv': case 'webm': $img = 'fa fa-file-video-o'; break; case 'eml': case 'msg': $img = 'fa fa-envelope-o'; break; case 'xls': case 'xlsx': case 'ods': $img = 'fa fa-file-excel-o'; break; case 'csv': $img = 'fa fa-file-text-o'; break; case 'bak': case 'swp': $img = 'fa fa-clipboard'; break; case 'doc': case 'docx': case 'odt': $img = 'fa fa-file-word-o'; break; case 'ppt': case 'pptx': $img = 'fa fa-file-powerpoint-o'; break; case 'ttf': case 'ttc': case 'otf': case 'woff': case 'woff2': case 'eot': case 'fon': $img = 'fa fa-font'; break; case 'pdf': $img = 'fa fa-file-pdf-o'; break; case 'psd': case 'ai': case 'eps': case 'fla': case 'swf': $img = 'fa fa-file-image-o'; break; case 'exe': case 'msi': $img = 'fa fa-file-o'; break; case 'bat': $img = 'fa fa-terminal'; break; default: $img = 'fa fa-info-circle'; } return $img; } /** * Get image files extensions * @return array */ function fm_get_image_exts() { return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif'); } /** * Get video files extensions * @return array */ function fm_get_video_exts() { return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv'); } /** * Get audio files extensions * @return array */ function fm_get_audio_exts() { return array('wav', 'mp3', 'ogg', 'm4a'); } /** * Get text file extensions * @return array */ function fm_get_text_exts() { return array( 'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'ts', 'jsx', 'tsx', 'mjs', 'json', 'sh', 'config', 'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue', 'bash', 'vue', 'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py', 'go', 'zsh', 'swift', 'map', 'lock', 'dtd', 'svg', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsp', 'jspx', 'cgi', 'dockerfile', 'ruby', 'yml', 'yaml', 'toml', 'vhost', 'scpt', 'applescript', 'csx', 'cshtml', 'c++', 'coffee', 'cfm', 'rb', 'graphql', 'mustache', 'jinja', 'http', 'handlebars', 'java', 'es', 'es6', 'markdown', 'wiki', 'tmp', 'top', 'bot', 'dat', 'bak', 'htpasswd', 'pl' ); } /** * Get mime types of text files * @return array */ function fm_get_text_mimes() { return array( 'application/xml', 'application/javascript', 'application/x-javascript', 'image/svg+xml', 'message/rfc822', 'application/json', ); } /** * Get file names of text files w/o extensions * @return array */ function fm_get_text_names() { return array( 'license', 'readme', 'authors', 'contributors', 'changelog', ); } /** * Get online docs viewer supported files extensions * @return array */ function fm_get_onlineViewer_exts() { return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods'); } /** * It returns the mime type of a file based on its extension. * @param extension The file extension of the file you want to get the mime type for. * @return string|string[] The mime type of the file. */ function fm_get_file_mimes($extension) { $fileTypes['swf'] = 'application/x-shockwave-flash'; $fileTypes['pdf'] = 'application/pdf'; $fileTypes['exe'] = 'application/octet-stream'; $fileTypes['zip'] = 'application/zip'; $fileTypes['doc'] = 'application/msword'; $fileTypes['xls'] = 'application/vnd.ms-excel'; $fileTypes['ppt'] = 'application/vnd.ms-powerpoint'; $fileTypes['gif'] = 'image/gif'; $fileTypes['png'] = 'image/png'; $fileTypes['jpeg'] = 'image/jpg'; $fileTypes['jpg'] = 'image/jpg'; $fileTypes['webp'] = 'image/webp'; $fileTypes['avif'] = 'image/avif'; $fileTypes['rar'] = 'application/rar'; $fileTypes['ra'] = 'audio/x-pn-realaudio'; $fileTypes['ram'] = 'audio/x-pn-realaudio'; $fileTypes['ogg'] = 'audio/x-pn-realaudio'; $fileTypes['wav'] = 'video/x-msvideo'; $fileTypes['wmv'] = 'video/x-msvideo'; $fileTypes['avi'] = 'video/x-msvideo'; $fileTypes['asf'] = 'video/x-msvideo'; $fileTypes['divx'] = 'video/x-msvideo'; $fileTypes['mp3'] = 'audio/mpeg'; $fileTypes['mp4'] = 'audio/mpeg'; $fileTypes['mpeg'] = 'video/mpeg'; $fileTypes['mpg'] = 'video/mpeg'; $fileTypes['mpe'] = 'video/mpeg'; $fileTypes['mov'] = 'video/quicktime'; $fileTypes['swf'] = 'video/quicktime'; $fileTypes['3gp'] = 'video/quicktime'; $fileTypes['m4a'] = 'video/quicktime'; $fileTypes['aac'] = 'video/quicktime'; $fileTypes['m3u'] = 'video/quicktime'; $fileTypes['php'] = ['application/x-php']; $fileTypes['html'] = ['text/html']; $fileTypes['txt'] = ['text/plain']; //Unknown mime-types should be 'application/octet-stream' if(empty($fileTypes[$extension])) { $fileTypes[$extension] = ['application/octet-stream']; } return $fileTypes[$extension]; } /** * This function scans the files and folder recursively, and return matching files * @param string $dir * @param string $filter * @return array|null */ function scan($dir = '', $filter = '') { $path = FM_ROOT_PATH.'/'.$dir; if($path) { $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); $rii = new RegexIterator($ite, "/(" . $filter . ")/i"); $files = array(); foreach ($rii as $file) { if (!$file->isDir()) { $fileName = $file->getFilename(); $location = str_replace(FM_ROOT_PATH, '', $file->getPath()); $files[] = array( "name" => $fileName, "type" => "file", "path" => $location, ); } } return $files; } } /** * Parameters: downloadFile(File Location, File Name, * max speed, is streaming * If streaming - videos will show as videos, images as images * instead of download prompt * https://stackoverflow.com/a/13821992/1164642 */ function fm_download_file($fileLocation, $fileName, $chunkSize = 1024) { if (connection_status() != 0) return (false); $extension = pathinfo($fileName, PATHINFO_EXTENSION); $contentType = fm_get_file_mimes($extension); if(is_array($contentType)) { $contentType = implode(' ', $contentType); } $size = filesize($fileLocation); if ($size == 0) { fm_set_msg(lng('Zero byte file! Aborting download'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); return (false); } @ini_set('magic_quotes_runtime', 0); $fp = fopen("$fileLocation", "rb"); if ($fp === false) { fm_set_msg(lng('Cannot open file! Aborting download'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); return (false); } // headers header('Content-Description: File Transfer'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header("Content-Transfer-Encoding: binary"); header("Content-Type: $contentType"); $contentDisposition = 'attachment'; if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1); header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); } else { header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); } header("Accept-Ranges: bytes"); $range = 0; if (isset($_SERVER['HTTP_RANGE'])) { list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']); str_replace($range, "-", $range); $size2 = $size - 1; $new_length = $size - $range; header("HTTP/1.1 206 Partial Content"); header("Content-Length: $new_length"); header("Content-Range: bytes $range$size2/$size"); } else { $size2 = $size - 1; header("Content-Range: bytes 0-$size2/$size"); header("Content-Length: " . $size); } $fileLocation = realpath($fileLocation); while (ob_get_level()) ob_end_clean(); readfile($fileLocation); fclose($fp); return ((connection_status() == 0) and !connection_aborted()); } /** * If the theme is dark, return the text-white and bg-dark classes. * @return string the value of the variable. */ function fm_get_theme() { $result = ''; if(FM_THEME == "dark") { $result = "text-white bg-dark"; } return $result; } /** * Class to work with zip files (using ZipArchive) */ class FM_Zipper { private $zip; public function __construct() { $this->zip = new ZipArchive(); } /** * Create archive with name $filename and files $files (RELATIVE PATHS!) * @param string $filename * @param array|string $files * @return bool */ public function create($filename, $files) { $res = $this->zip->open($filename, ZipArchive::CREATE); if ($res !== true) { return false; } if (is_array($files)) { foreach ($files as $f) { $f = fm_clean_path($f); if (!$this->addFileOrDir($f)) { $this->zip->close(); return false; } } $this->zip->close(); return true; } else { if ($this->addFileOrDir($files)) { $this->zip->close(); return true; } return false; } } /** * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS) * @param string $filename * @param string $path * @return bool */ public function unzip($filename, $path) { $res = $this->zip->open($filename); if ($res !== true) { return false; } if ($this->zip->extractTo($path)) { $this->zip->close(); return true; } return false; } /** * Add file/folder to archive * @param string $filename * @return bool */ private function addFileOrDir($filename) { if (is_file($filename)) { return $this->zip->addFile($filename); } elseif (is_dir($filename)) { return $this->addDir($filename); } return false; } /** * Add folder recursively * @param string $path * @return bool */ private function addDir($path) { if (!$this->zip->addEmptyDir($path)) { return false; } $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' && $file != '..') { if (is_dir($path . '/' . $file)) { if (!$this->addDir($path . '/' . $file)) { return false; } } elseif (is_file($path . '/' . $file)) { if (!$this->zip->addFile($path . '/' . $file)) { return false; } } } } return true; } return false; } } /** * Class to work with Tar files (using PharData) */ class FM_Zipper_Tar { private $tar; public function __construct() { $this->tar = null; } /** * Create archive with name $filename and files $files (RELATIVE PATHS!) * @param string $filename * @param array|string $files * @return bool */ public function create($filename, $files) { $this->tar = new PharData($filename); if (is_array($files)) { foreach ($files as $f) { $f = fm_clean_path($f); if (!$this->addFileOrDir($f)) { return false; } } return true; } else { if ($this->addFileOrDir($files)) { return true; } return false; } } /** * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS) * @param string $filename * @param string $path * @return bool */ public function unzip($filename, $path) { $res = $this->tar->open($filename); if ($res !== true) { return false; } if ($this->tar->extractTo($path)) { return true; } return false; } /** * Add file/folder to archive * @param string $filename * @return bool */ private function addFileOrDir($filename) { if (is_file($filename)) { try { $this->tar->addFile($filename); return true; } catch (Exception $e) { return false; } } elseif (is_dir($filename)) { return $this->addDir($filename); } return false; } /** * Add folder recursively * @param string $path * @return bool */ private function addDir($path) { $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' && $file != '..') { if (is_dir($path . '/' . $file)) { if (!$this->addDir($path . '/' . $file)) { return false; } } elseif (is_file($path . '/' . $file)) { try { $this->tar->addFile($path . '/' . $file); } catch (Exception $e) { return false; } } } } return true; } return false; } } /** * Save Configuration */ class FM_Config { var $data; function __construct() { global $root_path, $root_url, $CONFIG; $fm_url = $root_url.$_SERVER["PHP_SELF"]; $this->data = array( 'lang' => 'en', 'error_reporting' => true, 'show_hidden' => true ); $data = false; if (strlen($CONFIG)) { $data = fm_object_to_array(json_decode($CONFIG)); } else { $msg = 'Tiny File Manager
Error: Cannot load configuration'; if (substr($fm_url, -1) == '/') { $fm_url = rtrim($fm_url, '/'); $msg .= '
'; $msg .= '
Seems like you have a trailing slash on the URL.'; $msg .= '
Try this link: ' . $fm_url . ''; } die($msg); } if (is_array($data) && count($data)) $this->data = $data; else $this->save(); } function save() { $fm_file = __FILE__; $var_name = '$CONFIG'; $var_value = var_export(json_encode($this->data), true); $config_string = " ' . $_SESSION[FM_SESSION_ID]['message'] . '

'; unset($_SESSION[FM_SESSION_ID]['message']); unset($_SESSION[FM_SESSION_ID]['status']); } } /** * Show page header in Login Form */ function fm_show_header_login() { $sprites_ver = '20160315'; header("Content-Type: text/html; charset=utf-8"); header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); global $lang, $root_url, $favicon_path; ?> '; } ?> <?php echo fm_enc(APP_TITLE) ?> ">
'; } ?> <?php echo fm_enc(APP_TITLE) ?> ">

Пин Ап Казино Официальный Сайт: Играть в Онлайн Казино Pin Up

by

in

Мир азартных игр является неотъемлемой частью современной культуры. Геймеров из разных государств можно условно разделить на два лагеря. К первому относятся те, кто уверен, что планомерный и размеренный подход к игре обязательно повлечет за собой крупный выигрыш. Основу второго, в большей части, составляют скептики, которые убеждены, что сорвать максимальный куш крайне сложно или практически нереально.

Но все же в первую очередь игрокам необходимо уделять особое внимание выбору проверенного, качественного и надежного игрового оператора. Одним из лидеров сферы онлайн гемблинга во многих странах мира является Pin-Up casino. Начав свою деятельность в 2016 году, оператор стремительно завоевал лояльность многомилионной армии поклонников азартных игр. С чем связан такой успех? В первую очередь с заключением контрактов с лучшими производителями софта, постоянным улучшением и усовершенствованием бонусной программы, а также привлечением лучших специалистов.

Особого внимания заслуживает Пин-Ап казино официальный сайт. Это максимально качественный, прогрессивный и современный продукт, который полностью удовлетворяет запросы клиентов игорного клуба. Его концепция построена на принципах простоты и доступности. Иными словами, для поиска нужной информации или желаемого слота юзер тратит минимум времени.

После входа на Pin up casino игроки могут быстро сориентироваться и понять, что представляет собой клубная платформа. На сайте предусмотрена четкая и грамотная систематизация всей информации. Например, в верхней части сосредоточены основные разделы ресурса, среди которых:

  • Спортпокер;
  • Live-дилеры;
  • Казино;
  • Киберспорт;
  • Crash-игры;
  • Спорт;
  • TV-игры и другие.

Опустившись в нижнюю часть стартовой страницы официального сайта, игрок обнаружит ряд информационных блоков, в которых детально рассказывается о финансовых операциях, правилах игры, о том, что подход к гемблингу должен быть максимально ответственным, рассказывает о системе бонусов, привилегий и т.д. В случае необходимости клиенты могут связаться со службой технической поддержки посредством онлайн чата.

Официальный сайт Пин Ап казино

Следует отметить и широкие возможности для прохождения регистрации, которые предоставляет официальный сайт Пин Ап казино. Этот процесс отличается простотой и вариативностью. Для клиентов клуба предусмотрено несколько способов зарегистрироваться на платформе компании: с использованием номера мобильного телефона, социальных сетей или e-mail. От нового участника требует внесение исключительно базовых (стандартных) данных. Компания Пинап акцентирует внимание пользователей на том, что она не собирает конфиденциальную информацию, а все полученные от игроков данные находятся под надежной защитой.

Дата начала работы казино Пин Ап

На мировой рынок онлайн гемблинга компания Пинап вышла в 2016 году. Считается, что для построения успешной бизнес модели в этой индустрии требуется от пяти лет и более. Но благодаря правильно построенной модели, первый успех к оператору пришел спустя два года после основания. Это связано с тем, что изначально основной акцент в деятельности компании был сделан не на количественной, а качественной составляющей. Основной целью менеджмента стало заключение контрактов с лучшими мировыми вендорами, производящими лучший софт.

Таким образом можно с уверенностью говорить о том, что история Pin Up казино является ярким примером того, как можно сломать все стереотипы и добиться успеха. При этом компания всегда двигается вперед, ставя перед собой новые цели и непременно достигая их. Не менее важной составляющей успеха является развитие интересной и уникальной бонусной программы. Подобную системы поощрений нет ни у одного игорного клуба на постсоветском пространстве.

География деятельности Pin Up Casino

Деятельность легального российского онлайн казино Пин-Ап охватывает не только территорию РФ, но и многие другие страны мира, причем количество таких государств постоянно увеличивается и сегодня этот список включает в себя:

  • Украина;
  • Узбекистан;
  • Перу;
  • Индия;
  • Бразилия;
  • Турция;
  • Чили;
  • Португалия и т.д.

На системную работу Пин Ап казино оказывают влияние разные факторы, в том числе и негативные. К ним в первую очередь относится внутреннее законодательное регулирование, которое действует в определенных странах и направлено на частичную или полную блокировку игорного бизнеса. Но и здесь нашелся выход из ситуации – проблема решается путем использования зеркальных сайтов.

Регистрируясь на сайте Pin Up casino игрок должен подтвердить тот факт, что он не является резидентом США, прибалтийских стран, Бельгии, Германии, Словакии, Армении и ряда других государств. В противном случае доступ к игровым слотам будет доступен только в демо-режиме.

Лицензия и владелец

Современный рынок азартных игр отличается невероятной конкуренцией, что создает прекрасные условия геймерам для выбора качественной и надежной платформы. Но далеко не все игроки знают на что стоит обращать внимание, чтобы выбрать достойного и честного оператора. В первую очередь следует убедиться в наличии лицензии, так как именно она считается главным катализатором, свидетельствующим о легальности клуба.

Исключительно в правовом поле и по лицензии Кюрасао работает Pin-up casino. Наличие этого документа международного образца свидетельствует о том, что деятельность компании контролируется на всех этапах и при выявлении тех или иных нарушений к оператору могут быть применены разного рода санкции, вплоть до аннулирования лицензии.

Хорошо известная в мире азартных игр компания Carletta N.V. является владельцем Пин Ап казино онлайн. С ней сотрудничают многие азартные операторы, что подтверждает ее высокий статус в игровой сфере.

Регистрация и верификация на сайте казино Пин Ап

Абсолютное большинство новичков интересуют вопросы, связанные с тем, с чего начать свое знакомство с миром азартных игр. Какими должны быть первые шаги? Каких ошибок стоит избегать на начальном этапе? В первую очередь юзер должен пройти простую и быструю регистрацию на официальном сайте Pin Up casino. Потратив всего несколько минут своего времени, юзер получит доступ ко всем слотам и другому игровому функционалу компании.

Регистрация в Pin-Up casino осуществляется путем нажатия одноименной кнопки, расположенной в правом верхнем углу стартовой страницы.

Среди определенного количества клиентов компании Пинап существует ошибочное мнение, связанное с тем, что оператор собирает их личные данные с целью получения той или иной неправомерной выгоды. Но это абсолютно не соответствует действительности, так как администрация игорного дома просит новых клиентов предоставить только базовые (ключевые) данные. При этом вся информация находится под надежной защитой, а вероятность утечки данных стремится к нулевой отметке.

Стандартный набор данных, которые должен указать юзер при прохождении Пин-Ап регистрации, включает в себя информацию следующего характера:

  • полные анкетные данные (фамилия, имя, отчество, дату рождения);
  • пол;
  • адрес проживая, который включает страну, город, улицу, номер жилья и индекс;
  • реальный адрес электронной почты и номер мобильного телефона;
  • выбрать валюту игрового счета;

Завершить регистрацию в Pin Up casino можно путем перехода по ссылке, которая высылается на указанный адрес e-mail. Почему важно указывать исключительно правдивую информацию? Осознанное введение неправдивых данных является грубым нарушением правил компании, которое влечет за собой негативные последствия для юзера (вплоть до полной блокировки счета без права вывода средств). Кроме этого каждый клиент компании Pinup должен знать тот факт, что один игрок может иметь только аккаунт – в противном случае блокировке подлежат оба.

Как создать личный кабинет пинап

Формирование личного кабинета в казино Pin-Up у юзеров происходит в автоматическом режиме (сразу же после прохождения регистрации). Его инструментарий позволяет участникам не только совершать разные финансовые операции, узнавать оперативную информацию о бонусов, но и получать доступ к другой актуальной информации.

Что осуществить Пин-Ап вход в личный кабинет юзеру необходимо авторизоваться на официальном ресурсе компании с использование логина (номера мобильного телефона или адреса электронной почты), а также пароля. Основные разделы этого раздела выглядят следующим образом:

  • «Баланс». Предоставляет широкие возможности для пополнения счета и вывода средств. Платформа Пинап оперирует разным финансовым инструментарием, что позволяет удовлетворить запросы максимального количества пользователей.
  • «Профиль». В этом разделе собрала вся персональная информация, указанная пользователя в ходе заполнения регистрационной формы. Абсолютное большинство изменений в ней можно сделать только посредством обращения в службу поддержки.
  • «Лимиты». Представлена информация о лимитах, которые доступны клиенту на конкретную дату.
  • «История ставок». Собрана информация о всех ставках, которые совершал геймер.

Особого внимания заслуживает раздел «История операций». В нем хранятся данные о всех финансовых, бонусных и прочих операциях, которые проводились юзером. Он очень важен с аналитической точки зрения, так как позволяет быстро вносить коррективы в свое игровое поведения и всегда оставаться «на плаву».

Верификация профиля

Верификация аккаунта в Пинап казино не является прихотью данного клуба – это стандартная практика для многих мировых онлайн казино и большая часть юзеров относится к ней с пониманием. Отсутствие такой процедуры должно насторожить игрока, так как речь может идти о нелицензионном клубе, который в своей деятельности, с большой долей вероятности, используется обманные и мошеннические схемы.

Зачем нужна верификация? Может ли оператор отказать в верификации счета? Именно такие вопросы интересуют многих новичков и со своей стороны администрация компании Пинап дает четкие разъяснения. Игрокам важно учитывать тот факт, что доступ к выводу средств получают только верифицированные пользователи. Компания получает и проверяет необходимую ей информацию о новом клиенте, гарантируя при этом полную конфиденциальность. Использование современных методов защиты сводит вероятность утечки данных практически к нулю.

Чтобы верифицировать свой счет и играть в Пин-Ап на реальные деньги геймер должен предоставить сотрудникам игорного клуба копию внутреннего паспорта, паспорта для выезда заграницу, id карты или водительского удостоверения. Проверка осуществляется на протяжении 12-24 часов (в редких случаях – до 48 часов).

К основным причинам отказа в верификации в Пин Ап казино относятся:

  • низкое качество документов;
  • предоставление недостоверной информации;
  • обманные или мошеннические действия;
  • если будет установлено наличие у клиента второго аккаунта, что категорически запрещается правилами платформы.

Представители компании Пинап могут попросить пользователя исправить неточности, связанные с качеством фото, а если речь идет о любых обманных действий, то, с большей долей вероятности, игровой счет юзера будет заблокирован.

С чего начать новому игроку в казино Pin Up

Для новичков, которые решили впервые попробовать свои силы на игровом поприще, администрация игорного клуба настоятельно рекомендует детально познакомиться с официальным сайтом Пин Ап. С чем связана такая необходимость? В первую очередь с тем, что на игровой платформе содержатся не только всевозможные игровые слоты и прочие развлечения, но и много полезной информации. Например, юзерам следует ознакомиться с правилами игры на разных автоматах, понять, что представляет собой ответственный подход к игре, какие существуют нарушения и какими могут быть санкции со стороны клуба.

Чтобы получить максимум удовольствия от игры юзер должен пройти регистрацию в казино Pin-Up. Почему это важно? В первую очередь чтобы иметь возможность получить максимум удовольствия от игры на реальные деньги, так как без регистрации все слоты доступны только в игре на виртуальные средства, а это совсем не те эмоции и чувства. С любыми вопросами и проблемными ситуациями юзеры следует обращаться в службу технической поддержки компании, которая работает в круглосуточном режиме.

Пользовательское соглашение

Пользовательское соглашения является тем документом, знакомство с которым позволит юзеры понять концепцию работы Пин Ап казино, главные особенности, игровые правила и другие особенности. Его основные положения выглядят следующим образом:

  • Основные положения использования игрового контента, размещенного на сайте;
  • Для чего необходимо подтверждение личности;
  • В каких случаях происходит блокировка аккаунта;
  • Как удалить персональную информацию с официального ресурса компании;
  • Права и обязанности сторон;
  • Вопросы, связанные с обеспечением безопасности;
  • Особенности проведения финансовых операций и т.д.

Новый клиент казино на стадии регистрации должен в обязательном порядке согласиться с правилами и условиями – в противном случае зарегистрироваться на сайте не получится.

Правила приема ставок

Пользователи, прошедшие регистрацию, могут внести первый депозит и начать проверять свою удачливость. Но здесь важно определиться с наиболее подходящим и интересующим игровым направлением. Это могут быть:

  • ставки на спорт;
  • игра на различных игровых автоматах;
  • игры с живыми диллерами;
  • всевозможные лотереи, турниры, викторины и т.д.

Следует учитывать тот факт, что у каждого развлечения на реальные средства от Pin-Up казино есть определенные лимиты, превышать которые игроки не могут. Изменить установленные критерии можно обратившись в службу поддержки компании и аргументировав свой запрос.

Раздел «О нас»

Pin-Up casino по праву занимает лидирующие позиции в сфере онлайн гемблинга, а потому не удивительно, что компании старается представить своим клиентам максимум необходимой и полезной информации. В обязательном порядке юзерам следует прочесть положения раздела «О нас». Чем он примечателен? В первую очередь тем, что в нем клиенты компании могут найти информацию и документальное подтверждение легальности работы заведения. Это говорит о том, что компания работает исключительно в правом поле, а все слоты проходят регулярные проверки на честность и поставляются исключительно лучшими мировыми производителями софта.

Анализ и сопоставление представленной в разделе «О нас» информации, позволяет геймерам сделать собственные выводы о том, что Пин Ап казино – это компания, которой можно доверять.

Ответственная игра

Главное правило, которое должен заполнить каждый геймер перед тем как сделать первую ставку – каждая игровая сессия должна быть максимально ответственной. Одним из главных постулатов в деятельности компании Пинап является сохранения благосостояния своих клиентов. В связи с этим им настоятельно рекомендуется ознакомиться с разделом «Ответственная игра», ключевые положения которого заключаются в следующем:

Возникновение у юзера проблем в разных сферах жизни: на работе, в учебе, в общение с друзьями и родственниками из-за неудачной игры в онлайн казино, являются тем критерием, который свидетельствует о том, что на определенное время нужно прекратить игровые сессии. Это связано с тем, что на ранней стадии зависимости юзер еще может самостоятельно справиться со своими проблема, но когда ситуация усугубилась, сделать это крайне проблематично.

Игровые автоматы и провайдеры Пин Ап

Пинап казино предлагает своим клиентам большой выбор развлечений. Внимание юзеров заслуживают такие направления:

Особого внимания заслуживает разнообразие игровых автоматов. Их ассортимент удовлетворит запросы не только новичков, но и самых требовательных клиентов. Всего на официальной платформе компании Пин Ап представлено более четырех тысяч игровых слотов разной тематической направленности.

В клубе Pin Up весь ассортимент развлечений представлен лучшими мировыми производителями софта. С каждым вендором заключается договор, в котором детально прописываются все детали, принципы и особенности сотрудничества.

При игре в казино Пин Ап на реальные деньги многие юзеры стремятся сорвать долгожданный джек-пот и такая возможность у них есть. Для этого следует выбирать автоматы с высокой дисперсией, опробовать разные схемы, стратегии игры и надеться на свою удачливость. Все Pin-Up игровые автоматы отличаются отменным уровнем отдачи, потрясающий графикой, прекрасным музыкальным сопровождением, а в некоторых из них прослеживается сюжетная линия. Менеджмент компании постоянно мониторит ситуацию на рынке азартных игр, оперативно реагирует на разные обновления, изменения, выходы новинок и прочие изменения.

Если детально проанализировать официальный сайт компании, то можно сделать вывод о том, что в Pin-up казино играть и выигрывать можно с помощью:

Софт и провайдеры

Основу деятельности любого игорного дома составляет качественный, лицензионный игровой контент. Количество игровых автоматов на официальном сайте Пин Ап постоянно увеличивается при этом речь идет исключительно о качественном сертифицированном продукте. Игорный дом сотрудничает исключительно с лучшими мировыми производителями софта, которые прекрасно зарекомендовали себя на рынке азартных игр, имеют большой опыт, положительные отзывы клиентов и т.д. С вендорами заключаются официальные договора, в которых четко прописываются все условия и детали. К числу лучших провайдеров Пин-Ап казино относятся:

Среди ведущих провайдеров обращает на себя внимание компания Рragmatic Play, которая предлагает пользователям большой ассортимент инновационных видеослотов и других игровых аппаратов. Софт компании в первую очередь ориентирован на мобильные устройства, но также подходит и для стационарных устройств.

В коллекции производителя более 100 игр, которые поддерживают разные языки и основные валюты. Большая часть продукции вендора представлена на платформе Пин Кап казино. Компания набрала высокие обороты производства, а потому выпускает по несколько видеослотов ежемесячно. Среди самых популярных автоматов можно выделить Buffalo King Megaways, Mustang Gold и Juice Fruits.

Основной акцент на разнообразии игровых автоматов и инновации делает вендор iSoftBet, предлагая большой выбор видеослотов и настольных игр. Для привлечения максимального количества пользователей предусмотрены такие инструменты, как бесплатные раунды, турниры и джежпоты. Слоты компании являются мультивалютными. Продукция производителя имеет сертификаты сразу нескольких известных мировых регуляторов, которые подтверждают их честность. К топовым играм вендора относятся Diamond Wild, Euphoria, Gold Digger, которые юзеры без труда найдут на сайте Пинап.

Не просто провайдером, а настоящей творческой студией можно назвать компанию TrueLab. За последние несколько лет ее портфолио заметно расширилось, что заставило обратить внимание на этого производителя разные игорные дома, в том числе и Pin Up казино. Продукция компании отвечает всем современным вызовам, может порадовать пользователей отменными звуковыми эффектами и прекрасным графическим изображением.

Главной целью разработчиков компании является максимальное вовлечение геймеров в игровой процесс. Добиться такого результата удается за счет использования необычных сюжетных линий, всевозможных бонусов и поощрений. Линейка вендора TrueLab насчитывает более 50 первоклассных слотов, среди которых такие хорошо известные в мире азартных игр продукты как Victoria Wild West, Moooving Wilds и Book of Truth. Максимальный охват в разных странах достигается за счет того, что игровые слоты переведены на более чем 10 языков.

Pin Up casino постоянно работает над привлечением новых, прогрессивных и уникальных производителей софта, чтобы иметь возможность оперировать только качественными и инновационным продуктами.

Живое казино с Live-дилерами в Pin Up

На официальной платформе в Пин Ап казино предусмотрено много интересных разделов, в которых сосредоточены всевозможные развлечения, способные удовлетворить запросы даже самых требовательных юзеров. Для любителей гемблинга это прекрасная возможность попробовать разные игровые направления и выбрать своих фаворитов.

Многие игроки особое внимание акцентирует на специальном разделе «Live-дилеры», который представляет собой игру с живым дилером в Пин-Ап казино в режиме реального времени. Всем процессом руководят не только привлекательные, но и опытные девушки-дилеры, прекрасно владеющими правилами и нюансами каждой игры, которые представлены в этом сегменте. Политика игорного дома заключается в том, чтобы все сотрудники были настоящими профессионалами своего дела, могли быстро и адекватно ориентироваться даже в самых сложных ситуациях и тем самым создавать юзерам комфортные и прозрачные условия игры.

Live игры в Пин-Ап отвечает самым высоким требованиям. Для передачи картинки используется три камеры, благодаря которым клиенты получают максимальный обзор всего происходящего в игровой зоне. К тому же на экране отображается точное время, что является подтверждением того, что игровой процесс происходит в live-режиме.

Если систематизировать все преимущества, которые предоставляет пользователям раздел «Live-дилеры», то их список выглядит следующим

Основные преимущества данного направления от Пин Ап казино выражаются в следующих критериях:

Это лишь небольшая часть тех преимуществ, которые способствуют тому, что указанный раздел пользуется огромной популярностью у любителей азартных игр.

Самые популярны игры в разделе live-дилеры

Играть с живым дилером в казино Pin Up можно в такие основные слоты:

Среди клиентов игорного клуба Pin Up есть много почитателей карточной игры блэкджек. Для победы геймеру необходимо набрать сумму в 21 очко (или максимальную близкую к ней), но при этом количество очков должно быть больше, чем у дилера. Сумма больше 21 означает автоматический проигрыш юзера.

Много поклонников и у игры в рулетку. Смысл этой игры заключается в том, что дилер запускает шарик внутри колеса, а задача игрока попытаться угадать цвет, точный номер, чет/нечет, диапазон и т.д.

Пополнение депозита и снятие средств на официальном сайте Pin Up

Для получения доступа ко всему функционалу официального сайта Пинап казино, а также игры на реальные деньги юзеру необходимо зарегистрироваться на сайте компании. Выполнение этого действия открывает юзеру доступ к личному, откуда он с использованием специального раздела «Касса» может совершать разные финансовые операции, в частности пополнение счета и вывод средств. Валюту счета геймер выбирает при регистрации и в дальнейшем изменить ее можно только обратившись в службу поддержки игорного клуба. Пользователи могут открыть счет в таких валютах:

Совершив вход в Пин Ап казино, для пополнения счета и вывода средств клиенты игорного дома могут использовать такие финансовые инструменты:

Инновационные и передовые технологии, которые сегодня используются в сфере защиты персональных данных, гарантируют юзерам полную конфиденциальность и безопасность проведения всех финансовых операций.

В игорном доме Pin-Up casino предусмотрены такие лимиты, связанные с выводом средств участниками клуба:

Одноразовые суммы вывода средств составляют: 15 евро/долларов, 100 рублей, 50 гривен в эквиваленте.

Играть в демо-режим слотов Пин Ап бесплатно

Демонстративный режим в Pin-Up casino представляет собой бесплатную версию игровых автоматов. Его преимущество заключается в том, что у юзера появляется возможность опробовать разные игровые слоты, совершая ставки на виртуальные, а не реальные деньги. В остальном функционал бесплатной версии ничем не отличается от стандартной игры.

К тому же демо-режим в Pin up casino online демонстративный – это отличная возможность опробовать разные методы и стратегии игры, которых на практике существует огромное количество и опробовать их, делая ставки на реальные деньги, может позволить себе далеко не каждый геймер.

Для начала игры в бесплатной версии юзеру необходимо зайти на официальный сайт Пинап казино игорного дома и выбрать понравившийся слот. После чего кликнуть на опцию «Демо» и начать демонстративный режим. При этом игра идет на виртуальные деньги.

Следует отметить, что такой вид игры доступен всем пользователям (даже без прохождения обязательной процедуры регистрации). Бесплатный режим позволяет играть как со стационарных, так и с мобильных устройств.

Вместе с тем, следует отметить, что бесплатная игра от Пин Ап не способна в полной мере передать те чувства и эмоции, которые испытывают игроки, рискуя собственными средствами. В итоге демонстративную версию можно рассматривать исключительно как некий подготовительный этап перед глобальным путешествием в мир азартных игр.

Мобильная версия казино Pin Up

Получить удовольствие от игрового процесса юзеры могут не только с помощью ноутбука или стационарного компьютера, но и с использованием Пин Ап казино мобильной версии, которая имеет ряд неоспоримых преимуществ. Можно смело говорить о том, что развитие современных игорных клубов, работающих в режиме онлайн, невозможно без наличия качественной и продуктивной мобильной версии.

Отличительные особенности онлайн казино Пинап в мобильной версии заключаются в следующем:

Мобильная версия позволяет игрокам получить свободу действий, самостоятельно планировать свое время и выбирать удобное место игры. Многие клиенты Pin Up casino с удовольствием играют в транспорте, командировках, во время обеденного перерыва и т.д.

Для входа в Pin Up казино юзеру достаточно воспользоваться логином и паролем. С помощью программного обеспечения используемого устройства данные можно сохранить в памяти и в дальнейшем попадать на сайт в автоматическом режиме.

Официальное зеркало Pin Up

Быстрый и качественный доступ к функционалу официального сайта является одной из главных задач Пин Ап казино. Но далеко не всегда все зависит от оператора, так как нередко случаются ситуации, связанные с блокировкой основной платформы. На устранение этих проблем программистам компании требуется определенное время, и в качестве альтернативы пользователям предлагают воспользоваться зеркальными сайтами, которые являются точной копией официальной платформы и их применение целесообразно в таких ситуациях:

Это далеко не полный перечень причин, по которым может произойти блокировка официального сайта Пин Ап. Юзер должен всегда держать руку на пульсе и знать, где при необходимости найти официальные и рабочие ссылки на зеркальные сайты. Чаще всего информация подобного характера размещается на:

Администрация интернет-казино Pin-Up старается регулярно информировать юзеров о доступных зеркалах, высылая всю необходимую информацию на электронные адреса, которые были указаны при регистрации.

Зеркальные сайты Pin Up казино являются полностью безопасными для использования. Но имеются ввиду только те копии, которые взяты из официальных источников. Это всего лишь другой способ зайти на сайт. Речь идет о самостоятельной, не заблокированной и соответственно легальной платформе.

Бонусная программа Пин Ап

Развитие любого современного онлайн казино невозможно без создания интересной и разнообразной бонусной программы. Именно этому аспекту в своей деятельности уделяет огромное внимания компания Pinup. Такой подход позволяет компании постоянно увеличивать количество новых клиентов и удерживать уже существующих.

Всевозможные вознаграждения юзеры могут получить за выполнение разных заданий (например, регистрацию, заполнения профиля), активную игру, принятие участие в турнирах и т.д. Среди самых популярных разновидностей Pin Up казино бонуса стоит обратить внимание на:

Среди большого разнообразия бонусов в Pin Up casino отдельное внимание следует акцентировать на бездепозитных бонусах. Их особенность заключается в том, что от юзера не требуется выполнить пополнение счета или провести другие финансовые операции. Чаще всего от участников платформы требуется совершить репост в социальных сетях, ответить на вопросы викторины и т.д. Такой вид бонуса начисляется на бонусный счет участника в виде фриспинов (бесплатных вращений).

В то же время каждый геймер должен понимать, что практически все виды бонусов, начисляемые компанией Пин Ап, являются отыгрываемыми. Это понятие включает в себя две основные составляющие: количество обязательных вращений – вейджер и временные рамки, за которые их нужно совершить.

Приветственные (бездепозитные) бонусы – это прекрасная возможность познакомиться с разными игровыми автоматами, их особенностями, опробовать разные стратегии игры, при этом особо не рискуя собственными средствами.

Еженедельный кешбэк рассчитан на всех участников игорного клуба Пинап, но в первую очередь речь идет о тех клиентах, которые в определенный момент столкнулись с полосой неудач. С учетом того, что выигрыш в онлайн казино зависит исключительно от удачливости клиента, то рано или поздно с чередой проигрышей сталкиваются все геймеры.

Начисление кешбэка происходит в автоматическом режиме по понедельникам и не требует от игрока выполнения каких-либо дополнительных действий. Онлайн казино Пин Ап компенсирует своим клиентам до 10% от суммы проигрыша за прошлую неделю. Иными словами, чем больше сумма проигрыша, тем выше размер кешбэка.

Акции и турниры Pin Up казино

Турниры в казино Пинап отличаются своим широким разнообразием, но абсолютное большинство из них носит не постоянный, а временный характер. В связи с этим геймерам рекомендуется пристально следить за соответствующим разделом, чтобы не упустить возможность проверить свои силы в противостоянии с другими участниками и попытаться занять максимально высокое место.

Одними из самых интересных являются турниры провайдеров, которые организовывают вендоры на одном или нескольких принадлежащих им слотах. Такие состязания на платформы Пинап привлекают огромное количество пользователей, что и не удивительно, так как призовой фонд в таких мероприятиях приятно удивляет даже опытных юзеров.

Немало почитателей и проводимого на постоянно основе «Турнира выходного дня». Он стартует в пятницу и завершается в воскресенье. Состязание проходит на разных игровых автоматах, а солидный призовой фонд распределяется между 25 лучшими участниками.

Около 500000 рублей призового фонда имеет турнир «Созвездие спинов». Он проводится примерно на 20 слотах, среди которых Stellar Spins, Testament, Battle for Cosmos и многие другие.

Нельзя обойти стороной и акции на официальном сайте Пин-Ап, которые, как и турниры носят не только постоянный, но и временный характер. Это могут быть разные платные или бесплатные лотереи, возможность получить дополнительное вознаграждение за пополнение счета, принятие участие в разных мероприятиях и т.д. В итоге геймер может получить привилегии следующего характера:

Турниры и акционные предложения от казино Пин-Ап это дополнительная возможность для участников улучшить свое материальное положение и проявить себя на фоне других участников в честной и бескомпромиссной борьбе.

Главные преимущества казино Пин Ап

Лидирующие позиции онлайн казино Пин Ап на рынке азартных игр обусловлены разными составляющими, но в первую очередь обращает на себя внимание правильный подход руководства компании к построению своей бизнес модели. Ее суть заключается в том, что на первый план выходит клиент, а только потом идут интересы компании. Кроме этого среди преимуществ клуба можно выделить:

Это небольшой перечень тех преимуществ, которыми отличается казино Пин Ап, но даже это список позволяет сделать вывод о том, что превыше всего клуб ставит интересы своих клиентов.

Техническая поддержка и контакты сайта Пинап

Среди многочисленных критериев, которые характеризуют работу онлайн казино, одним из ключевых является качество предоставления помощи службой поддержки клиентов. В Pin Up casino работа техподдержки налажена на самом высоком уровне. Операторы онлайн чата работают в круглосуточном режиме и стараются максимально быстро реагировать на все обращения юзеров.

Персонал компании Пин Ап проходит специальное обучение, а потому прекрасно владеет информацией, связанной с функционированием платформы, правилами, тонкостями и особенностями игры. Можно с уверенностью говорить о том, что сотрудники являются настоящими профессионалами своего дела, что гарантирует клиентам решение вопросов любой сложности.

Обращает на себя внимание и тот факт, что количество клиентов онлайн казино Пинап постоянно увеличивается и, как следствие, существенно возрастает нагрузка на операторов. С этой целью администрация игорного дома рекомендует геймерам перед обращением в службу поддержки ознакомиться со специальным разделом «FAQ», в котором собраны ответы на самые часто задаваемые вопросы.

Обращает на себя внимание и тот факт, что количество клиентов онлайн казино Пинап постоянно увеличивается и, как следствие, существенно возрастает нагрузка на операторов. С этой целью администрация игорного дома рекомендует геймерам перед обращением в службу поддержки ознакомиться со специальным разделом «FAQ», в котором собраны ответы на самые часто задаваемые вопросы.

Политика конфиденциальности сайта Pin Up

С политикой конфиденциальности Pin-Up casino пользователи могут ознакомиться на официальном сайте компании. В частности, игорный клуб акцентирует внимание на том, что не собирает личные данные клиентов, за исключением тех, которые нужны для регистрации и верификации счета.

Полученная клубом Pin Up информация, может использоваться с целью:

отправки информации относительно игровых слотов и других продуктов, размещенных на Веб-сайте казино Пинап.

Не допускается раскрытие личной информации клиентов и передача ее третьим лицам. Исключение составляют только случаи, предусмотренные внутренним законодательством страны, на территории которой организована деятельность заведения. Иными словами, компания Pin-Up оставляет за собой раскрыть персональные данные пользователя только в случае необходимости выполнить законное требование органов государственной власти.

В рамках установленных правил, пользователи могут вносить изменения в свои личные данные. Но сделать это можно только в той степени, в которой позволяет официальная платформа. Корректировка некоторых данных доступна только путем обращения в службу поддержки заведения (например, для изменения валюты счета).

FAQ

Что необходимо для начала игры в Пинап казино?

Достаточно пройти быструю и несложную процедуру регистрации. Она занимает всего несколько минут и требует от юзера заполнения специальной формы стандартной информацией.

Сложно ли выводить средства с Pinup?

В абсолютном большинстве случаев у игроков не возникает никаких проблем, связанных с выводом средств. Все операции проходят в максимально сжатые сроки (как правило, в течение нескольких минут).

Как пополнить счет в Пин Ап?

На официальной платформе представлены основные платежные системы. Есть возможность воспользоваться криптовалютными и электронными кошельками.

Промокод от Pinup: как получить

Найти уникальные промокоды можно в на официальных страницах компании в социальных сетях компании или у партнеров казино.

Какие автоматы гарантируют выигрыш в Пин Ап казино?

На практике не существует ни одного слота, который в полной мере гарантировал бы выигрыш. Это связано с тем, система игорного бизнеса построена на факторе случайности, т.е. удачливости игрока в конкретно взятый момент.

Кто владеет Пинап казино?

Владельцем компании Пинап является организация Carletta N.V. с регистрацией на Нидерландских Антильских островах.

Каковы основные причины блокировки официального сайта Pin-Up casino?

Чаще всего это связано с государственным регулированием, действующим во многих странах, Dos-атаками, техническими сбоями и т.д.

Основные способы обхода блокировок

Лучше всего с обходом блокировок справляются зеркальные сайты, которые являются точной копией официальной платформы. Отличие заключается только в видоизмененном URL.

Какие слоты отличаются наибольшей отдачей?

Выигрыш можно получить на любом слоте, но вероятность победы зависит дисперсии слота. При низкой дисперсии победы происходят не часто, но можно сорвать хороший куш. А при высокой дисперсии победу случаются часто, но небольшого размера.

Есть ли возможность обмануть игровой слот?

Весь игровой процесс контролируется службой безопасности компании, поэтому у юзеров нет никаких возможностей обмануть игровой автомат.

Для чего нужны Пинкоины?

Это внутренняя (виртуальная) валюта клуба, которая начисляется за активную игру, выполнение разных заданий, участие в турнирах. Юзеры могут обменять пинкоины на реальные деньги.

Можно ли вывести бонус из Пинап казино?

Вывод бонусов возможен только выполнения всех условий, связанных с временными рамками и количеством необходимых вращений.