• Publicidad

ayuda con cgi

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

ayuda con cgi

Notapor AkonD » 2006-08-23 10:23 @474

Nose que pasa con este cgi que no acaba de funcionarme i no encuentro el error :S

el cgi no responde cuando se manda el form

Código: Seleccionar todo
#!/usr/bin/perl -w

use strict;
use CGI;
use CGI::Cookie;
use IO::Socket;
use CGI::Session;

my $session;
my $cgi = new CGI;
my $url = $cgi->url();

#exit if ($url ne $ENV{'HTTP_REFERER'});

my $conf = {
   irc_server => 'irc.redmundial.org',
   irc_port   => 6668,
   irc_nick   => 'WeBPerfil',
   irc_pass   => 'xxxxx',
   session_path => '/var/tmp',
   session_expire => '+2h',
   cookie_path => '/rm',
   cookie_domain => '.redmundial.org',
   cookie_httponly => 'true'
};

#recoje las cokies del navegador
my %cookies = fetch CGI::Cookie;
#si existe la cookie de session guardamos el sid
my $CGISESSID = $cookies{'CGISESSID'};
#recoje el form
my %FORM = $cgi->Vars;

#recoje una sesion si existe
if ($CGISESSID) {
   #recupera una session con el sid de la cookie
        $session = new CGI::Session("driver:File", $CGISESSID, {Directory=> $conf->{session_path}});
   #si la session existe deveria devolver el nick
   my $nick = $session->param('nick');
   #sino existe el nick elimina la session
   if (!$nick) {
      $session->delete();
      undef $session;
      undef $CGISESSID;
#      print "Set-Cookie: CGISESSID=0; expires=22-Nov-1985 00:00:00 GTM; path=/rm; domain=.redmundial.org \n";
   }
}

#si estan mandando el form i no ai session
if (!$session and %FORM and !$CGISESSID) {
   if (!$FORM{'pass'} or !$FORM{'nick'}) {
      print $cgi->header;
      print $cgi->start_html;
      print <<EOT;
      <form name="perfil_login" id="perfil_login" method="post" action="$url">
      <p>Identifícate poniendo tu nick y tu contraseña de acceso a la red de IRC. Recuerda que estos datos son los de tu nick registrado en <a href="http://redmundial.org">irC.redmundial.oRg</a></p>
      <p>Al ser usuario autentificado tendrás acceso a más funcionalidades del web.</p>
      <p>Nick: <input type="text" id="nick"></p>
      <p>Contraseña: <input type="password" id="pass"></p>
      <p><input type="submit" value="Identificarse"></p>
      </form>
      <h1>Respuesta de Identificación</h1>
      <p>Debes Rellenar Todos los Campos del Formulario</p>
EOT
   }
   else {
      my $html = perfil_login($FORM{'nick'}, $FORM{'pass'});
      print $html;
   }
}
#se manda el form i ya existe la session
elsif ($session and %FORM and $CGISESSID) {
   print $cgi->header;
   print $cgi->start_html;
   my $nick = $session->param('nick');
   print <<EOT;
   <h1>Respuesta de Identificación</h1>
   <p>Ya estabas Identificado</p>
   <p>tu nick es: $nick</p>
   <p>tu id de session es: $CGISESSID</p>
EOT
}
#no se manda el form i no ai session
elsif (!$session and !%FORM  and !$CGISESSID) {
   print $cgi->header;
   print $cgi->start_html;
   print <<EOT;
   <form name="perfil_login" id="perfil_login" method="post" action="$url">
   <p>Identifícate poniendo tu nick y tu contraseña de acceso a la red de IRC. Recuerda que estos datos son los de tu nick registrado en <a href="http://redmundial.org">irC.redmundial.oRg</a></p>
   <p>Al ser usuario autentificado tendrás acceso a más funcionalidades del web.</p>
   <p>Nick: <input type="text" id="nick"></p>
   <p>Contraseña: <input type="password" id="pass"></p>
   <p><input type="submit" value="Identificarse"></p>
   </form>
EOT
}
#si la session existe i es valida
else {
   print $cgi->header;
   print $cgi->start_html;
   my $sid = $session->id();
   my $nick = $session->param('nick');
   print <<EOT;
   <p>Eres un usuario Identificado</p>
   <p>tu nick es: $nick</p>
   <p>tu id de session es: $CGISESSID</p>
EOT
}

print $cgi->end_html;
exit;

