134 lines
3.3 KiB
JavaScript
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');
|
|
});
|
|
}
|
|
};
|
|
|