summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Trask <ttrask01@yahoo.com>2009-11-17 17:52:35 +0000
committerTed Trask <ttrask01@yahoo.com>2009-11-17 17:52:35 +0000
commit7570528cc84eb88a606858bed7cba166074af92e (patch)
tree5758129922c55dfb0bea33cbb2c6156e73efaad6
parent5261ae2fa86ae090a2923b502646aa03c6a275a9 (diff)
downloadacf-kamailio-7570528cc84eb88a606858bed7cba166074af92e.tar.bz2
acf-kamailio-7570528cc84eb88a606858bed7cba166074af92e.tar.xz
Added ability to create/delete/update users (tested for postgres)
-rw-r--r--kamailio-controller.lua16
-rw-r--r--kamailio-createuser-html.lsp15
-rw-r--r--kamailio-listusers-html.lsp43
-rw-r--r--kamailio-model.lua107
l---------kamailio-updateuser-html.lsp1
-rw-r--r--kamailio.menu1
-rw-r--r--kamailio.roles5
7 files changed, 186 insertions, 2 deletions
diff --git a/kamailio-controller.lua b/kamailio-controller.lua
index 45a8fd7..a4bff67 100644
--- a/kamailio-controller.lua
+++ b/kamailio-controller.lua
@@ -20,3 +20,19 @@ end
function edit(self)
return controllerfunctions.handle_form(self, function() return self.model.get_filedetails(self.clientdata.filename) end, self.model.update_filedetails, self.clientdata, "Save", "Edit File", "File Saved")
end
+
+function listusers(self)
+ return self.model.list_users()
+end
+
+function createuser(self)
+ return controllerfunctions.handle_form(self, self.model.get_new_user, self.model.create_new_user, self.clientdata, "Create", "Create New User")
+end
+
+function deleteuser(self)
+ return self:redirect_to_referrer(self.model.delete_user(self.clientdata.username))
+end
+
+function updateuser(self)
+ return controllerfunctions.handle_form(self, function() return self.model.get_user(self.clientdata.username) end, self.model.update_user, self.clientdata, "Update", "Update User")
+end
diff --git a/kamailio-createuser-html.lsp b/kamailio-createuser-html.lsp
new file mode 100644
index 0000000..fb05750
--- /dev/null
+++ b/kamailio-createuser-html.lsp
@@ -0,0 +1,15 @@
+<% local form, viewlibrary, page_info = ...
+require("viewfunctions")
+%>
+
+<H1><%= html.html_escape(form.label) %></H1>
+<%
+ form.action = page_info.script .. page_info.prefix .. page_info.controller .. "/" .. page_info.action
+ form.value.password.type = "password"
+ form.value.password_confirm.type = "password"
+ if page_info.action == "updateuser" then
+ form.value.username.readonly = true
+ end
+ local order = {"username", "password", "password_confirm", "email_address"}
+ displayform(form, order)
+%>
diff --git a/kamailio-listusers-html.lsp b/kamailio-listusers-html.lsp
new file mode 100644
index 0000000..0c010c5
--- /dev/null
+++ b/kamailio-listusers-html.lsp
@@ -0,0 +1,43 @@
+<% local form, viewlibrary, page_info, session = ... %>
+<% require("viewfunctions") %>
+
+<% displaycommandresults({"deleteuser", "updateuser"}, session) %>
+<% displaycommandresults({"createuser"}, session, true) %>
+
+<H1><%= html.html_escape(form.label) %></H1>
+<DL>
+<TABLE>
+ <TR style="background:#eee;font-weight:bold;">
+ <% if session.permissions[page_info.controller].deleteuser or session.permissions[page_info.controller].updateuser then %>
+ <TD style="padding-right:20px;white-space:nowrap;" class="header">Action</TD>
+ <% end %>
+ <TD style="padding-right:20px;white-space:nowrap;" class="header">User Name</TD>
+ <TD style="white-space:nowrap;" class="header">Password</TD>
+ </TR>
+
+<% for i,user in ipairs(form.value) do %>
+ <TR>
+ <% if session.permissions[page_info.controller].deleteuser or session.permissions[page_info.controller].updateuser then %>
+ <TD style="padding-right:20px;white-space:nowrap;">
+ <% if session.permissions[page_info.controller].updateuser then %>
+ <%= html.link{value = "updateuser?username=" .. user.username.."&redir="..page_info.orig_action, label="Update "} %>
+ <% end %>
+ <% if session.permissions[page_info.controller].deleteuser then %>
+ <%= html.link{value = "deleteuser?username=" .. user.username, label="Delete "} %>
+ <% end %>
+ </TD>
+ <% end %>
+ <TD><%= html.html_escape(user.username) %></TD>
+ <% if session.permissions[page_info.controller].updateuser then %>
+ <TD><%= html.html_escape(user.password) %></TD>
+ <% else %>
+ <TD>******</TD>
+ <% end %>
+ </TR>
+<% end %>
+</TABLE>
+</DL>
+
+<% if viewlibrary and viewlibrary.dispatch_component and session.permissions[page_info.controller].createuser then
+ viewlibrary.dispatch_component("createuser")
+end %>
diff --git a/kamailio-model.lua b/kamailio-model.lua
index 4915787..e6262ba 100644
--- a/kamailio-model.lua
+++ b/kamailio-model.lua
@@ -20,6 +20,23 @@ local is_valid_filename = function(filename)
return validator.is_valid_filename(filename) and string.match(dirname, baseurl) and not string.match(dirname, "%.%.")
end
+local function validate_user(user)
+ local success = true
+ if user.value.username.value == "" then
+ user.value.username.errtxt = "Cannot be empty"
+ success = false
+ end
+ if user.value.password.value == "" then
+ user.value.password.errtxt = "Cannot be empty"
+ success = false
+ end
+ if user.value.password.value ~= user.value.password_confirm.value then
+ user.value.password_confirm.errtxt = "Must match password"
+ success = false
+ end
+ return success, user
+end
+
-- ################################################################################
-- PUBLIC FUNCTIONS
@@ -51,3 +68,93 @@ function list_files()
table.sort(retval, function(a,b) return a.filename < b.filename end)
return cfe({ type="structure", value=retval, label="List of Kamailio files" })
end
+
+function list_users()
+ -- Database format: id | username | domain | password | email_address | ha1 | ha1b | rpid
+ local cmd = path .. "kamctl db show subscriber"
+ local f = io.popen(cmd)
+ -- These settings work for Postgres database
+ local skiplines = 2
+ local delimiter = "%s*|%s*"
+ local results = {}
+ for line in f:lines() do
+ if skiplines > 0 then
+ skiplines = skiplines-1
+ else
+ local words = format.string_to_table(line, delimiter)
+ if #words > 1 then
+ local temp = {username = words[2],
+ --domain = words[3],
+ password = words[4],
+ --email_address = words[5]
+ }
+ results[#results+1] = temp
+ end
+ end
+ end
+ f:close()
+ table.sort(results, function(a,b) return a.username < b.username end)
+ return cfe({type="list", value=results, label="Kamailio Users"})
+end
+
+function get_new_user()
+ local user = {}
+ user.username = cfe({label="User Name"})
+ user.password = cfe({label="Password"})
+ user.password_confirm = cfe({label="Password (confirm)"})
+ --user.email_address = cfe({label="E-mail Address"})
+ return cfe({type="group", value=user, label="Kamailio User"})
+end
+
+function create_new_user(user)
+ local success = validate_user(user)
+ if success then
+ local cmd = path .. "kamctl add "..format.escapespecialcharacters(user.value.username.value).." "..format.escapespecialcharacters(user.value.password.value)
+ --if user.value.email_address.value ~= "" then
+ -- cmd = cmd.." "..format.escapespecialcharacters(user.value.email_address.value)
+ --end
+ local f = io.popen(cmd)
+ user.descr = f:read("*a")
+ f:close()
+ else
+ user.errtxt = "Failed to create new user"
+ end
+
+ return user
+end
+
+function delete_user(username)
+ local cmd = path .. "kamctl rm "..format.escapespecialcharacters(username)
+ local f = io.popen(cmd)
+ local result = f:read("*a")
+ f:close()
+ return cfe({value=result, label="Delete User Result"})
+end
+
+function get_user(username)
+ local user = get_new_user()
+ user.value.username.value = username
+ user.value.username.errtxt = "Invalid user"
+ local users = list_users()
+ for i,u in ipairs(users.value) do
+ if u.username == username then
+ user.value.username.errtxt = nil
+ break
+ end
+ end
+ return user
+end
+
+function update_user(user)
+ local success = validate_user(user)
+ if success then
+ local cmd = path .. "kamctl passwd "..format.escapespecialcharacters(user.value.username.value).." "..format.escapespecialcharacters(user.value.password.value)
+ local f = io.popen(cmd)
+ user.descr = f:read("*a")
+ f:close()
+ else
+ user.errtxt = "Failed to update user"
+ end
+
+ return user
+end
diff --git a/kamailio-updateuser-html.lsp b/kamailio-updateuser-html.lsp
new file mode 120000
index 0000000..cd878eb
--- /dev/null
+++ b/kamailio-updateuser-html.lsp
@@ -0,0 +1 @@
+kamailio-createuser-html.lsp \ No newline at end of file
diff --git a/kamailio.menu b/kamailio.menu
index f806819..607387f 100644
--- a/kamailio.menu
+++ b/kamailio.menu
@@ -1,4 +1,5 @@
# Prefix and controller are already known at this point
# Cat Group Tab Action
Applications 86Kamailio Status status
+Applications 86Kamailio Users listusers
Applications 86Kamailio Expert listfiles
diff --git a/kamailio.roles b/kamailio.roles
index b40dd8a..111828b 100644
--- a/kamailio.roles
+++ b/kamailio.roles
@@ -1,3 +1,4 @@
-USER=kamailio:status,kamailio:startstop
+USER=kamailio:status,kamailio:startstop,kamailio:listusers
+EDITOR=kamailio:createuser,kamailio:updateuser,kamailio:deleteuser
EXPERT=kamailio:listfiles,kamailio:edit
-ADMIN=kamailio:status,kamailio:startstop,kamailio:listfiles,kamailio:edit
+ADMIN=kamailio:status,kamailio:startstop,kamailio:listusers,kamailio:createuser,kamailio:updateuser,kamailio:deleteuser,kamailio:listfiles,kamailio:edit