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