diff options
author | Richard Ipsum <richardipsum@fastmail.co.uk> | 2014-01-21 12:48:14 +0000 |
---|---|---|
committer | Richard Ipsum <richard.ipsum@codethink.co.uk> | 2014-02-10 15:03:59 +0000 |
commit | 6e8b1db01cfc1525490f7c056c969c4454fdb3c5 (patch) | |
tree | 3f3da9297e30093564d4e0bbdf8f1cfd9ec5d76f | |
parent | 7430e995f7edefc69f9e0e4b99eb30a1a1a79080 (diff) | |
download | gitano-6e8b1db01cfc1525490f7c056c969c4454fdb3c5.tar.gz |
Add passwd command
-rw-r--r-- | lib/gitano/usercommand.lua | 108 |
1 files changed, 105 insertions, 3 deletions
diff --git a/lib/gitano/usercommand.lua b/lib/gitano/usercommand.lua index d28b203..ad290d4 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) @@ -209,6 +214,100 @@ 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 passwd = io.stdin:read('*all') + local passwd_hash = util.hash_password(passwd) + + if conf.users[user].passwd == '' and passwd == '' 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 passwd ~= '' then + conf.users[user].passwd = passwd_hash + else + conf.users[user].passwd = nil -- user's password file will be removed + end + + local ok, msg + ok = update_htpasswd(user, passwd) + + if not ok then + log.error("Failed to update htpasswd file") + return "exit", 1 + end + + local action = string.format("%s password for %s", + passwd ~= '' 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", + passwd ~= '' 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, @@ -216,6 +315,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 { |