# HG changeset patch # User HIROSE Yuuji # Date 1386845840 -32400 # Node ID f67f5304baacc8896dadc8ff2b7464d53cb03925 # Parent 54d85f7d5676cb78369692f0396764e83ada33e9 Add feature of sending message to a user diff -r 54d85f7d5676 -r f67f5304baac after5.rb --- 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 [yuujigentei.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, '&').gsub(/\"/n, '"'). gsub(/>/n, '>').gsub(/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("
", " ") } @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"