Apply system session from user session 89/98089/1
authorWootak Jung <wootak.jung@samsung.com>
Wed, 16 Nov 2016 06:06:20 +0000 (15:06 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Wed, 16 Nov 2016 06:06:20 +0000 (15:06 +0900)
- Apply multi-user scenario
- Apply cap_dac_read_search capability to access user session socket

Change-Id: I40d8dc7cfcbef47c01ca50ffea8292f31446e486

common/CMakeLists.txt
common/src/callmgr-util.c
packaging/call-manager.spec
resource/callmgr.service
service/CMakeLists.txt

index cdfe3873e3ee55df62096a21c35716e1b2515f93..f66380a3f64491e877f15f69a808cb3efc2258f1 100644 (file)
@@ -19,6 +19,7 @@ pkg_check_modules(common_pkgs REQUIRED
        capi-media-recorder
        notification
        msg-service
+       libsystemd-login
 )
 
 FOREACH(flag ${common_pkgs_CFLAGS})
index da55c30ce09f9432652cc40a8fda3727b47cfa23..af07715b5f5aa1dbc8359884b929d91d0e3fc938 100644 (file)
@@ -32,6 +32,7 @@
 #include <msg.h>
 #include <cynara-creds-gdbus.h>
 #include <cynara-session.h>
+#include <systemd/sd-login.h>
 
 #include "callmgr-util.h"
 #include "callmgr-log.h"
@@ -44,6 +45,7 @@
 #define CALLMGR_CLI_SHOW_ID "*31#"
 #define CALLMGR_CLI_HIDE_ID "#31#"
 #define CALLMGR_PHONE_NUMBER_LENGTH_MAX 82
+#define CALLMGR_SYSTEM_SLICE "system.slice"
 
 #define PERM_WRITE     "w"
 #define PERM_EXECUTE   "x"
@@ -192,6 +194,38 @@ static gboolean __callmgr_util_dispatch_job_on_new_thread(gchar *name, GThreadFu
        return TRUE;
 }
 
+static int __callmgr_util_get_active_uid(uid_t *uid)
+{
+       int ret = 0;
+       uid_t *active_user_list = NULL;
+       char *slice = NULL;
+       *uid = getuid();
+
+       ret = sd_pid_get_slice(getpid(), &slice);
+       if (0 <= ret && slice) {
+               if (!g_strcmp0(slice, CALLMGR_SYSTEM_SLICE)) {
+                       ret = sd_get_active_uids(&active_user_list);
+                       /* the number of active users is 1 in tizen3.0 */
+                       if (1 == ret && active_user_list) {
+                               *uid = active_user_list[0];
+                               dbg("uid = %d", *uid);
+                       } else {
+                               err("sd_get_active_uids() Fail(%d)", ret);
+                               free(active_user_list);
+                               free(slice);
+                               return 0;
+                       }
+                       free(active_user_list);
+               }
+               free(slice);
+       } else {
+               err("sd_pid_get_slice() Fail(%d)", ret);
+       }
+       dbg("getuid() = %d, uid =  %d", getuid(), *uid);
+
+       return 0;
+}
+
 static gpointer __callmgr_util_launch_voice_call(gpointer data)
 {
        GThread* selfi = g_thread_self();
@@ -201,6 +235,7 @@ static gpointer __callmgr_util_launch_voice_call(gpointer data)
        CM_RETURN_VAL_IF_FAIL(cb_data, NULL);
        char buf[2] = {0, };
        bundle *kb      = NULL;
+       uid_t uid = 0;
 
        kb = bundle_create();
 
@@ -214,7 +249,9 @@ static gpointer __callmgr_util_launch_voice_call(gpointer data)
        g_snprintf(buf, 2, "%d", cb_data->sim_slot);
        dbg("sim_slot : [%s]", buf);
        appsvc_add_data(kb, "sim_slot", buf);
-       appsvc_run_service(kb, 0, NULL, NULL);
+       /* To support multi-user, launch call-ui with active uid */
+       __callmgr_util_get_active_uid(&uid);
+       appsvc_usr_run_service(kb, 0, NULL, NULL, uid);
 
        bundle_free(kb);
        g_free(cb_data);
index 1c413c2205f6cc5c43c37e8d9116678b88622857..90773d92ae3f6a0265dac39d40548236e7e48f3a 100644 (file)
@@ -1,6 +1,6 @@
 %define major 0
 %define minor 1
-%define patchlevel 83
+%define patchlevel 84
 %define ext_feature 0
 
 Name:           call-manager
@@ -53,6 +53,7 @@ BuildRequires: pkgconfig(cynara-client)
 BuildRequires: pkgconfig(cynara-creds-gdbus)
 BuildRequires: pkgconfig(cynara-session)
 BuildRequires: pkgconfig(msg-service)
+BuildRequires: pkgconfig(libsystemd)
 
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
@@ -96,8 +97,8 @@ make %{?_smp_mflags}
 
 %install
 %make_install
-mkdir -p %{buildroot}/usr/lib/systemd/user/default.target.wants
-ln -s /usr/lib/systemd/user/callmgr.service %{buildroot}/usr/lib/systemd/user/default.target.wants/callmgr.service
+mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants
+ln -s %{_unitdir}/callmgr.service %{buildroot}%{_unitdir}/multi-user.target.wants/callmgr.service
 mkdir -p %{buildroot}/etc/dbus-1/system.d/
 cp %{SOURCE1} %{buildroot}/etc/dbus-1/system.d/callmgr.conf
 mkdir -p %{buildroot}/usr/share/license
@@ -106,10 +107,10 @@ cp LICENSE %{buildroot}/usr/share/license/call-manager
 %files
 %manifest callmgr.manifest
 %defattr(644,root,root,-)
-%attr(755,root,root) %{_bindir}/callmgrd
+%caps(cap_dac_read_search=eip) %attr(755,root,root) %{_bindir}/callmgrd
 #/etc/*
-/usr/lib/systemd/user/callmgr.service
-/usr/lib/systemd/user/default.target.wants/callmgr.service
+%{_unitdir}/callmgr.service
+%{_unitdir}/multi-user.target.wants/callmgr.service
 /etc/dbus-1/system.d/callmgr.conf
 %{_datadir}/license/call-manager
 /usr/share/call-manager/*
index c189d4c2558bb6851cb0543c5e23ddb79fda26eb..b833fb58f78c993f17617b9d0bc8bac54c2c1a7b 100644 (file)
@@ -4,10 +4,12 @@ Requires=tizen-runtime.target
 After=tizen-runtime.target telephony-daemon.service contacts-service.service
 
 [Service]
-Type=simple
+User=telephony
+Group=telephony
+SmackProcessLabel=System
 ExecStart=/usr/bin/callmgrd
 Restart=always
 RestartSec=0
 
 [Install]
-WantedBy=default.target
+WantedBy=multi-user.target
index ba81c4fe9de36fb0eddec61cafc72ab93f453431..1c47a242f9da824334b11ca042daea30287d1e9e 100644 (file)
@@ -48,4 +48,4 @@ TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${service_pkgs_LDFLAGS} callmgr_module cal
 INSTALL(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
 
 # Configuration files (dbus & smack)
-INSTALL(FILES ${CMAKE_SOURCE_DIR}/resource/callmgr.service DESTINATION /usr/lib/systemd/user/)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/resource/callmgr.service DESTINATION ${UNITDIR})