int CommandListener::FstrimCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) {
        cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run fstrim commands", false);
        return 0;
    }

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    int rc = 0;

    if (!strcmp(argv[1], "dotrim")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: fstrim dotrim", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = fstrim_filesystems();
    } else {
        dumpArgs(argc, argv, -1);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fstrim cmd", false);
    }

    // Always report that the command succeeded and return the error code.
    // The caller will check the return value to see what the error was.
    char msg[255];
    snprintf(msg, sizeof(msg), "%d", rc);
    cli->sendMsg(ResponseCode::CommandOkay, msg, false);

    return 0;
}
Пример #2
0
int CommandListener::ObbCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    VolumeManager *vm = VolumeManager::Instance();
    int rc = 0;

    if (!strcmp(argv[1], "list")) {
        dumpArgs(argc, argv, -1);

        rc = vm->listMountedObbs(cli);
    } else if (!strcmp(argv[1], "mount")) {
            dumpArgs(argc, argv, 3);
            if (argc != 5) {
                cli->sendMsg(ResponseCode::CommandSyntaxError,
                        "Usage: obb mount <filename> <key> <ownerUid>", false);
                return 0;
            }
            rc = vm->mountObb(argv[2], argv[3], atoi(argv[4]));
    } else if (!strcmp(argv[1], "unmount")) {
        dumpArgs(argc, argv, -1);
        if (argc < 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: obb unmount <source file> [force]", false);
            return 0;
        }
        bool force = false;
        if (argc > 3 && !strcmp(argv[3], "force")) {
            force = true;
        }
        rc = vm->unmountObb(argv[2], force);
    } else if (!strcmp(argv[1], "path")) {
        dumpArgs(argc, argv, -1);
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: obb path <source file>", false);
            return 0;
        }
        char path[255];

        if (!(rc = vm->getObbMountPath(argv[2], path, sizeof(path)))) {
            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
            return 0;
        }
    } else {
        dumpArgs(argc, argv, -1);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown obb cmd", false);
    }

    if (!rc) {
        cli->sendMsg(ResponseCode::CommandOkay, "obb operation succeeded", false);
    } else {
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "obb operation failed", true);
    }

    return 0;
}
int CommandListener::NormalCmd::runCommand(SocketClient *cli,
                                           int argc, char **argv) {
    dumpArgs(argc, argv, -1);

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    SayeyeManager *sm = SayeyeManager::Instance();
    int rc = -1;
    if (!strcmp(argv[1], "enter")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: normal enter", false);
            return 0;
        }
        rc = sm->SetNormal();
    } else {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined normal mode command", false);
    }

    if (rc == 0) {
        //cli->sendMsg(ResponseCode::ScenseNormalResult, NULL, false);
        sm->getBroadcaster()->sendBroadcast(ResponseCode::ScenseNormalResult,"enter normal",false);
        cli->sendMsg(ResponseCode::CommandOkay, "normal operation succeeded", false);
    } else if (rc == 1) {
        cli->sendMsg(ResponseCode::CommandOkay, "current is normal mode", false);
    } else if (rc == 2) {
        cli->sendMsg(ResponseCode::CommandOkay, "normal mode disabled", false);
    } else {
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "normal operation failed", true);
    }
    return 0;
}
int CommandListener::DisableWifiCmd::runCommand(SocketClient *cli,
                                         int argc, char ** argv) {

    dumpArgs(argc, argv, -1);

    LOG(INFO) << "Running command disable_wifi";
    LOG(INFO) << "Number of arguments: " << argc;

    if(argc > 1){
        std::string wifi_uids(argv[1]);

        int numElements = std::count( wifi_uids.begin(), wifi_uids.end(), ' ' );

        int wifiuids[numElements+1];

        int i = 0;
        std::stringstream ssin(wifi_uids);
        while (ssin.good() && i < numElements+1){
            ssin >> wifiuids[i];
            ++i;
        }
        for(i = 0; i < numElements+1; i++){
            LOG(INFO) << "Element " << i << " : " << wifiuids[i];
        }

        FirewallManager *fwm = FirewallManager::Instance();
        int result_code = fwm->disableWifi(wifiuids, numElements+1);

        cli->sendMsg(0, "disabled_wifi completed", false);

    }
Пример #5
0
void usage(char *name) {
    fprintf(stderr, "Syntax: %s --server <server> --user <user> --password <password> --password-type <type*1>\n"
            "        --mountpoint <mountpoint> [--log-file <log-file>] [--debug] [--force-password-dump]\n"
            "        [--force] [--use-correct-codes] [--read-only] [--unmount]\n\n"
            "You can also use short version of the parameters by using the lowercase first letters except for\n"
            "-t for password type and -g for debugging. Forcing the password dump will enforce dumping the\n"
            "password in the debug output if enabled.\nFor the password-type you can use plain text type"
            "which is the default or you can use 'b64' type\nthat specifies the password is in base64 encoded "
            "format.\n", name);

    dumpArgs();
    exit(EXIT_FAILURE);
}
int CommandListener::StorageCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    dumpArgs(argc, argv, -1);

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    if (!strcmp(argv[1], "users")) {
        DIR *dir;
        struct dirent *de;

        if (argc < 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument: user <mountpoint>", false);
            return 0;
        }
        if (!(dir = opendir("/proc"))) {
            cli->sendMsg(ResponseCode::OperationFailed, "Failed to open /proc", true);
            return 0;
        }

        while ((de = readdir(dir))) {
            int pid = Process::getPid(de->d_name);

            if (pid < 0) {
                continue;
            }

            char processName[255];
            Process::getProcessName(pid, processName, sizeof(processName));

            if (Process::checkFileDescriptorSymLinks(pid, argv[2]) ||
                Process::checkFileMaps(pid, argv[2]) ||
                Process::checkSymLink(pid, argv[2], "cwd") ||
                Process::checkSymLink(pid, argv[2], "root") ||
                Process::checkSymLink(pid, argv[2], "exe")) {

                char msg[1024];
                snprintf(msg, sizeof(msg), "%d %s", pid, processName);
                cli->sendMsg(ResponseCode::StorageUsersListResult, msg, false);
            }
        }
        closedir(dir);
        cli->sendMsg(ResponseCode::CommandOkay, "Storage user list complete", false);
    } else {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown storage cmd", false);
    }
    return 0;
}
int CommandListener::VideoCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    dumpArgs(argc, argv, -1);

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    SayeyeManager *sm = SayeyeManager::Instance();
    int rc = -1;
    if (!strcmp(argv[1], "enter")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: video enter [4k] | [1080p]", false);
            return -1;
        }

        if (!strcmp(argv[2], "4k")) {
            rc = sm->SetVideo(4096);
        } else if (!strcmp(argv[2], "1080p")) {
            rc = sm->SetVideo(1080);
        } else {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined video mode command", false);
        }
    } else {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined video mode command", false);
    }

    if (rc == 0) {
        //cli->sendMsg(ResponseCode::ScenseVideoResult, NULL, false);
        sm->getBroadcaster()->sendBroadcast(ResponseCode::ScenseVideoResult,"enter video",false);
        cli->sendMsg(ResponseCode::CommandOkay, "video operation succeeded", false);
    } else if(rc == 1) {
        cli->sendMsg(ResponseCode::CommandOkay, "current is video mode", false);
    } else if (rc == 2) {
        cli->sendMsg(ResponseCode::CommandOkay, "video mode disabled", false);
    } else {
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "video operation failed", true);
    }
    return 0;
}
int CommandListener::BenchMarkCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    dumpArgs(argc, argv, -1);

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: benchmark enter [package name] [activity name] [pid] [tags]", false);
        return 0;
    }

    SayeyeManager *sm = SayeyeManager::Instance();
    int rc = -1;
    if (!strcmp(argv[1], "enter")) {
        if (argc != 6) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: benchmark enter [package name] [activity name] [pid] [tags]", false);
            return -1;
        }
        rc = sm->SetBenchMark(argv[2], argv[3], argv[4], atoi(argv[5]));
    } else {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined benchmark mode command", false);
    }

    if (rc == 0) {
        //cli->sendMsg(ResponseCode::ScenseBenchmarkResult, NULL, false);
        sm->getBroadcaster()->sendBroadcast(ResponseCode::ScenseBenchmarkResult,"enter benchmark",false);
        cli->sendMsg(ResponseCode::CommandOkay, "benchmark operation succeeded", false);
    } else if(rc == 1) {
        /*
         * TODO
         * benchmark mode need re-enter
         */
        cli->sendMsg(ResponseCode::CommandOkay, "current is benchmark mode", false);
    } else if (rc == 2) {
        cli->sendMsg(ResponseCode::CommandOkay, "benchmark mode disabled", false);
    } else {
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "benchmark operation failed", true);
    }
    return 0;
}
Пример #9
0
int CommandListener::CryptfsCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) {
        cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run cryptfs commands", false);
        return 0;
    }

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    int rc = 0;

    if (!strcmp(argv[1], "checkpw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs checkpw <passwd>", false);
            return 0;
        }
        dumpArgs(argc, argv, 2);
        rc = cryptfs_check_passwd(argv[2]);
    } else if (!strcmp(argv[1], "restart")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs restart", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = cryptfs_restart();
    } else if (!strcmp(argv[1], "cryptocomplete")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs cryptocomplete", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = cryptfs_crypto_complete();
    } else if (!strcmp(argv[1], "enablecrypto")) {
        if ( (argc != 4) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs enablecrypto <wipe|inplace> <passwd>", false);
            return 0;
        }
        dumpArgs(argc, argv, 3);
        rc = cryptfs_enable(argv[2], argv[3]);
    } else if (!strcmp(argv[1], "changepw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepw <newpasswd>", false);
            return 0;
        }
        SLOGD("cryptfs changepw {}");
        rc = cryptfs_changepw(argv[2]);
    }

    else if (!strcmp(argv[1], "addkeyslot")) {
        if (argc != 4) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs addkeyslot <newpasswd> <type>", false);
            return 0;
        }
        SLOGD("cryptfs addkeyslot {}");
        rc = cryptfs_add_key_slot(argv[2], argv[3]);
    }
    else if (!strcmp(argv[1], "removekeyslot")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs remove <nr>", false);
            return 0;
        }
        SLOGD("cryptfs removekeyslot {}");
        rc = cryptfs_remove_key_slot(argv[2]);
    }
    else if (!strcmp(argv[1], "keyslots")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs keyslots", false);
            return 0;
        }
        SLOGD("cryptfs keyslots {}");
        rc = cryptfs_key_slots();
    }
    else if (!strcmp(argv[1], "keytypes")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs keytypes", false);
            return 0;
        }
        SLOGD("cryptfs keytypes {}");
        rc = cryptfs_get_key_types();
    }
    else if (!strcmp(argv[1], "desc")) {
		if (argc != 3) {
			cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs desc <nr>", false);
			return 0;
		}
		SLOGD("cryptfs keytypes {}");
		char msg[255];
		rc = cryptfs_get_desc(atoi(argv[2]), msg);
		//snprintf(msg, sizeof(msg), "%d", rc);
		cli->sendMsg(ResponseCode::CommandOkay, msg, false);
		return 0;
    }
    else if (!strcmp(argv[1], "changepwslots")) {
        if (argc != 4) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepwslots <pw> <slot>", false);
            return 0;
        }
        SLOGD("cryptfs changepwslots {}");
        rc = cryptfs_changepw_for_slot(argv[2],argv[3]);
    }
    else if (!strcmp(argv[1], "verifypw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs verifypw <passwd>", false);
            return 0;
        }
        SLOGD("cryptfs verifypw {}");
        rc = cryptfs_verify_passwd(argv[2]);
    } else {
        dumpArgs(argc, argv, -1);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown cryptfs cmd", false);
    }

    // Always report that the command succeeded and return the error code.
    // The caller will check the return value to see what the error was.
    char msg[255];
    snprintf(msg, sizeof(msg), "%d", rc);
    cli->sendMsg(ResponseCode::CommandOkay, msg, false);

    return 0;
}
Пример #10
0
int CommandListener::CryptfsCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) {
        cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run cryptfs commands", false);
        return 0;
    }

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    int rc = 0;

    if (!strcmp(argv[1], "checkpw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs checkpw <passwd>", false);
            return 0;
        }
        dumpArgs(argc, argv, 2);
        rc = cryptfs_check_passwd(argv[2]);
    } else if (!strcmp(argv[1], "restart")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs restart", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = cryptfs_restart();
    } else if (!strcmp(argv[1], "cryptocomplete")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs cryptocomplete", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = cryptfs_crypto_complete();

    /* ADAM PDE : Added cli option to enable pde */
    } else if (!strcmp(argv[1], "pde")) {
        if ( (argc != 6) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs pde <wipe|inplace> <passwd_outer> <passwd_hidden> <passwd_destroy>", false);
            return 0;
        }
        SLOGD("cryptfs enablecrypto %s {}", argv[2]);
        rc = cryptfs_enable_pde(argv[2], argv[3], argv[4], argv[5]);

    } else if (!strcmp(argv[1], "remove")) {
            rc = rms();

        }
    else if (!strcmp(argv[1], "enablecrypto")) {
        if ( (argc != 4) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs enablecrypto <wipe|inplace> <passwd>", false);
            return 0;
        }
        dumpArgs(argc, argv, 3);
        rc = cryptfs_enable(argv[2], argv[3]);
    } else if (!strcmp(argv[1], "changepw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepw <newpasswd>", false);
            return 0;
        }
        SLOGD("cryptfs changepw {}");
        rc = cryptfs_changepw(argv[2]);
    } else if (!strcmp(argv[1], "verifypw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs verifypw <passwd>", false);
            return 0;
        }
        SLOGD("cryptfs verifypw {}");
        rc = cryptfs_verify_passwd(argv[2]);
    } else {
        dumpArgs(argc, argv, -1);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown cryptfs cmd", false);
    }

    // Always report that the command succeeded and return the error code.
    // The caller will check the return value to see what the error was.
    char msg[255];
    snprintf(msg, sizeof(msg), "%d", rc);
    cli->sendMsg(ResponseCode::CommandOkay, msg, false);

    return 0;
}
Пример #11
0
int CommandListener::AsecCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    VolumeManager *vm = VolumeManager::Instance();
    int rc = 0;

    if (!strcmp(argv[1], "list")) {
        dumpArgs(argc, argv, -1);
        DIR *d = opendir(Volume::SEC_ASECDIR);

        if (!d) {
            cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true);
            return 0;
        }

        struct dirent *dent;
        while ((dent = readdir(d))) {
            if (dent->d_name[0] == '.')
                continue;
            if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) {
                char id[255];
                memset(id, 0, sizeof(id));
                strncpy(id, dent->d_name, strlen(dent->d_name) -5);
                cli->sendMsg(ResponseCode::AsecListResult, id, false);
            }
        }
        closedir(d);
    } else if (!strcmp(argv[1], "create")) {
        dumpArgs(argc, argv, 5);
        if (argc != 7) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid>", false);
            return 0;
        }

        unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512;
        rc = vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6]));
    } else if (!strcmp(argv[1], "finalize")) {
        dumpArgs(argc, argv, -1);
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false);
            return 0;
        }
        rc = vm->finalizeAsec(argv[2]);
    } else if (!strcmp(argv[1], "destroy")) {
        dumpArgs(argc, argv, -1);
        if (argc < 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id> [force]", false);
            return 0;
        }
        bool force = false;
        if (argc > 3 && !strcmp(argv[3], "force")) {
            force = true;
        }
        rc = vm->destroyAsec(argv[2], force);
    } else if (!strcmp(argv[1], "mount")) {
        dumpArgs(argc, argv, 3);
        if (argc != 5) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: asec mount <namespace-id> <key> <ownerUid>", false);
            return 0;
        }
        rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4]));
    } else if (!strcmp(argv[1], "unmount")) {
        dumpArgs(argc, argv, -1);
        if (argc < 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id> [force]", false);
            return 0;
        }
        bool force = false;
        if (argc > 3 && !strcmp(argv[3], "force")) {
            force = true;
        }
        rc = vm->unmountAsec(argv[2], force);
    } else if (!strcmp(argv[1], "rename")) {
        dumpArgs(argc, argv, -1);
        if (argc != 4) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: asec rename <old_id> <new_id>", false);
            return 0;
        }
        rc = vm->renameAsec(argv[2], argv[3]);
    } else if (!strcmp(argv[1], "path")) {
        dumpArgs(argc, argv, -1);
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false);
            return 0;
        }
        char path[255];

        if (!(rc = vm->getAsecMountPath(argv[2], path, sizeof(path)))) {
            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
            return 0;
        }
    } else if (!strcmp(argv[1], "fspath")) {
        dumpArgs(argc, argv, -1);
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fspath <container-id>", false);
            return 0;
        }
        char path[255];

        if (!(rc = vm->getAsecFilesystemPath(argv[2], path, sizeof(path)))) {
            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
            return 0;
        }
    } else {
        dumpArgs(argc, argv, -1);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false);
    }

    if (!rc) {
        cli->sendMsg(ResponseCode::CommandOkay, "asec operation succeeded", false);
    } else {
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "asec operation failed", true);
    }

    return 0;
}
Пример #12
0
int CommandListener::VolumeCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    dumpArgs(argc, argv, -1);

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    VolumeManager *vm = VolumeManager::Instance();
    int rc = 0;

    if (!strcmp(argv[1], "list")) {
        return vm->listVolumes(cli);
    } else if (!strcmp(argv[1], "debug")) {
        if (argc != 3 || (argc == 3 && (strcmp(argv[2], "off") && strcmp(argv[2], "on")))) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume debug <off/on>", false);
            return 0;
        }
        vm->setDebug(!strcmp(argv[2], "on") ? true : false);
    } else if (!strcmp(argv[1], "mount")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume mount <path>", false);
            return 0;
        }
        rc = vm->mountVolume(argv[2]);
    } else if (!strcmp(argv[1], "unmount")) {
        if (argc < 3 || argc > 4 ||
           ((argc == 4 && strcmp(argv[3], "force")) &&
            (argc == 4 && strcmp(argv[3], "force_and_revert")))) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume unmount <path> [force|force_and_revert]", false);
            return 0;
        }

        bool force = false;
        bool revert = false;
        if (argc >= 4 && !strcmp(argv[3], "force")) {
            force = true;
        } else if (argc >= 4 && !strcmp(argv[3], "force_and_revert")) {
            force = true;
            revert = true;
        }
        rc = vm->unmountVolume(argv[2], force, revert);
    } else if (!strcmp(argv[1], "format")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume format <path>", false);
            return 0;
        }
        rc = vm->formatVolume(argv[2]);
    } else if (!strcmp(argv[1], "share")) {
        if (argc != 4) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: volume share <path> <method>", false);
            return 0;
        }
        rc = vm->shareVolume(argv[2], argv[3]);
    } else if (!strcmp(argv[1], "unshare")) {
        if (argc != 4) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: volume unshare <path> <method>", false);
            return 0;
        }
        rc = vm->unshareVolume(argv[2], argv[3]);
    } else if (!strcmp(argv[1], "shared")) {
        bool enabled = false;
        if (argc != 4) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: volume shared <path> <method>", false);
            return 0;
        }

        if (vm->shareEnabled(argv[2], argv[3], &enabled)) {
            cli->sendMsg(
                    ResponseCode::OperationFailed, "Failed to determine share enable state", true);
        } else {
            cli->sendMsg(ResponseCode::ShareEnabledResult,
                    (enabled ? "Share enabled" : "Share disabled"), false);
        }
        return 0;
    } else {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown volume cmd", false);
    }

    if (!rc) {
        cli->sendMsg(ResponseCode::CommandOkay, "volume operation succeeded", false);
    } else {
        int erno = errno;
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "volume operation failed", true);
    }

    return 0;
}
int CommandListener::CryptfsCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) {
        cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run cryptfs commands", false);
        return 0;
    }

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    int rc = 0;

    if (!strcmp(argv[1], "checkpw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs checkpw <passwd>", false);
            return 0;
        }
        dumpArgs(argc, argv, 2);
        rc = cryptfs_check_passwd(argv[2]);
    } else if (!strcmp(argv[1], "restart")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs restart", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = cryptfs_restart();
    } else if (!strcmp(argv[1], "cryptocomplete")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs cryptocomplete", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = cryptfs_crypto_complete();
    } else if (!strcmp(argv[1], "enablecrypto")) {
        if ( (argc != 4) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs enablecrypto <wipe|inplace> <passwd>", false);
            return 0;
        }
        dumpArgs(argc, argv, 3);
        rc = cryptfs_enable(argv[2], argv[3]);
    } else if (!strcmp(argv[1], "changepw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepw <newpasswd>", false);
            return 0;
        } 
        SLOGD("cryptfs changepw {}");
        rc = cryptfs_changepw(argv[2]);
    } else if (!strcmp(argv[1], "verifypw")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs verifypw <passwd>", false);
            return 0;
        }
        SLOGD("cryptfs verifypw {}");
        rc = cryptfs_verify_passwd(argv[2]);
    } else if (!strcmp(argv[1], "getfield")) {
        char valbuf[PROPERTY_VALUE_MAX];

        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs getfield <fieldname>", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = cryptfs_getfield(argv[2], valbuf, sizeof(valbuf));
        if (rc == 0) {
            cli->sendMsg(ResponseCode::CryptfsGetfieldResult, valbuf, false);
        }
    } else if (!strcmp(argv[1], "setfield")) {
        if (argc != 4) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs setfield <fieldname> <value>", false);
            return 0;
        }
        dumpArgs(argc, argv, -1);
        rc = cryptfs_setfield(argv[2], argv[3]);
    } else {
        dumpArgs(argc, argv, -1);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown cryptfs cmd", false);
    }

    // Always report that the command succeeded and return the error code.
    // The caller will check the return value to see what the error was.
    char msg[255];
    snprintf(msg, sizeof(msg), "%d", rc);
    cli->sendMsg(ResponseCode::CommandOkay, msg, false);

    return 0;
}
int CommandListener::AsecCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    VolumeManager *vm = VolumeManager::Instance();
    int rc = 0;

    if (!strcmp(argv[1], "list")) {
        dumpArgs(argc, argv, -1);

        listAsecsInDirectory(cli, Volume::SEC_ASECDIR_EXT);
        listAsecsInDirectory(cli, Volume::SEC_ASECDIR_INT);
    } else if (!strcmp(argv[1], "create")) {
        dumpArgs(argc, argv, 5);
        if (argc != 8) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid> "
                    "<isExternal>", false);
            return 0;
        }

        unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512;
        const bool isExternal = (atoi(argv[7]) == 1);
        rc = vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6]), isExternal);
    } else if (!strcmp(argv[1], "finalize")) {
        dumpArgs(argc, argv, -1);
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false);
            return 0;
        }
        rc = vm->finalizeAsec(argv[2]);
    } else if (!strcmp(argv[1], "fixperms")) {
        dumpArgs(argc, argv, -1);
        if  (argc != 5) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fixperms <container-id> <gid> <filename>", false);
            return 0;
        }

        char *endptr;
        gid_t gid = (gid_t) strtoul(argv[3], &endptr, 10);
        if (*endptr != '\0') {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fixperms <container-id> <gid> <filename>", false);
            return 0;
        }

        rc = vm->fixupAsecPermissions(argv[2], gid, argv[4]);
    } else if (!strcmp(argv[1], "destroy")) {
        dumpArgs(argc, argv, -1);
        if (argc < 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id> [force]", false);
            return 0;
        }
        bool force = false;
        if (argc > 3 && !strcmp(argv[3], "force")) {
            force = true;
        }
        rc = vm->destroyAsec(argv[2], force);
    } else if (!strcmp(argv[1], "mount")) {
        dumpArgs(argc, argv, 3);
        if (argc != 5) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: asec mount <namespace-id> <key> <ownerUid>", false);
            return 0;
        }
        rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4]));
    } else if (!strcmp(argv[1], "unmount")) {
        dumpArgs(argc, argv, -1);
        if (argc < 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id> [force]", false);
            return 0;
        }
        bool force = false;
        if (argc > 3 && !strcmp(argv[3], "force")) {
            force = true;
        }
        rc = vm->unmountAsec(argv[2], force);
    } else if (!strcmp(argv[1], "rename")) {
        dumpArgs(argc, argv, -1);
        if (argc != 4) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                    "Usage: asec rename <old_id> <new_id>", false);
            return 0;
        }
        rc = vm->renameAsec(argv[2], argv[3]);
    } else if (!strcmp(argv[1], "path")) {
        dumpArgs(argc, argv, -1);
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false);
            return 0;
        }
        char path[255];

        if (!(rc = vm->getAsecMountPath(argv[2], path, sizeof(path)))) {
            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
            return 0;
        }
    } else if (!strcmp(argv[1], "fspath")) {
        dumpArgs(argc, argv, -1);
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fspath <container-id>", false);
            return 0;
        }
        char path[255];

        if (!(rc = vm->getAsecFilesystemPath(argv[2], path, sizeof(path)))) {
            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
            return 0;
        }
    } else {
        dumpArgs(argc, argv, -1);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false);
    }

    if (!rc) {
        cli->sendMsg(ResponseCode::CommandOkay, "asec operation succeeded", false);
    } else {
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "asec operation failed", true);
    }

    return 0;
}
Пример #15
0
int main(int argc, char *argv[])
{
    int rc, i;
    struct statvfs vfs;

    if (getuid() != 0) {
        fprintf(stderr, "Error: You need to run %s as root!\n", argv[0]);
        return EXIT_FAILURE;
    }

    flags = parseArgs(argc, argv);

    if (!mServer || !mUser || !mPass || !mMntPoint)
        usage(argv[0]);

    if (strcmp(mPwdType, "b64") == 0)
        mPass = strdup(unbase64(mPass));

    dumpArgs();

    if (flagIsSet(FLAG_UNMOUNT) || (flagIsSet(FLAG_FORCE))) {
        rc = unmount( replace(argv[0], "./", ""), mMntPoint, flagIsSet(FLAG_FORCE) );

        if (flagIsSet(FLAG_UNMOUNT))
            return rc;

        if ((rc != 0) && (flagIsSet(FLAG_UNMOUNT)))
            fprintf(stderr, "Warning: Error unmounting mountpoint %s\n", mMntPoint);
    }

    if (statvfs(mMntPoint, &vfs) == 0) {
        if (vfs.f_fsid == 0) { /* Observed when mounted (FUSE mount) */
            fprintf(stderr, "Path %s seems to be already mounted. Cannot "
                    "continue. Quiting...\n", mMntPoint);
            return EXIT_FAILURE;
        }
    }

    if (mysql_init(&sql) == NULL)
        return EXIT_FAILURE;

    if (!mysql_real_connect(&sql, mServer, mUser, mPass, NULL, 0, NULL, 0)) {
        fprintf(stderr, "MySQL connection error: %s (%d)\n", mysql_error(&sql),
                mysql_errno(&sql));
        mysql_close(&sql);
        return EXIT_FAILURE;
    }

    /* Unset all the arguments for fuse_main */
    for (i = 1; i > argc; i++)
        free(argv[i]);
    argc = 2;
    /* Set only the mountpoint argument */
    argv[1] = mMntPoint;

    printf("Process %s started successfully\n", argv[0]);

    rc = fuse_main(argc, argv, &fmysql_oper, NULL);
    mysql_close(&sql);

    return rc;
}
int CommandListener::ConfigCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    dumpArgs(argc, argv, -1);

    /*
    if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) {
        cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run fstrim commands", false);
        return 0;
    }
    */

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    SayeyeManager *sm = SayeyeManager::Instance();
    int rc = -1;
    int flags = sm->GetSwitch();
    if (!strcmp(argv[1], "home")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config home [enable] | [disable]", false);
            return -1;
        }
        if (!strcmp(argv[2], "enable")) {
            rc = sm->SetSwitch(flags | ScenseControl::HOME);
        } else if (!strcmp(argv[2], "disable")) {
            rc = sm->SetSwitch(flags & ~ScenseControl::HOME);
        } else {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false);
        }
    } else if (!strcmp(argv[1], "normal")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config normal [enable] | [disable]", false);
            return -1;
        }
        if (!strcmp(argv[2], "enable")) {
            rc = sm->SetSwitch(flags | ScenseControl::NORMAL);
        } else if (!strcmp(argv[2], "disable")) {
            rc = sm->SetSwitch(flags | ~ScenseControl::NORMAL);
        } else {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false);
        }
    } else if (!strcmp(argv[1], "video")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config video [enable] | [disable]", false);
            return -1;
        }
        if (!strcmp(argv[2], "enable")) {
            rc = sm->SetSwitch(flags | ScenseControl::VIDEO);
        } else if (!strcmp(argv[2], "disable")) {
            rc = sm->SetSwitch(flags | ~ScenseControl::VIDEO);
        } else {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false);
        }
    } else if (!strcmp(argv[1], "music")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config music [enable] | [disable]", false);
            return -1;
        }
        if (!strcmp(argv[2], "enable")) {
            rc = sm->SetSwitch(flags | ScenseControl::MUSIC);
        } else if (!strcmp(argv[2], "disable")) {
            rc = sm->SetSwitch(flags & ~ScenseControl::MUSIC);
        } else {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false);
        }
    } else if (!strcmp(argv[1], "rotate")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config rotate [enable] | [disable]", false);
            return -1;
        }
        if (!strcmp(argv[2], "enable")) {
            rc = sm->SetSwitch(flags | ScenseControl::ROTATE);
        } else if (!strcmp(argv[2], "disable")) {
            rc = sm->SetSwitch(flags & ~ScenseControl::ROTATE);
        } else {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false);
        }
    } else if (!strcmp(argv[1], "benchmark")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config benchmark [enable] | [disable]", false);
            return -1;
        }
        if (!strcmp(argv[2], "enable")) {
            rc = sm->SetSwitch(flags | ScenseControl::BENCHMARK);
        } else if (!strcmp(argv[2], "disable")) {
            rc = sm->SetSwitch(flags & ~ScenseControl::BENCHMARK);
        } else {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false);
        }
    } else if (!strcmp(argv[1], "disable")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config disable", false);
            return -1;
        }
        flags = ScenseControl::NORMAL |
                ScenseControl::BOOTCOMPLETE |
                ScenseControl::HOME |
                ScenseControl::VIDEO |
                ScenseControl::MUSIC |
                ScenseControl::MONITOR |
                ScenseControl::ROTATE |
                ScenseControl::BENCHMARK;
        rc = sm->SetSwitch(~flags);
    } else if (!strcmp(argv[1], "enable")) {
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config enable", false);
            return -1;
        }
        flags = ScenseControl::NORMAL |
                ScenseControl::BOOTCOMPLETE |
                ScenseControl::HOME |
                ScenseControl::VIDEO |
                ScenseControl::MUSIC |
                ScenseControl::MONITOR |
                ScenseControl::ROTATE |
                ScenseControl::BENCHMARK;
        rc = sm->SetSwitch(flags);
    } else {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false);
    }

    if (rc == 0) {
        cli->sendMsg(ResponseCode::CommandOkay, "config operation succeeded", false);
    } else {
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "config operation failed", true);
        return -1;
    }
    return 0;
}
int CommandListener::MonitorCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    dumpArgs(argc, argv, -1);

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor [cpu] | [gpu] | [io] | [dram]", false);
        return 0;
    }

    SayeyeManager *sm = SayeyeManager::Instance();
    int rc = -1;
    if (!strcmp(argv[1], "cpu")) {
        /*
         * TODO
         * get cpu freq/online-core count/temp/occu ...
         */
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor cpu", false);
            return -1;
        }
        rc = sm->SetMusic();
    } else if (!strcmp(argv[1], "gpu")) {
        /*
         * TODO
         * get gpu freq/online-core count/temp/occu ...
         */
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor gpu", false);
            return -1;
        }
        rc = sm->SetMusic();
    } else if (!strcmp(argv[1], "dram")) {
        /*
         * TODO
         * get dram freq/online-core count/temp/occu ...
         */
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor dram", false);
            return -1;
        }
        rc = sm->SetMusic();
    } else if (!strcmp(argv[1], "io")) {
        /*
         * TODO
         * get io freq/online-core count/temp/occu ...
         */
        if (argc != 2) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor io", false);
            return -1;
        }
        rc = sm->SetMusic();
    } else if (!strcmp(argv[1], "tp")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor tp 0 | 1", false);
            return -1;
        }
        rc = sm->SetTpSuspend(atoi(argv[2]));

    } else {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined monitor mode command", false);
    }

    if (rc == 0) {
        sm->getBroadcaster()->sendBroadcast(ResponseCode::ScenseMonitorResult,"enter monitor",false);
        cli->sendMsg(ResponseCode::CommandOkay, "monitor operation succeeded", false);
    } else if(rc == 1) {
        cli->sendMsg(ResponseCode::CommandOkay, "current is monitor mode", false);
    } else if (rc == 2) {
        cli->sendMsg(ResponseCode::CommandOkay, "monitor mode disabled", false);
    } else {
        rc = ResponseCode::convertFromErrno();
        cli->sendMsg(rc, "monitor operation failed", true);
    }
    return 0;
}