Compare commits

...

23 Commits
5.4 ... 5.4.2

Author SHA1 Message Date
Mario
0ebb1f685f version 5.4.2 2021-03-15 08:55:46 +00:00
Mario
805a25eb62 more changelog
(cherry picked from commit 268464ccde)
2021-03-15 08:54:16 +00:00
Mario
4ca12afc9d changelog
(cherry picked from commit cb74de7472)
2021-03-15 08:54:05 +00:00
Mario
6cfa2572a8 do not parse bbcode in summary - issue #1532 2021-03-15 08:50:53 +00:00
Mario
04ec986bf7 cleanup
(cherry picked from commit 0fbd0ca416)
2021-03-15 08:50:29 +00:00
Max Kostikov
ee453c4acc Fix plurals variable 2021-03-15 08:50:13 +00:00
Mario
4d3524ba9d mod subthread issue continued
(cherry picked from commit b6d30f6734)
2021-03-15 08:49:53 +00:00
Mario
29beea28c2 fix mod subthread for zot6
(cherry picked from commit 22d769ecae)
2021-03-15 08:48:40 +00:00
Mario
e2a289d614 truncate too long text
(cherry picked from commit 1582b8bc96)
2021-03-15 09:43:18 +01:00
Mario
59d3483a06 save the rewritten llink
(cherry picked from commit db0e1c9f31)
2021-03-15 09:43:08 +01:00
Mario
a99161abdf if rewriting the mid also rewrite the llink
(cherry picked from commit 260c518562)
2021-03-15 09:42:56 +01:00
Mario
79d48dc92b fix mod display query
(cherry picked from commit b51049227f)
2021-03-15 09:42:41 +01:00
Mario Vavti
82192d1ead a possible fix for issue #1529
(cherry picked from commit 7ee495624e)
2021-03-09 21:40:43 +01:00
Mario
64bbbc8053 Version 5.4.1 2021-03-09 19:07:33 +00:00
Mario Vavti
4d3d868d19 changelog
(cherry picked from commit 45cc2d7bd8)
2021-03-09 19:58:40 +01:00
Max Kostikov
011342ac1b Fix undefined page end on non dynamic pages
(cherry picked from commit 182dec3e57)
2021-03-09 12:14:38 +01:00
Max Kostikov
5577383a48 Fix Spanish plural expression
(cherry picked from commit f952d65cfd)
2021-03-09 12:13:22 +01:00
Mario
dc336010db type submit should not be type button
(cherry picked from commit b09cbb72fb)
2021-03-09 12:12:53 +01:00
Mario
88fbeaddb0 fix unexpected trigger of buttons when pressing enter in input field issue #1528
(cherry picked from commit d57f4a9527)
2021-03-09 12:12:20 +01:00
Mario
7612d8246e fix summary not saved in browser autosave draft
(cherry picked from commit 8d26961639)
2021-03-09 12:11:39 +01:00
Mario
53bb16e799 fix summary not reset on cancel
(cherry picked from commit 0932d2a0a6)
2021-03-09 12:11:09 +01:00
Mario
ed04104250 fix profile not found if not logged in
(cherry picked from commit ed981ec8e8)
2021-03-09 12:10:27 +01:00
mjfriaza
97e483d684 Update Spanish 2021-03-08 10:26:38 +00:00
22 changed files with 16714 additions and 16827 deletions

View File

@@ -1,3 +1,28 @@
Hubzilla 5.4.2 (2021-03-15)
- Fix translation plural variable
- Fix issue with following/unfollowing a thread
- Fix rendering of long text in xchan vcard
- Fix local link for rss content if rewrite author is sets
- Fix regression in mod display
Addons
- Pubcrawl: fix issue with following/unfollowing a thread
- Pubcrawl: more robust implementation of mastodon remote reply
- Photocache: remove suffix from the cached photo URL
Hubzilla 5.4.1 (2021-03-09)
- Fix profile not found if not logged in
- Fix summary not reset on cancel
- Fix summary not saved with aoutosave draft
- Fix unexpected trigger of buttons when pressing enter in input fields
- Fix spanish plural expression
- Fix undefined page-end on non dynamic pages
Addons
- Pubcrawl: fix regression in pubcrawl_follow_mod_init()
Hubzilla 5.4 (2021-03-08)
- Add new connections to privacy group independend from the default privacy group settings
- group_add() return group hash to save a lookup

View File

