#!/bin/sh cd `dirname $0` . ./cgilib2-sh myname=`basename $0` query "CREATE TABLE IF NOT EXISTS blog( datetime UNIQUE, body, filename, filecontent);" case "$1" in catfile/*) # miniblog3.cgi catfile/《rowid》で起動するとその行の画像を出力 rowid=`echo "${1#catfile/}" | tr -cd '[0-9]'` # 数字以外は除去 from="FROM blog WHERE rowid=$rowid" # FROM句以下を変数に echo -n "Content-type: " # 中味を調べて Content-type ヘッダ出力 query "SELECT hex(filecontent) $from" | unhexize \ | file --mime-type - | cut -d' ' -f2 fn=`query "SELECT filename $from;"| tr -d '\n'` # 改行あれば除去 echo "Content-Disposition: filename=\"$fn\"" # ファイル名と長さ出力 query "SELECT 'Content-Length: ' || length(filecontent) $from;" echo "" query "SELECT hex(filecontent) $from" | unhexize # 画像を書き出して終了 exit ;; edit/*) # miniblog3.cgi edit/《日時》で起動すると修正フォーム出力 editkey=`echo ${1#edit/}|pdecode` ;; # pdecode不要なhttpdもある # 【1】 login) . ./cgiauthlib-sh loginform; echo "" exit ;; esac # $1に指定したカラムを$2の日付キーから得る関数 getcol() { # HTMLエスケープしたカラム値を返す escape "`query \"SELECT $1 FROM blog WHERE datetime='$2';\"`" } putform() { # HTTPヘッダから入力フォームHTMLまで出力 title="一言日記" if [ -n "$editkey" ]; then datetime=`getcol datetime "$editkey"` # 実在するキーか? if [ -n "$datetime" ]; then hitokoto=`getcol body "$editkey"` # 既存のbodyカラム値を得る hidden="

ほんとうに消してよいですか:

" title="$datetime の一言の修正" fi fi htmlhead "$title" # ヘッダから h1 要素まで出力(cgilib2内) cat<<-EOF
${datetime:+$hidden}
一言:
EOF } addnew() { if [ -n "$CONTENT_LENGTH" ]; then # データが送信された場合の登録処理 dt=`getpar datetime` # datetimeの値がある場合は既存行の更新 # 実在する datetime か値自身を引直して確認する [ -n "$dt" ] && \ dt=`query "SELECT datetime from blog WHERE datetime='$dt';"` if [ x`getpar remove``getpar confirm` = x"yesyes" ]; then # 「削除」と確認の「はい」両方にチェックの場合 query "DELETE FROM blog WHERE datetime='$dt';" elif [ -n "`getpar hitokoto`" ]; then # hitokotoに何かが入力されたら [ -n "$dt" ] && now=$dt || now=`date '+%F %T'` query<<-EOF REPLACE INTO blog -- (日時, 一言, ファイル名, ファイル内容) を合成して挿入 SELECT '$now', max(CASE name WHEN 'hitokoto' THEN val END), max(CASE name WHEN 'attach' THEN filename END), max(CASE name WHEN 'attach' THEN val END) FROM cgipars WHERE tag='$_tag' GROUP BY tag; EOF fi fi } putblog() { # 既存のエントリをtableで出力 href1=${authok:+"\\2<"} href2="\\2<" echo '' query<<-EOF \ | sed -e "s,
1:\(\([-0-9 :]*\):[0-9]*\)<,${href1:-\\2<}," \ -e "s,2:,," \ -e "s,3:\([0-9]*\):\(.*\)<,$href2," .mode html .header ON SELECT '1:' || datetime '日時', '2:' || body '一言', CASE WHEN filename IS NOT NULL THEN '3:' || rowid || ":" || filename ELSE '' -- filenameが非NULLのときのみ出力 END '添付ファイル' FROM blog; EOF echo '
' } . ./cgiauthlib-sh cgiauth rc=$? if [ 0 -eq $rc ]; then authok=yes # 認証済みフラグ bodyclass="authok" putform # ヘッダと入力フォームを出力 addnew # 新規レコードの登録 else if [ $rc -eq 99 ]; then # 「忘れた」場合は $?=99 で戻る htmlhead echo "

${user}宛に新規パスワードを送信しておきました。

" loginform "Login again" exit 0 fi htmlhead "Miniblog" loginlink # loginフォームへのリンク fi [ -n "$editkey" ] || putblog # データ更新後の登録エントリを出力 echo ''