2022-01-07 22:23:47 +01:00

134 lines
3.3 KiB
JavaScript

/*
* Gemini Library
*/
//'use strict';
const fs = require('fs');
const constants = require('constants');
const tls = require('tls');
const url = require('url').URL;
const Router = require('./router');
const Request = require('./request');
const Response = require('./response');
const { time } = require('console');
const router = new Router();
const req = new Request();
const res = new Response();
module.exports.App = class App {
constructor(name) {
this.name = name;
}
display() {
console.log("my Name is " + this.name);
}
valid(startdate, enddate) {
var startdate_ = Date.parse(startdate);
var enddate_ = Date.parse(enddate);
var today_ = Date.now();
if (today_ >= startdate_ && today_ <= enddate_) {
return true;
} else {
return false;
}
}
fileExist(path) {
return fs.existsSync(settings.root + path);
}
isDirectory(path) {
return fs.statSync(settings.root + path).isDirectory();
}
getPage(path, next) {
var index;
fs.readFile(this.settings.root + path, 'utf8', function(err, data) {
if(err) {
console.log('ERROR: ' + err);
return;
} else {
index = data;
next(index);
}
});
}
};
module.exports.Gemini = class Gemini {
constructor() {
this.req = req;
this.res = res;
this.router = router;
this.settings = {
root: 'geminiroot/',
index: 'index.gml',
port: 1965
};
this.options = {
key: fs.readFileSync('cert/localhost-key.pem'),
cert: fs.readFileSync('cert/localhost-cert.pem'),
passphrase: "rdeci3kombi",
agent: false,
requestCert: true,
rejectUnauthorized: false,
ciphers: 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS',
honorCipherOrder: true,
secureOptions: constants.SSL_OP_NO_SSLv3 | constants.SSL_OP_NO_SSLv2,
};
this.server = tls.createServer(this.options, function(c) {
c.on('end', function() {
//do nothing
});
c.on('error', function(err) {
let timestamp = Date.now();
let date_ob = new Date(timestamp);
let utc = date_ob.toUTCString();
console.log(`[${utc}] ${c.remoteAddress} ${req.path} ERR: ${err}`);
});
c.on('data', function(data) {
var timestamp = Date.now();
let date_ob = new Date(timestamp);
let date = date_ob.getDate();
let month = date_ob.getMonth() + 1;
let year = date_ob.getFullYear();
let hour = date_ob.getHours();
let minute = date_ob.getMinutes();
let second = date_ob.getSeconds();
let utc = date_ob.toUTCString();
req.setClientCert(c.getPeerCertificate());
req.setRawRequest(data);
req.parseRequest();
req.setClientIP(c.remoteAddress);
req.setClientPort(c.remotePort);
req.setClientFamily(c.remoteFamily);
res.setSocket(c);
router.set(req.path, req, res);
c.end();
var timestamp2 = Date.now();
var requestTime = timestamp2 - timestamp;
console.log(`[${utc}] ${c.remoteAddress} ${req.path} - \x1b[33m${res.status}\x1b[0m - \x1b[36m${requestTime}ms\x1b[0m`);
});
});
}
listen() {
this.server.listen(this.settings.port, function() {
console.log('Gemini Server Bound');
});
}
};