Allow customising the warning shown when enabling the remote

This commit is contained in:
Richard Hughes 2018-04-11 11:03:05 +01:00
parent 9e7d69ccb1
commit 972f6eaba5
8 changed files with 207 additions and 4 deletions

View File

@ -210,7 +210,7 @@ mkdir -p --mode=0700 $RPM_BUILD_ROOT%{_localstatedir}/lib/fwupd/gnupg
%{_datadir}/dbus-1/system-services/org.freedesktop.fwupd.service
%{_datadir}/man/man1/dfu-tool.1.gz
%{_datadir}/man/man1/fwupdmgr.1.gz
%{_datadir}/metainfo/org.freedesktop.fwupd.metainfo.xml
%{_datadir}/metainfo/org.freedesktop.fwupd*.metainfo.xml
%{_datadir}/fwupd/firmware-packager
%{_unitdir}/fwupd-offline-update.service
%{_unitdir}/fwupd.service

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2018 Richard Hughes <richard@hughsie.com> -->
<component type="source">
<id>org.freedesktop.fwupd.remotes.lvfs-testing</id>
<name>Linux Vendor Firmware Service (testing firmware)</name>
<metadata_license>CC0</metadata_license>
<agreement version_id="1.0">
<agreement_section>
<description>
<!-- TRANSLATORS: do not translate the variables marked using $ -->
<p>
The LVFS is a free service that operates as an independent legal
entity and has no connection with $OS_RELEASE:NAME$.
Your distributor may not have verified any of the firmware updates for
compatibility with your system or connected devices.
All firmware is provided only by the original equipment manufacturer.
</p>
<p>
This remote contains firmware which is not embargoed, but is still being
tested by the hardware vendor.
You should ensure you have a way to manually downgrade the firmware if
the firmware update fails.
</p>
<p>
Enabling this functionality is done at your own risk, which means you
have to contact your original equipment manufacturer regarding any
problems caused by these updates.
Only problems with the update process itself should be filed at
$OS_RELEASE:BUG_REPORT_URL$.
</p>
</description>
</agreement_section>
</agreement>
</component>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2018 Richard Hughes <richard@hughsie.com> -->
<component type="source">
<id>org.freedesktop.fwupd.remotes.lvfs</id>
<name>Linux Vendor Firmware Service (stable firmware)</name>
<metadata_license>CC0</metadata_license>
<agreement version_id="1.0">
<agreement_section>
<description>
<!-- TRANSLATORS: do not translate the variables marked using $ -->
<p>
The LVFS is a free service that operates as an independent legal
entity and has no connection with $OS_RELEASE:NAME$.
Your distributor may not have verified any of the firmware updates for
compatibility with your system or connected devices.
All firmware is provided only by the original equipment manufacturer.
</p>
<p>
Enabling this functionality is done at your own risk, which means you
have to contact your original equipment manufacturer regarding any
problems caused by these updates.
Only problems with the update process itself should be filed at
$OS_RELEASE:BUG_REPORT_URL$.
</p>
</description>
</agreement_section>
</agreement>
</component>

View File

