Refactor ask_access() with ResourceType argument

This commit is contained in:
David Capello 2021-10-07 19:34:40 -03:00
parent 4cd137a639
commit b9241e6d91
8 changed files with 39 additions and 27 deletions

View File

@ -126,7 +126,7 @@ int AppFS_makeDirectory(lua_State* L)
return 1;
}
if (!ask_access(L, path, FileAccessMode::Write, true))
if (!ask_access(L, path, FileAccessMode::Full, ResourceType::File))
return luaL_error(L, "the script doesn't have access to create the directory '%s'", path);
try {
@ -148,7 +148,7 @@ int AppFS_makeAllDirectories(lua_State* L)
return 1;
}
if (!ask_access(L, path, FileAccessMode::Write, true))
if (!ask_access(L, path, FileAccessMode::Write, ResourceType::File))
return luaL_error(L, "the script doesn't have access to create all directories '%s'", path);
try {
@ -170,7 +170,7 @@ int AppFS_removeDirectory(lua_State* L)
return 1;
}
if (!ask_access(L, path, FileAccessMode::Write, true))
if (!ask_access(L, path, FileAccessMode::Write, ResourceType::File))
return luaL_error(L, "the script doesn't have access to remove the directory '%s'", path);
try {

View File

@ -58,7 +58,7 @@ int load_sprite_from_file(lua_State* L, const char* filename,
const LoadSpriteFromFileParam param)
{
std::string absFn = base::get_absolute_path(filename);
if (!ask_access(L, absFn.c_str(), FileAccessMode::Read, true))
if (!ask_access(L, absFn.c_str(), FileAccessMode::Read, ResourceType::File))
return luaL_error(L, "script doesn't have access to open file %s",
absFn.c_str());

View File

@ -58,13 +58,6 @@ namespace app {
namespace script {
enum class FileAccessMode {
Execute = 1,
Write = 2,
Read = 4,
Full = 7
};
class EngineDelegate {
public:
virtual ~EngineDelegate() { }

View File

@ -367,7 +367,7 @@ int Image_saveAs(lua_State* L)
return luaL_error(L, "missing filename in Image:saveAs()");
std::string absFn = base::get_absolute_path(fn);
if (!ask_access(L, absFn.c_str(), FileAccessMode::Write, true))
if (!ask_access(L, absFn.c_str(), FileAccessMode::Write, ResourceType::File))
return luaL_error(L, "script doesn't have access to write file %s",
absFn.c_str());

View File

@ -76,7 +76,7 @@ int Palette_new(lua_State* L)
std::string absFn = base::get_absolute_path(fromFile);
lua_pop(L, 1);
if (!ask_access(L, absFn.c_str(), FileAccessMode::Read, true))
if (!ask_access(L, absFn.c_str(), FileAccessMode::Read, ResourceType::File))
return luaL_error(L, "script doesn't have access to open file %s",
absFn.c_str());
@ -105,7 +105,7 @@ int Palette_new(lua_State* L)
if (!idAndPaths[id].empty()) {
std::string absFn = base::get_absolute_path(idAndPaths[id]);
if (!ask_access(L, absFn.c_str(), FileAccessMode::Read, true))
if (!ask_access(L, absFn.c_str(), FileAccessMode::Read, ResourceType::File))
return luaL_error(L, "script doesn't have access to open file %s",
absFn.c_str());
@ -240,7 +240,7 @@ int Palette_saveAs(lua_State* L)
const char* fn = luaL_checkstring(L, 2);
if (fn) {
std::string absFn = base::get_absolute_path(fn);
if (!ask_access(L, absFn.c_str(), FileAccessMode::Write, true))
if (!ask_access(L, absFn.c_str(), FileAccessMode::Write, ResourceType::File))
return luaL_error(L, "script doesn't have access to write file %s",
absFn.c_str());
save_palette(absFn.c_str(), pal, pal->size());

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2019 Igara Studio S.A.
// Copyright (C) 2019-2021 Igara Studio S.A.
// Copyright (C) 2018 David Capello
//
// This program is distributed under the terms of
@ -81,7 +81,7 @@ int secure_io_open(lua_State* L)
mode = FileAccessMode::Write;
}
if (!ask_access(L, absFilename.c_str(), mode, true)) {
if (!ask_access(L, absFilename.c_str(), mode, ResourceType::File)) {
return luaL_error(L, "the script doesn't have access to file '%s'",
absFilename.c_str());
}
@ -101,7 +101,7 @@ int secure_os_execute(lua_State* L)
return 0;
const char* cmd = lua_tostring(L, 1);
if (!ask_access(L, cmd, FileAccessMode::Execute, false)) {
if (!ask_access(L, cmd, FileAccessMode::Execute, ResourceType::Command)) {
// Stop script
return luaL_error(L, "the script doesn't have access to execute the command: '%s'",
cmd);
@ -117,7 +117,7 @@ int secure_os_execute(lua_State* L)
bool ask_access(lua_State* L,
const char* filename,
const FileAccessMode mode,
const bool canOpenFile)
const ResourceType resourceType)
{
#ifdef ENABLE_UI
// Ask for permission to open the file
@ -144,10 +144,16 @@ bool ask_access(lua_State* L,
app::gen::ScriptAccess dlg;
dlg.script()->setText(script);
dlg.fileLabel()->setText(
canOpenFile ?
Strings::script_access_file_label():
Strings::script_access_command_label());
{
std::string label;
switch (resourceType) {
case ResourceType::File: label = Strings::script_access_file_label(); break;
case ResourceType::Command: label = Strings::script_access_command_label(); break;
}
dlg.fileLabel()->setText(label);
}
dlg.file()->setText(filename);
dlg.allow()->setText(allowButtonText);
dlg.allow()->processMnemonicFromText();
@ -174,7 +180,7 @@ bool ask_access(lua_State* L,
}
});
if (canOpenFile) {
if (resourceType == ResourceType::File) {
dlg.file()->Click.connect(
[&dlg]{
std::string fn = dlg.file()->text();

View File

@ -1,4 +1,5 @@
// Aseprite
// Copyright (C) 2021 Igara Studio S.A.
// Copyright (C) 2018 David Capello
//
// This program is distributed under the terms of
@ -17,13 +18,25 @@
namespace app {
namespace script {
enum class FileAccessMode {
Execute = 1,
Write = 2,
Read = 4,
Full = 7,
};
enum class ResourceType {
File,
Command,
};
int secure_io_open(lua_State* L);
int secure_os_execute(lua_State* L);
bool ask_access(lua_State* L,
const char* filename,
const FileAccessMode mode,
const bool canOpenFile);
const ResourceType resourceType);
} // namespace script
} // namespace app

View File

@ -208,7 +208,7 @@ int Sprite_saveAs_base(lua_State* L, std::string& absFn)
appCtx->setActiveDocument(doc);
absFn = base::get_absolute_path(fn);
if (!ask_access(L, absFn.c_str(), FileAccessMode::Write, true))
if (!ask_access(L, absFn.c_str(), FileAccessMode::Write, ResourceType::File))
return luaL_error(L, "script doesn't have access to write file %s",
absFn.c_str());
@ -267,7 +267,7 @@ int Sprite_loadPalette(lua_State* L)
const char* fn = luaL_checkstring(L, 2);
if (fn && sprite) {
std::string absFn = base::get_absolute_path(fn);
if (!ask_access(L, absFn.c_str(), FileAccessMode::Read, true))
if (!ask_access(L, absFn.c_str(), FileAccessMode::Read, ResourceType::File))
return luaL_error(L, "script doesn't have access to open file %s",
absFn.c_str());