/** * appdata_validate_format_text: **/ static void appdata_validate_format_text (const gchar *filename, GPtrArray *probs) { AsProblem *problem; const gchar *tmp; guint i; guint j; if (probs->len == 0) { /* TRANSLATORS: the file is valid */ g_print (_("%s validated OK."), filename); g_print ("\n"); return; } g_print ("%s %i %s\n", filename, probs->len, _("problems detected:")); for (i = 0; i < probs->len; i++) { problem = g_ptr_array_index (probs, i); tmp = as_problem_kind_to_string (as_problem_get_kind (problem)); g_print ("• %s ", tmp); for (j = strlen (tmp); j < 20; j++) g_print (" "); if (as_problem_get_line_number (problem) > 0) { g_print (" : %s [ln:%i]\n", as_problem_get_message (problem), as_problem_get_line_number (problem)); } else { g_print (" : %s\n", as_problem_get_message (problem)); } } }
G_GNUC_PRINTF (3, 4) static void ai_app_validate_add (AsAppValidateHelper *helper, AsProblemKind kind, const gchar *fmt, ...) { AsProblem *problem; guint i; va_list args; g_autofree gchar *str = NULL; va_start (args, fmt); str = g_strdup_vprintf (fmt, args); va_end (args); /* don't care about style when relaxed */ if (helper->flags & AS_APP_VALIDATE_FLAG_RELAX && kind == AS_PROBLEM_KIND_STYLE_INCORRECT) return; /* already added */ for (i = 0; i < helper->probs->len; i++) { problem = g_ptr_array_index (helper->probs, i); if (g_strcmp0 (as_problem_get_message (problem), str) == 0) return; } /* add new problem to list */ problem = as_problem_new (); as_problem_set_kind (problem, kind); as_problem_set_message (problem, str); g_debug ("Adding %s '%s'", as_problem_kind_to_string (kind), str); g_ptr_array_add (helper->probs, problem); }
static AsApp * load_appdata (const gchar *prefix, const gchar *app_name, GError **error) { g_autofree gchar *appdata_basename = NULL; g_autofree gchar *appdata_path = NULL; g_autoptr(AsApp) app = NULL; g_autoptr(GPtrArray) problems = NULL; AsProblemKind problem_kind; AsProblem *problem; guint i; appdata_basename = g_strconcat (app_name, ".appdata.xml", NULL); appdata_path = g_build_filename (prefix, "share", "appdata", appdata_basename, NULL); g_debug ("Looking for %s", appdata_path); app = as_app_new (); if (!as_app_parse_file (app, appdata_path, AS_APP_PARSE_FLAG_USE_HEURISTICS, error)) return NULL; if (as_app_get_kind (app) == AS_APP_KIND_UNKNOWN) { g_set_error (error, AS_APP_ERROR, AS_APP_ERROR_FAILED, "%s has no recognised type", as_app_get_id (AS_APP (app))); return NULL; } problems = as_app_validate (app, AS_APP_VALIDATE_FLAG_NO_NETWORK | AS_APP_VALIDATE_FLAG_RELAX, error); if (problems == NULL) return NULL; for (i = 0; i < problems->len; i++) { problem = g_ptr_array_index (problems, i); problem_kind = as_problem_get_kind (problem); as_compose_app_log (app, "AppData problem: %s : %s", as_problem_kind_to_string (problem_kind), as_problem_get_message (problem)); } if (problems->len > 0) { g_set_error (error, AS_APP_ERROR, AS_APP_ERROR_FAILED, "AppData file %s was not valid", appdata_path); return NULL; } return g_steal_pointer (&app); }
/** * appdata_validate_format_xml: **/ static void appdata_validate_format_xml (const gchar *filename, GPtrArray *probs) { AsProblem *problem; GString *tmp; guint i; g_print ("<results version=\"1\">\n"); g_print (" <filename>%s</filename>\n", filename); if (probs->len > 0) { g_print (" <problems>\n"); for (i = 0; i < probs->len; i++) { problem = g_ptr_array_index (probs, i); tmp = g_string_new (as_problem_get_message (problem)); gs_string_replace (tmp, "&", "&"); gs_string_replace (tmp, "<", ""); gs_string_replace (tmp, ">", ""); if (as_problem_get_line_number (problem) > 0) { g_print (" <problem type=\"%s\" line=\"%i\">%s</problem>\n", as_problem_kind_to_string (as_problem_get_kind (problem)), as_problem_get_line_number (problem), tmp->str); } else { g_print (" <problem type=\"%s\">%s</problem>\n", as_problem_kind_to_string (as_problem_get_kind (problem)), tmp->str); } g_string_free (tmp, TRUE); } g_print (" </problems>\n"); } g_print ("</results>\n"); }
/** * appdata_validate_format_html: **/ static void appdata_validate_format_html (const gchar *filename, GPtrArray *probs) { AsProblem *problem; GString *tmp; guint i; g_print ("<html>\n"); g_print ("<head>\n"); g_print ("<style type=\"text/css\">\n"); g_print ("body {width: 70%%; font: 12px/20px Arial, Helvetica;}\n"); g_print ("p {color: #333;}\n"); g_print ("</style>\n"); g_print ("<title>AppData Validation Results for %s</title>\n", filename); g_print ("</head>\n"); g_print ("<body>\n"); if (probs->len == 0) { g_print ("<h1>Success!</h1>\n"); g_print ("<p>%s validated successfully.</p>\n", filename); } else { g_print ("<h1>Validation failed!</h1>\n"); g_print ("<p>%s did not validate:</p>\n", filename); g_print ("<ul>\n"); for (i = 0; i < probs->len; i++) { problem = g_ptr_array_index (probs, i); tmp = g_string_new (as_problem_get_message (problem)); gs_string_replace (tmp, "&", "&"); gs_string_replace (tmp, "<", "["); gs_string_replace (tmp, ">", "]"); g_print ("<li>"); g_print ("%s\n", tmp->str); if (as_problem_get_line_number (problem) > 0) { g_print (" (line %i)", as_problem_get_line_number (problem)); } g_print ("</li>\n"); g_string_free (tmp, TRUE); } g_print ("</ul>\n"); } g_print ("</body>\n"); g_print ("</html>\n"); }
/** * ai_app_validate_add: */ static void ai_app_validate_add (GPtrArray *problems, AsProblemKind kind, const gchar *str) { AsProblem *problem; guint i; /* already added */ for (i = 0; i < problems->len; i++) { problem = g_ptr_array_index (problems, i); if (g_strcmp0 (as_problem_get_message (problem), str) == 0) return; } /* add new problem to list */ problem = as_problem_new (); as_problem_set_kind (problem, kind); as_problem_set_message (problem, str); g_debug ("Adding %s '%s'", as_problem_kind_to_string (kind), str); g_ptr_array_add (problems, problem); }
static gboolean asb_plugin_process_filename (AsbPlugin *plugin, AsbPackage *pkg, const gchar *filename, GList **apps, GError **error) { AsProblemKind problem_kind; AsProblem *problem; GPtrArray *icons; const gchar *tmp; guint i; g_autoptr(AsbApp) app = NULL; g_autoptr(GPtrArray) problems = NULL; app = asb_app_new (NULL, NULL); if (!as_app_parse_file (AS_APP (app), filename, AS_APP_PARSE_FLAG_USE_HEURISTICS, error)) return FALSE; if (as_app_get_kind (AS_APP (app)) == AS_APP_KIND_UNKNOWN) { g_set_error (error, ASB_PLUGIN_ERROR, ASB_PLUGIN_ERROR_FAILED, "%s has no recognised type", as_app_get_id (AS_APP (app))); return FALSE; } /* validate */ problems = as_app_validate (AS_APP (app), AS_APP_VALIDATE_FLAG_NO_NETWORK | AS_APP_VALIDATE_FLAG_RELAX, error); if (problems == NULL) return FALSE; asb_app_set_package (app, pkg); for (i = 0; i < problems->len; i++) { problem = g_ptr_array_index (problems, i); problem_kind = as_problem_get_kind (problem); asb_package_log (asb_app_get_package (app), ASB_PACKAGE_LOG_LEVEL_WARNING, "AppData problem: %s : %s", as_problem_kind_to_string (problem_kind), as_problem_get_message (problem)); } /* nuke things that do not belong */ icons = as_app_get_icons (AS_APP (app)); if (icons->len > 0) g_ptr_array_set_size (icons, 0); /* fix up the project license */ tmp = as_app_get_project_license (AS_APP (app)); if (tmp != NULL && !as_utils_is_spdx_license (tmp)) { g_autofree gchar *license_spdx = NULL; license_spdx = as_utils_license_to_spdx (tmp); if (as_utils_is_spdx_license (license_spdx)) { asb_package_log (asb_app_get_package (app), ASB_PACKAGE_LOG_LEVEL_WARNING, "project license fixup: %s -> %s", tmp, license_spdx); as_app_set_project_license (AS_APP (app), license_spdx); } else { asb_package_log (asb_app_get_package (app), ASB_PACKAGE_LOG_LEVEL_WARNING, "project license is invalid: %s", tmp); as_app_set_project_license (AS_APP (app), NULL); } } /* check license */ tmp = as_app_get_metadata_license (AS_APP (app)); if (tmp == NULL) { g_set_error (error, ASB_PLUGIN_ERROR, ASB_PLUGIN_ERROR_FAILED, "AppData %s has no licence", filename); return FALSE; } if (!as_utils_is_spdx_license (tmp)) { g_set_error (error, ASB_PLUGIN_ERROR, ASB_PLUGIN_ERROR_FAILED, "AppData %s license '%s' invalid", filename, tmp); return FALSE; } /* log updateinfo */ tmp = as_app_get_update_contact (AS_APP (app)); if (tmp != NULL) { asb_package_log (asb_app_get_package (app), ASB_PACKAGE_LOG_LEVEL_INFO, "Upstream contact <%s>", tmp); } /* add icon for firmware */ if (as_app_get_kind (AS_APP (app)) == AS_APP_KIND_FIRMWARE) { g_autoptr(AsIcon) icon = NULL; icon = as_icon_new (); as_icon_set_kind (icon, AS_ICON_KIND_STOCK); as_icon_set_name (icon, "application-x-executable"); as_app_add_icon (AS_APP (app), icon); } /* fix up input methods */ if (as_app_get_kind (AS_APP (app)) == AS_APP_KIND_INPUT_METHOD) { g_autoptr(AsIcon) icon = NULL; icon = as_icon_new (); as_icon_set_kind (icon, AS_ICON_KIND_STOCK); as_icon_set_name (icon, "system-run-symbolic"); as_app_add_icon (AS_APP (app), icon); as_app_add_category (AS_APP (app), "Addons"); as_app_add_category (AS_APP (app), "InputSources"); } /* fix up codecs */ if (as_app_get_kind (AS_APP (app)) == AS_APP_KIND_CODEC) { g_autoptr(AsIcon) icon = NULL; icon = as_icon_new (); as_icon_set_kind (icon, AS_ICON_KIND_STOCK); as_icon_set_name (icon, "application-x-executable"); as_app_add_icon (AS_APP (app), icon); as_app_add_category (AS_APP (app), "Addons"); as_app_add_category (AS_APP (app), "Codecs"); } /* success */ asb_app_set_hidpi_enabled (app, asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_HIDPI_ICONS)); asb_plugin_add_app (apps, AS_APP (app)); return TRUE; }