59 lines
1.6 KiB
JavaScript
59 lines
1.6 KiB
JavaScript
|
const PluginAuth = require('./plugin-auth');
|
||
|
|
||
|
/**
|
||
|
* Use PAM authentication
|
||
|
*/
|
||
|
class PamPasswordAuth extends PluginAuth {
|
||
|
constructor(packSeq, compressPackSeq, pluginData, resolve, reject, multiAuthResolver) {
|
||
|
super(resolve, reject, multiAuthResolver);
|
||
|
this.pluginData = pluginData;
|
||
|
this.sequenceNo = packSeq;
|
||
|
this.counter = 0;
|
||
|
}
|
||
|
|
||
|
start(out, opts, info) {
|
||
|
this.exchange(this.pluginData, out, opts, info);
|
||
|
this.onPacketReceive = this.response;
|
||
|
}
|
||
|
|
||
|
exchange(buffer, out, opts, info) {
|
||
|
//conversation is :
|
||
|
// - first byte is information tell if question is a password (4) or clear text (2).
|
||
|
// - other bytes are the question to user
|
||
|
|
||
|
out.startPacket(this);
|
||
|
|
||
|
let pwd;
|
||
|
if (Array.isArray(opts.password)) {
|
||
|
pwd = opts.password[this.counter];
|
||
|
this.counter++;
|
||
|
} else {
|
||
|
pwd = opts.password;
|
||
|
}
|
||
|
|
||
|
if (pwd) out.writeString(pwd);
|
||
|
out.writeInt8(0);
|
||
|
out.flushBuffer(true);
|
||
|
}
|
||
|
|
||
|
response(packet, out, opts, info) {
|
||
|
const marker = packet.peek();
|
||
|
switch (marker) {
|
||
|
//*********************************************************************************************************
|
||
|
//* OK_Packet and Err_Packet ending packet
|
||
|
//*********************************************************************************************************
|
||
|
case 0x00:
|
||
|
case 0xff:
|
||
|
this.emit('send_end');
|
||
|
return this.successSend(packet, out, opts, info);
|
||
|
|
||
|
default:
|
||
|
let promptData = packet.readBuffer();
|
||
|
this.exchange(promptData, out, opts, info);
|
||
|
this.onPacketReceive = this.response;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = PamPasswordAuth;
|