Ark

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

Revision history for Perl module Ark

1.22 2020-03-13T11:56:42Z
    - fix dependencies

1.21 2020-03-13T06:48:52Z
    - support HttpOnly and SameSite in Plugin::Session::State::Cookie (mackee)

1.20 2013-11-20T07:41:04Z
    - [INCOMPATIBLE] rename X-JSON-Status to X-API-Status in View::JSON (hisaichi5518)
    - add View::JSON#status_code_header attribute
    - depends on HTML::Shakan 2.00

1.13 2013-11-19T11:16:09Z
    - X-JSON-Status support (hisaichi5518)
    - use JSON instead of JSON::Any in Ark::View::JSON

MANIFEST  view on Meta::CPAN

lib/Ark/Model.pm
lib/Ark/Model/Adaptor.pm
lib/Ark/Models.pm
lib/Ark/Plugin.pm
lib/Ark/Plugin/CSRFDefender.pm
lib/Ark/Plugin/Encoding/Null.pm
lib/Ark/Plugin/Encoding/Unicode.pm
lib/Ark/Plugin/FormValidator/Lite.pm
lib/Ark/Plugin/Session.pm
lib/Ark/Plugin/Session/Backend.pm
lib/Ark/Plugin/Session/State/Cookie.pm
lib/Ark/Plugin/Session/State/OpenSocial.pm
lib/Ark/Plugin/Session/State/URI.pm
lib/Ark/Plugin/Session/State/URI/ExtendContext.pm
lib/Ark/Plugin/Session/Store/Memory.pm
lib/Ark/Plugin/Session/Store/Model.pm
lib/Ark/Request.pm
lib/Ark/Response.pm
lib/Ark/Test.pm
lib/Ark/Test/Context.pm
lib/Ark/View.pm

