Hej, Habr. Dette er den 2. artikel i serien om ssh-chat.
Hvad vi vil gøre:
- Tilføje mulighed for at skabe egne formatteringsfunktioner
- Tilføje støtte til markdown
- Tilføje støtte til bots
- Øge sikkerheden af adgangskoder (hash og salt)
Desværre vil der ikke være filoverførsler
Brugerdefinerede formatteringsfunktioner
I øjeblikket er følgende formatteringsfunktioner implementeret:
@color@bold@underline@hex@box
Men vi bør tilføje mulighed for at skabe egne funktioner:
Alle funktioner opbevares i
Så det vil være tilstrækkeligt at oprette en funktionregisterMethod:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}Denne metode skal også returneres efter oprettelsen af serveren
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethodNår vi opretter serveren, kan vi nu registrere formatteringsmetoder. Eksempel:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hej, ' + formatNick(name) + '!'
})
Støtte til markdown
Markdown er meget praktisk, så vi tilføjer det ved hjælp af
// 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)
Bots
Hvordan det vil fungere
let writeBotBob = chat.registerBot({
name: 'botBob',
onConnect(nick, write){
write('@hello{' + nick + '}')
},
onDisconnect(nick, write){},
onMessage(nick, message, write) {
if(message == 'botBob!') write('Jeg er her')
},
onCommand(command, write) {
write('Udfører ' + command)
}
})onCommand kan kaldes ved hjælp af @bot(botBob){Command}
Alt til arbejde med bots er beskrevet i filen:
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;
};

Hvad kan gøres med bots:
- Belastningsmonitor
- Udrul
- Opgaveliste
Hash og salt
Hvorfor ikke ssh nøgler? Fordi ssh nøglerne vil være forskellige på forskellige enheder
Lad os oprette en fil, der vil tage sig af kontrol og oprettelse af adgangskoder
// 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 = checkPassOg også et script til saltning og hashing af adgangskoder
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))Opdaterer i users.json og i stedet for sammenligning i lobby.js bruger vi checkPassword
Resultat
Resultatet er en chat over ssh med formatteringsmuligheder og bots.
Kilde: habr.com
