/* * 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'); }); } };