<?php
session_start();

// === Constants === //
const LANGUAGE = 'en';
const TRANSLATIONS = [
'en' => array (
  'method' => 'Unpacking method',
  'download' => 'Download file',
  'unzip_it' => 'Unzip it',
  'delete_it' => 'Delete it',
  'zip_file' => 'zip file',
  'zip_files' => 'zip files',
  'msg_found_files' => 'Found %s in this directory.',
  'msg_files_not_found' => 'There is no zip file in this directory.',
  'msg_not_zip_file' => 'This %s is not a zip file.',
  'msg_error_while_unzip' => 'Error while unzipping file %s.',
  'msg_unzip_success' => 'File %s has been unziped.',
  'msg_cannot_delete' => 'This file %s cannot be deleted.',
  'msg_error_while_delete' => 'Error while deleting file %s.',
  'msg_delete_success' => 'File %s has been deleted.',
  'msg_missing_token' => 'Missing token.',
  'msg_invalid_token' => 'Invalid token.',
  'msg_warning_files_overwrite' => 'All unzipped files will be overwritten if they already exist.',
  'msg_warning_file_delete' => 'File will be deleted permanently.',
  'msg_warning_script_delete' => 'This script file will be deleted permanently.',
  'msg_remind_to_delete' => 'Remember to delete this script when you are done.',
  'msg_are_you_sure' => 'Are you sure?',
  'msg_confirm_your_action' => 'Confirm your action.',
  'msg_action_proceed' => 'Yes, proceed it',
  'msg_action_close' => 'No, close it',
)];

// === Helpers === //
/**
 * TranslateHelper
 *
 * Helps manage translations.
 *
 * @author Robert Wierzchowski <revert@revert.pl>
 * @version 1.2.0
 */
class TranslateHelper
{
    private static $language;
    private static $defaultlanguage = 'en';
    private static $availableLanguages = ['en', 'pl', 'de', 'es', 'ru'];
    private static $translationsFileName = 'src/lang/translations.php';
    private static $translations;

    private function __construct() {}

    private static function findTranslation($key)
    {
        return (! empty(self::$translations[self::$language][$key])) ? self::$translations[self::$language][$key] : str_replace('_', ' ', ucfirst($key));
    }

    private static function setLanguageFromGet($name)
    {
        if (! empty($_GET[$name])) {
            self::$language = (in_array($_GET[$name], self::$availableLanguages)) ? $_GET[$name] : self::$defaultlanguage;
        }
    }

    private static function setLanguageFromUri()
    {
        $args = explode('/', $_SERVER['REQUEST_URI']);
        $cleanArgs = array_filter($args, function ($value) { return $value !== ''; });
        $lastArg = array_pop($cleanArgs);
        if (in_array($lastArg, self::$availableLanguages)) {
            self::$language = $lastArg;
        }
    }

    private static function setLanguageFromBrowser()
    {
        self::$availableLanguages = array_flip(self::$availableLanguages);
        $languagesWeight = [];
        preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']), $matches, PREG_SET_ORDER);
        foreach ($matches as $match) {
            list($a, $b) = explode('-', $match[1]) + ['', ''];
            $value = isset($match[2]) ? (float) $match[2] : 1.0;
            if (isset(self::$availableLanguages[$match[1]])) {
                $languagesWeight[$match[1]] = $value;
                continue;
            }
            if (isset(self::$availableLanguages[$a])) {
                $languagesWeight[$a] = $value - 0.1;
            }
        }
        if ($languagesWeight) {
            arsort($languagesWeight);
            self::$language = key($languagesWeight);
        }
    }

    private static function setLanguage()
    {
        self::setLanguageFromGet('lang');
        if (empty(self::$language)) {
            self::setLanguageFromUri();
        }
        if (empty(self::$language)) {
            self::setLanguageFromBrowser();
        }
        if (empty(self::$language)) {
            self::$language = self::$defaultlanguage;
        }
        if (! empty(LANGUAGE)) {
            self::$language = LANGUAGE;
        }
    }

    private static function readTranslations($fileName)
    {
        if (! file_exists($fileName)) {
            return false;
        }

        $extension = pathinfo($fileName, PATHINFO_EXTENSION);
        if ($extension != 'php') {
            return false;
        }

        return (include $fileName);
    }

    private static function setTranslations()
    {
        self::$translations = (! empty(TRANSLATIONS)) ? TRANSLATIONS : self::readTranslations(self::$translationsFileName);
    }

