View hash-passphrase.js
import util from 'util'; | |
import crypto from 'crypto'; | |
const HASH_ALGO = 'sha512'; | |
// nist recommends 10000, 10x nist, approx 83ms on i7-8650U | |
const HASH_ITERATIONS = 100000; | |
const HASH_SALT_BYTES = 16; // Exceeds NIST Minimum 32/8 (4 bytes) | |
const HASH_BYTES = 64; // Match Hash Algorithm lengh / bits (512 / 8); |
View sanitize-html-browser.js
function sanitizeHtml(input) { | |
if (typeof input !== 'string') return input; | |
if (input.indexOf('<') === -1) return input; | |
const div = document.createElement('div'); | |
div.innerHTML = input; | |
div.querySelectorAll('script').forEach((el) => el.remove()); | |
div.querySelectorAll('style').forEach((el) => el.remove()); | |
div.querySelectorAll('*').forEach((el) => { | |
const events = el.getAttributeNames().filter((a) => a.indexOf('on') === 0); |
View text.dat.js
// save to (exec/mods)/text.dat.js - at the top of login/login/shell files, load('text.dat.js') | |
bbs.replace_text(/* MsgSubj */ 1, "\1n\1h\1c\xda\xc4\xc4\xc4\xc4\xc4\xc4\1n\xc4\xc4\xc4\xc4\xc4\xc4\1h\1k\xc4\xc4\xc4\xc4\xc4\xc4\xc4\1n\1c\xc4\xc4\xc4\xc4\xc4\xfa\xfa\xfa\xfa\r\n\1h\xb3 \1bSubj\1n\1b: \1h\1c%.70s"); | |
bbs.replace_text(/* MsgAttr */ 2, "\r\n\xb3 \1bAttr\1n\1b: \1h\1c%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"); | |
bbs.replace_text(/* MsgTo */ 3, "\r\n\xb3 \1bTo \1n\1b: \1h\1c%.70s"); | |
bbs.replace_text(/* MsgToExt */ 4, " #%s"); | |
bbs.replace_text(/* MsgToNet */ 5, " (%.40s)"); | |
bbs.replace_text(/* MsgFrom */ 6, "\r\n\1w\xb3 \1bFrom\1n\1b: \1h\1c%.33s"); | |
bbs.replace_text(/* MsgFromExt */ 7, " #%s"); | |
bbs.replace_text(/* MsgFromNet */ 8, " (%.35s)"); | |
bbs.replace_text(/* MsgDate */ 9, "\r\n\1w\xb3 \1bDate\1n\1b: \1h\1c%.24s %s (%s)\r\n\1w\xc0\xc4\xc4\xc4\xc4\xc4\xc4\1c\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\1n\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\1h\1k\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\1n\1c\xc4\xc4\xc4\xc4\xc4\xc4\xc4\ |
View .eslintrc.js
module.exports = { | |
parser: 'babel-eslint', | |
extends: ['plugin:prettier/recommended', 'prettier/react'], | |
plugins: ['prettier', 'jest'], | |
parserOptions: { | |
sourceType: 'module', | |
ecmaVersion: 2020, | |
ecmaFeatures: { | |
jsx: true, | |
}, |
View settings.json
{ | |
"editor.rulers": [ | |
76, | |
80 | |
], | |
"editor.tabSize": 2, | |
"editor.renderControlCharacters": true, | |
"files.encoding": "cp437", | |
"files.associations": { | |
"*.ssjs": "javascript" |
View load-component-import.js
/* | |
/feature/load-component-import.js | |
This is used by any async loading areas of the application | |
import load from '../load-component-import.js'; | |
const FooComponentAsync = load(() => import('./FooComponent'))'; | |
*/ | |
import React, { Suspense } from 'react'; |
View precheck.js
// precheck | |
try { | |
eval('(function() { async _ => _; })();'); | |
if (typeof fetch !== 'function') throw new Error('No fetch api'); | |
} catch (e) { | |
// render unsupported message in half a second - after error trap | |
window.setTimeout(function() { | |
// fallback render for development | |
var body = document.getElementsByTagName('body')[0]; | |
body.className = 'message'; |
View settings.json
{ | |
"editor.rulers": [ | |
76, | |
80 | |
], | |
"editor.tabSize": 2, | |
"editor.renderControlCharacters": true, | |
"files.encoding": "cp437", | |
"files.associations": { | |
"*.ssjs": "javascript" |
View future.js
module.exports = () => { | |
// break resolve and reject out of a promise | |
let resolve, reject; | |
const promise = new Promise((res, rej) => { | |
resolve = res; | |
reject = rej; | |
}); | |
// return as a future | |
return { |
View index.js
/* | |
The application uses os-service module to register itself in to an | |
environment based on command line parameters. | |
*/ | |
const SERVICE_NAME = "my-service-name"; // TODO: changeme | |
// https://www.npmjs.com/package/os-service - using fork for 12.13 for now | |
const service = require("os-service"); | |
const startServer = require("./feature/web-server"); |
NewerOlder