Ssh-chat, partie 2

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

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) +  '!'
})

Ssh-chat, partie 2

Prise en charge des démarques

Markdown est très pratique, alors ajoutons-le en utilisant borne marquée

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

Ssh-chat, partie 2

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;
};

Ssh-chat, partie 2

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.
Dépôt final

Source: habr.com

Ajouter un commentaire