Fix advisory locking in client library
[platform/core/security/security-manager.git] / src / client / client-offline.cpp
1 /*
2  *  Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Contact: Rafal Krypa <r.krypa@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  * @file        client-offline.cpp
20  * @author      Rafal Krypa <r.krypa@samsung.com>
21  * @version     1.0
22  * @brief       Helper class for client "off-line" mode detection
23  */
24
25 #include <client-common.h>
26 #include <message-buffer.h>
27 #include <protocols.h>
28 #include <dpl/serialization.h>
29 #include <dpl/log/log.h>
30 #include "client-offline.h"
31
32 namespace SecurityManager {
33
34 ClientOffline::ClientOffline()
35 {
36     offlineMode = false;
37     serviceLock = nullptr;
38
39     if (geteuid()) {
40         LogInfo("UID != 0, attempting only on-line mode.");
41         return;
42     }
43
44     try {
45         serviceLock = new SecurityManager::FileLocker(SecurityManager::SERVICE_LOCK_FILE, false);
46         if (serviceLock->Locked()) {
47             int retval;
48             MessageBuffer send, recv;
49
50             LogInfo("Service isn't running, try to trigger it via socket activation.");
51             serviceLock->Unlock();
52             Serialization::Serialize(send, static_cast<int>(SecurityModuleCall::NOOP));
53             retval = sendToServer(SERVICE_SOCKET, send.Pop(), recv);
54             if (retval != SECURITY_MANAGER_API_SUCCESS) {
55                 LogInfo("Socket activation attempt failed.");
56                 serviceLock->Lock();
57                 offlineMode = serviceLock->Locked();
58             } else
59                 LogInfo("Service seems to be running now.");
60         }
61     } catch (...) {
62         LogError("Cannot detect off-line mode by lock.");
63         offlineMode = false;
64     }
65
66     if (offlineMode)
67         LogInfo("Working in off-line mode.");
68     else
69         LogInfo("Working in on-line mode.");
70 }
71
72 ClientOffline::~ClientOffline()
73 {
74     if (serviceLock != nullptr)
75         delete serviceLock;
76 }
77
78 bool ClientOffline::isOffline(void)
79 {
80     return offlineMode;
81 }
82
83 } // namespace SecurityManager