sidikiisajawa
asked on
how do i include a query string when running do("scriptname.cgi"); from a perl script
I have a site which requires a login. (mydomain.com)
suppose I send someone the following url in an email.
(mydomain.com/bla.cgi?file name=bla&t oken=blabl a)
if the user clicks the link, without a login cookie, they are directed to the login screen. (mydomain.com/index.cgi)
Upon a successfull login, I want to redirect the user to the page of the original url (ie: mydomain.com/bla.cgi?filen ame=bla&to ken=blabla )
I was thinking the easiest way would be something like this:
bla.cgi
-------------------------- ---------- ------
my $logged_in = cookie('login');
####
#this code is wronge, but it illustrates what i am trying to do
####
do ("log_in.cgi?return_pos='b la.cgi\?fi lename=bla \&token=bl abla'") unless ($logged_in);
#bla.cgi continues. . .
-------------------------- ---------- ------
passcheck.cgi
-------------------------- ---------- ------
#successfull login takes place, cookie set, etc. . .
$form = new CGI;
my $RETURN_POS = $form->param('return_pos') ;
do("$RETURN_POS);
-------------------------- ---------- ------
the problem is I don't think you can put the query string in the do('scriptname.cgi'); unless I am just doing it wrong. Anyone know how to make this work or have other suggestions?
thanks!
suppose I send someone the following url in an email.
(mydomain.com/bla.cgi?file
if the user clicks the link, without a login cookie, they are directed to the login screen. (mydomain.com/index.cgi)
Upon a successfull login, I want to redirect the user to the page of the original url (ie: mydomain.com/bla.cgi?filen
I was thinking the easiest way would be something like this:
bla.cgi
--------------------------
my $logged_in = cookie('login');
####
#this code is wronge, but it illustrates what i am trying to do
####
do ("log_in.cgi?return_pos='b
#bla.cgi continues. . .
--------------------------
passcheck.cgi
--------------------------
#successfull login takes place, cookie set, etc. . .
$form = new CGI;
my $RETURN_POS = $form->param('return_pos')
do("$RETURN_POS);
--------------------------
the problem is I don't think you can put the query string in the do('scriptname.cgi'); unless I am just doing it wrong. Anyone know how to make this work or have other suggestions?
thanks!
ASKER
Thanks for your comment rkosai, but the meta-refresh is not the answer i am looking for.
I tried this anyway, and it did not work. Does it work for you?
I tried this anyway, and it did not work. Does it work for you?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I'd be inclined to use param() to retrieve the GET parameters from the address bar, then embed them as hidden form elements in your login page, such that when post-processing the login page, you can redirect them using the same parameters that were originally passed in.
ASKER
rkosai, you are right, thanks!
Here is what i ended up doing:
bla.cgi:
-------------------------- ---------- ---------- ---------- ---
#!/usr/bin/perl
#some other code
#. . .
#end some other code
my $url = "bla.cgi";
$url .= "?"."$ENV{QUERY_STRING}";
$url .= '&logjump=1';
$url = CGI::escape($url); #escape special characters
##
#make sure they log in
##
my $loggedin = cookie('pialogin');
#withoug this, we would get stuck in a neverending loop waiting for the cookie to be set
my $LOGJUMP = $form->param('logjump');
unless ($LOGJUMP){
unless ($loggedin > 1){
print "Location: index.cgi?from_url=$url\n\ n";
exit;
}
}
#functionality of bla.cgi follows
#. . .
#end bla.cgi
-------------------------- ---------- ---------- ---------- ---
loginscreen.cgi:
-------------------------- ---------- ---------- ---------- ---
#!/usr/bin/perl
#some other code follows:
#. . .
#end some other code
my $FROM_URL = $form->param('from_url');
print qq{<h3>Login</h3>
Sign in:<br />
<form method="post" action="authenticate.cgi">
<table>
<tr><td>Username: </td><td><input type="text" name="user"></td></tr>
<tr><td>Password: </td><td><input type="password" name="passwd"></td></tr>
</table>
<input type="hidden" name="from_url" value="$FROM_URL">
<input type="submit" class="buttonblue" value="Login">
</form>
};
-------------------------- ---------- ---------- ---------- ---
authenticate.cgi:
-------------------------- ---------- ---------- ---------- ---
#!/usr/bin/perl
#some other code follows:
#. . .
#end some other code
my $USER = $form->param("user"); #username entered
my $PASSWD = $form->param("passwd"); #password entered
my $result; #result code of authenticate()
my $FROM_URL = $form->param('from_url');
$result = authenticate("$USER","$PAS SWD"); #returns '0' for a sucessfull login
unless ($result){
print "Set-cookie: login=1\n\n";
print "Set-cookie: user=$USER\n\n";
print "Location: $FROM_URL"
}
#the rest of the code follows:
#if $result is not zero, login error, etc, etc. . .
#
-------------------------- ---------- ---------- ---------- ---
Here is what i ended up doing:
bla.cgi:
--------------------------
#!/usr/bin/perl
#some other code
#. . .
#end some other code
my $url = "bla.cgi";
$url .= "?"."$ENV{QUERY_STRING}";
$url .= '&logjump=1';
$url = CGI::escape($url); #escape special characters
##
#make sure they log in
##
my $loggedin = cookie('pialogin');
#withoug this, we would get stuck in a neverending loop waiting for the cookie to be set
my $LOGJUMP = $form->param('logjump');
unless ($LOGJUMP){
unless ($loggedin > 1){
print "Location: index.cgi?from_url=$url\n\
exit;
}
}
#functionality of bla.cgi follows
#. . .
#end bla.cgi
--------------------------
loginscreen.cgi:
--------------------------
#!/usr/bin/perl
#some other code follows:
#. . .
#end some other code
my $FROM_URL = $form->param('from_url');
print qq{<h3>Login</h3>
Sign in:<br />
<form method="post" action="authenticate.cgi">
<table>
<tr><td>Username: </td><td><input type="text" name="user"></td></tr>
<tr><td>Password: </td><td><input type="password" name="passwd"></td></tr>
</table>
<input type="hidden" name="from_url" value="$FROM_URL">
<input type="submit" class="buttonblue" value="Login">
</form>
};
--------------------------
authenticate.cgi:
--------------------------
#!/usr/bin/perl
#some other code follows:
#. . .
#end some other code
my $USER = $form->param("user"); #username entered
my $PASSWD = $form->param("passwd"); #password entered
my $result; #result code of authenticate()
my $FROM_URL = $form->param('from_url');
$result = authenticate("$USER","$PAS
unless ($result){
print "Set-cookie: login=1\n\n";
print "Set-cookie: user=$USER\n\n";
print "Location: $FROM_URL"
}
#the rest of the code follows:
#if $result is not zero, login error, etc, etc. . .
#
--------------------------
my $loc = 'mydomain.com/bla.cgi?file
if (!$logged_in) {
print "Location: mydomain.com/index.cgi\n\n
} else {
print "Location: $loc\n\n";
}