]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #7727 from MrPetovan/task/4090-move-manage-to-src
authorPhilipp <admin+Github@philipp.info>
Sun, 13 Oct 2019 16:20:47 +0000 (18:20 +0200)
committerGitHub <noreply@github.com>
Sun, 13 Oct 2019 16:20:47 +0000 (18:20 +0200)
Move mod/manage to src/Module/Delegation

18 files changed:
boot.php
include/api.php
src/Content/Text/HTML.php
src/Core/Logger.php
src/Model/User.php
src/Module/Search/Index.php
src/Module/Search/Saved.php
src/Util/Strings.php
static/routes.config.php
tests/src/Util/StringsTest.php
view/templates/searchbox.tpl
view/templates/widget/saved_searches.tpl
view/theme/frio/css/style.css
view/theme/frio/js/theme.js
view/theme/frio/templates/nav.tpl
view/theme/frio/templates/searchbox.tpl
view/theme/frio/templates/widget/saved_searches.tpl
view/theme/quattro/templates/widget/saved_searches.tpl

index 9d7ee2b0923beeac4d95d97a79d20700887196ca..ae9c35ae5d32207db6b4f0196f1e44e8676c48c5 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -527,7 +527,7 @@ function is_site_admin()
 
        $adminlist = explode(',', str_replace(' ', '', $admin_email));
 
-       return local_user() && $admin_email && in_array(defaults($a->user, 'email', ''), $adminlist);
+       return local_user() && $admin_email && in_array($a->user['email'] ?? '', $adminlist);
 }
 
 function explode_querystring($query)
index 3cadb485dedfd065731282f0b25a1caab538633c..e986a5173490791e432b28ada142971c5fa4e4d1 100644 (file)
@@ -207,8 +207,8 @@ function api_login(App $a)
                throw new UnauthorizedException("This API requires login");
        }
 
-       $user = defaults($_SERVER, 'PHP_AUTH_USER', '');
-       $password = defaults($_SERVER, 'PHP_AUTH_PW', '');
+       $user = $_SERVER['PHP_AUTH_USER'] ?? '';
+       $password = $_SERVER['PHP_AUTH_PW'] ?? '';
 
        // allow "user@server" login (but ignore 'server' part)
        $at = strstr($user, "@", true);
@@ -272,7 +272,7 @@ function api_check_method($method)
        if ($method == "*") {
                return true;
        }
-       return (stripos($method, defaults($_SERVER, 'REQUEST_METHOD', 'GET')) !== false);
+       return (stripos($method, $_SERVER['REQUEST_METHOD'] ?? 'GET') !== false);
 }
 
 /**
@@ -775,14 +775,14 @@ function api_get_user(App $a, $contact_id = null)
  */
 function api_item_get_user(App $a, $item)
 {
-       $status_user = api_get_user($a, defaults($item, 'author-id', null));
+       $status_user = api_get_user($a, $item['author-id'] ?? null);
 
        $author_user = $status_user;
 
-       $status_user["protected"] = defaults($item, 'private', 0);
+       $status_user["protected"] = $item['private'] ?? 0;
 
-       if (defaults($item, 'thr-parent', '') == defaults($item, 'uri', '')) {
-               $owner_user = api_get_user($a, defaults($item, 'owner-id', null));
+       if (($item['thr-parent'] ?? '') == ($item['uri'] ?? '')) {
+               $owner_user = api_get_user($a, $item['owner-id'] ?? null);
        } else {
                $owner_user = $author_user;
        }
@@ -946,7 +946,7 @@ function api_account_verify_credentials($type)
        unset($_REQUEST["screen_name"]);
        unset($_GET["screen_name"]);
 
-       $skip_status = defaults($_REQUEST, 'skip_status', false);
+       $skip_status = $_REQUEST['skip_status'] ?? false;
 
        $user_info = api_get_user($a);
 
@@ -1517,10 +1517,12 @@ function api_search($type)
                $count = $_REQUEST['count'];
        }
        
-       $since_id = defaults($_REQUEST, 'since_id', 0);
-       $max_id = defaults($_REQUEST, 'max_id', 0);
-       $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] - 1 : 0);
-       $start = $page * $count;
+       $since_id = $_REQUEST['since_id'] ?? 0;
+       $max_id = $_REQUEST['max_id'] ?? 0;
+       $page = $_REQUEST['page'] ?? 1;
+
+       $start = max(0, ($page - 1) * $count);
+
        $params = ['order' => ['id' => true], 'limit' => [$start, $count]];
        if (preg_match('/^#(\w+)$/', $searchTerm, $matches) === 1 && isset($matches[1])) {
                $searchTerm = $matches[1];
@@ -1608,17 +1610,14 @@ function api_statuses_home_timeline($type)
        // get last network messages
 
        // params
-       $count = defaults($_REQUEST, 'count', 20);
-       $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] - 1 : 0);
-       if ($page < 0) {
-               $page = 0;
-       }
-       $since_id = defaults($_REQUEST, 'since_id', 0);
-       $max_id = defaults($_REQUEST, 'max_id', 0);
+       $count = $_REQUEST['count'] ?? 20;
+       $page = $_REQUEST['page']?? 0;
+       $since_id = $_REQUEST['since_id'] ?? 0;
+       $max_id = $_REQUEST['max_id'] ?? 0;
        $exclude_replies = !empty($_REQUEST['exclude_replies']);
-       $conversation_id = defaults($_REQUEST, 'conversation_id', 0);
+       $conversation_id = $_REQUEST['conversation_id'] ?? 0;
 
-       $start = $page * $count;
+       $start = max(0, ($page - 1) * $count);
 
        $condition = ["`uid` = ? AND `gravity` IN (?, ?) AND `item`.`id` > ?",
                api_user(), GRAVITY_PARENT, GRAVITY_COMMENT, $since_id];
@@ -1698,17 +1697,14 @@ function api_statuses_public_timeline($type)
        // get last network messages
 
        // params
-       $count = defaults($_REQUEST, 'count', 20);
-       $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] -1 : 0);
-       if ($page < 0) {
-               $page = 0;
-       }
-       $since_id = defaults($_REQUEST, 'since_id', 0);
-       $max_id = defaults($_REQUEST, 'max_id', 0);
+       $count = $_REQUEST['count'] ?? 20;
+       $page = $_REQUEST['page'] ?? 1;
+       $since_id = $_REQUEST['since_id'] ?? 0;
+       $max_id = $_REQUEST['max_id'] ?? 0;
        $exclude_replies = (!empty($_REQUEST['exclude_replies']) ? 1 : 0);
-       $conversation_id = defaults($_REQUEST, 'conversation_id', 0);
+       $conversation_id = $_REQUEST['conversation_id'] ?? 0;
 
-       $start = $page * $count;
+       $start = max(0, ($page - 1) * $count);
 
        if ($exclude_replies && !$conversation_id) {
                $condition = ["`gravity` IN (?, ?) AND `iid` > ? AND NOT `private` AND `wall` AND NOT `user`.`hidewall` AND NOT `author`.`hidden`",
@@ -1783,16 +1779,14 @@ function api_statuses_networkpublic_timeline($type)
                throw new ForbiddenException();
        }
 
-       $since_id        = defaults($_REQUEST, 'since_id', 0);
-       $max_id          = defaults($_REQUEST, 'max_id', 0);
+       $since_id        = $_REQUEST['since_id'] ?? 0;
+       $max_id          = $_REQUEST['max_id'] ?? 0;
 
        // pagination
-       $count = defaults($_REQUEST, 'count', 20);
-       $page  = defaults($_REQUEST, 'page', 1);
-       if ($page < 1) {
-               $page = 1;
-       }
-       $start = ($page - 1) * $count;
+       $count = $_REQUEST['count'] ?? 20;
+       $page  = $_REQUEST['page'] ?? 1;
+
+       $start = max(0, ($page - 1) * $count);
 
        $condition = ["`uid` = 0 AND `gravity` IN (?, ?) AND `thread`.`iid` > ? AND NOT `private`",
                GRAVITY_PARENT, GRAVITY_COMMENT, $since_id];
@@ -1847,15 +1841,15 @@ function api_statuses_show($type)
        }
 
        // params
-       $id = intval(defaults($a->argv, 3, 0));
+       $id = intval($a->argv[3] ?? 0);
 
        if ($id == 0) {
-               $id = intval(defaults($_REQUEST, 'id', 0));
+               $id = intval($_REQUEST['id'] ?? 0);
        }
 
        // Hotot workaround
        if ($id == 0) {
-               $id = intval(defaults($a->argv, 4, 0));
+               $id = intval($a->argv[4] ?? 0);
        }
 
        Logger::log('API: api_statuses_show: ' . $id);
