aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2018-06-24 19:23:31 -0300
committerHisham Muhammad <hisham@gobolinux.org>2018-07-01 15:51:36 -0300
commitc9708d8eabf178f2fdea371a024045355ff00505 (patch)
tree3f57085c3716a6728d2c899f63280aff8b78117b /src
parentbd7da4f5a06fd9f417d9963d9fcbb074a6176ba2 (diff)
downloadluarocks-c9708d8eabf178f2fdea371a024045355ff00505.tar.gz
luarocks-c9708d8eabf178f2fdea371a024045355ff00505.tar.bz2
luarocks-c9708d8eabf178f2fdea371a024045355ff00505.zip
fs: add LuaPosix-version of set_permissions
This implemention the ugly side-effect of "exposing" some Unix-specific utility functions to the public API, so they can be shared by `luarocks.fs.lua` and `luarocks.fs.unix.tools`. I named those functions `_unix_*` (with a Python-style `_` at the beginning) to clarify that they should not be used publicly.
Diffstat (limited to 'src')
-rw-r--r--src/luarocks/fs/lua.lua46
-rw-r--r--src/luarocks/fs/unix.lua40
-rw-r--r--src/luarocks/fs/unix/tools.lua57
3 files changed, 92 insertions, 51 deletions
diff --git a/src/luarocks/fs/lua.lua b/src/luarocks/fs/lua.lua
index 37e1bffc..b5232a52 100644
--- a/src/luarocks/fs/lua.lua
+++ b/src/luarocks/fs/lua.lua
@@ -788,16 +788,46 @@ local octal_to_rwx = {
788 ["7"] = "rwx", 788 ["7"] = "rwx",
789} 789}
790 790
791function fs_lua.chmod(file, mode) 791do
792 -- LuaPosix (as of 5.1.15) does not support octal notation... 792 local umask_cache
793 if mode:sub(1,1) == "0" then 793 function fs_lua._unix_umask()
794 local new_mode = {} 794 if umask_cache then
795 for c in mode:sub(-3):gmatch(".") do 795 return umask_cache
796 table.insert(new_mode, octal_to_rwx[c]) 796 end
797 -- LuaPosix (as of 34.0.4) only returns the umask as rwx
798 local rwx = posix.umask()
799 local oct = 0
800 for i = 1, 9 do
801 if rwx:sub(10 - i, 10 - i) == "-" then
802 oct = oct + 2^i
803 end
797 end 804 end
798 mode = table.concat(new_mode) 805 umask_cache = ("%03o"):format(oct)
806 return umask_cache
807 end
808end
809
810function fs_lua.set_permissions(filename, mode, scope)
811 local perms
812 if mode == "read" and scope == "user" then
813 perms = fs._unix_moderate_permissions("600")
814 elseif mode == "exec" and scope == "user" then
815 perms = fs._unix_moderate_permissions("700")
816 elseif mode == "read" and scope == "all" then
817 perms = fs._unix_moderate_permissions("644")
818 elseif mode == "exec" and scope == "all" then
819 perms = fs._unix_moderate_permissions("755")
820 else
821 return false, "Invalid permission " .. mode .. " for " .. scope
822 end
823
824 -- LuaPosix (as of 5.1.15) does not support octal notation...
825 local new_perms = {}
826 for c in perms:sub(-3):gmatch(".") do
827 table.insert(new_perms, octal_to_rwx[c])
799 end 828 end
800 local err = posix.chmod(file, mode) 829 perms = table.concat(new_perms)
830 local err = posix.chmod(filename, perms)
801 return err == 0 831 return err == 0
802end 832end
803 833
diff --git a/src/luarocks/fs/unix.lua b/src/luarocks/fs/unix.lua
index dbe48cca..4ca68ce5 100644
--- a/src/luarocks/fs/unix.lua
+++ b/src/luarocks/fs/unix.lua
@@ -165,4 +165,44 @@ function unix.export_cmd(var, val)
165 return ("export %s='%s'"):format(var, val) 165 return ("export %s='%s'"):format(var, val)
166end 166end
167 167
168--- Moderate the given permissions based on the local umask
169-- @param perms string: permissions to moderate
170-- @return string: the moderated permissions
171function unix._unix_moderate_permissions(perms)
172 local octal_to_rwx = {
173 ["0"] = "---",
174 ["1"] = "--x",
175 ["2"] = "-w-",
176 ["3"] = "-wx",
177 ["4"] = "r--",
178 ["5"] = "r-x",
179 ["6"] = "rw-",
180 ["7"] = "rwx",
181 }
182 local rwx_to_octal = {}
183 for octal, rwx in pairs(octal_to_rwx) do
184 rwx_to_octal[rwx] = octal
185 end
186
187 local umask = fs._unix_umask()
188
189 local moderated_perms = ""
190 for i = 1, 3 do
191 local p_rwx = octal_to_rwx[perms:sub(i, i)]
192 local u_rwx = octal_to_rwx[umask:sub(i, i)]
193 local new_perm = ""
194 for j = 1, 3 do
195 local p_val = p_rwx:sub(j, j)
196 local u_val = u_rwx:sub(j, j)
197 if p_val == u_val then
198 new_perm = new_perm .. "-"
199 else
200 new_perm = new_perm .. p_val
201 end
202 end
203 moderated_perms = moderated_perms .. rwx_to_octal[new_perm]
204 end
205 return moderated_perms
206end
207
168return unix 208return unix
diff --git a/src/luarocks/fs/unix/tools.lua b/src/luarocks/fs/unix/tools.lua
index 06098399..e0b0d22a 100644
--- a/src/luarocks/fs/unix/tools.lua
+++ b/src/luarocks/fs/unix/tools.lua
@@ -160,47 +160,18 @@ function tools.is_file(file)
160 return fs.execute(vars.TEST, "-f", file) 160 return fs.execute(vars.TEST, "-f", file)
161end 161end
162 162
163--- Moderate the given permissions based on the local umask 163do
164-- @param perms string: permissions to moderate 164 local umask_cache
165-- @return string: the moderated permissions 165 function tools._unix_umask()
166local function moderate_permissions(perms) 166 if umask_cache then
167 local octal_to_rwx = { 167 return umask_cache
168 ["0"] = "---",
169 ["1"] = "--x",
170 ["2"] = "-w-",
171 ["3"] = "-wx",
172 ["4"] = "r--",
173 ["5"] = "r-x",
174 ["6"] = "rw-",
175 ["7"] = "rwx",
176 }
177 local rwx_to_octal = {}
178 for octal, rwx in pairs(octal_to_rwx) do
179 rwx_to_octal[rwx] = octal
180 end
181
182 local fd = assert(io.popen("umask"))
183 local umask = assert(fd:read("*a"))
184 umask = umask:gsub("\n", "")
185 umask = umask:sub(2, 4)
186
187 local moderated_perms = ""
188 for i = 1, 3 do
189 local p_rwx = octal_to_rwx[perms:sub(i, i)]
190 local u_rwx = octal_to_rwx[umask:sub(i, i)]
191 local new_perm = ""
192 for j = 1, 3 do
193 local p_val = p_rwx:sub(j, j)
194 local u_val = u_rwx:sub(j, j)
195 if p_val == u_val then
196 new_perm = new_perm .. "-"
197 else
198 new_perm = new_perm .. p_val
199 end
200 end 168 end
201 moderated_perms = moderated_perms .. rwx_to_octal[new_perm] 169 local fd = assert(io.popen("umask"))
170 local umask = assert(fd:read("*a"))
171 umask = umask:gsub("\n", "")
172 umask_cache = umask:sub(2, 4)
173 return umask_cache
202 end 174 end
203 return moderated_perms
204end 175end
205 176
206--- Set permissions for file or directory 177--- Set permissions for file or directory
@@ -214,13 +185,13 @@ function tools.set_permissions(filename, mode, scope)
214 185
215 local perms 186 local perms
216 if mode == "read" and scope == "user" then 187 if mode == "read" and scope == "user" then
217 perms = moderate_permissions("600") 188 perms = fs._unix_moderate_permissions("600")
218 elseif mode == "exec" and scope == "user" then 189 elseif mode == "exec" and scope == "user" then
219 perms = moderate_permissions("700") 190 perms = fs._unix_moderate_permissions("700")
220 elseif mode == "read" and scope == "all" then 191 elseif mode == "read" and scope == "all" then
221 perms = moderate_permissions("644") 192 perms = fs._unix_moderate_permissions("644")
222 elseif mode == "exec" and scope == "all" then 193 elseif mode == "exec" and scope == "all" then
223 perms = moderate_permissions("755") 194 perms = fs._unix_moderate_permissions("755")
224 else 195 else
225 return false, "Invalid permission " .. mode .. " for " .. scope 196 return false, "Invalid permission " .. mode .. " for " .. scope
226 end 197 end