From 7570528cc84eb88a606858bed7cba166074af92e Mon Sep 17 00:00:00 2001 From: Ted Trask Date: Tue, 17 Nov 2009 17:52:35 +0000 Subject: Added ability to create/delete/update users (tested for postgres) --- kamailio-controller.lua | 16 +++++++ kamailio-createuser-html.lsp | 15 ++++++ kamailio-listusers-html.lsp | 43 +++++++++++++++++ kamailio-model.lua | 107 +++++++++++++++++++++++++++++++++++++++++++ kamailio-updateuser-html.lsp | 1 + kamailio.menu | 1 + kamailio.roles | 5 +- 7 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 kamailio-createuser-html.lsp create mode 100644 kamailio-listusers-html.lsp create mode 120000 kamailio-updateuser-html.lsp 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") +%> + +

<%= html.html_escape(form.label) %>

+<% + 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) %> + +

<%= html.html_escape(form.label) %>

+
+ + + <% if session.permissions[page_info.controller].deleteuser or session.permissions[page_info.controller].updateuser then %> + + <% end %> + + + + +<% for i,user in ipairs(form.value) do %> + + <% if session.permissions[page_info.controller].deleteuser or session.permissions[page_info.controller].updateuser then %> + + <% end %> + + <% if session.permissions[page_info.controller].updateuser then %> + + <% else %> + + <% end %> + +<% end %> +
ActionUser NamePassword
+ <% 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 %> + <%= html.html_escape(user.username) %><%= html.html_escape(user.password) %>******
+
+ +<% 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 -- cgit v1.2.3