changeset 117:82e215e75468

Add moderated mode to grp
author HIROSE Yuuji <yuuji@gentei.org>
date Tue, 04 Aug 2015 22:54:33 +0900
parents 2342e637a632
children 45d1b0f09e48
files s4-blog.sh s4-funcs.sh s4.cgi
diffstat 3 files changed, 115 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/s4-blog.sh	Tue Aug 04 22:39:44 2015 +0900
+++ b/s4-blog.sh	Tue Aug 04 22:54:33 2015 +0900
@@ -22,10 +22,7 @@
   case $mode in
     admin)
       if isgroup "$blogowner"; then
-	emails=`for i in $(getgroupadmins $blogowner); do\
-	  [ x"$i" = x"$user" ] && continue;\
-	  email4group "$blogowner" "$i" ;\
-	done`
+	emails=`getgroupadminmails $blogowner`
       else
 	emails=`collectemail $blogowner`
       fi
--- a/s4-funcs.sh	Tue Aug 04 22:39:44 2015 +0900
+++ b/s4-funcs.sh	Tue Aug 04 22:54:33 2015 +0900
@@ -19,8 +19,9 @@
 imgdir=${IMGDIR:-img}
 url=${URL:-"${REQUEST_SCHEME:-http${HTTPS:+s}}://$HTTP_HOST$REQUEST_URI"}
 urlbase=${url%%\?*}
-msg=$templ/msg
+msgdir=$templ/msg
 timeout="+2 days"
+memoplimitdays="7"
 dumpcollen=20
 #thumbxy=120x120
 thumbxy=96x96
@@ -319,11 +320,22 @@
   err isgrpowner: $sql
   test -n "`query $sql`"
 )
+getgroupadminmails() {
+  # $1=group
+  for i in $(getgroupadmins $1); do
+    email4group "$1" "$i" ;
+  done
+}
 getgroupadmins() {	# $1=group
   # This function is called in a backquote, so needn't to be subshellized
   qgrp=`sqlquote "$1"`
   query "select user from grp_adm where gname=$qgrp;"
 }
+getgroupattr() {	# $1=group $2=attr
+  # This function is called in a backquote, so needn't to be subshellized
+  getvalbyid grp $2 \
+	     $(query "select rowid from grp where gname=`sqlquote $1`;")
+}
 getgroupbyid() {
   # $1=id|gname
   sql="select coalesce((select gname from grp where gname=$(sqlquote $1)),
@@ -884,9 +896,8 @@
 smail() {
   # smail rcpt subj (file)
   rcpt=`echo $1`		# strip newlines
-  subj="`echo $2|nkf -jM`"
-  # echo rcpt=$rcpt
-  (m4 -D_RCPT_="$rcpt" -D_SUBJ_="\`$subj'" -D_FROM_=$admin $msg/mail-header.m4
+  subj=`echo $2|nkf -jM|tr -d '\n'`
+  (m4 -D_RCPT_="$rcpt" -D_SUBJ_="\`$subj'" -D_FROM_=$admin $msgdir/mail-header.m4
    cat $3 | nkf -jd ) | sendmail -f $admin $rcpt
 }
 setviastring() {
@@ -933,7 +944,7 @@
   dbsetbyid user $user pswd "$encpswd"
   # Avoid $user substitution with m4, because $url comes from user input.
   m4 -D_PSWD_="$newpswd" -D_URL_="$url" -D_ADMIN_="$admin" \
-     $msg/mail-newaccount.m4 \
+     $msgdir/mail-newaccount.m4 \
       | sed "s/_USER_/$user/g" \
       | smail $user "New Account"
 }
@@ -975,7 +986,7 @@
   if [ $st != 0 ]; then
     contenttype; echo
     m4 -D_USER_="$user" -D_URL_="$url" -D_ADMIN_="$admin" \
-       $msg/login-fail-$st.m4.html
+       $msgdir/login-fail-$st.m4.html
     showlogin			# and EXIT
   fi
 }
@@ -1111,7 +1122,7 @@
 sendinvitation() (
   # $1=email
   iss="invite-`date +%s`-$user"
-  addsession $iss +7days # 1 week due date
+  addsession $iss +${memoplimitdays}days # 1 week due date
   query "replace into par values('$iss', 'invite', 'string', \"$1\");"
   gecos=`gecos`
   name=$user"${gecos:+($gecos)}"
@@ -1121,7 +1132,7 @@
      -D_EMAIL_="$1" \
      -D_REGIST_="$regist" \
      -D_ADMIN_="$admin" \
-     $msg/mail-invite.m4 \
+     $msgdir/mail-invite.m4 \
       | smail $1 "BBSへの御招待"
   return 0
 )
@@ -1612,6 +1623,10 @@
 </table>
 `cgi_hidden grp $rowid`
 EOF
+  if [ x`getgroupattr $grp regmode` = x'moderated' -a -z "$ismem" ]; then
+    echo "moderated (承認加入の)グループなので実際に参加できるのは
+グループ管理者が承認操作をした後になります。" | html p 'class="warn"'
+  fi
   echo '</div></div>'
   echo '<h2>話題一覧</h2>'
   cgi_form searchart<<EOF
@@ -1639,6 +1654,8 @@
   echo "グループ $grp 個別選択操作" \
       | m4 -D_TITLE_="syscmd(\`cat')" $layout/html.m4.html
 
+  isowner=""
+  isgrpowner "$user" "$grp" && isowner="yes"
   usel=`getpar usel`
   if [ -n "$usel" ]; then
     uids=$(echo `echo $usel`|tr ' ' ',')
@@ -1648,7 +1665,7 @@
     rm=`getpar rm` cfm=`getpar confirm`
 err rm=$rm cfm=$cfm
     if [ x"$rm" = x"yes" ]; then
-      if isgrpowner "$user" "$grp"; then
+      if [ "$isowner" ]; then
 	if [ x"$rm$cfm" = x"yesyes" ]; then
 	  # Eliminate
 	  cond="where gname=(select gname from grp where rowid=$grid) and user in (select name from user where rowid in ($uids))"
@@ -1713,7 +1730,7 @@
   sql="select a.rowid||','||coalesce(val,a.name) as name from
 	 (select rowid,name from user where name in
 		 (select user from grp_mem where
-		 gname=(select gname from grp where rowid=1)))
+		 gname=(select gname from grp where rowid=$grid)))
 	  a left join user_s on a.name=user_s.name and key='gecos'
 	order by name;"
   err grpaction: `echo $sql`
