changeset 84:f67f5304baac draft

Add feature of sending message to a user
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 12 Dec 2013 19:57:20 +0900
parents 54d85f7d5676
children e2b6a2e8b5c7
files after5.rb
diffstat 1 files changed, 108 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/after5.rb	Wed Dec 11 08:41:04 2013 +0900
+++ b/after5.rb	Thu Dec 12 19:57:20 2013 +0900
@@ -4,7 +4,7 @@
 # Associative Scheduling Table - after5
 # (C)2003, 2004, 2006, 2008, 2012, 2013 by HIROSE Yuuji [yuuji<at>gentei.org]
 # $Id: after5.rb,v 1.20 2012/12/03 15:54:20 yuuji Exp $
-# Last modified Wed Dec 11 08:38:14 2013 on firestorm
+# Last modified Thu Dec 12 18:09:01 2013 on firestorm
 # See http://www.gentei.org/~yuuji/software/after5/
 # このスクリプトはEUCで保存してください。
 $hgid = <<_HGID_.split[1..-2].join(" ")
@@ -607,7 +607,11 @@
       collectmembers(grp)
   end
   def membernames(grp)
-    members(grp).collect{|u| nickname(u)}
+    if isgroup(grp)
+      members(grp).collect{|u| nickname(u)}
+    else
+      [nickname(grp)]
+    end
   end
   def admins(grp)
     @groupmap[grp] and @groupmap[grp]['admin']
@@ -1379,6 +1383,8 @@
         'aboutgroup'	=> ['グループ %s の操作', "Operations on group `%s'"],
 	'groupwarn'	=> ['自分が参加してないグループAに、自分が参加しているグループBが含まれている場合、グループAにも加入していると見なされるので気をつけよう。管理者はグループのニックネームを変えられるよ。',
 	  'Though you are not member of group A, you are treated as a member of A, if you join to the group B, which is a member of A.  Think the nesting of groups carefully, please.  Group administrator can change the group nickname.'],
