]> git.mxchange.org Git - friendica.git/blobdiff - include/acl_selectors.php
Merge pull request #2758 from annando/1609-sql-charset
[friendica.git] / include / acl_selectors.php
index 8b03a1312cd2b5aa0307cbde49bd3c6a1b2b8bc5..71a42478ba92c06b80c02f6f3d332af6382deba4 100644 (file)
@@ -1,12 +1,15 @@
 <?php
 
+/**
+ * @file include/acl_selectors.php
+ */
+
 require_once("include/contact_selectors.php");
+require_once("include/contact_widgets.php");
+require_once("include/DirSearch.php");
 require_once("include/features.php");
 require_once("mod/proxy.php");
 
-/**
- *
- */
 
 /**
  * @package acl_selectors
@@ -19,7 +22,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
 
        $o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" >\r\n";
 
-       $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
+       $r = q("SELECT `id`, `name` FROM `group` WHERE NOT `deleted` AND `uid` = %d ORDER BY `name` ASC",
                intval(local_user())
        );
 
@@ -190,8 +193,14 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
 
        $tabindex = ($tabindex > 0 ? "tabindex=\"$tabindex\"" : "");
 
+       if ($privmail AND $preselected) {
+               $sql_extra .= " AND `id` IN (".implode(",", $preselected).")";
+               $hidepreselected = ' style="display: none;"';
+       } else
+               $hidepreselected = "";
+
        if($privmail)
-               $o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\" $tabindex >\r\n";
+               $o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\" $tabindex $hidepreselected>\r\n";
        else
                $o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" $tabindex >\r\n";
 
@@ -209,6 +218,8 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
 
        call_hooks($a->module . '_pre_' . $selname, $arr);
 
+       $receiverlist = array();
+
        if(count($r)) {
                foreach($r as $rr) {
                        if((is_array($preselected)) && in_array($rr['id'], $preselected))
@@ -221,6 +232,8 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
                        else
                                $trimmed = mb_substr($rr['name'],0,20);
 
+                       $receiverlist[] = $trimmed;
+
                        $o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['name']}|{$rr['url']}\" >$trimmed</option>\r\n";
                }
 
@@ -228,6 +241,9 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
 
        $o .= "</select>\r\n";
 
+       if ($privmail AND $preselected)
+               $o .= implode(", ", $receiverlist);
+
        call_hooks($a->module . '_post_' . $selname, $o);
 
        return $o;
@@ -243,7 +259,7 @@ function prune_deadguys($arr) {
        if(! $arr)
                return $arr;
        $str = dbesc(implode(',',$arr));
-       $r = q("select id from contact where id in ( " . $str . ") and blocked = 0 and pending = 0 and archive = 0 ");
+       $r = q("SELECT `id` FROM `contact` WHERE `id` IN ( " . $str . ") AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 ");
        if($r) {
                $ret = array();
                foreach($r as $rr)
@@ -295,7 +311,7 @@ function populate_acl($user = null, $show_jotnets = false) {
                $pubmail_enabled = false;
 
                if(! $mail_disabled) {
-                       $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
+                       $r = q("SELECT `pubmail` FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
                                intval(local_user())
                        );
                        if(count($r)) {
@@ -379,14 +395,14 @@ function acl_lookup(&$a, $out_type = 'json') {
        if(!local_user())
                return "";
 
+       $start  =       (x($_REQUEST,'start')           ? $_REQUEST['start']            : 0);
+       $count  =       (x($_REQUEST,'count')           ? $_REQUEST['count']            : 100);
+       $search  =      (x($_REQUEST,'search')          ? $_REQUEST['search']           : "");
+       $type   =       (x($_REQUEST,'type')            ? $_REQUEST['type']             : "");
+       $mode   =       (x($_REQUEST,'smode')           ? $_REQUEST['smode']            : "");
+       $conv_id =      (x($_REQUEST,'conversation')    ? $_REQUEST['conversation']     : null);
 
-       $start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
-       $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
-       $search = (x($_REQUEST,'search')?$_REQUEST['search']:"");
-       $type = (x($_REQUEST,'type')?$_REQUEST['type']:"");
-       $conv_id = (x($_REQUEST,'conversation')?$_REQUEST['conversation']:null);
-
-       // For use with jquery.autocomplete for private mail completion
+       // For use with jquery.textcomplete for private mail completion
 
        if(x($_REQUEST,'query') && strlen($_REQUEST['query'])) {
                if(! $type)
@@ -394,7 +410,7 @@ function acl_lookup(&$a, $out_type = 'json') {
                $search = $_REQUEST['query'];
        }
 
-//     logger("Searching for ".$search." - type ".$type, LOGGER_DEBUG);
+       logger("Searching for ".$search." - type ".$type, LOGGER_DEBUG);
 
        if ($search!=""){
                $sql_extra = "AND `name` LIKE '%%".dbesc($search)."%%'";
@@ -413,6 +429,9 @@ function acl_lookup(&$a, $out_type = 'json') {
                $group_count = 0;
        }
 
+       $sql_extra2 .= " ".unavailable_networks();
+
+       // autocomplete for editor mentions
        if ($type=='' || $type=='c'){
                $r = q("SELECT COUNT(*) AS c FROM `contact`
                                WHERE `uid` = %d AND `self` = 0
@@ -461,12 +480,12 @@ function acl_lookup(&$a, $out_type = 'json') {
 
        if ($type=='' || $type=='g'){
 
-               $r = q("SELECT `group`.`id`, `group`.`name`, GROUP_CONCAT(DISTINCT `group_member`.`contact-id` SEPARATOR ',') as uids
-                               FROM `group`,`group_member`
-                               WHERE `group`.`deleted` = 0 AND `group`.`uid` = %d
-                                       AND `group_member`.`gid`=`group`.`id`
+               $r = q("SELECT `group`.`id`, `group`.`name`, GROUP_CONCAT(DISTINCT `group_member`.`contact-id` SEPARATOR ',') AS uids
+                               FROM `group`
+                               INNER JOIN `group_member` ON `group_member`.`gid`=`group`.`id` AND `group_member`.`uid` = `group`.`uid`
+                               WHERE NOT `group`.`deleted` AND `group`.`uid` = %d
                                        $sql_extra
-                               GROUP BY `group`.`id`
+                               GROUP BY `group`.`name`
                                ORDER BY `group`.`name`
                                LIMIT %d,%d",
                        intval(local_user()),
@@ -479,7 +498,7 @@ function acl_lookup(&$a, $out_type = 'json') {
                        $groups[] = array(
                                "type"  => "g",
                                "photo" => "images/twopeople.png",
-                               "name"  => $g['name'],
+                               "name"  => htmlentities($g['name']),
                                "id"    => intval($g['id']),
                                "uids"  => array_map("intval", explode(",",$g['uids'])),
                                "link"  => '',
@@ -488,9 +507,9 @@ function acl_lookup(&$a, $out_type = 'json') {
                }
        }
 
-       if ($type=='' || $type=='c'){
+       if ($type==''){
 
-               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, forum FROM `contact`
+               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `forum`, `prv` FROM `contact`
                        WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
                        AND NOT (`network` IN ('%s', '%s'))
                        $sql_extra2
@@ -499,6 +518,17 @@ function acl_lookup(&$a, $out_type = 'json') {
                        dbesc(NETWORK_OSTATUS), dbesc(NETWORK_STATUSNET)
                );
        }
+       elseif ($type=='c'){
+
+               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `forum`, `prv` FROM `contact`
+                       WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
+                       AND NOT (`network` IN ('%s'))
+                       $sql_extra2
+                       ORDER BY `name` ASC ",
+                       intval(local_user()),
+                       dbesc(NETWORK_STATUSNET)
+               );
+       }
        elseif($type == 'm') {
                $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact`
                        WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0
@@ -512,47 +542,52 @@ function acl_lookup(&$a, $out_type = 'json') {
                );
        }
        elseif($type == 'a') {
-               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact`
+               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `forum`, `prv` FROM `contact`
                        WHERE `uid` = %d AND `pending` = 0
                        $sql_extra2
                        ORDER BY `name` ASC ",
                        intval(local_user())
                );
        }
-       else
-               $r = array();
-
-
-       if($type == 'm' || $type == 'a') {
-               $x = array();
-               $x['query'] = $search;
-               $x['photos'] = array();
-               $x['links'] = array();
-               $x['suggestions'] = array();
-               $x['data'] = array();
-               if(count($r)) {
+       elseif($type == 'x') {
+               // autocomplete for global contact search (e.g. navbar search)
+               $r = navbar_complete($a);
+               $contacts = array();
+               if($r) {
                        foreach($r as $g) {
-                               $x['photos'][] = proxy_url($g['micro']);
-                               $x['links'][] = $g['url'];
-                               $x['suggestions'][] = $g['name'];
-                               $x['data'][] = intval($g['id']);
+                               $contacts[] = array(
+                                       "photo"    => proxy_url($g['photo'], false, PROXY_SIZE_MICRO),
+                                       "name"     => $g['name'],
+                                       "nick"     => (x($g['addr']) ? $g['addr'] : $g['url']),
+                                       "network" => $g['network'],
+                                       "link" => $g['url'],
+                                       "forum"    => (x($g['community']) ? 1 : 0),
+                               );
                        }
                }
-               echo json_encode($x);
+               $o = array(
+                       'start' => $start,
+                       'count' => $count,
+                       'items' => $contacts,
+               );
+               echo json_encode($o);
                killme();
        }
+       else
+               $r = array();
+
 
        if(count($r)) {
                foreach($r as $g){
                        $contacts[] = array(
                                "type"  => "c",
-                               "photo" => proxy_url($g['micro']),
-                               "name"  => $g['name'],
+                               "photo" => proxy_url($g['micro'], false, PROXY_SIZE_MICRO),
+                               "name"  => htmlentities($g['name']),
                                "id"    => intval($g['id']),
                                "network" => $g['network'],
                                "link" => $g['url'],
-                               "nick" => ($g['attag']) ? $g['attag'] : $g['nick'],
-                               "forum" => $g['forum']
+                               "nick" => htmlentities(($g['attag']) ? $g['attag'] : $g['nick']),
+                               "forum" => ((x($g['forum']) || x($g['prv'])) ? 1 : 0),
                        );
                }
        }
@@ -565,14 +600,10 @@ function acl_lookup(&$a, $out_type = 'json') {
                function _contact_link($i){ return dbesc($i['link']); }
                $known_contacts = array_map(_contact_link, $contacts);
                $unknow_contacts=array();
-               $r = q("select
-                                       `author-avatar`,`author-name`,`author-link`
-                               from item where parent=%d
-                               and (
-                                       `author-name` LIKE '%%%s%%' OR
-                                       `author-link` LIKE '%%%s%%'
-                               ) and
-                               `author-link` NOT IN ('%s')
+               $r = q("SELECT `author-avatar`,`author-name`,`author-link`
+                               FROM `item` WHERE `parent` = %d
+                                       AND (`author-name` LIKE '%%%s%%' OR `author-link` LIKE '%%%s%%')
+                                       AND `author-link` NOT IN ('%s')
                                GROUP BY `author-link`
                                ORDER BY `author-name` ASC
                                ",
@@ -591,12 +622,12 @@ function acl_lookup(&$a, $out_type = 'json') {
                                // /nickname
                                $unknow_contacts[] = array(
                                        "type"  => "c",
-                                       "photo" => proxy_url($row['author-avatar']),
-                                       "name"  => $row['author-name'],
+                                       "photo" => proxy_url($row['author-avatar'], false, PROXY_SIZE_MICRO),
+                                       "name"  => htmlentities($row['author-name']),
                                        "id"    => '',
                                        "network" => "unknown",
                                        "link" => $row['author-link'],
-                                       "nick" => $nick,
+                                       "nick" => htmlentities($nick),
                                        "forum" => false
                                );
                        }
@@ -606,26 +637,84 @@ function acl_lookup(&$a, $out_type = 'json') {
                $tot += count($unknow_contacts);
        }
 
+       $results = array(
+               "tot"   => $tot,
+               "start" => $start,
+               "count" => $count,
+               "groups" => $groups,
+               "contacts" => $contacts,
+               "items" => $items,
+               "type"  => $type,
+               "search" => $search,
+       );
+
+       call_hooks('acl_lookup_end', $results);
+
        if($out_type === 'html') {
                $o = array(
-                       'tot'           => $tot,
-                       'start' => $start,
-                       'count' => $count,
-                       'groups'        => $groups,
-                       'contacts'      => $contacts,
+                       'tot'           => $results["tot"],
+                       'start'         => $results["start"],
+                       'count'         => $results["count"],
+                       'groups'        => $results["groups"],
+                       'contacts'      => $results["contacts"],
                );
                return $o;
        }
 
        $o = array(
-               'tot'   => $tot,
-               'start' => $start,
-               'count' => $count,
-               'items' => $items,
+               'tot'   => $results["tot"],
+               'start' => $results["start"],
+               'count' => $results["count"],
+               'items' => $results["items"],
        );
 
        echo json_encode($o);
 
        killme();
 }
+/**
+ * @brief Searching for global contacts for autocompletion
+ * 
+ * @param App $a
+ * @return array with the search results
+ */
+function navbar_complete(&$a) {
+
+//     logger('navbar_complete');
 
+       if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
+               return;
+       }
+
+       // check if searching in the local global contact table is enabled
+       $localsearch = get_config('system','poco_local_search');
+
+       $search = $prefix.notags(trim($_REQUEST['search']));
+       $mode = $_REQUEST['smode'];
+
+       // don't search if search term has less than 2 characters
+       if(! $search || mb_strlen($search) < 2)
+               return array();
+
+       if(substr($search,0,1) === '@')
+               $search = substr($search,1);
+
+       if($localsearch) {
+               $x = DirSearch::global_search_by_name($search, $mode);
+               return $x;
+       }
+
+       if(! $localsearch) {
+               $p = (($a->pager['page'] != 1) ? '&p=' . $a->pager['page'] : '');
+
+               $x = z_fetch_url(get_server().'/lsearch?f=' . $p .  '&search=' . urlencode($search));
+               if($x['success']) {
+                       $t = 0;
+                       $j = json_decode($x['body'],true);
+                       if($j && $j['results']) {
+                               return $j['results'];
+                       }
+               }
+       }
+       return;
+}