Skip to content

Commit f7f7d98

Browse files
marianaballabramleyAlainRnetlwcorpmichield
authored
Release 3.6.15 (#1034)
* Translations for 3.6.15 (#1032) * Translated using Weblate (English) Currently translated at 91.4% (1950 of 2132 strings) Translation: phpList/phpList3 Translate-URL: http://translate.phplist.org/projects/phplist/phplist3/en/ * Translated using Weblate (French) Currently translated at 99.8% (2128 of 2132 strings) Translation: phpList/phpList3 Translate-URL: http://translate.phplist.org/projects/phplist/phplist3/fr/ --------- Co-authored-by: Duncan Cameron <[email protected]> Co-authored-by: Alain Rihs <[email protected]> * Support for indicating and getting feedback for e-mail test messages (#1031) * Update sendemaillib.php 1. Appended a test subject indicator to test messages 1. Added a reply-to address to test messages that have no manual reply-to: using the logged in admin's address or at least the general admin's * Update sendemaillib.php Rephrased variable name * Update sendemaillib.php Switched to using $admin_auth * Allowing subscribers to be filtered by confirmed and/or blacklisted (#1030) * Update users.php Allowed to filter by confirmed and/or non blacklisted - and not just by unconfirmed and/or blacklisted * Changed users to subscribers * Bouncemgt - allowing processing only existing bounces + a related new rule action (#1028) * Update bouncemgt.php Added &justexisting=true * Update processbounces.php 1. Added support for &justexisting=true 1. Added support for new bounce rule action * Update lib.php Added support for new bounce action * Update bouncemgt.php Added non default title (otherwise it takes the wrong one) * Update processbounces.php 1. Replaced goto with if-else 1. Hardcoded "-1" instead of supplying it in a sprintf value * Hardcoding defaults for older PHP versions * Removed modern solution * Update Common plugin and Segment plugin (#1024) * Define timestamp columns explicitly (#1019) * Define timestamp fields explicitly to avoid problem with the mysql setting explicit_defaults_for_timestamp * Remove setting of timestamp fields that are automatically updated * update CI to remove old PHP versions and add 8.3 (#1004) * Escape single quote in error message (#1003) * Allow ajax page links to have a title, defaulting to the link description (#1002) Fixes #996 * Update CONTRIBUTING.md (#994) Removed obsolete references * update UUID class to the latest upstream (#990) * update UUID class to the latest upstream * clean up old files * use the list order, even when grouping by category (#1025) * restore ability to create other super users (#1014) * restore ability to create other super users * correctly initialise the privileges array * Bounces' subscriber' status indicator + allowing to confirm right from bounces (#1029) * Update listbounces.php Added support for confirmed/blacklisted indicator * Update bounces.php Added confirmed/blacklisted indicator * Update bounce.php 1. Added confirmed/blacklisted indicator 1. Added support for confirming user from a bounce * Update bounce.php 1. Avoided ternary if because translation system doesn't support it 1. Used the newer s() function * Update listbounces.php Added curly brackets * Used potential translation * Php8fixes 202401 (#1026) * remove deprecated ini_set call * stop possible warning * avoid warning * avoid warning * cast to int * avoid warning on existing being null * force template to be an integer * suppress warnings * check on valid var and cast to int * give buttons an ID, so they can be targetted with testing * avoid warning on empty array index * add notification by email when an admin logs in from a new IP address. (#1027) * add notification by email when an admin logs in from a new IP address. * check IP per admin * force columns to be not null * prevent blocking login on an non-upgraded system and send login alert just to admin, or superuser * keep newlines in translation as they are * make shorter lines, so it renders a bit better * Remove redundant upgrade steps (#1020) * Remove steps that are unnecessary due to the 3.2.0 being the minimum upgrade version * Keep silent when there are no subscriber UUIDs to generate * Remove other unnecessary upgrade steps --------- Co-authored-by: Michiel Dethmers <[email protected]> * Use utf8mb4 for the connection etc (#1001) * Use utf8mb4 for the connection etc * Support utf8mb4 in campaign subject and content --------- Co-authored-by: Michiel Dethmers <[email protected]> * use PHP8.2 to build * use latest phplint * update docker build from bookworm * set version * avoid the admin being kicked out after upgrade (#1033) * mark update translations as @wip --------- Co-authored-by: Duncan Cameron <[email protected]> Co-authored-by: Alain Rihs <[email protected]> Co-authored-by: lwcorp <[email protected]> Co-authored-by: Duncan Cameron <[email protected]> Co-authored-by: Michiel Dethmers <[email protected]>
1 parent 7832a75 commit f7f7d98

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+537
-1189
lines changed

.github/workflows/build-release.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
strategy:
1515
fail-fast: false
1616
matrix:
17-
php-version: ['7.4']
17+
php-version: ['8.2']
1818
experimental: [false]
1919

2020
steps:
@@ -93,7 +93,7 @@ jobs:
9393
sudo php -S 0.0.0.0:80 -t public_html > /dev/null 2>&1 &
9494
9595
- name: Check PHP syntax errors
96-
uses: overtrue/phplint@2.4.1
96+
uses: overtrue/phplint@9.1.2
9797
with:
9898
path: ./public_html
9999
options: --exclude=base/vendor

.github/workflows/main.yml

+2-6
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,10 @@ jobs:
1111
strategy:
1212
fail-fast: false
1313
matrix:
14-
php-version: ['7.4', '8.0', '8.1']
14+
php-version: ['7.4', '8.0', '8.1','8.2']
1515
experimental: [false]
1616
include:
17-
- php-version: 7.2
18-
experimental: true
19-
- php-version: 7.3
20-
experimental: true
21-
- php-version: 8.2
17+
- php-version: 8.3
2218
experimental: true
2319

2420
steps:

CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Please follow the guidelines below when creating an issue so that your issue can
2525

2626
**Avoid duplicated issues**
2727

28-
Before you report an issue, please search through [existing issues on Mantis](https://mantis.phplist.com) and [GitHub](https://github.com/phpList/phplist3/issues) to see if your issue is already reported or fixed to make sure you are not reporting a duplicated issue.
28+
Before you report an issue, please search through [existing issues](https://github.com/phpList/phplist3/issues) to see if your issue is already reported or fixed to make sure you are not reporting a duplicated issue.
2929
Also, make sure you have the latest version of phpList and see if the issue still exists.
3030

3131

Dockerfile.release

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
FROM debian:buster-slim
2+
FROM debian:bookworm-slim
33

44
LABEL maintainer="[email protected]"
55

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# file that keeps track of the latest tag in cvs and the corresponding version
22
# this automates publishing a new version, when it's tagged
33
# if you don't understand this, don't worry. You don't need this file
4-
VERSION=3.6.13
4+
VERSION=3.6.15

composer.lock

+13-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public_html/lists/admin/CsvReader.php

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ class CsvReader
1616
*/
1717
public function __construct($filename, $delimiter)
1818
{
19-
ini_set('auto_detect_line_endings', true);
2019
$this->fh = fopen($filename, 'r');
2120
$this->delimiter = $delimiter;
2221
$this->totalRows = 0;

public_html/lists/admin/actions/import1.php

+6-5
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,13 @@
5353
if (!is_email($email) && $omit_invalid) {
5454
unset($email, $info);
5555
$count_invalid_emails++;
56+
} else {
57+
//# actually looks like the "info" bit will get lost, but
58+
//# in a way, that doesn't matter
59+
$user_list[$email] = array(
60+
'info' => $info,
61+
);
5662
}
57-
//# actually looks like the "info" bit will get lost, but
58-
//# in a way, that doesn't matter
59-
$user_list[$email] = array(
60-
'info' => $info,
61-
);
6263
}
6364

6465
$count_email_add = 0;

public_html/lists/admin/actions/listmembercount.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ function listMemberCounts($listId)
4949
.'<span class="unconfirmedCount text-warning" title="%s">%s</span>, '.' '
5050
.'<span class="blacklistedCount text-danger" title="%s">%s</span>'.')',
5151
s('Confirmed and not blacklisted members'),
52-
number_format($counts['confirmed']),
52+
number_format(!empty($counts['confirmed']) ? $counts['confirmed'] : 0),
5353
s('Unconfirmed and not blacklisted members'),
54-
number_format($counts['notconfirmed']),
54+
number_format(!empty($counts['notconfirmed']) ? $counts['notconfirmed'] : 0),
5555
s('Blacklisted members'),
56-
number_format($counts['blacklisted'])
56+
number_format(!empty($counts['blacklisted']) ? $counts['blacklisted'] : 0)
5757
);
5858

5959
return $membersDisplay;

public_html/lists/admin/admin.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
echo Error(s('No Access'));
1919
return;
2020
}
21+
$accesslevel = 'all';
2122

2223
if (!empty($_POST['change'])) {
2324
if (!verifyToken()) { //# csrf check, should be added in more places
@@ -102,7 +103,7 @@
102103
'statistics' => !empty($_POST['statistics']),
103104
'settings' => !empty($_POST['settings']),
104105
);
105-
Sql_Query(sprintf('update %s set modified=now(), modifiedby = "%s", privileges = "%s" where id = %d',
106+
Sql_Query(sprintf('update %s set modifiedby = "%s", privileges = "%s" where id = %d',
106107
$GLOBALS['tables']['admin'], adminName($_SESSION['logindetails']['id']), sql_escape(serialize($privs)),
107108
$id));
108109

@@ -157,7 +158,7 @@
157158
if (isset($data['privileges'])) {
158159
$privileges = unserialize($data['privileges']);
159160
} else {
160-
$privileges = array();
161+
$privileges = array('subscribers' => 0, 'campaigns' => 0, 'statistics' => 0, 'settings' => 0);
161162
}
162163

163164
reset($struct);

public_html/lists/admin/bounce.php

+23-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
$deletebounce = isset($_GET['deletebounce']); //BUGFIX #15286 - nickyoung
1919
$amount = isset($_GET['amount']) ? sprintf('%d', $_GET['amount']) : ''; //BUGFIX #15286 - CS2
2020
$unconfirm = isset($_GET['unconfirm']); //BUGFIX #15286 - CS2
21+
$confirm = isset($_GET['confirm']);
2122
$maketext = isset($_GET['maketext']); //BUGFIX #15286 - CS2
2223
$deleteuser = isset($_GET['deleteuser']); //BUGFIX #15286 - CS2
2324

@@ -76,10 +77,14 @@
7677
}
7778
}
7879

79-
if (!empty($userid) && $unconfirm) {
80-
Sql_Query(sprintf('update %s set confirmed = 0 where id = %d',
80+
if (!empty($userid) && ($unconfirm || $confirm)) {
81+
Sql_Query(sprintf('update %s set confirmed = ' . ($confirm ? '1' : '0') . ' where id = %d',
8182
$tables['user'], $userid));
82-
$actionresult .= sprintf($GLOBALS['I18N']->get('Made subscriber %s unconfirmed').'<br />', $userid);
83+
if ($confirm) {
84+
$actionresult .= sprintf(s('Made subscriber %s confirmed').'<br />', $userid);
85+
} else {
86+
$actionresult .= sprintf(s('Made subscriber %s unconfirmed').'<br />', $userid);
87+
}
8388
}
8489

8590
if (!empty($userid) && $maketext) {
@@ -164,16 +169,28 @@
164169
$GLOBALS['I18N']->get('Memo for this rule'));
165170
$newruleform .= '<tr><td colspan="2"><p class="submit"><input type="submit" name="add" value="'.$GLOBALS['I18N']->get('Add new Rule').'" /></p></td></tr>';
166171
$newruleform .= '</table></form>';
167-
168172
$actionpanel = '';
169173
$actionpanel .= '<form method="get" action="">';
170174
$actionpanel .= '<input type="hidden" name="page" value="'.$page.'" />';
171175
$actionpanel .= '<input type="hidden" name="id" value="'.$id.'" />';
172176
$actionpanel .= '<input type="hidden" name="type" value="'.$type.'" />';
173177
$actionpanel .= '<table class="bounceActions">';
174-
$actionpanel .= '<tr><td>'.$GLOBALS['I18N']->get('For subscriber with email').'</td><td><input type="text" name="useremail" value="'.$guessedemail.'" size="35" /></td></tr>';
178+
list($msgDetails, $userDetails, $furtherDetails) = array('', '', '');
179+
if (preg_match("#bounced list message ([\d]+)#", $bounce['status'], $regs))
180+
$msgDetails = s('Campaign') . '&nbsp;' . PageLink2('message&id='.$regs[1], shortenTextDisplay(campaignTitle($regs[1]), 30));
181+
if (isset($guessedid)) {
182+
$userDetails = Sql_Fetch_Assoc_Query(sprintf('select confirmed from %s where id = %d', $tables['user'], $guessedid));
183+
if ($userDetails['confirmed'] && !isBlackListed(htmlspecialchars($guessedemail)))
184+
$ls_confirmed = $GLOBALS['img_tick'];
185+
else
186+
$ls_confirmed = $GLOBALS['img_cross'];
187+
$userDetails = s('User') . '&nbsp' . PageLink2('user&id='.$guessedid, $guessedid) . '&nbsp' . $ls_confirmed . '<br />(' . s('Subscribers with a red icon are either unconfirmed or blacklisted or both') . ')';
188+
}
189+
if (!empty($msgDetails) || !empty($userDetails))
190+
$furtherDetails = '<br />' . $msgDetails . (empty($msgDetails) ? '' : '&nbsp') . $userDetails;
191+
$actionpanel .= '<tr><td>'.s('For subscriber with email').$furtherDetails.'</td><td><input type="text" name="useremail" value="'.$guessedemail.'" size="35" /></td></tr>';
175192
$actionpanel .= '<tr><td>'.$GLOBALS['I18N']->get('Increase bouncecount with').'<br />'.$GLOBALS['I18N']->get('(use negative numbers to decrease)').'</td><td><input type="text" name="amount" value="0" size="5" /></td></tr>';
176-
$actionpanel .= '<tr><td>'.$GLOBALS['I18N']->get('Mark subscriber as unconfirmed').'<br />'.$GLOBALS['I18N']->get('(so you can resend the request for confirmation)').' </td><td><input type="checkbox" name="unconfirm" value="1" /></td></tr>';
193+
$actionpanel .= '<tr><td>'.s('Mark subscriber as unconfirmed').'<br />'.s('(so you can resend the request for confirmation)').'<br />'.s('or confirmed').'<br />'.s('(so you can revert possible auto unconfirmation)'). ' </td><td>'.s('unconfirmed').'<input onclick="if (this.checked && form.confirm.checked) form.confirm.checked=false" type="checkbox" name="unconfirm" value="1" />'.s('confirmed').'<input onclick="if (this.checked && form.unconfirm.checked) form.unconfirm.checked=false" type="checkbox" name="confirm" value="1" /></td></tr>';
177194
$actionpanel .= '<tr><td>'.$GLOBALS['I18N']->get('Set subscriber to receive text instead of HTML').' </td><td><input type="checkbox" name="maketext" value="1" /></td></tr>';
178195
$actionpanel .= '<tr><td>'.$GLOBALS['I18N']->get('Delete subscriber').' </td><td><input type="checkbox" name="deleteuser" value="1" /></td></tr>';
179196
if (ALLOW_DELETEBOUNCE) {

public_html/lists/admin/bouncemgt.php

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
echo $spb.PageLink2('checkbouncerules', s('Check Current Bounce Rules')).$spe;
1515

1616
echo $spb.PageLink2('processbounces', s('Process Bounces')).$spe;
17+
echo $spb.PageLink2('processbounces&justexisting=true', s('Reprocess Only Existing Bounces'), '', false, s('Reprocess Only Existing Bounces')).$spe;
1718

1819
echo '</ul><br />';
1920

@@ -24,3 +25,4 @@
2425
echo '<p class="information text-warning"><big>'.s('You have already defined bounce rules in your system. Be careful with generating new ones, because these may interfere with the ones that exist.').'</big></p>';
2526
}
2627
echo '<br /><p class="button">'.PageLink2('generatebouncerules', s('Generate Bounce Rules')).'</p>';
28+

public_html/lists/admin/bounces.php

+9-2
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@
162162
break;
163163

164164
}
165-
}
165+
} elseif ($status == 'processed')
166+
echo s('Subscribers with a red icon are either unconfirmed or blacklisted or both');
166167

167168
$ls = new WebblerListing(s($status).' '.s('bounces'));
168169
$ls->setElementHeading('Bounce ID');
@@ -195,7 +196,13 @@
195196
preg_match("#([\d]+) bouncecount increased#", $bounce['comment'], $regs)
196197
OR preg_match("#([\d]+) marked unconfirmed#", $bounce['comment'], $regs)
197198
) {
198-
$userIdLink = PageLink2('user&id='.$regs[1], getUserEmail($regs[1]));
199+
$userIdLink = PageLink2('user&id='.$regs[1], ($regs[1]));
200+
$userDetails = Sql_Fetch_Assoc_Query(sprintf('select email, confirmed from %s where id = %d', $tables['user'], $regs[1]));
201+
if ($userDetails['confirmed'] && !isBlackListed(htmlspecialchars($userDetails['email'])))
202+
$ls_confirmed = $GLOBALS['img_tick'];
203+
else
204+
$ls_confirmed = $GLOBALS['img_cross'];
205+
$userIdLink .= '&nbsp;' . $ls_confirmed;
199206
} elseif ($bounce['comment'] == 'not processed') {
200207
$userIdLink = $GLOBALS['I18N']->get('Unknown');
201208
} else {

public_html/lists/admin/connect.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -1262,10 +1262,10 @@ function PageLinkDialogOnly($name, $desc = '', $url = '', $extraclass = '')
12621262
return $link;
12631263
}
12641264

1265-
function PageLinkAjax($name, $desc = '', $url = '', $extraclass = '')
1265+
function PageLinkAjax($name, $desc = '', $url = '', $extraclass = '', $title = '')
12661266
{
12671267
//# as PageLink2, but add the option to ajax it in a popover window
1268-
$link = PageLink2($name, $desc, $url);
1268+
$link = PageLink2($name, $desc, $url, false, $title ?: $desc);
12691269
if ($link) {
12701270
$link = str_replace('<a ', '<a class="ajaxable '.$extraclass.'" ', $link);
12711271
$link .= '';

public_html/lists/admin/defaultconfig.php

+7-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,13 @@
125125
'type' => 'text',
126126
'category' => 'security',
127127
),
128-
128+
'notify_admin_login' => array(
129+
'value' => 1,
130+
'description' => s('Notify admin on login from new location'),
131+
'type' => 'boolean',
132+
'category' => 'security',
133+
'allowempty' => true,
134+
),
129135
// admin addresses are other people who receive copies of subscriptions
130136
'admin_addresses' => array(
131137
'value' => '',

public_html/lists/admin/import1.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@
134134
if (count($email_list) > 300 && !$test_import) {
135135
// this is a possibly a time consuming process, so lets show a progress bar
136136
flush();
137-
// increase the memory to make sure we are not running out
138-
ini_set('memory_limit', '16M');
137+
// try to increase the memory to make sure we are not running out
138+
@ini_set('memory_limit', '16M');
139139
}
140140

141141
// View test output of emails

public_html/lists/admin/import2.php

+13-8
Original file line numberDiff line numberDiff line change
@@ -309,16 +309,21 @@
309309
//@@ Why is $attributes not used
310310
$query = sprintf('select id from %s where name = "%s"', $tables['attribute'], sql_escape($column));
311311
$existing = Sql_Fetch_Row_Query($query);
312-
$_SESSION['import_attribute'][$column] = array(
313-
'index' => $i,
314-
'record' => $existing[0],
315-
'column' => $column,
316-
);
317-
array_push($used_attributes, $existing[0]);
318-
if ($existing[0]) {
312+
if (!empty($existing[0])) {
319313
// $dbg .= " =known attribute id=" . $existing[0];
320-
} else {
314+
$_SESSION['import_attribute'][$column] = array(
315+
'index' => $i,
316+
'record' => $existing[0],
317+
'column' => $column,
318+
);
319+
array_push($used_attributes, $existing[0]);
320+
} else {
321321
// $dbg .= " =request mapping";
322+
$_SESSION['import_attribute'][$column] = array(
323+
'index' => $i,
324+
'record' => "",
325+
'column' => $column,
326+
);
322327
}
323328
}
324329
}

0 commit comments

Comments
 (0)