240 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
ini_set('display_errors', 1);
 | 
						|
ini_set('display_startup_errors', 1);
 | 
						|
error_reporting(E_ALL);
 | 
						|
ini_set("session.cache_limiter", "public");
 | 
						|
session_cache_limiter(false);
 | 
						|
session_start();
 | 
						|
if (!empty($_POST)) {
 | 
						|
    $_SESSION["save"] = $_POST;
 | 
						|
 | 
						|
    $file = $_SERVER["PHP_SELF"];
 | 
						|
    if (!empty($_SERVER["QUERY_STRING"])) {
 | 
						|
        $fichierActuel .= "?" . $_SERVER["QUERY_STRING"];
 | 
						|
    }
 | 
						|
 | 
						|
    header("Location: " . $file);
 | 
						|
    exit();
 | 
						|
}
 | 
						|
 | 
						|
if (isset($_SESSION["save"])) {
 | 
						|
    $_POST = $_SESSION["save"];
 | 
						|
 | 
						|
    unset($_SESSION["save"]);
 | 
						|
}
 | 
						|
include_once $_SERVER["DOCUMENT_ROOT"] . "/assets/includes/config.php";
 | 
						|
function random_str(
 | 
						|
    int $length,
 | 
						|
    string $keyspace = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
 | 
						|
): string {
 | 
						|
    if ($length < 1) {
 | 
						|
        throw new \RangeException("Length must be a positive integer");
 | 
						|
    }
 | 
						|
    $pieces = [];
 | 
						|
    $max = mb_strlen($keyspace, "8bit") - 1;
 | 
						|
    for ($i = 0; $i < $length; ++$i) {
 | 
						|
        $pieces[] = $keyspace[random_int(0, $max)];
 | 
						|
    }
 | 
						|
    return implode("", $pieces);
 | 
						|
}
 | 
						|
