]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/ACLFormatter.php
Merge pull request #8148 from annando/remote-comment
[friendica.git] / src / Util / ACLFormatter.php
index a7d851508d4e22d1c9441b959eb541c56e2875b9..d79a73298b086ea1ec46308651c736538f14c45a 100644 (file)
@@ -12,30 +12,57 @@ final class ACLFormatter
        /**
         * Turn user/group ACLs stored as angle bracketed text into arrays
         *
-        * @param string|null $ids A angle-bracketed list of IDs
+        * @param string|null $acl_string A angle-bracketed list of IDs
         *
         * @return array The array based on the IDs (empty in case there is no list)
         */
-       public function expand(string $ids = null)
+       public function expand(string $acl_string = null)
        {
                // In case there is no ID list, return empty array (=> no ACL set)
-               if (!isset($ids)) {
+               if (!isset($acl_string)) {
                        return [];
                }
 
                // turn string array of angle-bracketed elements into numeric array
                // e.g. "<1><2><3>" => array(1,2,3);
-               preg_match_all('/<(' . Group::FOLLOWERS . '|'. Group::MUTUALS . '|[0-9]+)>/', $ids, $matches, PREG_PATTERN_ORDER);
+               preg_match_all('/<(' . Group::FOLLOWERS . '|'. Group::MUTUALS . '|[0-9]+)>/', $acl_string, $matches, PREG_PATTERN_ORDER);
 
                return $matches[1];
        }
 
+       /**
+        * Takes an arbitrary ACL string and sanitizes it for storage
+        *
+        * @param string|null $acl_string
+        * @return string
+        */
+       public function sanitize(string $acl_string = null)
+       {
+               if (empty($acl_string)) {
+                       return '';
+               }
+
+               $cleaned_list = trim($acl_string, '<>');
+
+               if (empty($cleaned_list)) {
+                       return '';
+               }
+
+               $elements = explode('><', $cleaned_list);
+
+               sort($elements);
+
+               array_walk($elements, [$this, 'sanitizeItem']);
+
+               return implode('', $elements);
+       }
+
        /**
         * Wrap ACL elements in angle brackets for storage
         *
         * @param string $item The item to sanitise
         */
-       private function sanitize(string &$item) {
+       private function sanitizeItem(string &$item) {
                // The item is an ACL int value
                if (intval($item)) {
                        $item = '<' . intval(Strings::escapeTags(trim($item))) . '>';
@@ -70,7 +97,7 @@ final class ACLFormatter
                }
 
                if (is_array($item)) {
-                       array_walk($item, [$this, 'sanitize']);
+                       array_walk($item, [$this, 'sanitizeItem']);
                        $return = implode('', $item);
                }
                return $return;