diff --git a/bin/daemon.php b/bin/daemon.php index f0f5826d92..f628031c35 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -9,6 +9,7 @@ use Friendica\App; use Friendica\Core\Config; +use Friendica\Core\Logger; use Friendica\Core\Worker; use Friendica\Database\DBA; @@ -97,7 +98,7 @@ if ($mode == "stop") { unlink($pidfile); - logger("Worker daemon process $pid was killed.", LOGGER_DEBUG); + Logger::log("Worker daemon process $pid was killed.", Logger::DEBUG); Config::set('system', 'worker_daemon_mode', false); die("Worker daemon process $pid was killed.\n"); @@ -107,7 +108,7 @@ if (!empty($pid) && posix_kill($pid, 0)) { die("Daemon process $pid is already running.\n"); } -logger('Starting worker daemon.', LOGGER_DEBUG); +Logger::log('Starting worker daemon.', Logger::DEBUG); if (!$foreground) { echo "Starting worker daemon.\n"; @@ -155,7 +156,7 @@ $last_cron = 0; // Now running as a daemon. while (true) { if (!$do_cron && ($last_cron + $wait_interval) < time()) { - logger('Forcing cron worker call.', LOGGER_DEBUG); + Logger::log('Forcing cron worker call.', Logger::DEBUG); $do_cron = true; } @@ -169,7 +170,7 @@ while (true) { $last_cron = time(); } - logger("Sleeping", LOGGER_DEBUG); + Logger::log("Sleeping", Logger::DEBUG); $start = time(); do { $seconds = (time() - $start); @@ -186,10 +187,10 @@ while (true) { if ($timeout) { $do_cron = true; - logger("Woke up after $wait_interval seconds.", LOGGER_DEBUG); + Logger::log("Woke up after $wait_interval seconds.", Logger::DEBUG); } else { $do_cron = false; - logger("Worker jobs are calling to be forked.", LOGGER_DEBUG); + Logger::log("Worker jobs are calling to be forked.", Logger::DEBUG); } } diff --git a/bin/worker.php b/bin/worker.php index d5cd1f6b4b..9ae2f68b3e 100755 --- a/bin/worker.php +++ b/bin/worker.php @@ -7,6 +7,7 @@ use Friendica\App; use Friendica\Core\Config; use Friendica\Core\Worker; +use Friendica\Core\Update; // Get options $shortopts = 'sn'; @@ -30,7 +31,7 @@ require_once "boot.php"; $a = new App(dirname(__DIR__)); // Check the database structure and possibly fixes it -check_db(true); +Update::check(true); // Quit when in maintenance if (!$a->getMode()->has(App\Mode::MAINTENANCEDISABLED)) { diff --git a/boot.php b/boot.php index 6b66625c6c..a94b380387 100644 --- a/boot.php +++ b/boot.php @@ -28,9 +28,9 @@ use Friendica\Core\L10n; use Friendica\Core\PConfig; use Friendica\Core\Protocol; use Friendica\Core\System; +use Friendica\Core\Update; use Friendica\Core\Worker; use Friendica\Database\DBA; -use Friendica\Database\DBStructure; use Friendica\Model\Contact; use Friendica\Model\Conversation; use Friendica\Util\DateTimeFormat; @@ -43,13 +43,6 @@ define('FRIENDICA_VERSION', '2018.12-dev'); define('DFRN_PROTOCOL_VERSION', '2.23'); define('NEW_UPDATE_ROUTINE_VERSION', 1170); -/** - * @brief Constants for the database update check - */ -const DB_UPDATE_NOT_CHECKED = 0; // Database check wasn't executed before -const DB_UPDATE_SUCCESSFUL = 1; // Database check was successful -const DB_UPDATE_FAILED = 2; // Database check failed - /** * @brief Constant with a HTML line break. * @@ -106,20 +99,6 @@ define('SSL_POLICY_FULL', 1); define('SSL_POLICY_SELFSIGN', 2); /* @}*/ -/** - * @name Logger - * - * log levels - * @{ - */ -define('LOGGER_WARNING', 0); -define('LOGGER_INFO', 1); -define('LOGGER_TRACE', 2); -define('LOGGER_DEBUG', 3); -define('LOGGER_DATA', 4); -define('LOGGER_ALL', 5); -/* @}*/ - /** * @name Register * @@ -133,18 +112,6 @@ define('REGISTER_OPEN', 2); * @} */ -/** - * @name Update - * - * DB update return values - * @{ - */ -define('UPDATE_SUCCESS', 0); -define('UPDATE_FAILED', 1); -/** - * @} - */ - /** * @name CP * @@ -446,143 +413,6 @@ function defaults() { return $return; } -/** - * @brief Function to check if request was an AJAX (xmlhttprequest) request. - * - * @param boolean $via_worker boolean Is the check run via the worker? - */ -function check_db($via_worker) -{ - $build = Config::get('system', 'build'); - - if (empty($build)) { - Config::set('system', 'build', DB_UPDATE_VERSION - 1); - $build = DB_UPDATE_VERSION - 1; - } - - // We don't support upgrading from very old versions anymore - if ($build < NEW_UPDATE_ROUTINE_VERSION) { - die('You try to update from a version prior to database version 1170. The direct upgrade path is not supported. Please update to version 3.5.4 before updating to this version.'); - } - - if ($build < DB_UPDATE_VERSION) { - // When we cannot execute the database update via the worker, we will do it directly - if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) { - update_db(); - } - } -} - -/** - * @brief Automatic database updates - * @param object $a App - */ -function update_db() -{ - $build = Config::get('system', 'build'); - - if (empty($build) || ($build > DB_UPDATE_VERSION)) { - $build = DB_UPDATE_VERSION - 1; - Config::set('system', 'build', $build); - } - - if ($build != DB_UPDATE_VERSION) { - require_once 'update.php'; - - $stored = intval($build); - $current = intval(DB_UPDATE_VERSION); - if ($stored < $current) { - Config::load('database'); - - // Compare the current structure with the defined structure - $t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION); - if (!is_null($t)) { - return; - } - - // run the pre_update_nnnn functions in update.php - for ($x = $stored + 1; $x <= $current; $x++) { - $r = run_update_function($x, 'pre_update'); - if (!$r) { - break; - } - } - - Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time()); - - // update the structure in one call - $retval = DBStructure::update(false, true); - if ($retval) { - DBStructure::updateFail( - DB_UPDATE_VERSION, - $retval - ); - return; - } else { - Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success'); - } - - // run the update_nnnn functions in update.php - for ($x = $stored + 1; $x <= $current; $x++) { - $r = run_update_function($x, 'update'); - if (!$r) { - break; - } - } - } - } - - return; -} - -function run_update_function($x, $prefix) -{ - $funcname = $prefix . '_' . $x; - - if (function_exists($funcname)) { - // There could be a lot of processes running or about to run. - // We want exactly one process to run the update command. - // So store the fact that we're taking responsibility - // after first checking to see if somebody else already has. - // If the update fails or times-out completely you may need to - // delete the config entry to try again. - - $t = Config::get('database', $funcname); - if (!is_null($t)) { - return false; - } - Config::set('database', $funcname, time()); - - // call the specific update - $retval = $funcname(); - - if ($retval) { - //send the administrator an e-mail - DBStructure::updateFail( - $x, - L10n::t('Update %s failed. See error logs.', $x) - ); - return false; - } else { - Config::set('database', $funcname, 'success'); - - if ($prefix == 'update') { - Config::set('system', 'build', $x); - } - - return true; - } - } else { - Config::set('database', $funcname, 'success'); - - if ($prefix == 'update') { - Config::set('system', 'build', $x); - } - - return true; - } -} - /** * @brief Used to end the current process, after saving session state. * @deprecated diff --git a/doc/Addons.md b/doc/Addons.md index f7dfcc870c..50febf7214 100644 --- a/doc/Addons.md +++ b/doc/Addons.md @@ -160,11 +160,11 @@ In your code, like in the function addon_name_content(), load the template file ```php # load template file. first argument is the template name, # second is the addon path relative to friendica top folder -$tpl = get_markup_template('mytemplate.tpl', 'addon/addon_name/'); +$tpl = Renderer::getMarkupTemplate('mytemplate.tpl', 'addon/addon_name/'); # apply template. first argument is the loaded template, # second an array of 'name' => 'values' to pass to template -$output = replace_macros($tpl, array( +$output = Renderer::replaceMacros($tpl, array( 'title' => 'My beautiful addon', )); ``` diff --git a/doc/smarty3-templates.md b/doc/smarty3-templates.md index d44f263255..599e3597e7 100644 --- a/doc/smarty3-templates.md +++ b/doc/smarty3-templates.md @@ -20,10 +20,10 @@ Templates that are only used by addons shall be placed in the directory. -To render a template use the function *get_markup_template* to load the template and *replace_macros* to replace the macros/variables in the just loaded template file. +To render a template use the function *getMarkupTemplate* to load the template and *replaceMacros* to replace the macros/variables in the just loaded template file. - $tpl = get_markup_template('install_settings.tpl'); - $o .= replace_macros($tpl, array( ... )); + $tpl = Renderer::getMarkupTemplate('install_settings.tpl'); + $o .= Renderer::replaceMacros($tpl, array( ... )); the array consists of an association of an identifier and the value for that identifier, i.e. diff --git a/include/api.php b/include/api.php index 86f2e3b2a4..246a716fac 100644 --- a/include/api.php +++ b/include/api.php @@ -15,6 +15,7 @@ use Friendica\Core\Addon; use Friendica\Core\Authentication; use Friendica\Core\Config; use Friendica\Core\L10n; +use Friendica\Core\Logger; use Friendica\Core\NotificationsManager; use Friendica\Core\PConfig; use Friendica\Core\Protocol; @@ -96,9 +97,9 @@ function api_source() return "Twidere"; } - logger("Unrecognized user-agent ".$_SERVER['HTTP_USER_AGENT'], LOGGER_DEBUG); + Logger::log("Unrecognized user-agent ".$_SERVER['HTTP_USER_AGENT'], Logger::DEBUG); } else { - logger("Empty user-agent", LOGGER_DEBUG); + Logger::log("Empty user-agent", Logger::DEBUG); } return "api"; @@ -180,7 +181,7 @@ function api_login(App $a) var_dump($consumer, $token); die(); } catch (Exception $e) { - logger($e); + Logger::log($e); } // workaround for HTTP-auth in CGI mode @@ -194,7 +195,7 @@ function api_login(App $a) } if (!x($_SERVER, 'PHP_AUTH_USER')) { - logger('API_login: ' . print_r($_SERVER, true), LOGGER_DEBUG); + Logger::log('API_login: ' . print_r($_SERVER, true), Logger::DEBUG); header('WWW-Authenticate: Basic realm="Friendica"'); throw new UnauthorizedException("This API requires login"); } @@ -235,7 +236,7 @@ function api_login(App $a) } if (!DBA::isResult($record)) { - logger('API_login failure: ' . print_r($_SERVER, true), LOGGER_DEBUG); + Logger::log('API_login failure: ' . print_r($_SERVER, true), Logger::DEBUG); header('WWW-Authenticate: Basic realm="Friendica"'); //header('HTTP/1.0 401 Unauthorized'); //die('This api requires login'); @@ -308,19 +309,19 @@ function api_call(App $a) api_login($a); } - logger('API call for ' . $a->user['username'] . ': ' . $a->query_string); - logger('API parameters: ' . print_r($_REQUEST, true)); + Logger::log('API call for ' . $a->user['username'] . ': ' . $a->query_string); + Logger::log('API parameters: ' . print_r($_REQUEST, true)); $stamp = microtime(true); $return = call_user_func($info['func'], $type); $duration = (float) (microtime(true) - $stamp); - logger("API call duration: " . round($duration, 2) . "\t" . $a->query_string, LOGGER_DEBUG); + Logger::log("API call duration: " . round($duration, 2) . "\t" . $a->query_string, Logger::DEBUG); if (Config::get("system", "profiler")) { $duration = microtime(true)-$a->performance["start"]; /// @TODO round() really everywhere? - logger( + Logger::log( parse_url($a->query_string, PHP_URL_PATH) . ": " . sprintf( "Database: %s/%s, Cache %s/%s, Network: %s, I/O: %s, Other: %s, Total: %s", round($a->performance["database"] - $a->performance["database_write"], 3), @@ -334,7 +335,7 @@ function api_call(App $a) + $a->performance["network"] + $a->performance["file"]), 2), round($duration, 2) ), - LOGGER_DEBUG + Logger::DEBUG ); if (Config::get("rendertime", "callstack")) { @@ -375,7 +376,7 @@ function api_call(App $a) $o .= $func . ": " . $time . "\n"; } } - logger($o, LOGGER_DEBUG); + Logger::log($o, Logger::DEBUG); } } @@ -412,7 +413,7 @@ function api_call(App $a) } } - logger('API call not implemented: ' . $a->query_string); + Logger::log('API call not implemented: ' . $a->query_string); throw new NotImplementedException(); } catch (HTTPException $e) { header("HTTP/1.1 {$e->httpcode} {$e->httpdesc}"); @@ -521,7 +522,7 @@ function api_get_user(App $a, $contact_id = null) $extra_query = ""; $url = ""; - logger("api_get_user: Fetching user data for user ".$contact_id, LOGGER_DEBUG); + Logger::log("api_get_user: Fetching user data for user ".$contact_id, Logger::DEBUG); // Searching for contact URL if (!is_null($contact_id) && (intval($contact_id) == 0)) { @@ -605,7 +606,7 @@ function api_get_user(App $a, $contact_id = null) } } - logger("api_get_user: user ".$user, LOGGER_DEBUG); + Logger::log("api_get_user: user ".$user, Logger::DEBUG); if (!$user) { if (api_user() === false) { @@ -617,7 +618,7 @@ function api_get_user(App $a, $contact_id = null) } } - logger('api_user: ' . $extra_query . ', user: ' . $user); + Logger::log('api_user: ' . $extra_query . ', user: ' . $user); // user info $uinfo = q( @@ -1033,7 +1034,7 @@ function api_statuses_mediap($type) $a = get_app(); if (api_user() === false) { - logger('api_statuses_update: no user'); + Logger::log('api_statuses_update: no user'); throw new ForbiddenException(); } $user_info = api_get_user($a); @@ -1081,7 +1082,7 @@ function api_statuses_update($type) $a = get_app(); if (api_user() === false) { - logger('api_statuses_update: no user'); + Logger::log('api_statuses_update: no user'); throw new ForbiddenException(); } @@ -1135,7 +1136,7 @@ function api_statuses_update($type) $posts_day = DBA::count('thread', $condition); if ($posts_day > $throttle_day) { - logger('Daily posting limit reached for user '.api_user(), LOGGER_DEBUG); + Logger::log('Daily posting limit reached for user '.api_user(), Logger::DEBUG); // die(api_error($type, L10n::t("Daily posting limit of %d posts reached. The post was rejected.", $throttle_day)); throw new TooManyRequestsException(L10n::tt("Daily posting limit of %d post reached. The post was rejected.", "Daily posting limit of %d posts reached. The post was rejected.", $throttle_day)); } @@ -1149,7 +1150,7 @@ function api_statuses_update($type) $posts_week = DBA::count('thread', $condition); if ($posts_week > $throttle_week) { - logger('Weekly posting limit reached for user '.api_user(), LOGGER_DEBUG); + Logger::log('Weekly posting limit reached for user '.api_user(), Logger::DEBUG); // die(api_error($type, L10n::t("Weekly posting limit of %d posts reached. The post was rejected.", $throttle_week))); throw new TooManyRequestsException(L10n::tt("Weekly posting limit of %d post reached. The post was rejected.", "Weekly posting limit of %d posts reached. The post was rejected.", $throttle_week)); } @@ -1163,7 +1164,7 @@ function api_statuses_update($type) $posts_month = DBA::count('thread', $condition); if ($posts_month > $throttle_month) { - logger('Monthly posting limit reached for user '.api_user(), LOGGER_DEBUG); + Logger::log('Monthly posting limit reached for user '.api_user(), Logger::DEBUG); // die(api_error($type, L10n::t("Monthly posting limit of %d posts reached. The post was rejected.", $throttle_month)); throw new TooManyRequestsException(L10n::t("Monthly posting limit of %d post reached. The post was rejected.", "Monthly posting limit of %d posts reached. The post was rejected.", $throttle_month)); } @@ -1223,7 +1224,7 @@ function api_media_upload() $a = get_app(); if (api_user() === false) { - logger('no user'); + Logger::log('no user'); throw new ForbiddenException(); } @@ -1248,7 +1249,7 @@ function api_media_upload() "h" => $media["height"], "image_type" => $media["type"]]; - logger("Media uploaded: " . print_r($returndata, true), LOGGER_DEBUG); + Logger::log("Media uploaded: " . print_r($returndata, true), Logger::DEBUG); return ["media" => $returndata]; } @@ -1268,7 +1269,7 @@ function api_status_show($type, $item_id = 0) $user_info = api_get_user($a); - logger('api_status_show: user_info: '.print_r($user_info, true), LOGGER_DEBUG); + Logger::log('api_status_show: user_info: '.print_r($user_info, true), Logger::DEBUG); if ($type == "raw") { $privacy_sql = "AND NOT `private`"; @@ -1344,7 +1345,7 @@ function api_status_show($type, $item_id = 0) unset($status_info["user"]["uid"]); unset($status_info["user"]["self"]); - logger('status_info: '.print_r($status_info, true), LOGGER_DEBUG); + Logger::log('status_info: '.print_r($status_info, true), Logger::DEBUG); if ($type == "raw") { return $status_info; @@ -1824,7 +1825,7 @@ function api_statuses_show($type) $id = intval(defaults($a->argv, 4, 0)); } - logger('API: api_statuses_show: ' . $id); + Logger::log('API: api_statuses_show: ' . $id); $conversation = !empty($_REQUEST['conversation']); @@ -1906,7 +1907,7 @@ function api_conversation_show($type) $id = intval(defaults($a->argv, 4, 0)); } - logger('API: api_conversation_show: '.$id); + Logger::log('API: api_conversation_show: '.$id); // try to fetch the item for the local user - or the public item, if there is no local one $item = Item::selectFirst(['parent-uri'], ['id' => $id]); @@ -1977,7 +1978,7 @@ function api_statuses_repeat($type) $id = intval(defaults($a->argv, 4, 0)); } - logger('API: api_statuses_repeat: '.$id); + Logger::log('API: api_statuses_repeat: '.$id); $fields = ['body', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink']; $item = Item::selectFirst($fields, ['id' => $id, 'private' => false]); @@ -2042,7 +2043,7 @@ function api_statuses_destroy($type) $id = intval(defaults($a->argv, 4, 0)); } - logger('API: api_statuses_destroy: '.$id); + Logger::log('API: api_statuses_destroy: '.$id); $ret = api_statuses_show($type); @@ -2137,11 +2138,11 @@ function api_statuses_user_timeline($type) throw new ForbiddenException(); } - logger( + Logger::log( "api_statuses_user_timeline: api_user: ". api_user() . "\nuser_info: ".print_r($user_info, true) . "\n_REQUEST: ".print_r($_REQUEST, true), - LOGGER_DEBUG + Logger::DEBUG ); $since_id = x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0; @@ -2294,7 +2295,7 @@ function api_favorites($type) // in friendica starred item are private // return favorites only for self - logger('api_favorites: self:' . $user_info['self']); + Logger::log('api_favorites: self:' . $user_info['self']); if ($user_info['self'] == 0) { $ret = []; @@ -3649,7 +3650,7 @@ function api_friendships_destroy($type) $contact_id = defaults($_REQUEST, 'user_id'); if (empty($contact_id)) { - logger("No user_id specified", LOGGER_DEBUG); + Logger::log("No user_id specified", Logger::DEBUG); throw new BadRequestException("no user_id specified"); } @@ -3657,7 +3658,7 @@ function api_friendships_destroy($type) $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => 0, 'self' => false]); if(!DBA::isResult($contact)) { - logger("No contact found for ID" . $contact_id, LOGGER_DEBUG); + Logger::log("No contact found for ID" . $contact_id, Logger::DEBUG); throw new NotFoundException("no contact found to given ID"); } @@ -3669,12 +3670,12 @@ function api_friendships_destroy($type) $contact = DBA::selectFirst('contact', [], $condition); if (!DBA::isResult($contact)) { - logger("Not following Contact", LOGGER_DEBUG); + Logger::log("Not following Contact", Logger::DEBUG); throw new NotFoundException("Not following Contact"); } if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { - logger("Not supported", LOGGER_DEBUG); + Logger::log("Not supported", Logger::DEBUG); throw new ExpectationFailedException("Not supported"); } @@ -3685,7 +3686,7 @@ function api_friendships_destroy($type) Contact::terminateFriendship($owner, $contact, $dissolve); } else { - logger("No owner found", LOGGER_DEBUG); + Logger::log("No owner found", Logger::DEBUG); throw new NotFoundException("Error Processing Request"); } @@ -4485,10 +4486,10 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ if ($imagedata) { $filetype = $imagedata['mime']; } - logger( + Logger::log( "File upload src: " . $src . " - filename: " . $filename . " - size: " . $filesize . " - type: " . $filetype, - LOGGER_DEBUG + Logger::DEBUG ); // check if there was a php upload error @@ -4520,7 +4521,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ } if ($max_length > 0) { $Image->scaleDown($max_length); - logger("File upload: Scaling picture to new size " . $max_length, LOGGER_DEBUG); + Logger::log("File upload: Scaling picture to new size " . $max_length, Logger::DEBUG); } $width = $Image->getWidth(); $height = $Image->getHeight(); @@ -4530,17 +4531,17 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ if ($mediatype == "photo") { // upload normal image (scales 0, 1, 2) - logger("photo upload: starting new photo upload", LOGGER_DEBUG); + Logger::log("photo upload: starting new photo upload", Logger::DEBUG); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 0, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); if (!$r) { - logger("photo upload: image upload with scale 0 (original size) failed"); + Logger::log("photo upload: image upload with scale 0 (original size) failed"); } if ($width > 640 || $height > 640) { $Image->scaleDown(640); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 1, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); if (!$r) { - logger("photo upload: image upload with scale 1 (640x640) failed"); + Logger::log("photo upload: image upload with scale 1 (640x640) failed"); } } @@ -4548,19 +4549,19 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ $Image->scaleDown(320); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 2, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); if (!$r) { - logger("photo upload: image upload with scale 2 (320x320) failed"); + Logger::log("photo upload: image upload with scale 2 (320x320) failed"); } } - logger("photo upload: new photo upload ended", LOGGER_DEBUG); + Logger::log("photo upload: new photo upload ended", Logger::DEBUG); } elseif ($mediatype == "profileimage") { // upload profile image (scales 4, 5, 6) - logger("photo upload: starting new profile image upload", LOGGER_DEBUG); + Logger::log("photo upload: starting new profile image upload", Logger::DEBUG); if ($width > 300 || $height > 300) { $Image->scaleDown(300); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 4, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); if (!$r) { - logger("photo upload: profile image upload with scale 4 (300x300) failed"); + Logger::log("photo upload: profile image upload with scale 4 (300x300) failed"); } } @@ -4568,7 +4569,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ $Image->scaleDown(80); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 5, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); if (!$r) { - logger("photo upload: profile image upload with scale 5 (80x80) failed"); + Logger::log("photo upload: profile image upload with scale 5 (80x80) failed"); } } @@ -4576,11 +4577,11 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ $Image->scaleDown(48); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 6, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); if (!$r) { - logger("photo upload: profile image upload with scale 6 (48x48) failed"); + Logger::log("photo upload: profile image upload with scale 6 (48x48) failed"); } } $Image->__destruct(); - logger("photo upload: new profile image upload ended", LOGGER_DEBUG); + Logger::log("photo upload: new profile image upload ended", Logger::DEBUG); } if (isset($r) && $r) { @@ -4807,7 +4808,7 @@ function api_friendica_remoteauth() 'sec' => $sec, 'expire' => time() + 45]; DBA::insert('profile_check', $fields); - logger($contact['name'] . ' ' . $sec, LOGGER_DEBUG); + Logger::log($contact['name'] . ' ' . $sec, Logger::DEBUG); $dest = ($url ? '&destination_url=' . $url : ''); System::externalRedirect( @@ -5055,7 +5056,7 @@ function api_in_reply_to($item) // https://github.com/friendica/friendica/issues/1010 // This is a bugfix for that. if (intval($in_reply_to['status_id']) == intval($item['id'])) { - logger('this message should never appear: id: '.$item['id'].' similar to reply-to: '.$in_reply_to['status_id'], LOGGER_DEBUG); + Logger::log('this message should never appear: id: '.$item['id'].' similar to reply-to: '.$in_reply_to['status_id'], Logger::DEBUG); $in_reply_to['status_id'] = null; $in_reply_to['user_id'] = null; $in_reply_to['status_id_str'] = null; diff --git a/include/conversation.php b/include/conversation.php index 27cbd4289b..c1d428f244 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -11,8 +11,10 @@ use Friendica\Content\Text\BBCode; use Friendica\Core\Addon; use Friendica\Core\Config; use Friendica\Core\L10n; +use Friendica\Core\Logger; use Friendica\Core\PConfig; use Friendica\Core\Protocol; +use Friendica\Core\Renderer; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Model\Contact; @@ -552,7 +554,7 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ $threads = []; $threadsid = -1; - $page_template = get_markup_template("conversation.tpl"); + $page_template = Renderer::getMarkupTemplate("conversation.tpl"); if (!empty($items)) { if (in_array($mode, ['community', 'contacts'])) { @@ -711,7 +713,7 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ } } else { // Normal View - $page_template = get_markup_template("threaded_conversation.tpl"); + $page_template = Renderer::getMarkupTemplate("threaded_conversation.tpl"); $conv = new Thread($mode, $preview, $writable); @@ -751,13 +753,13 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ $threads = $conv->getTemplateData($conv_responses); if (!$threads) { - logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG); + Logger::log('[ERROR] conversation : Failed to get template data.', Logger::DEBUG); $threads = []; } } } - $o = replace_macros($page_template, [ + $o = Renderer::replaceMacros($page_template, [ '$baseurl' => System::baseUrl($ssl_state), '$return_path' => $a->query_string, '$live_update' => $live_update_div, @@ -1061,7 +1063,7 @@ function format_like($cnt, array $arr, $type, $id) { } $phrase .= EOL ; - $o .= replace_macros(get_markup_template('voting_fakelink.tpl'), [ + $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [ '$phrase' => $phrase, '$type' => $type, '$id' => $id @@ -1075,10 +1077,10 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { $o = ''; - $geotag = x($x, 'allow_location') ? replace_macros(get_markup_template('jot_geotag.tpl'), []) : ''; + $geotag = x($x, 'allow_location') ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : ''; - $tpl = get_markup_template('jot-header.tpl'); - $a->page['htmlhead'] .= replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate('jot-header.tpl'); + $a->page['htmlhead'] .= Renderer::replaceMacros($tpl, [ '$newpost' => 'true', '$baseurl' => System::baseUrl(true), '$geotag' => $geotag, @@ -1116,10 +1118,10 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) $public_post_link = '&public=1'; } - // $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins)); - $tpl = get_markup_template("jot.tpl"); + // $tpl = Renderer::replaceMacros($tpl,array('$jotplugins' => $jotplugins)); + $tpl = Renderer::getMarkupTemplate("jot.tpl"); - $o .= replace_macros($tpl,[ + $o .= Renderer::replaceMacros($tpl,[ '$new_post' => L10n::t('New Post'), '$return_path' => $query_str, '$action' => 'item', diff --git a/include/enotify.php b/include/enotify.php index 5665f485f4..339e31a3c8 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -7,6 +7,8 @@ use Friendica\Content\Text\BBCode; use Friendica\Core\Addon; use Friendica\Core\Config; use Friendica\Core\L10n; +use Friendica\Core\Logger; +use Friendica\Core\Renderer; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Model\Contact; @@ -29,7 +31,7 @@ function notification($params) // Temporary logging for finding the origin if (!isset($params['language']) || !isset($params['uid'])) { - logger('Missing parameters.' . System::callstack()); + Logger::log('Missing parameters.' . System::callstack()); } // Ensure that the important fields are set at any time @@ -37,7 +39,7 @@ function notification($params) $user = DBA::selectFirst('user', $fields, ['uid' => $params['uid']]); if (!DBA::isResult($user)) { - logger('Unknown user ' . $params['uid']); + Logger::log('Unknown user ' . $params['uid']); return; } @@ -133,7 +135,7 @@ function notification($params) if ($params['type'] == NOTIFY_COMMENT) { $thread = Item::selectFirstThreadForUser($params['uid'] ,['ignored'], ['iid' => $parent_id]); if (DBA::isResult($thread) && $thread["ignored"]) { - logger("Thread ".$parent_id." will be ignored", LOGGER_DEBUG); + Logger::log("Thread ".$parent_id." will be ignored", Logger::DEBUG); L10n::popLang(); return; } @@ -452,7 +454,7 @@ function notification($params) $itemlink = $h['itemlink']; if ($show_in_notification_page) { - logger("adding notification entry", LOGGER_DEBUG); + Logger::log("adding notification entry", Logger::DEBUG); do { $dups = false; $hash = random_string(); @@ -516,7 +518,7 @@ function notification($params) } $itemlink = System::baseUrl().'/notify/view/'.$notify_id; - $msg = replace_macros($epreamble, ['$itemlink' => $itemlink]); + $msg = Renderer::replaceMacros($epreamble, ['$itemlink' => $itemlink]); $msg_cache = format_notification_message($datarray['name_cache'], strip_tags(BBCode::convert($msg))); $fields = ['msg' => $msg, 'msg_cache' => $msg_cache]; @@ -529,14 +531,14 @@ function notification($params) || $params['type'] == NOTIFY_SYSTEM || $params['type'] == SYSTEM_EMAIL) { - logger('sending notification email'); + Logger::log('sending notification email'); if (isset($params['parent']) && (intval($params['parent']) != 0)) { $id_for_parent = $params['parent']."@".$hostname; // Is this the first email notification for this parent item and user? if (!DBA::exists('notify-threads', ['master-parent-item' => $params['parent'], 'receiver-uid' => $params['uid']])) { - logger("notify_id:".intval($notify_id).", parent: ".intval($params['parent'])."uid: ".intval($params['uid']), LOGGER_DEBUG); + Logger::log("notify_id:".intval($notify_id).", parent: ".intval($params['parent'])."uid: ".intval($params['uid']), Logger::DEBUG); $fields = ['notify-id' => $notify_id, 'master-parent-item' => $params['parent'], 'receiver-uid' => $params['uid'], 'parent-item' => 0]; @@ -545,11 +547,11 @@ function notification($params) $additional_mail_header .= "Message-ID: <${id_for_parent}>\n"; $log_msg = "include/enotify: No previous notification found for this parent:\n". " parent: ${params['parent']}\n"." uid : ${params['uid']}\n"; - logger($log_msg, LOGGER_DEBUG); + Logger::log($log_msg, Logger::DEBUG); } else { // If not, just "follow" the thread. $additional_mail_header .= "References: <${id_for_parent}>\nIn-Reply-To: <${id_for_parent}>\n"; - logger("There's already a notification for this parent.", LOGGER_DEBUG); + Logger::log("There's already a notification for this parent.", Logger::DEBUG); } } @@ -588,8 +590,8 @@ function notification($params) $content_allowed = ((!Config::get('system', 'enotify_no_content')) || ($params['type'] == SYSTEM_EMAIL)); // load the template for private message notifications - $tpl = get_markup_template('email_notify_html.tpl'); - $email_html_body = replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate('email_notify_html.tpl'); + $email_html_body = Renderer::replaceMacros($tpl, [ '$banner' => $datarray['banner'], '$product' => $datarray['product'], '$preamble' => str_replace("\n", "
\n", $datarray['preamble']), @@ -609,8 +611,8 @@ function notification($params) ]); // load the template for private message notifications - $tpl = get_markup_template('email_notify_text.tpl'); - $email_text_body = replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate('email_notify_text.tpl'); + $email_text_body = Renderer::replaceMacros($tpl, [ '$banner' => $datarray['banner'], '$product' => $datarray['product'], '$preamble' => $datarray['preamble'], diff --git a/include/items.php b/include/items.php index 54ae7a82ce..961a20b240 100644 --- a/include/items.php +++ b/include/items.php @@ -8,8 +8,10 @@ use Friendica\Content\Feature; use Friendica\Core\Addon; use Friendica\Core\Config; use Friendica\Core\L10n; +use Friendica\Core\Logger; use Friendica\Core\PConfig; use Friendica\Core\Protocol; +use Friendica\Core\Renderer; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Model\Item; @@ -109,7 +111,7 @@ function query_page_info($url, $photo = "", $keywords = false, $keyword_blacklis $data["images"][0]["src"] = $photo; } - logger('fetch page info for ' . $url . ' ' . print_r($data, true), LOGGER_DEBUG); + Logger::log('fetch page info for ' . $url . ' ' . print_r($data, true), Logger::DEBUG); if (!$keywords && isset($data["keywords"])) { unset($data["keywords"]); @@ -167,7 +169,7 @@ function add_page_info($url, $no_photos = false, $photo = "", $keywords = false, function add_page_info_to_body($body, $texturl = false, $no_photos = false) { - logger('add_page_info_to_body: fetch page info for body ' . $body, LOGGER_DEBUG); + Logger::log('add_page_info_to_body: fetch page info for body ' . $body, Logger::DEBUG); $URLSearchString = "^\[\]"; @@ -251,7 +253,7 @@ function consume_feed($xml, array $importer, array $contact, &$hub, $datedir = 0 // Test - remove before flight //$tempfile = tempnam(get_temppath(), "ostatus2"); //file_put_contents($tempfile, $xml); - logger("Consume OStatus messages ", LOGGER_DEBUG); + Logger::log("Consume OStatus messages ", Logger::DEBUG); OStatus::import($xml, $importer, $contact, $hub); } @@ -260,7 +262,7 @@ function consume_feed($xml, array $importer, array $contact, &$hub, $datedir = 0 if ($contact['network'] === Protocol::FEED) { if ($pass < 2) { - logger("Consume feeds", LOGGER_DEBUG); + Logger::log("Consume feeds", Logger::DEBUG); Feed::import($xml, $importer, $contact, $hub); } @@ -268,10 +270,10 @@ function consume_feed($xml, array $importer, array $contact, &$hub, $datedir = 0 } if ($contact['network'] === Protocol::DFRN) { - logger("Consume DFRN messages", LOGGER_DEBUG); + Logger::log("Consume DFRN messages", Logger::DEBUG); $dfrn_importer = DFRN::getImporter($contact["id"], $importer["uid"]); if (!empty($dfrn_importer)) { - logger("Now import the DFRN feed"); + Logger::log("Now import the DFRN feed"); DFRN::import($xml, $dfrn_importer, true); return; } @@ -310,7 +312,7 @@ function subscribe_to_hub($url, array $importer, array $contact, $hubmode = 'sub $params= 'hub.mode=' . $hubmode . '&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token; - logger('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token); + Logger::log('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token); if (!strlen($contact['hub-verify']) || ($contact['hub-verify'] != $verify_token)) { DBA::update('contact', ['hub-verify' => $verify_token], ['id' => $contact['id']]); @@ -318,7 +320,7 @@ function subscribe_to_hub($url, array $importer, array $contact, $hubmode = 'sub $postResult = Network::post($url, $params); - logger('subscribe_to_hub: returns: ' . $postResult->getReturnCode(), LOGGER_DEBUG); + Logger::log('subscribe_to_hub: returns: ' . $postResult->getReturnCode(), Logger::DEBUG); return; @@ -343,7 +345,7 @@ function drop_items(array $items) } } -function drop_item($id) +function drop_item($id, $return = '') { $a = BaseObject::getApp(); @@ -389,7 +391,7 @@ function drop_item($id) } } - return replace_macros(get_markup_template('confirm.tpl'), [ + return Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ '$method' => 'get', '$message' => L10n::t('Do you really want to delete this item?'), '$extra_inputs' => $inputs, @@ -407,8 +409,15 @@ function drop_item($id) // delete the item Item::deleteForUser(['id' => $item['id']], local_user()); - $a->internalRedirect('network'); - //NOTREACHED + $return_url = hex2bin($return); + if (empty($return_url) || strpos($return_url, 'display') !== false) { + $a->internalRedirect('network'); + //NOTREACHED + } + else { + $a->internalRedirect($return_url); + //NOTREACHED + } } else { notice(L10n::t('Permission denied.') . EOL); $a->internalRedirect('display/' . $item['guid']); @@ -480,7 +489,7 @@ function posted_date_widget($url, $uid, $wall) $cutoff_year = intval(DateTimeFormat::localNow('Y')) - $visible_years; $cutoff = ((array_key_exists($cutoff_year, $ret))? true : false); - $o = replace_macros(get_markup_template('posted_date_widget.tpl'),[ + $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('posted_date_widget.tpl'),[ '$title' => L10n::t('Archives'), '$size' => $visible_years, '$cutoff_year' => $cutoff_year, diff --git a/include/text.php b/include/text.php index 2d497bd58b..7f66268ad4 100644 --- a/include/text.php +++ b/include/text.php @@ -23,38 +23,12 @@ use Friendica\Util\DateTimeFormat; use Friendica\Util\Map; use Friendica\Util\Proxy as ProxyUtils; +use Friendica\Core\Logger; +use Friendica\Core\Renderer; +use Friendica\Model\FileTag; + require_once "include/conversation.php"; -/** - * This is our template processor - * - * @param string|FriendicaSmarty $s the string requiring macro substitution, - * or an instance of FriendicaSmarty - * @param array $r key value pairs (search => replace) - * @return string substituted string - */ -function replace_macros($s, $r) { - - $stamp1 = microtime(true); - - $a = get_app(); - - // pass $baseurl to all templates - $r['$baseurl'] = System::baseUrl(); - - $t = $a->getTemplateEngine(); - try { - $output = $t->replaceMacros($s, $r); - } catch (Exception $e) { - echo "
" . __FUNCTION__ . ": " . $e->getMessage() . "
"; - killme(); - } - - $a->saveTimestamp($stamp1, "rendering"); - - return $output; -} - /** * @brief Generates a pseudo-random string of hexadecimal characters * @@ -267,8 +241,8 @@ function unxmlify($s) { * @return string html for loader */ function scroll_loader() { - $tpl = get_markup_template("scroll_loader.tpl"); - return replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate("scroll_loader.tpl"); + return Renderer::replaceMacros($tpl, [ 'wait' => L10n::t('Loading more entries...'), 'end' => L10n::t('The end') ]); @@ -336,30 +310,6 @@ function perms2str($p) { return $ret; } -/** - * load template $s - * - * @param string $s - * @param string $root - * @return string - */ -function get_markup_template($s, $root = '') { - $stamp1 = microtime(true); - - $a = get_app(); - $t = $a->getTemplateEngine(); - try { - $template = $t->getTemplateFile($s, $root); - } catch (Exception $e) { - echo "
" . __FUNCTION__ . ": " . $e->getMessage() . "
"; - killme(); - } - - $a->saveTimestamp($stamp1, "file"); - - return $template; -} - /** * for html,xml parsing - let's say you've got * an attribute foobar="class1 class2 class3" @@ -379,139 +329,6 @@ function attribute_contains($attr, $s) { return (count($a) && in_array($s,$a)); } - -/* setup int->string log level map */ -$LOGGER_LEVELS = []; - -/** - * @brief Logs the given message at the given log level - * - * log levels: - * LOGGER_WARNING - * LOGGER_INFO (default) - * LOGGER_TRACE - * LOGGER_DEBUG - * LOGGER_DATA - * LOGGER_ALL - * - * @global array $LOGGER_LEVELS - * @param string $msg - * @param int $level - */ -function logger($msg, $level = LOGGER_INFO) { - $a = get_app(); - global $LOGGER_LEVELS; - - $debugging = Config::get('system', 'debugging'); - $logfile = Config::get('system', 'logfile'); - $loglevel = intval(Config::get('system', 'loglevel')); - - if ( - !$debugging - || !$logfile - || $level > $loglevel - ) { - return; - } - - if (count($LOGGER_LEVELS) == 0) { - foreach (get_defined_constants() as $k => $v) { - if (substr($k, 0, 7) == "LOGGER_") { - $LOGGER_LEVELS[$v] = substr($k, 7, 7); - } - } - } - - $process_id = session_id(); - - if ($process_id == '') { - $process_id = get_app()->process_id; - } - - $callers = debug_backtrace(); - - if (count($callers) > 1) { - $function = $callers[1]['function']; - } else { - $function = ''; - } - - $logline = sprintf("%s@%s\t[%s]:%s:%s:%s\t%s\n", - DateTimeFormat::utcNow(DateTimeFormat::ATOM), - $process_id, - $LOGGER_LEVELS[$level], - basename($callers[0]['file']), - $callers[0]['line'], - $function, - $msg - ); - - $stamp1 = microtime(true); - @file_put_contents($logfile, $logline, FILE_APPEND); - $a->saveTimestamp($stamp1, "file"); -} - -/** - * @brief An alternative logger for development. - * Works largely as logger() but allows developers - * to isolate particular elements they are targetting - * personally without background noise - * - * log levels: - * LOGGER_WARNING - * LOGGER_INFO (default) - * LOGGER_TRACE - * LOGGER_DEBUG - * LOGGER_DATA - * LOGGER_ALL - * - * @global array $LOGGER_LEVELS - * @param string $msg - * @param int $level - */ -function dlogger($msg, $level = LOGGER_INFO) { - $a = get_app(); - - $logfile = Config::get('system', 'dlogfile'); - if (!$logfile) { - return; - } - - $dlogip = Config::get('system', 'dlogip'); - if (!is_null($dlogip) && $_SERVER['REMOTE_ADDR'] != $dlogip) { - return; - } - - if (count($LOGGER_LEVELS) == 0) { - foreach (get_defined_constants() as $k => $v) { - if (substr($k, 0, 7) == "LOGGER_") { - $LOGGER_LEVELS[$v] = substr($k, 7, 7); - } - } - } - - $process_id = session_id(); - - if ($process_id == '') { - $process_id = $a->process_id; - } - - $callers = debug_backtrace(); - $logline = sprintf("%s@\t%s:\t%s:\t%s\t%s\t%s\n", - DateTimeFormat::utcNow(), - $process_id, - basename($callers[0]['file']), - $callers[0]['line'], - $callers[1]['function'], - $msg - ); - - $stamp1 = microtime(true); - @file_put_contents($logfile, $logline, FILE_APPEND); - $a->saveTimestamp($stamp1, "file"); -} - - /** * Compare activity uri. Knows about activity namespace. * @@ -671,8 +488,8 @@ function contact_block() { } } - $tpl = get_markup_template('contact_block.tpl'); - $o = replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate('contact_block.tpl'); + $o = Renderer::replaceMacros($tpl, [ '$contacts' => $contacts, '$nickname' => $a->profile['nickname'], '$viewcontacts' => L10n::t('View Contacts'), @@ -729,7 +546,7 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) { $url = ''; } - return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),[ + return Renderer::replaceMacros(Renderer::getMarkupTemplate(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),[ '$click' => defaults($contact, 'click', ''), '$class' => $class, '$url' => $url, @@ -784,7 +601,7 @@ function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = } } - return replace_macros(get_markup_template('searchbox.tpl'), $values); + return Renderer::replaceMacros(Renderer::getMarkupTemplate('searchbox.tpl'), $values); } /** @@ -1062,14 +879,14 @@ function prepare_body(array &$item, $attach = false, $is_preview = false) if (strpos($mime, 'video') !== false) { if (!$vhead) { $vhead = true; - $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), [ + $a->page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('videos_head.tpl'), [ '$baseurl' => System::baseUrl(), ]); } $url_parts = explode('/', $the_url); $id = end($url_parts); - $as .= replace_macros(get_markup_template('video_top.tpl'), [ + $as .= Renderer::replaceMacros(Renderer::getMarkupTemplate('video_top.tpl'), [ '$video' => [ 'id' => $id, 'title' => L10n::t('View Video'), @@ -1164,8 +981,8 @@ function prepare_body(array &$item, $attach = false, $is_preview = false) function apply_content_filter($html, array $reasons) { if (count($reasons)) { - $tpl = get_markup_template('wall/content_filter.tpl'); - $html = replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate('wall/content_filter.tpl'); + $html = Renderer::replaceMacros($tpl, [ '$reasons' => $reasons, '$rnd' => random_string(8), '$openclose' => L10n::t('Click to open/close'), @@ -1230,9 +1047,9 @@ function get_cats_and_terms($item) if ($cnt) { foreach ($matches as $mtch) { $categories[] = [ - 'name' => xmlify(file_tag_decode($mtch[1])), + 'name' => xmlify(FileTag::decode($mtch[1])), 'url' => "#", - 'removeurl' => ((local_user() == $item['uid'])?'filerm/' . $item['id'] . '?f=&cat=' . xmlify(file_tag_decode($mtch[1])):""), + 'removeurl' => ((local_user() == $item['uid'])?'filerm/' . $item['id'] . '?f=&cat=' . xmlify(FileTag::decode($mtch[1])):""), 'first' => $first, 'last' => false ]; @@ -1251,9 +1068,9 @@ function get_cats_and_terms($item) if ($cnt) { foreach ($matches as $mtch) { $folders[] = [ - 'name' => xmlify(file_tag_decode($mtch[1])), + 'name' => xmlify(FileTag::decode($mtch[1])), 'url' => "#", - 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . xmlify(file_tag_decode($mtch[1])) : ""), + 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . xmlify(FileTag::decode($mtch[1])) : ""), 'first' => $first, 'last' => false ]; @@ -1353,7 +1170,7 @@ function base64url_encode($s, $strip_padding = false) { function base64url_decode($s) { if (is_array($s)) { - logger('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true)); + Logger::log('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true)); return $s; } @@ -1491,199 +1308,6 @@ function item_post_type($item) { return L10n::t('post'); } -// post categories and "save to file" use the same item.file table for storage. -// We will differentiate the different uses by wrapping categories in angle brackets -// and save to file categories in square brackets. -// To do this we need to escape these characters if they appear in our tag. - -function file_tag_encode($s) { - return str_replace(['<','>','[',']'],['%3c','%3e','%5b','%5d'],$s); -} - -function file_tag_decode($s) { - return str_replace(['%3c', '%3e', '%5b', '%5d'], ['<', '>', '[', ']'], $s); -} - -function file_tag_file_query($table,$s,$type = 'file') { - - if ($type == 'file') { - $str = preg_quote('[' . str_replace('%', '%%', file_tag_encode($s)) . ']'); - } else { - $str = preg_quote('<' . str_replace('%', '%%', file_tag_encode($s)) . '>'); - } - return " AND " . (($table) ? DBA::escape($table) . '.' : '') . "file regexp '" . DBA::escape($str) . "' "; -} - -// ex. given music,video return