-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTSVMan.js
155 lines (133 loc) · 6.22 KB
/
TSVMan.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
150
const { Util } = require("./Util");
let util = new Util();
const startup_time = util.niceDate();
console.log(`${startup_time} : TSVMan v1.0.1 is starting up...`);
const crypto = require('crypto');
try {
const crypto_test = crypto.randomUUID();
} catch(err) {
console.log(`${util.niceDate()} : NodeJS is too out of date to start TSVMan! Please update NodeJS / NPM from the latest stable installer at NodeJS.org`);
process.exit(1);
};
const express = require("express");
const os = require("os");
const router = express.Router();
const e = require("express");
const app = express();
const fs = require('fs');
const cors = require('cors');
const path = require('path');
const rimraf = require('rimraf');
const service_port = Number(process.env.SERVICE_PORT) || 80;
const secret_key = process.env.SECRET_KEY || "security";
const hours_to_keep_tsv = process.env.HOURS_TO_KEEP_TSV || 48;
const ms_to_keep_tsv = ((hours_to_keep_tsv * 60) * 60) * 1000;
app.use("/", router);
app.use(cors({ origin: '*', methods: ['GET', 'POST'] }));
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
let jsonParser = express.json();
let serve_count = 0;
let create_count = 0;
let error_count = 0;
try {
router.post("/createTSV", jsonParser, (req, res) => {
let key = req.body.secret_key || "";
if (key != secret_key) { res.status(403).send("Missing or incorrect secret key!"); return false; }
let urls = req.body.urls;
if (!urls || urls.length < 1) { res.status(400).send("Missing expected array of URLs!"); return false; }
let urlstring = urls.join("\n");
let tsvdata = `TsvHttpData-1.0\n${urlstring}`;
console.log(`${util.niceDate()} : Creating TSV from these ${urls.length} URLs: ${urls.join(", ")}`);
let uuid = crypto.randomUUID();
let tsvname = `${uuid}_${Date.now()}`;
if (req.body.public) {
tsvname = `public_${tsvname}`;
}
let tsvpath = `./TSV/${tsvname}.tsv`;
fs.writeFile(tsvpath, tsvdata, () => {
res.status(200).send(tsvname.replace("public_", ""));
let ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress || "an unidentified private user"
console.log(`${util.niceDate()} : Created TSV ${tsvpath} for ${ip} ${req.body.public ? "(Publicly Accessible)" : ""}`);
create_count++;
return true;
});
});
router.get("/", (req, res) => {
res.send(`<body style="background-color:#2F4F4F;color:white;font-size:1.3em;font-family: Verdana, Helvetica, sans-serif;"><strong>TSVMan is up and running since ${startup_time}</strong><br><br>Since then, we have served <strong>${serve_count}</strong> TSVs, created <strong>${create_count}</strong> TSVs, and encountered <strong>${error_count}</strong> errors.<br><br>Have a great day!`)
});
router.get("/getTSV", (req, res) => {
let public_key = req.query.public_key || null;
if (public_key) {
if (fs.existsSync(`./TSV/public_${public_key}.tsv`)) {
try {
fs.createReadStream(`./TSV/public_${public_key}.tsv`).pipe(res);
let ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress || "an unidentified public user"
console.log(`${util.niceDate()} : Served Public TSV public_${public_key}.tsv to ${ip.replace(/::ffff:/, "")}`);
serve_count++;
return true;
} catch (e) {
res.status(500).send(e);
console.error(e);
error_count++
}
} else {
res.status(404).send("That TSV could not be located!");
return false;
}
} else {
let key = req.query.secret_key || "";
if (key != secret_key) { res.status(403).send("Missing or incorrect secret key!"); return false; }
let tsv_key = req.query.tsv_key || null;
if (tsv_key) {
if (fs.existsSync(`./TSV/${tsv_key}.tsv`) || fs.existsSync(`./TSV/public_${tsv_key}.tsv`)) {
try {
let public = "";
if (!fs.existsSync(`./TSV/${tsv_key}.tsv`)) {public = "public_"}
fs.createReadStream(`./TSV/${public}${tsv_key}.tsv`).pipe(res)
let ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress || "an unidentified private user"
console.log(`${util.niceDate()} : Served TSV ${tsv_key} to ${ip.replace(/::ffff:/, "")}`);
serve_count++;
} catch(error) {
res.status(500).send(error);
console.error(error);
error_count++
}
} else {
res.status(404).send("That TSV could not be located!");
return false;
}
} else {
res.status(400).send("No TSV key provided!")
return false;
}
}
});
app.listen(service_port, () => { console.log(`${util.niceDate()} : TSVMan is ready, listening on port ${service_port}`); });
setInterval(() => {
var uploadsDir = __dirname + '/TSV';
fs.readdir(uploadsDir, function (err, files) {
files.forEach(function (file, index) {
fs.stat(path.join(uploadsDir, file), function (err, stat) {
var endTime, now;
if (err) {
return console.error(err);
}
now = new Date().getTime();
endTime = new Date(stat.ctime).getTime() + ms_to_keep_tsv;
if (now > endTime) {
return rimraf(path.join(uploadsDir, file), function (err) {
if (err) {
return console.error(err);
}
console.log(`${util.niceDate()} : ${file} was deleted since it is over ${hours_to_keep_tsv} hours old.`);
});
}
});
});
});
}, 3600000);
} catch (e) {
console.error(`${util.niceDate()} : Error! ${e}`)
error_count++;
}