xmlhandlers: Fixed indentation and added some semicolons.
[prosody.git] / prosodyctl
index 522ebde9a3e62e73c006f6eb52ed9ac6a92f92d9..1c82d4584b0d1eb5d3956e97333414f42d9bbc38 100755 (executable)
@@ -60,13 +60,15 @@ do
        end
 end
 
+prosody = { hosts = {}, events = events, platform = "posix" };
+
 local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data";
 require "util.datamanager".set_data_path(data_path);
 
 -- Switch away from root and into the prosody user --
 local switched_user, current_uid;
 
-local want_pposix_version = "0.3.1";
+local want_pposix_version = "0.3.3";
 local ok, pposix = pcall(require, "util.pposix");
 
 if ok and pposix then
@@ -89,6 +91,9 @@ if ok and pposix then
                        print("Warning: Couldn't switch to Prosody user/group '"..tostring(desired_user).."'/'"..tostring(desired_group).."': "..tostring(err));
                end
        end
+       
+       -- Set our umask to protect data files
+       pposix.umask(config.get("*", "core", "umask") or "027");
 else
        print("Error: Unable to load pposix module. Check that Prosody is installed correctly.")
        print("For more help send the below error to us through http://prosody.im/discuss");
@@ -108,8 +113,7 @@ local error_messages = setmetatable({
 
 local events = require "util.events".new();
 
-hosts = {};
-prosody = { hosts = hosts, events = events };
+hosts = prosody.hosts;
 
 for hostname, config in pairs(config.getconfig()) do
        hosts[hostname] = { events = events };
@@ -137,18 +141,33 @@ function show_usage(usage, desc)
 end
 
 local function getchar(n)
-       os.execute("stty raw -echo");
-       local ok, char = pcall(io.read, n or 1);
-       os.execute("stty sane");
+       local stty_ret = os.execute("stty raw -echo 2>/dev/null");
+       local ok, char;
+       if stty_ret == 0 then
+               ok, char = pcall(io.read, n or 1);
+               os.execute("stty sane");
+       else
+               ok, char = pcall(io.read, "*l");
+               if ok then
+                       char = char:sub(1, n or 1);
+               end
+       end
        if ok then
                return char;
        end
 end
        
 local function getpass()
-       os.execute("stty -echo");
+       local stty_ret = os.execute("stty -echo 2>/dev/null");
+       if stty_ret ~= 0 then
+               io.write("\027[08m"); -- ANSI 'hidden' text attribute
+       end
        local ok, pass = pcall(io.read, "*l");
-       os.execute("stty sane");
+       if stty_ret == 0 then
+               os.execute("stty sane");
+       else
+               io.write("\027[00m");
+       end
        io.write("\n");
        if ok then
                return pass;
@@ -462,6 +481,32 @@ function commands.unregister(arg)
        return 1;
 end
 
+local http_errors = {
+       [404] = "Plugin not found, did you type the address correctly?"
+       };
+
+function commands.addplugin(arg)
+       local url = arg[1];
+       if url:match("^http://") then
+               local http = require "socket.http";
+               show_message("Fetching...");
+               local code, err = http.request(url);
+               if not code or not tostring(err):match("^[23]") then
+                       show_message("Failed: "..(http_errors[err] or ("HTTP error "..err)));
+                       return 1;
+               end
+               if url:match("%.lua$") then
+                       local ok, err = datamanager.store(url:match("/mod_([^/]+)$"), "*", "plugins", {code});
+                       if not ok then
+                               show_message("Failed to save to data store: "..err);
+                               return 1;
+                       end
+               end
+               show_message("Saved. Don't forget to load the module using the config file or admin console!");
+       else
+               show_message("Sorry, I don't understand how to fetch plugins from there.");
+       end
+end
 
 ---------------------