package gateway;
use strict;
#===============================================================================
# gateway.cgi: Perl-CGIスクリプトに簡易認証システムを組み込む
# The latest version is here: http://confetto.s31.xrea.com/
# This script use a japanese character code set: Shift_JIS
#===============================================================================
# Copyright (c) 2003-2007 confetto.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#===============================================================================
my $rcsid=q$Id: gateway.cgi,v 1.4 2007/04/18 16:08:52 confetto Exp $;
#===============================================================================
# 初期設定
#===============================================================================
#### アカウントの設定
# 下記の例にならって、ユーザ名とパスワードを対にしてコロン(:)で区切り、1行に1ア
# カウントずつ並べてください。半角英数字のみ使えます。余計な空行や空白を含めない
# でください。END_OF_USERNAMESという行はいじらないでください。
my $USERNAMES = <<'END_OF_USERNAMES';
test:test
guest:guest
END_OF_USERNAMES
#### 外部のユーザ認証ファイルのパス
# 使う場合は指定。ApacheのBASIC認証が使うユーザ認証ファイル(.htpasswd)と同じ形式
# のテキストファイルで、パスワードがcrypt()で暗号化されたものであれば、アカウン
# ト情報として使うことができます。
my $PASSWD_FILE = '';
#### ホームページのURI
# 認証フォームからの戻り先URIを指定してください。相対URIを指定する場合は、組み込
# み対象のCGIスクリプトからの相対で指定してください。
my $HOME_PAGE = '/';
#### 広告等挿入部
# 認証ページの最上部に広告等を挿入できます。''の代わりにHTMLコード
# 等を挿入してください。複数行に渡っても構いません。
my $AD_BLOCK = <<'END_OF_AD_BLOCK';
END_OF_AD_BLOCK
#### 外部スタイルシートのURI
# 認証ページに適用するスタイルシート(CSS)のURIを指定してください。相対URIを指定
# する場合は、組み込む対象のCGIスクリプトからの相対で指定してください。
my $CSS_FILE = 'gateway.css';
#### スクリプトのURI
# 組み込み対象のCGIスクリプトのURIです。通常は自動的に取得しますが、取得がうまく
# いかないときなどは手動で指定します。
my $SCRIPT_URI = '';
#### クッキーのパス
# 指定しなければ「対象のCGIスクリプトのあるディレクトリ」が既定値です。
my $COOKIE_PATH = '';
#### クッキーの有効期限(日数)
# フォームにパスワードなどを記憶するためのクッキーの有効期限です。
my $COOKIE_EXPIRE = 30; # 30日
# クッキーの名前
my $FORM_COOKIE_NAME = 'gatewayform'; # フォーム用
my $TEMP_COOKIE_NAME = 'gatewaytemp'; # セッション用
# スクリプトの文字符号化方式
my $ENCODING = 'Shift_JIS';
#===============================================================================
# ルーチン
#===============================================================================
my($VERSION) = $rcsid =~ /,v ([\d.]+)/;
$SCRIPT_URI ||= script_uri('relative') || './';
if ($COOKIE_PATH eq '') {
$COOKIE_PATH = script_uri();
$COOKIE_PATH =~ s|[^/]+$||;
}
&{ sub {
# クッキーを取得して認証できれば抜ける
return if authorize(split /:/, cookie($TEMP_COOKIE_NAME));
# パラメタを取得して認証
my $params = read_params();
# 認証できればクッキーを発行して抜ける
if (authorize(@$params{'_username','_password'})) {
set_cookies($params);
return;
}
print_header();
if (defined $params->{_username}) {
print_html_start(title => '認証に失敗しました');
print_auth_error();
} else {
print_html_start(
title => 'ユーザ名とパスワードを入力してください',
onload => 'document.forms.auth._username.focus()'
);
print_auth_form();
}
print_html_end();
exit;
} };
#===============================================================================
# サブルーチン
#===============================================================================
#
# 認証フォームを出力する
#
sub print_auth_form {
my($username, $password) = split /:/, cookie($FORM_COOKIE_NAME);
my $savecookie = ' checked="checked"' if $username;
print <Cookieを無効にしているとログインできませんのでご注意ください。