Ssh-chat, partea 2

Bună, Habr. Acesta este al 2-lea articol din seria ssh-chat.

Ce vom face:

  • Să adăugăm posibilitatea de a crea propriile funcții de design
  • Să adăugăm suport pentru reduceri
  • Să adăugăm suport pentru bot
  • Creșteți securitatea parolei (hash și sare)
    Ne pare rău, dar nu se vor trimite fișiere.

Caracteristici de design personalizat

În prezent, sunt acceptate următoarele funcții de proiectare:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Dar merită să adăugați capacitatea de a vă crea propriile funcții:
    Toate funcțiile sunt stocate în объекте под названием methods
    Deci va fi suficient să creați o funcție registerMethod:

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

De asemenea, trebuie să returnați această metodă după crearea serverului

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

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

Acum, când creăm un server, putem înregistra metode de formatare. Exemplu:

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

chat({})

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

Ssh-chat, partea 2

Suport pentru Markdown

Markdown este foarte convenabil, așa că să-l adăugăm folosind terminal marcat

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

Roboții

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('I'm here')
  },

  onCommand(command, write) {
    write('Doing ' + command)
  }
})

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

Totul pentru lucrul cu roboți este descris în fișier:

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 poți face cu boții:

  • Monitor de încărcare
  • Lansa
  • Taskboard

Haș și sare

De ce nu chei ssh? Deoarece cheile ssh vor fi diferite pe diferite dispozitive
Să creăm un fișier care va fi responsabil pentru 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 sare și hashing parola

// 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 să comparăm în lobby.js, folosim checkPassword

Total

Drept urmare, avem o conversație prin ssh cu capabilități de design și roboți.
Depozitul final

Sursa: www.habr.com

Adauga un comentariu