From 5f77e98d76ca221170cdb3e63bea8a78ec55c66c Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 28 Jul 2018 01:24:26 +0200 Subject: [PATCH] Postupdate is now working again (#5512) * "post-type" replaces "bookmark" and "type" * Removed some more type * Added index to permission set * The permission set is now stored * The permission set is now removed upon expiry * Post update now stores the permission set * New file * Permissions are now sorted * The permission set is now used for item permissions * Check for allow_cid, ... is superfluous. Checking for "private" is enough * We query the permissionset * Permissions are displayed correctly * Changed index * We don't store the permissions in the item table anymore * Permission fields are now deprecated * Reversed ... * Postupdate now handles "postopts" as well * Set deprecated fields to "null" if empty * Postupdates are enabled again --- src/Database/PostUpdate.php | 70 ++++++++++++++++++++++++++++++++++++- src/Model/PermissionSet.php | 1 - src/Worker/CronJobs.php | 3 +- update.php | 12 +++++++ 4 files changed, 82 insertions(+), 4 deletions(-) diff --git a/src/Database/PostUpdate.php b/src/Database/PostUpdate.php index 3b78b94fc..1d85e5fad 100644 --- a/src/Database/PostUpdate.php +++ b/src/Database/PostUpdate.php @@ -238,7 +238,7 @@ class PostUpdate $fields = array_merge(Item::MIXED_CONTENT_FIELDLIST, ['network', 'author-id', 'owner-id', 'tag', 'file', 'author-name', 'author-avatar', 'author-link', 'owner-name', 'owner-avatar', 'owner-link', 'id', 'uid', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'psid', 'post-type', 'bookmark', 'type', - 'inform']); + 'inform', 'postopts', 'icid']); $start_id = $id; $rows = 0; @@ -265,6 +265,11 @@ class PostUpdate if (!is_null($item['allow_cid']) && !is_null($item['allow_gid']) && !is_null($item['deny_cid']) && !is_null($item['deny_gid'])) { $item['psid'] = PermissionSet::fetchIDForPost($item); + } else { + $item['allow_cid'] = null; + $item['allow_gid'] = null; + $item['deny_cid'] = null; + $item['deny_gid'] = null; } if ($item['post-type'] == 0) { @@ -277,6 +282,13 @@ class PostUpdate } } + self::createLanguage($item); + + if (!empty($item['icid']) && !empty($item['language'])) { + DBA::update('item-content', ['language' => $item['language']], ['id' => $item['icid']]); + } + unset($item['language']); + Item::update($item, ['id' => $id]); ++$rows; @@ -288,6 +300,20 @@ class PostUpdate logger("Processed rows: " . $rows . " - last processed item: " . $id, LOGGER_DEBUG); if ($start_id == $id) { + // Set all deprecated fields to "null" if they contain an empty string + $nullfields = ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'postopts', 'inform', 'type', + 'bookmark', 'file', 'location', 'coord', 'tag', 'plink', 'title', 'content-warning', + 'body', 'app', 'verb', 'object-type', 'object', 'target-type', 'target', + 'author-name', 'author-link', 'author-avatar', 'owner-name', 'owner-link', 'owner-avatar', + 'rendered-hash', 'rendered-html']; + foreach ($nullfields as $field) { + $fields = [$field => null]; + $condition = [$field => '']; + logger("Setting '" . $field . "' to null if empty.", LOGGER_DEBUG); + // Important: This has to be a "DBA::update", not a "Item::update" + DBA::update('item', $fields, $condition); + } + Config::set("system", "post_update_version", 1279); logger("Done", LOGGER_DEBUG); return true; @@ -295,4 +321,46 @@ class PostUpdate return false; } + + private static function createLanguage(&$item) + { + if (empty($item['postopts'])) { + return; + } + + $opts = explode(',', $item['postopts']); + + $postopts = []; + + foreach ($opts as $opt) { + if (strstr($opt, 'lang=')) { + $language = substr($opt, 5); + } else { + $postopts[] = $opt; + } + } + + if (empty($language)) { + return; + } + + if (!empty($postopts)) { + $item['postopts'] = implode(',', $postopts); + } else { + $item['postopts'] = null; + } + + $lang_pairs = explode(':', $language); + + $lang_arr = []; + + foreach ($lang_pairs as $pair) { + $lang_pair_arr = explode(';', $pair); + if (count($lang_pair_arr) == 2) { + $lang_arr[$lang_pair_arr[0]] = $lang_pair_arr[1]; + } + } + + $item['language'] = json_encode($lang_arr); + } } diff --git a/src/Model/PermissionSet.php b/src/Model/PermissionSet.php index 20848c04d..f83f9ccb5 100644 --- a/src/Model/PermissionSet.php +++ b/src/Model/PermissionSet.php @@ -41,7 +41,6 @@ class PermissionSet extends BaseObject $set = DBA::selectFirst('permissionset', ['id'], $condition); } - $postarray['allow_cid'] = null; $postarray['allow_gid'] = null; $postarray['deny_cid'] = null; diff --git a/src/Worker/CronJobs.php b/src/Worker/CronJobs.php index ca898f2b6..c54e74e38 100644 --- a/src/Worker/CronJobs.php +++ b/src/Worker/CronJobs.php @@ -35,8 +35,7 @@ class CronJobs // Call possible post update functions // see src/Database/PostUpdate.php for more details if ($command == 'post_update') { -// Post updates will be reenabled (hopefully in a few days) when most item works are done -// PostUpdate::update(); + PostUpdate::update(); return; } diff --git a/update.php b/update.php index 7bd02f966..47434b337 100644 --- a/update.php +++ b/update.php @@ -246,3 +246,15 @@ function update_1278() { return UPDATE_SUCCESS; } + +function update_1278() { + Config::set('system', 'maintenance', 1); + Config::set('system', 'maintenance_reason', L10n::t('%s: Updating post-type.', DBM::date().' '.date('e'))); + + Item::update(['post-type' => Item::PT_PAGE], ['bookmark' => true]); + Item::update(['post-type' => Item::PT_PERSONAL_NOTE], ['type' => 'note']); + + Config::set('system', 'maintenance', 0); + + return UPDATE_SUCCESS; +}