aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.homeinstall/README.md28
-rw-r--r--.homeinstall/hubzilla-config.txt.template2
-rwxr-xr-x.homeinstall/hubzilla-setup.sh34
-rw-r--r--Zotlabs/Daemon/Deliver.php7
-rw-r--r--Zotlabs/Daemon/Notifier.php64
-rw-r--r--Zotlabs/Lib/ActivityStreams.php191
-rw-r--r--Zotlabs/Lib/DReport.php84
-rw-r--r--Zotlabs/Lib/JSalmon.php50
-rw-r--r--Zotlabs/Lib/Libzot.php77
-rw-r--r--Zotlabs/Lib/NativeWiki.php17
-rw-r--r--Zotlabs/Lib/ThreadItem.php10
-rw-r--r--Zotlabs/Lib/Zotfinger.php23
-rw-r--r--Zotlabs/Module/Channel.php44
-rw-r--r--Zotlabs/Module/Connedit.php5
-rw-r--r--Zotlabs/Module/Dreport.php20
-rw-r--r--Zotlabs/Module/Impel.php8
-rw-r--r--Zotlabs/Module/Item.php64
-rw-r--r--Zotlabs/Module/Like.php6
-rw-r--r--Zotlabs/Module/Mood.php4
-rw-r--r--Zotlabs/Module/Nojs.php15
-rw-r--r--Zotlabs/Module/Pconfig.php2
-rw-r--r--Zotlabs/Module/React.php4
-rw-r--r--Zotlabs/Module/Subthread.php6
-rw-r--r--Zotlabs/Module/Wfinger.php6
-rw-r--r--Zotlabs/Storage/Directory.php2
-rw-r--r--Zotlabs/Update/_1226.php78
-rw-r--r--Zotlabs/Update/_1227.php30
-rw-r--r--Zotlabs/Update/_1228.php36
-rw-r--r--Zotlabs/Web/CheckJS.php50
-rw-r--r--Zotlabs/Web/HTTPSig.php6
-rw-r--r--Zotlabs/Zot6/HTTPSig.php46
-rw-r--r--Zotlabs/Zot6/Receiver.php2
-rw-r--r--Zotlabs/Zot6/Zot6Handler.php11
-rwxr-xr-xboot.php4
-rw-r--r--include/activities.php3
-rw-r--r--include/attach.php18
-rw-r--r--include/channel.php82
-rw-r--r--include/crypto.php9
-rw-r--r--include/event.php7
-rw-r--r--include/help.php3
-rw-r--r--include/import.php3
-rwxr-xr-xinclude/items.php64
-rw-r--r--include/network.php4
-rw-r--r--include/photos.php8
-rw-r--r--include/queue_fn.php98
-rw-r--r--include/text.php44
-rw-r--r--include/xchan.php5
-rw-r--r--include/zot.php25
-rw-r--r--install/schema_mysql.sql6
-rw-r--r--install/schema_postgres.sql6
-rw-r--r--tests/unit/Web/HttpSigTest.php2
-rw-r--r--view/ru/hmessages.po1361
-rw-r--r--view/ru/hstrings.php44
-rwxr-xr-xview/tpl/conv_item.tpl2
54 files changed, 1770 insertions, 1060 deletions
diff --git a/.homeinstall/README.md b/.homeinstall/README.md
index aeecb9184..d63931a84 100644
--- a/.homeinstall/README.md
+++ b/.homeinstall/README.md
@@ -5,8 +5,8 @@ Run hubzilla-setup.sh for an unattended installation of hubzilla.
The script is known to work without adjustments with
+ Hardware
- - Mini-PC with Debian-9.2-amd64, or
- - Rapberry 3 with Raspbian, Debian-9.3
+ - Mini-PC with Debian-9.5-amd64, or
+ - Rapberry 3 with Raspbian, Debian-9.5
+ DynDNS
- selfHOST.de
- freedns.afraid.org
@@ -38,7 +38,7 @@ Software
- apt-get install git
- mkdir -p /var/www
- cd /var/www
- - git clone https://github.com/redmatrix/hubzilla.git html
+ - git clone https://framagit.org/hubzilla/core.git html
- cd html/.homeinstall
- cp hubzilla-config.txt.template hubzilla-config.txt
- nano hubzilla-config.txt
@@ -100,7 +100,7 @@ Create bootable USB drive with Debian on it.You could use
Example for command dd...
su -
- dd if=2017-11-29-raspbian-stretch.img of=/dev/mmcblk0
+ dd if=2018-10-09-raspbian-stretch.img of=/dev/mmcblk0
Do not forget to unmount the SD card before and check if unmounted like in this example...
@@ -164,7 +164,7 @@ Make the directory for apache and change diretory to it
Clone hubzilla from git ("git pull" will update it later)
- git clone https://framagit.org/hubzilla/core html
+ git clone https://framagit.org/hubzilla/core.git html
Change to the install script
@@ -217,14 +217,20 @@ After the daily script was executed at 05:30 (am)
- optionally view the daily log under yourdomain.org/admin/logs/
- set the logfile to var/www/html/hubzilla-daily.log
-## Note for the Rasperry
-The script was tested with an Raspberry 3 under Raspian (Debian 9.3, 2017-11-29-raspbian-stretch.img).
+## Install Hubzilla in a Virtual Machine for Test Purposes
+
+Modify the file "hubzilla-config.txt".
+
+ nano hubzilla-config.txt
-It is recommended to deinstall these programms to avoid endless updates. Use...
+There use
+
+ le_domain=localhost
+
+## Note for the Rasperry
- sudo apt-get purge wolfram-engine sonic-pi
- sudo apt-get autoremove
+The script was tested with an Raspberry 3 under Raspian (Debian 9.5, 2018-10-09-raspbian-stretch.img).
It is recommended to run the Raspi without graphical frontend (X-Server). Use...
@@ -234,7 +240,7 @@ to boot the Rapsi to the client console.
DO NOT FORGET TO CHANGE THE DEFAULT PASSWORD FOR USER PI!
-On a Raspian Stretch (Debian 9) the validation of the mail address fails for the very first user.
+If the validation of the mail address fails for the very first registered user...
This used to happen on some *bsd distros but there was some work to fix that a year ago (2017).
So if your system isn't registered in DNS or DNS isn't active do
diff --git a/.homeinstall/hubzilla-config.txt.template b/.homeinstall/hubzilla-config.txt.template
index 2776ccd27..e42da0e4e 100644
--- a/.homeinstall/hubzilla-config.txt.template
+++ b/.homeinstall/hubzilla-config.txt.template
@@ -18,6 +18,8 @@ db_pass=
# Example: my.cooldomain.org
# Example: cooldomain.org
#
+# Example: localhost (test installation without certificates for httpS)
+#
# Email is optional
#
#
diff --git a/.homeinstall/hubzilla-setup.sh b/.homeinstall/hubzilla-setup.sh
index ff101086c..1f3ad5db5 100755
--- a/.homeinstall/hubzilla-setup.sh
+++ b/.homeinstall/hubzilla-setup.sh
@@ -816,15 +816,35 @@ install_run_selfhost
ping_domain
configure_cron_freedns
configure_cron_selfhost
-install_letsencrypt
-configure_apache_for_https
-check_https
+
+if [ "$le_domain" != "localhost" ]
+then
+ install_letsencrypt
+ configure_apache_for_https
+ check_https
+else
+ print_info "is localhost - skipped installation of letsencrypt and configuration of apache for https"
+fi
+
install_hubzilla
-rewrite_to_https
-install_rsnapshot
+
+if [ "$le_domain" != "localhost" ]
+then
+ rewrite_to_https
+ install_rsnapshot
+else
+ print_info "is localhost - skipped rewrite to https and installation of rsnapshot"
+fi
+
configure_cron_daily
-install_cryptosetup
-write_uninstall_script
+
+if [ "$le_domain" != "localhost" ]
+then
+ install_cryptosetup
+ write_uninstall_script
+else
+ print_info "is localhost - skipped installation of cryptosetup"
+fi
#set +x # stop debugging from here
diff --git a/Zotlabs/Daemon/Deliver.php b/Zotlabs/Daemon/Deliver.php
index b809cba91..43f426eb7 100644
--- a/Zotlabs/Daemon/Deliver.php
+++ b/Zotlabs/Daemon/Deliver.php
@@ -2,6 +2,8 @@
namespace Zotlabs\Daemon;
+use Zotlabs\Lib\DReport;
+
require_once('include/zot.php');
require_once('include/queue_fn.php');
@@ -58,11 +60,12 @@ class Deliver {
foreach($dresult as $xx) {
if(is_array($xx) && array_key_exists('message_id',$xx)) {
- if(delivery_report_is_storable($xx)) {
- q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ",
+ if(DReport::is_storable($xx)) {
+ q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_name, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
dbesc($xx['message_id']),
dbesc($xx['location']),
dbesc($xx['recipient']),
+ dbesc(($xx['name']) ? $xx['name'] : EMPTY_STR),
dbesc($xx['status']),
dbesc(datetime_convert($xx['date'])),
dbesc($xx['sender'])
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index f74c8f11c..8b81c49da 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -2,6 +2,8 @@
namespace Zotlabs\Daemon;
+use Zotlabs\Lib\Libzot;
+
require_once('include/queue_fn.php');
require_once('include/html2plain.php');
require_once('include/conversation.php');
@@ -344,7 +346,16 @@ class Notifier {
return;
$encoded_item = encode_item($target_item);
-
+
+ // activitystreams version
+ $m = get_iconfig($target_item,'activitystreams','signed_data');
+ if($m) {
+ $activity = json_decode($m,true);
+ }
+ else {
+ $activity = \Zotlabs\Lib\Activity::encode_activity($target_item);
+ }
+
// Send comments to the owner to re-deliver to everybody in the conversation
// We only do this if the item in question originated on this site. This prevents looping.
// To clarify, a site accepting a new comment is responsible for sending it to the owner for relay.
@@ -561,7 +572,7 @@ class Notifier {
logger('notifier_hub: ' . $hub['hubloc_url'],LOGGER_DEBUG);
- if($hub['hubloc_network'] !== 'zot') {
+ if(! in_array($hub['hubloc_network'], [ 'zot','zot6' ])) {
$narr = [
'channel' => $channel,
'upstream' => $upstream,
@@ -610,20 +621,27 @@ class Notifier {
continue;
}
- // default: zot protocol
+ if(! in_array($hub['hubloc_network'], [ 'zot','zot6' ])) {
+ continue;
+ }
- $hash = random_string();
+ $hash = new_uuid();
$packet = null;
$pmsg = '';
if($packet_type === 'refresh' || $packet_type === 'purge') {
- $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null));
+ if($hub['hubloc_network'] === 'zot6') {
+ $packet = Libzot::build_packet($channel, $packet_type, ids_to_array($packet_recips,'hash'));
+ }
+ else {
+ $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null));
+ }
}
- if($packet_type === 'keychange') {
+ if($packet_type === 'keychange' && $hub['hubloc_network'] === 'zot') {
$pmsg = get_pconfig($channel['channel_id'],'system','keychange');
$packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null));
}
- elseif($packet_type === 'request') {
+ elseif($packet_type === 'request' && $hub['hubloc_network'] === 'zot') {
$env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : '');
$packet = zot_build_packet($channel,$packet_type,$env,$hub['hubloc_sitekey'],$hub['site_crypto'],
$hash, array('message_id' => $request_message_id)
@@ -636,6 +654,7 @@ class Notifier {
'account_id' => $channel['channel_account_id'],
'channel_id' => $channel['channel_id'],
'posturl' => $hub['hubloc_callback'],
+ 'driver' => $hub['hubloc_network'],
'notify' => $packet,
'msg' => (($pmsg) ? json_encode($pmsg) : '')
));
@@ -643,18 +662,32 @@ class Notifier {
else {
$env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : '');
- // currently zot6 delivery is only performed on normal items and not sync items or mail or anything else
- // Eventually we will do this for all deliveries, but for now ensure this is precisely what we are dealing
- // with before switching to zot6 as the primary zot6 handler checks for the existence of a message delivery report
- // to trigger dequeue'ing
- $z6 = (($encoded_item && $encoded_item['type'] === 'activity' && (! array_key_exists('allow_cid',$encoded_item))) ? true : false);
- if($z6) {
- $packet = zot6_build_packet($channel,'notify',$env, json_encode($encoded_item), (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
+ if($hub['hubloc_network'] === 'zot6') {
+ $zenv = [];
+ if($env) {
+ foreach($env as $e) {
+ $zenv[] = $e['hash'];
+ }
+ }
+
+ $packet_type = (($upstream || $uplink) ? 'response' : 'activity');
+ $packet = Libzot::build_packet($channel,$packet_type,$zenv,$activity,'activitystreams',(($private) ? $hub['hubloc_sitekey'] : null),$hub['site_crypto']);
}
else {
- $packet = zot_build_packet($channel,'notify',$env, (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
+ // currently zot6 delivery is only performed on normal items and not sync items or mail or anything else
+ // Eventually we will do this for all deliveries, but for now ensure this is precisely what we are dealing
+ // with before switching to zot6 as the primary zot6 handler checks for the existence of a message delivery report
+ // to trigger dequeue'ing
+
+ $z6 = (($encoded_item && $encoded_item['type'] === 'activity' && (! array_key_exists('allow_cid',$encoded_item))) ? true : false);
+ if($z6) {
+ $packet = zot6_build_packet($channel,'notify',$env, json_encode($encoded_item), (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
+ }
+ else {
+ $packet = zot_build_packet($channel,'notify',$env, (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
+ }
}
queue_insert(
@@ -663,6 +696,7 @@ class Notifier {
'account_id' => $target_item['aid'],
'channel_id' => $target_item['uid'],
'posturl' => $hub['hubloc_callback'],
+ 'driver' => $hub['hubloc_network'],
'notify' => $packet,
'msg' => json_encode($encoded_item)
]
diff --git a/Zotlabs/Lib/ActivityStreams.php b/Zotlabs/Lib/ActivityStreams.php
index 37e717f58..49978031e 100644
--- a/Zotlabs/Lib/ActivityStreams.php
+++ b/Zotlabs/Lib/ActivityStreams.php
@@ -7,22 +7,25 @@ namespace Zotlabs\Lib;
*
* Parses an ActivityStream JSON string.
*/
+
class ActivityStreams {
- public $raw = null;
- public $data;
- public $valid = false;
- public $id = '';
- public $type = '';
- public $actor = null;
- public $obj = null;
- public $tgt = null;
- public $origin = null;
- public $owner = null;
- public $signer = null;
- public $ldsig = null;
- public $sigok = false;
- public $recips = null;
+ public $raw = null;
+ public $data = null;
+ public $valid = false;
+ public $deleted = false;
+ public $id = '';
+ public $parent_id = '';
+ public $type = '';
+ public $actor = null;
+ public $obj = null;
+ public $tgt = null;
+ public $origin = null;
+ public $owner = null;
+ public $signer = null;
+ public $ldsig = null;
+ public $sigok = false;
+ public $recips = null;
public $raw_recips = null;
/**
@@ -35,16 +38,49 @@ class ActivityStreams {
function __construct($string) {
$this->raw = $string;
- $this->data = json_decode($string, true);
+
+ if(is_array($string)) {
+ $this->data = $string;
+ }
+ else {
+ $this->data = json_decode($string, true);
+ }
if($this->data) {
+
+ // verify and unpack JSalmon signature if present
+
+ if(is_array($this->data) && array_key_exists('signed',$this->data)) {
+ $ret = JSalmon::verify($this->data);
+ $tmp = JSalmon::unpack($this->data['data']);
+ if($ret && $ret['success']) {
+ if($ret['signer']) {
+ $saved = json_encode($this->data,JSON_UNESCAPED_SLASHES);
+ $this->data = $tmp;
+ $this->data['signer'] = $ret['signer'];
+ $this->data['signed_data'] = $saved;
+ if($ret['hubloc']) {
+ $this->data['hubloc'] = $ret['hubloc'];
+ }
+ }
+ }
+ }
+
$this->valid = true;
+
+ if(array_key_exists('type',$this->data) && array_key_exists('actor',$this->data) && array_key_exists('object',$this->data)) {
+ if($this->data['type'] === 'Delete' && $this->data['actor'] === $this->data['object']) {
+ $this->deleted = $this->data['actor'];
+ $this->valid = false;
+ }
+ }
+
}
if($this->is_valid()) {
$this->id = $this->get_property_obj('id');
$this->type = $this->get_primary_type();
- $this->actor = $this->get_compound_property('actor');
+ $this->actor = $this->get_actor('actor','','');
$this->obj = $this->get_compound_property('object');
$this->tgt = $this->get_compound_property('target');
$this->origin = $this->get_compound_property('origin');
@@ -53,14 +89,31 @@ class ActivityStreams {
$this->ldsig = $this->get_compound_property('signature');
if($this->ldsig) {
$this->signer = $this->get_compound_property('creator',$this->ldsig);
- if($this->signer && $this->signer['publicKey'] && $this->signer['publicKey']['publicKeyPem']) {
- $this->sigok = \Zotlabs\Lib\LDSignatures::verify($this->data,$this->signer['publicKey']['publicKeyPem']);
+ if($this->signer && is_array($this->signer) && array_key_exists('publicKey',$this->signer) && is_array($this->signer['publicKey']) && $this->signer['publicKey']['publicKeyPem']) {
+ $this->sigok = LDSignatures::verify($this->data,$this->signer['publicKey']['publicKeyPem']);
}
}
- if(($this->type === 'Note') && (! $this->obj)) {
+ if(! $this->obj) {
$this->obj = $this->data;
$this->type = 'Create';
+ if(! $this->actor) {
+ $this->actor = $this->get_actor('attributedTo',$this->obj);
+ }
+ }
+
+ if($this->obj && is_array($this->obj) && $this->obj['actor'])
+ $this->obj['actor'] = $this->get_actor('actor',$this->obj);
+ if($this->tgt && is_array($this->tgt) && $this->tgt['actor'])
+ $this->tgt['actor'] = $this->get_actor('actor',$this->tgt);
+
+ $this->parent_id = $this->get_property_obj('inReplyTo');
+
+ if((! $this->parent_id) && is_array($this->obj)) {
+ $this->parent_id = $this->obj['inReplyTo'];
+ }
+ if((! $this->parent_id) && is_array($this->obj)) {
+ $this->parent_id = $this->obj['id'];
}
}
}
@@ -190,44 +243,122 @@ class ActivityStreams {
$base = (($base) ? $base : $this->data);
$propname = (($prefix) ? $prefix . ':' : '') . $property;
+ if(! is_array($base)) {
+ btlogger('not an array: ' . print_r($base,true));
+ return null;
+ }
+
return ((array_key_exists($propname, $base)) ? $base[$propname] : null);
}
+
/**
* @brief Fetches a property from an URL.
*
* @param string $url
* @return NULL|mixed
*/
+
function fetch_property($url) {
+ return self::fetch($url);
+ }
+
+ static function fetch($url) {
$redirects = 0;
if(! check_siteallowed($url)) {
logger('blacklisted: ' . $url);
return null;
}
-
+ logger('fetch: ' . $url, LOGGER_DEBUG);
$x = z_fetch_url($url, true, $redirects,
- ['headers' => [ 'Accept: application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ]]);
- if($x['success'])
+ [ 'headers' => [ 'Accept: application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ]]);
+ if($x['success']) {
+ $y = json_decode($x['body'],true);
+ logger('returned: ' . json_encode($y,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
return json_decode($x['body'], true);
+ }
+ else {
+ logger('fetch failed: ' . $url);
+ }
+ return null;
+ }
+
+ static function is_an_actor($s) {
+ return(in_array($s,[ 'Application','Group','Organization','Person','Service' ]));
+ }
+
+ /**
+ * @brief
+ *
+ * @param string $property
+ * @param array $base
+ * @param string $namespace (optional) default empty
+ * @return NULL|mixed
+ */
+
+ function get_actor($property,$base='',$namespace = '') {
+ $x = $this->get_property_obj($property, $base, $namespace);
+ if($this->is_url($x)) {
+
+ // SECURITY: If we have already stored the actor profile, re-generate it
+ // from cached data - don't refetch it from the network
+ $r = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' limit 1",
+ dbesc($x)
+ );
+ if($r) {
+ $y = Activity::encode_person($r[0]);
+ $y['cached'] = true;
+ return $y;
+ }
+ }
+ $actor = $this->get_compound_property($property,$base,$namespace,true);
+ if(is_array($actor) && self::is_an_actor($actor['type'])) {
+ if(array_key_exists('id',$actor) && (! array_key_exists('inbox',$actor))) {
+ $actor = $this->fetch_property($actor['id']);
+ }
+ return $actor;
+ }
return null;
}
+
/**
* @brief
*
* @param string $property
* @param array $base
* @param string $namespace (optional) default empty
+ * @param boolean $first (optional) default false, if true and result is a sequential array return only the first element
* @return NULL|mixed
*/
- function get_compound_property($property, $base = '', $namespace = '') {
+ function get_compound_property($property, $base = '', $namespace = '', $first = false) {
$x = $this->get_property_obj($property, $base, $namespace);
if($this->is_url($x)) {
$x = $this->fetch_property($x);
}
+ // verify and unpack JSalmon signature if present
+
+ if(is_array($x) && array_key_exists('signed',$x)) {
+ $ret = JSalmon::verify($x);
+ $tmp = JSalmon::unpack($x['data']);
+ if($ret && $ret['success']) {
+ if($ret['signer']) {
+ $saved = json_encode($x,JSON_UNESCAPED_SLASHES);
+ $x = $tmp;
+ $x['signer'] = $ret['signer'];
+ $x['signed_data'] = $saved;
+ if($ret['hubloc']) {
+ $x['hubloc'] = $ret['hubloc'];
+ }
+ }
+ }
+ }
+ if($first && is_array($x) && array_key_exists(0,$x)) {
+ return $x[0];
+ }
+
return $x;
}
@@ -273,4 +404,18 @@ class ActivityStreams {
return $x;
}
+
+ static function is_as_request() {
+
+ $x = getBestSupportedMimeType([
+ 'application/ld+json;profile="https://www.w3.org/ns/activitystreams"',
+ 'application/activity+json',
+ 'application/ld+json;profile="http://www.w3.org/ns/activitystreams"'
+ ]);
+
+ return(($x) ? true : false);
+
+ }
+
+
} \ No newline at end of file
diff --git a/Zotlabs/Lib/DReport.php b/Zotlabs/Lib/DReport.php
index a68d6c18f..21b320cac 100644
--- a/Zotlabs/Lib/DReport.php
+++ b/Zotlabs/Lib/DReport.php
@@ -14,6 +14,7 @@ class DReport {
$this->location = $location;
$this->sender = $sender;
$this->recipient = $recipient;
+ $this->name = EMPTY_STR;
$this->message_id = $message_id;
$this->status = $status;
$this->date = datetime_convert();
@@ -24,8 +25,8 @@ class DReport {
$this->date = datetime_convert();
}
- function addto_recipient($name) {
- $this->recipient = $this->recipient . ' ' . $name;
+ function set_name($name) {
+ $this->name = $name;
}
function addto_update($status) {
@@ -37,6 +38,7 @@ class DReport {
$this->location = $arr['location'];
$this->sender = $arr['sender'];
$this->recipient = $arr['recipient'];
+ $this->name = $arr['name'];
$this->message_id = $arr['message_id'];
$this->status = $arr['status'];
$this->date = $arr['date'];
@@ -47,9 +49,87 @@ class DReport {
'location' => $this->location,
'sender' => $this->sender,
'recipient' => $this->recipient,
+ 'name' => $this->name,
'message_id' => $this->message_id,
'status' => $this->status,
'date' => $this->date
);
}
+
+ /**
+ * @brief decide whether to store a returned delivery report
+ *
+ * @param array $dr
+ * @return boolean
+ */
+
+ static function is_storable($dr) {
+
+ if(get_config('system', 'disable_dreport'))
+ return false;
+
+ /**
+ * @hooks dreport_is_storable
+ * Called before storing a dreport record to determine whether to store it.
+ * * \e array
+ */
+
+ call_hooks('dreport_is_storable', $dr);
+
+ // let plugins accept or reject - if neither, continue on
+ if(array_key_exists('accept',$dr) && intval($dr['accept']))
+ return true;
+ if(array_key_exists('reject',$dr) && intval($dr['reject']))
+ return false;
+
+ if(! ($dr['sender']))
+ return false;
+
+ // Is the sender one of our channels?
+
+ $c = q("select channel_id from channel where channel_hash = '%s' limit 1",
+ dbesc($dr['sender'])
+ );
+ if(! $c)
+ return false;
+
+
+ // is the recipient one of our connections, or do we want to store every report?
+
+
+ $rxchan = $dr['recipient'];
+ $pcf = get_pconfig($c[0]['channel_id'],'system','dreport_store_all');
+ if($pcf)
+ return true;
+
+ // We always add ourself as a recipient to private and relayed posts
+ // So if a remote site says they can't find us, that's no big surprise
+ // and just creates a lot of extra report noise
+
+ if(($dr['location'] !== z_root()) && ($dr['sender'] === $rxchan) && ($dr['status'] === 'recipient_not_found'))
+ return false;
+
+ // If you have a private post with a recipient list, every single site is going to report
+ // back a failed delivery for anybody on that list that isn't local to them. We're only
+ // concerned about this if we have a local hubloc record which says we expected them to
+ // have a channel on that site.
+
+ $r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_url = '%s'",
+ dbesc($rxchan),
+ dbesc($dr['location'])
+ );
+ if((! $r) && ($dr['status'] === 'recipient_not_found'))
+ return false;
+
+ $r = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($rxchan),
+ intval($c[0]['channel_id'])
+ );
+ if($r)
+ return true;
+
+ return false;
+ }
+
+
}
diff --git a/Zotlabs/Lib/JSalmon.php b/Zotlabs/Lib/JSalmon.php
index 43d5f9d09..f35bf6235 100644
--- a/Zotlabs/Lib/JSalmon.php
+++ b/Zotlabs/Lib/JSalmon.php
@@ -2,15 +2,13 @@
namespace Zotlabs\Lib;
+use Zotlabs\Zot6\HTTPSig;
class JSalmon {
- static function sign($data,$key_id,$key) {
+ static function sign($data,$key_id,$key,$data_type = 'application/x-zot+json') {
- $arr = $data;
- $data = json_encode($data,JSON_UNESCAPED_SLASHES);
- $data = base64url_encode($data, false); // do not strip padding
- $data_type = 'application/x-zot+json';
+ $data = base64url_encode(json_encode($data,true),true); // strip padding
$encoding = 'base64url';
$algorithm = 'RSA-SHA256';
@@ -18,9 +16,9 @@ class JSalmon {
// precomputed base64url encoding of data_type, encoding, algorithm concatenated with periods
- $precomputed = '.' . base64url_encode($data_type,false) . '.YmFzZTY0dXJs.UlNBLVNIQTI1Ng==';
+ $precomputed = '.' . base64url_encode($data_type,true) . '.YmFzZTY0dXJs.UlNBLVNIQTI1Ng';
- $signature = base64url_encode(rsa_sign($data . $precomputed, $key), false);
+ $signature = base64url_encode(rsa_sign($data . $precomputed, $key), true);
return ([
'signed' => true,
@@ -30,9 +28,45 @@ class JSalmon {
'alg' => $algorithm,
'sigs' => [
'value' => $signature,
- 'key_id' => base64url_encode($key_id)
+ 'key_id' => base64url_encode($key_id, true)
]
]);
}
+
+ static function verify($x) {
+
+ logger('verify');
+ $ret = [ 'results' => [] ];
+
+ if(! is_array($x)) {
+ return $false;
+ }
+ if(! ( array_key_exists('signed',$x) && $x['signed'])) {
+ return $false;
+ }
+
+ $signed_data = preg_replace('/\s+/','',$x['data']) . '.'
+ . base64url_encode($x['data_type'],true) . '.'
+ . base64url_encode($x['encoding'],true) . '.'
+ . base64url_encode($x['alg'],true);
+
+ $key = HTTPSig::get_key(EMPTY_STR,base64url_decode($x['sigs']['key_id']));
+ logger('key: ' . print_r($key,true));
+ if($key['portable_id'] && $key['public_key']) {
+ if(rsa_verify($signed_data,base64url_decode($x['sigs']['value']),$key['public_key'])) {
+ logger('verified');
+ $ret = [ 'success' => true, 'signer' => $key['portable_id'], 'hubloc' => $key['hubloc'] ];
+ }
+ }
+
+ return $ret;
+
+ }
+
+ static function unpack($data) {
+ return json_decode(base64url_decode($data),true);
+ }
+
+
} \ No newline at end of file
diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php
index 2c726aff4..70f013eb7 100644
--- a/Zotlabs/Lib/Libzot.php
+++ b/Zotlabs/Lib/Libzot.php
@@ -109,7 +109,7 @@ class Libzot {
$data = [
'type' => $type,
'encoding' => $encoding,
- 'sender' => $channel['channel_hash'],
+ 'sender' => $channel['channel_portable_id'],
'site_id' => self::make_xchan_hash(z_root(), get_config('system','pubkey')),
'version' => System::get_zot_revision(),
];
@@ -329,8 +329,14 @@ class Libzot {
return false;
if($channel && $record['data']['permissions']) {
- $old_read_stream_perm = their_perms_contains($channel['channel_id'],$x['hash'],'view_stream');
- set_abconfig($channel['channel_id'],$x['hash'],'system','their_perms',$record['data']['permissions']);
+ $permissions = explode(',',$record['data']['permissions']);
+ if($permissions && is_array($permissions)) {
+ $old_read_stream_perm = get_abconfig($channel['channel_id'],$x['hash'],'their_perms','view_stream');
+
+ foreach($permissions as $p) {
+ set_abconfig($channel['channel_id'],$x['hash'],'their_perms',$p,'1');
+ }
+ }
if(array_key_exists('profile',$record['data']) && array_key_exists('next_birthday',$record['data']['profile'])) {
$next_birthday = datetime_convert('UTC','UTC',$record['data']['profile']['next_birthday']);
@@ -350,7 +356,7 @@ class Libzot {
);
if($r) {
-
+logger('4');
// connection exists
// if the dob is the same as what we have stored (disregarding the year), keep the one
@@ -379,14 +385,16 @@ class Libzot {
else {
$p = Permissions::connect_perms($channel['channel_id']);
- $my_perms = Permissions::serialise($p['perms']);
+ $my_perms = $p['perms'];
$automatic = $p['automatic'];
// new connection
if($my_perms) {
- set_abconfig($channel['channel_id'],$x['hash'],'system','my_perms',$my_perms);
+ foreach($my_perms as $k => $v) {
+ set_abconfig($channel['channel_id'],$x['hash'],'my_perms',$k,$v);
+ }
}
$closeness = get_pconfig($channel['channel_id'],'system','new_abook_closeness');
@@ -409,7 +417,7 @@ class Libzot {
if($y) {
logger("New introduction received for {$channel['channel_name']}");
- $new_perms = get_all_perms($channel['channel_id'],$x['hash']);
+ $new_perms = get_all_perms($channel['channel_id'],$x['hash'],false);
// Send a clone sync packet and a permissions update if permissions have changed
@@ -425,7 +433,7 @@ class Libzot {
[
'type' => NOTIFY_INTRO,
'from_xchan' => $x['hash'],
- 'to_xchan' => $channel['channel_hash'],
+ 'to_xchan' => $channel['channel_portable_id'],
'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id']
]
);
@@ -500,6 +508,7 @@ class Libzot {
$r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url
where hubloc_guid = '%s' and hubloc_guid_sig = '%s'
and hubloc_url = '%s' and hubloc_url_sig = '%s'
+ and hubloc_network = 'zot6'
and hubloc_site_id = '%s' $limit",
dbesc($arr['id']),
dbesc($arr['id_sig']),
@@ -776,7 +785,7 @@ class Libzot {
// see if this is a channel clone that's hosted locally - which we treat different from other xchans/connections
- $local = q("select channel_account_id, channel_id from channel where channel_hash = '%s' limit 1",
+ $local = q("select channel_account_id, channel_id from channel where channel_portable_id = '%s' limit 1",
dbesc($xchan_hash)
);
if($local) {
@@ -966,6 +975,7 @@ class Libzot {
}
$x = crypto_unencapsulate($x, get_config('system','prvkey'));
+
if(! is_array($x)) {
$x = json_decode($x,true);
}
@@ -996,7 +1006,7 @@ class Libzot {
dbesc($xx['recipient']),
dbesc($xx['name']),
dbesc($xx['status']),
- dbesc(datetime_convert($xx['date'])),
+ dbesc(datetime_convert('UTC','UTC',$xx['date'])),
dbesc($xx['sender'])
);
}
@@ -1129,7 +1139,7 @@ class Libzot {
if($recip_arr) {
stringify_array_elms($recip_arr,true);
$recips = implode(',',$recip_arr);
- $r = q("select channel_hash as hash from channel where channel_hash in ( " . $recips . " ) and channel_removed = 0 ");
+ $r = q("select channel_portable_id as hash from channel where channel_portable_id in ( " . $recips . " ) and channel_removed = 0 ");
}
if(! $r) {
@@ -1303,12 +1313,12 @@ class Libzot {
$r = [];
- $c = q("select channel_id, channel_hash from channel where channel_removed = 0");
+ $c = q("select channel_id, channel_portable_id from channel where channel_removed = 0");
if($c) {
foreach($c as $cc) {
if(perm_is_allowed($cc['channel_id'],$msg['sender'],$perm)) {
- $r[] = $cc['channel_hash'];
+ $r[] = $cc['channel_portable_id'];
}
}
}
@@ -1316,7 +1326,7 @@ class Libzot {
if($include_sys) {
$sys = get_sys_channel();
if($sys)
- $r[] = $sys['channel_hash'];
+ $r[] = $sys['channel_portable_id'];
}
@@ -1332,7 +1342,7 @@ class Libzot {
if($tag['type'] === 'Mention' && (strpos($tag['href'],z_root()) !== false)) {
$address = basename($tag['href']);
if($address) {
- $z = q("select channel_hash as hash from channel where channel_address = '%s'
+ $z = q("select channel_portable_id as hash from channel where channel_address = '%s'
and channel_removed = 0 limit 1",
dbesc($address)
);
@@ -1353,7 +1363,7 @@ class Libzot {
$thread_parent = self::find_parent($msg,$act);
if($thread_parent) {
- $z = q("select channel_hash as hash from channel left join item on channel.channel_id = item.uid where ( item.thr_parent = '%s' OR item.parent_mid = '%s' ) ",
+ $z = q("select channel_portable_id as hash from channel left join item on channel.channel_id = item.uid where ( item.thr_parent = '%s' OR item.parent_mid = '%s' ) ",
dbesc($thread_parent),
dbesc($thread_parent)
);
@@ -1427,7 +1437,7 @@ class Libzot {
* access checks.
*/
- if($sender === $channel['channel_hash'] && $arr['author_xchan'] === $channel['channel_hash'] && $arr['mid'] === $arr['parent_mid']) {
+ if($sender === $channel['channel_portable_id'] && $arr['author_xchan'] === $channel['channel_portable_id'] && $arr['mid'] === $arr['parent_mid']) {
$DR->update('self delivery ignored');
$result[] = $DR->get();
continue;
@@ -1709,7 +1719,7 @@ class Libzot {
$stored = (($item_result && $item_result['item']) ? $item_result['item'] : false);
if((is_array($stored)) && ($stored['id'] != $stored['parent'])
- && ($stored['author_xchan'] === $channel['channel_hash'])) {
+ && ($stored['author_xchan'] === $channel['channel_hash'] || $stored['author_xchan'] === $channel['channel_portable_id'])) {
retain_item($stored['item']['parent']);
}
@@ -1809,9 +1819,9 @@ class Libzot {
}
logger('FOF Activity received: ' . print_r($arr,true), LOGGER_DATA, LOG_DEBUG);
- logger('FOF Activity recipient: ' . $channel['channel_hash'], LOGGER_DATA, LOG_DEBUG);
+ logger('FOF Activity recipient: ' . $channel['channel_portable_id'], LOGGER_DATA, LOG_DEBUG);
- $result = self::process_delivery($arr['owner_xchan'],$arr, [ $channel['channel_hash'] ],false,false,true);
+ $result = self::process_delivery($arr['owner_xchan'],$arr, [ $channel['channel_portable_id'] ],false,false,true);
if ($result) {
$ret = array_merge($ret, $result);
}
@@ -2047,7 +2057,7 @@ class Libzot {
$DR = new DReport(z_root(),$sender,$d,$arr['mid']);
- $r = q("select * from channel where channel_hash = '%s' limit 1",
+ $r = q("select * from channel where channel_portable_id = '%s' limit 1",
dbesc($d['hash'])
);
@@ -2202,7 +2212,7 @@ class Libzot {
$loc = $locations[0];
- $r = q("select * from channel where channel_hash = '%s' limit 1",
+ $r = q("select * from channel where channel_portable_id = '%s' limit 1",
dbesc($sender_hash)
);
@@ -2210,7 +2220,7 @@ class Libzot {
return;
if($loc['url'] !== z_root()) {
- $x = q("update channel set channel_moved = '%s' where channel_hash = '%s' limit 1",
+ $x = q("update channel set channel_moved = '%s' where channel_portable_id = '%s' limit 1",
dbesc($loc['url']),
dbesc($sender_hash)
);
@@ -2246,7 +2256,7 @@ class Libzot {
static function encode_locations($channel) {
$ret = [];
- $x = self::get_hublocs($channel['channel_hash']);
+ $x = self::get_hublocs($channel['channel_portable_id']);
if($x && count($x)) {
foreach($x as $hub) {
@@ -2557,6 +2567,9 @@ class Libzot {
static function zotinfo($arr) {
+ logger('arr: ' . print_r($arr,true));
+
+
$ret = [];
$zhash = ((x($arr,'guid_hash')) ? $arr['guid_hash'] : '');
@@ -2593,13 +2606,13 @@ class Libzot {
$r = null;
if(strlen($zhash)) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
- where channel_hash = '%s' limit 1",
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
+ where channel_portable_id = '%s' limit 1",
dbesc($zhash)
);
}
elseif(strlen($zguid) && strlen($zguid_sig)) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
dbesc($zguid),
dbesc($zguid_sig)
@@ -2607,7 +2620,7 @@ class Libzot {
}
elseif(strlen($zaddr)) {
if(strpos($zaddr,'[system]') === false) { /* normal address lookup */
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
where ( channel_address = '%s' or xchan_addr = '%s' ) limit 1",
dbesc($zaddr),
dbesc($zaddr)
@@ -2627,10 +2640,10 @@ class Libzot {
*
*/
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
where channel_system = 1 order by channel_id limit 1");
if(! $r) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
where channel_removed = 0 order by channel_id limit 1");
}
}
@@ -2749,7 +2762,7 @@ class Libzot {
];
$ret['channel_role'] = get_pconfig($e['channel_id'],'system','permissions_role','custom');
- $ret['protocols'] = [ 'zot6' ];
+ $ret['protocols'] = [ 'zot', 'zot6' ];
$ret['searchable'] = $searchable;
$ret['adult_content'] = $adult_channel;
$ret['public_forum'] = $public_forum;
@@ -2774,7 +2787,7 @@ class Libzot {
if(! $ret['follow_url'])
$ret['follow_url'] = z_root() . '/follow?f=&url=%s';
- $permissions = get_all_perms($e['channel_id'],$ztarget_hash,false);
+ $permissions = get_all_perms($e['channel_id'],$ztarget_hash,false,false);
if($ztarget_hash) {
$permissions['connected'] = false;
diff --git a/Zotlabs/Lib/NativeWiki.php b/Zotlabs/Lib/NativeWiki.php
index cdabbc3e9..e2bd07c0d 100644
--- a/Zotlabs/Lib/NativeWiki.php
+++ b/Zotlabs/Lib/NativeWiki.php
@@ -40,26 +40,17 @@ class NativeWiki {
function create_wiki($channel, $observer_hash, $wiki, $acl) {
- // Generate unique resource_id using the same method as item_message_id()
- do {
- $dups = false;
- $resource_id = random_string();
- $r = q("SELECT mid FROM item WHERE resource_id = '%s' AND resource_type = '%s' AND uid = %d LIMIT 1",
- dbesc($resource_id),
- dbesc(NWIKI_ITEM_RESOURCE_TYPE),
- intval($channel['channel_id'])
- );
- if($r)
- $dups = true;
- } while($dups == true);
+ $resource_id = new_uuid();
+ $uuid = new_uuid();
$ac = $acl->get();
- $mid = item_message_id();
+ $mid = z_root() . '/item/' . $uuid;
$arr = array(); // Initialize the array of parameters for the post
$item_hidden = ((intval($wiki['postVisible']) === 0) ? 1 : 0);
$wiki_url = z_root() . '/wiki/' . $channel['channel_address'] . '/' . $wiki['urlName'];
$arr['aid'] = $channel['channel_account_id'];
+ $arr['uuid'] = $uuid;
$arr['uid'] = $channel['channel_id'];
$arr['mid'] = $mid;
$arr['parent_mid'] = $mid;
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index 78714c2c4..83d243177 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -39,6 +39,8 @@ class ThreadItem {
$this->data = $data;
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
+ $observer = \App::get_observer();
+
// Prepare the children
if($data['children']) {
foreach($data['children'] as $item) {
@@ -51,6 +53,7 @@ class ThreadItem {
continue;
}
+
$child = new ThreadItem($item);
$this->add_child($child);
}
@@ -299,8 +302,10 @@ class ThreadItem {
if($keep_reports === 0)
$keep_reports = 10;
- if((! get_config('system','disable_dreport')) && strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC',"now - $keep_reports days")) > 0)
+ if((! get_config('system','disable_dreport')) && strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC',"now - $keep_reports days")) > 0) {
$dreport = t('Delivery Report');
+ $dreport_link = gen_link_id($item['mid']);
+ }
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
$is_new = true;
@@ -316,7 +321,7 @@ class ThreadItem {
$owner_address = substr($item['owner']['xchan_addr'],0,strpos($item['owner']['xchan_addr'],'@'));
$viewthread = $item['llink'];
if($conv->get_mode() === 'channel')
- $viewthread = z_root() . '/channel/' . $owner_address . '?f=&mid=' . urlencode($item['mid']);
+ $viewthread = z_root() . '/channel/' . $owner_address . '?f=&mid=' . urlencode(gen_link_id($item['mid']));
$comment_count_txt = sprintf( tt('%d comment','%d comments',$total_children),$total_children );
$list_unseen_txt = (($unseen_comments) ? sprintf('%d unseen',$unseen_comments) : '');
@@ -364,6 +369,7 @@ class ThreadItem {
'thread_action_menu' => thread_action_menu($item,$conv->get_mode()),
'thread_author_menu' => thread_author_menu($item,$conv->get_mode()),
'dreport' => $dreport,
+ 'dreport_link' => $dreport_link,
'name' => $profile_name,
'thumb' => $profile_avatar,
'osparkle' => $osparkle,
diff --git a/Zotlabs/Lib/Zotfinger.php b/Zotlabs/Lib/Zotfinger.php
index 537e440d4..d094fdc8d 100644
--- a/Zotlabs/Lib/Zotfinger.php
+++ b/Zotlabs/Lib/Zotfinger.php
@@ -2,7 +2,7 @@
namespace Zotlabs\Lib;
-use Zotlabs\Web\HTTPSig;
+use Zotlabs\Zot6\HTTPSig;
class Zotfinger {
@@ -12,10 +12,19 @@ class Zotfinger {
return false;
}
- if($channel) {
+ $m = parse_url($resource);
+
+ $data = json_encode([ 'zot_token' => random_string() ]);
+
+ if($channel && $m) {
+
$headers = [
- 'Accept' => 'application/x-zot+json',
- 'X-Zot-Token' => random_string(),
+ 'Accept' => 'application/x-zot+json',
+ 'Content-Type' => 'application/x-zot+json',
+ 'X-Zot-Token' => random_string(),
+ 'Digest' => HTTPSig::generate_digest_header($data),
+ 'Host' => $m['host'],
+ '(request-target)' => 'post ' . get_request_string($resource)
];
$h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel),false);
}
@@ -27,7 +36,9 @@ class Zotfinger {
$redirects = 0;
- $x = z_fetch_url($resource,false,$redirects, [ 'headers' => $h ] );
+ $x = z_post_url($resource,$data,$redirects, [ 'headers' => $h ] );
+
+ logger('fetch: ' . print_r($x,true));
if($x['success']) {
@@ -39,6 +50,8 @@ class Zotfinger {
$result['data'] = json_decode(crypto_unencapsulate($result['data'],get_config('system','prvkey')),true);
}
+ logger('decrypted: ' . print_r($result,true));
+
return $result;
}
diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php
index f1537ed15..12d87885f 100644
--- a/Zotlabs/Module/Channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -6,6 +6,8 @@ namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\PermissionDescription;
+use Zotlabs\Zot6\HTTPSig;
+use Zotlabs\Lib\Libzot;
require_once('include/items.php');
require_once('include/security.php');
@@ -44,6 +46,48 @@ class Channel extends Controller {
$channel = App::get_channel();
if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ }
+
+ $channel = channelx_by_nick($which);
+ if(! $channel) {
+ http_status_exit(404, 'Not found');
+ }
+
+ // handle zot6 channel discovery
+
+ if(Libzot::is_zot_request()) {
+
+ $sigdata = HTTPSig::verify(file_get_contents('php://input'));
+
+ if($sigdata && $sigdata['signer'] && $sigdata['header_valid']) {
+ $data = json_encode(Libzot::zotinfo([ 'address' => $channel['channel_address'], 'target_url' => $sigdata['signer'] ]));
+ $s = q("select site_crypto, hubloc_sitekey from site left join hubloc on hubloc_url = site_url where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1",
+ dbesc($sigdata['signer'])
+ );
+
+ if($s) {
+ $data = json_encode(crypto_encapsulate($data,$s[0]['hubloc_sitekey'],Libzot::best_algorithm($s[0]['site_crypto'])));
+ }
+ }
+ else {
+ $data = json_encode(Libzot::zotinfo([ 'address' => $channel['channel_address'] ]));
+ }
+
+ $headers = [
+ 'Content-Type' => 'application/x-zot+json',
+ 'Digest' => HTTPSig::generate_digest_header($data),
+ '(request-target)' => strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI']
+ ];
+ $h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel));
+ HTTPSig::set_headers($h);
+ echo $data;
+ killme();
+ }
+
+
+ if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
$profile = argv(1);
}
diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php
index 3d7ee449a..a9f643306 100644
--- a/Zotlabs/Module/Connedit.php
+++ b/Zotlabs/Module/Connedit.php
@@ -8,6 +8,7 @@ namespace Zotlabs\Module;
*/
use Zotlabs\Lib\Apps;
+use Zotlabs\Lib\Libzot;
require_once('include/socgraph.php');
require_once('include/selectors.php');
@@ -475,6 +476,10 @@ class Connedit extends \Zotlabs\Web\Controller {
if(! zot_refresh($orig_record[0],\App::get_channel()))
notice( t('Refresh failed - channel is currently unavailable.') );
}
+ elseif($orig_record[0]['xchan_network'] === 'zot6') {
+ if(! Libzot::refresh($orig_record[0],\App::get_channel()))
+ notice( t('Refresh failed - channel is currently unavailable.') );
+ }
else {
// if you are on a different network we'll force a refresh of the connection basic info
diff --git a/Zotlabs/Module/Dreport.php b/Zotlabs/Module/Dreport.php
index 76e07b147..16ae7941f 100644
--- a/Zotlabs/Module/Dreport.php
+++ b/Zotlabs/Module/Dreport.php
@@ -17,9 +17,17 @@ class Dreport extends \Zotlabs\Web\Controller {
$mid = ((argc() > 1) ? argv(1) : '');
+ if(strpos($mid,'b64.') === 0)
+ $mid = @base64url_decode(substr($mid,4));
+
+
if($mid === 'push') {
$table = 'push';
$mid = ((argc() > 2) ? argv(2) : '');
+
+ if(strpos($mid,'b64.') === 0)
+ $mid = @base64url_decode(substr($mid,4));
+
if($mid) {
$i = q("select id from item where mid = '%s' and uid = %d and ( author_xchan = '%s' or ( owner_xchan = '%s' and item_wall = 1 )) ",
dbesc($mid),
@@ -38,6 +46,9 @@ class Dreport extends \Zotlabs\Web\Controller {
if($mid === 'mail') {
$table = 'mail';
$mid = ((argc() > 2) ? argv(2) : '');
+ if(strpos($mid,'b64.') === 0)
+ $mid = @base64url_decode(substr($mid,4));
+
}
@@ -80,7 +91,6 @@ class Dreport extends \Zotlabs\Web\Controller {
}
for($x = 0; $x < count($r); $x++ ) {
- $r[$x]['name'] = escape_tags(substr($r[$x]['dreport_recip'],strpos($r[$x]['dreport_recip'],' ')));
// This has two purposes: 1. make the delivery report strings translateable, and
// 2. assign an ordering to item delivery results so we can group them and provide
@@ -138,14 +148,14 @@ class Dreport extends \Zotlabs\Web\Controller {
$entries = array();
foreach($r as $rr) {
$entries[] = [
- 'name' => $rr['name'],
+ 'name' => escape_tags($rr['dreport_name'] ?: $rr['dreport_recip']),
'result' => escape_tags($rr['dreport_result']),
'time' => escape_tags(datetime_convert('UTC',date_default_timezone_get(),$rr['dreport_time']))
];
}
$o = replace_macros(get_markup_template('dreport.tpl'), array(
- '$title' => sprintf( t('Delivery report for %1$s'),substr($mid,0,32)) . '...',
+ '$title' => sprintf( t('Delivery report for %1$s'),basename($mid)) . '...',
'$table' => $table,
'$mid' => urlencode($mid),
'$options' => t('Options'),
@@ -162,9 +172,9 @@ class Dreport extends \Zotlabs\Web\Controller {
private static function dreport_gravity_sort($a,$b) {
if($a['gravity'] == $b['gravity']) {
- if($a['name'] === $b['name'])
+ if($a['dreport_name'] === $b['dreport_name'])
return strcmp($a['dreport_time'],$b['dreport_time']);
- return strcmp($a['name'],$b['name']);
+ return strcmp($a['dreport_name'],$b['dreport_name']);
}
return (($a['gravity'] > $b['gravity']) ? 1 : (-1));
}
diff --git a/Zotlabs/Module/Impel.php b/Zotlabs/Module/Impel.php
index 0c372bd96..e05027d9f 100644
--- a/Zotlabs/Module/Impel.php
+++ b/Zotlabs/Module/Impel.php
@@ -133,9 +133,11 @@ class Impel extends \Zotlabs\Web\Controller {
$arr['author_xchan'] = (($j['author_xchan']) ? $j['author_xchan'] : get_observer_hash());
$arr['mimetype'] = (($j['mimetype']) ? $j['mimetype'] : 'text/bbcode');
- if(! $j['mid'])
- $j['mid'] = item_message_id();
-
+ if(! $j['mid']) {
+ $j['uuid'] = item_message_id();
+ $j['mid'] = z_root() . '/item/' . $j['uuid'];
+ }
+ $arr['uuid'] = $j['uuid'];
$arr['mid'] = $arr['parent_mid'] = $j['mid'];
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 2ee639874..1d64ef60c 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -2,6 +2,16 @@
namespace Zotlabs\Module;
+use Zotlabs\Lib\IConfig;
+use Zotlabs\Lib\Enotify;
+use Zotlabs\Web\Controller;
+use Zotlabs\Daemon\Master;
+
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/security.php');
+
+
/**
*
* This is the POST destination for most all locally posted
@@ -17,16 +27,8 @@ namespace Zotlabs\Module;
*
*/
-require_once('include/crypto.php');
-require_once('include/items.php');
-require_once('include/attach.php');
-require_once('include/bbcode.php');
-require_once('include/security.php');
-
-use \Zotlabs\Lib as Zlib;
-
-class Item extends \Zotlabs\Web\Controller {
+class Item extends Controller {
function post() {
@@ -392,6 +394,7 @@ class Item extends \Zotlabs\Web\Controller {
$verb = $orig_post['verb'];
$app = $orig_post['app'];
$title = escape_tags(trim($_REQUEST['title']));
+ $summary = trim($_REQUEST['summary']);
$body = trim($_REQUEST['body']);
$item_flags = $orig_post['item_flags'];
@@ -454,6 +457,7 @@ class Item extends \Zotlabs\Web\Controller {
$coord = notags(trim($_REQUEST['coord']));
$verb = notags(trim($_REQUEST['verb']));
$title = escape_tags(trim($_REQUEST['title']));
+ $summary = trim($_REQUEST['summary']);
$body = trim($_REQUEST['body']);
$body .= trim($_REQUEST['attachment']);
$postopts = '';
@@ -505,12 +509,14 @@ class Item extends \Zotlabs\Web\Controller {
&& ($channel['channel_pageflags'] & PAGE_ALLOWCODE)) ? true : false);
if($preview) {
+ $summary = z_input_filter($summary,$mimetype,$execflag);
$body = z_input_filter($body,$mimetype,$execflag);
}
- $arr = [ 'profile_uid' => $profile_uid, 'content' => $body, 'mimetype' => $mimetype ];
+ $arr = [ 'profile_uid' => $profile_uid, 'summary' => $summary, 'content' => $body, 'mimetype' => $mimetype ];
call_hooks('post_content',$arr);
+ $summary = $arr['summary'];
$body = $arr['content'];
$mimetype = $arr['mimetype'];
@@ -531,9 +537,23 @@ class Item extends \Zotlabs\Web\Controller {
// we may need virtual or template classes to implement the possible alternatives
+ if(strpos($body,'[/summary]') !== false) {
+ $match = '';
+ $cnt = preg_match("/\[summary\](.*?)\[\/summary\]/ism",$body,$match);
+ if($cnt) {
+ $summary .= $match[1];
+ }
+ $body_content = preg_replace("/^(.*?)\[summary\](.*?)\[\/summary\](.*?)$/ism", '',$body);
+ $body = trim($body_content);
+ }
+
+ $summary = cleanup_bbcode($summary);
+
$body = cleanup_bbcode($body);
// Look for tags and linkify them
+
+ $results = linkify_tags($a, $summary, ($uid) ? $uid : $profile_uid);
$results = linkify_tags($a, $body, ($uid) ? $uid : $profile_uid);
if($results) {
@@ -579,6 +599,9 @@ class Item extends \Zotlabs\Web\Controller {
if(! $preview) {
fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+ fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($summary,'[/crypt]')) ? $_POST['media_str'] : $summary),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+
+
fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
}
@@ -711,7 +734,8 @@ class Item extends \Zotlabs\Web\Controller {
$notify_type = (($parent) ? 'comment-new' : 'wall-new' );
if(! $mid) {
- $mid = (($message_id) ? $message_id : item_message_id());
+ $uuid = (($message_id) ? $message_id : item_message_id());
+ $mid = z_root() . '/item/' . $uuid;
}
@@ -766,6 +790,7 @@ class Item extends \Zotlabs\Web\Controller {
$datarray['aid'] = $channel['channel_account_id'];
$datarray['uid'] = $profile_uid;
+ $datarray['uuid'] = $uuid;
$datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
$datarray['author_xchan'] = $observer['xchan_hash'];
$datarray['created'] = $created;
@@ -778,6 +803,7 @@ class Item extends \Zotlabs\Web\Controller {
$datarray['parent_mid'] = $parent_mid;
$datarray['mimetype'] = $mimetype;
$datarray['title'] = $title;
+ $datarray['summary'] = $summary;
$datarray['body'] = $body;
$datarray['app'] = $app;
$datarray['location'] = $location;
@@ -887,12 +913,12 @@ class Item extends \Zotlabs\Web\Controller {
$datarray['title'] = mb_substr($datarray['title'],0,191);
if($webpage) {
- Zlib\IConfig::Set($datarray,'system', webpage_to_namespace($webpage),
- (($pagetitle) ? $pagetitle : substr($datarray['mid'],0,16)),true);
+ IConfig::Set($datarray,'system', webpage_to_namespace($webpage),
+ (($pagetitle) ? $pagetitle : basename($datarray['mid'])), true);
}
elseif($namespace) {
- Zlib\IConfig::Set($datarray,'system', $namespace,
- (($remote_id) ? $remote_id : substr($datarray['mid'],0,16)),true);
+ IConfig::Set($datarray,'system', $namespace,
+ (($remote_id) ? $remote_id : basename($datarray['mid'])), true);
}
@@ -924,7 +950,7 @@ class Item extends \Zotlabs\Web\Controller {
}
}
if(! $nopush)
- \Zotlabs\Daemon\Master::Summon(array('Notifier', 'edit_post', $post_id));
+ Master::Summon([ 'Notifier', 'edit_post', $post_id ]);
if($api_source)
@@ -959,7 +985,7 @@ class Item extends \Zotlabs\Web\Controller {
// otherwise it will happen during delivery
if(($datarray['owner_xchan'] != $datarray['author_xchan']) && (intval($parent_item['item_wall']))) {
- Zlib\Enotify::submit(array(
+ Enotify::submit(array(
'type' => NOTIFY_COMMENT,
'from_xchan' => $datarray['author_xchan'],
'to_xchan' => $datarray['owner_xchan'],
@@ -977,7 +1003,7 @@ class Item extends \Zotlabs\Web\Controller {
$parent = $post_id;
if(($datarray['owner_xchan'] != $datarray['author_xchan']) && ($datarray['item_type'] == ITEM_TYPE_POST)) {
- Zlib\Enotify::submit(array(
+ Enotify::submit(array(
'type' => NOTIFY_WALL,
'from_xchan' => $datarray['author_xchan'],
'to_xchan' => $datarray['owner_xchan'],
@@ -1039,7 +1065,7 @@ class Item extends \Zotlabs\Web\Controller {
call_hooks('post_local_end', $datarray);
if(! $nopush)
- \Zotlabs\Daemon\Master::Summon(array('Notifier', $notify_type, $post_id));
+ Master::Summon([ 'Notifier', $notify_type, $post_id ]);
logger('post_complete');
diff --git a/Zotlabs/Module/Like.php b/Zotlabs/Module/Like.php
index 4e216f08b..c39726b88 100644
--- a/Zotlabs/Module/Like.php
+++ b/Zotlabs/Module/Like.php
@@ -371,10 +371,13 @@ class Like extends \Zotlabs\Web\Controller {
}
}
- $mid = item_message_id();
+ $uuid = item_message_id();
$arr = array();
+ $arr['uuid'] = $uuid;
+ $arr['mid'] = z_root() . '/item/' . $uuid;
+
if($extended_like) {
$arr['item_thread_top'] = 1;
$arr['item_origin'] = 1;
@@ -476,7 +479,6 @@ class Like extends \Zotlabs\Web\Controller {
}
- $arr['mid'] = $mid;
$arr['aid'] = (($extended_like) ? $ch[0]['channel_account_id'] : $owner_aid);
$arr['uid'] = $owner_uid;
diff --git a/Zotlabs/Module/Mood.php b/Zotlabs/Module/Mood.php
index 16ef0b171..453f08f9f 100644
--- a/Zotlabs/Module/Mood.php
+++ b/Zotlabs/Module/Mood.php
@@ -70,7 +70,8 @@ class Mood extends Controller {
$poster = App::get_observer();
- $mid = item_message_id();
+ $uuid = item_message_id();
+ $mid = z_root() . '/item/' . $uuid;
$action = sprintf( t('%1$s is %2$s','mood'), '[zrl=' . $poster['xchan_url'] . ']' . $poster['xchan_name'] . '[/zrl]' , $verbs[$verb]);
@@ -78,6 +79,7 @@ class Mood extends Controller {
$arr['aid'] = get_account_id();
$arr['uid'] = $uid;
+ $arr['uuid'] = $uuid;
$arr['mid'] = $mid;
$arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
$arr['author_xchan'] = $poster['xchan_hash'];
diff --git a/Zotlabs/Module/Nojs.php b/Zotlabs/Module/Nojs.php
deleted file mode 100644
index 5f3d80ecd..000000000
--- a/Zotlabs/Module/Nojs.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-
-class Nojs extends \Zotlabs\Web\Controller {
-
- function init() {
- $n = ((argc() > 1) ? intval(argv(1)) : 1);
- setcookie('jsdisabled', $n, 0, '/');
- $p = hex2bin($_GET['redir']);
- $hasq = strpbrk($p,'?&');
- goaway(z_root() . (($p) ? '/' . $p : '') . (($hasq) ? '' : '?f=' ) . '&jsdisabled=' . $n);
-
- }
-}
diff --git a/Zotlabs/Module/Pconfig.php b/Zotlabs/Module/Pconfig.php
index 7c82bac7d..44fe5d9a9 100644
--- a/Zotlabs/Module/Pconfig.php
+++ b/Zotlabs/Module/Pconfig.php
@@ -43,7 +43,7 @@ class Pconfig extends \Zotlabs\Web\Controller {
}
- function get() {
+ function get() {
if(! local_channel()) {
return login();
diff --git a/Zotlabs/Module/React.php b/Zotlabs/Module/React.php
index fbb760786..3920301f5 100644
--- a/Zotlabs/Module/React.php
+++ b/Zotlabs/Module/React.php
@@ -44,6 +44,7 @@ class React extends \Zotlabs\Web\Controller {
return;
}
+ $uuid = item_message_id();
$n = array();
$n['aid'] = $channel['channel_account_id'];
@@ -52,7 +53,8 @@ class React extends \Zotlabs\Web\Controller {
$n['item_type'] = $i[0]['item_type'];
$n['parent'] = $postid;
$n['parent_mid'] = $i[0]['mid'];
- $n['mid'] = item_message_id();
+ $n['uuid'] = $uuid;
+ $n['mid'] = z_root() . '/item/' . $uuid;
$n['verb'] = ACTIVITY_REACT . '#' . $emoji;
$n['body'] = "\n\n[zmg=32x32]" . z_root() . '/images/emoji/' . $emoji . '.png[/zmg]' . "\n\n";
$n['author_xchan'] = $channel['channel_hash'];
diff --git a/Zotlabs/Module/Subthread.php b/Zotlabs/Module/Subthread.php
index 1a9caff6c..54343fdfa 100644
--- a/Zotlabs/Module/Subthread.php
+++ b/Zotlabs/Module/Subthread.php
@@ -106,8 +106,9 @@ class Subthread extends \Zotlabs\Web\Controller {
- $mid = item_message_id();
-
+ $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']));
@@ -145,6 +146,7 @@ class Subthread extends \Zotlabs\Web\Controller {
$arr = array();
+ $arr['uuid'] = $uuid;
$arr['mid'] = $mid;
$arr['aid'] = $owner_aid;
$arr['uid'] = $owner_uid;
diff --git a/Zotlabs/Module/Wfinger.php b/Zotlabs/Module/Wfinger.php
index 1866bce40..e4591df12 100644
--- a/Zotlabs/Module/Wfinger.php
+++ b/Zotlabs/Module/Wfinger.php
@@ -205,6 +205,12 @@ class Wfinger extends \Zotlabs\Web\Controller {
],
[
+ 'rel' => 'http://purl.org/zot/protocol/6.0',
+ 'type' => 'application/x-zot+json',
+ 'href' => channel_url($r[0])
+ ],
+
+ [
'rel' => 'http://purl.org/openwebauth/v1',
'type' => 'application/x-zot+json',
'href' => z_root() . '/owa',
diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php
index 642af6300..b30aecf92 100644
--- a/Zotlabs/Storage/Directory.php
+++ b/Zotlabs/Storage/Directory.php
@@ -224,7 +224,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota, DAV\IMo
}
$filesize = 0;
- $hash = random_string();
+ $hash = new_uuid();
$f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $hash;
diff --git a/Zotlabs/Update/_1226.php b/Zotlabs/Update/_1226.php
new file mode 100644
index 000000000..6e5a0e319
--- /dev/null
+++ b/Zotlabs/Update/_1226.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Zotlabs\Update;
+
+use Zotlabs\Lib\Libzot;
+
+class _1226 {
+
+ function run() {
+
+ q("START TRANSACTION");
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r1 = q("ALTER TABLE channel ADD channel_portable_id text NOT NULL DEFAULT '' ");
+ $r2 = q("create index \"channel_portable_id_idx\" on channel (\"channel_portable_id\")");
+
+ $r = ($r1 && $r2);
+ }
+ else {
+ $r = q("ALTER TABLE `channel` ADD `channel_portable_id` char(191) NOT NULL DEFAULT '' ,
+ ADD INDEX `channel_portable_id` (`channel_portable_id`)");
+ }
+
+ if($r) {
+ q("COMMIT");
+ self::upgrade();
+ return UPDATE_SUCCESS;
+ }
+
+ q("ROLLBACK");
+ return UPDATE_FAILED;
+ }
+
+
+ static function upgrade() {
+
+ $r = q("select * from channel where channel_portable_id = '' ");
+
+ if($r) {
+ foreach($r as $rv) {
+
+ $zhash = Libzot::make_xchan_hash($rv['channel_guid'],$rv['channel_pubkey']);
+ q("update channel set channel_portable_id = '%s' where channel_id = %d",
+ dbesc($zhash),
+ intval($rv['channel_id'])
+ );
+ $x = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($rv['channel_hash'])
+ );
+ if($x) {
+ $rec = $x[0];
+ $rec['xchan_hash'] = $zhash;
+ $rec['xchan_guid_sig'] = 'sha256.' . $rec['xchan_guid_sig'];
+ $rec['xchan_network'] = 'zot6';
+
+ xchan_store_lowlevel($rec);
+ }
+ $x = q("select * from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' limit 1",
+ dbesc($rv['channel_hash']),
+ dbesc(z_root())
+ );
+ if($x) {
+ $rec = $x[0];
+ $rec['hubloc_hash'] = $zhash;
+ $rec['hubloc_guid_sig'] = 'sha256.' . $rec['hubloc_guid_sig'];
+ $rec['hubloc_network'] = 'zot6';
+ $rec['hubloc_url_sig'] = 'sha256.' . $rec['hubloc_url_sig'];
+ $rec['hubloc_callback'] = z_root() . '/zot';
+ $rec['hubloc_id_url'] = channel_url($rv);
+ $rec['hubloc_site_id'] = Libzot::make_xchan_hash(z_root(),get_config('system','pubkey'));
+ hubloc_store_lowlevel($rec);
+ }
+ }
+ }
+ }
+}
+
+
diff --git a/Zotlabs/Update/_1227.php b/Zotlabs/Update/_1227.php
new file mode 100644
index 000000000..b5dbb2286
--- /dev/null
+++ b/Zotlabs/Update/_1227.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Zotlabs\Update;
+
+
+class _1227 {
+
+ function run() {
+
+ q("START TRANSACTION");
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r = q("ALTER TABLE dreport ADD dreport_name text NOT NULL DEFAULT '' ");
+ }
+ else {
+ $r = q("ALTER TABLE `dreport` ADD `dreport_name` char(191) NOT NULL DEFAULT ''");
+ }
+
+ if($r) {
+ q("COMMIT");
+ return UPDATE_SUCCESS;
+ }
+
+ q("ROLLBACK");
+ return UPDATE_FAILED;
+ }
+
+}
+
+
diff --git a/Zotlabs/Update/_1228.php b/Zotlabs/Update/_1228.php
new file mode 100644
index 000000000..f8a506bb4
--- /dev/null
+++ b/Zotlabs/Update/_1228.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Zotlabs\Update;
+
+
+class _1228 {
+
+ function run() {
+
+ q("START TRANSACTION");
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r1 = q("ALTER TABLE item ADD uuid text NOT NULL DEFAULT '' ");
+ $r2 = q("create index \"uuid_idx\" on channel (\"uuid\")");
+ $r3 = q("ALTER TABLE item add summary TEXT NOT NULL");
+
+ $r = ($r1 && $r2 && $r3);
+ }
+ else {
+ $r1 = q("ALTER TABLE `item` ADD `uuid` char(191) NOT NULL DEFAULT '' ,
+ ADD INDEX `uuid` (`uuid`)");
+ $r2 = q("ALTER TABLE `item` ADD `summary` mediumtext NOT NULL");
+ $r = ($r1 && $r2);
+ }
+
+ if($r) {
+ q("COMMIT");
+ return UPDATE_SUCCESS;
+ }
+
+ q("ROLLBACK");
+ return UPDATE_FAILED;
+ }
+
+}
+
diff --git a/Zotlabs/Web/CheckJS.php b/Zotlabs/Web/CheckJS.php
deleted file mode 100644
index e83ccf27b..000000000
--- a/Zotlabs/Web/CheckJS.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace Zotlabs\Web;
-
-
-class CheckJS {
-
- private static $jsdisabled = 0;
-
- function __construct($test = 0) {
- if(intval($_REQUEST['jsdisabled']))
- $this->jsdisabled = 1;
- else
- $this->jsdisabled = 0;
- if(intval($_COOKIE['jsdisabled']))
- $this->jsdisabled = 1;
- else
- $this->jsdisabled = 0;
-
- $page = bin2hex(\App::$query_string);
-
- if(! $this->jsdisabled) {
- if($test) {
- $this->jsdisabled = 1;
- if(array_key_exists('jsdisabled',$_COOKIE))
- $this->jsdisabled = $_COOKIE['jsdisabled'];
-
- if(! array_key_exists('jsdisabled',$_COOKIE)) {
- \App::$page['htmlhead'] .= "\r\n" . '<script>document.cookie="jsdisabled=0; path=/"; var jsMatch = /\&jsdisabled=0/; if (!jsMatch.exec(location.href)) { location.href = "' . z_root() . '/nojs/0?f=&redir=' . $page . '" ; }</script>' . "\r\n";
- /* emulate JS cookie if cookies are not accepted */
- if (array_key_exists('jsdisabled',$_GET)) {
- $_COOKIE['jsdisabled'] = $_GET['jsdisabled'];
- }
- }
- }
- else {
- \App::$page['htmlhead'] .= "\r\n" . '<noscript><meta http-equiv="refresh" content="0; url=' . z_root() . '/nojs?f=&redir=' . $page . '"></noscript>' . "\r\n";
- }
- }
-
- }
-
- function disabled() {
- return $this->jsdisabled;
- }
-
-
-}
-
-
diff --git a/Zotlabs/Web/HTTPSig.php b/Zotlabs/Web/HTTPSig.php
index f27aa0556..fe0b9428f 100644
--- a/Zotlabs/Web/HTTPSig.php
+++ b/Zotlabs/Web/HTTPSig.php
@@ -342,6 +342,10 @@ class HTTPSig {
*/
static function parse_sigheader($header) {
+ if(is_array($header)) {
+ btlogger('is_array: ' . print_r($header,true));
+ }
+
$ret = [];
$matches = [];
@@ -397,7 +401,7 @@ class HTTPSig {
$data = $matches[1];
if($iv && $key && $alg && $data) {
- return crypto_unencapsulate([ 'iv' => $iv, 'key' => $key, 'alg' => $alg, 'data' => $data ] , $prvkey);
+ return crypto_unencapsulate([ 'encrypted' => true, 'iv' => $iv, 'key' => $key, 'alg' => $alg, 'data' => $data ] , $prvkey);
}
return '';
diff --git a/Zotlabs/Zot6/HTTPSig.php b/Zotlabs/Zot6/HTTPSig.php
index a0f0d3500..72785b1e9 100644
--- a/Zotlabs/Zot6/HTTPSig.php
+++ b/Zotlabs/Zot6/HTTPSig.php
@@ -48,12 +48,14 @@ class HTTPSig {
$h = new HTTPHeaders($data['header']);
$headers = $h->fetcharr();
$body = $data['body'];
+ $headers['(request-target)'] = $data['request_target'];
}
else {
$headers = [];
$headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'];
$headers['content-type'] = $_SERVER['CONTENT_TYPE'];
+ $headers['content-length'] = $_SERVER['CONTENT_LENGTH'];
foreach($_SERVER as $k => $v) {
if(strpos($k,'HTTP_') === 0) {
@@ -121,6 +123,17 @@ class HTTPSig {
if(array_key_exists($h,$headers)) {
$signed_data .= $h . ': ' . $headers[$h] . "\n";
}
+ if($h === 'date') {
+ $d = new \DateTime($headers[$h]);
+ $d->setTimeZone(new \DateTimeZone('UTC'));
+ $dplus = datetime_convert('UTC','UTC','now + 1 day');
+ $dminus = datetime_convert('UTC','UTC','now - 1 day');
+ $c = $d->format('Y-m-d H:i:s');
+ if($c > $dplus || $c < $dminus) {
+ logger('bad time: ' . $c);
+ return $result;
+ }
+ }
}
$signed_data = rtrim($signed_data,"\n");
@@ -147,8 +160,15 @@ class HTTPSig {
logger('verified: ' . $x, LOGGER_DEBUG);
- if(! $x)
+ if(! $x) {
+ logger('verify failed for ' . $result['signer'] . ' alg=' . $algorithm . (($key['public_key']) ? '' : ' no key'));
+ $sig_block['signature'] = base64_encode($sig_block['signature']);
+ logger('affected sigblock: ' . print_r($sig_block,true));
+ logger('signed_data: ' . print_r($signed_data,true));
+ logger('headers: ' . print_r($headers,true));
+ logger('server: ' . print_r($_SERVER,true));
return $result;
+ }
$result['portable_id'] = $key['portable_id'];
$result['header_valid'] = true;
@@ -180,7 +200,9 @@ class HTTPSig {
return [ 'public_key' => $key ];
}
- $key = self::get_webfinger_key($id);
+ if(strpos($id,'#') === false) {
+ $key = self::get_webfinger_key($id);
+ }
if(! $key) {
$key = self::get_activitystreams_key($id);
@@ -216,25 +238,29 @@ class HTTPSig {
function get_activitystreams_key($id) {
+ // remove fragment
+
+ $url = ((strpos($id,'#')) ? substr($id,0,strpos($id,'#')) : $id);
+
$x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' limit 1",
- dbesc(str_replace('acct:','',$id)),
- dbesc($id)
+ dbesc(str_replace('acct:','',$url)),
+ dbesc($url)
);
if($x && $x[0]['xchan_pubkey']) {
return [ 'portable_id' => $x[0]['xchan_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
}
- $r = ActivityStreams::fetch_property($id);
+ $r = ActivityStreams::fetch($id);
if($r) {
- if(array_key_exists('publicKey',$j) && array_key_exists('publicKeyPem',$j['publicKey']) && array_key_exists('id',$j['publicKey'])) {
- if($j['publicKey']['id'] === $id || $j['id'] === $id) {
- return [ 'public_key' => self::convertKey($j['publicKey']['publicKeyPem']), 'portable_id' => '', 'hubloc' => [] ];
+ if(array_key_exists('publicKey',$r) && array_key_exists('publicKeyPem',$r['publicKey']) && array_key_exists('id',$r['publicKey'])) {
+ if($r['publicKey']['id'] === $id || $r['id'] === $id) {
+ $portable_id = ((array_key_exists('owner',$r['publicKey'])) ? $r['publicKey']['owner'] : EMPTY_STR);
+ return [ 'public_key' => self::convertKey($r['publicKey']['publicKeyPem']), 'portable_id' => $portable_id, 'hubloc' => [] ];
}
}
}
-
return false;
}
@@ -409,6 +435,8 @@ class HTTPSig {
$headers = '';
$fields = '';
+ logger('signing: ' . print_r($head,true), LOGGER_DATA);
+
if($head) {
foreach($head as $k => $v) {
$headers .= strtolower($k) . ': ' . trim($v) . "\n";
diff --git a/Zotlabs/Zot6/Receiver.php b/Zotlabs/Zot6/Receiver.php
index 4f26e2b0c..66559c9a5 100644
--- a/Zotlabs/Zot6/Receiver.php
+++ b/Zotlabs/Zot6/Receiver.php
@@ -4,7 +4,7 @@ namespace Zotlabs\Zot6;
use Zotlabs\Lib\Config;
use Zotlabs\Lib\Libzot;
-use Zotlabs\Web\HTTPSig;
+
class Receiver {
diff --git a/Zotlabs/Zot6/Zot6Handler.php b/Zotlabs/Zot6/Zot6Handler.php
index 5597921cc..e320e7825 100644
--- a/Zotlabs/Zot6/Zot6Handler.php
+++ b/Zotlabs/Zot6/Zot6Handler.php
@@ -70,9 +70,10 @@ class Zot6Handler implements IHandler {
// This would be a permissions update, typically for one connection
foreach ($recipients as $recip) {
+
$r = q("select channel.*,xchan.* from channel
- left join xchan on channel_hash = xchan_hash
- where channel_hash ='%s' limit 1",
+ left join xchan on channel_portable_id = xchan_hash
+ where xchan_hash ='%s' limit 1",
dbesc($recip)
);
@@ -140,7 +141,7 @@ class Zot6Handler implements IHandler {
$arr = $data['recipients'][0];
- $c = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_hash = '%s' limit 1",
+ $c = q("select * from channel left join xchan on channel_portable_id = xchan_hash where channel_portable_id = '%s' limit 1",
dbesc($arr['portable_id'])
);
if (! $c) {
@@ -230,8 +231,8 @@ class Zot6Handler implements IHandler {
// basically this means "unfriend"
foreach ($recipients as $recip) {
$r = q("select channel.*,xchan.* from channel
- left join xchan on channel_hash = xchan_hash
- where channel_hash = '%s' and channel_guid_sig = '%s' limit 1",
+ left join xchan on channel_portable_id = xchan_hash
+ where channel_portable_id = '%s' limit 1",
dbesc($recip)
);
if ($r) {
diff --git a/boot.php b/boot.php
index cbaec7000..c74309be0 100755
--- a/boot.php
+++ b/boot.php
@@ -50,10 +50,10 @@ require_once('include/attach.php');
require_once('include/bbcode.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
-define ( 'STD_VERSION', '3.8.5' );
+define ( 'STD_VERSION', '3.9.5' );
define ( 'ZOT_REVISION', '6.0a' );
-define ( 'DB_UPDATE_VERSION', 1225 );
+define ( 'DB_UPDATE_VERSION', 1228 );
define ( 'PROJECT_BASE', __DIR__ );
diff --git a/include/activities.php b/include/activities.php
index 9b83f7a5c..68c995338 100644
--- a/include/activities.php
+++ b/include/activities.php
@@ -16,7 +16,8 @@ function profile_activity($changed, $value) {
return;
$arr = array();
- $arr['mid'] = $arr['parent_mid'] = item_message_id();
+ $arr['uuid'] = item_message_id();
+ $arr['mid'] = $arr['parent_mid'] = z_root() . '/item/' . $arr['uuid'];
$arr['uid'] = local_channel();
$arr['aid'] = $self['channel_account_id'];
$arr['owner_xchan'] = $arr['author_xchan'] = $self['xchan_hash'];
diff --git a/include/attach.php b/include/attach.php
index 4db5bc435..dd718aa14 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -739,7 +739,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
}
if(! $hash)
- $hash = random_string();
+ $hash = new_uuid();
// Check storage limits
if($options !== 'update') {
@@ -1122,7 +1122,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
return $ret;
}
- $arr['hash'] = (($arr['hash']) ? $arr['hash'] : random_string());
+ $arr['hash'] = (($arr['hash']) ? $arr['hash'] : new_uuid());
// Check for duplicate name.
// Check both the filename and the hash as we will be making use of both.
@@ -1759,16 +1759,18 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid,
$arr_allow_cid = check_list_permissions($channel_id, $arr_allow_cid, 'view_storage');
}
- $mid = item_message_id();
+ $uuid = item_message_id();
+ $mid = z_root() . '/item/' . $uuid;
$objtype = ACTIVITY_OBJ_FILE;
$arr = array();
$arr['aid'] = get_account_id();
$arr['uid'] = $channel_id;
- $arr['item_wall'] = 1;
- $arr['item_origin'] = 1;
- $arr['item_unseen'] = 1;
+ $arr['uuid'] = $uuid;
+ $arr['item_wall'] = 1;
+ $arr['item_origin'] = 1;
+ $arr['item_unseen'] = 1;
$arr['author_xchan'] = $poster['xchan_hash'];
$arr['owner_xchan'] = $poster['xchan_hash'];
$arr['title'] = '';
@@ -1813,8 +1815,10 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid,
$private = (($u_arr_allow_cid[0] || $u_arr_allow_gid[0] || $u_arr_deny_cid[0] || $u_arr_deny_gid[0]) ? 1 : 0);
- $u_mid = item_message_id();
+ $uuid = item_message_id();
+ $u_mid = z_root() . '/item/' . $uuid;
+ $arr['uuid'] = $uuid;
$arr['mid'] = $u_mid;
$arr['parent_mid'] = $u_mid;
$arr['allow_cid'] = perms2str($u_arr_allow_cid);
diff --git a/include/channel.php b/include/channel.php
index 22cdb9fe7..1e5570f6b 100644
--- a/include/channel.php
+++ b/include/channel.php
@@ -10,6 +10,7 @@ use Zotlabs\Access\Permissions;
use Zotlabs\Daemon\Master;
use Zotlabs\Lib\System;
use Zotlabs\Render\Comanche;
+use Zotlabs\Lib\Libzot;
require_once('include/zot.php');
require_once('include/crypto.php');
@@ -232,6 +233,7 @@ function create_identity($arr) {
$sig = base64url_encode(rsa_sign($guid,$key['prvkey']));
$hash = make_xchan_hash($guid,$sig);
+ $zhash = Libzot::make_xchan_hash($guid,$key['pubkey']);
// Force a few things on the short term until we can provide a theme or app with choice
@@ -265,6 +267,7 @@ function create_identity($arr) {
'channel_guid' => $guid,
'channel_guid_sig' => $sig,
'channel_hash' => $hash,
+ 'channel_portable_id' => $zhash,
'channel_prvkey' => $key['prvkey'],
'channel_pubkey' => $key['pubkey'],
'channel_pageflags' => intval($pageflags),
@@ -345,30 +348,76 @@ function create_identity($arr) {
if(! $r)
logger('Unable to store hub location');
+ $r = hubloc_store_lowlevel(
+ [
+ 'hubloc_guid' => $guid,
+ 'hubloc_guid_sig' => 'sha256.' . $sig,
+ 'hubloc_hash' => $zhash,
+ 'hubloc_id_url' => channel_url($ret['channel']),
+ 'hubloc_addr' => channel_reddress($ret['channel']),
+ 'hubloc_primary' => intval($primary),
+ 'hubloc_url' => z_root(),
+ 'hubloc_url_sig' => 'sha256.' . base64url_encode(rsa_sign(z_root(),$ret['channel']['channel_prvkey'])),
+ 'hubloc_site_id' => Libzot::make_xchan_hash(z_root(),get_config('system','pubkey')),
+ 'hubloc_host' => App::get_hostname(),
+ 'hubloc_callback' => z_root() . '/zot',
+ 'hubloc_sitekey' => get_config('system','pubkey'),
+ 'hubloc_network' => 'zot6',
+ 'hubloc_updated' => datetime_convert()
+ ]
+ );
+ if(! $r)
+ logger('Unable to store hub location');
+
+
$newuid = $ret['channel']['channel_id'];
$r = xchan_store_lowlevel(
[
- 'xchan_hash' => $hash,
- 'xchan_guid' => $guid,
- 'xchan_guid_sig' => $sig,
- 'xchan_pubkey' => $key['pubkey'],
+ 'xchan_hash' => $hash,
+ 'xchan_guid' => $guid,
+ 'xchan_guid_sig' => $sig,
+ 'xchan_pubkey' => $key['pubkey'],
'xchan_photo_mimetype' => (($photo_type) ? $photo_type : 'image/png'),
- 'xchan_photo_l' => z_root() . "/photo/profile/l/{$newuid}",
- 'xchan_photo_m' => z_root() . "/photo/profile/m/{$newuid}",
- 'xchan_photo_s' => z_root() . "/photo/profile/s/{$newuid}",
- 'xchan_addr' => channel_reddress($ret['channel']),
- 'xchan_url' => z_root() . '/channel/' . $ret['channel']['channel_address'],
- 'xchan_follow' => z_root() . '/follow?f=&url=%s',
- 'xchan_connurl' => z_root() . '/poco/' . $ret['channel']['channel_address'],
- 'xchan_name' => $ret['channel']['channel_name'],
- 'xchan_network' => 'zot',
- 'xchan_photo_date' => datetime_convert(),
- 'xchan_name_date' => datetime_convert(),
- 'xchan_system' => $system
+ 'xchan_photo_l' => z_root() . "/photo/profile/l/{$newuid}",
+ 'xchan_photo_m' => z_root() . "/photo/profile/m/{$newuid}",
+ 'xchan_photo_s' => z_root() . "/photo/profile/s/{$newuid}",
+ 'xchan_addr' => channel_reddress($ret['channel']),
+ 'xchan_url' => z_root() . '/channel/' . $ret['channel']['channel_address'],
+ 'xchan_follow' => z_root() . '/follow?f=&url=%s',
+ 'xchan_connurl' => z_root() . '/poco/' . $ret['channel']['channel_address'],
+ 'xchan_name' => $ret['channel']['channel_name'],
+ 'xchan_network' => 'zot',
+ 'xchan_photo_date' => datetime_convert(),
+ 'xchan_name_date' => datetime_convert(),
+ 'xchan_system' => $system
]
);
+ $r = xchan_store_lowlevel(
+ [
+ 'xchan_hash' => $zhash,
+ 'xchan_guid' => $guid,
+ 'xchan_guid_sig' => 'sha256.' . $sig,
+ 'xchan_pubkey' => $key['pubkey'],
+ 'xchan_photo_mimetype' => (($photo_type) ? $photo_type : 'image/png'),
+ 'xchan_photo_l' => z_root() . "/photo/profile/l/{$newuid}",
+ 'xchan_photo_m' => z_root() . "/photo/profile/m/{$newuid}",
+ 'xchan_photo_s' => z_root() . "/photo/profile/s/{$newuid}",
+ 'xchan_addr' => channel_reddress($ret['channel']),
+ 'xchan_url' => z_root() . '/channel/' . $ret['channel']['channel_address'],
+ 'xchan_follow' => z_root() . '/follow?f=&url=%s',
+ 'xchan_connurl' => z_root() . '/poco/' . $ret['channel']['channel_address'],
+ 'xchan_name' => $ret['channel']['channel_name'],
+ 'xchan_network' => 'zot6',
+ 'xchan_photo_date' => datetime_convert(),
+ 'xchan_name_date' => datetime_convert(),
+ 'xchan_system' => $system
+ ]
+ );
+
+
+
// Not checking return value.
// It's ok for this to fail if it's an imported channel, and therefore the hash is a duplicate
@@ -2355,6 +2404,7 @@ function channel_store_lowlevel($arr) {
'channel_guid' => ((array_key_exists('channel_guid',$arr)) ? $arr['channel_guid'] : ''),
'channel_guid_sig' => ((array_key_exists('channel_guid_sig',$arr)) ? $arr['channel_guid_sig'] : ''),
'channel_hash' => ((array_key_exists('channel_hash',$arr)) ? $arr['channel_hash'] : ''),
+ 'channel_portable_id' => ((array_key_exists('channel_portable_id',$arr)) ? $arr['channel_portable_id'] : ''),
'channel_timezone' => ((array_key_exists('channel_timezone',$arr)) ? $arr['channel_timezone'] : 'UTC'),
'channel_location' => ((array_key_exists('channel_location',$arr)) ? $arr['channel_location'] : ''),
'channel_theme' => ((array_key_exists('channel_theme',$arr)) ? $arr['channel_theme'] : ''),
diff --git a/include/crypto.php b/include/crypto.php
index 1040ac29b..39bfd8d43 100644
--- a/include/crypto.php
+++ b/include/crypto.php
@@ -225,9 +225,14 @@ function crypto_unencapsulate($data,$prvkey) {
if(! $data)
return;
- $alg = ((array_key_exists('alg',$data)) ? $data['alg'] : 'aes256cbc');
- if($alg === 'aes256cbc')
+ $alg = ((is_array($data) && (array_key_exists('encrypted',$data) || array_key_exists('iv',$data))) ? $data['alg'] : '');
+ if(! $alg) {
+ return $data;
+ }
+
+ if($alg === 'aes256cbc') {
return aes_unencapsulate($data,$prvkey);
+ }
return other_unencapsulate($data,$prvkey,$alg);
diff --git a/include/event.php b/include/event.php
index 84a16e8be..a34250e7a 100644
--- a/include/event.php
+++ b/include/event.php
@@ -1125,11 +1125,14 @@ function event_store_item($arr, $event) {
}
}
- if(! $arr['mid'])
- $arr['mid'] = item_message_id();
+ if(! $arr['mid']) {
+ $arr['uuid'] = item_message_id();
+ $arr['mid'] = z_root() . '/item/' . $arr['uuid'];
+ }
$item_arr['aid'] = $z[0]['channel_account_id'];
$item_arr['uid'] = $arr['uid'];
+ $item_arr['uuid'] = $arr['uuid'];
$item_arr['author_xchan'] = $arr['event_xchan'];
$item_arr['mid'] = $arr['mid'];
$item_arr['parent_mid'] = $arr['mid'];
diff --git a/include/help.php b/include/help.php
index 3b56a7238..f2aa4add3 100644
--- a/include/help.php
+++ b/include/help.php
@@ -351,7 +351,8 @@ function store_doc_file($s) {
$x = item_store_update($item);
}
else {
- $item['mid'] = $item['parent_mid'] = item_message_id();
+ $item['uuid'] = $item_message_id();
+ $item['mid'] = $item['parent_mid'] = z_root() . '/item/' . $item['uuid'];
$x = item_store($item);
}
diff --git a/include/import.php b/include/import.php
index 6476aa688..53b21c317 100644
--- a/include/import.php
+++ b/include/import.php
@@ -1520,7 +1520,8 @@ function import_webpage_element($element, $channel, $type) {
}
else { // otherwise, generate the creation times and unique id
$arr['created'] = datetime_convert('UTC', 'UTC');
- $arr['mid'] = $arr['parent_mid'] = item_message_id();
+ $arr['uuid'] = item_message_id();
+ $arr['mid'] = $arr['parent_mid'] = z_root() . '/item/' . $arr['uuid'];
}
// Update the edited time whether or not the element already exists
$arr['edited'] = datetime_convert('UTC', 'UTC');
diff --git a/include/items.php b/include/items.php
index d8a9e8e56..2cee376d0 100755
--- a/include/items.php
+++ b/include/items.php
@@ -393,7 +393,11 @@ function post_activity_item($arr, $allow_code = false, $deliver = true) {
if(! array_key_exists('mimetype',$arr))
$arr['mimetype'] = 'text/bbcode';
- $arr['mid'] = ((x($arr,'mid')) ? $arr['mid'] : item_message_id());
+
+ if(! $arr['mid']) {
+ $arr['uuid'] = ((x($arr,'uuid')) ? $arr['uuid'] : item_message_id());
+ }
+ $arr['mid'] = ((x($arr,'mid')) ? $arr['mid'] : z_root() . '/item/' . $arr['uuid']);
$arr['parent_mid'] = ((x($arr,'parent_mid')) ? $arr['parent_mid'] : $arr['mid']);
$arr['thr_parent'] = ((x($arr,'thr_parent')) ? $arr['thr_parent'] : $arr['mid']);
@@ -597,6 +601,7 @@ function get_item_elements($x,$allow_code = false) {
$arr = array();
$arr['body'] = $x['body'];
+ $arr['summary'] = $x['summary'];
$maxlen = get_max_import_size();
@@ -605,6 +610,11 @@ function get_item_elements($x,$allow_code = false) {
logger('get_item_elements: message length exceeds max_import_size: truncated');
}
+ if($maxlen && mb_strlen($arr['summary']) > $maxlen) {
+ $arr['summary'] = mb_substr($arr['summary'],0,$maxlen,'UTF-8');
+ logger('get_item_elements: message summary length exceeds max_import_size: truncated');
+ }
+
$arr['created'] = datetime_convert('UTC','UTC',$x['created']);
$arr['edited'] = datetime_convert('UTC','UTC',$x['edited']);
@@ -627,6 +637,7 @@ function get_item_elements($x,$allow_code = false) {
if(mb_strlen($arr['title']) > 255)
$arr['title'] = mb_substr($arr['title'],0,255);
+ $arr['uuid'] = (($x['uuid']) ? htmlspecialchars($x['uuid'], ENT_COMPAT,'UTF-8',false) : '');
$arr['app'] = (($x['app']) ? htmlspecialchars($x['app'], ENT_COMPAT,'UTF-8',false) : '');
$arr['route'] = (($x['route']) ? htmlspecialchars($x['route'], ENT_COMPAT,'UTF-8',false) : '');
$arr['mid'] = (($x['message_id']) ? htmlspecialchars($x['message_id'], ENT_COMPAT,'UTF-8',false) : '');
@@ -747,9 +758,10 @@ function get_item_elements($x,$allow_code = false) {
// Do this after signature checking as the original signature
// was generated on the escaped content.
- if($arr['mimetype'] === 'text/markdown')
+ if($arr['mimetype'] === 'text/markdown') {
+ $arr['summary'] = MarkdownSoap::unescape($arr['summary']);
$arr['body'] = MarkdownSoap::unescape($arr['body']);
-
+ }
if(array_key_exists('revision',$x)) {
// extended export encoding
@@ -1061,6 +1073,7 @@ function encode_item($item,$mirror = false) {
$x['item_blocked'] = $item['item_blocked'];
}
+ $x['uuid'] = $item['uuid'];
$x['message_id'] = $item['mid'];
$x['message_top'] = $item['parent_mid'];
$x['message_parent'] = $item['thr_parent'];
@@ -1071,6 +1084,7 @@ function encode_item($item,$mirror = false) {
$x['commented'] = $item['commented'];
$x['mimetype'] = $item['mimetype'];
$x['title'] = $item['title'];
+ $x['summary'] = $item['summary'];
$x['body'] = $item['body'];
$x['app'] = $item['app'];
$x['verb'] = $item['verb'];
@@ -1629,6 +1643,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
}
$arr['title'] = ((array_key_exists('title',$arr) && strlen($arr['title'])) ? trim($arr['title']) : '');
+ $arr['summary'] = ((array_key_exists('summary',$arr) && strlen($arr['summary'])) ? trim($arr['summary']) : '');
$arr['body'] = ((array_key_exists('body',$arr) && strlen($arr['body'])) ? trim($arr['body']) : '');
$arr['allow_cid'] = ((x($arr,'allow_cid')) ? trim($arr['allow_cid']) : '');
@@ -1637,6 +1652,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
$arr['deny_gid'] = ((x($arr,'deny_gid')) ? trim($arr['deny_gid']) : '');
$arr['postopts'] = ((x($arr,'postopts')) ? trim($arr['postopts']) : '');
$arr['route'] = ((x($arr,'route')) ? trim($arr['route']) : '');
+ $arr['uuid'] = ((x($arr,'uuid')) ? trim($arr['uuid']) : '');
$arr['item_private'] = ((x($arr,'item_private')) ? intval($arr['item_private']) : 0 );
$arr['item_wall'] = ((x($arr,'item_wall')) ? intval($arr['item_wall']) : 0 );
$arr['item_type'] = ((x($arr,'item_type')) ? intval($arr['item_type']) : 0 );
@@ -1649,6 +1665,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
// apply the input filter here
+ $arr['summary'] = trim(z_input_filter($arr['summary'],$arr['mimetype'],$allow_exec));
$arr['body'] = trim(z_input_filter($arr['body'],$arr['mimetype'],$allow_exec));
item_sign($arr);
@@ -2094,6 +2111,7 @@ function item_store_update($arr, $allow_exec = false, $deliver = true) {
// apply the input filter here
+ $arr['summary'] = trim(z_input_filter($arr['summary'],$arr['mimetype'],$allow_exec));
$arr['body'] = trim(z_input_filter($arr['body'],$arr['mimetype'],$allow_exec));
item_sign($arr);
@@ -2170,6 +2188,7 @@ function item_store_update($arr, $allow_exec = false, $deliver = true) {
$arr['route'] = ((array_key_exists('route',$arr)) ? trim($arr['route']) : $orig[0]['route']);
$arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : $orig[0]['location']);
+ $arr['uuid'] = ((x($arr,'uuid')) ? notags(trim($arr['uuid'])) : $orig[0]['uuid']);
$arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : $orig[0]['coord']);
$arr['verb'] = ((x($arr,'verb')) ? notags(trim($arr['verb'])) : $orig[0]['verb']);
$arr['obj_type'] = ((x($arr,'obj_type')) ? notags(trim($arr['obj_type'])) : $orig[0]['obj_type']);
@@ -2625,28 +2644,30 @@ function tag_deliver($uid, $item_id) {
$plustagged = false;
$matches = array();
- $pattern = '/[\!@]\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'],'/') . '\[\/zrl\]/';
+ $pattern = '/[\!@]\!?\[[uz]rl\=' . preg_quote($term['url'],'/') . '\](.*?)\[\/[uz]rl\]/';
if(preg_match($pattern,$body,$matches))
$tagged = true;
- // original red forum tagging sequence @forumname+
+ $pattern = '/\[url\=' . preg_quote($term['url'],'/') . '\]\@(.*?)\[\/url\]/';
+ if(preg_match($pattern,$body,$matches))
+ $tagged = true;
+
+
// standard forum tagging sequence !forumname
- $pluspattern = '/@\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\+\[\/zrl\]/';
+ $forumpattern = '/\!\!?\[[uz]rl\=([^\]]*?)\]((?:.(?!\[[uz]rl\=))*?)\[\/[uz]rl\]/';
- $forumpattern = '/\!\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\[\/zrl\]/';
+ $forumpattern2 = '/\[[uz]rl\=([^\]]*?)\]\!((?:.(?!\[[uz]rl\=))*?)\[\/[uz]rl\]/';
- $found = false;
$matches = array();
- if(preg_match_all($pluspattern,$body,$matches,PREG_SET_ORDER)) {
+ if(preg_match_all($forumpattern,$body,$matches,PREG_SET_ORDER)) {
foreach($matches as $match) {
$matched_forums ++;
- if($term['url'] === $match[1] && $term['term'] === $match[2] && intval($term['ttype']) === TERM_MENTION) {
+ if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) {
if($matched_forums <= $max_forums) {
$plustagged = true;
- $found = true;
break;
}
logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring');
@@ -2654,13 +2675,12 @@ function tag_deliver($uid, $item_id) {
}
}
- if(preg_match_all($forumpattern,$body,$matches,PREG_SET_ORDER)) {
+ if(preg_match_all($forumpattern2,$body,$matches,PREG_SET_ORDER)) {
foreach($matches as $match) {
$matched_forums ++;
- if($term['url'] === $match[1] && $term['term'] === $match[2] && intval($term['ttype']) === TERM_FORUM) {
+ if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) {
if($matched_forums <= $max_forums) {
$plustagged = true;
- $found = true;
break;
}
logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring');
@@ -2882,18 +2902,19 @@ function tgroup_check($uid, $item) {
$body = preg_replace('/\[share(.*?)\[\/share\]/','',$item['body']);
- $pluspattern = '/@\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\+\[\/zrl\]/';
-
$forumpattern = '/\!\!?\[zrl\=([^\]]*?)\]((?:.(?!\[zrl\=))*?)\[\/zrl\]/';
+ $forumpattern2 = '/\[zrl\=([^\]]*?)\]\!((?:.(?!\[zrl\=))*?)\[\/zrl\]/';
+
+
$found = false;
$matches = array();
- if(preg_match_all($pluspattern,$body,$matches,PREG_SET_ORDER)) {
+ if(preg_match_all($forumpattern,$body,$matches,PREG_SET_ORDER)) {
foreach($matches as $match) {
$matched_forums ++;
- if($term['url'] === $match[1] && $term['term'] === $match[2] && intval($term['ttype']) === TERM_MENTION) {
+ if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) {
if($matched_forums <= $max_forums) {
$found = true;
break;
@@ -2903,10 +2924,10 @@ function tgroup_check($uid, $item) {
}
}
- if(preg_match_all($forumpattern,$body,$matches,PREG_SET_ORDER)) {
+ if(preg_match_all($forumpattern2,$body,$matches,PREG_SET_ORDER)) {
foreach($matches as $match) {
$matched_forums ++;
- if($term['url'] === $match[1] && $term['term'] === $match[2] && intval($term['ttype']) === TERM_FORUM) {
+ if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) {
if($matched_forums <= $max_forums) {
$found = true;
break;
@@ -4744,7 +4765,8 @@ function item_create_edit_activity($post) {
$new_item['id'] = 0;
$new_item['parent'] = 0;
- $new_item['mid'] = item_message_id();
+ $new_item['uuid'] = item_message_id();
+ $new_item['mid'] = z_root() . '/item/' . $new_item['uuid'];
$new_item['body'] = sprintf( t('[Edited %s]'), (($update_item['item_thread_top']) ? t('Post','edit_activity') : t('Comment','edit_activity')));
diff --git a/include/network.php b/include/network.php
index d37da05f7..183a47105 100644
--- a/include/network.php
+++ b/include/network.php
@@ -153,7 +153,7 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
// Pull out multiple headers, e.g. proxy and continuation headers
// allow for HTTP/2.x without fixing code
- while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
+ while(preg_match('/^HTTP\/[1-3].+? [1-5][0-9][0-9]/',$base)) {
$chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
$header .= $chunk;
$base = substr($base,strlen($chunk));
@@ -319,7 +319,7 @@ function z_post_url($url, $params, $redirects = 0, $opts = array()) {
// Pull out multiple headers, e.g. proxy and continuation headers
// allow for HTTP/2.x without fixing code
- while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
+ while(preg_match('/^HTTP\/[1-3].+? [1-5][0-9][0-9]/',$base)) {
$chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
$header .= $chunk;
$base = substr($base,strlen($chunk));
diff --git a/include/photos.php b/include/photos.php
index d5553b495..ae51703e0 100644
--- a/include/photos.php
+++ b/include/photos.php
@@ -441,11 +441,13 @@ function photo_upload($channel, $observer, $args) {
}
}
else {
- $mid = item_message_id();
+ $uuid = item_message_id();
+ $mid = z_root() . '/item/' . $uuid;
$arr = [
'aid' => $account_id,
'uid' => $channel_id,
+ 'uuid' => $uuid,
'mid' => $mid,
'parent_mid' => $mid,
'item_hidden' => $item_hidden,
@@ -827,12 +829,14 @@ function photos_create_item($channel, $creator_hash, $photo, $visible = false) {
$item_hidden = (($visible) ? 0 : 1 );
- $mid = item_message_id();
+ $uuid = item_message_id();
+ $mid = z_root() . '/item/' . $uuid;
$arr = array();
$arr['aid'] = $channel['channel_account_id'];
$arr['uid'] = $channel['channel_id'];
+ $arr['uuid'] = $uuid;
$arr['mid'] = $mid;
$arr['parent_mid'] = $mid;
$arr['item_wall'] = 1;
diff --git a/include/queue_fn.php b/include/queue_fn.php
index f05bac5b0..f7e2922c6 100644
--- a/include/queue_fn.php
+++ b/include/queue_fn.php
@@ -1,5 +1,9 @@
<?php /** @file */
+use Zotlabs\Lib\Libzot;
+use Zotlabs\Zot6\Receiver;
+use Zotlabs\Zot6\Zot6Handler;
+
function update_queue_item($id, $add_priority = 0) {
logger('queue: requeue item ' . $id,LOGGER_DEBUG);
$x = q("select outq_created, outq_posturl from outq where outq_hash = '%s' limit 1",
@@ -226,37 +230,85 @@ function queue_deliver($outq, $immediate = false) {
logger('deliver: dest: ' . $outq['outq_posturl'], LOGGER_DEBUG);
- $channel = null;
+ if($outq['outq_driver'] === 'zot6') {
+
+ if($outq['outq_posturl'] === z_root() . '/zot') {
+ // local delivery
+ $zot = new Receiver(new Zot6Handler(),$outq['outq_notify']);
+ $result = $zot->run(true);
+ logger('returned_json: ' . json_encode($result,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES), LOGGER_DATA);
+ logger('deliver: local zot6 delivery succeeded to ' . $outq['outq_posturl']);
+ Libzot::process_response($outq['outq_posturl'],[ 'success' => true, 'body' => json_encode($result) ], $outq);
+ }
+ else {
+ logger('remote');
+ $channel = null;
+
+ if($outq['outq_channel']) {
+ $channel = channelx_by_n($outq['outq_channel']);
+ }
+
+ $host_crypto = null;
+ if($channel && $base) {
+ $h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' and hubloc_network = 'zot6' order by hubloc_id desc limit 1",
+ dbesc($base)
+ );
+ if($h) {
+ $host_crypto = $h[0];
+ }
+ }
+
+ $msg = $outq['outq_notify'];
+
+ $result = Libzot::zot($outq['outq_posturl'],$msg,$channel,$host_crypto);
+
+ if($result['success']) {
+ logger('deliver: remote zot6 delivery succeeded to ' . $outq['outq_posturl']);
+ Libzot::process_response($outq['outq_posturl'],$result, $outq);
+ }
+ else {
+ logger('deliver: remote zot6 delivery failed to ' . $outq['outq_posturl']);
+ logger('deliver: remote zot6 delivery fail data: ' . print_r($result,true), LOGGER_DATA);
+ update_queue_item($outq['outq_hash'],10);
+ }
- if($outq['outq_msg'] && $outq['outq_channel']) {
- $channel = channelx_by_n($outq['outq_channel']);
+ }
+ return;
}
+ else {
- $host_crypto = null;
+ $channel = null;
- if($channel && $base) {
- $h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' order by hubloc_id desc limit 1",
- dbesc($base)
- );
- if($h) {
- $host_crypto = $h[0];
+ if($outq['outq_msg'] && $outq['outq_channel']) {
+ $channel = channelx_by_n($outq['outq_channel']);
}
- }
- $msg = $outq['outq_notify'];
+ $host_crypto = null;
- $result = zot_zot($outq['outq_posturl'],$msg,$channel,$host_crypto);
+ if($channel && $base) {
+ $h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' order by hubloc_id desc limit 1",
+ dbesc($base)
+ );
+ if($h) {
+ $host_crypto = $h[0];
+ }
+ }
+ $msg = $outq['outq_notify'];
- if($result['success']) {
- logger('deliver: remote zot delivery succeeded to ' . $outq['outq_posturl']);
- zot_process_response($outq['outq_posturl'],$result, $outq);
- }
- else {
- logger('deliver: remote zot delivery failed to ' . $outq['outq_posturl']);
- logger('deliver: remote zot delivery fail data: ' . print_r($result,true), LOGGER_DATA);
- update_queue_item($outq['outq_hash'],10);
+ $result = zot_zot($outq['outq_posturl'],$msg,$channel,$host_crypto);
+
+
+ if($result['success']) {
+ logger('deliver: remote zot delivery succeeded to ' . $outq['outq_posturl']);
+ zot_process_response($outq['outq_posturl'],$result, $outq);
+ }
+ else {
+ logger('deliver: remote zot delivery failed to ' . $outq['outq_posturl']);
+ logger('deliver: remote zot delivery fail data: ' . print_r($result,true), LOGGER_DATA);
+ update_queue_item($outq['outq_hash'],10);
+ }
+ return;
}
- return;
-}
+} \ No newline at end of file
diff --git a/include/text.php b/include/text.php
index 076c98407..646bfe749 100644
--- a/include/text.php
+++ b/include/text.php
@@ -3,8 +3,11 @@
* @file include/text.php
*/
-use \Zotlabs\Lib as Zlib;
-use \Michelf\MarkdownExtra;
+use Zotlabs\Lib as Zlib;
+
+use Michelf\MarkdownExtra;
+use Ramsey\Uuid\Uuid;
+use Ramsey\Uuid\Exception\UnsatisfiedDependencyException;
require_once("include/bbcode.php");
@@ -571,18 +574,9 @@ function alt_pager($i, $more = '', $less = '') {
* @return string a unique id
*/
function item_message_id() {
- do {
- $dups = false;
- $hash = random_string();
- $mid = $hash . '@' . App::get_hostname();
- $r = q("SELECT id FROM item WHERE mid = '%s' LIMIT 1",
- dbesc($mid));
- if($r)
- $dups = true;
- } while($dups == true);
+ return new_uuid();
- return $mid;
}
/**
@@ -593,17 +587,9 @@ function item_message_id() {
* @return string a uniqe hash
*/
function photo_new_resource() {
- do {
- $found = false;
- $resource = hash('md5', uniqid(mt_rand(), true));
- $r = q("SELECT id FROM photo WHERE resource_id = '%s' LIMIT 1",
- dbesc($resource));
- if($r)
- $found = true;
- } while($found === true);
+ return new_uuid();
- return $resource;
}
/**
@@ -3480,3 +3466,19 @@ function print_val($v) {
return $v;
}
+
+/**
+ * @brief Generate a unique ID.
+ *
+ * @return string
+ */
+function new_uuid() {
+
+ try {
+ $hash = Uuid::uuid4()->toString();
+ } catch (UnsatisfiedDependencyException $e) {
+ $hash = random_string(48);
+ }
+
+ return $hash;
+}
diff --git a/include/xchan.php b/include/xchan.php
index eb5f1b4a3..4cbfb42c5 100644
--- a/include/xchan.php
+++ b/include/xchan.php
@@ -5,6 +5,11 @@ use Zotlabs\Zot6\HTTPSig;
function xchan_store_lowlevel($arr) {
+ if(! $arr['xchan_hash']) {
+ logger('No xchan_hash');
+ return false;
+ }
+
$store = [
'xchan_hash' => ((array_key_exists('xchan_hash',$arr)) ? $arr['xchan_hash'] : ''),
'xchan_guid' => ((array_key_exists('xchan_guid',$arr)) ? $arr['xchan_guid'] : ''),
diff --git a/include/zot.php b/include/zot.php
index 3ccf0a81f..d031b4a96 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -8,6 +8,8 @@
*
*/
+use Zotlabs\Lib\DReport;
+
require_once('include/crypto.php');
require_once('include/items.php');
require_once('include/queue_fn.php');
@@ -81,7 +83,7 @@ function zot_get_hublocs($hash) {
/* Only search for active hublocs - e.g. those that haven't been marked deleted */
- $ret = q("select * from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 order by hubloc_url ",
+ $ret = q("select * from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 and hubloc_network = 'zot' order by hubloc_url ",
dbesc($hash)
);
@@ -654,7 +656,7 @@ function zot_gethub($arr, $multiple = false) {
$r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url
where hubloc_guid = '%s' and hubloc_guid_sig = '%s'
- and hubloc_url = '%s' and hubloc_url_sig = '%s'
+ and hubloc_url = '%s' and hubloc_url_sig = '%s' and hubloc_network = 'zot'
$sitekey $limit",
dbesc($arr['guid']),
dbesc($arr['guid_sig']),
@@ -1119,14 +1121,15 @@ function zot_process_response($hub, $arr, $outq) {
}
foreach($x['delivery_report'] as $xx) {
- call_hooks('dreport_process',$xx);
- if(is_array($xx) && array_key_exists('message_id',$xx) && delivery_report_is_storable($xx)) {
- q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ",
+ call_hooks('dreport_process',$xx);
+ if(is_array($xx) && array_key_exists('message_id',$xx) && DReport::is_storable($xx)) {
+ q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_name, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s','%s' ) ",
dbesc($xx['message_id']),
dbesc($xx['location']),
dbesc($xx['recipient']),
+ dbesc($xx['name']),
dbesc($xx['status']),
- dbesc(datetime_convert($xx['date'])),
+ dbesc(datetime_convert('UTC','UTC',$xx['date'])),
dbesc($xx['sender'])
);
}
@@ -1188,6 +1191,7 @@ function zot_fetch($arr) {
$zret = zot6_check_sig();
if($zret['success'] && $zret['hubloc'] && $zret['hubloc']['hubloc_guid'] === $arr['sender']['guid'] && $arr['msg']) {
+
logger('zot6_delivery',LOGGER_DEBUG);
logger('zot6_data: ' . print_r($arr,true),LOGGER_DATA);
@@ -1748,7 +1752,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
}
$channel = $r[0];
- $DR->addto_recipient($channel['channel_name'] . ' <' . channel_reddress($channel) . '>');
+ $DR->set_name($channel['channel_name'] . ' <' . channel_reddress($channel) . '>');
/* blacklisted channels get a permission denied, no special message to tip them off */
@@ -2297,7 +2301,7 @@ function process_mail_delivery($sender, $arr, $deliveries) {
}
$channel = $r[0];
- $DR->addto_recipient($channel['channel_name'] . ' <' . channel_reddress($channel) . '>');
+ $DR->set_name($channel['channel_name'] . ' <' . channel_reddress($channel) . '>');
/* blacklisted channels get a permission denied, no special message to tip them off */
@@ -3987,7 +3991,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
if(array_key_exists('item',$arr) && is_array($arr['item'][0])) {
$DR = new Zotlabs\Lib\DReport(z_root(),$d['hash'],$d['hash'],$arr['item'][0]['message_id'],'channel sync processed');
- $DR->addto_recipient($channel['channel_name'] . ' <' . channel_reddress($channel) . '>');
+ $DR->set_name($channel['channel_name'] . ' <' . channel_reddress($channel) . '>');
}
else
$DR = new Zotlabs\Lib\DReport(z_root(),$d['hash'],$d['hash'],'sync packet','channel sync delivered');
@@ -5185,7 +5189,7 @@ function zot6_check_sig() {
$sigblock = \Zotlabs\Web\HTTPSig::parse_sigheader($_SERVER['HTTP_SIGNATURE']);
if($sigblock) {
$keyId = $sigblock['keyId'];
-
+ logger('keyID: ' . $keyId);
if($keyId) {
$r = q("select hubloc.*, site_crypto from hubloc left join site on hubloc_url = site_url
where hubloc_addr = '%s' ",
@@ -5195,6 +5199,7 @@ function zot6_check_sig() {
foreach($r as $hubloc) {
$verified = \Zotlabs\Web\HTTPSig::verify('',$hubloc['xchan_pubkey']);
if($verified && $verified['header_signed'] && $verified['header_valid'] && $verified['content_signed'] && $verified['content_valid']) {
+ logger('zot6 verified');
$ret['hubloc'] = $hubloc;
$ret['success'] = true;
return $ret;
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index 7b7d9cc3a..3e3e6fe88 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -247,6 +247,7 @@ CREATE TABLE IF NOT EXISTS `channel` (
`channel_guid` char(191) NOT NULL DEFAULT '',
`channel_guid_sig` text NOT NULL,
`channel_hash` char(191) NOT NULL DEFAULT '',
+ `channel_portable_id` char(191) NOT NULL DEFAULT '',
`channel_timezone` char(128) NOT NULL DEFAULT 'UTC',
`channel_location` char(191) NOT NULL DEFAULT '',
`channel_theme` char(191) NOT NULL DEFAULT '',
@@ -306,6 +307,7 @@ CREATE TABLE IF NOT EXISTS `channel` (
KEY `channel_default_gid` (`channel_default_group`),
KEY `channel_guid` (`channel_guid`),
KEY `channel_hash` (`channel_hash`),
+ KEY `channel_portable_id` (`channel_portable_id`),
KEY `channel_expire_days` (`channel_expire_days`),
KEY `channel_deleted` (`channel_deleted`),
KEY `channel_active` (`channel_active`),
@@ -403,6 +405,7 @@ CREATE TABLE IF NOT EXISTS `dreport` (
`dreport_site` char(191) NOT NULL DEFAULT '',
`dreport_recip` char(191) NOT NULL DEFAULT '',
`dreport_result` char(191) NOT NULL DEFAULT '',
+ `dreport_name` char(191) NOT NULL DEFAULT '',
`dreport_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`dreport_xchan` char(191) NOT NULL DEFAULT '',
`dreport_queue` char(191) NOT NULL DEFAULT '',
@@ -577,6 +580,7 @@ CREATE TABLE IF NOT EXISTS `issue` (
CREATE TABLE IF NOT EXISTS `item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `uuid` char(191) NOT NULL DEFAULT '',
`mid` char(191) NOT NULL DEFAULT '',
`aid` int(10) unsigned NOT NULL DEFAULT 0 ,
`uid` int(10) unsigned NOT NULL DEFAULT 0 ,
@@ -595,6 +599,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`source_xchan` char(191) NOT NULL DEFAULT '',
`mimetype` char(191) NOT NULL DEFAULT '',
`title` text NOT NULL,
+ `summary` mediumtext NOT NULL,
`body` mediumtext NOT NULL,
`html` mediumtext NOT NULL,
`app` char(191) NOT NULL DEFAULT '',
@@ -649,6 +654,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`item_pending_remove` tinyint(1) NOT NULL DEFAULT 0 ,
`item_blocked` tinyint(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
+ KEY `uuid` (`uuid`),
KEY `parent` (`parent`),
KEY `created` (`created`),
KEY `edited` (`edited`),
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index fd827978c..44f98b944 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -242,6 +242,7 @@ CREATE TABLE "channel" (
"channel_guid" text NOT NULL DEFAULT '',
"channel_guid_sig" text NOT NULL,
"channel_hash" text NOT NULL DEFAULT '',
+ "channel_portable_id" text NOT NULL DEFAULT '',
"channel_timezone" varchar(128) NOT NULL DEFAULT 'UTC',
"channel_location" text NOT NULL DEFAULT '',
"channel_theme" text NOT NULL DEFAULT '',
@@ -284,6 +285,7 @@ create index "channel_max_friend_req" on channel ("channel_max_friend_req");
create index "channel_default_gid" on channel ("channel_default_group");
create index "channel_guid" on channel ("channel_guid");
create index "channel_hash" on channel ("channel_hash");
+create index "channel_portable_id" on channel ("channel_portable_id");
create index "channel_expire_days" on channel ("channel_expire_days");
create index "channel_deleted" on channel ("channel_deleted");
create index "channel_active" on channel ("channel_active");
@@ -375,6 +377,7 @@ CREATE TABLE IF NOT EXISTS "dreport" (
"dreport_site" varchar(255) NOT NULL DEFAULT '',
"dreport_recip" varchar(255) NOT NULL DEFAULT '',
"dreport_result" varchar(255) NOT NULL DEFAULT '',
+ "dreport_name" varchar(255) NOT NULL DEFAULT '',
"dreport_time" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"dreport_xchan" varchar(255) NOT NULL DEFAULT '',
"dreport_queue" varchar(255) NOT NULL DEFAULT '',
@@ -548,6 +551,7 @@ create index "issue_component" on issue ("issue_component");
CREATE TABLE "item" (
"id" serial NOT NULL,
+ "uuid" text NOT NULL DEFAULT '',
"mid" text NOT NULL DEFAULT '',
"aid" bigint NOT NULL DEFAULT '0',
"uid" bigint NOT NULL DEFAULT '0',
@@ -566,6 +570,7 @@ CREATE TABLE "item" (
"source_xchan" text NOT NULL DEFAULT '',
"mimetype" text NOT NULL DEFAULT '',
"title" text NOT NULL,
+ "summary" text NOT NULL,
"body" text NOT NULL,
"html" text NOT NULL,
"app" text NOT NULL DEFAULT '',
@@ -623,6 +628,7 @@ CREATE TABLE "item" (
PRIMARY KEY ("id")
);
create index "item_uid" on item ("uid");
+create index "item_uuid" on item ("uuid");
create index "item_parent" on item ("parent");
create index "item_created" on item ("created");
create index "item_edited" on item ("edited");
diff --git a/tests/unit/Web/HttpSigTest.php b/tests/unit/Web/HttpSigTest.php
index 18f2ce92b..9909a9883 100644
--- a/tests/unit/Web/HttpSigTest.php
+++ b/tests/unit/Web/HttpSigTest.php
@@ -91,6 +91,7 @@ class PermissionDescriptionTest extends UnitTestCase {
function testDecrypt_sigheader() {
$header = 'Header: iv="value_iv" key="value_key" alg="value_alg" data="value_data"';
$result = [
+ 'encrypted' => true,
'iv' => 'value_iv',
'key' => 'value_key',
'alg' => 'value_alg',
@@ -109,6 +110,7 @@ class PermissionDescriptionTest extends UnitTestCase {
$header = 'Header: iv="value_iv" key="value_key" alg="value_alg" data="value_data"';
$result = [
+ 'encrypted' => true,
'iv' => 'value_iv',
'key' => 'value_key',
'alg' => 'value_alg',
diff --git a/view/ru/hmessages.po b/view/ru/hmessages.po
index d21f707d1..6a8c8805c 100644
--- a/view/ru/hmessages.po
+++ b/view/ru/hmessages.po
@@ -12,7 +12,7 @@ msgstr ""
"Project-Id-Version: hubzilla\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-18 11:03+0200\n"
-"PO-Revision-Date: 2018-10-18 11:06+0200\n"
+"PO-Revision-Date: 2018-11-19 14:12+0200\n"
"Last-Translator: Max Kostikov <max@kostikov.co>\n"
"Language-Team: Russian (http://www.transifex.com/Friendica/hubzilla/language/ru/)\n"
"MIME-Version: 1.0\n"
@@ -25,7 +25,7 @@ msgstr ""
msgid "Source channel not found."
msgstr "Канал-источник не найден."
-#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3087
+#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3086
#: ../../Zotlabs/Module/Admin/Site.php:187
msgid "Default"
msgstr "По умолчанию"
@@ -41,8 +41,8 @@ msgstr "Фокус (по умолчанию Hubzilla)"
#: ../../Zotlabs/Module/Xchan.php:15
#: ../../Zotlabs/Module/Email_validation.php:40
#: ../../Zotlabs/Module/Poke.php:217 ../../Zotlabs/Module/Appman.php:155
-#: ../../Zotlabs/Module/Profiles.php:723 ../../Zotlabs/Module/Photos.php:1084
-#: ../../Zotlabs/Module/Photos.php:1124 ../../Zotlabs/Module/Photos.php:1242
+#: ../../Zotlabs/Module/Profiles.php:723 ../../Zotlabs/Module/Photos.php:1097
+#: ../../Zotlabs/Module/Photos.php:1137 ../../Zotlabs/Module/Photos.php:1255
#: ../../Zotlabs/Module/Oauth.php:111 ../../Zotlabs/Module/Events.php:495
#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Locs.php:121
#: ../../Zotlabs/Module/Sources.php:125 ../../Zotlabs/Module/Sources.php:162
@@ -79,15 +79,15 @@ msgstr "Фокус (по умолчанию Hubzilla)"
#: ../../Zotlabs/Module/Admin/Account_edit.php:73
#: ../../Zotlabs/Module/Tokens.php:188 ../../Zotlabs/Module/Thing.php:326
#: ../../Zotlabs/Module/Thing.php:379 ../../Zotlabs/Module/Editpost.php:85
-#: ../../Zotlabs/Module/Connedit.php:888 ../../Zotlabs/Module/Group.php:140
-#: ../../Zotlabs/Module/Group.php:156 ../../Zotlabs/Module/Mood.php:156
+#: ../../Zotlabs/Module/Connedit.php:893 ../../Zotlabs/Module/Group.php:140
+#: ../../Zotlabs/Module/Group.php:156 ../../Zotlabs/Module/Mood.php:158
#: ../../Zotlabs/Module/Invite.php:168 ../../Zotlabs/Module/Connect.php:124
#: ../../Zotlabs/Module/Pdledit.php:107 ../../Zotlabs/Module/Wiki.php:215
#: ../../Zotlabs/Module/Import.php:565
#: ../../Zotlabs/Module/Import_items.php:129
#: ../../Zotlabs/Widget/Wiki_pages.php:42
#: ../../Zotlabs/Widget/Wiki_pages.php:99
-#: ../../Zotlabs/Widget/Eventstools.php:16 ../../Zotlabs/Lib/ThreadItem.php:767
+#: ../../Zotlabs/Widget/Eventstools.php:16 ../../Zotlabs/Lib/ThreadItem.php:770
#: ../../extend/addon/hzaddons/dwpost/dwpost.php:89
#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:191
#: ../../extend/addon/hzaddons/redphotos/redphotos.php:136
@@ -106,7 +106,7 @@ msgstr "Фокус (по умолчанию Hubzilla)"
#: ../../extend/addon/hzaddons/mailtest/mailtest.php:100
#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:53
#: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:84
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:86
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:89
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:322
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:380
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:432
@@ -150,9 +150,9 @@ msgstr "Узкая панель навигации"
#: ../../view/theme/redbasic/php/config.php:99
#: ../../view/theme/redbasic/php/config.php:116 ../../include/dir_fns.php:143
#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../boot.php:1630 ../../Zotlabs/Storage/Browser.php:405
+#: ../../boot.php:1629 ../../Zotlabs/Storage/Browser.php:405
#: ../../Zotlabs/Module/Defperms.php:197 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Photos.php:699 ../../Zotlabs/Module/Api.php:99
+#: ../../Zotlabs/Module/Photos.php:712 ../../Zotlabs/Module/Api.php:99
#: ../../Zotlabs/Module/Events.php:472 ../../Zotlabs/Module/Events.php:473
#: ../../Zotlabs/Module/Sources.php:124 ../../Zotlabs/Module/Sources.php:159
#: ../../Zotlabs/Module/Settings/Display.php:89
@@ -163,7 +163,7 @@ msgstr "Узкая панель навигации"
#: ../../Zotlabs/Module/Menu.php:221 ../../Zotlabs/Module/Mitem.php:176
#: ../../Zotlabs/Module/Mitem.php:177 ../../Zotlabs/Module/Mitem.php:256
#: ../../Zotlabs/Module/Mitem.php:257 ../../Zotlabs/Module/Admin/Site.php:255
-#: ../../Zotlabs/Module/Connedit.php:397 ../../Zotlabs/Module/Connedit.php:780
+#: ../../Zotlabs/Module/Connedit.php:398 ../../Zotlabs/Module/Connedit.php:785
#: ../../Zotlabs/Module/Wiki.php:227 ../../Zotlabs/Module/Wiki.php:228
#: ../../Zotlabs/Module/Import.php:554 ../../Zotlabs/Module/Import.php:558
#: ../../Zotlabs/Module/Import.php:559 ../../Zotlabs/Lib/Libzotdir.php:162
@@ -189,8 +189,8 @@ msgstr "Узкая панель навигации"
#: ../../extend/addon/hzaddons/pumpio/pumpio.php:227
#: ../../extend/addon/hzaddons/pumpio/pumpio.php:231
#: ../../extend/addon/hzaddons/nsabait/nsabait.php:157
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:73
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:85
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:389
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:411
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:415
@@ -229,9 +229,9 @@ msgstr "Нет"
#: ../../view/theme/redbasic/php/config.php:99
#: ../../view/theme/redbasic/php/config.php:116 ../../include/dir_fns.php:143
#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../boot.php:1630 ../../Zotlabs/Storage/Browser.php:405
+#: ../../boot.php:1629 ../../Zotlabs/Storage/Browser.php:405
#: ../../Zotlabs/Module/Defperms.php:197 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Photos.php:699 ../../Zotlabs/Module/Api.php:98
+#: ../../Zotlabs/Module/Photos.php:712 ../../Zotlabs/Module/Api.php:98
#: ../../Zotlabs/Module/Events.php:472 ../../Zotlabs/Module/Events.php:473
#: ../../Zotlabs/Module/Sources.php:124 ../../Zotlabs/Module/Sources.php:159
#: ../../Zotlabs/Module/Settings/Display.php:89
@@ -242,7 +242,7 @@ msgstr "Нет"
#: ../../Zotlabs/Module/Menu.php:221 ../../Zotlabs/Module/Mitem.php:176
#: ../../Zotlabs/Module/Mitem.php:177 ../../Zotlabs/Module/Mitem.php:256
#: ../../Zotlabs/Module/Mitem.php:257 ../../Zotlabs/Module/Admin/Site.php:257
-#: ../../Zotlabs/Module/Connedit.php:397 ../../Zotlabs/Module/Wiki.php:227
+#: ../../Zotlabs/Module/Connedit.php:398 ../../Zotlabs/Module/Wiki.php:227
#: ../../Zotlabs/Module/Wiki.php:228 ../../Zotlabs/Module/Import.php:554
#: ../../Zotlabs/Module/Import.php:558 ../../Zotlabs/Module/Import.php:559
#: ../../Zotlabs/Lib/Libzotdir.php:162 ../../Zotlabs/Lib/Libzotdir.php:163
@@ -268,8 +268,8 @@ msgstr "Нет"
#: ../../extend/addon/hzaddons/pumpio/pumpio.php:227
#: ../../extend/addon/hzaddons/pumpio/pumpio.php:231
#: ../../extend/addon/hzaddons/nsabait/nsabait.php:157
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:73
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:85
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:389
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:411
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:415
@@ -414,13 +414,13 @@ msgid "Monthly"
msgstr "Ежемесячно"
#: ../../include/selectors.php:60 ../../include/selectors.php:77
-#: ../../include/channel.php:1487
+#: ../../include/channel.php:1536
#: ../../extend/addon/hzaddons/openid/Mod_Id.php:85
msgid "Male"
msgstr "Мужчина"
#: ../../include/selectors.php:60 ../../include/selectors.php:77
-#: ../../include/channel.php:1485
+#: ../../include/channel.php:1534
#: ../../extend/addon/hzaddons/openid/Mod_Id.php:87
msgid "Female"
msgstr "Женщина"
@@ -457,20 +457,20 @@ msgstr "Транссексуал"
msgid "Hermaphrodite"
msgstr "Гермафродит"
-#: ../../include/selectors.php:60 ../../include/channel.php:1491
+#: ../../include/selectors.php:60 ../../include/channel.php:1540
msgid "Neuter"
msgstr "Среднего рода"
-#: ../../include/selectors.php:60 ../../include/channel.php:1493
+#: ../../include/selectors.php:60 ../../include/channel.php:1542
msgid "Non-specific"
msgstr "Неспецифический"
#: ../../include/selectors.php:60 ../../include/selectors.php:77
#: ../../include/selectors.php:115 ../../include/selectors.php:151
#: ../../include/connections.php:703 ../../include/connections.php:710
-#: ../../include/event.php:1315 ../../include/event.php:1322
+#: ../../include/event.php:1318 ../../include/event.php:1325
#: ../../Zotlabs/Module/Cdav.php:1227 ../../Zotlabs/Module/Profiles.php:795
-#: ../../Zotlabs/Module/Connedit.php:919
+#: ../../Zotlabs/Module/Connedit.php:924
#: ../../Zotlabs/Access/PermissionRoles.php:306
msgid "Other"
msgstr "Другой"
@@ -567,14 +567,14 @@ msgstr "Неверный"
msgid "Sex Addict"
msgstr "Эротоман"
-#: ../../include/selectors.php:134 ../../include/channel.php:444
-#: ../../include/channel.php:445 ../../include/channel.php:452
+#: ../../include/selectors.php:134 ../../include/channel.php:493
+#: ../../include/channel.php:494 ../../include/channel.php:501
#: ../../Zotlabs/Module/Settings/Channel.php:70
#: ../../Zotlabs/Module/Settings/Channel.php:74
#: ../../Zotlabs/Module/Settings/Channel.php:75
#: ../../Zotlabs/Module/Settings/Channel.php:78
#: ../../Zotlabs/Module/Settings/Channel.php:89
-#: ../../Zotlabs/Module/Connedit.php:712 ../../Zotlabs/Widget/Affinity.php:24
+#: ../../Zotlabs/Module/Connedit.php:717 ../../Zotlabs/Widget/Affinity.php:24
msgid "Friends"
msgstr "Друзья"
@@ -662,7 +662,7 @@ msgstr "Всё равно"
msgid "Ask me"
msgstr "Спроси меня"
-#: ../../include/photos.php:27 ../../include/items.php:3675
+#: ../../include/photos.php:27 ../../include/items.php:3701
#: ../../include/attach.php:150 ../../include/attach.php:197
#: ../../include/attach.php:270 ../../include/attach.php:379
#: ../../include/attach.php:393 ../../include/attach.php:400
@@ -670,8 +670,8 @@ msgstr "Спроси меня"
#: ../../include/attach.php:1116 ../../include/attach.php:1281
#: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Defperms.php:181
#: ../../Zotlabs/Module/Network.php:17 ../../Zotlabs/Module/Common.php:38
-#: ../../Zotlabs/Module/Item.php:229 ../../Zotlabs/Module/Item.php:248
-#: ../../Zotlabs/Module/Item.php:258 ../../Zotlabs/Module/Item.php:1110
+#: ../../Zotlabs/Module/Item.php:231 ../../Zotlabs/Module/Item.php:250
+#: ../../Zotlabs/Module/Item.php:260 ../../Zotlabs/Module/Item.php:1136
#: ../../Zotlabs/Module/Achievements.php:34
#: ../../Zotlabs/Module/Display.php:448 ../../Zotlabs/Module/Poke.php:157
#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:101
@@ -698,8 +698,8 @@ msgstr "Спроси меня"
#: ../../Zotlabs/Module/Filestorage.php:140
#: ../../Zotlabs/Module/Editblock.php:67
#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Channel.php:119
-#: ../../Zotlabs/Module/Channel.php:286 ../../Zotlabs/Module/Channel.php:325
+#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Channel.php:163
+#: ../../Zotlabs/Module/Channel.php:330 ../../Zotlabs/Module/Channel.php:369
#: ../../Zotlabs/Module/Like.php:185 ../../Zotlabs/Module/Bookmarks.php:70
#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Menu.php:129
#: ../../Zotlabs/Module/Menu.php:140 ../../Zotlabs/Module/Setup.php:209
@@ -713,9 +713,9 @@ msgstr "Спроси меня"
#: ../../Zotlabs/Module/Moderate.php:13 ../../Zotlabs/Module/Webpages.php:133
#: ../../Zotlabs/Module/Profile_photo.php:302
#: ../../Zotlabs/Module/Profile_photo.php:315
-#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Connedit.php:390
+#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Connedit.php:391
#: ../../Zotlabs/Module/Group.php:14 ../../Zotlabs/Module/Group.php:30
-#: ../../Zotlabs/Module/Connections.php:32 ../../Zotlabs/Module/Mood.php:124
+#: ../../Zotlabs/Module/Connections.php:32 ../../Zotlabs/Module/Mood.php:126
#: ../../Zotlabs/Module/Card_edit.php:51
#: ../../Zotlabs/Module/Article_edit.php:51 ../../Zotlabs/Module/Blocks.php:73
#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Invite.php:21
@@ -727,6 +727,7 @@ msgstr "Спроси меня"
#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Web/WebServer.php:123
#: ../../Zotlabs/Lib/Chatroom.php:133
+#: ../../extend/addon/hzaddons/flashcards/Mod_Flashcards.php:167
#: ../../extend/addon/hzaddons/pumpio/pumpio.php:40
#: ../../extend/addon/hzaddons/openid/Mod_Id.php:53
#: ../../extend/addon/hzaddons/keepout/keepout.php:36
@@ -761,16 +762,16 @@ msgctxt "photo_upload"
msgid "%1$s posted %2$s to %3$s"
msgstr "%1$s опубликовал %2$s в %3$s"
-#: ../../include/photos.php:667 ../../include/nav.php:417
+#: ../../include/photos.php:669 ../../include/nav.php:417
msgid "Photo Albums"
msgstr "Фотоальбомы"
-#: ../../include/photos.php:668 ../../Zotlabs/Module/Photos.php:1367
-#: ../../Zotlabs/Module/Photos.php:1380 ../../Zotlabs/Module/Photos.php:1381
+#: ../../include/photos.php:670 ../../Zotlabs/Module/Photos.php:1380
+#: ../../Zotlabs/Module/Photos.php:1393 ../../Zotlabs/Module/Photos.php:1394
msgid "Recent Photos"
msgstr "Последние фотографии"
-#: ../../include/photos.php:672
+#: ../../include/photos.php:674
msgid "Upload New Photos"
msgstr "Загрузить новые фотографии"
@@ -778,19 +779,19 @@ msgstr "Загрузить новые фотографии"
msgid "View PDF"
msgstr "Просмотреть PDF"
-#: ../../include/oembed.php:347
+#: ../../include/oembed.php:352
msgid " by "
msgstr " по "
-#: ../../include/oembed.php:348
+#: ../../include/oembed.php:353
msgid " on "
msgstr " на "
-#: ../../include/oembed.php:377
+#: ../../include/oembed.php:382
msgid "Embedded content"
msgstr "Встроенное содержимое"
-#: ../../include/oembed.php:386
+#: ../../include/oembed.php:391
msgid "Embedding disabled"
msgstr "Встраивание отключено"
@@ -853,7 +854,7 @@ msgstr "Расширенный пример: name=ivan and country=russia"
#: ../../include/contact_widgets.php:53 ../../include/features.php:325
#: ../../Zotlabs/Widget/Filer.php:28
-#: ../../Zotlabs/Widget/Activity_filter.php:136
+#: ../../Zotlabs/Widget/Activity_filter.php:137
msgid "Saved Folders"
msgstr "Сохранённые каталоги"
@@ -879,8 +880,8 @@ msgstr "Общие контакты"
msgid "View all %d common connections"
msgstr "Просмотреть все %d общих контактов"
-#: ../../include/menu.php:118 ../../include/channel.php:1303
-#: ../../include/channel.php:1307 ../../Zotlabs/Storage/Browser.php:290
+#: ../../include/menu.php:118 ../../include/channel.php:1352
+#: ../../include/channel.php:1356 ../../Zotlabs/Storage/Browser.php:290
#: ../../Zotlabs/Module/Oauth.php:173 ../../Zotlabs/Module/Oauth2.php:194
#: ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Editblock.php:114 ../../Zotlabs/Module/Menu.php:175
@@ -899,55 +900,55 @@ msgstr "Просмотреть все %d общих контактов"
msgid "Edit"
msgstr "Изменить"
-#: ../../include/channel.php:42
+#: ../../include/channel.php:43
msgid "Unable to obtain identity information from database"
msgstr "Невозможно получить идентификационную информацию из базы данных"
-#: ../../include/channel.php:75
+#: ../../include/channel.php:76
msgid "Empty name"
msgstr "Пустое имя"
-#: ../../include/channel.php:78
+#: ../../include/channel.php:79
msgid "Name too long"
msgstr "Слишком длинное имя"
-#: ../../include/channel.php:195
+#: ../../include/channel.php:196
msgid "No account identifier"
msgstr "Идентификатор аккаунта отсутствует"
-#: ../../include/channel.php:207
+#: ../../include/channel.php:208
msgid "Nickname is required."
msgstr "Требуется псевдоним."
-#: ../../include/channel.php:221 ../../include/channel.php:606
+#: ../../include/channel.php:222 ../../include/channel.php:655
#: ../../Zotlabs/Module/Changeaddr.php:46
msgid "Reserved nickname. Please choose another."
msgstr "Зарезервированый псевдоним. Пожалуйста, выберите другой."
-#: ../../include/channel.php:226 ../../include/channel.php:611
+#: ../../include/channel.php:227 ../../include/channel.php:660
#: ../../Zotlabs/Module/Changeaddr.php:51
msgid ""
"Nickname has unsupported characters or is already being used on this site."
msgstr "Псевдоним имеет недопустимые символы или уже используется на этом сайте."
-#: ../../include/channel.php:284
+#: ../../include/channel.php:287
msgid "Unable to retrieve created identity"
msgstr "Не удается получить созданный идентификатор"
-#: ../../include/channel.php:380
+#: ../../include/channel.php:429
msgid "Default Profile"
msgstr "Профиль по умолчанию"
-#: ../../include/channel.php:539 ../../include/channel.php:628
+#: ../../include/channel.php:588 ../../include/channel.php:677
msgid "Unable to retrieve modified identity"
msgstr "Не удается найти изменённый идентификатор"
-#: ../../include/channel.php:1158
+#: ../../include/channel.php:1207
#: ../../extend/addon/hzaddons/chess/chess.php:486
msgid "Requested channel is not available."
msgstr "Запрошенный канал не доступен."
-#: ../../include/channel.php:1204 ../../Zotlabs/Module/Achievements.php:15
+#: ../../include/channel.php:1253 ../../Zotlabs/Module/Achievements.php:15
#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Editlayout.php:31
#: ../../Zotlabs/Module/Filestorage.php:51
#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Menu.php:91
@@ -959,84 +960,84 @@ msgstr "Запрошенный канал не доступен."
msgid "Requested profile is not available."
msgstr "Запрашиваемый профиль не доступен."
-#: ../../include/channel.php:1296 ../../Zotlabs/Module/Profiles.php:728
+#: ../../include/channel.php:1345 ../../Zotlabs/Module/Profiles.php:728
msgid "Change profile photo"
msgstr "Изменить фотографию профиля"
-#: ../../include/channel.php:1303 ../../include/nav.php:109
+#: ../../include/channel.php:1352 ../../include/nav.php:109
#: ../../Zotlabs/Module/Profiles.php:830
msgid "Edit Profiles"
msgstr "Редактирование профилей"
-#: ../../include/channel.php:1304
+#: ../../include/channel.php:1353
msgid "Create New Profile"
msgstr "Создать новый профиль"
-#: ../../include/channel.php:1307 ../../include/nav.php:111
+#: ../../include/channel.php:1356 ../../include/nav.php:111
#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:58
msgid "Edit Profile"
msgstr "Редактировать профиль"
-#: ../../include/channel.php:1322 ../../Zotlabs/Module/Profiles.php:820
+#: ../../include/channel.php:1371 ../../Zotlabs/Module/Profiles.php:820
msgid "Profile Image"
msgstr "Изображение профиля"
-#: ../../include/channel.php:1325
+#: ../../include/channel.php:1374
msgid "Visible to everybody"
msgstr "Видно всем"
-#: ../../include/channel.php:1326 ../../Zotlabs/Module/Profiles.php:725
+#: ../../include/channel.php:1375 ../../Zotlabs/Module/Profiles.php:725
#: ../../Zotlabs/Module/Profiles.php:824
msgid "Edit visibility"
msgstr "Редактировать видимость"
-#: ../../include/channel.php:1383 ../../include/conversation.php:1058
+#: ../../include/channel.php:1432 ../../include/conversation.php:1058
#: ../../include/connections.php:110 ../../Zotlabs/Module/Directory.php:342
#: ../../Zotlabs/Module/Suggest.php:71 ../../Zotlabs/Widget/Suggestions.php:44
#: ../../Zotlabs/Widget/Follow.php:32
msgid "Connect"
msgstr "Подключить"
-#: ../../include/channel.php:1398 ../../include/event.php:54
+#: ../../include/channel.php:1447 ../../include/event.php:54
#: ../../include/event.php:86 ../../Zotlabs/Module/Directory.php:328
msgid "Location:"
msgstr "Местоположение:"
-#: ../../include/channel.php:1402 ../../include/channel.php:1530
+#: ../../include/channel.php:1451 ../../include/channel.php:1579
msgid "Gender:"
msgstr "Пол:"
-#: ../../include/channel.php:1403 ../../include/channel.php:1574
+#: ../../include/channel.php:1452 ../../include/channel.php:1623
#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:305
msgid "Status:"
msgstr "Статус:"
-#: ../../include/channel.php:1404 ../../include/channel.php:1598
+#: ../../include/channel.php:1453 ../../include/channel.php:1647
msgid "Homepage:"
msgstr "Домашняя страница:"
-#: ../../include/channel.php:1405
+#: ../../include/channel.php:1454
msgid "Online Now"
msgstr "Сейчас в сети"
-#: ../../include/channel.php:1458
+#: ../../include/channel.php:1507
msgid "Change your profile photo"
msgstr "Изменить фотографию вашего профиля"
-#: ../../include/channel.php:1489
+#: ../../include/channel.php:1538
msgid "Trans"
msgstr "Трансексуал"
-#: ../../include/channel.php:1528 ../../Zotlabs/Module/Settings/Channel.php:499
+#: ../../include/channel.php:1577 ../../Zotlabs/Module/Settings/Channel.php:499
msgid "Full Name:"
msgstr "Полное имя:"
-#: ../../include/channel.php:1535
+#: ../../include/channel.php:1584
msgid "Like this channel"
msgstr "нравится этот канал"
-#: ../../include/channel.php:1546 ../../include/conversation.php:1693
-#: ../../include/taxonomy.php:661 ../../Zotlabs/Module/Photos.php:1162
+#: ../../include/channel.php:1595 ../../include/conversation.php:1693
+#: ../../include/taxonomy.php:661 ../../Zotlabs/Module/Photos.php:1175
#: ../../Zotlabs/Lib/ThreadItem.php:218
msgctxt "noun"
msgid "Like"
@@ -1045,136 +1046,136 @@ msgstr[0] "Нравится"
msgstr[1] "Нравится"
msgstr[2] "Нравится"
-#: ../../include/channel.php:1559
+#: ../../include/channel.php:1608
msgid "j F, Y"
msgstr ""
-#: ../../include/channel.php:1560
+#: ../../include/channel.php:1609
msgid "j F"
msgstr ""
-#: ../../include/channel.php:1567
+#: ../../include/channel.php:1616
msgid "Birthday:"
msgstr "День рождения:"
-#: ../../include/channel.php:1571 ../../Zotlabs/Module/Directory.php:323
+#: ../../include/channel.php:1620 ../../Zotlabs/Module/Directory.php:323
msgid "Age:"
msgstr "Возраст:"
-#: ../../include/channel.php:1580
+#: ../../include/channel.php:1629
#, php-format
msgid "for %1$d %2$s"
msgstr "для %1$d %2$s"
-#: ../../include/channel.php:1592
+#: ../../include/channel.php:1641
msgid "Tags:"
msgstr "Теги:"
-#: ../../include/channel.php:1596
+#: ../../include/channel.php:1645
msgid "Sexual Preference:"
msgstr "Сексуальные предпочтения:"
-#: ../../include/channel.php:1600 ../../Zotlabs/Module/Directory.php:339
+#: ../../include/channel.php:1649 ../../Zotlabs/Module/Directory.php:339
msgid "Hometown:"
msgstr "Родной город:"
-#: ../../include/channel.php:1602
+#: ../../include/channel.php:1651
msgid "Political Views:"
msgstr "Политические взгляды:"
-#: ../../include/channel.php:1604
+#: ../../include/channel.php:1653
msgid "Religion:"
msgstr "Религия:"
-#: ../../include/channel.php:1606 ../../Zotlabs/Module/Directory.php:341
+#: ../../include/channel.php:1655 ../../Zotlabs/Module/Directory.php:341
msgid "About:"
msgstr "О себе:"
-#: ../../include/channel.php:1608
+#: ../../include/channel.php:1657
msgid "Hobbies/Interests:"
msgstr "Хобби / интересы:"
-#: ../../include/channel.php:1610
+#: ../../include/channel.php:1659
msgid "Likes:"
msgstr "Что вам нравится:"
-#: ../../include/channel.php:1612
+#: ../../include/channel.php:1661
msgid "Dislikes:"
msgstr "Что вам не нравится:"
-#: ../../include/channel.php:1614
+#: ../../include/channel.php:1663
msgid "Contact information and Social Networks:"
msgstr "Контактная информация и социальные сети:"
-#: ../../include/channel.php:1616
+#: ../../include/channel.php:1665
msgid "My other channels:"
msgstr "Мои другие каналы:"
-#: ../../include/channel.php:1618
+#: ../../include/channel.php:1667
msgid "Musical interests:"
msgstr "Музыкальные интересы:"
-#: ../../include/channel.php:1620
+#: ../../include/channel.php:1669
msgid "Books, literature:"
msgstr "Книги, литература:"
-#: ../../include/channel.php:1622
+#: ../../include/channel.php:1671
msgid "Television:"
msgstr "Телевидение:"
-#: ../../include/channel.php:1624
+#: ../../include/channel.php:1673
msgid "Film/dance/culture/entertainment:"
msgstr "Кино / танцы / культура / развлечения:"
-#: ../../include/channel.php:1626
+#: ../../include/channel.php:1675
msgid "Love/Romance:"
msgstr "Любовь / романтика:"
-#: ../../include/channel.php:1628
+#: ../../include/channel.php:1677
msgid "Work/employment:"
msgstr "Работа / занятость:"
-#: ../../include/channel.php:1630
+#: ../../include/channel.php:1679
msgid "School/education:"
msgstr "Школа / образование:"
-#: ../../include/channel.php:1651 ../../Zotlabs/Module/Profperm.php:113
+#: ../../include/channel.php:1700 ../../Zotlabs/Module/Profperm.php:113
#: ../../Zotlabs/Lib/Apps.php:337
msgid "Profile"
msgstr "Профиль"
-#: ../../include/channel.php:1653
+#: ../../include/channel.php:1702
msgid "Like this thing"
msgstr "нравится этo"
-#: ../../include/channel.php:1654 ../../Zotlabs/Module/Events.php:692
+#: ../../include/channel.php:1703 ../../Zotlabs/Module/Events.php:692
#: ../../Zotlabs/Module/Cal.php:340
msgid "Export"
msgstr "Экспорт"
-#: ../../include/channel.php:2088 ../../Zotlabs/Module/Cover_photo.php:276
+#: ../../include/channel.php:2137 ../../Zotlabs/Module/Cover_photo.php:276
msgid "cover photo"
msgstr "фотография обложки"
-#: ../../include/channel.php:2341 ../../boot.php:1626
+#: ../../include/channel.php:2390 ../../boot.php:1625
#: ../../Zotlabs/Module/Rmagic.php:75
msgid "Remote Authentication"
msgstr "Удаленная аутентификация"
-#: ../../include/channel.php:2342 ../../Zotlabs/Module/Rmagic.php:76
+#: ../../include/channel.php:2391 ../../Zotlabs/Module/Rmagic.php:76
msgid "Enter your channel address (e.g. channel@example.com)"
msgstr "Введите адрес вашего канала (например: channel@example.com)"
-#: ../../include/channel.php:2343 ../../Zotlabs/Module/Rmagic.php:77
+#: ../../include/channel.php:2392 ../../Zotlabs/Module/Rmagic.php:77
msgid "Authenticate"
msgstr "Проверка подлинности"
-#: ../../include/channel.php:2497 ../../Zotlabs/Module/Admin/Accounts.php:91
+#: ../../include/channel.php:2547 ../../Zotlabs/Module/Admin/Accounts.php:91
#, php-format
msgid "Account '%s' deleted"
msgstr "Аккаунт '%s' удален"
-#: ../../include/message.php:13 ../../include/text.php:1709
+#: ../../include/message.php:13 ../../include/text.php:1708
msgid "Download binary/encrypted content"
msgstr "Загрузить двоичное / зашифрованное содержимое"
@@ -1205,7 +1206,7 @@ msgid "post"
msgstr "публикация"
#: ../../include/items.php:384 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:68 ../../Zotlabs/Module/Profperm.php:28
+#: ../../Zotlabs/Module/Dreport.php:79 ../../Zotlabs/Module/Profperm.php:28
#: ../../Zotlabs/Module/Like.php:296 ../../Zotlabs/Module/Subthread.php:86
#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Cloud.php:126
#: ../../Zotlabs/Module/Import_items.php:120
@@ -1217,44 +1218,44 @@ msgstr "публикация"
msgid "Permission denied"
msgstr "Доступ запрещен"
-#: ../../include/items.php:911 ../../include/items.php:971
+#: ../../include/items.php:921 ../../include/items.php:981
msgid "(Unknown)"
msgstr "(Неизвестный)"
-#: ../../include/items.php:1157
+#: ../../include/items.php:1169
msgid "Visible to anybody on the internet."
msgstr "Виден всем в интернете."
-#: ../../include/items.php:1159
+#: ../../include/items.php:1171
msgid "Visible to you only."
msgstr "Видно только вам."
-#: ../../include/items.php:1161
+#: ../../include/items.php:1173
msgid "Visible to anybody in this network."
msgstr "Видно всем в этой сети."
-#: ../../include/items.php:1163
+#: ../../include/items.php:1175
msgid "Visible to anybody authenticated."
msgstr "Видно всем аутентифицированным."
-#: ../../include/items.php:1165
+#: ../../include/items.php:1177
#, php-format
msgid "Visible to anybody on %s."
msgstr "Видно всем в %s."
-#: ../../include/items.php:1167
+#: ../../include/items.php:1179
msgid "Visible to all connections."
msgstr "Видно всем контактам."
-#: ../../include/items.php:1169
+#: ../../include/items.php:1181
msgid "Visible to approved connections."
msgstr "Видно только одобренным контактам."
-#: ../../include/items.php:1171
+#: ../../include/items.php:1183
msgid "Visible to specific connections."
msgstr "Видно указанным контактам."
-#: ../../include/items.php:3587 ../../Zotlabs/Module/Display.php:45
+#: ../../include/items.php:3613 ../../Zotlabs/Module/Display.php:45
#: ../../Zotlabs/Module/Display.php:452 ../../Zotlabs/Module/Admin.php:62
#: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Viewsrc.php:25
#: ../../Zotlabs/Module/Admin/Addons.php:259
@@ -1262,90 +1263,90 @@ msgstr "Видно указанным контактам."
msgid "Item not found."
msgstr "Элемент не найден."
-#: ../../include/items.php:4167 ../../Zotlabs/Module/Group.php:61
+#: ../../include/items.php:4193 ../../Zotlabs/Module/Group.php:61
#: ../../Zotlabs/Module/Group.php:200
msgid "Privacy group not found."
msgstr "Группа безопасности не найдена."
-#: ../../include/items.php:4183
+#: ../../include/items.php:4209
msgid "Privacy group is empty."
msgstr "Группа безопасности пуста"
-#: ../../include/items.php:4190
+#: ../../include/items.php:4216
#, php-format
msgid "Privacy group: %s"
msgstr "Группа безопасности: %s"
-#: ../../include/items.php:4200 ../../Zotlabs/Module/Connedit.php:851
+#: ../../include/items.php:4226 ../../Zotlabs/Module/Connedit.php:856
#, php-format
msgid "Connection: %s"
msgstr "Контакт: %s"
-#: ../../include/items.php:4202
+#: ../../include/items.php:4228
msgid "Connection not found."
msgstr "Контакт не найден."
-#: ../../include/items.php:4544 ../../Zotlabs/Module/Cover_photo.php:269
+#: ../../include/items.php:4570 ../../Zotlabs/Module/Cover_photo.php:269
msgid "female"
msgstr "женщина"
-#: ../../include/items.php:4545 ../../Zotlabs/Module/Cover_photo.php:270
+#: ../../include/items.php:4571 ../../Zotlabs/Module/Cover_photo.php:270
#, php-format
msgid "%1$s updated her %2$s"
msgstr "%1$s обновила её %2$s"
-#: ../../include/items.php:4546 ../../Zotlabs/Module/Cover_photo.php:271
+#: ../../include/items.php:4572 ../../Zotlabs/Module/Cover_photo.php:271
msgid "male"
msgstr "мужчина"
-#: ../../include/items.php:4547 ../../Zotlabs/Module/Cover_photo.php:272
+#: ../../include/items.php:4573 ../../Zotlabs/Module/Cover_photo.php:272
#, php-format
msgid "%1$s updated his %2$s"
msgstr "%1$s обновил его %2$s"
-#: ../../include/items.php:4549 ../../Zotlabs/Module/Cover_photo.php:274
+#: ../../include/items.php:4575 ../../Zotlabs/Module/Cover_photo.php:274
#, php-format
msgid "%1$s updated their %2$s"
msgstr "%1$s обновили их %2$s"
-#: ../../include/items.php:4551
+#: ../../include/items.php:4577
msgid "profile photo"
msgstr "Фотография профиля"
-#: ../../include/items.php:4742
+#: ../../include/items.php:4769
#, php-format
msgid "[Edited %s]"
msgstr "[Отредактировано %s]"
-#: ../../include/items.php:4742
+#: ../../include/items.php:4769
msgctxt "edit_activity"
msgid "Post"
msgstr "Публикация"
-#: ../../include/items.php:4742
+#: ../../include/items.php:4769
msgctxt "edit_activity"
msgid "Comment"
msgstr "Комментарий"
-#: ../../include/activities.php:41
+#: ../../include/activities.php:42
msgid " and "
msgstr " и "
-#: ../../include/activities.php:49
+#: ../../include/activities.php:50
msgid "public profile"
msgstr "общедоступный профиль"
-#: ../../include/activities.php:58
+#: ../../include/activities.php:59
#, php-format
msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
msgstr "%1$s изменил %2$s на &ldquo;%3$s&rdquo;"
-#: ../../include/activities.php:59
+#: ../../include/activities.php:60
#, php-format
msgid "Visit %1$s's %2$s"
msgstr "Посетить %1$s %2$s"
-#: ../../include/activities.php:62
+#: ../../include/activities.php:63
#, php-format
msgid "%1$s has an updated %2$s, changing %3$s."
msgstr "%1$s обновлено %2$s, изменено %3$s."
@@ -1402,7 +1403,7 @@ msgstr "Использовать режим блога / списка"
msgid "Comments will be displayed separately"
msgstr "Комментарии будут отображаться отдельно"
-#: ../../include/features.php:125 ../../include/text.php:981
+#: ../../include/features.php:125 ../../include/text.php:980
#: ../../Zotlabs/Module/Connections.php:334 ../../Zotlabs/Lib/Apps.php:308
msgid "Connections"
msgstr "Контакты"
@@ -1687,53 +1688,53 @@ msgstr "Несколько профилей"
msgid "Ability to create multiple profiles"
msgstr "Возможность создания нескольких профилей"
-#: ../../include/text.php:498
+#: ../../include/text.php:501
msgid "prev"
msgstr "предыдущий"
-#: ../../include/text.php:500
+#: ../../include/text.php:503
msgid "first"
msgstr "первый"
-#: ../../include/text.php:529
+#: ../../include/text.php:532
msgid "last"
msgstr "последний"
-#: ../../include/text.php:532
+#: ../../include/text.php:535
msgid "next"
msgstr "следующий"
-#: ../../include/text.php:543
+#: ../../include/text.php:546
msgid "older"
msgstr "старше"
-#: ../../include/text.php:545
+#: ../../include/text.php:548
msgid "newer"
msgstr "новее"
-#: ../../include/text.php:969
+#: ../../include/text.php:968
msgid "No connections"
msgstr "Нет контактов"
-#: ../../include/text.php:1001
+#: ../../include/text.php:1000
#, php-format
msgid "View all %s connections"
msgstr "Просмотреть все %s контактов"
-#: ../../include/text.php:1057
+#: ../../include/text.php:1056
#, php-format
msgid "Network: %s"
msgstr "Сеть: %s"
-#: ../../include/text.php:1068 ../../include/text.php:1080
+#: ../../include/text.php:1067 ../../include/text.php:1079
#: ../../include/acl_selectors.php:118 ../../include/nav.php:183
#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:338
#: ../../Zotlabs/Widget/Sitesearch.php:31
-#: ../../Zotlabs/Widget/Activity_filter.php:150 ../../Zotlabs/Lib/Apps.php:328
+#: ../../Zotlabs/Widget/Activity_filter.php:151 ../../Zotlabs/Lib/Apps.php:328
msgid "Search"
msgstr "Поиск"
-#: ../../include/text.php:1069 ../../include/text.php:1081
+#: ../../include/text.php:1068 ../../include/text.php:1080
#: ../../Zotlabs/Module/Admin/Profs.php:94
#: ../../Zotlabs/Module/Admin/Profs.php:114 ../../Zotlabs/Module/Rbmark.php:32
#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
@@ -1741,409 +1742,409 @@ msgstr "Поиск"
msgid "Save"
msgstr "Запомнить"
-#: ../../include/text.php:1146 ../../include/text.php:1150
+#: ../../include/text.php:1145 ../../include/text.php:1149
msgid "poke"
msgstr "Ткнуть"
-#: ../../include/text.php:1146 ../../include/text.php:1150
+#: ../../include/text.php:1145 ../../include/text.php:1149
#: ../../include/conversation.php:251
msgid "poked"
msgstr "ткнут"
-#: ../../include/text.php:1151
+#: ../../include/text.php:1150
msgid "ping"
msgstr "Пингануть"
-#: ../../include/text.php:1151
+#: ../../include/text.php:1150
msgid "pinged"
msgstr "Отпингован"
-#: ../../include/text.php:1152
+#: ../../include/text.php:1151
msgid "prod"
msgstr "Подтолкнуть"
-#: ../../include/text.php:1152
+#: ../../include/text.php:1151
msgid "prodded"
msgstr "Подтолкнут"
-#: ../../include/text.php:1153
+#: ../../include/text.php:1152
msgid "slap"
msgstr "Шлёпнуть"
-#: ../../include/text.php:1153
+#: ../../include/text.php:1152
msgid "slapped"
msgstr "Шлёпнут"
-#: ../../include/text.php:1154
+#: ../../include/text.php:1153
msgid "finger"
msgstr "Указать"
-#: ../../include/text.php:1154
+#: ../../include/text.php:1153
msgid "fingered"
msgstr "Указан"
-#: ../../include/text.php:1155
+#: ../../include/text.php:1154
msgid "rebuff"
msgstr "Дать отпор"
-#: ../../include/text.php:1155
+#: ../../include/text.php:1154
msgid "rebuffed"
msgstr "Дан отпор"
-#: ../../include/text.php:1178
+#: ../../include/text.php:1177
msgid "happy"
msgstr "счастливый"
-#: ../../include/text.php:1179
+#: ../../include/text.php:1178
msgid "sad"
msgstr "грустный"
-#: ../../include/text.php:1180
+#: ../../include/text.php:1179
msgid "mellow"
msgstr "спокойный"
-#: ../../include/text.php:1181
+#: ../../include/text.php:1180
msgid "tired"
msgstr "усталый"
-#: ../../include/text.php:1182
+#: ../../include/text.php:1181
msgid "perky"
msgstr "весёлый"
-#: ../../include/text.php:1183
+#: ../../include/text.php:1182
msgid "angry"
msgstr "сердитый"
-#: ../../include/text.php:1184
+#: ../../include/text.php:1183
msgid "stupefied"
msgstr "отупевший"
-#: ../../include/text.php:1185
+#: ../../include/text.php:1184
msgid "puzzled"
msgstr "недоумевающий"
-#: ../../include/text.php:1186
+#: ../../include/text.php:1185
msgid "interested"
msgstr "заинтересованный"
-#: ../../include/text.php:1187
+#: ../../include/text.php:1186
msgid "bitter"
msgstr "едкий"
-#: ../../include/text.php:1188
+#: ../../include/text.php:1187
msgid "cheerful"
msgstr "бодрый"
-#: ../../include/text.php:1189
+#: ../../include/text.php:1188
msgid "alive"
msgstr "энергичный"
-#: ../../include/text.php:1190
+#: ../../include/text.php:1189
msgid "annoyed"
msgstr "раздражённый"
-#: ../../include/text.php:1191
+#: ../../include/text.php:1190
msgid "anxious"
msgstr "обеспокоенный"
-#: ../../include/text.php:1192
+#: ../../include/text.php:1191
msgid "cranky"
msgstr "капризный"
-#: ../../include/text.php:1193
+#: ../../include/text.php:1192
msgid "disturbed"
msgstr "встревоженный"
-#: ../../include/text.php:1194
+#: ../../include/text.php:1193
msgid "frustrated"
msgstr "разочарованный"
-#: ../../include/text.php:1195
+#: ../../include/text.php:1194
msgid "depressed"
msgstr "подавленный"
-#: ../../include/text.php:1196
+#: ../../include/text.php:1195
msgid "motivated"
msgstr "мотивированный"
-#: ../../include/text.php:1197
+#: ../../include/text.php:1196
msgid "relaxed"
msgstr "расслабленный"
-#: ../../include/text.php:1198
+#: ../../include/text.php:1197
msgid "surprised"
msgstr "удивленный"
-#: ../../include/text.php:1377 ../../include/js_strings.php:95
+#: ../../include/text.php:1376 ../../include/js_strings.php:95
msgid "Monday"
msgstr "Понедельник"
-#: ../../include/text.php:1377 ../../include/js_strings.php:96
+#: ../../include/text.php:1376 ../../include/js_strings.php:96
msgid "Tuesday"
msgstr "Вторник"
-#: ../../include/text.php:1377 ../../include/js_strings.php:97
+#: ../../include/text.php:1376 ../../include/js_strings.php:97
msgid "Wednesday"
msgstr "Среда"
-#: ../../include/text.php:1377 ../../include/js_strings.php:98
+#: ../../include/text.php:1376 ../../include/js_strings.php:98
msgid "Thursday"
msgstr "Четверг"
-#: ../../include/text.php:1377 ../../include/js_strings.php:99
+#: ../../include/text.php:1376 ../../include/js_strings.php:99
msgid "Friday"
msgstr "Пятница"
-#: ../../include/text.php:1377 ../../include/js_strings.php:100
+#: ../../include/text.php:1376 ../../include/js_strings.php:100
msgid "Saturday"
msgstr "Суббота"
-#: ../../include/text.php:1377 ../../include/js_strings.php:94
+#: ../../include/text.php:1376 ../../include/js_strings.php:94
msgid "Sunday"
msgstr "Воскресенье"
-#: ../../include/text.php:1381 ../../include/js_strings.php:70
+#: ../../include/text.php:1380 ../../include/js_strings.php:70
msgid "January"
msgstr "Январь"
-#: ../../include/text.php:1381 ../../include/js_strings.php:71
+#: ../../include/text.php:1380 ../../include/js_strings.php:71
msgid "February"
msgstr "Февраль"
-#: ../../include/text.php:1381 ../../include/js_strings.php:72
+#: ../../include/text.php:1380 ../../include/js_strings.php:72
msgid "March"
msgstr "Март"
-#: ../../include/text.php:1381 ../../include/js_strings.php:73
+#: ../../include/text.php:1380 ../../include/js_strings.php:73
msgid "April"
msgstr "Апрель"
-#: ../../include/text.php:1381
+#: ../../include/text.php:1380
msgid "May"
msgstr "Май"
-#: ../../include/text.php:1381 ../../include/js_strings.php:75
+#: ../../include/text.php:1380 ../../include/js_strings.php:75
msgid "June"
msgstr "Июнь"
-#: ../../include/text.php:1381 ../../include/js_strings.php:76
+#: ../../include/text.php:1380 ../../include/js_strings.php:76
msgid "July"
msgstr "Июль"
-#: ../../include/text.php:1381 ../../include/js_strings.php:77
+#: ../../include/text.php:1380 ../../include/js_strings.php:77
msgid "August"
msgstr "Август"
-#: ../../include/text.php:1381 ../../include/js_strings.php:78
+#: ../../include/text.php:1380 ../../include/js_strings.php:78
msgid "September"
msgstr "Сентябрь"
-#: ../../include/text.php:1381 ../../include/js_strings.php:79
+#: ../../include/text.php:1380 ../../include/js_strings.php:79
msgid "October"
msgstr "Октябрь"
-#: ../../include/text.php:1381 ../../include/js_strings.php:80
+#: ../../include/text.php:1380 ../../include/js_strings.php:80
msgid "November"
msgstr "Ноябрь"
-#: ../../include/text.php:1381 ../../include/js_strings.php:81
+#: ../../include/text.php:1380 ../../include/js_strings.php:81
msgid "December"
msgstr "Декабрь"
-#: ../../include/text.php:1455
+#: ../../include/text.php:1454
msgid "Unknown Attachment"
msgstr "Неизвестное вложение"
-#: ../../include/text.php:1457 ../../Zotlabs/Storage/Browser.php:287
+#: ../../include/text.php:1456 ../../Zotlabs/Storage/Browser.php:287
#: ../../Zotlabs/Module/Sharedwithme.php:106
msgid "Size"
msgstr "Размер"
-#: ../../include/text.php:1457 ../../include/feedutils.php:860
+#: ../../include/text.php:1456 ../../include/feedutils.php:860
msgid "unknown"
msgstr "неизвестный"
-#: ../../include/text.php:1493
+#: ../../include/text.php:1492
msgid "remove category"
msgstr "удалить категорию"
-#: ../../include/text.php:1567
+#: ../../include/text.php:1566
msgid "remove from file"
msgstr "удалить из файла"
-#: ../../include/text.php:1850 ../../Zotlabs/Module/Events.php:663
+#: ../../include/text.php:1849 ../../Zotlabs/Module/Events.php:663
#: ../../Zotlabs/Module/Cal.php:314
msgid "Link to Source"
msgstr "Ссылка на источник"
-#: ../../include/text.php:1872 ../../include/language.php:423
+#: ../../include/text.php:1871 ../../include/language.php:423
msgid "default"
msgstr "по умолчанию"
-#: ../../include/text.php:1880
+#: ../../include/text.php:1879
msgid "Page layout"
msgstr "Шаблон страницы"
-#: ../../include/text.php:1880
+#: ../../include/text.php:1879
msgid "You can create your own with the layouts tool"
msgstr "Вы можете создать свой собственный с помощью инструмента шаблонов"
-#: ../../include/text.php:1890 ../../Zotlabs/Module/Wiki.php:217
+#: ../../include/text.php:1889 ../../Zotlabs/Module/Wiki.php:217
#: ../../Zotlabs/Module/Wiki.php:371 ../../Zotlabs/Widget/Wiki_pages.php:38
#: ../../Zotlabs/Widget/Wiki_pages.php:95
msgid "BBcode"
msgstr ""
-#: ../../include/text.php:1891
+#: ../../include/text.php:1890
msgid "HTML"
msgstr ""
-#: ../../include/text.php:1892 ../../Zotlabs/Module/Wiki.php:217
+#: ../../include/text.php:1891 ../../Zotlabs/Module/Wiki.php:217
#: ../../Zotlabs/Module/Wiki.php:371 ../../Zotlabs/Widget/Wiki_pages.php:38
#: ../../Zotlabs/Widget/Wiki_pages.php:95
#: ../../extend/addon/hzaddons/mdpost/mdpost.php:41
msgid "Markdown"
msgstr "Разметка Markdown"
-#: ../../include/text.php:1893 ../../Zotlabs/Module/Wiki.php:217
+#: ../../include/text.php:1892 ../../Zotlabs/Module/Wiki.php:217
#: ../../Zotlabs/Widget/Wiki_pages.php:38
#: ../../Zotlabs/Widget/Wiki_pages.php:95
msgid "Text"
msgstr "Текст"
-#: ../../include/text.php:1894
+#: ../../include/text.php:1893
msgid "Comanche Layout"
msgstr "Шаблон Comanche"
-#: ../../include/text.php:1899
+#: ../../include/text.php:1898
msgid "PHP"
msgstr ""
-#: ../../include/text.php:1908
+#: ../../include/text.php:1907
msgid "Page content type"
msgstr "Тип содержимого страницы"
-#: ../../include/text.php:2028 ../../include/conversation.php:116
-#: ../../Zotlabs/Module/Tagger.php:69 ../../Zotlabs/Module/Like.php:384
-#: ../../Zotlabs/Module/Subthread.php:111 ../../Zotlabs/Lib/Activity.php:1570
+#: ../../include/text.php:2027 ../../include/conversation.php:116
+#: ../../Zotlabs/Module/Tagger.php:69 ../../Zotlabs/Module/Like.php:387
+#: ../../Zotlabs/Module/Subthread.php:112 ../../Zotlabs/Lib/Activity.php:1570
#: ../../extend/addon/hzaddons/redphotos/redphotohelper.php:71
-#: ../../extend/addon/hzaddons/pubcrawl/as.php:1512
-#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1539
+#: ../../extend/addon/hzaddons/pubcrawl/as.php:1494
+#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1541
msgid "photo"
msgstr "фото"
-#: ../../include/text.php:2031 ../../include/conversation.php:119
-#: ../../include/event.php:1153 ../../Zotlabs/Module/Tagger.php:73
-#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Like.php:386
+#: ../../include/text.php:2030 ../../include/conversation.php:119
+#: ../../include/event.php:1156 ../../Zotlabs/Module/Tagger.php:73
+#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Like.php:389
msgid "event"
msgstr "событие"
-#: ../../include/text.php:2034 ../../include/conversation.php:144
-#: ../../Zotlabs/Module/Like.php:384 ../../Zotlabs/Module/Subthread.php:111
+#: ../../include/text.php:2033 ../../include/conversation.php:144
+#: ../../Zotlabs/Module/Like.php:387 ../../Zotlabs/Module/Subthread.php:112
#: ../../Zotlabs/Lib/Activity.php:1570
-#: ../../extend/addon/hzaddons/pubcrawl/as.php:1512
-#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1539
+#: ../../extend/addon/hzaddons/pubcrawl/as.php:1494
+#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1541
msgid "status"
msgstr "статус"
-#: ../../include/text.php:2036 ../../include/conversation.php:146
+#: ../../include/text.php:2035 ../../include/conversation.php:146
#: ../../Zotlabs/Module/Tagger.php:79
msgid "comment"
msgstr "комментарий"
-#: ../../include/text.php:2041
+#: ../../include/text.php:2040
msgid "activity"
msgstr "активность"
-#: ../../include/text.php:2142
+#: ../../include/text.php:2141
msgid "a-z, 0-9, -, and _ only"
msgstr "Только a-z, 0-9, -, и _"
-#: ../../include/text.php:2462
+#: ../../include/text.php:2461
msgid "Design Tools"
msgstr "Инструменты дизайна"
-#: ../../include/text.php:2465 ../../Zotlabs/Module/Blocks.php:154
+#: ../../include/text.php:2464 ../../Zotlabs/Module/Blocks.php:154
msgid "Blocks"
msgstr "Блокировки"
-#: ../../include/text.php:2466 ../../Zotlabs/Module/Menu.php:170
+#: ../../include/text.php:2465 ../../Zotlabs/Module/Menu.php:170
msgid "Menus"
msgstr "Меню"
-#: ../../include/text.php:2467 ../../Zotlabs/Module/Layouts.php:184
+#: ../../include/text.php:2466 ../../Zotlabs/Module/Layouts.php:184
msgid "Layouts"
msgstr "Шаблоны"
-#: ../../include/text.php:2468
+#: ../../include/text.php:2467
msgid "Pages"
msgstr "Страницы"
-#: ../../include/text.php:2489 ../../Zotlabs/Module/Cal.php:343
+#: ../../include/text.php:2488 ../../Zotlabs/Module/Cal.php:343
msgid "Import"
msgstr "Импортировать"
-#: ../../include/text.php:2490
+#: ../../include/text.php:2489
msgid "Import website..."
msgstr "Импорт веб-сайта..."
-#: ../../include/text.php:2491
+#: ../../include/text.php:2490
msgid "Select folder to import"
msgstr "Выбрать каталог для импорта"
-#: ../../include/text.php:2492
+#: ../../include/text.php:2491
msgid "Import from a zipped folder:"
msgstr "Импортировать из каталога в zip-архиве:"
-#: ../../include/text.php:2493
+#: ../../include/text.php:2492
msgid "Import from cloud files:"
msgstr "Импортировать из сетевых файлов:"
-#: ../../include/text.php:2494
+#: ../../include/text.php:2493
msgid "/cloud/channel/path/to/folder"
msgstr ""
-#: ../../include/text.php:2495
+#: ../../include/text.php:2494
msgid "Enter path to website files"
msgstr "Введите путь к файлам веб-сайта"
-#: ../../include/text.php:2496
+#: ../../include/text.php:2495
msgid "Select folder"
msgstr "Выбрать каталог"
-#: ../../include/text.php:2497
+#: ../../include/text.php:2496
msgid "Export website..."
msgstr "Экспорт веб-сайта..."
-#: ../../include/text.php:2498
+#: ../../include/text.php:2497
msgid "Export to a zip file"
msgstr "Экспортировать в ZIP файл."
-#: ../../include/text.php:2499
+#: ../../include/text.php:2498
msgid "website.zip"
msgstr ""
-#: ../../include/text.php:2500
+#: ../../include/text.php:2499
msgid "Enter a name for the zip file."
msgstr "Введите имя для ZIP файла."
-#: ../../include/text.php:2501
+#: ../../include/text.php:2500
msgid "Export to cloud files"
msgstr "Эскпортировать в сетевые файлы:"
-#: ../../include/text.php:2502
+#: ../../include/text.php:2501
msgid "/path/to/export/folder"
msgstr ""
-#: ../../include/text.php:2503
+#: ../../include/text.php:2502
msgid "Enter a path to a cloud files destination."
msgstr "Введите путь к расположению сетевых файлов."
-#: ../../include/text.php:2504
+#: ../../include/text.php:2503
msgid "Specify folder"
msgstr "Указать каталог"
-#: ../../include/text.php:2824 ../../Zotlabs/Storage/Browser.php:131
+#: ../../include/text.php:2823 ../../Zotlabs/Storage/Browser.php:131
msgid "Collection"
msgstr "Коллекция"
@@ -2161,7 +2162,7 @@ msgstr "Не удалось создать дублирующийся идент
msgid "Unable to create a unique channel address. Import failed."
msgstr "Не удалось создать уникальный адрес канала. Импорт не завершен."
-#: ../../include/import.php:117
+#: ../../include/import.php:116
msgid "Cloned channel not found. Import failed."
msgstr "Клон канала не найден. Импорт невозможен."
@@ -2182,7 +2183,7 @@ msgstr "редактировать"
#: ../../include/group.php:320 ../../include/nav.php:95
#: ../../Zotlabs/Module/Group.php:132 ../../Zotlabs/Module/Group.php:143
-#: ../../Zotlabs/Widget/Activity_filter.php:70 ../../Zotlabs/Lib/Group.php:324
+#: ../../Zotlabs/Widget/Activity_filter.php:41 ../../Zotlabs/Lib/Group.php:324
#: ../../Zotlabs/Lib/Apps.php:339
msgid "Privacy Groups"
msgstr "Группы безопасности"
@@ -2272,20 +2273,20 @@ msgstr "Это действие превышает ограничения, ус
msgid "This action is not available under your subscription plan."
msgstr "Это действие невозможно из-за ограничений в вашем плане."
-#: ../../include/zot.php:773
+#: ../../include/zot.php:775
msgid "Invalid data packet"
msgstr "Неверный пакет данных"
-#: ../../include/zot.php:800 ../../Zotlabs/Lib/Libzot.php:663
+#: ../../include/zot.php:802 ../../Zotlabs/Lib/Libzot.php:667
msgid "Unable to verify channel signature"
msgstr "Невозможно проверить подпись канала"
-#: ../../include/zot.php:2571 ../../Zotlabs/Lib/Libsync.php:733
+#: ../../include/zot.php:2575 ../../Zotlabs/Lib/Libsync.php:733
#, php-format
msgid "Unable to verify site signature for %s"
msgstr "Невозможно проверить подпись сайта %s"
-#: ../../include/zot.php:4235
+#: ../../include/zot.php:4272
msgid "invalid target signature"
msgstr "недопустимая целевая подпись"
@@ -2346,11 +2347,6 @@ msgstr "Не найдено"
msgid "Page not found."
msgstr "Страница не найдена."
-#: ../../include/dba/dba_driver.php:178
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Не удается найти DNS информацию для сервера базы данных '%s'"
-
#: ../../include/bbcode.php:200 ../../include/bbcode.php:1201
#: ../../include/bbcode.php:1204 ../../include/bbcode.php:1209
#: ../../include/bbcode.php:1212 ../../include/bbcode.php:1215
@@ -2430,17 +2426,17 @@ msgstr "$1 писал:"
msgid "channel"
msgstr "канал"
-#: ../../include/conversation.php:160 ../../Zotlabs/Module/Like.php:438
+#: ../../include/conversation.php:160 ../../Zotlabs/Module/Like.php:441
#: ../../Zotlabs/Lib/Activity.php:1605
-#: ../../extend/addon/hzaddons/pubcrawl/as.php:1547
-#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1568
+#: ../../extend/addon/hzaddons/pubcrawl/as.php:1529
+#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1570
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgstr "%1$s нравится %3$s %2$s"
-#: ../../include/conversation.php:163 ../../Zotlabs/Module/Like.php:440
+#: ../../include/conversation.php:163 ../../Zotlabs/Module/Like.php:443
#: ../../Zotlabs/Lib/Activity.php:1607
-#: ../../extend/addon/hzaddons/pubcrawl/as.php:1549
+#: ../../extend/addon/hzaddons/pubcrawl/as.php:1531
#, php-format
msgid "%1$s doesn't like %2$s's %3$s"
msgstr "%1$s не нравится %2$s %3$s"
@@ -2465,52 +2461,52 @@ msgstr "%1$s теперь в контакте с %2$s"
msgid "%1$s poked %2$s"
msgstr "%1$s ткнул %2$s"
-#: ../../include/conversation.php:268 ../../Zotlabs/Module/Mood.php:75
+#: ../../include/conversation.php:268 ../../Zotlabs/Module/Mood.php:76
#, php-format
msgctxt "mood"
msgid "%1$s is %2$s"
msgstr "%1$s в %2$s"
-#: ../../include/conversation.php:483 ../../Zotlabs/Lib/ThreadItem.php:440
+#: ../../include/conversation.php:483 ../../Zotlabs/Lib/ThreadItem.php:443
msgid "This is an unsaved preview"
msgstr "Это несохранённый просмотр"
-#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1139
+#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1152
msgctxt "title"
msgid "Likes"
msgstr "Нравится"
-#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1139
+#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1152
msgctxt "title"
msgid "Dislikes"
msgstr "Не нравится"
-#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1140
+#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153
msgctxt "title"
msgid "Agree"
msgstr "Согласен"
-#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1140
+#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153
msgctxt "title"
msgid "Disagree"
msgstr "Не согласен"
-#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1140
+#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1153
msgctxt "title"
msgid "Abstain"
msgstr "Воздержался"
-#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1141
+#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154
msgctxt "title"
msgid "Attending"
msgstr "Посещаю"
-#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1141
+#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154
msgctxt "title"
msgid "Not attending"
msgstr "Не посещаю"
-#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1141
+#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1154
msgctxt "title"
msgid "Might attend"
msgstr "Возможно посещу"
@@ -2522,15 +2518,15 @@ msgstr "Выбрать"
#: ../../include/conversation.php:691 ../../include/conversation.php:736
#: ../../Zotlabs/Storage/Browser.php:291 ../../Zotlabs/Module/Cdav.php:942
#: ../../Zotlabs/Module/Cdav.php:1232 ../../Zotlabs/Module/Profiles.php:800
-#: ../../Zotlabs/Module/Photos.php:1205 ../../Zotlabs/Module/Oauth.php:174
+#: ../../Zotlabs/Module/Photos.php:1218 ../../Zotlabs/Module/Oauth.php:174
#: ../../Zotlabs/Module/Oauth2.php:195 ../../Zotlabs/Module/Editlayout.php:138
#: ../../Zotlabs/Module/Editblock.php:139
#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Admin/Profs.php:176
#: ../../Zotlabs/Module/Admin/Accounts.php:175
#: ../../Zotlabs/Module/Editwebpage.php:167 ../../Zotlabs/Module/Thing.php:267
-#: ../../Zotlabs/Module/Webpages.php:257 ../../Zotlabs/Module/Connedit.php:655
-#: ../../Zotlabs/Module/Connedit.php:924
+#: ../../Zotlabs/Module/Webpages.php:257 ../../Zotlabs/Module/Connedit.php:660
+#: ../../Zotlabs/Module/Connedit.php:929
#: ../../Zotlabs/Module/Connections.php:292
#: ../../Zotlabs/Module/Card_edit.php:129
#: ../../Zotlabs/Module/Article_edit.php:129
@@ -2574,17 +2570,17 @@ msgstr "Категории:"
msgid "Filed under:"
msgstr "Хранить под:"
-#: ../../include/conversation.php:766 ../../Zotlabs/Lib/ThreadItem.php:375
+#: ../../include/conversation.php:766 ../../Zotlabs/Lib/ThreadItem.php:378
#, php-format
msgid "from %s"
msgstr "от %s"
-#: ../../include/conversation.php:769 ../../Zotlabs/Lib/ThreadItem.php:378
+#: ../../include/conversation.php:769 ../../Zotlabs/Lib/ThreadItem.php:381
#, php-format
msgid "last edited: %s"
msgstr "последнее редактирование: %s"
-#: ../../include/conversation.php:770 ../../Zotlabs/Lib/ThreadItem.php:379
+#: ../../include/conversation.php:770 ../../Zotlabs/Lib/ThreadItem.php:382
#, php-format
msgid "Expires: %s"
msgstr "Срок действия: %s"
@@ -2593,8 +2589,8 @@ msgstr "Срок действия: %s"
msgid "View in context"
msgstr "Показать в контексте"
-#: ../../include/conversation.php:787 ../../Zotlabs/Module/Photos.php:1105
-#: ../../Zotlabs/Lib/ThreadItem.php:441
+#: ../../include/conversation.php:787 ../../Zotlabs/Module/Photos.php:1118
+#: ../../Zotlabs/Lib/ThreadItem.php:444
msgid "Please wait"
msgstr "Подождите пожалуйста"
@@ -2627,12 +2623,12 @@ msgid "Unfollow Thread"
msgstr "Прекратить отслеживать тему"
#: ../../include/conversation.php:1038 ../../include/nav.php:106
-#: ../../Zotlabs/Module/Connedit.php:595 ../../Zotlabs/Lib/Apps.php:319
+#: ../../Zotlabs/Module/Connedit.php:600 ../../Zotlabs/Lib/Apps.php:319
#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:57
msgid "View Profile"
msgstr "Просмотреть профиль"
-#: ../../include/conversation.php:1048 ../../Zotlabs/Module/Connedit.php:616
+#: ../../include/conversation.php:1048 ../../Zotlabs/Module/Connedit.php:621
msgid "Recent Activity"
msgstr "Последние действия"
@@ -2656,13 +2652,13 @@ msgstr "Ткнуть"
#: ../../include/conversation.php:1166 ../../Zotlabs/Storage/Browser.php:164
#: ../../Zotlabs/Module/Cdav.php:811 ../../Zotlabs/Module/Cdav.php:812
-#: ../../Zotlabs/Module/Cdav.php:819 ../../Zotlabs/Module/Photos.php:819
-#: ../../Zotlabs/Module/Photos.php:1275
+#: ../../Zotlabs/Module/Cdav.php:819 ../../Zotlabs/Module/Photos.php:832
+#: ../../Zotlabs/Module/Photos.php:1288
#: ../../Zotlabs/Module/Embedphotos.php:146
#: ../../Zotlabs/Widget/Portfolio.php:95 ../../Zotlabs/Widget/Album.php:84
#: ../../Zotlabs/Lib/Apps.php:994 ../../Zotlabs/Lib/Apps.php:1078
#: ../../Zotlabs/Lib/Activity.php:858
-#: ../../extend/addon/hzaddons/pubcrawl/as.php:964
+#: ../../extend/addon/hzaddons/pubcrawl/as.php:949
msgid "Unknown"
msgstr "Неизвестный"
@@ -2800,14 +2796,14 @@ msgstr "Комментарии включены"
msgid "Comments disabled"
msgstr "Комментарии отключены"
-#: ../../include/conversation.php:1356 ../../Zotlabs/Module/Photos.php:1125
+#: ../../include/conversation.php:1356 ../../Zotlabs/Module/Photos.php:1138
#: ../../Zotlabs/Module/Events.php:480 ../../Zotlabs/Module/Webpages.php:262
-#: ../../Zotlabs/Lib/ThreadItem.php:777
+#: ../../Zotlabs/Lib/ThreadItem.php:780
#: ../../extend/addon/hzaddons/hsse/hsse.php:153
msgid "Preview"
msgstr "Предварительный просмотр"
-#: ../../include/conversation.php:1389 ../../Zotlabs/Module/Photos.php:1104
+#: ../../include/conversation.php:1389 ../../Zotlabs/Module/Photos.php:1117
#: ../../Zotlabs/Module/Webpages.php:256 ../../Zotlabs/Module/Blocks.php:161
#: ../../Zotlabs/Module/Wiki.php:301 ../../Zotlabs/Module/Layouts.php:194
#: ../../Zotlabs/Widget/Cdav.php:124
@@ -2825,32 +2821,32 @@ msgstr "Название ссылки на страницу "
msgid "Post as"
msgstr "Опубликовать как"
-#: ../../include/conversation.php:1403 ../../Zotlabs/Lib/ThreadItem.php:768
+#: ../../include/conversation.php:1403 ../../Zotlabs/Lib/ThreadItem.php:771
#: ../../extend/addon/hzaddons/hsse/hsse.php:200
msgid "Bold"
msgstr "Жирный"
-#: ../../include/conversation.php:1404 ../../Zotlabs/Lib/ThreadItem.php:769
+#: ../../include/conversation.php:1404 ../../Zotlabs/Lib/ThreadItem.php:772
#: ../../extend/addon/hzaddons/hsse/hsse.php:201
msgid "Italic"
msgstr "Курсив"
-#: ../../include/conversation.php:1405 ../../Zotlabs/Lib/ThreadItem.php:770
+#: ../../include/conversation.php:1405 ../../Zotlabs/Lib/ThreadItem.php:773
#: ../../extend/addon/hzaddons/hsse/hsse.php:202
msgid "Underline"
msgstr "Подчеркнутый"
-#: ../../include/conversation.php:1406 ../../Zotlabs/Lib/ThreadItem.php:771
+#: ../../include/conversation.php:1406 ../../Zotlabs/Lib/ThreadItem.php:774
#: ../../extend/addon/hzaddons/hsse/hsse.php:203
msgid "Quote"
msgstr "Цитата"
-#: ../../include/conversation.php:1407 ../../Zotlabs/Lib/ThreadItem.php:772
+#: ../../include/conversation.php:1407 ../../Zotlabs/Lib/ThreadItem.php:775
#: ../../extend/addon/hzaddons/hsse/hsse.php:204
msgid "Code"
msgstr "Код"
-#: ../../include/conversation.php:1408 ../../Zotlabs/Lib/ThreadItem.php:774
+#: ../../include/conversation.php:1408 ../../Zotlabs/Lib/ThreadItem.php:777
#: ../../extend/addon/hzaddons/hsse/hsse.php:205
msgid "Attach/Upload file"
msgstr "Прикрепить/загрузить файл"
@@ -2872,7 +2868,7 @@ msgstr "Встроить изображение из ваших альбомов
#: ../../Zotlabs/Module/Admin/Addons.php:423
#: ../../Zotlabs/Module/Editwebpage.php:169
#: ../../Zotlabs/Module/Profile_photo.php:465
-#: ../../Zotlabs/Module/Editpost.php:109 ../../Zotlabs/Module/Connedit.php:925
+#: ../../Zotlabs/Module/Editpost.php:109 ../../Zotlabs/Module/Connedit.php:930
#: ../../Zotlabs/Module/Card_edit.php:131
#: ../../Zotlabs/Module/Article_edit.php:131 ../../Zotlabs/Module/Wiki.php:368
#: ../../Zotlabs/Module/Wiki.php:401 ../../Zotlabs/Module/Filer.php:55
@@ -2904,8 +2900,8 @@ msgstr "Отключить комментарии"
msgid "Toggle comments"
msgstr "Переключить комментарии"
-#: ../../include/conversation.php:1424 ../../Zotlabs/Module/Photos.php:700
-#: ../../Zotlabs/Module/Photos.php:1070 ../../Zotlabs/Module/Editblock.php:129
+#: ../../include/conversation.php:1424 ../../Zotlabs/Module/Photos.php:713
+#: ../../Zotlabs/Module/Photos.php:1083 ../../Zotlabs/Module/Editblock.php:129
#: ../../Zotlabs/Module/Card_edit.php:117
#: ../../Zotlabs/Module/Article_edit.php:117
#: ../../extend/addon/hzaddons/hsse/hsse.php:221
@@ -2940,12 +2936,12 @@ msgstr "Установить дату публикации"
#: ../../include/conversation.php:1458 ../../Zotlabs/Module/Mail.php:294
#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Module/Chat.php:221
-#: ../../Zotlabs/Lib/ThreadItem.php:781
+#: ../../Zotlabs/Lib/ThreadItem.php:784
#: ../../extend/addon/hzaddons/hsse/hsse.php:255
msgid "Encrypt text"
msgstr "Зашифровать текст"
-#: ../../include/conversation.php:1696 ../../Zotlabs/Module/Photos.php:1167
+#: ../../include/conversation.php:1696 ../../Zotlabs/Module/Photos.php:1180
#: ../../Zotlabs/Lib/ThreadItem.php:223
msgctxt "noun"
msgid "Dislike"
@@ -3053,12 +3049,12 @@ msgstr "Выбор дополнительного языка"
msgid "Delete this item?"
msgstr "Удалить этот элемент?"
-#: ../../include/js_strings.php:6 ../../Zotlabs/Module/Photos.php:1123
-#: ../../Zotlabs/Module/Photos.php:1241 ../../Zotlabs/Lib/ThreadItem.php:766
+#: ../../include/js_strings.php:6 ../../Zotlabs/Module/Photos.php:1136
+#: ../../Zotlabs/Module/Photos.php:1254 ../../Zotlabs/Lib/ThreadItem.php:769
msgid "Comment"
msgstr "Комментарий"
-#: ../../include/js_strings.php:7 ../../Zotlabs/Lib/ThreadItem.php:473
+#: ../../include/js_strings.php:7 ../../Zotlabs/Lib/ThreadItem.php:476
#, php-format
msgid "%s show all"
msgstr "%s показать всё"
@@ -3115,7 +3111,7 @@ msgid "Rate This Channel (this is public)"
msgstr "Оценкa этoго канала (общедоступно)"
#: ../../include/js_strings.php:20 ../../Zotlabs/Module/Rate.php:155
-#: ../../Zotlabs/Module/Connedit.php:871
+#: ../../Zotlabs/Module/Connedit.php:876
msgid "Rating"
msgstr "Оценка"
@@ -3413,9 +3409,9 @@ msgstr ""
#: ../../include/network.php:1778 ../../Zotlabs/Lib/Activity.php:1417
#: ../../Zotlabs/Lib/Activity.php:1614
-#: ../../extend/addon/hzaddons/pubcrawl/as.php:1222
-#: ../../extend/addon/hzaddons/pubcrawl/as.php:1377
-#: ../../extend/addon/hzaddons/pubcrawl/as.php:1556
+#: ../../extend/addon/hzaddons/pubcrawl/as.php:1204
+#: ../../extend/addon/hzaddons/pubcrawl/as.php:1359
+#: ../../extend/addon/hzaddons/pubcrawl/as.php:1538
msgid "ActivityPub"
msgstr ""
@@ -3423,7 +3419,7 @@ msgstr ""
#: ../../Zotlabs/Module/Profiles.php:787
#: ../../Zotlabs/Module/Admin/Accounts.php:171
#: ../../Zotlabs/Module/Admin/Accounts.php:183
-#: ../../Zotlabs/Module/Connedit.php:911
+#: ../../Zotlabs/Module/Connedit.php:916
#: ../../extend/addon/hzaddons/rtof/rtof.php:93
#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:56
#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:57
@@ -3479,7 +3475,7 @@ msgstr "YYYY-MM-DD или MM-DD"
msgid "Required"
msgstr "Требуется"
-#: ../../include/datetime.php:238 ../../boot.php:2558
+#: ../../include/datetime.php:238 ../../boot.php:2557
msgid "never"
msgstr "никогда"
@@ -3564,7 +3560,7 @@ msgstr "С Днем рождения %1$s !"
msgid "Visible to your default audience"
msgstr "Видно вашей аудитории по умолчанию."
-#: ../../include/acl_selectors.php:88 ../../Zotlabs/Module/Acl.php:120
+#: ../../include/acl_selectors.php:88 ../../Zotlabs/Module/Acl.php:121
#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
msgctxt "acl"
msgid "Profile"
@@ -3597,15 +3593,15 @@ msgstr "Показать"
msgid "Don't show"
msgstr "Не показывать"
-#: ../../include/acl_selectors.php:123 ../../Zotlabs/Module/Photos.php:704
-#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Chat.php:243
+#: ../../include/acl_selectors.php:123 ../../Zotlabs/Module/Photos.php:717
+#: ../../Zotlabs/Module/Photos.php:1086 ../../Zotlabs/Module/Chat.php:243
#: ../../Zotlabs/Module/Filestorage.php:170 ../../Zotlabs/Module/Thing.php:319
-#: ../../Zotlabs/Module/Thing.php:372 ../../Zotlabs/Module/Connedit.php:677
+#: ../../Zotlabs/Module/Thing.php:372 ../../Zotlabs/Module/Connedit.php:682
msgid "Permissions"
msgstr "Разрешения"
-#: ../../include/acl_selectors.php:125 ../../Zotlabs/Module/Photos.php:1295
-#: ../../Zotlabs/Lib/ThreadItem.php:435
+#: ../../include/acl_selectors.php:125 ../../Zotlabs/Module/Photos.php:1308
+#: ../../Zotlabs/Lib/ThreadItem.php:438
msgid "Close"
msgstr "Закрыть"
@@ -3629,37 +3625,37 @@ msgstr "Новое окно"
msgid "Open the selected location in a different window or browser tab"
msgstr "Открыть выбранное местоположение в другом окне или вкладке браузера"
-#: ../../include/connections.php:696 ../../include/event.php:1308
+#: ../../include/connections.php:696 ../../include/event.php:1311
#: ../../Zotlabs/Module/Cdav.php:1224 ../../Zotlabs/Module/Profiles.php:792
-#: ../../Zotlabs/Module/Connedit.php:916
+#: ../../Zotlabs/Module/Connedit.php:921
msgid "Mobile"
msgstr "Мобильный"
-#: ../../include/connections.php:697 ../../include/event.php:1309
+#: ../../include/connections.php:697 ../../include/event.php:1312
#: ../../Zotlabs/Module/Cdav.php:1225 ../../Zotlabs/Module/Profiles.php:793
-#: ../../Zotlabs/Module/Connedit.php:917
+#: ../../Zotlabs/Module/Connedit.php:922
msgid "Home"
msgstr "Домашний"
-#: ../../include/connections.php:698 ../../include/event.php:1310
+#: ../../include/connections.php:698 ../../include/event.php:1313
msgid "Home, Voice"
msgstr "Дом, голос"
-#: ../../include/connections.php:699 ../../include/event.php:1311
+#: ../../include/connections.php:699 ../../include/event.php:1314
msgid "Home, Fax"
msgstr "Дом, факс"
-#: ../../include/connections.php:700 ../../include/event.php:1312
+#: ../../include/connections.php:700 ../../include/event.php:1315
#: ../../Zotlabs/Module/Cdav.php:1226 ../../Zotlabs/Module/Profiles.php:794
-#: ../../Zotlabs/Module/Connedit.php:918
+#: ../../Zotlabs/Module/Connedit.php:923
msgid "Work"
msgstr "Рабочий"
-#: ../../include/connections.php:701 ../../include/event.php:1313
+#: ../../include/connections.php:701 ../../include/event.php:1316
msgid "Work, Voice"
msgstr "Работа, голос"
-#: ../../include/connections.php:702 ../../include/event.php:1314
+#: ../../include/connections.php:702 ../../include/event.php:1317
msgid "Work, Fax"
msgstr "Работа, факс"
@@ -3679,23 +3675,23 @@ msgstr "Окончание:"
msgid "This event has been added to your calendar."
msgstr "Это событие было добавлено в ваш календарь."
-#: ../../include/event.php:1227
+#: ../../include/event.php:1230
msgid "Not specified"
msgstr "Не указано"
-#: ../../include/event.php:1228
+#: ../../include/event.php:1231
msgid "Needs Action"
msgstr "Требует действия"
-#: ../../include/event.php:1229
+#: ../../include/event.php:1232
msgid "Completed"
msgstr "Завершено"
-#: ../../include/event.php:1230
+#: ../../include/event.php:1233
msgid "In Process"
msgstr "В процессе"
-#: ../../include/event.php:1231
+#: ../../include/event.php:1234
msgid "Cancelled"
msgstr "Отменено"
@@ -3753,7 +3749,7 @@ msgid "Account/Channel Settings"
msgstr "Настройки аккаунта / канала"
#: ../../include/nav.php:103 ../../include/nav.php:132
-#: ../../include/nav.php:151 ../../boot.php:1624
+#: ../../include/nav.php:151 ../../boot.php:1623
msgid "Logout"
msgstr "Выход"
@@ -3773,7 +3769,7 @@ msgstr "Управление / редактирование профилей"
msgid "Edit your profile"
msgstr "Редактировать профиль"
-#: ../../include/nav.php:118 ../../include/nav.php:122 ../../boot.php:1625
+#: ../../include/nav.php:118 ../../include/nav.php:122 ../../boot.php:1624
#: ../../Zotlabs/Lib/Apps.php:311
msgid "Login"
msgstr "Войти"
@@ -3790,7 +3786,7 @@ msgstr "Домой"
msgid "Log me out of this site"
msgstr "Выйти с этого сайта"
-#: ../../include/nav.php:156 ../../boot.php:1605
+#: ../../include/nav.php:156 ../../boot.php:1604
#: ../../Zotlabs/Module/Register.php:289
msgid "Register"
msgstr "Регистрация"
@@ -3818,7 +3814,7 @@ msgstr "Установка и конфигурация сайта"
#: ../../include/nav.php:293 ../../Zotlabs/Module/Defperms.php:256
#: ../../Zotlabs/Module/New_channel.php:157
#: ../../Zotlabs/Module/New_channel.php:164
-#: ../../Zotlabs/Module/Connedit.php:853
+#: ../../Zotlabs/Module/Connedit.php:858
#: ../../Zotlabs/Widget/Notifications.php:162
msgid "Loading"
msgstr "Загрузка"
@@ -3914,7 +3910,7 @@ msgid "View Webpages"
msgstr "Просмотр веб-страниц"
#: ../../include/nav.php:506 ../../Zotlabs/Module/Wiki.php:206
-#: ../../Zotlabs/Widget/Wiki_list.php:19
+#: ../../Zotlabs/Widget/Wiki_list.php:15
msgid "Wikis"
msgstr ""
@@ -3993,51 +3989,51 @@ msgstr "ошибка при записи базы данных."
msgid "Empty path"
msgstr "Пустое имя пути"
-#: ../../include/photo/photo_driver.php:741
+#: ../../include/photo/photo_driver.php:774
#: ../../Zotlabs/Module/Profile_photo.php:120
#: ../../Zotlabs/Module/Profile_photo.php:248
msgid "Profile Photos"
msgstr "Фотографии профиля"
-#: ../../boot.php:1604
+#: ../../boot.php:1603
msgid "Create an account to access services and applications"
msgstr "Создайте аккаунт для доступа к службам и приложениям"
-#: ../../boot.php:1628
+#: ../../boot.php:1627
msgid "Login/Email"
msgstr "Пользователь / email"
-#: ../../boot.php:1629
+#: ../../boot.php:1628
msgid "Password"
msgstr "Пароль"
-#: ../../boot.php:1630
+#: ../../boot.php:1629
msgid "Remember me"
msgstr "Запомнить меня"
-#: ../../boot.php:1633
+#: ../../boot.php:1632
msgid "Forgot your password?"
msgstr "Забыли пароль или логин?"
-#: ../../boot.php:1634 ../../Zotlabs/Module/Lostpass.php:91
+#: ../../boot.php:1633 ../../Zotlabs/Module/Lostpass.php:91
msgid "Password Reset"
msgstr "Сбросить пароль"
-#: ../../boot.php:2431
+#: ../../boot.php:2430
#, php-format
msgid "[$Projectname] Website SSL error for %s"
msgstr "[$Projectname] Ошибка SSL/TLS веб-сайта для %s"
-#: ../../boot.php:2436
+#: ../../boot.php:2435
msgid "Website SSL certificate is not valid. Please correct."
msgstr "SSL/TLS сертификат веб-сайт недействителен. Исправьте это."
-#: ../../boot.php:2552
+#: ../../boot.php:2551
#, php-format
msgid "[$Projectname] Cron tasks not running on %s"
msgstr "[$Projectname] Задания Cron не запущены на %s"
-#: ../../boot.php:2557
+#: ../../boot.php:2556
msgid "Cron/Scheduled tasks not running."
msgstr "Задания Cron / планировщика не запущены."
@@ -4072,7 +4068,7 @@ msgstr "Общие"
#: ../../Zotlabs/Storage/Browser.php:276 ../../Zotlabs/Storage/Browser.php:390
#: ../../Zotlabs/Module/Cdav.php:1230 ../../Zotlabs/Module/Profiles.php:798
#: ../../Zotlabs/Module/New_channel.php:189 ../../Zotlabs/Module/Menu.php:181
-#: ../../Zotlabs/Module/Webpages.php:254 ../../Zotlabs/Module/Connedit.php:922
+#: ../../Zotlabs/Module/Webpages.php:254 ../../Zotlabs/Module/Connedit.php:927
#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Articles.php:108
#: ../../Zotlabs/Module/Cards.php:109 ../../Zotlabs/Module/Layouts.php:185
#: ../../Zotlabs/Widget/Cdav.php:128 ../../Zotlabs/Widget/Cdav.php:165
@@ -4092,7 +4088,7 @@ msgstr "Удалено администратором"
#: ../../Zotlabs/Module/Sharedwithme.php:104 ../../Zotlabs/Module/Chat.php:259
#: ../../Zotlabs/Module/Oauth2.php:118 ../../Zotlabs/Module/Oauth2.php:146
#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Connedit.php:907 ../../Zotlabs/Module/Group.php:144
+#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Group.php:144
#: ../../Zotlabs/Module/Wiki.php:218
#: ../../Zotlabs/Widget/Wiki_page_history.php:22
#: ../../Zotlabs/Lib/NativeWikiPage.php:561
@@ -4131,7 +4127,7 @@ msgstr "Создать новую папку"
msgid "Upload file"
msgstr "Загрузить файл"
-#: ../../Zotlabs/Storage/Browser.php:392 ../../Zotlabs/Module/Photos.php:714
+#: ../../Zotlabs/Storage/Browser.php:392 ../../Zotlabs/Module/Photos.php:727
#: ../../Zotlabs/Module/Cover_photo.php:395
#: ../../Zotlabs/Module/Embedphotos.php:158
#: ../../Zotlabs/Module/Profile_photo.php:459
@@ -4280,7 +4276,7 @@ msgid ""
"to correctly use this feature."
msgstr "Предупреждение. Изменение некоторых настроек может привести к неработоспособности вашего канала. Пожалуйста, покиньте эту страницу, если вы точно не значете, как правильно использовать эту функцию."
-#: ../../Zotlabs/Module/Defperms.php:67 ../../Zotlabs/Module/Connedit.php:80
+#: ../../Zotlabs/Module/Defperms.php:67 ../../Zotlabs/Module/Connedit.php:81
msgid "Could not access contact record."
msgstr "Не удалось получить доступ к записи контакта."
@@ -4308,7 +4304,7 @@ msgstr "Приложение \"Разрешения по умолчанию\""
#: ../../Zotlabs/Module/Uexport.php:61 ../../Zotlabs/Module/Bookmarks.php:78
#: ../../Zotlabs/Module/Probe.php:18 ../../Zotlabs/Module/Tokens.php:99
#: ../../Zotlabs/Module/Notes.php:55 ../../Zotlabs/Module/Webpages.php:48
-#: ../../Zotlabs/Module/Group.php:101 ../../Zotlabs/Module/Mood.php:132
+#: ../../Zotlabs/Module/Group.php:101 ../../Zotlabs/Module/Mood.php:134
#: ../../Zotlabs/Module/Lang.php:17 ../../Zotlabs/Module/Randprof.php:29
#: ../../Zotlabs/Module/Invite.php:110 ../../Zotlabs/Module/Articles.php:43
#: ../../Zotlabs/Module/Connect.php:104 ../../Zotlabs/Module/Pdledit.php:42
@@ -4321,11 +4317,11 @@ msgstr "не установлено"
msgid "Set custom default permissions for new connections"
msgstr "Настройка пользовательских разрешений по умолчанию для новых подключений "
-#: ../../Zotlabs/Module/Defperms.php:254 ../../Zotlabs/Module/Connedit.php:851
+#: ../../Zotlabs/Module/Defperms.php:254 ../../Zotlabs/Module/Connedit.php:856
msgid "Connection Default Permissions"
msgstr "Разрешения по умолчанию для контакта"
-#: ../../Zotlabs/Module/Defperms.php:255 ../../Zotlabs/Module/Connedit.php:852
+#: ../../Zotlabs/Module/Defperms.php:255 ../../Zotlabs/Module/Connedit.php:857
msgid "Apply these permissions automatically"
msgstr "Применить эти разрешения автоматически"
@@ -4335,15 +4331,15 @@ msgid ""
"If enabled, connection requests will be approved without your interaction"
msgstr "Если включено, запросы контактов будут одобрены без вашего участия"
-#: ../../Zotlabs/Module/Defperms.php:256 ../../Zotlabs/Module/Connedit.php:853
+#: ../../Zotlabs/Module/Defperms.php:256 ../../Zotlabs/Module/Connedit.php:858
msgid "Permission role"
msgstr "Роль разрешения"
-#: ../../Zotlabs/Module/Defperms.php:257 ../../Zotlabs/Module/Connedit.php:854
+#: ../../Zotlabs/Module/Defperms.php:257 ../../Zotlabs/Module/Connedit.php:859
msgid "Add permission role"
msgstr "Добавить роль разрешения"
-#: ../../Zotlabs/Module/Defperms.php:261 ../../Zotlabs/Module/Connedit.php:867
+#: ../../Zotlabs/Module/Defperms.php:261 ../../Zotlabs/Module/Connedit.php:872
msgid ""
"The permissions indicated on this page will be applied to all new "
"connections."
@@ -4354,17 +4350,17 @@ msgid "Automatic approval settings"
msgstr "Настройки автоматического одобрения"
#: ../../Zotlabs/Module/Defperms.php:264 ../../Zotlabs/Module/Permcats.php:123
-#: ../../Zotlabs/Module/Tokens.php:183 ../../Zotlabs/Module/Connedit.php:887
+#: ../../Zotlabs/Module/Tokens.php:183 ../../Zotlabs/Module/Connedit.php:892
msgid "inherited"
msgstr "наследуется"
#: ../../Zotlabs/Module/Defperms.php:266 ../../Zotlabs/Module/Permcats.php:121
-#: ../../Zotlabs/Module/Tokens.php:181 ../../Zotlabs/Module/Connedit.php:892
+#: ../../Zotlabs/Module/Tokens.php:181 ../../Zotlabs/Module/Connedit.php:897
msgid "My Settings"
msgstr "Мои настройки"
#: ../../Zotlabs/Module/Defperms.php:269 ../../Zotlabs/Module/Permcats.php:126
-#: ../../Zotlabs/Module/Tokens.php:186 ../../Zotlabs/Module/Connedit.php:894
+#: ../../Zotlabs/Module/Tokens.php:186 ../../Zotlabs/Module/Connedit.php:899
msgid "Individual Permissions"
msgstr "Индивидуальные разрешения"
@@ -4405,7 +4401,7 @@ msgid "Permission category name"
msgstr "Наименование категории разрешений"
#: ../../Zotlabs/Module/Permcats.php:127 ../../Zotlabs/Module/Tokens.php:187
-#: ../../Zotlabs/Module/Connedit.php:895
+#: ../../Zotlabs/Module/Connedit.php:900
msgid ""
"Some permissions may be inherited from your channel's <a href=\"settings"
"\"><strong>privacy settings</strong></a>, which have higher priority than "
@@ -4425,69 +4421,69 @@ msgstr "Запрос Xchan начинается с (или webbie):"
msgid "Not found."
msgstr "Не найдено."
-#: ../../Zotlabs/Module/Dreport.php:45
+#: ../../Zotlabs/Module/Dreport.php:56
msgid "Invalid message"
msgstr "Неверное сообщение"
-#: ../../Zotlabs/Module/Dreport.php:78
+#: ../../Zotlabs/Module/Dreport.php:89
msgid "no results"
msgstr "Ничего не найдено."
-#: ../../Zotlabs/Module/Dreport.php:93
+#: ../../Zotlabs/Module/Dreport.php:103
msgid "channel sync processed"
msgstr "синхронизация канала завершена"
-#: ../../Zotlabs/Module/Dreport.php:97
+#: ../../Zotlabs/Module/Dreport.php:107
msgid "queued"
msgstr "в очереди"
-#: ../../Zotlabs/Module/Dreport.php:101
+#: ../../Zotlabs/Module/Dreport.php:111
msgid "posted"
msgstr "опубликовано"
-#: ../../Zotlabs/Module/Dreport.php:105
+#: ../../Zotlabs/Module/Dreport.php:115
msgid "accepted for delivery"
msgstr "принято к доставке"
-#: ../../Zotlabs/Module/Dreport.php:109
+#: ../../Zotlabs/Module/Dreport.php:119
msgid "updated"
msgstr "обновлено"
-#: ../../Zotlabs/Module/Dreport.php:112
+#: ../../Zotlabs/Module/Dreport.php:122
msgid "update ignored"
msgstr "обновление игнорируется"
-#: ../../Zotlabs/Module/Dreport.php:115
+#: ../../Zotlabs/Module/Dreport.php:125
msgid "permission denied"
msgstr "доступ запрещен"
-#: ../../Zotlabs/Module/Dreport.php:119
+#: ../../Zotlabs/Module/Dreport.php:129
msgid "recipient not found"
msgstr "получатель не найден"
-#: ../../Zotlabs/Module/Dreport.php:122
+#: ../../Zotlabs/Module/Dreport.php:132
msgid "mail recalled"
msgstr "почта отозвана"
-#: ../../Zotlabs/Module/Dreport.php:125
+#: ../../Zotlabs/Module/Dreport.php:135
msgid "duplicate mail received"
msgstr "получено дублирующее сообщение"
-#: ../../Zotlabs/Module/Dreport.php:128
+#: ../../Zotlabs/Module/Dreport.php:138
msgid "mail delivered"
msgstr "почта доставлен"
-#: ../../Zotlabs/Module/Dreport.php:148
+#: ../../Zotlabs/Module/Dreport.php:158
#, php-format
msgid "Delivery report for %1$s"
msgstr "Отчёт о доставке для %1$s"
-#: ../../Zotlabs/Module/Dreport.php:151 ../../Zotlabs/Widget/Wiki_pages.php:41
+#: ../../Zotlabs/Module/Dreport.php:161 ../../Zotlabs/Widget/Wiki_pages.php:41
#: ../../Zotlabs/Widget/Wiki_pages.php:98
msgid "Options"
msgstr "Параметры"
-#: ../../Zotlabs/Module/Dreport.php:152
+#: ../../Zotlabs/Module/Dreport.php:162
msgid "Redeliver"
msgstr "Доставить повторно"
@@ -4495,29 +4491,29 @@ msgstr "Доставить повторно"
msgid "No such group"
msgstr "Нет такой группы"
-#: ../../Zotlabs/Module/Network.php:148
+#: ../../Zotlabs/Module/Network.php:149
msgid "No such channel"
msgstr "Нет такого канала"
-#: ../../Zotlabs/Module/Network.php:163 ../../Zotlabs/Module/Channel.php:133
+#: ../../Zotlabs/Module/Network.php:164 ../../Zotlabs/Module/Channel.php:177
msgid "Search Results For:"
msgstr "Результаты поиска для:"
-#: ../../Zotlabs/Module/Network.php:193 ../../Zotlabs/Module/Display.php:80
-#: ../../Zotlabs/Module/Pubstream.php:94 ../../Zotlabs/Module/Channel.php:168
+#: ../../Zotlabs/Module/Network.php:194 ../../Zotlabs/Module/Display.php:80
+#: ../../Zotlabs/Module/Pubstream.php:94 ../../Zotlabs/Module/Channel.php:212
#: ../../Zotlabs/Module/Hq.php:134
msgid "Reset form"
msgstr "Очистить форму"
-#: ../../Zotlabs/Module/Network.php:231
+#: ../../Zotlabs/Module/Network.php:233
msgid "Privacy group is empty"
msgstr "Группа безопасности пуста"
-#: ../../Zotlabs/Module/Network.php:242
+#: ../../Zotlabs/Module/Network.php:243
msgid "Privacy group: "
msgstr "Группа безопасности: "
-#: ../../Zotlabs/Module/Network.php:291
+#: ../../Zotlabs/Module/Network.php:316
#: ../../extend/addon/hzaddons/redred/redred.php:65
msgid "Invalid channel."
msgstr "Недействительный канал."
@@ -4559,40 +4555,40 @@ msgstr "Общих контактов нет."
msgid "View Common Connections"
msgstr "Просмотр общий контактов"
-#: ../../Zotlabs/Module/Acl.php:359
+#: ../../Zotlabs/Module/Acl.php:360
msgid "network"
msgstr "сеть"
-#: ../../Zotlabs/Module/Item.php:194
+#: ../../Zotlabs/Module/Item.php:196
msgid "Unable to locate original post."
msgstr "Не удалось найти оригинальную публикацию."
-#: ../../Zotlabs/Module/Item.php:479
+#: ../../Zotlabs/Module/Item.php:483
msgid "Empty post discarded."
msgstr "Пустая публикация отклонена."
-#: ../../Zotlabs/Module/Item.php:866
+#: ../../Zotlabs/Module/Item.php:892
msgid "Duplicate post suppressed."
msgstr "Подавлена дублирующаяся публикация."
-#: ../../Zotlabs/Module/Item.php:1011
+#: ../../Zotlabs/Module/Item.php:1037
msgid "System error. Post not saved."
msgstr "Системная ошибка. Публикация не сохранена."
-#: ../../Zotlabs/Module/Item.php:1047
+#: ../../Zotlabs/Module/Item.php:1073
msgid "Your comment is awaiting approval."
msgstr "Ваш комментарий ожидает одобрения."
-#: ../../Zotlabs/Module/Item.php:1164
+#: ../../Zotlabs/Module/Item.php:1190
msgid "Unable to obtain post information from database."
msgstr "Невозможно получить информацию о публикации из базы данных"
-#: ../../Zotlabs/Module/Item.php:1171
+#: ../../Zotlabs/Module/Item.php:1197
#, php-format
msgid "You have reached your limit of %1$.0f top level posts."
msgstr "Вы достигли вашего ограничения в %1$.0f публикаций высокого уровня."
-#: ../../Zotlabs/Module/Item.php:1178
+#: ../../Zotlabs/Module/Item.php:1204
#, php-format
msgid "You have reached your limit of %1$.0f webpages."
msgstr "Вы достигли вашего ограничения в %1$.0f страниц."
@@ -4602,13 +4598,13 @@ msgid "Some blurb about what to do when you're new here"
msgstr "Некоторые предложения о том, что делать, если вы здесь новичок "
#: ../../Zotlabs/Module/Display.php:29 ../../Zotlabs/Module/Directory.php:67
-#: ../../Zotlabs/Module/Directory.php:72 ../../Zotlabs/Module/Photos.php:545
+#: ../../Zotlabs/Module/Directory.php:72 ../../Zotlabs/Module/Photos.php:558
#: ../../Zotlabs/Module/Viewconnections.php:23
#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Search.php:17
msgid "Public access denied."
msgstr "Публичный доступ запрещен."
-#: ../../Zotlabs/Module/Display.php:374 ../../Zotlabs/Module/Channel.php:424
+#: ../../Zotlabs/Module/Display.php:374 ../../Zotlabs/Module/Channel.php:468
msgid ""
"You must enable javascript for your browser to be able to view this content."
msgstr "Для просмотра этого содержимого в вашем браузере должен быть включён JavaScript"
@@ -4649,11 +4645,11 @@ msgstr "событие опубликовано"
msgid "shared a file with you"
msgstr "с вами поделились файлом"
-#: ../../Zotlabs/Module/Ping.php:659
+#: ../../Zotlabs/Module/Ping.php:665
msgid "Private forum"
msgstr "Частный форум"
-#: ../../Zotlabs/Module/Ping.php:659
+#: ../../Zotlabs/Module/Ping.php:665
msgid "Public forum"
msgstr "Публичный форум"
@@ -4858,13 +4854,13 @@ msgstr "Дата и время окончания"
msgid "Description"
msgstr "Описание"
-#: ../../Zotlabs/Module/Cdav.php:924 ../../Zotlabs/Module/Photos.php:973
+#: ../../Zotlabs/Module/Cdav.php:924 ../../Zotlabs/Module/Photos.php:986
#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Cal.php:345
msgid "Previous"
msgstr "Предыдущая"
-#: ../../Zotlabs/Module/Cdav.php:925 ../../Zotlabs/Module/Photos.php:982
+#: ../../Zotlabs/Module/Cdav.php:925 ../../Zotlabs/Module/Photos.php:995
#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Events.php:700
#: ../../Zotlabs/Module/Cal.php:339 ../../Zotlabs/Module/Cal.php:346
#: ../../Zotlabs/Module/Setup.php:263
@@ -4920,49 +4916,49 @@ msgstr "Удалить всё"
msgid "Sorry! Editing of recurrent events is not yet implemented."
msgstr "Простите, но редактирование повторяющихся событий пока не реализовано."
-#: ../../Zotlabs/Module/Cdav.php:1216 ../../Zotlabs/Module/Connedit.php:908
+#: ../../Zotlabs/Module/Cdav.php:1216 ../../Zotlabs/Module/Connedit.php:913
msgid "Organisation"
msgstr "Организация"
-#: ../../Zotlabs/Module/Cdav.php:1217 ../../Zotlabs/Module/Connedit.php:909
+#: ../../Zotlabs/Module/Cdav.php:1217 ../../Zotlabs/Module/Connedit.php:914
msgid "Title"
msgstr "Наименование"
#: ../../Zotlabs/Module/Cdav.php:1218 ../../Zotlabs/Module/Profiles.php:786
-#: ../../Zotlabs/Module/Connedit.php:910
+#: ../../Zotlabs/Module/Connedit.php:915
msgid "Phone"
msgstr "Телефон"
#: ../../Zotlabs/Module/Cdav.php:1220 ../../Zotlabs/Module/Profiles.php:788
-#: ../../Zotlabs/Module/Connedit.php:912
+#: ../../Zotlabs/Module/Connedit.php:917
msgid "Instant messenger"
msgstr "Мессенджер"
#: ../../Zotlabs/Module/Cdav.php:1221 ../../Zotlabs/Module/Profiles.php:789
-#: ../../Zotlabs/Module/Connedit.php:913
+#: ../../Zotlabs/Module/Connedit.php:918
msgid "Website"
msgstr "Веб-сайт"
#: ../../Zotlabs/Module/Cdav.php:1222 ../../Zotlabs/Module/Profiles.php:502
#: ../../Zotlabs/Module/Profiles.php:790 ../../Zotlabs/Module/Locs.php:118
#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Connedit.php:914
+#: ../../Zotlabs/Module/Connedit.php:919
msgid "Address"
msgstr "Адрес"
#: ../../Zotlabs/Module/Cdav.php:1223 ../../Zotlabs/Module/Profiles.php:791
-#: ../../Zotlabs/Module/Connedit.php:915
+#: ../../Zotlabs/Module/Connedit.php:920
msgid "Note"
msgstr "Заметка"
#: ../../Zotlabs/Module/Cdav.php:1228 ../../Zotlabs/Module/Profiles.php:796
-#: ../../Zotlabs/Module/Connedit.php:920
+#: ../../Zotlabs/Module/Connedit.php:925
#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:368
msgid "Add Contact"
msgstr "Добавить контакт"
#: ../../Zotlabs/Module/Cdav.php:1229 ../../Zotlabs/Module/Profiles.php:797
-#: ../../Zotlabs/Module/Connedit.php:921
+#: ../../Zotlabs/Module/Connedit.php:926
msgid "Add Field"
msgstr "Добавить поле"
@@ -4970,36 +4966,36 @@ msgstr "Добавить поле"
#: ../../Zotlabs/Module/Oauth.php:53 ../../Zotlabs/Module/Oauth.php:137
#: ../../Zotlabs/Module/Oauth2.php:58 ../../Zotlabs/Module/Oauth2.php:144
#: ../../Zotlabs/Module/Admin/Addons.php:453
-#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Lib/Apps.php:513
+#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Lib/Apps.php:513
msgid "Update"
msgstr "Обновить"
-#: ../../Zotlabs/Module/Cdav.php:1234 ../../Zotlabs/Module/Connedit.php:926
+#: ../../Zotlabs/Module/Cdav.php:1234 ../../Zotlabs/Module/Connedit.php:931
msgid "P.O. Box"
msgstr "абонентский ящик"
-#: ../../Zotlabs/Module/Cdav.php:1235 ../../Zotlabs/Module/Connedit.php:927
+#: ../../Zotlabs/Module/Cdav.php:1235 ../../Zotlabs/Module/Connedit.php:932
msgid "Additional"
msgstr "Дополнительно"
-#: ../../Zotlabs/Module/Cdav.php:1236 ../../Zotlabs/Module/Connedit.php:928
+#: ../../Zotlabs/Module/Cdav.php:1236 ../../Zotlabs/Module/Connedit.php:933
msgid "Street"
msgstr "Улица"
-#: ../../Zotlabs/Module/Cdav.php:1237 ../../Zotlabs/Module/Connedit.php:929
+#: ../../Zotlabs/Module/Cdav.php:1237 ../../Zotlabs/Module/Connedit.php:934
msgid "Locality"
msgstr "Населённый пункт"
-#: ../../Zotlabs/Module/Cdav.php:1238 ../../Zotlabs/Module/Connedit.php:930
+#: ../../Zotlabs/Module/Cdav.php:1238 ../../Zotlabs/Module/Connedit.php:935
msgid "Region"
msgstr "Регион"
-#: ../../Zotlabs/Module/Cdav.php:1239 ../../Zotlabs/Module/Connedit.php:931
+#: ../../Zotlabs/Module/Cdav.php:1239 ../../Zotlabs/Module/Connedit.php:936
msgid "ZIP Code"
msgstr "Индекс"
#: ../../Zotlabs/Module/Cdav.php:1240 ../../Zotlabs/Module/Profiles.php:757
-#: ../../Zotlabs/Module/Connedit.php:932
+#: ../../Zotlabs/Module/Connedit.php:937
msgid "Country"
msgstr "Страна"
@@ -5011,12 +5007,12 @@ msgstr "Календарь по умолчанию"
msgid "Default Addressbook"
msgstr "Адресная книга по умолчанию"
-#: ../../Zotlabs/Module/Profile.php:45 ../../Zotlabs/Module/Channel.php:54
+#: ../../Zotlabs/Module/Profile.php:45 ../../Zotlabs/Module/Channel.php:98
#: ../../Zotlabs/Module/Hcard.php:37
msgid "Posts and comments"
msgstr "Публикации и комментарии"
-#: ../../Zotlabs/Module/Profile.php:52 ../../Zotlabs/Module/Channel.php:61
+#: ../../Zotlabs/Module/Profile.php:52 ../../Zotlabs/Module/Channel.php:105
#: ../../Zotlabs/Module/Hcard.php:44
msgid "Only posts"
msgstr "Только публикации"
@@ -5026,7 +5022,7 @@ msgid "vcard"
msgstr "vCard"
#: ../../Zotlabs/Module/Ochannel.php:32 ../../Zotlabs/Module/Chat.php:31
-#: ../../Zotlabs/Module/Channel.php:39
+#: ../../Zotlabs/Module/Channel.php:41
#: ../../extend/addon/hzaddons/chess/chess.php:508
msgid "You must be logged in to see this page."
msgstr "Вы должны авторизоваться, чтобы увидеть эту страницу."
@@ -5039,12 +5035,12 @@ msgstr "Нет новых оповещений системы."
msgid "System Notifications"
msgstr "Системные оповещения "
-#: ../../Zotlabs/Module/Impel.php:183
+#: ../../Zotlabs/Module/Impel.php:185
#, php-format
msgid "%s element installed"
msgstr "%s элемент установлен"
-#: ../../Zotlabs/Module/Impel.php:186
+#: ../../Zotlabs/Module/Impel.php:188
#, php-format
msgid "%s element installation failed"
msgstr "%sустановка элемента неудачна."
@@ -5179,23 +5175,15 @@ msgstr "Близкие к просрочке аккаунты"
msgid "Channels"
msgstr "Каналы"
-#: ../../Zotlabs/Module/Admin.php:115 ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Основной"
-
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Clones"
-msgstr "Клоны"
-
-#: ../../Zotlabs/Module/Admin.php:122
+#: ../../Zotlabs/Module/Admin.php:120
msgid "Message queues"
msgstr "Очередь сообщений"
-#: ../../Zotlabs/Module/Admin.php:136
+#: ../../Zotlabs/Module/Admin.php:134
msgid "Your software should be updated"
msgstr "Ваше программное обеспечение должно быть обновлено"
-#: ../../Zotlabs/Module/Admin.php:140 ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin.php:138 ../../Zotlabs/Module/Admin/Logs.php:82
#: ../../Zotlabs/Module/Admin/Channels.php:145
#: ../../Zotlabs/Module/Admin/Security.php:92
#: ../../Zotlabs/Module/Admin/Addons.php:341
@@ -5207,35 +5195,35 @@ msgstr "Ваше программное обеспечение должно бы
msgid "Administration"
msgstr "Администрирование"
-#: ../../Zotlabs/Module/Admin.php:141
+#: ../../Zotlabs/Module/Admin.php:139
msgid "Summary"
msgstr "Резюме"
-#: ../../Zotlabs/Module/Admin.php:144
+#: ../../Zotlabs/Module/Admin.php:142
msgid "Registered accounts"
msgstr "Зарегистрированные аккаунты"
-#: ../../Zotlabs/Module/Admin.php:145
+#: ../../Zotlabs/Module/Admin.php:143
msgid "Pending registrations"
msgstr "Ждут утверждения"
-#: ../../Zotlabs/Module/Admin.php:146
+#: ../../Zotlabs/Module/Admin.php:144
msgid "Registered channels"
msgstr "Зарегистрированные каналы"
-#: ../../Zotlabs/Module/Admin.php:147
+#: ../../Zotlabs/Module/Admin.php:145
msgid "Active addons"
msgstr "Активные расширения"
-#: ../../Zotlabs/Module/Admin.php:148
+#: ../../Zotlabs/Module/Admin.php:146
msgid "Version"
msgstr "Версия системы"
-#: ../../Zotlabs/Module/Admin.php:149
+#: ../../Zotlabs/Module/Admin.php:147
msgid "Repository version (master)"
msgstr "Версия репозитория (master)"
-#: ../../Zotlabs/Module/Admin.php:150
+#: ../../Zotlabs/Module/Admin.php:148
msgid "Repository version (dev)"
msgstr "Версия репозитория (dev)"
@@ -5511,173 +5499,173 @@ msgstr "Альбом не найден."
msgid "Delete Album"
msgstr "Удалить альбом"
-#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1085
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1098
msgid "Delete Photo"
msgstr "Удалить фотографию"
-#: ../../Zotlabs/Module/Photos.php:556
+#: ../../Zotlabs/Module/Photos.php:569
msgid "No photos selected"
msgstr "Никакие фотографии не выбраны"
-#: ../../Zotlabs/Module/Photos.php:605
+#: ../../Zotlabs/Module/Photos.php:618
msgid "Access to this item is restricted."
msgstr "Доступ к этому элементу ограничен."
-#: ../../Zotlabs/Module/Photos.php:648
+#: ../../Zotlabs/Module/Photos.php:661
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr "Вы использовали %1$.2f мегабайт из %2$.2f для хранения фото."
-#: ../../Zotlabs/Module/Photos.php:651
+#: ../../Zotlabs/Module/Photos.php:664
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr "Вы использовали %1$.2f мегабайт для хранения фото."
-#: ../../Zotlabs/Module/Photos.php:693
+#: ../../Zotlabs/Module/Photos.php:706
msgid "Upload Photos"
msgstr "Загрузить фотографии"
-#: ../../Zotlabs/Module/Photos.php:697
+#: ../../Zotlabs/Module/Photos.php:710
msgid "Enter an album name"
msgstr "Введите название альбома"
-#: ../../Zotlabs/Module/Photos.php:698
+#: ../../Zotlabs/Module/Photos.php:711
msgid "or select an existing album (doubleclick)"
msgstr "или выберите существующий альбом (двойной щелчок)"
-#: ../../Zotlabs/Module/Photos.php:699
+#: ../../Zotlabs/Module/Photos.php:712
msgid "Create a status post for this upload"
msgstr "Сделать публикацию о статусе для этой загрузки"
-#: ../../Zotlabs/Module/Photos.php:701
+#: ../../Zotlabs/Module/Photos.php:714
msgid "Description (optional)"
msgstr "Описание (необязательно)"
-#: ../../Zotlabs/Module/Photos.php:787
+#: ../../Zotlabs/Module/Photos.php:800
msgid "Show Newest First"
msgstr "Показать новые первыми"
-#: ../../Zotlabs/Module/Photos.php:789
+#: ../../Zotlabs/Module/Photos.php:802
msgid "Show Oldest First"
msgstr "Показать старые первыми"
-#: ../../Zotlabs/Module/Photos.php:813 ../../Zotlabs/Module/Photos.php:1352
+#: ../../Zotlabs/Module/Photos.php:826 ../../Zotlabs/Module/Photos.php:1365
#: ../../Zotlabs/Module/Embedphotos.php:140
#: ../../Zotlabs/Widget/Portfolio.php:87 ../../Zotlabs/Widget/Album.php:78
msgid "View Photo"
msgstr "Посмотреть фотографию"
-#: ../../Zotlabs/Module/Photos.php:844 ../../Zotlabs/Module/Embedphotos.php:156
+#: ../../Zotlabs/Module/Photos.php:857 ../../Zotlabs/Module/Embedphotos.php:156
#: ../../Zotlabs/Widget/Portfolio.php:108 ../../Zotlabs/Widget/Album.php:95
msgid "Edit Album"
msgstr "Редактировать Фотоальбом"
-#: ../../Zotlabs/Module/Photos.php:846 ../../Zotlabs/Module/Photos.php:1383
+#: ../../Zotlabs/Module/Photos.php:859 ../../Zotlabs/Module/Photos.php:1396
msgid "Add Photos"
msgstr "Добавить фотографии"
-#: ../../Zotlabs/Module/Photos.php:894
+#: ../../Zotlabs/Module/Photos.php:907
msgid "Permission denied. Access to this item may be restricted."
msgstr "Доступ запрещен. Доступ к этому элементу может быть ограничен."
-#: ../../Zotlabs/Module/Photos.php:896
+#: ../../Zotlabs/Module/Photos.php:909
msgid "Photo not available"
msgstr "Фотография не доступна"
-#: ../../Zotlabs/Module/Photos.php:954
+#: ../../Zotlabs/Module/Photos.php:967
msgid "Use as profile photo"
msgstr "Использовать в качестве фотографии профиля"
-#: ../../Zotlabs/Module/Photos.php:955
+#: ../../Zotlabs/Module/Photos.php:968
msgid "Use as cover photo"
msgstr "Использовать в качестве фотографии обложки"
-#: ../../Zotlabs/Module/Photos.php:962
+#: ../../Zotlabs/Module/Photos.php:975
msgid "Private Photo"
msgstr "Личная фотография"
-#: ../../Zotlabs/Module/Photos.php:977
+#: ../../Zotlabs/Module/Photos.php:990
msgid "View Full Size"
msgstr "Посмотреть в полный размер"
-#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../Zotlabs/Module/Photos.php:1035 ../../Zotlabs/Module/Tagrm.php:137
#: ../../Zotlabs/Module/Admin/Addons.php:455
#: ../../extend/addon/hzaddons/superblock/Mod_Superblock.php:91
msgid "Remove"
msgstr "Удалить"
-#: ../../Zotlabs/Module/Photos.php:1059
+#: ../../Zotlabs/Module/Photos.php:1072
msgid "Edit photo"
msgstr "Редактировать фотографию"
-#: ../../Zotlabs/Module/Photos.php:1061
+#: ../../Zotlabs/Module/Photos.php:1074
msgid "Rotate CW (right)"
msgstr "Повернуть CW (направо)"
-#: ../../Zotlabs/Module/Photos.php:1062
+#: ../../Zotlabs/Module/Photos.php:1075
msgid "Rotate CCW (left)"
msgstr "Повернуть CCW (налево)"
-#: ../../Zotlabs/Module/Photos.php:1065
+#: ../../Zotlabs/Module/Photos.php:1078
msgid "Move photo to album"
msgstr "Переместить фотографию в альбом"
-#: ../../Zotlabs/Module/Photos.php:1066
+#: ../../Zotlabs/Module/Photos.php:1079
msgid "Enter a new album name"
msgstr "Введите новое название альбома"
-#: ../../Zotlabs/Module/Photos.php:1067
+#: ../../Zotlabs/Module/Photos.php:1080
msgid "or select an existing one (doubleclick)"
msgstr "или выбрать существующую (двойной щелчок)"
-#: ../../Zotlabs/Module/Photos.php:1072
+#: ../../Zotlabs/Module/Photos.php:1085
msgid "Add a Tag"
msgstr "Добавить тег"
-#: ../../Zotlabs/Module/Photos.php:1080
+#: ../../Zotlabs/Module/Photos.php:1093
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr "Пример: @bob, @Barbara_Jensen, @jim@example.com"
-#: ../../Zotlabs/Module/Photos.php:1083
+#: ../../Zotlabs/Module/Photos.php:1096
msgid "Flag as adult in album view"
msgstr "Пометить как альбом \"для взрослых\""
-#: ../../Zotlabs/Module/Photos.php:1102 ../../Zotlabs/Lib/ThreadItem.php:289
+#: ../../Zotlabs/Module/Photos.php:1115 ../../Zotlabs/Lib/ThreadItem.php:289
msgid "I like this (toggle)"
msgstr "мне это нравится (переключение)"
-#: ../../Zotlabs/Module/Photos.php:1103 ../../Zotlabs/Lib/ThreadItem.php:290
+#: ../../Zotlabs/Module/Photos.php:1116 ../../Zotlabs/Lib/ThreadItem.php:290
msgid "I don't like this (toggle)"
msgstr "мне это не нравится (переключение)"
-#: ../../Zotlabs/Module/Photos.php:1121 ../../Zotlabs/Module/Photos.php:1239
-#: ../../Zotlabs/Lib/ThreadItem.php:764
+#: ../../Zotlabs/Module/Photos.php:1134 ../../Zotlabs/Module/Photos.php:1252
+#: ../../Zotlabs/Lib/ThreadItem.php:767
msgid "This is you"
msgstr "Это вы"
-#: ../../Zotlabs/Module/Photos.php:1158 ../../Zotlabs/Module/Photos.php:1170
+#: ../../Zotlabs/Module/Photos.php:1171 ../../Zotlabs/Module/Photos.php:1183
#: ../../Zotlabs/Lib/ThreadItem.php:214 ../../Zotlabs/Lib/ThreadItem.php:226
msgid "View all"
msgstr "Просмотреть все"
-#: ../../Zotlabs/Module/Photos.php:1267
+#: ../../Zotlabs/Module/Photos.php:1280
msgid "Photo Tools"
msgstr "Фото-Инструменты"
-#: ../../Zotlabs/Module/Photos.php:1276
+#: ../../Zotlabs/Module/Photos.php:1289
msgid "In This Photo:"
msgstr "На этой фотографии:"
-#: ../../Zotlabs/Module/Photos.php:1281
+#: ../../Zotlabs/Module/Photos.php:1294
msgid "Map"
msgstr "Карта"
-#: ../../Zotlabs/Module/Photos.php:1289 ../../Zotlabs/Lib/ThreadItem.php:429
+#: ../../Zotlabs/Module/Photos.php:1302 ../../Zotlabs/Lib/ThreadItem.php:432
msgctxt "noun"
msgid "Likes"
msgstr "Нравится"
-#: ../../Zotlabs/Module/Photos.php:1290 ../../Zotlabs/Lib/ThreadItem.php:430
+#: ../../Zotlabs/Module/Photos.php:1303 ../../Zotlabs/Lib/ThreadItem.php:433
msgctxt "noun"
msgid "Dislikes"
msgstr "Не нравится"
@@ -6444,6 +6432,10 @@ msgstr "Местоположений не найдено"
msgid "Manage Channel Locations"
msgstr "Управление местоположением канала"
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Основной"
+
#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:176
msgid "Drop"
msgstr "Удалить"
@@ -7410,7 +7402,7 @@ msgstr "Редактировать блок"
msgid "No service class restrictions found."
msgstr "Ограничений класса обслуживание не найдено."
-#: ../../Zotlabs/Module/Channel.php:116
+#: ../../Zotlabs/Module/Channel.php:160
msgid "Insufficient permissions. Request redirected to profile page."
msgstr "Недостаточно прав. Запрос перенаправлен на страницу профиля."
@@ -7519,44 +7511,44 @@ msgstr "Канал недоступен."
msgid "Previous action reversed."
msgstr "Предыдущее действие отменено."
-#: ../../Zotlabs/Module/Like.php:442
+#: ../../Zotlabs/Module/Like.php:445
#, php-format
msgid "%1$s agrees with %2$s's %3$s"
msgstr "%1$s согласен с %2$s %3$s"
-#: ../../Zotlabs/Module/Like.php:444
+#: ../../Zotlabs/Module/Like.php:447
#, php-format
msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr "%1$s не согласен с %2$s %3$s"
-#: ../../Zotlabs/Module/Like.php:446
+#: ../../Zotlabs/Module/Like.php:449
#, php-format
msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr "%1$s воздерживается от решения по %2$s%3$s"
-#: ../../Zotlabs/Module/Like.php:448
-#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2111
+#: ../../Zotlabs/Module/Like.php:451
+#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2120
#, php-format
msgid "%1$s is attending %2$s's %3$s"
msgstr "%1$s посещает %2$s%3$s"
-#: ../../Zotlabs/Module/Like.php:450
-#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2113
+#: ../../Zotlabs/Module/Like.php:453
+#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2122
#, php-format
msgid "%1$s is not attending %2$s's %3$s"
msgstr "%1$s не посещает %2$s%3$s"
-#: ../../Zotlabs/Module/Like.php:452
-#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2115
+#: ../../Zotlabs/Module/Like.php:455
+#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2124
#, php-format
msgid "%1$s may attend %2$s's %3$s"
msgstr "%1$s может посетить %2$s%3$s"
-#: ../../Zotlabs/Module/Like.php:564
+#: ../../Zotlabs/Module/Like.php:566
msgid "Action completed."
msgstr "Действие завершено."
-#: ../../Zotlabs/Module/Like.php:565
+#: ../../Zotlabs/Module/Like.php:567
msgid "Thank you."
msgstr "Спасибо."
@@ -8148,14 +8140,14 @@ msgstr "хранилище доступно для записи"
msgid ""
"SSL certificate cannot be validated. Fix certificate or disable https access "
"to this site."
-msgstr ""
+msgstr "SSL certificate cannot be validated. Замените его или отключите https доступ к этому сайту."
#: ../../Zotlabs/Module/Setup.php:659
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
-msgstr ""
+msgstr "Если у вас есть https-доступ к вашему сайту или разрешено подключение к TCP-порту 443 (порт https), вы ДОЛЖНЫ использовать сертификат, действительный для браузера. Вы НЕ ДОЛЖНЫ использовать самоподписанные сертификаты!"
#: ../../Zotlabs/Module/Setup.php:660
msgid ""
@@ -8168,18 +8160,18 @@ msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
-msgstr ""
+msgstr "Если ваш сертификат не признан, пользователи других сайтов (которые могут сами иметь действительные сертификаты) получат предупреждающее сообщение о проблемах с безопасностью."
#: ../../Zotlabs/Module/Setup.php:662
msgid ""
"This can cause usability issues elsewhere (not just on your own site) so we "
"must insist on this requirement."
-msgstr ""
+msgstr "Это может привести к проблемам удобства использования из других мест (не только на вашем собственном сайте), поэтому мы настаиваем на этом требовании."
#: ../../Zotlabs/Module/Setup.php:663
msgid ""
"Providers are available that issue free certificates which are browser-valid."
-msgstr ""
+msgstr "Доступны поставщики, которые выдают действительные для браузера бесплатные сертификаты."
#: ../../Zotlabs/Module/Setup.php:665
msgid ""
@@ -8187,17 +8179,17 @@ msgid ""
"authority, check to see if you have failed to install an intermediate cert. "
"These are not normally required by browsers, but are required for server-to-"
"server communications."
-msgstr ""
+msgstr "Если вы уверены, что сертификат действителен и подписан доверенным органом, проверьте, установлен ли промежуточные сертификаты. Обычно они не требуются браузерами, но бывают необходимы для связи между серверами."
#: ../../Zotlabs/Module/Setup.php:667
msgid "SSL certificate validation"
-msgstr ""
+msgstr "Проверка SSL сертификата"
#: ../../Zotlabs/Module/Setup.php:673
msgid ""
"Url rewrite in .htaccess is not working. Check your server configuration."
"Test: "
-msgstr ""
+msgstr "Перезапись URL в .htaccess не работает. Проверьте настройки вашего сервера."
#: ../../Zotlabs/Module/Setup.php:676
msgid "Url rewrite is working"
@@ -8208,7 +8200,7 @@ msgid ""
"The database configuration file \".htconfig.php\" could not be written. "
"Please use the enclosed text to create a configuration file in your web "
"server root."
-msgstr ""
+msgstr "Файл конфигурации базы данных \".htconfig.php\" не может быть записан. Используйте прилагаемый текст для создания файла конфигурации в корневом каталоге веб-сервера."
#: ../../Zotlabs/Module/Setup.php:714
#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:401
@@ -8953,7 +8945,7 @@ msgstr "Импортировать только публичные потоки
#: ../../Zotlabs/Module/Admin/Site.php:323
#: ../../Zotlabs/Module/Admin/Site.php:324
-#: ../../Zotlabs/Module/Connedit.php:876 ../../Zotlabs/Module/Connedit.php:877
+#: ../../Zotlabs/Module/Connedit.php:881 ../../Zotlabs/Module/Connedit.php:882
msgid ""
"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
"all posts"
@@ -9298,12 +9290,12 @@ msgid "No registrations."
msgstr "Нет новых регистраций."
#: ../../Zotlabs/Module/Admin/Accounts.php:176
-#: ../../Zotlabs/Module/Connedit.php:623
+#: ../../Zotlabs/Module/Connedit.php:628
msgid "Block"
msgstr "Блокировать"
#: ../../Zotlabs/Module/Admin/Accounts.php:177
-#: ../../Zotlabs/Module/Connedit.php:623
+#: ../../Zotlabs/Module/Connedit.php:628
msgid "Unblock"
msgstr "Разблокировать"
@@ -9467,21 +9459,21 @@ msgstr "Пароль"
msgid "Expires (yyyy-mm-dd)"
msgstr "Срок действия (yyyy-mm-dd)"
-#: ../../Zotlabs/Module/Tokens.php:180 ../../Zotlabs/Module/Connedit.php:891
+#: ../../Zotlabs/Module/Tokens.php:180 ../../Zotlabs/Module/Connedit.php:896
msgid "Their Settings"
msgstr "Их настройки"
#: ../../Zotlabs/Module/Notifications.php:60
-#: ../../Zotlabs/Lib/ThreadItem.php:422
+#: ../../Zotlabs/Lib/ThreadItem.php:425
msgid "Mark all seen"
msgstr "Отметить как просмотренное"
-#: ../../Zotlabs/Module/Subthread.php:142
+#: ../../Zotlabs/Module/Subthread.php:143
#, php-format
msgid "%1$s is following %2$s's %3$s"
msgstr "%1$s отслеживает %2$s's %3$s"
-#: ../../Zotlabs/Module/Subthread.php:144
+#: ../../Zotlabs/Module/Subthread.php:145
#, php-format
msgid "%1$s stopped following %2$s's %3$s"
msgstr "%1$s прекратил отслеживать %2$s's %3$s"
@@ -9711,268 +9703,268 @@ msgstr "Контакт добавлен."
msgid "Item is not editable"
msgstr "Элемент нельзя редактировать"
-#: ../../Zotlabs/Module/Connedit.php:110
+#: ../../Zotlabs/Module/Connedit.php:111
msgid "Could not locate selected profile."
msgstr "Не удалось обнаружить выбранный профиль."
-#: ../../Zotlabs/Module/Connedit.php:247
+#: ../../Zotlabs/Module/Connedit.php:248
msgid "Connection updated."
msgstr "Контакты обновлены."
-#: ../../Zotlabs/Module/Connedit.php:249
+#: ../../Zotlabs/Module/Connedit.php:250
msgid "Failed to update connection record."
msgstr "Не удалось обновить запись контакта."
-#: ../../Zotlabs/Module/Connedit.php:303
+#: ../../Zotlabs/Module/Connedit.php:304
msgid "is now connected to"
msgstr "теперь подключён к"
-#: ../../Zotlabs/Module/Connedit.php:428
+#: ../../Zotlabs/Module/Connedit.php:429
msgid "Could not access address book record."
msgstr "Не удалось получить доступ к записи адресной книги."
-#: ../../Zotlabs/Module/Connedit.php:476
+#: ../../Zotlabs/Module/Connedit.php:477 ../../Zotlabs/Module/Connedit.php:481
msgid "Refresh failed - channel is currently unavailable."
msgstr "Обновление невозможно - в настоящее время канал недоступен."
-#: ../../Zotlabs/Module/Connedit.php:491 ../../Zotlabs/Module/Connedit.php:500
-#: ../../Zotlabs/Module/Connedit.php:509 ../../Zotlabs/Module/Connedit.php:518
-#: ../../Zotlabs/Module/Connedit.php:531
+#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505
+#: ../../Zotlabs/Module/Connedit.php:514 ../../Zotlabs/Module/Connedit.php:523
+#: ../../Zotlabs/Module/Connedit.php:536
msgid "Unable to set address book parameters."
msgstr "Не удалось получить доступ к параметрам адресной книги."
-#: ../../Zotlabs/Module/Connedit.php:555
+#: ../../Zotlabs/Module/Connedit.php:560
msgid "Connection has been removed."
msgstr "Контакт был удалён."
-#: ../../Zotlabs/Module/Connedit.php:598
+#: ../../Zotlabs/Module/Connedit.php:603
#, php-format
msgid "View %s's profile"
msgstr "Просмотр %s профиля"
-#: ../../Zotlabs/Module/Connedit.php:602
+#: ../../Zotlabs/Module/Connedit.php:607
msgid "Refresh Permissions"
msgstr "Обновить разрешения"
-#: ../../Zotlabs/Module/Connedit.php:605
+#: ../../Zotlabs/Module/Connedit.php:610
msgid "Fetch updated permissions"
msgstr "Получить обновлённые разрешения"
-#: ../../Zotlabs/Module/Connedit.php:609
+#: ../../Zotlabs/Module/Connedit.php:614
msgid "Refresh Photo"
msgstr "Обновить фотографию"
-#: ../../Zotlabs/Module/Connedit.php:612
+#: ../../Zotlabs/Module/Connedit.php:617
msgid "Fetch updated photo"
msgstr "Получить обновлённую фотографию"
-#: ../../Zotlabs/Module/Connedit.php:619
+#: ../../Zotlabs/Module/Connedit.php:624
msgid "View recent posts and comments"
msgstr "Просмотреть последние публикации и комментарии"
-#: ../../Zotlabs/Module/Connedit.php:626
+#: ../../Zotlabs/Module/Connedit.php:631
msgid "Block (or Unblock) all communications with this connection"
msgstr "Блокировать (или разблокировать) связи с этим контактом"
-#: ../../Zotlabs/Module/Connedit.php:627
+#: ../../Zotlabs/Module/Connedit.php:632
msgid "This connection is blocked!"
msgstr "Этот контакт заблокирован!"
-#: ../../Zotlabs/Module/Connedit.php:631
+#: ../../Zotlabs/Module/Connedit.php:636
msgid "Unignore"
msgstr "Не игнорировать"
-#: ../../Zotlabs/Module/Connedit.php:631
+#: ../../Zotlabs/Module/Connedit.php:636
#: ../../Zotlabs/Module/Connections.php:308
msgid "Ignore"
msgstr "Игнорировать"
-#: ../../Zotlabs/Module/Connedit.php:634
+#: ../../Zotlabs/Module/Connedit.php:639
msgid "Ignore (or Unignore) all inbound communications from this connection"
msgstr "Игнорировать (или не игнорировать) все связи для этого контакта"
-#: ../../Zotlabs/Module/Connedit.php:635
+#: ../../Zotlabs/Module/Connedit.php:640
msgid "This connection is ignored!"
msgstr "Этот контакт игнорируется!"
-#: ../../Zotlabs/Module/Connedit.php:639
+#: ../../Zotlabs/Module/Connedit.php:644
msgid "Unarchive"
msgstr "Разархивировать"
-#: ../../Zotlabs/Module/Connedit.php:639
+#: ../../Zotlabs/Module/Connedit.php:644
msgid "Archive"
msgstr "Заархивировать"
-#: ../../Zotlabs/Module/Connedit.php:642
+#: ../../Zotlabs/Module/Connedit.php:647
msgid ""
"Archive (or Unarchive) this connection - mark channel dead but keep content"
msgstr "Заархивировать (или разархивировать) этот контакт - пометить канал отключённым но сохранить содержимое"
-#: ../../Zotlabs/Module/Connedit.php:643
+#: ../../Zotlabs/Module/Connedit.php:648
msgid "This connection is archived!"
msgstr "Этот контакт заархивирован!"
-#: ../../Zotlabs/Module/Connedit.php:647
+#: ../../Zotlabs/Module/Connedit.php:652
msgid "Unhide"
msgstr "Показать"
-#: ../../Zotlabs/Module/Connedit.php:647
+#: ../../Zotlabs/Module/Connedit.php:652
msgid "Hide"
msgstr "Скрыть"
-#: ../../Zotlabs/Module/Connedit.php:650
+#: ../../Zotlabs/Module/Connedit.php:655
msgid "Hide or Unhide this connection from your other connections"
msgstr "Скрыть или показать этот контакт от / для остальных"
-#: ../../Zotlabs/Module/Connedit.php:651
+#: ../../Zotlabs/Module/Connedit.php:656
msgid "This connection is hidden!"
msgstr "Этот контакт скрыт!"
-#: ../../Zotlabs/Module/Connedit.php:658
+#: ../../Zotlabs/Module/Connedit.php:663
msgid "Delete this connection"
msgstr "Удалить этот контакт"
-#: ../../Zotlabs/Module/Connedit.php:666
+#: ../../Zotlabs/Module/Connedit.php:671
msgid "Fetch Vcard"
msgstr "Получить vCard"
-#: ../../Zotlabs/Module/Connedit.php:669
+#: ../../Zotlabs/Module/Connedit.php:674
msgid "Fetch electronic calling card for this connection"
msgstr "Получить электронную телефонную карточку для этого контакта"
-#: ../../Zotlabs/Module/Connedit.php:680
+#: ../../Zotlabs/Module/Connedit.php:685
msgid "Open Individual Permissions section by default"
msgstr "Открывать раздел \"Индивидуальные разрешения\" по умолчанию"
-#: ../../Zotlabs/Module/Connedit.php:703
+#: ../../Zotlabs/Module/Connedit.php:708
msgid "Affinity"
msgstr "Сходство"
-#: ../../Zotlabs/Module/Connedit.php:706
+#: ../../Zotlabs/Module/Connedit.php:711
msgid "Open Set Affinity section by default"
msgstr "Открыть секцию установления сходства по умолчанию"
-#: ../../Zotlabs/Module/Connedit.php:710 ../../Zotlabs/Widget/Affinity.php:22
+#: ../../Zotlabs/Module/Connedit.php:715 ../../Zotlabs/Widget/Affinity.php:22
msgid "Me"
msgstr "Я"
-#: ../../Zotlabs/Module/Connedit.php:711 ../../Zotlabs/Widget/Affinity.php:23
+#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Widget/Affinity.php:23
msgid "Family"
msgstr "Семья"
-#: ../../Zotlabs/Module/Connedit.php:713 ../../Zotlabs/Widget/Affinity.php:25
+#: ../../Zotlabs/Module/Connedit.php:718 ../../Zotlabs/Widget/Affinity.php:25
msgid "Acquaintances"
msgstr "Знакомые"
-#: ../../Zotlabs/Module/Connedit.php:714
+#: ../../Zotlabs/Module/Connedit.php:719
#: ../../Zotlabs/Module/Connections.php:97
#: ../../Zotlabs/Module/Connections.php:111
#: ../../Zotlabs/Widget/Affinity.php:26
msgid "All"
msgstr "Все"
-#: ../../Zotlabs/Module/Connedit.php:740
+#: ../../Zotlabs/Module/Connedit.php:745
msgid "Filter"
msgstr "Фильтр"
-#: ../../Zotlabs/Module/Connedit.php:743
+#: ../../Zotlabs/Module/Connedit.php:748
msgid "Open Custom Filter section by default"
msgstr "Открывать секцию \"Настраиваемый фильтр\" по умолчанию"
-#: ../../Zotlabs/Module/Connedit.php:780
+#: ../../Zotlabs/Module/Connedit.php:785
msgid "Approve this connection"
msgstr "Утвердить этот контакт"
-#: ../../Zotlabs/Module/Connedit.php:780
+#: ../../Zotlabs/Module/Connedit.php:785
msgid "Accept connection to allow communication"
msgstr "Принять контакт чтобы разрешить связь"
-#: ../../Zotlabs/Module/Connedit.php:785
+#: ../../Zotlabs/Module/Connedit.php:790
msgid "Set Affinity"
msgstr "Установить сходство"
-#: ../../Zotlabs/Module/Connedit.php:788
+#: ../../Zotlabs/Module/Connedit.php:793
msgid "Set Profile"
msgstr "Установить профиль"
-#: ../../Zotlabs/Module/Connedit.php:791
+#: ../../Zotlabs/Module/Connedit.php:796
msgid "Set Affinity & Profile"
msgstr "Установить сходство и профиль"
-#: ../../Zotlabs/Module/Connedit.php:839
+#: ../../Zotlabs/Module/Connedit.php:844
msgid "This connection is unreachable from this location."
msgstr "Этот контакт недоступен для данного местоположения"
-#: ../../Zotlabs/Module/Connedit.php:840
+#: ../../Zotlabs/Module/Connedit.php:845
msgid "This connection may be unreachable from other channel locations."
msgstr "Этот контакт может быть недоступен из других мест размещения канала"
-#: ../../Zotlabs/Module/Connedit.php:842
+#: ../../Zotlabs/Module/Connedit.php:847
msgid "Location independence is not supported by their network."
msgstr "Независимое местоположение не поддерживается их сетью."
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:853
msgid ""
"This connection is unreachable from this location. Location independence is "
"not supported by their network."
msgstr "Этот контакт недоступен из данного местоположения. Независимое местоположение не поддерживается их сетью."
-#: ../../Zotlabs/Module/Connedit.php:852
+#: ../../Zotlabs/Module/Connedit.php:857
msgid "Connection requests will be approved without your interaction"
msgstr "Запросы контактов будут одобрены без вашего участия"
-#: ../../Zotlabs/Module/Connedit.php:861
+#: ../../Zotlabs/Module/Connedit.php:866
msgid "This connection's primary address is"
msgstr "Главный адрес это контакта"
-#: ../../Zotlabs/Module/Connedit.php:862
+#: ../../Zotlabs/Module/Connedit.php:867
msgid "Available locations:"
msgstr "Доступные расположения:"
-#: ../../Zotlabs/Module/Connedit.php:868
+#: ../../Zotlabs/Module/Connedit.php:873
msgid "Connection Tools"
msgstr "Инструменты контактов"
-#: ../../Zotlabs/Module/Connedit.php:870
+#: ../../Zotlabs/Module/Connedit.php:875
msgid "Slide to adjust your degree of friendship"
msgstr "Прокрутить для настройки степени дружбы"
-#: ../../Zotlabs/Module/Connedit.php:872
+#: ../../Zotlabs/Module/Connedit.php:877
msgid "Slide to adjust your rating"
msgstr "Прокрутить для настройки оценки"
-#: ../../Zotlabs/Module/Connedit.php:873 ../../Zotlabs/Module/Connedit.php:878
+#: ../../Zotlabs/Module/Connedit.php:878 ../../Zotlabs/Module/Connedit.php:883
msgid "Optionally explain your rating"
msgstr "Объясните свою оценку (не обязательно)"
-#: ../../Zotlabs/Module/Connedit.php:875
+#: ../../Zotlabs/Module/Connedit.php:880
msgid "Custom Filter"
msgstr "Настраиваемый фильтр"
-#: ../../Zotlabs/Module/Connedit.php:876
+#: ../../Zotlabs/Module/Connedit.php:881
msgid "Only import posts with this text"
msgstr "Импортировать публикации только с этим текстом"
-#: ../../Zotlabs/Module/Connedit.php:877
+#: ../../Zotlabs/Module/Connedit.php:882
msgid "Do not import posts with this text"
msgstr "Не импортировать публикации с этим текстом"
-#: ../../Zotlabs/Module/Connedit.php:879
+#: ../../Zotlabs/Module/Connedit.php:884
msgid "This information is public!"
msgstr "Эта информация общедоступна!"
-#: ../../Zotlabs/Module/Connedit.php:884
+#: ../../Zotlabs/Module/Connedit.php:889
msgid "Connection Pending Approval"
msgstr "Ожидающие подтверждения контактов"
-#: ../../Zotlabs/Module/Connedit.php:889
+#: ../../Zotlabs/Module/Connedit.php:894
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr "Пожалуйста, выберите профиль который вы хотит показывать в %s при безопасном просмотре."
-#: ../../Zotlabs/Module/Connedit.php:896
+#: ../../Zotlabs/Module/Connedit.php:901
msgid ""
"Some permissions may be inherited from your channel's <a href=\"settings"
"\"><strong>privacy settings</strong></a>, which have higher priority than "
@@ -9980,11 +9972,11 @@ msgid ""
"any impact unless the inherited setting changes."
msgstr "Некоторые разрешения могут быть унаследованы из <a href=\"settings\"><strong>настроек приватности</strong></a> вашего канала, которые могут иметь более высокий приоритет чем индивидуальные. Вы можете изменить эти настройки, однако они не будут применены до изменения переданных по наследству настроек."
-#: ../../Zotlabs/Module/Connedit.php:897
+#: ../../Zotlabs/Module/Connedit.php:902
msgid "Last update:"
msgstr "Последнее обновление:"
-#: ../../Zotlabs/Module/Connedit.php:905
+#: ../../Zotlabs/Module/Connedit.php:910
msgid "Details"
msgstr "Сведения"
@@ -10180,15 +10172,15 @@ msgstr "Поиск ваших контактов"
msgid "Connections search"
msgstr "Поиск контаков"
-#: ../../Zotlabs/Module/Mood.php:132
+#: ../../Zotlabs/Module/Mood.php:134
msgid "Mood App"
msgstr "Приложение \"Настроение\""
-#: ../../Zotlabs/Module/Mood.php:133 ../../Zotlabs/Module/Mood.php:153
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Module/Mood.php:155
msgid "Set your current mood and tell your friends"
msgstr "Установить текущее настроение и рассказать друзьям"
-#: ../../Zotlabs/Module/Mood.php:152 ../../Zotlabs/Lib/Apps.php:325
+#: ../../Zotlabs/Module/Mood.php:154 ../../Zotlabs/Lib/Apps.php:325
msgid "Mood"
msgstr "Настроение"
@@ -10413,6 +10405,7 @@ msgid "System layout"
msgstr "Системный шаблон"
#: ../../Zotlabs/Module/Wiki.php:35
+#: ../../extend/addon/hzaddons/flashcards/Mod_Flashcards.php:34
#: ../../extend/addon/hzaddons/cart/cart.php:1297
msgid "Profile Unavailable."
msgstr "Профиль недоступен."
@@ -10429,7 +10422,7 @@ msgstr "Предоставьте Wiki для вашего канала"
#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:456
#: ../../extend/addon/hzaddons/cart/myshop.php:37
#: ../../extend/addon/hzaddons/cart/manual_payments.php:93
-#: ../../extend/addon/hzaddons/cart/cart.php:1440
+#: ../../extend/addon/hzaddons/cart/cart.php:1443
msgid "Invalid channel"
msgstr "Недействительный канал"
@@ -10937,7 +10930,7 @@ msgstr "Просмотр публичного потока. Предупрежд
#: ../../Zotlabs/Widget/Forums.php:100
#: ../../Zotlabs/Widget/Notifications.php:119
#: ../../Zotlabs/Widget/Notifications.php:120
-#: ../../Zotlabs/Widget/Activity_filter.php:102
+#: ../../Zotlabs/Widget/Activity_filter.php:73
msgid "Forums"
msgstr "Форумы"
@@ -10979,7 +10972,7 @@ msgstr "Показывать только новые публикации"
#: ../../Zotlabs/Widget/Notifications.php:46
#: ../../Zotlabs/Widget/Notifications.php:122
#: ../../Zotlabs/Widget/Notifications.php:153
-#: ../../Zotlabs/Widget/Activity_filter.php:164
+#: ../../Zotlabs/Widget/Activity_filter.php:165
msgid "Filter by name"
msgstr "Отфильтровать по имени"
@@ -11372,57 +11365,57 @@ msgstr "Установленные приложения"
msgid "Remove term"
msgstr "Удалить термин"
-#: ../../Zotlabs/Widget/Activity_filter.php:26
-msgid "Personal Posts"
-msgstr "Личные публикации"
-
-#: ../../Zotlabs/Widget/Activity_filter.php:30
-msgid "Show posts that mention or involve me"
-msgstr "Показывать публикации где вы были упомянуты или привлечены"
-
-#: ../../Zotlabs/Widget/Activity_filter.php:41
-msgid "Starred Posts"
-msgstr "Отмеченные публикации"
-
-#: ../../Zotlabs/Widget/Activity_filter.php:45
-msgid "Show posts that I have starred"
-msgstr "Показывать публикации которые я отметил"
-
-#: ../../Zotlabs/Widget/Activity_filter.php:65
+#: ../../Zotlabs/Widget/Activity_filter.php:36
#, php-format
msgid "Show posts related to the %s privacy group"
msgstr "Показывать публикации относящиеся к группе безопасности %s"
-#: ../../Zotlabs/Widget/Activity_filter.php:74
+#: ../../Zotlabs/Widget/Activity_filter.php:45
msgid "Show my privacy groups"
msgstr "Показывать мои группы безопасности"
-#: ../../Zotlabs/Widget/Activity_filter.php:95
+#: ../../Zotlabs/Widget/Activity_filter.php:66
msgid "Show posts to this forum"
msgstr "Показывать публикации этого форума"
-#: ../../Zotlabs/Widget/Activity_filter.php:106
+#: ../../Zotlabs/Widget/Activity_filter.php:77
msgid "Show forums"
msgstr "Показывать форумы"
-#: ../../Zotlabs/Widget/Activity_filter.php:130
+#: ../../Zotlabs/Widget/Activity_filter.php:91
+msgid "Starred Posts"
+msgstr "Отмеченные публикации"
+
+#: ../../Zotlabs/Widget/Activity_filter.php:95
+msgid "Show posts that I have starred"
+msgstr "Показывать публикации которые я отметил"
+
+#: ../../Zotlabs/Widget/Activity_filter.php:106
+msgid "Personal Posts"
+msgstr "Личные публикации"
+
+#: ../../Zotlabs/Widget/Activity_filter.php:110
+msgid "Show posts that mention or involve me"
+msgstr "Показывать публикации где вы были упомянуты или привлечены"
+
+#: ../../Zotlabs/Widget/Activity_filter.php:131
#, php-format
msgid "Show posts that I have filed to %s"
msgstr "Показывать публикации которые я добавил в %s"
-#: ../../Zotlabs/Widget/Activity_filter.php:140
+#: ../../Zotlabs/Widget/Activity_filter.php:141
msgid "Show filed post categories"
msgstr "Показывать категории добавленных публикаций"
-#: ../../Zotlabs/Widget/Activity_filter.php:154
+#: ../../Zotlabs/Widget/Activity_filter.php:155
msgid "Panel search"
msgstr "Панель поиска"
-#: ../../Zotlabs/Widget/Activity_filter.php:179
+#: ../../Zotlabs/Widget/Activity_filter.php:180
msgid "Remove active filter"
msgstr "Удалить активный фильтр"
-#: ../../Zotlabs/Widget/Activity_filter.php:195
+#: ../../Zotlabs/Widget/Activity_filter.php:196
msgid "Stream Filters"
msgstr "Фильтры потока"
@@ -12164,7 +12157,7 @@ msgstr "поделиться"
msgid "Delivery Report"
msgstr "Отчёт о доставке"
-#: ../../Zotlabs/Lib/ThreadItem.php:321
+#: ../../Zotlabs/Lib/ThreadItem.php:323
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
@@ -12172,73 +12165,73 @@ msgstr[0] "%d комментарий"
msgstr[1] "%d комментария"
msgstr[2] "%d комментариев"
-#: ../../Zotlabs/Lib/ThreadItem.php:355 ../../Zotlabs/Lib/ThreadItem.php:356
+#: ../../Zotlabs/Lib/ThreadItem.php:357 ../../Zotlabs/Lib/ThreadItem.php:358
#, php-format
msgid "View %s's profile - %s"
msgstr "Просмотр %s профиля - %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:359
+#: ../../Zotlabs/Lib/ThreadItem.php:361
msgid "to"
msgstr "к"
-#: ../../Zotlabs/Lib/ThreadItem.php:360
+#: ../../Zotlabs/Lib/ThreadItem.php:362
msgid "via"
msgstr "через"
-#: ../../Zotlabs/Lib/ThreadItem.php:361
+#: ../../Zotlabs/Lib/ThreadItem.php:363
msgid "Wall-to-Wall"
msgstr "Стена-к-Стене"
-#: ../../Zotlabs/Lib/ThreadItem.php:362
+#: ../../Zotlabs/Lib/ThreadItem.php:364
msgid "via Wall-To-Wall:"
msgstr "через Стена-к-Стене:"
-#: ../../Zotlabs/Lib/ThreadItem.php:387
+#: ../../Zotlabs/Lib/ThreadItem.php:390
msgid "Attend"
msgstr "Посетить"
-#: ../../Zotlabs/Lib/ThreadItem.php:388
+#: ../../Zotlabs/Lib/ThreadItem.php:391
msgid "Attendance Options"
msgstr "Параметры посещаемости"
-#: ../../Zotlabs/Lib/ThreadItem.php:389
+#: ../../Zotlabs/Lib/ThreadItem.php:392
msgid "Vote"
msgstr "Голосовать"
-#: ../../Zotlabs/Lib/ThreadItem.php:390
+#: ../../Zotlabs/Lib/ThreadItem.php:393
msgid "Voting Options"
msgstr "Параметры голосования"
-#: ../../Zotlabs/Lib/ThreadItem.php:411
+#: ../../Zotlabs/Lib/ThreadItem.php:414
#: ../../extend/addon/hzaddons/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Сохранить закладки"
-#: ../../Zotlabs/Lib/ThreadItem.php:412
+#: ../../Zotlabs/Lib/ThreadItem.php:415
msgid "Add to Calendar"
msgstr "Добавить в календарь"
-#: ../../Zotlabs/Lib/ThreadItem.php:773
+#: ../../Zotlabs/Lib/ThreadItem.php:776
msgid "Image"
msgstr "Изображение"
-#: ../../Zotlabs/Lib/ThreadItem.php:775
+#: ../../Zotlabs/Lib/ThreadItem.php:778
msgid "Insert Link"
msgstr "Вставить ссылку"
-#: ../../Zotlabs/Lib/ThreadItem.php:776
+#: ../../Zotlabs/Lib/ThreadItem.php:779
msgid "Video"
msgstr "Видео"
-#: ../../Zotlabs/Lib/ThreadItem.php:786
+#: ../../Zotlabs/Lib/ThreadItem.php:789
msgid "Your full name (required)"
msgstr "Ваше полное имя (требуется)"
-#: ../../Zotlabs/Lib/ThreadItem.php:787
+#: ../../Zotlabs/Lib/ThreadItem.php:790
msgid "Your email address (required)"
msgstr "Ваш адрес электронной почты (требуется)"
-#: ../../Zotlabs/Lib/ThreadItem.php:788
+#: ../../Zotlabs/Lib/ThreadItem.php:791
msgid "Your website URL (optional)"
msgstr "URL вашего вебсайта (необязательно)"
@@ -12339,11 +12332,11 @@ msgstr "4. Эксперт - я умею программировать"
msgid "5. Wizard - I probably know more than you do"
msgstr "5. Волшебник - возможно я знаю больше чем ты"
-#: ../../Zotlabs/Lib/NativeWiki.php:152
+#: ../../Zotlabs/Lib/NativeWiki.php:143
msgid "Wiki updated successfully"
msgstr "Wiki успешно обновлена"
-#: ../../Zotlabs/Lib/NativeWiki.php:206
+#: ../../Zotlabs/Lib/NativeWiki.php:197
msgid "Wiki files deleted successfully"
msgstr "Wiki успешно удалена"
@@ -12383,72 +12376,68 @@ msgstr "Серверы и ресурсы проекта"
msgid "Project Creator and Tech Lead"
msgstr "Создатель проекта и технический руководитель"
-#: ../../extend/addon/hzaddons/donate/donate.php:23
-msgid "Admin, developer, directorymin, support bloke"
-msgstr "Администратор, разработчик, администратор каталога, поддержка"
-
-#: ../../extend/addon/hzaddons/donate/donate.php:50
+#: ../../extend/addon/hzaddons/donate/donate.php:49
msgid ""
"And the hundreds of other people and organisations who helped make the "
"Hubzilla possible."
msgstr "И сотни других людей и организаций которые помогали в создании Hubzilla."
-#: ../../extend/addon/hzaddons/donate/donate.php:53
+#: ../../extend/addon/hzaddons/donate/donate.php:52
msgid ""
"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
"their time and expertise - and often paying out of pocket for services they "
"share with others."
msgstr "Проекты Redmatrix / Hubzilla предоставляются, в основном, добровольцами, которые предоставляют свое время и опыт и, часто, оплачивают из своего кармана услуги, которыми они делятся с другими."
-#: ../../extend/addon/hzaddons/donate/donate.php:54
+#: ../../extend/addon/hzaddons/donate/donate.php:53
msgid ""
"There is no corporate funding and no ads, and we do not collect and sell "
"your personal information. (We don't control your personal information - "
"<strong>you do</strong>.)"
msgstr "Здесь нет корпоративного финансирования и рекламы, мы не собираем и не продаем вашу личную информацию. (Мы не контролируем вашу личную информацию - <strong>это делаете вы</strong>.)"
-#: ../../extend/addon/hzaddons/donate/donate.php:55
+#: ../../extend/addon/hzaddons/donate/donate.php:54
msgid ""
"Help support our ground-breaking work in decentralisation, web identity, and "
"privacy."
msgstr "Помогите поддержать нашу новаторскую работу в областях децентрализации, веб-идентификации и конфиденциальности."
-#: ../../extend/addon/hzaddons/donate/donate.php:57
+#: ../../extend/addon/hzaddons/donate/donate.php:56
msgid ""
"Your donations keep servers and services running and also helps us to "
"provide innovative new features and continued development."
msgstr "В ваших пожертвованиях поддерживают серверы и службы, а также помогают нам предоставлять новые возможности и продолжать развитие."
-#: ../../extend/addon/hzaddons/donate/donate.php:60
+#: ../../extend/addon/hzaddons/donate/donate.php:59
msgid "Donate"
msgstr "Пожертвовать"
-#: ../../extend/addon/hzaddons/donate/donate.php:62
+#: ../../extend/addon/hzaddons/donate/donate.php:61
msgid ""
"Choose a project, developer, or public hub to support with a one-time "
"donation"
msgstr "Выберите проект, разработчика или общедоступный узел для поддержки в форме единоразового пожертвования"
-#: ../../extend/addon/hzaddons/donate/donate.php:63
+#: ../../extend/addon/hzaddons/donate/donate.php:62
msgid "Donate Now"
msgstr "Пожертвовать сейчас"
-#: ../../extend/addon/hzaddons/donate/donate.php:64
+#: ../../extend/addon/hzaddons/donate/donate.php:63
msgid ""
"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"
msgstr "<strong><em>или</em></strong> станьте спонсором проекта (только для Hubzilla)"
-#: ../../extend/addon/hzaddons/donate/donate.php:65
+#: ../../extend/addon/hzaddons/donate/donate.php:64
msgid ""
"Please indicate if you would like your first name or full name (or nothing) "
"to appear in our sponsor listing"
msgstr "Пожалуйста, если желаете, укажите ваше имя для отображения в списке спонсоров."
-#: ../../extend/addon/hzaddons/donate/donate.php:66
+#: ../../extend/addon/hzaddons/donate/donate.php:65
msgid "Sponsor"
msgstr "Спонсор"
-#: ../../extend/addon/hzaddons/donate/donate.php:69
+#: ../../extend/addon/hzaddons/donate/donate.php:68
msgid "Special thanks to: "
msgstr "Особые благодарности:"
@@ -12535,11 +12524,11 @@ msgid "A simple gallery for your photo albums"
msgstr "Простая галлерея для ваших фотоальбомов"
#: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:115
-#: ../../extend/addon/hzaddons/gallery/gallery.php:47
+#: ../../extend/addon/hzaddons/gallery/gallery.php:28
msgid "Gallery"
msgstr "Галерея"
-#: ../../extend/addon/hzaddons/gallery/gallery.php:50
+#: ../../extend/addon/hzaddons/gallery/gallery.php:31
msgid "Photo Gallery"
msgstr "Фотогалерея"
@@ -12881,7 +12870,7 @@ msgid ""
"return key"
msgstr "Добро пожаловать в Hubzilla! Желаете получить обзор пользовательского интерфейса?</p> <p>Вы можете его приостановаить и в любое время перезагрузив страницу или перейдя на другую.</p><p>Также вы можете нажать клавишу \"Назад\""
-#: ../../extend/addon/hzaddons/superblock/superblock.php:318
+#: ../../extend/addon/hzaddons/superblock/superblock.php:337
msgid "Block Completely"
msgstr "Заблокировать полностью"
@@ -13599,32 +13588,28 @@ msgid "Until modified date yyyy-mm-dd"
msgstr "Заканчивая датой изменений yyyy-mm-dd"
#: ../../extend/addon/hzaddons/ljpost/ljpost.php:42
-msgid "Post to LiveJournal"
-msgstr "Опубликовать в LiveJournal"
-
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Включить плагин публикаций LiveJournal"
+msgid "Post to Livejournal"
+msgstr "Опубликовать в Livejournal"
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:74
-msgid "LiveJournal username"
-msgstr "Имя пользователя LiveJournal"
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:73
+msgid "Enable Livejournal Post Plugin"
+msgstr "Включить раширение публикаций в Livejournal"
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:78
-msgid "LiveJournal password"
-msgstr "Пароль LiveJournal"
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:77
+msgid "Livejournal username"
+msgstr "Имя пользователя Livejournal"
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82
-msgid "Post to LiveJournal by default"
-msgstr "Публиковать в LiveJournal по умолчанию"
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:81
+msgid "Livejournal password"
+msgstr "Пароль Livejournal"
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:86
-msgid "LiveJournal Post Settings"
-msgstr "Настройки публикаций в LiveJournal"
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:85
+msgid "Post to Livejournal by default"
+msgstr "Публиковать в Livejournal по умолчанию"
-#: ../../extend/addon/hzaddons/ljpost/ljpost.php:101
-msgid "LiveJournal Settings saved."
-msgstr "Настройки LiveJournal сохранены."
+#: ../../extend/addon/hzaddons/ljpost/ljpost.php:89
+msgid "Livejournal Post Settings"
+msgstr "Настройки публикации в Livejournal"
#: ../../extend/addon/hzaddons/statusnet/statusnet.php:143
msgid "Post to GNU social"
@@ -13825,8 +13810,8 @@ msgstr "Настройки модерирования сообщества"
msgid "Can moderate reputation on my channel."
msgstr "Может модерировать репутацию на моём канале"
-#: ../../extend/addon/hzaddons/channelreputation/channelreputation.php:544
-#: ../../extend/addon/hzaddons/channelreputation/channelreputation.php:547
+#: ../../extend/addon/hzaddons/channelreputation/channelreputation.php:542
+#: ../../extend/addon/hzaddons/channelreputation/channelreputation.php:545
msgid "Channel Reputation"
msgstr "Репутация канала"
@@ -14160,7 +14145,7 @@ msgstr "Кнопка Paypal для платежей настроена непр
#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:392
#: ../../extend/addon/hzaddons/cart/manual_payments.php:68
-#: ../../extend/addon/hzaddons/cart/cart.php:1462
+#: ../../extend/addon/hzaddons/cart/cart.php:1465
msgid "Order not found."
msgstr "Заказ не найден."
@@ -14173,7 +14158,7 @@ msgid "Access Denied."
msgstr "Доступ запрещён."
#: ../../extend/addon/hzaddons/cart/myshop.php:111
-#: ../../extend/addon/hzaddons/cart/cart.php:1330
+#: ../../extend/addon/hzaddons/cart/cart.php:1333
msgid "Order Not Found"
msgstr "Заказ не найден"
@@ -14217,32 +14202,32 @@ msgstr "Сбросить таблицы базы данных при деинс
msgid "Shop"
msgstr "Магазин"
-#: ../../extend/addon/hzaddons/cart/cart.php:1391
+#: ../../extend/addon/hzaddons/cart/cart.php:1394
msgid "Cart utilities for orders and payments"
msgstr "Утилиты карточек для заказов и платежей"
-#: ../../extend/addon/hzaddons/cart/cart.php:1429
+#: ../../extend/addon/hzaddons/cart/cart.php:1432
msgid "You must be logged into the Grid to shop."
msgstr "Вы должны быть в сети для доступа к магазину"
-#: ../../extend/addon/hzaddons/cart/cart.php:1470
+#: ../../extend/addon/hzaddons/cart/cart.php:1473
msgid "Access denied."
msgstr "Доступ запрещён."
-#: ../../extend/addon/hzaddons/cart/cart.php:1522
-#: ../../extend/addon/hzaddons/cart/cart.php:1665
+#: ../../extend/addon/hzaddons/cart/cart.php:1525
+#: ../../extend/addon/hzaddons/cart/cart.php:1668
msgid "No Order Found"
msgstr "Нет найденных заказов"
-#: ../../extend/addon/hzaddons/cart/cart.php:1531
+#: ../../extend/addon/hzaddons/cart/cart.php:1534
msgid "An unknown error has occurred Please start again."
msgstr "Произошла неизвестная ошибка. Пожалуйста, начните снова."
-#: ../../extend/addon/hzaddons/cart/cart.php:1698
+#: ../../extend/addon/hzaddons/cart/cart.php:1701
msgid "Invalid Payment Type. Please start again."
msgstr "Недействительный тип платежа. Пожалуйста, начните снова."
-#: ../../extend/addon/hzaddons/cart/cart.php:1705
+#: ../../extend/addon/hzaddons/cart/cart.php:1708
msgid "Order not found"
msgstr "Заказ не найден"
@@ -14415,7 +14400,7 @@ msgstr "Ошибка создания новой игры."
msgid "You must select a local channel /chess/channelname"
msgstr "Вы должны выбрать локальный канал /chess/channelname"
-#: ../../extend/addon/hzaddons/chess/chess.php:1066
+#: ../../extend/addon/hzaddons/chess/chess.php:1071
msgid "Enable notifications"
msgstr "Включить оповещения"
diff --git a/view/ru/hstrings.php b/view/ru/hstrings.php
index 598d02718..02c88dde3 100644
--- a/view/ru/hstrings.php
+++ b/view/ru/hstrings.php
@@ -470,7 +470,6 @@ App::$strings["Help:"] = "Помощь:";
App::$strings["Help"] = "Помощь";
App::$strings["Not Found"] = "Не найдено";
App::$strings["Page not found."] = "Страница не найдена.";
-App::$strings["Cannot locate DNS info for database server '%s'"] = "Не удается найти DNS информацию для сервера базы данных '%s'";
App::$strings["Image/photo"] = "Изображение / фотография";
App::$strings["Encrypted content"] = "Зашифрованное содержание";
App::$strings["Install %1\$s element %2\$s"] = "Установить %1\$s элемент %2\$s";
@@ -1152,8 +1151,6 @@ App::$strings["Blocked accounts"] = "Заблокированные аккаун
App::$strings["Expired accounts"] = "Просроченные аккаунты";
App::$strings["Expiring accounts"] = "Близкие к просрочке аккаунты";
App::$strings["Channels"] = "Каналы";
-App::$strings["Primary"] = "Основной";
-App::$strings["Clones"] = "Клоны";
App::$strings["Message queues"] = "Очередь сообщений";
App::$strings["Your software should be updated"] = "Ваше программное обеспечение должно быть обновлено";
App::$strings["Administration"] = "Администрирование";
@@ -1439,6 +1436,7 @@ App::$strings["Please select another location to become primary before removing
App::$strings["Syncing locations"] = "Синхронизировать местоположение";
App::$strings["No locations found."] = "Местоположений не найдено";
App::$strings["Manage Channel Locations"] = "Управление местоположением канала";
+App::$strings["Primary"] = "Основной";
App::$strings["Drop"] = "Удалить";
App::$strings["Sync Now"] = "Синхронизировать";
App::$strings["Please wait several minutes between consecutive operations."] = "Пожалуйста, подождите несколько минут между последовательными операциями.";
@@ -1828,17 +1826,17 @@ App::$strings["Note: as a security measure, you should give the web server write
App::$strings["%s is writable"] = "%s доступен для записи";
App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Эта программа использует каталог хранения для загруженных файлов. Для веб-сервера требуется доступ на запись начиная с верхнего уровня каталога хранения.";
App::$strings["store is writable"] = "хранилище доступно для записи";
-App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "";
-App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "";
+App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "SSL certificate cannot be validated. Замените его или отключите https доступ к этому сайту.";
+App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Если у вас есть https-доступ к вашему сайту или разрешено подключение к TCP-порту 443 (порт https), вы ДОЛЖНЫ использовать сертификат, действительный для браузера. Вы НЕ ДОЛЖНЫ использовать самоподписанные сертификаты!";
App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Эти ограничения приняты поскольку ваши общедоступные публикации могут, например, содержать ссылки на изображения на вашем собственном хабе.";
-App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "";
-App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "";
-App::$strings["Providers are available that issue free certificates which are browser-valid."] = "";
-App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "";
-App::$strings["SSL certificate validation"] = "";
-App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "";
+App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Если ваш сертификат не признан, пользователи других сайтов (которые могут сами иметь действительные сертификаты) получат предупреждающее сообщение о проблемах с безопасностью.";
+App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Это может привести к проблемам удобства использования из других мест (не только на вашем собственном сайте), поэтому мы настаиваем на этом требовании.";
+App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Доступны поставщики, которые выдают действительные для браузера бесплатные сертификаты.";
+App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "Если вы уверены, что сертификат действителен и подписан доверенным органом, проверьте, установлен ли промежуточные сертификаты. Обычно они не требуются браузерами, но бывают необходимы для связи между серверами.";
+App::$strings["SSL certificate validation"] = "Проверка SSL сертификата";
+App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "Перезапись URL в .htaccess не работает. Проверьте настройки вашего сервера.";
App::$strings["Url rewrite is working"] = "Перезапись URL работает";
-App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "";
+App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Файл конфигурации базы данных \".htconfig.php\" не может быть записан. Используйте прилагаемый текст для создания файла конфигурации в корневом каталоге веб-сервера.";
App::$strings["Errors encountered creating database tables."] = "При создании базы данных возникли ошибки.";
App::$strings["<h1>What next?</h1>"] = "<h1>Что дальше? </h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "Вам понадобится [вручную] настроить запланированную задачу для опрашивателя.";
@@ -2588,14 +2586,14 @@ App::$strings["Addon Features"] = "Настройки расширений";
App::$strings["App Collections"] = "Коллекции приложений";
App::$strings["Installed apps"] = "Установленные приложения";
App::$strings["Remove term"] = "Удалить термин";
-App::$strings["Personal Posts"] = "Личные публикации";
-App::$strings["Show posts that mention or involve me"] = "Показывать публикации где вы были упомянуты или привлечены";
-App::$strings["Starred Posts"] = "Отмеченные публикации";
-App::$strings["Show posts that I have starred"] = "Показывать публикации которые я отметил";
App::$strings["Show posts related to the %s privacy group"] = "Показывать публикации относящиеся к группе безопасности %s";
App::$strings["Show my privacy groups"] = "Показывать мои группы безопасности";
App::$strings["Show posts to this forum"] = "Показывать публикации этого форума";
App::$strings["Show forums"] = "Показывать форумы";
+App::$strings["Starred Posts"] = "Отмеченные публикации";
+App::$strings["Show posts that I have starred"] = "Показывать публикации которые я отметил";
+App::$strings["Personal Posts"] = "Личные публикации";
+App::$strings["Show posts that mention or involve me"] = "Показывать публикации где вы были упомянуты или привлечены";
App::$strings["Show posts that I have filed to %s"] = "Показывать публикации которые я добавил в %s";
App::$strings["Show filed post categories"] = "Показывать категории добавленных публикаций";
App::$strings["Panel search"] = "Панель поиска";
@@ -2824,7 +2822,6 @@ App::$strings["Post to Dreamwidth by default"] = "Публиковать в Drea
App::$strings["Dreamwidth Post Settings"] = "Настройки публикаций в Dreamwidth";
App::$strings["Project Servers and Resources"] = "Серверы и ресурсы проекта";
App::$strings["Project Creator and Tech Lead"] = "Создатель проекта и технический руководитель";
-App::$strings["Admin, developer, directorymin, support bloke"] = "Администратор, разработчик, администратор каталога, поддержка";
App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "И сотни других людей и организаций которые помогали в создании Hubzilla.";
App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Проекты Redmatrix / Hubzilla предоставляются, в основном, добровольцами, которые предоставляют свое время и опыт и, часто, оплачивают из своего кармана услуги, которыми они делятся с другими.";
App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Здесь нет корпоративного финансирования и рекламы, мы не собираем и не продаем вашу личную информацию. (Мы не контролируем вашу личную информацию - <strong>это делаете вы</strong>.)";
@@ -3102,13 +3099,12 @@ App::$strings["This will import all your cloud files from another server."] = "
App::$strings["Hubzilla Server base URL"] = "Базовый URL сервера Hubzilla";
App::$strings["Since modified date yyyy-mm-dd"] = "Начиная с даты изменений yyyy-mm-dd";
App::$strings["Until modified date yyyy-mm-dd"] = "Заканчивая датой изменений yyyy-mm-dd";
-App::$strings["Post to LiveJournal"] = "Опубликовать в LiveJournal";
-App::$strings["Enable LiveJournal Post Plugin"] = "Включить плагин публикаций LiveJournal";
-App::$strings["LiveJournal username"] = "Имя пользователя LiveJournal";
-App::$strings["LiveJournal password"] = "Пароль LiveJournal";
-App::$strings["Post to LiveJournal by default"] = "Публиковать в LiveJournal по умолчанию";
-App::$strings["LiveJournal Post Settings"] = "Настройки публикаций в LiveJournal";
-App::$strings["LiveJournal Settings saved."] = "Настройки LiveJournal сохранены.";
+App::$strings["Post to Livejournal"] = "Опубликовать в Livejournal";
+App::$strings["Enable Livejournal Post Plugin"] = "Включить раширение публикаций в Livejournal";
+App::$strings["Livejournal username"] = "Имя пользователя Livejournal";
+App::$strings["Livejournal password"] = "Пароль Livejournal";
+App::$strings["Post to Livejournal by default"] = "Публиковать в Livejournal по умолчанию";
+App::$strings["Livejournal Post Settings"] = "Настройки публикации в Livejournal";
App::$strings["Post to GNU social"] = "Опубликовать в GNU Social";
App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Пожалуйста свяжитесь с администратором сайта. <br />Предоставленный URL API недействителен.";
App::$strings["We could not contact the GNU social API with the Path you entered."] = "Нам не удалось установить контакт с GNU Social API по введённому вами пути";
diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl
index 5720a2a5f..7dddf9c01 100755
--- a/view/tpl/conv_item.tpl
+++ b/view/tpl/conv_item.tpl
@@ -181,7 +181,7 @@
{{/if}}
{{if $item.edpost && $item.dreport}}
<div class="dropdown-divider"></div>
- <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
+ <a class="dropdown-item" href="dreport/{{$item.dreport_link}}">{{$item.dreport}}</a>
{{/if}}
{{if $item.settings}}
<div class="dropdown-divider"></div>