blob: 8cbaeea1ac34323a7e2a717092e98ecb526adfda [file] [log] [blame]
// Copyright 2015 The Chromium OS 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 SETTINGSD_LOCKED_SETTINGS_H_
#define SETTINGSD_LOCKED_SETTINGS_H_
#include <memory>
#include <string>
#include <vector>
#include <base/macros.h>
#include "settingsd/blob_ref.h"
namespace settingsd {
class SettingsDocument;
// LockedVersionComponent wraps signatures and meta data used in validating
// version stamps that are included within a LockedSettingsContainer. This
// enables the validation logic implemented in SourceDelegate subclasses to
// perform validation without having to know details about the binary encoding
// of the wrapped version component.
class LockedVersionComponent {
public:
virtual ~LockedVersionComponent() = default;
// Returns the source identifier this version component belongs to.
virtual std::string GetSourceId() const = 0;
private:
DISALLOW_ASSIGN(LockedVersionComponent);
};
// LockedSettingsContainer holds context used while decoding and validating the
// enclosed SettingsDocument. This interface provides access to signatures and
// meta data present in the protected container regardless of binary encoding of
// the container. Note that the actual validation logic is not part of this
// class. It is specific to the source that has produced the SettingsDocument
// enclosed within a LockedSettingsContainer and the validation logic is
// implemented in a suitable SourceDelegate subclass. For example, the source
// delegate might check whether there's a valid signature on the container,
// using a signing key configured for the source for signature verification.
class LockedSettingsContainer {
public:
virtual ~LockedSettingsContainer() = default;
// Gets the protected data payload. If unavailable, returns an empty blob.
virtual BlobRef GetData() const;
// Get the protected vector clock components (along with applicable
// signatures, meta data etc.) for validation against the source-specific
// logic implemented in the corresponding SourceDelegate.
//
// Returns an empty vector in case the blob doesn't contain any locked version
// components. Note that this implies the SettingsDocument returned by
// DecodePayload will not have a version stamp that establishes causal
// relation with other documents, so it'll only pass validation if the
// settings keys it touches are not present in the system yet.
virtual std::vector<const LockedVersionComponent*> GetVersionComponents()
const;
// Extract the enclosed SettingsDocument payload from the passed container.
static std::unique_ptr<SettingsDocument> DecodePayload(
std::unique_ptr<LockedSettingsContainer> container);
private:
// Decodes the payload, i.e. extracts the enclosed SettingsDocument. It is
// guaranteed that this function only gets called exactly once and the |this|
// object will get destroyed immediately afterwards.
virtual std::unique_ptr<SettingsDocument> DecodePayloadInternal() = 0;
DISALLOW_ASSIGN(LockedSettingsContainer);
};
} // namespace settingsd
#endif // SETTINGSD_LOCKED_SETTINGS_H_