@ -5,6 +5,24 @@ if get_option('lvfs')
],
install_dir : join_paths(sysconfdir, 'fwupd', 'remotes.d')
)
i18n.merge_file(
input: 'lvfs.metainfo.xml',
output: 'org.freedesktop.fwupd.remotes.lvfs.metainfo.xml',
type: 'xml',
po_dir: join_paths(meson.source_root(), 'po'),
data_dirs: join_paths(meson.source_root(), 'po'),
install: true,
install_dir: join_paths(get_option('datadir'), 'metainfo')
)
i18n.merge_file(
input: 'lvfs-testing.metainfo.xml',
output: 'org.freedesktop.fwupd.remotes.lvfs-testing.metainfo.xml',
type: 'xml',
po_dir: join_paths(meson.source_root(), 'po'),
data_dirs: join_paths(meson.source_root(), 'po'),
install: true,
install_dir: join_paths(get_option('datadir'), 'metainfo')
)
endif
install_data('README.md',

View File

@ -1,4 +1,6 @@
data/org.freedesktop.fwupd.metainfo.xml
data/remotes.d/lvfs.metainfo.xml
data/remotes.d/lvfs-testing.metainfo.xml
policy/org.freedesktop.fwupd.policy.in
plugins/dfu/dfu-tool.c
plugins/synapticsmst/synapticsmst-tool.c

14
po/its/appdata.its Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0"?>
<its:rules xmlns:its="http://www.w3.org/2005/11/its"
version="2.0">
<its:translateRule selector="/component" translate="no"/>
<its:translateRule selector="/component/name |
/component/summary |
/component/description |
/component/developer_name |
/component/agreement/agreement_section/name |
/component/agreement/agreement_section/summary |
/component/agreement/agreement_section/description |
/component/screenshots/screenshot/caption"
translate="yes"/>
</its:rules>

9
po/its/appdata.loc Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<locatingRules>
<locatingRule name="AppData" pattern="*.appdata.xml">
<documentRule localName="component" target="appdata.its"/>
</locatingRule>
<locatingRule name="AppData" pattern="*.metainfo.xml">
<documentRule localName="component" target="appdata.its"/>
</locatingRule>
</locatingRules>

View File

@ -481,15 +481,111 @@ fu_util_get_remote_warning (FuUtilPrivate *priv, FwupdRemote *remote, GError **e
return str;
}
static GString *
fu_util_get_component_agreement (FuUtilPrivate *priv, AsApp *app, GError **error)
{
g_autofree gchar *tmp = NULL;
#if AS_CHECK_VERSION(0,7,8)
AsAgreement *agreement;
AsAgreementSection *section;
/* get the default agreement section */
agreement = as_app_get_agreement_default (app);
if (agreement == NULL) {
g_set_error_literal (error,
FWUPD_ERROR,
FWUPD_ERROR_NOT_FOUND,
"No agreement found");
return NULL;
}
section = as_agreement_get_section_default (agreement);
if (section == NULL) {
g_set_error_literal (error,
FWUPD_ERROR,
FWUPD_ERROR_NOT_FOUND,
"No default section for agreement found");
return NULL;
}
tmp = as_agreement_section_get_description (section, NULL);
if (tmp == NULL) {
g_set_error_literal (error,
FWUPD_ERROR,
FWUPD_ERROR_NOT_FOUND,
"No description found in agreement section");
return NULL;
}
/* convert to console text */
tmp = as_markup_convert_simple (tmp, error);
#else
AsFormat *format;
GNode *n;
g_autoptr(AsNode) root = NULL;
g_autoptr(GFile) file = NULL;
g_autoptr(GString) str = NULL;
/* parse the XML file */
format = as_app_get_format_default (app);
if (format == NULL) {
g_set_error_literal (error,
FWUPD_ERROR,
FWUPD_ERROR_NOT_FOUND,
"No format for Metainfo file");
return NULL;
}
file = g_file_new_for_path (as_format_get_filename (format));
root = as_node_from_file (file, AS_NODE_FROM_XML_FLAG_NONE, NULL, error);
if (root == NULL)
return NULL;
/* manually find the first agreement section */
n = as_node_find (root, "component/agreement/agreement_section/description");
if (n == NULL) {
g_set_error_literal (error,
FWUPD_ERROR,
FWUPD_ERROR_NOT_FOUND,
"No agreement description found");
return NULL;
}
str = as_node_to_xml (n->children, AS_NODE_TO_XML_FLAG_INCLUDE_SIBLINGS);
tmp = as_markup_convert_simple (str->str, error);
#endif
return g_string_new (tmp);
}
static gboolean
fu_util_modify_remote_warning (FuUtilPrivate *priv, FwupdRemote *remote, GError **error)
{
AsApp *app;
g_autofree gchar *component_id = NULL;
g_autoptr(AsStore) store = NULL;
g_autoptr(GHashTable) os_release = NULL;
g_autoptr(GString) desc_plain_str = NULL;
/* get a generic warning */
desc_plain_str = fu_util_get_remote_warning (priv, remote, error);
if (desc_plain_str == NULL)
/* try to find a custom agreement, falling back to a generic warning */
store = as_store_new ();
as_store_add_filter (store, AS_APP_KIND_SOURCE);
if (!as_store_load (store, AS_STORE_LOAD_FLAG_APPDATA, NULL, error))
return FALSE;
component_id = g_strdup_printf ("org.freedesktop.fwupd.remotes.%s",
fwupd_remote_get_id (remote));
app = as_store_get_app_by_id (store, component_id);
if (app != NULL) {
desc_plain_str = fu_util_get_component_agreement (priv, app, error);
if (desc_plain_str == NULL)
return FALSE;
} else {
desc_plain_str = fu_util_get_remote_warning (priv, remote, error);
if (desc_plain_str == NULL)
return FALSE;
}
/* replace any dynamic values from os-release */
os_release = fwupd_get_os_release (error);
as_utils_string_replace (desc_plain_str, "$OS_RELEASE:NAME$",
g_hash_table_lookup (os_release, "NAME"));
as_utils_string_replace (desc_plain_str, "$OS_RELEASE:BUG_REPORT_URL$",
g_hash_table_lookup (os_release, "BUG_REPORT_URL"));
/* show and ask user to confirm */
g_print ("%s", desc_plain_str->str);