Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Listmaster should be able to bypass visibility scenario #1663

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion default/web_tt2/including_lists.tt2
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@
<span class="divider"></span>
[% SET invisible_count = 0; visible_count = 0 ~%]
[% FOREACH l = which ~%]
[% IF l.value.visible ~%]
[% IF l.value.visible || is_listmaster ~%]
<div class="item_content">
<a class="item_title" href="[% l.value.robot == robot ? l.value.url_rel : l.value.url_abs %]">
[%|obfuscate(conf.spam_protection) ~%]
165 changes: 94 additions & 71 deletions default/web_tt2/lists.tt2
Original file line number Diff line number Diff line change
@@ -1,14 +1,36 @@
<!-- lists.tt2 -->

[% BLOCK ListsList # (listname, listinfo) ~%]
<a href="[% 'info' | url_rel([listname]) %]">
[% "${listname}@${domain}" | obfuscate(conf.spam_protection) %]
[% IF listinfo.is_owner || listinfo.is_editor || listinfo.is_subscriber ~%]
<span class="highlighted">(
[%~ IF listinfo.is_owner ~%]
[%|loc%]Owner[%END ~%]
[% IF listinfo.is_subscriber %]
[%|loc%], [%END%]
[%END ~%]
[% ELSIF listinfo.is_editor ~%]
[%|loc%]Moderator[%END ~%]
[% IF listinfo.is_subscriber %]
[%|loc%], [%END%]
[%END ~%]
[% END ~%]
[% IF listinfo.is_subscriber %]
[%|loc%]Subscriber[%END%]
[%END ~%]
)</span>
[% END %]
</a>
<p class="listenum" >[% listinfo.subject %]</p>
[%~ END ~%]

[% IF topic ~%]
<h3>[% topic | optdesc('listtopic') %]</h3>
[%~ ELSIF subtitle ~%]
<h3>[% subtitle %]</h3>
[%~ END %]

[% letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','others' ] %]
[% all_letters = [] %]

[% IF action == 'search_list' %]
[%~ PROCESS search_list_request.tt2 %]
[% IF occurrence ~%]
@@ -18,77 +40,78 @@
<p>[%|loc(email)%]<strong>%1</strong> is subscribed to the following mailing lists[%END%]</p>
[%~ END %]

[% IF which && which.size %]
[% FOREACH letter IN letters %]
[% IF orderedlist.$letter.0 %]
<article id="[% letter %]" >
<h4 class="letter">
[% IF letter == "others" %]
[%|loc%]Others[%END%]
[% ELSE %]
[% letter %]
[% END %]
</h4>
<ul class="listenum">
[% FOREACH listname IN orderedlist.$letter %]
<li class="listenum">
<a href="[% 'info' | url_rel([listname]) %]">
[%|obfuscate(conf.spam_protection) %][% listname %]@[% domain %][% END %]
[% IF which.$listname.is_owner || which.$listname.is_editor || which.$listname.is_subscriber ~%]
<span class="highlighted">(
[%~ IF which.$listname.is_owner ~%]
[%|loc%]Owner[%END ~%]
[% IF which.$listname.is_subscriber %]
[%|loc%], [%END%]
[%END ~%]
[% ELSIF which.$listname.is_editor ~%]
[%|loc%]Moderator[%END ~%]
[% IF which.$listname.is_subscriber %]
[%|loc%], [%END%]
[%END ~%]
[% END ~%]
[% IF which.$listname.is_subscriber %]
[%|loc%]Subscriber[%END%]
[%END ~%]
)</span>
[% END %]
</a>
<p class="listenum" >[% which.$listname.subject %]</p>
</li>
[% END %]
[% SET letters_which = {} ~%]
[% SET others_which = {} ~%]
[% IF which && which.size ~%]
[% FOREACH l IN which ~%]
[% IF l.key.match('^[a-z]') ~%]
[% letters_which.${l.key} = l.value %]
[%~ ELSE ~%]
[% others_which.${l.key} = l.value %]
[%~ END %]
[%~ END %]
[%~ END ~%]

[% UNLESS letters_which.size || others_which.size ~%]
<p>
[%|loc%]No mailing list available.[%END%]
</p>
[%~ END ~%]

[% IF letters_which.size ~%]
[% SET prev_letter = '' ~%]
[% FOREACH l IN letters_which ~%]
[% letter = l.key.substr(0, 1) ~%]

[% IF prev_letter != letter ~%]
[% IF prev_letter != '' ~%]
</ul>
<span class="divider"></span>
</article>
[% all_letters.push(letter) %]
[% END %]
[% END %]
</article>
[%~ END %]

<br />
<article id="[% letter %]" class="letter" >
<h4 class="letter">
[% letter %]
</h4>
<ul class="listenum">

[% IF action == 'which' %]
[% IF ! which %]
&nbsp;&nbsp;<span class="color_dark">[%|loc(user.email)%]No subscriptions with address <strong>%1</strong>![%END%]</span>
<br />
[% END %]
[% END %]
[% ELSE %]
<p>[%|loc%]No mailing list available.[%END%]</p>
[% END %]
[% prev_letter = letter %]
[%~ END %]

<li class="listenum">
[% PROCESS ListsList
listname = l.key
listinfo = l.value
%]
</li>
[%~ END %]

</ul>
<span class="divider"></span>
</article>
[%~ END %]

[% IF others_which.size ~%]
[% letter = 'others' ~%]
<article id="[% letter %]" class="letter" >
<h4 class="letter">
[%|loc%]Others[%END%]
</h4>
<ul class="listenum">

[% FOREACH l IN others_which ~%]
<li class="listenum">
[% PROCESS ListsList
listname = l.key
listinfo = l.value
%]
</li>
[%~ END %]

</ul>
<span class="divider"></span>
</article>
[%~ END %]

[% IF all_letters.size %]
<script>
<!--
$(
'[% 'a[href="#' _ all_letters.join( '"], a[href="#' ) _ '"]' %]'
).on('click', function(e) {
e.stopPropagation();
e.preventDefault();
id = $(this).attr('href').substr(1);
$( '[% '#' _ all_letters.join(', #') %]' ).hide();
$('#' + id).show();
return false;
});
//-->
</script>
[% END %]
<!-- end lists.tt2 -->
12 changes: 11 additions & 1 deletion default/web_tt2/nav.tt2
Original file line number Diff line number Diff line change
@@ -169,6 +169,16 @@
</h2>

[% letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','others' ] ~%]
[% SET orderedlist = {} ~%]
[% IF which && which.size ~%]
[% FOREACH l IN which ~%]
[% IF l.key.match('^[a-z]') ~%]
[% orderedlist.${l.key.substr(0,1)} = [1] %]
[%~ ELSE ~%]
[% orderedlist.others = [1] %]
[%~ END %]
[%~ END %]
[%~ END ~%]

<div class="title-bar" data-responsive-toggle="sympa-nav-bar" data-hide-for="medium">
<span class="menu-text" aria-hidden="true">
@@ -186,7 +196,7 @@
<menu class="top-bar-left">
<ul class="vertical medium-horizontal menu" data-responsive-menu="drilldown medium-dropdown">
[% FOREACH letter IN letters %]
[% IF orderedlist.$letter.0 %]
[% IF orderedlist.$letter %]
<li class="letter">
<a href="#[%letter%]">
[%IF letter == 'others'%]
76 changes: 47 additions & 29 deletions src/cgi/wwsympa.fcgi.in
Original file line number Diff line number Diff line change
@@ -4178,19 +4178,17 @@ sub do_lists {
'remote_addr' => $param->{'remote_addr'},
}
);

my $r_action;
$r_action = $result->{'action'} if (ref($result) eq 'HASH');

next unless ($r_action eq 'do_it');

my $list_info = {};
$list_info->{'subject'} = $list->{'admin'}{'subject'};
$list_info->{'date_epoch'} =
$list->{'admin'}{'creation'}{'date_epoch'};
$list_info->{'topics'} = $list->{'admin'}{'topics'};
#Compat.<6.2.32
$list_info->{'host'} = $list->{'domain'};
my $r_action = $result->{action} if ref $result eq 'HASH';
next
unless ($r_action // '') =~ /\Ado_it\b/i
or $param->{'is_listmaster'};

my $list_info = {
subject => $list->{'admin'}{'subject'},
date_epoch => $list->{'admin'}{'creation'}{'date_epoch'},
topics => $list->{'admin'}{'topics'},
host => $list->{'domain'}, #Compat.<6.2.32
};

if ($param->{'user'}{'email'}) {
if ($which->{owner}->{$listname}) {
@@ -4223,6 +4221,8 @@ sub do_lists {

$param->{'which'} ||= {};
$param->{'which'}{$listname} = $list_info;

#Compat.<=6.2.72
if ($listname =~ /^([a-z])/) {
push @{$param->{'orderedlist'}{$1}}, $listname;
} else {
@@ -4390,9 +4390,13 @@ sub do_active_lists {
sub do_including_lists {
my %which;

my %visible;
my %invisible;
foreach my $role (qw(member owner editor)) {
foreach my $l (@{$list->get_including_lists($role) || []}) {
unless (exists $which{$l->get_id}) {
my $id = $l->get_id;

unless (exists $visible{$id}) {
# Check visibility.
my $result =
Sympa::Scenario->new($l, 'visibility',
@@ -4403,10 +4407,12 @@ sub do_including_lists {
'remote_addr' => $param->{'remote_addr'},
}
);
my $action = $result->{'action'} if ref $result eq 'HASH';
next unless $action;
my $r_action = $result->{action} if ref $result eq 'HASH';
$visible{$id} = ($r_action // '') =~ /\Ado_it\b/i;
}

$which{$l->get_id} = {
if ($visible{$id} or $param->{'is_listmaster'}) {
$which{$id} ||= {
name => $l->{'name'},
domain => $l->{'domain'},
host => $l->{'domain'}, # Compat.<6.2.32
@@ -4415,10 +4421,19 @@ sub do_including_lists {
url_abs => Sympa::get_url($l, 'info'),
url_rel =>
Sympa::get_url($l, 'info', authority => 'omit'),
visible => ($action =~ /\Ado_it\b/i),
visible => $visible{$id}, #Compat.<=6.2.72
};

$which{$id}->{"${$role}_include"} = 1;
} else {
unless (exists $invisible{$id}) {
$invisible{$id} = sprintf 'list#%d',
scalar keys %invisible;
}
$which{$invisible{$id}} ||= {};

$which{$invisible{$id}}->{"${$role}_include"} = 1;
}
$which{$l->get_id}->{$role . '_include'} = 1;
}
}

@@ -10198,9 +10213,10 @@ sub do_search_list {
'remote_addr' => $param->{'remote_addr'}
}
);
my $r_action;
$r_action = $result->{'action'} if (ref($result) eq 'HASH');
next unless ($r_action eq 'do_it');
my $r_action = $result->{action} if ref $result eq 'HASH';
next
unless ($r_action // '') =~ /\Ado_it\b/i
or $param->{'is_listmaster'};

if ($param->{'user'}{'email'}
and ( $list->is_admin('owner', $param->{'user'}{'email'})
@@ -10211,14 +10227,15 @@ sub do_search_list {

$record++;
$param->{'which'}{$list->{'name'}} = {
'subject' => $list->{'admin'}{'subject'},
'admin' => $is_admin,
'export' => 'no',
# Compat. < 6.2.32
'host' => $list->{'domain'},
subject => $list->{'admin'}{'subject'},
admin => $is_admin,
export => 'no',
host => $list->{'domain'}, # Compat. < 6.2.32
};
}
$param->{'occurrence'} = $record;

# Compat.<=6.2.72
foreach my $listname (sort keys %{$param->{'which'}}) {
if ($listname =~ /^([a-z])/) {
push @{$param->{'orderedlist'}{$1}}, $listname;
@@ -13794,9 +13811,10 @@ sub _set_my_lists_info {
'remote_addr' => $param->{'remote_addr'}
}
);
my $r_action = $result->{action} if ref $result eq 'HASH';
next
unless ref $result eq 'HASH'
and $result->{'action'} eq 'do_it';
unless ($r_action // '') =~ /\Ado_it\b/i
or $param->{'is_listmaster'};

$all_lists{$list->{'name'}} = $list;

11 changes: 10 additions & 1 deletion www/js/sympa.js
Original file line number Diff line number Diff line change
@@ -362,6 +362,16 @@ $(function(){
});
});

/* Filter list of lists. */
$(function() {
$('li.letter a').on('click', function(e) {
id = $(this).attr('href').substr(1);
$('article.letter').hide();
$('#' + id).show();
return false;
});
});

/* Align the scrollable calendar. */
$(function() {
$('.calendarLinksCurrentPage').each(function(){
@@ -373,4 +383,3 @@ $(function() {
(container.height() - curmonth.height()) / 2);
});
});