diff options
Diffstat (limited to 'torrus/perllib/Torrus/ACL/Edit.pm')
| -rw-r--r-- | torrus/perllib/Torrus/ACL/Edit.pm | 627 |
1 files changed, 627 insertions, 0 deletions
diff --git a/torrus/perllib/Torrus/ACL/Edit.pm b/torrus/perllib/Torrus/ACL/Edit.pm new file mode 100644 index 000000000..9966c9edd --- /dev/null +++ b/torrus/perllib/Torrus/ACL/Edit.pm @@ -0,0 +1,627 @@ +# Copyright (C) 2002 Stanislav Sinyagin +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + +# $Id: Edit.pm,v 1.1 2010-12-27 00:03:59 ivan Exp $ +# Stanislav Sinyagin <ssinyagin@yahoo.com> + + +package Torrus::ACL::Edit; + +use Torrus::ACL; +use Torrus::Log; + +use strict; + +@Torrus::ACL::Edit::ISA = qw(Torrus::ACL); + +sub new +{ + my $proto = shift; + my %options = @_; + my $class = ref($proto) || $proto; + $options{'-WriteAccess'} = 1; + my $self = $class->SUPER::new( %options ); + bless $self, $class; + return $self; +} + + +sub addGroups +{ + my $self = shift; + my @groups = shift; + + my $ok = 1; + foreach my $group ( @groups ) + { + if( length( $group ) == 0 or $group =~ /\W/ ) + { + Error('Invalid group name: ' . $group); + $ok = 0; + } + elsif( $self->groupExists( $group ) ) + { + Error('Cannot add group ' . $group . ': the group already exists'); + $ok = 0; + } + else + { + $self->{'db_users'}->addToList( 'G:', $group ); + $self->setGroupModified( $group ); + Info('Group added: ' . $group); + } + } + return $ok; +} + +sub deleteGroups +{ + my $self = shift; + my @groups = shift; + + my $ok = 1; + foreach my $group ( @groups ) + { + if( $self->groupExists( $group ) ) + { + my $members = $self->listGroupMembers( $group ); + foreach my $uid ( @{$members} ) + { + $self->{'db_users'}->delFromList( 'gm:' . $uid, $group ); + } + $self->{'db_users'}->delFromList( 'G:', $group ); + + my $cursor = $self->{'db_acl'}->cursor( -Write => 1 ); + while( my ($key, $val) = $self->{'db_acl'}->next( $cursor ) ) + { + my( $dbgroup, $object, $privilege ) = split( ':', $key ); + if( $dbgroup eq $group ) + { + $self->{'db_acl'}->c_del( $cursor ); + } + } + undef $cursor; + + Info('Group deleted: ' . $group); + } + else + { + Error('Cannot delete group ' . $group . + ': the group does not exist'); + $ok = 0; + } + } + return $ok; +} + +sub groupExists +{ + my $self = shift; + my $group = shift; + + return $self->{'db_users'}->searchList( 'G:', $group ); +} + + +sub listGroups +{ + my $self = shift; + + my $list = $self->{'db_users'}->get( 'G:' ); + + return split( ',', $list ); +} + + +sub listGroupMembers +{ + my $self = shift; + my $group = shift; + + my $members = []; + + my $cursor = $self->{'db_users'}->cursor(); + while( my ($key, $val) = $self->{'db_users'}->next( $cursor ) ) + { + my( $selector, $uid ) = split(':', $key); + if( $selector eq 'gm' ) + { + if( defined($val) and length($val) > 0 and + grep {$group eq $_} split(',', $val) ) + { + push( @{$members}, $uid ); + } + } + } + undef $cursor; + return $members; +} + + +sub addUserToGroups +{ + my $self = shift; + my $uid = shift; + my @groups = @_; + + my $ok = 1; + if( $self->userExists( $uid ) ) + { + foreach my $group ( @groups ) + { + if( $self->groupExists( $group ) ) + { + if( not grep {$group eq $_} $self->memberOf( $uid ) ) + { + $self->{'db_users'}->addToList( 'gm:' . $uid, $group ); + $self->setGroupModified( $group ); + Info('Added ' . $uid . ' to group ' . $group); + } + else + { + Error('Cannot add ' . $uid . ' to group ' . $group . + ': user is already a member of this group'); + $ok = 0; + } + } + else + { + Error('Cannot add ' . $uid . ' to group ' . $group . + ': group does not exist'); + $ok = 0; + } + } + } + else + { + Error('Cannot add user ' . $uid . + 'to groups: user does not exist'); + $ok = 0; + } + return $ok; +} + + +sub delUserFromGroups +{ + my $self = shift; + my $uid = shift; + my @groups = shift; + + my $ok = 1; + if( $self->userExists( $uid ) ) + { + foreach my $group ( @groups ) + { + if( $self->groupExists( $group ) ) + { + if( grep {$group eq $_} $self->memberOf( $uid ) ) + { + $self->{'db_users'}->delFromList( 'gm:' . $uid, $group ); + $self->setGroupModified( $group ); + Info('Deleted ' . $uid . ' from group ' . $group); + } + else + { + Error('Cannot delete ' . $uid . ' from group ' . $group . + ': user is not a member of this group'); + $ok = 0; + } + } + else + { + Error('Cannot detete ' . $uid . ' from group ' . $group . + ': group does not exist'); + $ok = 0; + } + } + } + else + { + Error('Cannot delete user ' . $uid . + 'from groups: user does not exist'); + $ok = 0; + } + return $ok; +} + + +sub addUser +{ + my $self = shift; + my $uid = shift; + my $attrValues = shift; + + my $ok = 1; + if( length( $uid ) == 0 or $uid =~ /\W/ ) + { + Error('Invalid user ID: ' . $uid); + $ok = 0; + } + elsif( $self->userExists( $uid ) ) + { + Error('Cannot add user ' . $uid . ': the user already exists'); + $ok = 0; + } + else + { + $self->setUserAttribute( $uid, 'uid', $uid ); + if( defined( $attrValues ) ) + { + $self->setUserAttributes( $uid, $attrValues ); + } + Info('User added: ' . $uid); + } + return $ok; +} + + +sub userExists +{ + my $self = shift; + my $uid = shift; + + my $dbuid = $self->userAttribute( $uid, 'uid' ); + return( defined( $dbuid ) and ( $dbuid eq $uid ) ); +} + +sub listUsers +{ + my $self = shift; + + my @ret; + + my $cursor = $self->{'db_users'}->cursor(); + while( my ($key, $val) = $self->{'db_users'}->next( $cursor ) ) + { + my( $selector, $uid, $attr ) = split(':', $key); + if( $selector eq 'ua' and $attr eq 'uid' ) + { + push( @ret, $uid ); + } + } + undef $cursor; + return @ret; +} + +sub setUserAttribute +{ + my $self = shift; + my $uid = shift; + my $attr = shift; + my $val = shift; + + my $ok = 1; + if( length( $attr ) == 0 or $attr =~ /\W/ ) + { + Error('Invalid attribute name: ' . $attr); + $ok = 0; + } + else + { + $self->{'db_users'}->put( 'ua:' . $uid . ':' . $attr, $val ); + $self->{'db_users'}->addToList( 'uA:' . $uid, $attr ); + if( $attr ne 'modified' ) + { + $self->setUserModified( $uid ); + } + Debug('Set ' . $attr . ' for ' . $uid . ': ' . $val); + } + return $ok; +} + + +sub delUserAttribute +{ + my $self = shift; + my $uid = shift; + my @attrs = @_; + + foreach my $attr ( @attrs ) + { + $self->{'db_users'}->del( 'ua:' . $uid . ':' . $attr ); + $self->{'db_users'}->delFromList( 'uA:' . $uid, $attr ); + $self->setUserModified( $uid ); + Debug('Deleted ' . $attr . ' from ' . $uid); + } +} + + +sub setUserAttributes +{ + my $self = shift; + my $uid = shift; + my $attrValues = shift; + + my $ok = 1; + + foreach my $attr ( keys %{$attrValues} ) + { + $ok = $self->setUserAttribute( $uid, $attr, $attrValues->{$attr} ) + ? $ok:0; + } + + return $ok; +} + + +sub setUserModified +{ + my $self = shift; + my $uid = shift; + + $self->setUserAttribute( $uid, 'modified', scalar( localtime( time() ) ) ); +} + +sub listUserAttributes +{ + my $self = shift; + my $uid = shift; + + my $list = $self->{'db_users'}->get( 'uA:' . $uid ); + + return split( ',', $list ); +} + + +sub setPassword +{ + my $self = shift; + my $uid = shift; + my $password = shift; + + my $ok = 1; + if( $self->userExists( $uid ) ) + { + if( length( $password ) < $Torrus::ACL::minPasswordLength ) + { + Error('Password too short: must be ' . + $Torrus::ACL::minPasswordLength . ' characters long'); + $ok = 0; + } + else + { + my $attrValues = $self->{'auth'}->setPassword( $uid, $password ); + $self->setUserAttributes( $uid, $attrValues ); + Info('Password set for ' . $uid); + } + } + else + { + Error('Cannot change password for user ' . $uid . + ': user does not exist'); + $ok = 0; + } + return $ok; +} + + +sub deleteUser +{ + my $self = shift; + my $uid = shift; + + my $ok = 1; + if( $self->userExists( $uid ) ) + { + my $cursor = $self->{'db_users'}->cursor( -Write => 1 ); + while( my ($key, $val) = $self->{'db_users'}->next( $cursor ) ) + { + my( $selector, $dbuid ) = split(':', $key); + if( ( $selector eq 'gm' or $selector eq 'ua' ) and + $dbuid eq $uid ) + { + $self->{'db_users'}->c_del( $cursor ); + } + } + undef $cursor; + + Info('User deleted: ' . $uid); + } + else + { + Error('Cannot delete user ' . $uid . ': user does not exist'); + $ok = 0; + } + return $ok; +} + + +sub setGroupAttribute +{ + my $self = shift; + my $group = shift; + my $attr = shift; + my $val = shift; + + my $ok = 1; + if( length( $attr ) == 0 or $attr =~ /\W/ ) + { + Error('Invalid attribute name: ' . $attr); + $ok = 0; + } + else + { + $self->{'db_users'}->put( 'ga:' . $group . ':' . $attr, $val ); + $self->{'db_users'}->addToList( 'gA:' . $group, $attr ); + if( $attr ne 'modified' ) + { + $self->setGroupModified( $group ); + } + Debug('Set ' . $attr . ' for ' . $group . ': ' . $val); + } + return $ok; +} + + +sub listGroupAttributes +{ + my $self = shift; + my $group = shift; + + my $list = $self->{'db_users'}->get( 'gA:' . $group ); + + return split( ',', $list ); +} + + + +sub setGroupModified +{ + my $self = shift; + my $group = shift; + + $self->setGroupAttribute( $group, 'modified', + scalar( localtime( time() ) ) ); +} + + +sub setPrivilege +{ + my $self = shift; + my $group = shift; + my $object = shift; + my $privilege = shift; + + my $ok = 1; + if( $self->groupExists( $group ) ) + { + $self->{'db_acl'}->put( $group.':'.$object.':'.$privilege, 1 ); + $self->setGroupModified( $group ); + Info('Privilege ' . $privilege . ' for object ' . $object . + ' set for group ' . $group); + } + else + { + Error('Cannot set privilege for group ' . $group . + ': group does not exist'); + $ok = 0; + } + return $ok; +} + + +sub clearPrivilege +{ + my $self = shift; + my $group = shift; + my $object = shift; + my $privilege = shift; + + my $ok = 1; + if( $self->groupExists( $group ) ) + { + my $key = $group.':'.$object.':'.$privilege; + if( $self->{'db_acl'}->get( $key ) ) + { + $self->{'db_acl'}->del( $key ); + $self->setGroupModified( $group ); + Info('Privilege ' . $privilege . ' for object ' . $object . + ' revoked from group ' . $group); + } + } + else + { + Error('Cannot revoke privilege from group ' . $group . + ': group does not exist'); + $ok = 0; + } + return $ok; +} + + +sub listPrivileges +{ + my $self = shift; + my $group = shift; + + my $ret = {}; + + my $cursor = $self->{'db_acl'}->cursor(); + while( my ($key, $val) = $self->{'db_acl'}->next( $cursor ) ) + { + my( $dbgroup, $object, $privilege ) = split( ':', $key ); + if( $dbgroup eq $group ) + { + $ret->{$object}{$privilege} = 1; + } + } + undef $cursor; + + return $ret; +} + + +sub clearConfig +{ + my $self = shift; + + $self->{'db_acl'}->trunc(); + $self->{'db_users'}->trunc(); + + Info('Cleared the ACL configuration'); + return 1; +} + +sub exportACL +{ + my $self = shift; + my $exportfile = shift; + my $exporttemplate = shift; + + my $ok; + eval 'require Torrus::ACL::Export; + $ok = Torrus::ACL::Export::exportACL( $self, $exportfile, + $exporttemplate );'; + if( $@ ) + { + Error($@); + return 0; + } + else + { + return $ok; + } +} + +sub importACL +{ + my $self = shift; + my $importfile = shift; + + my $ok; + eval 'require Torrus::ACL::Import; + $ok = Torrus::ACL::Import::importACL( $self, $importfile );'; + + if( $@ ) + { + Error($@); + return 0; + } + else + { + return $ok; + } +} + +1; + + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# perl-indent-level: 4 +# End: |
