This is an automated email from the ASF dual-hosted git repository.

sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/whimsy.git


The following commit(s) were added to refs/heads/master by this push:
     new b0b396e0 Allow (P)PMC members to see (*) markers
b0b396e0 is described below

commit b0b396e0f1d49fd895d7838c5eb3c0e973320fb0
Author: Sebb <[email protected]>
AuthorDate: Tue Apr 25 15:19:26 2023 +0100

    Allow (P)PMC members to see (*) markers
---
 www/roster/models/committee.rb      | 68 ++++++++++++++++++++++++++----------
 www/roster/models/ppmc.rb           | 69 ++++++++++++++++++++++++++-----------
 www/roster/views/pmc/members.js.rb  |  2 +-
 www/roster/views/ppmc/members.js.rb |  2 +-
 4 files changed, 99 insertions(+), 42 deletions(-)

diff --git a/www/roster/models/committee.rb b/www/roster/models/committee.rb
index 8534c4ec..62180c60 100644
--- a/www/roster/models/committee.rb
+++ b/www/roster/models/committee.rb
@@ -1,3 +1,5 @@
+require 'whimsy/asf/mlist'
+
 class Committee
   def self.serialize(id, env)
 
@@ -16,30 +18,46 @@ class Committee
 
     image = ASF::SiteImage.find(id)
 
-    moderators = nil
-    modtime = nil
+    # always needed: if not a member, for checking moderator status
+    # and if a member, needed for showing list moderators
+    # will be dropped later if insufficient karma
+    moderators, modtime = ASF::MLIST.list_moderators(pmc.mail_list, true)
     subscribers = nil # we get the counts only here
     subtime = nil
     pSubs = [] # private@ subscribers
     unMatchedSubs = [] # unknown private@ subscribers
     unMatchedSecSubs = [] # unknown security@ subscribers
     currentUser = ASF::Person.find(env.user)
-    analysePrivateSubs = false # whether to show missing private@ subscriptions
-    if pmc.roster.include? env.user or currentUser.asf_member?
-      require 'whimsy/asf/mlist'
-      moderators, modtime = ASF::MLIST.list_moderators(pmc.mail_list)
+
+    # Users have extra karma if they are either of the following:
+    # ASF member or private@ list moderator (analysePrivateSubs)
+    # PMC member (isPMCMember)
+    # These attributes grant access as follows:
+    # both: can see (*) markers (PPMC members not subscribed to the private@ 
list)
+    # both: can see moderator addresses for mailing lists
+    # analysePrivateSubs: can see crosscheck of private@ list subscriptions
+
+
+    analysePrivateSubs = currentUser.asf_member?
+    unless analysePrivateSubs # not an ASF member - are we a moderator?
+      # TODO match using canonical emails
+      user_mail = currentUser.all_mail || []
+      pMods = moderators["private@#{pmc.mail_list}.apache.org"] || []
+      analysePrivateSubs = !(pMods & user_mail).empty?
+    end
+
+    isPMCMember = false # default to not needed
+    unless analysePrivateSubs
+      isPMCMember = pmc.roster.include? env.user
+    end
+
+    # Now get the data we are allowed to see
+    if analysePrivateSubs or isPMCMember
       subscribers, subtime = ASF::MLIST.list_subs(pmc.mail_list) # counts 
only, no archivers
-      analysePrivateSubs = currentUser.asf_member?
-      unless analysePrivateSubs # check for private moderator if not already 
allowed access
-        # TODO match using canonical emails
-        user_mail = currentUser.all_mail || []
-        pMods = moderators["private@#{pmc.mail_list}.apache.org"] || []
-        analysePrivateSubs = !(pMods & user_mail).empty?
-      end
+      pSubs = ASF::MLIST.private_subscribers(pmc.mail_list)[0]||[]
+      unMatchedSubs=Set.new(pSubs) if analysePrivateSubs # init ready to 
remove matched mails
+      pSubs.map!(&:downcase) # for matching
       if analysePrivateSubs
-        pSubs = ASF::MLIST.private_subscribers(pmc.mail_list)[0]||[]
-        unMatchedSubs=Set.new(pSubs) # init ready to remove matched mails
-        pSubs.map!(&:downcase) # for matching
         sSubs = ASF::MLIST.security_subscribers(pmc.mail_list)[0]||[]
         unMatchedSecSubs=Set.new(sSubs) # init ready to remove matched mails
       end
@@ -55,12 +73,14 @@ class Committee
       next if pmc.ownerids.include?(key) # skip the rest (expensive) if person 
is in the owner group
       person = ASF::Person[key]
       next unless person  # in case of missing entry (e.g. renamed uid)