@@ -1926,24 +1920,21 @@ function api_conversation_show($type)
        }
 
        // params
-       $id       = intval(defaults($a->argv , 3         , 0));
-       $since_id = intval(defaults($_REQUEST, 'since_id', 0));
-       $max_id   = intval(defaults($_REQUEST, 'max_id'  , 0));
-       $count    = intval(defaults($_REQUEST, 'count'   , 20));
-       $page     = intval(defaults($_REQUEST, 'page'    , 1)) - 1;
-       if ($page < 0) {
-               $page = 0;
-       }
+       $id       = intval($a->argv[3]           ?? 0);
+       $since_id = intval($_REQUEST['since_id'] ?? 0);
+       $max_id   = intval($_REQUEST['max_id']   ?? 0);
+       $count    = intval($_REQUEST['count']    ?? 20);
+       $page     = intval($_REQUEST['page']     ?? 1);
 
-       $start = $page * $count;
+       $start = max(0, ($page - 1) * $count);
 
        if ($id == 0) {
-               $id = intval(defaults($_REQUEST, 'id', 0));
+               $id = intval($_REQUEST['id'] ?? 0);
        }
 
        // Hotot workaround
        if ($id == 0) {
-               $id = intval(defaults($a->argv, 4, 0));
+               $id = intval($a->argv[4] ?? 0);
        }
 
        Logger::info(API_LOG_PREFIX . '{subaction}', ['module' => 'api', 'action' => 'conversation', 'subaction' => 'show', 'id' => $id]);
@@ -2012,15 +2003,15 @@ function api_statuses_repeat($type)
        api_get_user($a);
 
        // params
-       $id = intval(defaults($a->argv, 3, 0));
+       $id = intval($a->argv[3] ?? 0);
 
        if ($id == 0) {
-               $id = intval(defaults($_REQUEST, 'id', 0));
+               $id = intval($_REQUEST['id'] ?? 0);
        }
 
        // Hotot workaround
        if ($id == 0) {
-               $id = intval(defaults($a->argv, 4, 0));
+               $id = intval($a->argv[4] ?? 0);
        }
 
        Logger::log('API: api_statuses_repeat: '.$id);
@@ -2083,15 +2074,15 @@ function api_statuses_destroy($type)
        api_get_user($a);
 
        // params
-       $id = intval(defaults($a->argv, 3, 0));
+       $id = intval($a->argv[3] ?? 0);
 
        if ($id == 0) {
-               $id = intval(defaults($_REQUEST, 'id', 0));
+               $id = intval($_REQUEST['id'] ?? 0);
        }
 
        // Hotot workaround
        if ($id == 0) {
-               $id = intval(defaults($a->argv, 4, 0));
+               $id = intval($a->argv[4] ?? 0);
        }
 
        Logger::log('API: api_statuses_destroy: '.$id);
@@ -2137,15 +2128,12 @@ function api_statuses_mentions($type)
        // get last network messages
 
        // params
-       $since_id = defaults($_REQUEST, 'since_id', 0);
-       $max_id   = defaults($_REQUEST, 'max_id'  , 0);
-       $count    = defaults($_REQUEST, 'count'   , 20);
-       $page     = defaults($_REQUEST, 'page'    , 1);
-       if ($page < 1) {
-               $page = 1;
-       }
+       $since_id = $_REQUEST['since_id'] ?? 0;
+       $max_id   = $_REQUEST['max_id']   ?? 0;
+       $count    = $_REQUEST['count']    ?? 20;
+       $page     = $_REQUEST['page']     ?? 1;
 
-       $start = ($page - 1) * $count;
+       $start = max(0, ($page - 1) * $count);
 
        $condition = ["`uid` = ? AND `gravity` IN (?, ?) AND `item`.`id` > ? AND `author-id` != ?
                AND `item`.`parent` IN (SELECT `iid` FROM `thread` WHERE `thread`.`uid` = ? AND `thread`.`mention` AND NOT `thread`.`ignored`)",
@@ -2207,18 +2195,16 @@ function api_statuses_user_timeline($type)
                Logger::DEBUG
        );
 
-       $since_id        = defaults($_REQUEST, 'since_id', 0);
-       $max_id          = defaults($_REQUEST, 'max_id', 0);
+       $since_id        = $_REQUEST['since_id'] ?? 0;
+       $max_id          = $_REQUEST['max_id'] ?? 0;
        $exclude_replies = !empty($_REQUEST['exclude_replies']);
-       $conversation_id = defaults($_REQUEST, 'conversation_id', 0);
+       $conversation_id = $_REQUEST['conversation_id'] ?? 0;
 
        // pagination
-       $count = defaults($_REQUEST, 'count', 20);
-       $page  = defaults($_REQUEST, 'page', 1);
-       if ($page < 1) {
-               $page = 1;
-       }
-       $start = ($page - 1) * $count;
+       $count = $_REQUEST['count'] ?? 20;
+       $page  = $_REQUEST['page'] ?? 1;
+
+       $start = max(0, ($page - 1) * $count);
 
        $condition = ["`uid` = ? AND `gravity` IN (?, ?) AND `item`.`id` > ? AND `item`.`contact-id` = ?",
                api_user(), GRAVITY_PARENT, GRAVITY_COMMENT, $since_id, $user_info['cid']];
@@ -2297,9 +2283,9 @@ function api_favorites_create_destroy($type)
        }
        $action = str_replace("." . $type, "", $a->argv[$action_argv_id]);
        if ($a->argc == $action_argv_id + 2) {
-               $itemid = intval(defaults($a->argv, $action_argv_id + 1, 0));
+               $itemid = intval($a->argv[$action_argv_id + 1] ?? 0);
        } else {
-               $itemid = intval(defaults($_REQUEST, 'id', 0));
+               $itemid = intval($_REQUEST['id'] ?? 0);
        }
 
        $item = Item::selectFirstForUser(api_user(), [], ['id' => $itemid, 'uid' => api_user()]);
@@ -2379,15 +2365,12 @@ function api_favorites($type)
                $ret = [];
        } else {
                // params
-               $since_id = defaults($_REQUEST, 'since_id', 0);
-               $max_id = defaults($_REQUEST, 'max_id', 0);
-               $count = defaults($_GET, 'count', 20);
-               $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] -1 : 0);
-               if ($page < 0) {
-                       $page = 0;
-               }
+               $since_id = $_REQUEST['since_id'] ?? 0;
+               $max_id = $_REQUEST['max_id'] ?? 0;
+               $count = $_GET['count'] ?? 20;
+               $page = $_REQUEST['page'] ?? 1;
 
-               $start = $page*$count;
+               $start = max(0, ($page - 1) * $count);
 
                $condition = ["`uid` = ? AND `gravity` IN (?, ?) AND `id` > ? AND `starred`",
                        api_user(), GRAVITY_PARENT, GRAVITY_COMMENT, $since_id];
@@ -2438,14 +2421,14 @@ function api_format_messages($item, $recipient, $sender)
                'sender_id'             => $sender['id'],
                'text'                  => "",
                'recipient_id'          => $recipient['id'],
-               'created_at'            => api_date(defaults($item, 'created', DateTimeFormat::utcNow())),
+               'created_at'            => api_date($item['created'] ?? DateTimeFormat::utcNow()),
                'sender_screen_name'    => $sender['screen_name'],
                'recipient_screen_name' => $recipient['screen_name'],
                'sender'                => $sender,
                'recipient'             => $recipient,
                'title'                 => "",
-               'friendica_seen'        => defaults($item, 'seen', 0),
-               'friendica_parent_uri'  => defaults($item, 'parent-uri', ''),
+               'friendica_seen'        => $item['seen'] ?? 0,
+               'friendica_parent_uri'  => $item['parent-uri'] ?? '',
        ];
 
        // "uid" and "self" are only needed for some internal stuff, so remove it from here
@@ -2508,8 +2491,8 @@ function api_convert_item($item)
                $statustext = trim($statustitle."\n\n".$statusbody);
        }
 
-       if ((defaults($item, 'network', Protocol::PHANTOM) == Protocol::FEED) && (mb_strlen($statustext)> 1000)) {
-               $statustext = mb_substr($statustext, 0, 1000) . "... \n" . defaults($item, 'plink', '');
+       if ((($item['network'] ?? Protocol::PHANTOM) == Protocol::FEED) && (mb_strlen($statustext)> 1000)) {
+               $statustext = mb_substr($statustext, 0, 1000) . "... \n" . ($item['plink'] ?? '');
        }
 
        $statushtml = BBCode::convert(api_clean_attachments($body), false);
@@ -2543,7 +2526,7 @@ function api_convert_item($item)
        }
 
        // feeds without body should contain the link
