changeset 62:2d33f85c3d9f draft

Introduce invitation-only mode for groups.
author HIROSE Yuuji <yuuji@gentei.org>
date Mon, 25 Jun 2012 14:14:47 +0900
parents 502103680ea2
children e2aa6180c2c6
files after5.rb
diffstat 1 files changed, 55 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- 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 [yuuji<at>gentei.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) + "<br>\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')) + "<br>\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)) + "<br>\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] -&gt; %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] -&gt; %s",
+                       group, param, @params[param].inspect))
+        }
+        somethingdone = true
+      end
+    }
     # mladdress
     newmladdress = @params['mladdress']
     newmladdress = nil if newmladdress == ""

yatex.org