@@ -331,6 +331,12 @@ class Notifier {
return;
}
// follow/unfollow is for internal use only
if (in_array($target_item['verb'], [ACTIVITY_FOLLOW, ACTIVITY_UNFOLLOW])) {
logger('not fowarding follow/unfollow note activity');
return;
}
if (strpos($target_item['postopts'], 'nodeliver') !== false) {
logger('notifier: target item is undeliverable', LOGGER_DEBUG);
return;

View File

@@ -160,50 +160,6 @@ class Onepoll {
}
}
/* if ($fetch_feed) {
if (strpos($contact['xchan_connurl'], z_root()) === 0) {
// local channel - save a network fetch
$c = channelx_by_hash($contact['xchan_hash']);
if ($c) {
$x = [
'success' => true,
'body' => json_encode([
'success' => true,
'messages' => zot_feed($c['channel_id'], $importer['xchan_hash'], ['mindate' => $last_update])
])
];
}
}
else {
// remote fetch
$feedurl = str_replace('/poco/', '/zotfeed/', $contact['xchan_connurl']);
$feedurl .= '?f=&mindate=' . urlencode($last_update) . '&zid=' . $importer['channel_address'] . '@' . App::get_hostname();
$recurse = 0;
$x = z_fetch_url($feedurl, false, $recurse, ['session' => true]);
}
logger('feed_update: ' . print_r($x, true), LOGGER_DATA);
}
if (($x) && ($x['success'])) {
$total = 0;
logger('onepoll: feed update ' . $contact['xchan_name'] . ' ' . $feedurl);
$j = json_decode($x['body'], true);
if ($j['success'] && $j['messages']) {
foreach ($j['messages'] as $message) {
$results = process_delivery(['hash' => $contact['xchan_hash']], get_item_elements($message),
[['hash' => $importer['xchan_hash']]], false);
logger('onepoll: feed_update: process_delivery: ' . print_r($results, true), LOGGER_DATA);
$total++;
}
logger("onepoll: $total messages processed");
}
}
*/
// update the poco details for this connection
$r = q("SELECT xlink_id from xlink where xlink_xchan = '%s' and xlink_updated > %s - INTERVAL %s and xlink_static = 0 limit 1",
intval($contact['xchan_hash']),

View File

@@ -376,6 +376,8 @@ class Activity {
$ret = [];
if ($i['verb'] === ACTIVITY_FRIEND) {
// Hubzilla 'make-friend' activity, no direct mapping from AS1 to AS2 - make it a note
$objtype = 'Note';
@@ -719,7 +721,6 @@ class Activity {
$ret = [];
$reply = false;
if ($i['verb'] === ACTIVITY_FRIEND) {
// Hubzilla 'make-friend' activity, no direct mapping from AS1 to AS2 - make it a note
$ret['obj'] = [];
@@ -1122,7 +1123,7 @@ class Activity {
static function encode_item_object($item, $elm = 'obj') {
$ret = [];
if ($item[$elm]) {
if (! is_array($item[$elm])) {
$item[$elm] = json_decode($item[$elm],true);
@@ -1164,6 +1165,7 @@ class Activity {
'http://activitystrea.ms/schema/1.0/tag' => 'Add',
'http://activitystrea.ms/schema/1.0/follow' => 'Follow',
'http://activitystrea.ms/schema/1.0/unfollow' => 'Unfollow',
'http://activitystrea.ms/schema/1.0/stop-following' => 'Unfollow',
'http://purl.org/zot/activity/attendyes' => 'Accept',
'http://purl.org/zot/activity/attendno' => 'Reject',
'http://purl.org/zot/activity/attendmaybe' => 'TentativeAccept',
@@ -1211,6 +1213,7 @@ class Activity {
'http://activitystrea.ms/schema/1.0/tag' => 'Add',
'http://activitystrea.ms/schema/1.0/follow' => 'Follow',
'http://activitystrea.ms/schema/1.0/unfollow' => 'Unfollow',
'http://activitystrea.ms/schema/1.0/stop-following' => 'Unfollow',
'http://purl.org/zot/activity/attendyes' => 'Accept',
'http://purl.org/zot/activity/attendno' => 'Reject',
'http://purl.org/zot/activity/attendmaybe' => 'TentativeAccept',
@@ -2093,6 +2096,15 @@ class Activity {
static function decode_note($act) {
// Within our family of projects, Follow/Unfollow of a thread is an internal activity which should not be transmitted,
// hence if we receive it - ignore or reject it.
// Unfollow is not defined by ActivityStreams, which prefers Undo->Follow.
// This may have to be revisited if AP projects start using Follow for objects other than actors.
if (in_array($act->type, [ 'Follow', 'Unfollow' ])) {
return false;
}
$response_activity = false;
$s = [];
@@ -2290,13 +2302,16 @@ class Activity {
$s['iconfig'] = $a;
}
if ($act->obj['type'] === 'Note' && $s['attach']) {
$s['body'] .= self::bb_attach($s['attach'], $s['body']);
}
if (array_key_exists('type', $act->obj)) {
if ($act->obj['type'] === 'Question' && in_array($act->type, ['Create', 'Update'])) {
if ($act->obj['endTime']) {
$s['comments_closed'] = datetime_convert('UTC', 'UTC', $act->obj['endTime']);
if ($act->obj['type'] === 'Note' && $s['attach']) {
$s['body'] .= self::bb_attach($s['attach'], $s['body']);
}
if ($act->obj['type'] === 'Question' && in_array($act->type, ['Create', 'Update'])) {
if (array_key_exists('endTime', $act->obj)) {
$s['comments_closed'] = datetime_convert('UTC', 'UTC', $act->obj['endTime']);
}
}
}

View File

@@ -26,7 +26,12 @@ class Activity extends Controller {
$portable_id = EMPTY_STR;
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 ";
$item_normal_extra = sprintf(" and not verb in ('%s', '%s') ",
dbesc(ACTIVITY_FOLLOW),
dbesc(ACTIVITY_UNFOLLOW)
);
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 $item_normal_extra ";
$i = null;
@@ -86,7 +91,7 @@ class Activity extends Controller {
}
$parents_str = ids_to_querystr($i,'item_id');
$items = q("SELECT item.*, item.id AS item_id FROM item WHERE item.parent IN ( %s ) $item_normal ",
dbesc($parents_str)
);
@@ -197,8 +202,12 @@ class Activity extends Controller {
}
}
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0
and item.item_delayed = 0 and item.item_blocked = 0 ";
$item_normal_extra = sprintf(" and not verb in ('%s', '%s') ",
dbesc(ACTIVITY_FOLLOW),
dbesc(ACTIVITY_UNFOLLOW)
);
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 $item_normal_extra ";
$sigdata = HTTPSig::verify(EMPTY_STR);
if ($sigdata['portable_id'] && $sigdata['header_valid']) {

View File

@@ -28,7 +28,7 @@ class Channel extends Controller {
function init() {
if (in_array(substr($_GET['search'], 0, 1), ['@', '!', '?']) || strpos($_GET['search'], 'https://') === 0)
goaway('search' . '?f=&search=' . $_GET['search']);
goaway(z_root() . '/search?f=&search=' . $_GET['search']);
$which = null;
if (argc() > 1)

View File

@@ -243,7 +243,7 @@ class Display extends \Zotlabs\Web\Controller {
$item_normal = item_normal();
$item_normal_update = item_normal_update();
$sql_extra = public_permissions_sql($observer_hash);
$sql_extra = ((local_channel()) ? EMPTY_STR : item_permissions_sql(0, $observer_hash));
if($noscript_content || $load) {
@@ -260,8 +260,7 @@ class Display extends \Zotlabs\Web\Controller {
);
}
if(! $r) {
if($r === null) {
// in case somebody turned off public access to sys channel content using permissions
// make that content unsearchable by ensuring the owner uid can't match
@@ -269,20 +268,18 @@ class Display extends \Zotlabs\Web\Controller {
$sysid = 0;
$r = q("SELECT item.id as item_id from item
WHERE ( (mid = '%s'
WHERE ((mid = '%s'
AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
AND item.deny_gid = '' AND item_private = 0 )
and uid in ( " . stream_perms_api_uids(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
OR uid = %d ) ) ) OR
(mid = '%s' $sql_extra ) )
OR uid = %d ))) OR
(mid = '%s' $sql_extra ))
$item_normal
limit 1",
dbesc($target_item['parent_mid']),
intval($sysid),
dbesc($target_item['parent_mid'])
);
}
}
@@ -306,20 +303,22 @@ class Display extends \Zotlabs\Web\Controller {
if($r === null) {
// in case somebody turned off public access to sys channel content using permissions
// make that content unsearchable by ensuring the owner_xchan can't match
if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
$sysid = 0;
$r = q("SELECT item.parent AS item_id from item
WHERE parent_mid = '%s'
$r = q("SELECT item.id as item_id from item
WHERE ((parent_mid = '%s'
AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
AND item.deny_gid = '' AND item_private = 0 )
and uid in ( " . stream_perms_api_uids(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
OR uid = %d )
$sql_extra )
$item_normal_update
$simple_update
OR uid = %d ))) OR
(parent_mid = '%s' $sql_extra ))
$item_normal
limit 1",
dbesc($target_item['parent_mid']),
intval($sysid)
intval($sysid),
dbesc($target_item['parent_mid'])
);
}
}

View File

@@ -55,7 +55,12 @@ class Item extends Controller {
$portable_id = EMPTY_STR;
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 ";
$item_normal_extra = sprintf(" and not verb in ('%s', '%s') ",
dbesc(ACTIVITY_FOLLOW),
dbesc(ACTIVITY_UNFOLLOW)
);
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 $item_normal_extra ";
$i = null;
@@ -167,7 +172,12 @@ class Item extends Controller {
$portable_id = EMPTY_STR;
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 ";
$item_normal_extra = sprintf(" and not verb in ('%s', '%s') ",
dbesc(ACTIVITY_FOLLOW),
dbesc(ACTIVITY_UNFOLLOW)
);
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 $item_normal_extra ";
$i = null;
@@ -821,12 +831,10 @@ class Item extends Controller {
// and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.)
// we may need virtual or template classes to implement the possible alternatives
$summary = cleanup_bbcode($summary);
$body = cleanup_bbcode($body);
// Look for tags and linkify them
$results = linkify_tags($summary, ($uid) ? $uid : $profile_uid);
$results = linkify_tags($body, ($uid) ? $uid : $profile_uid);
if($results) {

View File

@@ -21,12 +21,12 @@ class Network extends \Zotlabs\Web\Controller {
}
if(in_array(substr($_GET['search'],0,1),[ '@', '!', '?']) || strpos($_GET['search'], 'https://') === 0)
goaway('search' . '?f=&search=' . $_GET['search']);
goaway(z_root() . '/search?f=&search=' . $_GET['search']);
if(count($_GET) < 2) {
$network_options = get_pconfig(local_channel(),'system','network_page_default');
if($network_options)
goaway('network' . '?f=&' . $network_options);
goaway(z_root() . '/network?f=&' . $network_options);
}
$channel = App::get_channel();

View File

@@ -29,26 +29,28 @@ class Profile extends Controller {
return;
}
$profile = '';
$channel = App::get_channel();
if (!$channel)
http_status_exit(404, 'Not found');
if (ActivityStreams::is_as_request()) {
$channel = channelx_by_nick($which);
if (!$channel) {
http_status_exit(404, 'Not found');
}
$p = Activity::encode_person($channel, true);
as_return_and_die(['type' => 'Profile', 'describes' => $p], $channel);
}
nav_set_selected('Profile');
$profile = '';
if ((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
$channel = App::get_channel();
$which = $channel['channel_address'];
$profile = argv(1);
$r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
$r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
intval($profile),
intval(local_channel())
);
if (!$r)
$profile = '';
$profile = $r[0]['profile_guid'];
@@ -80,7 +82,6 @@ class Profile extends Controller {
profile_load($which, $profile);
}
function get() {
@@ -89,11 +90,10 @@ class Profile extends Controller {
return login();
}
nav_set_selected('Profile');
$groups = [];
$tab = 'profile';
$o = '';
$o = '';
if (!(perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_profile'))) {
notice(t('Permission denied.') . EOL);

View File

@@ -14,7 +14,6 @@ class Search extends Controller {
App::$data['search'] = escape_tags($_REQUEST['search']);
}
function get($update = 0, $load = false) {
if ((get_config('system', 'block_public')) || (get_config('system', 'block_public_search'))) {
@@ -194,7 +193,7 @@ class Search extends Controller {
if (local_channel()) {
$r = q("SELECT mid, MAX(id) as item_id from item
WHERE ((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = '' AND item.deny_gid = '' AND item_private = 0 )
WHERE ((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = '' AND item.deny_gid = '' AND item_private = 0 )
OR ( item.uid = %d )) OR item.owner_xchan = '%s' )
$item_normal
$sql_extra
@@ -210,7 +209,7 @@ class Search extends Controller {
and owner_xchan in ( " . stream_perms_xchans(($observer) ? (PERMS_NETWORK | PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
$pub_sql ) OR owner_xchan = '%s')
$item_normal
$sql_extra
$sql_extra
group by mid, created order by created desc $pager_sql",
dbesc($sys['xchan_hash'])
);

View File

@@ -1,6 +1,9 @@
<?php
namespace Zotlabs\Module;
use Zotlabs\Lib\Activity;
require_once('include/security.php');
require_once('include/bbcode.php');
require_once('include/items.php');
@@ -10,22 +13,22 @@ require_once('include/items.php');
class Subthread extends \Zotlabs\Web\Controller {
function get() {
if(! local_channel()) {
return;
}
$sys = get_sys_channel();
$channel = \App::get_channel();
$item_id = ((argc() > 2) ? notags(trim(argv(2))) : 0);
if(argv(1) === 'sub')
$activity = ACTIVITY_FOLLOW;
elseif(argv(1) === 'unsub')
$activity = ACTIVITY_UNFOLLOW;
$i = q("select * from item where id = %d and uid = %d",
intval($item_id),
intval(local_channel())
@@ -42,7 +45,7 @@ class Subthread extends \Zotlabs\Web\Controller {
$item_id = (($i) ? $i[0]['id'] : 0);
}
}
if(! $i) {
return;
}
@@ -56,37 +59,37 @@ class Subthread extends \Zotlabs\Web\Controller {
dbesc($r[0]['parent'])
);
}
if((! $item_id) || (! $r)) {
logger('subthread: no item ' . $item_id);
return;
}
$item = $r[0];
$owner_uid = $item['uid'];
$observer = \App::get_observer();
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
if(! perm_is_allowed($owner_uid,$ob_hash,'post_comments'))
return;
$sys = get_sys_channel();
$owner_uid = $item['uid'];
$owner_aid = $item['aid'];
// if this is a "discover" item, (item['uid'] is the sys channel),
// fallback to the item comment policy, which should've been
// respected when generating the conversation thread.
// Even if the activity is rejected by the item owner, it should still get attached
// to the local discover conversation on this site.
// to the local discover conversation on this site.
if(($owner_uid != $sys['channel_id']) && (! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments'))) {
notice( t('Permission denied') . EOL);
killme();
}
$r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($item['owner_xchan'])
);
@@ -94,7 +97,7 @@ class Subthread extends \Zotlabs\Web\Controller {
$thread_owner = $r[0];
else
killme();
$r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($item['author_xchan'])
);
@@ -102,50 +105,32 @@ class Subthread extends \Zotlabs\Web\Controller {
$item_author = $r[0];
else
killme();
$uuid = item_message_id();
$mid = z_root() . '/item/' . $uuid;
$post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status'));
$links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
$objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
$objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
$body = $item['body'];
$obj = json_encode(array(
'type' => $objtype,
'id' => $item['mid'],
'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
'link' => $links,
'title' => $item['title'],
'content' => $item['body'],
'created' => $item['created'],
'edited' => $item['edited'],
'author' => array(
'name' => $item_author['xchan_name'],
'address' => $item_author['xchan_addr'],
'guid' => $item_author['xchan_guid'],
'guid_sig' => $item_author['xchan_guid_sig'],
'link' => array(
array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
),
));
$obj = Activity::fetch_item( [ 'id' => $item['mid'] ] );
if(! intval($item['item_thread_top']))
$post_type = 'comment';
$post_type = 'comment';
if($activity === ACTIVITY_FOLLOW)
$bodyverb = t('%1$s is following %2$s\'s %3$s');
if($activity === ACTIVITY_UNFOLLOW)
$bodyverb = t('%1$s stopped following %2$s\'s %3$s');
$arr = array();
$arr['uuid'] = $uuid;
$arr['mid'] = $mid;
$arr['aid'] = $owner_aid;
@@ -161,35 +146,35 @@ class Subthread extends \Zotlabs\Web\Controller {
$arr['item_wall'] = 1;
else
$arr['item_wall'] = 0;
$ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
$alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
$plink = '[zrl=' . z_root() . '/display/' . gen_link_id($item['mid']) . ']' . $post_type . '[/zrl]';
$arr['body'] = sprintf( $bodyverb, $alink, $ulink, $plink );
$arr['verb'] = $activity;
$arr['obj_type'] = $objtype;
$arr['obj'] = $obj;
$arr['obj'] = json_encode($obj);
$arr['allow_cid'] = $item['allow_cid'];
$arr['allow_gid'] = $item['allow_gid'];
$arr['deny_cid'] = $item['deny_cid'];
$arr['deny_gid'] = $item['deny_gid'];
$post = item_store($arr);
$post = item_store($arr);
$post_id = $post['item_id'];
$arr['id'] = $post_id;
call_hooks('post_local_end', $arr);
killme();
}
}

View File

@@ -19,7 +19,7 @@ class Zotfeed extends Controller {
killme();
}
$channel = ((argv(1)) ? channelx_by_nick(argv(1)) : get_sys_channel());
$channel = channelx_by_nick(argv(1));
if (!$channel) {
killme();
}
@@ -120,45 +120,5 @@ class Zotfeed extends Controller {
as_return_and_die($ret, $channel);
}
/*
$result = array('success' => false);
$mindate = (($_REQUEST['mindate']) ? datetime_convert('UTC','UTC',$_REQUEST['mindate']) : '');
if(! $mindate)
$mindate = datetime_convert('UTC','UTC', 'now - 14 days');
if(observer_prohibited()) {
$result['message'] = 'Public access denied';
json_return_and_die($result);
}
$observer = App::get_observer();
logger('observer: ' . get_observer_hash(), LOGGER_DEBUG);
$channel_address = ((argc() > 1) ? argv(1) : '');
if($channel_address) {
$r = q("select channel_id, channel_name from channel where channel_address = '%s' and channel_removed = 0 limit 1",
dbesc(argv(1))
);
}
else {
$x = get_sys_channel();
if($x)
$r = array($x);
$mindate = datetime_convert('UTC','UTC', 'now - 14 days');
}
if(! $r) {
$result['message'] = 'Channel not found.';
json_return_and_die($result);
}
logger('zotfeed request: ' . $r[0]['channel_name'], LOGGER_DEBUG);
$result['project'] = 'Hubzilla';
$result['messages'] = zot_feed($r[0]['channel_id'],$observer['xchan_hash'],array('mindate' => $mindate));
$result['success'] = true;
json_return_and_die($result);
*/
}
}

View File

@@ -52,7 +52,7 @@ require_once('include/attach.php');
require_once('include/bbcode.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
define ( 'STD_VERSION', '5.4' );
define ( 'STD_VERSION', '5.4.2' );
define ( 'ZOT_REVISION', '6.0' );
define ( 'DB_UPDATE_VERSION', 1243 );

View File

@@ -151,6 +151,18 @@ function bb_spacefy($st) {
return $new_str;
}
// The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
// now turns back returning [noparse][i]italic[/i][/noparse]
function bb_unspacefy($st) {
$whole_match = $st[0];
$captured = $st[1];
$spacefied = preg_replace("/\[ (.*?) \]/", "[$1]", $captured);
$new_str = str_replace($captured, $spacefied, $whole_match);
return $new_str;
}
// The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
// now turns back and the [noparse] tags are trimmed
// returning [i]italic[/i]
@@ -1097,6 +1109,9 @@ function bbcode($Text, $options = []) {
if (strpos($Text,'[pre]') !== false) {
$Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
}
if (strpos($Text,'[summary]') !== false) {
$Text = preg_replace_callback("/\[summary\](.*?)\[\/summary\]/ism", 'bb_spacefy',$Text);
}
$Text = bb_format_attachdata($Text);
@@ -1438,11 +1453,6 @@ function bbcode($Text, $options = []) {
$Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm", "<span style=\"font-family: $1;\">$2</span>", $Text);
}
if(strpos($Text,'[/summary]') !== false) {
$Text = preg_replace_callback("/^(.*?)\[summary\](.*?)\[\/summary\](.*?)$/is", 'bb_summary', $Text);
}
// Check for [spoiler] text
$endlessloop = 0;
while ((strpos($Text, "[/spoiler]")!== false) and (strpos($Text, "[spoiler]") !== false) and (++$endlessloop < 20)) {
@@ -1611,6 +1621,13 @@ function bbcode($Text, $options = []) {
}
if (strpos($Text,'[summary]') !== false) {
$Text = preg_replace_callback("/\[summary\](.*?)\[\/summary\]/ism", 'bb_unspacefy',$Text);
}
if(strpos($Text,'[/summary]') !== false) {
$Text = preg_replace_callback("/^(.*?)\[summary\](.*?)\[\/summary\](.*?)$/is", 'bb_summary', $Text);
}
// Unhide all [noparse] contained bbtags unspacefying them
// and triming the [noparse] tag.
if (strpos($Text,'[noparse]') !== false) {

View File

@@ -3253,13 +3253,15 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $group = false
$item['mid'] = z_root() . '/item/' . $item['uuid'];
$item['parent_mid'] = $item['mid'];
$item['thr_parent'] = $item['mid'];
$item['llink'] = z_root() . '/display/' . gen_link_id($item['mid']);
}
$r = q("UPDATE item SET author_xchan = '%s', mid = '%s', parent_mid = '%s', thr_parent = '%s' WHERE id = %d",
$r = q("UPDATE item SET author_xchan = '%s', mid = '%s', parent_mid = '%s', thr_parent = '%s', llink = '%s' WHERE id = %d",
dbesc($item['author_xchan']),
dbesc($item['mid']),
dbesc($item['parent_mid']),
dbesc($item['thr_parent']),
dbesc($item['llink']),
intval($item_id)
);
}
@@ -4508,6 +4510,13 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
$item_uids = " item.uid = " . intval($uid) . " ";
}
if (! (isset($arr['include_follow']) && intval($arr['include_follow']))) {
$sql_options .= sprintf(" and not verb in ('%s', '%s') ",
dbesc(ACTIVITY_FOLLOW),
dbesc(ACTIVITY_UNFOLLOW)
);
}
if($arr['star'])
$sql_options .= " and item_starred = 1 ";
@@ -4575,7 +4584,7 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
}
if($channel && intval($arr['compat']) === 1) {
$sql_extra = " AND author_xchan = '" . $channel['channel_hash'] . "' and item_private = 0 $item_normal ";
$sql_extra = " AND author_xchan = '" . $channel['channel_hash'] . "' and item_private = 0 $sql_options $item_normal ";
}
if ($arr['datequery']) {
@@ -4680,7 +4689,6 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
);
require_once('include/items.php');
xchan_query($items);
$items = fetch_post_tags($items,true);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1574,7 +1574,7 @@ $(window).scroll(function () {
}
else {
// This is some other kind of page - perhaps a directory
if($(window).scrollTop() + $(window).height() > $('#page-end').position().top) {
if($('#page-end').length && ($(window).scrollTop() + $(window).height() > $('#page-end').position().top)) {
if((pageHasMoreContent) && (! loadingPage) && (! justifiedGalleryActive)) {
next_page++;
scroll_next = true;

View File

@@ -51,7 +51,7 @@ var activeCommentID = 0;
var activeCommentText = '';
$(document).ready(function() {
$("#profile-jot-text").focus(enableOnUser);
$("#profile-jot-text").click(enableOnUser);
@@ -125,8 +125,8 @@ var activeCommentText = '';
});
function jotSetMime() {
var mtype = $('#id_mimetype').val();
function jotSetMime() {
var mtype = $('#id_mimetype').val();
if(mtype == 'text/bbcode')
$('#profile-jot-submit-left').show();
else
@@ -155,7 +155,7 @@ var activeCommentText = '';
textarea = document.getElementById('profile-jot-text');
if (textarea.selectionStart || textarea.selectionStart == "0") {
var start = textarea.selectionStart;
var end = textarea.selectionEnd;
var end = textarea.selectionEnd;
if (end > start) {
reply = prompt("{{$linkurl}}");
if(reply && reply.length) {
@@ -313,6 +313,7 @@ var activeCommentText = '';
function itemCancel() {
$("#jot-title").val('');
$("#jot-summary").val('');
$("#profile-jot-text").val('');
$(".jot-poll-option input").val('');
$("#jot-category").tagsinput('removeAll');
@@ -351,7 +352,7 @@ var activeCommentText = '';
return false;
});
});
}
function itemFilerRm(id, term) {
@@ -570,6 +571,7 @@ $( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-del
if(action != 'clean') {
localStorage.setItem("post_title" + postid, $("#jot-title").val());
localStorage.setItem("post_summary" + postid, $("#jot-summary").val());
localStorage.setItem("post_body" + postid, $("#profile-jot-text").val());
if($("#jot-category").length)
localStorage.setItem("post_category" + postid, $("#jot-category").val());
@@ -590,10 +592,11 @@ $( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-del
clearTimeout(postSaveTimer);
postSaveTimer = null;
localStorage.removeItem("post_title" + postid);
localStorage.removeItem("post_summary" + postid);
localStorage.removeItem("post_body" + postid);
localStorage.removeItem("post_category" + postid);
}
}
}
}
@@ -605,6 +608,7 @@ $( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-del
var doctype = $('#jot-webpage').val();
var postid = '-' + doctype + '-' + $('#jot-postid').val();
var postTitle = localStorage.getItem("post_title" + postid);
var postSummary = localStorage.getItem("post_summary" + postid);
var postBody = localStorage.getItem("post_body" + postid);
var postCategory = (($("#jot-category").length) ? localStorage.getItem("post_category" + postid) : '');
var openEditor = false;
@@ -613,6 +617,10 @@ $( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-del
$('#jot-title').val(postTitle);
openEditor = true;
}
if(postSummary) {
$('#jot-summary').val(postSummary);
openEditor = true;
}
if(postBody) {
$('#profile-jot-text').val(postBody);
openEditor = true;

View File

@@ -52,15 +52,15 @@
<div id="jot-text-wrap">
<div id="profile-jot-tools" class="btn-group d-none">
{{if $is_owner}}
<a id="profile-jot-settings" class="btn btn-outline-secondary btn-sm border-0" href="/settings/editor/?f=&rpath=/{{$return_path}}"><i class="fa fa-cog"></i></a>
<a id="profile-jot-settings" class="btn btn-outline-secondary btn-sm border-0" href="/settings/editor/?f=&rpath=/{{$return_path}}" tabindex="4"><i class="fa fa-cog"></i></a>
{{/if}}
{{if $reset}}
<button id="profile-jot-reset" class="btn btn-outline-secondary btn-sm border-0" title="{{$reset}}" onclick="itemCancel(); return false;">
<button type="button" id="profile-jot-reset" class="btn btn-outline-secondary btn-sm border-0" title="{{$reset}}" tabindex="-1" onclick="itemCancel(); return false;">
<i class="fa fa-close"></i>
</button>
{{/if}}
</div>
<textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$placeholdtext}}" >{{$content}}</textarea>
<textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$placeholdtext}}" tabindex="3">{{$content}}</textarea>
</div>
{{if $attachment}}
<div id="jot-attachment-wrap">
@@ -99,19 +99,19 @@
<div id="profile-jot-submit-left" class="btn-toolbar float-left">
{{if $bbcode}}
<div class="btn-group mr-2">
<button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'profile-jot-text'); return false;">
<button type="button" id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'profile-jot-text'); return false;">
<i class="fa fa-bold jot-icons"></i>
</button>
<button id="main-editor-italic" class="btn btn-outline-secondary btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'profile-jot-text'); return false;">
<button type="button" id="main-editor-italic" class="btn btn-outline-secondary btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'profile-jot-text'); return false;">
<i class="fa fa-italic jot-icons"></i>
</button>
<button id="main-editor-underline" class="btn btn-outline-secondary btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'profile-jot-text'); return false;">
<button type="button" id="main-editor-underline" class="btn btn-outline-secondary btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'profile-jot-text'); return false;">
<i class="fa fa-underline jot-icons"></i>
</button>
<button id="main-editor-quote" class="btn btn-outline-secondary btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'profile-jot-text'); return false;">
<button type="button" id="main-editor-quote" class="btn btn-outline-secondary btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'profile-jot-text'); return false;">
<i class="fa fa-quote-left jot-icons"></i>
</button>
<button id="main-editor-code" class="btn btn-outline-secondary btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'profile-jot-text'); return false;">
<button type="button" id="main-editor-code" class="btn btn-outline-secondary btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'profile-jot-text'); return false;">
<i class="fa fa-terminal jot-icons"></i>
</button>
</div>
@@ -119,29 +119,29 @@
{{if $visitor}}
<div class="btn-group mr-2 d-none d-lg-flex">
{{if $writefiles}}
<button id="wall-file-upload" class="btn btn-outline-secondary btn-sm" title="{{$attach}}" >
<button type="button" id="wall-file-upload" class="btn btn-outline-secondary btn-sm" title="{{$attach}}" >
<i id="wall-file-upload-icon" class="fa fa-paperclip jot-icons"></i>
</button>
{{/if}}
{{if $weblink}}
<button id="profile-link-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$weblink}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;">
<button type="button" id="profile-link-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$weblink}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;">
<i id="profile-link" class="fa fa-link jot-icons"></i>
</button>
{{/if}}
{{if $embedPhotos}}
<button id="embed-photo-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$embedPhotos}}" onclick="initializeEmbedPhotoDialog();return false;">
<button type="button" id="embed-photo-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$embedPhotos}}" onclick="initializeEmbedPhotoDialog();return false;">
<i id="embed-photo" class="fa fa-file-image-o jot-icons"></i>
</button>
{{/if}}
</div>
<div class="btn-group mr-2 d-none d-lg-flex">
{{if $setloc}}
<button id="profile-location-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$setloc}}" onclick="jotGetLocation();return false;">
<button type="button" id="profile-location-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$setloc}}" onclick="jotGetLocation();return false;">
<i id="profile-location" class="fa fa-globe jot-icons"></i>
</button>
{{/if}}
{{if $clearloc}}
<button id="profile-nolocation-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$clearloc}}" onclick="jotClearLocation();return false;" disabled="disabled">
<button type="button" id="profile-nolocation-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$clearloc}}" onclick="jotClearLocation();return false;" disabled="disabled">
<i id="profile-nolocation" class="fa fa-circle-o jot-icons"></i>
</button>
{{/if}}
@@ -149,17 +149,17 @@
<div class="btn-group d-none d-lg-flex">
{{/if}}
{{if $feature_expire}}
<button id="profile-expire-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$expires}}" onclick="jotGetExpiry();return false;">
<button type="button" id="profile-expire-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$expires}}" onclick="jotGetExpiry();return false;">
<i id="profile-expires" class="fa fa-eraser jot-icons"></i>
</button>
{{/if}}
{{if $feature_future}}
<button id="profile-future-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$future_txt}}" onclick="jotGetPubDate();return false;">
<button type="button" id="profile-future-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$future_txt}}" onclick="jotGetPubDate();return false;">
<i id="profile-future" class="fa fa-clock-o jot-icons"></i>
</button>
{{/if}}
{{if $feature_encrypt}}
<button id="profile-encrypt-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$encrypt}}" onclick="hz_encrypt('{{$cipher}}','#profile-jot-text');return false;">
<button type="button" id="profile-encrypt-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$encrypt}}" onclick="hz_encrypt('{{$cipher}}','#profile-jot-text');return false;">
<i id="profile-encrypt" class="fa fa-key jot-icons"></i>
</button>
{{/if}}
@@ -167,7 +167,7 @@
<i id="profile-poll" class="fa fa-bar-chart jot-icons"></i>
</button>
{{if $feature_nocomment}}
<button id="profile-nocomment-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$nocommenttitle}}" onclick="toggleNoComment();return false;">
<button type="button" id="profile-nocomment-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$nocommenttitle}}" onclick="toggleNoComment();return false;">
<i id="profile-nocomment" class="fa fa-comments jot-icons"></i>
</button>
{{/if}}
@@ -224,22 +224,22 @@
</div>
<div id="profile-jot-submit-right" class="btn-group float-right">
{{foreach $customsubmitright as $csr}}
<button class="btn btn-outline-secondary btn-sm" {{$csr.buttonparams}} title="{{$csr.preview}}">
<button type="button" class="btn btn-outline-secondary btn-sm" {{$csr.buttonparams}} title="{{$csr.preview}}">
{{$csr.buttoncontent}}
</button>
{{/foreach}}
{{if $preview}}
<button class="btn btn-outline-secondary btn-sm" onclick="preview_post();return false;" title="{{$preview}}">
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="preview_post();return false;" title="{{$preview}}">
<i class="fa fa-eye jot-icons" ></i>
</button>
{{/if}}
{{if $jotnets}}
<button id="dbtn-jotnets" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#jotnetsModal" type="button" title="{{$jotnets_label}}" style="{{if $lockstate == 'lock'}}display: none;{{/if}}">
<button type="button" id="dbtn-jotnets" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#jotnetsModal" type="button" title="{{$jotnets_label}}" style="{{if $lockstate == 'lock'}}display: none;{{/if}}">
<i class="fa fa-share-alt jot-icons"></i>
</button>
{{/if}}
{{if $showacl}}
<button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button" data-form_id="profile-jot-form">
<button type="button" id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button" data-form_id="profile-jot-form">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons{{if $bang}} jot-lock-warn{{/if}}"></i>
</button>
{{/if}}

View File

@@ -5,12 +5,12 @@
<img class="u-photo" src="{{$photo}}" alt="{{$name}}" width="80px" height="80px">
</a>
</div>
<div class="col m-1">
<div class="col-7 m-1">
<div class="row">
<strong class="fn p-name">{{$name}}</strong>
<strong class="fn p-name text-truncate">{{$name}}</strong>
</div>
<div class="row">
<small class="text-muted p-adr">{{$addr}}</small>
<small class="text-muted p-adr text-truncate">{{$addr}}</small>
</div>
{{if $connect}}
<div class="row mt-2">