From 78d40e304be182b7e07be449ebda668b8b9d0fcd Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Mon, 4 Mar 2024 12:17:56 -0300 Subject: fix: check permissions before trying to lock This should provide a better error message. --- spec/quick/build.q | 76 +++++++++++++++++++++++++++++------------- src/luarocks/cmd.lua | 5 +++ src/luarocks/cmd/build.lua | 6 ---- src/luarocks/cmd/install.lua | 4 --- src/luarocks/cmd/make.lua | 6 +--- src/luarocks/cmd/purge.lua | 5 --- src/luarocks/cmd/remove.lua | 7 +--- src/luarocks/fs/unix/tools.lua | 2 +- 8 files changed, 60 insertions(+), 51 deletions(-) diff --git a/spec/quick/build.q b/spec/quick/build.q index 55bb7519..7cbc526b 100644 --- a/spec/quick/build.q +++ b/spec/quick/build.q @@ -79,11 +79,16 @@ a_rock 1.0 ================================================================================ TEST: fails if no permissions to access the specified tree #unix -RUN: luarocks build --tree=/usr ./a_rock-1.0.1-rockspec -EXIT: 4 +RUN: luarocks build --tree=/usr ./a_rock-1.0-1.rockspec +EXIT: 2 STDERR: -------------------------------------------------------------------------------- -requires exclusive write access +You may want to run as a privileged user, +or use --local to install into your local tree +or run 'luarocks config local_by_default true' to make --local the default. + +(You may need to configure your Lua package paths +to use the local tree, see 'luarocks path --help') -------------------------------------------------------------------------------- We show the OS permission denied error, so we don't show the --force-lock @@ -96,33 +101,66 @@ try --force-lock NOT_EXISTS: %{testing_sys_rocks}/a_rock/1.0-1/a_rock-1.0-1.rockspec -RUN: luarocks build --tree=/usr ./a_rock-1.0.1-rockspec --force-lock -EXIT: 4 -STDERR: + + +================================================================================ +TEST: fails if tree is locked, --force-lock overrides #unix + +FILE: a_rock-1.0-1.rockspec -------------------------------------------------------------------------------- -requires exclusive write access +rockspec_format = "3.0" +package = "a_rock" +version = "1.0-1" +source = { + url = "file://%{url(%{fixtures_dir})}/a_rock.lua" +} +description = { + summary = "An example rockspec", +} +dependencies = { + "lua >= 5.1" +} +build = { + modules = { + build = "a_rock.lua" + }, +} -------------------------------------------------------------------------------- -We show the OS permission denied error, so we don't show the --force-lock -message. +FILE: %{testing_tree}/lockfile.lfs +-------------------------------------------------------------------------------- +dummy lock file for testing +-------------------------------------------------------------------------------- -NOT_STDERR: +RUN: luarocks build --tree=%{testing_tree} ./a_rock-1.0-1.rockspec +EXIT: 4 +STDERR: -------------------------------------------------------------------------------- +requires exclusive write access try --force-lock -------------------------------------------------------------------------------- -NOT_EXISTS: %{testing_sys_rocks}/a_rock/1.0-1/a_rock-1.0-1.rockspec +RUN: luarocks build --tree=%{testing_tree} ./a_rock-1.0-1.rockspec --force-lock +EXIT: 0 ================================================================================ TEST: fails if no permissions to access the parent #unix -RUN: luarocks build --tree=/usr/invalid ./a_rock-1.0.1-rockspec -EXIT: 4 +RUN: luarocks build --tree=/usr/invalid ./a_rock-1.0-1.rockspec +EXIT: 2 STDERR: -------------------------------------------------------------------------------- -requires exclusive write access +Error: /usr/invalid/lib/luarocks/rocks-%{lua_version} does not exist +and your user does not have write permissions in /usr + +You may want to run as a privileged user, +or use --local to install into your local tree +or run 'luarocks config local_by_default true' to make --local the default. + +(You may need to configure your Lua package paths +to use the local tree, see 'luarocks path --help') -------------------------------------------------------------------------------- We show the OS permission denied error, so we don't show the --force-lock @@ -135,16 +173,6 @@ try --force-lock NOT_EXISTS: %{testing_sys_rocks}/a_rock/1.0-1/a_rock-1.0-1.rockspec -RUN: luarocks build --tree=/usr/invalid ./a_rock-1.0.1-rockspec --force-lock -EXIT: 4 -STDERR: --------------------------------------------------------------------------------- -requires exclusive write access -failed to force the lock --------------------------------------------------------------------------------- - -NOT_EXISTS: %{testing_sys_rocks}/a_rock/1.0-1/a_rock-1.0-1.rockspec - ================================================================================ diff --git a/src/luarocks/cmd.lua b/src/luarocks/cmd.lua index b6d0d47e..6085fc9d 100644 --- a/src/luarocks/cmd.lua +++ b/src/luarocks/cmd.lua @@ -730,6 +730,11 @@ function cmd.run_command(description, commands, external_namespace, ...) local lock if cmd_mod.needs_lock and cmd_mod.needs_lock(args) then + local ok, err = fs.check_command_permissions(args) + if not ok then + die(err, cmd.errorcodes.PERMISSIONDENIED) + end + lock, err = fs.lock_access(path.root_dir(cfg.root_dir), args.force_lock) if not lock then err = args.force_lock diff --git a/src/luarocks/cmd/build.lua b/src/luarocks/cmd/build.lua index 710c89f2..ada6b7d2 100644 --- a/src/luarocks/cmd/build.lua +++ b/src/luarocks/cmd/build.lua @@ -15,7 +15,6 @@ local build = require("luarocks.build") local writer = require("luarocks.manif.writer") local search = require("luarocks.search") local make = require("luarocks.cmd.make") -local cmd = require("luarocks.cmd") local repos = require("luarocks.repos") function cmd_build.add_to_parser(parser) @@ -156,11 +155,6 @@ function cmd_build.command(args) end) end - local ok, err = fs.check_command_permissions(args) - if not ok then - return nil, err, cmd.errorcodes.PERMISSIONDENIED - end - local name, version, skip = do_build(args.rock, args.namespace, args.version, opts) if not name then return nil, version diff --git a/src/luarocks/cmd/install.lua b/src/luarocks/cmd/install.lua index a6dddd2b..e71b6db8 100644 --- a/src/luarocks/cmd/install.lua +++ b/src/luarocks/cmd/install.lua @@ -13,7 +13,6 @@ local remove = require("luarocks.remove") local search = require("luarocks.search") local queries = require("luarocks.queries") local cfg = require("luarocks.core.cfg") -local cmd = require("luarocks.cmd") function install.add_to_parser(parser) local cmd = parser:command("install", "Install a rock.", util.see_also()) -- luacheck: ignore 431 @@ -226,9 +225,6 @@ end -- @return boolean or (nil, string, exitcode): True if installation was -- successful, nil and an error message otherwise. exitcode is optionally returned. function install.command(args) - local ok, err = fs.check_command_permissions(args) - if not ok then return nil, err, cmd.errorcodes.PERMISSIONDENIED end - if args.rock:match("%.rockspec$") or args.rock:match("%.src%.rock$") then local build = require("luarocks.cmd.build") return build.command(args) diff --git a/src/luarocks/cmd/make.lua b/src/luarocks/cmd/make.lua index ef794b91..eaa4b899 100644 --- a/src/luarocks/cmd/make.lua +++ b/src/luarocks/cmd/make.lua @@ -6,7 +6,6 @@ local make = {} local build = require("luarocks.build") -local fs = require("luarocks.fs") local util = require("luarocks.util") local cfg = require("luarocks.core.cfg") local fetch = require("luarocks.fetch") @@ -14,7 +13,6 @@ local pack = require("luarocks.pack") local remove = require("luarocks.remove") local deps = require("luarocks.deps") local writer = require("luarocks.manif.writer") -local cmd = require("luarocks.cmd") function make.cmd_options(parser) parser:flag("--no-install", "Do not install the rock.") @@ -126,9 +124,7 @@ function make.command(args) return name, version end) else - local ok, err = fs.check_command_permissions(args) - if not ok then return nil, err, cmd.errorcodes.PERMISSIONDENIED end - ok, err = build.build_rockspec(rockspec, opts) + local ok, err = build.build_rockspec(rockspec, opts) if not ok then return nil, err end local name, version = ok, err -- luacheck: ignore 421 diff --git a/src/luarocks/cmd/purge.lua b/src/luarocks/cmd/purge.lua index 16d96531..30811ddf 100644 --- a/src/luarocks/cmd/purge.lua +++ b/src/luarocks/cmd/purge.lua @@ -4,7 +4,6 @@ local purge = {} local util = require("luarocks.util") -local fs = require("luarocks.fs") local path = require("luarocks.path") local search = require("luarocks.search") local vers = require("luarocks.core.vers") @@ -13,7 +12,6 @@ local writer = require("luarocks.manif.writer") local cfg = require("luarocks.core.cfg") local remove = require("luarocks.remove") local queries = require("luarocks.queries") -local cmd = require("luarocks.cmd") function purge.add_to_parser(parser) -- luacheck: push ignore 431 @@ -39,9 +37,6 @@ end function purge.command(args) local tree = args.tree - local ok, err = fs.check_command_permissions(args) - if not ok then return nil, err, cmd.errorcodes.PERMISSIONDENIED end - local results = {} search.local_manifest_search(results, path.rocks_dir(tree), queries.all()) diff --git a/src/luarocks/cmd/remove.lua b/src/luarocks/cmd/remove.lua index 91aa8914..8b11bcd3 100644 --- a/src/luarocks/cmd/remove.lua +++ b/src/luarocks/cmd/remove.lua @@ -6,13 +6,11 @@ local cmd_remove = {} local remove = require("luarocks.remove") local util = require("luarocks.util") local cfg = require("luarocks.core.cfg") -local fs = require("luarocks.fs") local search = require("luarocks.search") local path = require("luarocks.path") local deps = require("luarocks.deps") local writer = require("luarocks.manif.writer") local queries = require("luarocks.queries") -local cmd = require("luarocks.cmd") function cmd_remove.add_to_parser(parser) -- luacheck: push ignore 431 @@ -43,9 +41,6 @@ function cmd_remove.command(args) local name = args.rock local deps_mode = deps.get_deps_mode(args) - local ok, err = fs.check_command_permissions(args) - if not ok then return nil, err, cmd.errorcodes.PERMISSIONDENIED end - local rock_type = name:match("%.(rock)$") or name:match("%.(rockspec)$") local version = args.version local filename = name @@ -63,7 +58,7 @@ function cmd_remove.command(args) return nil, "Could not find rock '"..rock.."' in "..path.rocks_tree_to_string(cfg.root_dir) end - ok, err = remove.remove_search_results(results, name, deps_mode, args.force, args.force_fast) + local ok, err = remove.remove_search_results(results, name, deps_mode, args.force, args.force_fast) if not ok then return nil, err end diff --git a/src/luarocks/fs/unix/tools.lua b/src/luarocks/fs/unix/tools.lua index a0fba784..16b31335 100644 --- a/src/luarocks/fs/unix/tools.lua +++ b/src/luarocks/fs/unix/tools.lua @@ -338,7 +338,7 @@ function tools.lock_access(dirname, force) fd:close() - local lockfile = dir.path(dirname, "lockfile.luarocks") + local lockfile = dir.path(dirname, "lockfile.lfs") local force_flag = force and " -f" or "" -- cgit v1.2.3-55-g6feb