Re: Deleting a cookie

2001-11-27 Thread Mohit Agarwal

On Tue, 27 Nov 2001, Jon Robison wrote:

 My only problem is that I want to provide the users with a logout
 button which will delete the cookie from thier browser, yet I cannot
 find how!.  I have reviewed every module on my system with 'Cookie'
 in the name (Apache::Cookie, CGI::Cookie, etc.) and nowhere does it
 tell how to do this. There is a small mention of changing the
 expiration to  0, but apparently I am doing it wrong (possible
 confusing point is the use of an 'expires' value in the cookie
 itself, seperate, I think, from the 'expires' attribute on the
 cookie?)

Never tried the negative value for expiration time, but setting it to
a very small value, say 1s, works.  I'm not sure, but setting the
cookie value to null should also have the same effect.




Re: Deleting a cookie

2001-11-27 Thread Mithun Bhattacharya

Mohit Agarwal wrote:
 


 Never tried the negative value for expiration time, but setting it to
 a very small value, say 1s, works.  I'm not sure, but setting the
 cookie value to null should also have the same effect.


I believe setting the expiry date less than the current time should
work.



Mithun



Re: Deleting a cookie

2001-11-27 Thread Nick Tonkin


Expiring the cookie works well for me. Here's what I have:

sub handler {

[ ... ]

if ($r-uri =~ /logout/) {
if (my $cookie = destroy_cookie($r)) {
return logout_screen($r);
} else {
return 500;
}
}

[ ... ]

}

sub destroy_cookie {
my $r = shift;

# you may or may not be using this
my $auth_domain = $r-dir_config('Auth_Domain');
 
my $cookie =  Apache::Cookie-new(
$r,
expires = -24h,
domain  = $auth_domain,
name= 'auth', # whatever you've called it
path= '/',
value   = ''
);
   
$cookie-bake;
return $cookie;
}

sub logout_screen {

[ ... ]

}

1;


~~~
Nick Tonkin

On Tue, 27 Nov 2001, Jon Robison wrote:

 I have created a login system using the wonderful Ticket system from the
 Eagle book.  I have modified TicketAccess so that after authentication,
 it reviews the arguments in the query string and does push_handler, the
 handler being chosen based on the args.
 
 My only problem is that I want to provide the users with a logout button
 which will delete the cookie from thier browser, yet I cannot find how!.
 I have reviewed every module on my system with 'Cookie' in the name
 (Apache::Cookie, CGI::Cookie, etc.) and nowhere does it tell how to do
 this. There is a small mention of changing the expiration to  0, but
 apparently I am doing it wrong (possible confusing point is the use of
 an 'expires' value in the cookie itself, seperate, I think, from the
 'expires' attribute on the cookie?)
 
 I know it is a lot to ask, but I am relatively new to this part of
 mod_perl (pushing handlers, etc.), so if anyone can look at this and
 replace my BLOCKED comments with a couple of helpfull lines, I would
 greatly appreciate it! 
 
 Thanks in advance - 
 
 Jonathon Robison
 
 
 Below is my modified TicketAccess, as well as the Logout module I am
 re-directing to for logout action:
 =
 package FES::Apache::TicketAccess;
 
 use strict;
 use Apache::Constants qw(:common);
 use FES::Apache::TicketTool ();
 
 sub handler {
 my $r = shift;
   my %input = $r-args;  
 # for checking input items
 my $ticketTool = FES::Apache::TicketTool-new($r);
 my($result, $msg) = $ticketTool-verify_ticket($r);
 unless ($result) {
   $r-log_reason($msg, $r-filename);
   my $cookie = $ticketTool-make_return_address($r);
   $r-err_headers_out-add('Set-Cookie' = $cookie);
   return FORBIDDEN;
 }
   ## Here is where we need to insert a push_handler insert. I won't need
   ## the requested uri from the $r, since the $r goes along for the ride
 in## push_handler
 
   my $action = defined $input{'act'} ? $input{'act'} : 'view';
 
   print STDERR action is defined as $action\n;  ## DEBUGGING
 
   if ($action eq 'logout')  {
   $r-push_handlers('PerlHandler' = 'FES::Control::Logout');
   return OK;
   } elsif ($action eq 'view') {
   $r-push_handlers('PerlHandler' = 'FES::Control::View');
   return OK;
   }   else {
   $r-push_handlers('PerlHandler' = 'FES::Control::View');
   return OK;
   }
## ARE THOSE THE CORRECT THINGS TO 'RETURN' FOR THESE CASES?
  
 }
 
 1;
 ==
 
 And the Logout.pm:
 
 =
 package FES::Control::Logout;
 
 use strict;
 use Apache;
 use Apache::Constants qw(:common);
 use FES::Common::Common qw( header footer);
 use CGI qw/:standard/;
 use CGI::Cookie;
 
 sub handler {
   my $r = shift;
   my $q = new CGI;
   my $ticket = _get_ticket('r' = $r);
 
 ## HERE IS WHERE I NEED TO 1.) DELETE USER'S TICKET COOKIE AND
 ## 2.) REDIRECT THEM TO /FES (w/o bringing old
 $r),(WHERE THEY SHOULD GET
 ## A NEW LOGIN SCREEN BECAUSE COOKIE IS
 GONE.)
 
 }
 
 sub _get_ticket {
   my $args = {
   'r' = undef,
   @_
   };
   my $r = $args-{'r'};
   my %cookies = CGI::Cookie-parse($r-header_in('Cookie'));
 # TESTING
   my %ticket = $cookies{'Ticket'}-value;  # TESTING
   return \%ticket;
 }
 
 1;
 =
 




