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