comparison after5.rb @ 83:54d85f7d5676 draft

- The parameter pswdlen surely works - Subject tag `NONE' introduced - New group parameter xmlname controls 'X-ML-Name: ' header - Remove ML spool dir when group destruction
author HIROSE Yuuji <yuuji@gentei.org>
date Wed, 11 Dec 2013 08:41:04 +0900
parents 0ca2c48f8387
children f67f5304baac
comparison
equal deleted inserted replaced
82:0ca2c48f8387 83:54d85f7d5676
2 # -*- coding: euc-jp -*- 2 # -*- coding: euc-jp -*-
3 # 3 #
4 # Associative Scheduling Table - after5 4 # Associative Scheduling Table - after5
5 # (C)2003, 2004, 2006, 2008, 2012, 2013 by HIROSE Yuuji [yuuji<at>gentei.org] 5 # (C)2003, 2004, 2006, 2008, 2012, 2013 by HIROSE Yuuji [yuuji<at>gentei.org]
6 # $Id: after5.rb,v 1.20 2012/12/03 15:54:20 yuuji Exp $ 6 # $Id: after5.rb,v 1.20 2012/12/03 15:54:20 yuuji Exp $
7 # Last modified Tue Mar 5 15:31:29 2013 on firestorm 7 # Last modified Wed Dec 11 08:38:14 2013 on firestorm
8 # See http://www.gentei.org/~yuuji/software/after5/ 8 # See http://www.gentei.org/~yuuji/software/after5/
9 # このスクリプトはEUCで保存してください。 9 # このスクリプトはEUCで保存してください。
10 $hgid = <<_HGID_.split[1..-2].join(" ") 10 $hgid = <<_HGID_.split[1..-2].join(" ")
11 $HGid$ 11 $HGid$
12 _HGID_ 12 _HGID_
257 def users() 257 def users()
258 @pdb.keys.collect{|u| u.toeuc} # toeuc is for 1.9 :( 258 @pdb.keys.collect{|u| u.toeuc} # toeuc is for 1.9 :(
259 end 259 end
260 private :newpasswd 260 private :newpasswd
261 def setnewpasswd(user, length=8) 261 def setnewpasswd(user, length=8)
262 length = length.to_i
263 length = 4 if length < 4
262 newp = newpasswd(length) 264 newp = newpasswd(length)
263 setpasswd(user, newp) 265 setpasswd(user, newp)
264 newp 266 newp
265 end 267 end
266 end 268 end
373 else 375 else
374 members += collectmembers(item) 376 members += collectmembers(item)
375 end 377 end
376 } 378 }
377 @visitedgroup.pop 379 @visitedgroup.pop
378 members 380 members.uniq
379 end 381 end
380 def mkgroupmap() 382 def mkgroupmap()
381 map = {} 383 map = {}
382 return map unless test(?d, @groupmapdir) 384 return map unless test(?d, @groupmapdir)
383 @visitedgroup = [] 385 @visitedgroup = []
1126 ['[GroupName:#]', "[%n:%c]"], 1128 ['[GroupName:#]', "[%n:%c]"],
1127 ['[GroupName:#####]', "[%n:%5c]"], 1129 ['[GroupName:#####]', "[%n:%5c]"],
1128 ['(GroupID:#)', "(%i:%c)"], 1130 ['(GroupID:#)', "(%i:%c)"],
1129 ['(GroupID:#####)', "(%i:%5c)"], 1131 ['(GroupID:#####)', "(%i:%5c)"],
1130 ['(GroupName:#)', "(%n:%c)"], 1132 ['(GroupName:#)', "(%n:%c)"],
1131 ['(GroupName:#####)', "(%n:%5c)"]] 1133 ['(GroupName:#####)', "(%n:%5c)"],
1134 ['NONE', "NONE"]]
1132 ##@job = "today" 1135 ##@job = "today"
1133 @wnames = %w[sun mon tue wed thu fri sat] 1136 @wnames = %w[sun mon tue wed thu fri sat]
1134 @job = "login" 1137 @job = "login"
1135 @sc = ScheduleDir.new 1138 @sc = ScheduleDir.new
1136 @O = StringIO.new 1139 @O = StringIO.new
1306 'Only administrators can add new members.'], 1309 'Only administrators can add new members.'],
1307 'invite-error' => ['%s への加入はグループ管理者のみが操作できます。', 1310 'invite-error' => ['%s への加入はグループ管理者のみが操作できます。',
1308 "Only administrator of this group(`%s') can add you."], 1311 "Only administrator of this group(`%s') can add you."],
1309 'limitsender' => ['アカウント保持者のみ送信可能', 1312 'limitsender' => ['アカウント保持者のみ送信可能',
1310 'Allow only account holders to post to ML'], 1313 'Allow only account holders to post to ML'],
1314 'xmlname' => ['X-ML-Nameヘッダの値("%s" 以外にしたい場合設定する)',
1315 'Value of X-ML-Name header ("%s" for default)'],
1311 'personal' => ['個人で', 'personal'], 1316 'personal' => ['個人で', 'personal'],
1312 'registas' => ['グループ予定として登録?', 'Register as group?'], 1317 'registas' => ['グループ予定として登録?', 'Register as group?'],
1313 'headsched' => ['下の枠内に予定を記入: 1行以内で短めに。 1318 'headsched' => ['下の枠内に予定を記入: 1行以内で短めに。
1314 長くなるときは2行目以降に詳細を。', 1319 長くなるときは2行目以降に詳細を。',
1315 'Put shortest sentence as possible within 1 line. 1320 'Put shortest sentence as possible within 1 line.
1530 end 1535 end
1531 if pm.userexist?(user) 1536 if pm.userexist?(user)
1532 if pm.checkpasswd(user, passwd) 1537 if pm.checkpasswd(user, passwd)
1533 throw :auth, true 1538 throw :auth, true
1534 elsif passwd == @opt['forgot'] 1539 elsif passwd == @opt['forgot']
1535 newp = pm.setnewpasswd(user, @opt['pswdlen']) 1540 newp = pm.setnewpasswd(user, @opt['pswdlen'].to_i)
1536 sendMail(email, "#{@mybase} password", 1541 sendMail(email, "#{@mybase} password",
1537 "(#{ENV['REMOTE_ADDR']} からのアクセスによる送信)\n" + 1542 "(#{ENV['REMOTE_ADDR']} からのアクセスによる送信)\n" +
1538 @opt['url'] + "\n" + 1543 @opt['url'] + "\n" +
1539 "#{@mybase} 用の #{user} さんのパスワードは\n" + 1544 "#{@mybase} 用の #{user} さんのパスワードは\n" +
1540 (newp || "未定義") + "\nです。\n") 1545 (newp || "未定義") + "\nです。\n")
2709 break 2714 break
2710 ## when /^(subject|from): /i 2715 ## when /^(subject|from): /i
2711 when /^(\S+): /i # if new header comes 2716 when /^(\S+): /i # if new header comes
2712 if /^subject:/i =~ hold[0] # check previous header in hold space 2717 if /^subject:/i =~ hold[0] # check previous header in hold space
2713 sj = hold.join.toeuc.sub("Subject: ", "").gsub(tag, "").strip 2718 sj = hold.join.toeuc.sub("Subject: ", "").gsub(tag, "").strip
2714 sj.gsub!(removeregexp, "") 2719 removeregexp and sj.gsub!(removeregexp, "")
2715 sj = sj.sub(/^(re: *)+/i, "Re: ").gsub("\n", "") 2720 sj = sj.sub(/^(re: *)+/i, "Re: ").gsub("\n", "")
2716 hold = ["Subject: "+NKF.nkf('-jM', tag+" "+sj).strip+"\n"] 2721 hold = ["Subject: "+NKF.nkf('-jM', tag+" "+sj).strip+"\n"]
2717 elsif /^from/i =~ hold[0] && fromhack.is_a?(String) 2722 elsif /^from/i =~ hold[0] && fromhack.is_a?(String)
2718 from = hold.join.toeuc.sub(/From: */i, "").strip 2723 from = hold.join.toeuc.sub(/From: */i, "").strip
2719 email, comment = parseaddress(from) 2724 email, comment = parseaddress(from)
2779 from = sprintf("%s <%s>", nick, @params['user']) 2784 from = sprintf("%s <%s>", nick, @params['user'])
2780 body = @params['body'].gsub("\r", "").untaint 2785 body = @params['body'].gsub("\r", "").untaint
2781 end 2786 end
2782 bracket = @sc.getgroupattr(name, 'subjtag') || @opt['mailbracket'] 2787 bracket = @sc.getgroupattr(name, 'subjtag') || @opt['mailbracket']
2783 fromhack = @sc.getgroupattr(name, 'fromhack') 2788 fromhack = @sc.getgroupattr(name, 'fromhack')
2789 xmlname = @sc.getgroupattr(name, 'xmlname') || name
2784 mldir = "ml/"+name 2790 mldir = "ml/"+name
2785 to = @sc.getgroupattr(name, 'mladdress') || defaultmladdress(name) 2791 to = @sc.getgroupattr(name, 'mladdress') || defaultmladdress(name)
2786 returnpath = to.sub("@", @mailadmsuffix+"-@") 2792 returnpath = to.sub("@", @mailadmsuffix+"-@")
2787 adminaddr = to.sub("@", @mailadmsuffix+"@") 2793 adminaddr = to.sub("@", @mailadmsuffix+"@")
2788 subj = @params['subject'] || "Message from "+@myname 2794 subj = @params['subject'] || "Message from "+@myname
2789 sjtag = bracket.gsub("%n", nickname(name)). 2795 if bracket == "NONE"
2790 gsub("%i", name). 2796 sjtag = ""
2791 gsub(/%(\d*)c/){("%0"+$1+"d") % [mlseq(mldir)]} 2797 tagre = nil
2792 tagpt = Regexp.quote(bracket). # compute bracket pattern 2798 else
2793 gsub("%n", Regexp.quote(nickname(name))). 2799 sjtag = bracket.gsub("%n", nickname(name)).
2794 gsub("%i", Regexp.quote(name)). 2800 gsub("%i", name).
2795 gsub(/%(\d*)c/, '\d+') 2801 gsub(/%(\d*)c/){("%0"+$1+"d") % [mlseq(mldir)]}
2796 tagre = Regexp.new(tagpt) 2802 tagpt = Regexp.quote(bracket). # compute bracket pattern
2797 subj = sjtag.strip+" "+subj.gsub(Regexp.new(tagpt), "") 2803 gsub("%n", Regexp.quote(nickname(name))).
2804 gsub("%i", Regexp.quote(name)).
2805 gsub(/%(\d*)c/, '\d+')
2806 tagre = Regexp.new(tagpt)
2807 subj = sjtag.strip+" "+subj.gsub(Regexp.new(tagpt), "")
2808 end
2798 if viamail then 2809 if viamail then
2799 body = tagify_subj(STDIN.readlines, sjtag, tagre, 2810 body = tagify_subj(STDIN.readlines, sjtag, tagre,
2800 fromhack ? to : nil).join 2811 fromhack ? to : nil).join
2801 elsif fromhack 2812 elsif fromhack
2802 from = rewritefrom(@params['user'], nick, to) 2813 from = rewritefrom(@params['user'], nick, to)
2803 end 2814 end
2804 header = { 2815 header = {
2805 "Reply-to" => to, 2816 "Reply-to" => to,
2806 "X-ML-Driver" => ($hgid || @myname), 2817 "X-ML-Driver" => ($hgid || @myname),
2807 "X-ML-Driver-URI" => $myurl, 2818 "X-ML-Driver-URI" => $myurl,
2808 "X-ML-Name" => name, 2819 "X-ML-Name" => xmlname,
2809 "X-ML-URI" => sprintf("%s?-groupman+%s", @opt['url'], name), 2820 "X-ML-URI" => sprintf("%s?-groupman+%s", @opt['url'], name),
2810 "Return-path" => returnpath} 2821 "Return-path" => returnpath}
2811 Dir.chdir @mydir 2822 Dir.chdir @mydir
2812 rcpts = if grepgroup(name) 2823 rcpts = if grepgroup(name)
2813 @sc.members(name) 2824 @sc.members(name)
3356 sprintf(msg('mladdress'), defaultmladdress(group)) + \ 3367 sprintf(msg('mladdress'), defaultmladdress(group)) + \
3357 @H.text("mladdress", @sc.getgroupattr(group, 'mladdress'), 3368 @H.text("mladdress", @sc.getgroupattr(group, 'mladdress'),
3358 @opt['size'], 80) 3369 @opt['size'], 80)
3359 } : "") + \ 3370 } : "") + \
3360 @H.elementln('p') { 3371 @H.elementln('p') {
3372 sprintf(msg('xmlname'), group) + \
3373 @H.text("xmlname", @sc.getgroupattr(group, 'xmlname'),
3374 @opt['size'], 80)
3375 } + \
3376 @H.elementln('p') {
3361 n = -1 3377 n = -1
3362 curtag = @sc.getgroupattr(group, 'subjtag') 3378 curtag = @sc.getgroupattr(group, 'subjtag')
3363 values = @subjtags.collect {|x| 3379 values = @subjtags.collect {|x|
3364 sprintf(' <option value="%d"%s>%s</option>', n+=1, 3380 sprintf(' <option value="%d"%s>%s</option>', n+=1,
3365 curtag==@subjtags[n][1] ? ' selected' : "", 3381 curtag==@subjtags[n][1] ? ' selected' : "",
3432 end 3448 end
3433 unless (gr=grepgroup(group)) 3449 unless (gr=grepgroup(group))
3434 @O.print @H.p("No such group #{group}") 3450 @O.print @H.p("No such group #{group}")
3435 return nil 3451 return nil
3436 end 3452 end
3437 group = gr 3453 group = safecopy(gr)
3438 unless @sc.isadmin(user, group) 3454 unless @sc.isadmin(user, group)
3439 @O.print @H.p("You are not administrator of #{group}.") 3455 @O.print @H.p("You are not administrator of #{group}.")
3440 return nil 3456 return nil
3441 end 3457 end
3442 unless @params['delete'] && /yes/i =~ @params['delete'] \ 3458 unless @params['delete'] && /yes/i =~ @params['delete'] \
3445 return nil 3461 return nil
3446 end 3462 end
3447 @O.print @H.elementln("h1"){ 3463 @O.print @H.elementln("h1"){
3448 msg('group')+" #{group} "+msg('deletion') 3464 msg('group')+" #{group} "+msg('deletion')
3449 } 3465 }
3450 resmsg = @sc.destroygroup(group) ? msg("done") : msg("failure") 3466 if @sc.destroygroup(group)
3467 system(sprintf("rm -r ml/%s", group))
3468 resmsg = msg("done")
3469 else
3470 resmsg = Omsg("failure")
3471 end
3451 @O.print @H.p(resmsg) 3472 @O.print @H.p(resmsg)
3452 putLog("Delete group '#{group}' #{resmsg}\n") 3473 putLog("Delete group '#{group}' #{resmsg}\n")
3453 3474
3454 @O.print footer() 3475 @O.print footer()
3455 end 3476 end
3605 end 3626 end
3606 @sc.putgroupattr(group, 'subjtag', newtag) 3627 @sc.putgroupattr(group, 'subjtag', newtag)
3607 if newtag && newtag > "" 3628 if newtag && newtag > ""
3608 @O.print @H.elementln("p") { 3629 @O.print @H.elementln("p") {
3609 putLog(sprintf("group: %s[subjtag] set to '%s'", group, newtag)) 3630 putLog(sprintf("group: %s[subjtag] set to '%s'", group, newtag))
3631 }
3632 somethingdone = true
3633 end
3634 # X-ML-Name: Header value
3635 xmlname = @params['xmlname']
3636 xmlname = nil if xmlname == ""
3637 curxmlname = @sc.getgroupattr(group, 'xmlname')
3638 if xmlname != curxmlname && /^[-A-Z_a-z\/0-9+@(),.<>]+$/ =~ xmlname
3639 @sc.putgroupattr(group, 'xmlname', xmlname)
3640 @O.print @H.elementln("p") {
3641 putLog(sprintf("X-ML-Name: Set to %s", xmlname))
3610 } 3642 }
3611 somethingdone = true 3643 somethingdone = true
3612 end 3644 end
3613 unless somethingdone 3645 unless somethingdone
3614 # @O.print @H.p(msg('nothingtodo')) 3646 # @O.print @H.p(msg('nothingtodo'))

yatex.org