Re: Deleting a cookie

2001-11-27 Thread Mark Maunder

Jon Robison wrote:

 I have created a login system using the wonderful Ticket system from the
 Eagle book.  I have modified TicketAccess so that after authentication,
 it reviews the arguments in the query string and does push_handler, the
 handler being chosen based on the args.

 My only problem is that I want to provide the users with a logout button
 which will delete the cookie from thier browser, yet I cannot find how!.

Jon,

I had the same problem and could not succesfully delete the cookie from all browsers 
(IE, Netscape, Konqueror, Lynx, Opera etc.). I eventually solved
it by keeping the existing (session) cookie which was assigned when the user first 
logged in, but marking the user as logged out on the server side.
i.e. associate a user cookie with session data stored in a database, and instead of 
deleting the cookie on the client side, just set something on the
server side session information that marks the user as having logged out. If the user 
then logs in again, just reuse the same cookie and mark the user
as having logged in. This way you only have to assign an authentication cookie once 
per browser session.

This may be tough to drop into TicketTool because IIRC it stores the authentication 
info in the cookie itself, rather than a server side session it
associates with a cookie. Not very helpful, but it's another approach. I'd like to 
hear if you get it working across various browsers by expiring the
cookie - for future ref.

~mark




Re: Deleting a cookie

2001-11-27 Thread Hans Poo

El Mar 27 Nov 2001 10:21, Jon Robison escribió:
 I have created a login system using the wonderful Ticket system from the
 Eagle book.  I have modified TicketAccess so that after authentication,
 it reviews the arguments in the query string and does push_handler, the
 handler being chosen based on the args.

 My only problem is that I want to provide the users with a logout button
 which will delete the cookie from thier browser, yet I cannot find how!.
 I have reviewed every module on my system with 'Cookie' in the name
 (Apache::Cookie, CGI::Cookie, etc.) and nowhere does it tell how to do
 this. There is a small mention of changing the expiration to  0, but
 apparently I am doing it wrong (possible confusing point is the use of
 an 'expires' value in the cookie itself, seperate, I think, from the
 'expires' attribute on the cookie?)

 I know it is a lot to ask, but I am relatively new to this part of
 mod_perl (pushing handlers, etc.), so if anyone can look at this and
 replace my BLOCKED comments with a couple of helpfull lines, I would
 greatly appreciate it!

 Thanks in advance -

 Jonathon Robison


 Below is my modified TicketAccess, as well as the Logout module I am
 re-directing to for logout action:
 =
 package FES::Apache::TicketAccess;

 use strict;
 use Apache::Constants qw(:common);
 use FES::Apache::TicketTool ();

 sub handler {
 my $r = shift;
   my %input = $r-args;  
 # for checking input items
 my $ticketTool = FES::Apache::TicketTool-new($r);
 my($result, $msg) = $ticketTool-verify_ticket($r);
 unless ($result) {
   $r-log_reason($msg, $r-filename);
   my $cookie = $ticketTool-make_return_address($r);
   $r-err_headers_out-add('Set-Cookie' = $cookie);
   return FORBIDDEN;
 }
   ## Here is where we need to insert a push_handler insert. I won't need
   ## the requested uri from the $r, since the $r goes along for the ride
 in## push_handler

   my $action = defined $input{'act'} ? $input{'act'} : 'view';

   print STDERR action is defined as $action\n;  ## DEBUGGING

   if ($action eq 'logout')  {
   $r-push_handlers('PerlHandler' = 'FES::Control::Logout');
   return OK;
   } elsif ($action eq 'view') {
   $r-push_handlers('PerlHandler' = 'FES::Control::View');
   return OK;
   }   else {
   $r-push_handlers('PerlHandler' = 'FES::Control::View');
   return OK;
   }
## ARE THOSE THE CORRECT THINGS TO 'RETURN' FOR THESE CASES?

 }

 1;
 ==

 And the Logout.pm:

 =
 package FES::Control::Logout;

 use strict;
 use Apache;
 use Apache::Constants qw(:common);
 use FES::Common::Common qw( header footer);
 use CGI qw/:standard/;
 use CGI::Cookie;

 sub handler {
   my $r = shift;
   my $q = new CGI;
   my $ticket = _get_ticket('r' = $r);

 ## HERE IS WHERE I NEED TO 1.) DELETE USER'S TICKET COOKIE AND
 ## 2.) REDIRECT THEM TO /FES (w/o bringing old
 $r),(WHERE THEY SHOULD GET
 ## A NEW LOGIN SCREEN BECAUSE COOKIE IS
 GONE.)

 }

 sub _get_ticket {
   my $args = {
   'r' = undef,
   @_
   };
   my $r = $args-{'r'};
   my %cookies = CGI::Cookie-parse($r-header_in('Cookie'));
 # TESTING
   my %ticket = $cookies{'Ticket'}-value;  # TESTING
   return \%ticket;
 }

 1;
 =

Set it again with an expiration time of 'now', i actually use it with CGI.pm

You  can send it with a custom invalid value, like 'invalidated', and take 
apropriate actions.

Hans Poo