[# vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4 ft=perl: +--------------------------------------------------------------------+ | Ministerio de Economía | | SAMURAI | +--------------------------------------------------------------------+ | This file is part of SAMURAI. | | | | SAMURAI 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. | | | | SAMURAI 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 SAMURAI; if not, write to the Free Software Foundation, | | Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | +--------------------------------------------------------------------+ | Creado: vie oct 17 15:21:05 ART 2003 | | Autor: Martin Marrese | +--------------------------------------------------------------------+ $Id$ Libreria para el manejo de permisos para perl. #] [! $CLEANUP{'SAMURAI_Perm'} = 0; use Data::Dumper; # Parser para el ini de configuracion # # @return hash $SAMURAI_Perm->{parse_ini} = sub { use Config::IniFiles; my $cfg = new Config::IniFiles( -file => "/var/www/sistemas/samurai/lib_perl/consultasDB.ini" ); $dsn->{dsn} = $cfg->val('conf', 'dsn'); $dsn->{user} = $cfg->val('conf', 'user'); $dsn->{password} = $cfg->val('conf', 'password'); return $dsn; }; # Simil Constructor. # # @param string $login Login del usuario para el cual obtener los permisos. # @param int $sistema Sistema con el cual se va a trabajar. # # @return void $SAMURAI_Perm->{new} = sub { my $sql = "SELECT DISTINCT psu.id_sistema AS sistema, pps.id_permiso AS permiso FROM samurai.perfil_sist_usuario AS psu, samurai.perm_perfil_sist AS pps WHERE psu.login = ? AND psu.id_perfil = pps.id_perfil AND psu.id_sistema = pps.id_sistema ORDER BY psu.id_sistema"; $udat{SAMURAI_Perm_vars}{login} = @_[0]; $udat{SAMURAI_Perm_vars}{id_sistema} = @_[1]; ##Conexion con la base $dns = $ret->{SAMURAI_Perm}->{parse_ini} (); my $dbh = DBI->connect($dsn->{dsn}, $dsn->{user}, $dsn->{password}); ##Obtengo los permisos de la base $re = $dbh->prepare($sql); $re->execute($udat{SAMURAI_Perm_vars}{login}); while ($r = $re->fetchrow_hashref()) { push (@{$permisos{$r->{sistema}}}, $r->{permiso}); } $re->finish(); #Desconexion con la base $dbh->disconnect; $udat{SAMURAI_Perm_vars}{permisos} = \%permisos; #Se asignan a $udat para que esten disponibles siempre }; # Set Sistema. # # @param int $sistema Sistema. # # @return void $SAMURAI_Perm->{setSistema} = sub { $udat{SAMURAI_Perm_vars}{id_sistema} = @_[0]; }; # Verifica si tiene un permiso. # Se puede pasar parametros variables con un identificador de permiso, # por ejemplo: # $ret->{SAMURAI_PERM}->{tiene}(1, 4, 12); # # Si tiene algun permiso devuelve true. Si no se pasa ningun parametro # ($perm->tiene()), devuelve true si tiene un permiso (al menos uno) en el # sistema actual. # # @return bool $SAMURAI_Perm->{tiene} = sub { if (!scalar(@_)) { #Devuelvo true si tiene al menos un permiso if (scalar ($udat{SAMURAI_Perm_vars}{permisos}{$udat{SAMURAI_Perm_vars}{id_sistema}})) { return 1; } else { return 0; } } else { foreach $arg (@_) { foreach $perm (@{$udat{SAMURAI_Perm_vars}{permisos}{$udat{SAMURAI_Perm_vars}{id_sistema}}}) { if ($arg == $perm) { return 1; } } } return 0; } }; # Obtiene una lista de permisos. Si se especifica un sistema, obtiene la lista de permisos para ese sistema. # # @param int $sistema Sistema del cual obtener la lista de permisos. # # @return array $SAMURAI_Perm->{getPermisos} = sub { if (!scalar(@_)) { return $udat{SAMURAI_Perm_vars}{permisos}{$udat{SAMURAI_Perm_vars}{id_sistema}}; } else { return $udat{SAMURAI_Perm_vars}{permisos}{@_[0]}; } }; # Chequea si un usuario puede acceder o no a una pagina. En caso de no tener # permisos automaticamente lo redirige a una pagina de error. # # @return void $SAMURAI_Perm->{chequear} = sub { if (!$ret->{SAMURAI_Perm}->{tiene} (@_)) { open (ARCHORIG , "/var/www/meconlib/lib/MECON/includes/no_autorizado.html") or die "POROTO"; while (my $linea = ) { print $linea } exit; } }; # Obtiene las observaciones de un permiso para un sistema. # # @param int $perm Obtiene las observaciones de un permiso para un sistema. # @param int $sistema Sistema al cual pertenecen los permisos. # # @return array $SAMURAI_Perm->{getObservaciones} = sub { $perm = @_[0]; if (scalar(@_[1])) { $sistema = @_[1]; } else { $sistema = $udat{SAMURAI_Perm_vars}{id_sistema}; } if (!$udat{SAMURAI_Perm_vars}{observaciones}{$sistema}{$perm}) { $udat{SAMURAI_Perm_vars}{observaciones} = ''; $sql = 'SELECT ps.observaciones AS observaciones FROM samurai.perm_sist AS ps WHERE ps.id_permiso = ? AND ps.id_sistema = ?'; ##Conexion con la base $dns = $ret->{SAMURAI_Perm}->{parse_ini} (); my $dbh = DBI->connect($dsn->{dsn}, $dsn->{user}, $dsn->{password}); $re = $dbh->prepare($sql); $re->execute($perm, $sistema); while ($r = $re->fetchrow_hashref()) { push (@{$obser{$sistema}{$perm}}, $r->{observaciones}); } $re->finish(); #Desconexion con la base $dbh->disconnect; $udat{SAMURAI_Perm_vars}{observaciones} = \%obser; return $udat{SAMURAI_Perm_vars}{observaciones}; } }; # MANAZAR: Funcion para dar un perfil a un usuario en un sistema # # @return void $SAMURAI_Perm->{asignarPerfil} = sub { $id_perfil = @_[0]; my $login=$udat{SAMURAI_Perm_vars}{login}; my $id_sistema=$udat{SAMURAI_Perm_vars}{id_sistema}; my $resp=$udat{'user'}; my $sql = "REPLACE INTO perfil_sist_usuario (login,id_perfil,id_sistema,responsable) VALUES ('$login',$id_perfil,$id_sistema,'$resp')"; ##Conexion con la base $dns = $ret->{SAMURAI_Perm}->{parse_ini} (); my $dbh = DBI->connect($dsn->{dsn}, $dsn->{user}, $dsn->{password}); my $result=$dbh->do($sql); #Desconexion con la base $dbh->disconnect; }; # MANAZAR: Funcion para quitar perfil a un usuario en un sistema # # @return void $SAMURAI_Perm->{quitarPerfil} = sub { $id_perfil = @_[0]; my $login=$udat{SAMURAI_Perm_vars}{login}; my $id_sistema=$udat{SAMURAI_Perm_vars}{id_sistema}; my $resp=$udat{'user'}; my $sql = "DELETE FROM perfil_sist_usuario where (login='$login') AND (id_perfil=$id_perfil) AND (id_sistema=$id_sistema)"; ##Conexion con la base $dns = $ret->{SAMURAI_Perm}->{parse_ini} (); my $dbh = DBI->connect($dsn->{dsn}, $dsn->{user}, $dsn->{password}); ##Conexion con la base my $result=$dbh->do($sql); #Desconexion con la base $dbh->disconnect; }; !] [- $ret = shift; $ret->{SAMURAI_Perm} = $SAMURAI_Perm; -]