diff --git a/.eleventy.js b/.eleventy.js index 019091b..f14dadd 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -3,6 +3,7 @@ const pluginRss = require('@11ty/eleventy-plugin-rss'); const timeToRead = require('eleventy-plugin-time-to-read'); const safeLinks = require('@sardine/eleventy-plugin-external-links'); const eleventySass = require("@11tyrocks/eleventy-plugin-sass-lightningcss"); +const related = require("eleventy-plugin-related"); module.exports = function (eleventyConfig) { const parseDate = (str) => { @@ -45,11 +46,35 @@ module.exports = function (eleventyConfig) { eleventyConfig.addFilter('urlescape', str => { return str.split('/').map(part => encodeURI(part)).join('/') - }) + }); + + // this appears to potentially be dependent on rendering order + eleventyConfig.addFilter("related", function(obj) { + const post = this.ctx; + const posts = this.ctx.collections.posts.map(post => post.data); + + const tagScore = (a, b) => { + const total = a.tags.length + b.tags.length; + const intersection = a.tags.filter(tag => b.tags.includes(tag)).length; + return (intersection * 2) / total; + } + + const results = related.related({ + serializer: (doc) => [doc.title, doc.description], + weights: [10, 10], + })(post, posts).map(result => { + return { + relative: result.relative + tagScore(post, result.document), + document: result.document + } + }); + + return results.filter(result => result.relative > 0.0).slice(0,3); + }); eleventyConfig.addCollection('posts', collection => { return collection.getFilteredByGlob('src/posts/*.md').reverse() - }) + }); return { templateFormats: ["njk", "md", "html"], diff --git a/package-lock.json b/package-lock.json index 5734be9..e7c417e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@11ty/eleventy-plugin-syntaxhighlight": "^4.0.0", "@11tyrocks/eleventy-plugin-sass-lightningcss": "^1.0.3", "@sardine/eleventy-plugin-external-links": "^1.4.0", + "eleventy-plugin-related": "^1.0.6", "eleventy-plugin-time-to-read": "^1.3.0" } }, @@ -424,6 +425,15 @@ "node": ">=0.4.0" } }, + "node_modules/afinn-165": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/afinn-165/-/afinn-165-1.0.4.tgz", + "integrity": "sha512-7+Wlx3BImrK0HiG6y3lU4xX7SpBPSSu8T9iguPMlaueRFxjbYwAQrp9lqZUuFikqKbd/en8lVREILvP2J80uJA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -455,6 +465,17 @@ "node": ">= 8" } }, + "node_modules/apparatus": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.10.tgz", + "integrity": "sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg==", + "dependencies": { + "sylvester": ">= 0.0.8" + }, + "engines": { + "node": ">=0.2.6" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -910,6 +931,24 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.401.tgz", "integrity": "sha512-AswqHsYyEbfSn0x87n31Na/xttUqEAg7NUjpiyxC20MaWKLyadOYHMzyLdF78N1iw+FK8/2KHLpZxRdyRILgtA==" }, + "node_modules/eleventy-plugin-related": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/eleventy-plugin-related/-/eleventy-plugin-related-1.0.6.tgz", + "integrity": "sha512-Kg4OrXO8eGZkVA5zdhKKYVjnSEFy7CZIsiJGsGJ6ciC0G8cRxk5oIWxMnMVk5i2k99qN2gsEnA5p18zAr2AenA==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/jpoehnelt" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/jpoehnelt" + } + ], + "dependencies": { + "related-documents": "^1.0.6" + } + }, "node_modules/eleventy-plugin-time-to-read": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eleventy-plugin-time-to-read/-/eleventy-plugin-time-to-read-1.3.0.tgz", @@ -1733,6 +1772,11 @@ "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==" }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", @@ -1947,6 +1991,22 @@ "mustache": "bin/mustache" } }, + "node_modules/natural": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/natural/-/natural-5.2.4.tgz", + "integrity": "sha512-hstvCeNO63go8GMwZIO/wrmcj2oh0Wom2aN7QFF+1I7EJX/NoyM3jWKDbEoCkkQ7CCqqCn0+QdP9Bj2jkD731A==", + "dependencies": { + "afinn-165": "^1.0.2", + "apparatus": "^0.0.10", + "safe-stable-stringify": "^2.2.0", + "sylvester": "^0.0.12", + "underscore": "^1.9.1", + "wordnet-db": "^3.1.11" + }, + "engines": { + "node": ">=0.4.10" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -2418,6 +2478,25 @@ "slash": "^1.0.0" } }, + "node_modules/related-documents": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/related-documents/-/related-documents-1.0.8.tgz", + "integrity": "sha512-NIbJulmApiKxJRSVkXil/TOSYEnnHOmOrG2JtkClva/w+0CV/KqHSlPREyLijayBaT0XNY3htgVc1ubks6VpCw==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/jpoehnelt" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/jpoehnelt" + } + ], + "dependencies": { + "lodash": "^4.17.21", + "natural": "^5.1.13" + } + }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -2476,6 +2555,14 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/sass": { "version": "1.62.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", @@ -2628,6 +2715,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sylvester": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.12.tgz", + "integrity": "sha512-SzRP5LQ6Ts2G5NyAa/jg16s8e3R7rfdFjizy1zeoecYWw+nGL+YA1xZvW/+iJmidBGSdLkuvdwTYEyJEb+EiUw==", + "engines": { + "node": ">=0.2.6" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -2674,6 +2769,11 @@ "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==" }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -2747,6 +2847,14 @@ "node": ">= 10.0.0" } }, + "node_modules/wordnet-db": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/wordnet-db/-/wordnet-db-3.1.14.tgz", + "integrity": "sha512-zVyFsvE+mq9MCmwXUWHIcpfbrHHClZWZiVOzKSxNJruIcFn2RbY55zkhiAMMxM8zCVSmtNiViq8FsAZSFpMYag==", + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 114a5fa..a5ff3cd 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@11ty/eleventy-plugin-syntaxhighlight": "^4.0.0", "@11tyrocks/eleventy-plugin-sass-lightningcss": "^1.0.3", "@sardine/eleventy-plugin-external-links": "^1.4.0", + "eleventy-plugin-related": "^1.0.6", "eleventy-plugin-time-to-read": "^1.3.0" } } diff --git a/src/posts/how-to-hack-an-airline.md b/src/posts/how-to-hack-an-airline.md index dc296fd..9195ac0 100644 --- a/src/posts/how-to-hack-an-airline.md +++ b/src/posts/how-to-hack-an-airline.md @@ -4,6 +4,7 @@ date: 2023-01-19 changed_date: 2023-01-22 description: "and grab the TSA nofly list along the way" tags: + - leak - security - infosec - jenkins diff --git a/src/posts/nebita-malware.md b/src/posts/nebita-malware.md index 1be94a4..de4f926 100644 --- a/src/posts/nebita-malware.md +++ b/src/posts/nebita-malware.md @@ -7,7 +7,7 @@ tags: - infosec - malware - reverse engineering - - php + - analysis feature_image: /img/posts/nebita-malware/cover.jpg feature_alt: "a glitchy edited screenshot of the nebita.com home page" --- diff --git a/src/posts/optimeyes-leak.md b/src/posts/optimeyes-leak.md index b631b6e..62f6f9d 100644 --- a/src/posts/optimeyes-leak.md +++ b/src/posts/optimeyes-leak.md @@ -3,6 +3,7 @@ title: "infosec company owned completely by 4chan user" date: 2023-05-10 description: "risk visualize deez nuts" tags: + - leak - security - infosec - jenkins