1 #include "directorrepository.h"
5 void DirectorRepository::resetMeta() {
8 latest_targets = Targets();
11 bool DirectorRepository::targetsExpired()
const {
return latest_targets.isExpired(TimeStamp::Now()); }
13 bool DirectorRepository::usePreviousTargets()
const {
16 return !targets.targets.empty() && latest_targets.targets.empty();
19 bool DirectorRepository::verifyTargets(
const std::string& targets_raw) {
22 latest_targets = Targets(RepositoryType::Director(), Role::Targets(), Utils::parseJSON(targets_raw),
23 std::make_shared<MetaWithKeys>(root));
24 if (!usePreviousTargets()) {
25 targets = latest_targets;
28 LOG_ERROR <<
"Signature verification for director targets metadata failed";
35 bool DirectorRepository::checkMetaOffline(
INvStorage& storage) {
39 std::string director_root;
40 if (!storage.loadLatestRoot(&director_root, RepositoryType::Director())) {
44 if (!initRoot(director_root)) {
55 std::string director_targets;
57 if (!storage.loadNonRoot(&director_targets, RepositoryType::Director(), Role::Targets())) {
61 if (!verifyTargets(director_targets)) {
65 if (targetsExpired()) {
73 bool DirectorRepository::updateMeta(
INvStorage& storage,
const IMetadataFetcher& fetcher) {
80 if (!updateRoot(storage, fetcher, RepositoryType::Director())) {
90 std::string director_targets;
92 if (!fetcher.fetchLatestRole(&director_targets, kMaxDirectorTargetsSize, RepositoryType::Director(),
96 int remote_version = extractVersionUntrusted(director_targets);
99 std::string director_targets_stored;
100 if (storage.loadNonRoot(&director_targets_stored, RepositoryType::Director(), Role::Targets())) {
101 local_version = extractVersionUntrusted(director_targets_stored);
102 if (!verifyTargets(director_targets_stored)) {
103 LOG_WARNING <<
"Unable to verify stored director targets metadata.";
119 if (!verifyTargets(director_targets)) {
123 if (local_version > remote_version) {
125 }
else if (local_version < remote_version && !usePreviousTargets()) {
126 storage.storeNonRoot(director_targets, RepositoryType::Director(), Role::Targets());
129 if (targetsExpired()) {
137 void DirectorRepository::dropTargets(
INvStorage& storage) {
138 storage.clearNonRootMeta(RepositoryType::Director());
142 bool DirectorRepository::matchTargetsWithImageTargets(
const Uptane::Targets& image_targets)
const {
146 const auto& image_target_array = image_targets.targets;
147 const auto& director_target_array = targets.targets;
149 for (
const auto& director_target : director_target_array) {
150 auto found_it = std::find_if(
151 image_target_array.begin(), image_target_array.end(),
152 [&director_target](
const Target& image_target) {
return director_target.MatchTarget(image_target); });
154 if (found_it == image_target_array.end()) {