Ssh-chat, deel 2

Hallo, Habr. Dit is het tweede artikel in de ssh-chat cyclus.

Wat we gaan doen:

  • De mogelijkheid toevoegen om aangepaste opmaakfuncties te creëren
  • Markdown ondersteuning toevoegen
  • Ondersteuning voor bots toevoegen
  • De veiligheid van wachtwoorden verhogen (hash en zout)
    Helaas zal er geen bestandoverdracht zijn

Aangepaste opmaakfuncties

Momenteel ondersteunt het de volgende opmaakfuncties:

  • @kleur
  • @vet
  • @onderstrepen
  • @hex
  • @box
    Maar we moeten de mogelijkheid toevoegen om onze eigen functies te creëren:
    Alle functies worden opgeslagen in een object genaamd methods
    Dus het is voldoende om een functie te creëren registerMethod:

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

We moeten deze methode ook retourneren na het creëren van de server

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

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

Nu kunnen we formatteringsmethoden registreren bij het maken van een server. Voorbeeld:

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

chat({})

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

Ssh-chat, deel 2

Markdown ondersteuning

Markdown is erg handig, dus we voegen het toe met behulp van 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, deel 2

Bots

Hoe dit zal werken

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

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

  onDisconnect(nick, write){},

  onMessage(nick, message, write) {
    if(message == 'botBob!') write('Ik ben hier')
  },

  onCommand(command, write) {
    write('Bezig met ' + command)
  }
})

onCommand kan worden aangeroepen met @bot(botBob){Commando}

Alles wat je met bots kunt doen staat beschreven in het bestand:

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

Wat je met bots kunt doen:

  • Belastingsmonitor
  • Implementeren
  • Takenbord

Hash en zout

Waarom geen ssh sleutels? Omdat ssh sleutels op verschillende apparaten verschillend zullen zijn
We creëren een bestand dat verantwoordelijk zal zijn voor het controleren en creëren van wachtwoorden

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

Ook een script voor het zouten en hashen van wachtwoorden

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

Bijwerken in users.json en in plaats van vergelijken in lobby.js gebruiken we checkPassword

Conclusie

Het resultaat is een ssh-chat met opmaakmogelijkheden en bots.
De eindrepository

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster