-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
149 lines (123 loc) · 3.63 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
const express = require("express");
const fs = require("fs");
const path = require("path");
const promisify = require("util.promisify");
const crypto = require("crypto");
const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);
const readDir = promisify(fs.readdir);
const unlink = promisify(fs.unlink);
console.log("Arguments", process.argv);
const app = express();
const getExistingFilesNames = async (files) => {
const ret = [];
for (let i = 0; i < files.length; ++i) {
const file = await readFile(path.join(__dirname, "uploads", files[i]));
const data = JSON.parse(file);
ret.push(data.name + (data.pass ? "*" : ""));
}
return ret;
};
const getFileDiskName = (userName) => {
const hasher = crypto.createHash("whirlpool");
return hasher.update(userName).digest("hex");
};
{
// loggers
// log API request
app.use((req, res, next) => {
console.log("Request method", req.method, "received for", req.path);
next();
});
// log empty file request(additional)
app.get("/file", (req, res, next) => {
console.log("Empty file requested");
next();
});
}
app.get("/file", async (req, res) => {
const files = await readDir(path.join(__dirname, "uploads"));
const names = await getExistingFilesNames(files);
return res.json(names);
});
app.put("/file/:name/:content?", async (req, res) => {
const hash = getFileDiskName(req.params.name);
const obj = JSON.stringify({
name: req.params.name,
hash,
content: req.params.content,
pass: undefined,
});
try {
await writeFile(path.join(__dirname, "uploads", `${hash}.txt`), obj);
return res.send(req.params.content);
} catch (error) {
res.status(500);
res.send(error.message);
}
});
app.delete("/file/:name", async (req, res, next) => {
const hash = getFileDiskName(req.params.name);
const fileName = path.join(__dirname, "uploads", `${hash}.txt`);
let content;
try {
content = JSON.parse(await readFile(fileName));
} catch (err) {
return res.status(403).send("File not found");
}
try {
if (content.pass && req.query.pass === content.pass) {
await unlink(fileName);
return res.send(true);
} else {
if (!content.pass) {
await unlink(fileName);
return res.send(true);
}
res.status(403).send("File is Protected");
}
} catch (err) {
res.status(500).send(err.message);
}
});
app.post("/file/:name", async (req, res) => {
const hash = getFileDiskName(req.params.name);
const fileName = path.join(__dirname, "uploads", `${hash}.txt`);
try {
const content = JSON.parse(await readFile(fileName));
if (content.pass && req.query.pass !== content.pass) {
return res.status(403).send("File is Protected");
}
content.pass = req.query.pass;
await writeFile(fileName, JSON.stringify(content));
res.status(200).send("Password set");
} catch (err) {
res.status(500);
res.send(err.message);
}
});
app.get("/file/:name", async (req, res) => {
const hash = getFileDiskName(req.params.name);
const fileName = path.join(__dirname, "uploads", `${hash}.txt`);
try {
const content = JSON.parse(await readFile(fileName));
if (content.pass && req.query.pass === content.pass) {
return res.send(content.content);
} else {
if (!content.pass) {
return res.send(content.content);
}
res.status(403).send("File is Protected");
}
} catch (err) {
if (err.code === "ENOENT") {
res.status(404).send("File not found");
return;
}
res.status(500);
res.send(err.message);
}
});
app.listen(2000, () => {
console.log("App is listening on", 2000);
});