-       if ((defaults($item, 'network', Protocol::PHANTOM) == Protocol::FEED) && (strlen($item['body']) == 0)) {
+       if ((($item['network'] ?? Protocol::PHANTOM) == Protocol::FEED) && (strlen($item['body']) == 0)) {
                $statushtml .= BBCode::convert($item['plink']);
        }
 
@@ -2586,7 +2569,7 @@ function api_get_attachments(&$body)
                }
        }
 
-       if (strstr(defaults($_SERVER, 'HTTP_USER_AGENT', ''), "AndStatus")) {
+       if (strstr($_SERVER['HTTP_USER_AGENT'] ?? '', 'AndStatus')) {
                foreach ($images[0] as $orig) {
                        $body = str_replace($orig, "", $body);
                }
@@ -2606,7 +2589,7 @@ function api_get_attachments(&$body)
  */
 function api_get_entitities(&$text, $bbcode)
 {
-       $include_entities = strtolower(defaults($_REQUEST, 'include_entities', "false"));
+       $include_entities = strtolower($_REQUEST['include_entities'] ?? 'false');
 
        if ($include_entities != "true") {
                preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images);
@@ -3311,17 +3294,14 @@ function api_lists_statuses($type)
        }
 
        // params
-       $count = defaults($_REQUEST, 'count', 20);
-       $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] - 1 : 0);
-       if ($page < 0) {
-               $page = 0;
-       }
-       $since_id = defaults($_REQUEST, 'since_id', 0);
-       $max_id = defaults($_REQUEST, 'max_id', 0);
+       $count = $_REQUEST['count'] ?? 20;
+       $page = $_REQUEST['page'] ?? 1;
+       $since_id = $_REQUEST['since_id'] ?? 0;
+       $max_id = $_REQUEST['max_id'] ?? 0;
        $exclude_replies = (!empty($_REQUEST['exclude_replies']) ? 1 : 0);
-       $conversation_id = defaults($_REQUEST, 'conversation_id', 0);
+       $conversation_id = $_REQUEST['conversation_id'] ?? 0;
 
-       $start = $page * $count;
+       $start = max(0, ($page - 1) * $count);
 
        $condition = ["`uid` = ? AND `gravity` IN (?, ?) AND `id` > ? AND `group_member`.`gid` = ?",
                api_user(), GRAVITY_PARENT, GRAVITY_COMMENT, $since_id, $_REQUEST['list_id']];
@@ -3381,12 +3361,10 @@ function api_statuses_f($qtype)
        }
 
        // pagination
-       $count = defaults($_GET, 'count', 20);
-       $page = defaults($_GET, 'page', 1);
-       if ($page < 1) {
-               $page = 1;
-       }
-       $start = ($page - 1) * $count;
+       $count = $_GET['count'] ?? 20;
+       $page = $_GET['page'] ?? 1;
+
+       $start = max(0, ($page - 1) * $count);
 
        $user_info = api_get_user($a);
 
@@ -3633,7 +3611,7 @@ function api_ff_ids($type)
 
        api_get_user($a);
 
-       $stringify_ids = defaults($_REQUEST, 'stringify_ids', false);
+       $stringify_ids = $_REQUEST['stringify_ids'] ?? false;
 
        $r = q(
                "SELECT `pcontact`.`id` FROM `contact`
@@ -3808,9 +3786,9 @@ function api_direct_messages_destroy($type)
        // params
        $user_info = api_get_user($a);
        //required
-       $id = defaults($_REQUEST, 'id', 0);
+       $id = $_REQUEST['id'] ?? 0;
        // optional
-       $parenturi = defaults($_REQUEST, 'friendica_parenturi', "");
+       $parenturi = $_REQUEST['friendica_parenturi'] ?? '';
        $verbose = (!empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false");
        /// @todo optional parameter 'include_entities' from Twitter API not yet implemented
 
@@ -3891,7 +3869,7 @@ function api_friendships_destroy($type)
                throw new ForbiddenException();
        }
 
-       $contact_id = defaults($_REQUEST, 'user_id');
+       $contact_id = $_REQUEST['user_id'] ?? 0;
 
        if (empty($contact_id)) {
                Logger::notice(API_LOG_PREFIX . 'No user_id specified', ['module' => 'api', 'action' => 'friendships_destroy']);
@@ -3972,17 +3950,14 @@ function api_direct_messages_box($type, $box, $verbose)
                throw new ForbiddenException();
        }
        // params
-       $count = defaults($_GET, 'count', 20);
-       $page = defaults($_REQUEST, 'page', 1) - 1;
-       if ($page < 0) {
-               $page = 0;
-       }
+       $count = $_GET['count'] ?? 20;
+       $page = $_REQUEST['page'] ?? 1;
 
-       $since_id = defaults($_REQUEST, 'since_id', 0);
-       $max_id = defaults($_REQUEST, 'max_id', 0);
+       $since_id = $_REQUEST['since_id'] ?? 0;
+       $max_id = $_REQUEST['max_id'] ?? 0;
 
-       $user_id = defaults($_REQUEST, 'user_id', '');
-       $screen_name = defaults($_REQUEST, 'screen_name', '');
+       $user_id = $_REQUEST['user_id'] ?? '';
+       $screen_name = $_REQUEST['screen_name'] ?? '';
 
        //  caller user info
        unset($_REQUEST["user_id"]);
@@ -3998,7 +3973,7 @@ function api_direct_messages_box($type, $box, $verbose)
        $profile_url = $user_info["url"];
 
        // pagination
-       $start = $page * $count;
+       $start = max(0, ($page - 1) * $count);
 
        $sql_extra = "";
 
@@ -4006,7 +3981,7 @@ function api_direct_messages_box($type, $box, $verbose)
        if ($box=="sentbox") {
                $sql_extra = "`mail`.`from-url`='" . DBA::escape($profile_url) . "'";
        } elseif ($box == "conversation") {
-               $sql_extra = "`mail`.`parent-uri`='" . DBA::escape(defaults($_GET, 'uri', ''))  . "'";
+               $sql_extra = "`mail`.`parent-uri`='" . DBA::escape($_GET['uri'] ?? '')  . "'";
        } elseif ($box == "all") {
                $sql_extra = "true";
        } elseif ($box == "inbox") {
@@ -4186,7 +4161,7 @@ function api_fr_photoalbum_delete($type)
                throw new ForbiddenException();
        }
        // input params
-       $album = defaults($_REQUEST, 'album', "");
+       $album = $_REQUEST['album'] ?? '';
 
        // we do not allow calls without album string
        if ($album == "") {
@@ -4241,8 +4216,8 @@ function api_fr_photoalbum_update($type)
                throw new ForbiddenException();
        }
        // input params
-       $album = defaults($_REQUEST, 'album', "");
-       $album_new = defaults($_REQUEST, 'album_new', "");
+       $album = $_REQUEST['album'] ?? '';
+       $album_new = $_REQUEST['album_new'] ?? '';
 
        // we do not allow calls without album string
        if ($album == "") {
@@ -4333,14 +4308,14 @@ function api_fr_photo_create_update($type)
                throw new ForbiddenException();
        }
        // input params
-       $photo_id = defaults($_REQUEST, 'photo_id', null);
-       $desc = defaults($_REQUEST, 'desc', (array_key_exists('desc', $_REQUEST) ? "" : null)) ; // extra check necessary to distinguish between 'not provided' and 'empty string'
-       $album = defaults($_REQUEST, 'album', null);
-       $album_new = defaults($_REQUEST, 'album_new', null);
-       $allow_cid = defaults($_REQUEST, 'allow_cid', (array_key_exists('allow_cid', $_REQUEST) ? " " : null));
-       $deny_cid  = defaults($_REQUEST, 'deny_cid' , (array_key_exists('deny_cid' , $_REQUEST) ? " " : null));
-       $allow_gid = defaults($_REQUEST, 'allow_gid', (array_key_exists('allow_gid', $_REQUEST) ? " " : null));
-       $deny_gid  = defaults($_REQUEST, 'deny_gid' , (array_key_exists('deny_gid' , $_REQUEST) ? " " : null));
+       $photo_id  = $_REQUEST['photo_id']  ?? null;
+       $desc      = $_REQUEST['desc']      ?? null;
+       $album     = $_REQUEST['album']     ?? null;
+       $album_new = $_REQUEST['album_new'] ?? null;
+       $allow_cid = $_REQUEST['allow_cid'] ?? null;
+       $deny_cid  = $_REQUEST['deny_cid' ] ?? null;
+       $allow_gid = $_REQUEST['allow_gid'] ?? null;
+       $deny_gid  = $_REQUEST['deny_gid' ] ?? null;
        $visibility = !empty($_REQUEST['visibility']) && $_REQUEST['visibility'] !== "false";
 
        // do several checks on input parameters
@@ -4471,7 +4446,7 @@ function api_fr_photo_delete($type)
        }
 
        // input params
