changeset 37:1515ea889ea1 draft

First implementation of ML feature.
author HIROSE Yuuji <yuuji@gentei.org>
date Sun, 06 May 2012 22:24:32 +0900
parents e67737e49a5d
children 39da23b2edb9
files after5.rb
diffstat 1 files changed, 139 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- 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 [yuuji<at>gentei.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'	=> ['管理<br>操作', "Administrative<br>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("<br>", " ")
+    }
+    @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"})){}
+          }
+        }
+      } +	# </table>
+      @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"

yatex.org