changeset 741:f2c7117f452e feature-annex

Merged
author HIROSE Yuuji <yuuji@gentei.org>
date Fri, 05 Jun 2020 16:49:25 +0900
parents c892a3633baa (diff) b5df3b16c9d8 (current diff)
children 3d2502af9c07
files s4-funcs.sh
diffstat 5 files changed, 140 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/examples/common/default/default.css	Fri Jun 05 14:49:59 2020 +0900
+++ b/examples/common/default/default.css	Fri Jun 05 16:49:25 2020 +0900
@@ -331,6 +331,20 @@
 input[type="reset"] {margin-left: 4em;}
 
 /*
+ * Annex
+ */
+li.casmenu div {display: none; position: relative; width: 10%;
+		min-width: 80%; margin-right: 0;}
+li.casmenu div table {
+    background: white; position: absolute; top: 0em; border: 3px solid navy;
+}
+li.casmenu:hover div, li.casmenu:active div,
+li.casmenu div:hover, li.casmenu div:active
+{display: block;}
+ 
+
+
+/*
  * PR Web
  */
 body.pr {font-size: 200%;}
--- a/examples/common/default/footer.m4.html	Fri Jun 05 14:49:59 2020 +0900
+++ b/examples/common/default/footer.m4.html	Fri Jun 05 16:49:25 2020 +0900
@@ -1,6 +1,6 @@
 <p class="copyright">Driven by
 <a href="http://www.gentei.org/~yuuji/software/s4/">s4</a>
-&copy;2015-2019 by 
+&copy;2015-2020 by
 <a href="http://www.gentei.org/~yuuji/">yuuji</a>
 </body>
 </html>
--- a/examples/common/default/html.m4.html	Fri Jun 05 14:49:59 2020 +0900
+++ b/examples/common/default/html.m4.html	Fri Jun 05 16:49:25 2020 +0900
@@ -18,8 +18,8 @@
 <body class="_BODYCLASS_">
 <div class="topmenu">
 <ul>
- <li><a href="?home" accesskey="1" title="Shortcut: 1
-Home">ホーム</a></li>
+ <li class="casmenu"><a href="?home" accesskey="1" title="Shortcut: 1
+Home">ホーム</a>_S4ANNEXES_</li>
  <!-- <li><a href="?blog">話題作成</a></li> -->
  <li><a href="?mems" accesskey="2" title="Shortcut: 2
 Members">参加者一覧</a></li>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s4-annex.sh	Fri Jun 05 16:49:25 2020 +0900
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+if [ -z "$S4MASTERDB" -o ! -s "$S4MASTERDB" ]; then
+  return
+fi
+if [ "$db" -ef "$S4MASTERDB" ]; then
+  return		# Points to the same file
+fi
+
+# Now S4ANNEX mode is ACTIVE
+S4ANNEXNAME=`dirname $mydir`
+sessdb=`dirname $S4MASTERDB`/sess.sq3
+S4ANNEXES="<div><table><tr><th><a
+	 href=\"$S4MASTERURL\">本館</a></th></tr></table><div>"
+## skey="skey-`basename $mydir`"
+syncflag=$dbdir/usersynced
+userupdateflag=`dirname $S4MASTERDB`/`basename $userupdateflag`
+test ! -e "$userupdateflag"		&& return
+test "$syncflag" -nt "$userupdateflag"	&& return
+    
+#  for sub.sq3
+# 
+#  main: user: 'taro', 'hanako', 'shige'
+#  sub:  user: 'taro', 'hanako', 'shige'
+#  sub2: user_s: ('taro', 't'), ('hanako', 'h'), ('shige', 's')
+#  then update
+# 
+
+## sqlite3 -cmd '.timer 1' -cmd '.echo 1' $db <<EOF
+err "Starting account synchronization"
+err "db=$db mas=$S4MASTERDB sess=$sessdb"
+num=$(sqlite3 -bail -cmd 'PRAGMA FOREIGN_KEYS=on' $db <<EOF
+ATTACH DATABASE "$S4MASTERDB" AS m;
+CREATE TABLE IF NOT EXISTS user(name, primary key(name));
+BEGIN;
+DElETE FROM main.user WHERE rowid NOT IN (SELECT rowid FROM m.user);
+INSERT INTO main.user(rowid, name)
+       SELECT rowid, name FROM m.user
+       WHERE m.user.rowid NOT IN (SELECT rowid FROM user);
+UPDATE user SET name = (SELECT name FROM m.user WHERE main.user.rowid=m.user.rowid);
+DELETE FROM main.user_s;
+INSERT INTO main.user_s(rowid, name, key, type, val, bin)
+	SELECT rowid,* FROM m.user_s;
+DELETE FROM main.user_m;
+INSERT INTO main.user_m(rowid, name, key, type, val, bin)
+	SELECT rowid,* FROM m.user_m
+	WHERE key NOT LIKE '%cache%';
+END;
+
+/* Compare user tables */
+WITH master AS (
+  SELECT p.rowid,* FROM m.user p
+  	 NATURAL LEFT JOIN m.user_s
+	 NATURAL LEFT JOIN m.user_m
+), annex AS (
+  SELECT p.rowid,* FROM user p
+  	 NATURAL LEFT JOIN user_s
+ 	 NATURAL LEFT JOIN user_m
+), m_a AS (
+  SELECT * FROM master EXCEPT SELECT * FROM annex
+), a_m AS (
+  SELECT * FROM annex EXCEPT SELECT * FROM master
+) SELECT (SELECT count(*) FROM m_a) + (SELECT count(*) FROM a_m);
+
+-- SELECT * FROM annex;
+-- SELECT rowid,* FROM m.user LIMIT 10;
+-- SELECT rowid,* FROM user WHERE rowid NOT IN (SELECT rowid FROM m.user);
+DETACH DATABASE m;
+EOF
+)
+if [ $num -eq 0 ]; then
+  touch $syncflag
+fi
+return $num
--- a/s4-funcs.sh	Fri Jun 05 14:49:59 2020 +0900
+++ b/s4-funcs.sh	Fri Jun 05 16:49:25 2020 +0900
@@ -12,12 +12,13 @@
 tmpdir=${TMPDIR:-tmp}
 dbdir=${DBDIR:-db}
 tmpfiles=""
