web: samplehub
This commit is contained in:
parent
6993d95ff1
commit
ad2485a290
BIN
web/samplehub/samplehub.tar.xz
Normal file
BIN
web/samplehub/samplehub.tar.xz
Normal file
Binary file not shown.
1
web/samplehub/samplehub/.flag.txt
Normal file
1
web/samplehub/samplehub/.flag.txt
Normal file
@ -0,0 +1 @@
|
||||
HERO{FAKE_FLAG}
|
10
web/samplehub/samplehub/Dockerfile
Normal file
10
web/samplehub/samplehub/Dockerfile
Normal file
@ -0,0 +1,10 @@
|
||||
FROM alpine:3.20.3
|
||||
|
||||
WORKDIR /usr/app
|
||||
COPY ./src/ .
|
||||
COPY ./.flag.txt /.flag.txt
|
||||
RUN apk add --update --no-cache nodejs npm && \
|
||||
npm install
|
||||
|
||||
USER guest
|
||||
CMD ["/usr/bin/node", "/usr/app/app.js"]
|
16
web/samplehub/samplehub/docker-compose.yml
Normal file
16
web/samplehub/samplehub/docker-compose.yml
Normal file
@ -0,0 +1,16 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
web:
|
||||
build: .
|
||||
ports:
|
||||
- "3000:3000"
|
||||
read_only: true
|
||||
restart: unless-stopped
|
||||
cap_drop:
|
||||
- all
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: "0.5"
|
||||
memory: 1G
|
28
web/samplehub/samplehub/src/app.js
Normal file
28
web/samplehub/samplehub/src/app.js
Normal file
@ -0,0 +1,28 @@
|
||||
const express = require("express");
|
||||
const path = require("path");
|
||||
|
||||
const app = express();
|
||||
const PORT = 3000;
|
||||
|
||||
app.use(express.static(path.join(__dirname, "public")));
|
||||
app.set("view engine", "ejs");
|
||||
app.set("views", path.join(__dirname, "views"));
|
||||
|
||||
app.get("/", (req, res) => {
|
||||
res.render("index");
|
||||
});
|
||||
|
||||
process.chdir(path.join(__dirname, "samples"));
|
||||
app.get("/download/:file", (req, res) => {
|
||||
const file = path.basename(req.params.file);
|
||||
res.download(file, req.query.filename || "sample.png", (err) => {
|
||||
if (err) {
|
||||
res.status(404).send(`File "${file}" not found`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server is running on http://localhost:${PORT}`);
|
||||
});
|
6
web/samplehub/samplehub/src/package.json
Normal file
6
web/samplehub/samplehub/src/package.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"ejs": "^3.1.10",
|
||||
"express": "^4.21.1"
|
||||
}
|
||||
}
|
9
web/samplehub/samplehub/src/public/samples.json
Normal file
9
web/samplehub/samplehub/src/public/samples.json
Normal file
@ -0,0 +1,9 @@
|
||||
[
|
||||
{ "filename": "sample.png", "extension": ".png", "description": "A Portable Network Graphics file that supports lossless data compression. Commonly used for web images and graphics." },
|
||||
{ "filename": "sample.jpg", "extension": ".jpg", "description": "A JPEG image file, widely used for digital photos and web graphics. It employs lossy compression to reduce file size." },
|
||||
{ "filename": "sample.pdf", "extension": ".pdf", "description": "A Portable Document Format file used for sharing documents while preserving formatting. It is viewable on any platform using a PDF reader." },
|
||||
{ "filename": "sample.doc", "extension": ".doc", "description": "A Microsoft Word document file format used for text documents. It supports rich formatting and can include images, tables, and other elements." },
|
||||
{ "filename": "sample.xls", "extension": ".xls", "description": "A Microsoft Excel spreadsheet file format that supports data analysis and calculation. It allows for complex formulas and data visualization." },
|
||||
{ "filename": "sample.mp3", "extension": ".mp3", "description": "An audio file format that uses lossy compression to reduce file size. It's commonly used for music and audio streaming." },
|
||||
{ "filename": "sample.mp4", "extension": ".mp4", "description": "A digital multimedia format commonly used for video files. It supports a wide range of codecs and is ideal for streaming." }
|
||||
]
|
BIN
web/samplehub/samplehub/src/samples/sample.doc
Normal file
BIN
web/samplehub/samplehub/src/samples/sample.doc
Normal file
Binary file not shown.
BIN
web/samplehub/samplehub/src/samples/sample.jpg
Normal file
BIN
web/samplehub/samplehub/src/samples/sample.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 542 KiB |
BIN
web/samplehub/samplehub/src/samples/sample.mp3
Normal file
BIN
web/samplehub/samplehub/src/samples/sample.mp3
Normal file
Binary file not shown.
BIN
web/samplehub/samplehub/src/samples/sample.mp4
Normal file
BIN
web/samplehub/samplehub/src/samples/sample.mp4
Normal file
Binary file not shown.
BIN
web/samplehub/samplehub/src/samples/sample.pdf
Normal file
BIN
web/samplehub/samplehub/src/samples/sample.pdf
Normal file
Binary file not shown.
BIN
web/samplehub/samplehub/src/samples/sample.png
Normal file
BIN
web/samplehub/samplehub/src/samples/sample.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 501 KiB |
BIN
web/samplehub/samplehub/src/samples/sample.xls
Normal file
BIN
web/samplehub/samplehub/src/samples/sample.xls
Normal file
Binary file not shown.
65
web/samplehub/samplehub/src/views/index.ejs
Normal file
65
web/samplehub/samplehub/src/views/index.ejs
Normal file
@ -0,0 +1,65 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Samples</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-gray-100">
|
||||
<div class="container mx-auto p-5">
|
||||
<h1 class="text-3xl font-bold mb-6 text-center">File Samples</h1>
|
||||
<div class="mb-6">
|
||||
<input
|
||||
type="text"
|
||||
id="search"
|
||||
placeholder="Search for files..."
|
||||
class="w-full p-3 border border-gray-300 rounded-lg shadow focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||
>
|
||||
</div>
|
||||
<div id="file-list" class="space-y-4"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const searchInput = document.getElementById("search");
|
||||
const fileList = document.getElementById("file-list");
|
||||
|
||||
fetch("/samples.json")
|
||||
.then(response => response.json())
|
||||
.then(samples => {
|
||||
const originalSamples = samples;
|
||||
|
||||
function populateList(samples) {
|
||||
fileList.innerHTML = "";
|
||||
if (samples.length === 0) return;
|
||||
|
||||
samples.forEach(sample => {
|
||||
const div = document.createElement("div");
|
||||
div.className = "flex items-center justify-between p-4 bg-white border border-gray-200 rounded-lg shadow";
|
||||
div.innerHTML = `
|
||||
<div>
|
||||
<h2 class="font-semibold">${sample.extension}</h2>
|
||||
<p class="text-gray-600">${sample.description}</p>
|
||||
</div>
|
||||
<a href="/download/${sample.filename}" class="bg-blue-500 text-white py-2 px-4 rounded hover:bg-blue-600 transition">Download</a>
|
||||
`;
|
||||
fileList.appendChild(div);
|
||||
});
|
||||
}
|
||||
|
||||
searchInput.addEventListener("input", function() {
|
||||
const query = this.value.toLowerCase();
|
||||
if (query) {
|
||||
const filteredSamples = originalSamples.filter(sample =>
|
||||
sample.extension.toLowerCase().includes(query)
|
||||
);
|
||||
populateList(filteredSamples);
|
||||
} else {
|
||||
fileList.innerHTML = "";
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch(error => console.error("Error fetching samples:", error));
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user