diff options
author | Richard Ipsum <richard.ipsum@codethink.co.uk> | 2014-01-21 12:48:14 +0000 |
---|---|---|
committer | Richard Ipsum <richard.ipsum@codethink.co.uk> | 2014-02-15 14:49:33 +0000 |
commit | ba6ddfc7f8c25fc07950c0d49349b34e4a526500 (patch) | |
tree | 99eaaf6cd729fb27d8618dd6e0e2c0143c534663 /lib | |
parent | efc61666f2e5195fc0dcc90d21cd4b5019f0d91e (diff) | |
download | gitano-ba6ddfc7f8c25fc07950c0d49349b34e4a526500.tar.gz |
Add passwd command
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitano/usercommand.lua | 114 |
1 files changed, 111 insertions, 3 deletions
diff --git a/lib/gitano/usercommand.lua b/lib/gitano/usercommand.lua index 2071fc3..49e66dd 100644 --- a/lib/gitano/usercommand.lua +++ b/lib/gitano/usercommand.lua @@ -10,6 +10,7 @@ local repository = require 'gitano.repository' local config = require 'gitano.config' local sio = require 'luxio.simple' +local subprocess = require 'luxio.subprocess' local builtin_whoami_short = "Find out how Gitano identifies you" @@ -20,15 +21,19 @@ Tells you who you are, what your email address is set to, what keys you have registered etc. ]] -local function builtin_whoami_validate(config, repo, cmdline) - -- whoami +local function validate_single_argcmd(cmdline, msg) if #cmdline > 1 then - log.error("usage: whoami") + log.error(msg) return false end + return true end +local function builtin_whoami_validate(_, _, cmdline) + return validate_single_argcmd(cmdline, "usage: whoami") +end + local function builtin_whoami_prep(config, repo, cmdline, context) context.operation = "whoami" return config.repo:run_lace(context) @@ -214,6 +219,106 @@ local function builtin_sshkey_run(conf, _, cmdline, env) return "exit", 0 end +local builtin_passwd_short = "Set your password" + +local builtin_passwd_helptext = [[ +usage: passwd + +Sets your password, the password is read from stdin. + +If no password is provided your password is removed (if you have one). +]] + +local function builtin_passwd_validate(_, _, cmdline) + return validate_single_argcmd(cmdline, "usage: passwd") +end + +local function builtin_passwd_prep(conf, repo, cmdline, context) + context.operation = "passwd" + + local action, reason = conf.repo:run_lace(context) + if action == "deny" then + return reason + end + + return action, reason +end + +local function update_htpasswd(user, passwd) + local htpasswd_path = os.getenv("HOME") .. "/htpasswd" + local flags = io.open(htpasswd_path, "r") and "" or "-c" + local exit_code + + if passwd ~= '' then + local proc = subprocess.spawn_simple({ + "htpasswd", flags, htpasswd_path, user, + stdin = passwd .. '\n' .. passwd .. '\n', + stdout = subprocess.PIPE, + stderr = subprocess.PIPE + }) + + _, exit_code = proc:wait() + else + local proc = subprocess.spawn_simple({ + "htpasswd", "-D", htpasswd_path, user, + stdout = subprocess.PIPE, + stderr = subprocess.PIPE + }) + + _, exit_code = proc:wait() + end + + return exit_code == 0 +end + +local function builtin_passwd_run(conf, _, cmdline, env) + local user = env.GITANO_USER + + local password = sio.stdin:read("*l") + local method, hash = util.hash_password(password) + + if conf.users[user].hash == nil and password == "" then + log.chat(string.format("Password for %s is not set and no password was" + .. " provided, no action taken.", user)) + return "exit", 0 + end + + if password ~= "" then + conf.users[user].method = method + conf.users[user].hash = hash + else + -- user's password will be removed + conf.users[user].method = nil + conf.users[user].hash = nil + end + + local ok, msg + + if conf.clod.settings["use_htpasswd"] == "yes" then + ok = update_htpasswd(user, password) + + if not ok then + log.error("Failed to update htpasswd file") + return "exit", 1 + end + end + + local action = string.format("%s password for %s", + password ~= '' and "Update" or "Remove", user) + + ok, msg = config.commit(conf, action, user) + + if not ok then + log.error(msg) + return "exit", 1 + end + + log.chat(string.format("%s password for %s", + password ~= '' and "Updated" or "Removed", user)) + + return "exit", 0 +end + local function register_commands(reg) assert(reg("whoami", builtin_whoami_short, builtin_whoami_helptext, builtin_whoami_validate, @@ -221,6 +326,9 @@ local function register_commands(reg) assert(reg("sshkey", builtin_sshkey_short, builtin_sshkey_helptext, builtin_sshkey_validate, builtin_sshkey_prep, builtin_sshkey_run, false, false)) + assert(reg("passwd", builtin_passwd_short, builtin_passwd_helptext, + builtin_passwd_validate, builtin_passwd_prep, + builtin_passwd_run, false, false)) end return { |