-db=${DB:-$dbdir/cgi.sq3}
 querylog=${QUERYLOG:-$tmpdir/query.log}
 searchlog=${SEARCHLOG:-$tmpdir/search.log}
-workdb=$dbdir/tmpdata.sq3
+db=${DB:-$dbdir/cgi.sq3}
 sessdb=$dbdir/sess.sq3
+userupdateflag=$dbdir/userupdate
 sesstb=tmp.sess
+workdb=$dbdir/tmpdata.sq3
 listentlimit=${LISTENTLIMIT:-30}
 admin=${ADMIN:-hostmaster@example.org}
 noreply=${NOREPLY:-noreply@example.org}
@@ -64,10 +65,36 @@
 "
 likeesc=`printf '\037'`		# ESCAPE char of LIKE operator
 iconcachekey="profimgcache_S"
+
+# Start debug logging
+exec 3>> $tmpdir/debug.out
+err() {
+  echo "[`date +%F-%T%z`] $@" 1>&3
+}
 case "$HTTP_USER_AGENT" in
   *i[Pp]hone*|*[Aa]ndroid*)	touchpanel=1 ;;
   *)				touchpanel="" ;;
 esac
+
+# If S4MASTERDB is set, behave as ANNEX s4
+if [ -n "$S4MASTERDB" -a -s "$S4MASTERDB" ]; then
+  # $S4ANNEX is set after s4-annex setup
+  . ./s4-annex.sh 2>> tmp/debug.out
+  err S4ANNEXES="$S4ANNEXES" S4ANNEXNAME=$S4ANNEXNAME
+elif [ -n "$S4ANNEXES" ]; then
+  # Master Site mode, which has annexes
+  v=""
+  for i in $S4ANNEXES; do
+    _aname=${i%:*}; _apath=${i##*:}
+    v=${v}"<tr><td>&rArr; <a href=\"$_apath\">$_aname</a></td></tr>$nl"
+  done
+  if [ -n "$v" ]; then
+    i="<tr><th title=\"Annex\">別館</a></th></tr>$nl"
+    S4ANNEXES="${touchpanel:+ : ▼}<div><table>$i$v</table></div>"
+  fi
+fi
+
+
 [ -f ./s4-cgi.sh ] && . ./s4-cgi.sh
 
 : <<EOF
@@ -374,7 +401,6 @@
   if [ -n "$isCGI" ]; then
      exec 2>> $tmpdir/error.out
   fi
-  exec 3>> $tmpdir/debug.out
   exec 5> $sqi # Turning $sqi access through fd5 for continuous open state
   chmod o-r $tmpdir/error.out $tmpdir/debug.out
   rm $sqi
@@ -423,7 +449,8 @@
 }
 _m4() {
   #S4NAME=f,f,f
-  m4 ${S4NAME:+"-D_S4NAME_=${S4NAME}"} ${S4CSS:+-D_S4CSS_="$S4CSS"} "$@"
+  m4 ${S4NAME:+"-D_S4NAME_=${S4NAME}"} ${S4CSS:+-D_S4CSS_="$S4CSS"} \
+     -D_S4ANNEXES_="${S4ANNEXES}" "$@"
 }
 ismember() {
   # $1=user, $2=group
@@ -1201,9 +1228,10 @@
   for kv in `echo $HTTP_COOKIE|sed 's/[;, ]/ /g'`; do
     k="${kv%%=*}"
     v="`echo ${kv#*=}|nkf -Ww -mQ|sed -e 's/\"/\"\"/g'`"
+err "GetCookie: $k=[$v]"
     case "$k" in
       user)	_user="$v" ;;
