Mercurial > hgrepos > hgweb.cgi > after5
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')) |