0ec3634125a20f36017e5e08866745194e4a146e
[platform/core/security/vasum.git] / client / vasum-client-impl.hpp
1 /*
2  *  Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Contact: Mateusz Malicki <m.malicki2@samsung.com>
5  *
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License
17  */
18
19
20 /**
21  * @file
22  * @author  Mateusz Malicki (m.malicki2@samsung.com)
23  * @brief   This file contains vasum-server's client definition
24  */
25
26 #ifndef VASUM_CLIENT_IMPL_HPP
27 #define VASUM_CLIENT_IMPL_HPP
28
29 #include "vasum-client.h"
30 #include "host-ipc-connection.hpp"
31
32 #include <ipc/epoll/thread-dispatcher.hpp>
33 #include <ipc/epoll/event-poll.hpp>
34
35 #include <mutex>
36 #include <memory>
37 #include <functional>
38 #include <linux/if_link.h>
39
40 /**
41  * Zone's D-Bus state change callback function signature.
42  *
43  * @param[in] zoneId affected zone id
44  * @param[in] dbusAddress new D-Bus address
45  * @param data custom user's data pointer passed to vsm_add_state_callback() function
46  */
47 typedef std::function<void (const char *zoneId, const char *dbusAddress, void *data)> VsmZoneDbusStateFunction;
48
49 /**
50  * Notification callback function signature.
51  *
52  * @param[in] zone source zone
53  * @param[in] application sending application name
54  * @param[in] message notification message
55  * @param data custom user's data pointer passed to vsm_add_notification_callback()
56  */
57 typedef std::function<void(const char *zone, const char *application, const char *message, void *data)>
58     VsmNotificationFunction;
59
60 /**
61  * vasum's client definition.
62  *
63  * Client uses dbus API.
64  */
65 class Client {
66 public:
67     Client() noexcept;
68     ~Client() noexcept;
69
70     /**
71      * Connect client with system ipc address.
72      *
73      * @return status of this function call
74      */
75     VsmStatus connectSystem() noexcept;
76
77     /**
78      * Connect client.
79      *
80      * @param address ipc socket address
81      * @return status of this function call
82      */
83     VsmStatus connect(const std::string& address) noexcept;
84
85     /**
86      * Disconnect client
87      */
88     VsmStatus disconnect() noexcept;
89
90     /**
91      *  @see ::vsm_get_poll_fd
92      */
93     VsmStatus vsm_get_poll_fd(int* fd) noexcept;
94
95     /**
96      *  @see ::vsm_enter_eventloop
97      */
98     VsmStatus vsm_enter_eventloop(int flags, int timeout) noexcept;
99
100     /**
101      *  @see ::vsm_set_dispatcher_type
102      */
103     VsmStatus vsm_set_dispatcher_type(VsmDispacherType dispacher) noexcept;
104
105     /**
106      *  @see ::vsm_get_dispatcher_type
107      */
108     VsmStatus vsm_get_dispatcher_type(VsmDispacherType* dispacher) noexcept;
109
110     /**
111      *  @see ::vsm_get_status_message
112      */
113     const char* vsm_get_status_message() const noexcept;
114
115     /**
116      *  @see ::vsm_get_status
117      */
118     VsmStatus vsm_get_status() const noexcept;
119
120     /**
121      *  @see ::vsm_get_zone_dbuses
122      */
123     VsmStatus vsm_get_zone_dbuses(VsmArrayString* keys, VsmArrayString* values) noexcept;
124
125     /**
126      *  @see ::vsm_get_zone_ids
127      */
128     VsmStatus vsm_get_zone_ids(VsmArrayString* array) noexcept;
129
130     /**
131      *  @see ::vsm_get_active_zone_id
132      */
133     VsmStatus vsm_get_active_zone_id(VsmString* id) noexcept;
134
135     /**
136      *  @see ::vsm_get_zone_rootpath
137      */
138     VsmStatus vsm_get_zone_rootpath(const char* id, VsmString* rootpath) noexcept;
139
140     /**
141      *  @see ::vsm_lookup_zone_by_pid
142      */
143     VsmStatus vsm_lookup_zone_by_pid(int pid, VsmString* id) noexcept;
144
145     /**
146      * @see ::vsm_lookup_zone_by_id
147      */
148     VsmStatus vsm_lookup_zone_by_id(const char* id, VsmZone* zone) noexcept;
149
150     /**
151      * @see ::vsm_lookup_zone_by_terminal_id
152      */
153     VsmStatus vsm_lookup_zone_by_terminal_id(int terminal, VsmString* id) noexcept;
154
155     /**
156      *  @see ::vsm_set_active_zone
157      */
158     VsmStatus vsm_set_active_zone(const char* id) noexcept;
159
160     /**
161      *  @see ::vsm_create_zone
162      */
163     VsmStatus vsm_create_zone(const char* id, const char* tname) noexcept;
164
165     /**
166      *  @see ::vsm_destroy_zone
167      */
168     VsmStatus vsm_destroy_zone(const char* id) noexcept;
169
170     /**
171      *  @see ::vsm_shutdown_zone
172      */
173     VsmStatus vsm_shutdown_zone(const char* id) noexcept;
174
175     /**
176      *  @see ::vsm_start_zone
177      */
178     VsmStatus vsm_start_zone(const char* id) noexcept;
179
180     /**
181      *  @see ::vsm_lock_zone
182      */
183     VsmStatus vsm_lock_zone(const char* id) noexcept;
184
185     /**
186      *  @see ::vsm_unlock_zone
187      */
188     VsmStatus vsm_unlock_zone(const char* id) noexcept;
189
190     /**
191      *  @see ::vsm_add_state_callback
192      */
193     VsmStatus vsm_add_state_callback(VsmZoneDbusStateFunction zoneDbusStateCallback,
194                                      void* data,
195                                      VsmSubscriptionId* subscriptionId) noexcept;
196
197     /**
198      *  @see ::vsm_del_state_callback
199      */
200     VsmStatus vsm_del_state_callback(VsmSubscriptionId subscriptionId) noexcept;
201
202     /**
203      *  @see ::vsm_del_state_callback
204      */
205     VsmStatus vsm_grant_device(const char* id,
206                                const char* device,
207                                uint32_t flags) noexcept;
208
209     /**
210      *  @see ::vsm_revoke_device
211      */
212     VsmStatus vsm_revoke_device(const char* id, const char* device) noexcept;
213
214     /**
215      *  @see ::vsm_zone_get_netdevs
216      */
217     VsmStatus vsm_zone_get_netdevs(const char* zone, VsmArrayString* netdevIds) noexcept;
218
219     /**
220      *  @see ::vsm_netdev_get_ipv4_addr
221      */
222     VsmStatus vsm_netdev_get_ipv4_addr(const char* zone,
223                                        const char* netdevId,
224                                        struct in_addr *addr) noexcept;
225
226     /**
227      *  @see ::vsm_netdev_get_ipv6_addr
228      */
229     VsmStatus vsm_netdev_get_ipv6_addr(const char* zone,
230                                        const char* netdevId,
231                                        struct in6_addr *addr) noexcept;
232
233     /**
234      *  @see ::vsm_netdev_set_ipv4_addr
235      */
236     VsmStatus vsm_netdev_set_ipv4_addr(const char* zone,
237                                        const char* netdevId,
238                                        struct in_addr *addr,
239                                        int prefix) noexcept;
240
241     /**
242      *  @see ::vsm_netdev_set_ipv6_addr
243      */
244     VsmStatus vsm_netdev_set_ipv6_addr(const char* zone,
245                                        const char* netdevId,
246                                        struct in6_addr *addr,
247                                        int prefix) noexcept;
248
249     /**
250      *  @see ::vsm_netdev_del_ipv4_addr
251      */
252     VsmStatus vsm_netdev_del_ipv4_addr(const char* zone,
253                                       const char* netdevId,
254                                       struct in_addr* addr,
255                                       int prefix) noexcept;
256
257     /**
258      *  @see ::vsm_netdev_del_ipv6_addr
259      */
260     VsmStatus vsm_netdev_del_ipv6_addr(const char* zone,
261                                       const char* netdevId,
262                                       struct in6_addr* addr,
263                                       int prefix) noexcept;
264
265     /**
266      *  @see ::vsm_netdev_up
267      */
268     VsmStatus vsm_netdev_up(const char* zone, const char* netdevId) noexcept;
269
270     /**
271      *  @see ::vsm_netdev_down
272      */
273     VsmStatus vsm_netdev_down(const char* zone, const char* netdevId) noexcept;
274
275     /**
276      *  @see ::vsm_create_netdev_veth
277      */
278     VsmStatus vsm_create_netdev_veth(const char* zone,
279                                      const char* zoneDev,
280                                      const char* hostDev) noexcept;
281
282     /**
283      *  @see ::vsm_create_netdev_macvlan
284      */
285     VsmStatus vsm_create_netdev_macvlan(const char* zone,
286                                         const char* zoneDev,
287                                         const char* hostDev,
288                                         enum macvlan_mode mode) noexcept;
289
290     /**
291      *  @see ::vsm_create_netdev_phys
292      */
293     VsmStatus vsm_create_netdev_phys(const char* zone, const char* devId) noexcept;
294
295     /**
296      *  @see ::vsm_lookup_netdev_by_name
297      */
298     VsmStatus vsm_lookup_netdev_by_name(const char* zone,
299                                         const char* netdevId,
300                                         VsmNetdev* netdev) noexcept;
301
302     /**
303      *  @see ::vsm_destroy_netdev
304      */
305     VsmStatus vsm_destroy_netdev(const char* zone, const char* devId) noexcept;
306
307     /**
308      *  @see ::vsm_declare_file
309      */
310     VsmStatus vsm_declare_file(const char* zone,
311                                VsmFileType type,
312                                const char* path,
313                                int32_t flags,
314                                mode_t mode,
315                                VsmString* id) noexcept;
316
317     /**
318      * @see ::vsm_declare_mount
319      */
320     VsmStatus vsm_declare_mount(const char* source,
321                                 const char* zone,
322                                 const char* target,
323                                 const char* type,
324                                 uint64_t flags,
325                                 const char* data,
326                                 VsmString* id) noexcept;
327     /**
328      * @see ::vsm_declare_link
329      */
330     VsmStatus vsm_declare_link(const char* source,
331                                const char* zone,
332                                const char* target,
333                                VsmString* id) noexcept;
334
335     /**
336      * @see ::vsm_list_declarations
337      */
338     VsmStatus vsm_list_declarations(const char* zone, VsmArrayString* declarations) noexcept;
339
340     /**
341      * @see ::vsm_remove_declaration
342      */
343     VsmStatus vsm_remove_declaration(const char* zone, VsmString declaration) noexcept;
344
345     /**
346      *  @see ::vsm_notify_active_zone
347      */
348     VsmStatus vsm_notify_active_zone(const char* application, const char* message) noexcept;
349
350     /**
351      *  @see ::vsm_file_move_request
352      */
353     VsmStatus vsm_file_move_request(const char* destZone, const char* path) noexcept;
354
355     /**
356      *  @see ::vsm_add_notification_callback
357      */
358     VsmStatus vsm_add_notification_callback(VsmNotificationFunction notificationCallback,
359                                             void* data,
360                                             VsmSubscriptionId* subscriptionId) noexcept;
361
362     /**
363      *  @see ::vsm_del_notification_callback
364      */
365     VsmStatus vsm_del_notification_callback(VsmSubscriptionId subscriptionId) noexcept;
366
367 private:
368     typedef vasum::client::HostIPCConnection HostConnection;
369     struct Status {
370         Status();
371         Status(VsmStatus status, const std::string& msg = "");
372         VsmStatus mVsmStatus;
373         std::string mMsg;
374     };
375     Status mStatus;
376
377     mutable std::mutex mStatusMutex;
378     std::unique_ptr<ipc::epoll::ThreadDispatcher> mInternalDispatcher;
379     std::unique_ptr<ipc::epoll::EventPoll> mEventPoll;
380     HostConnection mHostClient;
381
382     bool isInternalDispatcherEnabled() const;
383     ipc::epoll::EventPoll& getEventPoll() const;
384     VsmStatus coverException(const std::function<void(void)>& worker) noexcept;
385     VsmStatus vsm_netdev_get_ip_addr(const char* zone,
386                                      const char* netdevId,
387                                      int type,
388                                      void* addr) noexcept;
389 };
390
391 #endif /* VASUM_CLIENT_IMPL_HPP */