Add krate-mount service
[platform/core/security/krate.git] / module / krate.cpp
index b81a901..8c9a320 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <dlfcn.h>
 #include <syslog.h>
+#include <unistd.h>
 #include <security/pam_ext.h>
 #include <security/pam_modules.h>
 
 #include <vector>
 #include <iostream>
 
-#include "session.h"
-#include "krate-guard.h"
 #include "krate-builder.h"
 
 #include <klay/exception.h>
 #include <klay/filesystem.h>
-#include <klay/xml/parser.h>
-#include <klay/xml/document.h>
 
-#define KRATE_UID_MIN 60001
-#define KRATE_UID_MAX 60100
+#define KRATE_UID_MIN 6000
+#define KRATE_UID_MAX 6999
 
-#define LAZYMOUNT_EXTERN extern
-#define LAZYMOUNT_LIB "/usr/lib/liblazymount.so.0"
+namespace {
 
-std::string buildKrateManifestPath(const std::string& name)
-{
-       return CONF_PATH "/" + name + ".xml";
+static std::string getFlagFilePath(runtime::User &user) {
+       return "/run/user/" + std::to_string(user.getUid()) + "/.container";
 }
 
+} // namespace
+
 std::string getKrateName(pam_handle_t* handle)
 {
        const void* retItem;
@@ -54,101 +51,21 @@ std::string getKrateName(pam_handle_t* handle)
        return static_cast<const char*>(retItem);
 }
 
-static int wait_condition(void)
-{
-    int r;
-    void *h;
-
-    int (*wait_mount_user)(void);
-
-    r = access(LAZYMOUNT_LIB,F_OK);
-    if (r < 0){
-        fprintf(stderr, "cannot find lazymount module - No support lazymount\n");
-        return 0;
-    }
-
-    h = dlopen(LAZYMOUNT_LIB, RTLD_LAZY);
-    if (!h) {
-        fprintf(stderr, "lazymount module dlopen error\n");
-        return -1;
-    }
-
-       do{
-        wait_mount_user = (int (*)())dlsym(h,"wait_mount_user");
-        if (!wait_mount_user) {
-            fprintf(stderr, "dlsym wait_mount_user error\n");
-            dlclose(h);
-            return -1;
-        }
-    } while (0);
-
-    r = wait_mount_user();
-    if (r < 0) {
-        fprintf(stderr, "wait_mout_user failed\n");
-        dlclose(h);
-        return r;
-    }
-
-    dlclose(h);
-    return 0;
-}
-
 extern "C" {
-LAZYMOUNT_EXTERN  __attribute__((visibility("default")))
-int container_preprocess(char* id) {
-       std::cout << "kraterize (UID " << id << ")..." << std::endl << std::flush;
-       try {
-               runtime::User user(std::stoi(std::string(id)));
-               KrateGuard krateGuard(user.getName());
-               krateGuard.wait();
-
-               auto sessionBuilder = [](const runtime::User& user) {
-                       KrateBuilder builder(user, buildKrateManifestPath(user.getName()));
-                       builder.unshareNamespace();
-               };
-               createSession(user, sessionBuilder);
-
-               if (user.getUid() >= KRATE_UID_MIN && user.getUid() <= KRATE_UID_MAX ) {
-                       wait_condition();
-               }
-       } catch (runtime::Exception& e) {
-               std::cerr << "krate error : " << e.what() <<std::endl << std::flush;
-               return -1;
-       }
-
-       std::cout << "krate preprocess completed!" << std::endl << std::flush;
-       return 0;
-}
-
-LAZYMOUNT_EXTERN  __attribute__((visibility("default")))
-int container_postprocess(char* id) {
-       try {
-               runtime::User user(std::stoi(std::string(id)));
-               KrateBuilder builder(user, buildKrateManifestPath(user.getName()));
-               builder.mountOwnFilesystem();
-       } catch (runtime::Exception& e) {
-               std::cerr << "krate error : " << e.what() << std::endl << std::flush;
-               return -1;
-       }
-       std::cout << "krate postprocess completed!" << std::endl << std::flush;
-       std::cout << "kraterized!" << std::endl << std::flush;
-       return 0;
-}
-
 PAM_EXTERN  __attribute__((visibility("default")))
 int pam_sm_open_session(pam_handle_t* pamh, int flags, int argc, const char* argv[])
 {
        try {
                runtime::User user(getKrateName(pamh));
-               KrateGuard krateGuard(user.getName());
-               krateGuard.wait();
-
-               auto sessionBuilder = [](const runtime::User& user) {
-                       KrateBuilder builder(user, buildKrateManifestPath(user.getName()));
-                       builder.unshareNamespace();
-                       builder.mountOwnFilesystem();
-               };
-               createSession(user, sessionBuilder);
+
+               KrateBuilder builder(user);
+               builder.enterKrate();
+
+               if (user.getUid() >= KRATE_UID_MIN && user.getUid() <= KRATE_UID_MAX ) {
+                       runtime::File flag(getFlagFilePath(user));
+                       if (!flag.exists())
+                               flag.create(0644);
+               }
        } catch (runtime::Exception& e) {
                ::pam_syslog(pamh, LOG_ERR, "%s", e.what());
                return PAM_SESSION_ERR;
@@ -162,10 +79,13 @@ int pam_sm_close_session(pam_handle_t* pamh, int flags, int argc, const char* ar
 {
        try {
                runtime::User user(getKrateName(pamh));
-               KrateGuard krateGuard(user.getName());
-               krateGuard.wait();
 
-               destroySession(user);
+               KrateBuilder builder(user);
+               builder.exitKrate();
+
+               runtime::File flag(getFlagFilePath(user));
+               if (flag.exists())
+                       flag.remove(false);
        } catch (runtime::Exception& e) {
                ::pam_syslog(pamh, LOG_ERR, "%s", e.what());
                return PAM_SESSION_ERR;