-      skey)	_skey="$v" ;;
+      skey)	_skey="$v"; k=skey ;;
     esac
     query "replace into cookie values('$session', '$k', 'string', \"$v\");"
   done
@@ -1220,7 +1248,7 @@
   # smail rcpts subj (file)
   # $SMAIL_TO  <- Recipient value of To: header
   # $MAIL_FROM <- From: header value
-  from=`echo "${MAIL_FROM:-$admin}"|nkf -jM|tr -d '\n'`
+  from=`echo "${MAIL_FROM:-$admin}"|nkf -jM|tr : /|tr -d '\n'`
   rcpt=`echo $1|tr ' ' '\n'|sort -u|tr '\n' ' '` # uniq and strip newlines
   rcptheader=`echo $1|tr ' ' '\n'|sort -u|sed '2,$s/^/To: /g'`
   subj=`echo $2|nkf -jM|tr -d '\n'`
@@ -1310,7 +1338,7 @@
   # $1=passwd
   dbpswd=`getpwfield $user pswd`
   encpswd=`mycrypt "$1" "$dbpswd"`
-  ## err user=$user, pswd=$1, db=$dbpswd, enc=$encpswd
+  # err user=$user, pswd=$1, db=$dbpswd, enc=$encpswd
   [ x"$dbpswd" = x"$encpswd" ]
 }
 mypwhash() {
@@ -1328,7 +1356,7 @@
   newpswd=`genrandom` # newsalt=`genrandom 5`
   #encpswd=`mycrypt "$newpswd" "$newsalt"`
   encpswd=`echo $newpswd|mypwhash`
-  dbsetbyid user $user pswd "$encpswd"
+  dbsetbyid user $user pswd "$encpswd" && touch $userupdateflag
   # Avoid $user substitution with m4, because $url comes from user input.
   _m4 -D_PSWD_="$newpswd" -D_URL_="$url" -D_ADMIN_="$admin" \
      $msgdir/mail-newaccount.m4 \
@@ -1363,6 +1391,7 @@
     newsession=`genrandom 34`
     if setskey "$user" "$newsession" &&
 	dbsetbyid user "$user" login "`date '+%F %T'`"; then
+      # err gencookie "user=$user" "skey=$newsession"
       gencookie "user=$user" "skey=$newsession"
       return 0
     else
@@ -1403,9 +1432,6 @@
 trap cleanup INT HUP EXIT TERM PIPE
 # trap cleanup INT HUP
 
-err() {
-  echo "[`date +%F-%T%z`] $@" 1>&3
-}
 
 cgiinit() {
   tmpd=`tmpd=$tmpdir mktempd`
@@ -2049,8 +2075,14 @@
   cond="gname in (select gname from grp_mem where user='$uname')"
   search_form_args=""
   if [ x"$user" = x"$uname" ]; then
-    usermenu="<a href=\"?userconf\" accesskey=\"e\"
-	 title=\"Shortcut: E${nl}Edit Profile\">プロフィールの編集</a> /
+    if [ -z "$S4ANNEXNAME" ]; then
+      usermenu="<a href=\"?userconf\" accesskey=\"e\"
+	 title=\"Shortcut: E${nl}Edit Profile\">プロフィールの編集</a> / "
+    elif [ -n "$S4MASTERURL" ]; then
+      usermenu="<a href=\"$S4MASTERURL\" accesskey=\"e\"
+	 title=\"Shortcut: E${nl}Main Site\">本館</a> / "
+    fi
+    usermenu="$usermenu
 	<a href=\"?blog\" accesskey=\"n\" title=\"Shortcut: N${nl}New blog\">新規話題の作成</a>"
     # Display folders
     sql="select count(id) from article_m where id
@@ -3940,8 +3972,10 @@
 	.read $transaction
 	RELEASE SAVEPOINT pa2table_insert;
 	EOF
-  return $?
-  ##err donee
+  rc=$?
+  [ $rc -eq 0 -a x"$tbl" = x"user" ] && touch $userupdateflag
+  ## err "Table:$tbl update done "
+  return $rc
 )
 genform() {
   # $1 = form definition file

yatex.org