Initial commit
This commit is contained in:
+68
@@ -0,0 +1,68 @@
|
||||
// SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
// Copyright (c) 2015-2024 MariaDB Corporation Ab
|
||||
|
||||
import PluginAuth from './plugin-auth.js';
|
||||
|
||||
/**
|
||||
* Use PAM authentication
|
||||
*/
|
||||
class PamPasswordAuth extends PluginAuth {
|
||||
constructor(packSeq, compressPackSeq, pluginData, cmdParam, reject, multiAuthResolver) {
|
||||
super(cmdParam, multiAuthResolver, reject);
|
||||
this.pluginData = pluginData;
|
||||
this.sequenceNo = packSeq;
|
||||
this.compressSequenceNo = compressPackSeq;
|
||||
this.counter = 0;
|
||||
this.multiAuthResolver = multiAuthResolver;
|
||||
}
|
||||
|
||||
requireSecure() {
|
||||
// PAM (dialog) transmits the password in clear text, so only run it over a secure channel.
|
||||
return true;
|
||||
}
|
||||
|
||||
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.flushPacket();
|
||||
}
|
||||
|
||||
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.multiAuthResolver(packet, out, opts, info);
|
||||
|
||||
default:
|
||||
let promptData = packet.readBuffer();
|
||||
this.exchange(promptData, out, opts, info);
|
||||
this.onPacketReceive = this.response;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default PamPasswordAuth;
|
||||
Reference in New Issue
Block a user