chg: Moved the resources folder out of actix since it isn't Rust

This commit is contained in:
SinTan1729 committed 2024-03-08 10:41:52 -06:00
1 parent 9fdb634d71
commit 8b1af0a169
9 files changed
+1 -1

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

+37
View File
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="512"
height="512"
viewBox="0 0 135.46667 135.46667"
version="1.1"
id="svg21"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs18" /><g
id="layer1"><image
width="66.145836"
height="119.0625"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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 gg== "
id="image90"
x="34.660416"
y="8.2020836"
style="display:none" /><path
style="display:inline;fill:#febf00;stroke-width:0.264583"
d="m 61.839322,126.59008 c -0.458565,-0.45857 -0.721643,-1.07268 -0.821745,-1.91823 -0.08098,-0.68405 -0.698279,-12.61419 -1.37177,-26.511433 C 58.972316,84.263177 58.3436,72.690091 58.24866,72.442449 58.100071,72.054868 56.683976,72.598137 48.076041,76.345053 41.3723,79.2631 37.768033,80.697917 37.141625,80.697917 c -0.679996,0 -1.144991,-0.210577 -1.707812,-0.773398 -0.676069,-0.676069 -0.773397,-0.965494 -0.773397,-2.299859 0,-1.487911 4.889994,-64.762941 5.174141,-66.951808 0.09016,-0.694512 0.39582,-1.3539869 0.82777,-1.7859374 l 0.684832,-0.684831 h 15.758297 15.758297 l 0.742082,0.7109595 c 0.571194,0.5472379 0.743556,0.9585084 0.748483,1.7859379 0.0035,0.591238 -0.966505,6.167218 -2.155611,12.391067 -1.189109,6.223849 -2.114701,11.363402 -2.056876,11.421228 0.05783,0.05783 6.3559,-1.496789 13.995718,-3.454701 12.526685,-3.210305 13.987058,-3.532122 14.873193,-3.277538 1.234088,0.35455 1.796638,1.142238 1.791508,2.50848 -0.006,1.480591 -34.300943,95.450423 -35.162395,96.345463 -0.883928,0.9184 -2.861556,0.89608 -3.800533,-0.0429 z"
id="path336" /><image
width="134.9375"
height="59.795834"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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 lIxF+MO8ooV+KUGDvxSNkrEIf5hPxNLine truncated
id="image312"
x="0.26458332"
y="33.602081"
style="display:none" /><path
style="fill:#1333a3;stroke-width:0.264583"
d="m 25.929167,93.210246 c -4.16678,-0.728242 -8.701438,-2.4599 -11.90625,-4.546661 C 9.8016118,85.914951 5.2152505,80.696113 3.1624225,76.305387 0.99913145,71.678399 -0.05126766,65.466492 0.50533434,60.591761 1.3585805,53.119013 4.0179694,47.565917 9.2538851,42.323829 13.276695,38.296276 17.512679,35.884908 23.283333,34.337452 c 2.238076,-0.600161 2.337301,-0.603079 20.505209,-0.603079 18.167908,0 18.267132,0.0029 20.505208,0.603079 5.770655,1.547456 10.00664,3.958824 14.029449,7.986377 4.026628,4.031374 6.194507,7.639078 7.669012,12.762476 1.085209,3.770741 1.480788,7.82414 1.10681,11.341228 -0.413094,3.884967 -0.737468,4.760614 -1.990159,5.372434 -2.894076,1.413483 -7.950607,1.885759 -11.936566,1.114872 -2.984365,-0.577181 -3.488486,-1.853369 -1.949056,-4.934043 0.771486,-1.543881 0.844138,-1.905878 0.844823,-4.209449 7.94e-4,-2.264865 -0.08865,-2.731188 -0.881301,-4.600945 -1.204769,-2.841886 -3.208882,-4.974389 -6.007589,-6.392456 0,0 -2.820549,-1.165893 -7.13716,-0.986427 L 45.24375,51.72604 33.832014,51.505999 C 28.302687,51.800301 25.4,52.685233 25.4,52.685233 c -4.844732,0.677545 -7.61163,7.415652 -7.020388,11.571979 0.642675,4.517895 3.091,8.007818 7.020388,10.007094 0,0 1.333798,0.929837 5.259606,1.129578 l 7.925095,0.01236 c 12.544081,0.01957 11.551682,-0.02838 12.185142,2.169425 1.652444,5.73319 2.962412,8.133522 6.040861,11.069039 2.393693,2.282558 2.735384,3.150865 1.662213,4.224036 -0.518094,0.518094 -0.857171,0.528413 -16.20573,0.493136 -8.622109,-0.01982 -15.912294,0.01039 -16.33802,-0.151638 z m 47.889583,0.0052 C 69.503102,92.427225 65.117848,90.750701 61.9125,88.66359 57.691195,85.914956 53.104833,80.696118 51.052005,76.305392 48.923358,71.7525 47.848628,65.453562 48.367646,60.572468 c 0.455154,-4.280516 0.659976,-4.719059 2.564646,-5.491164 3.396792,-1.376975 6.655329,-1.6961 10.889019,-1.066417 3.414377,0.507825 4.031697,1.783263 2.422115,5.004319 -0.771485,1.54388 -0.844137,1.905878 -0.844822,4.209449 -7.94e-4,2.264865 0.08865,2.731188 0.8813,4.600945 1.20477,2.841884 3.208883,4.974389 6.00759,6.392455 0,0 1.899539,1.396934 6.965558,1.125967 l 12.969865,-0.07407 10.999063,0.113679 c 4.96425,-0.06801 8.84469,-1.072873 8.84469,-1.072873 4.78336,-1.080028 7.61163,-7.415651 7.02038,-11.571978 -0.64264,-4.517723 -3.08584,-7.999686 -7.02038,-10.005247 0,0 -2.37709,-1.3488 -6.86366,-1.4367 l -6.321044,0.292911 c -12.531062,0.580677 -11.554701,0.02795 -12.182031,-2.169423 -1.636146,-5.731003 -2.926566,-8.096376 -6.032936,-11.058519 -2.412878,-2.300849 -2.748788,-3.15902 -1.661935,-4.245871 0.53463,-0.534632 0.718569,-0.211647 16.867187,-0.447653 l 7.829079,-0.114419 c 4.47549,-0.192738 10.87888,0.881674 10.87888,0.881674 5.85751,0.959188 9.64665,3.893669 13.63257,7.884295 4.05052,4.055291 6.22516,7.687575 7.66756,12.807044 1.40547,4.988406 1.60854,9.247526 0.67025,14.057667 -1.22391,6.274424 -3.66561,10.809922 -8.33781,15.487629 -3.98514,3.98984 -7.66605,6.520583 -13.3815,8.141714 0,0 -1.7391,0.334523 -2.50365,0.444821 -0.73659,0.106266 -17.988047,0.02387 -17.988047,0.02387 -9.822601,0.04264 -18.157031,-0.0047 -18.520833,-0.07112 z"
id="path1143" /></g></svg>

