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 )