Ssh-chat, deel 2

Hallo, Habr. Dit is het 2e artikel in de ssh-chat-serie.

Wat we gaan doen:

  • Laten we de mogelijkheid toevoegen om uw eigen ontwerpfuncties te creëren
  • Laten we ondersteuning voor prijsverlagingen toevoegen
  • Laten we botondersteuning toevoegen
  • Verhoog de wachtwoordbeveiliging (hash en salt)
    Sorry, maar er worden geen bestanden verzonden.

Aangepaste ontwerpfuncties

Momenteel worden de volgende ontwerpfuncties ondersteund:

  • @color
  • @bold
  • @underline
  • @hex
  • @box
    Maar het is de moeite waard om de mogelijkheid toe te voegen om uw eigen functies te creëren:
    Alle functies worden opgeslagen in объекте под названием methods
    Het is dus voldoende om een ​​functie te creëren registerMethod:

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

U moet deze methode ook retourneren nadat u de server hebt gemaakt

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

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

Bij het maken van een server kunnen we nu opmaakmethoden registreren. Voorbeeld:

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

chat({})

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

Ssh-chat, deel 2

Ondersteuning voor prijsverlagingen

Markdown is erg handig, dus laten we het toevoegen met terminal gemarkeerd

// 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 zal het werken?

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 mee gebeld kan worden @bot(botBob){Command}

Alles voor het werken met bots wordt 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:

  • Laadmonitor
  • Implementeren
  • Taakbord

Hasj en zout

Waarom geen ssh-sleutels? Omdat ssh-sleutels op verschillende apparaten anders zullen zijn
Laten we een bestand maken dat verantwoordelijk is voor het controleren en maken 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 salten en hashen van het wachtwoord

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

We updaten in users.json en in plaats van te vergelijken in lobby.js gebruiken we checkPassword

Totaal

Als gevolg hiervan hebben we een chat via ssh met ontwerpmogelijkheden en bots.
Laatste opslagplaats

Bron: www.habr.com

Voeg een reactie