From a6ca0d7fe5da639bf6296e9ff881f9902a10ef8f Mon Sep 17 00:00:00 2001
From: onli <onli@paskuda.biz>
Date: Sun, 2 May 2021 12:43:26 +0200
Subject: [PATCH] PHP8 compat fixes for media library

---
 include/admin/images.inc.php        |  7 +++++
 include/functions_images.inc.php    | 47 +++++++++++++++++------------
 templates/2k11/admin/media_pane.tpl | 16 +++++-----
 3 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/include/admin/images.inc.php b/include/admin/images.inc.php
index 8fed051b..bd9fecf8 100644
--- a/include/admin/images.inc.php
+++ b/include/admin/images.inc.php
@@ -21,6 +21,13 @@ if (!is_array($serendipity['POST']) && $serendipity['GET']['adminAction'] == 'mu
     unset($serendipity['GET']['adminAction']);
 }
 
+if (empty($serendipity['GET']['toggle_dir']) && empty($serendipity['COOKIE']['serendipity_toggle_dir'])) {
+    $serendipity['GET']['toggle_dir'] = 'no'; // default
+}
+if (!empty($serendipity['COOKIE']['serendipity_toggle_dir'])) {
+    serendipity_restoreVar($serendipity['COOKIE']['serendipity_toggle_dir'], $serendipity['GET']['toggle_dir']);
+}
+
 $messages = array();
 
 // submitted media_upload.tpl: check for empty file field and redirect back to media_upload
diff --git a/include/functions_images.inc.php b/include/functions_images.inc.php
index 9b7f0bfc..81353044 100644
--- a/include/functions_images.inc.php
+++ b/include/functions_images.inc.php
@@ -169,7 +169,7 @@ function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total=null, $
     serendipity_plugin_api::hook_event('fetch_images_sql', $cond);
     serendipity_ACL_SQL($cond, false, 'directory');
 
-    if ($cond['joinparts']['keywords']) {
+    if ($cond['joinparts']['keywords'] ?? false) {
         $cond['joins'] .= "\n LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS mk
                                         ON (mk.mediaid = i.id AND mk.property_group = 'base_keyword')\n";
     }
@@ -183,17 +183,17 @@ function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total=null, $
         $cond['orderkey'] = "''";
     }
 