    public static function getTranslation($key)
    {
        self::setLanguage();
        self::setTranslations();
        return self::findTranslation($key);
    }

    public static function getLanguage()
    {
        self::setLanguage();
        return self::$language;
    }
}

/**
 * Get translation from translate helper function
 */
function _t($key, ...$args)
{
    $translation = TranslateHelper::getTranslation($key);
    $result = vsprintf($translation, $args);

    return $result;
}

/**
 * Get language from translate helper function
 */
function _lang()
{
    return TranslateHelper::getLanguage();
}

/**
 * Alias of htmlspecialchars helper function
 */
function _h($text)
{
    return htmlspecialchars($text, ENT_COMPAT);
}


// === Classes === //
/**
 * UnZipper
 *
 * Unzip zip files. One file server side simple unzipper with UI.
 *
 * @author Robert Wierzchowski <revert@revert.pl>
 * @version 1.2.0
 */
class UnZipper
{
    private $title = 'UnZipper';
    private $dir = './';
    private $zips = [];
    private $alertMessage;
    private $alertStatus;
    private $token;
    private $output;
    private $methods = [
        'zipArchive' => 'ZipArchive',
        'execUnzip' => 'exec unzip',
        'systemUnzip' => 'system unzip',
    ];

    public function __construct()
    {
        $this->checkIfUnZip();
        $this->checkIfDeleteFile();
        $this->setToken();
        $this->findZips();
        $this->countZips();
    }

    private function checkIfUnZip()
    {
        if (! empty($_POST['zipfile']) && $this->verifyToken($_POST['token'])) {
            $this->unZip($_POST['zipfile'], $_POST['method']);
        }
    }

    private function checkIfDeleteFile()
    {
        if (! empty($_POST['delfile']) && $this->verifyToken($_POST['token'])) {
            $this->deleteFile($_POST['delfile']);
        }
    }

    private function findZips()
    {
        $fileNames = scandir($this->dir);

        foreach ($fileNames as $fileName) {
            if ($this->checkZipFile($fileName)) {
                $this->zips[] = $fileName;
            }
        }
    }

    private function countZips()
    {
        if ($this->alertMessage) {
            return false;
        }

        $count = count($this->zips);
        if ($count) {
            $zipFile = ($count == 1) ? _t('zip_file') : _t('zip_files');
            $this->alertMessage = _t('msg_found_files', '<strong>' . $count . ' ' . $zipFile . '</strong>');
            $this->alertStatus = 'info';
        } else {
            $this->alertMessage = _t('msg_files_not_found');
            $this->alertStatus = 'warning';
        }
    }

    private function checkZipFile($fileName)
    {
        if (! file_exists($fileName)) {
            return false;
        }

        $extension = pathinfo($fileName, PATHINFO_EXTENSION);
        if ($extension != 'zip') {
            return false;
        }

        return true;
    }

    private function unZip($zip, $method = null)
    {
        if (! $this->checkZipFile($zip) || ! in_array($zip, scandir($this->dir))) {
            $this->alertMessage = _t('msg_not_zip_file', '<strong>' . $zip . '</strong>');
            $this->alertStatus = 'danger';
            return false;
        }

        switch ($method) {
            case 'execUnzip':
                $unzipResult = $this->execUnzip($zip);
                break;
            case 'systemUnzip':
                $unzipResult = $this->systemUnzip($zip);
                break;
            default:
                $unzipResult = $this->unZipArchive($zip);
        }

        if (! $unzipResult) {
            $this->alertMessage = _t('msg_error_while_unzip', '<strong>' . $zip . '</strong>');
            $this->alertStatus = 'danger';
            return false;
        }

        $this->alertMessage = _t('msg_unzip_success', '<strong>' . $zip . '</strong>');
        $this->alertStatus = 'success';

        return true;
    }

    private function unZipArchive($fileName)
    {
        $dirPath = pathinfo(realpath($fileName), PATHINFO_DIRNAME);
        $zip = new ZipArchive;
        if ($zip->open($fileName) !== true) {
            return false;
        }
        $zip->extractTo($dirPath);
        $zip->close();

        return true;
    }

    private function execUnzip($fileName)
    {
        if (! exec('unzip -o ' . $fileName, $output)) {
            return false;
        }

        $this->output = implode('<br>', $output);

        return true;
    }

