<?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();