Aktualizr
C++ SOTA Client
invstorage.h
1 #ifndef INVSTORAGE_H_
2 #define INVSTORAGE_H_
3 
4 #include <memory>
5 #include <string>
6 #include <utility>
7 #include <vector>
8 
9 #include <boost/filesystem.hpp>
10 #include <boost/optional.hpp>
11 
12 #include "libaktualizr/config.h"
13 #include "storage_exception.h"
14 #include "uptane/tuf.h"
15 
16 class INvStorage;
17 class FSStorageRead;
18 class SQLStorage;
19 
20 using store_data_t = void (INvStorage::*)(const std::string&);
21 using load_data_t = bool (INvStorage::*)(std::string*) const;
22 
23 typedef std::vector<std::pair<Uptane::EcuSerial, Uptane::HardwareIdentifier>> EcuSerials;
24 
25 // kUnused was previously kNotRegistered, but re-registration is now possible so
26 // that is no longer a misconfiguration.
27 enum class EcuState { kOld = 0, kUnused };
28 
30  MisconfiguredEcu(Uptane::EcuSerial serial_in, Uptane::HardwareIdentifier hardware_id_in, EcuState state_in)
31  : serial(std::move(serial_in)), hardware_id(std::move(hardware_id_in)), state(state_in) {}
32  Uptane::EcuSerial serial;
33  Uptane::HardwareIdentifier hardware_id;
34  EcuState state;
35 };
36 
37 enum class InstalledVersionUpdateMode { kNone, kCurrent, kPending };
38 
39 // Functions loading/storing multiple pieces of data are supposed to do so
40 // atomically as far as implementation makes it possible.
41 //
42 // store* functions normally write the complete content. save* functions just add an entry.
43 class INvStorage {
44  public:
45  explicit INvStorage(StorageConfig config) : config_(std::move(config)) {}
46  virtual ~INvStorage() = default;
47  virtual StorageType type() = 0;
48  virtual void storePrimaryKeys(const std::string& public_key, const std::string& private_key) = 0;
49  virtual bool loadPrimaryKeys(std::string* public_key, std::string* private_key) const = 0;
50  virtual bool loadPrimaryPublic(std::string* public_key) const = 0;
51  virtual bool loadPrimaryPrivate(std::string* private_key) const = 0;
52  virtual void clearPrimaryKeys() = 0;
53 
54  virtual void saveSecondaryInfo(const Uptane::EcuSerial& ecu_serial, const std::string& sec_type,
55  const PublicKey& public_key) = 0;
56  virtual void saveSecondaryData(const Uptane::EcuSerial& ecu_serial, const std::string& data) = 0;
57  virtual bool loadSecondaryInfo(const Uptane::EcuSerial& ecu_serial, SecondaryInfo* secondary) const = 0;
58  virtual bool loadSecondariesInfo(std::vector<SecondaryInfo>* secondaries) const = 0;
59 
60  virtual void storeTlsCreds(const std::string& ca, const std::string& cert, const std::string& pkey) = 0;
61  virtual void storeTlsCa(const std::string& ca) = 0;
62  virtual void storeTlsCert(const std::string& cert) = 0;
63  virtual void storeTlsPkey(const std::string& pkey) = 0;
64  virtual bool loadTlsCreds(std::string* ca, std::string* cert, std::string* pkey) const = 0;
65  virtual bool loadTlsCa(std::string* ca) const = 0;
66  virtual bool loadTlsCert(std::string* cert) const = 0;
67  virtual bool loadTlsPkey(std::string* cert) const = 0;
68  virtual void clearTlsCreds() = 0;
69 
70  virtual void storeRoot(const std::string& data, Uptane::RepositoryType repo, Uptane::Version version) = 0;
71  virtual bool loadRoot(std::string* data, Uptane::RepositoryType repo, Uptane::Version version) const = 0;
72  bool loadLatestRoot(std::string* data, Uptane::RepositoryType repo) const {
73  return loadRoot(data, repo, Uptane::Version());
74  };
75  virtual void storeNonRoot(const std::string& data, Uptane::RepositoryType repo, Uptane::Role role) = 0;
76  virtual bool loadNonRoot(std::string* data, Uptane::RepositoryType repo, Uptane::Role role) const = 0;
77  virtual void clearNonRootMeta(Uptane::RepositoryType repo) = 0;
78  virtual void clearMetadata() = 0;
79  virtual void storeDelegation(const std::string& data, Uptane::Role role) = 0;
80  virtual bool loadDelegation(std::string* data, Uptane::Role role) const = 0;
81  virtual bool loadAllDelegations(std::vector<std::pair<Uptane::Role, std::string>>& data) const = 0;
82  virtual void deleteDelegation(Uptane::Role role) = 0;
83  virtual void clearDelegations() = 0;
84 
85  virtual void storeDeviceId(const std::string& device_id) = 0;
86  virtual bool loadDeviceId(std::string* device_id) const = 0;
87  virtual void clearDeviceId() = 0;
88 
89  virtual void storeEcuSerials(const EcuSerials& serials) = 0;
90  virtual bool loadEcuSerials(EcuSerials* serials) const = 0;
91  virtual void clearEcuSerials() = 0;
92 
93  virtual void storeCachedEcuManifest(const Uptane::EcuSerial& ecu_serial, const std::string& manifest) = 0;
94  virtual bool loadCachedEcuManifest(const Uptane::EcuSerial& ecu_serial, std::string* manifest) const = 0;
95 
96  virtual void saveMisconfiguredEcu(const MisconfiguredEcu& ecu) = 0;
97  virtual bool loadMisconfiguredEcus(std::vector<MisconfiguredEcu>* ecus) const = 0;
98  virtual void clearMisconfiguredEcus() = 0;
99 
100  virtual void storeEcuRegistered() = 0; // should be called after storeDeviceId
101  virtual bool loadEcuRegistered() const = 0;
102  virtual void clearEcuRegistered() = 0;
103 
104  virtual void storeNeedReboot() = 0;
105  virtual bool loadNeedReboot(bool* need_reboot) const = 0;
106  virtual void clearNeedReboot() = 0;
107 
108  virtual void saveInstalledVersion(const std::string& ecu_serial, const Uptane::Target& target,
109  InstalledVersionUpdateMode update_mode) = 0;
110  virtual bool loadInstalledVersions(const std::string& ecu_serial, boost::optional<Uptane::Target>* current_version,
111  boost::optional<Uptane::Target>* pending_version) const = 0;
112  virtual bool loadInstallationLog(const std::string& ecu_serial, std::vector<Uptane::Target>* log,
113  bool only_installed) const = 0;
114  virtual bool hasPendingInstall() = 0;
115  virtual void getPendingEcus(std::vector<std::pair<Uptane::EcuSerial, Hash>>* pendingEcus) = 0;
116  virtual void clearInstalledVersions() = 0;
117 
118  virtual void saveEcuInstallationResult(const Uptane::EcuSerial& ecu_serial,
119  const data::InstallationResult& result) = 0;
120  virtual bool loadEcuInstallationResults(
121  std::vector<std::pair<Uptane::EcuSerial, data::InstallationResult>>* results) const = 0;
122  virtual void storeDeviceInstallationResult(const data::InstallationResult& result, const std::string& raw_report,
123  const std::string& correlation_id) = 0;
124  virtual bool storeDeviceInstallationRawReport(const std::string& raw_report) = 0;
125  virtual bool loadDeviceInstallationResult(data::InstallationResult* result, std::string* raw_report,
126  std::string* correlation_id) const = 0;
127  virtual void clearInstallationResults() = 0;
128 
129  virtual void saveEcuReportCounter(const Uptane::EcuSerial& ecu_serial, int64_t counter) = 0;
130  virtual bool loadEcuReportCounter(std::vector<std::pair<Uptane::EcuSerial, int64_t>>* results) const = 0;
131 
132  virtual void saveReportEvent(const Json::Value& json_value) = 0;
133  virtual bool loadReportEvents(Json::Value* report_array, int64_t* id_max) const = 0;
134  virtual void deleteReportEvents(int64_t id_max) = 0;
135 
136  virtual void storeDeviceDataHash(const std::string& data_type, const std::string& hash) = 0;
137  virtual bool loadDeviceDataHash(const std::string& data_type, std::string* hash) const = 0;
138  virtual void clearDeviceData() = 0;
139 
140  // Downloaded files info API
141  virtual void storeTargetFilename(const std::string& targetname, const std::string& filename) const = 0;
142  virtual std::string getTargetFilename(const std::string& targetname) const = 0;
143  virtual std::vector<std::string> getAllTargetNames() const = 0;
144  virtual void deleteTargetInfo(const std::string& targetname) const = 0;
145 
146  virtual void cleanUp() = 0;
147 
148  // Special constructors and utilities
149  static std::shared_ptr<INvStorage> newStorage(const StorageConfig& config, bool readonly = false);
150  static void FSSToSQLS(FSStorageRead& fs_storage, SQLStorage& sql_storage);
151  static bool fsReadInstalledVersions(const boost::filesystem::path& filename,
152  std::vector<Uptane::Target>* installed_versions, size_t* current_version);
153 
154  // Not purely virtual
155  void importData(const ImportConfig& import_config);
156  bool loadPrimaryInstalledVersions(boost::optional<Uptane::Target>* current_version,
157  boost::optional<Uptane::Target>* pending_version) const {
158  return loadInstalledVersions("", current_version, pending_version);
159  }
160  void savePrimaryInstalledVersion(const Uptane::Target& target, InstalledVersionUpdateMode update_mode) {
161  return saveInstalledVersion("", target, update_mode);
162  }
163  bool loadPrimaryInstallationLog(std::vector<Uptane::Target>* log, bool only_installed) const {
164  return loadInstallationLog("", log, only_installed);
165  }
166  void importInstalledVersions(const boost::filesystem::path& base_path);
167 
168  private:
169  void importSimple(const boost::filesystem::path& base_path, store_data_t store_func, load_data_t load_func,
170  const utils::BasedPath& imported_data_path, const std::string& data_name);
171  void importUpdateSimple(const boost::filesystem::path& base_path, store_data_t store_func, load_data_t load_func,
172  const utils::BasedPath& imported_data_path, const std::string& data_name);
173  void importUpdateCertificate(const boost::filesystem::path& base_path, const utils::BasedPath& imported_data_path);
174  void importPrimaryKeys(const boost::filesystem::path& base_path, const utils::BasedPath& import_pubkey_path,
175  const utils::BasedPath& import_privkey_path);
176 
177  protected:
178  const StorageConfig config_;
179 };
180 
181 #endif // INVSTORAGE_H_
data::InstallationResult
Definition: types.h:277
Uptane::Version
Metadata version numbers.
Definition: tuf.h:120
StorageConfig
Definition: config.h:111
MisconfiguredEcu
Definition: invstorage.h:29
data
General data structures.
Definition: types.h:217
Uptane::HardwareIdentifier
Definition: types.h:315
utils::BasedPath
The BasedPath class Can represent an absolute or relative path, only readable through the BasePath::g...
Definition: types.h:31
Uptane::RepositoryType
Definition: tuf.h:21
Uptane::EcuSerial
Definition: types.h:346
SecondaryInfo
Definition: types.h:462
PublicKey
Definition: types.h:119
result
Results of libaktualizr API calls.
Definition: results.h:12
Uptane::Role
TUF Roles.
Definition: tuf.h:61
Uptane::Target
Definition: types.h:379
SQLStorage
Definition: sqlstorage.h:18
FSStorageRead
Definition: fsstorage_read.h:7
INvStorage
Definition: invstorage.h:43
ImportConfig
Definition: config.h:130