    private function systemUnzip($fileName)
    {
        ob_start();
            if (! system("unzip -o {$fileName}")) {
                return false;
            }
            $this->output = nl2br(ob_get_contents());
        ob_end_clean();

        return true;
    }

    private function deleteFile($fileName)
    {
        if (! $this->checkZipFile($fileName) && $fileName != basename(__FILE__)) {
            $this->alertMessage = _t('msg_cannot_delete', '<strong>' . $fileName . '</strong>');
            $this->alertStatus = 'danger';
            return false;
        }

        if (! unlink($fileName)) {
            $this->alertMessage = _t('msg_error_while_delete', '<strong>' . $fileName . '</strong>');
            $this->alertStatus = 'danger';
            return false;
        }

        $this->alertMessage = _t('msg_delete_success', '<strong>' . $fileName . '</strong>');
        $this->alertStatus = 'success';

        return true;
    }

    private function verifyToken($inputToken)
    {
        if (empty($inputToken)) {
            $this->alertMessage = _t('msg_missing_token');
            $this->alertStatus = 'danger';
            return false;
        }

        if (! hash_equals($_SESSION['token'], $inputToken)) {
            $this->alertMessage = _t('msg_invalid_token');
            $this->alertStatus = 'danger';
            return false;
        }

        return true;
    }

    private function setToken()
    {
        $_SESSION['token'] = md5(uniqid(rand(), true)); // PHP 7 only: bin2hex(random_bytes(32));
        $this->token = $_SESSION['token'];
    }

    public function getToken()
    {
        return $this->token;
    }

    public function getZips()
    {
        return $this->zips;
    }

    public function getMessage()
    {
        return $this->alertMessage;
    }

    public function getStatus()
    {
        return $this->alertStatus;
    }

    public function getOutput()
    {
        return $this->output;
    }

    public function getScriptPath()
    {
        return $_SERVER['REQUEST_URI'] ;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function getMethods()
    {
        return $this->methods;
    }
}


// === Instances === //
$unZipper = new UnZipper();

// === Template === //
?>
<!DOCTYPE html>
<html lang="<?=_lang()?>">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><?=$unZipper->getTitle()?></title>
    <link rel="stylesheet" type="text/css" media="screen" href="https://bootswatch.com/4/lumen/bootstrap.min.css">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/all.css" integrity="sha384-3AB7yXWz4OeoZcPbieVW64vVXEwADiYyAEhwilzWsLw+9FgqpyjjStpPnpBO8o8S" crossorigin="anonymous">
    <link rel="icon" href="data:image/ico;base64,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">
    <style>
a:hover {
    text-decoration: none;
}
label {
    margin: 0;
}
.notification {
    position: absolute;
    top: 1rem;
    right: 1rem;
}
.output {
    max-height: 10rem;
    overflow: auto;
}
</style>
</head>
<body>
    <header>
        <div class="container">
            <h1 class="page-title text-center my-3">
                <a href="<?=$unZipper->getScriptPath()?>" title="<?=_h($unZipper->getTitle())?>">
                    <i class="fas fa-cube mr-1"></i>
                    <?=$unZipper->getTitle()?>
                </a>
            </h1>
        </div>
    </header>

    <section id="body">
        <div class="container">

            <div class="notification-box">
                <?php if ($unZipper->getMessage()): ?>
                    <div class="notification alert alert-dismissible fade show alert-<?=_h($unZipper->getStatus())?>">
                        <button type="button" class="close" data-dismiss="alert">&times;</button>
                        <?=$unZipper->getMessage()?>
                    </div>
                <?php endif ?>
            </div>

            <form class="form-unzip" method="POST" action="">
                <input type="hidden" name="token" value="<?=$unZipper->getToken()?>" />
                <input type="hidden" name="zipfile" value="" />
                <input type="hidden" name="delfile" value="" />

                <?php if ($unZipper->getZips()): ?>
                    <div class="form-control mb-3 d-flex justify-content-around align-items-center">
                        <strong><?=_t('method')?>:</strong>
                        <?php $i = 1; foreach ($unZipper->getMethods() as $methodKey => $methodName): ?>
                            <div class="form-check">
                                <label class="form-check-label">
                                    <input class="form-check-input" type="radio" name="method" value="<?=$methodKey?>" <?=(empty($_POST['method']) && $i == 1 || ! empty($_POST['method']) && $_POST['method'] == $methodKey) ? 'checked' : ''?> />
                                    <?=$methodName?>
                                </label>
                            </div>
                        <?php $i++; endforeach; ?>
                    </div>

