#!/usr/local/bin/ruby
# -*- coding: utf-8 -*-
require 'cgi'
require 'cgi/session'
require 'date'
class Auth
attr_reader :title,:msg,:user,:pass,:lasttime,:expire,:cookie, :class
def initialize(autologout=10)
@title="ログインしてください"
@cgi = CGI.new
@msg="AA"+@cgi["submit"]+"BB"
@autologout=autologout
@class=""
end
def count(cgi,session)
# セッションから値を取り出す。
value = session['value']
@msg="[#{value}]"
value = "0" if value == nil # 初回アクセス時などデータが未設定の場合nilになる。
@msg=@msg+";#{value}P"
# 値を更新して記録する。
value = (value.to_i + 1).to_s
session['value'] = value
"[[#{value}]]"
end
def getSess
begin
@msg+="-"
expire=Time.at(Time.now+120)
@msg+="["+@cgi.cookies.to_s+"]"
session = CGI::Session.new(@cgi, {"new_session"=>false,"session_expires"=>expire})
rescue => e
@msg+="expired.(#{e})"
if !session
@msg+="!/"
end
nil
end
end
def removeSess
begin
session = CGI::Session.new(@cgi, {"new_session" => false, "session_expires" => Time.now - 1})
session.delete
rescue => e
@msg+="%%% "+e.to_s
end
end
def execute
if ( @cgi["logout"] == "logout" )
@title="ログアウトしました"
removeSess
@msg="removed session."
else
expire=""
session=getSess
@cookie=[]
@lasttime=""
if session && session['lg'] then #ログイン済
@lasttime=session["lasttime"]
if(session["lasttime"] && (Time.now()-@lasttime > @autologout)) # タイムアウト自動ログアウト
@msg+="
TIMEOUT:"+" -_- "+@lasttime.to_s
@title="タイムアウトでログアウトしました"
sid=session.session_id
session.delete
@cookie=setcookie("_session_id",sid,Time.now-3600)
else
@msg+="
not timeout"
@msg=@msg+count(@cgi,session)
@user=session['lg']
session["lasttime"]=Time.now
@title="Welcome [#{user}]"
@class="authed"
end
else
@user=@cgi["user"]
@pass=@cgi["pass"]
if(authPass(@user,@name))
@title="Welcome //[#{@user}]"
@msg+="ログイン成功しました,hello [#{@user}]"
@class="loginok"
removeSess
expire=Time.at(Time.now+120)
session = CGI::Session.new(@cgi, {"new_session"=>true,"session_expires"=>expire})
@msg=@msg+count(@cgi,session)+"(( #{expire} ))"
session['lg']=@user # logged in
session["lasttime"]=Time.now
@lasttime=session["lasttime"]
# POSTを捨てるためにGETで再描画
@cgi.out{''}
exit
else
@msg+="incorrect ID or pass"
@msg+="not logged in"
end
end
end
end
def authPass(user,name)
user.size > 5
end
def setcookie(name,value,expires="")
[
CGI::Cookie.new({
"name" => name,
"value" => value,
'expires' => expires
})
]
end
end
x=Auth.new
x.execute
cookies = [
CGI::Cookie.new({
"name" => 'count1',
"value" => (Time.now+3600).to_s,
'expires' => Time.now-3600
})
]
s=<<-EOS
UHA
#{x.title}
user[#{x.user}]/pass[#{x.pass}] || last:#{x.lasttime}
#{x.msg}
なう#{Time.now()} ||
expire:#{x.expire}
..............
EOS
c=CGI.new
c.out("cookie" => x.cookie){s}