@@ -1721,6 +1738,14 @@
   b2='"> ' b3='</label>'
   tf=$tmpd/title.$$
   echo "グループ[$grp]参加メンバーに対する操作" > $tf
+  excmsg="<div class=\"fold\">
+`cgi_radio rm yes ` 下でチェックした人のグループ登録解除
+<div>
+本当に消します! `cgi_checkbox confirm yes` 確認
+<p>この操作による通知は本人に行きません。
+あらかじめ通知するか、登録解除してよい状況かしっかり確認してください。</p>
+</div>
+</div>"
   cgi_form grpaction<<EOF \
       	| sed  -e "s|^\(<TR><TD>\)\([0-9]*\),\([^<]*\)|\1$b1\2$b2\3$b3|" \
 	| m4 -D_TITLE_="spaste(\`$tf')" \
@@ -1734,14 +1759,7 @@
 `cgi_textarea text "" cols=40`
 </div>
 </div>
-<div class="fold">
-`cgi_radio rm yes ` 下でチェックした人のグループ登録解除
-<div>
-本当に消します! `cgi_checkbox confirm yes` 確認
-<p>この操作による通知は本人に行きません。
-あらかじめ通知するか、登録解除してよい状況かしっかり確認してください。</p>
-</div>
-</div>
+${isowner:+\"$excmsg\"}
 <h4>$grp 参加者一覧</h4>
 <table>
 `sq $db -html "$sql"`
@@ -1801,7 +1819,7 @@
     return
   fi
   message=`getpar message`
-  if [ -z "$msg" ]; then
+  if [ -z "$message" ]; then
     echo "文章を入れてください。" | html p
     return
   fi
@@ -1823,16 +1841,86 @@
 <p><a href="?grp+$rowid">グループ $grp</a>に戻る。</p>
 EOF
 }