-      if analysePrivateSubs
+      if analysePrivateSubs or isPMCMember
         # Analyse the subscriptions, matching against canonicalised personal 
emails
         allMail = person.all_mail.map{|m| ASF::Mail.to_canonical(m.downcase)}
         # pSubs is already downcased
         # TODO should it be canonicalised as well above?
         roster[key]['notSubbed'] = true if (allMail & pSubs.map{|m| 
ASF::Mail.to_canonical(m)}).empty?
+      end
+      if analysePrivateSubs 
         unMatchedSubs.delete_if {|k| allMail.include? 
ASF::Mail.to_canonical(k.downcase)}
         unMatchedSecSubs.delete_if {|k| allMail.include? 
ASF::Mail.to_canonical(k.downcase)}
       end
@@ -72,12 +92,14 @@ class Committee
         name: person.public_name,
         role: 'PMC member' # TODO not strictly true, as CI is the canonical 
source
       }
-      if analysePrivateSubs
+      if analysePrivateSubs or isPMCMember
         # Analyse the subscriptions, matching against canonicalised personal 
emails
         allMail = person.all_mail.map{|m| ASF::Mail.to_canonical(m.downcase)}
         # pSubs is already downcased
         # TODO should it be canonicalised as well above?
         roster[person.id]['notSubbed'] = true if (allMail & pSubs.map{|m| 
ASF::Mail.to_canonical(m)}).empty?
+      end
+      if analysePrivateSubs
         unMatchedSubs.delete_if {|k| allMail.include? 
ASF::Mail.to_canonical(k.downcase)}
         unMatchedSecSubs.delete_if {|k| allMail.include? 
ASF::Mail.to_canonical(k.downcase)}
       end
@@ -154,7 +176,12 @@ class Committee
       pmcchairs = ASF::Service.find('pmc-chairs')
       pmc_chair = pmcchairs.members.include? pmc.chair
     end
-    return {
+    # drop detailed information if it was only obtained for PMC members
+    unless analysePrivateSubs
+      moderators = modtime = subscribers = subtime = nil
+      nonASFmails = {}
+    end
+    ret = {
       id: id,
       chair: pmc.chair&.id,
       pmc_chair: pmc_chair,
@@ -181,6 +208,9 @@ class Committee
       asfMembers: asfMembers,
       unknownSecSubs: unknownSecSubs,
     }
+    # Don't add unnecessary settings
+    ret[:isPMCMember] = isPMCMember if isPMCMember
+    return ret
 
   end
 
diff --git a/www/roster/models/ppmc.rb b/www/roster/models/ppmc.rb
index 7b4ce67a..4fb8b0e5 100644
--- a/www/roster/models/ppmc.rb
+++ b/www/roster/models/ppmc.rb
@@ -15,32 +15,47 @@ class PPMC
     # Also look for non-ASF mod emails
     nonASFmails = {}
 
-    moderators = nil
-    modtime = nil
+    # always needed: if not a member, for checking moderator status
+    # and if a member, needed for showing list moderators
+    # will be dropped later if insufficient karma
+    moderators, modtime = ASF::MLIST.list_moderators(ppmc.mail_list, true)
     subscribers = nil # we get the counts only here
     subtime = nil
     pSubs = [] # private@ subscribers
     unMatchedSubs = [] # unknown private@ subscribers
     currentUser = ASF::Person.find(env.user)
-    analysePrivateSubs = false # whether to show missing private@ subscriptions
-    if currentUser.asf_member? or owners.include? currentUser
-      require 'whimsy/asf/mlist'
-      moderators, modtime = ASF::MLIST.list_moderators(ppmc.mail_list, true)
+
+    # Users have extra karma if they are either of the following:
+    # ASF member or private@ list moderator (analysePrivateSubs)
+    # PPMC member (in owner LDAP group) (isOwner)
+    # These attributes grant access as follows:
+    # both: can see (*) markers (PPMC members not subscribed to the private@ 
list)
+    # both: can see moderator addresses for mailing lists
+    # analysePrivateSubs: can see crosscheck of private@ list subscriptions
+
+    analysePrivateSubs = currentUser.asf_member? # whether to show missing 
private@ subscriptions
+    unless analysePrivateSubs # not an ASF member - are we a moderator?
+      # TODO match using canonical emails
+      user_mail = currentUser.all_mail || []
+      pMods = moderators["private@#{ppmc.mail_list}.apache.org"] || []
+      analysePrivateSubs = !(pMods & user_mail).empty?
+    end
+
+    isOwner = false # default to not needed
+    unless analysePrivateSubs
+      isOwner = owners.include? currentUser
+    end
+
+
+    # Now get the data we are allowed to see
+    if analysePrivateSubs or isOwner
+      pSubs = ASF::MLIST.private_subscribers(ppmc.mail_list)[0]||[]
       subscribers, subtime = ASF::MLIST.list_subs(ppmc.mail_list, true) # 
