136 #include <sys/utsname.h> 139 #include <glib/gi18n.h> 140 #include <glib/gstdio.h> 154 #ifdef GDK_WINDOWING_WAYLAND 155 #include <gdk/gdkwayland.h> 157 #ifdef GDK_WINDOWING_X11 158 #include <gdk/gdkx.h> 173 TRACE_CALL(__func__);
176 const gchar *uname, *hname;
177 const gchar *uid_suffix;
194 uname = g_get_user_name();
195 hname = g_get_host_name();
196 chs = g_checksum_new(G_CHECKSUM_SHA256);
197 g_checksum_update(chs, (
const guchar*)uname, strlen(uname));
198 g_checksum_update(chs, (
const guchar*)hname, strlen(hname));
199 uid_suffix = g_checksum_get_string(chs);
202 g_checksum_free(chs);
204 r = json_node_alloc();
205 json_node_init_string(r, uid);
215 TRACE_CALL(__func__);
220 gchar *kernel_release;
224 GHashTable *etc_release;
233 b = json_builder_new();
234 json_builder_begin_object(b);
236 json_builder_set_member_name(b,
"kernel_name");
238 if (!kernel_name || kernel_name[0] ==
'\0') {
239 json_builder_add_null_value(b);
241 json_builder_add_string_value(b, kernel_name);
245 json_builder_set_member_name(b,
"kernel_release");
247 if (!kernel_release || kernel_release[0] ==
'\0') {
248 json_builder_add_null_value(b);
250 json_builder_add_string_value(b, kernel_release);
252 g_free(kernel_release);
254 json_builder_set_member_name(b,
"kernel_arch");
256 if (!kernel_arch || kernel_arch[0] ==
'\0') {
257 json_builder_add_null_value(b);
259 json_builder_add_string_value(b, kernel_arch);
263 json_builder_set_member_name(b,
"lsb_distributor");
265 if (!
id ||
id[0] ==
'\0') {
266 json_builder_add_null_value(b);
268 json_builder_add_string_value(b,
id);
272 json_builder_set_member_name(b,
"lsb_distro_description");
274 if (!description || description[0] ==
'\0') {
275 json_builder_add_null_value(b);
277 json_builder_add_string_value(b, description);
281 json_builder_set_member_name(b,
"lsb_distro_release");
283 if (!release || release[0] ==
'\0') {
284 json_builder_add_null_value(b);
286 json_builder_add_string_value(b, release);
290 json_builder_set_member_name(b,
"lsb_distro_codename");
292 if (!codename || codename[0] ==
'\0') {
293 json_builder_add_null_value(b);
295 json_builder_add_string_value(b, codename);
300 json_builder_set_member_name(b,
"etc_release");
302 json_builder_begin_object(b);
303 g_hash_table_iter_init (&iter, etc_release);
304 while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&value)) {
305 json_builder_set_member_name(b, key);
306 json_builder_add_string_value(b, value);
308 json_builder_end_object(b);
309 g_hash_table_remove_all(etc_release);
310 g_hash_table_unref(etc_release);
312 json_builder_add_null_value(b);
319 json_builder_end_object(b);
320 r = json_builder_get_root(b);
333 TRACE_CALL(__func__);
341 b = json_builder_new();
342 json_builder_begin_object(b);
343 json_builder_set_member_name(b,
"language");
345 json_builder_add_string_value(b, language);
347 json_builder_end_object(b);
348 r = json_builder_get_root(b);
356 TRACE_CALL(__func__);
364 b = json_builder_new();
365 json_builder_begin_object(b);
366 json_builder_set_member_name(b,
"version");
367 json_builder_add_string_value(b, VERSION);
368 json_builder_set_member_name(b,
"git_revision");
369 json_builder_add_string_value(b, REMMINA_GIT_REVISION);
370 json_builder_set_member_name(b,
"snap_build");
372 json_builder_add_int_value(b, 1);
374 json_builder_add_int_value(b, 0);
380 json_builder_set_member_name(b,
"flatpak_build");
382 flatpak_info = g_build_filename(g_get_user_runtime_dir(),
"flatpak-info", NULL);
383 if (g_file_test(flatpak_info, G_FILE_TEST_EXISTS)) {
384 json_builder_add_int_value(b, 1);
386 json_builder_add_int_value(b, 0);
388 g_free(flatpak_info);
390 json_builder_end_object(b);
391 r = json_builder_get_root(b);
398 TRACE_CALL(__func__);
406 b = json_builder_new();
407 json_builder_begin_object(b);
408 json_builder_set_member_name(b,
"major");
409 json_builder_add_int_value(b, gtk_get_major_version());
410 json_builder_set_member_name(b,
"minor");
411 json_builder_add_int_value(b, gtk_get_minor_version());
412 json_builder_set_member_name(b,
"micro");
413 json_builder_add_int_value(b, gtk_get_micro_version());
414 json_builder_end_object(b);
415 r = json_builder_get_root(b);
423 TRACE_CALL(__func__);
432 disp = gdk_display_get_default();
434 #ifdef GDK_WINDOWING_WAYLAND 435 if (GDK_IS_WAYLAND_DISPLAY(disp)) {
439 #ifdef GDK_WINDOWING_X11 440 if (GDK_IS_X11_DISPLAY(disp)) {
446 r = json_node_alloc();
447 json_node_init_string(r, bkend);
455 TRACE_CALL(__func__);
461 b = json_builder_new();
462 json_builder_begin_object(b);
464 json_builder_set_member_name(b,
"window_manager");
468 if (!wmver || wmver[0] ==
'\0') {
472 json_builder_add_string_value(b,
"Gnome Shell");
473 json_builder_set_member_name(b,
"gnome_shell_ver");
474 json_builder_add_string_value(b, wmver);
480 if (!wmname || wmname[0] ==
'\0') {
483 json_builder_add_string_value(b,
"n/a");
486 json_builder_add_string_value(b, wmname);
491 json_builder_end_object(b);
492 r = json_builder_get_root(b);
499 TRACE_CALL(__func__);
504 b = json_builder_new();
505 json_builder_begin_object(b);
507 json_builder_set_member_name(b,
"appindicator_supported");
511 json_builder_add_int_value(b, 1);
512 json_builder_set_member_name(b,
"appindicator_compiled");
513 #ifdef HAVE_LIBAPPINDICATOR 515 json_builder_add_int_value(b, 1);
518 json_builder_add_int_value(b, 0);
522 json_builder_add_int_value(b, 0);
523 json_builder_set_member_name(b,
"icon_is_active");
526 json_builder_add_int_value(b, 1);
527 json_builder_set_member_name(b,
"appindicator_type");
528 #ifdef HAVE_LIBAPPINDICATOR 530 json_builder_add_string_value(b,
"AppIndicator on GtkStatusIcon/xembed");
533 json_builder_add_string_value(b,
"Remmina icon on GtkStatusIcon/xembed");
537 json_builder_add_int_value(b, 0);
539 json_builder_end_object(b);
540 r = json_builder_get_root(b);
553 TRACE_CALL(__func__);
558 gchar *hday, *hmonth, *hyear;
559 gchar *pday, *pmonth, *pyear;
561 GDateTime *prof_gdate;
562 GDateTime *pdata_gdate;
570 g_debug(
"%s date %s", pdata->
protocol, last_success);
572 prof_gdate = pdata_gdate = NULL;
573 if (last_success && last_success[0] !=
'\0' && strlen(last_success) >= 6) {
574 pyear = g_strdup_printf(
"%.4s", last_success);
575 pmonth = g_strdup_printf(
"%.2s", last_success + 4);
576 pday = g_strdup_printf(
"%.2s", last_success + 6);
577 prof_gdate = g_date_time_new_local(
580 atoi(pday), 0, 0, 0);
589 count = GPOINTER_TO_INT(pcount) + 1;
592 g_hash_table_insert(pdata->
proto_count, g_strdup(pdata->
protocol), GINT_TO_POINTER(count));
594 g_hash_table_replace(pdata->
proto_count, g_strdup(pdata->
protocol), GINT_TO_POINTER(count));
599 if (pdate && strlen(pdate) >= 6) {
601 hyear = g_strdup_printf(
"%.4s", (
char*)pdate);
602 hmonth = g_strdup_printf(
"%.2s", (
char*)pdate + 4);
603 hday = g_strdup_printf(
"%.2s", (
char*)pdate + 6);
604 pdata_gdate = g_date_time_new_local(
607 atoi(hday), 0, 0, 0);
614 if (prof_gdate != NULL && pdata_gdate != NULL ) {
615 g_debug(
"Comparing dates");
616 gint res = g_date_time_compare( pdata_gdate, prof_gdate );
619 g_debug(
"hash date is less than profile date. Replacing date in the hashtable");
620 g_hash_table_replace(pdata->
proto_date, g_strdup(pdata->
protocol), g_strdup(last_success));
622 g_debug(
"profile date is less than hash date. Replacing date in the hashtable");
628 if (prof_gdate == NULL && pdata_gdate != NULL) {
629 g_debug(
"prof_gdate is NULL, replacing date in the hashtable");
634 if (prof_gdate != NULL && pdata_gdate == NULL) {
635 g_debug(
"pdata_gdate is NULL, replacing date in the hashtable");
636 g_hash_table_replace(pdata->
proto_date, g_strdup(pdata->
protocol), g_strdup(last_success));
639 if ((prof_gdate == NULL && pdata_gdate == NULL) && pdata->
pdatestr) {
640 g_debug(
"All dates are NULL, replacing date in the hashtable");
654 g_debug(
"pdata set to %s protocol with last_success to %s", pdata->
protocol, pdata->
pdatestr);
656 g_date_time_unref(pdata_gdate);
658 g_date_time_unref(prof_gdate);
686 TRACE_CALL(__func__);
693 GHashTableIter pcountiter, pdateiter;
694 gpointer pcountkey, pcountvalue;
695 gpointer pdatekey, pdatevalue;
700 b = json_builder_new();
701 json_builder_begin_object(b);
703 json_builder_set_member_name(b,
"profile_count");
708 pdata->
proto_date = g_hash_table_new_full(g_str_hash, g_str_equal,
709 (GDestroyNotify)g_free, (GDestroyNotify)g_free);
710 pdata->
proto_count = g_hash_table_new_full(g_str_hash, g_str_equal,
711 (GDestroyNotify)g_free, NULL);
716 g_debug(
"Number of profiles: %d", profiles_count);
718 json_builder_add_int_value(b, profiles_count);
720 g_hash_table_iter_init(&pcountiter, pdata->proto_count);
721 while (g_hash_table_iter_next(&pcountiter, &pcountkey, &pcountvalue)) {
722 json_builder_set_member_name(b, (gchar*)pcountkey);
723 json_builder_add_int_value(b, GPOINTER_TO_INT(pcountvalue));
726 g_hash_table_iter_init(&pdateiter, pdata->proto_date);
727 while (g_hash_table_iter_next(&pdateiter, &pdatekey, &pdatevalue)) {
728 s = g_strdup_printf(
"DATE_%s", (gchar*)pdatekey);
729 g_debug(
"Protocol date label: %s", s);
730 json_builder_set_member_name(b, s);
732 json_builder_add_string_value(b, (gchar*)pdatevalue);
733 g_debug(
"Protocol date: %s", (gchar*)pdatevalue);
736 json_builder_end_object(b);
737 r = json_builder_get_root(b);
740 g_hash_table_remove_all(pdata->proto_date);
741 g_hash_table_unref(pdata->proto_date);
742 g_hash_table_remove_all(pdata->proto_count);
743 g_hash_table_unref(pdata->proto_count);
758 TRACE_CALL(__func__);
765 b = json_builder_new();
766 json_builder_begin_object(b);
769 json_builder_set_member_name(b,
"plugin_name");
770 json_builder_add_string_value(b, secret_plugin->
name);
772 json_builder_end_object(b);
773 r = json_builder_get_root(b);
787 TRACE_CALL(__func__);
792 b = json_builder_new();
793 json_builder_begin_object(b);
795 json_builder_set_member_name(b,
"master_password_status");
797 json_builder_add_string_value(b,
"ON");
799 json_builder_add_string_value(b,
"OFF");
802 json_builder_end_object(b);
803 r = json_builder_get_root(b);
817 TRACE_CALL(__func__);
822 b = json_builder_new();
823 json_builder_begin_object(b);
825 json_builder_set_member_name(b,
"kiosk_status");
827 json_builder_add_string_value(b,
"OFF");
829 json_builder_add_string_value(b,
"ON");
832 json_builder_end_object(b);
833 r = json_builder_get_root(b);
850 TRACE_CALL(__func__);
854 b = json_builder_new();
855 json_builder_begin_object(b);
858 json_builder_set_member_name(b,
"UID");
859 json_builder_add_value(b, n);
862 json_builder_set_member_name(b,
"REMMINAVERSION");
863 json_builder_add_value(b, n);
866 json_builder_set_member_name(b,
"SYSTEM");
867 json_builder_add_value(b, n);
874 json_builder_set_member_name(b,
"ENVIRONMENT");
875 json_builder_add_value(b, n);
878 json_builder_set_member_name(b,
"GTKVERSION");
879 json_builder_add_value(b, n);
882 json_builder_set_member_name(b,
"GTKBACKEND");
883 json_builder_add_value(b, n);
886 json_builder_set_member_name(b,
"WINDOWMANAGER");
887 json_builder_add_value(b, n);
890 json_builder_set_member_name(b,
"APPINDICATOR");
891 json_builder_add_value(b, n);
894 json_builder_set_member_name(b,
"PROFILES");
895 json_builder_add_value(b, n);
898 json_builder_set_member_name(b,
"ACTIVESECRETPLUGIN");
899 json_builder_add_value(b, n);
902 json_builder_set_member_name(b,
"HASMASTERPASSWORD");
903 json_builder_add_value(b, n);
906 json_builder_set_member_name(b,
"KIOSK");
907 json_builder_add_value(b, n);
910 json_builder_end_object(b);
911 n = json_builder_get_root(b);
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
JsonNode * remmina_stats_get_uid()
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
JsonNode * remmina_stats_get_user_env()
Gets the following user environment:
RemminaSecretPlugin * remmina_plugin_manager_get_secret_plugin(void)
gint pcount
Date in string format in the proto_date hash table.
gchar * remmina_utils_get_lsb_codename()
Print the Distribution codename as specified by the lsb_release command.
gboolean remmina_icon_is_available(void)
Determine whenever the Remmina icon is available.
gboolean(* is_service_available)(void)
gchar * remmina_utils_get_lsb_id()
Print the Distributor as specified by the lsb_release command.
const gchar * remmina_utils_get_kernel_name()
Return the OS name as in "uname -s".
JsonNode * remmina_stats_get_secret_plugin()
Add a json member ACTIVESECRETPLUGIN which shows the current secret plugin in use by remmina...
const gchar * remmina_utils_get_kernel_release()
Return the OS version as in "uname -r".
JsonNode * remmina_stats_get_gtk_version()
void remmina_debug(const gchar *fmt,...)
Print a string in the Remmina Debug Windows and in the terminal.
JsonNode * remmina_stats_get_master_password_status()
Add a json member HASMASTERPASSWORD which shows the status of the master password.
JsonNode * remmina_stats_get_os_info()
General utility functions, non-GTK related.
gchar * remmina_utils_get_lsb_release()
Print the Distribution release name as specified by the lsb_release command.
gchar * remmina_gen_random_uuid()
Generate a random sting of chars to be used as part of UID for news or stats.
gchar * periodic_usage_stats_uuid_prefix
gchar * remmina_utils_get_lang()
Return the current language defined in the LC_ALL.
gchar * remmina_utils_get_lsb_description()
Print the Distribution description as specified by the lsb_release command.
gchar * remmina_sysinfo_get_gnome_shell_version()
Query DBUS to get gnome shell version.
JsonNode * remmina_stats_get_gtk_backend()
gboolean remmina_pref_get_boolean(const gchar *key)
JsonNode * remmina_stats_get_profiles()
Add a json member profile_count with a child for each protocol used by the user.
static void remmina_profiles_get_data(RemminaFile *remminafile, gpointer user_data)
Given a remmina file, fills a structure containing profiles keys/value tuples.
JsonNode * remmina_stats_get_all()
Get all statistics in json format to send periodically to the PHP server.
gchar * remmina_sysinfo_get_wm_name()
Query environment variables to get the Window manager name.
const gchar * pdatestr
Key in the proto_count hash table.
gboolean remmina_pref_save(void)
gboolean remmina_sysinfo_is_appindicator_available()
JsonNode * remmina_stats_get_indicator()
JsonNode * remmina_stats_get_wm_name()
GHashTable * remmina_utils_get_etc_release()
Print the distribution description if found.
const gchar * remmina_utils_get_kernel_arch()
Return the machine hardware name as in "uname -m".
JsonNode * remmina_stats_get_kiosk_mode()
Add a json member KIOSK which shows the status of the kiosk.
gint remmina_file_manager_iterate(GFunc func, gpointer user_data)
JsonNode * remmina_stats_get_version()