s4

view s4.cgi @ 37:5cfad2c7eef8

group-id based argument handling
author HIROSE Yuuji <yuuji@gentei.org>
date Wed, 22 Jul 2015 13:28:11 +0900
parents 18b4d56a6206
children 0c26f4461d0b
line source
1 #!/bin/sh
2 # 愛
3 PATH=/usr/local/sqlite3/bin:$PATH
4 myname=`basename $0`
5 mydir=`dirname $0`
6 . $mydir/s4-funcs.sh
8 cgiinit
9 if [ x"$1" = x"reg" ]; then
10 contenttype; echo
11 regist $2
12 putfooter
13 exit
14 fi
16 dologin
17 #gencookie; echo
19 case ${SERVER_SOFTWARE} in
20 bozohttp*) # Ugly workaround for bozohttpd, which can't send
21 # two or more arguments.
22 set -- `echo "$@"|(IFS=+ read a b c d e f g; echo $a $b $c $d $e $f $g)`
23 ;;
24 esac
26 err 1=$1 2=$2 3=$3 4=$4
27 stage=`getpar stage`
28 stage=${stage:-$1}
29 case ${stage} in
30 # "")
31 # contenttype; echo
32 # m4 -D_SITE_="S System" $layout/welcome.m4.html
33 # # echo "<pre>"; gencookie "user=$user" "skey=$skey"; echo "</pre>"
34 # # echo "<pre>`env|sort -u`</pre>"
35 # ;;
36 "home"|"")
37 contenttype; echo
38 err HOME: just in rowid=`getpar rowid`
39 [ -n "`getpar rowid`" ] && par2table $formdir/user.def
40 showhome ${2:-$user}
41 ;;
42 # "diary")
43 # contenttype; echo
44 # title=`getpar title` #diary=`getpar diary` wday=`getpar wday`
45 # [ -n "$title" ] && par2table $formdir/diary.def
46 # m4 -D_TITLE_="$title" -D_DIARY_="$diary" \
47 # -D_FORM_="`genform templ/form/diary.def`" \
48 # -D_FORM2_="syscmd(\`genform templ/form/diary.def')" \
49 # -D_DUMPTABLE_="`dumptable html diary title,wday,diary`" \
50 # $layout/html.m4.html $layout/diary.m4.html
51 # ;;
52 "login")
53 contenttype; echo
54 myargs=""
55 showlogin
56 ;;
57 "invite")
58 contenttype; echo
59 invite
60 ;;
61 "groupman")
62 contenttype; echo
63 gname=`getpar gname`
64 if [ -n "$gname" ]; then
65 #gname=${gname%%[!-A-Z0-9a-z_.!#$%^&()=:/*]*}
66 #newgname=`echo "$gname"|tr -dc '\-0-9A-Za-z#=:/_.,'`
67 newgname=`echo "$gname"|tr -d '\"'`
68 newgname=$gname
69 if [ x"$newgname" != x"$gname" ]; then
70 err NewGNAME: gname=$newgname
71 echo "<p>使用禁止文字を除去し $gname としました。</p>"
72 gname=$newgname
73 replpar gname string "$gname"
74 fi
75 par2table $formdir/grp.def
76 joingrp "$gname" "$user" yes "$user" as-admin
77 fi
78 GF_STAGE=groupman
79 note="<p>グループ名に使用できない文字は自動的に削除されます。</p>"
80 m4 -D_TITLE_="グループ作成" \
81 -D_FORM_="$note`genform $formdir/grp.def`" \
82 -D_DUMPTABLE_="`DT_VIEW=grp dumptable html grp 'gname gecos:DESC mtime:TIME' 'order by b.TIME desc'`" \
83 $layout/html.m4.html $layout/groupman.m4.html
84 ;;
85 "edittable")
86 contenttype; echo
87 m4 -D_TITLE_="グループ編集/削除" $layout/html.m4.html
88 edittable "$formdir/$2.def" "$2" "$3"
89 ;;
90 "userconf")
91 contenttype; echo
92 [ -n "`getpar rowid`" ] && par2table $formdir/user.def
93 userconf
94 ;;
95 "groupconf")
96 contenttype; echo
97 [ -n "`getpar rowid`" ] && par2table $formdir/grp.def
98 groupconf "$2"
99 ;;
100 "mems")
101 contenttype; echo
102 m4 -D_TITLE_="参加者一覧" -D_BODYCLASS_=listmember $layout/html.m4.html
103 kwd=`getpar kwd`
104 listmember $kwd
105 ;;
106 "grps")
107 contenttype; echo
108 m4 -D_TITLE_="グループ一覧" -D_BODYCLASS_=listgroup $layout/html.m4.html
109 kwd=`getpar kwd`
110 listgroup $kwd \
111 | m4 -D_DUMPTABLE_="syscmd(\`cat')" \
112 -D_TITLE_="グループ関連操作" \
113 -D_FORM_="<a href=\"?groupman\">新規グループ作成</a>" \
114 $layout/groupman.m4.html
116 ;;
117 "grps2")
118 contenttype; echo
119 m4 -D_TITLE_="グループ一覧" \
120 -D_FORM_="`listgroup2 $formdir/grp.def`" -D_DUMPTABLE_= \
121 $layout/html.m4.html \
122 $layout/groupman.m4.html
123 ;;
124 "grp") # $2=group-rowid
125 contenttype; echo
126 gpg=`getpar grp`
127 grp=${2:-$gpg}
128 grp=`getgroupbyid "$grp"`
129 err grp: getpar-grp"(gpg)=[$grp]"
130 ## . ./s4-blog.sh
131 jg=`getpar joingrp`
132 if [ -n "$jg" ]; then
133 err jg=$jg, grp=$grp
134 [ -n "$jg" -a -n "$grp" ] &&
135 joingrp "$grp" "$user" "$jg" "`getpar email`"
136 fi
137 m4 -D_TITLE_="グループ $grp" \
138 $layout/html.m4.html
139 showgroup "$2"
141 ;;
142 "commission")
143 # $2=grp-rowid $3=user-rowid
144 contenttype; echo
145 err commission: "$@"
146 m4 -D_TITLE_="グループ $2 管理者委任" $layout/html.m4.html
147 shift # $1=grp-rowid $2=user-rowid
148 if [ -n "$2" ]; then
149 grp_reg_adm "$@"
150 else
151 echo "<p>無効な指定です。普通のアクセスならここに来ないはず。</p>"
152 fi
153 ;;
154 "blog")
155 contenttype; echo
156 . ./s4-blog.sh
157 blog_addentry $2
158 ;;
159 "replyblog")
160 contenttype; echo
161 rowid=${2%%[!A-Z0-9a-z_]*}
162 ## err ROWid=$rowid, '$2'=$2
163 . ./s4-blog.sh
164 err blog_reply $rowid
165 blog_reply $rowid
166 ;;
167 "editheading")
168 contenttype; echo
169 rowid=${2%%[!A-Z0-9a-z_]*}
170 # blogrowid=${3%%[!A-Z0-9a-z_]*}
171 if [ -z "$rowid" ]; then
172 echo "<p>話題番号が未指定です。</p>"
173 return
174 fi
175 owner=`getvalbyid blog owner $2`
176 title=`getvalbyid blog title $2`
177 m4 -D_TITLE_="修正" \
178 -D_SUBTITLE_="[$title]@$owner" -D_DIARY_="" \
179 -D_BLOGS_="" -D_DUMPTABLE_="" \
180 -D_FORM_="`GF_ACTION=\"?blog\" edittable $formdir/blog.def blog $rowid`" \
181 $layout/html.m4.html $layout/diary.m4.html
182 ;;
183 "editart")
184 contenttype; echo
185 rowid=${2%%[!A-Z0-9a-z_]*}
186 blogrowid=${3%%[!A-Z0-9a-z_]*}
187 if [ -z "$rowid" -o -z "$blogrowid" ]; then
188 echo "<p>表示する記事番号が未指定です。</p>"
189 return
190 fi
191 owner=`getvalbyid blog owner $blogrowid`
192 title=`getvalbyid blog title $blogrowid`
193 author=`getvalbyid article author $rowid`
194 err EDITart: owner=$owner, author=$author
195 if isgrpowner $user $owner; then
196 : EDIT OK
197 elif [ x"$owner" != x"$user" -a x"$author" != x"$user" ]; then
198 echo "<p>本人か所有者しか編集できません.</p>"
199 return
200 fi
201 aid=`query "select id from article where rowid=$rowid;"`
202 # title=`getvalbyid blog title $2`
203 m4 -D_TITLE_="コメントの修正" -D_DIARY_="" \
204 -D_FORM_="`GF_ACTION=\"?replyblog+$blogrowid#$aid\" edittable $formdir/article.def article $rowid`" \
205 -D_SUBTITLE_="`gecos $owner`の「$title」" \
206 -D_BLOGS_= -D_DUMPTABLE_= \
207 $layout/html.m4.html $layout/diary.m4.html
208 ;;
209 "lshandout")
210 contenttype; echo
211 rowid=${2%%[!A-Z0-9a-z_]*}
212 if [ -z "$rowid" ]; then
213 echo "<p>話題番号が未指定です。</p>"
214 return
215 fi
216 . ./s4-blog.sh
217 lshandout $rowid
218 ;;
219 "gethandout")
220 rowid=${2%%[!A-Z0-9a-z_]*}
221 if [ -z "$rowid" ]; then
222 echo "<p>話題番号が未指定です。</p>"
223 return
224 fi
225 . ./s4-blog.sh
226 gethandout $rowid
227 ;;
228 "searchart") # $2=blogowner
229 contenttype; echo
230 m4 -D_TITLE_="検索結果" $layout/html.m4.html
231 kwd=`getpar kwd`
232 if [ -z "$kwd" ]; then
233 echo "<p>検索語を指定してください</p>"
234 else
235 owner=`getpar owner`
236 owner=${owner:-$2}
237 echo "<h2>「$kwd」による検索結果</h2>"
238 if [ -n "$owner" ]; then
239 cond="where key='owner' and val='$owner'"
240 if isuser $owner; then
241 echo "<p>(`linkhome $owner` さんの記録からの検索)</p>"
242 else
243 linkhome $owner 1>&3
244 echo "<p>(`linkhome $owner` グループからの検索)</p>"
245 fi
246 fi
247 # article_s: id=article-id, key='text', val='TEXT'
248 # article: id=article-id, blogid=blogkd
249 # blog: id=blog-id, author=LeaderAuthor
250 # blog_s: id=blog-id, key='title', val='BLOG-TITLE'
251 # WANT: blog-ROWid,article-id,val(TEXT)
252 sql="select b.rowid||'#'||x.id as '',
253 b.title as TITLE,
254 substr(x.val, 0, 80) as TEXT
255 from (select blog.rowid,blog.*,bs.val as title from blog join blog_s bs
256 on blog.id=bs.id and bs.key='title') b
257 join
258 (select a.id,a.blogid,s.val from article a join article_s s
259 on a.id=s.id where s.val like '%$kwd%')
260 x on b.id=x.blogid
261 where b.id in (select id from blog_s
262 $cond);"
263 sedopt="s,<TR><TD>\([^<]*\)</TD>,<TR><TD><a\
264 href=\"?replyblog+\1\">VIEW</a></TD>,"
265 cat<<EOF
266 <table class="b searchart">
267 `sq -header -html $db "$sql"|sed "$sedopt"`
268 </table>
269 EOF
270 fi
271 ;;
272 "send2mem")
273 contenttype; echo
274 send2grpmember
275 ;;
276 "showattc")
277 # $2=table_m $3=rowid $4=val
278 if ! isfilereadable $user $2 $3; then
279 contenttype; echo
280 echo "<p>このファイルは管理者のみしか見られません</p>"
281 putfooter; exit
282 fi
283 idir=`umask 002; mktempd` || exit 1
284 # tmpfiles=$tmpfiles"${tmpfiles+ }$idir"
285 bin=$idir/$myname-$$.bin
286 sql="select quote(bin) from $2 where rowid='$3';"
287 sq $db "$sql" | unhexize > $bin
288 tv=`query "select type,val from $2 where rowid='$3';"`
289 type=${tv%|*} fn=${tv#*|}
290 err tv=$tv type=$type fn=$fn
291 ct=${type#file:}
292 case $ct in # all text/* changed to text/plain
293 text/*)
294 charset=`nkf -g $bin|cut -d' ' -f1`
295 case $charset in
296 ASCII*) charset="" ;;
297 esac
298 ct="text/plain${charset:+; charset=$charset}"
299 ;;
300 esac
301 contenttype "$ct"
302 echo "Content-Disposition: filename=\"$fn\""
303 echo "Content-Length: " `cat $bin | wc -c`; echo
304 #echo "Content-Type: " ${type#file:}; echo
305 cat $bin
306 exit 0
307 ;;
308 "gallery")
309 ## contenttype "Image/jpeg"
310 sql="select quote(b) from te where a='${2:-mikan.jpg}'"
311 idir=`umask 002; mktempd` || exit 1
312 # tmpfiles=$tmpfiles"${tmpfiles+ }$idir"
313 img=$idir/$myname-$$.bin
314 db=b.sq3
315 sqlite3 $db "$sql" | xxd -r -p > $img
316 len=`cat $img | wc -c`
317 echo "Content-Length: $len"
318 type=`file --mime-type $img | cut -d' ' -f2`
319 echo 'Content-type: $type'; echo
320 cat $img
321 ;;
322 esac
325 putfooter