+joingrpadmit() {
+  # $1=yes/no $2=session-key
+  if [ -z "$2" ]; then
+    echo "bye bye" | html p; return
+  fi
+  t_usr=`session=$2 getpar user`
+  t_grp=`session=$2 getpar group`
+  err joingrpadmit: t_usr=$t_usr, t_grp=$t_grp
+  m4 -D_TITLE_="joingrp" $layout/html.m4.html
+  if [ -z "$t_usr" -o -z "$t_grp" ]; then
+    echo "無効な加入依頼です。" | html p
+    echo "有効期限が切れたか、
+他の管理者がいる場合は処理済みの可能性があります。" | html p
+    return
+  fi
+  if ! isgrpowner "$user" $t_grp; then
+    echo "グループ管理者のみの機能です。" | html p; return
+  fi
+  case $1 in
+    yes)	joingrp "$t_grp" "$t_usr" yes "$t_usr" ;;
+    no)		joingrp "$t_grp" "$t_usr" no "$t_usr" ;;
+    *)
+      echo "無効な指定です($1)。" | html p
+      return ;;
+  esac
+  gid=$(query "select rowid from grp where gname=`sqlquote $t_grp`;")
+  rcpts="`getgroupadminmails $t_grp` $user"
+  err admit: msgdir=$msgdir, rcpts="["$rcpts"]"
+  body="グループ $t_grp
+に
+$t_usr
+`[ x$1 = xyes ] && echo 'を追加' || echo 'の解除操作を'`
+しました。"
+  (echo "$body"; echo; echo "$url?grp+$gid") | smail "$rcpts" "joingrp $1"
+  query "delete from session where id='$2';"
+  echo "$body" | html p
+}
+
+joingrprequest() {
+  # $1=group $2=user $3=yes/no $4=email(if any $5=AsAdmin) 
+  jss="joingrp-`date +%s`-`genrandom 12`"
+  addsession $jss +${memoplimitdays}days
+  query "replace into par values('$jss', 'group', 'string', `sqlquote $1`),
+('$jss', 'user', 'string', `sqlquote $user`);"
+  smail "$(collectemail `getgroupadmins $1`)" "Join request to $1"<<EOF
+$url
+グループ $1
+に加入依頼がありました。
+
+承認する:
+$urlbase?joingrpadmit+yes+$jss
+
+白紙に戻す:
+$urlbase?joingrpadmit+no+$jss
+EOF
+  echo "管理者に加入依頼を出しました。
+${memoplimitdays}日以内に加入承認操作がされれば加入できますが、
+グループ運用方針に懸かることですので直接の問い合わせが重要です。" | html p
+}
 joingrp() {
   # $1=group $2=user $3=yes/no $4=email(if any $5=AsAdmin)
 err joingrp: \$1=$1 \$2=$2 \$3=$3 \$4=$4
   isgrpowner "$user" "$1" && isowner="yes" || isowner=""
-err jg:isgrpowner: isowner="$isowner"
-  if [ x"$2" != x"$user" ]; then # if user is not login user
-    if [ -z "$isowner" ]; then
-      echo "本人か、グループ管理者しか加入操作はできません。" | html p
-      return
-    fi
+  err jg:isgrpowner: isowner="$isowner"
+  if [ -n "$isowner" ]; then
+    # GROUP OWNER CAN DO EVERYTHING ABOUT REGISTRATION/RETIREMENT
+  elif [ x"$2" != x"$user" ]; then # if user is not login user
+    echo "本人か、グループ管理者しか加入操作はできません。" | html p
+    return
+  elif [ x"$3" = x"no" ]; then
+    # Do not pursue those who leave
+  else				# adding user is $user itself
+    case `getgroupattr $1 regmode` in
+      moderated)
+	joingrprequest "$@"	# Request only
+	return
+	;;
+      *)
+	;;
+    esac
   fi
   qgname=`sqlquote $1`
   cond="where gname=$qgname and user='$2'"
--- a/s4.cgi	Tue Aug 04 22:39:44 2015 +0900
+++ b/s4.cgi	Tue Aug 04 22:54:33 2015 +0900
@@ -47,7 +47,7 @@
     showattc "$@"
     exit 0			# Do not output further chunks
     ;;
-  invite|groupman|userconf|groupconf|mems|grps|grp|groupupdate|grpaction|commission|editheading|editart|showattc|send2mem)
+  invite|groupman|userconf|groupconf|mems|grps|grp|groupupdate|grpaction|joingrpadmit|commission|editheading|editart|showattc|send2mem)
     contenttype; echo
     [ -n "$1" ] && shift
     $stage "$@"

yatex.org