147 lines
4.0 KiB
Perl
Executable File
147 lines
4.0 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
#
|
|
|
|
package LJ::Con;
|
|
|
|
$cmd{'ban_set'}->{'handler'} = \&ban_set_unset;
|
|
$cmd{'ban_unset'}->{'handler'} = \&ban_set_unset;
|
|
$cmd{'ban_list'}->{'handler'} = \&ban_list;
|
|
|
|
sub ban_list
|
|
{
|
|
my ($dbh, $remote, $args, $out) = @_;
|
|
|
|
unless ($remote) {
|
|
push @$out, [ "error", "You must be logged in to use this command." ];
|
|
return 0;
|
|
}
|
|
|
|
# journal to list from
|
|
my $j = $remote;
|
|
|
|
unless ($remote->{'journaltype'} eq "P") {
|
|
push @$out, [ "error", "Only people can list banned users, not communities (you're not logged in as a person account)." ];
|
|
return 0;
|
|
}
|
|
|
|
if (scalar(@$args) == 3) {
|
|
unless ($args->[1] eq "from") {
|
|
push @$out, [ "error", "First argument not 'from'." ];
|
|
return 0;
|
|
}
|
|
|
|
$j = LJ::load_user($args->[2]);
|
|
if (!$j) {
|
|
push @$out, [ "error", "Unknown account." ];
|
|
return 0;
|
|
}
|
|
|
|
unless (LJ::check_priv($remote, "finduser")) {
|
|
if ($j->{journaltype} ne 'C') {
|
|
push @$out, [ "error", "Account is not a community." ];
|
|
return 0;
|
|
} elsif (!LJ::can_manage($remote, $j)) {
|
|
push @$out, [ "error", "Not maintainer of this community." ];
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
my $banids = LJ::load_rel_user($j->{userid}, 'B') || [];
|
|
my $us = LJ::load_userids(@$banids);
|
|
my @userlist = map { $us->{$_}{user} } keys %$us;
|
|
|
|
foreach my $username (@userlist) {
|
|
push @$out, [ 'info', $username ];
|
|
}
|
|
push @$out, [ "info", "$j->{user} has not banned any other users." ] unless @userlist;
|
|
return 1;
|
|
}
|
|
|
|
sub ban_set_unset
|
|
{
|
|
my ($dbh, $remote, $args, $out) = @_;
|
|
my $error = 0;
|
|
|
|
unless ($remote) {
|
|
push @$out, [ "error", "You must be logged in to use this command" ];
|
|
return 0;
|
|
}
|
|
|
|
# journal to ban from:
|
|
my $j;
|
|
|
|
unless ($remote->{'journaltype'} eq "P") {
|
|
push @$out, [ "error", "Only people can ban other users, not communities (you're not logged in as a person account)." ],
|
|
return 0;
|
|
}
|
|
|
|
if (scalar(@$args) == 4) {
|
|
unless ($args->[2] eq "from") {
|
|
$error = 1;
|
|
push @$out, [ "error", "2nd argument not 'from'" ];
|
|
}
|
|
|
|
$j = LJ::load_user($args->[3]);
|
|
if (! $j) {
|
|
$error = 1;
|
|
push @$out, [ "error", "Unknown community." ],
|
|
} elsif (! LJ::can_manage_other($remote, $j)) {
|
|
$error = 1;
|
|
push @$out, [ "error", "Not maintainer of this community." ],
|
|
}
|
|
|
|
} else {
|
|
if (scalar(@$args) == 2) {
|
|
# banning from the remote user's journal
|
|
$j = $remote;
|
|
} else {
|
|
$error = 1;
|
|
push @$out, [ "error", "This form of the command takes exactly 1 argument. Consult the reference." ];
|
|
}
|
|
}
|
|
|
|
return 0 if ($error);
|
|
|
|
my $user = $args->[1];
|
|
my $banid = LJ::get_userid($dbh, $user);
|
|
|
|
unless ($banid) {
|
|
$error = 1;
|
|
push @$out, [ "error", "Invalid user \"$user\"" ];
|
|
}
|
|
|
|
return 0 if ($error);
|
|
|
|
my $qbanid = $banid+0;
|
|
my $quserid = $j->{'userid'}+0;
|
|
|
|
# exceeded ban limit?
|
|
if ($args->[0] eq 'ban_set') {
|
|
my $banlist = LJ::load_rel_user($quserid, 'B') || [];
|
|
if (scalar(@$banlist) >= ($LJ::MAX_BANS || 5000)) {
|
|
push @$out, [ "error", "You have reached the maximum number of bans. Unban someone and try again." ];
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if ($args->[0] eq "ban_set") {
|
|
LJ::set_rel($quserid, $qbanid, 'B');
|
|
$j->log_event('ban_set', { actiontarget => $banid, remote => $remote });
|
|
push @$out, [ "info", "User $user ($banid) banned from $j->{'user'}." ];
|
|
return 1;
|
|
}
|
|
|
|
if ($args->[0] eq "ban_unset") {
|
|
LJ::clear_rel($quserid, $qbanid, 'B');
|
|
$j->log_event('ban_unset', { actiontarget => $banid, remote => $remote });
|
|
push @$out, [ "info", "User $user ($banid) un-banned from $j->{'user'}." ];
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
1;
|