OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/host/pam_authorization_factory_posix.h" | 5 #include "remoting/host/pam_authorization_factory_posix.h" |
6 | 6 |
7 #include <security/pam_appl.h> | 7 #include <security/pam_appl.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/callback.h" | 12 #include "base/callback.h" |
13 #include "base/environment.h" | 13 #include "base/environment.h" |
| 14 #include "base/memory/ptr_util.h" |
14 #include "remoting/base/logging.h" | 15 #include "remoting/base/logging.h" |
15 #include "remoting/host/username.h" | 16 #include "remoting/host/username.h" |
16 #include "remoting/protocol/channel_authenticator.h" | 17 #include "remoting/protocol/channel_authenticator.h" |
17 #include "third_party/webrtc/libjingle/xmllite/xmlelement.h" | 18 #include "third_party/webrtc/libjingle/xmllite/xmlelement.h" |
18 | 19 |
19 namespace remoting { | 20 namespace remoting { |
20 | 21 |
21 namespace { | 22 namespace { |
22 class PamAuthorizer : public protocol::Authenticator { | 23 class PamAuthorizer : public protocol::Authenticator { |
23 public: | 24 public: |
24 PamAuthorizer(scoped_ptr<protocol::Authenticator> underlying); | 25 PamAuthorizer(std::unique_ptr<protocol::Authenticator> underlying); |
25 ~PamAuthorizer() override; | 26 ~PamAuthorizer() override; |
26 | 27 |
27 // protocol::Authenticator interface. | 28 // protocol::Authenticator interface. |
28 State state() const override; | 29 State state() const override; |
29 bool started() const override; | 30 bool started() const override; |
30 RejectionReason rejection_reason() const override; | 31 RejectionReason rejection_reason() const override; |
31 void ProcessMessage(const buzz::XmlElement* message, | 32 void ProcessMessage(const buzz::XmlElement* message, |
32 const base::Closure& resume_callback) override; | 33 const base::Closure& resume_callback) override; |
33 scoped_ptr<buzz::XmlElement> GetNextMessage() override; | 34 std::unique_ptr<buzz::XmlElement> GetNextMessage() override; |
34 const std::string& GetAuthKey() const override; | 35 const std::string& GetAuthKey() const override; |
35 scoped_ptr<protocol::ChannelAuthenticator> CreateChannelAuthenticator() | 36 std::unique_ptr<protocol::ChannelAuthenticator> CreateChannelAuthenticator() |
36 const override; | 37 const override; |
37 | 38 |
38 private: | 39 private: |
39 void MaybeCheckLocalLogin(); | 40 void MaybeCheckLocalLogin(); |
40 bool IsLocalLoginAllowed(); | 41 bool IsLocalLoginAllowed(); |
41 void OnMessageProcessed(const base::Closure& resume_callback); | 42 void OnMessageProcessed(const base::Closure& resume_callback); |
42 | 43 |
43 static int PamConversation(int num_messages, | 44 static int PamConversation(int num_messages, |
44 const struct pam_message** messages, | 45 const struct pam_message** messages, |
45 struct pam_response** responses, | 46 struct pam_response** responses, |
46 void* context); | 47 void* context); |
47 | 48 |
48 scoped_ptr<protocol::Authenticator> underlying_; | 49 std::unique_ptr<protocol::Authenticator> underlying_; |
49 enum { NOT_CHECKED, ALLOWED, DISALLOWED } local_login_status_; | 50 enum { NOT_CHECKED, ALLOWED, DISALLOWED } local_login_status_; |
50 }; | 51 }; |
51 | 52 |
52 } // namespace | 53 } // namespace |
53 | 54 |
54 PamAuthorizer::PamAuthorizer(scoped_ptr<protocol::Authenticator> underlying) | 55 PamAuthorizer::PamAuthorizer( |
| 56 std::unique_ptr<protocol::Authenticator> underlying) |
55 : underlying_(std::move(underlying)), local_login_status_(NOT_CHECKED) {} | 57 : underlying_(std::move(underlying)), local_login_status_(NOT_CHECKED) {} |
56 | 58 |
57 PamAuthorizer::~PamAuthorizer() {} | 59 PamAuthorizer::~PamAuthorizer() {} |
58 | 60 |
59 protocol::Authenticator::State PamAuthorizer::state() const { | 61 protocol::Authenticator::State PamAuthorizer::state() const { |
60 if (local_login_status_ == DISALLOWED) { | 62 if (local_login_status_ == DISALLOWED) { |
61 return REJECTED; | 63 return REJECTED; |
62 } else { | 64 } else { |
63 return underlying_->state(); | 65 return underlying_->state(); |
64 } | 66 } |
(...skipping 18 matching lines...) Expand all Loading... |
83 underlying_->ProcessMessage(message, base::Bind( | 85 underlying_->ProcessMessage(message, base::Bind( |
84 &PamAuthorizer::OnMessageProcessed, | 86 &PamAuthorizer::OnMessageProcessed, |
85 base::Unretained(this), resume_callback)); | 87 base::Unretained(this), resume_callback)); |
86 } | 88 } |
87 | 89 |
88 void PamAuthorizer::OnMessageProcessed(const base::Closure& resume_callback) { | 90 void PamAuthorizer::OnMessageProcessed(const base::Closure& resume_callback) { |
89 MaybeCheckLocalLogin(); | 91 MaybeCheckLocalLogin(); |
90 resume_callback.Run(); | 92 resume_callback.Run(); |
91 } | 93 } |
92 | 94 |
93 scoped_ptr<buzz::XmlElement> PamAuthorizer::GetNextMessage() { | 95 std::unique_ptr<buzz::XmlElement> PamAuthorizer::GetNextMessage() { |
94 scoped_ptr<buzz::XmlElement> result(underlying_->GetNextMessage()); | 96 std::unique_ptr<buzz::XmlElement> result(underlying_->GetNextMessage()); |
95 MaybeCheckLocalLogin(); | 97 MaybeCheckLocalLogin(); |
96 return result; | 98 return result; |
97 } | 99 } |
98 | 100 |
99 const std::string& PamAuthorizer::GetAuthKey() const { | 101 const std::string& PamAuthorizer::GetAuthKey() const { |
100 return underlying_->GetAuthKey(); | 102 return underlying_->GetAuthKey(); |
101 } | 103 } |
102 | 104 |
103 scoped_ptr<protocol::ChannelAuthenticator> | 105 std::unique_ptr<protocol::ChannelAuthenticator> |
104 PamAuthorizer::CreateChannelAuthenticator() const { | 106 PamAuthorizer::CreateChannelAuthenticator() const { |
105 return underlying_->CreateChannelAuthenticator(); | 107 return underlying_->CreateChannelAuthenticator(); |
106 } | 108 } |
107 | 109 |
108 void PamAuthorizer::MaybeCheckLocalLogin() { | 110 void PamAuthorizer::MaybeCheckLocalLogin() { |
109 if (local_login_status_ == NOT_CHECKED && state() == ACCEPTED) { | 111 if (local_login_status_ == NOT_CHECKED && state() == ACCEPTED) { |
110 local_login_status_ = IsLocalLoginAllowed() ? ALLOWED : DISALLOWED; | 112 local_login_status_ = IsLocalLoginAllowed() ? ALLOWED : DISALLOWED; |
111 } | 113 } |
112 } | 114 } |
113 | 115 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 break; | 156 break; |
155 default: | 157 default: |
156 LOG(FATAL) << "Unexpected PAM conversation response required: " | 158 LOG(FATAL) << "Unexpected PAM conversation response required: " |
157 << message->msg << "; msg_style = " << message->msg_style; | 159 << message->msg << "; msg_style = " << message->msg_style; |
158 } | 160 } |
159 } | 161 } |
160 return PAM_SUCCESS; | 162 return PAM_SUCCESS; |
161 } | 163 } |
162 | 164 |
163 PamAuthorizationFactory::PamAuthorizationFactory( | 165 PamAuthorizationFactory::PamAuthorizationFactory( |
164 scoped_ptr<protocol::AuthenticatorFactory> underlying) | 166 std::unique_ptr<protocol::AuthenticatorFactory> underlying) |
165 : underlying_(std::move(underlying)) {} | 167 : underlying_(std::move(underlying)) {} |
166 | 168 |
167 PamAuthorizationFactory::~PamAuthorizationFactory() {} | 169 PamAuthorizationFactory::~PamAuthorizationFactory() {} |
168 | 170 |
169 scoped_ptr<protocol::Authenticator> | 171 std::unique_ptr<protocol::Authenticator> |
170 PamAuthorizationFactory::CreateAuthenticator(const std::string& local_jid, | 172 PamAuthorizationFactory::CreateAuthenticator(const std::string& local_jid, |
171 const std::string& remote_jid) { | 173 const std::string& remote_jid) { |
172 scoped_ptr<protocol::Authenticator> authenticator( | 174 std::unique_ptr<protocol::Authenticator> authenticator( |
173 underlying_->CreateAuthenticator(local_jid, remote_jid)); | 175 underlying_->CreateAuthenticator(local_jid, remote_jid)); |
174 return make_scoped_ptr(new PamAuthorizer(std::move(authenticator))); | 176 return base::WrapUnique(new PamAuthorizer(std::move(authenticator))); |
175 } | 177 } |
176 | 178 |
177 } // namespace remoting | 179 } // namespace remoting |
OLD | NEW |