-       $photo_id = defaults($_REQUEST, 'photo_id', null);
+       $photo_id = $_REQUEST['photo_id'] ?? null;
 
        // do several checks on input parameters
        // we do not allow calls without photo id
@@ -4558,7 +4533,7 @@ function api_account_update_profile_image($type)
                throw new ForbiddenException();
        }
        // input params
-       $profile_id = defaults($_REQUEST, 'profile_id', 0);
+       $profile_id = $_REQUEST['profile_id'] ?? 0;
 
        // error if image data is missing
        if (empty($_FILES['image'])) {
@@ -4690,9 +4665,10 @@ api_register_func('api/account/update_profile', 'api_account_update_profile', tr
  */
 function check_acl_input($acl_string)
 {
-       if ($acl_string == null || $acl_string == " ") {
+       if (empty($acl_string)) {
                return false;
        }
+
        $contact_not_found = false;
 
        // split <x><y><z> into array of cid's
@@ -4710,7 +4686,6 @@ function check_acl_input($acl_string)
 }
 
 /**
- *
  * @param string  $mediatype
  * @param array   $media
  * @param string  $type
@@ -4729,6 +4704,7 @@ function check_acl_input($acl_string)
  * @throws ImagickException
  * @throws InternalServerErrorException
  * @throws NotFoundException
+ * @throws UnauthorizedException
  */
 function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $desc, $profile = 0, $visibility = false, $photo_id = null)
 {
@@ -5063,8 +5039,8 @@ function prepare_photo_data($type, $scale, $photo_id)
  */
 function api_friendica_remoteauth()
 {
-       $url = defaults($_GET, 'url', '');
-       $c_url = defaults($_GET, 'c_url', '');
+       $url = $_GET['url'] ?? '';
+       $c_url = $_GET['c_url'] ?? '';
 
        if ($url === '' || $c_url === '') {
                throw new BadRequestException("Wrong parameters.");
@@ -5082,7 +5058,7 @@ function api_friendica_remoteauth()
 
        $cid = $contact['id'];
 
-       $dfrn_id = defaults($contact, 'issued-id', $contact['dfrn-id']);
+       $dfrn_id = $contact['issued-id'] ?? $contact['dfrn-id'];
 
        if ($contact['duplex'] && $contact['issued-id']) {
                $orig_id = $contact['issued-id'];
@@ -5417,7 +5393,7 @@ function api_in_reply_to($item)
  */
 function api_clean_plain_items($text)
 {
-       $include_entities = strtolower(defaults($_REQUEST, 'include_entities', "false"));
+       $include_entities = strtolower($_REQUEST['include_entities'] ?? 'false');
 
        $text = BBCode::cleanPictureLinks($text);
        $URLSearchString = "^\[\]";
@@ -5555,7 +5531,7 @@ function api_friendica_group_show($type)
 
        // params
        $user_info = api_get_user($a);
-       $gid = defaults($_REQUEST, 'gid', 0);
+       $gid = $_REQUEST['gid'] ?? 0;
        $uid = $user_info['uid'];
 
        // get data of the specified group id or all groups if not specified
@@ -5625,8 +5601,8 @@ function api_friendica_group_delete($type)
 
        // params
        $user_info = api_get_user($a);
-       $gid = defaults($_REQUEST, 'gid', 0);
-       $name = defaults($_REQUEST, 'name', "");
+       $gid = $_REQUEST['gid'] ?? 0;
+       $name = $_REQUEST['name'] ?? '';
        $uid = $user_info['uid'];
 
        // error if no gid specified
@@ -5692,7 +5668,7 @@ function api_lists_destroy($type)
 
        // params
        $user_info = api_get_user($a);
-       $gid = defaults($_REQUEST, 'list_id', 0);
+       $gid = $_REQUEST['list_id'] ?? 0;
        $uid = $user_info['uid'];
 
        // error if no gid specified
@@ -5814,7 +5790,7 @@ function api_friendica_group_create($type)
 
        // params
        $user_info = api_get_user($a);
-       $name = defaults($_REQUEST, 'name', "");
+       $name = $_REQUEST['name'] ?? '';
        $uid = $user_info['uid'];
        $json = json_decode($_POST['json'], true);
        $users = $json['user'];
@@ -5848,7 +5824,7 @@ function api_lists_create($type)
 
        // params
        $user_info = api_get_user($a);
-       $name = defaults($_REQUEST, 'name', "");
+       $name = $_REQUEST['name'] ?? '';
        $uid = $user_info['uid'];
 
        $success = group_create($name, $uid);
@@ -5888,8 +5864,8 @@ function api_friendica_group_update($type)
        // params
        $user_info = api_get_user($a);
        $uid = $user_info['uid'];
-       $gid = defaults($_REQUEST, 'gid', 0);
-       $name = defaults($_REQUEST, 'name', "");
+       $gid = $_REQUEST['gid'] ?? 0;
+       $name = $_REQUEST['name'] ?? '';
        $json = json_decode($_POST['json'], true);
        $users = $json['user'];
 
@@ -5966,8 +5942,8 @@ function api_lists_update($type)
 
        // params
        $user_info = api_get_user($a);
-       $gid = defaults($_REQUEST, 'list_id', 0);
-       $name = defaults($_REQUEST, 'name', "");
+       $gid = $_REQUEST['list_id'] ?? 0;
+       $name = $_REQUEST['name'] ?? '';
        $uid = $user_info['uid'];
 
        // error if no gid specified
@@ -6016,7 +5992,7 @@ function api_friendica_activity($type)
        $verb = strtolower($a->argv[3]);
        $verb = preg_replace("|\..*$|", "", $verb);
 
-       $id = defaults($_REQUEST, 'id', 0);
+       $id = $_REQUEST['id'] ?? 0;
 
        $res = Item::performLike($id, $verb);
 
@@ -6153,7 +6129,7 @@ function api_friendica_direct_messages_setseen($type)
        // params
        $user_info = api_get_user($a);
        $uid = $user_info['uid'];
-       $id = defaults($_REQUEST, 'id', 0);
+       $id = $_REQUEST['id'] ?? 0;
 
        // return error if id is zero
        if ($id == "") {
@@ -6207,7 +6183,7 @@ function api_friendica_direct_messages_search($type, $box = "")
 
        // params
        $user_info = api_get_user($a);
-       $searchstring = defaults($_REQUEST, 'searchstring', "");
+       $searchstring = $_REQUEST['searchstring'] ?? '';
        $uid = $user_info['uid'];
 
        // error if no searchstring specified
@@ -6274,7 +6250,7 @@ function api_friendica_profile_show($type)
        }
 
        // input params
-       $profile_id = defaults($_REQUEST, 'profile_id', 0);
+       $profile_id = $_REQUEST['profile_id'] ?? 0;
 
        // retrieve general information about profiles for user
        $multi_profiles = Feature::isEnabled(api_user(), 'multi_profiles');
index ea9a4737cd5bbc3869b7319ccf6a107bf04554e8..549025dec00b4b26c9d6865a5cd133517b206a1d 100644 (file)
@@ -912,7 +912,7 @@ class HTML
                        '$save_label'   => $save_label,
                        '$search_hint'  => L10n::t('@name, !forum, #tags, content'),
                        '$mode'         => $mode,
-                       '$return_url'   => urlencode('search?q=' . $s),
+                       '$return_url'   => urlencode('search?q=' . urlencode($s)),
                ];
 
                if (!$aside) {
index e376485e564adae830ee0e1103d71d1a868fe281..e8d95fa857bf67fae7e990e7cab8a7ac94d2ebd9 100644 (file)
@@ -64,7 +64,6 @@ class Logger extends BaseObject
                self::TRACE => 'Trace',
                self::DEBUG => 'Debug',
                self::DATA => 'Data',
-               self::ALL => 'All',
        ];
 
        /**
index b6121ad04e07c46098f2eeec60b8cf8e17dbf07f..ef49f45edab1012f9873678c473f2137542d960f 100644 (file)
@@ -412,6 +412,7 @@ class User
         *
         * @param string $password
         * @return bool
+        * @throws Exception
         */
        public static function isPasswordExposed($password)
        {
@@ -420,9 +421,20 @@ class User
                        'cacheDirectory' => get_temppath() . '/password-exposed-cache/',
                ]);
 
-               $PasswordExposedCHecker = new PasswordExposed\PasswordExposedChecker(null, $cache);
+               try {
+                       $passwordExposedChecker = new PasswordExposed\PasswordExposedChecker(null, $cache);
+
+                       return $passwordExposedChecker->passwordExposed($password) === PasswordExposed\PasswordStatus::EXPOSED;
+               } catch (\Exception $e) {
+                       Logger::error('Password Exposed Exception: ' . $e->getMessage(), [
+                               'code' => $e->getCode(),
+                               'file' => $e->getFile(),
+                               'line' => $e->getLine(),
+                               'trace' => $e->getTraceAsString()
+                       ]);
 
-               return $PasswordExposedCHecker->passwordExposed($password) === PasswordExposed\PasswordStatus::EXPOSED;
+                       return false;
+               }
        }
 
        /**
index 9c0d9e1dfff9cebd5373cc3c2770a21eae729962..73de090a71acb429e32100ff67d66e607e116074 100644 (file)
@@ -63,7 +63,7 @@ class Index extends BaseSearchModule
                }
 
                if (local_user()) {
-                       self::getApp()->page['aside'] .= Widget\SavedSearches::getHTML('search?q=' . $search, $search);
+                       self::getApp()->page['aside'] .= Widget\SavedSearches::getHTML('search?q=' . urlencode($search), $search);
                }
 
                Nav::setSelected('search');
index 772f4782c2cb5850c43c365a6206ed687753d876..9d8d84b55a9bb10337af8801500435e1e36f723a 100644 (file)
@@ -10,17 +10,17 @@ use Friendica\Util\Strings;
 
 class Saved extends BaseModule
 {
-       public static function rawContent()
+       public static function init()
        {
                /** @var Arguments $args */
                $args = self::getClass(Arguments::class);
 
                $action = $args->get(2, 'none');
-               $search = Strings::escapeTags(trim(rawurldecode($args->get(3, ''))));
+               $search = Strings::escapeTags(trim(rawurldecode($_GET['term'] ?? '')));
 
                $return_url = $_GET['return_url'] ?? 'search?q=' . urlencode($search);
 
-               if (local_user()) {
+               if (local_user() && $search) {
                        switch ($action) {
                                case 'add':
                                        $fields = ['uid' => local_user(), 'term' => $search];
index 91b86fbfdc40b2b385b172c06fc80b030caaf2a9..f91a78d66c802dc3ef0fcb9dad5a92f53382bb44 100644 (file)
@@ -14,397 +14,395 @@ use Friendica\Core\Logger;
  */
 class Strings
 {
-    /**
-     * @brief Generates a pseudo-random string of hexadecimal characters
-     *
-     * @param int $size
-     * @return string
-     * @throws \Exception
-     */
-    public static function getRandomHex($size = 64)
-    {
-        $byte_size = ceil($size / 2);
-
-        $bytes = random_bytes($byte_size);
-
-        $return = substr(bin2hex($bytes), 0, $size);
-
-        return $return;
-    }
-
-    /**
-     * Checks, if the given string is a valid hexadecimal code
-     *
-     * @param string $hexCode
-     *
-     * @return bool
-     */
-    public static function isHex($hexCode)
-    {
-        return !empty($hexCode) ? @preg_match("/^[a-f0-9]{2,}$/i", $hexCode) && !(strlen($hexCode) & 1) : false;
-    }
-
-    /**
-     * @brief This is our primary input filter.
-     *
-     * Use this on any text input where angle chars are not valid or permitted
-     * They will be replaced with safer brackets. This may be filtered further
-     * if these are not allowed either.
-     *
-     * @param string $string Input string
-     * @return string Filtered string
-     */
-    public static function escapeTags($string)
-    {
-        return str_replace(["<", ">"], ['[', ']'], $string);
-    }
-
-    /**
-     * @brief Use this on "body" or "content" input where angle chars shouldn't be removed,
-     * and allow them to be safely displayed.
-     * @param string $string
-     *
-     * @return string
-     */
-    public static function escapeHtml($string)
-    {
-        return htmlentities($string, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
-    }
-
-    /**
-     * @brief Generate a string that's random, but usually pronounceable. Used to generate initial passwords
-     *
-     * @param int $len  length
-     *
-     * @return string
-     */
-    public static function getRandomName($len)
-    {
-        if ($len <= 0) {
-            return '';
-        }
-
-        $vowels = ['a', 'a', 'ai', 'au', 'e', 'e', 'e', 'ee', 'ea', 'i', 'ie', 'o', 'ou', 'u'];
-
-        if (mt_rand(0, 5) == 4) {
-            $vowels[] = 'y';
-        }
-
-        $cons = [
-            'b', 'bl', 'br',
-            'c', 'ch', 'cl', 'cr',
-            'd', 'dr',
-            'f', 'fl', 'fr',
-            'g', 'gh', 'gl', 'gr',
-            'h',
-            'j',
-            'k', 'kh', 'kl', 'kr',
-            'l',
-            'm',
-            'n',
-            'p', 'ph', 'pl', 'pr',
-            'qu',
-            'r', 'rh',
-            's', 'sc', 'sh', 'sm', 'sp', 'st',
-            't', 'th', 'tr',
-            'v',
-            'w', 'wh',
-            'x',
-            'z', 'zh'
-        ];
-
-        $midcons = [
-            'ck', 'ct', 'gn', 'ld', 'lf', 'lm', 'lt', 'mb', 'mm', 'mn', 'mp',
-            'nd', 'ng', 'nk', 'nt', 'rn', 'rp', 'rt'
-        ];
-
-        $noend = [
-            'bl', 'br', 'cl', 'cr', 'dr', 'fl', 'fr', 'gl', 'gr',
-            'kh', 'kl', 'kr', 'mn', 'pl', 'pr', 'rh', 'tr', 'qu', 'wh', 'q'
-        ];
-
-        $start = mt_rand(0, 2);
-        if ($start == 0) {
-            $table = $vowels;
-        } else {
-            $table = $cons;
-        }
-
-        $word = '';
-
-        for ($x = 0; $x < $len; $x++) {
-            $r = mt_rand(0, count($table) - 1);
-            $word .= $table[$r];
-
-            if ($table == $vowels) {
-                $table = array_merge($cons, $midcons);
-            } else {
-                $table = $vowels;
-            }
-        }
-
-        $word = substr($word, 0, $len);
-
-        foreach ($noend as $noe) {
-            $noelen = strlen($noe);
-            if ((strlen($word) > $noelen) && (substr($word, -$noelen) == $noe)) {
-                $word = self::getRandomName($len);
-                break;
-            }
-        }
-
-        return $word;
-    }
-
-    /**
-     * Translate and format the network name of a contact
-     *
-     * @param string $network Network name of the contact (e.g. dfrn, rss and so on)
-     * @param string $url     The contact url
-     *
-     * @return string Formatted network name
-     * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-     */
-    public static function formatNetworkName($network, $url = '')
-    {
-        if ($network != '') {
-            if ($url != '') {
-                $network_name = '<a href="' . $url . '">' . ContactSelector::networkToName($network, $url) . '</a>';
-            } else {
-                $network_name = ContactSelector::networkToName($network);
-            }
-
-            return $network_name;
-        }
-    }
-
-    /**
-     * @brief Remove indentation from a text
-     *
-     * @param string $text  String to be transformed.
-     * @param string $chr   Optional. Indentation tag. Default tab (\t).
-     * @param int    $count Optional. Default null.
-     *
-     * @return string       Transformed string.
-     */
-    public static function deindent($text, $chr = "[\t ]", $count = NULL)
-    {
-        $lines = explode("\n", $text);
-
-        if (is_null($count)) {
-            $m = [];
-            $k = 0;
-            while ($k < count($lines) && strlen($lines[$k]) == 0) {
-                $k++;
-            }
-            preg_match("|^" . $chr . "*|", $lines[$k], $m);
-            $count = strlen($m[0]);
-        }
-
-        for ($k = 0; $k < count($lines); $k++) {
-            $lines[$k] = preg_replace("|^" . $chr . "{" . $count . "}|", "", $lines[$k]);
-        }
-
-        return implode("\n", $lines);
-    }
-
-    /**
-     * @brief Get byte size returned in a Data Measurement (KB, MB, GB)
-     *
-     * @param int $bytes    The number of bytes to be measured
-     * @param int $precision    Optional. Default 2.
-     *
-     * @return string   Size with measured units.
-     */
-    public static function formatBytes($bytes, $precision = 2)
-    {
-        $units = ['B', 'KB', 'MB', 'GB', 'TB'];
-        $bytes = max($bytes, 0);
-        $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
-        $pow = min($pow, count($units) - 1);
-        $bytes /= pow(1024, $pow);
-
-        return round($bytes, $precision) . ' ' . $units[$pow];
-    }
-
-    /**
-     * @brief Protect percent characters in sprintf calls
-     *
-     * @param string $s String to transform.
-     *
-     * @return string   Transformed string.
-     */
-    public static function protectSprintf($s)
-    {
-        return str_replace('%', '%%', $s);
-    }
-
-    /**
-     * @brief Base64 Encode URL and translate +/ to -_ Optionally strip padding.
-     *
-     * @param string $s                 URL to encode
-     * @param boolean $strip_padding    Optional. Default false
-     *
-     * @return string   Encoded URL
-     */
-    public static function base64UrlEncode($s, $strip_padding = false)
-    {
-        $s = strtr(base64_encode($s), '+/', '-_');
-
-        if ($strip_padding) {
-            $s = str_replace('=', '', $s);
-        }
-
-        return $s;
-    }
-
-    /**
-     * @brief Decode Base64 Encoded URL and translate -_ to +/
-     * @param string $s URL to decode
-     *
-     * @return string   Decoded URL
-     * @throws \Exception
-     */
-    public static function base64UrlDecode($s)
-    {
-        if (is_array($s)) {
-            Logger::log('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true));
-            return $s;
-        }
-
-        /*
-        *  // Placeholder for new rev of salmon which strips base64 padding.
-        *  // PHP base64_decode handles the un-padded input without requiring this step
-        *  // Uncomment if you find you need it.
-        *
-        *      $l = strlen($s);
-        *      if (!strpos($s,'=')) {
-        *              $m = $l % 4;
-        *              if ($m == 2)
-        *                      $s .= '==';
-        *              if ($m == 3)
-        *                      $s .= '=';
-        *      }
-        *
-        */
-
-        return base64_decode(strtr($s, '-_', '+/'));
-    }
-
-    /**
-     * @brief Normalize url
-     *
-     * @param string $url   URL to be normalized.
-     *
-     * @return string   Normalized URL.
-     */
-    public static function normaliseLink($url)
-    {
-        $ret = str_replace(['https:', '//www.'], ['http:', '//'], $url);
-        return rtrim($ret, '/');
-    }
-
-    /**
-     * @brief Normalize OpenID identity
-     *
-     * @param string $s OpenID Identity
-     *
-     * @return string   normalized OpenId Identity
-     */
-    public static function normaliseOpenID($s)
-    {
-        return trim(str_replace(['http://', 'https://'], ['', ''], $s), '/');
-    }
-
-    /**
-     * @brief Compare two URLs to see if they are the same, but ignore
-     * slight but hopefully insignificant differences such as if one
-     * is https and the other isn't, or if one is www.something and
-     * the other isn't - and also ignore case differences.
-     *
-     * @param string $a first url
-     * @param string $b second url
-     * @return boolean True if the URLs match, otherwise False
-     *
-     */
-    public static function compareLink($a, $b)
-    {
-        return (strcasecmp(self::normaliseLink($a), self::normaliseLink($b)) === 0);
-    }
-
-
-    /**
-     * Ensures the provided URI has its query string punctuation in order.
-     *
-     * @param string $uri
-     * @return string
-     */
-    public static function ensureQueryParameter($uri)
-    {
-        if (strpos($uri, '?') === false && ($pos = strpos($uri, '&')) !== false) {
-            $uri = substr($uri, 0, $pos) . '?' . substr($uri, $pos + 1);
-        }
-
-        return $uri;
-    }
-
-
-    /**
-     * Check if the trimmed provided string is starting with one of the provided characters
-     *
-     * @param string $string
-     * @param array  $chars
-     * @return bool
-     */
-    public static function startsWith($string, array $chars)
-    {
-        $return = in_array(substr(trim($string), 0, 1), $chars);
-
-        return $return;
-    }
-
-    /**
-     * Returns the regular expression string to match URLs in a given text
-     *
-     * @return string
-     * @see https://daringfireball.net/2010/07/improved_regex_for_matching_urls
-     */
-    public static function autoLinkRegEx()
-    {
-        return '@
-(?<![=\'\]"/])          # Not preceded by [, =, \', ], ", /
+       /**
+        * @brief Generates a pseudo-random string of hexadecimal characters
+        *
+        * @param int $size
+        * @return string
+        * @throws \Exception
+        */
+       public static function getRandomHex($size = 64)
+       {
+               $byte_size = ceil($size / 2);
+
+               $bytes = random_bytes($byte_size);
+
+               $return = substr(bin2hex($bytes), 0, $size);
+
+               return $return;
+       }
+
+       /**
+        * Checks, if the given string is a valid hexadecimal code
+        *
+        * @param string $hexCode
+        *
+        * @return bool
+        */
+       public static function isHex($hexCode)
+       {
+               return !empty($hexCode) ? @preg_match("/^[a-f0-9]{2,}$/i", $hexCode) && !(strlen($hexCode) & 1) : false;
+       }
+
+       /**
+        * @brief This is our primary input filter.
+        *
+        * Use this on any text input where angle chars are not valid or permitted
+        * They will be replaced with safer brackets. This may be filtered further
+        * if these are not allowed either.
+        *
+        * @param string $string Input string
+        * @return string Filtered string
+        */
+       public static function escapeTags($string)
+       {
+               return str_replace(["<", ">"], ['[', ']'], $string);
+       }
+
+       /**
+        * @brief Use this on "body" or "content" input where angle chars shouldn't be removed,
+        * and allow them to be safely displayed.
+        * @param string $string
+        *
+        * @return string
+        */
+       public static function escapeHtml($string)
+       {
+               return htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false);
+       }
+
+       /**
+        * @brief Generate a string that's random, but usually pronounceable. Used to generate initial passwords
+        *
+        * @param int $len      length
+        *
+        * @return string
+        */
+       public static function getRandomName($len)
+       {
+               if ($len <= 0) {
+                       return '';
+               }
+
+               $vowels = ['a', 'a', 'ai', 'au', 'e', 'e', 'e', 'ee', 'ea', 'i', 'ie', 'o', 'ou', 'u'];
+
+               if (mt_rand(0, 5) == 4) {
+                       $vowels[] = 'y';
+               }
+
+               $cons = [
+                       'b', 'bl', 'br',
+                       'c', 'ch', 'cl', 'cr',
+                       'd', 'dr',
+                       'f', 'fl', 'fr',
+                       'g', 'gh', 'gl', 'gr',
+                       'h',
+                       'j',
+                       'k', 'kh', 'kl', 'kr',
+                       'l',
+                       'm',
+                       'n',
+                       'p', 'ph', 'pl', 'pr',
+                       'qu',
+                       'r', 'rh',
+                       's', 'sc', 'sh', 'sm', 'sp', 'st',
+                       't', 'th', 'tr',
+                       'v',
+                       'w', 'wh',
+                       'x',
+                       'z', 'zh'
+               ];
+
+               $midcons = [
+                       'ck', 'ct', 'gn', 'ld', 'lf', 'lm', 'lt', 'mb', 'mm', 'mn', 'mp',
+                       'nd', 'ng', 'nk', 'nt', 'rn', 'rp', 'rt'
+               ];
+
+               $noend = [
+                       'bl', 'br', 'cl', 'cr', 'dr', 'fl', 'fr', 'gl', 'gr',
+                       'kh', 'kl', 'kr', 'mn', 'pl', 'pr', 'rh', 'tr', 'qu', 'wh', 'q'
+               ];
+
+               $start = mt_rand(0, 2);
+               if ($start == 0) {
+                       $table = $vowels;
+               } else {
+                       $table = $cons;
+               }
+
+               $word = '';
+
+               for ($x = 0; $x < $len; $x++) {
+                       $r = mt_rand(0, count($table) - 1);
+                       $word .= $table[$r];
+
+                       if ($table == $vowels) {
+                               $table = array_merge($cons, $midcons);
+                       } else {
+                               $table = $vowels;
+                       }
+               }
+
+               $word = substr($word, 0, $len);
+
+               foreach ($noend as $noe) {
+                       $noelen = strlen($noe);
+                       if ((strlen($word) > $noelen) && (substr($word, -$noelen) == $noe)) {
+                               $word = self::getRandomName($len);
+                               break;
+                       }
+               }
+
+               return $word;
+       }
+
+       /**
+        * Translate and format the network name of a contact
+        *
+        * @param string $network Network name of the contact (e.g. dfrn, rss and so on)
+        * @param string $url     The contact url
+        *
+        * @return string Formatted network name
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public static function formatNetworkName($network, $url = '')
+       {
+               if ($network != '') {
+                       if ($url != '') {
+                               $network_name = '<a href="' . $url . '">' . ContactSelector::networkToName($network, $url) . '</a>';
+                       } else {
+                               $network_name = ContactSelector::networkToName($network);
+                       }
+
+                       return $network_name;
+               }
+       }
+
+       /**
+        * @brief Remove indentation from a text
+        *
+        * @param string $text  String to be transformed.
+        * @param string $chr   Optional. Indentation tag. Default tab (\t).
+        * @param int    $count Optional. Default null.
+        *
+        * @return string               Transformed string.
+        */
+       public static function deindent($text, $chr = "[\t ]", $count = NULL)
+       {
+               $lines = explode("\n", $text);
+
+               if (is_null($count)) {
+                       $m = [];
+                       $k = 0;
+                       while ($k < count($lines) && strlen($lines[$k]) == 0) {
+                               $k++;
+                       }
+                       preg_match("|^" . $chr . "*|", $lines[$k], $m);
+                       $count = strlen($m[0]);
+               }
+
+               for ($k = 0; $k < count($lines); $k++) {
+                       $lines[$k] = preg_replace("|^" . $chr . "{" . $count . "}|", "", $lines[$k]);
+               }
+
+               return implode("\n", $lines);
+       }
+
+       /**
+        * @brief Get byte size returned in a Data Measurement (KB, MB, GB)
+        *
+        * @param int $bytes    The number of bytes to be measured
+        * @param int $precision        Optional. Default 2.
+        *
+        * @return string       Size with measured units.
+        */
+       public static function formatBytes($bytes, $precision = 2)
+       {
+               $units = ['B', 'KB', 'MB', 'GB', 'TB'];
+               $bytes = max($bytes, 0);
+               $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
+               $pow = min($pow, count($units) - 1);
+               $bytes /= pow(1024, $pow);
+
+               return round($bytes, $precision) . ' ' . $units[$pow];
+       }
+
+       /**
+        * @brief Protect percent characters in sprintf calls
+        *
+        * @param string $s String to transform.
+        *
+        * @return string       Transformed string.
+        */
+       public static function protectSprintf($s)
+       {
+               return str_replace('%', '%%', $s);
+       }
+
+       /**
+        * @brief Base64 Encode URL and translate +/ to -_ Optionally strip padding.
+        *
+        * @param string $s                                     URL to encode
+        * @param boolean $strip_padding        Optional. Default false
+        *
+        * @return string       Encoded URL
+        */
+       public static function base64UrlEncode($s, $strip_padding = false)
+       {
+               $s = strtr(base64_encode($s), '+/', '-_');
+
+               if ($strip_padding) {
+                       $s = str_replace('=', '', $s);
+               }
+
+               return $s;
+       }
+
+       /**
+        * @brief Decode Base64 Encoded URL and translate -_ to +/
+        * @param string $s URL to decode
+        *
+        * @return string       Decoded URL
+        * @throws \Exception
+        */
+       public static function base64UrlDecode($s)
+       {
+               if (is_array($s)) {
+                       Logger::log('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true));
+                       return $s;
+               }
+
+               /*
+               *  // Placeholder for new rev of salmon which strips base64 padding.
+               *  // PHP base64_decode handles the un-padded input without requiring this step
+               *  // Uncomment if you find you need it.
+               *
+               *       $l = strlen($s);
+               *       if (!strpos($s,'=')) {
+               *               $m = $l % 4;
+               *               if ($m == 2)
+               *                       $s .= '==';
+               *               if ($m == 3)
+               *                       $s .= '=';
+               *       }
+               *
+               */
+
+               return base64_decode(strtr($s, '-_', '+/'));
+       }
+
+       /**
+        * @brief Normalize url
+        *
+        * @param string $url   URL to be normalized.
+        *
+        * @return string       Normalized URL.
+        */
+       public static function normaliseLink($url)
+       {
+               $ret = str_replace(['https:', '//www.'], ['http:', '//'], $url);
+               return rtrim($ret, '/');
+       }
+
+       /**
+        * @brief Normalize OpenID identity
+        *
+        * @param string $s OpenID Identity
+        *
+        * @return string       normalized OpenId Identity
+        */
+       public static function normaliseOpenID($s)
+       {
+               return trim(str_replace(['http://', 'https://'], ['', ''], $s), '/');
+       }
+
+       /**
+        * @brief Compare two URLs to see if they are the same, but ignore
+        * slight but hopefully insignificant differences such as if one
+        * is https and the other isn't, or if one is www.something and
+        * the other isn't - and also ignore case differences.
+        *
+        * @param string $a first url
+        * @param string $b second url
+        * @return boolean True if the URLs match, otherwise False
+        *
+        */
+       public static function compareLink($a, $b)
+       {
+               return (strcasecmp(self::normaliseLink($a), self::normaliseLink($b)) === 0);
+       }
+
+       /**
+        * Ensures the provided URI has its query string punctuation in order.
+        *
+        * @param string $uri
+        * @return string
+        */
+       public static function ensureQueryParameter($uri)
+       {
+               if (strpos($uri, '?') === false && ($pos = strpos($uri, '&')) !== false) {
+                       $uri = substr($uri, 0, $pos) . '?' . substr($uri, $pos + 1);
+               }
+
+               return $uri;
+       }
+
+       /**
+        * Check if the trimmed provided string is starting with one of the provided characters
+        *
+        * @param string $string
+        * @param array  $chars
+        * @return bool
+        */
+       public static function startsWith($string, array $chars)
+       {
+               $return = in_array(substr(trim($string), 0, 1), $chars);
+
+               return $return;
+       }
+
+       /**
+        * Returns the regular expression string to match URLs in a given text
+        *
+        * @return string
+        * @see https://daringfireball.net/2010/07/improved_regex_for_matching_urls
+        */
+       public static function autoLinkRegEx()
+       {
+               return '@
+(?<![=\'\]"/])                 # Not preceded by [, =, \', ], ", /
 \b
-(                              # Capture 1: entire matched URL
-  https?://                            # http or https protocol
+(                                                         # Capture 1: entire matched URL
+  https?://                                                       # http or https protocol
   (?:
-    [^/\s\xA0`!()\[\]{};:\'",<>?«»“”‘’.]    # Domain can\'t start with a .
-    [^/\s\xA0`!()\[\]{};:\'",<>?«»“”‘’]+    # Domain can\'t end with a .
-    \.
-    [^/\s\xA0`!()\[\]{};:\'".,<>?«»“”‘’]+/? # Followed by a slash
+       [^/\s\xA0`!()\[\]{};:\'",<>?«»“”‘’.]    # Domain can\'t start with a .
+       [^/\s\xA0`!()\[\]{};:\'",<>?«»“”‘’]+    # Domain can\'t end with a .
+       \.
+       [^/\s\xA0`!()\[\]{};:\'".,<>?«»“”‘’]+/? # Followed by a slash
   )
-  (?:                                  # One or more:
-    [^\s\xA0()<>]+                         # Run of non-space, non-()<>
-    |                                  #   or
-    \(([^\s\xA0()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
-    |                                  #   or
-    [^\s\xA0`!()\[\]{};:\'".,<>?«»“”‘’]    # not a space or one of these punct chars
+  (?:                                                             # One or more:
+       [^\s\xA0()<>]+                                             # Run of non-space, non-()<>
+       |                                                                  #   or
+       \(([^\s\xA0()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
+       |                                                                  #   or
+       [^\s\xA0`!()\[\]{};:\'".,<>?«»“”‘’]    # not a space or one of these punct chars
   )*
 )@xiu';
-    }
-
-    /**
-     * Ensures a single path item doesn't contain any path-traversing characters
-     *
-     * @see https://stackoverflow.com/a/46097713
-     * @param string $pathItem
-     * @return string
-     */
-    public static function sanitizeFilePathItem($pathItem)
-    {
-        $pathItem = str_replace('/', '_', $pathItem);
-        $pathItem = str_replace('\\', '_', $pathItem);
-        $pathItem = str_replace(DIRECTORY_SEPARATOR, '_', $pathItem); // In case it does not equal the standard values
-
-        return $pathItem;
-    }
+       }
+
+       /**
+        * Ensures a single path item doesn't contain any path-traversing characters
+        *
+        * @see https://stackoverflow.com/a/46097713
+        * @param string $pathItem
+        * @return string
+        */
+       public static function sanitizeFilePathItem($pathItem)
+       {
+               $pathItem = str_replace('/', '_', $pathItem);
+               $pathItem = str_replace('\\', '_', $pathItem);
+               $pathItem = str_replace(DIRECTORY_SEPARATOR, '_', $pathItem); // In case it does not equal the standard values
+
+               return $pathItem;
+       }
 }
index ef65c4685b0da1c04abc4a9ca4e70a8eebdcb358..0601d8e41d1dff48d9245d5dfe107530eef92d42 100644 (file)
@@ -192,8 +192,8 @@ return [
        '/search' => [
                '[/]'                  => [Module\Search\Index::class, [R::GET]],
                '/acl'                 => [Module\Search\Acl::class,   [R::GET, R::POST]],
-               '/saved/add/{term}'    => [Module\Search\Saved::class, [R::GET]],
-               '/saved/remove/{term}' => [Module\Search\Saved::class, [R::GET]],
+               '/saved/add'           => [Module\Search\Saved::class, [R::GET]],
+               '/saved/remove'        => [Module\Search\Saved::class, [R::GET]],
        ],
 
        '/settings' => [
index 03bc88d74c75457ccb61444b144294bdcd69efaa..d090b1c5dd3a088f9dad89a5323616c3f0cce2e5 100644 (file)
@@ -78,7 +78,7 @@ class StringsTest extends TestCase
 
                $this->assertEquals('[submit type="button" onclick="alert(\'failed!\');" /]', $validstring);
                $this->assertEquals(
-                       '&lt;submit type&equals;&quot;button&quot; onclick&equals;&quot;alert&lpar;&apos;failed&excl;&apos;&rpar;&semi;&quot; &sol;&gt;',
+                       "&lt;submit type=&quot;button&quot; onclick=&quot;alert('failed!');&quot; /&gt;",
                        $escapedString
                );
        }
index d566befba01bfd7ea73a7c316c2f286e1886cb13..8317c59b1d4620d4551a7ba91e9a87462124b8e4 100644 (file)
@@ -11,7 +11,7 @@
     {{/if}}
                <input type="submit" name="submit" id="search-submit" value="{{$search_label}}"/>
     {{if $s}}
-           <a href="search/saved/add/{{$q}}?return_url={{$return_url}}">{{$save_label}}</a>
+           <a href="search/saved/add?term={{$q}}&amp;return_url={{$return_url}}">{{$save_label}}</a>
     {{/if}}
 {{/strip}}
        </form>
index 858e921f78c0b403dd4652893e90df9f8d1d28e3..4e3a80b765ea07a8b1af7c5c00f17ad49f9f06ca 100644 (file)
@@ -6,7 +6,7 @@
        <ul role="menu" id="saved-search-ul">
                {{foreach $saved as $search}}
                <li role="menuitem" class="saved-search-li clear">
-                       <a href="search/saved/remove/{{$search.encodedterm}}?return_url={{$return_url}}" title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" class="iconspacer savedsearchdrop"></a>
+                       <a href="search/saved/remove?term={{$search.encodedterm}}&amp;return_url={{$return_url}}" title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" class="iconspacer savedsearchdrop"></a>
                        <a href="search?q={{$search.encodedterm}}" id="saved-search-term-{{$search.id}}" class="savedsearchterm">{{$search.term}}</a>
                </li>
                {{/foreach}}
index 1d47d862b1e25f8660a687ace315d4b889733151..f1c78abc777b291b9c1799005dff2fb6866b577b 100644 (file)
@@ -2312,7 +2312,7 @@ ul.dropdown-menu li:hover {
 .search-content-wrapper > .section-title-wrapper {
     display: none;
 }
-#navbar-button > #search-save-form > #search-save {
+#navbar-button > #search-save {
     margin-top: 3px;
 }
 /* Section-Content-Wrapper */
index 2ab11e637ba8284843476b1f2f6d5a094427c96e..46cea59ba23c60ccefed8efad885d55ae210139d 100644 (file)
@@ -169,7 +169,7 @@ $(document).ready(function(){
        }
 
        // move the "Save the search" button to the second navbar
-       $(".search-content-wrapper #search-save-form ").appendTo("#topbar-second > .container > #navbar-button");
+       $(".search-content-wrapper #search-save").appendTo("#topbar-second > .container > #navbar-button");
 
        // append the vcard-short-info to the second nav after passing the element
        // with .fn (vcard username). Use scrollspy to get the scroll position.
index 7df6dd04f16bfcd0cb6f0cdbdb291ca361ec3523..06b43f6b1584dd4f3c0e8f012517528ac003cd4c 100644 (file)
                                                        <form class="navbar-form" role="search" method="get" action="{{$nav.search.0}}">
                                                                <!-- <img class="hidden-xs" src="{{$nav.userinfo.icon}}" alt="{{$nav.userinfo.name}}" style="max-width:33px; max-height:33px; min-width:33px; min-height:33px; width:33px; height:33px;"> -->
                                                                <div class="form-group form-group-search">
-                                                                       <input accesskey="s" id="nav-search-input-field" class="form-control form-search" type="text" name="search" data-toggle="tooltip" title="{{$search_hint}}" placeholder="{{$nav.search.1}}">
+                                                                       <input accesskey="s" id="nav-search-input-field" class="form-control form-search" type="text" name="q" data-toggle="tooltip" title="{{$search_hint}}" placeholder="{{$nav.search.1}}">
                                                                        <button class="btn btn-default btn-sm form-button-search" type="submit">{{$nav.search.1}}</button>
                                                                </div>
                                                        </form>
index bf2ee53040692c297faef77a264d2b39769506fd..ced6fbbd388062f518fd633c4f40f967ffcb2ab1 100644 (file)
@@ -18,7 +18,7 @@ Some parts of this template will be moved by js to other places (see theme.js) -
                                        <div class="col-md-8">
                                                {{* The button to save searches *}}
                                                {{if $s}}
-                                               <a href="search/saved/add/{{$q}}?return_url={{$return_url}}" class="btn btn-primary btn-small pull-right">{{$save_label}}</a>
+                                               <a href="search/saved/add?term={{$q}}&amp;return_url={{$return_url}}" class="btn btn-primary btn-small pull-right">{{$save_label}}</a>
                                                {{/if}}
 
                                                {{* The select popup menu to select what kind of results the user would like to search for *}}
@@ -46,16 +46,13 @@ Some parts of this template will be moved by js to other places (see theme.js) -
        </div>
 
 {{if $s}}
-       <form id="search-save-form" action="search/saved/add/{{$q}}" method="get">
-               <input type="hidden" name="return_url" value="{{$return_url}}">
-               <button class="btn btn-sm btn-main pull-right" type="submit" id="search-save" title="{{$save_label}}" aria-label="{{$save_label}}" value="{{$save_label}}" data-toggle="tooltip">
+       <a href="search/saved/add?term={{$q}}&amp;return_url={{$return_url}}" class="btn btn-sm btn-main pull-right" id="search-save" title="{{$save_label}}" aria-label="{{$save_label}}" value="{{$save_label}}" data-toggle="tooltip">
        {{if $mode == "tag"}}
-                       <i class="fa fa-plus fa-2x" aria-hidden="true"></i>
+               <i class="fa fa-plus fa-2x" aria-hidden="true"></i>
        {{else}}
-                       <i class="fa fa-floppy-o fa-2x" aria-hidden="true"></i>
+               <i class="fa fa-floppy-o fa-2x" aria-hidden="true"></i>
        {{/if}}
-                       <span class="sr-only">{{$save_label}}</span>
-               </button>
-       </form>
+               <span class="sr-only">{{$save_label}}</span>
+       </a>
 {{/if}}
 </div>
index 1553961e1e26b15140fe3bf40cca71454035aa85..1981508cfd2f8a98e403c9da93e4e5d42cd417fe 100644 (file)
@@ -6,7 +6,7 @@
        <ul role="menu" id="saved-search-ul">
                {{foreach $saved as $search}}
                <li role="menuitem" class="saved-search-li clear">
-                       <a href="search/saved/remove/{{$search.encodedterm}}?return_url={{$return_url}}" title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" class="savedsearchdrop pull-right widget-action faded-icon">
+                       <a href="search/saved/remove?term={{$search.encodedterm}}&amp;return_url={{$return_url}}" title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" class="savedsearchdrop pull-right widget-action faded-icon">
                                <i class="fa fa-trash" aria-hidden="true"></i>
                        </a>
                        <a href="search?q={{$search.encodedterm}}" id="saved-search-term-{{$search.id}}" class="savedsearchterm">{{$search.term}}</a>
index 69e21c786fe1fc1d163ffb9c47726e511a11d0fb..ce99d521d9dbfac402d6dde76b513769eee156cc 100644 (file)
@@ -5,7 +5,7 @@
         {{foreach $saved as $search}}
                        <li class="tool {{if $search.selected}}selected{{/if}}">
                                <a href="search?q={{$search.encodedterm}}" class="label">{{$search.term}}</a>
-                               <a href="search/saved/remove/{{$search.encodedterm}}?return_url={{$return_url}}" class="action icon s10 delete" title="{{$search.delete}}" onclick="return confirmDelete();"></a>
+                               <a href="search/saved/remove?term={{$search.encodedterm}}&amp;return_url={{$return_url}}" class="action icon s10 delete" title="{{$search.delete}}" onclick="return confirmDelete();"></a>
                        </li>
         {{/foreach}}
        </ul>