Skip to content

Commit 443db49

Browse files
authored
Merge pull request #1545 from giox069/secret_plugin_snap
Minor improvements on secure plugin and SNAP welcome message
2 parents d894e95 + 9c15a8c commit 443db49

10 files changed

Lines changed: 228 additions & 17 deletions

File tree

plugins/secret/src/glibsecret_plugin.c

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,20 @@ static SecretService* secretservice;
5656
static SecretCollection* defaultcollection;
5757
#endif
5858

59-
static void remmina_plugin_glibsecret_unlock_secret_service()
59+
60+
gboolean remmina_plugin_glibsecret_is_service_available()
61+
{
62+
#ifdef LIBSECRET_VERSION_0_18
63+
if (secretservice && defaultcollection)
64+
return TRUE;
65+
else
66+
return FALSE;
67+
#else
68+
return FALSE;
69+
#endif
70+
}
71+
72+
static void remmina_plugin_glibsecret_unlock_secret_service()
6073
{
6174
TRACE_CALL(__func__);
6275

@@ -87,8 +100,6 @@ void remmina_plugin_glibsecret_store_password(RemminaFile *remminafile, const gc
87100
const gchar *path;
88101
gchar *s;
89102

90-
remmina_plugin_glibsecret_unlock_secret_service();
91-
92103
path = remmina_plugin_service->file_get_path(remminafile);
93104
s = g_strdup_printf("Remmina: %s - %s", remmina_plugin_service->file_get_string(remminafile, "name"), key);
94105
secret_password_store_sync(&remmina_file_secret_schema, SECRET_COLLECTION_DEFAULT, s, password,
@@ -111,8 +122,6 @@ remmina_plugin_glibsecret_get_password(RemminaFile *remminafile, const gchar *ke
111122
gchar *password;
112123
gchar *p;
113124

114-
remmina_plugin_glibsecret_unlock_secret_service();
115-
116125
path = remmina_plugin_service->file_get_path(remminafile);
117126
password = secret_password_lookup_sync(&remmina_file_secret_schema, NULL, &r, "filename", path, "key", key, NULL);
118127
if (r == NULL) {
@@ -132,8 +141,6 @@ void remmina_plugin_glibsecret_delete_password(RemminaFile *remminafile, const g
132141
GError *r = NULL;
133142
const gchar *path;
134143

135-
remmina_plugin_glibsecret_unlock_secret_service();
136-
137144
path = remmina_plugin_service->file_get_path(remminafile);
138145
secret_password_clear_sync(&remmina_file_secret_schema, NULL, &r, "filename", path, "key", key, NULL);
139146
if (r == NULL) {
@@ -144,9 +151,17 @@ void remmina_plugin_glibsecret_delete_password(RemminaFile *remminafile, const g
144151
}
145152

146153
static RemminaSecretPlugin remmina_plugin_glibsecret =
147-
{ REMMINA_PLUGIN_TYPE_SECRET, "glibsecret", "GNOME libsecret", NULL, VERSION,
148-
149-
TRUE, remmina_plugin_glibsecret_store_password, remmina_plugin_glibsecret_get_password, remmina_plugin_glibsecret_delete_password };
154+
{ REMMINA_PLUGIN_TYPE_SECRET,
155+
"glibsecret",
156+
"GNOME libsecret",
157+
NULL,
158+
VERSION,
159+
TRUE,
160+
remmina_plugin_glibsecret_store_password,
161+
remmina_plugin_glibsecret_get_password,
162+
remmina_plugin_glibsecret_delete_password,
163+
remmina_plugin_glibsecret_is_service_available
164+
};
150165

151166
G_MODULE_EXPORT gboolean
152167
remmina_plugin_entry(RemminaPluginService *service)
@@ -164,17 +179,27 @@ remmina_plugin_entry(RemminaPluginService *service)
164179
error = NULL;
165180
secretservice = secret_service_get_sync(SECRET_SERVICE_LOAD_COLLECTIONS, NULL, &error);
166181
if (error) {
167-
remmina_plugin_service->log_printf("[glibsecret] unable to get secret service: %s\n", error->message);
182+
g_print("[glibsecret] unable to get secret service: %s\n", error->message);
183+
return FALSE;
184+
}
185+
if (secretservice == NULL) {
186+
g_print("[glibsecret] unable to get secret service: Unknown error.\n");
168187
return FALSE;
169188
}
170189

171190
defaultcollection = secret_collection_for_alias_sync(secretservice, SECRET_COLLECTION_DEFAULT, SECRET_COLLECTION_NONE, NULL, &error);
172191
if (error) {
173-
remmina_plugin_service->log_printf("[glibsecret] unable to get secret service default collection: %s\n", error->message);
192+
g_print("[glibsecret] unable to get secret service default collection: %s\n", error->message);
174193
return FALSE;
175194
}
176-
#endif
177195

196+
remmina_plugin_glibsecret_unlock_secret_service();
178197
return TRUE;
198+
199+
#else
200+
g_print("Libsecret was too old during compilation, disabling secret service.\n");
201+
return FALSE;
202+
#endif
203+
179204
}
180205

remmina/include/remmina/plugin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ typedef struct _RemminaSecretPlugin {
137137
void (* store_password)(RemminaFile *remminafile, const gchar *key, const gchar *password);
138138
gchar* (*get_password)(RemminaFile * remminafile, const gchar * key);
139139
void (* delete_password)(RemminaFile *remminafile, const gchar *key);
140+
gboolean (* is_service_available)(void);
140141
} RemminaSecretPlugin;
141142

142143
/* Plugin Service is a struct containing a list of function pointers,

remmina/src/remmina.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ static gint remmina_on_command_line(GApplication *app, GApplicationCommandLine *
201201
static void remmina_on_startup(GApplication *app)
202202
{
203203
TRACE_CALL(__func__);
204+
205+
RemminaSecretPlugin *secret_plugin;
206+
204207
remmina_file_manager_init();
205208
remmina_pref_init();
206209
remmina_plugin_manager_init();
@@ -217,6 +220,18 @@ static void remmina_on_startup(GApplication *app)
217220
g_application_hold(app);
218221

219222
remmina_stats_sender_schedule();
223+
224+
/* Check for secret plugin and service initialization and show some warnings on the console if
225+
* there is something missing */
226+
secret_plugin = remmina_plugin_manager_get_secret_plugin();
227+
if (!secret_plugin) {
228+
g_print("WARNING: Remmina is running without a secret plugin. Passwords will be saved in a less secure way.\n");
229+
} else {
230+
if (!secret_plugin->is_service_available()) {
231+
g_print("WARNING: Remmina is running with a secret plugin, but it cannot connect to a secret service.\n");
232+
}
233+
}
234+
220235
}
221236

222237
static gint remmina_on_local_cmdline(GApplication *app, GVariantDict *options, gpointer user_data)

remmina/src/remmina_file.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ remmina_file_load(const gchar *filename)
216216
gchar *s, *sec;
217217
RemminaProtocolPlugin* protocol_plugin;
218218
RemminaSecretPlugin *secret_plugin;
219+
gboolean secret_service_available;
219220
int w, h;
220221

221222
gkeyfile = g_key_file_new();
@@ -238,6 +239,8 @@ remmina_file_load(const gchar *filename)
238239
}
239240

240241
secret_plugin = remmina_plugin_manager_get_secret_plugin();
242+
secret_service_available = secret_plugin->is_service_available();
243+
241244
remminafile->filename = g_strdup(filename);
242245
keys = g_key_file_get_keys(gkeyfile, "remmina", NULL, NULL);
243246
if (keys) {
@@ -246,7 +249,7 @@ remmina_file_load(const gchar *filename)
246249
if (is_encrypted_setting_by_name(key, protocol_plugin)) {
247250
s = g_key_file_get_string(gkeyfile, "remmina", key, NULL);
248251
if (g_strcmp0(s, ".") == 0) {
249-
if (secret_plugin) {
252+
if (secret_service_available) {
250253
sec = secret_plugin->get_password(remminafile, key);
251254
remmina_file_set_string(remminafile, key, sec);
252255
/* Annotate in spsettings that this value comes from secret_plugin */
@@ -406,6 +409,7 @@ void remmina_file_save(RemminaFile *remminafile)
406409
{
407410
TRACE_CALL(__func__);
408411
RemminaSecretPlugin *secret_plugin;
412+
gboolean secret_service_available;
409413
RemminaProtocolPlugin* protocol_plugin;
410414
GHashTableIter iter;
411415
const gchar *key, *value;
@@ -429,12 +433,13 @@ void remmina_file_save(RemminaFile *remminafile)
429433
}
430434

431435
secret_plugin = remmina_plugin_manager_get_secret_plugin();
436+
secret_service_available = secret_plugin->is_service_available();
432437

433438
g_hash_table_iter_init(&iter, remminafile->settings);
434439
while (g_hash_table_iter_next(&iter, (gpointer*)&key, (gpointer*)&value)) {
435440
if (is_encrypted_setting_by_name(key, protocol_plugin)) {
436441
if (remminafile->filename && g_strcmp0(remminafile->filename, remmina_pref_file)) {
437-
if (secret_plugin) {
442+
if (secret_service_available) {
438443
if (value && value[0]) {
439444
if (g_strcmp0(value, ".") != 0) {
440445
secret_plugin->store_password(remminafile, key, value);

remmina/src/remmina_main.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,59 @@ static void remmina_main_clear_selection_data(void)
187187
G_GNUC_END_IGNORE_DEPRECATIONS
188188
}
189189

190+
#ifdef SNAP_BUILD
191+
192+
static void remmina_main_show_snap_welcome()
193+
{
194+
GtkBuilder *dlgbuilder = NULL;
195+
GtkWidget *dlg;
196+
GtkWindow *parent;
197+
int result;
198+
static gboolean shown_once = FALSE;
199+
gboolean need_snap_interface_connections = FALSE;
200+
GtkWidget* dsa;
201+
RemminaSecretPlugin *remmina_secret_plugin;
202+
203+
if (shown_once)
204+
return;
205+
else
206+
shown_once = TRUE;
207+
208+
g_print("Remmina is compiled as a SNAP package.\n");
209+
remmina_secret_plugin = remmina_plugin_manager_get_secret_plugin();
210+
if (remmina_secret_plugin == NULL) {
211+
g_print(" but we can't find the secret plugin inside the SNAP.\n");
212+
need_snap_interface_connections = TRUE;
213+
} else {
214+
if (!remmina_secret_plugin->is_service_available()) {
215+
g_print(" but we can't access a secret service. Secret service or SNAP interface connection is missing.\n");
216+
need_snap_interface_connections = TRUE;
217+
}
218+
}
219+
220+
if (need_snap_interface_connections && !remmina_pref.prevent_snap_welcome_message) {
221+
dlgbuilder = remmina_public_gtk_builder_new_from_file("remmina_snap_info_dialog.glade");
222+
dsa = GTK_WIDGET(gtk_builder_get_object(dlgbuilder, "dontshowagain"));
223+
if(dlgbuilder) {
224+
parent = remmina_main_get_window();
225+
dlg = GTK_WIDGET(gtk_builder_get_object(dlgbuilder, "snapwarndlg"));
226+
if (parent)
227+
gtk_window_set_transient_for(GTK_WINDOW(dlg), parent);
228+
gtk_builder_connect_signals(dlgbuilder,NULL);
229+
result = gtk_dialog_run(GTK_DIALOG(dlg));
230+
if (result == 1) {
231+
remmina_pref.prevent_snap_welcome_message = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dsa));
232+
remmina_pref_save();
233+
}
234+
gtk_widget_destroy(dlg);
235+
g_object_unref(dlgbuilder);
236+
}
237+
}
238+
239+
}
240+
#endif
241+
242+
190243
static gboolean remmina_main_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path,
191244
gboolean path_currently_selected, gpointer user_data)
192245
{
@@ -1102,6 +1155,11 @@ void remmina_main_on_show(GtkWidget *w, gpointer user_data)
11021155
if (!remmina_pref.periodic_usage_stats_permission_asked) {
11031156
gtk_widget_set_visible(GTK_WIDGET(remminamain->box_ustat), TRUE);
11041157
}
1158+
1159+
#ifdef SNAP_BUILD
1160+
remmina_main_show_snap_welcome();
1161+
#endif
1162+
11051163
}
11061164

11071165
void remmina_main_on_click_ustat_yes(GtkWidget *w, gpointer user_data)

remmina/src/remmina_plugin_manager.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,7 @@ static gboolean remmina_gtksocket_available()
103103
available = TRUE;
104104
}
105105
#endif
106-
107106
return available;
108-
109107
}
110108

111109

remmina/src/remmina_pref.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,11 @@ void remmina_pref_init(void)
255255
else
256256
remmina_pref.floating_toolbar_placement = FLOATING_TOOLBAR_PLACEMENT_TOP;
257257

258+
if (g_key_file_has_key(gkeyfile, "remmina_pref", "prevent_snap_welcome_message", NULL))
259+
remmina_pref.prevent_snap_welcome_message = g_key_file_get_boolean(gkeyfile, "remmina_pref", "prevent_snap_welcome_message", NULL);
260+
else
261+
remmina_pref.prevent_snap_welcome_message = FALSE;
262+
258263
if (g_key_file_has_key(gkeyfile, "remmina_pref", "toolbar_placement", NULL))
259264
remmina_pref.toolbar_placement = g_key_file_get_integer(gkeyfile, "remmina_pref", "toolbar_placement", NULL);
260265
else
@@ -719,6 +724,7 @@ void remmina_pref_save(void)
719724
g_key_file_set_boolean(gkeyfile, "remmina_pref", "save_view_mode", remmina_pref.save_view_mode);
720725
g_key_file_set_integer(gkeyfile, "remmina_pref", "floating_toolbar_placement", remmina_pref.floating_toolbar_placement);
721726
g_key_file_set_integer(gkeyfile, "remmina_pref", "toolbar_placement", remmina_pref.toolbar_placement);
727+
g_key_file_set_boolean(gkeyfile, "remmina_pref", "prevent_snap_welcome_message", remmina_pref.prevent_snap_welcome_message);
722728
g_key_file_set_boolean(gkeyfile, "remmina_pref", "fullscreen_on_auto", remmina_pref.fullscreen_on_auto);
723729
g_key_file_set_boolean(gkeyfile, "remmina_pref", "always_show_tab", remmina_pref.always_show_tab);
724730
g_key_file_set_boolean(gkeyfile, "remmina_pref", "hide_connection_toolbar", remmina_pref.hide_connection_toolbar);

remmina/src/remmina_pref.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ typedef struct _RemminaPref {
152152
gboolean toolbar_pin_down;
153153
gint floating_toolbar_placement;
154154
gint toolbar_placement;
155+
gboolean prevent_snap_welcome_message;
155156

156157
/* Crypto */
157158
gchar *secret;

remmina/ui/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ install(FILES remmina_preferences.glade DESTINATION "${REMMINA_UIDIR}")
3939
install(FILES remmina_key_chooser.glade DESTINATION "${REMMINA_UIDIR}")
4040
install(FILES remmina_string_list.glade DESTINATION "${REMMINA_UIDIR}")
4141
install(FILES remmina_mpc.glade DESTINATION "${REMMINA_UIDIR}")
42+
install(FILES remmina_snap_info_dialog.glade DESTINATION "${REMMINA_UIDIR}")

0 commit comments

Comments
 (0)