123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #!/usr/bin/env perl
- package tcms::useradd;
- use strict;
- use warnings;
- use FindBin::libs;
- use Getopt::Long;
- use Pod::Usage;
- use List::Util qw{first};
- use Trog::Auth;
- use Trog::Data;
- use Trog::Config;
- use Trog::Log;
- # Don't murder our terminal when done
- $ENV{NOHUP} = 1;
- =head1 SYNOPSIS
- Add or edit a tCMS user. In the event of a user edit, every option save for user is optional.
- does not update user pages. Use this to reset user passwords or fix broken users.
- =head2 USAGE
- tcms-useradd --user foo --password bar --display_name baz --contact_email foo@bar.baz --acl fred --acl wilma
- =head2 OPTIONS
- =over 4
- =item --user
- Specify the user to add, or edit if the user already exists.
- =item --password
- Set a password for the user. Leave blank if you want to keep the password for an existing user.
- =item --display_name
- Set the display name for the user.
- =item --contact_email
- Set the contact email for the user.
- =item --acl
- Set an acl for this user. May be passed multiple times.
- Defaults to 'admin' acl.
- =item --help, --man
- Display this output.
- =back
- =cut
- sub main {
- Trog::Log::log_init();
- my %options;
- Getopt::Long::GetOptionsFromArray(
- \@_,
- 'user=s' => \$options{user},
- 'display_name=s' => \$options{display_name},
- 'help|?' => \$options{help},
- 'password=s' => \$options{password},
- 'contact_email=s' => \$options{contact_email},
- 'acl=s@' => \$options{acl},
- );
- pod2usage( -exitval => 0, -verbose => 1 ) if $options{help};
- $options{acl} //= [];
- $options{acl} = [ $options{acl} ] if $options{acl} && ref $options{acl} ne 'ARRAY';
- $options{acl} = ['admin'] unless @{ $options{acl} };
- Trog::Auth::killsession( $options{user} );
- eval { Trog::Auth::useradd( $options{user}, $options{display_name}, $options{password}, $options{acl}, $options{contact_email} ) } or do {
- return 1;
- };
- # Find the user's post and edit it
- my $conf = Trog::Config::get();
- my $data = Trog::Data->new($conf);
- my @userposts = $data->get( tags => ['about'], acls => [qw{admin}] );
- my $user_obj = first { ( $_->{user} || '' ) eq $options{user} } @userposts;
- my %merged = (
- %$user_obj,
- %options,
- $options{display_name} ? ( local_href => "/users/$options{display_name}" ) : ( local_href => $user_obj->{local_href} ),
- );
- # We don't want the password in plain text
- delete $merged{password};
- # The ACLs a user posesses is not necessarily what ACLs you need to view or edit a user's profile.
- delete $merged{acl};
- $data->add( \%merged );
- return 0;
- }
- exit main(@ARGV) unless caller;
- 1;
|