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:
-rw-r--r--remmina-plugins/rdp/rdp_plugin.c67
-rw-r--r--remmina/include/remmina/plugin.h2
-rw-r--r--remmina/src/remmina_file.c6
-rw-r--r--remmina/src/remmina_file.h2
-rw-r--r--remmina/src/remmina_plugin_manager.c2
-rw-r--r--remmina/src/remmina_protocol_widget.c10
-rw-r--r--remmina/src/remmina_protocol_widget.h1
7 files changed, 66 insertions, 24 deletions
diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c
index 0e59c6f8e..bf854b204 100644
--- a/remmina-plugins/rdp/rdp_plugin.c
+++ b/remmina-plugins/rdp/rdp_plugin.c
@@ -47,6 +47,7 @@
#include <freerdp/constants.h>
#include <freerdp/client/cliprdr.h>
#include <freerdp/client/channels.h>
+#include <freerdp/error.h>
#include <winpr/memory.h>
#define REMMINA_RDP_FEATURE_TOOL_REFRESH 1
@@ -351,13 +352,16 @@ static BOOL remmina_rdp_post_connect(freerdp* instance)
static BOOL remmina_rdp_authenticate(freerdp* instance, char** username, char** password, char** domain)
{
- gchar* s;
+ gchar *s_username, *s_password, *s_domain;
gint ret;
rfContext* rfi;
RemminaProtocolWidget* gp;
+ gboolean save;
+ RemminaFile* remminafile;
rfi = (rfContext*) instance->context;
gp = rfi->protocol_widget;
+ remminafile = remmina_plugin_service->protocol_plugin_get_file(gp);
THREADS_ENTER
ret = remmina_plugin_service->protocol_plugin_init_authuserpwd(gp, TRUE);
@@ -365,29 +369,32 @@ static BOOL remmina_rdp_authenticate(freerdp* instance, char** username, char**
if (ret == GTK_RESPONSE_OK)
{
- s = remmina_plugin_service->protocol_plugin_init_get_username(gp);
-
- if (s)
- {
- rfi->settings->Username = strdup(s);
- g_free(s);
- }
+ s_username = remmina_plugin_service->protocol_plugin_init_get_username(gp);
+ if (s_username) rfi->settings->Username = strdup(s_username);
- s = remmina_plugin_service->protocol_plugin_init_get_password(gp);
+ s_password = remmina_plugin_service->protocol_plugin_init_get_password(gp);
+ if (s_password) rfi->settings->Password = strdup(s_password);
- if (s)
+ s_domain = remmina_plugin_service->protocol_plugin_init_get_domain(gp);
+ if (s_domain) rfi->settings->Domain = strdup(s_domain);
+
+ save = remmina_plugin_service->protocol_plugin_init_get_savepassword(gp);
+ if (save)
{
- rfi->settings->Password = strdup(s);
- g_free(s);
- }
-
- s = remmina_plugin_service->protocol_plugin_init_get_domain(gp);
-
- if (s)
- {
- rfi->settings->Domain = strdup(s);
- g_free(s);
+ // User has requested to save password. We put all the new cretentials
+ // into remminafile->settings. They will be saved later, when disconnecting, by
+ // remmina_connection_object_on_disconnect of remmina_connection_window.c
+ // (this operation should be called "save credentials" and not "save password")
+
+ remmina_plugin_service->file_set_string( remminafile, "username", s_username );
+ remmina_plugin_service->file_set_string( remminafile, "password", s_password );
+ remmina_plugin_service->file_set_string( remminafile, "domain", s_domain );
+
}
+
+ if ( s_username ) g_free( s_username );
+ if ( s_password ) g_free( s_password );
+ if ( s_domain ) g_free( s_domain );
return True;
}
@@ -879,8 +886,24 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp)
{
if (!rfi->user_cancelled)
{
- remmina_plugin_service->protocol_plugin_set_error(gp, _("Unable to connect to RDP server %s"),
- rfi->settings->ServerHostname);
+ UINT32 e;
+
+ e = freerdp_get_last_error(rfi->instance->context);
+ switch(e) {
+ case FREERDP_ERROR_AUTHENTICATION_FAILED:
+ remmina_plugin_service->protocol_plugin_set_error(gp, _("Authentication to RDP server %s failed.\nCheck username, password and domain."),
+ rfi->settings->ServerHostname );
+ // Invalidate the saved password, so the user will be re-asked at next logon
+ remmina_plugin_service->file_unsave_password(remminafile);
+ break;
+ case FREERDP_ERROR_CONNECT_FAILED:
+ remmina_plugin_service->protocol_plugin_set_error(gp, _("Connection to RDP server %s failed."), rfi->settings->ServerHostname );
+ break;
+ default:
+ remmina_plugin_service->protocol_plugin_set_error(gp, _("Unable to connect to RDP server %s"), rfi->settings->ServerHostname);
+ break;
+ }
+
}
return FALSE;
diff --git a/remmina/include/remmina/plugin.h b/remmina/include/remmina/plugin.h
index 308ea993c..3514897e4 100644
--- a/remmina/include/remmina/plugin.h
+++ b/remmina/include/remmina/plugin.h
@@ -175,6 +175,7 @@ typedef struct _RemminaPluginService
gchar* (* protocol_plugin_init_get_username) (RemminaProtocolWidget *gp);
gchar* (* protocol_plugin_init_get_password) (RemminaProtocolWidget *gp);
gchar* (* protocol_plugin_init_get_domain) (RemminaProtocolWidget *gp);
+ gboolean (* protocol_plugin_init_get_savepassword) (RemminaProtocolWidget *gp);
gint (* protocol_plugin_init_authx509) (RemminaProtocolWidget *gp);
gchar* (* protocol_plugin_init_get_cacert) (RemminaProtocolWidget *gp);
gchar* (* protocol_plugin_init_get_cacrl) (RemminaProtocolWidget *gp);
@@ -199,6 +200,7 @@ typedef struct _RemminaPluginService
gchar* (* file_get_secret) (RemminaFile *remminafile, const gchar *setting);
void (* file_set_int) (RemminaFile *remminafile, const gchar *setting, gint value);
gint (* file_get_int) (RemminaFile *remminafile, const gchar *setting, gint default_value);
+ void (* file_unsave_password) (RemminaFile *remminafile);
void (* pref_set_value) (const gchar *key, const gchar *value);
gchar* (* pref_get_value) (const gchar *key);
diff --git a/remmina/src/remmina_file.c b/remmina/src/remmina_file.c
index 75c6360ec..d54b34833 100644
--- a/remmina/src/remmina_file.c
+++ b/remmina/src/remmina_file.c
@@ -290,6 +290,7 @@ static void remmina_file_store_group(RemminaFile *remminafile, GKeyFile *gkeyfil
gchar *s;
gboolean encrypted;
RemminaSettingGroup g;
+
plugin = remmina_plugin_manager_get_secret_plugin();
g_hash_table_iter_init(&iter, remminafile->settings);
@@ -502,3 +503,8 @@ void remmina_file_delete(const gchar *filename)
g_unlink(filename);
}
+void remmina_file_unsave_password(RemminaFile *remminafile)
+{
+ remmina_file_set_string(remminafile, "password", NULL);
+ remmina_file_save_group(remminafile, REMMINA_SETTING_GROUP_CREDENTIAL);
+}
diff --git a/remmina/src/remmina_file.h b/remmina/src/remmina_file.h
index 1978d50cc..b05996bfd 100644
--- a/remmina/src/remmina_file.h
+++ b/remmina/src/remmina_file.h
@@ -92,6 +92,8 @@ const gchar* remmina_file_get_icon_name(RemminaFile *remminafile);
RemminaFile* remmina_file_dup_temp_protocol(RemminaFile *remminafile, const gchar *new_protocol);
/* Delete a .remmina file */
void remmina_file_delete(const gchar *filename);
+/* Delete a "password" field and save into .remmina file */
+void remmina_file_unsave_password(RemminaFile *remminafile);
G_END_DECLS
diff --git a/remmina/src/remmina_plugin_manager.c b/remmina/src/remmina_plugin_manager.c
index d5262b948..7b361fdad 100644
--- a/remmina/src/remmina_plugin_manager.c
+++ b/remmina/src/remmina_plugin_manager.c
@@ -104,6 +104,7 @@ RemminaPluginService remmina_plugin_manager_service =
remmina_protocol_widget_init_get_username,
remmina_protocol_widget_init_get_password,
remmina_protocol_widget_init_get_domain,
+ remmina_protocol_widget_init_get_savepassword,
remmina_protocol_widget_init_authx509,
remmina_protocol_widget_init_get_cacert,
remmina_protocol_widget_init_get_cacrl,
@@ -126,6 +127,7 @@ RemminaPluginService remmina_plugin_manager_service =
remmina_file_get_secret,
remmina_file_set_int,
remmina_file_get_int,
+ remmina_file_unsave_password,
remmina_pref_set_value,
remmina_pref_get_value,
diff --git a/remmina/src/remmina_protocol_widget.c b/remmina/src/remmina_protocol_widget.c
index d87bdce30..794819d73 100644
--- a/remmina/src/remmina_protocol_widget.c
+++ b/remmina/src/remmina_protocol_widget.c
@@ -803,7 +803,7 @@ gint remmina_protocol_widget_init_authpwd(RemminaProtocolWidget* gp, RemminaAuth
RemminaFile* remminafile = gp->priv->remmina_file;
gchar* s;
gint ret;
-
+
switch (authpwd_type)
{
case REMMINA_AUTHPWD_TYPE_PROTOCOL:
@@ -832,7 +832,7 @@ gint remmina_protocol_widget_init_authpwd(RemminaProtocolWidget* gp, RemminaAuth
gint remmina_protocol_widget_init_authuserpwd(RemminaProtocolWidget* gp, gboolean want_domain)
{
RemminaFile* remminafile = gp->priv->remmina_file;
-
+
return remmina_init_dialog_authuserpwd(REMMINA_INIT_DIALOG(gp->priv->init_dialog), want_domain,
remmina_file_get_string(remminafile, "username"),
want_domain ? remmina_file_get_string(remminafile, "domain") : NULL,
@@ -863,6 +863,11 @@ gchar* remmina_protocol_widget_init_get_domain(RemminaProtocolWidget* gp)
return g_strdup(REMMINA_INIT_DIALOG(gp->priv->init_dialog)->domain);
}
+gboolean remmina_protocol_widget_init_get_savepassword(RemminaProtocolWidget *gp)
+{
+ return REMMINA_INIT_DIALOG(gp->priv->init_dialog)->save_password;
+}
+
gint remmina_protocol_widget_init_authx509(RemminaProtocolWidget* gp)
{
RemminaFile* remminafile = gp->priv->remmina_file;
@@ -952,6 +957,7 @@ void remmina_protocol_widget_init_save_cred(RemminaProtocolWidget* gp)
}
}
+
void remmina_protocol_widget_init_show_listen(RemminaProtocolWidget* gp, gint port)
{
remmina_init_dialog_set_status(REMMINA_INIT_DIALOG(gp->priv->init_dialog),
diff --git a/remmina/src/remmina_protocol_widget.h b/remmina/src/remmina_protocol_widget.h
index 0f980f48a..65ec65634 100644
--- a/remmina/src/remmina_protocol_widget.h
+++ b/remmina/src/remmina_protocol_widget.h
@@ -126,6 +126,7 @@ gint remmina_protocol_widget_changed_certificate(RemminaProtocolWidget *gp, cons
gchar* remmina_protocol_widget_init_get_username(RemminaProtocolWidget *gp);
gchar* remmina_protocol_widget_init_get_password(RemminaProtocolWidget *gp);
gchar* remmina_protocol_widget_init_get_domain(RemminaProtocolWidget *gp);
+gboolean remmina_protocol_widget_init_get_savepassword(RemminaProtocolWidget *gp);
gint remmina_protocol_widget_init_authx509(RemminaProtocolWidget *gp);
gchar* remmina_protocol_widget_init_get_cacert(RemminaProtocolWidget *gp);
gchar* remmina_protocol_widget_init_get_cacrl(RemminaProtocolWidget *gp);