Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbhatman1441 <blackhat1441@protonmail.com>2023-10-13 14:43:57 +0300
committerbhatman1441 <blackhat1441@protonmail.com>2023-10-13 14:43:57 +0300
commit6b0fded6e54395a2c6a507ca36b39591fd04f74d (patch)
tree549fdbd40f13cbe55a54c0c043e4da40fb998fee
parentc5e415fd697fb14521d830a9c43f0715c87c1a59 (diff)
parent61e100fe0c5bb97f2d294809ca67a542a460431f (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.c3
-rw-r--r--src/remmina_ssh.c44
-rw-r--r--src/remmina_ssh.h3
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);