Files
passman/completion.pm
thuning @ admin 1c7a197cc1 Whitespace
2024-10-11 13:57:44 +02:00

117 lines
2.7 KiB
Perl
Executable File

#!/usr/bin/env perl
use lib ($ENV{RLWRAP_FILTERDIR} or ".");
use RlwrapFilter;
use strict;
my $filter = new RlwrapFilter;
my $name = $filter -> name;
$filter -> help_text("");
$filter -> completion_handler(\&complete);
$filter -> run;
sub users {
return qx(./passman list user);
}
sub groups {
return qx(./passman list group);
}
sub passwords {
return qx(./passman list pass);
}
sub complete {
my ($line, $prefix, @completions) = @_;
my @base = ('get','modify',
'list','info',
'passwd',
'help',
'add','del',
'manage',
'promote','demote');
my @words = split /\s+/, $line;
my $nwords = scalar @words;
# only count completed words
$nwords-- if $prefix;
my @result = ();
if($nwords == 0) {
@result = @base;
} else {
# try to avoid suggesting completions in the middle of a line
return '' unless grep /$prefix$/, $words[-1];
my $first = $words[0];
if($first eq 'passwd') {
@result = ();
} elsif($nwords == 1
&& $first eq 'help') {
@result = @base;
} elsif($nwords == 1
&& ($first eq 'get'
|| $first eq 'modify')) {
@result = &passwords;
} elsif($first eq 'list'
|| $first eq 'info'
|| $first eq 'add'
|| $first eq 'del') {
if($nwords == 1) {
@result = ('user','group','pass');
} elsif($nwords == 2) {
my $second = $words[1];
if($second eq 'user') {
@result = &users;
} elsif($second eq 'group') {
@result = &groups;
} elsif($second eq 'pass') {
@result = &passwords;
}
}
} elsif($nwords == 1
&& ($first eq 'promote'
|| $first eq 'demote')) {
@result = &users;
} elsif($first eq 'manage') {
if($nwords == 1) {
@result = ('user','pass');
} else {
my $second = $words[1];
if($nwords == 2) {
if($second eq 'user') {
@result = &users;
} elsif($second eq 'pass') {
@result = &passwords;
}
} elsif($nwords == 3) {
my @temp = &groups;
@result = map { '-' . $_ } @temp;
push @result, map { '+' . $_ } @temp;
}
}
}
}
chomp(@result);
return grep /^$prefix/, @result;
}