Extension operations added to CLI tool 69/128569/14 submit/tizen/20170725.065700
authorLukasz Pawelczyk <l.pawelczyk@samsung.com>
Tue, 9 May 2017 16:07:22 +0000 (18:07 +0200)
committerLukasz Pawelczyk <l.pawelczyk@samsung.com>
Tue, 30 May 2017 09:47:12 +0000 (11:47 +0200)
Change-Id: Ic4ab188fd31508ed5dcd2ddc7bb85c7cff2892c6

tools/cli/ode-admin-cli.cpp

index b73de8a..0487c41 100644 (file)
@@ -31,6 +31,7 @@
 #include <ode/secure-erase.h>
 #include <ode/internal-encryption.h>
 #include <ode/external-encryption.h>
+#include <ode/extension-encryption.h>
 
 extern char** environ;
 
@@ -39,16 +40,17 @@ static inline int usage(const std::string name)
        std::cout << "Usage: " << name << " [Option]" << std::endl
                          << std::endl
                          << "Options :" << std::endl
-                         << "   -m, --mount=internal|external    mount" << std::endl
-                         << "   -u, --umount=internal|external   umount" << std::endl
-                         << "   -e, --encrypt=internal|external  encrypt" << std::endl
-                         << "   -d, --decrypt=internal|external  decrypt" << std::endl
-                         << "   -p, --changepw=internal|external change password" << std::endl
-                         << "   -s, --state=internal|external    get state" << std::endl
-                         << "   -w, --waitmnt=internal|external  wait for mount"<< std::endl
-                         << "   -r, --erase=FILE|DIRECTORY       secure-erase" << std::endl
-                         << "   -c, --clean=DIRECTORY            secure-clean" << std::endl
-                         << "   -h, --help                       show this" << std::endl
+                         << "   -m, --mount=internal|external|extension    mount" << std::endl
+                         << "   -u, --umount=internal|external|extension   umount" << std::endl
+                         << "   -e, --encrypt=internal|external            encrypt" << std::endl
+                         << "   -d, --decrypt=internal|external            decrypt" << std::endl
+                         << "   -f, --format=extension                     format and setup encryption" << std::endl
+                         << "   -p, --changepw=internal|external|extension change password" << std::endl
+                         << "   -s, --state=internal|external|extension    get state" << std::endl
+                         << "   -w, --waitmnt=internal|external|extension  wait for mount"<< std::endl
+                         << "   -r, --erase=FILE|DIRECTORY                 secure-erase" << std::endl
+                         << "   -c, --clean=DIRECTORY                      secure-clean" << std::endl
+                         << "   -h, --help                                 show this" << std::endl
                          << std::endl;
 
        return -1;
@@ -74,10 +76,33 @@ static inline std::string getPassword() {
        return password;
 }
 
-static inline void printSelectableStorage()
+static inline void printSelectableStorage(bool internal = true,
+                                          bool external = true,
+                                          bool extension = true)
 {
-       std::cerr << "Just choose one among followings :" << std::endl
-                         << "internal, external" << std::endl;
+       bool firstDone = false;
+       std::cerr << "Just choose one among followings :" << std::endl;
+
+       if (internal) {
+               std::cerr << "internal";
+               firstDone = true;
+       }
+       if (external) {
+               if (firstDone) {
+                       std::cerr << ", ";
+               }
+               std::cerr << "external";
+               firstDone = true;
+       }
+       if (extension) {
+               if (firstDone) {
+                       std::cerr << ", ";
+               }
+               std::cerr << "extension";
+               firstDone = true;
+       }
+
+       std::cerr << std::endl;
 }
 
 static inline int mount(const std::string name)
@@ -100,6 +125,9 @@ static inline int mount(const std::string name)
                } else {
                        std::cerr << "Password setting failed" << std::endl;
                }
+       } else if (name == "extension") {
+               std::string password = getPassword();
+               ret = ode_extension_encryption_mount(password.c_str());
        } else {
                printSelectableStorage();
                return -1;
@@ -120,6 +148,8 @@ static inline int umount(const std::string name)
                ret = ode_internal_encryption_umount();
        } else if (name == "external") {
                ret = ode_external_encryption_umount();
+       } else if (name == "extension") {
+               ret = ode_extension_encryption_umount();
        } else {
                printSelectableStorage();
                return -1;
@@ -208,7 +238,7 @@ static inline int encrypt_storage(const std::string name)
                }
                ret = ode_external_encryption_encrypt(password.c_str(), options);
        } else {
-               printSelectableStorage();
+               printSelectableStorage(true, true, false);
                return -1;
        }
 
