mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-29 23:39:24 +01:00
Improvements to capabilities
This commit is contained in:
parent
1016dd678f
commit
b33971c820
@ -36,19 +36,10 @@ sub initialize {
|
|||||||
$self->{caps}->load;
|
$self->{caps}->load;
|
||||||
# 'cap' command registered in PBot.pm because $self->{pbot}->{commands} is not yet loaded.
|
# 'cap' command registered in PBot.pm because $self->{pbot}->{commands} is not yet loaded.
|
||||||
|
|
||||||
# add some basic capabilities
|
# add some capabilities used in this file
|
||||||
$self->add('can-modify-capabilities', undef, 1);
|
$self->add('can-modify-capabilities', undef, 1);
|
||||||
$self->add('can-group-capabilities', undef, 1);
|
$self->add('can-group-capabilities', undef, 1);
|
||||||
$self->add('can-ungroup-capabilities', undef, 1);
|
$self->add('can-ungroup-capabilities', undef, 1);
|
||||||
|
|
||||||
# add capabilites to admin capabilities group
|
|
||||||
$self->add('admin', 'chanop', 1); # add chanop capabilities group to admin group -- see ChanOpCommands.md
|
|
||||||
$self->add('admin', 'can-useradd', 1);
|
|
||||||
$self->add('admin', 'can-userdel', 1);
|
|
||||||
$self->add('admin', 'can-userset', 1);
|
|
||||||
$self->add('admin', 'can-userunset', 1);
|
|
||||||
$self->add('admin', 'can-mode', 1);
|
|
||||||
$self->add('admin', 'can-mode-any', 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub has {
|
sub has {
|
||||||
|
@ -61,7 +61,7 @@ sub initialize {
|
|||||||
}
|
}
|
||||||
$self->{pbot}->{capabilities}->add('can-mode-any', 'can-mode', 1);
|
$self->{pbot}->{capabilities}->add('can-mode-any', 'can-mode', 1);
|
||||||
|
|
||||||
# create chanop capabilities group
|
# add to chanop capabilities group
|
||||||
$self->{pbot}->{capabilities}->add('chanop', 'can-ban', 1);
|
$self->{pbot}->{capabilities}->add('chanop', 'can-ban', 1);
|
||||||
$self->{pbot}->{capabilities}->add('chanop', 'can-unban', 1);
|
$self->{pbot}->{capabilities}->add('chanop', 'can-unban', 1);
|
||||||
$self->{pbot}->{capabilities}->add('chanop', 'can-mute', 1);
|
$self->{pbot}->{capabilities}->add('chanop', 'can-mute', 1);
|
||||||
@ -73,6 +73,11 @@ sub initialize {
|
|||||||
$self->{pbot}->{capabilities}->add('chanop', 'can-devoice', 1);
|
$self->{pbot}->{capabilities}->add('chanop', 'can-devoice', 1);
|
||||||
$self->{pbot}->{capabilities}->add('chanop', 'can-invite', 1);
|
$self->{pbot}->{capabilities}->add('chanop', 'can-invite', 1);
|
||||||
|
|
||||||
|
# add to admin capability group
|
||||||
|
$self->{pbot}->{capabilities}->add('admin', 'chanop', 1);
|
||||||
|
$self->{pbot}->{capabilities}->add('admin', 'can-mode', 1);
|
||||||
|
$self->{pbot}->{capabilities}->add('admin', 'can-mode-any', 1);
|
||||||
|
|
||||||
# allow users to use !unban * or !unmute *
|
# allow users to use !unban * or !unmute *
|
||||||
$self->{pbot}->{capabilities}->add('can-clear-bans', undef, 1);
|
$self->{pbot}->{capabilities}->add('can-clear-bans', undef, 1);
|
||||||
$self->{pbot}->{capabilities}->add('can-clear-mutes', undef, 1);
|
$self->{pbot}->{capabilities}->add('can-clear-mutes', undef, 1);
|
||||||
@ -297,11 +302,11 @@ sub mode {
|
|||||||
my $u = $self->{pbot}->{users}->loggedin($channel, "$nick!$user\@$host");
|
my $u = $self->{pbot}->{users}->loggedin($channel, "$nick!$user\@$host");
|
||||||
if ($mode eq 'v') {
|
if ($mode eq 'v') {
|
||||||
if (not $self->{pbot}->{capabilities}->userhas($u, 'can-voice-wildcard')) {
|
if (not $self->{pbot}->{capabilities}->userhas($u, 'can-voice-wildcard')) {
|
||||||
return "/msg $nick Using wildcards with `mode +v` requires the can-voice-wildcard capability, which your user account does not have.";
|
return "/msg $nick Using wildcards with `mode v` requires the can-voice-wildcard capability, which your user account does not have.";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (not $self->{pbot}->{capabilities}->userhas($u, 'can-op-wildcard')) {
|
if (not $self->{pbot}->{capabilities}->userhas($u, 'can-op-wildcard')) {
|
||||||
return "/msg $nick Using wildcards with `mode +o` requires the can-op-wildcard capability, which your user account does not have.";
|
return "/msg $nick Using wildcards with `mode o` requires the can-op-wildcard capability, which your user account does not have.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,11 @@ sub initialize {
|
|||||||
$self->{pbot}->{commands}->register(sub { return $self->userunset(@_) }, "userunset", 1);
|
$self->{pbot}->{commands}->register(sub { return $self->userunset(@_) }, "userunset", 1);
|
||||||
$self->{pbot}->{commands}->register(sub { return $self->mycmd(@_) }, "my", 0);
|
$self->{pbot}->{commands}->register(sub { return $self->mycmd(@_) }, "my", 0);
|
||||||
|
|
||||||
$self->{pbot}->{event_dispatcher}->register_handler('irc.join', sub { $self->on_join(@_) });
|
$self->{pbot}->{capabilities}->add('admin', 'can-useradd', 1);
|
||||||
|
$self->{pbot}->{capabilities}->add('admin', 'can-userdel', 1);
|
||||||
|
$self->{pbot}->{capabilities}->add('admin', 'can-userset', 1);
|
||||||
|
$self->{pbot}->{capabilities}->add('admin', 'can-userunset', 1);
|
||||||
|
$self->{pbot}->{capabilities}->add('can-modify-admins', undef, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub on_join {
|
sub on_join {
|
||||||
@ -93,7 +97,7 @@ sub add_user {
|
|||||||
password => $password
|
password => $password
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach my $cap (split /\s*,\s*/, $capabilities) {
|
foreach my $cap (split /\s*,\s*/, lc $capabilities) {
|
||||||
next if $cap eq 'none';
|
next if $cap eq 'none';
|
||||||
$data->{$cap} = 1;
|
$data->{$cap} = 1;
|
||||||
}
|
}
|
||||||
@ -349,12 +353,15 @@ sub useradd {
|
|||||||
return "Your user account does not have the can-modify-capabilities capability. You cannot create user accounts with capabilities.";
|
return "Your user account does not have the can-modify-capabilities capability. You cannot create user accounts with capabilities.";
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach my $cap (split /\s*,\s*/, $capabilities) {
|
foreach my $cap (split /\s*,\s*/, lc $capabilities) {
|
||||||
next if $cap eq 'none';
|
next if $cap eq 'none';
|
||||||
return "There is no such capability $cap." if not $self->{pbot}->{capabilities}->exists($cap);
|
return "There is no such capability $cap." if not $self->{pbot}->{capabilities}->exists($cap);
|
||||||
if (not $self->{pbot}->{capabilities}->userhas($u, $cap)) {
|
if (not $self->{pbot}->{capabilities}->userhas($u, $cap)) {
|
||||||
return "To set the $cap capability your user account must also have it.";
|
return "To set the $cap capability your user account must also have it.";
|
||||||
}
|
}
|
||||||
|
if ($self->{pbot}->{capabilities}->has($cap, 'admin') and not $self->{pbot}->{capabilities}->userhas($u, 'can-modify-admins')) {
|
||||||
|
return "To set the $cap capability your user account must have the can-modify-admins capability.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$self->{pbot}->{users}->add_user($name, $channel, $hostmask, $capabilities, $password);
|
$self->{pbot}->{users}->add_user($name, $channel, $hostmask, $capabilities, $password);
|
||||||
return "User added.";
|
return "User added.";
|
||||||
@ -369,6 +376,17 @@ sub userdel {
|
|||||||
return "Usage: userdel <channel> <hostmask or account name>";
|
return "Usage: userdel <channel> <hostmask or account name>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $u = $self->find_user($channel, "$nick!$user\@$host");
|
||||||
|
my $t = $self->find_user($channel, $hostmask);
|
||||||
|
|
||||||
|
if ($self->{pbot}->{capabilities}->userhas($t, 'botowner') and not $self->{pbot}->{capabilities}->userhas($u, 'botowner')) {
|
||||||
|
return "Only botowners may delete botowner user accounts.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($self->{pbot}->{capabilities}->userhas($t, 'admin') and not $self->{pbot}->{capabilities}->userhas($u, 'can-modify-admins')) {
|
||||||
|
return "To delete admin user accounts your user account must have the can-modify-admins capability.";
|
||||||
|
}
|
||||||
|
|
||||||
my ($found_channel, $found_hostmask) = $self->find_user_account($channel, $hostmask);
|
my ($found_channel, $found_hostmask) = $self->find_user_account($channel, $hostmask);
|
||||||
$found_channel = $channel if not defined $found_channel; # let DualIndexHashObject disambiguate
|
$found_channel = $channel if not defined $found_channel; # let DualIndexHashObject disambiguate
|
||||||
return $self->remove_user($found_channel, $found_hostmask);
|
return $self->remove_user($found_channel, $found_hostmask);
|
||||||
@ -409,6 +427,10 @@ sub userset {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (defined $value and $self->{pbot}->{capabilities}->userhas($target, 'admin') and not $self->{pbot}->{capabilities}->userhas($u, 'can-modify-admins')) {
|
||||||
|
return "To modify admin user accounts your user account must have the can-modify-admins capability.";
|
||||||
|
}
|
||||||
|
|
||||||
if ($self->{pbot}->{capabilities}->exists($key) and not $self->{pbot}->{capabilities}->userhas($u, $key)) {
|
if ($self->{pbot}->{capabilities}->exists($key) and not $self->{pbot}->{capabilities}->userhas($u, $key)) {
|
||||||
return "To set the $key capability your user account must also have it." unless $self->{pbot}->{capabilities}->userhas($u, 'botowner');
|
return "To set the $key capability your user account must also have it." unless $self->{pbot}->{capabilities}->userhas($u, 'botowner');
|
||||||
}
|
}
|
||||||
@ -433,7 +455,7 @@ sub userunset {
|
|||||||
return "Usage: userunset [channel] <hostmask or account name> <key>";
|
return "Usage: userunset [channel] <hostmask or account name> <key>";
|
||||||
}
|
}
|
||||||
|
|
||||||
my $u = $self->find_admin($channel, "$nick!$user\@$host");
|
my $u = $self->find_user($channel, "$nick!$user\@$host");
|
||||||
my $target = $self->find_user($channel, $hostmask);
|
my $target = $self->find_user($channel, $hostmask);
|
||||||
|
|
||||||
if (not $u) {
|
if (not $u) {
|
||||||
@ -455,6 +477,10 @@ sub userunset {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (defined $key and $self->{pbot}->{capabilities}->userhas($target, 'admin') and not $self->{pbot}->{capabilities}->userhas($u, 'can-modify-admins')) {
|
||||||
|
return "To modify admin user accounts your user account must have the can-modify-admins capability.";
|
||||||
|
}
|
||||||
|
|
||||||
if (defined $key and $self->{pbot}->{capabilities}->exists($key) and not $self->{pbot}->{capabilities}->userhas($u, $key)) {
|
if (defined $key and $self->{pbot}->{capabilities}->exists($key) and not $self->{pbot}->{capabilities}->userhas($u, $key)) {
|
||||||
return "To unset the $key capability your user account must also have it." unless $self->{pbot}->{capabilities}->userhas($u, 'botowner');
|
return "To unset the $key capability your user account must also have it." unless $self->{pbot}->{capabilities}->userhas($u, 'botowner');
|
||||||
}
|
}
|
||||||
@ -500,17 +526,25 @@ sub mycmd {
|
|||||||
|
|
||||||
if (defined $key) {
|
if (defined $key) {
|
||||||
$key = lc $key;
|
$key = lc $key;
|
||||||
|
if (defined $value) {
|
||||||
if (defined $value and not $self->{pbot}->{capabilities}->userhas($u, 'admin')) {
|
if (not $self->{pbot}->{capabilities}->userhas($u, 'can-modify-capabilities')) {
|
||||||
my @disallowed = qw/name autoop autovoice/;
|
if ($key =~ m/^can-/ or $self->{pbot}->{capabilities}->exists($key)) {
|
||||||
if (grep { $_ eq $key } @disallowed) {
|
return "The $key metadata requires the can-modify-capabilities capability, which your user account does not have.";
|
||||||
return "The $key metadata requires the admin capability to set, which your user account does not have.";
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (defined $value and not $self->{pbot}->{capabilities}->userhas($u, 'can-modify-capabilities')) {
|
if (not $self->{pbot}->{capabilities}->userhas($u, 'botowner')) {
|
||||||
if ($key =~ m/^can-/ or $self->{pbot}->{capabilities}->exists($key)) {
|
my @disallowed = qw/can-modify-admins botowner can-modify-capabilities/;
|
||||||
return "The $key metadata requires the can-modify-capabilities capability, which your user account does not have.";
|
if (grep { $_ eq $key } @disallowed) {
|
||||||
|
return "The $key metadata requires the botowner capability to set, which your user account does not have.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (not $self->{pbot}->{capabilities}->userhas($u, 'admin')) {
|
||||||
|
my @disallowed = qw/name autoop autovoice/;
|
||||||
|
if (grep { $_ eq $key } @disallowed) {
|
||||||
|
return "The $key metadata requires the admin capability to set, which your user account does not have.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user