+[#
+ 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 <mmarre@mecon.gov.ar> |
+ +--------------------------------------------------------------------+
+ $Id$
+
+ Libreria para el manejo de permisos para perl.
+#]
+[!
+$CLEANUP{'SAMURAI_Perm'} = 0;
+
+# 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.isd_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
+ #TODO Cambiar los parametros de conexion segun corresponda.
+ my $dbh = DBI->connect('dbi:mysql:dbname=samurai;host=bal747f',"intranet","intranet");
+ ##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
+# TODO Probar que esto este funcionando bien.
+$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 = <ARCHORIG>) {
+ 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 = ?';
+ my $dbh = DBI->connect('dbi:mysql:dbname=samurai;host=bal747f',"intranet","intranet");
+ $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}{$sistema}{$perm} = \%obser;
+
+ return $obser;
+ }
+};
+!]
+[-
+ $ret = shift;
+ $ret->{SAMURAI_Perm} = $SAMURAI_Perm;
+-]
+