Ssh-chat, bahagi 2

Hello, Habr. Ito ang ika-2 artikulo sa ssh-chat series.

Ano ang gagawin namin:

  • Idagdag natin ang kakayahang lumikha ng sarili mong mga function ng disenyo
  • Magdagdag tayo ng suporta sa markdown
  • Magdagdag tayo ng suporta sa bot
  • Dagdagan ang seguridad ng password (hash at asin)
    Paumanhin, ngunit walang pagpapadala ng mga file.

Mga tampok ng custom na disenyo

Sa kasalukuyan, sinusuportahan ang mga sumusunod na function ng disenyo:

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

Kailangan mo ring ibalik ang pamamaraang ito pagkatapos gawin ang server

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

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

Ngayon, kapag lumilikha ng isang server, maaari tayong magrehistro ng mga paraan ng pag-format. Halimbawa:

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

chat({})

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

Ssh-chat, bahagi 2

suporta sa markdown

Napaka-convenient ng markdown, kaya idagdag natin ito gamit may markang 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, bahagi 2

Mga bot

Paano ito gagana

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 maaaring tawaging gamit @bot(botBob){Command}

Ang lahat para sa pagtatrabaho sa mga bot ay inilarawan sa file:

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

Ano ang maaari mong gawin sa mga bot:

  • Mag-load ng monitor
  • lumawak
  • Task board

Hash at asin

Bakit hindi ssh keys? Dahil magkakaiba ang mga ssh key sa iba't ibang device
Gumawa tayo ng file na magiging responsable sa pagsuri at paggawa ng mga password

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

Isa ring script para sa pag-aasin at pag-hash ng password

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

Nag-a-update kami sa users.json at sa halip na ikumpara sa lobby.js ginagamit namin ang checkPassword

Kabuuan

Bilang resulta, mayroon kaming chat sa pamamagitan ng ssh na may mga kakayahan sa disenyo at mga bot.
Panghuling imbakan

Pinagmulan: www.habr.com

Magdagdag ng komento