After

Width:  |  Height:  |  Size: 14 KiB

+82
View File
@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Chhoto URL</title>
<meta name="description" content="A simple selfhosted URL shortener with no unnecessary features.">
<meta name="keywords" content="url shortener, link shortener, self hosted, open source">
<link rel="icon" type="image/x-icon" href="assets/favicon.ico" sizes="any">
<link rel="icon" type="image/svg+xml" href="assets/favicon.svg">
<link rel="icon" type="image/png" href="assets/favicon-32.png" sizes="32x32">
<link rel="icon" type="image/png" href="assets/favicon-196.png" sizes="196x196">
<script src="static/script.js"></script>
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.1/build/pure-min.css"
integrity="sha384-oAOxQR6DkCoMliIh8yFnu25d7Eq/PHS21PClpwjOTeU2jRSq11vu66rf90/cZr47" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" target="_blank" href="static/styles.css">
</head>
<body>
<div class="container" id="container">
<form class="pure-form pure-form-aligned" name="new-url-form">
<fieldset>
<legend id="logo"><img src="assets/favicon-32.png" width="26px" alt="logo"> Chhoto URL</legend>
<div class="pure-control-group">
<label for="longUrl">Long URL</label>
<input type="url" name="longUrl" id="longUrl" placeholder="Please enter a valid URL"
onblur="addProtocol(this)" required />
</div>
<div class=" pure-control-group">
<label for="shortUrl">Short URL (optional)</label>
<input type="text" name="shortUrl" id="shortUrl" placeholder="Only a-z, 0-9, - and _ are allowed"
pattern="[A-Za-z0-9_-]+" />
</div>
<div class="pure-controls">
<button class="pure-button pure-button-primary">Shorten!</button>
<p id="alert-box">&nbsp;</p>
</div>
</fieldset>
</form>
<p name="loading-text">Loading links table...</p>
<table class="pure-table">
<caption>Active links</caption>
<br>
<thead>
<tr>
<td id="short-url-header">Short URL<br>(click to copy)</td>
<td>Long URL</td>
<td>Hits</td>
<td name="deleteBtn">&times;</td>
</tr>
</thead>
<tbody id="url-table">
<!-- The links would be inserted here -->
</tbody>
</table>
</div>
<div name="github-link">
<a id="version-number" href="https://github.com/SinTan1729/chhoto-url" target="_blank" rel="noopener noreferrer"
hidden>Source Code</a>
<!-- The version number would be inserted here -->
</div>
<dialog id="login-dialog">
<form class="pure-form" name="login-form">
<p>Please enter password to access this website</p>
<input type="password" id="password" />
<button class="pure-button pure-button-primary" value="default">Submit</button>
<p id="wrong-pass">&nbsp;</p>
</form>
</dialog>
</body>
</html>
+26
View File
@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<title>Error 404</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<style>
#quote {
text-indent: 4em;
}
</style>
<body style="text-align: center;">
<h1>Error 404!</h1>
<div style="display: inline-block; text-align:left;">
<p>You step in the stream,</p>
<p>But the water has moved on.</p>
<p>The page is not here.</p>
<p id="quote"> — Cass Whittington</p>
</div>
</body>
</html>
+220
View File
@@ -0,0 +1,220 @@
const getSiteUrl = async () => await fetch("/api/siteurl")
.then(res => res.text())
.then(text => {
if (text == "unset") {
return window.location.host;
}
else {
return text;
}
});
const getVersion = async () => await fetch("/api/version")
.then(res => res.text())
.then(text => {
return text;
});
const refreshData = async () => {
let reply = await fetch("/api/all").then(res => res.text());
if (reply == "logged_out") {
console.log("logged_out");
document.getElementById("container").style.filter = "blur(2px)"
document.getElementById("login-dialog").showModal();
document.getElementById("password").focus();
} else {
data = reply
.split("\n")
.filter(line => line !== "")
.map(line => line.split(","))
.map(arr => ({
short: arr[0],
long: arr[1],
hits: arr[2]
}));
displayData(data);
}
};
const displayData = async (data) => {
let version = await getVersion();
link = document.getElementById("version-number")
link.innerText = "v" + version;
link.href = "https://github.com/SinTan1729/chhoto-url/releases/tag/" + version;
link.hidden = false;
let site = await getSiteUrl();
table_box = document.querySelector(".pure-table");
loading_text = document.getElementsByName("loading-text")[0];
if (data.length == 0) {
table_box.style.visibility = "hidden";
loading_text.style.display = "block";
loading_text.innerHTML = "No active links.";
}
else {
loading_text.style.display = "none";
const table = document.querySelector("#url-table");
if (!window.isSecureContext) {
const shortUrlHeader = document.getElementById("short-url-header");
shortUrlHeader.innerHTML = "Short URL<br>(right click and copy)";
}
table_box.style.visibility = "visible";
table.innerHTML = ''; // Clear
data.forEach(tr => table.appendChild(TR(tr, site)));
}
};
const showAlert = async (text, col) => {
document.getElementById("alert-box")?.remove();
const controls = document.querySelector(".pure-controls");
const alertBox = document.createElement("p");
alertBox.id = "alert-box";
alertBox.style.color = col;
alertBox.innerHTML = text;
controls.appendChild(alertBox);
};
const TR = (row, site) => {
const tr = document.createElement("tr");
const longTD = TD(A_LONG(row.long), "Long URL");
var shortTD = null;
if (window.isSecureContext) {
shortTD = TD(A_SHORT(row.short, site), "Short URL");
}
else {
shortTD = TD(A_SHORT_INSECURE(row.short, site), "Short URL");
}
hitsTD = TD(row.hits);
hitsTD.setAttribute("label", "Hits");
const btn = deleteButton(row.short);
tr.appendChild(shortTD);
tr.appendChild(longTD);
tr.appendChild(hitsTD);
tr.appendChild(btn);
return tr;
};
const copyShortUrl = async (link) => {
const site = await getSiteUrl();
try {
navigator.clipboard.writeText(`${site}/${link}`);
showAlert(`Short URL ${link} was copied to clipboard!`, "green");
} catch (e) {
console.log(e);
showAlert("Could not copy short URL to clipboard, please do it manually.", "red");
}
};
const addProtocol = (input) => {
var url = input.value.trim();
if (url != "" && !~url.indexOf("://") && !~url.indexOf("magnet:")) {
url = "https://" + url;
}
input.value = url;
return input
}
const A_LONG = (s) => `<a href='${s}'>${s}</a>`;
const A_SHORT = (s, t) => `<a href="javascript:copyShortUrl('${s}');">${s}</a>`;
const A_SHORT_INSECURE = (s, t) => `<a href="${t}/${s}">${s}</a>`;
const deleteButton = (shortUrl) => {
const td = document.createElement("td");
const btn = document.createElement("button");
btn.innerHTML = "&times;";
btn.onclick = e => {
e.preventDefault();
if (confirm("Do you want to delete the entry " + shortUrl + "?")) {
document.getElementById("alert-box")?.remove();
showAlert("&nbsp;", "black");
fetch(`/api/del/${shortUrl}`, {
method: "DELETE"
}).then(_ => refreshData());
}
};
td.setAttribute("name", "deleteBtn");
td.setAttribute("label", "Delete");
td.appendChild(btn);
return td;
};
const TD = (s, u) => {
const td = document.createElement("td");
const div = document.createElement("div");
div.innerHTML = s;
td.appendChild(div);
td.setAttribute("label", u);
return td;
};
const submitForm = () => {
const form = document.forms.namedItem("new-url-form");
const longUrl = form.elements["longUrl"];
const shortUrl = form.elements["shortUrl"];
const url = `/api/new`;
fetch(url, {
method: "POST",
body: `${longUrl.value};${shortUrl.value}`
})
.then(res => {
if (!res.ok) {
showAlert("Short URL is not valid or it's already in use!", "red");
return "error";
}
else {
return res.text();
}
}).then(text => {
if (text != "error") {
copyShortUrl(text);
longUrl.value = "";
shortUrl.value = "";
refreshData();
}
});
};
const submitLogin = () => {
const password = document.getElementById("password");
fetch("/api/login", {
method: "POST",
body: password.value
}).then(res => {
if (res.ok) {
document.getElementById("container").style.filter = "blur(0px)"
document.getElementById("login-dialog").remove();
refreshData();
} else {
const wrongPassBox = document.getElementById("wrong-pass");
wrongPassBox.innerHTML = "Wrong password!";
wrongPassBox.style.color = "red";
password.focus();
}
})
}
(async () => {
await refreshData();
const form = document.forms.namedItem("new-url-form");
form.onsubmit = e => {
e.preventDefault();
submitForm();
}
const login_form = document.forms.namedItem("login-form");
login_form.onsubmit = e => {
e.preventDefault();
submitLogin();
}
})();
+100
View File
@@ -0,0 +1,100 @@
.container {
max-width: 950px;
margin: 20px auto auto;
}
table {
width: 100%;
}
table tr td div {
max-height: 75px;
line-height: 25px;
word-wrap: break-word;
max-width: 575px;
overflow: auto;
}
td[name="deleteBtn"] {
text-align: center;
}
td[name="deleteBtn"] button {
border-radius: 50%;
border-style: solid;
cursor: pointer;
background-color: transparent;
}
input {
width: 65%;
}
form input[name="shortUrl"] {
text-transform: lowercase;
}
form input[name="shortUrl"]::placeholder {
text-transform: none;
}
div[name="github-link"] {
position: absolute;
right: 0.5%;
top: 0.5%;
}
.pure-table {
visibility: hidden;
}
.pure-table caption {
font-size: 22px;
text-align: left;
font-style: normal;
}
#logo {
font-size: 32px;
}
#password {
width: 100%;
margin-bottom: 10px;
}
dialog form {
text-align: center;
}
/* Settings for mobile devices */
@media (pointer:none),
(pointer:coarse) {
table tr {
border-bottom: 1px solid #999;
}
table thead {
display: none;
}
table td {
display: flex;
}
table td::before {
content: attr(label);
font-weight: bold;
width: 120px;
min-width: 120px;
text-align: left;
}
table tr td div {
width: 63vw
}
.pure-table caption {
padding-top: 0px;
}
}