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 // This file implements a standalone host process for Me2Me. | 5 // This file implements a standalone host process for Me2Me. |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 #include "crypto/nss_util.h" | 27 #include "crypto/nss_util.h" |
28 #include "ipc/ipc_channel.h" | 28 #include "ipc/ipc_channel.h" |
29 #include "ipc/ipc_channel_proxy.h" | 29 #include "ipc/ipc_channel_proxy.h" |
30 #include "ipc/ipc_listener.h" | 30 #include "ipc/ipc_listener.h" |
31 #include "net/base/network_change_notifier.h" | 31 #include "net/base/network_change_notifier.h" |
32 #include "net/socket/ssl_server_socket.h" | 32 #include "net/socket/ssl_server_socket.h" |
33 #include "net/url_request/url_fetcher.h" | 33 #include "net/url_request/url_fetcher.h" |
34 #include "remoting/base/auto_thread_task_runner.h" | 34 #include "remoting/base/auto_thread_task_runner.h" |
35 #include "remoting/base/breakpad.h" | 35 #include "remoting/base/breakpad.h" |
36 #include "remoting/base/constants.h" | 36 #include "remoting/base/constants.h" |
| 37 #include "remoting/base/util.h" |
37 #include "remoting/host/branding.h" | 38 #include "remoting/host/branding.h" |
38 #include "remoting/host/chromoting_host.h" | 39 #include "remoting/host/chromoting_host.h" |
39 #include "remoting/host/chromoting_host_context.h" | 40 #include "remoting/host/chromoting_host_context.h" |
40 #include "remoting/host/chromoting_messages.h" | 41 #include "remoting/host/chromoting_messages.h" |
41 #include "remoting/host/config_file_watcher.h" | 42 #include "remoting/host/config_file_watcher.h" |
42 #include "remoting/host/curtain_mode.h" | 43 #include "remoting/host/curtain_mode.h" |
43 #include "remoting/host/curtaining_host_observer.h" | 44 #include "remoting/host/curtaining_host_observer.h" |
44 #include "remoting/host/desktop_environment.h" | 45 #include "remoting/host/desktop_environment.h" |
45 #include "remoting/host/desktop_session_connector.h" | 46 #include "remoting/host/desktop_session_connector.h" |
46 #include "remoting/host/dns_blackhole_checker.h" | 47 #include "remoting/host/dns_blackhole_checker.h" |
(...skipping 15 matching lines...) Expand all Loading... |
62 #include "remoting/host/policy_hack/policy_watcher.h" | 63 #include "remoting/host/policy_hack/policy_watcher.h" |
63 #include "remoting/host/service_urls.h" | 64 #include "remoting/host/service_urls.h" |
64 #include "remoting/host/session_manager_factory.h" | 65 #include "remoting/host/session_manager_factory.h" |
65 #include "remoting/host/signaling_connector.h" | 66 #include "remoting/host/signaling_connector.h" |
66 #include "remoting/host/ui_strings.h" | 67 #include "remoting/host/ui_strings.h" |
67 #include "remoting/host/usage_stats_consent.h" | 68 #include "remoting/host/usage_stats_consent.h" |
68 #include "remoting/jingle_glue/xmpp_signal_strategy.h" | 69 #include "remoting/jingle_glue/xmpp_signal_strategy.h" |
69 #include "remoting/protocol/me2me_host_authenticator_factory.h" | 70 #include "remoting/protocol/me2me_host_authenticator_factory.h" |
70 | 71 |
71 #if defined(OS_POSIX) | 72 #if defined(OS_POSIX) |
72 #include <pwd.h> | |
73 #include <signal.h> | 73 #include <signal.h> |
74 #include "base/file_descriptor_posix.h" | 74 #include "base/file_descriptor_posix.h" |
75 #include "remoting/host/pam_authorization_factory_posix.h" | 75 #include "remoting/host/pam_authorization_factory_posix.h" |
76 #include "remoting/host/posix/signal_handler.h" | 76 #include "remoting/host/posix/signal_handler.h" |
77 #endif // defined(OS_POSIX) | 77 #endif // defined(OS_POSIX) |
78 | 78 |
79 #if defined(OS_MACOSX) | 79 #if defined(OS_MACOSX) |
80 #include "base/mac/scoped_cftyperef.h" | 80 #include "base/mac/scoped_cftyperef.h" |
81 #endif // defined(OS_MACOSX) | 81 #endif // defined(OS_MACOSX) |
82 | 82 |
(...skipping 17 matching lines...) Expand all Loading... |
100 const char kApplicationName[] = "chromoting"; | 100 const char kApplicationName[] = "chromoting"; |
101 | 101 |
102 // The command line switch used to pass name of the pipe to capture audio on | 102 // The command line switch used to pass name of the pipe to capture audio on |
103 // linux. | 103 // linux. |
104 const char kAudioPipeSwitchName[] = "audio-pipe-name"; | 104 const char kAudioPipeSwitchName[] = "audio-pipe-name"; |
105 | 105 |
106 void QuitMessageLoop(MessageLoop* message_loop) { | 106 void QuitMessageLoop(MessageLoop* message_loop) { |
107 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 107 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
108 } | 108 } |
109 | 109 |
110 // Returns true if GetUsername() is implemented on this platform. | |
111 bool CanGetUsername() { | |
112 #if defined(OS_POSIX) | |
113 return true; | |
114 #else // !defined(OS_POSIX) | |
115 return false; | |
116 #endif // defined(OS_POSIX) | |
117 } // namespace | |
118 | |
119 // Returns the username associated with this process, or the empty string on | |
120 // error. | |
121 std::string GetUsername() { | |
122 #if defined(OS_POSIX) | |
123 long buf_size = sysconf(_SC_GETPW_R_SIZE_MAX); | |
124 if (buf_size <= 0) | |
125 return ""; | |
126 scoped_array<char> buf(new char[buf_size]); | |
127 struct passwd passwd; | |
128 struct passwd* passwd_result = NULL; | |
129 getpwuid_r(getuid(), &passwd, buf.get(), buf_size, &passwd_result); | |
130 if (!passwd_result) | |
131 return ""; | |
132 return std::string(passwd_result->pw_name); | |
133 #else // !defined(OS_POSIX) | |
134 NOTREACHED(); | |
135 return ""; | |
136 #endif // defined(OS_POSIX) | |
137 } | |
138 | |
139 } // namespace | 110 } // namespace |
140 | 111 |
141 namespace remoting { | 112 namespace remoting { |
142 | 113 |
143 class HostProcess | 114 class HostProcess |
144 : public ConfigFileWatcher::Delegate, | 115 : public ConfigFileWatcher::Delegate, |
145 public HeartbeatSender::Listener, | 116 public HeartbeatSender::Listener, |
146 public HostChangeNotificationListener::Listener, | 117 public HostChangeNotificationListener::Listener, |
147 public IPC::Listener, | 118 public IPC::Listener, |
148 public base::RefCountedThreadSafe<HostProcess> { | 119 public base::RefCountedThreadSafe<HostProcess> { |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 } | 762 } |
792 return false; | 763 return false; |
793 } | 764 } |
794 | 765 |
795 bool HostProcess::OnUsernamePolicyUpdate(bool host_username_match_required) { | 766 bool HostProcess::OnUsernamePolicyUpdate(bool host_username_match_required) { |
796 // Returns false: never restart the host after this policy update. | 767 // Returns false: never restart the host after this policy update. |
797 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 768 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
798 | 769 |
799 if (host_username_match_required) { | 770 if (host_username_match_required) { |
800 LOG(INFO) << "Policy requires host username match."; | 771 LOG(INFO) << "Policy requires host username match."; |
801 bool shutdown = !CanGetUsername() || | 772 std::string username = GetUsername(); |
802 !StartsWithASCII(xmpp_login_, GetUsername() + std::string("@"), | 773 bool shutdown = username.empty() || |
| 774 !StartsWithASCII(xmpp_login_, username + std::string("@"), |
803 false); | 775 false); |
804 | 776 |
805 #if defined(OS_MACOSX) | 777 #if defined(OS_MACOSX) |
806 // On Mac, we run as root at the login screen, so the username won't match. | 778 // On Mac, we run as root at the login screen, so the username won't match. |
807 // However, there's no need to enforce the policy at the login screen, as | 779 // However, there's no need to enforce the policy at the login screen, as |
808 // the client will have to reconnect if a login occurs. | 780 // the client will have to reconnect if a login occurs. |
809 if (shutdown && getuid() == 0) { | 781 if (shutdown && getuid() == 0) { |
810 shutdown = false; | 782 shutdown = false; |
811 } | 783 } |
812 #endif | 784 #endif |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 return exit_code; | 1117 return exit_code; |
1146 } | 1118 } |
1147 | 1119 |
1148 } // namespace remoting | 1120 } // namespace remoting |
1149 | 1121 |
1150 #if !defined(OS_WIN) | 1122 #if !defined(OS_WIN) |
1151 int main(int argc, char** argv) { | 1123 int main(int argc, char** argv) { |
1152 return remoting::HostMain(argc, argv); | 1124 return remoting::HostMain(argc, argv); |
1153 } | 1125 } |
1154 #endif // !defined(OS_WIN) | 1126 #endif // !defined(OS_WIN) |
OLD | NEW |