sub perfil_login {
   
   my ($nick, $pass, $return) = (shift, shift, undef);
   
   $nick = lc($nick);
   #crea el socket con el irc
   my $socket = IO::Socket::INET->new(
      Proto => "tcp",
      PeerAddr => $conf->{irc_server},
      PeerPort => $conf->{irc_port})
   or die "No he podido conectar!\n";
   
   $socket->autoflush(1);
      
   #enviamos datos al irc para conectar a la red
   print $socket "NICK ".$conf->{irc_nick}."!".$conf->{irc_pass}."\r\n";
   print $socket "USER WebPerfiles - - :WeB Perfiles\r\n";
   
   #lectura del socket
   while(defined(my $linia=<$socket>)) {
      #borra final de linia i retorno de carro del socket
      chomp($linia); chomp($linia);
      #crea un array con el contenido de cada string que nos envia el irc
      my(@recibido) = split(" ", $linia);
      #respuest al ping de irc
      print $socket "PONG $recibido[1]\r\n" if ($recibido[0] eq "PING");
      #cuando recibe la informacion del MOTD le dice al bot nick que le de la pass del nick del formulario
      print $socket "PRIVMSG NICK GETPASS $nick\r\n" if ($recibido[1] eq '422');
      #procesa la respuesta del bot nick
      if ($recibido[0] eq ':[email protected]' and $recibido[1] eq 'PRIVMSG') {
         my $realpwd = $recibido[8];
         #kita los colores i caracteres no deseados
         $realpwd =~ s/\003(\d{1,2})(\,(\d{1,2})|)//g;
         $realpwd =~ s/[\x00-\x1f]//g;
         $realpwd =~ s/.$//;
         #si la pass no es correcta
         if ($pass ne $realpwd) {
            $return .= $cgi->header;
            $return .= $cgi->start_html;
            $return .=<<EOT;
            <form name="perfil_login" id="perfil_login" method="post" action="$url">
            <p>Identifícate poniendo tu nick y tu contraseña de acceso a la red de IRC. Recuerda que estos datos son los de tu nick registrado en <a href="http://redmundial.org">irC.redmundial.oRg</a></p>
            <p>Al ser usuario autentificado tendrás acceso a más funcionalidades del web.</p>
            <p>Nick: <input type="text" id="nick"></p>
            <p>Contraseña: <input type="password" id="pass"></p>
            <p><input type="submit" value="Identificarse"></p>
            </form>
            <h1>Respuesta de Identificación</h1>
            <p>La Contraseña que introdujo No coincíde con la del Nick o el Nick que introdujo no está registrado</p>
EOT
            #salimos del while
            last;
         }
         #si la pass es correcta creamos una session y luego asignamos una cookie con el sid de la session
         if ($pass eq $realpwd) {
            $session = new CGI::Session("driver:File", undef, {Directory=> $conf->{session_path}});
            my $cookie = $cgi->cookie(
                        -name=>$session->name,
                        -value=>$session->id,
                        -expires=>$conf->{session_expire},
                        -path=>$conf->{cookie_path},
                        -domain=>$conf->{cookie_domain},
                        -httponly=> $conf->{cookie_httponly}
                     );
            $return .= $cgi->header(-cookie => $cookie);
            $return .= $cgi->start_html;
            $session->expire($conf->{session_expire});
            $session->param('nick', $nick);
            my $sid = $session->id();
            $return .=<<EOT;
            <h1>Respuesta de Identificación</h1>
            <p>Bienvenido $nick ahora estas identificado.</p>
            <p>tu id de session es: $sid</p>
EOT
            last;
         }
      }
   }
   $socket->close();
   return $return;
}


Si alguien sabe pls

Salu2
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Publicidad

Notapor explorer » 2006-08-23 10:33 @481

La sintaxis está bien.
¿Has comprobado que tienes permiso de ejecución?
¿Permisos de los directorios y ficheros para poder leer y escribir en ellos?
Prueba con mi CGI mínimo para ver si funciona el sistema de cgi.
Usa el módulo CGI::Carp para que los errores salgan por el navegador.
¿Has mirado los registros de actividad? ¿Qué dicen los de errores?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor AkonD » 2006-08-23 10:40 @486

si le di chmod 755 i tiene permisos en la karpeta k guarda las sessiones
tngo varios cgis corriendo en el server el mod_perl esta..

lo del CGI Carp ni idea de como se usa.. ara exare un ojo en cpan

como miro los registros d actividad?

Salu2 i gracias
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor danimera » 2006-08-23 13:25 @601

Mira yo podria votar por que tienes un problema a enviar lo header

Si el no los encuentra correctos, quizas no te muestre nada en pantalla, tuve un error muy parecido.

Intenta verlo de todas maneras lo probare a ver que pasa
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor explorer » 2006-08-23 14:49 @659

El problema está en que utiliza 'id' como atributos en las marcas <input>, cuando lo correcto debería ser 'name'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados