Browse Source

black listing improved

master
Christian Müller 10 years ago
parent
commit
8ee00da09a
  1. 2
      package.json
  2. 0
      resources/misuse.txt
  3. 0
      resources/misuses.txt
  4. 2
      resources/template.html
  5. 13
      server.js
  6. 14
      src/view.js

2
package.json

@ -16,7 +16,7 @@
"markdown", "markdown",
"pastebin" "pastebin"
], ],
"author": "Christian Müller <notehub@icloud.com> (http://github.com/chmllr)", "author": "Christian Müller <notehub@icloud.com> (http://twitter.com/drmllr)",
"license": "ISC", "license": "ISC",
"bugs": { "bugs": {
"url": "https://github.com/chmllr/NoteHub/issues" "url": "https://github.com/chmllr/NoteHub/issues"

0
resources/misuse.txt

0
resources/misuses.txt

2
resources/template.html

@ -7,7 +7,7 @@
<link href="/style.css" rel="stylesheet" type="text/css" /> <link href="/style.css" rel="stylesheet" type="text/css" />
</head> </head>
<body> <body>
%MISUSE% %HEADER%
<article> <article>
%CONTENT% %CONTENT%
</article> </article>

13
server.js

@ -4,6 +4,8 @@ var storage = require('./src/storage');
var md5 = require('md5'); var md5 = require('md5');
var LRU = require("lru-cache") var LRU = require("lru-cache")
var bodyParser = require('body-parser'); var bodyParser = require('body-parser');
var fs = require('fs');
var blackList = new Set();
var app = express(); var app = express();
@ -143,7 +145,7 @@ app.get(/\/([a-z0-9]+)/, function(req, res) {
CACHE.set(link, null); CACHE.set(link, null);
return notFound(res); return notFound(res);
} }
var content = view.renderNote(note); var content = view.renderNote(note, blackList);
CACHE.set(link, content); CACHE.set(link, content);
MODELS[link] = note; MODELS[link] = note;
note.views++; note.views++;
@ -166,4 +168,11 @@ setInterval(() => {
var keys = Object.keys(MODELS); var keys = Object.keys(MODELS);
log("saving stats for", keys.length, "models..."); log("saving stats for", keys.length, "models...");
keys.forEach(id => MODELS[id].save()) keys.forEach(id => MODELS[id].save())
}, 60 * 5 * 1000); }, 5 * 60 * 1000);
setInterval(() => {
var ids = fs.readFileSync(process.env.BLACK_LIST || "/dev/null", "utf-8").split(/\n+/).filter(Boolean);
ids.forEach(id => CACHE.del(id))
blackList = new Set(ids);
log("black list updated:", blackList.size, "entries:", blackList);
}, 10 * 1000)

14
src/view.js

@ -5,15 +5,15 @@ var TOS = fs.readFileSync("resources/TOS.md", "utf-8");
var pageTemplate = fs.readFileSync("resources/template.html", "utf-8"); var pageTemplate = fs.readFileSync("resources/template.html", "utf-8");
var footerTemplate = fs.readFileSync("resources/footer.html", "utf-8"); var footerTemplate = fs.readFileSync("resources/footer.html", "utf-8");
var editTemplate = fs.readFileSync("resources/edit.html", "utf-8"); var editTemplate = fs.readFileSync("resources/edit.html", "utf-8");
var misuseScript = fs.readFileSync("resources/misuse.txt", "utf-8"); var header = fs.readFileSync(process.env.HEADER || "/dev/null", "utf-8");
var misuses = new Set(fs.readFileSync("resources/misuses.txt", "utf-8").split(/\s+/)); var defaultBL = new Set();
var deriveTitle = text => text var deriveTitle = text => text
.split(/[\n\r]/)[0].slice(0,25) .split(/[\n\r]/)[0].slice(0,25)
.replace(/[^a-zA-Z0-9\s]/g, ""); .replace(/[^a-zA-Z0-9\s]/g, "");
var renderPage = (id, title, content, footer) => pageTemplate var renderPage = (id, title, content, footer, blackList) => pageTemplate
.replace("%MISUSE%", misuses.has(id) ? misuseScript : "") .replace("%HEADER%", (blackList || defaultBL).has(id) ? header : "")
.replace("%TITLE%", title) .replace("%TITLE%", title)
.replace("%CONTENT%", content.replace(/<meta.*?>/gi, "").replace(/<script[\s\S.]*?\/script>/gi, "")) .replace("%CONTENT%", content.replace(/<meta.*?>/gi, "").replace(/<script[\s\S.]*?\/script>/gi, ""))
.replace("%FOOTER%", footer || ""); .replace("%FOOTER%", footer || "");
@ -31,9 +31,11 @@ module.exports.renderStats = note => renderPage(note.id, deriveTitle(note.text),
module.exports.renderTOS = () => module.exports.renderTOS = () =>
renderPage("tos", "Terms of Service", marked(TOS)); renderPage("tos", "Terms of Service", marked(TOS));
module.exports.renderNote = note => renderPage(note.id, deriveTitle(note.text), module.exports.renderNote = (note, blackList) => renderPage(note.id,
deriveTitle(note.text),
marked(note.text), marked(note.text),
footerTemplate.replace(/%LINK%/g, note.id)); footerTemplate.replace(/%LINK%/g, note.id),
blackList);
module.exports.newNotePage = session => editTemplate module.exports.newNotePage = session => editTemplate
.replace("%ACTION%", "POST") .replace("%ACTION%", "POST")

Loading…
Cancel
Save