Spaces:
Paused
Paused
| // This file was modified by Oracle on July 5, 2021. | |
| // Errors generated by asynchronous authentication plugins are now being | |
| // handled and subsequently emitted at the command level. | |
| // Modifications copyright (c) 2021, Oracle and/or its affiliates. | |
| ; | |
| const Packets = require('../packets/index.js'); | |
| const sha256_password = require('../auth_plugins/sha256_password'); | |
| const caching_sha2_password = require('../auth_plugins/caching_sha2_password.js'); | |
| const mysql_native_password = require('../auth_plugins/mysql_native_password.js'); | |
| const mysql_clear_password = require('../auth_plugins/mysql_clear_password.js'); | |
| const standardAuthPlugins = { | |
| sha256_password: sha256_password({}), | |
| caching_sha2_password: caching_sha2_password({}), | |
| mysql_native_password: mysql_native_password({}), | |
| mysql_clear_password: mysql_clear_password({}) | |
| }; | |
| function warnLegacyAuthSwitch() { | |
| console.warn( | |
| 'WARNING! authSwitchHandler api is deprecated, please use new authPlugins api' | |
| ); | |
| } | |
| function authSwitchPluginError(error, command) { | |
| // Authentication errors are fatal | |
| error.code = 'AUTH_SWITCH_PLUGIN_ERROR'; | |
| error.fatal = true; | |
| command.emit('error', error); | |
| } | |
| function authSwitchRequest(packet, connection, command) { | |
| const { pluginName, pluginData } = Packets.AuthSwitchRequest.fromPacket( | |
| packet | |
| ); | |
| let authPlugin = | |
| connection.config.authPlugins && connection.config.authPlugins[pluginName]; | |
| // legacy plugin api don't allow to override mysql_native_password | |
| // if pluginName is mysql_native_password it's using standard auth4.1 auth | |
| if ( | |
| connection.config.authSwitchHandler && | |
| pluginName !== 'mysql_native_password' | |
| ) { | |
| const legacySwitchHandler = connection.config.authSwitchHandler; | |
| warnLegacyAuthSwitch(); | |
| legacySwitchHandler({ pluginName, pluginData }, (err, data) => { | |
| if (err) { | |
| return authSwitchPluginError(err, command); | |
| } | |
| connection.writePacket(new Packets.AuthSwitchResponse(data).toPacket()); | |
| }); | |
| return; | |
| } | |
| if (!authPlugin) { | |
| authPlugin = standardAuthPlugins[pluginName]; | |
| } | |
| if (!authPlugin) { | |
| throw new Error( | |
| `Server requests authentication using unknown plugin ${pluginName}. See ${'TODO: add plugins doco here'} on how to configure or author authentication plugins.` | |
| ); | |
| } | |
| connection._authPlugin = authPlugin({ connection, command }); | |
| Promise.resolve(connection._authPlugin(pluginData)).then(data => { | |
| if (data) { | |
| connection.writePacket(new Packets.AuthSwitchResponse(data).toPacket()); | |
| } | |
| }).catch(err => { | |
| authSwitchPluginError(err, command); | |
| }); | |
| } | |
| function authSwitchRequestMoreData(packet, connection, command) { | |
| const { data } = Packets.AuthSwitchRequestMoreData.fromPacket(packet); | |
| if (connection.config.authSwitchHandler) { | |
| const legacySwitchHandler = connection.config.authSwitchHandler; | |
| warnLegacyAuthSwitch(); | |
| legacySwitchHandler({ pluginData: data }, (err, data) => { | |
| if (err) { | |
| return authSwitchPluginError(err, command); | |
| } | |
| connection.writePacket(new Packets.AuthSwitchResponse(data).toPacket()); | |
| }); | |
| return; | |
| } | |
| if (!connection._authPlugin) { | |
| throw new Error( | |
| 'AuthPluginMoreData received but no auth plugin instance found' | |
| ); | |
| } | |
| Promise.resolve(connection._authPlugin(data)).then(data => { | |
| if (data) { | |
| connection.writePacket(new Packets.AuthSwitchResponse(data).toPacket()); | |
| } | |
| }).catch(err => { | |
| authSwitchPluginError(err, command); | |
| }); | |
| } | |
| module.exports = { | |
| authSwitchRequest, | |
| authSwitchRequestMoreData | |
| }; | |