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:
authorGiovanni Panozzo <giovanni@panozzo.it>2018-05-04 21:56:04 +0300
committerGiovanni Panozzo <giovanni@panozzo.it>2018-05-04 21:56:04 +0300
commitf47a95cc8575e7e8fd2f915d94fcbb4680ef97e1 (patch)
tree734c3a2c2850921ebddcb98e7956ba42c3410777 /src/remmina_plugin_manager.c
parent32c92e0168d72213eeb6a676c9001a5331893b3f (diff)
Speedup file list
Diffstat (limited to 'src/remmina_plugin_manager.c')
-rw-r--r--src/remmina_plugin_manager.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/remmina_plugin_manager.c b/src/remmina_plugin_manager.c
index abf9786f1..73da6db3a 100644
--- a/src/remmina_plugin_manager.c
+++ b/src/remmina_plugin_manager.c
@@ -56,8 +56,12 @@
#include "remmina_masterthread_exec.h"
#include "remmina/remmina_trace_calls.h"
+
static GPtrArray* remmina_plugin_table = NULL;
+/* A GHashTable of GHashTables where to store the names of the encrypted settings */
+static GHashTable *encrypted_settings_cache = NULL;
+
/* There can be only one secret plugin loaded */
static RemminaSecretPlugin *remmina_secret_plugin = NULL;
@@ -70,9 +74,61 @@ static gint remmina_plugin_manager_compare_func(RemminaPlugin **a, RemminaPlugin
return g_strcmp0((*a)->name, (*b)->name);
}
+static void htdestroy(gpointer ht)
+{
+ g_hash_table_unref(ht);
+}
+
+static void init_settings_cache(RemminaPlugin *plugin)
+{
+ TRACE_CALL(__func__);
+ RemminaProtocolPlugin *protocol_plugin;
+ const RemminaProtocolSetting* setting_iter;
+ GHashTable *pht;
+
+ /* This code make a encrypted setting cache only for protocol plugins */
+
+ if (plugin->type != REMMINA_PLUGIN_TYPE_PROTOCOL) {
+ return;
+ }
+
+ if (encrypted_settings_cache == NULL)
+ encrypted_settings_cache = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, htdestroy);
+
+ if (!(pht = g_hash_table_lookup(encrypted_settings_cache, plugin->name))) {
+ pht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+ g_hash_table_insert(encrypted_settings_cache, g_strdup(plugin->name), pht);
+ }
+
+ /* Some settings are encrypted "by name" */
+ g_hash_table_insert(pht, g_strdup("ssh_password"), (gpointer)TRUE);
+ g_hash_table_insert(pht, g_strdup("ssh_passphrase"), (gpointer)TRUE);
+
+ /* Other settings are encrypted because of their type */
+ protocol_plugin = (RemminaProtocolPlugin *)plugin;
+ setting_iter = protocol_plugin->basic_settings;
+ if (setting_iter) {
+ while (setting_iter->type != REMMINA_PROTOCOL_SETTING_TYPE_END) {
+ if (setting_iter->type == REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD)
+ g_hash_table_insert(pht, g_strdup(remmina_plugin_manager_get_canonical_setting_name(setting_iter)), (gpointer)TRUE);
+ setting_iter++;
+ }
+ }
+ setting_iter = protocol_plugin->advanced_settings;
+ if (setting_iter) {
+ while (setting_iter->type != REMMINA_PROTOCOL_SETTING_TYPE_END) {
+ if (setting_iter->type == REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD)
+ g_hash_table_insert(pht, g_strdup(remmina_plugin_manager_get_canonical_setting_name(setting_iter)), (gpointer)TRUE);
+ setting_iter++;
+ }
+ }
+
+}
+
static gboolean remmina_plugin_manager_register_plugin(RemminaPlugin *plugin)
{
TRACE_CALL(__func__);
+
if (plugin->type == REMMINA_PLUGIN_TYPE_SECRET) {
if (remmina_secret_plugin) {
g_print("Remmina plugin %s (type=%s) bypassed.\n", plugin->name,
@@ -81,6 +137,8 @@ static gboolean remmina_plugin_manager_register_plugin(RemminaPlugin *plugin)
}
remmina_secret_plugin = (RemminaSecretPlugin*)plugin;
}
+ init_settings_cache(plugin);
+
g_ptr_array_add(remmina_plugin_table, plugin);
g_ptr_array_sort(remmina_plugin_table, (GCompareFunc)remmina_plugin_manager_compare_func);
/* g_print("Remmina plugin %s (type=%s) registered.\n", plugin->name, _(remmina_plugin_type_name[plugin->type])); */
@@ -419,6 +477,7 @@ RemminaSecretPlugin* remmina_plugin_manager_get_secret_plugin(void)
gboolean remmina_plugin_manager_query_feature_by_type(RemminaPluginType ptype, const gchar* name, RemminaProtocolFeatureType ftype)
{
+ TRACE_CALL(__func__);
const RemminaProtocolFeature *feature;
RemminaProtocolPlugin* plugin;
@@ -435,3 +494,23 @@ gboolean remmina_plugin_manager_query_feature_by_type(RemminaPluginType ptype, c
return FALSE;
}
+gboolean remmina_plugin_manager_is_encrypted_setting(RemminaProtocolPlugin *pp, const char *setting)
+{
+ TRACE_CALL(__func__);
+ GHashTable *pht;
+
+ if (encrypted_settings_cache == NULL)
+ return FALSE;
+
+ if (!(pht = g_hash_table_lookup(encrypted_settings_cache, pp->name)))
+ return FALSE;
+
+ if (!g_hash_table_lookup(pht, setting))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+
+