Ssh-chat, del 2

Hej, Habr. Dette er den 2. artikel i serien om ssh-chat.

Hvad vi vil gøre:

  • Tilføje mulighed for at skabe egne formatteringsfunktioner
  • Tilføje støtte til markdown
  • Tilføje støtte til bots
  • Øge sikkerheden af adgangskoder (hash og salt)
    Desværre vil der ikke være filoverførsler

Brugerdefinerede formatteringsfunktioner

I øjeblikket er følgende formatteringsfunktioner implementeret:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Men vi bør tilføje mulighed for at skabe egne funktioner:
    Alle funktioner opbevares i et objekt kaldet methods
    Så det vil være tilstrækkeligt at oprette en funktion registerMethod:

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

Denne metode skal også returneres efter oprettelsen af serveren

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

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

Når vi opretter serveren, kan vi nu registrere formatteringsmetoder. Eksempel:

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

chat({})

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

Ssh-chat, del 2

Støtte til markdown

Markdown er meget praktisk, så vi tilføjer det ved hjælp af 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, del 2

Bots

Hvordan det vil fungere

let writeBotBob = chat.registerBot({
  name: 'botBob',

  onConnect(nick, write){
    write('@hello{' + nick + '}')
  },

  onDisconnect(nick, write){},

  onMessage(nick, message, write) {
    if(message == 'botBob!') write('Jeg er her')
  },

  onCommand(command, write) {
    write('Udfører ' + command)
  }
})

onCommand kan kaldes ved hjælp af @bot(botBob){Command}

Alt til arbejde med bots er beskrevet i filen:

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

Hvad kan gøres med bots:

  • Belastningsmonitor
  • Udrul
  • Opgaveliste

Hash og salt

Hvorfor ikke ssh nøgler? Fordi ssh nøglerne vil være forskellige på forskellige enheder
Lad os oprette en fil, der vil tage sig af kontrol og oprettelse af adgangskoder

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

Og også et script til saltning og hashing af adgangskoder

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

Opdaterer i users.json og i stedet for sammenligning i lobby.js bruger vi checkPassword

Resultat

Resultatet er en chat over ssh med formatteringsmuligheder og bots.
Det endelige repository

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster