diff --git a/man/ostree.repo-config.xml b/man/ostree.repo-config.xml index 5e0383a6..b4c276df 100644 --- a/man/ostree.repo-config.xml +++ b/man/ostree.repo-config.xml @@ -179,6 +179,11 @@ Boston, MA 02111-1307, USA. tls-ca-path Path to file containing trusted anchors instead of the system CA database. + + + unconfigured-state + If set, pulls from this remote will fail with the configured text. This is intended for OS vendors which have a subscription process to access content. + diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 46724b85..9c99dc4f 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -2458,6 +2458,8 @@ ostree_repo_pull_with_options (OstreeRepo *self, } else { + g_autofree char *unconfigured_state = NULL; + pull_data->remote_name = g_strdup (remote_name_or_baseurl); /* Fetch GPG verification settings from remote if it wasn't already @@ -2471,6 +2473,22 @@ ostree_repo_pull_with_options (OstreeRepo *self, if (!ostree_repo_remote_get_gpg_verify_summary (self, pull_data->remote_name, &pull_data->gpg_verify_summary, error)) goto out; + + /* NOTE: If changing this, see the matching implementation in + * ostree-sysroot-upgrader.c + */ + if (!ostree_repo_get_remote_option (self, pull_data->remote_name, + "unconfigured-state", NULL, + &unconfigured_state, + error)) + goto out; + + if (unconfigured_state) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "remote unconfigured-state: %s", unconfigured_state); + goto out; + } } pull_data->phase = OSTREE_PULL_PHASE_FETCHING_REFS; diff --git a/src/libostree/ostree-sysroot-upgrader.c b/src/libostree/ostree-sysroot-upgrader.c index 447bd82b..daf2445c 100644 --- a/src/libostree/ostree-sysroot-upgrader.c +++ b/src/libostree/ostree-sysroot-upgrader.c @@ -77,7 +77,9 @@ parse_refspec (OstreeSysrootUpgrader *self, if ((self->flags & OSTREE_SYSROOT_UPGRADER_FLAGS_IGNORE_UNCONFIGURED) == 0) { - /* If explicit action by the OS creator is requried to upgrade, print their text as an error */ + /* If explicit action by the OS creator is requried to upgrade, print their text as an error. + * NOTE: If changing this, see the matching implementation in ostree-repo-pull.c. + */ unconfigured_state = g_key_file_get_string (self->origin, "origin", "unconfigured-state", NULL); if (unconfigured_state) { diff --git a/tests/pull-test.sh b/tests/pull-test.sh index 408d0539..56258b6c 100755 --- a/tests/pull-test.sh +++ b/tests/pull-test.sh @@ -35,7 +35,7 @@ function verify_initial_contents() { assert_file_has_content baz/cow '^moo$' } -echo "1..13" +echo "1..14" # Try both syntaxes repo_init @@ -249,3 +249,12 @@ assert_file_has_content baz/cow "further modified file for static deltas" assert_not_has_file baz/saucer echo "ok static delta 2" + +cd ${test_tmpdir} +${CMD_PREFIX} ostree --repo=repo remote add --set=gpg-verify=false --set=unconfigured-state="Access to ExampleOS requires ONE BILLION DOLLARS." origin-subscription file://$(pwd)/ostree-srv/gnomerepo +if ${CMD_PREFIX} ostree --repo=repo pull origin-subscription main 2>err.txt; then + assert_not_reached "pull unexpectedly succeeded?" +fi +assert_file_has_content err.txt "ONE BILLION DOLLARS" + +echo "ok unconfigured"