Use RAII idiom
[platform/core/appfw/rpc-port.git] / src / ac-internal.h
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
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 #ifndef AC_INTERNAL_H_
18 #define AC_INTERNAL_H_
19
20 #include <glib.h>
21 #include <gio/gio.h>
22 #include <glib-unix.h>
23 #include <cynara-client.h>
24
25 #include <string>
26 #include <vector>
27 #include <map>
28 #include <memory>
29
30 namespace rpc_port {
31 namespace internal {
32
33 class AccessController {
34  public:
35   explicit AccessController(bool trusted = false) : trusted_(trusted) {}
36
37   void AddPrivilege(std::string privilege);
38   void SetTrusted(const bool trusted);
39   int Check(GDBusConnection *connection, const char *sender,
40             const char* sender_appid);
41
42  private:
43   class Cynara {
44    public:
45      Cynara();
46
47      int FetchCredsFromDBus(GDBusConnection *connection, const char *sender);
48      int Check(const std::string& privilege) const;
49
50    private:
51      std::unique_ptr<cynara, decltype(cynara_finish)*> cynara_;
52      std::unique_ptr<char, decltype(std::free)*> client_;
53      std::unique_ptr<char, decltype(std::free)*> user_;
54   };
55
56   int SetCache(const std::string& sender);
57   int CheckTrusted(const char *sender_appid);
58   int CheckPrivilege(const Cynara& c);
59
60  private:
61   std::vector<std::string> privileges_;
62   std::map<std::string, bool> cache_;
63   bool trusted_;
64   std::string appid_;
65 };
66
67 }  // namespace internal
68 }  // namespace rpc_port
69
70 #endif  // AC_INTERNAL_H_