]>
Commit | Line | Data |
---|---|---|
738b1d82 J |
1 | #!/usr/bin/env node |
2 | ||
3 | 'use strict'; | |
4 | ||
5 | var program = require('commander'), | |
6 | safe = require('safetydance'), | |
7 | bcrypt = require('bcryptjs'), | |
8 | path = require('path'); | |
9 | ||
10 | function exit(error) { | |
11 | if (error) console.error(error); | |
12 | process.exit(error ? 1 : 0); | |
13 | } | |
14 | ||
15 | var LOCAL_AUTH_FILE = path.resolve(process.env.LOCAL_AUTH_FILE || './.users.json'); | |
16 | ||
17 | console.log('Using local auth file: ', LOCAL_AUTH_FILE); | |
18 | ||
19 | function addUser(options) { | |
20 | if (!options.username) exit('missing --username'); | |
21 | if (!options.password) exit('missing --password'); | |
22 | ||
23 | var users = safe.require(LOCAL_AUTH_FILE); | |
24 | if (!users) users = {}; | |
25 | if (users[options.username]) exit('User already exists'); | |
26 | ||
27 | bcrypt.hash(options.password, 8, function(error, hash) { | |
28 | users[options.username] = { username: options.username, passwordHash: hash }; | |
29 | safe.fs.writeFileSync(LOCAL_AUTH_FILE, JSON.stringify(users, null, 4)); | |
30 | ||
31 | console.log('Done.'); | |
32 | }); | |
33 | } | |
34 | ||
35 | function editUser(options) { | |
36 | if (!options.username) exit('missing --username'); | |
37 | if (!options.password) exit('missing --password'); | |
38 | ||
39 | var users = safe.require(LOCAL_AUTH_FILE); | |
40 | if (!users) users = {}; | |
41 | if (!users[options.username]) exit('No such user'); | |
42 | ||
43 | bcrypt.hash(options.password, 8, function(error, hash) { | |
44 | users[options.username] = { username: options.username, passwordHash: hash }; | |
45 | safe.fs.writeFileSync(LOCAL_AUTH_FILE, JSON.stringify(users, null, 4)); | |
46 | ||
47 | console.log('Done.'); | |
48 | }); | |
49 | } | |
50 | ||
51 | function delUser(options) { | |
52 | if (!options.username) exit('missing --username'); | |
53 | ||
54 | var users = safe.require(LOCAL_AUTH_FILE); | |
55 | if (!users) exit('No such user'); | |
56 | ||
57 | if (!users[options.username]) exit('No such user'); | |
58 | ||
59 | delete users[options.username]; | |
60 | safe.fs.writeFileSync(LOCAL_AUTH_FILE, JSON.stringify(users, null, 4)); | |
61 | ||
62 | console.log('Done.'); | |
63 | } | |
64 | ||
65 | function listUsers() { | |
66 | var users = safe.require(LOCAL_AUTH_FILE); | |
67 | if (!users) exit('No users. Use `admin user-add` to add some.'); | |
68 | ||
69 | console.log(users); | |
70 | } | |
71 | ||
72 | program.version('0.1.0'); | |
73 | ||
74 | program.command('user-add') | |
75 | .description('Add local user') | |
76 | .option('-u --username <username>', 'New username') | |
77 | .option('-p --password <password>', 'New password') | |
78 | .action(addUser); | |
79 | ||
80 | program.command('user-edit') | |
81 | .description('Edit local user') | |
82 | .option('-u --username <username>', 'Username') | |
83 | .option('-p --password <password>', 'New password') | |
84 | .action(editUser); | |
85 | ||
86 | program.command('user-del') | |
87 | .description('Delete local user') | |
88 | .option('-u --username <username>', 'Username') | |
89 | .action(delUser); | |
90 | ||
91 | program.command('users') | |
92 | .description('List local users') | |
93 | .action(listUsers); | |
94 | ||
95 | program.parse(process.argv); | |
96 | ||
97 | if (!process.argv.slice(2).length) { | |
98 | program.outputHelp(); | |
99 | } else { // https://github.com/tj/commander.js/issues/338 | |
100 | var knownCommand = program.commands.some(function (command) { return command._name === process.argv[2]; }); | |
101 | if (!knownCommand) { | |
102 | console.error('Unknown command: ' + process.argv[2]); | |
103 | process.exit(1); | |
104 | } | |
105 | } |