#ifndef REMOTING_PROTOCOL_PAIRING_REGISTRY_H_
#define REMOTING_PROTOCOL_PAIRING_REGISTRY_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/containers/queue.h"
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "base/values.h"
namespace base {
class Location;
class SingleThreadTaskRunner;
}
namespace remoting::protocol {
class PairingRegistry : public base::RefCountedThreadSafe<PairingRegistry> {
public:
struct Pairing {
Pairing();
Pairing(const base::Time& created_time,
const std::string& client_name,
const std::string& client_id,
const std::string& shared_secret);
Pairing(const Pairing& other);
~Pairing();
static Pairing Create(const std::string& client_name);
static Pairing CreateFromValue(const base::Value::Dict& pairing);
base::Value::Dict ToValue() const;
bool operator==(const Pairing& other) const;
bool is_valid() const;
base::Time created_time() const { return created_time_; }
std::string client_id() const { return client_id_; }
std::string client_name() const { return client_name_; }
std::string shared_secret() const { return shared_secret_; }
private:
base::Time created_time_;
std::string client_name_;
std::string client_id_;
std::string shared_secret_;
};
typedef std::map<std::string, Pairing> PairedClients;
typedef base::OnceCallback<void(bool success)> DoneCallback;
typedef base::OnceCallback<void(base::Value::List pairings)>
GetAllPairingsCallback;
typedef base::OnceCallback<void(Pairing pairing)> GetPairingCallback;
static const char kCreatedTimeKey[];
static const char kClientIdKey[];
static const char kClientNameKey[];
static const char kSharedSecretKey[];
class Delegate {
public:
virtual ~Delegate() {}
virtual base::Value::List LoadAll() = 0;
virtual bool DeleteAll() = 0;
virtual Pairing Load(const std::string& client_id) = 0;
virtual bool Save(const Pairing& pairing) = 0;
virtual bool Delete(const std::string& client_id) = 0;
};
PairingRegistry(
scoped_refptr<base::SingleThreadTaskRunner> delegate_task_runner,
std::unique_ptr<Delegate> delegate);
PairingRegistry(const PairingRegistry&) = delete;
PairingRegistry& operator=(const PairingRegistry&) = delete;
Pairing CreatePairing(const std::string& client_name);
void GetPairing(const std::string& client_id, GetPairingCallback callback);
void GetAllPairings(GetAllPairingsCallback callback);
void DeletePairing(const std::string& client_id, DoneCallback callback);
void ClearAllPairings(DoneCallback callback);
protected:
friend class base::RefCountedThreadSafe<PairingRegistry>;
virtual ~PairingRegistry();
virtual void PostTask(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const base::Location& from_here,
base::OnceClosure task);
private:
FRIEND_TEST_ALL_PREFIXES(PairingRegistryTest, AddPairing);
friend class NegotiatingAuthenticatorTest;
void AddPairing(const Pairing& pairing);
void DoLoadAll(GetAllPairingsCallback callback);
void DoDeleteAll(DoneCallback callback);
void DoLoad(const std::string& client_id, GetPairingCallback callback);
void DoSave(const Pairing& pairing, DoneCallback callback);
void DoDelete(const std::string& client_id, DoneCallback callback);
void InvokeDoneCallbackAndScheduleNext(DoneCallback callback, bool success);
void InvokeGetPairingCallbackAndScheduleNext(GetPairingCallback callback,
Pairing pairing);
void InvokeGetAllPairingsCallbackAndScheduleNext(
GetAllPairingsCallback callback,
base::Value::List pairings);
void SanitizePairings(GetAllPairingsCallback callback,
base::Value::List pairings);
void ServiceOrQueueRequest(base::OnceClosure request);
void ServiceNextRequest();
scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> delegate_task_runner_;
std::unique_ptr<Delegate> delegate_;
base::queue<base::OnceClosure> pending_requests_;
};
}
#endif