#!/usr/bin/perl
# your code goes here
# Relevant routes
my $if_login = $r -> under ( '/' ) -> to ( 'user#is_logged_in' ) ;
$if_login -> post ( '/logout' ) -> name ( 'on_logout' ) -> to ( 'user#on_logout' ) ;
# Controller functions
sub on_logout {
$self -> session ( expires => 1 ) ;
return $self -> render ( json
=> '{success: "true"}' ) ; }
sub is_logged_in {
say $self -> session ( 'username' ) ; # Sometimes after on_logout this is still
# defined and equal to the username.
return 1 if ( $self -> session ( 'username' ) ) ;
$self -> render (
template => 'permission/not_logged_in' ,
status => 403
) ;
}
# Front end
< a href= "" onclick= 'do_logout();' >
<%= l( 'Log out' ) %>
</ a>
<script>
function do_logout( ) {
$. post( "<%= url_for('on_logout') %>" , function( ) {
} ) . fail( function( ) {
alert( "error logging out" ) ;
} ) . done( function( data ) {
alert( "Data: " + data ) ;
} ) . always( function( ) {
alert( "finished" ) ;
} ) ;
}
</ script>
IyEvdXNyL2Jpbi9wZXJsCiMgeW91ciBjb2RlIGdvZXMgaGVyZQoKIyBSZWxldmFudCByb3V0ZXMKbXkgJGlmX2xvZ2luID0gJHItPnVuZGVyKCcvJyktPnRvKCd1c2VyI2lzX2xvZ2dlZF9pbicpOwokaWZfbG9naW4tPnBvc3QoJy9sb2dvdXQnKS0+bmFtZSgnb25fbG9nb3V0JyktPnRvKCd1c2VyI29uX2xvZ291dCcpOwoKIyBDb250cm9sbGVyIGZ1bmN0aW9ucwpzdWIgb25fbG9nb3V0IHsKICBteSAkc2VsZiA9IHNoaWZ0OwogICRzZWxmLT5zZXNzaW9uKGV4cGlyZXMgPT4gMSk7CgogIHJldHVybiAkc2VsZi0+cmVuZGVyKGpzb24gPT4gJ3tzdWNjZXNzOiAidHJ1ZSJ9Jyk7Cn0KCnN1YiBpc19sb2dnZWRfaW4gewogIG15ICRzZWxmID0gc2hpZnQ7CgogIHNheSAkc2VsZi0+c2Vzc2lvbigndXNlcm5hbWUnKTsgICMgU29tZXRpbWVzIGFmdGVyIG9uX2xvZ291dCB0aGlzIGlzIHN0aWxsCgkJCQkJCQkJICAgIyBkZWZpbmVkIGFuZCBlcXVhbCB0byB0aGUgdXNlcm5hbWUuCiAgcmV0dXJuIDEgaWYoJHNlbGYtPnNlc3Npb24oJ3VzZXJuYW1lJykpOwogIAogICRzZWxmLT5yZW5kZXIoCiAgICB0ZW1wbGF0ZSA9PiAncGVybWlzc2lvbi9ub3RfbG9nZ2VkX2luJywKICAgIHN0YXR1cyA9PiA0MDMKICApOwogIHJldHVybjsKfQoKIyBGcm9udCBlbmQKPGEgaHJlZj0iIiBvbmNsaWNrPSdkb19sb2dvdXQoKTsnPgogPCU9IGwoJ0xvZyBvdXQnKSAlPgo8L2E+Cgo8c2NyaXB0PgpmdW5jdGlvbiBkb19sb2dvdXQoKSB7CiAgJC5wb3N0KCAiPCU9IHVybF9mb3IoJ29uX2xvZ291dCcpICU+IiwgZnVuY3Rpb24oKSB7Cn0pLmZhaWwoZnVuY3Rpb24oKSB7CiAgYWxlcnQoICJlcnJvciBsb2dnaW5nIG91dCIgKTsKfSkuZG9uZShmdW5jdGlvbiggZGF0YSApIHsKICBhbGVydCggIkRhdGE6ICIgKyBkYXRhICk7Cn0pLmFsd2F5cyhmdW5jdGlvbigpIHsKICBhbGVydCggImZpbmlzaGVkIiApOwp9KTsKfQo8L3NjcmlwdD4K