Merge branch 'master' of https://github.com/friendica/red
This commit is contained in:
@@ -82,7 +82,7 @@ class RedBrowser extends DAV\Browser\Plugin {
|
||||
date_default_timezone_set($this->auth->getTimezone());
|
||||
|
||||
require_once('include/conversation.php');
|
||||
|
||||
require_once('include/text.php');
|
||||
if ($this->auth->owner_nick) {
|
||||
$html = profile_tabs(get_app(), (($is_owner) ? true : false), $this->auth->owner_nick);
|
||||
}
|
||||
@@ -208,9 +208,9 @@ class RedBrowser extends DAV\Browser\Plugin {
|
||||
$ft['displayName'] = $displayName;
|
||||
$ft['type'] = $type;
|
||||
$ft['size'] = $size;
|
||||
$ft['sizeFormatted'] = $this->userReadableSize($size);
|
||||
$ft['sizeFormatted'] = userReadableSize($size);
|
||||
$ft['lastmodified'] = (($lastmodified) ? datetime_convert('UTC', date_default_timezone_get(), $lastmodified) : '');
|
||||
$ft['iconFromType'] = $this->getIconFromType($type);
|
||||
$ft['iconFromType'] = getIconFromType($type);
|
||||
|
||||
$f[] = $ft;
|
||||
}
|
||||
@@ -224,13 +224,13 @@ class RedBrowser extends DAV\Browser\Plugin {
|
||||
if ($used) {
|
||||
$quotaDesc = t('%1$s used');
|
||||
$quotaDesc = sprintf($quotaDesc,
|
||||
$this->userReadableSize($used));
|
||||
userReadableSize($used));
|
||||
}
|
||||
if ($limit && $used) {
|
||||
$quotaDesc = t('%1$s used of %2$s (%3$s%)');
|
||||
$quotaDesc = sprintf($quotaDesc,
|
||||
$this->userReadableSize($used),
|
||||
$this->userReadableSize($limit),
|
||||
userReadableSize($used),
|
||||
userReadableSize($limit),
|
||||
round($used / $limit, 1));
|
||||
}
|
||||
|
||||
@@ -252,7 +252,8 @@ class RedBrowser extends DAV\Browser\Plugin {
|
||||
'$actionspanel' => $output,
|
||||
'$shared' => t('Shared'),
|
||||
'$create' => t('Create'),
|
||||
'upload' => t('Upload')
|
||||
'$upload' => t('Upload'),
|
||||
'$is_owner' => $is_owner
|
||||
));
|
||||
|
||||
$html .= replace_macros(get_markup_template('cloud_directory.tpl'), array(
|
||||
@@ -282,29 +283,6 @@ class RedBrowser extends DAV\Browser\Plugin {
|
||||
construct_page(get_app());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns a human readable formatted string for filesizes.
|
||||
*
|
||||
* Don't we need such a functionality in other places, too?
|
||||
*
|
||||
* @param int $size filesize in bytes
|
||||
* @return string
|
||||
*/
|
||||
function userReadableSize($size) {
|
||||
$ret = "";
|
||||
if (is_numeric($size)) {
|
||||
$incr = 0;
|
||||
$k = 1024;
|
||||
$unit = array('bytes', 'KB', 'MB', 'GB', 'TB', 'PB');
|
||||
while (($size / $k) >= 1){
|
||||
$incr++;
|
||||
$size = round($size / $k, 2);
|
||||
}
|
||||
$ret = $size . " " . $unit[$incr];
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Creates a form to add new folders and upload files.
|
||||
*
|
||||
@@ -339,65 +317,6 @@ class RedBrowser extends DAV\Browser\Plugin {
|
||||
return z_root() . '/cloud/?sabreAction=asset&assetName=' . urlencode($assetName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns icon name for use with e.g. font-awesome based on mime-type
|
||||
*
|
||||
* @param string $type
|
||||
* @return string
|
||||
*/
|
||||
protected function getIconFromType($type) {
|
||||
$iconMap = array(
|
||||
//Folder
|
||||
t('Collection') => 'icon-folder-close',
|
||||
|
||||
//Common file
|
||||
'application/octet-stream' => 'icon-file-alt',
|
||||
|
||||
//Text
|
||||
'text/plain' => 'icon-file-text-alt',
|
||||
'application/msword' => 'icon-file-text-alt',
|
||||
'application/pdf' => 'icon-file-text-alt',
|
||||
'application/vnd.oasis.opendocument.text' => 'icon-file-text-alt',
|
||||
'application/epub+zip' => 'icon-book',
|
||||
|
||||
//Spreadsheet
|
||||
'application/vnd.oasis.opendocument.spreadsheet' => 'icon-table',
|
||||
'application/vnd.ms-excel' => 'icon-table',
|
||||
|
||||
//Image
|
||||
'image/jpeg' => 'icon-picture',
|
||||
'image/png' => 'icon-picture',
|
||||
'image/gif' => 'icon-picture',
|
||||
'image/svg+xml' => 'icon-picture',
|
||||
|
||||
//Archive
|
||||
'application/zip' => 'icon-archive',
|
||||
'application/x-rar-compressed' => 'icon-archive',
|
||||
|
||||
//Audio
|
||||
'audio/mpeg' => 'icon-music',
|
||||
'audio/wav' => 'icon-music',
|
||||
'application/ogg' => 'icon-music',
|
||||
'audio/ogg' => 'icon-music',
|
||||
'audio/webm' => 'icon-music',
|
||||
'audio/mp4' => 'icon-music',
|
||||
|
||||
//Video
|
||||
'video/quicktime' => 'icon-film',
|
||||
'video/webm' => 'icon-film',
|
||||
'video/mp4' => 'icon-film'
|
||||
);
|
||||
|
||||
$iconFromType = 'icon-file-alt';
|
||||
|
||||
if (array_key_exists($type, $iconMap))
|
||||
{
|
||||
$iconFromType = $iconMap[$type];
|
||||
}
|
||||
|
||||
return $iconFromType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return the hash of an attachment.
|
||||
*
|
||||
@@ -412,6 +331,7 @@ class RedBrowser extends DAV\Browser\Plugin {
|
||||
* The name of the attachment
|
||||
* @return string
|
||||
*/
|
||||
|
||||
protected function findAttachHash($owner, $parentHash, $attachName) {
|
||||
$r = q("SELECT hash FROM attach WHERE uid = %d AND folder = '%s' AND filename = '%s' ORDER BY edited DESC LIMIT 1",
|
||||
intval($owner),
|
||||
|
||||
@@ -15,8 +15,14 @@ function diaspora_dispatch_public($msg) {
|
||||
return;
|
||||
}
|
||||
|
||||
// find everybody following or allowing this author
|
||||
$sys_disabled = true;
|
||||
|
||||
if(! get_config('system','disable_discover_tab')) {
|
||||
$sys_disabled = get_config('system','disable_diaspora_discover_tab');
|
||||
}
|
||||
$sys = (($sys_disabled) ? null : get_sys_channel());
|
||||
|
||||
// find everybody following or allowing this author
|
||||
|
||||
$r = q("SELECT * from channel where channel_id in ( SELECT abook_channel from abook left join xchan on abook_xchan = xchan_hash WHERE xchan_network like '%%diaspora%%' and xchan_addr = '%s' )",
|
||||
dbesc($msg['author'])
|
||||
@@ -29,6 +35,8 @@ function diaspora_dispatch_public($msg) {
|
||||
logger('diaspora_public: delivering to: ' . $rr['channel_name'] . ' (' . $rr['channel_address'] . ') ');
|
||||
diaspora_dispatch($rr,$msg);
|
||||
}
|
||||
if($sys)
|
||||
diaspora_dispatch($sys,$msg);
|
||||
}
|
||||
else
|
||||
logger('diaspora_public: no subscribers');
|
||||
|
||||
@@ -333,6 +333,7 @@ function notification($params) {
|
||||
|
||||
$datarray = array();
|
||||
$datarray['hash'] = $hash;
|
||||
$datarray['sender_hash'] = $sender['xchan_hash'];
|
||||
$datarray['name'] = $sender['xchan_name'];
|
||||
$datarray['url'] = $sender['xchan_url'];
|
||||
$datarray['photo'] = $sender['xchan_photo_s'];
|
||||
|
||||
@@ -2186,6 +2186,20 @@ function item_store($arr,$allow_exec = false) {
|
||||
unset($arr['term']);
|
||||
}
|
||||
|
||||
if(strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid) || strlen($public_policy))
|
||||
$private = 1;
|
||||
else
|
||||
$private = $arr['item_private'];
|
||||
|
||||
$arr['parent'] = $parent_id;
|
||||
$arr['allow_cid'] = $allow_cid;
|
||||
$arr['allow_gid'] = $allow_gid;
|
||||
$arr['deny_cid'] = $deny_cid;
|
||||
$arr['deny_gid'] = $deny_gid;
|
||||
$arr['public_policy'] = $public_policy;
|
||||
$arr['item_private'] = $private;
|
||||
$arr['comments_closed'] = $comments_closed;
|
||||
|
||||
logger('item_store: ' . print_r($arr,true), LOGGER_DATA);
|
||||
|
||||
dbesc_array($arr);
|
||||
@@ -2203,7 +2217,6 @@ function item_store($arr,$allow_exec = false) {
|
||||
intval($arr['uid'])
|
||||
);
|
||||
|
||||
|
||||
if($r && count($r)) {
|
||||
$current_post = $r[0]['id'];
|
||||
$arr = $r[0]; // This will gives us a fresh copy of what's now in the DB and undo the db escaping, which really messes up the notifications
|
||||
@@ -2223,40 +2236,14 @@ function item_store($arr,$allow_exec = false) {
|
||||
);
|
||||
}
|
||||
|
||||
if((! $parent_id) || ($arr['parent_mid'] === $arr['mid']))
|
||||
$parent_id = $current_post;
|
||||
$arr['id'] = $current_post;
|
||||
|
||||
if(strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid) || strlen($public_policy))
|
||||
$private = 1;
|
||||
else
|
||||
$private = $arr['item_private'];
|
||||
if(! intval($r[0]['parent'])) {
|
||||
$x = q("update item set parent = id where id = %d",
|
||||
intval($r[0]['id'])
|
||||
);
|
||||
}
|
||||
|
||||
// Set parent id - and also make sure to inherit the parent's ACL's.
|
||||
|
||||
$r = q("UPDATE item SET parent = %d, allow_cid = '%s', allow_gid = '%s',
|
||||
deny_cid = '%s', deny_gid = '%s', public_policy = '%s', item_private = %d, comments_closed = '%s'
|
||||
WHERE id = %d",
|
||||
intval($parent_id),
|
||||
dbesc($allow_cid),
|
||||
dbesc($allow_gid),
|
||||
dbesc($deny_cid),
|
||||
dbesc($deny_gid),
|
||||
dbesc($public_policy),
|
||||
intval($private),
|
||||
dbesc($comments_closed),
|
||||
intval($current_post)
|
||||
);
|
||||
|
||||
// These are probably redundant now that we've queried the just stored post
|
||||
$arr['id'] = $current_post;
|
||||
$arr['parent'] = $parent_id;
|
||||
$arr['allow_cid'] = $allow_cid;
|
||||
$arr['allow_gid'] = $allow_gid;
|
||||
$arr['deny_cid'] = $deny_cid;
|
||||
$arr['deny_gid'] = $deny_gid;
|
||||
$arr['public_policy'] = $public_policy;
|
||||
$arr['item_private'] = $private;
|
||||
$arr['comments_closed'] = $comments_closed;
|
||||
|
||||
// Store taxonomy
|
||||
|
||||
@@ -2865,12 +2852,27 @@ function tag_deliver($uid,$item_id) {
|
||||
if(preg_match($pattern,$body,$matches))
|
||||
$tagged = true;
|
||||
|
||||
$pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'] . '+','/') . '\[\/zrl\]/';
|
||||
if(preg_match($pattern,$body,$matches))
|
||||
$plustagged = true;
|
||||
$pattern = '/@\!?\[zrl\=(.*?)\](.*?)\+\[\/zrl\]/';
|
||||
|
||||
if(preg_match_all($pattern,$body,$matches,PREG_SET_ORDER)) {
|
||||
$max_forums = get_config('system','max_tagged_forums');
|
||||
if(! $max_forums)
|
||||
$max_forums = 2;
|
||||
$matched_forums = 0;
|
||||
foreach($matches as $match) {
|
||||
$matched_forums ++;
|
||||
if($term['url'] === $match[1] && $term['term'] === $match[2]) {
|
||||
if($matched_forums <= $max_forums) {
|
||||
$plustagged = true;
|
||||
break;
|
||||
}
|
||||
logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(! ($tagged || $plustagged)) {
|
||||
logger('tag_deliver: mention was in a reshare - ignoring');
|
||||
logger('tag_deliver: mention was in a reshare or exceeded max_tagged_forums - ignoring');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2987,6 +2989,7 @@ function tgroup_check($uid,$item) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if($mention) {
|
||||
logger('tgroup_check: mention found for ' . $u[0]['channel_name']);
|
||||
}
|
||||
@@ -2995,6 +2998,7 @@ function tgroup_check($uid,$item) {
|
||||
|
||||
// At this point we've determined that the person receiving this post was mentioned in it.
|
||||
// Now let's check if this mention was inside a reshare so we don't spam a forum
|
||||
// note: $term has been set to the matching term
|
||||
|
||||
|
||||
$body = $item['body'];
|
||||
@@ -3006,13 +3010,34 @@ function tgroup_check($uid,$item) {
|
||||
|
||||
$body = preg_replace('/\[share(.*?)\[\/share\]/','',$body);
|
||||
|
||||
$pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'] . '+','/') . '\[\/zrl\]/';
|
||||
|
||||
// $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'] . '+','/') . '\[\/zrl\]/';
|
||||
|
||||
if(! preg_match($pattern,$body,$matches)) {
|
||||
logger('tgroup_check: mention was in a reshare - ignoring');
|
||||
return false;
|
||||
$pattern = '/@\!?\[zrl\=(.*?)\](.*?)\+\[\/zrl\]/';
|
||||
|
||||
$found = false;
|
||||
|
||||
if(preg_match_all($pattern,$body,$matches,PREG_SET_ORDER)) {
|
||||
$max_forums = get_config('system','max_tagged_forums');
|
||||
if(! $max_forums)
|
||||
$max_forums = 2;
|
||||
$matched_forums = 0;
|
||||
foreach($matches as $match) {
|
||||
$matched_forums ++;
|
||||
if($term['url'] === $match[1] && $term['term'] === $match[2]) {
|
||||
if($matched_forums <= $max_forums) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(! $found) {
|
||||
logger('tgroup_check: mention was in a reshare or exceeded max_tagged_forums - ignoring');
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ function onepoll_run($argv, $argc){
|
||||
|
||||
if($contact['xchan_connurl']) {
|
||||
$r = q("SELECT xlink_id from xlink
|
||||
where xlink_xchan = '%s' and xlink_updated > %s - INTERVAL %s limit 1",
|
||||
where xlink_xchan = '%s' and xlink_updated > %s - INTERVAL %s and xlink_static = 0 limit 1",
|
||||
intval($contact['xchan_hash']),
|
||||
db_utcnow(), db_quoteinterval('1 DAY')
|
||||
);
|
||||
|
||||
@@ -160,7 +160,7 @@ function poller_run($argv, $argc){
|
||||
|
||||
// get rid of really old poco records
|
||||
|
||||
q("delete from xlink where xlink_updated < %s - INTERVAL %s",
|
||||
q("delete from xlink where xlink_updated < %s - INTERVAL %s and xlink_static = 0 ",
|
||||
db_utcnow(), db_quoteinterval('14 DAY')
|
||||
);
|
||||
|
||||
|
||||
@@ -186,13 +186,13 @@ function poco_load($xchan = '',$url = null) {
|
||||
$total ++;
|
||||
|
||||
|
||||
$r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' limit 1",
|
||||
$r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 0 limit 1",
|
||||
dbesc($xchan),
|
||||
dbesc($hash)
|
||||
);
|
||||
|
||||
if(! $r) {
|
||||
q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_updated ) values ( '%s', '%s', %d, '%s', '%s' ) ",
|
||||
q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', 0 ) ",
|
||||
dbesc($xchan),
|
||||
dbesc($hash),
|
||||
intval($rating),
|
||||
@@ -211,7 +211,7 @@ function poco_load($xchan = '',$url = null) {
|
||||
}
|
||||
logger("poco_load: loaded $total entries",LOGGER_DEBUG);
|
||||
|
||||
q("delete from xlink where xlink_xchan = '%s' and xlink_updated < %s - INTERVAL %s",
|
||||
q("delete from xlink where xlink_xchan = '%s' and xlink_updated < %s - INTERVAL %s and xlink_static = 0",
|
||||
dbesc($xchan),
|
||||
db_utcnow(), db_quoteinterval('2 DAY')
|
||||
);
|
||||
@@ -222,7 +222,7 @@ function poco_load($xchan = '',$url = null) {
|
||||
|
||||
function count_common_friends($uid,$xchan) {
|
||||
|
||||
$r = q("SELECT count(xlink_id) as total from xlink where xlink_xchan = '%s' and xlink_link in
|
||||
$r = q("SELECT count(xlink_id) as total from xlink where xlink_xchan = '%s' and xlink_static = 0 and xlink_link in
|
||||
(select abook_xchan from abook where abook_xchan != '%s' and abook_channel = %d and abook_flags = 0 )",
|
||||
dbesc($xchan),
|
||||
dbesc($xchan),
|
||||
@@ -243,7 +243,7 @@ function common_friends($uid,$xchan,$start = 0,$limit=100000000,$shuffle = false
|
||||
else
|
||||
$sql_extra = " order by xchan_name asc ";
|
||||
|
||||
$r = q("SELECT * from xchan left join xlink on xlink_link = xchan_hash where xlink_xchan = '%s' and xlink_link in
|
||||
$r = q("SELECT * from xchan left join xlink on xlink_link = xchan_hash where xlink_xchan = '%s' and xlink_static = 0 and xlink_link in
|
||||
(select abook_xchan from abook where abook_xchan != '%s' and abook_channel = %d and abook_flags = 0 ) $sql_extra limit %d offset %d",
|
||||
dbesc($xchan),
|
||||
dbesc($xchan),
|
||||
@@ -340,6 +340,7 @@ function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) {
|
||||
and not xlink_link in ( select abook_xchan from abook where abook_channel = %d )
|
||||
and not xlink_link in ( select xchan from xign where uid = %d )
|
||||
and xlink_xchan != ''
|
||||
and xlink_static = 0
|
||||
and not ( xchan_flags & %d )>0
|
||||
and not ( xchan_flags & %d )>0
|
||||
group by xchan_hash order by total desc limit %d offset %d ",
|
||||
@@ -360,6 +361,7 @@ function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) {
|
||||
where xlink_xchan = ''
|
||||
and not xlink_link in ( select abook_xchan from abook where abook_channel = %d )
|
||||
and not xlink_link in ( select xchan from xign where uid = %d )
|
||||
and xlink_static = 0
|
||||
and not ( xchan_flags & %d )>0
|
||||
and not ( xchan_flags & %d )>0
|
||||
group by xchan_hash order by total desc limit %d offset %d ",
|
||||
@@ -405,7 +407,7 @@ function update_suggestions() {
|
||||
// the targets may have changed their preferences and don't want to be suggested - and they
|
||||
// may have simply gone away.
|
||||
|
||||
$r = q("delete from xlink where xlink_xchan = '' and xlink_updated < %s - INTERVAL %s",
|
||||
$r = q("delete from xlink where xlink_xchan = '' and xlink_updated < %s - INTERVAL %s and xlink_static = 0",
|
||||
db_utcnow(), db_quoteinterval('7 DAY')
|
||||
);
|
||||
|
||||
@@ -418,3 +420,212 @@ function update_suggestions() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function poco($a,$extended = false) {
|
||||
|
||||
$system_mode = false;
|
||||
|
||||
if(intval(get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
|
||||
logger('mod_poco: block_public');
|
||||
http_status_exit(401);
|
||||
}
|
||||
|
||||
$observer = $a->get_observer();
|
||||
|
||||
if(argc() > 1) {
|
||||
$user = notags(trim(argv(1)));
|
||||
}
|
||||
if(! x($user)) {
|
||||
$c = q("select * from pconfig where cat = 'system' and k = 'suggestme' and v = '1'");
|
||||
if(! $c) {
|
||||
logger('mod_poco: system mode. No candidates.', LOGGER_DEBUG);
|
||||
http_status_exit(404);
|
||||
}
|
||||
$system_mode = true;
|
||||
}
|
||||
|
||||
|
||||
$format = (($_REQUEST['format']) ? $_REQUEST['format'] : 'json');
|
||||
|
||||
$justme = false;
|
||||
|
||||
if(argc() > 2 && argv(2) === '@me')
|
||||
$justme = true;
|
||||
if(argc() > 3) {
|
||||
if(argv(3) === '@all')
|
||||
$justme = false;
|
||||
elseif(argv(3) === '@self')
|
||||
$justme = true;
|
||||
}
|
||||
if(argc() > 4 && intval(argv(4)) && $justme == false)
|
||||
$cid = intval(argv(4));
|
||||
|
||||
if(! $system_mode) {
|
||||
|
||||
$r = q("SELECT channel_id from channel where channel_address = '%s' limit 1",
|
||||
dbesc($user)
|
||||
);
|
||||
if(! $r) {
|
||||
logger('mod_poco: user mode. Account not found. ' . $user);
|
||||
http_status_exit(404);
|
||||
}
|
||||
|
||||
$channel_id = $r[0]['channel_id'];
|
||||
$ohash = (($observer) ? $observer['xchan_hash'] : '');
|
||||
|
||||
if(! perm_is_allowed($channel_id,$ohash,'view_contacts')) {
|
||||
logger('mod_poco: user mode. Permission denied for ' . $ohash . ' user: ' . $user);
|
||||
http_status_exit(401);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if($justme)
|
||||
$sql_extra = " and ( abook_flags & " . ABOOK_FLAG_SELF . " )>0 ";
|
||||
else
|
||||
$sql_extra = " and abook_flags = 0 ";
|
||||
|
||||
if($cid)
|
||||
$sql_extra = sprintf(" and abook_id = %d ",intval($cid));
|
||||
|
||||
if($system_mode) {
|
||||
$r = q("SELECT count(*) as `total` from abook where ( abook_flags & " . ABOOK_FLAG_SELF .
|
||||
" )>0 and abook_channel in (select uid from pconfig where cat = 'system' and k = 'suggestme' and v = '1') ");
|
||||
}
|
||||
else {
|
||||
$r = q("SELECT count(*) as `total` from abook where abook_channel = %d
|
||||
$sql_extra ",
|
||||
intval($channel_id)
|
||||
);
|
||||
$rooms = q("select * from menu_item where ( mitem_flags & " . intval(MENU_ITEM_CHATROOM) . " )>0 and allow_cid = '' and allow_gid = '' and deny_cid = '' and deny_gid = '' and mitem_channel_id = %d",
|
||||
intval($channel_id)
|
||||
);
|
||||
}
|
||||
if($r)
|
||||
$totalResults = intval($r[0]['total']);
|
||||
else
|
||||
$totalResults = 0;
|
||||
|
||||
$startIndex = intval($_GET['startIndex']);
|
||||
if(! $startIndex)
|
||||
$startIndex = 0;
|
||||
$itemsPerPage = ((x($_GET,'count') && intval($_GET['count'])) ? intval($_GET['count']) : $totalResults);
|
||||
|
||||
|
||||
if($system_mode) {
|
||||
$r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where ( abook_flags & " . ABOOK_FLAG_SELF .
|
||||
" )>0 and abook_channel in (select uid from pconfig where cat = 'system' and k = 'suggestme' and v = '1') limit %d offset %d ",
|
||||
intval($itemsPerPage),
|
||||
intval($startIndex)
|
||||
);
|
||||
}
|
||||
else {
|
||||
$r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d
|
||||
$sql_extra LIMIT %d OFFSET %d",
|
||||
intval($channel_id),
|
||||
intval($itemsPerPage),
|
||||
intval($startIndex)
|
||||
);
|
||||
}
|
||||
|
||||
$ret = array();
|
||||
if(x($_GET,'sorted'))
|
||||
$ret['sorted'] = 'false';
|
||||
if(x($_GET,'filtered'))
|
||||
$ret['filtered'] = 'false';
|
||||
if(x($_GET,'updatedSince'))
|
||||
$ret['updateSince'] = 'false';
|
||||
|
||||
$ret['startIndex'] = (string) $startIndex;
|
||||
$ret['itemsPerPage'] = (string) $itemsPerPage;
|
||||
$ret['totalResults'] = (string) $totalResults;
|
||||
|
||||
if($rooms) {
|
||||
$ret['chatrooms'] = array();
|
||||
foreach($rooms as $room) {
|
||||
$ret['chatrooms'][] = array('url' => $room['mitem_link'], 'desc' => $room['mitem_desc']);
|
||||
}
|
||||
}
|
||||
|
||||
$ret['entry'] = array();
|
||||
|
||||
|
||||
$fields_ret = array(
|
||||
'id' => false,
|
||||
'guid' => false,
|
||||
'guid_sig' => false,
|
||||
'hash' => false,
|
||||
'displayName' => false,
|
||||
'urls' => false,
|
||||
'preferredUsername' => false,
|
||||
'photos' => false,
|
||||
'rating' => false
|
||||
);
|
||||
|
||||
if((! x($_GET,'fields')) || ($_GET['fields'] === '@all'))
|
||||
foreach($fields_ret as $k => $v)
|
||||
$fields_ret[$k] = true;
|
||||
else {
|
||||
$fields_req = explode(',',$_GET['fields']);
|
||||
foreach($fields_req as $f)
|
||||
$fields_ret[trim($f)] = true;
|
||||
}
|
||||
|
||||
if(is_array($r)) {
|
||||
if(count($r)) {
|
||||
foreach($r as $rr) {
|
||||
$entry = array();
|
||||
if($fields_ret['id'])
|
||||
$entry['id'] = $rr['abook_id'];
|
||||
if($fields_ret['guid'])
|
||||
$entry['guid'] = $rr['xchan_guid'];
|
||||
if($fields_ret['guid_sig'])
|
||||
$entry['guid_sig'] = $rr['xchan_guid_sig'];
|
||||
if($fields_ret['hash'])
|
||||
$entry['hash'] = $rr['xchan_hash'];
|
||||
|
||||
if($fields_ret['displayName'])
|
||||
$entry['displayName'] = $rr['xchan_name'];
|
||||
if($fields_ret['urls']) {
|
||||
$entry['urls'] = array(array('value' => $rr['xchan_url'], 'type' => 'profile'));
|
||||
$network = $rr['xchan_network'];
|
||||
if(strpos($network,'friendica') !== false)
|
||||
$network = 'friendica';
|
||||
if($rr['xchan_addr'])
|
||||
$entry['urls'][] = array('value' => 'acct:' . $rr['xchan_addr'], 'type' => $network);
|
||||
}
|
||||
if($fields_ret['preferredUsername'])
|
||||
$entry['preferredUsername'] = substr($rr['xchan_addr'],0,strpos($rr['xchan_addr'],'@'));
|
||||
if($fields_ret['photos'])
|
||||
$entry['photos'] = array(array('value' => $rr['xchan_photo_l'], 'mimetype' => $rr['xchan_photo_mimetype'], 'type' => 'profile'));
|
||||
if($fields_ret['rating']) {
|
||||
$entry['rating'] = ((array_key_exists('abook_rating',$rr)) ? intval($rr['abook_rating']) : 0);
|
||||
$entry['rating_text'] = ((array_key_exists('abook_rating_text',$rr)) ? $rr['abook_rating_text'] : '');
|
||||
// maybe this should be a composite calculated rating in $system_mode
|
||||
if($system_mode)
|
||||
$entry['rating'] = 0;
|
||||
}
|
||||
$ret['entry'][] = $entry;
|
||||
}
|
||||
}
|
||||
else
|
||||
$ret['entry'][] = array();
|
||||
}
|
||||
else
|
||||
http_status_exit(500);
|
||||
|
||||
if($format === 'xml') {
|
||||
header('Content-type: text/xml');
|
||||
echo replace_macros(get_markup_template('poco_xml.tpl'),array_xmlify(array('$response' => $ret)));
|
||||
http_status_exit(500);
|
||||
}
|
||||
if($format === 'json') {
|
||||
header('Content-type: application/json');
|
||||
echo json_encode($ret);
|
||||
killme();
|
||||
}
|
||||
else
|
||||
http_status_exit(500);
|
||||
|
||||
}
|
||||
@@ -2378,3 +2378,74 @@ function linkify_tags($a, &$body, $uid) {
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns icon name for use with e.g. font-awesome based on mime-type
|
||||
*
|
||||
* @param string $type
|
||||
* @return string
|
||||
*/
|
||||
function getIconFromType($type) {
|
||||
$iconMap = array(
|
||||
//Folder
|
||||
t('Collection') => 'icon-folder-close',
|
||||
//Common file
|
||||
'application/octet-stream' => 'icon-file-alt',
|
||||
//Text
|
||||
'text/plain' => 'icon-file-text-alt',
|
||||
'application/msword' => 'icon-file-text-alt',
|
||||
'application/pdf' => 'icon-file-text-alt',
|
||||
'application/vnd.oasis.opendocument.text' => 'icon-file-text-alt',
|
||||
'application/epub+zip' => 'icon-book',
|
||||
//Spreadsheet
|
||||
'application/vnd.oasis.opendocument.spreadsheet' => 'icon-table',
|
||||
'application/vnd.ms-excel' => 'icon-table',
|
||||
//Image
|
||||
'image/jpeg' => 'icon-picture',
|
||||
'image/png' => 'icon-picture',
|
||||
'image/gif' => 'icon-picture',
|
||||
'image/svg+xml' => 'icon-picture',
|
||||
//Archive
|
||||
'application/zip' => 'icon-archive',
|
||||
'application/x-rar-compressed' => 'icon-archive',
|
||||
//Audio
|
||||
'audio/mpeg' => 'icon-music',
|
||||
'audio/wav' => 'icon-music',
|
||||
'application/ogg' => 'icon-music',
|
||||
'audio/ogg' => 'icon-music',
|
||||
'audio/webm' => 'icon-music',
|
||||
'audio/mp4' => 'icon-music',
|
||||
//Video
|
||||
'video/quicktime' => 'icon-film',
|
||||
'video/webm' => 'icon-film',
|
||||
'video/mp4' => 'icon-film'
|
||||
);
|
||||
|
||||
$iconFromType = 'icon-file-alt';
|
||||
|
||||
if (array_key_exists($type, $iconMap)) {
|
||||
$iconFromType = $iconMap[$type];
|
||||
}
|
||||
|
||||
return $iconFromType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns a human readable formatted string for filesizes.
|
||||
*
|
||||
* @param int $size filesize in bytes
|
||||
* @return string
|
||||
*/
|
||||
function userReadableSize($size) {
|
||||
$ret = "";
|
||||
if (is_numeric($size)) {
|
||||
$incr = 0;
|
||||
$k = 1024;
|
||||
$unit = array('bytes', 'KB', 'MB', 'GB', 'TB', 'PB');
|
||||
while (($size / $k) >= 1){
|
||||
$incr++;
|
||||
$size = round($size / $k, 2);
|
||||
}
|
||||
$ret = $size . " " . $unit[$incr];
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
@@ -1096,6 +1096,12 @@ function zot_import($arr, $sender_url) {
|
||||
$i['notify']['sender']['hash'] = make_xchan_hash($i['notify']['sender']['guid'],$i['notify']['sender']['guid_sig']);
|
||||
$deliveries = null;
|
||||
|
||||
if(array_key_exists('message',$i) && array_key_exists('type',$i['message']) && $i['message']['type'] === 'rating') {
|
||||
// rating messages are processed only by directory servers
|
||||
logger('Rating received: ' . print_r($arr,true), LOGGER_DATA);
|
||||
$result = process_rating_delivery($i['notify']['sender'],$arr);
|
||||
}
|
||||
|
||||
if(array_key_exists('recipients',$i['notify']) && count($i['notify']['recipients'])) {
|
||||
logger('specific recipients');
|
||||
$recip_arr = array();
|
||||
@@ -1115,7 +1121,8 @@ function zot_import($arr, $sender_url) {
|
||||
// It's a specifically targetted post. If we were sent a public_scope hint (likely),
|
||||
// get rid of it so that it doesn't get stored and cause trouble.
|
||||
|
||||
if(($i) && is_array($i) && array_key_exists('message',$i) && is_array($i['message']) && array_key_exists('public_scope',$i['message']))
|
||||
if(($i) && is_array($i) && array_key_exists('message',$i) && is_array($i['message'])
|
||||
&& $i['message']['type'] === 'activity' && array_key_exists('public_scope',$i['message']))
|
||||
unset($i['message']['public_scope']);
|
||||
|
||||
$deliveries = $r;
|
||||
@@ -1124,7 +1131,7 @@ function zot_import($arr, $sender_url) {
|
||||
|
||||
}
|
||||
else {
|
||||
if(($i['message']) && (array_key_exists('flags',$i['message'])) && (in_array('private',$i['message']['flags']))) {
|
||||
if(($i['message']) && (array_key_exists('flags',$i['message'])) && (in_array('private',$i['message']['flags'])) && $i['message']['type'] === 'activity') {
|
||||
if(array_key_exists('public_scope',$i['message']) && $i['message']['public_scope'] === 'public') {
|
||||
// This should not happen but until we can stop it...
|
||||
logger('private message was delivered with no recipients.');
|
||||
@@ -1215,6 +1222,7 @@ function zot_import($arr, $sender_url) {
|
||||
$result = process_profile_delivery($i['notify']['sender'],$arr,$deliveries);
|
||||
|
||||
}
|
||||
|
||||
elseif($i['message']['type'] === 'channel_sync') {
|
||||
// $arr = get_channelsync_elements($i['message']);
|
||||
|
||||
@@ -1477,7 +1485,7 @@ function process_delivery($sender,$arr,$deliveries,$relay,$public = false,$reque
|
||||
// As a side effect we will also do a preliminary check that we have the top-level-post, otherwise
|
||||
// processing it is pointless.
|
||||
|
||||
$r = q("select route from item where mid = '%s' and uid = %d limit 1",
|
||||
$r = q("select route, id from item where mid = '%s' and uid = %d limit 1",
|
||||
dbesc($arr['parent_mid']),
|
||||
intval($channel['channel_id'])
|
||||
);
|
||||
@@ -1514,14 +1522,37 @@ function process_delivery($sender,$arr,$deliveries,$relay,$public = false,$reque
|
||||
|
||||
// going downstream check that we have the same upstream provider that
|
||||
// sent it to us originally. Ignore it if it came from another source
|
||||
// (with potentially different permissions)
|
||||
// (with potentially different permissions).
|
||||
// only compare the last hop since it could have arrived at the last location any number of ways.
|
||||
// Always accept empty routes and firehose items (route contains 'undefined') .
|
||||
|
||||
$existing_route = explode(',', $r[0]['route']);
|
||||
$routes = count($existing_route);
|
||||
if($routes) {
|
||||
$last_hop = array_pop($existing_route);
|
||||
$last_prior_route = implode(',',$existing_route);
|
||||
}
|
||||
else {
|
||||
$last_hop = '';
|
||||
$last_prior_route = '';
|
||||
}
|
||||
|
||||
if(in_array('undefined',$existing_route) || $last_hop == 'undefined' || $sender['hash'] == 'undefined')
|
||||
$last_hop = '';
|
||||
|
||||
$current_route = (($arr['route']) ? $arr['route'] . ',' : '') . $sender['hash'];
|
||||
|
||||
if($r[0]['route'] != $current_route) {
|
||||
if($last_hop && $last_hop != $sender['hash']) {
|
||||
logger('comment route mismatch: parent route = ' . $r[0]['route'] . ' expected = ' . $current_route, LOGGER_DEBUG);
|
||||
logger('comment route mismatch: parent msg = ' . $r[0]['id'],LOGGER_DEBUG);
|
||||
$result[] = array($d['hash'],'comment route mismatch',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
|
||||
continue;
|
||||
}
|
||||
|
||||
// we'll add sender['hash'] onto this when we deliver it. $last_prior_route now has the previously stored route
|
||||
// *except* for the sender['hash'] which would've been the last hop before it got to us.
|
||||
|
||||
$arr['route'] = $last_prior_route;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1771,6 +1802,41 @@ function process_mail_delivery($sender,$arr,$deliveries) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
function process_rating_delivery($sender,$arr) {
|
||||
|
||||
$dirmode = intval(get_config('system','directory_mode'));
|
||||
if($dirmode == DIRECTORY_MODE_NORMAL)
|
||||
return;
|
||||
|
||||
if(! $arr['target'])
|
||||
return;
|
||||
|
||||
$r = q("select * from xlink where xlink_xchan = '%s' and xlink_target = '%s' limit 1",
|
||||
dbesc($sender['hash']),
|
||||
dbesc($arr['target'])
|
||||
);
|
||||
if($r) {
|
||||
$x = q("update xlink set xlink_rating = %d, xlink_rating_text = '%s', xlink_updated = '%s' where xlink_id = %d",
|
||||
intval($arr['rating']),
|
||||
intval($arr['rating_text']),
|
||||
dbesc(datetime_convert()),
|
||||
intval($r[0]['xlink_id'])
|
||||
);
|
||||
}
|
||||
else {
|
||||
$x = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_updated, xlink_static )
|
||||
values( '%s', '%s', %d, '%s', '%s', 1 ) ",
|
||||
dbesc($sender['hash']),
|
||||
dbesc($arr['target']),
|
||||
intval($arr['rating']),
|
||||
intval($arr['rating_text']),
|
||||
dbesc(datetime_convert())
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
function process_profile_delivery($sender,$arr,$deliveries) {
|
||||
|
||||
logger('process_profile_delivery', LOGGER_DEBUG);
|
||||
|
||||
Reference in New Issue
Block a user