-    if ($cond['joinparts']['properties']) {
+    if ($cond['joinparts']['properties'] ?? false) {
         $cond['joins'] .= "\n LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS bp
                                         ON (bp.mediaid = i.id AND bp.property_group = 'base_property' AND bp.property = '{$cond['orderproperty']}')\n";
     }
 
-    if ($cond['joinparts']['filterproperties']) {
+    if ($cond['joinparts']['filterproperties'] ?? false) {
         $cond['joins'] .= "\n LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS bp2
                                         ON (bp2.mediaid = i.id AND bp2.property_group = 'base_property')\n";
     }
 
-    if ($cond['joinparts']['hiddenproperties']) {
+    if ($cond['joinparts']['hiddenproperties'] ?? false) {
         $cond['joins'] .= "\n LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS hp
                                         ON (hp.mediaid = i.id AND hp.property_group = 'base_hidden')\n";
     }
@@ -1570,7 +1570,7 @@ function serendipity_displayImageList($page = 0, $lineBreak = NULL, $manage = fa
             echo "<p>Image Sync Right: " . serendipity_checkPermission('adminImagesSync') . " Onthefly Sync: " . $serendipity['onTheFlySynch'] . " Hash: " . $serendipity['current_image_hash'] . "!=" . $serendipity['last_image_hash']. "</p>";
         }
 
-        if ($serendipity['onTheFlySynch'] && serendipity_checkPermission('adminImagesSync') && ($debug  || ($serendipity['current_image_hash'] != $serendipity['last_image_hash']))) {
+        if ($serendipity['onTheFlySynch'] && serendipity_checkPermission('adminImagesSync') && ($debug || ($serendipity['current_image_hash'] != ($serendipity['last_image_hash'] ?? null)))) {
             $aResultSet = serendipity_db_query("SELECT path, name, extension, thumbnail_name, id
                                                 FROM {$serendipity['dbPrefix']}images", false, 'assoc');
 
@@ -1709,7 +1709,7 @@ function serendipity_displayImageList($page = 0, $lineBreak = NULL, $manage = fa
     }
 
     $dprops = $keywords = array();
-    if ($serendipity['parseMediaOverview']) {
+    if ($serendipity['parseMediaOverview'] ?? false) {
         $ids = array();
         foreach ($serendipity['imageList'] AS $k => $file) {
             $ids[] = $file['id'];
@@ -1836,6 +1836,10 @@ function serendipity_isImage(&$file, $strict = false, $allowed = 'image/') {
 
     $file['displaymime'] = $file['mime'];
 
+    if (! isset($file['imgsrc'])) {
+        return false;
+    }
+
     // Strip HTTP path out of imgsrc
     $file['location'] = $serendipity['serendipityPath'] . preg_replace('@^(' . preg_quote($serendipity['serendipityHTTPPath']) . ')@i', '', $file['imgsrc']);
 
@@ -1952,7 +1956,7 @@ function serendipity_traversePath($basedir, $dir='', $onlyDirs = true, $pattern
     global $serendipity;
     
     if ($serendipity['useInternalCache']) {
-        $key = md5($basedir . $dir . $onlyDirs . $pattern . $depth . $max_depth . $apply_ACL . $aExcludeDirs . $serendipity['serendipityUser']);
+        $key = md5($basedir . $dir . $onlyDirs . $pattern . $depth . $max_depth . $apply_ACL . serialize($aExcludeDirs) . $serendipity['serendipityUser']);
         $files = serendipity_getCacheItem($key);
         if ($files && $files !== false) {
             return unserialize($files);
@@ -2139,13 +2143,14 @@ function serendipity_getimagesize($file, $ft_mime = '', $suf = '') {
 function serendipity_getImageFields() {
     global $serendipity;
 
-    if ($serendipity['simpleFilters'] !== false) {
+    if (($serendipity['simpleFilters'] ?? true) !== false) {
         $x = array(
             'i.date'              => array('desc' => SORT_ORDER_DATE,
                                          'type' => 'date'
                                    ),
 
-            'i.name'              => array('desc' => SORT_ORDER_NAME
+            'i.name'              => array('desc' => SORT_ORDER_NAME,
+                                        'type' => 'text'
                                    ),
 
         );
@@ -2156,14 +2161,16 @@ function serendipity_getImageFields() {
                                          'type' => 'date'
                                    ),
 
-            'i.name'              => array('desc' => SORT_ORDER_NAME
+            'i.name'              => array('desc' => SORT_ORDER_NAME,
+                                         'type' => 'text'
                                    ),
 
             'i.authorid'          => array('desc' => AUTHOR,
                                          'type' => 'authors'
                                    ),
 
-            'i.extension'         => array('desc' => SORT_ORDER_EXTENSION
+            'i.extension'         => array('desc' => SORT_ORDER_EXTENSION,
+                                        'type' => 'text'
                                    ),
 
             'i.size'              => array('desc' => SORT_ORDER_SIZE,
@@ -3234,7 +3241,7 @@ function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lin
 
     $form_hidden = '';
     // do not add, if not for the default media list form
-    if (($serendipity['GET']['adminAction'] == 'default' || empty($serendipity['GET']['adminAction'])) && !$serendipity['GET']['fid']) {
+    if (($serendipity['GET']['adminAction'] == 'default' || empty($serendipity['GET']['adminAction'])) && ! ($serendipity['GET']['fid'] ?? null)) {
         foreach($serendipity['GET'] AS $g_key => $g_val) {
             // do not add token, since this is assigned separately to properties and list forms
             if (!is_array($g_val) && $g_key != 'page' && $g_key != 'token') {
@@ -3247,8 +3254,6 @@ function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lin
         serendipity_smarty_init();
     }
     $order_fields = serendipity_getImageFields();
-    // reset filename for building template filters, since this is hardcoded as 'only_filename'
-    #unset($order_fields['i.name']);
 
     $media = array(
         'manage'            => $manage,
@@ -3272,11 +3277,11 @@ function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lin
         'only_path'         => $serendipity['GET']['only_path'],
         'only_filename'     => $serendipity['GET']['only_filename'],
         'sortorder'         => $serendipity['GET']['sortorder'],
-        'keywords_selected' => $serendipity['GET']['keywords'],
-        'filter'            => $serendipity['GET']['filter'],
+        'keywords_selected' => $serendipity['GET']['keywords'] ?? null,
+        'filter'            => $serendipity['GET']['filter'] ?? ['fileCategory' => null],
         'sort_order'        => $order_fields,
-        'simpleFilters'     => $serendipity['simpleFilters'],
-        'hideSubdirFiles'   => $serendipity['GET']['hideSubdirFiles'],
+        'simpleFilters'     => $serendipity['simpleFilters'] ?? true,
+        'hideSubdirFiles'   => $serendipity['GET']['hideSubdirFiles'] ?? null,
         'authors'           => serendipity_fetchUsers(),
         'sort_row_interval' => array(8, 16, 50, 100),
         'nr_files'          => count($file),
@@ -3756,7 +3761,11 @@ function showMediaLibrary($addvar_check = false, $smarty_vars = array()) {
         'filename_only' => isset($serendipity['GET']['filename_only']) ? $serendipity['GET']['filename_only'] : false,
     );
 
-    $show_upload = isset($serendipity['GET']['showUpload']) ? $serendipity['GET']['showUpload'] : false;
+    if (isset($serendipity['GET']['showUpload'])) {
+        $show_upload = $serendipity['GET']['showUpload'];
+    } else {
+        $show_upload = $serendipity['GET']['showUpload'] = false;
+    }
 
     $output .= serendipity_displayImageList(
         isset($serendipity['GET']['page']) ? $serendipity['GET']['page'] : 1,
diff --git a/templates/2k11/admin/media_pane.tpl b/templates/2k11/admin/media_pane.tpl
index 1c206dc8..554312e9 100644
--- a/templates/2k11/admin/media_pane.tpl
+++ b/templates/2k11/admin/media_pane.tpl
@@ -18,7 +18,7 @@
                 <div class="form_select">
                     <label for="serendipity_only_path" class="visuallyhidden">{$CONST.FILTER_DIRECTORY}</label>
                     <select id="serendipity_only_path" name="serendipity[only_path]">
-                        <option value="">{if NOT $media.limit_path}{if $media.toggle_dir == 'yes'}{$CONST.BASE_DIRECTORY}{else}{$CONST.ALL_DIRECTORIES}{/if}{else}{$media.blimit_path}{/if}</option>
+                        <option value="">{if NOT $media.limit_path}{if isset($media.toggle_dir) AND $media.toggle_dir == 'yes'}{$CONST.BASE_DIRECTORY}{else}{$CONST.ALL_DIRECTORIES}{/if}{else}{$media.blimit_path}{/if}</option>
                     {foreach $media.paths AS $folderHead}
 
                         <option{if ($media.only_path == $media.limit_path|cat:$folderHead.relpath)} selected{/if} value="{$folderHead.relpath}">{'&nbsp;'|str_repeat:($folderHead.depth*2)}{$folderHead.name}</option>
@@ -63,17 +63,17 @@
 
                         <div class="form_field">
                             <label for="serendipity_filter_{$filter@key}_from" class="range-label">{$CONST.RANGE_FROM|lower}</label>
-                            <input id="serendipity_filter_{$filter@key}_from" name="serendipity[filter][{$filter@key}][from]" type="date" placeholder="2001-01-31" value="{$media.filter[$filter@key].from|escape}">
+                            <input id="serendipity_filter_{$filter@key}_from" name="serendipity[filter][{$filter@key}][from]" type="date" placeholder="2001-01-31" value="{if isset($media.filter[$filter@key].from)}{$media.filter[$filter@key].from|escape}{/if}">
                             <label for="serendipity_filter_{$filter@key}_to" class="range-label">{$CONST.RANGE_TO|lower}</label>
-                            <input id="serendipity_filter_{$filter@key}_to" name="serendipity[filter][{$filter@key}][to]" type="date" placeholder="2005-12-31" value="{$media.filter[$filter@key].to|escape}">
+                            <input id="serendipity_filter_{$filter@key}_to" name="serendipity[filter][{$filter@key}][to]" type="date" placeholder="2005-12-31" value="{if isset($media.filter[$filter@key].to)}{$media.filter[$filter@key].to|escape}{/if}">
                         </div>
                 {elseif $filter.type == 'intrange'}
 
                         <div class="form_field">
                             <label for="serendipity_filter_{$filter@key}_from" class="range-label">{$CONST.RANGE_FROM|lower}</label>
-                            <input id="serendipity_filter_{$filter@key}_from" name="serendipity[filter][{$filter@key}][from]" type="text" placeholder="{if $filtername == 'bp.RUN_LENGTH'}in{/if}" value="{$media.filter[$filter@key].from|escape}">
+                            <input id="serendipity_filter_{$filter@key}_from" name="serendipity[filter][{$filter@key}][from]" type="text" placeholder="{if $filtername == 'bp.RUN_LENGTH'}in{/if}" value="{if isset($media.filter[$filter@key].from)}{$media.filter[$filter@key].from|escape}{/if}">
                             <label for="serendipity_filter_{$filter@key}_to" class="range-label">{$CONST.RANGE_TO|lower}</label>
-                            <input id="serendipity_filter_{$filter@key}_to" name="serendipity[filter][{$filter@key}][to]" type="text" placeholder="{if $filtername == 'bp.RUN_LENGTH'}seconds{/if}" value="{$media.filter[$filter@key].to|escape}">
+                            <input id="serendipity_filter_{$filter@key}_to" name="serendipity[filter][{$filter@key}][to]" type="text" placeholder="{if $filtername == 'bp.RUN_LENGTH'}seconds{/if}" value="{if isset($media.filter[$filter@key].to)}{$media.filter[$filter@key].to|escape}{/if}">
                         </div>
                 {elseif $filter.type == 'authors'}
 
@@ -81,13 +81,13 @@
                             <option value="">{$CONST.ALL_AUTHORS}</option>
                             {foreach $media.authors AS $media_author}
 
-                            <option value="{$media_author.authorid}"{if $media.filter[$filter@key] == $media_author.authorid} selected{/if}>{$media_author.realname|escape}</option>
+                            <option value="{$media_author.authorid}"{if isset($media.filter[$filter@key]) and $media.filter[$filter@key] == $media_author.authorid} selected{/if}>{$media_author.realname|escape}</option>
                             {/foreach}
 
                         </select>
                 {else}{* this is of type string w/o being named *}
                         {* label is already set on loop start, when type is not date or intrange *}
-                        <input id="serendipity_filter_{$filter@key}" name="serendipity[filter][{$filter@key}]" type="text" value="{$media.filter[$filter@key]|escape}">
+                        <input id="serendipity_filter_{$filter@key}" name="serendipity[filter][{$filter@key}]" type="text" value="{if isset($media.filter[$filter@key])}{$media.filter[$filter@key]|escape}{/if}">
                 {/if}
                 {if $filter.type == 'date' || $filter.type == 'intrange'}
 
@@ -182,10 +182,12 @@
 
                 serendipity.SetCookie("sortorder_{$sortParam}","{$media.sortorder.{$sortParam}}");
             {/foreach}
+            {if isset($media.filterParams)} 
             {foreach $media.filterParams AS $filterParam}
 
                 serendipity.SetCookie("{$filterParam}", "{$media.{$filterParam}}");
             {/foreach}
+            {/if}
 
                 serendipity.SetCookie("only_path", "{$media.only_path}");