• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "shill/dbus/chromeos_permission_broker_proxy.h"
18 
19 #include <string>
20 #include <vector>
21 
22 #include "shill/logging.h"
23 
24 namespace shill {
25 
26 // static
27 const int ChromeosPermissionBrokerProxy::kInvalidHandle = -1;
28 
ChromeosPermissionBrokerProxy(const scoped_refptr<dbus::Bus> & bus)29 ChromeosPermissionBrokerProxy::ChromeosPermissionBrokerProxy(
30     const scoped_refptr<dbus::Bus>& bus)
31     : proxy_(new org::chromium::PermissionBrokerProxy(bus)),
32       lifeline_read_fd_(kInvalidHandle),
33       lifeline_write_fd_(kInvalidHandle) {
34   // TODO(zqiu): register handler for service name owner changes, to
35   // automatically re-request VPN setup when permission broker is restarted.
36 }
37 
~ChromeosPermissionBrokerProxy()38 ChromeosPermissionBrokerProxy::~ChromeosPermissionBrokerProxy() {}
39 
RequestVpnSetup(const std::vector<std::string> & user_names,const std::string & interface)40 bool ChromeosPermissionBrokerProxy::RequestVpnSetup(
41     const std::vector<std::string>& user_names,
42     const std::string& interface) {
43   if (lifeline_read_fd_ != kInvalidHandle ||
44       lifeline_write_fd_ != kInvalidHandle) {
45     LOG(ERROR) << "Already setup?";
46     return false;
47   }
48 
49   // TODO(zqiu): move pipe creation/cleanup to the constructor and destructor.
50   // No need to recreate pipe for each request.
51   int fds[2];
52   if (pipe(fds) != 0) {
53     LOG(ERROR) << "Failed to create lifeline pipe";
54     return false;
55   }
56   lifeline_read_fd_ = fds[0];
57   lifeline_write_fd_ = fds[1];
58 
59   dbus::FileDescriptor dbus_fd(lifeline_read_fd_);
60   dbus_fd.CheckValidity();
61   brillo::ErrorPtr error;
62   bool success = false;
63   if (!proxy_->RequestVpnSetup(
64       user_names, interface, dbus_fd, &success, &error)) {
65     LOG(ERROR) << "Failed to request VPN setup: " << error->GetCode()
66                << " " << error->GetMessage();
67   }
68   return success;
69 }
70 
RemoveVpnSetup()71 bool ChromeosPermissionBrokerProxy::RemoveVpnSetup() {
72   if (lifeline_read_fd_ == kInvalidHandle &&
73       lifeline_write_fd_ == kInvalidHandle) {
74     return true;
75   }
76 
77   close(lifeline_read_fd_);
78   close(lifeline_write_fd_);
79   lifeline_read_fd_ = kInvalidHandle;
80   lifeline_write_fd_ = kInvalidHandle;
81   brillo::ErrorPtr error;
82   bool success = false;
83   if (!proxy_->RemoveVpnSetup(&success, &error)) {
84     LOG(ERROR) << "Failed to remove VPN setup: " << error->GetCode()
85                << " " << error->GetMessage();
86   }
87   return success;
88 }
89 
90 }  // namespace shill
91