Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
aktualizr_secondary_metadata.cc
1 #include "aktualizr_secondary_metadata.h"
2 
3 Metadata::Metadata(const Uptane::RawMetaPack& meta_pack)
4  : _director_metadata{{Uptane::Role::ROOT, meta_pack.director_root},
5  {Uptane::Role::TARGETS, meta_pack.director_targets}},
6  _image_metadata{
7  {Uptane::Role::ROOT, meta_pack.image_root},
8  {Uptane::Role::TIMESTAMP, meta_pack.image_timestamp},
9  {Uptane::Role::SNAPSHOT, meta_pack.image_snapshot},
10  {Uptane::Role::TARGETS, meta_pack.image_targets},
11  } {
12  director_root_version = Uptane::Version(Uptane::extractVersionUntrusted(meta_pack.director_root));
13  image_root_version = Uptane::Version(Uptane::extractVersionUntrusted(meta_pack.image_root));
14 }
15 
16 bool Metadata::fetchRole(std::string* result, int64_t maxsize, Uptane::RepositoryType repo, const Uptane::Role& role,
17  Uptane::Version version) const {
18  (void)maxsize;
19 
20  return getRoleMetadata(result, repo, role, version);
21 }
22 
23 bool Metadata::fetchLatestRole(std::string* result, int64_t maxsize, Uptane::RepositoryType repo,
24  const Uptane::Role& role) const {
25  (void)maxsize;
26  return getRoleMetadata(result, repo, role, Uptane::Version());
27 }
28 
29 bool Metadata::getRoleMetadata(std::string* result, const Uptane::RepositoryType& repo, const Uptane::Role& role,
30  Uptane::Version version) const {
31  const std::unordered_map<std::string, std::string>* metadata_map = nullptr;
32 
33  if (repo == Uptane::RepositoryType::Director()) {
34  metadata_map = &_director_metadata;
35  } else if (repo == Uptane::RepositoryType::Image()) {
36  metadata_map = &_image_metadata;
37  }
38 
39  if (metadata_map == nullptr) {
40  LOG_ERROR << "There are no any metadata for the given type of repository: " << repo.toString();
41  return false;
42  }
43 
44  auto found_meta_it = metadata_map->find(role.ToString());
45  if (found_meta_it == metadata_map->end()) {
46  LOG_ERROR << "There are no any metadata for the given type of role: " << repo.toString() << ": " << role.ToString();
47  return false;
48  }
49 
50  if (role == Uptane::Role::Root() && version != Uptane::Version()) {
51  // If requesting a Root version beyond what we have available, fail as
52  // expected. If requesting a version before what is available, just use what
53  // is available, since root rotation isn't supported here.
54  if (repo == Uptane::RepositoryType::Director() && director_root_version < version) {
55  LOG_DEBUG << "Requested Director root version " << version << " but only version " << director_root_version
56  << " is available.";
57  return false;
58  } else if (repo == Uptane::RepositoryType::Image() && image_root_version < version) {
59  LOG_DEBUG << "Requested Image repo root version " << version << " but only version " << image_root_version
60  << " is available.";
61  return false;
62  }
63  }
64 
65  *result = found_meta_it->second;
66  return true;
67 }
Uptane::Version
Metadata version numbers.
Definition: tuf.h:116
Uptane::RawMetaPack
Definition: tuf.h:535
Uptane::RepositoryType
Definition: tuf.h:20
result
Results of libaktualizr API calls.
Definition: results.h:13
Uptane::Role
TUF Roles.
Definition: tuf.h:57