diff options
author | bhatman1441 <blackhat1441@protonmail.com> | 2023-10-13 14:43:57 +0300 |
---|---|---|
committer | bhatman1441 <blackhat1441@protonmail.com> | 2023-10-13 14:43:57 +0300 |
commit | 6b0fded6e54395a2c6a507ca36b39591fd04f74d (patch) | |
tree | 549fdbd40f13cbe55a54c0c043e4da40fb998fee | |
parent | c5e415fd697fb14521d830a9c43f0715c87c1a59 (diff) | |
parent | 61e100fe0c5bb97f2d294809ca67a542a460431f (diff) |
Merge branch 'ssh-no-username' into 'master'
SSH private key auth: If username is empty, prompt user to enter it
See merge request Remmina/Remmina!2547
-rw-r--r-- | src/remmina_protocol_widget.c | 3 | ||||
-rw-r--r-- | src/remmina_ssh.c | 44 | ||||
-rw-r--r-- | src/remmina_ssh.h | 3 |
3 files changed, 48 insertions, 2 deletions
diff --git a/src/remmina_protocol_widget.c b/src/remmina_protocol_widget.c index b77d52fad..7becda0ac 100644 --- a/src/remmina_protocol_widget.c +++ b/src/remmina_protocol_widget.c @@ -1571,6 +1571,9 @@ static gboolean remmina_protocol_widget_dialog_mt_setup(gpointer user_data) mp = remmina_message_panel_new(); if (d->dtype == RPWDT_AUTH) { + if (d->pflags & REMMINA_MESSAGE_PANEL_FLAG_USERNAME) { + remmina_message_panel_field_set_string(mp, REMMINA_MESSAGE_PANEL_USERNAME, d->default_username); + } remmina_message_panel_setup_auth(mp, authpanel_mt_cb, d, d->title, d->strpasswordlabel, d->pflags); remmina_message_panel_field_set_string(mp, REMMINA_MESSAGE_PANEL_USERNAME, d->default_username); if (d->pflags & REMMINA_MESSAGE_PANEL_FLAG_DOMAIN) diff --git a/src/remmina_ssh.c b/src/remmina_ssh.c index 5634649d7..ddfb0cb93 100644 --- a/src/remmina_ssh.c +++ b/src/remmina_ssh.c @@ -878,6 +878,12 @@ remmina_ssh_auth_pubkey(RemminaSSH *ssh, RemminaProtocolWidget *gp, RemminaFile return REMMINA_SSH_AUTH_FATAL_ERROR; } + // Check for empty username + if (ssh->user == NULL) { + remmina_ssh_set_error(ssh, _("No username found. Asking user to enter it.")); + return REMMINA_SSH_AUTH_AUTHFAILED_EMPTY_USERNAME; + } + g_snprintf(pubkey, sizeof(pubkey), "%s.pub", ssh->privkeyfile); /*G_FILE_TEST_EXISTS*/ @@ -1531,12 +1537,48 @@ remmina_ssh_auth_gui(RemminaSSH *ssh, RemminaProtocolWidget *gp, RemminaFile *re * on a ssh connection. And the 3rd failed attempt will block the calling thread forever. * So we retry only 2 extra time authentication. */ for (attempt = 0; - attempt < 2 && ret == REMMINA_SSH_AUTH_AUTHFAILED_RETRY_AFTER_PROMPT; + attempt < 2 && (ret == REMMINA_SSH_AUTH_AUTHFAILED_RETRY_AFTER_PROMPT || ret == REMMINA_SSH_AUTH_AUTHFAILED_EMPTY_USERNAME); attempt++) { if (ssh->error) REMMINA_DEBUG("Retrying auth because %s", ssh->error); if (remmina_ssh_auth_type == REMMINA_SSH_AUTH_PKPASSPHRASE) { + // If username is empty, prompt user to enter it and attempt reconnect + if ( ret == REMMINA_SSH_AUTH_AUTHFAILED_EMPTY_USERNAME ) { + current_user = g_strdup(remmina_file_get_string(remminafile, ssh->is_tunnel ? "ssh_tunnel_username" : "username")); + ret = remmina_protocol_widget_panel_auth(gp, + (REMMINA_MESSAGE_PANEL_FLAG_USERNAME | REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD), + (ssh->is_tunnel ? _("SSH tunnel private key credentials") : _("SSH private key credentials")), + current_user, + remmina_file_get_string(remminafile, pwdfkey), + NULL, + _("Password for private SSH key")); + + if (ret == GTK_RESPONSE_OK) { + // Save username to remmina file and reset ssh error for reconnect attempt + // If password is empty or changed, save the new password + remmina_file_set_string(remminafile, ssh->is_tunnel ? "ssh_tunnel_username" : "username", remmina_protocol_widget_get_username(gp)); + ssh->user = remmina_protocol_widget_get_username(gp); + + g_free(current_pwd); + current_pwd = remmina_protocol_widget_get_password(gp); + save_password = remmina_protocol_widget_get_savepassword(gp); + if (save_password) { + remmina_file_set_string(remminafile, pwdfkey, current_pwd); + } + else { + remmina_file_set_string(remminafile, pwdfkey, NULL); + } + + ssh->passphrase = remmina_protocol_widget_get_password(gp); + ssh->error = NULL; + return REMMINA_SSH_AUTH_RECONNECT; + } + else { + return REMMINA_SSH_AUTH_USERCANCEL; + } + } + ret = remmina_protocol_widget_panel_auth(gp, (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD), diff --git a/src/remmina_ssh.h b/src/remmina_ssh.h index e7ab78754..baad19206 100644 --- a/src/remmina_ssh.h +++ b/src/remmina_ssh.h @@ -112,7 +112,8 @@ enum remmina_ssh_auth_result { REMMINA_SSH_AUTH_AUTHFAILED_RETRY_AFTER_PROMPT, REMMINA_SSH_AUTH_USERCANCEL, REMMINA_SSH_AUTH_FATAL_ERROR, - REMMINA_SSH_AUTH_RECONNECT + REMMINA_SSH_AUTH_RECONNECT, + REMMINA_SSH_AUTH_AUTHFAILED_EMPTY_USERNAME }; enum remmina_ssh_auth_result remmina_ssh_auth(RemminaSSH *ssh, const gchar *password, RemminaProtocolWidget *gp, RemminaFile *remminafile); |