counts only, no archivers
-      analysePrivateSubs = currentUser.asf_member?
-      unless analysePrivateSubs # check for private moderator if not already 
allowed access
-        # TODO match using canonical emails
-        user_mail = currentUser.all_mail || []
-        pMods = moderators["private@#{ppmc.mail_list}.apache.org"] || []
-        analysePrivateSubs = !(pMods & user_mail).empty?
-      end
       if analysePrivateSubs
-        pSubs = ASF::MLIST.private_subscribers(ppmc.mail_list)[0]||[]
-        unMatchedSubs=Set.new(pSubs) # init ready to remove matched mails
-        pSubs.map!(&:downcase) # for matching
+        unMatchedSubs=Set.new(pSubs) if analysePrivateSubs # init ready to 
remove matched mails
+        moderators.each { |_, mods| mods.each {|m| nonASFmails[m]='' unless 
m.end_with? '@apache.org'} }
       end
-
-      moderators.each { |_, mods| mods.each {|m| nonASFmails[m]='' unless 
m.end_with? '@apache.org'} }
+      pSubs.map!(&:downcase) # for matching
       lists = ASF::MLIST.domain_lists(ppmc.mail_list, true)
     else
       lists = ASF::MLIST.domain_lists(ppmc.mail_list, false)
@@ -71,9 +86,11 @@ class PPMC
         role: 'PPMC Member',
         githubUsername: (person.attrs['githubUsername'] || []).join(', ')
       }
-      if analysePrivateSubs
+      if analysePrivateSubs or isOwner
         allMail = person.all_mail.map{|m| ASF::Mail.to_canonical(m.downcase)}
         roster[person.id]['notSubbed'] = true if (allMail & pSubs.map{|m| 
ASF::Mail.to_canonical(m)}).empty?
+      end
+      if analysePrivateSubs
         unMatchedSubs.delete_if {|k| allMail.include? 
ASF::Mail.to_canonical(k.downcase)}
       end
     end
@@ -89,9 +106,11 @@ class PPMC
         role: 'Mentor',
         githubUsername: (person.attrs['githubUsername'] || []).join(', ')
       }
-      if analysePrivateSubs
+      if analysePrivateSubs or isOwner
         allMail = person.all_mail.map{|m| ASF::Mail.to_canonical(m.downcase)}
         roster[person.id]['notSubbed'] = true if (allMail & pSubs.map{|m| 
ASF::Mail.to_canonical(m)}).empty?
+      end
+      if analysePrivateSubs or isOwner
         unMatchedSubs.delete_if {|k| allMail.include? 
ASF::Mail.to_canonical(k.downcase)}
       end
     end
@@ -126,7 +145,12 @@ class PPMC
       }
     end
 
-    return {
+    # drop moderators if there is no karma
+    unless isOwner or analysePrivateSubs
+      moderators = modtime = nil
+    end
+
+    ret = {
       id: id,
       display_name: ppmc.display_name,
       description: ppmc.description,
@@ -154,6 +178,9 @@ class PPMC
       unknownSubs: unknownSubs,
       asfMembers: asfMembers,
     }
+    # Don't add unnecessary settings
+    ret[:isOwner] = isOwner if isOwner
+    return ret
 
   end
 
diff --git a/www/roster/views/pmc/members.js.rb 
b/www/roster/views/pmc/members.js.rb
index f904d802..1c0a1aa9 100644
--- a/www/roster/views/pmc/members.js.rb
+++ b/www/roster/views/pmc/members.js.rb
@@ -29,7 +29,7 @@ class PMCMembers < Vue
         end
       end
     end
-    if @@committee.analysePrivateSubs
+    if @@committee.analysePrivateSubs or @@committee.isPMCMember
       _h4.crosscheck! 'Cross-check of private@ list subscriptions'
       _p {
         _ 'PMC entries above with (*) do not appear to be subscribed to the 
private list.'
diff --git a/www/roster/views/ppmc/members.js.rb 
b/www/roster/views/ppmc/members.js.rb
index 5927465e..7953f37c 100644
--- a/www/roster/views/ppmc/members.js.rb
+++ b/www/roster/views/ppmc/members.js.rb
@@ -25,7 +25,7 @@ class PPMCMembers < Vue
       end
     end
 
-    if @@ppmc.analysePrivateSubs
+    if @@ppmc.analysePrivateSubs or @@ppmc.isOwner
       _h4.crosscheck! 'Cross-check of private@ list subscriptions'
       _p {
         _ 'PPMC entries above with (*) do not appear to be subscribed to the 
private list.'

Reply via email to