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.'