Salut, Habr. Acesta este articolul 2 din seria ssh-chat.
Ce vom face:
- Vom adăuga capacitatea de a crea propriile funcții de formatare
- Vom adăuga suport pentru markdown
- Vom adăuga suport pentru boți
- Vom crește securitatea parolelor (hash și salt)
Din păcate, nu va exista suport pentru trimiterea fișierelor
Funcții de formatare personalizate
În prezent, este implementat suport pentru următoarele funcții de formatare:
@color@bold@underline@hex@box
Dar trebuie să adăugăm capacitatea de a crea propriile funcții:
Toate funcțiile sunt stocate în
Așadar, va fi suficient să creăm o funcțieregisterMethod:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}De asemenea, trebuie să returnăm acest metod după crearea serverului
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethodAcum, atunci când creăm serverul, putem înregistra metodele de formatare. Exemplu:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Salut, ' + formatNick(name) + '!'
})
Suport pentru markdown
Markdown este foarte convenabil, așa că îl vom adăuga cu ajutorul
// format.js near require
const marked = require('marked');
const TerminalRenderer = require('marked-terminal');
marked.setOptions({
renderer: new TerminalRenderer()
});
// format.js line 23
message = marked(message)
Boți
Cum va funcționa
let writeBotBob = chat.registerBot({
name: 'botBob',
onConnect(nick, write){
write('@hello{' + nick + '}')
},
onDisconnect(nick, write){},
onMessage(nick, message, write) {
if(message == 'botBob!') write('Sunt aici')
},
onCommand(command, write) {
write('Executând ' + command)
}
})onCommand poate fi apelat folosind @bot(botBob){Command}
Totul despre lucrul cu boții este descris în fișierul:
let bots = []; // Все боты
let onWrite = () => {};
function getWrite(bot) { // Генерирует метод отправки сообщения для бота
return msg => {
onWrite(bot.name, msg);
};
}
module.exports.message = function message(nick, message) { // index.js выполнит эту функцию после отправки сообщения
bots.forEach(bot => {
try {
bot.onMessage(nick, message, getWrite(bot));
} catch (e) {
console.error(e);
}
});
};
module.exports.connect = function message(nick) { // При соединении
bots.forEach(bot => {
try {
bot.onConnect(nick, getWrite(bot));
} catch (e) {
console.error(e);
}
});
};
module.exports.disConnect = function message(nick) { // При отсоединении
bots.forEach(bot => {
try {
bot.onDisconnect(nick, message, getWrite(bot));
} catch (e) {
console.error(e);
}
});
};
module.exports.command = function message(name, message) { // При выполнении команды
bots.forEach(bot => {
if (bot.name == name) {
try {
bot.onCommand(message, getWrite(bot));
} catch (e) {
console.error(e);
}
}
});
};
module.exports.registerBot = function(bot) {
bots.push(bot);
return getWrite(bot)
};
module.exports.onMessage = func => {
onWrite = func;
};

Ce se poate face cu boții:
- Monitorizarea încărcării
- Desfășoară
- Tabloul de sarcini
Hash și salt
De ce nu chei ssh? Pentru că cheile ssh vor fi diferite pe dispozitive diferite
Vom crea un fișier care se va ocupa cu verificarea și crearea parolelor
// crypto.js
const crypto = require('crypto');
function genRandomString(length) {
return crypto
.randomBytes(Math.ceil(length / 2))
.toString('hex')
.slice(0, length);
}
function sha512(password, salt){
const hash = crypto.createHmac('sha512', salt); /** Hashing algorithm sha512 */
hash.update(password);
const value = hash.digest('hex');
return value
};
function checkPass(pass, obj){
return obj.password == sha512(pass, obj.salt)
}
function encodePass(pass){
const salt = genRandomString(16)
return JSON.stringify({
salt,
password: sha512(pass, salt)
})
}
module.exports.encodePass = encodePass
module.exports.checkPass = checkPassDe asemenea, un script pentru sărăcirea și hasharea parolei
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))Actualizăm în users.json și, în loc de comparație în lobby.js, folosim checkPassword
Rezultatul
În rezultatul final, avem un chat prin ssh cu opțiuni de formatare și boți.
Sursa: habr.com