                    <ul class="list-group">
                        <?php foreach ($unZipper->getZips() as $key => $zip): ?>
                            <li class="list-group-item clearfix">
                                <h2 class="text-nowrap float-left mb-0">
                                    <a href="<?=$zip?>" title="<?=_t('download')?> <?=_h($zip)?>">
                                        <i class="fas fa-file-archive mr-1"></i> <?=$zip?>
                                    </a>
                                </h2>
                                <input type="hidden" name="zipfiles[<?=$key?>]" value="<?=_h($zip)?>" />
                                <button type="submit" class="btn-unzip btn-modal btn btn-warning float-right mb-0" title="<?=_t('unzip_it')?>" data-modal-body="<?=_t('msg_warning_files_overwrite')?>">
                                    <i class="fas fa-cubes mr-1"></i>
                                    <?=_t('unzip_it')?>
                                </button>
                                <input type="hidden" name="delfiles[<?=$key?>]" value="<?=_h($zip)?>" />
                                <button type="submit" class="btn-delete btn-modal btn btn-outline-danger float-right mb-0 mr-3" title="<?=_t('delete_it')?>" data-modal-body="<?=_t('msg_warning_file_delete')?>">
                                    <i class="fas fa-trash-alt mr-1"></i>
                                    <?=_t('delete_it')?>
                                </button>
                            </li>
                        <?php endforeach ?>
                    </ul>
                <?php endif ?>

                <div class="output-box">
                    <?php if ($unZipper->getOutput()): ?>
                        <div class="output alert alert-dismissible fade show alert-warning mt-3">
                            <button type="button" class="close" data-dismiss="alert">&times;</button>
                            <?=$unZipper->getOutput()?>
                        </div>
                    <?php endif ?>
                </div>

                <div class="reminder-box mt-3 text-center">
                    <input type="hidden" name="delfiles[]" value="<?=basename(__FILE__)?>" />
                    <button type="button" class="btn-delete btn-modal btn btn-outline-warning" title="<?=_t('delete_it')?>" data-modal-body="<?=_t('msg_warning_script_delete')?>">
                        <i class="fas fa-exclamation-circle mr-1"></i>
                        <?=_t('msg_remind_to_delete')?>
                    </button>
                </div>

            </form>

        </div>
    </div>

    <div class="modal" tabindex="-1" role="dialog">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title"><?=_t('msg_are_you_sure')?></h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <?=_t('msg_confirm_your_action')?>
                </div>
                <div class="modal-footer d-flex justify-content-center">
                    <button type="button" class="btn btn-primary form-confirm"><?=_t('msg_action_proceed')?></button>
                    <button type="button" class="btn btn-secondary" data-dismiss="modal"><?=_t('msg_action_close')?></button>
                </div>
            </div>
        </div>
    </div>

    <footer class="text-center my-3">
        <div class="container">
            Made by
            <a href="http://revert.pl" title="Full-Stack Developer" target="_blank">
                Revert
            </a>
        </div>
    </footer>

    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    <script>
// Set zipfile name
$('.btn-unzip').on('click', function (e) {
    e.preventDefault();
    let zipfile = $(this).prev().val();
    $('input[name=zipfile]').val(zipfile);
    $('.form-unzip').submit();
});

// Set delfile name
$('.btn-delete').on('click', function (e) {
    e.preventDefault();
    let delfile = $(this).prev().val();
    $('input[name=delfile]').val(delfile);
    $('.form-unzip').submit();
});

// Set modal data
$('.btn-modal').on('click', function (e) {
    let title = $(this).data('modal-title');
    if (title) {
        $('.modal-title').html(title);
    }
    let body = $(this).data('modal-body');
    if (body) {
        $('.modal-body').html(body);
    }
});

// Form submit confirm with modal dialog
$('.form-unzip').submit(function(e){
    if ($(this).hasClass('confirmed')) {
        return true;
    } else {
        e.preventDefault();
        $('.modal').modal('show');
    }
});
$('.form-confirm').on('click', function (e) {
    $('.form-unzip').addClass('confirmed');
    $('.form-unzip').submit();
});
$('.modal').on('hidden.bs.modal', function (e) {
    $('input[name=zipfile]').val('');
    $('input[name=delfile]').val('');
});

// Notification auto close
let delay = 5000; // 5 s
setTimeout(function(){
    $('.notification').alert('close');
}, delay);
</script>
</body>
</html>