Ssh-chat, part 2

Nyob zoo, Habr. Nov yog tshooj 2 hauv ssh-chat series.

Peb yuav ua li cas:

  • Cia peb ntxiv lub peev xwm los tsim koj tus kheej tsim kev ua haujlwm
  • Wb ntxiv kev txhawb nqa markdown
  • Wb ntxiv kev txhawb nqa bot
  • Ua kom tus password ruaj ntseg (hash thiab ntsev)
    Thov txim, tab sis yuav tsis xa cov ntaub ntawv.

Kev cai tsim nta

Tam sim no, cov qauv tsim hauv qab no tau txais kev txhawb nqa:

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

Koj kuj yuav tsum tau rov qab cov qauv no tom qab tsim lub server

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

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

Tam sim no, thaum tsim ib tus neeg rau zaub mov, peb tuaj yeem sau npe cov txheej txheem formatting. Piv txwv:

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

chat({})

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

Ssh-chat, part 2

Kev them nyiaj yug Markdown

Markdown yooj yim heev, yog li cia peb ntxiv nws siv terminal cim

// 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, part 2

Cov txhawv

Yuav ua li cas

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 tuaj yeem hu tau siv @bot(botBob){Command}

Txhua yam ua haujlwm nrog bots tau piav qhia hauv cov ntaub ntawv:

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

Koj tuaj yeem ua dab tsi nrog bots:

  • Load saib
  • Tso
  • Task board

Hash thiab ntsev

Vim li cas ho tsis ssh yuam sij? Vim tias ssh yuam sij yuav txawv ntawm cov khoom siv sib txawv
Cia peb tsim cov ntaub ntawv uas yuav yog lub luag haujlwm rau kev kuaj xyuas thiab tsim cov passwords

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

Kuj yog ib tsab ntawv rau salting thiab hashing tus password

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

Peb hloov kho hauv users.json thiab tsis txhob sib piv hauv lobby.js peb siv checkPassword

Qhov no

Yog li ntawd, peb muaj kev sib tham ntawm ssh nrog tsim muaj peev xwm thiab bots.
Thaum kawg repository

Tau qhov twg los: www.hab.com

Ntxiv ib saib