App-SilverSplash
view release on metacpan or search on metacpan
lib/App/SilverSplash/Apache2.pm view on Meta::CPAN
# check to see if we can find a mac address for this paypal_id
my $found = $class->get("paypal_id|$id");
my ( $mac, $ip ) = split( /\|/, $found );
my $added = App::SilverSplash::IPTables->add_to_paid_chain( $mac, $ip );
return Apache2::Const::OK;
}
# base level request handler
sub handler {
my ( $class, $r ) = @_;
my $ip = $r->connection->remote_ip;
$r->log->debug("$$ new request ip $ip") if DEBUG;
$r->log->debug( "request: " . $r->as_string ) if DEBUG;
# "Thou shalt not pass!" - Gandalf
my $mac = $class->mac_from_ip($ip);
unless ($mac) {
$r->no_cache(1);
$r->content_type('text/plain');
$r->print(
"Please renew your DHCP lease, or reboot your computer to get a valid DHCP lease"
);
return Apache2::Const::OK;
}
return Apache2::Const::HTTP_METHOD_NOT_ALLOWED
if ( $r->header_only or ( $r->method_number != Apache2::Const::M_GET ) );
return Apache2::Const::HTTP_SERVICE_UNAVAILABLE
unless $r->headers_in->{'user-agent'};
my $dest_url = $r->construct_url( $r->unparsed_uri );
# check to see if this mac has been authenticated already
my $authed = $class->check_auth( $mac, $ip );
if ($authed) {
# this is a known mac, go on to the web
$r->log->debug("$$ valid mac $mac, redirect to $dest_url") if DEBUG;
$r->headers_out->set( Location => $dest_url );
$r->no_cache(1);
return Apache2::Const::REDIRECT;
}
my %tmpl = (
perlbal => 'http://' . $class->lan_ip . ':' . $Config->sl_perlbal_port,
cdn_host => $Config->sl_cdn_host,
mac => URI::Escape::uri_escape($mac),
url => URI::Escape::uri_escape($dest_url),
cp_mac => URI::Escape::uri_escape( $class->wan_mac ),
provider_href => $Config->sl_account_website,
provider_logo => $Config->sl_account_logo,
);
$r->content_type('text/html; charset=UTF-8');
$r->no_cache(1);
$r->rflush;
my $output;
$Template->process( 'splash.tmpl', \%tmpl, \$output )
|| die $Template->error;
$r->print($output);
return Apache2::Const::OK;
}
# authentication requests for free service
sub free {
my ( $class, $r ) = @_;
my $ip = $r->connection->remote_ip;
my $mac = $class->mac_from_ip($ip);
return Apache2::Const::NOT_FOUND unless $mac;
my $req = Apache2::Request->new($r);
my $url = $req->param('url');
# serve the page or process the request
if ( $r->method_number == Apache2::Const::M_GET ) {
my %tmpl = (
perlbal => 'http://'
. $class->lan_ip . ':'
. $Config->sl_perlbal_port,
cdn_host => $Config->sl_cdn_host,
mac => URI::Escape::uri_escape($mac),
url => $url, #URI::Escape::uri_escape($url),
cp_mac => URI::Escape::uri_escape( $class->wan_mac ),
provider_href => $Config->sl_account_website,
provider_logo => $Config->sl_account_logo,
);
my $output;
$Template->process( 'free.tmpl', \%tmpl, \$output )
|| die $Template->error;
$r->content_type('text/html; charset=UTF-8');
$r->no_cache(1);
$r->rflush;
$r->print($output);
return Apache2::Const::OK;
}
elsif ( $r->method_number == Apache2::Const::M_POST ) {
my $terms = $req->param('terms');
unless ($terms) {
$r->method_number(Apache2::Const::M_GET);
return $class->free($r);
}
# they clicked yes, authenticate
my $added = App::SilverSplash::IPTables->add_to_ads_chain( $mac, $ip );
unless ($added) {
$r->log->error("$$ error adding mac $mac to ads chain: $@");
return Apache2::Const::SERVER_ERROR;
}
my $location =
$class->make_post_url( $Config->sl_splash_href,
URI::Escape::uri_escape($url) );
$r->headers_out->set( Location => $location );
$r->no_cache(1);
return Apache2::Const::REDIRECT;
}
}
sub paid {
my ( $class, $r ) = @_;
my $ip = $r->connection->remote_ip;
my $mac = $class->mac_from_ip($ip);
return Apache2::Const::NOT_FOUND unless $mac;
my $req = Apache2::Request->new($r);
my $url = $req->param('url');
# serve the page or process the request
if ( $r->method_number == Apache2::Const::M_GET ) {
my $p = Business::PayPal->new;
my $id = $p->id;
my $b = $p->button(
'item_number' => 1,
'business' => $Config->sl_paypal_account,
'item_name' => 'airCloud WiFi Purchase',
'notify_url' => 'http://'
. $Config->sl_dmz_listen
. "/ipn_validate?url=$url&id=$id",
'return' => $Config->sl_splash_href,
'cancel_return' => 'http://'
. $class->lan_ip
. ":9999/paid?url=$url",
'amount' => '0.05',
'quantity' => 1,
'button_image' => CGI::image_button(
-name => 'submit',
-src =>
'http://s1.slwifi.com/images/buttons/3_hour_service.png',
-alt => 'Make payments with PayPal',
),
);
$class->set( "paypal_id|$id" => "$mac|$ip" );
my %tmpl = (
perlbal => 'http://'
. $class->lan_ip . ':'
. $Config->sl_perlbal_port,
cdn_host => $Config->sl_cdn_host,
mac => URI::Escape::uri_escape($mac),
url => $url, #URI::Escape::uri_escape($url),
cp_mac => URI::Escape::uri_escape( $class->wan_mac ),
provider_href => $Config->sl_account_website,
provider_logo => $Config->sl_account_logo,
button => $b,
);
my $output;
$Template->process( 'paid.tmpl', \%tmpl, \$output )
|| die $Template->error;
$r->content_type('text/html; charset=UTF-8');
$r->no_cache(1);
$r->rflush;
$r->print($output);
return Apache2::Const::OK;
}
elsif ( $r->method_number == Apache2::Const::M_POST ) {
my $terms = $req->param('terms');
unless ($terms) {
$r->method_number(Apache2::Const::M_GET);
return $class->free($r);
}
# they clicked yes, authenticate
my $added = App::SilverSplash::IPTables->add_to_paid_chain( $mac, $ip );
unless ($added) {
$r->log->error("$$ error adding mac $mac to paid chain: $@");
return Apache2::Const::SERVER_ERROR;
}
}
$mac = URI::Escape::uri_escape($mac);
$url = URI::Escape::uri_escape($url);
# else we have an authenticated user
my $location = $class->make_post_url( $Config->sl_splash_href, $url );
$r->headers_out->set( Location => $location );
$r->no_cache(1);
return Apache2::Const::REDIRECT;
}
sub make_post_url {
my ( $class, $splash_url, $dest_url ) = @_;
$dest_url = URI::Escape::uri_escape($dest_url);
my $separator = ( $splash_url =~ m/\?/ ) ? '&' : '?';
my $location = $splash_url . $separator . "url=$dest_url";
return $location;
}
1;
__END__
=cut
# throttling code
my $c = $r->connection;
if (my $attempts = $c->pnotes($c->remote_ip)) {
my $count = $attempts->{count};
my @times = @{$attempts->{times}};
my $idx;
( run in 2.976 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )