fix: correctly check group permissions in unix (#428)
* fix: set modifiable when user in group * feat: add mode caching, fallback to previous, and better checking of permissions * fix: make is_modifiable check group permissions even if the user is owner of the directory * refactor: simplify group ID caching --------- Co-authored-by: Steven Arcangeli <stevearc@stevearc.com>
This commit is contained in:
parent
f6df58ad37
commit
65c53dbe4f
1 changed files with 25 additions and 7 deletions
|
|
@ -412,6 +412,26 @@ M.list = function(url, column_defs, cb)
|
||||||
end, 10000)
|
end, 10000)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@type nil|integer[]
|
||||||
|
local _group_ids
|
||||||
|
---@return integer[]
|
||||||
|
local function get_group_ids()
|
||||||
|
if not _group_ids then
|
||||||
|
local output = vim.fn.system({ "id", "-G" })
|
||||||
|
if vim.v.shell_error == 0 then
|
||||||
|
_group_ids = vim.tbl_map(tonumber, vim.split(output, "%s+", { trimempty = true }))
|
||||||
|
else
|
||||||
|
-- If the id command fails, fall back to just using the process group
|
||||||
|
_group_ids = { uv.getgid() }
|
||||||
|
vim.notify(
|
||||||
|
"[oil] missing the `id` command. Some directories may not be modifiable even if you have group access.",
|
||||||
|
vim.log.levels.WARN
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _group_ids
|
||||||
|
end
|
||||||
|
|
||||||
---@param bufnr integer
|
---@param bufnr integer
|
||||||
---@return boolean
|
---@return boolean
|
||||||
M.is_modifiable = function(bufnr)
|
M.is_modifiable = function(bufnr)
|
||||||
|
|
@ -433,14 +453,12 @@ M.is_modifiable = function(bufnr)
|
||||||
end
|
end
|
||||||
|
|
||||||
local uid = uv.getuid()
|
local uid = uv.getuid()
|
||||||
local gid = uv.getgid()
|
local rwx = stat.mode
|
||||||
local rwx
|
|
||||||
if uid == stat.uid then
|
if uid == stat.uid then
|
||||||
rwx = bit.rshift(stat.mode, 6)
|
rwx = bit.bor(rwx, bit.rshift(stat.mode, 6))
|
||||||
elseif gid == stat.gid then
|
end
|
||||||
rwx = bit.rshift(stat.mode, 3)
|
if vim.tbl_contains(get_group_ids(), stat.gid) then
|
||||||
else
|
rwx = bit.bor(rwx, bit.rshift(stat.mode, 3))
|
||||||
rwx = stat.mode
|
|
||||||
end
|
end
|
||||||
return bit.band(rwx, 2) ~= 0
|
return bit.band(rwx, 2) ~= 0
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue