ScopeLogger();
const std::string& open_mode = args.get("openMode").get<std::string>();
- return std::string::npos != open_mode.find("w") || "a" == open_mode;
+ return "a" == open_mode || "rw" == open_mode || "rwo" == open_mode || "w" == open_mode;
}
bool ReadAccessRequested(const picojson::value& args) {
ScopeLogger();
const std::string& open_mode = args.get("openMode").get<std::string>();
- return std::string::npos != open_mode.find("r");
+ return "r" == open_mode || "rw" == open_mode || "rwo" == open_mode;
}
bool ShouldMakeParents(const picojson::value& args) {
return;
}
+ bool access_checked = false;
if (WriteAccessRequested(args)) {
CHECK_PRIVILEGE_ACCESS(kPrivilegeFilesystemWrite, &out);
+ access_checked = true;
}
if (ReadAccessRequested(args)) {
CHECK_PRIVILEGE_ACCESS(kPrivilegeFilesystemRead, &out);
+ access_checked = true;
+ }
+
+ // File open mode received from JS layer can be different than expected by
+ // WriteAccessRequested and ReadAccessRequested functions. In case like that
+ // privilege would not be checked and user could gain unauthorized access to file.
+ // To prevent this situation we only accept specific open modes.
+ if (false == access_checked) {
+ const std::string& open_mode = args.get("openMode").get<std::string>();
+ LogAndReportError(TypeMismatchException("Invalid open mode: " + open_mode), out);
+ return;
}
const std::string& path = args.get("path").get<std::string>();