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 "$@"