diff options
-rw-r--r-- | vmail-controller.lua | 12 | ||||
-rw-r--r-- | vmail-listmessages-html.lsp | 50 | ||||
-rw-r--r-- | vmail-model.lua | 76 | ||||
-rw-r--r-- | vmail.roles | 6 |
4 files changed, 130 insertions, 14 deletions
diff --git a/vmail-controller.lua b/vmail-controller.lua index 7b947fb..2ac08f5 100644 --- a/vmail-controller.lua +++ b/vmail-controller.lua @@ -4,6 +4,10 @@ require("controllerfunctions") default_action = "listmessages" +listfolders = function( self ) + return self.model.list_folders() +end + listusers = function( self ) return self.model.list_users() end @@ -58,6 +62,14 @@ emailmymessage = function( self ) return self:redirect_to_referrer(self.model.email_message(self.clientdata.message, self.clientdata.address, self.sessiondata.userinfo.userid)) end +movemessage = function( self ) + return self:redirect_to_referrer(self.model.move_message(self.clientdata.message, self.clientdata.newfolder)) +end + +movemymessage = function( self ) + return self:redirect_to_referrer(self.model.move_message(self.clientdata.message, self.clientdata.newfolder, self.sessiondata.userinfo.userid)) +end + editusersettings = function( self ) return controllerfunctions.handle_form(self, function() return self.model.get_usersettings(self.clientdata.username) end, self.model.update_usersettings, self.clientdata, "Save", "Edit Settings", "Settings Saved") end diff --git a/vmail-listmessages-html.lsp b/vmail-listmessages-html.lsp index 853d05c..78687d1 100644 --- a/vmail-listmessages-html.lsp +++ b/vmail-listmessages-html.lsp @@ -5,13 +5,32 @@ require("viewfunctions") <% -- Pregenerate the list of users if viewlibrary.check_permission("listusers") and (viewlibrary.check_permission("forwardmessage") or viewlibrary.check_permission("forwardmymessage")) then local users = viewlibrary.dispatch_component("listusers", nil, true) - options = {} + useroptions = {} for i,u in ipairs(users.value) do if u.username ~= session.userinfo.userid then - options[#options+1] = '<option value="'..html.html_escape(u.username)..'">'..html.html_escape(u.fullname)..' ('..html.html_escape(u.username)..')</option>' + useroptions[#useroptions+1] = '<option value="'..html.html_escape(u.username)..'">'..html.html_escape(u.fullname)..' ('..html.html_escape(u.username)..')</option>' end end - options = table.concat(options) + useroptions = table.concat(useroptions) +end +%> +<% -- Pregenerate the list of folders +reversefolders = {} +if viewlibrary.check_permission("listfolders") then + local folders = viewlibrary.dispatch_component("listfolders", nil, true) + for i,u in ipairs(folders.value) do + reversefolders[u.in_folder] = u.label + end + if (viewlibrary.check_permission("movemessage") or viewlibrary.check_permission("movemymessage")) then + if #folders.value <= 1 then + dontmove = true + end + folderoptions = {} + for i,u in ipairs(folders.value) do + folderoptions[#folderoptions+1] = '<option value="'..html.html_escape(u.in_folder)..'">'..html.html_escape(u.label)..'</option>' + end + folderoptions = table.concat(folderoptions) + end end %> @@ -20,7 +39,7 @@ end <script type="text/javascript"> function PlayMessage() { $(".temporaryplayer").remove(); - $(this).parent().parent().after("<tr class='temporaryplayer'><td colspan='8'><embed width='100%' height='25px' marginheight='0' marginwidth='0' frameborder='0' scrolling='no' autostart='false' autoplay='false' loop='false' src='" + $(this).attr("href") + "'></embed></TD></TR>"); + $(this).parent().parent().after("<tr class='temporaryplayer'><td colspan='9'><embed width='100%' height='25px' marginheight='0' marginwidth='0' frameborder='0' scrolling='no' autostart='false' autoplay='false' loop='false' src='" + $(this).attr("href") + "'></embed></TD></TR>"); return false; } function HandleMulti() { @@ -45,10 +64,13 @@ end <% if viewlibrary.check_permission("emailmessage") or viewlibrary.check_permission("emailmymessage") then %> $("#multiemail").click(HandleMulti); <% end %> +<% if viewlibrary.check_permission("movemessage") or viewlibrary.check_permission("movemymessage") then %> + $("#multimove").click(HandleMulti); +<% end %> }); </script> -<% displaycommandresults({"deletemessage", "deletemymessage", "forwardmessage", "forwardmymessage", "emailmessage", "emailmymessage"}, session) %> +<% displaycommandresults({"deletemessage", "deletemymessage", "forwardmessage", "forwardmymessage", "emailmessage", "emailmymessage", "movemessage", "movemymessage"}, session) %> <h1>Messages</h1> <DL> @@ -68,7 +90,7 @@ end " method="POST"> <input class="hidden" type="hidden" name="redir" value="<%= html.html_escape(page_info.orig_action) %>" > <input class="hidden" type="hidden" name="message" value="" > - <select name="newuser"><%= (options or "") %></select> + <select name="newuser"><%= (useroptions or "") %></select> <input class="submit" type="submit" value="Forward"> </form> <% end %> @@ -82,6 +104,18 @@ end <input class="submit" type="submit" value="E-mail"> </form> <% end %> +<% if viewlibrary.check_permission("movemessage") or viewlibrary.check_permission("movemymessage") then %> + <% if not dontmove then %> + <form id="multimove" action="<%= html.html_escape(page_info.script .. page_info.prefix .. page_info.controller) %>/ + <% if viewlibrary.check_permission("movemessage") then io.write("movemessage") else io.write("movemymessage") end %> + " method="POST"> + <input class="hidden" type="hidden" name="redir" value="<%= html.html_escape(page_info.orig_action) %>" > + <input class="hidden" type="hidden" name="message" value="" > + <select name="newfolder"><%= (folderoptions or "") %></select> + <input class="submit" type="submit" value="Move"> + </form> + <% end %> +<% end %> </TD></TR></TABLE> <TABLE id="list" class="tablesorter"><THEAD> @@ -92,7 +126,8 @@ end <TH>Time</TH> <TH>Caller ID</TH> <TH>Priority</TH> - <TH>Orig Mailbox</Th> + <TH>Orig Mailbox</TH> + <TH>Folder</TH> <TH>Duration</TH> </TR> </THEAD><TBODY> @@ -113,6 +148,7 @@ end <TD><%= html.html_escape(v.cid_number) %></TD> <TD><%= html.html_escape(v.read_flags) %></TD> <TD><%= html.html_escape(v.username) %></TD> + <TD><%= html.html_escape(reversefolders[v.in_folder] or v.in_folder) %></TD> <TD><%= html.html_escape(v.message_len) %></TD> </TR> <% end %> diff --git a/vmail-model.lua b/vmail-model.lua index 886e910..1a4ce01 100644 --- a/vmail-model.lua +++ b/vmail-model.lua @@ -22,15 +22,15 @@ local env local con local voicemail_users_creation_script = { - "CREATE TABLE voicemail_users (username text)", + "CREATE TABLE voicemail_users (username VARCHAR(255))", } local voicemail_values_creation_script = { - "CREATE TABLE voicemail_values (username text, name text, value text)", + "CREATE TABLE voicemail_values (username VARCHAR(255), name VARCHAR(255), value VARCHAR(255))", } local voicemail_params_creation_script = { - "CREATE TABLE voicemail_params (name text primary key, type text, label text, descr text, value text)", + "CREATE TABLE voicemail_params (name VARCHAR(255) primary key, type VARCHAR(255), label VARCHAR(255), descr VARCHAR(255), value VARCHAR(255))", "INSERT INTO voicemail_params VALUES('username', 'text', 'Extension', '', '')", "INSERT INTO voicemail_params VALUES('fullname', 'text', 'Full User Name', '', '')", "INSERT INTO voicemail_params VALUES('vm-password', 'text', 'Voicemail Password', '', '')", @@ -43,6 +43,11 @@ local voicemail_params_creation_script = { "INSERT INTO voicemail_params VALUES('vm-notify-email-all-messages', 'boolean', 'Pager Email Enable', '', 'false')", } +local voicemail_folders_creation_script = { + "CREATE TABLE voicemail_folders (in_folder VARCHAR(255) primary key, label VARCHAR(255))", + "INSERT INTO voicemail_folders VALUES('inbox', 'Inbox')", +} + local voicemail_prefs_creation_script = "CREATE TABLE voicemail_prefs (username VARCHAR(255), domain VARCHAR(255), name_path VARCHAR(255), greeting_path VARCHAR(255), password VARCHAR(255))" -- ################################################################################ @@ -136,7 +141,7 @@ local getselectresponse = function(sql) return retval end -local generatewhereclause = function(username, message) +local generatewhereclause = function(username, message, foldername) local sql = "" local where = {} if username and username ~= "" then @@ -151,6 +156,9 @@ local generatewhereclause = function(username, message) end where[#where+1] = "(" .. table.concat(where2, " OR ") .. ")" end + if foldername and foldername ~= "" then + where[#where+1] = "in_folder = '"..escape(foldername).."'" + end if #where > 0 then sql = " WHERE " .. table.concat(where, " AND ") end @@ -159,6 +167,16 @@ end -- These funtions access the new voicemail tables added for ACF +local listfolders = function(foldername) + if not checktable("voicemail_folders") then runscript(voicemail_folders_creation_script) end + local sql = "SELECT * FROM voicemail_folders" .. generatewhereclause(nil, nil, foldername).." ORDER BY label" + return getselectresponse(sql) +end + +local validfolder = function(foldername) + return foldername and (foldername ~= "") and (#listfolders(foldername) > 0) +end + local listusers = function(username) if not checktable("voicemail_users") then runscript(voicemail_users_creation_script) end local sql = "SELECT * FROM voicemail_users" .. generatewhereclause(username).." ORDER BY username" @@ -465,6 +483,56 @@ email_message = function(message, address, username) return retval end +move_message = function(message, newfolder, username) + local retval = cfe({ label="Move message result" }) + local messages = format.string_to_table(message, "%s*,%s*") + local res, err = pcall(function() + local connected = databaseconnect() + -- Check if message exists + local sql = "SELECT * FROM voicemail_msgs" .. generatewhereclause(username, messages) + local mess = getselectresponse(sql) + if #mess == #messages then + -- Check if newfolder exists + if validfolder(newfolder) then + for i,m in ipairs(mess) do + local sql = "UPDATE voicemail_msgs SET in_folder='"..newfolder.."'" .. generatewhereclause(username, messages) + assert (con:execute(sql)) + end + if #mess == 1 then + retval.value = "Moved message" + else + retval.value = "Moved "..#mess.." messages" + end + else + retval.errtxt = "Failed to move message - invalid folder" + end + else + retval.errtxt = "Failed to move message - message not found" + end + if connected then databasedisconnect() end + end) + if not res and err then + retval.errtxt = err + end + + return retval +end + +list_folders = function() + local errtxt + local folders = {} + local res, err = pcall(function() + local connected = databaseconnect() + folders = listfolders() + if connected then databasedisconnect() end + end) + if not res and err then + errtxt = err + end + + return cfe({ type="structure", value=folders, label="Voicemail Folders", errtxt=errtxt }) +end + list_users = function() local errtxt local users = {} diff --git a/vmail.roles b/vmail.roles index 6d72cb8..34cba80 100644 --- a/vmail.roles +++ b/vmail.roles @@ -1,5 +1,5 @@ GUEST=vmail:processdialplanxml,vmail:processdirectoryxml -USER=vmail:listusers,vmail:listmymessages,vmail:downloadmymessage,vmail:deletemymessage,vmail:editmyusersettings,vmail:forwardmymessage,vmail:emailmymessage +USER=vmail:listfolders,vmail:listusers,vmail:listmymessages,vmail:downloadmymessage,vmail:deletemymessage,vmail:editmyusersettings,vmail:forwardmymessage,vmail:movemymessage,vmail:emailmymessage EDITOR=vmail:editusers,vmail:createuser,vmail:deleteuser,vmail:editusersettings -EXPERT=vmail:editconfig,vmail:listmessages,vmail:downloadmessage,vmail:deletemessage,vmail:forwardmessage,vmail:emailmessage -ADMIN=vmail:listmessages,vmail:downloadmessage,vmail:deletemessage,vmail:forwardmessage,vmail:emailmessage,vmail:editusersettings,vmail:listusers,vmail:editusers,vmail:createuser,vmail:deleteuser,vmail:editconfig +EXPERT=vmail:editconfig,vmail:listmessages,vmail:downloadmessage,vmail:deletemessage,vmail:forwardmessage,vmail:movemessage,vmail:emailmessage +ADMIN=vmail:listmessages,vmail:downloadmessage,vmail:deletemessage,vmail:forwardmessage,vmail:movemessage,vmail:emailmessage,vmail:editusersettings,vmail:listfolders,vmail:listusers,vmail:editusers,vmail:createuser,vmail:deleteuser,vmail:editconfig |