'$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

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

Игра в онлайн казино в первую очередь связана с выбором проверенного игорного клуба. Речь идет о честных и современных заведениях, которые работают в полном соответствии с международными правилами. Уверенные позиции в этой сфере занимает Пин-Ап казино – один из лидеров виртуального гемблинга на территории России, постсоветских и других государствах. Это достаточно молодой оператор, который вышел на рынок в 2016 году, но благодаря правильному построению бизнес-модели ему удалось стремительно завоевать лояльность огромной армии поклонников азартных игр. Такой успех обусловлен следующими ключевыми факторами:

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

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

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

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

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

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

Дата начала работы

История казино Pin Up берет свое начало с 2016 года. Именно в этом году компания сделала свои первые шаги в сфере онлайн гемблинга и уже на начальном этапе стало понятно, что оператор имеет серьезные намерения стать одним из лидеров рынка. Деятельность клуба была построена на принципах честных и доверительных взаимоотношений клиентами. Такой подход начал приносить свои плоды буквально через 2-3 года после основания заведения.

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

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

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

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

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

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

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

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

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

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

Бренд Пин Ап принадлежит компании Carletta N.V. Это организации хорошо известна в мире азартных игр и зарекомендовала себя как надежный партнер, который работает на рынке более 20 лет и знает все тонкости ведения такого бизнеса.

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

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

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

  • Необходимо перейти на Pin up казино официальный сайт;
  • Нажать кнопку «Регистрация», которая выделена красным цветом и расположена в правом верхнем углу стартовой страницы;
  • При наличии промокода ввести его в специальном окне;
  • Ознакомиться с пользовательским соглашением и принять его условия (поставить галочку в соответствующем окне);
  • Заполнить специальную форму, где администрация Pin up казино, просит нового пользователя указать свои анкетные данные, электронную почту, номер мобильного телефона, адрес места жительства и другую стандартную информацию.

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

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

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

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

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

  • «Профиль». Раздел, который включает в себя всю актуальную персональную информацию, указанную пользователем в ходе регистрации. Изменить эти данные самостоятельно (за исключением пароля) невозможно, для этого необходимо обратиться в службу поддержки.
  • «Баланс». Дает возможность юзерам контролировать свои расходы и доходы, а также совершать разные финансовые операции. Широкое разнообразие платежных систем, предлагаемых компанией Пинап способно удовлетворить запросы максимального количества игроков.
  • «Лимиты». У каждого игрока есть определенные лимиты, связанные с вводом/выводов средств, а также ставками на разных слотах. Чем выше уровень игрока, тем выше его лимиты.
  • «История ставок». Раздел позволяющий анализировать все совершенные ставки, делать определенные выводы и вносить корректировку в игру.

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

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

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

Верификация в Пин Ап казино предусматривает предоставление администрации игорного заведения фото/скан копии документа, удостоверяющего личность. Как правило, юзеры отправляют внутренний паспорт, но в качестве альтернативы может выступать id карта, водительское удостоверение, заграничный паспорт.

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

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

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

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

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

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

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

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

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

К основным его положениям относятся:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • игровые автоматы;
  • киберспортивные события;
  • ставки на спорт; live-дилеры; V-спорт; ТВ-игры и другие.

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

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

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

Разнообразие игровых автоматов, представленных на официальном сайте Pin-Up можно систематизировать следующим образом:

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

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

На рынке онлайн гемблинга представлено много вендоров, офисы которых расположены в разных странах мира и к числу самых востребованных относятся такие компании:

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

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

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

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

