Add mockup for security-manager. 27/46727/3
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Mon, 24 Aug 2015 09:39:02 +0000 (11:39 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Tue, 25 Aug 2015 14:07:23 +0000 (16:07 +0200)
Security-manager mockup should be used with unit-tests.
CKM compilation with mockup:
gbs lb -A i586 --define "build_type DEBUG" --define "mockup_sm ON"

Note: It's not possible to compile RELEASE version of CKM with mockup.

Change-Id: I793ec55010b3826dd9d4157ce4e33f555dee14c0

packaging/key-manager.spec
src/CMakeLists.txt
src/manager/main/socket-2-id-mockup.cpp [new file with mode: 0644]

index 7329cf3..d39cdbd 100644 (file)
@@ -120,7 +120,8 @@ export LDFLAGS+="-Wl,--rpath=%{_libdir},-Bsymbolic-functions "
         -DSECURITY_MDFPP_STATE_ENABLE=1 \
 %endif
         -DSYSTEMD_UNIT_DIR=%{_unitdir} \
-        -DSYSTEMD_ENV_FILE="/etc/sysconfig/central-key-manager"
+        -DSYSTEMD_ENV_FILE="/etc/sysconfig/central-key-manager" \
+        -DMOCKUP_SM=%{?mockup_sm:%mockup_sm}%{!?mockup_sm:OFF}
 
 make %{?jobs:-j%jobs}
 
index 2fa3e94..30d56ab 100644 (file)
@@ -16,10 +16,19 @@ FIND_PACKAGE(Threads REQUIRED)
 SET(KEY_MANAGER_SRC_PATH ${PROJECT_SOURCE_DIR}/src)
 SET(KEY_MANAGER_PATH ${PROJECT_SOURCE_DIR}/src/manager)
 
+IF (MOCKUP_SM MATCHES "ON")
+    IF (CMAKE_BUILD_TYPE MATCHES "RELEASE")
+        MESSAGE(FATAL_ERROR "You cannot compile release version with mockups!")
+    ENDIF (CMAKE_BUILD_TYPE MATCHES "RELEASE")
+    MESSAGE("USING MOCKUP INSTEAD SECURITY MANAGER")
+    SET(SECURITY_MANAGER_PATH ${KEY_MANAGER_PATH}/main/socket-2-id-mockup.cpp)
+ELSE (MOCKUP_SM MATCHES "ON")
+    SET(SECURITY_MANAGER_PATH ${KEY_MANAGER_PATH}/main/socket-2-id.cpp)
+ENDIF (MOCKUP_SM MATCHES "ON")
+
 SET(KEY_MANAGER_SOURCES
     ${KEY_MANAGER_PATH}/main/generic-socket-manager.cpp
     ${KEY_MANAGER_PATH}/main/socket-manager.cpp
-    ${KEY_MANAGER_PATH}/main/socket-2-id.cpp
     ${KEY_MANAGER_PATH}/main/key-manager-main.cpp
     ${KEY_MANAGER_PATH}/main/smack-check.cpp
     ${KEY_MANAGER_PATH}/main/thread-service.cpp
@@ -58,6 +67,7 @@ SET(KEY_MANAGER_SOURCES
     ${KEY_MANAGER_PATH}/crypto/platform/decider.cpp
     ${KEY_MANAGER_PATH}/crypto/tz-backend/key.cpp
     ${KEY_MANAGER_PATH}/crypto/tz-backend/store.cpp
+    ${SECURITY_MANAGER_PATH}
     )
 
 # -fPIE and -pie flag is added for ASLR
diff --git a/src/manager/main/socket-2-id-mockup.cpp b/src/manager/main/socket-2-id-mockup.cpp
new file mode 100644 (file)
index 0000000..d031a02
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ *  Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+/*
+ * @file       socket-2-id-mockup.cpp
+ * @author     Bartlomiej Grzelewski (b.grzelewski@samsung.com)
+ * @version    1.0
+ */
+#include <sys/smack.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <security-manager.h>
+
+#include <dpl/log/log.h>
+#include <protocols.h>
+#include <socket-2-id.h>
+
+namespace CKM {
+namespace {
+
+int getCredentialsFromSocket(int sock, std::string &res)  {
+    std::vector<char> result(1);
+    socklen_t length = 1;
+
+    if ((0 > getsockopt(sock, SOL_SOCKET, SO_PEERSEC, result.data(), &length))
+      && errno != ERANGE)
+    {
+        LogError("getsockopt failed");
+        return -1;
+    }
+
+    result.resize(length);
+
+    if (0 > getsockopt(sock, SOL_SOCKET, SO_PEERSEC, result.data(), &length)) {
+        LogError("getsockopt failed");
+        return -1;
+    }
+
+    result.push_back('\0');
+    res = result.data();
+    return 0;
+}
+
+int getPkgIdFromSmack(const std::string &smack, std::string &pkgId) {
+    pkgId = smack;
+    return 0;
+}
+
+} // namespace anonymous
+
+
+int Socket2Id::translate(int sock, std::string &result) {
+    std::string smack;
+    std::string pkgId;
+
+    if (0 > getCredentialsFromSocket(sock, smack)) {
+        return -1;
+    }
+
+    if (0 > getPkgIdFromSmack(smack, pkgId)) {
+        return -1;
+    }
+
+    result = pkgId;
+    return 0;
+}
+
+void Socket2Id::resetCache() {
+    m_stringMap.clear();
+}
+
+} // namespace CKM
+