#!/usr/bin/env ruby22 # 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/") cgi = CGI.new(:accept_charset => "utf-8") db = SQLite3::Database.new($dbfile) db.execute("CREATE TABLE IF NOT EXISTS fruits(item, at, memo)") db.execute("CREATE TABLE IF NOT EXISTS kudamono(" + "id integer primary key autoincrement, item, at, memo)") # ログイン画面から来たものであれば,パスワード照合し,セッションキーを生成 # して表に格納する。 user = cgi['user'] # ログインフォームから来た場合値が入る authok = nil # 認証できたかどうか wasureta = "wasureta" # パスワード失念時の呪文 logininfo = "" # ログインプロンプトの追加メッセージ cookie = cgi.cookies # cgi.cookiesに配列のハッシュが入っている skey = cookie['skey'][0] # cookieにある(はずの)セッションキー if user && user > "" # ログインフォームからきた場合 pswd = cgi['pswd'] db.execute("CREATE TABLE IF NOT EXISTS " + "user(uid integer primary key autoincrement, " + "uname, pswd, email, name, skey);") 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'][0] 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("