Ssh-chat, fizarana 2

Salama, Habr. Ity no lahatsoratra faha-2 amin'ny andiany ssh-chat.

Inona no hataontsika:

  • Andeha ampio ny fahafahana mamorona asa famolavolana anao manokana
  • Andeha isika hanampy markdown fanohanana
  • Andeha isika hanampy bot fanohanana
  • Ampitomboy ny fiarovana ny tenimiafina (hash sy sira)
    Miala tsiny fa tsy hisy fandefasana rakitra.

endri-javatra famolavolana manokana

Amin'izao fotoana izao, ireto asa famolavolana manaraka ireto dia tohana:

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

Mila mamerina ity fomba ity ihany koa ianao rehefa avy namorona ny mpizara

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

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

Ankehitriny, rehefa mamorona mpizara, dia afaka misoratra anarana fomba fandrafetana. Ohatra:

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

chat({})

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

Ssh-chat, fizarana 2

Fanohanana markdown

Tena mety ny Markdown, koa andao hampiasaina voamarika ny 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, fizarana 2

Bot

Hanao ahoana izany

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 azo antsoina hoe mampiasa @bot(botBob){Command}

Ny zava-drehetra momba ny fiasana amin'ny bots dia voalaza ao amin'ny rakitra:

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

Inona no azonao atao amin'ny bots:

  • Load monitor
  • miisa
  • Tabilao asa

Hash sy sira

Nahoana no tsy ssh keys? Satria ny fanalahidy ssh dia tsy mitovy amin'ny fitaovana samihafa
Andao hamorona rakitra iray izay ho tompon'andraikitra amin'ny fanamarinana sy famoronana tenimiafina

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

Misy ihany koa script ho an'ny sira sy hashing ny tenimiafina

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

Manavao amin'ny users.json izahay fa tsy mampitaha ao amin'ny lobby.js dia mampiasa checkPassword

Ny vokany

Vokatr'izany dia manana chat amin'ny ssh izahay miaraka amin'ny fahaiza-manao famolavolana sy bots.
Repository farany

Source: www.habr.com

Add a comment