+	'address2send'	=> ['自分が参加しているグループのメンバーリストの先頭が自分。その直後にある入力欄には、そのML宛メッセージをどの宛先に配送するかを入れられる。そう、MLごとに自分への配送先を変えられるよ。',
+                            'The first entry of member list of a group to which you belongs, is you.  Entry box just after your name is for address list you want to deliver messages to that ML.  Thus, you can define different addresses for each ML.'],
 	'wholemembers'	=> ['グループ内グループを考慮した上で、現在グループ %s への通知は以下のメンバーに送られる。',
 	  "Consiering the groups registered in another group, notification to the group `%s' is send to members as follows."],
 	'noadmingroup'	=> ['管理できるグループはないっす',
@@ -1457,6 +1463,12 @@
     string.gsub(/&/n, '&amp;').gsub(/\"/n, '&quot;').
       gsub(/>/n, '&gt;').gsub(/</n, '&lt;')
   end
+  def quoted(string)
+    NKF.nkf('-eMQ', string)
+  end
+  def unquoted(string)
+    NKF.nkf('-emQ', string)
+  end
 
   def gencookie(name, a, expire)
     x = a.collect{|k, v|
@@ -1667,6 +1679,7 @@
   end
   def sendMail(to, subject, body, from=nil, rcptto=nil, header={},
                thru=nil, spoolto=false)
+    # rcptto should be an Array
     body = NKF.nkf("-j", body) unless thru
     subject = NKF.nkf("-jM", subject.strip)
     to = safecopy(to)		# cleanup tainted address
@@ -2716,12 +2729,16 @@
       when /^(\S+): /i             # if new header comes
         if /^subject:/i =~ hold[0] # check previous header in hold space
           sj = hold.join.toeuc.sub("Subject: ", "").gsub(tag, "").strip
-          removeregexp and sj.gsub!(removeregexp, "")
+          removeregexp && sj && sj.gsub!(removeregexp, "")
           sj = sj.sub(/^(re: *)+/i, "Re: ").gsub("\n", "")
           hold = ["Subject: "+NKF.nkf('-jM', tag+" "+sj).strip+"\n"]
         elsif /^from/i =~ hold[0] && fromhack.is_a?(String)
           from = hold.join.toeuc.sub(/From: */i, "").strip
           email, comment = parseaddress(from)
+          if (!comment || comment=="") && comment = @sc.ismembersemail(email)
+            # Reverse conversion of uname<->email
+            comment = @sc.nickname(comment) || ""
+          end
           hold = ["From: "+rewritefrom(email, comment, fromhack)+"\n"]
         end
         ret += hold
@@ -2742,7 +2759,7 @@
     #  LOCAL=1 DEFAULT=name ./after5.rb -list
     # $DEFAULT is ML name
     viamail = ENV['LOCAL'] && ENV['DEFAULT'] # called via mail
-    from = toadmin = nil
+    from = toadmin = groupmode = fromhack = nil
     unless @opt['mailprefix'] && @opt['maildomain']
       if viamail
         STDERR.print msg('sendall_err') % [@opt['conf']]
@@ -2754,7 +2771,7 @@
     end
     if viamail then
       prohibitviahttp()
-      name = ENV['DEFAULT']
+      name = unquoted(ENV['DEFAULT'])
       if Regexp.new("(.*)("+Regexp.quote(@mailadmsuffix)+")") =~ name
         # To: GROUP/adm*@domain
         #   -> Forward to group administrator(s)
@@ -2764,7 +2781,13 @@
                  {"Return-path" => @opt['maintainer']}, :thru)
         exit 0
       end
-      unless grepgroup(name)
+      if @sc.isuser(name)	# groupmode = nil
+        # First, compare with username
+        # groupmode = nil
+        # Then, check group name
+      elsif grepgroup(name)
+        groupmode = true
+      else                      # not found
         sendMail(@opt['maintainer'], "no group",
                  sprintf("Invalid group address: %s(%s@%s)\nSent by %s\n" +
                          "URL: %s\n------------\n",
@@ -2775,8 +2798,12 @@
       end
     else                        # via http
       return nil unless checkauth
-      name = @params['name'].untaint
-      unless grepgroup(name)
+      name = unquoted(@params['name'].untaint)
+      if @sc.isuser(name)
+        # groupmode = nil
+      elsif grepgroup(name)
+        groupmode = true
+      else
         @O.print @H.p("No such group: #{name}")
         return true
       end
@@ -2784,11 +2811,32 @@
       from = sprintf("%s <%s>", nick, @params['user'])
       body = @params['body'].gsub("\r", "").untaint
     end
-    bracket = @sc.getgroupattr(name, 'subjtag') || @opt['mailbracket']
-    fromhack = @sc.getgroupattr(name, 'fromhack')
-    xmlname = @sc.getgroupattr(name, 'xmlname') || name
-    mldir = "ml/"+name
-    to = @sc.getgroupattr(name, 'mladdress') || defaultmladdress(name)
+
+    # Set values for header rewriting
+    if groupmode                # Run as ML
+      bracket = @sc.getgroupattr(name, 'subjtag') || @opt['mailbracket']
+      xmlname = @sc.getgroupattr(name, 'xmlname') || name
+      mldir = "ml/"+name
+      to = @sc.getgroupattr(name, 'mladdress') || defaultmladdress(name)
+      if @sc.getgroupattr(name, 'fromhack')
+        fromhack = to
+      end
+      spooling = @opt['mlspooling']
+    else                        # Run as p2p mail
+      bracket = "NONE"          # Throught Subject
+      user = @params['user'] || ENV['SENDER']
+      if @sc.ismembersemail(user)
+        sender = defaultmladdress(quoted(user))
+      else
+        sender = user
+      end
+      ###fromhack = sprintf("%s <%s>", nick, sender)
+      fromhack = sender
+      
+      xmlname = name
+      to = name
+      spooling = mldir = nil
+    end
     returnpath = to.sub("@", @mailadmsuffix+"-@")
     adminaddr  = to.sub("@", @mailadmsuffix+"@")
     subj = @params['subject'] || "Message from "+@myname
@@ -2807,24 +2855,31 @@
       subj = sjtag.strip+" "+subj.gsub(Regexp.new(tagpt), "")
     end
     if viamail then
-      body = tagify_subj(STDIN.readlines, sjtag, tagre,
-                         fromhack ? to : nil).join
-    elsif fromhack
-      from = rewritefrom(@params['user'], nick, to)
+      body = tagify_subj(STDIN.readlines, sjtag, tagre, fromhack).join
+    elsif fromhack              # via http
+      from = rewritefrom(@params['user'], nick, groupmode ? to : sender)
     end
     header = {
-      "Reply-to" => to,
       "X-ML-Driver" => ($hgid || @myname),
       "X-ML-Driver-URI" => $myurl,
-      "X-ML-Name" => xmlname,
-      "X-ML-URI" => sprintf("%s?-groupman+%s", @opt['url'], name),
-      "Return-path" => returnpath}
+    }
+    if groupmode
+      header["Reply-to"] = to
+      header["X-ML-Name"] = xmlname
+      header["X-ML-URI"] = sprintf("%s?-groupman+%s", @opt['url'], name)
+      header["Return-path"] = returnpath
+    end
     Dir.chdir @mydir
-    rcpts = if grepgroup(name)
-              @sc.members(name)
-            else
-              [name]
-            end.collect {|u| mailaddress(u, name).split(/,\s*|\s+/)}.flatten
+    if groupmode
+      rcpts = if grepgroup(name)
+                @sc.members(name)
+              else
+                [name]
+              end.collect {|u| mailaddress(u, name).split(/,\s*|\s+/)}.flatten
+    else
+      rcpts = @sc.mailaddress(name).split(/,\s*|\s+/).flatten
+      rcpts += @sc.mailaddress(user).split(/,\s*|\s+/).flatten # +sender
+    end
     ENV["QMAILINJECT"] = "r"    # for ML mode, use verp
     #
     # On mail mode, check if sender can send message to list.
@@ -2847,7 +2902,7 @@
     sendMail(to, subj, body, from, rcpts,
              header,
              ENV['SENDER'],
-             @opt['mlspooling'] ? mldir : nil)
+             spooling ? mldir : nil)
     if !viamail then
       @O.print @H.elementln("h1"){msg('sendall_done')}
       @O.print @H.p(sprintf(msg('sendall_head'),
@@ -2868,14 +2923,21 @@
     
     user=@params['user']
     nickname = @sc.nickname(user)
+    groupmode = @sc.isgroup(name)
     @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(", ")))
+    list = groupmode ? @sc.members(name) : [name, user]
+    @O.print @H.p(sprintf("%s: %s", msg('member'),
+                          list.collect {|u|
+                            @H.element("abbr", "title"=>u){
+                              @sc.nickname(u)
+                            }
+                          }.join(",\n")))
+    @O.print @H.p(sprintf("(total %d)", list.length))+"\n"
     @O.print \
     @H.elementln("form", {'action' => @myname+'?-list', 'method'=>"POST"}) {
       @H.elementln("table"){
@@ -3111,12 +3173,15 @@
                   memlist.unshift(user)
                 end
                 memlist.collect{|u|
-                  (adminp \
-                   ? @H.element("abbr", "title"=>mailaddress(u)) {
-                     @sc.nickname(u)
-                   }
-                   : @sc.nickname(u)) + \
-                  ((u == user) ? ("("+@H.text("mail4-#{g}", memberp, 30, 180)+")") : "")
+                  if u == user
+                    @sc.nickname(u) + \
+                    "("+@H.text("mail4-#{g}", memberp, 30, 180)+")"
+                  else
+                    @H.a(@myname+"?-listdraft+#{u}",
+                         @H.element("abbr", "title"=>u) {
+                           @sc.nickname(u)
+                         })
+                  end
                 }.join(", ")
               }
             } + \
@@ -3127,6 +3192,7 @@
 	}.join("\n")
       } + \
       '' + \
