1 #include "directorrepository.h"
5 void DirectorRepository::resetMeta() {
8 latest_targets = Targets();
11 bool DirectorRepository::targetsExpired() {
12 if (latest_targets.isExpired(TimeStamp::Now())) {
19 bool DirectorRepository::targetsSanityCheck() {
22 if (!latest_targets.delegated_role_names_.empty()) {
29 std::set<Uptane::EcuSerial> ecu_ids;
30 for (
const auto& target : targets.targets) {
31 for (
const auto& ecu : target.ecus()) {
32 if (ecu_ids.find(ecu.first) == ecu_ids.end()) {
33 ecu_ids.insert(ecu.first);
35 last_exception =
Uptane::InvalidMetadata(type.toString(), Role::Targets().ToString(),
"Found repeated ECU ID.");
43 bool DirectorRepository::usePreviousTargets()
const {
46 return !targets.targets.empty() && latest_targets.targets.empty();
49 bool DirectorRepository::verifyTargets(
const std::string& targets_raw) {
52 latest_targets = Targets(RepositoryType::Director(), Role::Targets(), Utils::parseJSON(targets_raw),
53 std::make_shared<MetaWithKeys>(root));
54 if (!usePreviousTargets()) {
55 targets = latest_targets;
58 LOG_ERROR <<
"Signature verification for Director Targets metadata failed";
65 bool DirectorRepository::checkMetaOffline(
INvStorage& storage) {
69 std::string director_root;
70 if (!storage.loadLatestRoot(&director_root, RepositoryType::Director())) {
74 if (!initRoot(director_root)) {
85 std::string director_targets;
87 if (!storage.loadNonRoot(&director_targets, RepositoryType::Director(), Role::Targets())) {
91 if (!verifyTargets(director_targets)) {
95 if (targetsExpired()) {
99 if (!targetsSanityCheck()) {
107 bool DirectorRepository::updateMeta(
INvStorage& storage,
const IMetadataFetcher& fetcher) {
114 if (!updateRoot(storage, fetcher, RepositoryType::Director())) {
124 std::string director_targets;
126 if (!fetcher.fetchLatestRole(&director_targets, kMaxDirectorTargetsSize, RepositoryType::Director(),
130 int remote_version = extractVersionUntrusted(director_targets);
133 std::string director_targets_stored;
134 if (storage.loadNonRoot(&director_targets_stored, RepositoryType::Director(), Role::Targets())) {
135 local_version = extractVersionUntrusted(director_targets_stored);
136 if (!verifyTargets(director_targets_stored)) {
137 LOG_WARNING <<
"Unable to verify stored Director Targets metadata.";
143 if (!verifyTargets(director_targets)) {
147 if (local_version > remote_version) {
149 }
else if (local_version < remote_version && !usePreviousTargets()) {
150 storage.storeNonRoot(director_targets, RepositoryType::Director(), Role::Targets());
153 if (targetsExpired()) {
157 if (!targetsSanityCheck()) {
165 void DirectorRepository::dropTargets(
INvStorage& storage) {
166 storage.clearNonRootMeta(RepositoryType::Director());
170 bool DirectorRepository::matchTargetsWithImageTargets(
const Uptane::Targets& image_targets)
const {
174 const auto& image_target_array = image_targets.targets;
175 const auto& director_target_array = targets.targets;
177 for (
const auto& director_target : director_target_array) {
178 auto found_it = std::find_if(
179 image_target_array.begin(), image_target_array.end(),
180 [&director_target](
const Target& image_target) {
return director_target.MatchTarget(image_target); });
182 if (found_it == image_target_array.end()) {