Bonjour Habr. Ceci est le 2ème article de la série ssh-chat.
Qu'allons nous faire:
- Ajoutons la possibilité de créer vos propres fonctions de conception
- Ajoutons la prise en charge des démarques
- Ajoutons la prise en charge des robots
- Augmenter la sécurité des mots de passe (hachage et sel)
Désolé, mais il n'y aura pas d'envoi de fichiers.
Fonctionnalités de conception personnalisées
Actuellement, les fonctions de conception suivantes sont prises en charge :
@color
@bold
@underline
@hex
@box
Mais cela vaut la peine d'ajouter la possibilité de créer vos propres fonctions :
Toutes les fonctions sont stockées dansобъекте под названием methods
Il suffira donc de créer une fonctionregisterMethod
:
// parserExec.js at end
module.exports.registerMethod = function(name, func) {
methods[name] = func
}
Vous devez également renvoyer cette méthode après avoir créé le serveur
// index.js at require part
const { registerMethod } = require('./parserExec')
// index.js at end
module.exports.registerMethod = registerMethod
Désormais, lors de la création d'un serveur, nous pouvons enregistrer des méthodes de formatage. Exemple:
const chat = require('.')
const { formatNick } = require('./format')
chat({})
chat.registerMethod('hello', function(p, name){
return 'Hi, ' + formatNick(name) + '!'
})
Prise en charge des démarques
Markdown est très pratique, alors ajoutons-le en utilisant
// 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
Comment ça va marcher
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
peut être appelé avec @bot(botBob){Command}
Tout pour travailler avec des bots est décrit dans le fichier :
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 que vous pouvez faire avec les robots :
- Moniteur de charge
- Déployer
- Tableau des tâches
Hachis et sel
Pourquoi pas les clés ssh ? Parce que les clés ssh seront différentes sur différents appareils
Créons un fichier qui se chargera de vérifier et de créer les mots de passe
// 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
Également un script pour saler et hacher le mot de passe
// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))
Nous mettons à jour dans users.json et au lieu de comparer dans lobby.js, nous utilisons checkPassword
Total
En conséquence, nous discutons via ssh avec des capacités de conception et des robots.
Source: habr.com