summaryrefslogtreecommitdiffstats
path: root/freeradius3-model.lua
diff options
context:
space:
mode:
authorTed Trask <ttrask01@yahoo.com>2014-09-16 20:40:00 +0000
committerTed Trask <ttrask01@yahoo.com>2014-09-16 20:40:00 +0000
commit7d25635f278549eaac801f78e320e714fe61bf06 (patch)
tree085dcf3ca805e3f569cb4e5feadc999e687d1b10 /freeradius3-model.lua
parent674ea5218b182cb7ba2ba84e9e143f7cf1dd1862 (diff)
downloadacf-freeradius3-7d25635f278549eaac801f78e320e714fe61bf06.tar.bz2
acf-freeradius3-7d25635f278549eaac801f78e320e714fe61bf06.tar.xz
Modify passwd actions to detect readonly files and prevent modification
If you edit the file with editfile, the permissions will be changed to readwrite, making the file editable
Diffstat (limited to 'freeradius3-model.lua')
-rw-r--r--freeradius3-model.lua25
1 files changed, 23 insertions, 2 deletions
diff --git a/freeradius3-model.lua b/freeradius3-model.lua
index 4ec9037..83764c7 100644
--- a/freeradius3-model.lua
+++ b/freeradius3-model.lua
@@ -181,6 +181,8 @@ local get_passwd_file = function(self, clientdata, readonly)
if f == retval.value.filename.value then
retval.value.filename.errtxt = nil
if readonly then retval.value.filename.readonly = true end
+ local stat = posix.stat(retval.value.filename.value)
+ retval.value.mode = cfe({ label="Permissions", value=stat.mode, seq=2, readonly=true })
passwdconfig = parse_passwd_config(configs[i])
break
end
@@ -195,6 +197,11 @@ end
local get_passwd_entry_private = function(self, clientdata, create)
local retval,passwdconfig = get_passwd_file(self, clientdata, true)
retval.label = "Freeradius passwd entry"
+ if retval.value.mode and string.find(retval.value.mode.value, "^.%-") then
+ retval.value.filename.errtxt = "Readonly file"
+ return retval
+ end
+ retval.value.mode = nil
local entry = 0
local entryline = {}
if not create then
@@ -483,13 +490,18 @@ end
function mymodule.get_delete_passwd_entry(self, clientdata)
local retval,passwdconfig = get_passwd_file(self, clientdata)
retval.label = "Delete Freeradius passwd entry"
- retval.value.filename.key = nil
+ if retval.value.mode and string.find(retval.value.mode.value, "^.%-") then
+ retval.value.filename.errtxt = "Readonly file"
+ return retval
+ end
+ retval.value.mode = nil
retval.value.entry = cfe({ label="Entry index", seq=2 })
return retval
end
function mymodule.delete_passwd_entry(self, entry)
- local success = modelfunctions.validateselect(entry.value.filename)
+ local success = (nil ~= entry.value.entry)
+ success = modelfunctions.validateselect(entry.value.filename) and success
if success then
local contenttable = fs.read_file_as_array(entry.value.filename.value) or {}
if contenttable[tonumber(entry.value.entry.value) or 0] then
@@ -509,6 +521,11 @@ end
function mymodule.get_passwd(self, clientdata)
local retval,passwdconfig = get_passwd_file(self, clientdata, true)
retval.label = "Freeradius password"
+ if retval.value.mode and string.find(retval.value.mode.value, "^.%-") then
+ retval.value.filename.errtxt = "Readonly file"
+ return retval
+ end
+ retval.value.mode = nil
retval.value.entry = cfe({ label="Entry index", key=true, seq=2 })
self.handle_clientdata(retval, clientdata)
if passwdconfig then
@@ -559,6 +576,10 @@ function mymodule.get_passwd(self, clientdata)
end
function mymodule.update_passwd(self, passwd)
+ if not passwd.value.entry then
+ passwd.errtxt = "Failed to set password"
+ return passwd
+ end
-- The password/index fields have already been validated
if not passwd.value.password then
passwd.errtxt = "Invalid passwd entry"