diff options
author | Johannes <johannes@cloudron.io> | 2016-11-17 12:51:23 +0100 |
---|---|---|
committer | Johannes <johannes@cloudron.io> | 2016-11-17 12:51:23 +0100 |
commit | 738b1d82fd22dd0aa455cd6affaae6b2a94ebb41 (patch) | |
tree | 3eca4268365bc948d13f6b737fcae0838f2047ba | |
parent | dcb2086608d38a8c5c17fcdbd7ec97155aeb9cc0 (diff) | |
download | Surfer-738b1d82fd22dd0aa455cd6affaae6b2a94ebb41.tar.gz Surfer-738b1d82fd22dd0aa455cd6affaae6b2a94ebb41.tar.zst Surfer-738b1d82fd22dd0aa455cd6affaae6b2a94ebb41.zip |
Add local user admin tool
-rwxr-xr-x | admin | 105 |
1 files changed, 105 insertions, 0 deletions
@@ -0,0 +1,105 @@ | |||
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 | } | ||