if (
 | 
						|
    isset($_POST["link"]) &&
 | 
						|
    isset($_POST["token"]) &&
 | 
						|
    isset($_SESSION["token"]) &&
 | 
						|
    $_POST["token"] == $_SESSION["token"]
 | 
						|
) {
 | 
						|
    $link = $_POST["link"];
 | 
						|
    $link = ltrim($link);
 | 
						|
    $_POST["link"] = "";
 | 
						|
    if (
 | 
						|
        preg_match(
 | 
						|
            "/^(http(s?):\/\/)?(\[(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,7}:|([0-9a-f]{1,4}:){1,6}:[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}|([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}|([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}|([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}|[0-9a-f]{1,4}:((:[0-9a-f]{1,4}){1,6})|:((:[0-9a-f]{1,4}){1,7}|:)|fe80:(:[0-9a-f]{0,4}){0,4}%[0-9a-z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-f]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))\])|(http(s?):\/\/)?(((([a-zA-Z]+)|([0-9]{1,3}))\.)+(([a-zA-Z]+)|([0-9]{1,3})))/i",
 | 
						|
            $link
 | 
						|
        )
 | 
						|
    ) {
 | 
						|
        $valid_url = true;
 | 
						|
    } else {
 | 
						|
        $valid_url = false;
 | 
						|
    }
 | 
						|
    if (!stristr($link, "http")) {
 | 
						|
        $link = "https://" . $link;
 | 
						|
    }
 | 
						|
    if ($valid_url) {
 | 
						|
        $dsn =
 | 
						|
            "mysql:host=" .
 | 
						|
            $mysql_address .
 | 
						|
            ";dbname=" .
 | 
						|
            $mysql_db .
 | 
						|
            ";port=" .
 | 
						|
            $mysql_port .
 | 
						|
            ";charset=utf8mb4";
 | 
						|
        $options = [
 | 
						|
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
 | 
						|
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
 | 
						|
            PDO::ATTR_EMULATE_PREPARES => false,
 | 
						|
        ];
 | 
						|
        try {
 | 
						|
            $pdo = new PDO($dsn, $mysql_username, $mysql_password, $options);
 | 
						|
            $pdo->exec("use " . $mysql_db);
 | 
						|
        } catch (PDOException $e) {
 | 
						|
            die($e->getMessage() . " " . (int) $e->getCode());
 | 
						|
        }
 | 
						|
        while (true) {
 | 
						|
            $id = random_str($char_per_id);
 | 
						|
            $deleteId = random_str($char_per_deleteId);
 | 
						|
            while (
 | 
						|
                $id == "index" ||
 | 
						|
                $id == "shorten" ||
 | 
						|
                $id == "delete" ||
 | 
						|
                $id == "report" ||
 | 
						|
                $id == "reported"
 | 
						|
            ) {
 | 
						|
                $id = random_str($char_per_id);
 | 
						|
                $deleteId = random_str($char_per_deleteId);
 | 
						|
            }
 | 
						|
            $req = $pdo->prepare(
 | 
						|
                "select * from " . $mysql_table . " where id = ?"
 | 
						|
            );
 | 
						|
            $req->execute([$id]);
 | 
						|
            $getId = $req->fetch();
 | 
						|
            $req = $pdo->prepare(
 | 
						|
                "select * from " . $mysql_table . " where deleteId = ?"
 | 
						|
            );
 | 
						|
            $req->execute([$deleteId]);
 | 
						|
            $getdeleteId = $req->fetch();
 | 
						|
            if (
 | 
						|
                !isset($getId["original"]) ||
 | 
						|
                !isset($getdeleteId["original"])
 | 
						|
            ) {
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        $req = $pdo->prepare(
 | 
						|
            "insert into " .
 | 
						|
                $mysql_table .
 | 
						|
                " (id, original, deleteId, time) values (?, ?, ?, ?)"
 | 
						|
        );
 | 
						|
        $req->execute([$id, $link, $deleteId, time()]);
 | 
						|
        $req = $pdo->prepare("select * from " . $mysql_table . " where id = ?");
 | 
						|
        $req->execute([$id]);
 | 
						|
        $row = $req->fetch();
 | 
						|
        if (!isset($row["original"])) {
 | 
						|
 | 
						|
            $pagename = "An unknown error has occurred";
 | 
						|
            include_once $_SERVER["DOCUMENT_ROOT"] .
 | 
						|
                "/assets/includes/header.php";
 | 
						|
?>
 | 
						|
            <main role="main" class="cover fadeIn">
 | 
						|
                <h1 class="cover-heading">
 | 
						|
 | 
						|
                    <?php $translate->__("Oh no..."); ?>
 | 
						|
                </h1>
 | 
						|
                <p class="lead">
 | 
						|
                    <?php $translate->__("An unknown error has occurred."); ?>
 | 
						|
                </p>
 | 
						|
                <a class="btn btn-outline-primary btn-block" type="button" href="/">
 | 
						|
      <span class="bi-fix"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-house-door-fill" viewBox="0 0 16 16" aria-hidden="true">
 | 
						|
  <path d="M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5z"/>
 | 
						|
</svg> <?php $translate->__("Return to the homepage"); ?></span>
 | 
						|
      
 | 
						|
    </a>
 | 
						|
            </main>
 | 
						|
        <?php
 | 
						|
        } elseif (isset($row["original"])) {
 | 
						|
 | 
						|
            $pagename = "Your link has been successfully shortened";
 | 
						|
            include_once $_SERVER["DOCUMENT_ROOT"] .
 | 
						|
                "/assets/includes/header.php";
 | 
						|
        ?>
 | 
						|
            <main role="main" class="cover fadeIn">
 | 
						|
                <h1 class="cover-heading">
 | 
						|
 | 
						|
                    <?php $translate->__("Your link has been successfully shortened"); ?>
 | 
						|
                </h1>
 | 
						|
                <p class="lead">
 | 
						|
                    <?php $translate->__("Thank you for your trust."); ?>
 | 
						|
                </p>
 | 
						|
                <div class="input-group mb-3">
 | 
						|
                    <div class="input-group-prepend">
 | 
						|
                        <span class="input-group-text"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-link-45deg" viewBox="0 0 16 16" aria-hidden="true">
 | 
						|
                                <path d="M4.715 6.542 3.343 7.914a3 3 0 1 0 4.243 4.243l1.828-1.829A3 3 0 0 0 8.586 5.5L8 6.086a1.002 1.002 0 0 0-.154.199 2 2 0 0 1 .861 3.337L6.88 11.45a2 2 0 1 1-2.83-2.83l.793-.792a4.018 4.018 0 0 1-.128-1.287z" />
 | 
						|
                                <path d="M6.586 4.672A3 3 0 0 0 7.414 9.5l.775-.776a2 2 0 0 1-.896-3.346L9.12 3.55a2 2 0 1 1 2.83 2.83l-.793.792c.112.42.155.855.128 1.287l1.372-1.372a3 3 0 1 0-4.243-4.243L6.586 4.672z" />
 | 
						|
                            </svg> <?php $translate->__("Shortened link"); ?></span>
 | 
						|
                    </div>
 | 
						|
 | 
						|
 | 
						|
                    <input type="text" name="link" class="form-control form-control-shortenedlink" value="<?= "https://" .
 | 
						|
                                                                                                                $url .
 | 
						|
                                                                                                                "/" .
 | 
						|
                                                                                                                $id ?>" readonly>
 | 
						|
                    <div class="input-group-append">
 | 
						|
                        <button class="btn btn-outline-primary copyshorturl nojs">
 | 
						|
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard-fill" viewBox="0 0 16 16" aria-hidden="true">
 | 
						|
                                <path fill-rule="evenodd" d="M10 1.5a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-1Zm-5 0A1.5 1.5 0 0 1 6.5 0h3A1.5 1.5 0 0 1 11 1.5v1A1.5 1.5 0 0 1 9.5 4h-3A1.5 1.5 0 0 1 5 2.5v-1Zm-2 0h1v1A2.5 2.5 0 0 0 6.5 5h3A2.5 2.5 0 0 0 12 2.5v-1h1a2 2 0 0 1 2 2V14a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V3.5a2 2 0 0 1 2-2Z" />
 | 
						|
                            </svg>
 | 
						|
                        </button>
 | 
						|
                        <button class="btn btn-outline-primary nojs" onclick="showQRCode();">
 | 
						|
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-qr-code" viewBox="0 0 16 16" aria-hidden="true">
 | 
						|
                                <path d="M2 2h2v2H2V2Z" />
 | 
						|
                                <path d="M6 0v6H0V0h6ZM5 1H1v4h4V1ZM4 12H2v2h2v-2Z" />
 | 
						|
                                <path d="M6 10v6H0v-6h6Zm-5 1v4h4v-4H1Zm11-9h2v2h-2V2Z" />
 | 
						|
                                <path d="M10 0v6h6V0h-6Zm5 1v4h-4V1h4ZM8 1V0h1v2H8v2H7V1h1Zm0 5V4h1v2H8ZM6 8V7h1V6h1v2h1V7h5v1h-4v1H7V8H6Zm0 0v1H2V8H1v1H0V7h3v1h3Zm10 1h-1V7h1v2Zm-1 0h-1v2h2v-1h-1V9Zm-4 0h2v1h-1v1h-1V9Zm2 3v-1h-1v1h-1v1H9v1h3v-2h1Zm0 0h3v1h-2v1h-1v-2Zm-4-1v1h1v-2H7v1h2Z" />
 | 
						|
                                <path d="M7 12h1v3h4v1H7v-4Zm9 2v2h-3v-1h2v-1h1Z" />
 | 
						|
                            </svg>
 | 
						|
                        </button>
 | 
						|
                    </div>
 | 
						|
                </div>
 | 
						|
                <div class="input-group input-group-sm mb-3">
 | 
						|
                    <div class="input-group-prepend">
 | 
						|
                        <span class="input-group-text"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-trash-fill" viewBox="0 0 16 16" aria-hidden="true">
 | 
						|
                                <path d="M2.5 1a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1H3v9a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V4h.5a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H10a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1H2.5zm3 4a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 .5-.5zM8 5a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7A.5.5 0 0 1 8 5zm3 .5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 1 0z" />
 | 
						|
                            </svg> <?php $translate->__("Deletion link"); ?></span>
 | 
						|
                    </div>
 | 
						|
                    <input type="text" name="deletionlink" class="form-control form-control-deletionlink" value="<?= "https://" . $url . "/d/" . $deleteId ?>" data-toggle="popover" data-placement="bottom" data-content="<?php $translate->__("Keep this deletion link in case you want to delete your shortened link in the future.") ?>" data-trigger="hover" readonly>
 | 
						|
                    <div class="input-group-append">
 | 
						|
                        <button class="btn btn-outline-primary copydeletionlink nojs">
 | 
						|
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard-fill" viewBox="0 0 16 16" aria-hidden="true">
 | 
						|
                                <path fill-rule="evenodd" d="M10 1.5a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-1Zm-5 0A1.5 1.5 0 0 1 6.5 0h3A1.5 1.5 0 0 1 11 1.5v1A1.5 1.5 0 0 1 9.5 4h-3A1.5 1.5 0 0 1 5 2.5v-1Zm-2 0h1v1A2.5 2.5 0 0 0 6.5 5h3A2.5 2.5 0 0 0 12 2.5v-1h1a2 2 0 0 1 2 2V14a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V3.5a2 2 0 0 1 2-2Z" />
 | 
						|
                            </svg>
 | 
						|
                        </button>
 | 
						|
                    </div>
 | 
						|
                </div>
 | 
						|
                <a class="btn btn-outline-primary btn-block" type="button" href="/">
 | 
						|
      <span class="bi-fix"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-house-door-fill" viewBox="0 0 16 16" aria-hidden="true">
 | 
						|
  <path d="M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5z"/>
 | 
						|
</svg> <?php $translate->__("Return to the homepage"); ?></span>
 | 
						|
      
 | 
						|
    </a>
 | 
						|
            </main>
 | 
						|
        <?php
 | 
						|
        }
 | 
						|
    } elseif (!$valid_url) {
 | 
						|
 | 
						|
        $pagename = "The link you want to shorten is invalid";
 | 
						|
        include_once $_SERVER["DOCUMENT_ROOT"] . "/assets/includes/header.php";
 | 
						|
        ?>
 | 
						|
        <main role="main" class="cover fadeIn">
 | 
						|
            <h1 class="cover-heading">
 | 
						|
 | 
						|
                <?php $translate->__("Oh no..."); ?>
 | 
						|
            </h1>
 | 
						|
            <p class="lead"><?php $translate->__(
 | 
						|
                                "The link you want to shorten is invalid."
 | 
						|
                            ); ?>
 | 
						|
            </p>
 | 
						|
            <a class="btn btn-outline-primary btn-block" type="button" href="/">
 | 
						|
      <span class="bi-fix"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-house-door-fill" viewBox="0 0 16 16">
 | 
						|
  <path d="M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5z"/>
 | 
						|
</svg> <?php $translate->__("Return to the homepage"); ?></span>
 | 
						|
      
 | 
						|
    </a>
 | 
						|
        </main>
 | 
						|
<?php
 | 
						|
    }
 | 
						|
} else {
 | 
						|
    http_response_code(301);
 | 
						|
    header("Location: /");
 | 
						|
}
 | 
						|
include_once $_SERVER["DOCUMENT_ROOT"] . "/assets/includes/footer.php";
 | 
						|
session_destroy();
 |