# HG changeset patch # User HIROSE Yuuji # Date 1336310672 -32400 # Node ID 1515ea889ea1ea34d28f7a470ed6a2fc9fbb9762 # Parent e67737e49a5de7a492328714bb2c91b61f5411c8 First implementation of ML feature. diff -r e67737e49a5d -r 1515ea889ea1 after5.rb --- a/after5.rb Thu Apr 19 17:16:48 2012 +0900 +++ b/after5.rb Sun May 06 22:24:32 2012 +0900 @@ -4,10 +4,13 @@ # Associative Scheduling Table - after5 # (C)2003, 2004, 2006, 2008, 2012 by HIROSE Yuuji [yuujigentei.org] # $Id: after5.rb,v 1.19 2012/04/01 11:52:25 yuuji Exp yuuji $ -# $HGid$ -# Last modified Thu Apr 12 21:18:58 2012 on firestorm +# Last modified Sun May 6 21:41:14 2012 on firestorm # See http://www.gentei.org/~yuuji/software/after5/ # このスクリプトはEUCで保存してください。 +$hgid = <<_HGID_.split[1..-2].join(" ") +$HGid$ +_HGID_ +$myurl = "http://www.gentei.org/~yuuji/software/after5/" require 'kconv' require 'nkf' @@ -323,7 +326,7 @@ # Should we distinguish between attribute is nil and "" ? if @usermap.has_key?(user) && @usermap[user][attr].is_a?(String) && @usermap[user][attr] > '' - return @usermap[user][attr] + return @usermap[user][attr].untaint else return nil end @@ -539,6 +542,9 @@ @groupmap[grp] and ####################@groupmap[grp]['members'] collectmembers(grp) end + def membernames(grp) + members(grp).collect{|u| nickname(u)} + end def admins(grp) @groupmap[grp] and @groupmap[grp]['admin'] end @@ -1225,6 +1231,12 @@ 'administrator' => ['管理者', 'Administrator'], 'newgroup' => ['新規グループ作成', 'Create new group'], 'adminop' => ['管理
操作', "Administrative
operation"], + 'sendall' => ['一斉送信', "write to members"], + 'sendall_head' => ['「%s」宛のメイル送信', "Send message to `%s'"], + 'sendall_note' => ['メンバーへの連絡だけでなく、グループ非加入者がこれから加入する旨の通知などにも有用。', + "Send this message to all of group."], + 'sendall_done' => ['送信完了', "sending message done"], + 'body' => ['本文', 'Body'], 'member' => ['メンバー', 'Member'], 'personalmode' => ['自分のだけ表示モード', 'Display Personal Only'], 'normalmode' => ['全員分表示モード', "Display Everyone's"], @@ -1504,25 +1516,42 @@ end end - def sendMail(to, subject, body) - body = NKF.nkf("-j", body) - subject = NKF.nkf("-jM", subject) + def sendMail(to, subject, body, from=nil, rcptto=nil, header={}, thru=nil) + body = NKF.nkf("-j", body) unless thru + subject = NKF.nkf("-jM", subject.strip) to = safecopy(to) # cleanup tainted address subject.gsub!(/\n/, '') begin if (m=open("|-", "w")) - m.print "To: #{to}\n" - m.print "Subject: #{subject}\n" - m.print "Mime-Version: 1.0 + header.each do |h, v| + m.printf("%s: %s\n", h.strip, v.strip) + end + unless thru + m.print "To: #{to}\n" + from and m.print "From: #{from}\n" + m.print "Subject: #{subject}\n" + m.puts "Mime-Version: 1.0 Content-Transfer-Encoding: 7bit -Content-Type: Text/Plain; charset=iso-2022-jp - -" +Content-Type: Text/Plain; charset=iso-2022-jp" + m.print "\n" + end m.print body, "\n" m.close else # exec(@attr['mail'], "-s", subject, to) - exec(@opt['sendmail'], to) + recipient = rcptto || [to] + #p recipient + if ENV['MAILCMD'] + #exec("qmail-inject", "yuuji@gentei.org", "yuuji@koeki-u.ac.jp") + open("/tmp/body", "w") {|w| w.print STDIN.readlines.join + w.puts "---" + w.puts recipient.join(",\n") + } + exit 0 + else + #recipient.unshift "-f"+header['return-path'] if header['return-path'] + exec(ENV['MAILCMD'] || @opt['sendmail'], *recipient) + end exit 0; end putLog("Sent '#{subject}' to #{to}\n") @@ -2415,7 +2444,7 @@ prohibitviahttp() unless @opt['maintainer'] STDERR.printf "Set maintainer(email-address) in %s\n", @opt['conf'] - STDERR.print "(ex) maintainer=yuuji@gentei.org\n" + STDERR.print "(ex.) maintainer=yuuji@gentei.org\n" exit 0 end Dir.chdir @mydir @@ -2483,6 +2512,94 @@ exit 0 end + # ML functions + def list() + # For debug: + # LOCAL=1 DEFAULT=name ./after5.rb -list + # $DEFAULT is ML name + viamail = ENV['LOCAL'] && ENV['DEFAULT'] # called via mail + from = nil + unless @opt['mailprefix'] && @opt['maildomain'] + STDERR.printf("Set mailprefix and maildomain in %s\n", @opt['conf']) + STDERR.print "(ex.) mailprefix=yuuji-after5\n" + STDERR.print " maildomain=gentei.org\n" + exit 0 + end + if viamail then + prohibitviahttp() + name = ENV['DEFAULT'] + body = STDIN.readlines.join + else # via http + return nil unless checkauth + name = @params['name'] + nick = @sc.nickname(@params['user']) + from = sprintf("%s <%s>", nick, @params['user']) + body = @params['body'].gsub("\r", "").untaint + end + to = sprintf("%s-%s@%s", @opt['mailprefix'], name, @opt['maildomain']) + subj = @params['subject'] || "Message from "+@myname + Dir.chdir @mydir + rcpts = if grepgroup(name) + @sc.members(name) + else + [name] + end.collect {|u| mailaddress(u)} + # p rcpts + # p to + sendMail(to, subj, body, from, rcpts, + { "Reply-to" => to, + "X-ML-Driver" => $hgid, + "X-ML-Driver-URI" => $myurl, + "X-ML-Name" => name, + "Errors-to" => @opt['maintainer'], + "Return-path" => @opt['maintainer']}, + ENV['SENDER']) + if !viamail then + @O.print @H.elementln("h1"){msg('sendall_done')} + @O.print @H.p(sprintf(msg('sendall_head'), name)+" "+msg('done')) + link2home() + @O.print footer() + return true + end + exit 0 + end + def listdraft(name) + return nil unless checkauth + return nil unless name + user=@params['user'] + nickname = @sc.nickname(user) + @O.print @H.elementln("h1") { + @mybase+' '+msg('sendall').sub("
", " ") + } + @O.print @H.elementln("h2") { + sprintf(msg('sendall_head'), nickname(name)) + } + @O.print @H.p(sprintf("(%s: %s)", msg('member'), + @sc.membernames(name).join(", "))) + @O.print \ + @H.elementln("form", {'action' => @myname+'?-list', 'method'=>"POST"}) { + @H.elementln("table"){ + @H.elementln("tr"){ + @H.element("td"){"Subject"} + \ + @H.element("td"){ + @H.text("subject", "", 40, 128) + } + } + \ + @H.elementln("tr"){ + @H.element("td"){ + msg('body') + } + \ + @H.element("td"){ + @H.element("textarea", @schedulearea.merge({"name"=>"body"})){} + } + } + } + # + @H.hidden("name", name) + + @H.submit("send", "SEND") + + @H.reset("clear", "Clear") + } + @O.print @H.p(msg('sendall_note')) + end # put Link to home def link2home() @@ -2680,7 +2797,10 @@ ghash['members'].collect{|u| @sc.nickname(u) }.join(", ") - } + } + \ + @H.element("td"){ + @H.a(@myname+"?-listdraft+#{g}", msg('sendall')) + } } }.join("\n") } + \ @@ -3390,13 +3510,15 @@ @job = "groupmod" when "-notify" @job = 'notify' # + exit + when "-list" + @job = 'list' # + exit when "-newgroup" @job = 'newgroup' - when "-admgroup" + when /^-(admgroup|listdraft)/ ARGV.shift gr = safecopy(grepgroup(ARGV[0])) ##gr.untaint - @job = 'admgroup "'+gr+'"' + @job = safecopy($1)+' "'+gr+'"' when "-admgroupsub" @job = 'admgroupsub' when "-newgroupsub"