s4

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 diff
     1.1 --- a/s4-blog.sh	Tue Aug 04 22:39:44 2015 +0900
     1.2 +++ b/s4-blog.sh	Tue Aug 04 22:54:33 2015 +0900
     1.3 @@ -22,10 +22,7 @@
     1.4    case $mode in
     1.5      admin)
     1.6        if isgroup "$blogowner"; then
     1.7 -	emails=`for i in $(getgroupadmins $blogowner); do\
     1.8 -	  [ x"$i" = x"$user" ] && continue;\
     1.9 -	  email4group "$blogowner" "$i" ;\
    1.10 -	done`
    1.11 +	emails=`getgroupadminmails $blogowner`
    1.12        else
    1.13  	emails=`collectemail $blogowner`
    1.14        fi
     2.1 --- a/s4-funcs.sh	Tue Aug 04 22:39:44 2015 +0900
     2.2 +++ b/s4-funcs.sh	Tue Aug 04 22:54:33 2015 +0900
     2.3 @@ -19,8 +19,9 @@
     2.4  imgdir=${IMGDIR:-img}
     2.5  url=${URL:-"${REQUEST_SCHEME:-http${HTTPS:+s}}://$HTTP_HOST$REQUEST_URI"}
     2.6  urlbase=${url%%\?*}
     2.7 -msg=$templ/msg
     2.8 +msgdir=$templ/msg
     2.9  timeout="+2 days"
    2.10 +memoplimitdays="7"
    2.11  dumpcollen=20
    2.12  #thumbxy=120x120
    2.13  thumbxy=96x96
    2.14 @@ -319,11 +320,22 @@
    2.15    err isgrpowner: $sql
    2.16    test -n "`query $sql`"
    2.17  )
    2.18 +getgroupadminmails() {
    2.19 +  # $1=group
    2.20 +  for i in $(getgroupadmins $1); do
    2.21 +    email4group "$1" "$i" ;
    2.22 +  done
    2.23 +}
    2.24  getgroupadmins() {	# $1=group
    2.25    # This function is called in a backquote, so needn't to be subshellized
    2.26    qgrp=`sqlquote "$1"`
    2.27    query "select user from grp_adm where gname=$qgrp;"
    2.28  }
    2.29 +getgroupattr() {	# $1=group $2=attr
    2.30 +  # This function is called in a backquote, so needn't to be subshellized
    2.31 +  getvalbyid grp $2 \
    2.32 +	     $(query "select rowid from grp where gname=`sqlquote $1`;")
    2.33 +}
    2.34  getgroupbyid() {
    2.35    # $1=id|gname
    2.36    sql="select coalesce((select gname from grp where gname=$(sqlquote $1)),
    2.37 @@ -884,9 +896,8 @@
    2.38  smail() {
    2.39    # smail rcpt subj (file)
    2.40    rcpt=`echo $1`		# strip newlines
    2.41 -  subj="`echo $2|nkf -jM`"
    2.42 -  # echo rcpt=$rcpt
    2.43 -  (m4 -D_RCPT_="$rcpt" -D_SUBJ_="\`$subj'" -D_FROM_=$admin $msg/mail-header.m4
    2.44 +  subj=`echo $2|nkf -jM|tr -d '\n'`
    2.45 +  (m4 -D_RCPT_="$rcpt" -D_SUBJ_="\`$subj'" -D_FROM_=$admin $msgdir/mail-header.m4
    2.46     cat $3 | nkf -jd ) | sendmail -f $admin $rcpt
    2.47  }
    2.48  setviastring() {
    2.49 @@ -933,7 +944,7 @@
    2.50    dbsetbyid user $user pswd "$encpswd"
    2.51    # Avoid $user substitution with m4, because $url comes from user input.
    2.52    m4 -D_PSWD_="$newpswd" -D_URL_="$url" -D_ADMIN_="$admin" \
    2.53 -     $msg/mail-newaccount.m4 \
    2.54 +     $msgdir/mail-newaccount.m4 \
    2.55        | sed "s/_USER_/$user/g" \
    2.56        | smail $user "New Account"
    2.57  }
    2.58 @@ -975,7 +986,7 @@
    2.59    if [ $st != 0 ]; then
    2.60      contenttype; echo
    2.61      m4 -D_USER_="$user" -D_URL_="$url" -D_ADMIN_="$admin" \
    2.62 -       $msg/login-fail-$st.m4.html
    2.63 +       $msgdir/login-fail-$st.m4.html
    2.64      showlogin			# and EXIT
    2.65    fi
    2.66  }
    2.67 @@ -1111,7 +1122,7 @@
    2.68  sendinvitation() (
    2.69    # $1=email
    2.70    iss="invite-`date +%s`-$user"
    2.71 -  addsession $iss +7days # 1 week due date
    2.72 +  addsession $iss +${memoplimitdays}days # 1 week due date
    2.73    query "replace into par values('$iss', 'invite', 'string', \"$1\");"
    2.74    gecos=`gecos`
    2.75    name=$user"${gecos:+($gecos)}"
    2.76 @@ -1121,7 +1132,7 @@
    2.77       -D_EMAIL_="$1" \
    2.78       -D_REGIST_="$regist" \
    2.79       -D_ADMIN_="$admin" \
    2.80 -     $msg/mail-invite.m4 \
    2.81 +     $msgdir/mail-invite.m4 \
    2.82        | smail $1 "BBSへの御招待"
    2.83    return 0
    2.84  )
    2.85 @@ -1612,6 +1623,10 @@
    2.86  </table>
    2.87  `cgi_hidden grp $rowid`
    2.88  EOF
    2.89 +  if [ x`getgroupattr $grp regmode` = x'moderated' -a -z "$ismem" ]; then
    2.90 +    echo "moderated (承認加入の)グループなので実際に参加できるのは
    2.91 +グループ管理者が承認操作をした後になります。" | html p 'class="warn"'
    2.92 +  fi
    2.93    echo '</div></div>'
    2.94    echo '<h2>話題一覧</h2>'
    2.95    cgi_form searchart<<EOF
    2.96 @@ -1639,6 +1654,8 @@
    2.97    echo "グループ $grp 個別選択操作" \
    2.98        | m4 -D_TITLE_="syscmd(\`cat')" $layout/html.m4.html
    2.99  
   2.100 +  isowner=""
   2.101 +  isgrpowner "$user" "$grp" && isowner="yes"
   2.102    usel=`getpar usel`
   2.103    if [ -n "$usel" ]; then
   2.104      uids=$(echo `echo $usel`|tr ' ' ',')
   2.105 @@ -1648,7 +1665,7 @@
   2.106      rm=`getpar rm` cfm=`getpar confirm`
   2.107  err rm=$rm cfm=$cfm
   2.108      if [ x"$rm" = x"yes" ]; then
   2.109 -      if isgrpowner "$user" "$grp"; then
   2.110 +      if [ "$isowner" ]; then
   2.111  	if [ x"$rm$cfm" = x"yesyes" ]; then
   2.112  	  # Eliminate
   2.113  	  cond="where gname=(select gname from grp where rowid=$grid) and user in (select name from user where rowid in ($uids))"
   2.114 @@ -1713,7 +1730,7 @@
   2.115    sql="select a.rowid||','||coalesce(val,a.name) as name from
   2.116  	 (select rowid,name from user where name in
   2.117  		 (select user from grp_mem where
   2.118 -		 gname=(select gname from grp where rowid=1)))
   2.119 +		 gname=(select gname from grp where rowid=$grid)))
   2.120  	  a left join user_s on a.name=user_s.name and key='gecos'
   2.121  	order by name;"
   2.122    err grpaction: `echo $sql`
   2.123 @@ -1721,6 +1738,14 @@
   2.124    b2='"> ' b3='</label>'
   2.125    tf=$tmpd/title.$$
   2.126    echo "グループ[$grp]参加メンバーに対する操作" > $tf
   2.127 +  excmsg="<div class=\"fold\">
   2.128 +`cgi_radio rm yes ` 下でチェックした人のグループ登録解除
   2.129 +<div>
   2.130 +本当に消します! `cgi_checkbox confirm yes` 確認
   2.131 +<p>この操作による通知は本人に行きません。
   2.132 +あらかじめ通知するか、登録解除してよい状況かしっかり確認してください。</p>
   2.133 +</div>
   2.134 +</div>"
   2.135    cgi_form grpaction<<EOF \
   2.136        	| sed  -e "s|^\(<TR><TD>\)\([0-9]*\),\([^<]*\)|\1$b1\2$b2\3$b3|" \
   2.137  	| m4 -D_TITLE_="spaste(\`$tf')" \
   2.138 @@ -1734,14 +1759,7 @@
   2.139  `cgi_textarea text "" cols=40`
   2.140  </div>
   2.141  </div>
   2.142 -<div class="fold">
   2.143 -`cgi_radio rm yes ` 下でチェックした人のグループ登録解除
   2.144 -<div>
   2.145 -本当に消します! `cgi_checkbox confirm yes` 確認
   2.146 -<p>この操作による通知は本人に行きません。
   2.147 -あらかじめ通知するか、登録解除してよい状況かしっかり確認してください。</p>
   2.148 -</div>
   2.149 -</div>
   2.150 +${isowner:+\"$excmsg\"}
   2.151  <h4>$grp 参加者一覧</h4>
   2.152  <table>
   2.153  `sq $db -html "$sql"`
   2.154 @@ -1801,7 +1819,7 @@
   2.155      return
   2.156    fi
   2.157    message=`getpar message`
   2.158 -  if [ -z "$msg" ]; then
   2.159 +  if [ -z "$message" ]; then
   2.160      echo "文章を入れてください。" | html p
   2.161      return
   2.162    fi
   2.163 @@ -1823,16 +1841,86 @@
   2.164  <p><a href="?grp+$rowid">グループ $grp</a>に戻る。</p>
   2.165  EOF
   2.166  }
   2.167 +joingrpadmit() {
   2.168 +  # $1=yes/no $2=session-key
   2.169 +  if [ -z "$2" ]; then
   2.170 +    echo "bye bye" | html p; return
   2.171 +  fi
   2.172 +  t_usr=`session=$2 getpar user`
   2.173 +  t_grp=`session=$2 getpar group`
   2.174 +  err joingrpadmit: t_usr=$t_usr, t_grp=$t_grp
   2.175 +  m4 -D_TITLE_="joingrp" $layout/html.m4.html
   2.176 +  if [ -z "$t_usr" -o -z "$t_grp" ]; then
   2.177 +    echo "無効な加入依頼です。" | html p
   2.178 +    echo "有効期限が切れたか、
   2.179 +他の管理者がいる場合は処理済みの可能性があります。" | html p
   2.180 +    return
   2.181 +  fi
   2.182 +  if ! isgrpowner "$user" $t_grp; then
   2.183 +    echo "グループ管理者のみの機能です。" | html p; return
   2.184 +  fi
   2.185 +  case $1 in
   2.186 +    yes)	joingrp "$t_grp" "$t_usr" yes "$t_usr" ;;
   2.187 +    no)		joingrp "$t_grp" "$t_usr" no "$t_usr" ;;
   2.188 +    *)
   2.189 +      echo "無効な指定です($1)。" | html p
   2.190 +      return ;;
   2.191 +  esac
   2.192 +  gid=$(query "select rowid from grp where gname=`sqlquote $t_grp`;")
   2.193 +  rcpts="`getgroupadminmails $t_grp` $user"
   2.194 +  err admit: msgdir=$msgdir, rcpts="["$rcpts"]"
   2.195 +  body="グループ $t_grp
   2.196 +に
   2.197 +$t_usr
   2.198 +`[ x$1 = xyes ] && echo 'を追加' || echo 'の解除操作を'`
   2.199 +しました。"
   2.200 +  (echo "$body"; echo; echo "$url?grp+$gid") | smail "$rcpts" "joingrp $1"
   2.201 +  query "delete from session where id='$2';"
   2.202 +  echo "$body" | html p
   2.203 +}
   2.204 +
   2.205 +joingrprequest() {
   2.206 +  # $1=group $2=user $3=yes/no $4=email(if any $5=AsAdmin) 
   2.207 +  jss="joingrp-`date +%s`-`genrandom 12`"
   2.208 +  addsession $jss +${memoplimitdays}days
   2.209 +  query "replace into par values('$jss', 'group', 'string', `sqlquote $1`),
   2.210 +('$jss', 'user', 'string', `sqlquote $user`);"
   2.211 +  smail "$(collectemail `getgroupadmins $1`)" "Join request to $1"<<EOF
   2.212 +$url
   2.213 +グループ $1
   2.214 +に加入依頼がありました。
   2.215 +
   2.216 +承認する:
   2.217 +$urlbase?joingrpadmit+yes+$jss
   2.218 +
   2.219 +白紙に戻す:
   2.220 +$urlbase?joingrpadmit+no+$jss
   2.221 +EOF
   2.222 +  echo "管理者に加入依頼を出しました。
   2.223 +${memoplimitdays}日以内に加入承認操作がされれば加入できますが、
   2.224 +グループ運用方針に懸かることですので直接の問い合わせが重要です。" | html p
   2.225 +}
   2.226  joingrp() {
   2.227    # $1=group $2=user $3=yes/no $4=email(if any $5=AsAdmin)
   2.228  err joingrp: \$1=$1 \$2=$2 \$3=$3 \$4=$4
   2.229    isgrpowner "$user" "$1" && isowner="yes" || isowner=""
   2.230 -err jg:isgrpowner: isowner="$isowner"
   2.231 -  if [ x"$2" != x"$user" ]; then # if user is not login user
   2.232 -    if [ -z "$isowner" ]; then
   2.233 -      echo "本人か、グループ管理者しか加入操作はできません。" | html p
   2.234 -      return
   2.235 -    fi
   2.236 +  err jg:isgrpowner: isowner="$isowner"
   2.237 +  if [ -n "$isowner" ]; then
   2.238 +    # GROUP OWNER CAN DO EVERYTHING ABOUT REGISTRATION/RETIREMENT
   2.239 +  elif [ x"$2" != x"$user" ]; then # if user is not login user
   2.240 +    echo "本人か、グループ管理者しか加入操作はできません。" | html p
   2.241 +    return
   2.242 +  elif [ x"$3" = x"no" ]; then
   2.243 +    # Do not pursue those who leave
   2.244 +  else				# adding user is $user itself
   2.245 +    case `getgroupattr $1 regmode` in
   2.246 +      moderated)
   2.247 +	joingrprequest "$@"	# Request only
   2.248 +	return
   2.249 +	;;
   2.250 +      *)
   2.251 +	;;
   2.252 +    esac
   2.253    fi
   2.254    qgname=`sqlquote $1`
   2.255    cond="where gname=$qgname and user='$2'"
     3.1 --- a/s4.cgi	Tue Aug 04 22:39:44 2015 +0900
     3.2 +++ b/s4.cgi	Tue Aug 04 22:54:33 2015 +0900
     3.3 @@ -47,7 +47,7 @@
     3.4      showattc "$@"
     3.5      exit 0			# Do not output further chunks
     3.6      ;;
     3.7 -  invite|groupman|userconf|groupconf|mems|grps|grp|groupupdate|grpaction|commission|editheading|editart|showattc|send2mem)
     3.8 +  invite|groupman|userconf|groupconf|mems|grps|grp|groupupdate|grpaction|joingrpadmit|commission|editheading|editart|showattc|send2mem)
     3.9      contenttype; echo
    3.10      [ -n "$1" ] && shift
    3.11      $stage "$@"