Ssh-chat, partie 2

Bonjour, Habr. Voici le 2ème article de la série ssh-chat.

Ce que nous allons faire :

  • Ajouter la possibilité de créer des fonctions de formatage personnalisées
  • Ajouter le support du markdown
  • Ajouter le support des bots
  • Augmenter la sécurité des mots de passe (hash et sel)
    Malheureusement, l'envoi de fichiers ne sera pas possible

Fonctions de formatage personnalisées

À l'heure actuelle, le support des fonctions de formatage suivantes est implémenté :

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Mais nous devrions ajouter la possibilité de créer nos propres fonctions :
    Toutes les fonctions sont stockées dans un objet nommé methods
    Il suffira donc de créer une fonction registerMethod:

// parserExec.js at end
module.exports.registerMethod  =  function(name, func) {
  methods[name] =  func
}

Ce même méthode doit être retournée après la création du serveur

// index.js at require part
const { registerMethod } = require('./parserExec')

// index.js at end
module.exports.registerMethod  =  registerMethod

Maintenant, lors de la création du 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 'Salut, ' + formatNick(name) + ' !'
})

Ssh-chat, partie 2

Support du markdown

Le markdown est très pratique, alors nous l'ajouterons avec marked terminal

// 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 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('Je suis là')
  },

  onCommand(command, write) {
    write('En train de faire ' + command)
  }
})

onCommand peut être appelé avec @bot(botBob){Command}

Tout ce qui concerne le travail 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;
};

Ssh-chat, partie 2

Ce qui peut être fait avec les bots :

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

Hash et sel

Pourquoi pas des clés ssh ? Parce que les clés ssh seront différentes sur différents appareils
Nous allons créer un fichier qui s'occupera 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

Ainsi qu'un script pour le salage et le hachage du mot de passe

// To generate password run node ./encryptPassword password
const { encodePass } =require('./crypto')
console.log(encodePass(process.argv[2]))

Mettre à jour dans users.json et au lieu de comparer dans lobby.js, utiliser checkPassword

Conclusion

En conséquence, nous avons un chat ssh avec des capacités de formatage et des bots.
Dépôt final

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster