// Copyright (c) 2012 The Chromium 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 REMOTING_PROTOCOL_IT2ME_HOST_AUTHENTICATOR_FACTORY_H_
#define REMOTING_PROTOCOL_IT2ME_HOST_AUTHENTICATOR_FACTORY_H_

#include <memory>
#include <string>

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "remoting/protocol/authenticator.h"
#include "remoting/protocol/validating_authenticator.h"

namespace remoting {

class RsaKeyPair;

namespace protocol {

// It2MeHostAuthenticatorFactory implements AuthenticatorFactory and
// understands both the V2 and legacy V1 authentication mechanisms.
class It2MeHostAuthenticatorFactory : public AuthenticatorFactory {
 public:
  It2MeHostAuthenticatorFactory(
      const std::string& local_cert,
      scoped_refptr<RsaKeyPair> key_pair,
      const std::string& access_code,
      const ValidatingAuthenticator::ValidationCallback& callback);
  ~It2MeHostAuthenticatorFactory() override;

  // AuthenticatorFactory interface.
  std::unique_ptr<Authenticator> CreateAuthenticator(
      const std::string& local_jid,
      const std::string& remote_jid) override;

 private:
  std::string local_cert_;
  scoped_refptr<RsaKeyPair> key_pair_;
  std::string access_code_hash_;
  ValidatingAuthenticator::ValidationCallback validation_callback_;

  DISALLOW_COPY_AND_ASSIGN(It2MeHostAuthenticatorFactory);
};

}  // namespace protocol
}  // namespace remoting

#endif  // REMOTING_PROTOCOL_IT2ME_HOST_AUTHENTICATOR_FACTORY_H_
