# HG changeset patch # User HIROSE Yuuji # Date 1340601287 -32400 # Node ID 2d33f85c3d9f58133e04de759b5cfd55ddbc4080 # Parent 502103680ea2a14add921b8456687cea83a2cec0 Introduce invitation-only mode for groups. diff -r 502103680ea2 -r 2d33f85c3d9f after5.rb --- a/after5.rb Mon Jun 25 12:36:26 2012 +0900 +++ b/after5.rb Mon Jun 25 14:14:47 2012 +0900 @@ -4,7 +4,7 @@ # 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 $ -# Last modified Mon Jun 25 12:35:46 2012 on firestorm +# Last modified Mon Jun 25 14:07:39 2012 on firestorm # See http://www.gentei.org/~yuuji/software/after5/ # このスクリプトはEUCで保存してください。 $hgid = <<_HGID_.split[1..-2].join(" ") @@ -1088,6 +1088,7 @@ @lang = 0 @mailmode = nil @mailadmdelimiter = "/" + @mailadmsuffix = @mailadmdelimiter + "adm" @saveprefsregexp = /^(display(mode|days)$|nt|headline)/ @opt = { 'conf' => @mybase+".cf", @@ -1294,6 +1295,10 @@ 'Set From: address of all ML messages to ML address, which is convenient to keep responses from cellular phones surely to ML address. Most cellular phones tend to return only from: address.'], + 'inviteonly' => ['管理者のみが加入操作可能', + 'Only administrators can add new members.'], + 'invite-error' => ['%s への加入はグループ管理者のみが操作できます。', +"Only administrator of this group(`%s') can add you."], 'personal' => ['個人で', 'personal'], 'registas' => ['グループ予定として登録?', 'Register as group?'], 'headsched' => ['下の枠内に予定を記入: 1行以内で短めに。 @@ -2721,7 +2726,6 @@ # $DEFAULT is ML name viamail = ENV['LOCAL'] && ENV['DEFAULT'] # called via mail from = toadmin = nil - adminsuffix = @mailadmdelimiter+"adm-" unless @opt['mailprefix'] && @opt['maildomain'] if viamail STDERR.print msg('sendall_err') % [@opt['conf']] @@ -2734,7 +2738,7 @@ if viamail then prohibitviahttp() name = ENV['DEFAULT'] - if Regexp.new("(.*)("+Regexp.quote(adminsuffix)+")") =~ name + if Regexp.new("(.*)("+Regexp.quote(@mailadmsuffix)+")") =~ name # To: GROUP/adm*@domain # -> Forward to group administrator(s) name, toadmin = $1, $2 @@ -2767,7 +2771,7 @@ fromhack = @sc.getgroupattr(name, 'fromhack') mldir = "ml/"+name to = @sc.getgroupattr(name, 'mladdress') || defaultmladdress(name) - returnpath = to.sub("@", adminsuffix+"@") + returnpath = to.sub("@", @mailadmsuffix+"-@") subj = @params['subject'] || "Message from "+@myname sjtag = bracket.gsub("%n", nickname(name)). gsub("%i", name). @@ -3030,6 +3034,10 @@ @H.elementln("table", {'class'=>'border'}){ grmap.sort.collect{|g, ghash| memberp = @sc.ismember(user, g) + # If this group is inviteonly and the user is not a member of it + # nor administrator of it, skip listing. + next if !memberp && !@sc.isadmin(user, g) \ + && @sc.getgroupattr(g, 'inviteonly') @H.elementln("tr"){ @H.element("td", @sc.isadmin(user, g) ? admclass : nil){ g @@ -3093,11 +3101,29 @@ for grp in @sc.groups() # - # as a member, participate or retire + # As a member, participate or retire + key = "groupadd-#{grp}" + memberp = @sc.ismember(user, grp) removep = (/no/i =~ @params[key]) - memberp = @sc.ismember(user, grp) if @params[key] + # + # Check the group is invitation-only mode. + if !removep && !memberp && !@sc.isadmin(user, grp) + @O.print @H.elementln("p") { + sprintf(msg('invite-error'), grp) + "
\n" + \ + @sc.admins(grp).join(", ") + } + sendMail(defaultmladdress(grp).sub("@", @mailadmsuffix+"@"), + "Group paticipation attempt to #{grp}", + putLog("User `%s' tried to join `%s' from %s" % + [user, grp, ENV['REMOTE_ADDR']]), + nil, + @sc.admins(grp)) + next + end + # + # OK to join/retire if (!removep) ^ memberp @sc.addgroup(grp, [user], removep) @O.print @H.elementln("p"){ @@ -3107,7 +3133,7 @@ end end # - # as a member, change group-specific mailto address. + # As a member, change group-specific mailto address. key = "mail4-#{grp}" if memberp && @params[key] && memberp != @params[key] @sc.addgroup(grp, [[user, @params[key]]]) @@ -3119,7 +3145,7 @@ } end # - # as a owner, change the name of group + # as an owner, change the name of group if @sc.isadmin(user, grp) && (newname = @params["groupname-#{grp}"]) && @sc.groupname(grp) != newname @@ -3282,13 +3308,15 @@ }.join } } + \ - @H.checkbox("fromhack", "yes", msg('fromhack'), - @sc.getgroupattr(group, 'fromhack')) + "
\n" + \ - @H.elementln("p") { - sprintf(msg('mladdress'), defaultmladdress(group)) + \ - @H.text("mladdress", @sc.getgroupattr(group, 'mladdress'), - @opt['size'], 80) - } + \ + ["fromhack", "inviteonly"].collect do |param| + @H.checkbox(param, "yes", msg(param), + @sc.getgroupattr(group, param)) + "
\n" + end.join + \ + (group ? @H.elementln("p") { + sprintf(msg('mladdress'), defaultmladdress(group)) + \ + @H.text("mladdress", @sc.getgroupattr(group, 'mladdress'), + @opt['size'], 80) + } : "") + \ @H.elementln('p') { n = -1 curtag = @sc.getgroupattr(group, 'subjtag') @@ -3501,16 +3529,18 @@ end # groups # Change parameter(s) # To be more generic... - fhsetp = (@params['fromhack'] && /^yes/i =~ @params['fromhack']) - cusetp = (@sc.getgroupattr(group, 'fromhack')!=nil) - if cusetp ^ fhsetp - @sc.putgroupattr(group, 'fromhack', @params['fromhack']) - @O.print @H.elementln("p") { - putLog(sprintf("group: %s[fromhack] -> %s", - group, @params['fromhack'].inspect)) - } - somethingdone = true - end + ["fromhack", "inviteonly"].each {|param| + parsetp = (@params[param] && /^yes/i =~ @params[param]) + cursetp = (@sc.getgroupattr(group, param)!=nil) + if cursetp ^ parsetp + @sc.putgroupattr(group, param, @params[param]) + @O.print @H.elementln("p") { + putLog(sprintf("group: %s[%s] -> %s", + group, param, @params[param].inspect)) + } + somethingdone = true + end + } # mladdress newmladdress = @params['mladdress'] newmladdress = nil if newmladdress == ""