// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_CDM_PREF_SERVICE_HELPER_H_
#define CHROME_BROWSER_MEDIA_CDM_PREF_SERVICE_HELPER_H_
#include <map>
#include <optional>
#include <vector>
#include "base/functional/callback.h"
#include "base/time/time.h"
#include "base/unguessable_token.h"
#include "url/gurl.h"
#include "url/origin.h"
class PrefService;
class PrefRegistrySimple;
class CdmPrefData {
public:
CdmPrefData(const base::UnguessableToken& origin_id,
base::Time origin_id_time);
CdmPrefData(const base::UnguessableToken& origin_id,
base::Time origin_id_time,
std::vector<base::Time> hw_secure_decryption_disable_times);
~CdmPrefData();
const base::UnguessableToken& origin_id() const;
base::Time origin_id_creation_time() const;
const std::optional<std::vector<uint8_t>> client_token() const;
base::Time client_token_creation_time() const;
std::vector<base::Time> hw_secure_decryption_disable_times() const;
void SetClientToken(const std::vector<uint8_t>& client_token,
const base::Time creation_time);
private:
base::UnguessableToken origin_id_;
base::Time origin_id_creation_time_;
std::vector<base::Time> hw_secure_decryption_disable_times_;
std::optional<std::vector<uint8_t>> client_token_;
base::Time client_token_creation_time_;
};
// Manages reads and writes to the user prefs service related to CDM usage.
// Updates to the CDM Origin ID dictionary will be infrequent (ie. every time
// the Media Foundation CDM is used for a new origin). Origin ID are only stored
// for origins serving hardware security protected contents and as such the size
// of the CDM Origin ID dictionary should only contain a handful of items.
class CdmPrefServiceHelper {
public:
CdmPrefServiceHelper();
CdmPrefServiceHelper(const CdmPrefServiceHelper&) = delete;
CdmPrefServiceHelper& operator=(const CdmPrefServiceHelper&) = delete;
~CdmPrefServiceHelper();
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
static void ClearCdmPreferenceData(
PrefService* user_prefs,
base::Time start,
base::Time end,
const base::RepeatingCallback<bool(const GURL&)>& filter);
// Gets the CDM preference data associated with the current origin. If no
// preference data exist for the current origin, an entry is created with a
// new origin id and an empty client token. Returns nullptr if the preference
// could not be retrieved.
static std::unique_ptr<CdmPrefData> GetCdmPrefData(
PrefService* user_prefs,
const url::Origin& cdm_origin);
// Sets the client token for the origin associated with the CDM. The token is
// set by the CDM. If no entry exist for the current origin, the client token
// will not be saved.
static void SetCdmClientToken(PrefService* user_prefs,
const url::Origin& cdm_origin,
const std::vector<uint8_t>& client_token);
// Return a mapping of Origin ID to url::Origin. The string representation
// for the origin id is used in the mapping so that it can be more easily used
// to map a directory name to its origin.
static std::map<std::string, url::Origin> GetOriginIdMapping(
PrefService* user_prefs);
};
#endif // CHROME_BROWSER_MEDIA_CDM_PREF_SERVICE_HELPER_H_