+      @H.p(msg('address2send')) + \
       @H.p(msg('groupwarn', 'shortnameplz')) + \
       @H.submit_reset("GO")
     } # form
@@ -3367,13 +3433,13 @@
          sprintf(msg('mladdress'), defaultmladdress(group)) + \
          @H.text("mladdress", @sc.getgroupattr(group, 'mladdress'),
                  @opt['size'], 80)
+       } + \
+       @H.elementln('p') {
+         sprintf(msg('xmlname'), group) + \
+         @H.text("xmlname", @sc.getgroupattr(group, 'xmlname'),
+                 @opt['size'], 80)
        } : "") + \
       @H.elementln('p') {
-        sprintf(msg('xmlname'), group) + \
-        @H.text("xmlname", @sc.getgroupattr(group, 'xmlname'),
-                @opt['size'], 80)
-      } + \
-      @H.elementln('p') {
         n = -1
         curtag = @sc.getgroupattr(group, 'subjtag')
         values = @subjtags.collect {|x|
@@ -3996,7 +4062,8 @@
 	@job = 'newgroup'
       when /^-(admgroup|listdraft)$/
 	ARGV.shift
-	gr = safecopy(grepgroup(ARGV[0]))
+	#gr = safecopy(grepgroup(ARGV[0]))
+	gr = safecopy(ARGV[0]) # -listdraft can be called with user 2013/12/12
 	##gr.untaint
 	@job = safecopy($1)+' "'+gr+'"'
       when "-admgroupsub"

yatex.org