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
Show file tree
Hide file tree
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
Expand Up @@ -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) ~%]
Expand Down
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 ~%]
Expand All @@ -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
Expand Up @@ -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">
Expand All @@ -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'%]
Expand Down
76 changes: 47 additions & 29 deletions src/cgi/wwsympa.fcgi.in
Original file line number Diff line number Diff line change
Expand Up @@ -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}) {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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',
Expand All @@ -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
Expand All @@ -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;
}
}

Expand Down Expand Up @@ -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'})
Expand All @@ -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;
Expand Down Expand Up @@ -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;

Expand Down
11 changes: 10 additions & 1 deletion www/js/sympa.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(){
Expand All @@ -373,4 +383,3 @@ $(function() {
(container.height() - curmonth.height()) / 2);
});
});

Loading