# ================================================================== # Gossamer Forum - Advanced web community # # Website : http://gossamer-threads.com/ # Support : http://gossamer-threads.com/scripts/support/ # Revision : $Id: Bans.pm,v 1.12.2.1 2003/02/09 03:56:09 jagerman Exp $ # # Copyright (c) 2003 Gossamer Threads Inc. All Rights Reserved. # Redistribution in part or in whole strictly prohibited. Please # see LICENSE file for full details. # ================================================================== # package GForum::Bans; use strict; use GForum qw/:user $CFG $IN $DB $USER/; use GT::AutoLoader; # Loads the bans into the current template parser $COMPILE{load} = __LINE__ . <<'END_OF_SUB'; sub load { return { num_bans => scalar @{$CFG->{bans}}, bans => [ map +{ ban => $_ }, @{$CFG->{bans}} ] } } END_OF_SUB $COMPILE{save} = __LINE__ . <<'END_OF_SUB'; sub save { my $field = shift; my @bans = split ' ', $field; $CFG->{bans} = \@bans; $CFG->save(); return; } END_OF_SUB # Called by a moderator banning someone $COMPILE{forum_ban} = __LINE__ . <<'END_OF_SUB'; sub forum_ban { shift; my ($do, $func) = @_; my $page = $func->{page}; my $input = $IN->get_hash; $DB->table('ForumBan')->insert({ forum_id_fk => $input->{forum}, ban_type => $input->{ban_type}, ($input->{ban_type} eq 'ban_ip' ? (ban_ip => $input->{ban_value}, user_id_fk => 0) : (user_id_fk => $input->{ban_value}, ban_ip => 'N/A') ), ban_reason => $input->{ban_reason}, ban_set => time, ban_set_by_id => $USER->{user_id}, ($input->{ban_expiry} ? (ban_expiry => time + 24 * 60 * 60 * $input->{ban_expiry}) : ()) }); if ($input->{ban_type} eq 'user_id_fk') { my $username = $DB->table('User')->get($input->{ban_value}, 'ARRAY', ['user_username']); my $user = $username->[0] if $username; return($page->{ban}, { forum => $input->{forum}, ban_username => $user }); } else { return($page->{ban}, { forum => $input->{forum}, ban_ip => $input->{ban_value} }); } } END_OF_SUB # Called by a moderator unbanning someone $COMPILE{forum_unban} = __LINE__ . <<'END_OF_SUB'; sub forum_unban { shift; my ($do, $func) = @_; my $page = $func->{page}; for ($IN->param('ban_id')) { $DB->table('ForumBan')->delete($_); } GForum::do_func($IN->param('redo')); } END_OF_SUB # A moderator viewing the ban list for a forum $COMPILE{forum_ban_list} = __LINE__ . <<'END_OF_SUB'; sub forum_ban_list { shift; my ($do, $func) = @_; my $page = $func->{page}; my $forum_id = $IN->param('forum'); my $ForumBan = $DB->table('ForumBan'); my $User = $DB->table('User'); $ForumBan->delete(GT::SQL::Condition->new([ ban_expiry => '<=' => time, ban_expiry => '>' => 0 ])); my $sth = $ForumBan->select({ forum_id_fk => $forum_id }); my $loop = sub { my $row = $sth->fetchrow_hashref or return; my $user; my $set_by; if ($row->{ban_type} eq 'user_id_fk') { $user = $User->get($row->{user_id_fk}); } if ($row->{ban_set_by_id}) { $set_by = $User->get($row->{ban_set_by_id}); } else { $set_by = { user_username => $row->{ban_set_by_username_deleted} }; } @$row{keys %$user} = values %$user if $user; @$row{map "set_by_$_", keys %$set_by} = values %$set_by; $row->{ban_set_date} = GForum::date($row->{ban_set}); $row->{ban_expiry_date} = GForum::date($row->{ban_expiry}) if $row->{ban_expiry}; $row; }; return($page->{ban_list}, { forum => $forum_id, bans => $loop, num_bans => $sth->rows }); } END_OF_SUB # Called via the GForum user actions (although can only be called by a status-administrator user) # This adds a users IP to the ban list $COMPILE{ban_ip} = __LINE__ . <<'END_OF_SUB'; sub ban_ip { shift; my ($do, $func) = @_; my $ip = $IN->param('ip'); if ($ip and $USER and $USER->{user_status} >= ADMINISTRATOR) { push @{$CFG->{bans}}, $ip; $CFG->save(); } GForum::do_func($IN->param('redo')); } END_OF_SUB # This disables a user. This can only be called by a user with administrator status. $COMPILE{disable_user} = __LINE__ . <<'END_OF_SUB'; sub disable_user { shift; my ($do, $func) = @_; my $uid = $IN->param('user_id'); $DB->table('User')->update({ user_enabled => 0 }, { user_id => $uid }) if $uid and $USER and $USER->{user_status} >= ADMINISTRATOR; GForum::do_func($IN->param('redo')); } END_OF_SUB 1;