From 553fd0a9e8d246c3134cd637bb29b148c711dca6 Mon Sep 17 00:00:00 2001 From: azett Date: Thu, 11 Aug 2022 19:55:45 +0200 Subject: [PATCH 01/27] fixes #137 - thanks for reporting, @Fraenkiman :) --- .../themes/leggero/leggero-v2/style.conf.php | 39 +++++++++---------- .../themes/leggero/leggero/style.conf.php | 2 +- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/fp-interface/themes/leggero/leggero-v2/style.conf.php b/fp-interface/themes/leggero/leggero-v2/style.conf.php index 2d5140f8..6a9ad177 100644 --- a/fp-interface/themes/leggero/leggero-v2/style.conf.php +++ b/fp-interface/themes/leggero/leggero-v2/style.conf.php @@ -1,22 +1,21 @@ diff --git a/fp-interface/themes/leggero/leggero/style.conf.php b/fp-interface/themes/leggero/leggero/style.conf.php index a9329bc2..b26486b5 100644 --- a/fp-interface/themes/leggero/leggero/style.conf.php +++ b/fp-interface/themes/leggero/leggero/style.conf.php @@ -2,7 +2,7 @@ /* * Style Name: Leggero * Style URI: http://www.flatpress.org/ - * Description: The default FlatPress theme which brings a breath of fresh mint air. Responsive and a great start for own themes! + * Description: A responsive and more flat version of the default FlatPress theme. * Version: 1.2 * Author: NoWhereMan and Drudo, optimised by Laborix * Author URI: https://www.flatpress.org/ From cc28351945e20516718684c8a651dbc8e7ce36b3 Mon Sep 17 00:00:00 2001 From: azett Date: Thu, 11 Aug 2022 20:05:18 +0200 Subject: [PATCH 02/27] fixes #134, props to @Fraenkiman --- .../themes/leggero/leggero-v2/res/common.css | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/fp-interface/themes/leggero/leggero-v2/res/common.css b/fp-interface/themes/leggero/leggero-v2/res/common.css index 2f1b82c7..619c503c 100644 --- a/fp-interface/themes/leggero/leggero-v2/res/common.css +++ b/fp-interface/themes/leggero/leggero-v2/res/common.css @@ -220,54 +220,6 @@ h4 { font-size: 1.2em; } } } -/* ===== INTERNET EXPLORER ===== */ -@media \0screen\,screen\9{ - - body { margin: 10px 0 10px 0 } - - /* ===== BODY CONTAINER ===== */ - #body-container { - text-align: left; - max-width: 1000px; - width: 100%; - margin: 0 auto 0 auto; - padding: 5px; - background:none; - background-color:rgba(0,0,0,0.75); - -ms-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#BF000000,endColorstr=#BF000000); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#BF000000,endColorstr=#BF000000); - zoom:1; - border-radius: 3px; - } - - /* ===== MAIN ===== */ - #main h4 { margin: 2em 0 0 0} - - #main { - float:left; - position: relative; - width: 65%; - font-size: 100%; - padding: 25px; - margin: 20px; - background:none; - background-color:rgba(255,255,255,0.9); - -ms-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#E6FFFFFF,endColorstr=#E6FFFFFF); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#E6FFFFFF,endColorstr=#E6FFFFFF); - zoom:1; - border-radius: 3px; - } - - #head { - background:none; - background-color:rgba(184,60,46,0.7); - -ms-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#B3b83c2e,endColorstr=#B3b83c2e); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#B3b83c2e,endColorstr=#B3b83c2e); - zoom:1; - } - -} - #main p { line-height: 1.4em; margin-top: 1em; } #main img { margin: .5em } From 06a555b0d6eb754f5debca635bbf927738a9bae7 Mon Sep 17 00:00:00 2001 From: azett Date: Thu, 11 Aug 2022 20:08:21 +0200 Subject: [PATCH 03/27] fixes #133, props to @Fraenkiman --- fp-interface/themes/leggero/leggero-v2/res/common.css | 1 - 1 file changed, 1 deletion(-) diff --git a/fp-interface/themes/leggero/leggero-v2/res/common.css b/fp-interface/themes/leggero/leggero-v2/res/common.css index 619c503c..155f72f3 100644 --- a/fp-interface/themes/leggero/leggero-v2/res/common.css +++ b/fp-interface/themes/leggero/leggero-v2/res/common.css @@ -210,7 +210,6 @@ h4 { font-size: 1.2em; } #main h4 { margin: 2em 0 0 0} #main { - float: center; width: 90%; font-size: 100%; padding: 15px; From 3c3d614416e7be8805f684dab3c8f0fe28e30d53 Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 13 Aug 2022 20:38:03 +0200 Subject: [PATCH 04/27] fixes #135 - thx @Fraenkiman --- fp-interface/sharedtpls/comment-form.tpl | 2 +- fp-interface/sharedtpls/comments.tpl | 2 +- fp-interface/themes/leggero/leggero-v2/res/common.css | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fp-interface/sharedtpls/comment-form.tpl b/fp-interface/sharedtpls/comment-form.tpl index 25851487..9f22f4f0 100644 --- a/fp-interface/sharedtpls/comment-form.tpl +++ b/fp-interface/sharedtpls/comment-form.tpl @@ -1,5 +1,5 @@ {if !$entry_commslock} -

{$lang.comments.head}

+

{$lang.comments.head}

{$lang.comments.descr}

diff --git a/fp-interface/sharedtpls/comments.tpl b/fp-interface/sharedtpls/comments.tpl index c6c11fd2..e0895b5e 100755 --- a/fp-interface/sharedtpls/comments.tpl +++ b/fp-interface/sharedtpls/comments.tpl @@ -1,5 +1,5 @@ {if !$entry_commslock} -

{$lang.comments.head}

+

{$lang.comments.head}

{$lang.comments.descr}

diff --git a/fp-interface/themes/leggero/leggero-v2/res/common.css b/fp-interface/themes/leggero/leggero-v2/res/common.css index 155f72f3..3ba0be61 100644 --- a/fp-interface/themes/leggero/leggero-v2/res/common.css +++ b/fp-interface/themes/leggero/leggero-v2/res/common.css @@ -234,6 +234,8 @@ h4 { font-size: 1.2em; } padding: 0 1.6em 0 1.6em } +h4#addcomment {clear:both;} + #commentform fieldset p { margin: 0 0 .5em 0 } #comments li { From 5a637d7e7b9a6bdfd747a6fd3e0d9f716032966c Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 13 Aug 2022 20:43:20 +0200 Subject: [PATCH 05/27] Changelog updated --- CHANGELOG.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ee02481..26bb7eba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,15 @@ - Media Manager plugin shows 50 items per page, not 10 ## Themes -- Leggero theme: Fixed searchbox glitch in FlatMaas revisited style (see [#97](https://github.com/flatpressblog/flatpress/issues/97)) -- Leggero theme: Fixed missing bullets in preview (see [#98](https://github.com/flatpressblog/flatpress/issues/98)) -- Leggero theme: CSS of the Leggero style had some glitches on mobile devices -- Leggero theme: Invalid HTML output fixed (see [#106](https://github.com/flatpressblog/flatpress/issues/106)) -- Leggero theme: Removed unneccessary external font resource (see [#112](https://github.com/flatpressblog/flatpress/issues/112)) +- Leggero + - Fixed searchbox glitch in FlatMaas revisited style (see [#97](https://github.com/flatpressblog/flatpress/issues/97)) + - Fixed missing bullets in preview (see [#98](https://github.com/flatpressblog/flatpress/issues/98)) + - CSS of the Leggero style had some glitches on mobile devices + - Invalid HTML output fixed (see [#106](https://github.com/flatpressblog/flatpress/issues/106)) + - Removed unneccessary external font resource (see [#112](https://github.com/flatpressblog/flatpress/issues/112)) + - "Add comment" link has its own line (see [#135](https://github.com/flatpressblog/flatpress/issues/135)) + - Removed legacy/invalid CSS (see [#133](https://github.com/flatpressblog/flatpress/issues/133), [#134](https://github.com/flatpressblog/flatpress/issues/134)) + - Fixed description of Leggero and Leggero v2 styles (see [#137](https://github.com/flatpressblog/flatpress/issues/137) ## Bugfixes - Comment Center config page threw errors (see [#90](https://github.com/flatpressblog/flatpress/issues/90)) From a5bea6507bb1cdd3b43c1e69ff92d50d9d3a0f0b Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 13 Aug 2022 20:43:51 +0200 Subject: [PATCH 06/27] Changelog updated --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26bb7eba..07f42710 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ - Removed unneccessary external font resource (see [#112](https://github.com/flatpressblog/flatpress/issues/112)) - "Add comment" link has its own line (see [#135](https://github.com/flatpressblog/flatpress/issues/135)) - Removed legacy/invalid CSS (see [#133](https://github.com/flatpressblog/flatpress/issues/133), [#134](https://github.com/flatpressblog/flatpress/issues/134)) - - Fixed description of Leggero and Leggero v2 styles (see [#137](https://github.com/flatpressblog/flatpress/issues/137) + - Fixed description of Leggero and Leggero v2 styles (see [#137](https://github.com/flatpressblog/flatpress/issues/137)) ## Bugfixes - Comment Center config page threw errors (see [#90](https://github.com/flatpressblog/flatpress/issues/90)) From d5bdc72852b62cc9d97c558a611118ff4de0e329 Mon Sep 17 00:00:00 2001 From: azett Date: Sun, 14 Aug 2022 14:04:30 +0200 Subject: [PATCH 07/27] fixes #136 for all styles - thx @Fraenkiman --- admin/res/admin.css | 2 +- fp-interface/themes/leggero/flatmaas-rev/res/common.css | 5 +++++ fp-interface/themes/leggero/leggero-v2/res/common.css | 3 +++ fp-interface/themes/leggero/leggero-v2/res/globals.css | 3 ++- fp-interface/themes/leggero/leggero/res/common.css | 4 ++++ fp-interface/themes/leggero/leggero/res/globals.css | 3 ++- 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/admin/res/admin.css b/admin/res/admin.css index de582167..03cc1bb6 100755 --- a/admin/res/admin.css +++ b/admin/res/admin.css @@ -167,7 +167,7 @@ input.maxsize { width: 99% } #main ul.msgs, ul.msgs { margin-top: 1em; margin-left: 0em; - padding: 1em 2em + padding: 1em 2em; } .errors { diff --git a/fp-interface/themes/leggero/flatmaas-rev/res/common.css b/fp-interface/themes/leggero/flatmaas-rev/res/common.css index 4f7b0e38..ddf1c912 100755 --- a/fp-interface/themes/leggero/flatmaas-rev/res/common.css +++ b/fp-interface/themes/leggero/flatmaas-rev/res/common.css @@ -435,4 +435,9 @@ div#widget-searchbox li { margin:0px; padding:0px; } +form#search ul { + list-style-type: none; +} +form#search ul li:before { + content: none } \ No newline at end of file diff --git a/fp-interface/themes/leggero/leggero-v2/res/common.css b/fp-interface/themes/leggero/leggero-v2/res/common.css index 3ba0be61..a30462be 100644 --- a/fp-interface/themes/leggero/leggero-v2/res/common.css +++ b/fp-interface/themes/leggero/leggero-v2/res/common.css @@ -303,6 +303,9 @@ h4#addcomment {clear:both;} margin-bottom: 3em } + form#search ul { + list-style-type: none; + } /* ===== FOOTER ===== */ #footer { diff --git a/fp-interface/themes/leggero/leggero-v2/res/globals.css b/fp-interface/themes/leggero/leggero-v2/res/globals.css index 662bfd9e..6bc6d214 100755 --- a/fp-interface/themes/leggero/leggero-v2/res/globals.css +++ b/fp-interface/themes/leggero/leggero-v2/res/globals.css @@ -16,7 +16,8 @@ Module: globals.css /* ===== NOTIFICATION ===== */ #main ul.msgs, ul.msgs { margin: 0; - padding: 1em 2em + padding: 1em 2em; + list-style-type: none; } .errors { diff --git a/fp-interface/themes/leggero/leggero/res/common.css b/fp-interface/themes/leggero/leggero/res/common.css index 81f641a5..dc9067cd 100644 --- a/fp-interface/themes/leggero/leggero/res/common.css +++ b/fp-interface/themes/leggero/leggero/res/common.css @@ -327,6 +327,10 @@ h4 { font-size: 1.2em; } margin-bottom: 5em } + form#search ul { + list-style-type: none; + } + /* ===== FOOTER ===== */ #footer { diff --git a/fp-interface/themes/leggero/leggero/res/globals.css b/fp-interface/themes/leggero/leggero/res/globals.css index 0c337f3c..ff8f1009 100755 --- a/fp-interface/themes/leggero/leggero/res/globals.css +++ b/fp-interface/themes/leggero/leggero/res/globals.css @@ -20,7 +20,8 @@ Module: globals.css /* ===== NOTIFICATION ===== */ #main ul.msgs, ul.msgs { margin: 0; - padding: 1em 2em + padding: 1em 2em; + list-style-type: none; } .errors { From e510b47e61bf78cdc4c421c68142fa4fa8013d30 Mon Sep 17 00:00:00 2001 From: azett Date: Sun, 14 Aug 2022 14:25:02 +0200 Subject: [PATCH 08/27] Search form: Years in reverse order --- fp-interface/sharedtpls/search.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fp-interface/sharedtpls/search.tpl b/fp-interface/sharedtpls/search.tpl index b26f6edd..04e43e65 100755 --- a/fp-interface/sharedtpls/search.tpl +++ b/fp-interface/sharedtpls/search.tpl @@ -9,7 +9,7 @@
{$lang.search.fset2} -

