view release on metacpan or search on metacpan
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
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
}
},
"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",
},
"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::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
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'
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;