22 February 2021

Movable Type 6のセッションタイムアウトのカウントダウン開始を、ログオン時間から最終アクセス時間に変更

Movable Typeのセッションタイムアウトは、標準で4時間に設定されている。そして、このタイムアウト時間のカウントダウン開始は、ログオン時間である。

ユーザが編集している途中でも、ログオンから4時間経過すれば、容赦なくタイムアウトとなる。記事の「保存」「公開」ボタンを押した時にちょうどタイムアウトになった場合、現在の編集内容が失われる。これは仕様なのか不具合なのか知らないが、これでは都合が悪い。

タイムアウト時間のカウントダウンを、ユーザが何らかのアクションを起こすたびにリセットして、その時点から4時間というようにシステム側のスクリプトを修正する。

スクリプトに、赤で着色した部分を追加すると、get_unexpired_valueサブルーチンにアクセスするたびに、セッション($candidate)の保存時間が現在時間にアップデート($candidate->start(time))される。

lib/MT/Session.pm
sub get_unexpired_value {
    my $timeout = shift;
 
    ## Do not use a cached session even when the driver supports it
    my $driver = __PACKAGE__->driver;
    my $disabled;
    if ( $driver->isa('Data::ObjectDriver::Driver::BaseCache') ) {
        $disabled = Data::ObjectDriver::Driver::BaseCache->Disabled || 0;
        Data::ObjectDriver::Driver::BaseCache->Disabled(1);
    }
 
    my $candidate = __PACKAGE__->load(@_);
 
    if ( defined $disabled ) {
        Data::ObjectDriver::Driver::BaseCache->Disabled($disabled);
    }
 
    if ( $candidate && $candidate->start() < time - $timeout ) {
        $candidate->remove();
        $candidate = undef;
    }
########## fix: timeout time is updated, when user access to MT
    elsif( $candidate ) {
            $candidate->start(time);
            $candidate->save;
    }
##########
    return $candidate;
}

参考にしたWebページ

・『タイムアウトの判定を最終アクションからの経過時間に変更するプラグイン
・『Movable Type管理画面のセッションタイムアウトを延長する SessionTimeoutExtenderプラグイン」