blob: 251d02e64b42ec6752f550f0022b28e590278bed [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COBALT_SRC_LOGGER_OBSERVATION_WRITER_H_
#define COBALT_SRC_LOGGER_OBSERVATION_WRITER_H_
#include <memory>
#include "src/lib/crypto_util/random.h"
#include "src/lib/util/encrypted_message_util.h"
#include "src/logger/status.h"
#include "src/observation_store/observation_store.h"
#include "src/observation_store/observation_store_update_recipient.h"
#include "src/pb/observation.pb.h"
namespace cobalt {
namespace logger {
// The ObservationWriter encrypts Observations and writes them to the
// ObservationStore.
//
// A system has a single instance of ObservationWriter, which is used by the
// EventAggregator and multiple Loggers.
class ObservationWriter {
public:
// Constructor:
//
// |observation_store| A writer interface to the system's singleton instance of Observation Store.
// This must remain valid as long as the ObservationWriter is being used.
//
// |update_recipient| The ObservationWriter uses this to notify the update recipient when an
// Observation has been added to the Observation Store. This must remain valid as long as the
// ObservationWriter is being used.
//
// |observation_encrypter| This is used to encrypt Observations to the public key of Cobalt's
// Analyzer prior to writing them into the Observation Store. If this value is equal to nullptr,
// then Observations will not be encrypted before being added to the Observation Store. Otherwise,
// this must remain valid as long as the ObservationWriter is being used.
ObservationWriter(observation_store::ObservationStoreWriterInterface* observation_store,
observation_store::ObservationStoreUpdateRecipient* update_recipient,
util::EncryptedMessageMaker* observation_encrypter = nullptr)
: observation_store_(observation_store),
update_recipient_(update_recipient),
observation_encrypter_(observation_encrypter) {}
// Given an Observation |observation| and an ObservationMetadata |metadata|, adds a random ID to
// |observation| for server-side deduplication, writes an encryption of the Observation together
// with the unencrypted metadata to the Observation Store, and notifies the UpdateRecipient that
// an Observation has been added to the store. If |is_contribution| is true, a random contribution
// ID is added to the encrypted observation.
[[nodiscard]] Status WriteObservation(const std::unique_ptr<Observation>& observation,
std::unique_ptr<ObservationMetadata> metadata,
bool is_contribution) const;
private:
// Generates a random ID and populates the |random_id| field of |observation|. Currently we use an
// 8-byte ID but the ID size may change in the future. The ID is (approximately) distinct for each
// observation and is used to deduplicate observations on the server.
void AddRandomId(Observation* observation) const;
observation_store::ObservationStoreWriterInterface* observation_store_;
observation_store::ObservationStoreUpdateRecipient* update_recipient_;
util::EncryptedMessageMaker* observation_encrypter_;
mutable crypto::Random random_;
};
} // namespace logger
} // namespace cobalt
#endif // COBALT_SRC_LOGGER_OBSERVATION_WRITER_H_