1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROMEOS_LOGIN_AUTH_EXTENDED_AUTHENTICATOR_IMPL_H_
6#define CHROMEOS_LOGIN_AUTH_EXTENDED_AUTHENTICATOR_IMPL_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/callback.h"
12#include "base/compiler_specific.h"
13#include "base/memory/scoped_ptr.h"
14#include "chromeos/chromeos_export.h"
15#include "chromeos/login/auth/extended_authenticator.h"
16#include "third_party/cros_system_api/dbus/service_constants.h"
17
18namespace chromeos {
19
20class AuthStatusConsumer;
21class UserContext;
22
23// Implements ExtendedAuthenticator.
24class CHROMEOS_EXPORT ExtendedAuthenticatorImpl : public ExtendedAuthenticator {
25 public:
26  explicit ExtendedAuthenticatorImpl(NewAuthStatusConsumer* consumer);
27  explicit ExtendedAuthenticatorImpl(AuthStatusConsumer* consumer);
28
29  // ExtendedAuthenticator:
30  virtual void SetConsumer(AuthStatusConsumer* consumer) override;
31  virtual void AuthenticateToMount(
32      const UserContext& context,
33      const ResultCallback& success_callback) override;
34  virtual void AuthenticateToCheck(
35      const UserContext& context,
36      const base::Closure& success_callback) override;
37  virtual void CreateMount(const std::string& user_id,
38                           const std::vector<cryptohome::KeyDefinition>& keys,
39                           const ResultCallback& success_callback) override;
40  virtual void AddKey(const UserContext& context,
41                      const cryptohome::KeyDefinition& key,
42                      bool replace_existing,
43                      const base::Closure& success_callback) override;
44  virtual void UpdateKeyAuthorized(
45      const UserContext& context,
46      const cryptohome::KeyDefinition& key,
47      const std::string& signature,
48      const base::Closure& success_callback) override;
49  virtual void RemoveKey(const UserContext& context,
50                         const std::string& key_to_remove,
51                         const base::Closure& success_callback) override;
52  virtual void TransformKeyIfNeeded(const UserContext& user_context,
53                                    const ContextCallback& callback) override;
54
55 private:
56  virtual ~ExtendedAuthenticatorImpl();
57
58  // Callback for system salt getter.
59  void OnSaltObtained(const std::string& system_salt);
60
61  // Performs actual operation with fully configured |context|.
62  void DoAuthenticateToMount(const ResultCallback& success_callback,
63                             const UserContext& context);
64  void DoAuthenticateToCheck(const base::Closure& success_callback,
65                             const UserContext& context);
66  void DoAddKey(const cryptohome::KeyDefinition& key,
67                bool replace_existing,
68                const base::Closure& success_callback,
69                const UserContext& context);
70  void DoUpdateKeyAuthorized(const cryptohome::KeyDefinition& key,
71                             const std::string& signature,
72                             const base::Closure& success_callback,
73                             const UserContext& context);
74  void DoRemoveKey(const std::string& key_to_remove,
75                   const base::Closure& success_callback,
76                   const UserContext& context);
77
78  // Inner operation callbacks.
79  void OnMountComplete(const std::string& time_marker,
80                       const UserContext& context,
81                       const ResultCallback& success_callback,
82                       bool success,
83                       cryptohome::MountError return_code,
84                       const std::string& mount_hash);
85  void OnOperationComplete(const std::string& time_marker,
86                           const UserContext& context,
87                           const base::Closure& success_callback,
88                           bool success,
89                           cryptohome::MountError return_code);
90
91  bool salt_obtained_;
92  std::string system_salt_;
93  std::vector<base::Closure> system_salt_callbacks_;
94
95  NewAuthStatusConsumer* consumer_;
96  AuthStatusConsumer* old_consumer_;
97
98  DISALLOW_COPY_AND_ASSIGN(ExtendedAuthenticatorImpl);
99};
100
101}  // namespace chromeos
102
103#endif  // CHROMEOS_LOGIN_AUTH_EXTENDED_AUTHENTICATOR_IMPL_H_
104