@@ -236,7 +266,45 @@ static inline int decrypt_storage(const std::string name)
                        ode_external_encryption_clean_password(password.c_str());
                }
        } else {
-               printSelectableStorage();
+               printSelectableStorage(true, true, false);
+               return -1;
+       }
+
+       if (ret != 0) {
+               std::cerr << "Error : " << ret <<std::endl;
+       }
+
+       return ret;
+}
+
+
+static inline int format_storage(const std::string name)
+{
+       int ret;
+
+       if (name == "extension") {
+               bool result = false;
+               ode_extension_encryption_is_password_initialized(&result);
+
+               if (!result) {
+                       std::cout << "New ";
+                       std::string password = getPassword();
+                       ode_extension_encryption_init_password(password.c_str());
+               }
+
+               result = false;
+               std::cout << "Confirm ";
+               std::string password = getPassword();
+               ode_extension_encryption_verify_password(password.c_str(), &result);
+
+               if (!result) {
+                       std::cerr << "Confirm password doesn't match" << std::endl;
+                       return -1;
+               }
+
+               ret = ode_extension_encryption_format(password.c_str());
+       } else {
+               printSelectableStorage(false, false, true);
                return -1;
        }
 
@@ -261,6 +329,8 @@ static inline int change_password(const std::string name)
                ret = ode_internal_encryption_change_password(oldPW.c_str(), newPW.c_str());
        } else if (name == "external") {
                ret = ode_external_encryption_change_password(oldPW.c_str(), newPW.c_str());
+       } else if (name == "extension") {
+               ret = ode_extension_encryption_change_password(oldPW.c_str(), newPW.c_str());
        } else {
                printSelectableStorage();
                return -1;
@@ -281,6 +351,8 @@ static inline int get_state(const std::string name)
                ret = ode_internal_encryption_get_state(&state);
        } else if (name == "external") {
                ret = ode_external_encryption_get_state(&state);
+       } else if (name == "extension") {
+               ret = ode_extension_encryption_get_state(&state);
        } else {
                printSelectableStorage();
                return -1;
@@ -304,7 +376,6 @@ static inline int get_state(const std::string name)
        }
        std::cout << std::endl;
 
-
        return ret;
 }
 
@@ -325,6 +396,9 @@ static inline int wait_for_mount(const std::string name)
        } else if (name == "external") {
                std::cout << "Wait for external storage mount..." << std::endl;
                ret = ode_external_encryption_set_mount_event_cb(mount_event_cb, &mtx);
+       } else if (name == "extension") {
+               std::cout << "Wait for extension storage mount..." << std::endl;
+               ret = ode_extension_encryption_set_mount_event_cb(mount_event_cb, &mtx);
        } else {
                printSelectableStorage();
                return -1;
@@ -340,6 +414,7 @@ static inline int wait_for_mount(const std::string name)
 
        return ret;
 }
+
 static inline int erase(const std::string name)
 {
        int ret;
@@ -374,6 +449,7 @@ int main(int argc, char* argv[])
                {"umount", required_argument, 0, 'u'},
                {"encrypt", required_argument, 0, 'e'},
                {"decrypt", required_argument, 0, 'd'},
+               {"format", required_argument, 0, 'f'},
                {"state", required_argument, 0, 's'},
                {"waitmnt", required_argument, 0, 'w'},
                {"erase", required_argument, 0, 'r'},
@@ -386,7 +462,7 @@ int main(int argc, char* argv[])
                return EXIT_SUCCESS;
        }
 
-       while ((opt = getopt_long(argc, argv, "m:u:e:d:p:s:w:r:c:h", options, &index)) != -1) {
+       while ((opt = getopt_long(argc, argv, "m:u:e:d:f:p:s:w:r:c:h", options, &index)) != -1) {
                switch (opt) {
                case 'm':
                        ret = mount(optarg);
@@ -400,6 +476,9 @@ int main(int argc, char* argv[])
                case 'd':
                        ret = decrypt_storage(optarg);
                        break;
+               case 'f':
+                       ret = format_storage(optarg);
+                       break;
                case 'p':
                        ret = change_password(optarg);
                        break;