META.json  view on Meta::CPAN

         }
      },
      "runtime" : {
         "recommends" : {
            "Text::MicroTemplate::Extended" : "0.09",
            "Text::Xslate" : "0"
         },
         "requires" : {
            "Class::Data::Inheritable" : "0",
            "Clone" : "0",
            "Cookie::Baker" : "0.11",
            "Data::UUID" : "0",
            "Devel::StackTrace" : "0",
            "Digest::SHA1" : "0",
            "Exporter::AutoClean" : "0",
            "FormValidator::Lite" : "0",
            "HTML::Escape" : "0",
            "HTML::Shakan" : "2.00",
            "HTTP::Cookies" : "0",
            "HTTP::Request" : "0",
            "JSON" : "0",
            "Mouse" : "1.00",
            "Object::Container" : "0.08",
            "Path::AttrRouter" : "0.03",
            "Path::Class" : "0.16",
            "Plack" : "0.9910",
            "Plack::Request::WithEncoding" : "0.10",
            "Text::MicroTemplate" : "0",
            "Text::SimpleTable" : "0",

META.json  view on Meta::CPAN

      },
      "Ark::Plugin::FormValidator::Lite" : {
         "file" : "lib/Ark/Plugin/FormValidator/Lite.pm"
      },
      "Ark::Plugin::Session" : {
         "file" : "lib/Ark/Plugin/Session.pm"
      },
      "Ark::Plugin::Session::Backend" : {
         "file" : "lib/Ark/Plugin/Session/Backend.pm"
      },
      "Ark::Plugin::Session::State::Cookie" : {
         "file" : "lib/Ark/Plugin/Session/State/Cookie.pm"
      },
      "Ark::Plugin::Session::State::OpenSocial" : {
         "file" : "lib/Ark/Plugin/Session/State/OpenSocial.pm"
      },
      "Ark::Plugin::Session::State::URI" : {
         "file" : "lib/Ark/Plugin/Session/State/URI.pm"
      },
      "Ark::Plugin::Session::State::URI::ExtendContext" : {
         "file" : "lib/Ark/Plugin/Session/State/URI/ExtendContext.pm"
      },

META.yml  view on Meta::CPAN

  Ark::Plugin::Encoding::Null:
    file: lib/Ark/Plugin/Encoding/Null.pm
  Ark::Plugin::Encoding::Unicode:
    file: lib/Ark/Plugin/Encoding/Unicode.pm
  Ark::Plugin::FormValidator::Lite:
    file: lib/Ark/Plugin/FormValidator/Lite.pm
  Ark::Plugin::Session:
    file: lib/Ark/Plugin/Session.pm
  Ark::Plugin::Session::Backend:
    file: lib/Ark/Plugin/Session/Backend.pm
  Ark::Plugin::Session::State::Cookie:
    file: lib/Ark/Plugin/Session/State/Cookie.pm
  Ark::Plugin::Session::State::OpenSocial:
    file: lib/Ark/Plugin/Session/State/OpenSocial.pm
  Ark::Plugin::Session::State::URI:
    file: lib/Ark/Plugin/Session/State/URI.pm
  Ark::Plugin::Session::State::URI::ExtendContext:
    file: lib/Ark/Plugin/Session/State/URI/ExtendContext.pm
  Ark::Plugin::Session::Store::Memory:
    file: lib/Ark/Plugin/Session/Store/Memory.pm
  Ark::Plugin::Session::Store::Model:
    file: lib/Ark/Plugin/Session/Store/Model.pm

META.yml  view on Meta::CPAN

  Ark::View::TT:
    file: lib/Ark/View/TT.pm
  Ark::View::Xslate:
    file: lib/Ark/View/Xslate.pm
recommends:
  Text::MicroTemplate::Extended: '0.09'
  Text::Xslate: '0'
requires:
  Class::Data::Inheritable: '0'
  Clone: '0'
  Cookie::Baker: '0.11'
  Data::UUID: '0'
  Devel::StackTrace: '0'
  Digest::SHA1: '0'
  Exporter::AutoClean: '0'
  FormValidator::Lite: '0'
  HTML::Escape: '0'
  HTML::Shakan: '2.00'
  HTTP::Cookies: '0'
  HTTP::Request: '0'
  JSON: '0'
  Mouse: '1.00'
  Object::Container: '0.08'
  Path::AttrRouter: '0.03'
  Path::Class: '0.16'
  Plack: '0.9910'
  Plack::Request::WithEncoding: '0.10'
  Text::MicroTemplate: '0'
  Text::SimpleTable: '0'

cpanfile  view on Meta::CPAN

requires 'Class::Data::Inheritable';
requires 'Clone';
requires 'Data::UUID';
requires 'Exporter::AutoClean';
requires 'FormValidator::Lite';
requires 'HTML::Escape';
requires 'HTML::Shakan', '2.00';
requires 'HTTP::Cookies';
requires 'HTTP::Request';
requires 'JSON';
requires 'Mouse', '1.00';
requires 'Object::Container', '0.08';
requires 'Path::AttrRouter', '0.03';
requires 'Path::Class', '0.16';
requires 'Plack::Request::WithEncoding', '0.10';
requires 'Plack', '0.9910';
requires 'Try::Tiny',   '0.02';
requires 'URI::WithBase';
requires 'perl', '5.008001';

requires 'Cookie::Baker', '0.11';
requires 'Digest::SHA1';

# Context::Debug
requires 'Devel::StackTrace';
requires 'Text::SimpleTable';
requires 'Text::MicroTemplate';

# templates
recommends 'Text::Xslate';
recommends 'Text::MicroTemplate::Extended', '0.09';

lib/Ark/Plugin/Session/State/Cookie.pm  view on Meta::CPAN

package Ark::Plugin::Session::State::Cookie;
use strict;
use warnings;
use Ark::Plugin 'Session';

has cookie_name => (
    is      => 'rw',
    isa     => 'Str',
    lazy    => 1,
    default => sub {
        my $self = shift;

lib/Ark/Test.pm  view on Meta::CPAN

package Ark::Test;
use Mouse;

use HTTP::Request;
use HTTP::Cookies;
use Plack 0.9910; # only for declare dep version
use Plack::Test;

use FindBin;
use Path::Class qw/dir/;

use Ark::Test::Context;

sub import {
    my ($class, $app_class, @rest) = @_;

lib/Ark/Test.pm  view on Meta::CPAN

                }
                $app->config->{home} ||= dir($FindBin::Bin);
            }

            if ($option{reuse_connection}) {
                if ($persist_app) {
                    $app = $persist_app;
                }
                else {
                    $persist_app = $app;
                    $cookie = HTTP::Cookies->new;
                }
            }

            my $req = ref($_[0]) eq 'HTTP::Request' ? $_[0] : HTTP::Request->new(@_);
            if ($cookie) {
                unless ($req->uri->can('host') and $req->uri->host) {
                    $req->uri( URI->new('http://localhost' . $req->uri->path_query ) );
                    $req->header( Host => 'localhost' );
                }
                $cookie->add_cookie_header($req) unless $req->header('Cookie');
            }

            my $res;
            test_psgi(
                app    => $app->handler,
                client => sub {
                    my $cb = shift;
                    $res = $cb->($req);
                },
            );

t/plugin_csrf_defender.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;

{
    package TestApp;
    use Ark;

    use_plugins qw/
        Session
        Session::State::Cookie
        Session::Store::Memory
        CSRFDefender
        /;

    conf 'Plugin::Session::State::Cookie' => {
        cookie_expires => '+3d',
    };

    package TestApp::Controller::Root;
    use Ark 'Controller';

    has '+namespace' => default => '';

    sub test_set :Local {
        my ($self, $c) = @_;

t/plugin_csrf_defender_error_action.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;

{
    package TestApp;
    use Ark;

    use_plugins qw/
        Session
        Session::State::Cookie
        Session::Store::Memory
        CSRFDefender
        /;

    config 'Plugin::Session::State::Cookie' => {
        cookie_expires => '+3d',
    };

    config 'Plugin::CSRFDefender' => {
        error_action => '/csrf_error',
    };

    package TestApp::Controller::Root;
    use Ark 'Controller';

t/plugin_csrf_defender_filter_form.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;

{
    package TestApp;
    use Ark;

    use_plugins qw/
        Session
        Session::State::Cookie
        Session::Store::Memory
        CSRFDefender
        /;

    conf 'Plugin::Session::State::Cookie' => {
        cookie_expires => '+3d',
    };
    conf 'Plugin::CSRFDefender' => {
        filter_form => 1,
    };

    package TestApp::Controller::Root;
    use Ark 'Controller';

    has '+namespace' => default => '';

t/plugin_csrf_defender_with_options.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;

{
    package TestApp;
    use Ark;

    use_plugins qw/
        Session
        Session::State::Cookie
        Session::Store::Memory
        CSRFDefender
        /;

    config 'Plugin::Session::State::Cookie' => {
        cookie_expires => '+3d',
    };

    config 'Plugin::CSRFDefender' => {
        error_code    => 400,
        error_output  => 'ERROR!',
        validate_only => 1,
    };

    package TestApp::Controller::Root;

t/plugin_session.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;

{
    package TestApp;
    use Ark;

    use_plugins qw/
        Session
        Session::State::Cookie
        Session::Store::Memory
        /;

    conf 'Plugin::Session::State::Cookie' => {
        cookie_expires => '+3d',
    };

    package TestApp::Controller::Root;
    use Ark 'Controller';

    has '+namespace' => default => '';

    sub test_set :Local {
        my ($self, $c) = @_;

t/plugin_session.t  view on Meta::CPAN

    }
}


use Ark::Test 'TestApp',
    components       => [qw/Controller::Root/],
    reuse_connection => 1;

{
    my $res = request(GET => '/test_set');
    like( $res->header('Set-Cookie'), qr/testapp_session=/, 'session id ok');
    like( $res->header('Set-Cookie'), qr/expires=./, 'session expire ok');

    is(get('/test_get'), 'dummy', 'session get ok');
}

subtest 'dies after finalize' => sub {
    subtest "can't set" => sub {
        my $c = ctx_get '/test_set';
        local $@;
        eval {
            $c->session->set('hoge', 1);

t/plugin_session.t  view on Meta::CPAN

        local $@;
        eval {
            $c->session->get('test');
        };
        ok !$@;
    };
};

{
    my $res = request(GET => '/test_flash_set');
    like( $res->header('Set-Cookie'), qr/testapp_session=/, 'session id ok');

    is(get('/test_flash_get'), 'dummy_flash', 'flash get ok');
    is(get('/test_flash_get'), '', 'flash cleaered ok');
}

{
    is(get('/incr'), 1, 'increment first ok');
    is(get('/incr'), 2, 'increment second ok');
    reset_app;

t/plugin_session.t  view on Meta::CPAN

}

{
    # sid regeneration
    reset_app;

    my $res;
    $res = request(GET => '/incr');
    is $res->content, 1, 'request ok';

    my ($sid) = $res->header('Set-Cookie') =~ /testapp_session=(\w+)/;
    ok $sid, 'sid ok';

    $res = request(GET => '/regen');
    is $res->content, 'regenerated', 'sid regenerated';
    my ($new_sid) = $res->header('Set-Cookie') =~ /testapp_session=(\w+)/;

    is get('/incr'), 2, 'session continued ok';
    isnt $sid, $new_sid, 'but session_id updated ok';

    is get('/regen_and_incr'), 3, 'modified session data and regenerated sid on the same request ok';

    # old sid is now removed
    my $request = HTTP::Request->new(GET => '/incr');
    $request->header( Cookie => "testapp_session=$sid" );
    is request($request)->content, 1, 'old session already expired';
}
done_testing;

t/plugin_session_expire.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;

{
    package TestApp;
    use Ark;

    use_plugins qw/
        Session
        Session::State::Cookie
        Session::Store::Memory
        /;

    conf 'Plugin::Session::State::Cookie' => {
        cookie_expires => undef,
    };

    package TestApp::Controller::Root;
    use Ark 'Controller';

    has '+namespace' => default => '';

    sub test_set :Local {
        my ($self, $c) = @_;

t/plugin_session_expire.t  view on Meta::CPAN

    }
}


use Ark::Test 'TestApp',
    components       => [qw/Controller::Root/],
    reuse_connection => 1;

{
    my $res = request(GET => '/test_set');
    like( $res->header('Set-Cookie'), qr/testapp_session=/, 'session id ok');
    unlike( $res->header('Set-Cookie'), qr/expires=/, 'session expires ok');
}
done_testing;

t/plugin_session_model.t  view on Meta::CPAN

use warnings;
use Test::Requires 'Cache::MemoryCache';
use Test::More;

{
    package T1;
    use Ark;

    use_plugins qw/
        Session
        Session::State::Cookie
        Session::Store::Model
        /;

    conf 'Plugin::Session' => {
        expire => 3,
    };

    conf 'Plugin::Session::Store::Model' => {
        model => 'Session',
    };

t/plugin_session_model.t  view on Meta::CPAN

    }
}


use Ark::Test 'T1',
    components => [qw/Controller::Root Model::Session/],
    reuse_connection => 1;

{
    my $res = request(GET => '/test_set');
    like( $res->header('Set-Cookie'), qr/t1_session=/, 'session id ok');

    is(get('/test_get'), 'testdata', 'session get ok');
}

{
    is(get('/incr'), 1, 'increment first ok');
    is(get('/incr'), 2, 'increment second ok');
    reset_app;

    is(get('/incr'), 1, 're-increment first ok'); # XXX: this is test for Ark::Test: should be sepalate test.

t/plugin_session_state_cookie.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;

{
    package TestApp;
    use Ark;

    use_plugins qw/
        Session
        Session::State::Cookie
        Session::Store::Memory
        /;

    conf 'Plugin::Session::State::Cookie' => {
        cookie_secure   => 1,
        cookie_httponly => 1,
        cookie_samesite => 'None',
    };

    package TestApp::Controller::Root;
    use Ark 'Controller';

    has '+namespace' => default => '';

t/plugin_session_state_cookie.t  view on Meta::CPAN

    }
}


use Ark::Test 'TestApp',
    components       => [qw/Controller::Root/],
    reuse_connection => 1;

{
    my $res = request(GET => '/test_set');
    like( $res->header('Set-Cookie'), qr/secure/, 'secure is true');
    like( $res->header('Set-Cookie'), qr/HttpOnly/, 'HttpOnly is true');
    like( $res->header('Set-Cookie'), qr/SameSite=None;/, 'SameSite is None');
}
done_testing;



( run in 1.321 second using v1.01-cache-2.11-cpan-e9199f4ba4c )