Mercurial > hgrepos > hgweb.cgi > s4
diff s4-funcs.sh @ 117:82e215e75468
Add moderated mode to grp
author | HIROSE Yuuji <yuuji@gentei.org> |
---|---|
date | Tue, 04 Aug 2015 22:54:33 +0900 |
parents | 3bad3f525dfc |
children | 45d1b0f09e48 |
line wrap: on
line diff
--- 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'"