Commit | Line | Data |
570cf8ba |
1 | #!/usr/bin/env perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | use v5.10.0; |
7 | |
8 | use Getopt::Long; |
9 | ## using prompt(): |
10 | use ExtUtils::MakeMaker(); |
f54b1ba7 |
11 | use lib 'lib'; |
12 | |
f54b1ba7 |
13 | use Text::Tradition::Directory; |
570cf8ba |
14 | |
52dcc672 |
15 | my ($dsn, $command) = ('dbi:SQLite:dbname=stemmaweb/db/traditions.db', 'add'); |
2f3eb3e0 |
16 | my ($username, $password, $tradition_id, $rolename, $dbuser, $dbpass); |
570cf8ba |
17 | |
18 | GetOptions( |
19 | 'c|command:s' => \$command, |
20 | 'dsn:s' => \$dsn, |
2f3eb3e0 |
21 | 'dbuser=s' => \$dbuser, |
22 | 'dbpass=s' => \$dbpass, |
570cf8ba |
23 | 'u|username=s' => \$username, |
24 | 'p|password:s' => \$password, |
f54b1ba7 |
25 | 't|tradition:s' => \$tradition_id, |
4d4c5789 |
26 | 'r|role:s' => \$rolename, |
570cf8ba |
27 | ) or usage(); |
28 | |
df8c12f0 |
29 | if(!$command || !($command ~~ [qw/add modify delete deactivate reactivate list/])) { |
570cf8ba |
30 | print "No command supplied, chickening out ... \n\n"; |
31 | usage(); |
32 | } |
33 | |
34 | if(!$username) { |
35 | print "No username supplied, confused ... \n\n"; |
36 | usage(); |
37 | } |
38 | |
2f3eb3e0 |
39 | my %connect_args = ( dsn => $dsn ); |
40 | if( $dbuser || $dbpass ) { |
41 | $connect_args{extra_args} = { user => $dbuser, password => $dbpass }; |
42 | } |
43 | my $userstore = Text::Tradition::Directory->new( %connect_args ); |
cf7e4e7b |
44 | my $new_scope = $userstore->new_scope; |
570cf8ba |
45 | |
46 | given ($command) { |
47 | when ('add') { |
7cb56251 |
48 | ## We only add local users here, OpenID etc users will get auto-added |
49 | ## when they login |
570cf8ba |
50 | if(!$password || !$userstore->validate_password($password)) { |
51 | print "Can't add a new user without a valid password\n\n"; |
52 | usage(); |
4d4c5789 |
53 | break; |
570cf8ba |
54 | } |
4d4c5789 |
55 | ## Set role as passed in rolename, if set (else gets default "user") |
56 | my $user = $userstore->add_user({ username => $username, |
57 | password => $password, |
58 | ( $rolename ? (role => $rolename) : () ), |
59 | }); |
570cf8ba |
60 | if(!$user) { |
61 | print "Failed to add user! (you should see errors above this..)\n"; |
62 | } else { |
63 | print "OK.\n"; |
64 | } |
65 | } |
66 | |
67 | when ('modify') { |
4d4c5789 |
68 | if(!$tradition_id && !$password && !$rolename) { |
f54b1ba7 |
69 | print "Can't modify a user without a valid password or a tradition\n\n"; |
570cf8ba |
70 | usage(); |
cf7e4e7b |
71 | break; |
72 | } |
73 | if( $password && !$userstore->validate_password($password)) { |
74 | print "Can't modify a user without a valid password\n\n"; |
75 | usage(); |
76 | break; |
570cf8ba |
77 | } |
4d4c5789 |
78 | my @set_password = ( $password ? ( password => $password ) : () ); |
79 | my @set_role = ( $rolename ? ( role => $rolename ) : () ); |
80 | |
81 | my $user = $userstore->modify_user({ username => $username, |
82 | @set_password, |
83 | @set_role, |
84 | }); |
85 | if(!$user) { |
86 | print "Failed to modify user! (you should see errors above this..)\n"; |
87 | } else { |
88 | print "Modified User.\n"; |
89 | } |
90 | |
91 | if($tradition_id) { |
cf7e4e7b |
92 | my $tradition = $userstore->tradition($tradition_id); |
f54b1ba7 |
93 | my $user = $userstore->find_user({ username => $username }); |
94 | if(!$tradition || !$user) { |
95 | print "Can't find one of '$username' or '$tradition_id' in the database!\n"; |
96 | } else { |
ec7ea4e6 |
97 | if(grep { $userstore->object_to_id($_) |
98 | eq |
99 | $userstore->object_to_id($tradition)} |
100 | @{$user->traditions}) { |
101 | $user->remove_tradition($tradition); |
102 | } else { |
103 | $user->add_tradition($tradition); |
104 | } |
cf7e4e7b |
105 | $userstore->update($tradition); |
f54b1ba7 |
106 | $userstore->update($user); |
4d4c5789 |
107 | print "Added Tradition.\n"; |
f54b1ba7 |
108 | } |
4d4c5789 |
109 | } |
110 | |
111 | print "OK\n"; |
570cf8ba |
112 | } |
113 | |
df8c12f0 |
114 | when ('list') { |
115 | my $user = $userstore->find_user({ username => $username }); |
116 | if(!$user) { |
117 | print "Can't find user '$username'\n"; |
118 | break; |
119 | } |
120 | my $traditions = $user->traditions; |
121 | |
122 | print "User: $username\n"; |
123 | print "Has traditions: \n"; |
124 | foreach my $t (@$traditions) { |
125 | print " ", $t->name, "\n"; |
126 | } |
127 | print "OK.\n"; |
128 | } |
129 | |
570cf8ba |
130 | when ('deactivate') { |
131 | my $user = $userstore->deactivate_user({ username => $username}); |
132 | if(!$user) { |
133 | print "Failed to deactivate user! (you should see errors above this..)\n"; |
134 | } else { |
135 | print "OK.\n"; |
4d4c5789 |
136 | } |
570cf8ba |
137 | } |
138 | |
139 | when ('reactivate') { |
140 | my $user = $userstore->reactivate_user({ username => $username}); |
141 | if(!$user) { |
142 | print "Failed to reactivate user! (you should see errors above this..)\n"; |
143 | } else { |
144 | print "OK.\n"; |
4d4c5789 |
145 | } |
570cf8ba |
146 | } |
147 | |
148 | when ('delete') { |
149 | my $yesno = ExtUtils::MakeMaker::prompt("Permanently delete $username? (y/N)", "n"); |
150 | if($yesno !~ /^y$/i) { |
151 | print "Not deleting $username\n"; |
152 | break; |
153 | } |
154 | my $user = $userstore->delete_user({ username => $username}); |
155 | if(!$user) { |
156 | print "Failed to delete user! (you should see errors above this..)\n"; |
157 | } else { |
158 | print "OK.\n"; |
159 | } |
160 | } |
161 | } |
162 | |
163 | sub usage { |
164 | print "User Admin tool, to add/modify/deactivate/reactivate/delete users\n"; |
165 | print "===========================================\n"; |
166 | print "Usage: $0 -c add -u jimbob -p hispassword\n"; |
167 | print "Usage: $0 -c modify -u jimbob -p hisnewpassword\n"; |
f54b1ba7 |
168 | print "Usage: $0 -c modify -u jimbob -t \"Notre besoin\"\n"; |
4d4c5789 |
169 | print "Usage: $0 -c modify -u jimbob -r \"admin\"\n"; |
570cf8ba |
170 | print "Usage: $0 -c deactivate -u jimbob\n"; |
171 | } |
172 | |
173 | =head1 NAME |
174 | |
175 | admin_users.pl - add / modify / etc users |
176 | |
177 | =head1 SYNOPSIS |
178 | |
179 | admin_user.pl -c add -u jimbob -p "jimspassword" |
180 | |
4d4c5789 |
181 | admin_user.pl -c add -u jimbob -p "jimspassword" -r "admin" |
182 | |
570cf8ba |
183 | admin_user.pl -c modify -u jimbob -p "jimsnewpassword" |
184 | |
4d4c5789 |
185 | admin_user.pl -c modify -u jimbob -r "admin" |
186 | |
cf7e4e7b |
187 | admin_user.pl -c modify -u jimbob -t "mytradition" |
188 | |
df8c12f0 |
189 | admin_user.pl -c list -u jimbob |
190 | |
570cf8ba |
191 | admin_user.pl -c delete -u jimbob |
192 | |
193 | =head1 OPTIONS |
194 | |
195 | =over |
196 | |
197 | =item -c | --command |
198 | |
df8c12f0 |
199 | The action to take, can be one of: add, modify, deactivate, reactivate, delete, list. |
200 | |
201 | =over |
202 | |
203 | =item add |
204 | |
205 | Create a new user and store it in the Directory |
206 | |
207 | =item modify |
208 | |
209 | Change an existing stored user, with a -p this will change the user's |
210 | password, with a -t will add or remove the named tradition from the |
211 | user. |
212 | |
213 | =item list |
214 | |
215 | List the given user's traditions. |
216 | |
217 | =item deactivate |
218 | |
219 | Deactivate this user. |
220 | |
221 | =item reactivate |
222 | |
223 | Re-activate this user. |
224 | |
225 | =item delete |
226 | |
227 | Delete the user permanently. |
228 | |
229 | =back |
570cf8ba |
230 | |
231 | =item -u | --username |
232 | |
233 | The username of the new user or user to change. |
234 | |
235 | =item -p | --password |
236 | |
237 | The new password or password to change. |
238 | |
cf7e4e7b |
239 | =item -t | --tradition |
240 | |
241 | A Text::Tradition id or name which will be assigned to the user given. |
242 | |
4d4c5789 |
243 | =item -r | --role |
244 | |
245 | A rolename to add or modify, this is a plain text string to check it carefully. Use C<modify> to change if necessary. |
246 | |
570cf8ba |
247 | =back |