cache auth_bit_mask after the first none auth attempt

This fixes #36, password auth does not occur.
This commit is contained in:
Ryo Nakamura
2025-11-08 18:37:43 +09:00
parent 81d46a1cd1
commit ef8994d21e
2 changed files with 25 additions and 10 deletions

View File

@@ -114,15 +114,25 @@ static int ssh_set_opts(ssh_session ssh, struct mscp_ssh_opts *opts)
static int ssh_authenticate(ssh_session ssh, struct mscp_ssh_opts *opts) static int ssh_authenticate(ssh_session ssh, struct mscp_ssh_opts *opts)
{ {
int auth_bit_mask; static int auth_bit_mask;
int ret; int ret;
/* try publickey auth first */ if (auth_bit_mask == 0) {
char *p = opts->passphrase ? opts->passphrase : NULL; /* the first authentication attempt. try none auth to
if (ssh_userauth_publickey_auto(ssh, NULL, p) == SSH_AUTH_SUCCESS) * get available auth methods. */
return 0; if (ssh_userauth_none(ssh, NULL) == SSH_AUTH_SUCCESS)
return 0;
/* save auth_bit_mask for further authentications */
auth_bit_mask = ssh_userauth_list(ssh, NULL);
}
if (auth_bit_mask & SSH_AUTH_METHOD_PUBLICKEY) {
char *p = opts->passphrase ? opts->passphrase : NULL;
if (ssh_userauth_publickey_auto(ssh, NULL, p) == SSH_AUTH_SUCCESS)
return 0;
}
auth_bit_mask = ssh_userauth_list(ssh, NULL);
if (auth_bit_mask & SSH_AUTH_METHOD_PASSWORD) { if (auth_bit_mask & SSH_AUTH_METHOD_PASSWORD) {
if (!opts->password) { if (!opts->password) {
char buf[128] = {}; char buf[128] = {};

View File

@@ -49,6 +49,8 @@ def cleanup_files():
"{}/src".format(os.environ["HOME"]), "{}/src".format(os.environ["HOME"]),
"{}/dst".format(os.environ["HOME"]), "{}/dst".format(os.environ["HOME"]),
"/tmp/mscp_test_ssh_config", "/tmp/mscp_test_ssh_config",
"/home/test/dst",
"/home/test/src",
"checkpoint", "checkpoint",
] ]
@@ -657,11 +659,14 @@ def move_pubkey_temporally():
def test_passwordauth_without_pubkey(move_pubkey_temporally, def test_passwordauth_without_pubkey(move_pubkey_temporally,
mscp, src_prefix, dst_prefix): mscp, src_prefix, dst_prefix):
""" """
make sure password auth works (by removing publick keys) make sure password auth works (by removing public keys)
""" """
src = File("src", size = 10 * 1024 * 1024).make() src = File(os.getcwd() + "/src", size = 1024).make()
dst = File("dst") dst = File("/home/test/dst")
run2ok([mscp, "-vvv", src_prefix + src.path, dst_prefix + dst.path]) env = os.environ
env["MSCP_SSH_AUTH_PASSWORD"] = "userpassword"
run2ok([mscp, "-vvv", "-l", "test",
src.path, "localhost:" + dst.path], env = env)
assert check_same_md5sum(src, dst) assert check_same_md5sum(src, dst)