{html_select_date start_year=2000 end_year=$smarty.now|date_format:"%Y" field_separator=" - " field_order="DMY" time="0000-00-00" all_empty="--"}

+

{html_select_date reverse_years="true" start_year=2000 end_year=$smarty.now|date_format:"%Y" field_separator=" - " field_order="DMY" time="0000-00-00" all_empty="--"}

{$lang.search.datedescr}

From cf8b518aa3e9d8e1460306b595b05dc973e0b1e6 Mon Sep 17 00:00:00 2001 From: azett Date: Sun, 14 Aug 2022 14:44:29 +0200 Subject: [PATCH 09/27] Calendar plugin has previous/next buttons, see #128 - but still does not highlight proper days in previous months :/ --- fp-plugins/calendar/plugin.calendar.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fp-plugins/calendar/plugin.calendar.php b/fp-plugins/calendar/plugin.calendar.php index 9f38d2d2..d00256a1 100755 --- a/fp-plugins/calendar/plugin.calendar.php +++ b/fp-plugins/calendar/plugin.calendar.php @@ -31,8 +31,9 @@ function generate_calendar($year, $month, $days = array(), $day_name_length = 3, // Begin calendar. Uses a real . See http://diveintomark.org/archives/2002/07/03 // PHP7 compatibility: Since $pn is never passed, we do not need to create "previous" and "next" elements. - $p = ''; - $n = ''; + + $p = '« '; + $n = ' »'; // Commented out to prevent deprecated each() function from being executed. // @list($p, $pl) = each($pn); @list($n, $nl) = each($pn); #previous and next links, if applicable // if($p) $p = ''.($pl ? ''.$p.'' : $p).' '; From 925e225ee9a6dccbc09df157410172b0cf8e3212 Mon Sep 17 00:00:00 2001 From: azett Date: Sun, 14 Aug 2022 14:57:09 +0200 Subject: [PATCH 10/27] logout redirects to home page, fixes #119 --- login.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/login.php b/login.php index 65e403b7..b0f74f5e 100755 --- a/login.php +++ b/login.php @@ -15,7 +15,7 @@ function login_validate() { $pass = trim(@$_POST ['pass']); $error = array(); - $lerr = & $lang ['login'] ['error']; + $lerr = &$lang ['login'] ['error']; if (!$user) { $error ['user'] = $lerr ['user']; @@ -46,7 +46,8 @@ function main() { user_logout(); function myredirect() { - // login_redirect('.'); + // logout redirects to home page + login_redirect('.'); } add_filter('wp_head', 'myredirect'); @@ -55,6 +56,7 @@ function myredirect() { } elseif (user_loggedin()) { function myredirect() { + // login redirects to Admin Area login_redirect('admin.php'); } From 74f7963b92a29b176a34b576a37508561ec4d72c Mon Sep 17 00:00:00 2001 From: Arvid Zimmermann Date: Sun, 14 Aug 2022 15:01:40 +0200 Subject: [PATCH 11/27] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07f42710..5d17fc74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ - "Add comment" link has its own line (see [#135](https://github.com/flatpressblog/flatpress/issues/135)) - Removed legacy/invalid CSS (see [#133](https://github.com/flatpressblog/flatpress/issues/133), [#134](https://github.com/flatpressblog/flatpress/issues/134)) - Fixed description of Leggero and Leggero v2 styles (see [#137](https://github.com/flatpressblog/flatpress/issues/137)) + - Obsolete bullet points removed (see [#136](https://github.com/flatpressblog/flatpress/issues/136)) ## Bugfixes - Comment Center config page threw errors (see [#90](https://github.com/flatpressblog/flatpress/issues/90)) @@ -27,6 +28,7 @@ - Fixed wrong pt-br country code (see [#100](https://github.com/flatpressblog/flatpress/issues/100)) - Fixed error at prev link on first / next link on last entry (see [#95](https://github.com/flatpressblog/flatpress/issues/95)) - LastComments plugin will not even attempt to delete or rebuild LastComments caches if LastComments plugin is not available (see [#43](https://github.com/flatpressblog/flatpress/issues/43)) +- Logout redirects to home page again (see [#119](https://github.com/flatpressblog/flatpress/issues/119)) ## Security - Fixed security issue reported by huntr.dev: Session cookie missed the "secure" flag From 58b3063478688ebfcf7b62971fc968f5f1d27b07 Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 10 Sep 2022 13:32:31 +0200 Subject: [PATCH 12/27] Updated Leggero preview image, fixes #139 - thx @Fraenkiman --- fp-interface/themes/leggero/preview.png | Bin 46287 -> 16008 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fp-interface/themes/leggero/preview.png b/fp-interface/themes/leggero/preview.png index c00feecb0381456367450b2e4bb094b720b65e4f..1ad426cfa1b42d2f19ffadcb50121ea8cd7414c1 100644 GIT binary patch literal 16008 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 CqayJD literal 46287 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
}Debo|DB5d#9_a#L|QjQmSpLP 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 LNkvXXu0mjfUd*c9 From 5dd42b0ffaa1a64b6d731b43e1e185531cfa03dd Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 10 Sep 2022 14:20:23 +0200 Subject: [PATCH 13/27] fixes #49 & #91 - basically reverting 9f610ddac3f3a566f7ec672f5741d2314ea63ffc --- fp-includes/core/core.wp-formatting.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/fp-includes/core/core.wp-formatting.php b/fp-includes/core/core.wp-formatting.php index 842af80a..26508e50 100644 --- a/fp-includes/core/core.wp-formatting.php +++ b/fp-includes/core/core.wp-formatting.php @@ -487,25 +487,21 @@ function sanitize_title($title, $fallback_title = '') { function sanitize_title_with_dashes($title) { $title = strip_tags($title); - - if (seems_utf8($title)) { - if (function_exists('mb_strtolower')) { - $title = mb_strtolower($title, 'UTF-8'); - } - $title = utf8_uri_encode($title); - } - // Preserve escaped octets. $title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title); // Remove percent signs that are not part of an octet. $title = str_replace('%', '', $title); // Restore octets. $title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title); - // and finally: Kill octets - $title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '', $title); // remove accents $title = remove_accents($title); + if (seems_utf8($title)) { + if (function_exists('mb_strtolower')) { + $title = mb_strtolower($title, 'UTF-8'); + } + $title = utf8_uri_encode($title); + } // title is in lower case always $title = strtolower($title); From 7d5264891a23d2096dc8f4985138302da591cbe1 Mon Sep 17 00:00:00 2001 From: Arvid Zimmermann Date: Sat, 10 Sep 2022 15:01:28 +0200 Subject: [PATCH 14/27] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d17fc74..3d4080fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - Removed legacy/invalid CSS (see [#133](https://github.com/flatpressblog/flatpress/issues/133), [#134](https://github.com/flatpressblog/flatpress/issues/134)) - Fixed description of Leggero and Leggero v2 styles (see [#137](https://github.com/flatpressblog/flatpress/issues/137)) - Obsolete bullet points removed (see [#136](https://github.com/flatpressblog/flatpress/issues/136)) + - Updated preview image (see [#139](https://github.com/flatpressblog/flatpress/issues/139)) ## Bugfixes - Comment Center config page threw errors (see [#90](https://github.com/flatpressblog/flatpress/issues/90)) @@ -29,6 +30,7 @@ - Fixed error at prev link on first / next link on last entry (see [#95](https://github.com/flatpressblog/flatpress/issues/95)) - LastComments plugin will not even attempt to delete or rebuild LastComments caches if LastComments plugin is not available (see [#43](https://github.com/flatpressblog/flatpress/issues/43)) - Logout redirects to home page again (see [#119](https://github.com/flatpressblog/flatpress/issues/119)) +- Fixed disappearing non-Latin characters in page title (see [#49](https://github.com/flatpressblog/flatpress/issues/49) and [#91](https://github.com/flatpressblog/flatpress/issues/91)) ## Security - Fixed security issue reported by huntr.dev: Session cookie missed the "secure" flag From 216cc58479b85d03bc78c2ae6866aa222921dec4 Mon Sep 17 00:00:00 2001 From: Arvid Zimmermann Date: Sat, 10 Sep 2022 15:05:21 +0200 Subject: [PATCH 15/27] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 96811665..5c652523 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -14,6 +14,7 @@ Since 2018, FlatPress is taken care of by [Arvid Zimmermann](https://github.com/ - The SEO Meta Tag Info plugin was built by Don Prince. - [Matthias Mauch](http://www.aadmm.org/)'s [FP-Patch](http://www.aadmm.org/fp-patch/) initially brought FlatPress to PHP 7. Also, he regularly tests FlatPress against new PHP versions. - The XML sitemap for search engines was [initially introduced](https://www.igorkromin.net/index.php/2013/02/18/adding-a-google-compatible-sitemap-to-flatpress/) by [Igor Kromin](https://www.igorkromin.net/). +- [Fraenkiman](https://github.com/Fraenkiman) tests FlatPress to its very core and creates a metric ton of very helpful issues. ## Translation - Brazilian Portuguese: randy From 969966ed2586be3dab33618adc727d955af72080 Mon Sep 17 00:00:00 2001 From: Arvid Zimmermann Date: Sat, 10 Sep 2022 18:04:15 +0200 Subject: [PATCH 16/27] added @Fraenkiman --- CONTRIBUTORS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 5c652523..bbe97b90 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -14,7 +14,6 @@ Since 2018, FlatPress is taken care of by [Arvid Zimmermann](https://github.com/ - The SEO Meta Tag Info plugin was built by Don Prince. - [Matthias Mauch](http://www.aadmm.org/)'s [FP-Patch](http://www.aadmm.org/fp-patch/) initially brought FlatPress to PHP 7. Also, he regularly tests FlatPress against new PHP versions. - The XML sitemap for search engines was [initially introduced](https://www.igorkromin.net/index.php/2013/02/18/adding-a-google-compatible-sitemap-to-flatpress/) by [Igor Kromin](https://www.igorkromin.net/). -- [Fraenkiman](https://github.com/Fraenkiman) tests FlatPress to its very core and creates a metric ton of very helpful issues. ## Translation - Brazilian Portuguese: randy @@ -38,3 +37,4 @@ FlatPress utilizes the following free frameworks and libraries. Thanks to their ## Other contributions - [Julian Rademacher](https://moortaube.de/) generously donated his Twitter account [@FlatPress](https://twitter.com/FlatPress). Also thanks for your useful pull requests! +- [Fraenkiman](https://github.com/Fraenkiman) tests FlatPress to its very core and creates a metric ton of very helpful [issues](https://github.com/flatpressblog/flatpress/issues). From e58efa9da063ca6bee76f330c1f96ca14b63d0db Mon Sep 17 00:00:00 2001 From: Arvid Zimmermann Date: Thu, 15 Sep 2022 20:32:43 +0200 Subject: [PATCH 17/27] added Donate button; brought Follow buttons to top --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 06a076da..45a9036f 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,13 @@ [![Change log](https://img.shields.io/badge/Change%20log-📜-555?style=plastic)](./CHANGELOG.md "Change log") [![Security policy](https://img.shields.io/badge/Security%20policy-⚡-555?style=plastic)](./SECURITY.md "Security policy") [![Contributors](https://img.shields.io/badge/Contributors-😎-555?style=plastic)](./CONTRIBUTORS.md "Contributors") +[![Wiki](https://img.shields.io/badge/Donate-💛-555?style=plastic&logo=paypal)](https://www.flatpress.org/donate "Send us a little Thank You") [![Releases](https://img.shields.io/github/release/flatpressblog/flatpress.svg?label=Latest%20release&style=plastic)](https://github.com/flatpressblog/flatpress/releases "See all releases") [![License](https://img.shields.io/github/license/flatpressblog/flatpress.svg?style=plastic)](./LICENSE.md "License") [![Open issues](https://img.shields.io/github/issues-raw/flatpressblog/flatpress?style=plastic)](https://github.com/flatpressblog/flatpress/issues "See open issues") [![Last commit](https://img.shields.io/github/last-commit/flatpressblog/flatpress?style=plastic)](https://github.com/flatpressblog/flatpress/commits/ "Last commit") +Mastodon Follow Follow on Twitter # Welcome to FlatPress! FlatPress is a lightweight, easy-to-set-up blogging engine. Plain and simple, just PHP. No database needed! @@ -41,7 +43,3 @@ FlatPress runs on any web server (e.g. Apache or IIS) with PHP 5.6 or higher. Si ## Credits There are many people who contributed to FlatPress over the years. [See them here.](./CONTRIBUTORS.md) - - -Mastodon Follow
-Follow on Twitter From 225e3b1b8d1cdb5f2c7c3c44beef258b07db2543 Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 1 Oct 2022 12:59:20 +0200 Subject: [PATCH 18/27] fixes #132 - thx laborix & @Fraenkiman! --- CHANGELOG.md | 41 +- .../plugins/function.html_select_date.php | 622 ++++++++++-------- 2 files changed, 354 insertions(+), 309 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d4080fc..09710781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,33 +4,36 @@ - [README](https://github.com/flatpressblog/flatpress/blob/master/README.md): added "help and support" section ## Plugins -- Gallery captions plugin added (see [#108](https://github.com/flatpressblog/flatpress/issues/108)) -- PhotoSwipe plugin added (see [#109](https://github.com/flatpressblog/flatpress/issues/109)) +- Gallery captions plugin added ([#108](https://github.com/flatpressblog/flatpress/issues/108)) +- PhotoSwipe plugin added ([#109](https://github.com/flatpressblog/flatpress/issues/109)) - jQuery plugin: Updated jQuery (3.5.1 => 3.6) and jQueryUI (1.12.1 => 1.13.1) - Media Manager plugin shows 50 items per page, not 10 +- LastComments plugin will not even attempt to delete or rebuild LastComments caches if LastComments plugin is not available ([#43](https://github.com/flatpressblog/flatpress/issues/43)) ## Themes - Leggero - - Fixed searchbox glitch in FlatMaas revisited style (see [#97](https://github.com/flatpressblog/flatpress/issues/97)) - - Fixed missing bullets in preview (see [#98](https://github.com/flatpressblog/flatpress/issues/98)) + - Fixed searchbox glitch in FlatMaas revisited style ([#97](https://github.com/flatpressblog/flatpress/issues/97)) + - Fixed missing bullets in preview ([#98](https://github.com/flatpressblog/flatpress/issues/98)) - CSS of the Leggero style had some glitches on mobile devices - - Invalid HTML output fixed (see [#106](https://github.com/flatpressblog/flatpress/issues/106)) - - Removed unneccessary external font resource (see [#112](https://github.com/flatpressblog/flatpress/issues/112)) - - "Add comment" link has its own line (see [#135](https://github.com/flatpressblog/flatpress/issues/135)) - - Removed legacy/invalid CSS (see [#133](https://github.com/flatpressblog/flatpress/issues/133), [#134](https://github.com/flatpressblog/flatpress/issues/134)) - - Fixed description of Leggero and Leggero v2 styles (see [#137](https://github.com/flatpressblog/flatpress/issues/137)) - - Obsolete bullet points removed (see [#136](https://github.com/flatpressblog/flatpress/issues/136)) - - Updated preview image (see [#139](https://github.com/flatpressblog/flatpress/issues/139)) - -## Bugfixes -- Comment Center config page threw errors (see [#90](https://github.com/flatpressblog/flatpress/issues/90)) + - Invalid HTML output fixed ([#106](https://github.com/flatpressblog/flatpress/issues/106)) + - Removed unneccessary external font resource ([#112](https://github.com/flatpressblog/flatpress/issues/112)) + - "Add comment" link has its own line ([#135](https://github.com/flatpressblog/flatpress/issues/135)) + - Removed legacy/invalid CSS ([#133](https://github.com/flatpressblog/flatpress/issues/133), [#134](https://github.com/flatpressblog/flatpress/issues/134)) + - Fixed description of Leggero and Leggero v2 styles ([#137](https://github.com/flatpressblog/flatpress/issues/137)) + - Obsolete bullet points removed ([#136](https://github.com/flatpressblog/flatpress/issues/136)) + - Updated preview image ([#139](https://github.com/flatpressblog/flatpress/issues/139)) + +## Internationalization - Fixed glitches in Spanish an Portuguese language files +- Fixed wrong pt-br country code ([#100](https://github.com/flatpressblog/flatpress/issues/100)) +- Search page: Month names displayed in configured frontend language ([#132](https://github.com/flatpressblog/flatpress/issues/132)) + +## Other bugfixes +- Comment Center config page threw errors ([#90](https://github.com/flatpressblog/flatpress/issues/90)) - Plugin management page: Removed empty warning messages box -- Fixed wrong pt-br country code (see [#100](https://github.com/flatpressblog/flatpress/issues/100)) -- Fixed error at prev link on first / next link on last entry (see [#95](https://github.com/flatpressblog/flatpress/issues/95)) -- LastComments plugin will not even attempt to delete or rebuild LastComments caches if LastComments plugin is not available (see [#43](https://github.com/flatpressblog/flatpress/issues/43)) -- Logout redirects to home page again (see [#119](https://github.com/flatpressblog/flatpress/issues/119)) -- Fixed disappearing non-Latin characters in page title (see [#49](https://github.com/flatpressblog/flatpress/issues/49) and [#91](https://github.com/flatpressblog/flatpress/issues/91)) +- Fixed error at prev link on first / next link on last entry ([#95](https://github.com/flatpressblog/flatpress/issues/95)) +- Logout redirects to home page again ([#119](https://github.com/flatpressblog/flatpress/issues/119)) +- Fixed disappearing non-Latin characters in page title ([#49](https://github.com/flatpressblog/flatpress/issues/49) and [#91](https://github.com/flatpressblog/flatpress/issues/91)) ## Security - Fixed security issue reported by huntr.dev: Session cookie missed the "secure" flag diff --git a/fp-includes/smarty/plugins/function.html_select_date.php b/fp-includes/smarty/plugins/function.html_select_date.php index e5eb1830..eb4de0fd 100644 --- a/fp-includes/smarty/plugins/function.html_select_date.php +++ b/fp-includes/smarty/plugins/function.html_select_date.php @@ -1,6 +1,8 @@ - * Name: html_select_date
- * Purpose: Prints the dropdowns for date selection. + * Type: function
+ * Name: html_select_date
+ * Purpose: Prints the dropdowns for date selection. * * ChangeLog:
- * - 1.0 initial release - * - 1.1 added support for +/- N syntax for begin - * and end year values. (Monte) - * - 1.2 added support for yyyy-mm-dd syntax for - * time value. (Jan Rosier) - * - 1.3 added support for choosing format for - * month values (Gary Loescher) - * - 1.3.1 added support for choosing format for - * day values (Marcus Bointon) - * - 1.3.2 support negative timestamps, force year - * dropdown to include given date unless explicitly set (Monte) - * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that - * of 0000-00-00 dates (cybot, boots) + * - 1.0 initial release + * - 1.1 added support for +/- N syntax for begin + * and end year values. (Monte) + * - 1.2 added support for yyyy-mm-dd syntax for + * time value. (Jan Rosier) + * - 1.3 added support for choosing format for + * month values (Gary Loescher) + * - 1.3.1 added support for choosing format for + * day values (Marcus Bointon) + * - 1.3.2 support negative timestamps, force year + * dropdown to include given date unless explicitly set (Monte) + * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that + * of 0000-00-00 dates (cybot, boots) + * * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date} - * (Smarty online manual) + * (Smarty online manual) * @version 1.3.4 * @author Andrei Zmievski * @author Monte Ohrt - * @param array - * @param Smarty + * @param + * array + * @param + * Smarty * @return string */ -function smarty_function_html_select_date($params, &$smarty) -{ - require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); - require_once $smarty->_get_plugin_filepath('shared','make_timestamp'); - require_once $smarty->_get_plugin_filepath('function','html_options'); - /* Default values. */ - $prefix = "Date_"; - $start_year = strftime("%Y"); - $end_year = $start_year; - $display_days = true; - $display_months = true; - $display_years = true; - $month_format = "%B"; - /* Write months as numbers by default GL */ - $month_value_format = "%m"; - $day_format = "%02d"; - /* Write day values using this format MB */ - $day_value_format = "%d"; - $year_as_text = false; - /* Display years in reverse order? Ie. 2000,1999,.... */ - $reverse_years = false; - /* Should the select boxes be part of an array when returned from PHP? - e.g. setting it to "birthday", would create "birthday[Day]", - "birthday[Month]" & "birthday[Year]". Can be combined with prefix */ - $field_array = null; - /* tags. - If not set, uses default dropdown. */ - $day_size = null; - $month_size = null; - $year_size = null; - /* Unparsed attributes common to *ALL* the tags. - An example might be in the template: all_extra ='class ="foo"'. */ - $all_extra = null; - /* Separate attributes for the tags. */ - $day_extra = null; - $month_extra = null; - $year_extra = null; - /* Order in which to display the fields. - "D" -> day, "M" -> month, "Y" -> year. */ - $field_order = 'MDY'; - /* String printed between the different fields. */ - $field_separator = "\n"; - $time = time(); - $all_empty = null; - $day_empty = null; - $month_empty = null; - $year_empty = null; - $extra_attrs = ''; +function smarty_function_html_select_date($params, &$smarty) { + require_once $smarty->_get_plugin_filepath('shared', 'escape_special_chars'); + require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp'); + require_once $smarty->_get_plugin_filepath('function', 'html_options'); + /* Default values. */ + $prefix = "Date_"; + $start_year = strftime("%Y"); + $end_year = $start_year; + $display_days = true; + $display_months = true; + $display_years = true; + $month_format = "%B"; + /* Write months as numbers by default GL */ + $month_value_format = "%m"; + $day_format = "%02d"; + /* Write day values using this format MB */ + $day_value_format = "%d"; + $year_as_text = false; + /* Display years in reverse order? Ie. 2000,1999,.... */ + $reverse_years = false; + /* + * Should the select boxes be part of an array when returned from PHP? + * e.g. setting it to "birthday", would create "birthday[Day]", + * "birthday[Month]" & "birthday[Year]". Can be combined with prefix + */ + $field_array = null; + /* + * tags. + * If not set, uses default dropdown. + */ + $day_size = null; + $month_size = null; + $year_size = null; + /* + * Unparsed attributes common to *ALL* the tags. + * An example might be in the template: all_extra ='class ="foo"'. + */ + $all_extra = null; + /* Separate attributes for the tags. */ + $day_extra = null; + $month_extra = null; + $year_extra = null; + /* + * Order in which to display the fields. + * "D" -> day, "M" -> month, "Y" -> year. + */ + $field_order = 'MDY'; + /* String printed between the different fields. */ + $field_separator = "\n"; + $time = time(); + $all_empty = null; + $day_empty = null; + $month_empty = null; + $year_empty = null; + $extra_attrs = ''; - foreach ($params as $_key=>$_value) { - switch ($_key) { - case 'prefix': - case 'time': - case 'start_year': - case 'end_year': - case 'month_format': - case 'day_format': - case 'day_value_format': - case 'field_array': - case 'day_size': - case 'month_size': - case 'year_size': - case 'all_extra': - case 'day_extra': - case 'month_extra': - case 'year_extra': - case 'field_order': - case 'field_separator': - case 'month_value_format': - case 'month_empty': - case 'day_empty': - case 'year_empty': - $$_key = (string)$_value; - break; + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'prefix': + case 'time': + case 'start_year': + case 'end_year': + case 'month_format': + case 'day_format': + case 'day_value_format': + case 'field_array': + case 'day_size': + case 'month_size': + case 'year_size': + case 'all_extra': + case 'day_extra': + case 'month_extra': + case 'year_extra': + case 'field_order': + case 'field_separator': + case 'month_value_format': + case 'month_empty': + case 'day_empty': + case 'year_empty': + $$_key = (string) $_value; + break; - case 'all_empty': - $$_key = (string)$_value; - $day_empty = $month_empty = $year_empty = $all_empty; - break; + case 'all_empty': + $$_key = (string) $_value; + $day_empty = $month_empty = $year_empty = $all_empty; + break; - case 'display_days': - case 'display_months': - case 'display_years': - case 'year_as_text': - case 'reverse_years': - $$_key = (bool)$_value; - break; + case 'display_days': + case 'display_months': + case 'display_years': + case 'year_as_text': + case 'reverse_years': + $$_key = (bool) $_value; + break; - default: - if(!is_array($_value)) { - $extra_attrs .= ' '.$_key.'="'.smarty_function_escape_special_chars($_value).'"'; - } else { - $smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); - } - break; - } - } + default: + if (!is_array($_value)) { + $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; + } else { + $smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } - if (preg_match('!^-\d+$!', $time)) { - // negative timestamp, use date() - $time = date('Y-m-d', $time); - } - // If $time is not in format yyyy-mm-dd - if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) { - $time = $found[1]; - } else { - // use smarty_make_timestamp to get an unix timestamp and - // strftime to make yyyy-mm-dd - $time = strftime('%Y-%m-%d', smarty_make_timestamp($time)); - } - // Now split this in pieces, which later can be used to set the select - $time = explode("-", $time); + if (preg_match('!^-\d+$!', $time)) { + // negative timestamp, use date() + $time = date('Y-m-d', $time); + } + // If $time is not in format yyyy-mm-dd + if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) { + $time = $found [1]; + } else { + // use smarty_make_timestamp to get an unix timestamp and + // strftime to make yyyy-mm-dd + $time = strftime('%Y-%m-%d', smarty_make_timestamp($time)); + } + // Now split this in pieces, which later can be used to set the select + $time = explode("-", $time); - // make syntax "+N" or "-N" work with start_year and end_year - if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) { - if ($match[1] == '+') { - $end_year = strftime('%Y') + $match[2]; - } else { - $end_year = strftime('%Y') - $match[2]; - } - } - if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) { - if ($match[1] == '+') { - $start_year = strftime('%Y') + $match[2]; - } else { - $start_year = strftime('%Y') - $match[2]; - } - } - if (strlen($time[0]) > 0) { - if ($start_year > $time[0] && !isset($params['start_year'])) { - // force start year to include given date if not explicitly set - $start_year = $time[0]; - } - if($end_year < $time[0] && !isset($params['end_year'])) { - // force end year to include given date if not explicitly set - $end_year = $time[0]; - } - } + // make syntax "+N" or "-N" work with start_year and end_year + if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) { + if ($match [1] == '+') { + $end_year = strftime('%Y') + $match [2]; + } else { + $end_year = strftime('%Y') - $match [2]; + } + } + if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) { + if ($match [1] == '+') { + $start_year = strftime('%Y') + $match [2]; + } else { + $start_year = strftime('%Y') - $match [2]; + } + } + if (strlen($time [0]) > 0) { + if ($start_year > $time [0] && !isset($params ['start_year'])) { + // force start year to include given date if not explicitly set + $start_year = $time [0]; + } + if ($end_year < $time [0] && !isset($params ['end_year'])) { + // force end year to include given date if not explicitly set + $end_year = $time [0]; + } + } - $field_order = strtoupper($field_order); + $field_order = strtoupper($field_order); - $html_result = $month_result = $day_result = $year_result = ""; + $html_result = $month_result = $day_result = $year_result = ""; - $field_separator_count = -1; - if ($display_months) { - $field_separator_count++; - $month_names = array(); - $month_values = array(); - if(isset($month_empty)) { - $month_names[''] = $month_empty; - $month_values[''] = ''; - } - for ($i = 1; $i <= 12; $i++) { - $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000)); - $month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000)); - } + $field_separator_count = -1; + if ($display_months) { + $field_separator_count++; + $month_names = array(); + $month_values = array(); + if (isset($month_empty)) { + $month_names [''] = $month_empty; + $month_values [''] = ''; + } + // Using the month_names from the FlatPress language files + global $lang; + $replace_month_names = array(); + $replace_month_names [0] = '-'; + $replace_month_value_format = array( + "00", + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12" + ); + $fp_lang_months = array(); + $fp_lang_months = $lang ['date'] ['month']; + $fplm = 0; + for($lm = 1; $lm <= 12; $lm++) { + $replace_month_names [$lm] = $fp_lang_months [$fplm]; + $fplm++; + } + for($i = 1; $i <= 12; $i++) { + $month_names [$i] = $replace_month_names [$i]; + $month_values [$i] = $replace_month_value_format [$i]; + } + // /FlatPress change - $month_result .= '' . "\n"; - $month_result .= smarty_function_html_options(array('output' => $month_names, - 'values' => $month_values, - 'selected' => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '', - 'print_result' => false), - $smarty); - $month_result .= ''; - } + $month_result .= smarty_function_html_options(array( + 'output' => $month_names, + 'values' => $month_values, + 'selected' => (int) $time [1] ? strftime($month_value_format, mktime(0, 0, 0, (int) $time [1], 1, 2000)) : '', + 'print_result' => false + ), $smarty); + $month_result .= ''; + } - if ($display_days) { - $field_separator_count++; - $days = array(); - if (isset($day_empty)) { - $days[''] = $day_empty; - $day_values[''] = ''; - } - for ($i = 1; $i <= 31; $i++) { - $days[] = sprintf($day_format, $i); - $day_values[] = sprintf($day_value_format, $i); - } + if ($display_days) { + $field_separator_count++; + $days = array(); + if (isset($day_empty)) { + $days [''] = $day_empty; + $day_values [''] = ''; + } + for($i = 1; $i <= 31; $i++) { + $days [] = sprintf($day_format, $i); + $day_values [] = sprintf($day_value_format, $i); + } - $day_result .= ''; - } + $day_result .= ''; + } - if ($display_years) { - $field_separator_count++; - if (null !== $field_array){ - $year_name = $field_array . '[' . $prefix . 'Year]'; - } else { - $year_name = $prefix . 'Year'; - } - if ($year_as_text) { - $year_result .= ''."\n"; - $year_result .= smarty_function_html_options(array('output' => $years, - 'values' => $yearvals, - 'selected' => $time[0], - 'print_result' => false), - $smarty); - $year_result .= ''; - } - } + if ($display_years) { + $field_separator_count++; + if (null !== $field_array) { + $year_name = $field_array . '[' . $prefix . 'Year]'; + } else { + $year_name = $prefix . 'Year'; + } + if ($year_as_text) { + $year_result .= '' . "\n"; + $year_result .= smarty_function_html_options(array( + 'output' => $years, + 'values' => $yearvals, + 'selected' => $time [0], + 'print_result' => false + ), $smarty); + $year_result .= ''; + } + } - // Loop thru the field_order field - for ($i = 0; $i <= 2; $i++){ - $c = substr($field_order, $i, 1); - switch ($c){ - case 'D': - $html_result .= $day_result; - break; + // Loop thru the field_order field + for($i = 0; $i <= 2; $i++) { + $c = substr($field_order, $i, 1); + switch ($c) { + case 'D': + $html_result .= $day_result; + break; - case 'M': - $html_result .= $month_result; - break; + case 'M': + $html_result .= $month_result; + break; - case 'Y': - $html_result .= $year_result; - break; - } - // Add the field seperator - if($i < $field_separator_count) { - $html_result .= $field_separator; - } - } + case 'Y': + $html_result .= $year_result; + break; + } + // Add the field seperator + if ($i < $field_separator_count) { + $html_result .= $field_separator; + } + } - return $html_result; + return $html_result; } /* vim: set expandtab: */ From 92c0b2a5178d5d7102a2fac85e8af0ba8940994f Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 1 Oct 2022 13:33:34 +0200 Subject: [PATCH 19/27] Bufix: Checking uploaded files' extensions looked for the tmp file name, not the actual file name. Fixes #152 as well - thanks @s4n-h4xor! --- CHANGELOG.md | 2 +- admin/panels/uploader/admin.uploader.php | 219 ++++++++++++----------- 2 files changed, 112 insertions(+), 109 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09710781..a3542053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - jQuery plugin: Updated jQuery (3.5.1 => 3.6) and jQueryUI (1.12.1 => 1.13.1) - Media Manager plugin shows 50 items per page, not 10 - LastComments plugin will not even attempt to delete or rebuild LastComments caches if LastComments plugin is not available ([#43](https://github.com/flatpressblog/flatpress/issues/43)) +- Comment Center config page threw errors ([#90](https://github.com/flatpressblog/flatpress/issues/90)) ## Themes - Leggero @@ -29,7 +30,6 @@ - Search page: Month names displayed in configured frontend language ([#132](https://github.com/flatpressblog/flatpress/issues/132)) ## Other bugfixes -- Comment Center config page threw errors ([#90](https://github.com/flatpressblog/flatpress/issues/90)) - Plugin management page: Removed empty warning messages box - Fixed error at prev link on first / next link on last entry ([#95](https://github.com/flatpressblog/flatpress/issues/95)) - Logout redirects to home page again ([#119](https://github.com/flatpressblog/flatpress/issues/119)) diff --git a/admin/panels/uploader/admin.uploader.php b/admin/panels/uploader/admin.uploader.php index 8cc6ca22..1fc8aec2 100755 --- a/admin/panels/uploader/admin.uploader.php +++ b/admin/panels/uploader/admin.uploader.php @@ -102,133 +102,136 @@ function onupload() { foreach ($_FILES ["upload"] ["error"] as $key => $error) { - if ($error == UPLOAD_ERR_OK) { - $tmp_name = $_FILES ["upload"] ["tmp_name"] [$key]; - $name = $_FILES ["upload"] ["name"] [$key]; + // Upload went wrong -> jump to the next file + if ($error != UPLOAD_ERR_OK) { + continue; + } + + $tmp_name = $_FILES ["upload"] ["tmp_name"] [$key]; + $name = $_FILES ["upload"] ["name"] [$key]; + + $dir = ATTACHS_DIR; + + /* + * second check extension list + * https://stackoverflow.com/questions/4166762/php-image-upload-security-check-list + * + * 2019-11-24 - laborix + */ + + $uploadfilename = strtolower($name); - $dir = ATTACHS_DIR; + $isForbidden = false; + $deeptest = array(); + $extcount = 0; + $deeptest = explode('.', $uploadfilename); + $extcount = count($deeptest); + if ($extcount == 1) { /* - * second check extension list - * https://stackoverflow.com/questions/4166762/php-image-upload-security-check-list + * none extension like .jpg or something else * - * 2019-11-24 - laborix + * possible filename = simple-file-without-extension - linux like ok */ - - $uploadfilename = strtolower($tmp_name); - $isForbidden = false; - $deeptest = array(); - $extcount = 0; - $deeptest = explode('.', $uploadfilename); - $extcount = count($deeptest); - - if ($extcount == 1) { - /* - * none extension like .jpg or something else - * - * possible filename = simple-file-without-extension - linux like ok - */ - $isForbidden = false; - } elseif ($extcount == 2) { - /* - * Only one possible extension - * - * possible filename = 1.jpg - * possible filename = admin.uploader.php - * possible filename = .htaccess - * and so on... - */ - $check_ext1 = ""; - $check_ext1 = trim($deeptest [1], "\x00..\x1F"); - if (in_array($check_ext1, $blacklist_extensions)) { - $isForbidden = true; - } else { - $isForbidden = false; - } - } elseif ($extcount > 2) { - /* - * Chekc only the last two possible extensions - * - * Hint: OWASP - Unrestricted File Upload - * - * In Apache, a php file might be executed using the - * double extension technique such as "file.php.jpg" - * when ".jpg" is allowed. - * - * possible filename = 1.PhP.jpg - * possible filename = admin.uploader.php.JPg - * and so on... - */ - $check_ext1 = ""; - $check_ext2 = ""; - $check_ext1 = trim($deeptest [$extcount - 1], "\x00..\x1F"); - if (in_array($check_ext1, $blacklist_extensions)) { - $isForbidden = true; - } else { - $isForbidden = false; - } - /* Test only if first extension check are not in the blacklist */ - if (!$isForbidden) { - $check_ext2 = trim($deeptest [$extcount - 2], "\x00..\x1F"); - if (in_array($check_ext2, $blacklist_extensions)) { - $isForbidden = true; - } else { - $isForbidden = false; - } - } - } + } elseif ($extcount == 2) { /* - * If one blacklisted extension found then - * return with -1 = An error occurred while trying to upload. + * Only one possible extension + * + * possible filename = 1.jpg + * possible filename = admin.uploader.php + * possible filename = .htaccess + * and so on... */ - if ($isForbidden) { - $this->smarty->assign('success', $success ? 1 : -1); - sess_add('admin_uploader_files', $uploaded_files); - return -1; + $check_ext1 = ""; + $check_ext1 = trim($deeptest [1], "\x00..\x1F"); + if (in_array($check_ext1, $blacklist_extensions)) { + $isForbidden = true; + } else { + $isForbidden = false; } - + } elseif ($extcount > 2) { /* - * third check extension - * if someone upload a .php file as .gif, .jpg or .txt - * if someone upload a .html file as .gif, .jpg or .txt + * Chekc only the last two possible extensions + * + * Hint: OWASP - Unrestricted File Upload + * + * In Apache, a php file might be executed using the + * double extension technique such as "file.php.jpg" + * when ".jpg" is allowed. * - * 2019-11-24 - laborix + * possible filename = 1.PhP.jpg + * possible filename = admin.uploader.php.JPg + * and so on... */ - - if (version_compare(PHP_VERSION, '5.3.0') < 0) - return -1; - if (!function_exists('finfo_open')) - return -1; - - $finfo = finfo_open(FILEINFO_MIME_TYPE); - $mime = finfo_file($finfo, $tmp_name); - finfo_close($finfo); - - if (($mime == "text/x-php") || ($mime == "text/html")) { - $this->smarty->assign('success', $success ? 1 : -1); - sess_add('admin_uploader_files', $uploaded_files); - return -1; + $check_ext1 = ""; + $check_ext2 = ""; + $check_ext1 = trim($deeptest [$extcount - 1], "\x00..\x1F"); + if (in_array($check_ext1, $blacklist_extensions)) { + $isForbidden = true; + } else { + $isForbidden = false; } + /* Test only if first extension check are not in the blacklist */ + if (!$isForbidden) { + $check_ext2 = trim($deeptest [$extcount - 2], "\x00..\x1F"); + if (in_array($check_ext2, $blacklist_extensions)) { + $isForbidden = true; + } else { + $isForbidden = false; + } + } + } + /* + * If one blacklisted extension found then + * return with -1 = An error occurred while trying to upload. + */ + if ($isForbidden) { + $this->smarty->assign('success', $success ? 1 : -1); + sess_add('admin_uploader_files', $uploaded_files); + return -1; + } - $ext = strtolower(strrchr($name, '.')); + /* + * third check extension + * if someone upload a .php file as .gif, .jpg or .txt + * if someone upload a .html file as .gif, .jpg or .txt + * + * 2019-11-24 - laborix + */ + + if (version_compare(PHP_VERSION, '5.3.0') < 0) + return -1; + if (!function_exists('finfo_open')) + return -1; + + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime = finfo_file($finfo, $tmp_name); + finfo_close($finfo); + + if (($mime == "text/x-php") || ($mime == "text/html")) { + $this->smarty->assign('success', $success ? 1 : -1); + sess_add('admin_uploader_files', $uploaded_files); + return -1; + } - if (in_array($ext, $imgs)) { - $dir = IMAGES_DIR; - } + $ext = strtolower(strrchr($name, '.')); + + if (in_array($ext, $imgs)) { + $dir = IMAGES_DIR; + } - $name = sanitize_title(substr($name, 0, -strlen($ext))) . $ext; + $name = sanitize_title(substr($name, 0, -strlen($ext))) . $ext; - $target = "$dir/$name"; - @umask(022); - $success = move_uploaded_file($tmp_name, $target); - @chmod($target, 0766); + $target = "$dir/$name"; + @umask(022); + $success = move_uploaded_file($tmp_name, $target); + @chmod($target, 0766); - $uploaded_files [] = $name; + $uploaded_files [] = $name; - // one failure will make $success == false :) - $success &= $success; - } + // one failure will make $success == false :) + $success &= $success; } if ($uploaded_files) { From 9df201725fa5473d852a70684e0a3a751f1e15e8 Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 1 Oct 2022 13:45:12 +0200 Subject: [PATCH 20/27] Changelog for 92c0b2a --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3542053..ceaadcd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ ## Security - Fixed security issue reported by huntr.dev: Session cookie missed the "secure" flag - Possible path traversal in Media Manager plugin prevented +- Uploaded files wheren't checked properly ([#152](https://github.com/flatpressblog/flatpress/issues/152)) # 2021-06-19: [FlatPress 1.2.1](https://github.com/flatpressblog/flatpress/releases/tag/1.2.1) ## Bugfixes From 34fb2f3e6b84fdc12668d296a998e69abcf02518 Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 1 Oct 2022 14:07:54 +0200 Subject: [PATCH 21/27] HttpOnly flag for session cookie to prevent possible XSS - thx @melbinkm! --- defaults.php | 1 + fp-includes/core/core.cookie.php | 18 +++++++++------- fp-includes/core/core.session.php | 4 ++-- fp-includes/core/core.users.php | 8 +++---- fp-includes/core/core.wp-pluggable-funcs.php | 22 ++++++++++---------- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/defaults.php b/defaults.php index e6e066b6..81eea9e7 100755 --- a/defaults.php +++ b/defaults.php @@ -121,6 +121,7 @@ $serverport = "false"; // Unterstützung für Apache und IIS ini_set('session.cookie_secure', 1); +ini_set('session.cookie_httponly', 1); if (isset($_SERVER ['HTTPS']) && ($_SERVER ['HTTPS'] == '1' || strtolower($_SERVER ['HTTPS']) == 'on')) { $serverport = "https://"; } else { diff --git a/fp-includes/core/core.cookie.php b/fp-includes/core/core.cookie.php index dd99493c..aadb6176 100644 --- a/fp-includes/core/core.cookie.php +++ b/fp-includes/core/core.cookie.php @@ -23,6 +23,8 @@ function cookie_setup() { define('COOKIE_DOMAIN', false); if (!defined('COOKIE_SECURE')) define('COOKIE_SECURE', true); + if (!defined('COOKIE_HTTPONLY')) + define('COOKIE_HTTPONLY', true); } if (!function_exists('wp_get_cookie_login')) : @@ -62,20 +64,20 @@ function cookie_set($username, $password, $already_md5 = false, $home = '', $sit else $expire = 0; - setcookie(USER_COOKIE, $username, $expire, $cookiepath, COOKIE_DOMAIN, COOKIE_SECURE); - setcookie(PASS_COOKIE, $password, $expire, $cookiepath, COOKIE_DOMAIN, COOKIE_SECURE); + setcookie(USER_COOKIE, $username, $expire, $cookiepath, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie(PASS_COOKIE, $password, $expire, $cookiepath, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); if ($cookiepath != $sitecookiepath) { - setcookie(USER_COOKIE, $username, $expire, $sitecookiepath, COOKIE_DOMAIN, COOKIE_SECURE); - setcookie(PASS_COOKIE, $password, $expire, $sitecookiepath, COOKIE_DOMAIN, COOKIE_SECURE); + setcookie(USER_COOKIE, $username, $expire, $sitecookiepath, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie(PASS_COOKIE, $password, $expire, $sitecookiepath, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); } } function cookie_clear() { - setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE); - setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE); - setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE); - setcookie(PASS_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE); + setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie(PASS_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); } if (!function_exists('wp_login')) : diff --git a/fp-includes/core/core.session.php b/fp-includes/core/core.session.php index 7a428e26..87904424 100755 --- a/fp-includes/core/core.session.php +++ b/fp-includes/core/core.session.php @@ -5,7 +5,7 @@ function sess_setup() { session_save_path(SESSION_PATH); session_name(SESS_COOKIE); - setcookie(SESS_COOKIE, '', 0, '', COOKIE_DOMAIN, COOKIE_SECURE); + setcookie(SESS_COOKIE, '', 0, '', COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); session_start(); } @@ -32,7 +32,7 @@ function sess_get($key) { function sess_close() { unset($_SESSION); if (isset($_COOKIE [session_name()])) { - setcookie(session_name(), '', time() - 42000, '/', COOKIE_SECURE); + setcookie(session_name(), '', time() - 42000, '/', COOKIE_SECURE, COOKIE_HTTPONLY); session_set_cookie_params(-42000); } session_destroy(); diff --git a/fp-includes/core/core.users.php b/fp-includes/core/core.users.php index 82d61d62..032a95cc 100755 --- a/fp-includes/core/core.users.php +++ b/fp-includes/core/core.users.php @@ -64,8 +64,8 @@ function user_login($userid, $pwd, $params = null) { if ($loggedin) { // session_regenerate_id(); $expire = time() + 31536000; - setcookie(USER_COOKIE, $userid, $expire, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE); - setcookie(PASS_COOKIE, $user ['password'], $expire, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE); + setcookie(USER_COOKIE, $userid, $expire, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie(PASS_COOKIE, $user ['password'], $expire, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); } return $loggedin; @@ -76,8 +76,8 @@ function user_logout() { if (user_loggedin()) { - setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE); - setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE); + setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN, COOKIE_SECURE, COOKIE_HTTPONLY); } $loggedin = false; diff --git a/fp-includes/core/core.wp-pluggable-funcs.php b/fp-includes/core/core.wp-pluggable-funcs.php index 815e0207..45941c16 100755 --- a/fp-includes/core/core.wp-pluggable-funcs.php +++ b/fp-includes/core/core.wp-pluggable-funcs.php @@ -6,7 +6,7 @@ */ function _get_nextprev_link($nextprev) { global $fpdb; - $q = & $fpdb->getQuery(); + $q = &$fpdb->getQuery(); list ($caption, $id) = call_user_func(array( &$q, @@ -42,7 +42,7 @@ function _get_nextprev_link($nextprev) { function get_nextpage_link() { global $fpdb; - $q = & $fpdb->getQuery(); + $q = &$fpdb->getQuery(); $a = _get_nextprev_link('NextPage'); @@ -59,7 +59,7 @@ function get_nextpage_link() { function get_prevpage_link() { global $fpdb; - $q = & $fpdb->getQuery(); + $q = &$fpdb->getQuery(); $a = _get_nextprev_link('PrevPage'); @@ -292,12 +292,12 @@ function wp_setcookie($username, $password, $already_md5 = false, $home = '', $s $cookiehash = md5($siteurl); } - setcookie('wordpressuser_' . $cookiehash, $username, time() + 31536000, $cookiepath, COOKIE_SECURE); - setcookie('wordpresspass_' . $cookiehash, $password, time() + 31536000, $cookiepath, COOKIE_SECURE); + setcookie('wordpressuser_' . $cookiehash, $username, time() + 31536000, $cookiepath, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie('wordpresspass_' . $cookiehash, $password, time() + 31536000, $cookiepath, COOKIE_SECURE, COOKIE_HTTPONLY); if ($cookiepath != $sitecookiepath) { - setcookie('wordpressuser_' . $cookiehash, $username, time() + 31536000, $sitecookiepath, COOKIE_SECURE); - setcookie('wordpresspass_' . $cookiehash, $password, time() + 31536000, $sitecookiepath, COOKIE_SECURE); + setcookie('wordpressuser_' . $cookiehash, $username, time() + 31536000, $sitecookiepath, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie('wordpresspass_' . $cookiehash, $password, time() + 31536000, $sitecookiepath, COOKIE_SECURE, COOKIE_HTTPONLY); } } endif; @@ -305,10 +305,10 @@ function wp_setcookie($username, $password, $already_md5 = false, $home = '', $s if (!function_exists('wp_clearcookie')) : function wp_clearcookie() { - setcookie('wordpressuser_' . COOKIEHASH, ' ', time() - 31536000, COOKIEPATH, COOKIE_SECURE); - setcookie('wordpresspass_' . COOKIEHASH, ' ', time() - 31536000, COOKIEPATH, COOKIE_SECURE); - setcookie('wordpressuser_' . COOKIEHASH, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_SECURE); - setcookie('wordpresspass_' . COOKIEHASH, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_SECURE); + setcookie('wordpressuser_' . COOKIEHASH, ' ', time() - 31536000, COOKIEPATH, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie('wordpresspass_' . COOKIEHASH, ' ', time() - 31536000, COOKIEPATH, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie('wordpressuser_' . COOKIEHASH, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_SECURE, COOKIE_HTTPONLY); + setcookie('wordpresspass_' . COOKIEHASH, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_SECURE, COOKIE_HTTPONLY); } endif; From b45b7b25ae95db7fdd2d6a5739d5a9ea29bfc54c Mon Sep 17 00:00:00 2001 From: azett Date: Sat, 1 Oct 2022 14:15:37 +0200 Subject: [PATCH 22/27] changelog for 34fb2f3 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ceaadcd6..88513720 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ - Fixed disappearing non-Latin characters in page title ([#49](https://github.com/flatpressblog/flatpress/issues/49) and [#91](https://github.com/flatpressblog/flatpress/issues/91)) ## Security -- Fixed security issue reported by huntr.dev: Session cookie missed the "secure" flag +- Possible XSS prevented: Session cookie missed the "secure" and "httponly" flags - Possible path traversal in Media Manager plugin prevented - Uploaded files wheren't checked properly ([#152](https://github.com/flatpressblog/flatpress/issues/152)) From 266b217161f9a2db5601ab322370966ff95f667b Mon Sep 17 00:00:00 2001 From: azett Date: Sun, 2 Oct 2022 12:49:24 +0200 Subject: [PATCH 23/27] Fixes #156 - thx @Fraenkiman --- CHANGELOG.md | 2 +- setup/index.php | 7 +++---- setup/tpls/header.tpl.php | 7 ++++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88513720..c7ef1b02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ - Fixed searchbox glitch in FlatMaas revisited style ([#97](https://github.com/flatpressblog/flatpress/issues/97)) - Fixed missing bullets in preview ([#98](https://github.com/flatpressblog/flatpress/issues/98)) - CSS of the Leggero style had some glitches on mobile devices - - Invalid HTML output fixed ([#106](https://github.com/flatpressblog/flatpress/issues/106)) + - Invalid HTML output fixed ([#106](https://github.com/flatpressblog/flatpress/issues/106), [#156](https://github.com/flatpressblog/flatpress/issues/156)) - Removed unneccessary external font resource ([#112](https://github.com/flatpressblog/flatpress/issues/112)) - "Add comment" link has its own line ([#135](https://github.com/flatpressblog/flatpress/issues/135)) - Removed legacy/invalid CSS ([#133](https://github.com/flatpressblog/flatpress/issues/133), [#134](https://github.com/flatpressblog/flatpress/issues/134)) diff --git a/setup/index.php b/setup/index.php index db0b4f99..eeee52f7 100755 --- a/setup/index.php +++ b/setup/index.php @@ -1,10 +1,9 @@ - + FlatPress diff --git a/setup/tpls/header.tpl.php b/setup/tpls/header.tpl.php index 043ac90e..1a60beff 100644 --- a/setup/tpls/header.tpl.php +++ b/setup/tpls/header.tpl.php @@ -1,5 +1,4 @@ - + Flatpress installer @@ -11,4 +10,6 @@
-
\ No newline at end of file + \ No newline at end of file From 23dcf5d1e75d3fbc3334bbf6093b40b74e050dc3 Mon Sep 17 00:00:00 2001 From: azett Date: Sun, 2 Oct 2022 13:28:51 +0200 Subject: [PATCH 24/27] reworked Dutch translation by G0erwt - hartelijk dank! --- fp-interface/lang/nl-nl/lang.admin.config.php | 10 +-- fp-interface/lang/nl-nl/lang.admin.static.php | 2 +- .../lang/nl-nl/lang.admin.widgets.php | 12 +-- fp-interface/lang/nl-nl/lang.comments.php | 2 +- fp-interface/lang/nl-nl/lang.contact.php | 20 ++--- fp-interface/lang/nl-nl/lang.default.php | 76 +++++++++---------- 6 files changed, 62 insertions(+), 60 deletions(-) diff --git a/fp-interface/lang/nl-nl/lang.admin.config.php b/fp-interface/lang/nl-nl/lang.admin.config.php index 05ddb3fd..2b83d956 100644 --- a/fp-interface/lang/nl-nl/lang.admin.config.php +++ b/fp-interface/lang/nl-nl/lang.admin.config.php @@ -3,17 +3,17 @@ $lang['admin']['config']['default'] = array( 'head' => 'Opties', - 'descr' => 'Aanpassen en configureren jouw FlatPress + 'descr' => 'Aanpassen en configureren van de FlatPress installatie.', 'submit' => 'Bewaar aanpassingen', 'sysfset' => 'Algemene systeeminformatie', 'syswarning' => 'Warschuwing! Deze informatie is van cruciaal belang en moet correct zijn, - anders FlatPress zal (waarschijnlijk) weigeren om goed te werken.', + anders zal FlatPress (waarschijnlijk) weigeren om goed te werken.', 'blog_root' => 'Absoluut pad naar flatpress. Opmerking: over het algemeen hoeft u dit niet te bewerken, wees hoe dan ook voorzichtig, want we kunnen niet controleren of het correct is of niet.', - 'www' =>'Blog root. URL naar je blog, compleet met + 'www' =>'Blog root. URL naar de blog, compleet met subdirectories.
VB: https://www.mydomain.com/flatpress/ (voorwaard slash is nodig)', @@ -24,10 +24,10 @@ 'blogsubtitle' => 'Blog subtitel', 'blogfooter' => 'Blog voettekst', 'blogauthor' => 'Blog auteur', - 'startpage' => 'De home page van deze web site is', + 'startpage' => 'De home page van deze website is', 'stdstartpage' => 'mijn blog (default)', 'blogurl' => 'Blog URL', - 'blogemail' => 'Blog email', + 'blogemail' => 'Blog e-mail', 'notifications' => 'Notificaties', 'mailnotify' => 'E-mailmelding inschakelen voor opmerkingen', 'blogmaxentries' => 'Aantal berichten per pagina', diff --git a/fp-interface/lang/nl-nl/lang.admin.static.php b/fp-interface/lang/nl-nl/lang.admin.static.php index 63d7f6b8..cd2c1d1f 100644 --- a/fp-interface/lang/nl-nl/lang.admin.static.php +++ b/fp-interface/lang/nl-nl/lang.admin.static.php @@ -11,7 +11,7 @@ $lang['admin']['static']['list'] = array( 'head' => 'Statische paginas', - 'descr' => 'Selecteer een pagina om te bewerken of voeg nieuw toe.', + 'descr' => 'Selecteer een pagina om te bewerken of voeg een nieuwe toe.', 'sel' => 'Selecteer', // checkbox 'date' => 'Datum', diff --git a/fp-interface/lang/nl-nl/lang.admin.widgets.php b/fp-interface/lang/nl-nl/lang.admin.widgets.php index bda5e231..b47ccfbd 100644 --- a/fp-interface/lang/nl-nl/lang.admin.widgets.php +++ b/fp-interface/lang/nl-nl/lang.admin.widgets.php @@ -19,19 +19,19 @@ thema dat u kiest.

FlatPress komt met verschillende widgets: zo zijn er widgets om je met inloggen te helpen, om - deen zoek box te tonen, etc.

+ een zoekbox te tonen, etc.

-

Elke Widget is gedefineert door een Elke Widget is gedefineerd door een plugin.', 'availwdgs' => 'Beschikbare Widgets', - 'trashcan' => 'Sleep het hier om te verwijderen', + 'trashcan' => 'Sleep het hierheen om te verwijderen', 'themewdgs' => 'Widgetsets voor dit thema', - 'themewdgsdescr' => 'Het thema wat je nu hebt geslekteerd heeft de volgende widgetsets', + 'themewdgsdescr' => 'Het thema wat je nu hebt geselekteerd heeft de volgende widgetsets', 'oldwdgs' => '\\\andere widgetsets', - 'oldwdgsdescr' =>'De volgende widgetsets lijkt niet behoren tot elke andere van de '. - 'widgetsets als boven getoond. Dit kan herinneringen zijn van andere thema.', + 'oldwdgsdescr' =>'De volgende widgetsets lijken niet te behoren tot elke van de andere '. + 'widgetsets als boven getoond. Dit kan een overblijfsel zijn van een ander thema.', 'submit' => 'Bewaar veranderingen', diff --git a/fp-interface/lang/nl-nl/lang.comments.php b/fp-interface/lang/nl-nl/lang.comments.php index 78a5e1c3..4caff8e5 100644 --- a/fp-interface/lang/nl-nl/lang.comments.php +++ b/fp-interface/lang/nl-nl/lang.comments.php @@ -3,7 +3,7 @@ "%fromname%" %frommail% heeft een commentaar geplaatst op de volgende post met als titel "%entrytitle%". -Dit het commentaar link naar je blog: +Dit de commentaar link naar je blog: %commentlink% Hier is het commentaar dat net is geplaatst: diff --git a/fp-interface/lang/nl-nl/lang.contact.php b/fp-interface/lang/nl-nl/lang.contact.php index 85b627fd..c6190f7c 100644 --- a/fp-interface/lang/nl-nl/lang.contact.php +++ b/fp-interface/lang/nl-nl/lang.contact.php @@ -1,14 +1,16 @@ 'Contact mij', - 'descr' => 'Vuk het formulier hieronder in om een feedback te sturen. Vul je email als je een antwoord wilt.', - 'fieldset1' => 'Gebruiker gegevens', + 'head' => 'Neem contact op', + 'descr' => 'Vul het formulier hieronder in. + Om een antwoord te krijgen is een e-mail adres nodig. + (*) verplicht in te vullen velden', + 'fieldset1' => 'Gegevens gebruiker', 'name' => 'Naam (*)', 'email' => 'Email:', 'www' => 'Web:', - 'cookie' => 'Herinner mij', - 'fieldset2' => 'Jouw bericht', + 'cookie' => 'Stuur herinnering', + 'fieldset2' => 'Bericht', 'comment' => 'Bericht (*):', 'fieldset3' => 'Stuur', 'submit' => 'Stuur', @@ -17,10 +19,10 @@ ); $lang['contact']['error'] = array( - 'name' => 'Je moet een naam invullen', - 'email' => 'Je moet een geldig email invullen', - 'www' => 'Je moet een geldig URL invullen', - 'content' => 'Je moet een bericht invullen', + 'name' => 'Er dient een naam ingevuld te worden', + 'email' => 'Geen geldig e-mail adres', + 'www' => 'Geen geldige URL ', + 'content' => 'Het bericht mag niet blanko zijn', ); $lang['contact']['msgs'] = array( diff --git a/fp-interface/lang/nl-nl/lang.default.php b/fp-interface/lang/nl-nl/lang.default.php index 8d416956..4ebb635d 100644 --- a/fp-interface/lang/nl-nl/lang.default.php +++ b/fp-interface/lang/nl-nl/lang.default.php @@ -129,56 +129,56 @@ $lang ['date'] ['month'] = array( - 'Januari', - 'Februari', - 'Maart', - 'April', - 'Mei', - 'Juni', - 'July', - 'Augustus', - 'September', - 'October', - 'November', - 'December' + 'januari', + 'februari', + 'maart', + 'april', + 'mei', + 'juni', + 'juli', + 'augustus', + 'september', + 'oktober', + 'november', + 'december' ); $lang ['date'] ['month_abbr'] = array( - 'Jan', - 'Feb', - 'Mrt', - 'Apr', - 'Mei', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec' + 'jan', + 'feb', + 'mrt', + 'apr', + 'mei', + 'jun', + 'jul', + 'aug', + 'sep', + 'okt', + 'nov', + 'dec' ); $lang ['date'] ['weekday'] = array( - 'Zondag', - 'Maandag', - 'Dinsdag', - 'Woensdag', - 'Donderdag', - 'Vrijdag', - 'Zaterdag' + 'zondag', + 'maandag', + 'dinsdag', + 'woensdag', + 'donderdag', + 'vrijdag', + 'zaterdag' ); $lang ['date'] ['weekday_abbr'] = array( - 'Zo', - 'Ma', - 'Di', - 'Wo', - 'Do', - 'Vr', - 'Za' + 'zo', + 'ma', + 'di', + 'wo', + 'do', + 'vr', + 'za' ); ?> From 4d9b7a9b41d2669c09073f02215196c5a9e1abf2 Mon Sep 17 00:00:00 2001 From: azett Date: Sun, 2 Oct 2022 15:04:40 +0200 Subject: [PATCH 25/27] added German translation - thx @Fraenkiman! Closes #148 --- fp-plugins/commentcenter/lang/lang.de-de.php | 182 +++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 fp-plugins/commentcenter/lang/lang.de-de.php diff --git a/fp-plugins/commentcenter/lang/lang.de-de.php b/fp-plugins/commentcenter/lang/lang.de-de.php new file mode 100644 index 00000000..71c986e7 --- /dev/null +++ b/fp-plugins/commentcenter/lang/lang.de-de.php @@ -0,0 +1,182 @@ + 'Comment Center', + 'desc1' => 'Dieses Panel ermöglicht es Ihnen, die Kommentare in Ihrem Blog zu verwalten.', + 'desc2' => 'Hier können Sie mehrere Dinge tun:', + + // Links + 'lpolicies' => 'Verwaltung der Richtlinien', + 'lapprove' => 'Blockierte Kommentare anzeigen', + 'lmanage' => 'Kommentare verwalten', + 'lconfig' => 'Konfigurieren des Plugins', + + // Policies + 'policies' => 'Richtlinien', + 'desc_pol' => 'Hier können Sie die Richtlinien für Kommentare bearbeiten.', + 'select' => 'Auswählen', + 'criteria' => 'Kriterien', + 'behavoir' => 'Verhalten', + 'options' => 'Einstellungen', + 'entry' => 'Eintrag', + 'entries' => 'Einträge', + 'categories' => 'Kategorien', + 'nopolicies' => 'Es gibt keine Richtlinien', + 'all_entries' => 'Alle Einträge', + 'fol_entries' => 'Die Richtlinie gilt für die folgenden Einträge:', + 'fol_cats' => 'Die Richtlinie gilt für Einträge in den folgenden Kategorien:', + 'older' => 'Die Richtlinie gilt für Einträge, die älter als %d Tag (e) sind.', + 'allow' => 'Kommentare erlauben', + 'block' => 'Kommentare verbieten', + 'approvation' => 'Kommentare müssen genehmigt werden', + 'up' => 'Nach oben', + 'down' => 'Nach unten', + 'edit' => 'Bearbeiten', + 'delete' => 'Löschen', + 'newpol' => 'Eine neue Richtlinie hinzufügen', + 'del_selected' => 'Ausgewählte Richtlinie (n) löschen', + 'select_all' => 'Alle auswählen', + 'deselect_all' => 'Keine auswählen', + + // Configuration page + 'configure' => 'Konfigurieren des Plugins', + 'desc_conf' => 'Hier können Sie die Optionen des Plugins ändern.', + 'log_all' => 'Blockierte Kommentare protokollieren', + 'log_all_long' => 'Aktivieren Sie diese Option, wenn Sie auch blockierte Kommentare protokollieren möchten.', + 'email_alert' => 'Benachrichtigung per E-Mail', + 'email_alert_long' => 'Wenn Sie einen Kommentar zum Genehmigen prüfen sollen, können Sie ' . 'über E-Mail informiert werden.', + 'akismet' => 'Akismet', + 'akismet_use' => 'Kommentar-Prüfung mit Akismet', + 'akismet_key' => 'Akismet-Schlüssel', + 'akismet_key_long' => 'Der Akismet-Dienst stellt Ihnen einen Schlüssel zur Verfügung. Fügen Sie diesen hier ein.', + 'akismet_url' => 'Blog-URL für Akismet', + 'akismet_url_long' => 'Für den kostenlosen Service von Akismet sollten Sie nur eine Domain verwenden. ' . 'Sie können dieses Feld leer lassen. Es wird dann %s verwendet.', + 'save_conf' => 'Einstellungen speichern', + + // Edit policy page + 'apply_to' => 'Anwenden auf', + 'editpol' => 'Bearbeiten einer Richtlinie', + 'createpol' => 'Erstellen einer Richtlinie', + 'some_entries' => 'Bestimmte Einträge', + 'properties' => 'Eintrag mit bestimmten Eigenschaften', + 'se_desc' => 'Wenn Sie die Option %s ausgewählt haben, fügen Sie bitte Einträge ein, die Sie auf diese Richtlinie anwenden möchten.', + 'se_fill' => 'Bitte füllen Sie die Felder mit der ID der Einträge aus (entryYYMMDD-HHMMSS).', + 'po_title' => 'Eigenschaften', + 'po_desc' => 'Wenn Sie die Option %s ausgewählt haben, füllen Sie bitte die Eigenschaften aus.', + 'po_comp' => 'Die Felder sind nicht obligatorisch, aber Sie müssen mindestens eines ausfüllen oder die Richtlinie ' . 'wird auf alle Einträge gelten.', + 'po_time' => 'Zeiteinstellungen', + 'po_older' => 'Auf Einträge anwenden, die älter sind als ', + 'days' => 'Tage.', + 'save_policy' => 'Richtlinie speichern', + + // Delete policies page + 'del_policies' => 'Richtlinien löschen', + 'del_descs' => 'Sie werden diese Richtlinie löschen: ', + 'del_descm' => 'Sie werden diese Richtlinien löschen: ', + 'sure' => 'Sind Sie sicher?', + 'del_subs' => 'Ja, bitte löschen', + 'del_subm' => 'Ja, bitte löschen Sie sie', + 'del_cancel' => 'Nein, zurück zu den Einstellungen.', + + // Approve comments page + 'app_title' => 'Genehmigen Sie den Kommentar', + 'app_desc' => 'Hier können Sie Kommentare genehmigen.', + 'app_date' => 'Datum', + 'app_content' => 'Kommentar', + 'app_author' => 'Verfasser', + 'app_email' => 'Email', + 'app_ip' => 'IP', + 'app_actions' => 'Maßnahmen', + 'app_publish' => 'Veröffentlichung', + 'app_delete' => 'Löschen', + 'app_nocomms' => 'Es gibt keinen Kommentar.', + 'app_pselected' => 'Ausgewählte Kommentare veröffentlichen', + 'app_dselected' => 'Ausgewählte Kommentare entfernen', + 'app_other' => 'Sonstige Bemerkungen', + 'app_akismet' => 'Als Spam erkannt', + 'app_spamdesc' => 'Diese Kommentare wurden von Akismet blockiert.', + 'app_hamsubmit' => 'Beim Veröffentlichen auch gleich als Ham an Akismet melden.', + 'app_pubnotham' => 'Veröffentlichen, aber nicht an Akismet übertragen', + + // Delete comments page + 'delc_title' => 'Kommentare löschen', + 'delc_descs' => 'Sie werden diesen Kommentar löschen: ', + 'delc_descm' => 'Sie werden diese Kommentare löschen: ', + + // Manage comments page + 'man_searcht' => 'Einen Eintrag suchen', + 'man_searchd' => 'Fügen Sie die ID des Eintrags ein, dessen Kommentare Sie verwalten möchten.', + 'man_search' => 'Suche', + 'man_commfor' => 'Bemerkungen für %s', + 'man_spam' => 'Als Spam an Akismet melden', + + // The simple edit + 'simple_pre' => 'Die Kommentare zu diesem Eintrag ', + 'simple_1' => 'werden erlaubt.', + 'simple_0' => 'benötigen Ihre Zustimmung.', + 'simple_-1' => 'werden geblockt.', + 'simple_manage' => 'Verwalten Sie die Kommentare zu diesem Eintrag.', + 'simple_edit' => 'Richtlinien bearbeiten', + + // Akismet warnings + 'akismet_errors' => array( + -1 => 'Der Akismet-Schlüssel ist leer. Bitte geben Sie diesen ein.', + -2 => 'Wir konnten die Akismet-Server nicht erreichen.', + -3 => 'Die Reaktion von Akismet schlug fehl.', + -4 => 'Der Akismet-Schlüssel ist ungültig.' + ), + + // Messages + 'msgs' => array( + 1 => 'Konfiguration gespeichert.', + -1 => 'Beim Speichern der Konfiguration ist ein Fehler aufgetreten.', + + 2 => 'Richtlinie gespeichert.', + -2 => 'Beim Speichern der Richtlinie ist ein Fehler aufgetreten (vielleicht sind Ihre Einstellungen falsch).', + + 3 => 'Richtlinie verschoben.', + -3 => 'Beim Versuch, die Richtlinie zu verschieben, ist ein Fehler aufgetreten (oder sie kann nicht verschoben werden).', + + 4 => 'Richtlinie (n) entfernt.', + -4 => 'Beim Versuch, die Richtlinie (n) zu entfernen, ist ein Fehler aufgetreten (oder Sie haben keine Richtlinie ausgewählt).', + + 5 => 'Kommentar (e) veröffentlicht.', + -5 => 'Beim Versuch, die Kommentare zu veröffentlichen, ist ein Fehler aufgetreten.', + + 6 => 'Kommentar (e) entfernt.', + -6 => 'Beim Versuch, die Kommentare zu entfernen, ist ein Fehler aufgetreten (oder Sie haben keinen Kommentar ausgewählt).', + + 7 => 'Kommentar eingereicht.', + -7 => 'Beim Absenden des Kommentars ist ein Fehler aufgetreten.' + ), + + // Errors + 'errors' => array( + 'pol_nonex' => 'Die Richtlinie, die Sie bearbeiten möchten, existiert nicht.', + 'entry_nf' => 'Der gewählte Eintrag existiert nicht.' + ) +); +$lang ['plugin'] ['commentcenter'] = array( + 'akismet_error' => 'Sorry, wir stossen auf technische Schwierigkeiten.', + 'lock' => 'Dieser Eintrag kann leider nicht kommentiert werden.', + 'approvation' => 'Der Kommentar wurde gespeichert, aber der Administrator muss ihn freischalten, bevor er angezeigt wird.', + + // Mail for comments + 'mail_subj' => 'Neuer Kommentar zu genehmigen %s' +); + +$lang ['plugin'] ['commentcenter'] ['mail_text'] = 'Hallo %toname%, + +"%fromname%" %frommail% hat einen Kommentar zu dem Eintrag geschrieben mit dem Titel "%entrytitle%" +Aber dieser braucht deine Zustimmung, bevor dieser veröffentlicht wird. + +Folgendes wurde als Kommentar geschrieben: +__________________________________________ +%content% +__________________________________________ + +Automatisch generiert von +%blogtitle% + +'; From ff0f320e28cab5a527c29902df46ca7f795c06eb Mon Sep 17 00:00:00 2001 From: azett Date: Sun, 2 Oct 2022 15:06:39 +0200 Subject: [PATCH 26/27] changelog for #148 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7ef1b02..eb42af31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ - Fixed glitches in Spanish an Portuguese language files - Fixed wrong pt-br country code ([#100](https://github.com/flatpressblog/flatpress/issues/100)) - Search page: Month names displayed in configured frontend language ([#132](https://github.com/flatpressblog/flatpress/issues/132)) +- German translation for Comment Center plugin added ([#148](https://github.com/flatpressblog/flatpress/issues/148)) ## Other bugfixes - Plugin management page: Removed empty warning messages box From d88262ad9a2f619ffad41c594d496bab9b412dc0 Mon Sep 17 00:00:00 2001 From: Arvid Zimmermann Date: Thu, 6 Oct 2022 19:57:34 +0200 Subject: [PATCH 27/27] removed redundant social media links --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 45a9036f..df671ea9 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ [![Home page](https://img.shields.io/badge/Home%20page-🏠-555?style=plastic)](https://www.flatpress.org "Home page") [![Support forum](https://img.shields.io/badge/Support%20forum-💬-555?style=plastic)](https://forum.flatpress.org "Support forum") [![Wiki](https://img.shields.io/badge/Wiki-📖-555?style=plastic)](https://wiki.flatpress.org "Wiki") -[![Mastodon](https://img.shields.io/badge/Mastodon-🐘-555?style=plastic)](https://fosstodon.org/@flatpress "FlatPress@Mastodon") -[![Twitter](https://img.shields.io/badge/Twitter-🐦-555?style=plastic)](https://twitter.com/FlatPress "FlatPress@Twitter") [![Change log](https://img.shields.io/badge/Change%20log-📜-555?style=plastic)](./CHANGELOG.md "Change log") [![Security policy](https://img.shields.io/badge/Security%20policy-⚡-555?style=plastic)](./SECURITY.md "Security policy") [![Contributors](https://img.shields.io/badge/Contributors-😎-555?style=plastic)](./CONTRIBUTORS.md "Contributors")