Bună, Habr. Acesta este al 2-lea articol din seria ssh-chat.
Ce vom face:
- Să adăugăm posibilitatea de a crea propriile funcții de design
- Să adăugăm suport pentru reduceri
- Să adăugăm suport pentru bot
- Creșteți securitatea parolei (hash și sare)
Ne pare rău, dar nu se vor trimite fișiere.
Caracteristici de design personalizat
În prezent, sunt acceptate următoarele funcții de proiectare:
@color
@bold
@underline
@hex
@box
Dar merită să adăugați capacitatea de a vă crea propriile funcții:
Toate funcțiile sunt stocate înобъекте под названием methods
Deci va fi suficient să creați o funcțieregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
De asemenea, trebuie să returnați această metodă după crearea serverului
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethod
Acum, când creăm un server, putem înregistra metode de formatare. Exemplu:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hi, ' + formatNick(name) + '!'
})
Suport pentru Markdown
Markdown este foarte convenabil, așa că să-l adăugăm folosind
// 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)
Roboții
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('I'm here')
},
onCommand(command, write) {
write('Doing ' + command)
}
})
onCommand
poate fi apelat folosind @bot(botBob){Command}
Totul pentru lucrul cu roboți este descris în fișier:
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 poți face cu boții:
- Monitor de încărcare
- Lansa
- Taskboard
Haș și sare
De ce nu chei ssh? Deoarece cheile ssh vor fi diferite pe diferite dispozitive
Să creăm un fișier care va fi responsabil pentru 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 = checkPass
De asemenea, un script pentru sare și hashing parola
// 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 să comparăm în lobby.js, folosim checkPassword
Total
Drept urmare, avem o conversație prin ssh cu capabilități de design și roboți.
Sursa: www.habr.com