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
Dus het is voldoende om een functie te creërenregisterMethod:
// 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 = registerMethodNu 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) + '!'
})
Markdown ondersteuning
Markdown is erg handig, dus we voegen het toe met behulp van
// 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)
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;
};

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 = checkPassOok 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.
Bron: habr.com
