#!/usr/bin/env ruby21 # coding: utf-8 # fruits3.rb require 'sqlite3' require 'kconv' require 'cgi' $myname = 'fruits3.rb' $dbfile = "tmpdb/fruits.sq3" # セッションキーのPREFIXを、接続IPアドレス+日付にしていずれか一方でも # 変わった場合は使えないようにする。 skeyprefix = ENV["REMOTE_ADDR"] + Time.now.strftime("/%Y%m%d%H%M/") cgi = CGI.new(:accept_charset => "utf-8") db = SQLite3::Database.new($dbfile) # ログイン画面から来たものであれば,パスワード照合し,セッションキーを生成 # して表に格納する。 user = cgi['user'] # ログインフォームから来た場合値が入る authok = nil # 認証できたかどうか wasureta = "wasureta" # パスワード失念時の呪文 logininfo = "" # ログインプロンプトの追加メッセージ cookie = Hash.new # cookieをHashに取得 if (c=ENV['HTTP_COOKIE']) # 環境変数 HTTP_COOKIE にcookieリストがある c.split(/[;,]\s+/).each do |exp| # (セミコロンかカンマ)+空白 で分解 if /(.*)=(.*)/ =~ exp # =の前後で分解 「変数=値;」 key = CGI::unescape($1) # 変数も値もエスケープされているので value = CGI::unescape($2) # 元に戻す cookie[key] = CGI::unescape(value) end end end skey = cookie['skey'] # cookieにある(はずの)セッションキー if user && user > "" # ログインフォームからきた場合 pswd = cgi['pswd'] r = db.execute("select pswd from user where uname = ?", user)[0] if r && pswd.crypt(r[0]) == r[0] # r[0]はdb内のpswd # パスワード照合OKなので新セッションキーを「IPアドレス+ランダム」で生成 skey = skeyprefix+ [*'a'..'z'].sample(14).join db.execute("update user set skey = ? where uname=?", skey, user) authok = true # 認証フラグON elsif pswd == wasureta if /(.*)@(.*)/ =~ user system "../useradm.rb #{user} #{$dbfile} | Mail -s newuser #{user}" logininfo = "指定したメイルアドレスに送信しました。" end end elsif skey && skey > "" user = cookie['user'] r=db.execute("select skey from user where uname = ?", user)[0] skeyinfo = [user, r] # デバッグ用 if r && r[0] && r[0] == skey # cookie skey == saved skey if skey.index(skeyprefix) == 0 # セッションキーが継続して使えるものか検査 authok = true # 認証フラグON else logininfo = "ログイン有効時間終了です。再ログインをお願いします。" end end end if authok # 認証成功ならcookie更新 (HTML本文より先に送出する) # 5時間有効 expires = (Time.now.gmtime+3600*5).strftime("%a, %d-%m-%Y %H:%M:%S GMT") printf("Set-Cookie: skey=%s; expires=%s\n", skey, expires) printf("Set-Cookie: user=%s; expires=%s\n", user, expires) end # HTMLヘッダの出力 (
まで) print <<_EOF_ Content-type: text/html; charset=utf-8%s
\n", logininfo) end puts("\n") exit(0) end # フォーム画面をロードした時刻を hidden 変数に埋め込む now = Time.now.to_i.to_s # 1970/1/1からの秒数が入る # 値入力フォームの初期値用の変数 fruit = at = memo = update = "" # ./fruits3.rb -edit 1 のように呼ばれたら入力フォームに初期値を入れる # -edit オプションは一覧表示のところで出している(※1) if ARGV[0] == "-edit" && ARGV[1] != nil id = ARGV[1] # 更新するレコードのid r = db.execute("select * from kudamono where id=?", id) fruit, at, memo = r[0][1..-1] # 第2カラム以降すべて memo = CGI::unescapeHTML(memo.gsub("