Ssh-chat, partea 2

Salut, Habr. Acesta este articolul 2 din seria ssh-chat.

Ce vom face:

  • Vom adăuga capacitatea de a crea propriile funcții de formatare
  • Vom adăuga suport pentru markdown
  • Vom adăuga suport pentru boți
  • Vom crește securitatea parolelor (hash și salt)
    Din păcate, nu va exista suport pentru trimiterea fișierelor

Funcții de formatare personalizate

În prezent, este implementat suport pentru următoarele funcții de formatare:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Dar trebuie să adăugăm capacitatea de a crea propriile funcții:
    Toate funcțiile sunt stocate în un obiect numit methods
    Așadar, va fi suficient să creăm o funcție registerMethod:

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

De asemenea, trebuie să returnăm acest metod după crearea serverului

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

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

Acum, atunci când creăm serverul, putem înregistra metodele de formatare. Exemplu:

const chat = require('.')
const { formatNick } = require('./format')

chat({})

chat.registerMethod('hello', function(p, name){
  return 'Salut, ' + formatNick(name) + '!'
})

Ssh-chat, partea 2

Suport pentru markdown

Markdown este foarte convenabil, așa că îl vom adăuga cu ajutorul 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, partea 2

Boți

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('Sunt aici')
  },

  onCommand(command, write) {
    write('Executând ' + command)
  }
})

onCommand poate fi apelat folosind @bot(botBob){Command}

Totul despre lucrul cu boții este descris în fișierul:

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, partea 2

Ce se poate face cu boții:

  • Monitorizarea încărcării
  • Desfășoară
  • Tabloul de sarcini

Hash și salt

De ce nu chei ssh? Pentru că cheile ssh vor fi diferite pe dispozitive diferite
Vom crea un fișier care se va ocupa cu 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 sărăcirea și hasharea parolei

// 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 de comparație în lobby.js, folosim checkPassword

Rezultatul

În rezultatul final, avem un chat prin ssh cu opțiuni de formatare și boți.
Repository-ul final

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster