commit
d7ecaa8b23
@ -3,18 +3,18 @@
|
|||||||
Hubzilla - Community Server
|
Hubzilla - Community Server
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
|
||||||
<p align="center" markdown="1">
|
<p align="center" markdown="1">
|
||||||
<em><a href="https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em>
|
<em><a href="https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
**What is Hubzilla?**
|
**What is Hubzilla?**
|
||||||
|
|
||||||
Hubzilla is a general purpose communication server integrated with a web publishing system and a decentralised permission system. If this sounds like a bunch of technical mumbo-jumbo to you, just think of it as an independent platform for sharing stuff online.
|
Hubzilla is a general purpose communication server integrated with a web publishing system and a decentralised permission system. If this sounds like a bunch of technical mumbo-jumbo to you, just think of it as an independent platform for sharing stuff online (publicly or privately).
|
||||||
|
|
||||||
Hubzilla contains some social network bits, some cloud storage bits, some blog and forum bits, and some content management bits. These are all integrated within a common privacy framework - and it is all decentralised.
|
Hubzilla contains some social network bits, some cloud storage bits, some blog and forum bits, and some content management bits. These are all integrated within a common privacy framework - and it is all decentralised.
|
||||||
|
|
||||||
Everything you publish or share can be restricted to those channels and people you wish to share them with; and these permissions work completely invisibly - even with channels on different servers or other communications services.
|
Everything you publish or share can be restricted to those channels and people you wish to share them with; and these permissions work completely invisibly - **even with channels on different servers or other communications services**.
|
||||||
|
|
||||||
Migration and live backups of your connections, settings, and everything you publish are built-in, so you never need worry about server failure.
|
Migration and live backups of your connections, settings, and everything you publish are built-in, so you never need worry about server failure.
|
||||||
|
|
||||||
|
@ -826,25 +826,8 @@ class Connedit extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$locstr = '';
|
$locstr = locations_by_netid($contact['xchan_hash']);
|
||||||
|
if(! $locstr)
|
||||||
$locs = q("select hubloc_addr as location from hubloc left join site on hubloc_url = site_url where hubloc_hash = '%s'
|
|
||||||
and hubloc_deleted = 0 and site_dead = 0",
|
|
||||||
dbesc($contact['xchan_hash'])
|
|
||||||
);
|
|
||||||
|
|
||||||
if($locs) {
|
|
||||||
foreach($locs as $l) {
|
|
||||||
if(!($l['location']))
|
|
||||||
continue;
|
|
||||||
if(strpos($locstr,$l['location']) !== false)
|
|
||||||
continue;
|
|
||||||
if(strlen($locstr))
|
|
||||||
$locstr .= ', ';
|
|
||||||
$locstr .= $l['location'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$locstr = $contact['xchan_url'];
|
$locstr = $contact['xchan_url'];
|
||||||
|
|
||||||
$clone_warn = '';
|
$clone_warn = '';
|
||||||
|
@ -343,14 +343,15 @@ class Display extends \Zotlabs\Web\Controller {
|
|||||||
case 'atom':
|
case 'atom':
|
||||||
|
|
||||||
$atom = replace_macros(get_markup_template('atom_feed.tpl'), array(
|
$atom = replace_macros(get_markup_template('atom_feed.tpl'), array(
|
||||||
'$version' => xmlify(\Zotlabs\Lib\System::get_project_version()),
|
'$version' => xmlify(\Zotlabs\Lib\System::get_project_version()),
|
||||||
'$red' => xmlify(\Zotlabs\Lib\System::get_platform_name()),
|
'$generator' => xmlify(\Zotlabs\Lib\System::get_platform_name()),
|
||||||
'$feed_id' => xmlify(\App::$cmd),
|
'$generator_uri' => 'https://hubzilla.org',
|
||||||
'$feed_title' => xmlify(t('Article')),
|
'$feed_id' => xmlify(\App::$cmd),
|
||||||
'$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now', ATOM_TIME)),
|
'$feed_title' => xmlify(t('Article')),
|
||||||
'$author' => '',
|
'$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now', ATOM_TIME)),
|
||||||
'$owner' => '',
|
'$author' => '',
|
||||||
'$profile_page' => xmlify(z_root() . '/display/' . $target_item['mid']),
|
'$owner' => '',
|
||||||
|
'$profile_page' => xmlify(z_root() . '/display/' . $target_item['mid']),
|
||||||
));
|
));
|
||||||
|
|
||||||
$x = [ 'xml' => $atom, 'channel' => $channel, 'observer_hash' => $observer_hash, 'params' => $params ];
|
$x = [ 'xml' => $atom, 'channel' => $channel, 'observer_hash' => $observer_hash, 'params' => $params ];
|
||||||
|
2
boot.php
2
boot.php
@ -1014,7 +1014,7 @@ class App {
|
|||||||
|
|
||||||
self::$baseurl = $url;
|
self::$baseurl = $url;
|
||||||
|
|
||||||
if($parsed) {
|
if($parsed !== false) {
|
||||||
self::$scheme = $parsed['scheme'];
|
self::$scheme = $parsed['scheme'];
|
||||||
|
|
||||||
self::$hostname = $parsed['host'];
|
self::$hostname = $parsed['host'];
|
||||||
|
@ -345,16 +345,18 @@ If the person mentioned is in the list of recipients for the post, they will rec
|
|||||||
|
|
||||||
[h4]Deliverable Mentions[/h4]
|
[h4]Deliverable Mentions[/h4]
|
||||||
|
|
||||||
Some connections in the mention auto-complete box behave differently than others. If you mention a channel which provides "re-delivery of mentions" it will also send the post to all of that channel's default delivery connections. This is how one posts to "forums". The auto-complete box will provide two entries for these channels, one will mention just the channel. The other will invoke re-delivery and be listed as the channel's "network".
|
The [b]![/b] character designates a deliverable mention to a forum or special channel which allows "re-delivery of mentions".
|
||||||
|
|
||||||
[code]
|
[code]
|
||||||
@Gardening - mention the Gardening forum
|
@Gardening - mention the Gardening forum
|
||||||
[/code]
|
[/code]
|
||||||
|
|
||||||
[code]
|
[code]
|
||||||
@Gardening+ - mention the Gardening Forum and also post to the Gardening "network" (e.g. all the forum members; if you have permission to do so)
|
!Gardening - mention the Gardening Forum and also post to the Gardening "network" (e.g. send to all the forum members; if you have permission to do so)
|
||||||
[/code]
|
[/code]
|
||||||
|
|
||||||
|
Note: In previous releases, forums were delivered by using @forum+ with a plus sign at the end. This mechanism is still used occasionally but is deprecated and !forum is now preferred.
|
||||||
|
|
||||||
[h4]Private Mentions[/h4]
|
[h4]Private Mentions[/h4]
|
||||||
If you wish to restrict a post to a single person or a number of people, you can do this by selecting channels or privacy groups from the privacy tool. You can also just tag them with a privacy tag. A privacy tag is a name preceded by the two characters @! - and in addition to tagging these channels, will also change the privacy permissions of the post to only include them. You can have more than one privacy tag, for instance @!bob and @!linda will send the post only to Bob and Linda. This mechanism over-rides the privacy selector.
|
If you wish to restrict a post to a single person or a number of people, you can do this by selecting channels or privacy groups from the privacy tool. You can also just tag them with a privacy tag. A privacy tag is a name preceded by the two characters @! - and in addition to tagging these channels, will also change the privacy permissions of the post to only include them. You can have more than one privacy tag, for instance @!bob and @!linda will send the post only to Bob and Linda. This mechanism over-rides the privacy selector.
|
||||||
|
|
||||||
@ -369,7 +371,7 @@ Topical tags are indicated by preceding the tag name with the # character. This
|
|||||||
Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numeric hashtag, please add some descriptive text such as #2012-elections.
|
Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numeric hashtag, please add some descriptive text such as #2012-elections.
|
||||||
|
|
||||||
[h4]Bookmarks[/h4]
|
[h4]Bookmarks[/h4]
|
||||||
Bookmarks indicate a link which can be saved to your bookmark folder. They use the sequence #^ followed by the link. Often these are generated automatically. If the 'bookmarker' addon is installed, this sequence will be converted to a bookmark icon when viewing the post or comment online and clicking the icon will save the bookmark. If the bookmarker addon is not installed, the post 'dropdown menu' contains a link for saving the bookmark or bookmarks.
|
Bookmarks indicate a link which can be saved to your bookmark folder. They use the sequence #^ followed by the link. Often these are generated automatically. If the 'bookmarker' addon is installed, this sequence will be converted to a bookmark icon when viewing the post or comment online, and clicking the icon will save the bookmark. If the bookmarker addon is not installed, the post 'dropdown menu' contains a link for saving the bookmark or bookmarks.
|
||||||
|
|
||||||
[h4]Spaces in Tags and Mentions[/h4]
|
[h4]Spaces in Tags and Mentions[/h4]
|
||||||
Where possible please use the auto-complete window to select tag and mention recipients, because it will generate a coded tag which uniquely identifies one channel. Names are sometimes ambiguous. However, you can "manually" tag a channel by matching the channel name or address.
|
Where possible please use the auto-complete window to select tag and mention recipients, because it will generate a coded tag which uniquely identifies one channel. Names are sometimes ambiguous. However, you can "manually" tag a channel by matching the channel name or address.
|
||||||
|
@ -15,15 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
function get_public_feed($channel, $params) {
|
function get_public_feed($channel, $params) {
|
||||||
|
|
||||||
/* $type = 'xml';
|
|
||||||
$begin = NULL_DATE;
|
|
||||||
$end = '';
|
|
||||||
$start = 0;
|
|
||||||
$records = 40;
|
|
||||||
$direction = 'desc';
|
|
||||||
$pages = 0;
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(! $params)
|
if(! $params)
|
||||||
$params = [];
|
$params = [];
|
||||||
|
|
||||||
@ -106,23 +97,15 @@ function get_feed_for($channel, $observer_hash, $params) {
|
|||||||
$owner = atom_render_author('zot:owner',$channel);
|
$owner = atom_render_author('zot:owner',$channel);
|
||||||
|
|
||||||
$atom .= replace_macros($feed_template, array(
|
$atom .= replace_macros($feed_template, array(
|
||||||
'$version' => xmlify(Zotlabs\Lib\System::get_project_version()),
|
'$version' => xmlify(Zotlabs\Lib\System::get_project_version()),
|
||||||
'$red' => xmlify(Zotlabs\Lib\System::get_platform_name()),
|
'$generator' => xmlify(Zotlabs\Lib\System::get_platform_name()),
|
||||||
'$feed_id' => xmlify($channel['xchan_url']),
|
'$generator_uri' => 'https://hubzilla.org',
|
||||||
'$feed_title' => xmlify($channel['channel_name']),
|
'$feed_id' => xmlify($channel['xchan_url']),
|
||||||
'$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now', ATOM_TIME)),
|
'$feed_title' => xmlify($channel['channel_name']),
|
||||||
'$author' => $feed_author,
|
'$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now', ATOM_TIME)),
|
||||||
'$owner' => $owner,
|
'$author' => $feed_author,
|
||||||
'$name' => xmlify($channel['channel_name']),
|
'$owner' => $owner,
|
||||||
'$profile_page' => xmlify($channel['xchan_url']),
|
'$profile_page' => xmlify($channel['xchan_url']),
|
||||||
'$mimephoto' => xmlify($channel['xchan_photo_mimetype']),
|
|
||||||
'$photo' => xmlify($channel['xchan_photo_l']),
|
|
||||||
'$thumb' => xmlify($channel['xchan_photo_m']),
|
|
||||||
'$picdate' => '',
|
|
||||||
'$uridate' => '',
|
|
||||||
'$namdate' => '',
|
|
||||||
'$birthday' => '',
|
|
||||||
'$community' => '',
|
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
@ -1843,10 +1826,24 @@ function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0, $
|
|||||||
|
|
||||||
create_export_photo_body($item);
|
create_export_photo_body($item);
|
||||||
|
|
||||||
if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid'])
|
// provide separate summary and content unless compat is true; as summary represents a content-warning on some networks
|
||||||
$body = fix_private_photos($item['body'],$owner['uid'],$item,$cid);
|
|
||||||
|
$matches = false;
|
||||||
|
if(preg_match('|\[summary\](.*?)\[/summary\]|ism',$item['body'],$matches))
|
||||||
|
$summary = $matches[1];
|
||||||
else
|
else
|
||||||
$body = $item['body'];
|
$summary = '';
|
||||||
|
|
||||||
|
$body = $item['body'];
|
||||||
|
|
||||||
|
if($summary)
|
||||||
|
$body = preg_replace('|^(.*?)\[summary\](.*?)\[/summary\](.*?)$|ism','$1$3',$item['body']);
|
||||||
|
|
||||||
|
if($compat)
|
||||||
|
$summary = '';
|
||||||
|
|
||||||
|
if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid'])
|
||||||
|
$body = fix_private_photos($body,$owner['uid'],$item,$cid);
|
||||||
|
|
||||||
if($compat) {
|
if($compat) {
|
||||||
$compat_photos = compat_photos_list($body);
|
$compat_photos = compat_photos_list($body);
|
||||||
@ -1887,6 +1884,8 @@ function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0, $
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";
|
$o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";
|
||||||
|
if($summary)
|
||||||
|
$o .= '<summary type="' . $type . '" >' . xmlify(prepare_text($summary,$item['mimetype'])) . '</summary>' . "\r\n";
|
||||||
$o .= '<content type="' . $type . '" >' . xmlify(prepare_text($body,$item['mimetype'])) . '</content>' . "\r\n";
|
$o .= '<content type="' . $type . '" >' . xmlify(prepare_text($body,$item['mimetype'])) . '</content>' . "\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,6 +257,24 @@ function hubloc_mark_as_down($posturl) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief return comma separated string of non-dead clone locations (net addresses) for a given netid
|
||||||
|
*
|
||||||
|
* @param string $netid network identity (typically xchan_hash or hubloc_hash)
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
|
||||||
|
function locations_by_netid($netid) {
|
||||||
|
|
||||||
|
$locs = q("select hubloc_addr as location from hubloc left join site on hubloc_url = site_url where hubloc_hash = '%s' and hubloc_deleted = 0 and site_dead = 0",
|
||||||
|
dbesc($netid)
|
||||||
|
);
|
||||||
|
|
||||||
|
return array_elm_to_str($locs,'location',', ');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function ping_site($url) {
|
function ping_site($url) {
|
||||||
|
|
||||||
|
@ -3261,3 +3261,31 @@ function purify_filename($s) {
|
|||||||
return '';
|
return '';
|
||||||
return $s;
|
return $s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief array_elm_to_str($arr,$elm,$delim = ',') extract unique individual elements from an array of arrays and return them as a string separated by a delimiter
|
||||||
|
*
|
||||||
|
* empty elements (evaluated after trim()) are ignored.
|
||||||
|
* @param $arr array
|
||||||
|
* @param $elm array key to extract from sub-array
|
||||||
|
* @param $delim string default ','
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
|
||||||
|
function array_elm_to_str($arr,$elm,$delim = ',') {
|
||||||
|
|
||||||
|
$tmp = [];
|
||||||
|
if($arr && is_array($arr)) {
|
||||||
|
foreach($arr as $x) {
|
||||||
|
if(is_array($x) && array_key_exists($elm,$x)) {
|
||||||
|
$z = trim($x[$elm]);
|
||||||
|
if(($z) && (! in_array($z,$tmp))) {
|
||||||
|
$tmp[] = $z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return implode($tmp,$delim);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
<id>{{$feed_id}}</id>
|
<id>{{$feed_id}}</id>
|
||||||
<title>{{$feed_title}}</title>
|
<title>{{$feed_title}}</title>
|
||||||
<generator uri="http://hubzilla.org" version="{{$version}}">{{$red}}</generator>
|
<generator uri="{{$generator_uri}}" version="{{$version}}">{{$generator}}</generator>
|
||||||
<link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
|
<link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
|
||||||
{{if $profile_page}}
|
{{if $profile_page}}
|
||||||
<link rel="alternate" type="text/html" href="{{$profile_page}}" />
|
<link rel="alternate" type="text/html" href="{{$profile_page}}" />
|
||||||
|
@ -33,6 +33,14 @@
|
|||||||
|
|
||||||
{{if $module != 'hq' && $startpage == 'hq'}}
|
{{if $module != 'hq' && $startpage == 'hq'}}
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
if(typeof notify_id !== 'undefined' && notify_id !== 'undefined') {
|
||||||
|
$.post(
|
||||||
|
"hq",
|
||||||
|
{
|
||||||
|
"notify_id" : notify_id
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
window.location.href = 'hq/' + b64mid;
|
window.location.href = 'hq/' + b64mid;
|
||||||
return;
|
return;
|
||||||
{{else}}
|
{{else}}
|
||||||
|
Reference in New Issue
Block a user