Ssh-chat, partie 2

Salut, Habr. Il s'agit de l'article 2 de la boucle ssh-chat.


Ce que nous ferons:


  • Ajoutez la possibilité de créer vos propres fonctions de conception.
  • Ajouter un support de démarque
  • Ajouter le support du bot
  • Augmentez la sécurité des mots de passe (hachage et sel)
    Hélas, il n'y aura pas d'envoi de fichiers

Fonctions de mise en page personnalisées


Prise en charge actuellement implémentée des fonctionnalités de conception suivantes:


  • @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 un methods
    Il suffira donc de créer la fonction registerMethod :

 // 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 

Maintenant, lors de la création d'un serveur, nous pouvons enregistrer des méthodes de formatage. Un exemple:


 const chat = require('.') const { formatNick } = require('./format') chat({}) chat.registerMethod('hello', function(p, name){ return 'Hi, ' + formatNick(name) + '!' }) 


Prise en charge de Markdown


Le démarquage est très pratique, alors ajoutez-le en utilisant un terminal marqué


 // 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 cela fonctionnera


 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é à l'aide de @bot(botBob){Command}


Tout pour travailler avec les 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; }; 


Que peut-on faire avec les bots:


  • Moniteur de charge
  • Déployer
  • Tableau des tâches

Hash et sel


Pourquoi pas les clés ssh? Parce que les clés ssh seront différentes sur différents appareils
Créer un fichier dans lequel sera responsable de la vérification et de la création des 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 un 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


Résumé


En conséquence, nous avons ssh chat avec des options de conception et des bots.
Dépôt final

Source: https://habr.com/ru/post/fr467543/


All Articles