From b5717b7bae45ff46e7c193d62c13ffc43dd70235 Mon Sep 17 00:00:00 2001 From: diophants Date: Tue, 16 Jan 2024 05:21:11 +0300 Subject: [PATCH] create 4-all file --- JavaScript/4-all/readme.md | 22 +++++ JavaScript/4-all/server.js | 86 ++++++++++++++++++ JavaScript/4-all/static/errors/404.html | 1 + .../4-all/static/errors/no-reading.html | 1 + JavaScript/4-all/static/errors/traversal.html | 1 + JavaScript/4-all/static/favicon.ico | 0 JavaScript/4-all/static/favicon.png | 0 JavaScript/4-all/static/images/Diophant.png | Bin 0 -> 10526 bytes .../4-all/static/images/channel-xyz.jpg | Bin 0 -> 12791 bytes JavaScript/4-all/static/index.html | 15 +++ JavaScript/4-all/static/js/init.js | 1 + JavaScript/4-all/static/styles/style.css | 6 ++ 12 files changed, 133 insertions(+) create mode 100644 JavaScript/4-all/readme.md create mode 100644 JavaScript/4-all/server.js create mode 100644 JavaScript/4-all/static/errors/404.html create mode 100644 JavaScript/4-all/static/errors/no-reading.html create mode 100644 JavaScript/4-all/static/errors/traversal.html create mode 100644 JavaScript/4-all/static/favicon.ico create mode 100644 JavaScript/4-all/static/favicon.png create mode 100644 JavaScript/4-all/static/images/Diophant.png create mode 100644 JavaScript/4-all/static/images/channel-xyz.jpg create mode 100644 JavaScript/4-all/static/index.html create mode 100644 JavaScript/4-all/static/js/init.js create mode 100644 JavaScript/4-all/static/styles/style.css diff --git a/JavaScript/4-all/readme.md b/JavaScript/4-all/readme.md new file mode 100644 index 0000000..f03223d --- /dev/null +++ b/JavaScript/4-all/readme.md @@ -0,0 +1,22 @@ +## Вопросы + +- Зачем нужно объявлять константу STATIC_FILE_LENGTH? +- Как вызвать pathTraversal что бы он был равен true? +- Можно ли утверждать, чем больше проверок на безопасность тем лучше, + или в некоторых случаях они создают уязвимость? + +## Упражнения + +1. Обработайте ошибки: + +- когда файла не найден; ✓ +- когда нет прав на чтение файла или каталога; ✗ +- когда происходит попытка чтения файла из каталога выше. ✗ + +2. Создайте шаблоны страниц с ошибками в специальном каталоге. ✓ +3. Перепишите те места, которые возможно с использованием `fs.promises`. ✓ +4. Объедините все примеры в один: ✓ + +- отдача индекса каталога; ✓ +- кеширование; ✓ +- обработка ошибок. ✓ diff --git a/JavaScript/4-all/server.js b/JavaScript/4-all/server.js new file mode 100644 index 0000000..bdcaf68 --- /dev/null +++ b/JavaScript/4-all/server.js @@ -0,0 +1,86 @@ +'use strict'; + +const http = require('node:http'); +const fs = require('node:fs').promises; +const path = require('node:path'); + +const PORT = 8000; + +const STATIC_PATH = path.join(process.cwd(), './static'); + +const MIME_TYPE = { + default: 'application/octet-stream', + html: 'text/html; charset=UTF-8', + js: 'application/javascript; charset=UTF-8', + css: 'text/css', + png: 'image/png', + jpg: 'image/jpeg', + ico: 'image/x-icon', +}; + +const cache = new Map(); + +const cacheFile = async (filePath) => { + const key = filePath.substring(STATIC_PATH.length).replace(/\\/g, '/'); + const value = await fs.readFile(filePath); + cache.set(key, value); +}; + +const cacheDirectory = async (directoryPath) => { + const files = await fs.readdir(directoryPath, { withFileTypes: true }); + for (const file of files) { + const filePath = path.join(file.path, file.name); + if (file.isDirectory()) cacheDirectory(filePath); + else cacheFile(filePath); + } + const key = directoryPath.substring(STATIC_PATH.length).replace(/\\/g, '/'); + cache.set( + key || '/', + files.map((file) => file.name) + ); +}; + +cacheDirectory(STATIC_PATH); + +const folderIndex = (url) => { + const items = cache.get(url); + if (url !== '/' && items[0] !== '../') items.unshift('../'); + const list = items + .map((el) => { + const addres = path.join(url, el); + return `
  • ${el}
  • `; + }) + .join('\n'); + const file = `

    Directory files:

    `; + return file; +}; + +const prepareFile = (url) => { + const filePath = path.join(STATIC_PATH, url); + const pathTraversal = !filePath.startsWith(STATIC_PATH); + // console.log(pathTraversal) + const exists = cache.get(url); + const found = !pathTraversal && !!exists; + let cachePath = url; + if (!found) cachePath = '/errors/404.html'; + if (pathTraversal) cachePath = '/errors/traversal.html'; // Не знаю как установить true через браузер + if (!'readingRights') cachePath = '/errors/no-reading.html'; // Не представляю как это раелизовать без авторизации пользователя + const errorPath = + cachePath.startsWith('/errors/') && cachePath.endsWith('.html'); + const isDirectory = exists instanceof Array && !errorPath; + const ext = path.extname(cachePath).substring(1); + const content = isDirectory ? folderIndex(cachePath) : cache.get(cachePath); + return { found, ext: isDirectory ? 'html' : ext, content }; +}; + +http + .createServer((req, res) => { + const file = prepareFile(req.url); + const mimeType = MIME_TYPE[file.ext] || MIME_TYPE.default; + const statusCode = file.found ? 200 : 404; + res.writeHead(statusCode, { 'content-type': mimeType }); + res.end(file.content); + }) + .listen(PORT, () => + console.log(`Server is running: http://localhost:${PORT}`) + ); diff --git a/JavaScript/4-all/static/errors/404.html b/JavaScript/4-all/static/errors/404.html new file mode 100644 index 0000000..0c50a11 --- /dev/null +++ b/JavaScript/4-all/static/errors/404.html @@ -0,0 +1 @@ +

    file is not exists!

    diff --git a/JavaScript/4-all/static/errors/no-reading.html b/JavaScript/4-all/static/errors/no-reading.html new file mode 100644 index 0000000..4a4f630 --- /dev/null +++ b/JavaScript/4-all/static/errors/no-reading.html @@ -0,0 +1 @@ +

    You do not have permission to read this directory!

    diff --git a/JavaScript/4-all/static/errors/traversal.html b/JavaScript/4-all/static/errors/traversal.html new file mode 100644 index 0000000..0b64017 --- /dev/null +++ b/JavaScript/4-all/static/errors/traversal.html @@ -0,0 +1 @@ +

    Occurrd traversal path!

    diff --git a/JavaScript/4-all/static/favicon.ico b/JavaScript/4-all/static/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/JavaScript/4-all/static/favicon.png b/JavaScript/4-all/static/favicon.png new file mode 100644 index 0000000..e69de29 diff --git a/JavaScript/4-all/static/images/Diophant.png b/JavaScript/4-all/static/images/Diophant.png new file mode 100644 index 0000000000000000000000000000000000000000..4f75ad5ec0ed8b694171d3e82006d69ac9d41cd5 GIT binary patch literal 10526 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 M;Qx+*&@SWu0O(JfTmS$7 literal 0 HcmV?d00001 diff --git a/JavaScript/4-all/static/index.html b/JavaScript/4-all/static/index.html new file mode 100644 index 0000000..3e7d6ca --- /dev/null +++ b/JavaScript/4-all/static/index.html @@ -0,0 +1,15 @@ + + + + + + Document + + + + + + diff --git a/JavaScript/4-all/static/js/init.js b/JavaScript/4-all/static/js/init.js new file mode 100644 index 0000000..e921523 --- /dev/null +++ b/JavaScript/4-all/static/js/init.js @@ -0,0 +1 @@ +console.log('hello'); diff --git a/JavaScript/4-all/static/styles/style.css b/JavaScript/4-all/static/styles/style.css new file mode 100644 index 0000000..a6020bf --- /dev/null +++ b/JavaScript/4-all/static/styles/style.css @@ -0,0 +1,6 @@ +.hello { + background-color: black; + width: 200; + height: 60; + color: white; +}