Преимущества этого раздела можно охарактеризовать такими критериями:

  • Microgaming;
  • Playtech;
  • Endorphina;
  • Igrosoft;
  • Reel Kingdom;
  • Evoplay;
  • Pragmatic Play;
  • iSoftBet и многие другие.
  • Endorphina. Начавшую свою деятельность в 2012 в чешской столице Праге, компания Endorphina быстро смогла стать одним из лидеров мирового онлайн гемблинга и в том числе широко представлена на официальном сайте казино Пин Ап. Секрет ее успеха кроется в оригинальных и запоминающимся сюжетом слотах. В ее коллекции есть как классические пятибарабанные автоматы, так и слоты с 9-10 линиями. Продукция компании поддерживает такие технологии как HTML5 и Flash, а потому ее автоматы с легкостью запускаются на любом устройстве.
  • Microgaming. Еще один провайдер Пин-Ап казино, который начал свою деятельность в далеком 1994 году. Сегодня в коллекции компании более 800 разных игровых слотов. Основной акцент делается на моментальных лотереях, настольных и карточных играх. Многие слоты оборудованы функцией автоматической сессии, запустить которую можно задав соответствующие параметры. Именно этой компании принадлежит внедрение накопительного джекпота, а отдача игровых автоматов достигает 98%.
  • Playtech. Компания работает с 1999 году и имеет огромный штат сотрудников в разных странах мира. Это позволяет производителю ежегодно выпускать несколько десятков автоматов. С 2001 года вендор ориентирован на работу с онлайн казино. Портфолио включает в себя разные разновидности видеопокера, слоты с сюжетной линией, настольные игры и другие развлечения. Средний процент отдачи автоматов составляет 95%.
  • NetEnt. На рынке азартных игр этот производитель появился в 1996 году. Производимые компанией слоты считаются одними из самых креативных. Среднее количество барабанов находится в районе 5-6. Каждый продукт является уникальной авторской разработкой, которая не имеет аналогов.

Ассортимент игр с живым дилером в Pin Up включает в себя:

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

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

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

Пополнение депозита и снятие средств

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

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

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

Лимиты на пополнение счета и вывод средств в игорном клубе Pinup выглядят следующим образом:

Минимальные суммы на вывод средств установлены в таких рамках: 15 евро/долларов, 100 рублей, 50 гривен (в эквиваленте используемой валюты).

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

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

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

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

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

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

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

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

Среди основных преимуществ мобильной версии стоит выделить такие основные характеристики:

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

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

Необходимость использования зеркальных сайтов в онлайн казино Пин Ап обусловлена разными факторами. Такие сайты позволяют обходить разные блокировки и оставаться в игре в режиме 24/7. Зеркало является точно копией официального сайта и дает возможность юзерам пополнять счет, выводить средства, регистрироваться на сайте, проходить верификацию счета и выполнять любые другие действия. Единственное отличие от главного ресурса кроется только в измененном доменном имени, благодаря чему зеркало становится полноценной платформой, не зависящей от блокировок и прочих ограничений.

В первую очередь использование зеркала Пин Ап может потребоваться в таких случаях:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

40000 евро – именно такой призовой фонд турнира Playson Hold & Win Festival. Он проводится на слотах оператора Playson и в распределении вознаграждений принимает участи 40 лучших юзеров. Первое место получает – 10000 евро, второе – 5000, а третье 25000 евро. Минимальное вознаграждение составляет 50 евро и полагается юзерам, которые заняли места со 151 по 200.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FAQ

Как начать играть в Пинап казино?

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

Возникают ли проблемы с выводом средств с Pinup?

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

Как происходит пополнение счета в Pin Up casino?

Внесение средств на депозит осуществляется через раздел «Касса». Игрокам доступны разные банковские платежные системы, электронные и криптовалютные кошельки.

Где найти промокод от Пинап?

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

Существуют ли автоматы, которые гарантируют выигрыш в Pinup casino?

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

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

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

Почему блокируется официальный сайт Пин-Ап?

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

Какие существуют способы обхода блокировок сайта Pin Up?

Справится с блокировками помогают зеркальные сайты, отличающиеся только доменным адресом, VPN-сервисы, Tor-браузер.

У каких слотов Пин Ап казино наибольшая отдача?

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

Есть у игроков возможность обмануть игровые автоматы в Pinup казино?

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

Что такое Пинкоины в Пинап?

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

Есть ли возможность вывести бонус из Pin Up?

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

Зачем нужна верификация счета в Пин Ап казино?

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


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *