From fabcf841c9b4a360e2e496d04775e2ef594cb0e3 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Mon, 5 Nov 2018 19:34:10 -0800
Subject: z6 work
---
Zotlabs/Lib/Libzot.php | 9 +++++----
Zotlabs/Zot6/Zot6Handler.php | 3 ++-
install/schema_mysql.sql | 4 ++++
install/schema_postgres.sql | 4 ++++
4 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php
index 2c726aff4..3d18df051 100644
--- a/Zotlabs/Lib/Libzot.php
+++ b/Zotlabs/Lib/Libzot.php
@@ -324,11 +324,12 @@ class Libzot {
logger('zot-info: ' . print_r($record,true), LOGGER_DATA, LOG_DEBUG);
$x = self::import_xchan($record['data'], (($force) ? UPDATE_FLAGS_FORCED : UPDATE_FLAGS_UPDATED));
-
+logger('1');
if(! $x['success'])
return false;
-
+logger('2');
if($channel && $record['data']['permissions']) {
+logger('3');
$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']);
@@ -350,7 +351,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
@@ -2749,7 +2750,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;
diff --git a/Zotlabs/Zot6/Zot6Handler.php b/Zotlabs/Zot6/Zot6Handler.php
index 5597921cc..6fc82501a 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",
+ where xchan_hash ='%s' limit 1",
dbesc($recip)
);
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index ef7e2a516..088c0414d 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`),
@@ -1296,6 +1298,7 @@ CREATE TABLE IF NOT EXISTS `vote` (
CREATE TABLE IF NOT EXISTS `xchan` (
`xchan_hash` char(191) NOT NULL,
+ `xchan_portable_id` char(191) NOT NULL DEFAULT '',,
`xchan_guid` char(191) NOT NULL DEFAULT '',
`xchan_guid_sig` text NOT NULL,
`xchan_pubkey` text NOT NULL,
@@ -1322,6 +1325,7 @@ CREATE TABLE IF NOT EXISTS `xchan` (
`xchan_pubforum` tinyint(1) NOT NULL DEFAULT 0 ,
`xchan_deleted` tinyint(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`xchan_hash`),
+ KEY `xchan_portable_id` (`xchan_portable_id`),
KEY `xchan_guid` (`xchan_guid`),
KEY `xchan_addr` (`xchan_addr`),
KEY `xchan_name` (`xchan_name`),
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index cb4476628..ec4fb63ad 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");
@@ -1267,6 +1269,7 @@ create index "vote_poll" on vote ("vote_poll");
create index "vote_element" on vote ("vote_element");
CREATE TABLE "xchan" (
"xchan_hash" text NOT NULL,
+ "xchan_portable_id" text NOT NULL,
"xchan_guid" text NOT NULL DEFAULT '',
"xchan_guid_sig" text NOT NULL DEFAULT '',
"xchan_pubkey" text NOT NULL DEFAULT '',
@@ -1294,6 +1297,7 @@ CREATE TABLE "xchan" (
"xchan_deleted" smallint NOT NULL DEFAULT '0',
PRIMARY KEY ("xchan_hash")
);
+create index "xchan_portable_id" on xchan ("xchan_portable_id");
create index "xchan_guid" on xchan ("xchan_guid");
create index "xchan_addr" on xchan ("xchan_addr");
create index "xchan_name" on xchan ("xchan_name");
--
cgit v1.2.3
From 3b9aedec5f8445d723e41835ccba6d0add8068c8 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Mon, 5 Nov 2018 19:52:30 -0800
Subject: populate new fields
---
include/channel.php | 57 ++++++++++++++++++++++++++++++++++++++---------------
include/xchan.php | 6 ++++++
2 files changed, 47 insertions(+), 16 deletions(-)
diff --git a/include/channel.php b/include/channel.php
index 22cdb9fe7..030efffb9 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\Zotlib;
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 = Zotlib::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,27 +348,48 @@ 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_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_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_portable_id' => $zhash,
+ '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
]
);
@@ -2355,6 +2379,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/xchan.php b/include/xchan.php
index eb5f1b4a3..5516d046f 100644
--- a/include/xchan.php
+++ b/include/xchan.php
@@ -5,8 +5,14 @@ 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_portable_id' => ((array_key_exists('xchan_portable_id',$arr)) ? $arr['xchan_portable_id'] : ''),
'xchan_guid' => ((array_key_exists('xchan_guid',$arr)) ? $arr['xchan_guid'] : ''),
'xchan_guid_sig' => ((array_key_exists('xchan_guid_sig',$arr)) ? $arr['xchan_guid_sig'] : ''),
'xchan_pubkey' => ((array_key_exists('xchan_pubkey',$arr)) ? $arr['xchan_pubkey'] : ''),
--
cgit v1.2.3
From e7f1d350c92bb2be87adefd33ab877ef6e121af2 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Mon, 5 Nov 2018 21:29:26 -0800
Subject: more zot6 work
---
Zotlabs/Zot6/HTTPSig.php | 44 ++++++++++++++++++++++++++++++++++----------
Zotlabs/Zot6/Zot6Handler.php | 17 +++++++++--------
2 files changed, 43 insertions(+), 18 deletions(-)
diff --git a/Zotlabs/Zot6/HTTPSig.php b/Zotlabs/Zot6/HTTPSig.php
index a0f0d3500..f5c59f9d6 100644
--- a/Zotlabs/Zot6/HTTPSig.php
+++ b/Zotlabs/Zot6/HTTPSig.php
@@ -215,14 +215,19 @@ class HTTPSig {
*/
function get_activitystreams_key($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",
+ $x = q("select * from xchan left join hubloc on xchan_portable_id = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' limit 1",
dbesc(str_replace('acct:','',$id)),
dbesc($id)
);
+ if(! $x) {
+ $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)
+ );
+ }
if($x && $x[0]['xchan_pubkey']) {
- return [ 'portable_id' => $x[0]['xchan_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
+ return [ 'portable_id' => $x[0]['hubloc_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
}
$r = ActivityStreams::fetch_property($id);
@@ -235,19 +240,25 @@ class HTTPSig {
}
}
- return false;
+ return false;
}
function get_webfinger_key($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",
+ $x = q("select * from xchan left join hubloc on xchan_portable_id = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' limit 1",
dbesc(str_replace('acct:','',$id)),
dbesc($id)
);
+ if(! $x) {
+ $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)
+ );
+ }
if($x && $x[0]['xchan_pubkey']) {
- return [ 'portable_id' => $x[0]['xchan_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
+ return [ 'portable_id' => $x[0]['hubloc_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
}
$wf = Webfinger::exec($id);
@@ -269,18 +280,26 @@ class HTTPSig {
}
}
- return (($key['public_key']) ? $key : false);
+ return (($key['public_key']) ? $key : false);
}
function get_zotfinger_key($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",
+ $x = q("select * from xchan left join hubloc on xchan_portable_id = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' limit 1",
dbesc(str_replace('acct:','',$id)),
dbesc($id)
);
+ if(! $x) {
+ $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)
+ );
+ }
+
+
if($x && $x[0]['xchan_pubkey']) {
- return [ 'portable_id' => $x[0]['xchan_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
+ return [ 'portable_id' => $x[0]['hubloc_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
}
$wf = Webfinger::exec($id);
@@ -302,9 +321,14 @@ class HTTPSig {
if($i['success']) {
$key['portable_id'] = $i['hash'];
- $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' limit 1",
+ $x = q("select * from xchan left join hubloc on xchan_portable_id = hubloc_hash where hubloc_id_url = '%s' limit 1",
dbesc($l['href'])
);
+ if(! $x) {
+ $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' limit 1",
+ dbesc($l['href'])
+ );
+ }
if($x) {
$key['hubloc'] = $x[0];
}
diff --git a/Zotlabs/Zot6/Zot6Handler.php b/Zotlabs/Zot6/Zot6Handler.php
index 6fc82501a..1fae81ae6 100644
--- a/Zotlabs/Zot6/Zot6Handler.php
+++ b/Zotlabs/Zot6/Zot6Handler.php
@@ -72,8 +72,8 @@ class Zot6Handler implements IHandler {
foreach ($recipients as $recip) {
$r = q("select channel.*,xchan.* from channel
- left join xchan on channel_hash = xchan_hash
- where xchan_hash ='%s' limit 1",
+ left join xchan on channel_portable_id = xchan_portable_id
+ where xchan_portable_id ='%s' limit 1",
dbesc($recip)
);
@@ -141,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_portable_id where channel_portable_id = '%s' limit 1",
dbesc($arr['portable_id'])
);
if (! $c) {
@@ -197,7 +197,7 @@ class Zot6Handler implements IHandler {
return $ret;
}
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ $r = q("select * from xchan where xchan_hash = '%s' or xchan_portable_id = '%s' limit 1",
dbesc($sender)
);
@@ -231,14 +231,15 @@ 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_portable_id
+ where channel_portable_id = '%s' limit 1",
dbesc($recip)
);
if ($r) {
- $r = q("select abook_id from abook where uid = %d and abook_xchan = '%s' limit 1",
+ $r = q("select abook_id from abook where uid = %d and (abook_xchan = '%s' or abook_xchan = '%s') limit 1",
intval($r[0]['channel_id']),
- dbesc($sender)
+ dbesc($sender),
+ dbesc($r[0]['xchan_portable_id'])
);
if ($r) {
contact_remove($r[0]['channel_id'],$r[0]['abook_id']);
--
cgit v1.2.3
From bb8b3b92913832750a393533f491725b4330a8e1 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Tue, 6 Nov 2018 20:44:40 -0800
Subject: this is brutal
---
Zotlabs/Lib/ActivityStreams.php | 191 +++++++++++++++++++++++++++++++++++-----
Zotlabs/Lib/JSalmon.php | 50 +++++++++--
Zotlabs/Lib/Libzot.php | 74 +++++++++-------
Zotlabs/Lib/Zotfinger.php | 23 +++--
Zotlabs/Module/Channel.php | 44 +++++++++
Zotlabs/Zot6/HTTPSig.php | 90 ++++++++++---------
Zotlabs/Zot6/Receiver.php | 2 +-
Zotlabs/Zot6/Zot6Handler.php | 15 ++--
include/channel.php | 31 ++++++-
include/xchan.php | 1 -
10 files changed, 397 insertions(+), 124 deletions(-)
diff --git a/Zotlabs/Lib/ActivityStreams.php b/Zotlabs/Lib/ActivityStreams.php
index 37e717f58..a322637fd 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','Service','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/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 3d18df051..23703a040 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(),
];
@@ -324,14 +324,19 @@ class Libzot {
logger('zot-info: ' . print_r($record,true), LOGGER_DATA, LOG_DEBUG);
$x = self::import_xchan($record['data'], (($force) ? UPDATE_FLAGS_FORCED : UPDATE_FLAGS_UPDATED));
-logger('1');
+
if(! $x['success'])
return false;
-logger('2');
+
if($channel && $record['data']['permissions']) {
-logger('3');
- $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 $k => $v) {
+ set_abconfig($channel['channel_id'],$x['hash'],'their_perms',$k,$v);
+ }
+ }
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']);
@@ -380,14 +385,16 @@ logger('4');
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');
@@ -410,7 +417,7 @@ logger('4');
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
@@ -426,7 +433,7 @@ logger('4');
[
'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']
]
);
@@ -777,7 +784,7 @@ logger('4');
// 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) {
@@ -1130,7 +1137,7 @@ logger('4');
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) {
@@ -1304,12 +1311,12 @@ logger('4');
$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'];
}
}
}
@@ -1317,7 +1324,7 @@ logger('4');
if($include_sys) {
$sys = get_sys_channel();
if($sys)
- $r[] = $sys['channel_hash'];
+ $r[] = $sys['channel_portable_id'];
}
@@ -1333,7 +1340,7 @@ logger('4');
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)
);
@@ -1354,7 +1361,7 @@ logger('4');
$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)
);
@@ -1428,7 +1435,7 @@ logger('4');
* 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;
@@ -1710,7 +1717,7 @@ logger('4');
$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']);
}
@@ -1810,9 +1817,9 @@ logger('4');
}
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);
}
@@ -2048,7 +2055,7 @@ logger('4');
$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'])
);
@@ -2203,7 +2210,7 @@ logger('4');
$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)
);
@@ -2211,7 +2218,7 @@ logger('4');
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)
);
@@ -2247,7 +2254,7 @@ logger('4');
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) {
@@ -2558,6 +2565,9 @@ logger('4');
static function zotinfo($arr) {
+ logger('arr: ' . print_r($arr,true));
+
+
$ret = [];
$zhash = ((x($arr,'guid_hash')) ? $arr['guid_hash'] : '');
@@ -2594,13 +2604,13 @@ logger('4');
$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)
@@ -2608,7 +2618,7 @@ logger('4');
}
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)
@@ -2628,10 +2638,10 @@ logger('4');
*
*/
- $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");
}
}
@@ -2775,7 +2785,7 @@ logger('4');
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/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');
@@ -43,6 +45,48 @@ class Channel extends Controller {
$profile = 0;
$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/Zot6/HTTPSig.php b/Zotlabs/Zot6/HTTPSig.php
index f5c59f9d6..6d52e5033 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'] = base64url_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);
@@ -215,50 +237,43 @@ class HTTPSig {
*/
function get_activitystreams_key($id) {
- $x = q("select * from xchan left join hubloc on xchan_portable_id = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' limit 1",
- dbesc(str_replace('acct:','',$id)),
- dbesc($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:','',$url)),
+ dbesc($url)
);
- if(! $x) {
- $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)
- );
- }
if($x && $x[0]['xchan_pubkey']) {
- return [ 'portable_id' => $x[0]['hubloc_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
+ 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;
+ return false;
}
function get_webfinger_key($id) {
- $x = q("select * from xchan left join hubloc on xchan_portable_id = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' limit 1",
+ $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)
);
- if(! $x) {
- $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)
- );
- }
if($x && $x[0]['xchan_pubkey']) {
- return [ 'portable_id' => $x[0]['hubloc_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
+ return [ 'portable_id' => $x[0]['xchan_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
}
$wf = Webfinger::exec($id);
@@ -280,26 +295,18 @@ class HTTPSig {
}
}
- return (($key['public_key']) ? $key : false);
+ return (($key['public_key']) ? $key : false);
}
function get_zotfinger_key($id) {
- $x = q("select * from xchan left join hubloc on xchan_portable_id = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' limit 1",
+ $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)
);
- if(! $x) {
- $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)
- );
- }
-
-
if($x && $x[0]['xchan_pubkey']) {
- return [ 'portable_id' => $x[0]['hubloc_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
+ return [ 'portable_id' => $x[0]['xchan_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ];
}
$wf = Webfinger::exec($id);
@@ -321,14 +328,9 @@ class HTTPSig {
if($i['success']) {
$key['portable_id'] = $i['hash'];
- $x = q("select * from xchan left join hubloc on xchan_portable_id = hubloc_hash where hubloc_id_url = '%s' limit 1",
+ $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' limit 1",
dbesc($l['href'])
);
- if(! $x) {
- $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' limit 1",
- dbesc($l['href'])
- );
- }
if($x) {
$key['hubloc'] = $x[0];
}
@@ -433,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 1fae81ae6..e320e7825 100644
--- a/Zotlabs/Zot6/Zot6Handler.php
+++ b/Zotlabs/Zot6/Zot6Handler.php
@@ -72,8 +72,8 @@ class Zot6Handler implements IHandler {
foreach ($recipients as $recip) {
$r = q("select channel.*,xchan.* from channel
- left join xchan on channel_portable_id = xchan_portable_id
- where xchan_portable_id ='%s' limit 1",
+ left join xchan on channel_portable_id = xchan_hash
+ where xchan_hash ='%s' limit 1",
dbesc($recip)
);
@@ -141,7 +141,7 @@ class Zot6Handler implements IHandler {
$arr = $data['recipients'][0];
- $c = q("select * from channel left join xchan on channel_portable_id = xchan_portable_id where channel_portable_id = '%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) {
@@ -197,7 +197,7 @@ class Zot6Handler implements IHandler {
return $ret;
}
- $r = q("select * from xchan where xchan_hash = '%s' or xchan_portable_id = '%s' limit 1",
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($sender)
);
@@ -231,15 +231,14 @@ class Zot6Handler implements IHandler {
// basically this means "unfriend"
foreach ($recipients as $recip) {
$r = q("select channel.*,xchan.* from channel
- left join xchan on channel_portable_id = xchan_portable_id
+ left join xchan on channel_portable_id = xchan_hash
where channel_portable_id = '%s' limit 1",
dbesc($recip)
);
if ($r) {
- $r = q("select abook_id from abook where uid = %d and (abook_xchan = '%s' or abook_xchan = '%s') limit 1",
+ $r = q("select abook_id from abook where uid = %d and abook_xchan = '%s' limit 1",
intval($r[0]['channel_id']),
- dbesc($sender),
- dbesc($r[0]['xchan_portable_id'])
+ dbesc($sender)
);
if ($r) {
contact_remove($r[0]['channel_id'],$r[0]['abook_id']);
diff --git a/include/channel.php b/include/channel.php
index 030efffb9..1e5570f6b 100644
--- a/include/channel.php
+++ b/include/channel.php
@@ -10,7 +10,7 @@ use Zotlabs\Access\Permissions;
use Zotlabs\Daemon\Master;
use Zotlabs\Lib\System;
use Zotlabs\Render\Comanche;
-use Zotlabs\Lib\Zotlib;
+use Zotlabs\Lib\Libzot;
require_once('include/zot.php');
require_once('include/crypto.php');
@@ -233,7 +233,7 @@ function create_identity($arr) {
$sig = base64url_encode(rsa_sign($guid,$key['prvkey']));
$hash = make_xchan_hash($guid,$sig);
- $zhash = Zotlib::make_xchan_hash($guid,$key['pubkey']);
+ $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
@@ -353,10 +353,12 @@ function create_identity($arr) {
'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'),
@@ -373,7 +375,6 @@ function create_identity($arr) {
$r = xchan_store_lowlevel(
[
'xchan_hash' => $hash,
- 'xchan_portable_id' => $zhash,
'xchan_guid' => $guid,
'xchan_guid_sig' => $sig,
'xchan_pubkey' => $key['pubkey'],
@@ -393,6 +394,30 @@ function create_identity($arr) {
]
);
+ $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
diff --git a/include/xchan.php b/include/xchan.php
index 5516d046f..4cbfb42c5 100644
--- a/include/xchan.php
+++ b/include/xchan.php
@@ -12,7 +12,6 @@ function xchan_store_lowlevel($arr) {
$store = [
'xchan_hash' => ((array_key_exists('xchan_hash',$arr)) ? $arr['xchan_hash'] : ''),
- 'xchan_portable_id' => ((array_key_exists('xchan_portable_id',$arr)) ? $arr['xchan_portable_id'] : ''),
'xchan_guid' => ((array_key_exists('xchan_guid',$arr)) ? $arr['xchan_guid'] : ''),
'xchan_guid_sig' => ((array_key_exists('xchan_guid_sig',$arr)) ? $arr['xchan_guid_sig'] : ''),
'xchan_pubkey' => ((array_key_exists('xchan_pubkey',$arr)) ? $arr['xchan_pubkey'] : ''),
--
cgit v1.2.3
From a5483a03c90967eea58f5a0db17c59c4ec3ff2ff Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Tue, 6 Nov 2018 21:44:57 -0800
Subject: fix signatures
---
Zotlabs/Zot6/HTTPSig.php | 2 +-
include/network.php | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Zotlabs/Zot6/HTTPSig.php b/Zotlabs/Zot6/HTTPSig.php
index 6d52e5033..72785b1e9 100644
--- a/Zotlabs/Zot6/HTTPSig.php
+++ b/Zotlabs/Zot6/HTTPSig.php
@@ -162,7 +162,7 @@ class HTTPSig {
if(! $x) {
logger('verify failed for ' . $result['signer'] . ' alg=' . $algorithm . (($key['public_key']) ? '' : ' no key'));
- $sig_block['signature'] = base64url_encode($sig_block['signature']);
+ $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));
diff --git a/include/network.php b/include/network.php
index f976dcc35..d37da05f7 100644
--- a/include/network.php
+++ b/include/network.php
@@ -233,7 +233,7 @@ function z_post_url($url, $params, $redirects = 0, $opts = array()) {
return $ret;
if(! array_key_exists('request_target',$opts)) {
- $opts['request_target'] = 'get ' . get_request_string($url);
+ $opts['request_target'] = 'post ' . get_request_string($url);
}
@curl_setopt($ch, CURLOPT_HEADER, true);
--
cgit v1.2.3
From 4e6758e31de60263e3a630c562efb93a11c57edf Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 8 Nov 2018 15:51:52 -0800
Subject: item db updates
---
install/schema_mysql.sql | 3 +++
install/schema_postgres.sql | 3 +++
2 files changed, 6 insertions(+)
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index 088c0414d..8ece64ae2 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -579,6 +579,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 ,
@@ -597,6 +598,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 '',
@@ -651,6 +653,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 ec4fb63ad..6e2a09ebf 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -550,6 +550,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',
@@ -568,6 +569,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 '',
@@ -625,6 +627,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");
--
cgit v1.2.3
From 3fe2491b737375e7c616c47366d5ab6f1c4fb851 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 8 Nov 2018 15:53:48 -0800
Subject: didn't need xchan_portable_id
---
install/schema_mysql.sql | 2 --
install/schema_postgres.sql | 2 --
2 files changed, 4 deletions(-)
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index 8ece64ae2..fb8cd63f7 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -1301,7 +1301,6 @@ CREATE TABLE IF NOT EXISTS `vote` (
CREATE TABLE IF NOT EXISTS `xchan` (
`xchan_hash` char(191) NOT NULL,
- `xchan_portable_id` char(191) NOT NULL DEFAULT '',,
`xchan_guid` char(191) NOT NULL DEFAULT '',
`xchan_guid_sig` text NOT NULL,
`xchan_pubkey` text NOT NULL,
@@ -1328,7 +1327,6 @@ CREATE TABLE IF NOT EXISTS `xchan` (
`xchan_pubforum` tinyint(1) NOT NULL DEFAULT 0 ,
`xchan_deleted` tinyint(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`xchan_hash`),
- KEY `xchan_portable_id` (`xchan_portable_id`),
KEY `xchan_guid` (`xchan_guid`),
KEY `xchan_addr` (`xchan_addr`),
KEY `xchan_name` (`xchan_name`),
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index 6e2a09ebf..2fdb2b105 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -1272,7 +1272,6 @@ create index "vote_poll" on vote ("vote_poll");
create index "vote_element" on vote ("vote_element");
CREATE TABLE "xchan" (
"xchan_hash" text NOT NULL,
- "xchan_portable_id" text NOT NULL,
"xchan_guid" text NOT NULL DEFAULT '',
"xchan_guid_sig" text NOT NULL DEFAULT '',
"xchan_pubkey" text NOT NULL DEFAULT '',
@@ -1300,7 +1299,6 @@ CREATE TABLE "xchan" (
"xchan_deleted" smallint NOT NULL DEFAULT '0',
PRIMARY KEY ("xchan_hash")
);
-create index "xchan_portable_id" on xchan ("xchan_portable_id");
create index "xchan_guid" on xchan ("xchan_guid");
create index "xchan_addr" on xchan ("xchan_addr");
create index "xchan_name" on xchan ("xchan_name");
--
cgit v1.2.3
From 22b3ddab66f128ca05a42ebfccda0964bddd7509 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 8 Nov 2018 19:24:02 -0800
Subject: refresh packets
---
Zotlabs/Daemon/Notifier.php | 15 ++++++++++++---
Zotlabs/Module/Wfinger.php | 6 ++++++
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index f74c8f11c..48928f5ba 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');
@@ -561,7 +563,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,14 +612,21 @@ class Notifier {
continue;
}
- // default: zot protocol
+ if(! in_array($hub['hubloc_network'], [ 'zot','zot6' ])) {
+ continue;
+ }
$hash = random_string();
$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') {
$pmsg = get_pconfig($channel['channel_id'],'system','keychange');
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
@@ -204,6 +204,12 @@ class Wfinger extends \Zotlabs\Web\Controller {
'href' => z_root() . '/.well-known/zot-info' . '?address=' . $r[0]['xchan_addr'],
],
+ [
+ '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',
--
cgit v1.2.3
From d56e1f6285fd2e4cc7b2f9cd88df88a26c5d2ad7 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 8 Nov 2018 19:49:57 -0800
Subject: begin native summary support
---
Zotlabs/Module/Item.php | 24 +++++++++++++++++++++++-
include/items.php | 15 +++++++++++++--
include/text.php | 23 +++++++++++++++++++++--
3 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 2ee639874..1e1df9d56 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -392,6 +392,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 +455,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 +507,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 +535,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 +597,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);
}
@@ -778,6 +799,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;
diff --git a/include/items.php b/include/items.php
index cae380b01..24f1be84f 100755
--- a/include/items.php
+++ b/include/items.php
@@ -597,6 +597,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 +606,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']);
@@ -749,9 +755,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
@@ -1073,6 +1080,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'];
@@ -1631,6 +1639,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']) : '');
@@ -1651,6 +1660,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);
@@ -2096,6 +2106,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);
diff --git a/include/text.php b/include/text.php
index 15cc0ca8a..3d351f7dc 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");
@@ -3467,3 +3470,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;
+}
--
cgit v1.2.3
From c80ac58effdb71fe457daa164053ea57c1513e68 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 8 Nov 2018 20:42:09 -0800
Subject: add zot6 delivery method
---
Zotlabs/Daemon/Notifier.php | 1 +
include/queue_fn.php | 99 ++++++++++++++++++++++++++++++++++-----------
2 files changed, 77 insertions(+), 23 deletions(-)
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index 48928f5ba..9a4b14d57 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -672,6 +672,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/include/queue_fn.php b/include/queue_fn.php
index f05bac5b0..074e3c407 100644
--- a/include/queue_fn.php
+++ b/include/queue_fn.php
@@ -1,5 +1,9 @@
run(true);
+ logger('returned_json: ' . json_encode($result,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES), LOGGER_DATA);
+ logger('deliver: local zot 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 zot delivery succeeded to ' . $outq['outq_posturl']);
+ Libzot::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);
+ }
- 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
--
cgit v1.2.3
From da452decf695ceac249642ec9d12fb724fa547f7 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Sun, 11 Nov 2018 15:12:01 -0800
Subject: more z6 debugging
---
Zotlabs/Daemon/Notifier.php | 1 +
Zotlabs/Lib/Libzot.php | 5 +++--
Zotlabs/Module/Connedit.php | 5 +++++
include/crypto.php | 9 +++++++--
include/queue_fn.php | 11 +++++------
5 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index 9a4b14d57..c7360b83c 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -645,6 +645,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) : '')
));
diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php
index 23703a040..f0248a85b 100644
--- a/Zotlabs/Lib/Libzot.php
+++ b/Zotlabs/Lib/Libzot.php
@@ -333,8 +333,8 @@ class Libzot {
if($permissions && is_array($permissions)) {
$old_read_stream_perm = get_abconfig($channel['channel_id'],$x['hash'],'their_perms','view_stream');
- foreach($permissions as $k => $v) {
- set_abconfig($channel['channel_id'],$x['hash'],'their_perms',$k,$v);
+ foreach($permissions as $p) {
+ set_abconfig($channel['channel_id'],$x['hash'],'their_perms',$p,'1');
}
}
@@ -974,6 +974,7 @@ logger('4');
}
$x = crypto_unencapsulate($x, get_config('system','prvkey'));
+
if(! is_array($x)) {
$x = json_decode($x,true);
}
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/include/crypto.php b/include/crypto.php
index 1040ac29b..fc1029e55 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)) ? $data['alg'] : '');
+ if(! $alg) {
+ return $data;
+ }
+
+ if($alg === 'aes256cbc') {
return aes_unencapsulate($data,$prvkey);
+ }
return other_unencapsulate($data,$prvkey,$alg);
diff --git a/include/queue_fn.php b/include/queue_fn.php
index 074e3c407..f7e2922c6 100644
--- a/include/queue_fn.php
+++ b/include/queue_fn.php
@@ -237,7 +237,7 @@ function queue_deliver($outq, $immediate = false) {
$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 zot delivery succeeded to ' . $outq['outq_posturl']);
+ logger('deliver: local zot6 delivery succeeded to ' . $outq['outq_posturl']);
Libzot::process_response($outq['outq_posturl'],[ 'success' => true, 'body' => json_encode($result) ], $outq);
}
else {
@@ -250,8 +250,7 @@ function queue_deliver($outq, $immediate = false) {
$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",
+ $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) {
@@ -264,12 +263,12 @@ function queue_deliver($outq, $immediate = false) {
$result = Libzot::zot($outq['outq_posturl'],$msg,$channel,$host_crypto);
if($result['success']) {
- logger('deliver: remote zot delivery succeeded to ' . $outq['outq_posturl']);
+ logger('deliver: remote zot6 delivery succeeded to ' . $outq['outq_posturl']);
Libzot::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);
+ 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);
}
--
cgit v1.2.3
From 171ff54ea407595a85e971f62abc556faf3dec73 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Sun, 11 Nov 2018 21:55:10 -0800
Subject: translate zot message packets to zot6 for delivery
---
Zotlabs/Daemon/Notifier.php | 47 +++++++++++++++++++++++++++++++++------------
1 file changed, 35 insertions(+), 12 deletions(-)
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index c7360b83c..8b81c49da 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -346,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.
@@ -616,7 +625,7 @@ class Notifier {
continue;
}
- $hash = random_string();
+ $hash = new_uuid();
$packet = null;
$pmsg = '';
@@ -628,11 +637,11 @@ class Notifier {
$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)
@@ -653,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(
--
cgit v1.2.3
From 770fdb2b7d095d763d43ffe8d2f6b5b2182673cb Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Mon, 12 Nov 2018 16:08:22 -0800
Subject: dreport updates
---
Zotlabs/Daemon/Deliver.php | 7 ++--
Zotlabs/Lib/DReport.php | 84 +++++++++++++++++++++++++++++++++++++++++++--
Zotlabs/Module/Dreport.php | 20 ++++++++---
include/zot.php | 10 +++---
install/schema_mysql.sql | 1 +
install/schema_postgres.sql | 1 +
6 files changed, 110 insertions(+), 13 deletions(-)
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/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/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/include/zot.php b/include/zot.php
index 49fc89e33..756a5bde6 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');
@@ -1120,7 +1122,7 @@ 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)) {
+ 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_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ",
dbesc($xx['message_id']),
dbesc($xx['location']),
@@ -1748,7 +1750,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 +2299,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 +3989,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');
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index fb8cd63f7..c820fca25 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -405,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 '',
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index 2fdb2b105..3bc256377 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -377,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 '',
--
cgit v1.2.3
From 1a2df9c51c4692fce433f483aba1b91738609df7 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Mon, 12 Nov 2018 18:25:55 -0800
Subject: item uuid changes
---
Zotlabs/Module/Item.php | 4 +++-
include/items.php | 10 +++++++++-
include/text.php | 21 ++-------------------
3 files changed, 14 insertions(+), 21 deletions(-)
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 1e1df9d56..464daa516 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -732,7 +732,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;
}
@@ -787,6 +788,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;
diff --git a/include/items.php b/include/items.php
index 24f1be84f..3d707a492 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']);
@@ -635,6 +639,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) : '');
@@ -1070,6 +1075,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'];
@@ -1648,6 +1654,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 );
@@ -2183,6 +2190,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']);
diff --git a/include/text.php b/include/text.php
index 3d351f7dc..d3130023c 100644
--- a/include/text.php
+++ b/include/text.php
@@ -574,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;
}
/**
@@ -596,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;
}
/**
--
cgit v1.2.3
From ee85784be18c14905568fb259411f490c8d6bd91 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Tue, 13 Nov 2018 19:55:43 -0800
Subject: stay ahead of the game
---
include/network.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
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));
--
cgit v1.2.3
From 62b367fa8177ed16958864a4799a0a2a9aa0119b Mon Sep 17 00:00:00 2001
From: Mario Vavti
Date: Wed, 14 Nov 2018 11:22:41 +0100
Subject: version 3.9.5
---
boot.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/boot.php b/boot.php
index f4ef1a036..53aad48c9 100755
--- a/boot.php
+++ b/boot.php
@@ -50,7 +50,7 @@ require_once('include/attach.php');
require_once('include/bbcode.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
-define ( 'STD_VERSION', '3.8.4' );
+define ( 'STD_VERSION', '3.9.5' );
define ( 'ZOT_REVISION', '6.0a' );
define ( 'DB_UPDATE_VERSION', 1225 );
--
cgit v1.2.3
From 71cc2d7d5d7c74e7743a39720b3c418b95dba16e Mon Sep 17 00:00:00 2001
From: OJ Random
Date: Wed, 14 Nov 2018 16:27:27 +0100
Subject: localhost, URLs, version updates
---
.homeinstall/README.md | 28 +++++++++++++++----------
.homeinstall/hubzilla-config.txt.template | 2 ++
.homeinstall/hubzilla-setup.sh | 34 ++++++++++++++++++++++++-------
3 files changed, 46 insertions(+), 18 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
--
cgit v1.2.3
From bf013ecf00c710d6056890a6994eedd096121841 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 16:40:30 -0800
Subject: db updates for zot6
---
Zotlabs/Update/_1226.php | 78 ++++++++++++++++++++++++++++++++++++++++++++++++
Zotlabs/Update/_1227.php | 30 +++++++++++++++++++
Zotlabs/Update/_1228.php | 37 +++++++++++++++++++++++
3 files changed, 145 insertions(+)
create mode 100644 Zotlabs/Update/_1226.php
create mode 100644 Zotlabs/Update/_1227.php
create mode 100644 Zotlabs/Update/_1228.php
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 @@
+
Date: Wed, 14 Nov 2018 16:56:07 -0800
Subject: change db update counter
---
boot.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/boot.php b/boot.php
index 53aad48c9..c74309be0 100755
--- a/boot.php
+++ b/boot.php
@@ -53,7 +53,7 @@ define ( 'PLATFORM_NAME', 'hubzilla' );
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__ );
--
cgit v1.2.3
From ab2376f8d85877f95c20fad3a3ece4ef517e083b Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 17:42:02 -0800
Subject: fix dreport link
---
Zotlabs/Lib/ThreadItem.php | 7 +++++--
view/tpl/conv_item.tpl | 2 +-
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index 78714c2c4..93d8aa3a5 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -299,8 +299,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 +318,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 +366,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/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}}
- {{$item.dreport}}
+ {{$item.dreport}}
{{/if}}
{{if $item.settings}}
--
cgit v1.2.3
From 65a8965e85853b624f64a03930dfbe39a1a339cc Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 18:07:39 -0800
Subject: extra logging
---
Zotlabs/Web/HTTPSig.php | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Zotlabs/Web/HTTPSig.php b/Zotlabs/Web/HTTPSig.php
index f27aa0556..0ec534948 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 = [];
--
cgit v1.2.3
From d0f0a74df8835e54b42daf5b96e53eecc0481c71 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 18:14:47 -0800
Subject: encrypted header issue
---
Zotlabs/Web/HTTPSig.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Zotlabs/Web/HTTPSig.php b/Zotlabs/Web/HTTPSig.php
index 0ec534948..fe0b9428f 100644
--- a/Zotlabs/Web/HTTPSig.php
+++ b/Zotlabs/Web/HTTPSig.php
@@ -401,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 '';
--
cgit v1.2.3
From 4a06378d672cd355e337b2456096e76f698cf163 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 18:19:35 -0800
Subject: crypto fix
---
include/crypto.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/crypto.php b/include/crypto.php
index fc1029e55..39bfd8d43 100644
--- a/include/crypto.php
+++ b/include/crypto.php
@@ -225,7 +225,7 @@ function crypto_unencapsulate($data,$prvkey) {
if(! $data)
return;
- $alg = ((is_array($data) && array_key_exists('encrypted',$data)) ? $data['alg'] : '');
+ $alg = ((is_array($data) && (array_key_exists('encrypted',$data) || array_key_exists('iv',$data))) ? $data['alg'] : '');
if(! $alg) {
return $data;
}
--
cgit v1.2.3
From 5f166158c3900bd85a204d3b7741d8e190a92bc4 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 18:25:02 -0800
Subject: filter by network
---
include/zot.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/zot.php b/include/zot.php
index 756a5bde6..b0d6ffd61 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -83,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)
);
@@ -656,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']),
--
cgit v1.2.3
From 079e2af0c07f54f521cdee9b31b8be4dd1acd159 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 18:33:00 -0800
Subject: check keyid
---
include/zot.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/zot.php b/include/zot.php
index b0d6ffd61..12bd9995c 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -5187,7 +5187,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' ",
--
cgit v1.2.3
From 830c2472cb7b2b1d53f1d99062f37e52c4aa7074 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 18:39:23 -0800
Subject: more logging
---
include/zot.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/zot.php b/include/zot.php
index 12bd9995c..26eaee6b3 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -5197,6 +5197,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;
--
cgit v1.2.3
From db4ff56f0b5c4610ef6706af39ac496b5d98e69b Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 18:41:36 -0800
Subject: more logging
---
include/zot.php | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/zot.php b/include/zot.php
index 26eaee6b3..2fca33a96 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -1189,6 +1189,8 @@ function zot_fetch($arr) {
$zret = zot6_check_sig();
+ logger('zret: ' . print_r($zret,true));
+
if($zret['success'] && $zret['hubloc'] && $zret['hubloc']['hubloc_guid'] === $data['sender']['guid'] && $data['msg']) {
logger('zot6_delivery',LOGGER_DEBUG);
logger('zot6_data: ' . print_r($data,true),LOGGER_DATA);
--
cgit v1.2.3
From 9c25f300cf5032076c98bd597355c88e7ec08a34 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 18:56:38 -0800
Subject: fixes to old z6 delivery
---
include/zot.php | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/include/zot.php b/include/zot.php
index 2fca33a96..580220182 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -1189,15 +1189,14 @@ function zot_fetch($arr) {
$zret = zot6_check_sig();
- logger('zret: ' . print_r($zret,true));
+ if($zret['success'] && $zret['hubloc'] && $zret['hubloc']['hubloc_guid'] === $arr['sender']['guid'] && $arr['msg']) {
- if($zret['success'] && $zret['hubloc'] && $zret['hubloc']['hubloc_guid'] === $data['sender']['guid'] && $data['msg']) {
logger('zot6_delivery',LOGGER_DEBUG);
- logger('zot6_data: ' . print_r($data,true),LOGGER_DATA);
+ logger('zot6_data: ' . print_r($arr,true),LOGGER_DATA);
$ret['collected'] = true;
- $import = [ 'success' => true, 'body' => json_encode( [ 'success' => true, 'pickup' => [ [ 'notify' => $data, 'message' => json_decode($data['msg'],true) ] ] ] ) ];
+ $import = [ 'success' => true, 'body' => json_encode( [ 'success' => true, 'pickup' => [ [ 'notify' => $arr, 'message' => json_decode($arr['msg'],true) ] ] ] ) ];
$hubs = [ $zret['hubloc'] ] ;
}
--
cgit v1.2.3
From 034f23b47ee38a237637a34ef02bc9aec4773f7f Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 19:09:18 -0800
Subject: update httpsig unit test which is failing
---
tests/unit/Web/HttpSigTest.php | 2 ++
1 file changed, 2 insertions(+)
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',
--
cgit v1.2.3
From b11858bcaca9a5784f37e5b69eb7ca6096d0bde3 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 14 Nov 2018 20:34:00 -0800
Subject: separate by network
---
Zotlabs/Lib/Libzot.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php
index f0248a85b..010735487 100644
--- a/Zotlabs/Lib/Libzot.php
+++ b/Zotlabs/Lib/Libzot.php
@@ -508,6 +508,7 @@ logger('4');
$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']),
--
cgit v1.2.3
From ca4e7f9b4fab7035e511582a0755d58e9e4fa2f0 Mon Sep 17 00:00:00 2001
From: Mario Vavti
Date: Thu, 15 Nov 2018 10:11:04 +0100
Subject: fix update 1228
---
Zotlabs/Update/_1228.php | 1 -
1 file changed, 1 deletion(-)
diff --git a/Zotlabs/Update/_1228.php b/Zotlabs/Update/_1228.php
index b9ba1d86f..f8a506bb4 100644
--- a/Zotlabs/Update/_1228.php
+++ b/Zotlabs/Update/_1228.php
@@ -25,7 +25,6 @@ class _1228 {
if($r) {
q("COMMIT");
- self::upgrade();
return UPDATE_SUCCESS;
}
--
cgit v1.2.3
From a7d2f9b53005f0c27ddfe1ef32fab78591c5374f Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 15 Nov 2018 15:35:06 -0800
Subject: remove checkjs and nojs
---
Zotlabs/Module/Nojs.php | 15 ---------------
Zotlabs/Web/CheckJS.php | 50 -------------------------------------------------
2 files changed, 65 deletions(-)
delete mode 100644 Zotlabs/Module/Nojs.php
delete mode 100644 Zotlabs/Web/CheckJS.php
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 @@
- 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/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 @@
-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" . '' . "\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" . '' . "\r\n";
- }
- }
-
- }
-
- function disabled() {
- return $this->jsdisabled;
- }
-
-
-}
-
-
--
cgit v1.2.3
From 8d2f4d9dfd90d218a68e0e36ccf537d800b09755 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 15 Nov 2018 16:02:29 -0800
Subject: mid -> uuid conversions for basic reactions
---
Zotlabs/Module/Like.php | 6 ++++--
Zotlabs/Module/React.php | 4 +++-
2 files changed, 7 insertions(+), 3 deletions(-)
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/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'];
--
cgit v1.2.3
From 39d914c9dfe87021351cb2aad9feedd381e791ec Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 15 Nov 2018 16:34:09 -0800
Subject: add item.uuid to relevant places
---
Zotlabs/Lib/NativeWiki.php | 17 ++++-------------
Zotlabs/Module/Impel.php | 8 +++++---
Zotlabs/Module/Mood.php | 4 +++-
Zotlabs/Module/Subthread.php | 6 ++++--
include/activities.php | 3 ++-
include/attach.php | 14 +++++++++-----
include/event.php | 7 +++++--
include/help.php | 3 ++-
include/import.php | 3 ++-
include/items.php | 3 ++-
include/photos.php | 8 ++++++--
11 files changed, 44 insertions(+), 32 deletions(-)
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/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/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/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/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..6b0d3fb3b 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -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/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 3d707a492..2baad3d04 100755
--- a/include/items.php
+++ b/include/items.php
@@ -4765,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/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;
--
cgit v1.2.3
From 5162459e4a77ccd1e4a4a68a2deae2a231947f62 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 15 Nov 2018 18:07:58 -0800
Subject: delivery report issue
---
include/zot.php | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/include/zot.php b/include/zot.php
index 580220182..9208a6a99 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -1121,12 +1121,13 @@ function zot_process_response($hub, $arr, $outq) {
}
foreach($x['delivery_report'] as $xx) {
- call_hooks('dreport_process',$xx);
+ 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_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ",
+ 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($xx['sender'])
--
cgit v1.2.3
From e42a401987bb34eed4d90bf22e36652fc907b063 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 15 Nov 2018 20:50:47 -0800
Subject: more work on the mid/uuid conversion
---
Zotlabs/Module/Item.php | 36 +++++++++++++++++++-----------------
1 file changed, 19 insertions(+), 17 deletions(-)
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 464daa516..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() {
@@ -911,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);
}
@@ -948,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)
@@ -983,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'],
@@ -1001,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'],
@@ -1063,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');
--
cgit v1.2.3
From b0689614bff4272f90b0c3f064ca91b16cb392e0 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 15 Nov 2018 21:14:14 -0800
Subject: datetime_convert wrong args
---
Zotlabs/Lib/Libzot.php | 2 +-
include/zot.php | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php
index 010735487..70f013eb7 100644
--- a/Zotlabs/Lib/Libzot.php
+++ b/Zotlabs/Lib/Libzot.php
@@ -1006,7 +1006,7 @@ logger('4');
dbesc($xx['recipient']),
dbesc($xx['name']),
dbesc($xx['status']),
- dbesc(datetime_convert($xx['date'])),
+ dbesc(datetime_convert('UTC','UTC',$xx['date'])),
dbesc($xx['sender'])
);
}
diff --git a/include/zot.php b/include/zot.php
index 9208a6a99..d031b4a96 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -1129,7 +1129,7 @@ function zot_process_response($hub, $arr, $outq) {
dbesc($xx['recipient']),
dbesc($xx['name']),
dbesc($xx['status']),
- dbesc(datetime_convert($xx['date'])),
+ dbesc(datetime_convert('UTC','UTC',$xx['date'])),
dbesc($xx['sender'])
);
}
--
cgit v1.2.3
From 4812c5486db3f49cd1df34f8678c51369ac76d7a Mon Sep 17 00:00:00 2001
From: Mario Vavti
Date: Fri, 16 Nov 2018 21:14:11 +0000
Subject: strlen($this->imageString()) does not return the correct size when
dealing with os_storage images. use filesize() instead.
(cherry picked from commit afc75af62f759181bbe6a806b523c6ca52126f5f)
---
include/photo/photo_driver.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php
index 4173d727e..b70a13622 100644
--- a/include/photo/photo_driver.php
+++ b/include/photo/photo_driver.php
@@ -413,7 +413,7 @@ abstract class photo_driver {
intval($p['width']),
(intval($p['os_storage']) ? dbescbin($p['os_syspath']) : dbescbin($this->imageString())),
intval($p['os_storage']),
- intval(strlen($this->imageString())),
+ (intval($p['os_storage']) ? @filesize($p['os_syspath']) : strlen($this->imageString())),
intval($p['imgscale']),
intval($p['photo_usage']),
dbesc($p['title']),
@@ -445,7 +445,7 @@ abstract class photo_driver {
intval($p['width']),
(intval($p['os_storage']) ? dbescbin($p['os_syspath']) : dbescbin($this->imageString())),
intval($p['os_storage']),
- intval(strlen($this->imageString())),
+ (intval($p['os_storage']) ? @filesize($p['os_syspath']) : strlen($this->imageString())),
intval($p['imgscale']),
intval($p['photo_usage']),
dbesc($p['title']),
--
cgit v1.2.3
From 6010b5c6198bf49c39029a657443b5bf1be8b408 Mon Sep 17 00:00:00 2001
From: Max Kostikov
Date: Fri, 16 Nov 2018 23:14:10 +0100
Subject: Fix return on wrong sotred in Content-Length size for full size
photos
---
Zotlabs/Module/Photo.php | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index 30e8340e2..91175c7df 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -163,11 +163,13 @@ class Photo extends \Zotlabs\Web\Controller {
if($exists && $allowed) {
$data = dbunescbin($e[0]['content']);
- $filesize = $e[0]['filesize'];
$mimetype = $e[0]['mimetype'];
$modified = strtotime($e[0]['edited'] . 'Z');
- if(intval($e[0]['os_storage']))
+ if(intval($e[0]['os_storage'])) {
$streaming = $data;
+ }
+ else
+ $filesize = $e[0]['filesize'];
if($e[0]['allow_cid'] != '' || $e[0]['allow_gid'] != '' || $e[0]['deny_gid'] != '' || $e[0]['deny_gid'] != '')
$prvcachecontrol = true;
}
--
cgit v1.2.3
From 238a616292ad5c6e7be97a4dd763a302729abf80 Mon Sep 17 00:00:00 2001
From: Max Kostikov
Date: Fri, 16 Nov 2018 23:33:45 +0100
Subject: Add filesize for streaming content
---
Zotlabs/Module/Photo.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index 91175c7df..be9d55eb2 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -167,6 +167,7 @@ class Photo extends \Zotlabs\Web\Controller {
$modified = strtotime($e[0]['edited'] . 'Z');
if(intval($e[0]['os_storage'])) {
$streaming = $data;
+ $filesize = filesize($data);
}
else
$filesize = $e[0]['filesize'];
--
cgit v1.2.3
From 783cca1e13ae480b31ddcffce6f014fbd1cdc34a Mon Sep 17 00:00:00 2001
From: Mario Vavti
Date: Sat, 17 Nov 2018 08:41:26 +0000
Subject: recalculate photo filesize when rotating an image
(cherry picked from commit f15e32d0637fdf84de7cab43b558ec8a383d3cf5)
---
Zotlabs/Module/Photos.php | 29 +++++++++++++++++++----------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php
index 03fd8a53d..21f6293ef 100644
--- a/Zotlabs/Module/Photos.php
+++ b/Zotlabs/Module/Photos.php
@@ -264,7 +264,7 @@ class Photos extends \Zotlabs\Web\Controller {
}
$x = q("update photo set edited = '%s', content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 0",
- dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
dbescbin($data),
intval($fsize),
intval($height),
@@ -278,10 +278,13 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
+ $data = $ph->imageString();
+ $fsize = strlen($data);
- $x = q("update photo set edited = '%s', content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 1",
- dbesc(datetime_convert()),
- dbescbin($ph->imageString()),
+ $x = q("update photo set edited = '%s', content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 1",
+ dbesc(datetime_convert()),
+ dbescbin($data),
+ intval($fsize),
intval($height),
intval($width),
dbesc($resource_id),
@@ -294,10 +297,13 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
+ $data = $ph->imageString();
+ $fsize = strlen($data);
- $x = q("update photo set edited = '%s', content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 2",
- dbesc(datetime_convert()),
- dbescbin($ph->imageString()),
+ $x = q("update photo set edited = '%s', content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 2",
+ dbesc(datetime_convert()),
+ dbescbin($data),
+ intval($fsize),
intval($height),
intval($width),
dbesc($resource_id),
@@ -310,10 +316,13 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
+ $data = $ph->imageString();
+ $fsize = strlen($data);
- $x = q("update photo set edited = '%s', content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 3",
- dbesc(datetime_convert()),
- dbescbin($ph->imageString()),
+ $x = q("update photo set edited = '%s', content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 3",
+ dbesc(datetime_convert()),
+ dbescbin($data),
+ intval($fsize),
intval($height),
intval($width),
dbesc($resource_id),
--
cgit v1.2.3
From 0c94747ab1c740f47e5a796f5c60efcdfcd29ba1 Mon Sep 17 00:00:00 2001
From: Mario Vavti
Date: Sun, 18 Nov 2018 11:02:01 +0100
Subject: fix typo which prevented propagation of comments
---
Zotlabs/Module/Zot.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Zotlabs/Module/Zot.php b/Zotlabs/Module/Zot.php
index 8c34dced1..1cc0e54c9 100644
--- a/Zotlabs/Module/Zot.php
+++ b/Zotlabs/Module/Zot.php
@@ -19,7 +19,7 @@ class Zot extends \Zotlabs\Web\Controller {
function init() {
$zot = new ZotProtocol\Receiver(new ZotProtocol\Zot6Handler());
- json_return_and_die($zot->run(),'application/x-zot+jzon');
+ json_return_and_die($zot->run(),'application/x-zot+json');
}
}
--
cgit v1.2.3
From 3787c490d4fe9c6beda393580e4ee8ad8f7cd6dc Mon Sep 17 00:00:00 2001
From: "DM42.Net (Matt Dent)"
Date: Sun, 18 Nov 2018 07:00:06 -0500
Subject: Fix: delayed items propagate before publication on cloned channels
---
include/items.php | 2 --
1 file changed, 2 deletions(-)
diff --git a/include/items.php b/include/items.php
index 2baad3d04..8268d3fe7 100755
--- a/include/items.php
+++ b/include/items.php
@@ -618,8 +618,6 @@ function get_item_elements($x,$allow_code = false) {
$arr['created'] = datetime_convert('UTC','UTC',$x['created']);
$arr['edited'] = datetime_convert('UTC','UTC',$x['edited']);
- if($arr['created'] > datetime_convert())
- $arr['created'] = datetime_convert();
if($arr['edited'] > datetime_convert())
$arr['edited'] = datetime_convert();
--
cgit v1.2.3
From 0525eb2d29eb83fb157491aab13f268dc9fd3c15 Mon Sep 17 00:00:00 2001
From: Mario Vavti
Date: Mon, 19 Nov 2018 09:42:18 +0000
Subject: update sql schemas to include update column in pconfig table
(cherry picked from commit ae97649948b8af575441e5a1f5b69db9f627a0e2)
---
install/schema_mysql.sql | 6 +++---
install/schema_postgres.sql | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index c820fca25..3e3e6fe88 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -916,7 +916,6 @@ CREATE TABLE IF NOT EXISTS `outq` (
KEY `outq_priority` (`outq_priority`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
CREATE TABLE IF NOT EXISTS pchan (
`pchan_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`pchan_guid` char(191) NOT NULL DEFAULT '',
@@ -928,15 +927,16 @@ CREATE TABLE IF NOT EXISTS pchan (
KEY `pchan_hash` (`pchan_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
CREATE TABLE IF NOT EXISTS `pconfig` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL DEFAULT 0 ,
`cat` char(191) NOT NULL DEFAULT '',
`k` char(191) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
+ `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`id`),
- UNIQUE KEY `access` (`uid`,`cat`,`k`)
+ UNIQUE KEY `access` (`uid`,`cat`,`k`),
+ KEY `pconfig_updated` (`updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `photo` (
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index 3bc256377..44f98b944 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -897,7 +897,6 @@ create index "outq_async" on outq ("outq_async");
create index "outq_delivered" on outq ("outq_delivered");
create index "outq_priority" on outq ("outq_priority");
-
CREATE TABLE "pchan" (
"pchan_id" serial NOT NULL,
"pchan_guid" text NOT NULL,
@@ -906,7 +905,6 @@ CREATE TABLE "pchan" (
"pchan_prvkey" text NOT NULL,
PRIMARY KEY ("pchan_id")
);
-
create index "pchan_guid" on pchan ("pchan_guid");
create index "pchan_hash" on pchan ("pchan_hash");
@@ -916,9 +914,11 @@ CREATE TABLE "pconfig" (
"cat" text NOT NULL,
"k" text NOT NULL,
"v" text NOT NULL,
+ "updated" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY ("id"),
UNIQUE ("uid","cat","k")
);
+create index "pconfig_updated_idx" on pconfig ("updated");
CREATE TABLE "photo" (
"id" serial NOT NULL,
--
cgit v1.2.3
From dffc0a4ed8fc04f0e95bbee1941509fb6b859913 Mon Sep 17 00:00:00 2001
From: Mario Vavti
Date: Mon, 19 Nov 2018 10:10:22 +0000
Subject: changelog
(cherry picked from commit 5cb4cdaa5e42f87e9d26501150d6d689b56a1cd2)
---
CHANGELOG | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 59e8bdfc9..b11016eba 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,12 @@
+Hubzilla 3.8.5 (2018-11-19)
+ - Fix pconfig for new installs
+ - Fix delayed publication of posts in combination with channel clones
+ - Fix issue where photo filesize was not updated in the DB when a photo was edited
+ - Fix issue where the original photo size was not set correct in the DB
+ - Fix delivery issue in zot_fetch()
+ - Fix typo in channel reputation addon
+
+
Hubzilla 3.8.4 (2018-11-14)
- Fix xss issue (thanks to Eduardo)
- Implement hook in enotify to be used by superblock
--
cgit v1.2.3
From af0c2f59cc1a51d2e1847682f6d66ab4dc600004 Mon Sep 17 00:00:00 2001
From: Mario
Date: Mon, 19 Nov 2018 13:11:04 +0100
Subject: Revert "Add filesize for streaming content"
This reverts commit 238a616292ad5c6e7be97a4dd763a302729abf80
---
Zotlabs/Module/Photo.php | 1 -
1 file changed, 1 deletion(-)
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index be9d55eb2..91175c7df 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -167,7 +167,6 @@ class Photo extends \Zotlabs\Web\Controller {
$modified = strtotime($e[0]['edited'] . 'Z');
if(intval($e[0]['os_storage'])) {
$streaming = $data;
- $filesize = filesize($data);
}
else
$filesize = $e[0]['filesize'];
--
cgit v1.2.3
From 73b836c73d6804bc29d7de89cd6397bfe857f9d7 Mon Sep 17 00:00:00 2001
From: Mario
Date: Mon, 19 Nov 2018 13:11:18 +0100
Subject: Revert "Fix return on wrong sotred in Content-Length size for full
size photos"
This reverts commit 6010b5c6198bf49c39029a657443b5bf1be8b408
---
Zotlabs/Module/Photo.php | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index 91175c7df..30e8340e2 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -163,13 +163,11 @@ class Photo extends \Zotlabs\Web\Controller {
if($exists && $allowed) {
$data = dbunescbin($e[0]['content']);
+ $filesize = $e[0]['filesize'];
$mimetype = $e[0]['mimetype'];
$modified = strtotime($e[0]['edited'] . 'Z');
- if(intval($e[0]['os_storage'])) {
+ if(intval($e[0]['os_storage']))
$streaming = $data;
- }
- else
- $filesize = $e[0]['filesize'];
if($e[0]['allow_cid'] != '' || $e[0]['allow_gid'] != '' || $e[0]['deny_gid'] != '' || $e[0]['deny_gid'] != '')
$prvcachecontrol = true;
}
--
cgit v1.2.3
From da44ab0529602d9d38db42ad21979c297f4c22eb Mon Sep 17 00:00:00 2001
From: Max Kostikov
Date: Mon, 19 Nov 2018 13:51:54 +0100
Subject: Replace hstrings.php
---
view/ru/hstrings.php | 44 ++++++++++++++++++++------------------------
1 file changed, 20 insertions(+), 24 deletions(-)
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["What next?
"] = "Что дальше?
";
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 - you do.)"] = "Здесь нет корпоративного финансирования и рекламы, мы не собираем и не продаем вашу личную информацию. (Мы не контролируем вашу личную информацию - это делаете вы.)";
@@ -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.
The provided API URL is not valid."] = "Пожалуйста свяжитесь с администратором сайта.
Предоставленный URL API недействителен.";
App::$strings["We could not contact the GNU social API with the Path you entered."] = "Нам не удалось установить контакт с GNU Social API по введённому вами пути";
--
cgit v1.2.3
From 4dea1b5a0d719832a1d989099cb806f5d518b231 Mon Sep 17 00:00:00 2001
From: Max Kostikov
Date: Mon, 19 Nov 2018 13:52:31 +0100
Subject: Replace hmessages.po
---
view/ru/hmessages.po | 1361 +++++++++++++++++++++++++-------------------------
1 file changed, 673 insertions(+), 688 deletions(-)
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 \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 “%3$s”"
msgstr "%1$s изменил %2$s на “%3$s”"
-#: ../../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 privacy settings, 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 privacy settings, which have higher priority than "
@@ -9980,11 +9972,11 @@ msgid ""
"any impact unless the inherited setting changes."
msgstr "Некоторые разрешения могут быть унаследованы из настроек приватности вашего канала, которые могут иметь более высокий приоритет чем индивидуальные. Вы можете изменить эти настройки, однако они не будут применены до изменения переданных по наследству настроек."
-#: ../../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 - "
"you do.)"
msgstr "Здесь нет корпоративного финансирования и рекламы, мы не собираем и не продаем вашу личную информацию. (Мы не контролируем вашу личную информацию - это делаете вы.)"
-#: ../../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 ""
"Or become a project sponsor (Hubzilla Project only)"
msgstr "или станьте спонсором проекта (только для 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! Желаете получить обзор пользовательского интерфейса?
Вы можете его приостановаить и в любое время перезагрузив страницу или перейдя на другую.
Также вы можете нажать клавишу \"Назад\""
-#: ../../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 "Включить оповещения"
--
cgit v1.2.3
From 7aaa1973f492c3505b132a1f6af6c897fa6e0581 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Mon, 19 Nov 2018 15:04:08 -0800
Subject: push recent changes
---
Zotlabs/Lib/ThreadItem.php | 4 ++++
Zotlabs/Module/Pconfig.php | 2 +-
Zotlabs/Module/Zot.php | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index 93d8aa3a5..98fb5c268 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -39,6 +39,9 @@ class ThreadItem {
$this->data = $data;
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
+ $conv = $this->get_conversation();
+ $observer = $conv->get_observer();
+
// Prepare the children
if($data['children']) {
foreach($data['children'] as $item) {
@@ -51,6 +54,7 @@ class ThreadItem {
continue;
}
+
$child = new ThreadItem($item);
$this->add_child($child);
}
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/Zot.php b/Zotlabs/Module/Zot.php
index 8c34dced1..1cc0e54c9 100644
--- a/Zotlabs/Module/Zot.php
+++ b/Zotlabs/Module/Zot.php
@@ -19,7 +19,7 @@ class Zot extends \Zotlabs\Web\Controller {
function init() {
$zot = new ZotProtocol\Receiver(new ZotProtocol\Zot6Handler());
- json_return_and_die($zot->run(),'application/x-zot+jzon');
+ json_return_and_die($zot->run(),'application/x-zot+json');
}
}
--
cgit v1.2.3
From 6481c9dca18d5b0e09e495b30edff987ac2da0b5 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Mon, 19 Nov 2018 15:20:28 -0800
Subject: use this form instead
---
Zotlabs/Lib/ThreadItem.php | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index 98fb5c268..83d243177 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -39,8 +39,7 @@ class ThreadItem {
$this->data = $data;
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
- $conv = $this->get_conversation();
- $observer = $conv->get_observer();
+ $observer = \App::get_observer();
// Prepare the children
if($data['children']) {
--
cgit v1.2.3
From e30be643c9f217dc379aac0feb085a1b1ffa44e1 Mon Sep 17 00:00:00 2001
From: Mario Vavti
Date: Wed, 21 Nov 2018 12:21:29 +0000
Subject: fix call to undefined function
(cherry picked from commit 0bba9482dfbcc0fd8bea880ac3820548281ecfc2)
---
Zotlabs/Lib/PConfig.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php
index b9384cf6b..5e5954c95 100644
--- a/Zotlabs/Lib/PConfig.php
+++ b/Zotlabs/Lib/PConfig.php
@@ -138,7 +138,7 @@ class PConfig {
$hash = hash('sha256',$family.':'.$key);
if (self::Get($uid, 'hz_delpconfig', $hash) !== false) {
- if (Get($uid, 'hz_delpconfig', $hash) > $updated) {
+ if (self::Get($uid, 'hz_delpconfig', $hash) > $updated) {
logger('Refusing to update pconfig with outdated info (Item deleted more recently).', LOGGER_NORMAL, LOG_ERR);
return self::Get($uid,$family,$key);
} else {
--
cgit v1.2.3
From ea235c0c6751b682332b968b4c18f905e8ece451 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 21 Nov 2018 20:03:58 -0800
Subject: no mention notifications from mastodon (and pleroma)
---
Zotlabs/Lib/PConfig.php | 2 +-
include/items.php | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php
index b9384cf6b..5e5954c95 100644
--- a/Zotlabs/Lib/PConfig.php
+++ b/Zotlabs/Lib/PConfig.php
@@ -138,7 +138,7 @@ class PConfig {
$hash = hash('sha256',$family.':'.$key);
if (self::Get($uid, 'hz_delpconfig', $hash) !== false) {
- if (Get($uid, 'hz_delpconfig', $hash) > $updated) {
+ if (self::Get($uid, 'hz_delpconfig', $hash) > $updated) {
logger('Refusing to update pconfig with outdated info (Item deleted more recently).', LOGGER_NORMAL, LOG_ERR);
return self::Get($uid,$family,$key);
} else {
diff --git a/include/items.php b/include/items.php
index 2baad3d04..19df3bb80 100755
--- a/include/items.php
+++ b/include/items.php
@@ -2664,7 +2664,7 @@ function tag_deliver($uid, $item_id) {
if(preg_match_all($pluspattern,$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_MENTION) {
if($matched_forums <= $max_forums) {
$plustagged = true;
$found = true;
@@ -2678,7 +2678,7 @@ function tag_deliver($uid, $item_id) {
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_FORUM) {
+ if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) {
if($matched_forums <= $max_forums) {
$plustagged = true;
$found = true;
@@ -2914,7 +2914,7 @@ function tgroup_check($uid, $item) {
if(preg_match_all($pluspattern,$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_MENTION) {
if($matched_forums <= $max_forums) {
$found = true;
break;
@@ -2927,7 +2927,7 @@ function tgroup_check($uid, $item) {
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_FORUM) {
+ if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) {
if($matched_forums <= $max_forums) {
$found = true;
break;
--
cgit v1.2.3
From 8e713245144d0bcedca0d3345017b5fa232c8ca3 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Wed, 21 Nov 2018 20:25:59 -0800
Subject: fix mastodon tag notifications (again)
---
include/items.php | 32 +++++++++++++++++---------------
1 file changed, 17 insertions(+), 15 deletions(-)
diff --git a/include/items.php b/include/items.php
index 19df3bb80..4ccc3e01c 100755
--- a/include/items.php
+++ b/include/items.php
@@ -2646,28 +2646,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] && 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');
@@ -2675,13 +2677,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] && intval($term['ttype']) === TERM_FORUM) {
if($matched_forums <= $max_forums) {
$plustagged = true;
- $found = true;
break;
}
logger('forum ' . $term['term'] . ' exceeded max_tagged_forums - ignoring');
@@ -2903,18 +2904,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] && intval($term['ttype']) === TERM_MENTION) {
+ if($term['url'] === $match[1] && intval($term['ttype']) === TERM_FORUM) {
if($matched_forums <= $max_forums) {
$found = true;
break;
@@ -2924,7 +2926,7 @@ 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] && intval($term['ttype']) === TERM_FORUM) {
--
cgit v1.2.3
From 16c7aa2813b8a7fca52ac3f214c214cc01834308 Mon Sep 17 00:00:00 2001
From: Mario
Date: Thu, 22 Nov 2018 12:52:08 +0100
Subject: fix db upgrade 1228 for postgres
---
Zotlabs/Update/_1228.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Zotlabs/Update/_1228.php b/Zotlabs/Update/_1228.php
index f8a506bb4..9e6bf8047 100644
--- a/Zotlabs/Update/_1228.php
+++ b/Zotlabs/Update/_1228.php
@@ -11,8 +11,8 @@ class _1228 {
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");
+ $r2 = q("create index \"uuid_idx\" on item (\"uuid\")");
+ $r3 = q("ALTER TABLE item add summary TEXT NOT NULL DEFAULT ''");
$r = ($r1 && $r2 && $r3);
}
--
cgit v1.2.3
From 9a8d1200ecc9f877b431a00a5219b41d2bd68de6 Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Thu, 22 Nov 2018 18:39:38 -0800
Subject: use uuid in file storage
---
Zotlabs/Storage/Directory.php | 2 +-
include/attach.php | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
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/include/attach.php b/include/attach.php
index 6b0d3fb3b..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.
--
cgit v1.2.3
From c5a9b00eaec750e2983e0e46565b7305fe4ae27e Mon Sep 17 00:00:00 2001
From: zotlabs
Date: Fri, 23 Nov 2018 12:25:05 -0800
Subject: Organization actor type was missing
---
Zotlabs/Lib/ActivityStreams.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Zotlabs/Lib/ActivityStreams.php b/Zotlabs/Lib/ActivityStreams.php
index a322637fd..49978031e 100644
--- a/Zotlabs/Lib/ActivityStreams.php
+++ b/Zotlabs/Lib/ActivityStreams.php
@@ -284,7 +284,7 @@ class ActivityStreams {
}
static function is_an_actor($s) {
- return(in_array($s,[ 'Application','Group','Service','Person','Service' ]));
+ return(in_array($s,[ 'Application','Group','Organization','Person','Service' ]));
}
/**
--
cgit v1.2.3
From ca98a566ee7821c901b6a1db3013f3e9097747bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Manuel=20Jim=C3=A9nez=20Friaza?=
Date: Sat, 24 Nov 2018 13:23:20 +0100
Subject: Update es-es
---
view/es-es/hmessages.po | 26 +++++++++++++-------------
view/es-es/hstrings.php | 28 ++++++++++++++--------------
2 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po
index 3b42394b1..67cb21672 100644
--- a/view/es-es/hmessages.po
+++ b/view/es-es/hmessages.po
@@ -15,7 +15,7 @@ msgstr ""
"Project-Id-Version: hubzilla\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-19 11:04+0200\n"
-"PO-Revision-Date: 2018-10-24 11:35+0000\n"
+"PO-Revision-Date: 2018-11-21 11:04+0000\n"
"Last-Translator: Manuel Jiménez Friaza \n"
"Language-Team: Spanish (Spain) (http://www.transifex.com/Friendica/hubzilla/language/es_ES/)\n"
"MIME-Version: 1.0\n"
@@ -1729,7 +1729,7 @@ msgstr "Importar elementos"
#: ../../Zotlabs/Module/Import_items.php:126
msgid ""
"Use this form to import existing posts and content from an export file."
-msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación."
+msgstr "Utilice este formulario para importar entradas y contenido desde un archivo de exportación."
#: ../../Zotlabs/Module/Import_items.php:127
#: ../../Zotlabs/Module/Import.php:548
@@ -1807,7 +1807,7 @@ msgstr "Un canal es una identidad única en la red. Puede representar a una pers
#: ../../Zotlabs/Module/New_channel.php:183
msgid ""
"or import an existing channel from another location."
-msgstr "O importar un canal existente desde otro lugar."
+msgstr "O importar un canal desde otro lugar."
#: ../../Zotlabs/Module/New_channel.php:188
msgid "Validate"
@@ -4496,7 +4496,7 @@ msgid ""
"Leave blank to keep your existing channel nickname. You will be randomly "
"assigned a similar nickname if either name is already allocated on this "
"site."
-msgstr "Dejar en blanco para mantener su alias de canal existente. Se le asignará aleatoriamente uno similar si cualquiera de los dos nombres ya está asignado en este sitio."
+msgstr "Dejar en blanco para mantener su alias de canal . Se le asignará aleatoriamente uno similar si cualquiera de los dos nombres ya está asignado en este sitio."
#: ../../Zotlabs/Module/Import.php:562
msgid ""
@@ -4942,7 +4942,7 @@ msgstr "Introducir un nombre de álbum"
#: ../../Zotlabs/Module/Photos.php:698
msgid "or select an existing album (doubleclick)"
-msgstr "o seleccionar uno existente (doble click)"
+msgstr "o seleccionar un álbum (con un doble click)"
#: ../../Zotlabs/Module/Photos.php:699
msgid "Create a status post for this upload"
@@ -5010,7 +5010,7 @@ msgstr "Introducir un nuevo nombre de álbum"
#: ../../Zotlabs/Module/Photos.php:1067
msgid "or select an existing one (doubleclick)"
-msgstr "o seleccionar uno (doble click) existente"
+msgstr "o seleccionar un álbum (con un doble click)"
#: ../../Zotlabs/Module/Photos.php:1072
msgid "Add a Tag"
@@ -5557,7 +5557,7 @@ msgstr "Usar una foto de sus álbumes"
#: ../../Zotlabs/Module/Profile_photo.php:474
#: ../../Zotlabs/Module/Cover_photo.php:409
msgid "Select existing photo"
-msgstr "Seleccionar una foto existente"
+msgstr "Seleccionar una foto"
#: ../../Zotlabs/Module/Profile_photo.php:493
#: ../../Zotlabs/Module/Cover_photo.php:426
@@ -8443,7 +8443,7 @@ msgid ""
"A deleted group with this name was revived. Existing item permissions "
"may apply to this group and any future members. If this is "
"not what you intended, please create another group with a different name."
-msgstr "Un grupo suprimido con este nombre ha sido restablecido. Es posible que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."
+msgstr "Un grupo suprimido con este nombre ha sido restablecido. Es posible que los permisos que ya existen sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."
#: ../../Zotlabs/Lib/Group.php:270 ../../include/group.php:264
msgid "Add new connections to this privacy group"
@@ -11149,11 +11149,11 @@ msgstr "Por favor visite el sitio web de $Projectname"
#: ../../addon/upgrade_info/upgrade_info.php:46
msgid "app store"
-msgstr "depósito de apps"
+msgstr "aplicaciones disponibles"
#: ../../addon/upgrade_info/upgrade_info.php:47
msgid "and install possibly missing apps."
-msgstr "e instalar aplicaciones que posiblemente falten."
+msgstr "e instale las aplicaciones que posiblemente falten."
#: ../../addon/upgrade_info/upgrade_info.php:52
msgid "Upgrade Info"
@@ -11364,7 +11364,7 @@ msgstr "Eliminar los datos de localización geográfica del navegador"
#: ../../addon/hsse/hsse.php:99 ../../include/conversation.php:1302
msgid "Embed (existing) photo from your photo albums"
-msgstr "Insertar (existente) foto de sus álbumes de fotos"
+msgstr "Insertar una foto de sus álbumes"
#: ../../addon/hsse/hsse.php:135 ../../include/conversation.php:1338
msgid "Tag term:"
@@ -12247,7 +12247,7 @@ msgstr "Crear nuevos eventos aquí."
msgid ""
"You can accept new connections and change permissions for existing ones "
"here. You can also e.g. create groups of contacts."
-msgstr "Puede aceptar nuevas conexiones y cambiar permisos para las existentes aquí. También puede, por ejemplo, crear grupos de contactos."
+msgstr "Puede aceptar nuevas conexiones y cambiar permisos para las que ya existen aquí. También puede, por ejemplo, crear grupos de contactos."
#: ../../addon/tour/tour.php:82
msgid "System notifications will arrive here"
@@ -14455,7 +14455,7 @@ msgstr "Etiquetas de la comunidad"
#: ../../include/features.php:143
msgid "Ability to tag existing posts"
-msgstr "Capacidad de etiquetar entradas existentes"
+msgstr "Capacidad de etiquetar entradas"
#: ../../include/features.php:150
msgid "Emoji Reactions"
diff --git a/view/es-es/hstrings.php b/view/es-es/hstrings.php
index a459e10dd..67f499feb 100644
--- a/view/es-es/hstrings.php
+++ b/view/es-es/hstrings.php
@@ -2,10 +2,10 @@
if(! function_exists("string_plural_select_es_es")) {
function string_plural_select_es_es($n){
- return ($n != 1 ? 1 : 0);
+ return ($n != 1 ? 1 : 0);;
}}
App::$rtl = 0;
-App::$strings["plural_function_code"] = "(n != 1 ? 1 : 0)";
+App::$strings["plural_function_code"] = "(n != 1 ? 1 : 0);";
App::$strings["Can view my channel stream and posts"] = "Pueden verse la actividad y publicaciones de mi canal";
App::$strings["Can send me their channel stream and posts"] = "Se me pueden enviar entradas y contenido de un canal";
App::$strings["Can view my default channel profile"] = "Puede verse mi perfil de canal predeterminado.";
@@ -300,7 +300,7 @@ App::$strings["Imported file is empty."] = "El fichero importado está vacío.";
App::$strings["Warning: Database versions differ by %1\$d updates."] = "Atención: Las versiones de la base de datos difieren en %1\$d actualizaciones.";
App::$strings["Import completed"] = "Importación completada";
App::$strings["Import Items"] = "Importar elementos";
-App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación.";
+App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas y contenido desde un archivo de exportación.";
App::$strings["File to Upload"] = "Fichero para subir";
App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Ha creado %1$.0f de %2$.0f canales permitidos.";
App::$strings["Loading"] = "Cargando";
@@ -315,7 +315,7 @@ App::$strings["Select a channel permission role compatible with your usage needs
App::$strings["Read more about channel permission roles"] = "Leer más sobre los roles y permisos";
App::$strings["Create a Channel"] = "Crear un canal";
App::$strings["A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things."] = "Un canal es una identidad única en la red. Puede representar a una persona (un perfil de una red social), un foro o grupo, un negocio o una página de una celebridad, un \"feed\" de noticias, y muchas otras cosas.";
-App::$strings["or import an existing channel from another location."] = "O importar un canal existente desde otro lugar.";
+App::$strings["or import an existing channel from another location."] = "O importar un canal desde otro lugar.";
App::$strings["Validate"] = "Validar";
App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña.";
App::$strings["Remove This Channel"] = "Eliminar este canal";
@@ -914,7 +914,7 @@ App::$strings["For either option, please choose whether to make this hub your ne
App::$strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
App::$strings["Move this channel (disable all previous locations)"] = "Mover este canal (desactivar todas las ubicaciones anteriores)";
App::$strings["Use this channel nickname instead of the one provided"] = "Usa este alias de canal en lugar del que se proporciona";
-App::$strings["Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site."] = "Dejar en blanco para mantener su alias de canal existente. Se le asignará aleatoriamente uno similar si cualquiera de los dos nombres ya está asignado en este sitio.";
+App::$strings["Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site."] = "Dejar en blanco para mantener su alias de canal . Se le asignará aleatoriamente uno similar si cualquiera de los dos nombres ya está asignado en este sitio.";
App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
App::$strings["Authentication failed."] = "Falló la autenticación.";
App::$strings["Remote Authentication"] = "Acceso desde su servidor";
@@ -1014,7 +1014,7 @@ App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.
App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
App::$strings["Upload Photos"] = "Subir fotos";
App::$strings["Enter an album name"] = "Introducir un nombre de álbum";
-App::$strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
+App::$strings["or select an existing album (doubleclick)"] = "o seleccionar un álbum (con un doble click)";
App::$strings["Create a status post for this upload"] = "Crear un mensaje de estado para esta subida";
App::$strings["Description (optional)"] = "Descripción (opcional)";
App::$strings["Show Newest First"] = "Mostrar lo más reciente primero";
@@ -1031,7 +1031,7 @@ App::$strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
App::$strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
App::$strings["Move photo to album"] = "Mover la foto a un álbum";
App::$strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
-App::$strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
+App::$strings["or select an existing one (doubleclick)"] = "o seleccionar un álbum (con un doble click)";
App::$strings["Add a Tag"] = "Añadir una etiqueta";
App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
App::$strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
@@ -1153,7 +1153,7 @@ App::$strings["Use Photo for Profile"] = "Usar la fotografía para el perfil";
App::$strings["Change Profile Photo"] = "Cambiar la foto del perfil";
App::$strings["Use"] = "Usar";
App::$strings["Use a photo from your albums"] = "Usar una foto de sus álbumes";
-App::$strings["Select existing photo"] = "Seleccionar una foto existente";
+App::$strings["Select existing photo"] = "Seleccionar una foto";
App::$strings["Crop Image"] = "Recortar imagen";
App::$strings["Please adjust the image cropping for optimum viewing."] = "Por favor ajuste el recorte de la imagen para una visión óptima.";
App::$strings["Done Editing"] = "Edición completada";
@@ -1829,7 +1829,7 @@ App::$strings["Directory Options"] = "Opciones del directorio";
App::$strings["Safe Mode"] = "Modo seguro";
App::$strings["Public Forums Only"] = "Solo foros públicos";
App::$strings["This Website Only"] = "Solo este sitio web";
-App::$strings["A deleted group with this name was revived. Existing item permissions may apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. Es posible que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
+App::$strings["A deleted group with this name was revived. Existing item permissions may apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. Es posible que los permisos que ya existen sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales";
App::$strings["edit"] = "editar";
App::$strings["Edit group"] = "Editar grupo";
@@ -2458,8 +2458,8 @@ App::$strings["Jappix Mini Settings"] = "Ajustes de Jappix Mini";
App::$strings["Your channel has been upgraded to the latest \$Projectname version."] = "Su canal ha sido actualizado a la última versión de \$Projectname.";
App::$strings["To improve usability, we have converted some features into installable stand-alone apps."] = "Para mejorar la usabilidad, hemos convertido algunas características en aplicaciones independientes instalables.";
App::$strings["Please visit the \$Projectname"] = "Por favor visite el sitio web de \$Projectname";
-App::$strings["app store"] = "depósito de apps";
-App::$strings["and install possibly missing apps."] = "e instalar aplicaciones que posiblemente falten.";
+App::$strings["app store"] = "aplicaciones disponibles";
+App::$strings["and install possibly missing apps."] = "e instale las aplicaciones que posiblemente falten.";
App::$strings["Upgrade Info"] = "Información de actualización";
App::$strings["Do not show this again"] = "No mostrar esto de nuevo";
App::$strings["Access Denied"] = "Acceso denegado";
@@ -2509,7 +2509,7 @@ App::$strings["WYSIWYG status editor"] = "Editor de estado de WYSIWYG";
App::$strings["WYSIWYG Status"] = "Estado de WYSIWYG";
App::$strings["Set your location"] = "Establecer su ubicación";
App::$strings["Clear browser location"] = "Eliminar los datos de localización geográfica del navegador";
-App::$strings["Embed (existing) photo from your photo albums"] = "Insertar (existente) foto de sus álbumes de fotos";
+App::$strings["Embed (existing) photo from your photo albums"] = "Insertar una foto de sus álbumes";
App::$strings["Tag term:"] = "Término de la etiqueta:";
App::$strings["Where are you right now?"] = "¿Donde está ahora?";
App::$strings["Choose a different album..."] = "Elegir un álbum diferente...";
@@ -2706,7 +2706,7 @@ App::$strings["Click here to see activity from your connections."] = "Pulsar aqu
App::$strings["Click here to see your channel home."] = "Pulsar aquí para ver la página de inicio de su canal.";
App::$strings["You can access your private messages from here."] = "Puede acceder a sus mensajes privados desde aquí.";
App::$strings["Create new events here."] = "Crear nuevos eventos aquí.";
-App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Puede aceptar nuevas conexiones y cambiar permisos para las existentes aquí. También puede, por ejemplo, crear grupos de contactos.";
+App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Puede aceptar nuevas conexiones y cambiar permisos para las que ya existen aquí. También puede, por ejemplo, crear grupos de contactos.";
App::$strings["System notifications will arrive here"] = "Las notificaciones del sistema llegarán aquí";
App::$strings["Search for content and users"] = "Buscar contenido y usuarios";
App::$strings["Browse for new contacts"] = "Buscar nuevos contactos";
@@ -3270,7 +3270,7 @@ App::$strings["Connection Filtering"] = "Filtrado de conexiones";
App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido";
App::$strings["Conversation"] = "Conversación";
App::$strings["Community Tagging"] = "Etiquetas de la comunidad";
-App::$strings["Ability to tag existing posts"] = "Capacidad de etiquetar entradas existentes";
+App::$strings["Ability to tag existing posts"] = "Capacidad de etiquetar entradas";
App::$strings["Emoji Reactions"] = "Emoticonos \"emoji\"";
App::$strings["Add emoji reaction ability to posts"] = "Activar la capacidad de añadir un emoticono \"emoji\" a las entradas";
App::$strings["Dislike Posts"] = "Desagrado de publicaciones";
--
cgit v1.2.3
From c667572d3eedb0c31b29a4c469b378ccdcee0ba1 Mon Sep 17 00:00:00 2001
From: Mario
Date: Sun, 25 Nov 2018 10:09:26 +0100
Subject: update imagesloaded to version 4.1.4 via composer
---
composer.json | 3 +-
composer.lock | 41 +-
library/imagesloaded/imagesloaded.pkgd.js | 487 --------------------
library/imagesloaded/imagesloaded.pkgd.min.js | 7 -
vendor/composer/ClassLoader.php | 2 +-
vendor/composer/LICENSE | 69 +--
vendor/composer/autoload_classmap.php | 6 +-
vendor/composer/autoload_static.php | 5 +-
vendor/composer/installed.json | 41 ++
vendor/desandro/imagesloaded/.gitignore | 5 +
vendor/desandro/imagesloaded/.jshintrc | 12 +
vendor/desandro/imagesloaded/README.md | 362 +++++++++++++++
vendor/desandro/imagesloaded/bower.json | 37 ++
vendor/desandro/imagesloaded/composer.json | 15 +
vendor/desandro/imagesloaded/contributing.md | 20 +
vendor/desandro/imagesloaded/gulpfile.js | 128 ++++++
vendor/desandro/imagesloaded/imagesloaded.js | 377 ++++++++++++++++
vendor/desandro/imagesloaded/imagesloaded.pkgd.js | 497 +++++++++++++++++++++
.../desandro/imagesloaded/imagesloaded.pkgd.min.js | 7 +
vendor/desandro/imagesloaded/package.json | 48 ++
.../sandbox/background/css/background.css | 29 ++
.../imagesloaded/sandbox/background/index.html | 51 +++
.../imagesloaded/sandbox/progress/index.html | 89 ++++
.../imagesloaded/sandbox/progress/progress.js | 111 +++++
vendor/desandro/imagesloaded/test/css/tests.css | 41 ++
.../desandro/imagesloaded/test/img/blue-shell.jpg | Bin 0 -> 24555 bytes
.../desandro/imagesloaded/test/img/bowser-jr.jpg | Bin 0 -> 36987 bytes
.../imagesloaded/test/img/thunder-cloud.jpg | Bin 0 -> 24588 bytes
vendor/desandro/imagesloaded/test/index.html | 104 +++++
vendor/desandro/imagesloaded/test/unit/append.js | 30 ++
.../desandro/imagesloaded/test/unit/background.js | 70 +++
vendor/desandro/imagesloaded/test/unit/basics.js | 28 ++
vendor/desandro/imagesloaded/test/unit/data-uri.js | 10 +
.../desandro/imagesloaded/test/unit/jquery-fail.js | 29 ++
.../imagesloaded/test/unit/jquery-success.js | 28 ++
.../desandro/imagesloaded/test/unit/local-files.js | 31 ++
.../desandro/imagesloaded/test/unit/no-images.js | 11 +
.../desandro/imagesloaded/test/unit/non-element.js | 24 +
.../imagesloaded/test/unit/selector-string.js | 12 +
.../imagesloaded/test/unit/single-element.js | 11 +
view/php/theme_init.php | 2 +-
41 files changed, 2326 insertions(+), 554 deletions(-)
delete mode 100644 library/imagesloaded/imagesloaded.pkgd.js
delete mode 100644 library/imagesloaded/imagesloaded.pkgd.min.js
create mode 100644 vendor/desandro/imagesloaded/.gitignore
create mode 100644 vendor/desandro/imagesloaded/.jshintrc
create mode 100644 vendor/desandro/imagesloaded/README.md
create mode 100644 vendor/desandro/imagesloaded/bower.json
create mode 100644 vendor/desandro/imagesloaded/composer.json
create mode 100644 vendor/desandro/imagesloaded/contributing.md
create mode 100644 vendor/desandro/imagesloaded/gulpfile.js
create mode 100644 vendor/desandro/imagesloaded/imagesloaded.js
create mode 100644 vendor/desandro/imagesloaded/imagesloaded.pkgd.js
create mode 100644 vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js
create mode 100644 vendor/desandro/imagesloaded/package.json
create mode 100644 vendor/desandro/imagesloaded/sandbox/background/css/background.css
create mode 100644 vendor/desandro/imagesloaded/sandbox/background/index.html
create mode 100644 vendor/desandro/imagesloaded/sandbox/progress/index.html
create mode 100644 vendor/desandro/imagesloaded/sandbox/progress/progress.js
create mode 100644 vendor/desandro/imagesloaded/test/css/tests.css
create mode 100644 vendor/desandro/imagesloaded/test/img/blue-shell.jpg
create mode 100644 vendor/desandro/imagesloaded/test/img/bowser-jr.jpg
create mode 100644 vendor/desandro/imagesloaded/test/img/thunder-cloud.jpg
create mode 100644 vendor/desandro/imagesloaded/test/index.html
create mode 100644 vendor/desandro/imagesloaded/test/unit/append.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/background.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/basics.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/data-uri.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/jquery-fail.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/jquery-success.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/local-files.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/no-images.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/non-element.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/selector-string.js
create mode 100644 vendor/desandro/imagesloaded/test/unit/single-element.js
diff --git a/composer.json b/composer.json
index f117cc3b1..e6cefa241 100644
--- a/composer.json
+++ b/composer.json
@@ -40,7 +40,8 @@
"smarty/smarty": "~3.1",
"ramsey/uuid": "^3.8",
"twbs/bootstrap": "4.1.3",
- "blueimp/jquery-file-upload": "^9.25"
+ "blueimp/jquery-file-upload": "^9.25",
+ "desandro/imagesloaded": "^4.1"
},
"require-dev" : {
"phpunit/phpunit" : "@stable",
diff --git a/composer.lock b/composer.lock
index d7e8d11f6..64d28c22e 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "63d0e52cc07f8113059ec30d3637b850",
+ "content-hash": "fe5e71d7076eeddf1c174be4a5c052dd",
"packages": [
{
"name": "blueimp/jquery-file-upload",
@@ -163,6 +163,45 @@
"description": "Internationalization library powered by CLDR data.",
"time": "2017-12-29T00:13:05+00:00"
},
+ {
+ "name": "desandro/imagesloaded",
+ "version": "v4.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/desandro/imagesloaded.git",
+ "reference": "67c4e57453120935180c45c6820e7d3fbd2ea1f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/desandro/imagesloaded/zipball/67c4e57453120935180c45c6820e7d3fbd2ea1f9",
+ "reference": "67c4e57453120935180c45c6820e7d3fbd2ea1f9",
+ "shasum": ""
+ },
+ "type": "component",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "David DeSandro",
+ "homepage": "http://desandro.com/",
+ "role": "developer"
+ }
+ ],
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "homepage": "http://imagesloaded.desandro.com",
+ "keywords": [
+ "dom",
+ "images",
+ "javascript",
+ "jquery-plugin",
+ "library",
+ "loaded",
+ "ui"
+ ],
+ "time": "2018-01-02T16:53:35+00:00"
+ },
{
"name": "ezyang/htmlpurifier",
"version": "v4.10.0",
diff --git a/library/imagesloaded/imagesloaded.pkgd.js b/library/imagesloaded/imagesloaded.pkgd.js
deleted file mode 100644
index ef23971be..000000000
--- a/library/imagesloaded/imagesloaded.pkgd.js
+++ /dev/null
@@ -1,487 +0,0 @@
-/*!
- * imagesLoaded PACKAGED v4.1.0
- * JavaScript is all like "You images are done yet or what?"
- * MIT License
- */
-
-/**
- * EvEmitter v1.0.1
- * Lil' event emitter
- * MIT License
- */
-
-/* jshint unused: true, undef: true, strict: true */
-
-( function( global, factory ) {
- // universal module definition
- /* jshint strict: false */ /* globals define, module */
- if ( typeof define == 'function' && define.amd ) {
- // AMD - RequireJS
- define( 'ev-emitter/ev-emitter',factory );
- } else if ( typeof module == 'object' && module.exports ) {
- // CommonJS - Browserify, Webpack
- module.exports = factory();
- } else {
- // Browser globals
- global.EvEmitter = factory();
- }
-
-}( this, function() {
-
-
-
-function EvEmitter() {}
-
-var proto = EvEmitter.prototype;
-
-proto.on = function( eventName, listener ) {
- if ( !eventName || !listener ) {
- return;
- }
- // set events hash
- var events = this._events = this._events || {};
- // set listeners array
- var listeners = events[ eventName ] = events[ eventName ] || [];
- // only add once
- if ( listeners.indexOf( listener ) == -1 ) {
- listeners.push( listener );
- }
-
- return this;
-};
-
-proto.once = function( eventName, listener ) {
- if ( !eventName || !listener ) {
- return;
- }
- // add event
- this.on( eventName, listener );
- // set once flag
- // set onceEvents hash
- var onceEvents = this._onceEvents = this._onceEvents || {};
- // set onceListeners array
- var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || [];
- // set flag
- onceListeners[ listener ] = true;
-
- return this;
-};
-
-proto.off = function( eventName, listener ) {
- var listeners = this._events && this._events[ eventName ];
- if ( !listeners || !listeners.length ) {
- return;
- }
- var index = listeners.indexOf( listener );
- if ( index != -1 ) {
- listeners.splice( index, 1 );
- }
-
- return this;
-};
-
-proto.emitEvent = function( eventName, args ) {
- var listeners = this._events && this._events[ eventName ];
- if ( !listeners || !listeners.length ) {
- return;
- }
- var i = 0;
- var listener = listeners[i];
- args = args || [];
- // once stuff
- var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
-
- while ( listener ) {
- var isOnce = onceListeners && onceListeners[ listener ];
- if ( isOnce ) {
- // remove listener
- // remove before trigger to prevent recursion
- this.off( eventName, listener );
- // unset once flag
- delete onceListeners[ listener ];
- }
- // trigger listener
- listener.apply( this, args );
- // get next listener
- i += isOnce ? 0 : 1;
- listener = listeners[i];
- }
-
- return this;
-};
-
-return EvEmitter;
-
-}));
-
-/*!
- * imagesLoaded v4.1.0
- * JavaScript is all like "You images are done yet or what?"
- * MIT License
- */
-
-( function( window, factory ) { 'use strict';
- // universal module definition
-
- /*global define: false, module: false, require: false */
-
- if ( typeof define == 'function' && define.amd ) {
- // AMD
- define( [
- 'ev-emitter/ev-emitter'
- ], function( EvEmitter ) {
- return factory( window, EvEmitter );
- });
- } else if ( typeof module == 'object' && module.exports ) {
- // CommonJS
- module.exports = factory(
- window,
- require('ev-emitter')
- );
- } else {
- // browser global
- window.imagesLoaded = factory(
- window,
- window.EvEmitter
- );
- }
-
-})( window,
-
-// -------------------------- factory -------------------------- //
-
-function factory( window, EvEmitter ) {
-
-
-
-var $ = window.jQuery;
-var console = window.console;
-
-// -------------------------- helpers -------------------------- //
-
-// extend objects
-function extend( a, b ) {
- for ( var prop in b ) {
- a[ prop ] = b[ prop ];
- }
- return a;
-}
-
-// turn element or nodeList into an array
-function makeArray( obj ) {
- var ary = [];
- if ( Array.isArray( obj ) ) {
- // use object if already an array
- ary = obj;
- } else if ( typeof obj.length == 'number' ) {
- // convert nodeList to array
- for ( var i=0; i < obj.length; i++ ) {
- ary.push( obj[i] );
- }
- } else {
- // array of single index
- ary.push( obj );
- }
- return ary;
-}
-
-// -------------------------- imagesLoaded -------------------------- //
-
-/**
- * @param {Array, Element, NodeList, String} elem
- * @param {Object or Function} options - if function, use as callback
- * @param {Function} onAlways - callback function
- */
-function ImagesLoaded( elem, options, onAlways ) {
- // coerce ImagesLoaded() without new, to be new ImagesLoaded()
- if ( !( this instanceof ImagesLoaded ) ) {
- return new ImagesLoaded( elem, options, onAlways );
- }
- // use elem as selector string
- if ( typeof elem == 'string' ) {
- elem = document.querySelectorAll( elem );
- }
-
- this.elements = makeArray( elem );
- this.options = extend( {}, this.options );
-
- if ( typeof options == 'function' ) {
- onAlways = options;
- } else {
- extend( this.options, options );
- }
-
- if ( onAlways ) {
- this.on( 'always', onAlways );
- }
-
- this.getImages();
-
- if ( $ ) {
- // add jQuery Deferred object
- this.jqDeferred = new $.Deferred();
- }
-
- // HACK check async to allow time to bind listeners
- setTimeout( function() {
- this.check();
- }.bind( this ));
-}
-
-ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
-
-ImagesLoaded.prototype.options = {};
-
-ImagesLoaded.prototype.getImages = function() {
- this.images = [];
-
- // filter & find items if we have an item selector
- this.elements.forEach( this.addElementImages, this );
-};
-
-/**
- * @param {Node} element
- */
-ImagesLoaded.prototype.addElementImages = function( elem ) {
- // filter siblings
- if ( elem.nodeName == 'IMG' ) {
- this.addImage( elem );
- }
- // get background image on element
- if ( this.options.background === true ) {
- this.addElementBackgroundImages( elem );
- }
-
- // find children
- // no non-element nodes, #143
- var nodeType = elem.nodeType;
- if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
- return;
- }
- var childImgs = elem.querySelectorAll('img');
- // concat childElems to filterFound array
- for ( var i=0; i < childImgs.length; i++ ) {
- var img = childImgs[i];
- this.addImage( img );
- }
-
- // get child background images
- if ( typeof this.options.background == 'string' ) {
- var children = elem.querySelectorAll( this.options.background );
- for ( i=0; i < children.length; i++ ) {
- var child = children[i];
- this.addElementBackgroundImages( child );
- }
- }
-};
-
-var elementNodeTypes = {
- 1: true,
- 9: true,
- 11: true
-};
-
-ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
- var style = getComputedStyle( elem );
- if ( !style ) {
- // Firefox returns null if in a hidden iframe https://bugzil.la/548397
- return;
- }
- // get url inside url("...")
- var reURL = /url\((['"])?(.*?)\1\)/gi;
- var matches = reURL.exec( style.backgroundImage );
- while ( matches !== null ) {
- var url = matches && matches[2];
- if ( url ) {
- this.addBackground( url, elem );
- }
- matches = reURL.exec( style.backgroundImage );
- }
-};
-
-/**
- * @param {Image} img
- */
-ImagesLoaded.prototype.addImage = function( img ) {
- var loadingImage = new LoadingImage( img );
- this.images.push( loadingImage );
-};
-
-ImagesLoaded.prototype.addBackground = function( url, elem ) {
- var background = new Background( url, elem );
- this.images.push( background );
-};
-
-ImagesLoaded.prototype.check = function() {
- var _this = this;
- this.progressedCount = 0;
- this.hasAnyBroken = false;
- // complete if no images
- if ( !this.images.length ) {
- this.complete();
- return;
- }
-
- function onProgress( image, elem, message ) {
- // HACK - Chrome triggers event before object properties have changed. #83
- setTimeout( function() {
- _this.progress( image, elem, message );
- });
- }
-
- this.images.forEach( function( loadingImage ) {
- loadingImage.once( 'progress', onProgress );
- loadingImage.check();
- });
-};
-
-ImagesLoaded.prototype.progress = function( image, elem, message ) {
- this.progressedCount++;
- this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
- // progress event
- this.emitEvent( 'progress', [ this, image, elem ] );
- if ( this.jqDeferred && this.jqDeferred.notify ) {
- this.jqDeferred.notify( this, image );
- }
- // check if completed
- if ( this.progressedCount == this.images.length ) {
- this.complete();
- }
-
- if ( this.options.debug && console ) {
- console.log( 'progress: ' + message, image, elem );
- }
-};
-
-ImagesLoaded.prototype.complete = function() {
- var eventName = this.hasAnyBroken ? 'fail' : 'done';
- this.isComplete = true;
- this.emitEvent( eventName, [ this ] );
- this.emitEvent( 'always', [ this ] );
- if ( this.jqDeferred ) {
- var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
- this.jqDeferred[ jqMethod ]( this );
- }
-};
-
-// -------------------------- -------------------------- //
-
-function LoadingImage( img ) {
- this.img = img;
-}
-
-LoadingImage.prototype = Object.create( EvEmitter.prototype );
-
-LoadingImage.prototype.check = function() {
- // If complete is true and browser supports natural sizes,
- // try to check for image status manually.
- var isComplete = this.getIsImageComplete();
- if ( isComplete ) {
- // report based on naturalWidth
- this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
- return;
- }
-
- // If none of the checks above matched, simulate loading on detached element.
- this.proxyImage = new Image();
- this.proxyImage.addEventListener( 'load', this );
- this.proxyImage.addEventListener( 'error', this );
- // bind to image as well for Firefox. #191
- this.img.addEventListener( 'load', this );
- this.img.addEventListener( 'error', this );
- this.proxyImage.src = this.img.src;
-};
-
-LoadingImage.prototype.getIsImageComplete = function() {
- return this.img.complete && this.img.naturalWidth !== undefined;
-};
-
-LoadingImage.prototype.confirm = function( isLoaded, message ) {
- this.isLoaded = isLoaded;
- this.emitEvent( 'progress', [ this, this.img, message ] );
-};
-
-// ----- events ----- //
-
-// trigger specified handler for event type
-LoadingImage.prototype.handleEvent = function( event ) {
- var method = 'on' + event.type;
- if ( this[ method ] ) {
- this[ method ]( event );
- }
-};
-
-LoadingImage.prototype.onload = function() {
- this.confirm( true, 'onload' );
- this.unbindEvents();
-};
-
-LoadingImage.prototype.onerror = function() {
- this.confirm( false, 'onerror' );
- this.unbindEvents();
-};
-
-LoadingImage.prototype.unbindEvents = function() {
- this.proxyImage.removeEventListener( 'load', this );
- this.proxyImage.removeEventListener( 'error', this );
- this.img.removeEventListener( 'load', this );
- this.img.removeEventListener( 'error', this );
-};
-
-// -------------------------- Background -------------------------- //
-
-function Background( url, element ) {
- this.url = url;
- this.element = element;
- this.img = new Image();
-}
-
-// inherit LoadingImage prototype
-Background.prototype = Object.create( LoadingImage.prototype );
-
-Background.prototype.check = function() {
- this.img.addEventListener( 'load', this );
- this.img.addEventListener( 'error', this );
- this.img.src = this.url;
- // check if image is already complete
- var isComplete = this.getIsImageComplete();
- if ( isComplete ) {
- this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
- this.unbindEvents();
- }
-};
-
-Background.prototype.unbindEvents = function() {
- this.img.removeEventListener( 'load', this );
- this.img.removeEventListener( 'error', this );
-};
-
-Background.prototype.confirm = function( isLoaded, message ) {
- this.isLoaded = isLoaded;
- this.emitEvent( 'progress', [ this, this.element, message ] );
-};
-
-// -------------------------- jQuery -------------------------- //
-
-ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
- jQuery = jQuery || window.jQuery;
- if ( !jQuery ) {
- return;
- }
- // set local variable
- $ = jQuery;
- // $().imagesLoaded()
- $.fn.imagesLoaded = function( options, callback ) {
- var instance = new ImagesLoaded( this, options, callback );
- return instance.jqDeferred.promise( $(this) );
- };
-};
-// try making plugin
-ImagesLoaded.makeJQueryPlugin();
-
-// -------------------------- -------------------------- //
-
-return ImagesLoaded;
-
-});
-
diff --git a/library/imagesloaded/imagesloaded.pkgd.min.js b/library/imagesloaded/imagesloaded.pkgd.min.js
deleted file mode 100644
index c3e71fadc..000000000
--- a/library/imagesloaded/imagesloaded.pkgd.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * imagesLoaded PACKAGED v4.1.0
- * JavaScript is all like "You images are done yet or what?"
- * MIT License
- */
-
-!function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}(this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},n=i[t]=i[t]||[];return-1==n.indexOf(e)&&n.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{},n=i[t]=i[t]||[];return n[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var n=i.indexOf(e);return-1!=n&&i.splice(n,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var n=0,o=i[n];e=e||[];for(var r=this._onceEvents&&this._onceEvents[t];o;){var s=r&&r[o];s&&(this.off(t,o),delete r[o]),o.apply(this,e),n+=s?0:1,o=i[n]}return this}},t}),function(t,e){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}(window,function(t,e){function i(t,e){for(var i in e)t[i]=e[i];return t}function n(t){var e=[];if(Array.isArray(t))e=t;else if("number"==typeof t.length)for(var i=0;iapcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
}
/**
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
index f0157a6ed..f27399a04 100644
--- a/vendor/composer/LICENSE
+++ b/vendor/composer/LICENSE
@@ -1,56 +1,21 @@
-Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: Composer
-Upstream-Contact: Jordi Boggiano
-Source: https://github.com/composer/composer
-Files: *
-Copyright: 2016, Nils Adermann
- 2016, Jordi Boggiano
-License: Expat
+Copyright (c) Nils Adermann, Jordi Boggiano
-Files: src/Composer/Util/TlsHelper.php
-Copyright: 2016, Nils Adermann
- 2016, Jordi Boggiano
- 2013, Evan Coury
-License: Expat and BSD-2-Clause
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
-License: BSD-2-Clause
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- .
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- .
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- .
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
-License: Expat
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is furnished
- to do so, subject to the following conditions:
- .
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- .
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index f3c814e02..b7cffc67c 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -981,7 +981,6 @@ return array(
'Zotlabs\\Module\\Mood' => $baseDir . '/Zotlabs/Module/Mood.php',
'Zotlabs\\Module\\Network' => $baseDir . '/Zotlabs/Module/Network.php',
'Zotlabs\\Module\\New_channel' => $baseDir . '/Zotlabs/Module/New_channel.php',
- 'Zotlabs\\Module\\Nojs' => $baseDir . '/Zotlabs/Module/Nojs.php',
'Zotlabs\\Module\\Notes' => $baseDir . '/Zotlabs/Module/Notes.php',
'Zotlabs\\Module\\Notifications' => $baseDir . '/Zotlabs/Module/Notifications.php',
'Zotlabs\\Module\\Notify' => $baseDir . '/Zotlabs/Module/Notify.php',
@@ -1337,7 +1336,10 @@ return array(
'Zotlabs\\Update\\_1222' => $baseDir . '/Zotlabs/Update/_1222.php',
'Zotlabs\\Update\\_1223' => $baseDir . '/Zotlabs/Update/_1223.php',
'Zotlabs\\Update\\_1224' => $baseDir . '/Zotlabs/Update/_1224.php',
- 'Zotlabs\\Web\\CheckJS' => $baseDir . '/Zotlabs/Web/CheckJS.php',
+ 'Zotlabs\\Update\\_1225' => $baseDir . '/Zotlabs/Update/_1225.php',
+ 'Zotlabs\\Update\\_1226' => $baseDir . '/Zotlabs/Update/_1226.php',
+ 'Zotlabs\\Update\\_1227' => $baseDir . '/Zotlabs/Update/_1227.php',
+ 'Zotlabs\\Update\\_1228' => $baseDir . '/Zotlabs/Update/_1228.php',
'Zotlabs\\Web\\Controller' => $baseDir . '/Zotlabs/Web/Controller.php',
'Zotlabs\\Web\\HTTPHeaders' => $baseDir . '/Zotlabs/Web/HTTPHeaders.php',
'Zotlabs\\Web\\HTTPSig' => $baseDir . '/Zotlabs/Web/HTTPSig.php',
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index ce0232306..a02571a95 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -1149,7 +1149,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Mood' => __DIR__ . '/../..' . '/Zotlabs/Module/Mood.php',
'Zotlabs\\Module\\Network' => __DIR__ . '/../..' . '/Zotlabs/Module/Network.php',
'Zotlabs\\Module\\New_channel' => __DIR__ . '/../..' . '/Zotlabs/Module/New_channel.php',
- 'Zotlabs\\Module\\Nojs' => __DIR__ . '/../..' . '/Zotlabs/Module/Nojs.php',
'Zotlabs\\Module\\Notes' => __DIR__ . '/../..' . '/Zotlabs/Module/Notes.php',
'Zotlabs\\Module\\Notifications' => __DIR__ . '/../..' . '/Zotlabs/Module/Notifications.php',
'Zotlabs\\Module\\Notify' => __DIR__ . '/../..' . '/Zotlabs/Module/Notify.php',
@@ -1506,7 +1505,9 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Update\\_1223' => __DIR__ . '/../..' . '/Zotlabs/Update/_1223.php',
'Zotlabs\\Update\\_1224' => __DIR__ . '/../..' . '/Zotlabs/Update/_1224.php',
'Zotlabs\\Update\\_1225' => __DIR__ . '/../..' . '/Zotlabs/Update/_1225.php',
- 'Zotlabs\\Web\\CheckJS' => __DIR__ . '/../..' . '/Zotlabs/Web/CheckJS.php',
+ 'Zotlabs\\Update\\_1226' => __DIR__ . '/../..' . '/Zotlabs/Update/_1226.php',
+ 'Zotlabs\\Update\\_1227' => __DIR__ . '/../..' . '/Zotlabs/Update/_1227.php',
+ 'Zotlabs\\Update\\_1228' => __DIR__ . '/../..' . '/Zotlabs/Update/_1228.php',
'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php',
'Zotlabs\\Web\\HTTPHeaders' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPHeaders.php',
'Zotlabs\\Web\\HTTPSig' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPSig.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index af845828e..b9c998f12 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -162,6 +162,47 @@
],
"description": "Internationalization library powered by CLDR data."
},
+ {
+ "name": "desandro/imagesloaded",
+ "version": "v4.1.4",
+ "version_normalized": "4.1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/desandro/imagesloaded.git",
+ "reference": "67c4e57453120935180c45c6820e7d3fbd2ea1f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/desandro/imagesloaded/zipball/67c4e57453120935180c45c6820e7d3fbd2ea1f9",
+ "reference": "67c4e57453120935180c45c6820e7d3fbd2ea1f9",
+ "shasum": ""
+ },
+ "time": "2018-01-02T16:53:35+00:00",
+ "type": "component",
+ "installation-source": "dist",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "David DeSandro",
+ "homepage": "http://desandro.com/",
+ "role": "developer"
+ }
+ ],
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "homepage": "http://imagesloaded.desandro.com",
+ "keywords": [
+ "dom",
+ "images",
+ "javascript",
+ "jquery-plugin",
+ "library",
+ "loaded",
+ "ui"
+ ]
+ },
{
"name": "ezyang/htmlpurifier",
"version": "v4.10.0",
diff --git a/vendor/desandro/imagesloaded/.gitignore b/vendor/desandro/imagesloaded/.gitignore
new file mode 100644
index 000000000..2486eb53d
--- /dev/null
+++ b/vendor/desandro/imagesloaded/.gitignore
@@ -0,0 +1,5 @@
+bower_components/
+node_modules/
+_site/
+build/
+package-lock.json
diff --git a/vendor/desandro/imagesloaded/.jshintrc b/vendor/desandro/imagesloaded/.jshintrc
new file mode 100644
index 000000000..78aa4af7b
--- /dev/null
+++ b/vendor/desandro/imagesloaded/.jshintrc
@@ -0,0 +1,12 @@
+{
+ "browser": true,
+ "curly": true,
+ "newcap": false,
+ "strict": true,
+ "undef": true,
+ "unused": true,
+ "globals": {
+ "imagesLoaded": false,
+ "QUnit": false
+ }
+}
diff --git a/vendor/desandro/imagesloaded/README.md b/vendor/desandro/imagesloaded/README.md
new file mode 100644
index 000000000..67b799dfd
--- /dev/null
+++ b/vendor/desandro/imagesloaded/README.md
@@ -0,0 +1,362 @@
+# imagesLoaded
+
+JavaScript is all like "You images done yet or what?"
+
+[imagesloaded.desandro.com](http://imagesloaded.desandro.com)
+
+Detect when images have been loaded.
+
+## Install
+
+### Download
+
++ [imagesloaded.pkgd.min.js](https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js) minified
++ [imagesloaded.pkgd.js](https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.js) un-minified
+
+### CDN
+
+``` html
+
+
+
+```
+
+### Package managers
+
+Install via [npm](https://www.npmjs.com/package/imagesloaded): `npm install imagesloaded`
+
+Install via [Bower](http://bower.io): `bower install imagesloaded --save`
+
+## jQuery
+
+You can use imagesLoaded as a jQuery Plugin.
+
+``` js
+$('#container').imagesLoaded( function() {
+ // images have loaded
+});
+
+// options
+$('#container').imagesLoaded( {
+ // options...
+ },
+ function() {
+ // images have loaded
+ }
+);
+```
+
+`.imagesLoaded()` returns a [jQuery Deferred object](http://api.jquery.com/category/deferred-object/). This allows you to use `.always()`, `.done()`, `.fail()` and `.progress()`.
+
+``` js
+$('#container').imagesLoaded()
+ .always( function( instance ) {
+ console.log('all images loaded');
+ })
+ .done( function( instance ) {
+ console.log('all images successfully loaded');
+ })
+ .fail( function() {
+ console.log('all images loaded, at least one is broken');
+ })
+ .progress( function( instance, image ) {
+ var result = image.isLoaded ? 'loaded' : 'broken';
+ console.log( 'image is ' + result + ' for ' + image.img.src );
+ });
+```
+
+## Vanilla JavaScript
+
+You can use imagesLoaded with vanilla JS.
+
+``` js
+imagesLoaded( elem, callback )
+// options
+imagesLoaded( elem, options, callback )
+// you can use `new` if you like
+new imagesLoaded( elem, callback )
+```
+
++ `elem` _Element, NodeList, Array, or Selector String_
++ `options` _Object_
++ `callback` _Function_ - function triggered after all images have been loaded
+
+Using a callback function is the same as binding it to the `always` event (see below).
+
+``` js
+// element
+imagesLoaded( document.querySelector('#container'), function( instance ) {
+ console.log('all images are loaded');
+});
+// selector string
+imagesLoaded( '#container', function() {...});
+// multiple elements
+var posts = document.querySelectorAll('.post');
+imagesLoaded( posts, function() {...});
+```
+
+Bind events with vanilla JS with .on(), .off(), and .once() methods.
+
+``` js
+var imgLoad = imagesLoaded( elem );
+function onAlways( instance ) {
+ console.log('all images are loaded');
+}
+// bind with .on()
+imgLoad.on( 'always', onAlways );
+// unbind with .off()
+imgLoad.off( 'always', onAlways );
+```
+
+## Background
+
+Detect when background images have loaded, in addition to `
`s.
+
+Set `{ background: true }` to detect when the element's background image has loaded.
+
+``` js
+// jQuery
+$('#container').imagesLoaded( { background: true }, function() {
+ console.log('#container background image loaded');
+});
+
+// vanilla JS
+imagesLoaded( '#container', { background: true }, function() {
+ console.log('#container background image loaded');
+});
+```
+
+[See jQuery demo](http://codepen.io/desandro/pen/pjVMPB) or [vanilla JS demo](http://codepen.io/desandro/pen/avKooW) on CodePen.
+
+Set to a selector string like `{ background: '.item' }` to detect when the background images of child elements have loaded.
+
+``` js
+// jQuery
+$('#container').imagesLoaded( { background: '.item' }, function() {
+ console.log('all .item background images loaded');
+});
+
+// vanilla JS
+imagesLoaded( '#container', { background: '.item' }, function() {
+ console.log('all .item background images loaded');
+});
+```
+
+[See jQuery demo](http://codepen.io/desandro/pen/avKoZL) or [vanilla JS demo](http://codepen.io/desandro/pen/vNrBGz) on CodePen.
+
+## Events
+
+### always
+
+``` js
+// jQuery
+$('#container').imagesLoaded().always( function( instance ) {
+ console.log('ALWAYS - all images have been loaded');
+});
+
+// vanilla JS
+imgLoad.on( 'always', function( instance ) {
+ console.log('ALWAYS - all images have been loaded');
+});
+```
+
+Triggered after all images have been either loaded or confirmed broken.
+
++ `instance` _imagesLoaded_ - the imagesLoaded instance
+
+### done
+
+``` js
+// jQuery
+$('#container').imagesLoaded().done( function( instance ) {
+ console.log('DONE - all images have been successfully loaded');
+});
+
+// vanilla JS
+imgLoad.on( 'done', function( instance ) {
+ console.log('DONE - all images have been successfully loaded');
+});
+```
+
+Triggered after all images have successfully loaded without any broken images.
+
+### fail
+
+``` js
+$('#container').imagesLoaded().fail( function( instance ) {
+ console.log('FAIL - all images loaded, at least one is broken');
+});
+
+// vanilla JS
+imgLoad.on( 'fail', function( instance ) {
+ console.log('FAIL - all images loaded, at least one is broken');
+});
+```
+
+Triggered after all images have been loaded with at least one broken image.
+
+### progress
+
+``` js
+imgLoad.on( 'progress', function( instance, image ) {
+ var result = image.isLoaded ? 'loaded' : 'broken';
+ console.log( 'image is ' + result + ' for ' + image.img.src );
+});
+```
+
+Triggered after each image has been loaded.
+
++ `instance` _imagesLoaded_ - the imagesLoaded instance
++ `image` _LoadingImage_ - the LoadingImage instance of the loaded image
+
+
+
+## Properties
+
+### LoadingImage.img
+
+_Image_ - The `img` element
+
+### LoadingImage.isLoaded
+
+_Boolean_ - `true` when the image has successfully loaded
+
+### imagesLoaded.images
+
+Array of _LoadingImage_ instances for each image detected
+
+``` js
+var imgLoad = imagesLoaded('#container');
+imgLoad.on( 'always', function() {
+ console.log( imgLoad.images.length + ' images loaded' );
+ // detect which image is broken
+ for ( var i = 0, len = imgLoad.images.length; i < len; i++ ) {
+ var image = imgLoad.images[i];
+ var result = image.isLoaded ? 'loaded' : 'broken';
+ console.log( 'image is ' + result + ' for ' + image.img.src );
+ }
+});
+```
+
+## Browserify
+
+imagesLoaded works with [Browserify](http://browserify.org/).
+
+``` bash
+npm install imagesloaded --save
+```
+
+``` js
+var imagesLoaded = require('imagesloaded');
+
+imagesLoaded( elem, function() {...} );
+```
+
+Use `.makeJQueryPlugin` to make to use `.imagesLoaded()` jQuery plugin.
+
+``` js
+var $ = require('jquery');
+var imagesLoaded = require('imagesloaded');
+
+// provide jQuery argument
+imagesLoaded.makeJQueryPlugin( $ );
+// now use .imagesLoaded() jQuery plugin
+$('#container').imagesLoaded( function() {...});
+```
+
+## Webpack
+
+Install imagesLoaded with npm.
+
+``` bash
+npm install imagesloaded
+```
+
+You can then `require('imagesloaded')`.
+
+``` js
+// main.js
+var imagesLoaded = require('imagesloaded');
+
+imagesLoaded( '#container', function() {
+ // images have loaded
+});
+```
+
+Use `.makeJQueryPlugin` to make `.imagesLoaded()` jQuery plugin.
+
+``` js
+// main.js
+var imagesLoaded = require('imagesloaded');
+var $ = require('jquery');
+
+// provide jQuery argument
+imagesLoaded.makeJQueryPlugin( $ );
+// now use .imagesLoaded() jQuery plugin
+$('#container').imagesLoaded( function() {...});
+```
+
+Run webpack.
+
+``` bash
+webpack main.js bundle.js
+```
+
+## RequireJS
+
+imagesLoaded works with [RequireJS](http://requirejs.org).
+
+You can require [imagesloaded.pkgd.js](http://imagesloaded.desandro.com/imagesloaded.pkgd.js).
+
+``` js
+requirejs( [
+ 'path/to/imagesloaded.pkgd.js',
+], function( imagesLoaded ) {
+ imagesLoaded( '#container', function() { ... });
+});
+```
+
+Use `.makeJQueryPlugin` to make `.imagesLoaded()` jQuery plugin.
+
+``` js
+requirejs( [
+ 'jquery',
+ 'path/to/imagesloaded.pkgd.js',
+], function( $, imagesLoaded ) {
+ // provide jQuery argument
+ imagesLoaded.makeJQueryPlugin( $ );
+ // now use .imagesLoaded() jQuery plugin
+ $('#container').imagesLoaded( function() {...});
+});
+```
+
+You can manage dependencies with [Bower](http://bower.io). Set `baseUrl` to `bower_components` and set a path config for all your application code.
+
+``` js
+requirejs.config({
+ baseUrl: 'bower_components/',
+ paths: { // path to your app
+ app: '../'
+ }
+});
+
+requirejs( [
+ 'imagesloaded/imagesloaded',
+ 'app/my-component.js'
+], function( imagesLoaded, myComp ) {
+ imagesLoaded( '#container', function() { ... });
+});
+```
+
+## Browser support
+
++ IE9+
++ Android 2.3+
++ iOS Safari 4+
++ All other modern browsers
+
+Use [imagesLoaded v3](http://imagesloaded.desandro.com/v3/) for IE8 support.
+
+## MIT License
+
+imagesLoaded is released under the [MIT License](http://desandro.mit-license.org/). Have at it.
diff --git a/vendor/desandro/imagesloaded/bower.json b/vendor/desandro/imagesloaded/bower.json
new file mode 100644
index 000000000..795c69f07
--- /dev/null
+++ b/vendor/desandro/imagesloaded/bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "imagesloaded",
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "main": "imagesloaded.js",
+ "dependencies": {
+ "ev-emitter": "^1.0.0"
+ },
+ "devDependencies": {
+ "jquery": ">=1.9 <4.0",
+ "qunit": "^2.0.0"
+ },
+ "ignore": [
+ "**/.*",
+ "test",
+ "package.json",
+ "composer.json",
+ "node_modules",
+ "bower_components",
+ "tests",
+ "sandbox/",
+ "gulpfile.js",
+ "contributing.md"
+ ],
+ "homepage": "http://imagesloaded.desandro.com",
+ "authors": [
+ "David DeSandro"
+ ],
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "keywords": [
+ "images"
+ ],
+ "license": "MIT"
+}
diff --git a/vendor/desandro/imagesloaded/composer.json b/vendor/desandro/imagesloaded/composer.json
new file mode 100644
index 000000000..95ba64c4a
--- /dev/null
+++ b/vendor/desandro/imagesloaded/composer.json
@@ -0,0 +1,15 @@
+{
+ "name": "desandro/imagesloaded",
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "type": "component",
+ "keywords": ["javascript", "library", "images", "loaded", "dom", "ui", "jquery-plugin"],
+ "homepage": "http://imagesloaded.desandro.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "David DeSandro",
+ "homepage": "http://desandro.com/",
+ "role": "developer"
+ }
+ ]
+}
diff --git a/vendor/desandro/imagesloaded/contributing.md b/vendor/desandro/imagesloaded/contributing.md
new file mode 100644
index 000000000..acac280cc
--- /dev/null
+++ b/vendor/desandro/imagesloaded/contributing.md
@@ -0,0 +1,20 @@
+## Submitting issues
+
+### Reduced test case required
+
+All bug reports and problem issues require a [**reduced test case**](http://css-tricks.com/reduced-test-cases/).
+
++ A reduced test case clearly demonstrates the bug or issue.
++ It contains the bare minimum HTML, CSS, and JavaScript required to demonstrate the bug.
++ A link to your production site is **not** a reduced test case.
+
+Create a test case by forking a [CodePen demos](http://codepen.io/desandro/pens/tags/?selected_tag=imagesloaded-docs).
+
++ [progress with jQuery](http://codepen.io/desandro/pen/bIFyl)
++ [progress with vanilla JS](http://codepen.io/desandro/pen/hlzaw)
++ [`{ background: true }` with jQuery](http://codepen.io/desandro/pen/pjVMPB)
++ [`{ background: true }` with vanilla JS](http://codepen.io/desandro/pen/avKooW)
++ [`{ background: '.selector' }` with jQuery](http://codepen.io/desandro/pen/avKoZL)
++ [`{ background: '.selector' }` with vanilla JS](http://codepen.io/desandro/pen/vNrBGz)
+
+Providing a reduced test case is the best way to get your issue addressed. They help you point out the problem. They help me verify and debug the problem. They help others understand the problem. Without a reduced test case, your issue may be closed.
diff --git a/vendor/desandro/imagesloaded/gulpfile.js b/vendor/desandro/imagesloaded/gulpfile.js
new file mode 100644
index 000000000..66f775f3d
--- /dev/null
+++ b/vendor/desandro/imagesloaded/gulpfile.js
@@ -0,0 +1,128 @@
+/*jshint node: true, strict: false */
+
+var fs = require('fs');
+var gulp = require('gulp');
+var rename = require('gulp-rename');
+var replace = require('gulp-replace');
+
+// ----- hint ----- //
+
+var jshint = require('gulp-jshint');
+
+gulp.task( 'hint-js', function() {
+ return gulp.src('imagesloaded.js')
+ .pipe( jshint() )
+ .pipe( jshint.reporter('default') );
+});
+
+gulp.task( 'hint-test', function() {
+ return gulp.src('test/unit/*.js')
+ .pipe( jshint() )
+ .pipe( jshint.reporter('default') );
+});
+
+gulp.task( 'hint-task', function() {
+ return gulp.src('gulpfile.js')
+ .pipe( jshint() )
+ .pipe( jshint.reporter('default') );
+});
+
+var jsonlint = require('gulp-json-lint');
+
+gulp.task( 'jsonlint', function() {
+ return gulp.src( '*.json' )
+ .pipe( jsonlint() )
+ .pipe( jsonlint.report('verbose') );
+});
+
+gulp.task( 'hint', [ 'hint-js', 'hint-test', 'hint-task', 'jsonlint' ]);
+
+// -------------------------- RequireJS makes pkgd -------------------------- //
+
+// refactored from gulp-requirejs-optimize
+// https://www.npmjs.com/package/gulp-requirejs-optimize/
+
+var gutil = require('gulp-util');
+var chalk = require('chalk');
+var rjsOptimize = require('gulp-requirejs-optimize');
+
+// regex for banner comment
+var reBannerComment = new RegExp('^\\s*(?:\\/\\*[\\s\\S]*?\\*\\/)\\s*');
+
+function getBanner() {
+ var src = fs.readFileSync( 'imagesloaded.js', 'utf8' );
+ var matches = src.match( reBannerComment );
+ var banner = matches[0].replace( 'imagesLoaded', 'imagesLoaded PACKAGED' );
+ return banner;
+}
+
+function addBanner( str ) {
+ return replace( /^/, str );
+}
+
+gulp.task( 'requirejs', function() {
+ var banner = getBanner();
+ // HACK src is not needed
+ // should refactor rjsOptimize to produce src
+ return gulp.src('imagesloaded.js')
+ .pipe( rjsOptimize({
+ baseUrl: 'bower_components',
+ optimize: 'none',
+ include: [
+ '../imagesloaded'
+ ]
+ }) )
+ // remove named module
+ .pipe( replace( "'../imagesloaded',", '' ) )
+ // add banner
+ .pipe( addBanner( banner ) )
+ .pipe( rename('imagesloaded.pkgd.js') )
+ .pipe( gulp.dest('.') );
+});
+
+
+// ----- uglify ----- //
+
+var uglify = require('gulp-uglify');
+
+gulp.task( 'uglify', [ 'requirejs' ], function() {
+ var banner = getBanner();
+ gulp.src('imagesloaded.pkgd.js')
+ .pipe( uglify() )
+ // add banner
+ .pipe( addBanner( banner ) )
+ .pipe( rename('imagesloaded.pkgd.min.js') )
+ .pipe( gulp.dest('.') );
+});
+
+// ----- version ----- //
+
+// set version in source files
+
+var minimist = require('minimist');
+
+// use gulp version -t 1.2.3
+gulp.task( 'version', function() {
+ var args = minimist( process.argv.slice(3) );
+ var version = args.t;
+ if ( !version || !/\d+\.\d+\.\d+/.test( version ) ) {
+ gutil.log( 'invalid version: ' + chalk.red( version ) );
+ return;
+ }
+ gutil.log( 'ticking version to ' + chalk.green( version ) );
+
+ gulp.src('imagesloaded.js')
+ .pipe( replace( /imagesLoaded v\d+\.\d+\.\d+/, 'imagesLoaded v' + version ) )
+ .pipe( gulp.dest('.') );
+
+ gulp.src( [ 'bower.json', 'package.json' ] )
+ .pipe( replace( /"version": "\d+\.\d+\.\d+"/, '"version": "' + version + '"' ) )
+ .pipe( gulp.dest('.') );
+});
+
+// ----- default ----- //
+
+gulp.task( 'default', [
+ 'hint',
+ 'uglify'
+]);
diff --git a/vendor/desandro/imagesloaded/imagesloaded.js b/vendor/desandro/imagesloaded/imagesloaded.js
new file mode 100644
index 000000000..f527a71e9
--- /dev/null
+++ b/vendor/desandro/imagesloaded/imagesloaded.js
@@ -0,0 +1,377 @@
+/*!
+ * imagesLoaded v4.1.4
+ * JavaScript is all like "You images are done yet or what?"
+ * MIT License
+ */
+
+( function( window, factory ) { 'use strict';
+ // universal module definition
+
+ /*global define: false, module: false, require: false */
+
+ if ( typeof define == 'function' && define.amd ) {
+ // AMD
+ define( [
+ 'ev-emitter/ev-emitter'
+ ], function( EvEmitter ) {
+ return factory( window, EvEmitter );
+ });
+ } else if ( typeof module == 'object' && module.exports ) {
+ // CommonJS
+ module.exports = factory(
+ window,
+ require('ev-emitter')
+ );
+ } else {
+ // browser global
+ window.imagesLoaded = factory(
+ window,
+ window.EvEmitter
+ );
+ }
+
+})( typeof window !== 'undefined' ? window : this,
+
+// -------------------------- factory -------------------------- //
+
+function factory( window, EvEmitter ) {
+
+'use strict';
+
+var $ = window.jQuery;
+var console = window.console;
+
+// -------------------------- helpers -------------------------- //
+
+// extend objects
+function extend( a, b ) {
+ for ( var prop in b ) {
+ a[ prop ] = b[ prop ];
+ }
+ return a;
+}
+
+var arraySlice = Array.prototype.slice;
+
+// turn element or nodeList into an array
+function makeArray( obj ) {
+ if ( Array.isArray( obj ) ) {
+ // use object if already an array
+ return obj;
+ }
+
+ var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
+ if ( isArrayLike ) {
+ // convert nodeList to array
+ return arraySlice.call( obj );
+ }
+
+ // array of single index
+ return [ obj ];
+}
+
+// -------------------------- imagesLoaded -------------------------- //
+
+/**
+ * @param {Array, Element, NodeList, String} elem
+ * @param {Object or Function} options - if function, use as callback
+ * @param {Function} onAlways - callback function
+ */
+function ImagesLoaded( elem, options, onAlways ) {
+ // coerce ImagesLoaded() without new, to be new ImagesLoaded()
+ if ( !( this instanceof ImagesLoaded ) ) {
+ return new ImagesLoaded( elem, options, onAlways );
+ }
+ // use elem as selector string
+ var queryElem = elem;
+ if ( typeof elem == 'string' ) {
+ queryElem = document.querySelectorAll( elem );
+ }
+ // bail if bad element
+ if ( !queryElem ) {
+ console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
+ return;
+ }
+
+ this.elements = makeArray( queryElem );
+ this.options = extend( {}, this.options );
+ // shift arguments if no options set
+ if ( typeof options == 'function' ) {
+ onAlways = options;
+ } else {
+ extend( this.options, options );
+ }
+
+ if ( onAlways ) {
+ this.on( 'always', onAlways );
+ }
+
+ this.getImages();
+
+ if ( $ ) {
+ // add jQuery Deferred object
+ this.jqDeferred = new $.Deferred();
+ }
+
+ // HACK check async to allow time to bind listeners
+ setTimeout( this.check.bind( this ) );
+}
+
+ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
+
+ImagesLoaded.prototype.options = {};
+
+ImagesLoaded.prototype.getImages = function() {
+ this.images = [];
+
+ // filter & find items if we have an item selector
+ this.elements.forEach( this.addElementImages, this );
+};
+
+/**
+ * @param {Node} element
+ */
+ImagesLoaded.prototype.addElementImages = function( elem ) {
+ // filter siblings
+ if ( elem.nodeName == 'IMG' ) {
+ this.addImage( elem );
+ }
+ // get background image on element
+ if ( this.options.background === true ) {
+ this.addElementBackgroundImages( elem );
+ }
+
+ // find children
+ // no non-element nodes, #143
+ var nodeType = elem.nodeType;
+ if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
+ return;
+ }
+ var childImgs = elem.querySelectorAll('img');
+ // concat childElems to filterFound array
+ for ( var i=0; i < childImgs.length; i++ ) {
+ var img = childImgs[i];
+ this.addImage( img );
+ }
+
+ // get child background images
+ if ( typeof this.options.background == 'string' ) {
+ var children = elem.querySelectorAll( this.options.background );
+ for ( i=0; i < children.length; i++ ) {
+ var child = children[i];
+ this.addElementBackgroundImages( child );
+ }
+ }
+};
+
+var elementNodeTypes = {
+ 1: true,
+ 9: true,
+ 11: true
+};
+
+ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
+ var style = getComputedStyle( elem );
+ if ( !style ) {
+ // Firefox returns null if in a hidden iframe https://bugzil.la/548397
+ return;
+ }
+ // get url inside url("...")
+ var reURL = /url\((['"])?(.*?)\1\)/gi;
+ var matches = reURL.exec( style.backgroundImage );
+ while ( matches !== null ) {
+ var url = matches && matches[2];
+ if ( url ) {
+ this.addBackground( url, elem );
+ }
+ matches = reURL.exec( style.backgroundImage );
+ }
+};
+
+/**
+ * @param {Image} img
+ */
+ImagesLoaded.prototype.addImage = function( img ) {
+ var loadingImage = new LoadingImage( img );
+ this.images.push( loadingImage );
+};
+
+ImagesLoaded.prototype.addBackground = function( url, elem ) {
+ var background = new Background( url, elem );
+ this.images.push( background );
+};
+
+ImagesLoaded.prototype.check = function() {
+ var _this = this;
+ this.progressedCount = 0;
+ this.hasAnyBroken = false;
+ // complete if no images
+ if ( !this.images.length ) {
+ this.complete();
+ return;
+ }
+
+ function onProgress( image, elem, message ) {
+ // HACK - Chrome triggers event before object properties have changed. #83
+ setTimeout( function() {
+ _this.progress( image, elem, message );
+ });
+ }
+
+ this.images.forEach( function( loadingImage ) {
+ loadingImage.once( 'progress', onProgress );
+ loadingImage.check();
+ });
+};
+
+ImagesLoaded.prototype.progress = function( image, elem, message ) {
+ this.progressedCount++;
+ this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
+ // progress event
+ this.emitEvent( 'progress', [ this, image, elem ] );
+ if ( this.jqDeferred && this.jqDeferred.notify ) {
+ this.jqDeferred.notify( this, image );
+ }
+ // check if completed
+ if ( this.progressedCount == this.images.length ) {
+ this.complete();
+ }
+
+ if ( this.options.debug && console ) {
+ console.log( 'progress: ' + message, image, elem );
+ }
+};
+
+ImagesLoaded.prototype.complete = function() {
+ var eventName = this.hasAnyBroken ? 'fail' : 'done';
+ this.isComplete = true;
+ this.emitEvent( eventName, [ this ] );
+ this.emitEvent( 'always', [ this ] );
+ if ( this.jqDeferred ) {
+ var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
+ this.jqDeferred[ jqMethod ]( this );
+ }
+};
+
+// -------------------------- -------------------------- //
+
+function LoadingImage( img ) {
+ this.img = img;
+}
+
+LoadingImage.prototype = Object.create( EvEmitter.prototype );
+
+LoadingImage.prototype.check = function() {
+ // If complete is true and browser supports natural sizes,
+ // try to check for image status manually.
+ var isComplete = this.getIsImageComplete();
+ if ( isComplete ) {
+ // report based on naturalWidth
+ this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
+ return;
+ }
+
+ // If none of the checks above matched, simulate loading on detached element.
+ this.proxyImage = new Image();
+ this.proxyImage.addEventListener( 'load', this );
+ this.proxyImage.addEventListener( 'error', this );
+ // bind to image as well for Firefox. #191
+ this.img.addEventListener( 'load', this );
+ this.img.addEventListener( 'error', this );
+ this.proxyImage.src = this.img.src;
+};
+
+LoadingImage.prototype.getIsImageComplete = function() {
+ // check for non-zero, non-undefined naturalWidth
+ // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
+ return this.img.complete && this.img.naturalWidth;
+};
+
+LoadingImage.prototype.confirm = function( isLoaded, message ) {
+ this.isLoaded = isLoaded;
+ this.emitEvent( 'progress', [ this, this.img, message ] );
+};
+
+// ----- events ----- //
+
+// trigger specified handler for event type
+LoadingImage.prototype.handleEvent = function( event ) {
+ var method = 'on' + event.type;
+ if ( this[ method ] ) {
+ this[ method ]( event );
+ }
+};
+
+LoadingImage.prototype.onload = function() {
+ this.confirm( true, 'onload' );
+ this.unbindEvents();
+};
+
+LoadingImage.prototype.onerror = function() {
+ this.confirm( false, 'onerror' );
+ this.unbindEvents();
+};
+
+LoadingImage.prototype.unbindEvents = function() {
+ this.proxyImage.removeEventListener( 'load', this );
+ this.proxyImage.removeEventListener( 'error', this );
+ this.img.removeEventListener( 'load', this );
+ this.img.removeEventListener( 'error', this );
+};
+
+// -------------------------- Background -------------------------- //
+
+function Background( url, element ) {
+ this.url = url;
+ this.element = element;
+ this.img = new Image();
+}
+
+// inherit LoadingImage prototype
+Background.prototype = Object.create( LoadingImage.prototype );
+
+Background.prototype.check = function() {
+ this.img.addEventListener( 'load', this );
+ this.img.addEventListener( 'error', this );
+ this.img.src = this.url;
+ // check if image is already complete
+ var isComplete = this.getIsImageComplete();
+ if ( isComplete ) {
+ this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
+ this.unbindEvents();
+ }
+};
+
+Background.prototype.unbindEvents = function() {
+ this.img.removeEventListener( 'load', this );
+ this.img.removeEventListener( 'error', this );
+};
+
+Background.prototype.confirm = function( isLoaded, message ) {
+ this.isLoaded = isLoaded;
+ this.emitEvent( 'progress', [ this, this.element, message ] );
+};
+
+// -------------------------- jQuery -------------------------- //
+
+ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
+ jQuery = jQuery || window.jQuery;
+ if ( !jQuery ) {
+ return;
+ }
+ // set local variable
+ $ = jQuery;
+ // $().imagesLoaded()
+ $.fn.imagesLoaded = function( options, callback ) {
+ var instance = new ImagesLoaded( this, options, callback );
+ return instance.jqDeferred.promise( $(this) );
+ };
+};
+// try making plugin
+ImagesLoaded.makeJQueryPlugin();
+
+// -------------------------- -------------------------- //
+
+return ImagesLoaded;
+
+});
diff --git a/vendor/desandro/imagesloaded/imagesloaded.pkgd.js b/vendor/desandro/imagesloaded/imagesloaded.pkgd.js
new file mode 100644
index 000000000..a230750b3
--- /dev/null
+++ b/vendor/desandro/imagesloaded/imagesloaded.pkgd.js
@@ -0,0 +1,497 @@
+/*!
+ * imagesLoaded PACKAGED v4.1.4
+ * JavaScript is all like "You images are done yet or what?"
+ * MIT License
+ */
+
+/**
+ * EvEmitter v1.1.0
+ * Lil' event emitter
+ * MIT License
+ */
+
+/* jshint unused: true, undef: true, strict: true */
+
+( function( global, factory ) {
+ // universal module definition
+ /* jshint strict: false */ /* globals define, module, window */
+ if ( typeof define == 'function' && define.amd ) {
+ // AMD - RequireJS
+ define( 'ev-emitter/ev-emitter',factory );
+ } else if ( typeof module == 'object' && module.exports ) {
+ // CommonJS - Browserify, Webpack
+ module.exports = factory();
+ } else {
+ // Browser globals
+ global.EvEmitter = factory();
+ }
+
+}( typeof window != 'undefined' ? window : this, function() {
+
+
+
+function EvEmitter() {}
+
+var proto = EvEmitter.prototype;
+
+proto.on = function( eventName, listener ) {
+ if ( !eventName || !listener ) {
+ return;
+ }
+ // set events hash
+ var events = this._events = this._events || {};
+ // set listeners array
+ var listeners = events[ eventName ] = events[ eventName ] || [];
+ // only add once
+ if ( listeners.indexOf( listener ) == -1 ) {
+ listeners.push( listener );
+ }
+
+ return this;
+};
+
+proto.once = function( eventName, listener ) {
+ if ( !eventName || !listener ) {
+ return;
+ }
+ // add event
+ this.on( eventName, listener );
+ // set once flag
+ // set onceEvents hash
+ var onceEvents = this._onceEvents = this._onceEvents || {};
+ // set onceListeners object
+ var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
+ // set flag
+ onceListeners[ listener ] = true;
+
+ return this;
+};
+
+proto.off = function( eventName, listener ) {
+ var listeners = this._events && this._events[ eventName ];
+ if ( !listeners || !listeners.length ) {
+ return;
+ }
+ var index = listeners.indexOf( listener );
+ if ( index != -1 ) {
+ listeners.splice( index, 1 );
+ }
+
+ return this;
+};
+
+proto.emitEvent = function( eventName, args ) {
+ var listeners = this._events && this._events[ eventName ];
+ if ( !listeners || !listeners.length ) {
+ return;
+ }
+ // copy over to avoid interference if .off() in listener
+ listeners = listeners.slice(0);
+ args = args || [];
+ // once stuff
+ var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
+
+ for ( var i=0; i < listeners.length; i++ ) {
+ var listener = listeners[i]
+ var isOnce = onceListeners && onceListeners[ listener ];
+ if ( isOnce ) {
+ // remove listener
+ // remove before trigger to prevent recursion
+ this.off( eventName, listener );
+ // unset once flag
+ delete onceListeners[ listener ];
+ }
+ // trigger listener
+ listener.apply( this, args );
+ }
+
+ return this;
+};
+
+proto.allOff = function() {
+ delete this._events;
+ delete this._onceEvents;
+};
+
+return EvEmitter;
+
+}));
+
+/*!
+ * imagesLoaded v4.1.4
+ * JavaScript is all like "You images are done yet or what?"
+ * MIT License
+ */
+
+( function( window, factory ) { 'use strict';
+ // universal module definition
+
+ /*global define: false, module: false, require: false */
+
+ if ( typeof define == 'function' && define.amd ) {
+ // AMD
+ define( [
+ 'ev-emitter/ev-emitter'
+ ], function( EvEmitter ) {
+ return factory( window, EvEmitter );
+ });
+ } else if ( typeof module == 'object' && module.exports ) {
+ // CommonJS
+ module.exports = factory(
+ window,
+ require('ev-emitter')
+ );
+ } else {
+ // browser global
+ window.imagesLoaded = factory(
+ window,
+ window.EvEmitter
+ );
+ }
+
+})( typeof window !== 'undefined' ? window : this,
+
+// -------------------------- factory -------------------------- //
+
+function factory( window, EvEmitter ) {
+
+
+
+var $ = window.jQuery;
+var console = window.console;
+
+// -------------------------- helpers -------------------------- //
+
+// extend objects
+function extend( a, b ) {
+ for ( var prop in b ) {
+ a[ prop ] = b[ prop ];
+ }
+ return a;
+}
+
+var arraySlice = Array.prototype.slice;
+
+// turn element or nodeList into an array
+function makeArray( obj ) {
+ if ( Array.isArray( obj ) ) {
+ // use object if already an array
+ return obj;
+ }
+
+ var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
+ if ( isArrayLike ) {
+ // convert nodeList to array
+ return arraySlice.call( obj );
+ }
+
+ // array of single index
+ return [ obj ];
+}
+
+// -------------------------- imagesLoaded -------------------------- //
+
+/**
+ * @param {Array, Element, NodeList, String} elem
+ * @param {Object or Function} options - if function, use as callback
+ * @param {Function} onAlways - callback function
+ */
+function ImagesLoaded( elem, options, onAlways ) {
+ // coerce ImagesLoaded() without new, to be new ImagesLoaded()
+ if ( !( this instanceof ImagesLoaded ) ) {
+ return new ImagesLoaded( elem, options, onAlways );
+ }
+ // use elem as selector string
+ var queryElem = elem;
+ if ( typeof elem == 'string' ) {
+ queryElem = document.querySelectorAll( elem );
+ }
+ // bail if bad element
+ if ( !queryElem ) {
+ console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
+ return;
+ }
+
+ this.elements = makeArray( queryElem );
+ this.options = extend( {}, this.options );
+ // shift arguments if no options set
+ if ( typeof options == 'function' ) {
+ onAlways = options;
+ } else {
+ extend( this.options, options );
+ }
+
+ if ( onAlways ) {
+ this.on( 'always', onAlways );
+ }
+
+ this.getImages();
+
+ if ( $ ) {
+ // add jQuery Deferred object
+ this.jqDeferred = new $.Deferred();
+ }
+
+ // HACK check async to allow time to bind listeners
+ setTimeout( this.check.bind( this ) );
+}
+
+ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
+
+ImagesLoaded.prototype.options = {};
+
+ImagesLoaded.prototype.getImages = function() {
+ this.images = [];
+
+ // filter & find items if we have an item selector
+ this.elements.forEach( this.addElementImages, this );
+};
+
+/**
+ * @param {Node} element
+ */
+ImagesLoaded.prototype.addElementImages = function( elem ) {
+ // filter siblings
+ if ( elem.nodeName == 'IMG' ) {
+ this.addImage( elem );
+ }
+ // get background image on element
+ if ( this.options.background === true ) {
+ this.addElementBackgroundImages( elem );
+ }
+
+ // find children
+ // no non-element nodes, #143
+ var nodeType = elem.nodeType;
+ if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
+ return;
+ }
+ var childImgs = elem.querySelectorAll('img');
+ // concat childElems to filterFound array
+ for ( var i=0; i < childImgs.length; i++ ) {
+ var img = childImgs[i];
+ this.addImage( img );
+ }
+
+ // get child background images
+ if ( typeof this.options.background == 'string' ) {
+ var children = elem.querySelectorAll( this.options.background );
+ for ( i=0; i < children.length; i++ ) {
+ var child = children[i];
+ this.addElementBackgroundImages( child );
+ }
+ }
+};
+
+var elementNodeTypes = {
+ 1: true,
+ 9: true,
+ 11: true
+};
+
+ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
+ var style = getComputedStyle( elem );
+ if ( !style ) {
+ // Firefox returns null if in a hidden iframe https://bugzil.la/548397
+ return;
+ }
+ // get url inside url("...")
+ var reURL = /url\((['"])?(.*?)\1\)/gi;
+ var matches = reURL.exec( style.backgroundImage );
+ while ( matches !== null ) {
+ var url = matches && matches[2];
+ if ( url ) {
+ this.addBackground( url, elem );
+ }
+ matches = reURL.exec( style.backgroundImage );
+ }
+};
+
+/**
+ * @param {Image} img
+ */
+ImagesLoaded.prototype.addImage = function( img ) {
+ var loadingImage = new LoadingImage( img );
+ this.images.push( loadingImage );
+};
+
+ImagesLoaded.prototype.addBackground = function( url, elem ) {
+ var background = new Background( url, elem );
+ this.images.push( background );
+};
+
+ImagesLoaded.prototype.check = function() {
+ var _this = this;
+ this.progressedCount = 0;
+ this.hasAnyBroken = false;
+ // complete if no images
+ if ( !this.images.length ) {
+ this.complete();
+ return;
+ }
+
+ function onProgress( image, elem, message ) {
+ // HACK - Chrome triggers event before object properties have changed. #83
+ setTimeout( function() {
+ _this.progress( image, elem, message );
+ });
+ }
+
+ this.images.forEach( function( loadingImage ) {
+ loadingImage.once( 'progress', onProgress );
+ loadingImage.check();
+ });
+};
+
+ImagesLoaded.prototype.progress = function( image, elem, message ) {
+ this.progressedCount++;
+ this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
+ // progress event
+ this.emitEvent( 'progress', [ this, image, elem ] );
+ if ( this.jqDeferred && this.jqDeferred.notify ) {
+ this.jqDeferred.notify( this, image );
+ }
+ // check if completed
+ if ( this.progressedCount == this.images.length ) {
+ this.complete();
+ }
+
+ if ( this.options.debug && console ) {
+ console.log( 'progress: ' + message, image, elem );
+ }
+};
+
+ImagesLoaded.prototype.complete = function() {
+ var eventName = this.hasAnyBroken ? 'fail' : 'done';
+ this.isComplete = true;
+ this.emitEvent( eventName, [ this ] );
+ this.emitEvent( 'always', [ this ] );
+ if ( this.jqDeferred ) {
+ var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
+ this.jqDeferred[ jqMethod ]( this );
+ }
+};
+
+// -------------------------- -------------------------- //
+
+function LoadingImage( img ) {
+ this.img = img;
+}
+
+LoadingImage.prototype = Object.create( EvEmitter.prototype );
+
+LoadingImage.prototype.check = function() {
+ // If complete is true and browser supports natural sizes,
+ // try to check for image status manually.
+ var isComplete = this.getIsImageComplete();
+ if ( isComplete ) {
+ // report based on naturalWidth
+ this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
+ return;
+ }
+
+ // If none of the checks above matched, simulate loading on detached element.
+ this.proxyImage = new Image();
+ this.proxyImage.addEventListener( 'load', this );
+ this.proxyImage.addEventListener( 'error', this );
+ // bind to image as well for Firefox. #191
+ this.img.addEventListener( 'load', this );
+ this.img.addEventListener( 'error', this );
+ this.proxyImage.src = this.img.src;
+};
+
+LoadingImage.prototype.getIsImageComplete = function() {
+ // check for non-zero, non-undefined naturalWidth
+ // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
+ return this.img.complete && this.img.naturalWidth;
+};
+
+LoadingImage.prototype.confirm = function( isLoaded, message ) {
+ this.isLoaded = isLoaded;
+ this.emitEvent( 'progress', [ this, this.img, message ] );
+};
+
+// ----- events ----- //
+
+// trigger specified handler for event type
+LoadingImage.prototype.handleEvent = function( event ) {
+ var method = 'on' + event.type;
+ if ( this[ method ] ) {
+ this[ method ]( event );
+ }
+};
+
+LoadingImage.prototype.onload = function() {
+ this.confirm( true, 'onload' );
+ this.unbindEvents();
+};
+
+LoadingImage.prototype.onerror = function() {
+ this.confirm( false, 'onerror' );
+ this.unbindEvents();
+};
+
+LoadingImage.prototype.unbindEvents = function() {
+ this.proxyImage.removeEventListener( 'load', this );
+ this.proxyImage.removeEventListener( 'error', this );
+ this.img.removeEventListener( 'load', this );
+ this.img.removeEventListener( 'error', this );
+};
+
+// -------------------------- Background -------------------------- //
+
+function Background( url, element ) {
+ this.url = url;
+ this.element = element;
+ this.img = new Image();
+}
+
+// inherit LoadingImage prototype
+Background.prototype = Object.create( LoadingImage.prototype );
+
+Background.prototype.check = function() {
+ this.img.addEventListener( 'load', this );
+ this.img.addEventListener( 'error', this );
+ this.img.src = this.url;
+ // check if image is already complete
+ var isComplete = this.getIsImageComplete();
+ if ( isComplete ) {
+ this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
+ this.unbindEvents();
+ }
+};
+
+Background.prototype.unbindEvents = function() {
+ this.img.removeEventListener( 'load', this );
+ this.img.removeEventListener( 'error', this );
+};
+
+Background.prototype.confirm = function( isLoaded, message ) {
+ this.isLoaded = isLoaded;
+ this.emitEvent( 'progress', [ this, this.element, message ] );
+};
+
+// -------------------------- jQuery -------------------------- //
+
+ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
+ jQuery = jQuery || window.jQuery;
+ if ( !jQuery ) {
+ return;
+ }
+ // set local variable
+ $ = jQuery;
+ // $().imagesLoaded()
+ $.fn.imagesLoaded = function( options, callback ) {
+ var instance = new ImagesLoaded( this, options, callback );
+ return instance.jqDeferred.promise( $(this) );
+ };
+};
+// try making plugin
+ImagesLoaded.makeJQueryPlugin();
+
+// -------------------------- -------------------------- //
+
+return ImagesLoaded;
+
+});
+
diff --git a/vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js b/vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js
new file mode 100644
index 000000000..e443a77d6
--- /dev/null
+++ b/vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js
@@ -0,0 +1,7 @@
+/*!
+ * imagesLoaded PACKAGED v4.1.4
+ * JavaScript is all like "You images are done yet or what?"
+ * MIT License
+ */
+
+!function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o
+
+
+
+
+
+ background
+
+
+
+
+
+
+
+ background
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vendor/desandro/imagesloaded/sandbox/progress/index.html b/vendor/desandro/imagesloaded/sandbox/progress/index.html
new file mode 100644
index 000000000..b01ce28c5
--- /dev/null
+++ b/vendor/desandro/imagesloaded/sandbox/progress/index.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ progress
+
+
+
+
+
+
+ progress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vendor/desandro/imagesloaded/sandbox/progress/progress.js b/vendor/desandro/imagesloaded/sandbox/progress/progress.js
new file mode 100644
index 000000000..7c00003f5
--- /dev/null
+++ b/vendor/desandro/imagesloaded/sandbox/progress/progress.js
@@ -0,0 +1,111 @@
+/* jshint strict: false */
+
+var progressElem, statusElem;
+var supportsProgress;
+var loadedImageCount, imageCount;
+
+var container = document.querySelector('#image-container');
+statusElem = document.querySelector('#status');
+progressElem = document.querySelector('progress');
+
+supportsProgress = progressElem &&
+ // IE does not support progress
+ progressElem.toString().indexOf('Unknown') === -1;
+
+document.querySelector('#add').onclick = function() {
+ // add new images
+ var fragment = getItemsFragment();
+ container.insertBefore( fragment, container.firstChild );
+ // use ImagesLoaded
+ var imgLoad = imagesLoaded( container );
+ imgLoad.on( 'progress', onProgress );
+ imgLoad.on( 'always', onAlways );
+ // reset progress counter
+ imageCount = imgLoad.images.length;
+ resetProgress();
+ updateProgress( 0 );
+};
+
+// reset container
+document.querySelector('#reset').onclick = function() {
+ empty( container );
+};
+
+// ----- set text helper ----- //
+
+var docElem = document.documentElement;
+var textSetter = docElem.textContent !== undefined ? 'textContent' : 'innerText';
+
+function setText( elem, value ) {
+ elem[ textSetter ] = value;
+}
+
+function empty( elem ) {
+ while ( elem.firstChild ) {
+ elem.removeChild( elem.firstChild );
+ }
+}
+
+// ----- ----- //
+
+// return doc fragment with
+function getItemsFragment() {
+ var fragment = document.createDocumentFragment();
+ for ( var i = 0; i < 7; i++ ) {
+ var item = getImageItem();
+ fragment.appendChild( item );
+ }
+ return fragment;
+}
+
+// return an with a
in it
+function getImageItem() {
+ var item = document.createElement('li');
+ item.className = 'is-loading';
+ var img = document.createElement('img');
+ var size = Math.random() * 3 + 1;
+ var width = Math.random() * 110 + 100;
+ width = Math.round( width * size );
+ var height = Math.round( 140 * size );
+ var rando = Math.ceil( Math.random() * 1000 );
+ // 10% chance of broken image src
+ // random parameter to prevent cached images
+ img.src = rando < 100 ? '//foo/broken-' + rando + '.jpg' :
+ // use picsum for great random images
+ 'https://picsum.photos/' + width + '/' + height + '/' + '?random';
+ item.appendChild( img );
+ return item;
+}
+
+// ----- ----- //
+
+function resetProgress() {
+ statusElem.style.opacity = 1;
+ loadedImageCount = 0;
+ if ( supportsProgress ) {
+ progressElem.setAttribute( 'max', imageCount );
+ }
+}
+
+function updateProgress( value ) {
+ if ( supportsProgress ) {
+ progressElem.setAttribute( 'value', value );
+ } else {
+ // if you don't support progress elem
+ setText( statusElem, value + ' / ' + imageCount );
+ }
+}
+
+// triggered after each item is loaded
+function onProgress( imgLoad, image ) {
+ // change class if the image is loaded or broken
+ image.img.parentNode.className = image.isLoaded ? '' : 'is-broken';
+ // update progress element
+ loadedImageCount++;
+ updateProgress( loadedImageCount );
+}
+
+// hide status when done
+function onAlways() {
+ statusElem.style.opacity = 0;
+}
diff --git a/vendor/desandro/imagesloaded/test/css/tests.css b/vendor/desandro/imagesloaded/test/css/tests.css
new file mode 100644
index 000000000..af8a7e885
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/css/tests.css
@@ -0,0 +1,41 @@
+img {
+ display: inline-block;
+ max-width: 240px;
+}
+
+/* ---- backgrounds ---- */
+
+.bg-box {
+ width: 240px;
+ height: 240px;
+ margin: 0 20px 20px 0;
+ border: 1px solid;
+ display: inline-block;
+}
+
+.bg-box.tulip {
+ background: url('http://i.imgur.com/9xYjgCk.jpg');
+ background-size: cover;
+}
+
+.bg-box.thunder-cloud {
+ background: url('../img/thunder-cloud.jpg');
+ background-size: contain;
+}
+
+.bg-box.multi {
+ background:
+ url("http://i.imgur.com/ZAVN3.png"),
+ url('http://i.imgur.com/6UdOxeB.png') bottom right,
+ url(https://picsum.photos/601/401/?random);
+ background-size: cover;
+}
+
+.bg-box.blue {
+ background: #09F;
+}
+
+.bg-box.gulls {
+ background-image: url('http://i.imgur.com/qKhkOKC.jpg');
+ background-size: cover;
+}
diff --git a/vendor/desandro/imagesloaded/test/img/blue-shell.jpg b/vendor/desandro/imagesloaded/test/img/blue-shell.jpg
new file mode 100644
index 000000000..b47f1e927
Binary files /dev/null and b/vendor/desandro/imagesloaded/test/img/blue-shell.jpg differ
diff --git a/vendor/desandro/imagesloaded/test/img/bowser-jr.jpg b/vendor/desandro/imagesloaded/test/img/bowser-jr.jpg
new file mode 100644
index 000000000..b1de2a76f
Binary files /dev/null and b/vendor/desandro/imagesloaded/test/img/bowser-jr.jpg differ
diff --git a/vendor/desandro/imagesloaded/test/img/thunder-cloud.jpg b/vendor/desandro/imagesloaded/test/img/thunder-cloud.jpg
new file mode 100644
index 000000000..54fc9a1b7
Binary files /dev/null and b/vendor/desandro/imagesloaded/test/img/thunder-cloud.jpg differ
diff --git a/vendor/desandro/imagesloaded/test/index.html b/vendor/desandro/imagesloaded/test/index.html
new file mode 100644
index 000000000..02b04f4a6
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/index.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+ imagesLoaded tests
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ imagesLoaded tests
+
+
+
+ Basics
+
+
+
+
+
+ Locals
+
+
+
+ Data URI
+
+
+

+

+
+
+ append
+
+
+
+ no images
+
+
+
+ jQuery success
+
+
+
+ jQuery fail
+
+
+
+ background
+
+
+
+
+
+
+
+

+

+
+
+
+
+
diff --git a/vendor/desandro/imagesloaded/test/unit/append.js b/vendor/desandro/imagesloaded/test/unit/append.js
new file mode 100644
index 000000000..7a6b3c827
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/append.js
@@ -0,0 +1,30 @@
+QUnit.test( 'append', function( assert ) {
+ 'use strict';
+
+ var imgUrls = [
+ 'http://i.imgur.com/bwy74ok.jpg',
+ 'http://i.imgur.com/bAZWoqx.jpg',
+ 'http://i.imgur.com/PgmEBSB.jpg',
+ 'http://i.imgur.com/aboaFoB.jpg',
+ 'http://i.imgur.com/LkmcILl.jpg',
+ 'http://i.imgur.com/q9zO6tw.jpg'
+ ];
+
+ // create images
+ var fragment = document.createDocumentFragment();
+ for ( var i=0, len = imgUrls.length; i < len; i++ ) {
+ var img = document.createElement('img');
+ img.src = imgUrls[i];
+ fragment.appendChild( img );
+ }
+
+ var elem = document.querySelector('#append');
+ elem.appendChild( fragment );
+ var done = assert.async();
+
+ imagesLoaded( elem, { debug: false } ).on( 'always', function() {
+ assert.ok( 'appended images loaded' );
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/background.js b/vendor/desandro/imagesloaded/test/unit/background.js
new file mode 100644
index 000000000..ca76fad6f
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/background.js
@@ -0,0 +1,70 @@
+QUnit.test( 'background', function( assert ) {
+ 'use strict';
+
+ // from Modernizr
+ var supportsMultiBGs = ( function() {
+ var style = document.createElement('a').style;
+ style.cssText = 'background:url(https://),url(https://),red url(https://)';
+ return (/(url\s*\(.*?){3}/).test(style.background);
+ })();
+
+ var multiBGCount = supportsMultiBGs ? 3 : 0;
+ var done = assert.async( 14 + multiBGCount );
+
+ var imgLoad0 = imagesLoaded( '#background .tulip', { background: true }, function() {
+ assert.ok( true, 'callback triggered on .orange-tree');
+ done();
+ });
+ assert.equal( imgLoad0.images.length, 1, '1 image on .images' );
+
+ imgLoad0.on( 'progress', function( instance, image, element ) {
+ assert.ok( element.nodeName == 'DIV', 'progress; element is div');
+ assert.ok( image.isLoaded, 'progress; image.isLoaded');
+ done();
+ });
+
+ var imgLoad1 = imagesLoaded( '#background .thunder-cloud', { background: true }, function() {
+ assert.ok( true, 'callback triggered on .thunder-cloud');
+ done();
+ });
+ assert.equal( imgLoad1.images.length, 1, '1 image on .images' );
+
+ // multiple backgrounds
+ var imgLoad2 = imagesLoaded( '#background .multi', { background: true }, function() {
+ assert.ok( true, 'callback triggered on .multi');
+ done();
+ });
+ assert.equal( imgLoad2.images.length, multiBGCount, 'correct multiple BG count on .images' );
+
+ // multiple elements
+ var imgLoad3 = imagesLoaded( '#background .bg-box', { background: true }, function() {
+ assert.ok( true, 'callback triggered on .bg-box');
+ var count = 5 + multiBGCount;
+ assert.equal( imgLoad3.images.length, count, count + ' images on .bg-box' );
+ done();
+ });
+
+ imgLoad3.on('progress', function( instance, image/*, element */) {
+ assert.ok( true, 'progress on .bg-box; ' + image.img.src );
+ assert.equal( image.isLoaded, true, 'image.isLoaded == true' );
+ done();
+ });
+
+ // background and
children
+ var imgLoad4 = imagesLoaded( '#background .gulls', { background: true } );
+ assert.equal( imgLoad4.images.length, 3, '3 images: 1 background and 2
' );
+
+ imgLoad4.on( 'progress', function( instance, image ) {
+ assert.equal( image.isLoaded, true, 'image is loaded' );
+ done();
+ });
+
+ // child background selector
+ var imgLoad5 = imagesLoaded( '#background', { background: '.bg-box' }, function() {
+ var count = 5 + multiBGCount;
+ assert.equal( imgLoad5.images.length, count,
+ count + ' images on .bg-box, with {background: .bg-box}' );
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/basics.js b/vendor/desandro/imagesloaded/test/unit/basics.js
new file mode 100644
index 000000000..6c502a793
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/basics.js
@@ -0,0 +1,28 @@
+QUnit.test( 'basics', function( assert ) {
+
+ 'use strict';
+
+ var elem = document.querySelector('#basics');
+ var images = elem.querySelectorAll('img');
+ var done = assert.async( 3 + images.length );
+
+ var imgLoader = new imagesLoaded( elem, function( obj ) {
+ assert.ok( true, 'callback function triggered' );
+ assert.equal( imgLoader, obj, 'callback argument and instance match' );
+ done();
+ });
+ imgLoader.on( 'done', function() {
+ assert.ok( true, 'done event triggered' );
+ done();
+ });
+ imgLoader.on( 'always', function() {
+ assert.ok( true, 'always event triggered' );
+ done();
+ });
+
+ imgLoader.on( 'progress', function( loader, image ) {
+ assert.ok( image.isLoaded, 'image is loaded');
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/data-uri.js b/vendor/desandro/imagesloaded/test/unit/data-uri.js
new file mode 100644
index 000000000..635f69859
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/data-uri.js
@@ -0,0 +1,10 @@
+QUnit.test( 'data-uri', function( assert ) {
+ 'use strict';
+
+ var done = assert.async();
+ imagesLoaded('#data-uri', { debug: false }).on( 'done', function( obj ) {
+ assert.ok( true, 'data-uri images loaded' );
+ assert.equal( obj.images.length, 2, 'instance has 2 images' );
+ done();
+ });
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/jquery-fail.js b/vendor/desandro/imagesloaded/test/unit/jquery-fail.js
new file mode 100644
index 000000000..b2180f6f2
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/jquery-fail.js
@@ -0,0 +1,29 @@
+QUnit.test( 'jquery fail', function( assert ) {
+
+ 'use strict';
+
+ var $ = window.jQuery;
+ var $images = $('#jquery-fail img');
+ var done = assert.async( 3 + $images.length );
+
+ $('#jquery-fail').imagesLoaded( function( instance ) {
+ assert.ok( true, 'callback triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .fail( function( instance ) {
+ assert.ok( true, 'fail triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .always( function( instance ) {
+ assert.ok( true, 'always triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .progress( function(/* instance, image */) {
+ assert.ok( true, 'progress trigged');
+ done();
+ });
+
+ });
diff --git a/vendor/desandro/imagesloaded/test/unit/jquery-success.js b/vendor/desandro/imagesloaded/test/unit/jquery-success.js
new file mode 100644
index 000000000..f16621088
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/jquery-success.js
@@ -0,0 +1,28 @@
+QUnit.test( 'jquery success', function( assert ) {
+
+ 'use strict';
+
+ var $ = window.jQuery;
+ var done = assert.async( 6 );
+
+ $('#jquery-success').imagesLoaded( function( instance ) {
+ assert.ok( true, 'callback triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .done( function( instance ) {
+ assert.ok( true, 'done triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .always( function( instance ) {
+ assert.ok( true, 'always triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .progress( function( instance, image ) {
+ assert.ok( image.isLoaded, 'progress trigged, image is loaded');
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/local-files.js b/vendor/desandro/imagesloaded/test/unit/local-files.js
new file mode 100644
index 000000000..61da6ae92
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/local-files.js
@@ -0,0 +1,31 @@
+QUnit.test( 'local files', function( assert ) {
+ 'use strict';
+
+ var elem = document.querySelector('#locals');
+ var done = assert.async( 6 );
+
+ var imgLoader = new imagesLoaded( elem, function( obj ) {
+ assert.ok( true, 'callback function triggered' );
+ assert.equal( imgLoader, obj, 'callback argument and instance match' );
+ done();
+ });
+ imgLoader.on( 'fail', function() {
+ assert.ok( true, 'fail event triggered' );
+ done();
+ });
+ imgLoader.on( 'always', function() {
+ assert.ok( true, 'always event triggered' );
+ done();
+ });
+
+ imgLoader.on( 'progress', function( loader, image ) {
+ assert.ok( true, 'image progressed');
+ if ( image.img.src.indexOf('img/not-there.jpg') !== -1 ) {
+ assert.ok( !image.isLoaded, 'thunder cloud is not loaded' );
+ } else {
+ assert.ok( image.isLoaded, 'image is loaded' );
+ }
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/no-images.js b/vendor/desandro/imagesloaded/test/unit/no-images.js
new file mode 100644
index 000000000..841216381
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/no-images.js
@@ -0,0 +1,11 @@
+QUnit.test( 'no images', function( assert ) {
+ 'use strict';
+
+ var elem = document.querySelector('#no-images');
+ var done = assert.async();
+ imagesLoaded( elem, function() {
+ assert.ok( true, 'triggered with no images' );
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/non-element.js b/vendor/desandro/imagesloaded/test/unit/non-element.js
new file mode 100644
index 000000000..4c9986fa6
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/non-element.js
@@ -0,0 +1,24 @@
+QUnit.test( 'dismiss non-element nodes', function( assert ) {
+ 'use strict';
+
+ var $ = window.jQuery;
+ var done = assert.async( 2 );
+
+ $('
')
+ .imagesLoaded(function() {
+ assert.ok( true, 'elements from jQuery string ok' );
+ done();
+ });
+
+ // test fragment
+ var frag = document.createDocumentFragment();
+ var img = new Image();
+ img.src = 'https://picsum.photos/403/303/?random';
+ frag.appendChild( img );
+ var imgLoad = imagesLoaded( frag, function() {
+ assert.ok( true, 'document fragment ok' );
+ assert.equal( imgLoad.images.length, 1, '1 image found' );
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/selector-string.js b/vendor/desandro/imagesloaded/test/unit/selector-string.js
new file mode 100644
index 000000000..8c43c4bef
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/selector-string.js
@@ -0,0 +1,12 @@
+QUnit.test( 'selector string', function( assert ) {
+ 'use strict';
+ var images = document.querySelectorAll('#basics img');
+ var done = assert.async();
+ var imgLoad = imagesLoaded('#basics', { debug: true }).on( 'done', function( obj ) {
+ assert.ok( true, 'selector string worked' );
+ assert.ok( obj.images, 'argument has images' );
+ assert.equal( obj.images.length, images.length, 'images.length matches' );
+ done();
+ });
+ assert.ok( imgLoad.options.debug, 'debug option set' );
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/single-element.js b/vendor/desandro/imagesloaded/test/unit/single-element.js
new file mode 100644
index 000000000..42d7e48ee
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/single-element.js
@@ -0,0 +1,11 @@
+QUnit.test( 'single element', function( assert ) {
+ 'use strict';
+ var elem = document.querySelector('#mario-with-shell');
+ var done = assert.async();
+ imagesLoaded( elem ).on( 'done', function( obj ) {
+ assert.ok( true, 'single element worked' );
+ assert.ok( obj.images, 'argument has images' );
+ assert.equal( obj.images.length, 1, 'images.length = 1' );
+ done();
+ });
+});
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index dd8dcb5ee..73e559c45 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -36,7 +36,7 @@ head_add_js('/library/colorbox/jquery.colorbox-min.js');
head_add_js('/library/jquery.AreYouSure/jquery.are-you-sure.js');
head_add_js('/library/tableofcontents/jquery.toc.js');
-head_add_js('/library/imagesloaded/imagesloaded.pkgd.min.js');
+head_add_js('/vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js');
/**
* Those who require this feature will know what to do with it.
* Those who don't, won't.
--
cgit v1.2.3
From c7ae3fdc9af6e78ddee63fff4a9938df27d0d39d Mon Sep 17 00:00:00 2001
From: Mario
Date: Sun, 25 Nov 2018 10:18:26 +0100
Subject: update jquery-file-upload and psr-log via composer
---
composer.lock | 130 ++++++++++-----------
vendor/blueimp/jquery-file-upload/README.md | 2 +-
vendor/blueimp/jquery-file-upload/SECURITY.md | 2 +-
vendor/blueimp/jquery-file-upload/angularjs.html | 8 +-
vendor/blueimp/jquery-file-upload/basic-plus.html | 8 +-
vendor/blueimp/jquery-file-upload/basic.html | 6 +-
.../jquery-file-upload/bower-version-update.js | 0
vendor/blueimp/jquery-file-upload/bower.json | 2 +-
.../jquery-file-upload/cors/postmessage.html | 2 +-
vendor/blueimp/jquery-file-upload/index.html | 6 +-
vendor/blueimp/jquery-file-upload/jquery-ui.html | 6 +-
vendor/blueimp/jquery-file-upload/package.json | 2 +-
.../server/php/UploadHandler.php | 34 +++---
.../jquery-file-upload/server/php/index.php | 2 +-
vendor/blueimp/jquery-file-upload/test/index.html | 6 +-
vendor/composer/ClassLoader.php | 2 +-
vendor/composer/LICENSE | 69 +++--------
vendor/composer/autoload_classmap.php | 9 +-
vendor/composer/autoload_static.php | 8 +-
vendor/composer/installed.json | 28 ++---
vendor/psr/log/README.md | 7 ++
21 files changed, 164 insertions(+), 175 deletions(-)
mode change 100755 => 100644 vendor/blueimp/jquery-file-upload/bower-version-update.js
mode change 100755 => 100644 vendor/blueimp/jquery-file-upload/server/php/UploadHandler.php
diff --git a/composer.lock b/composer.lock
index d7e8d11f6..158674a42 100644
--- a/composer.lock
+++ b/composer.lock
@@ -8,16 +8,16 @@
"packages": [
{
"name": "blueimp/jquery-file-upload",
- "version": "v9.25.1",
+ "version": "v9.28.0",
"source": {
"type": "git",
"url": "https://github.com/vkhramtsov/jQuery-File-Upload.git",
- "reference": "28891f9b2bc339bcc1ca8d548e5401e8563bf04b"
+ "reference": "ff5accfe2e5c4a522777faa980a90cf86a636d1d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vkhramtsov/jQuery-File-Upload/zipball/28891f9b2bc339bcc1ca8d548e5401e8563bf04b",
- "reference": "28891f9b2bc339bcc1ca8d548e5401e8563bf04b",
+ "url": "https://api.github.com/repos/vkhramtsov/jQuery-File-Upload/zipball/ff5accfe2e5c4a522777faa980a90cf86a636d1d",
+ "reference": "ff5accfe2e5c4a522777faa980a90cf86a636d1d",
"shasum": ""
},
"type": "library",
@@ -59,7 +59,7 @@
"upload",
"widget"
],
- "time": "2018-10-26T07:21:48+00:00"
+ "time": "2018-11-13T05:41:39+00:00"
},
{
"name": "bshaffer/oauth2-server-php",
@@ -446,16 +446,16 @@
},
{
"name": "psr/log",
- "version": "1.0.2",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
+ "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
"shasum": ""
},
"require": {
@@ -489,7 +489,7 @@
"psr",
"psr-3"
],
- "time": "2016-10-10T12:19:37+00:00"
+ "time": "2018-11-20T15:27:04+00:00"
},
{
"name": "ramsey/uuid",
@@ -1110,7 +1110,7 @@
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.9.0",
+ "version": "v1.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
@@ -2536,16 +2536,16 @@
},
{
"name": "phpunit/php-code-coverage",
- "version": "6.1.3",
+ "version": "6.1.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "4d3ae9b21a7d7e440bd0cf65565533117976859f"
+ "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4d3ae9b21a7d7e440bd0cf65565533117976859f",
- "reference": "4d3ae9b21a7d7e440bd0cf65565533117976859f",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
+ "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
"shasum": ""
},
"require": {
@@ -2595,7 +2595,7 @@
"testing",
"xunit"
],
- "time": "2018-10-23T05:59:32+00:00"
+ "time": "2018-10-31T16:06:48+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -2788,16 +2788,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "7.4.3",
+ "version": "7.4.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "c151651fb6ed264038d486ea262e243af72e5e64"
+ "reference": "b1be2c8530c4c29c3519a052c9fb6cee55053bbd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c151651fb6ed264038d486ea262e243af72e5e64",
- "reference": "c151651fb6ed264038d486ea262e243af72e5e64",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b1be2c8530c4c29c3519a052c9fb6cee55053bbd",
+ "reference": "b1be2c8530c4c29c3519a052c9fb6cee55053bbd",
"shasum": ""
},
"require": {
@@ -2868,7 +2868,7 @@
"testing",
"xunit"
],
- "time": "2018-10-23T05:57:41+00:00"
+ "time": "2018-11-14T16:52:02+00:00"
},
{
"name": "psr/container",
@@ -3534,7 +3534,7 @@
},
{
"name": "symfony/browser-kit",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/browser-kit.git",
@@ -3591,16 +3591,16 @@
},
{
"name": "symfony/class-loader",
- "version": "v3.4.17",
+ "version": "v3.4.18",
"source": {
"type": "git",
"url": "https://github.com/symfony/class-loader.git",
- "reference": "f31333bdff54c7595f834d510a6d2325573ddb36"
+ "reference": "5605edec7b8f034ead2497ff4aab17bb70d558c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/class-loader/zipball/f31333bdff54c7595f834d510a6d2325573ddb36",
- "reference": "f31333bdff54c7595f834d510a6d2325573ddb36",
+ "url": "https://api.github.com/repos/symfony/class-loader/zipball/5605edec7b8f034ead2497ff4aab17bb70d558c1",
+ "reference": "5605edec7b8f034ead2497ff4aab17bb70d558c1",
"shasum": ""
},
"require": {
@@ -3643,20 +3643,20 @@
],
"description": "Symfony ClassLoader Component",
"homepage": "https://symfony.com",
- "time": "2018-10-02T12:28:39+00:00"
+ "time": "2018-10-31T09:06:03+00:00"
},
{
"name": "symfony/config",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "b3d4d7b567d7a49e6dfafb6d4760abc921177c96"
+ "reference": "991fec8bbe77367fc8b48ecbaa8a4bd6e905a238"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/b3d4d7b567d7a49e6dfafb6d4760abc921177c96",
- "reference": "b3d4d7b567d7a49e6dfafb6d4760abc921177c96",
+ "url": "https://api.github.com/repos/symfony/config/zipball/991fec8bbe77367fc8b48ecbaa8a4bd6e905a238",
+ "reference": "991fec8bbe77367fc8b48ecbaa8a4bd6e905a238",
"shasum": ""
},
"require": {
@@ -3706,20 +3706,20 @@
],
"description": "Symfony Config Component",
"homepage": "https://symfony.com",
- "time": "2018-09-08T13:24:10+00:00"
+ "time": "2018-10-31T09:09:42+00:00"
},
{
"name": "symfony/console",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b"
+ "reference": "432122af37d8cd52fba1b294b11976e0d20df595"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/dc7122fe5f6113cfaba3b3de575d31112c9aa60b",
- "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b",
+ "url": "https://api.github.com/repos/symfony/console/zipball/432122af37d8cd52fba1b294b11976e0d20df595",
+ "reference": "432122af37d8cd52fba1b294b11976e0d20df595",
"shasum": ""
},
"require": {
@@ -3774,11 +3774,11 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2018-10-03T08:15:46+00:00"
+ "time": "2018-10-31T09:30:44+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v3.4.17",
+ "version": "v3.4.18",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
@@ -3831,16 +3831,16 @@
},
{
"name": "symfony/dependency-injection",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "f6b9d893ad28aefd8942dc0469c8397e2216fe30"
+ "reference": "e72ee2c23d952e4c368ee98610fa22b79b89b483"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f6b9d893ad28aefd8942dc0469c8397e2216fe30",
- "reference": "f6b9d893ad28aefd8942dc0469c8397e2216fe30",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e72ee2c23d952e4c368ee98610fa22b79b89b483",
+ "reference": "e72ee2c23d952e4c368ee98610fa22b79b89b483",
"shasum": ""
},
"require": {
@@ -3898,11 +3898,11 @@
],
"description": "Symfony DependencyInjection Component",
"homepage": "https://symfony.com",
- "time": "2018-10-02T12:40:59+00:00"
+ "time": "2018-10-31T10:54:16+00:00"
},
{
"name": "symfony/dom-crawler",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
@@ -3959,16 +3959,16 @@
},
{
"name": "symfony/event-dispatcher",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e"
+ "reference": "552541dad078c85d9414b09c041ede488b456cd5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bfb30c2ad377615a463ebbc875eba64a99f6aa3e",
- "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/552541dad078c85d9414b09c041ede488b456cd5",
+ "reference": "552541dad078c85d9414b09c041ede488b456cd5",
"shasum": ""
},
"require": {
@@ -4018,20 +4018,20 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
- "time": "2018-07-26T09:10:45+00:00"
+ "time": "2018-10-10T13:52:42+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "596d12b40624055c300c8b619755b748ca5cf0b5"
+ "reference": "fd7bd6535beb1f0a0a9e3ee960666d0598546981"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/596d12b40624055c300c8b619755b748ca5cf0b5",
- "reference": "596d12b40624055c300c8b619755b748ca5cf0b5",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/fd7bd6535beb1f0a0a9e3ee960666d0598546981",
+ "reference": "fd7bd6535beb1f0a0a9e3ee960666d0598546981",
"shasum": ""
},
"require": {
@@ -4068,20 +4068,20 @@
],
"description": "Symfony Filesystem Component",
"homepage": "https://symfony.com",
- "time": "2018-10-02T12:40:59+00:00"
+ "time": "2018-10-30T13:18:25+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.9.0",
+ "version": "v1.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8"
+ "reference": "c79c051f5b3a46be09205c73b80b346e4153e494"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8",
- "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494",
+ "reference": "c79c051f5b3a46be09205c73b80b346e4153e494",
"shasum": ""
},
"require": {
@@ -4127,20 +4127,20 @@
"portable",
"shim"
],
- "time": "2018-08-06T14:22:27+00:00"
+ "time": "2018-09-21T13:07:52+00:00"
},
{
"name": "symfony/translation",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "9f0b61e339160a466ebcde167a6c5521c810e304"
+ "reference": "aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/9f0b61e339160a466ebcde167a6c5521c810e304",
- "reference": "9f0b61e339160a466ebcde167a6c5521c810e304",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c",
+ "reference": "aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c",
"shasum": ""
},
"require": {
@@ -4196,11 +4196,11 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
- "time": "2018-10-02T16:36:10+00:00"
+ "time": "2018-10-28T18:38:52+00:00"
},
{
"name": "symfony/yaml",
- "version": "v4.1.6",
+ "version": "v4.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
diff --git a/vendor/blueimp/jquery-file-upload/README.md b/vendor/blueimp/jquery-file-upload/README.md
index d2f104d5c..d9e16ed18 100644
--- a/vendor/blueimp/jquery-file-upload/README.md
+++ b/vendor/blueimp/jquery-file-upload/README.md
@@ -10,7 +10,7 @@ Supports cross-domain, chunked and resumable file uploads and client-side image
## ⚠️ Security Notice
Security related releases:
-* [v9.25.1](https://github.com/blueimp/jQuery-File-Upload/releases/tag/v9.25.1) Mitigates some [Potential vulnerabilities with PHP+ImageMagick](VULNERABILITIES.md#potential-vulnerabilities-with-php+imagemagick).
+* [v9.25.1](https://github.com/blueimp/jQuery-File-Upload/releases/tag/v9.25.1) Mitigates some [Potential vulnerabilities with PHP+ImageMagick](VULNERABILITIES.md#potential-vulnerabilities-with-php-imagemagick).
* [v9.24.1](https://github.com/blueimp/jQuery-File-Upload/releases/tag/v9.24.1) Fixes a [Remote code execution vulnerability in the PHP component](VULNERABILITIES.md#remote-code-execution-vulnerability-in-the-php-component).
* v[9.10.1](https://github.com/blueimp/jQuery-File-Upload/releases/tag/9.10.1) Fixes an [Open redirect vulnerability in the GAE components](VULNERABILITIES.md#open-redirect-vulnerability-in-the-gae-components).
* Commit [4175032](https://github.com/blueimp/jQuery-File-Upload/commit/41750323a464e848856dc4c5c940663498beb74a) (*fixed in all tagged releases*) Fixes a [Cross-site scripting vulnerability in the Iframe Transport](VULNERABILITIES.md#cross-site-scripting-vulnerability-in-the-iframe-transport).
diff --git a/vendor/blueimp/jquery-file-upload/SECURITY.md b/vendor/blueimp/jquery-file-upload/SECURITY.md
index db58f7dd7..86ffc163b 100644
--- a/vendor/blueimp/jquery-file-upload/SECURITY.md
+++ b/vendor/blueimp/jquery-file-upload/SECURITY.md
@@ -113,7 +113,7 @@ location ^~ /path/to/project/server/php/files {
```
## Secure image processing configurations
-The following configuration mitigates [potential image processing vulnerabilities with ImageMagick](VULNERABILITIES.md#potential-vulnerabilities-with-php+imagemagick) by limiting the attack vectors to a small subset of image types (`GIF/JPEG/PNG`).
+The following configuration mitigates [potential image processing vulnerabilities with ImageMagick](VULNERABILITIES.md#potential-vulnerabilities-with-php-imagemagick) by limiting the attack vectors to a small subset of image types (`GIF/JPEG/PNG`).
Please also consider using alternative, safer image processing libraries like [libvips](https://github.com/libvips/libvips) or [imageflow](https://github.com/imazen/imageflow).
diff --git a/vendor/blueimp/jquery-file-upload/angularjs.html b/vendor/blueimp/jquery-file-upload/angularjs.html
index 2051bbf79..e8b05e77f 100644
--- a/vendor/blueimp/jquery-file-upload/angularjs.html
+++ b/vendor/blueimp/jquery-file-upload/angularjs.html
@@ -22,7 +22,7 @@
-
+
@@ -177,8 +177,8 @@
-
-
+
+
@@ -186,7 +186,7 @@
-
+
diff --git a/vendor/blueimp/jquery-file-upload/basic-plus.html b/vendor/blueimp/jquery-file-upload/basic-plus.html
index acee24843..6d53acdc1 100644
--- a/vendor/blueimp/jquery-file-upload/basic-plus.html
+++ b/vendor/blueimp/jquery-file-upload/basic-plus.html
@@ -20,7 +20,7 @@
-
+
@@ -96,15 +96,15 @@
-
+
-
+
-
+
diff --git a/vendor/blueimp/jquery-file-upload/basic.html b/vendor/blueimp/jquery-file-upload/basic.html
index 232a24624..a9ef6273e 100644
--- a/vendor/blueimp/jquery-file-upload/basic.html
+++ b/vendor/blueimp/jquery-file-upload/basic.html
@@ -20,7 +20,7 @@
-
+
@@ -96,7 +96,7 @@
-
+
@@ -104,7 +104,7 @@
-
+
+
-
+
@@ -226,7 +226,7 @@
-
+
diff --git a/vendor/blueimp/jquery-file-upload/jquery-ui.html b/vendor/blueimp/jquery-file-upload/jquery-ui.html
index 842dd4ca7..e44d41e89 100644
--- a/vendor/blueimp/jquery-file-upload/jquery-ui.html
+++ b/vendor/blueimp/jquery-file-upload/jquery-ui.html
@@ -22,7 +22,7 @@
-
+
@@ -201,8 +201,8 @@
{% } %}
-
-
+
+
diff --git a/vendor/blueimp/jquery-file-upload/package.json b/vendor/blueimp/jquery-file-upload/package.json
index 4b33a0362..0a635397c 100644
--- a/vendor/blueimp/jquery-file-upload/package.json
+++ b/vendor/blueimp/jquery-file-upload/package.json
@@ -1,6 +1,6 @@
{
"name": "blueimp-file-upload",
- "version": "9.25.1",
+ "version": "9.28.0",
"title": "jQuery File Upload",
"description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
"keywords": [
diff --git a/vendor/blueimp/jquery-file-upload/server/php/UploadHandler.php b/vendor/blueimp/jquery-file-upload/server/php/UploadHandler.php
old mode 100755
new mode 100644
index e44004395..5215e4c0f
--- a/vendor/blueimp/jquery-file-upload/server/php/UploadHandler.php
+++ b/vendor/blueimp/jquery-file-upload/server/php/UploadHandler.php
@@ -38,9 +38,9 @@ class UploadHandler
'image_resize' => 'Failed to resize image'
);
- protected const IMAGETYPE_GIF = 1;
- protected const IMAGETYPE_JPEG = 2;
- protected const IMAGETYPE_PNG = 3;
+ const IMAGETYPE_GIF = 1;
+ const IMAGETYPE_JPEG = 2;
+ const IMAGETYPE_PNG = 3;
protected $image_objects = array();
@@ -1047,13 +1047,18 @@ class UploadHandler
}
protected function create_scaled_image($file_name, $version, $options) {
- if ($this->options['image_library'] === 2) {
- return $this->imagemagick_create_scaled_image($file_name, $version, $options);
- }
- if ($this->options['image_library'] && extension_loaded('imagick')) {
- return $this->imagick_create_scaled_image($file_name, $version, $options);
+ try {
+ if ($this->options['image_library'] === 2) {
+ return $this->imagemagick_create_scaled_image($file_name, $version, $options);
+ }
+ if ($this->options['image_library'] && extension_loaded('imagick')) {
+ return $this->imagick_create_scaled_image($file_name, $version, $options);
+ }
+ return $this->gd_create_scaled_image($file_name, $version, $options);
+ } catch (\Exception $e) {
+ error_log($e->getMessage());
+ return false;
}
- return $this->gd_create_scaled_image($file_name, $version, $options);
}
protected function destroy_image_object($file_path) {
@@ -1066,12 +1071,12 @@ class UploadHandler
$fp = fopen($file_path, 'r');
$data = fread($fp, 4);
fclose($fp);
- // GIF: 47 49 46
- if (substr($data, 0, 3) === 'GIF') {
+ // GIF: 47 49 46 38
+ if ($data === 'GIF8') {
return self::IMAGETYPE_GIF;
}
- // JPG: FF D8
- if (bin2hex(substr($data, 0, 2)) === 'ffd8') {
+ // JPG: FF D8 FF
+ if (bin2hex(substr($data, 0, 3)) === 'ffd8ff') {
return self::IMAGETYPE_JPEG;
}
// PNG: 89 50 4E 47
@@ -1082,6 +1087,9 @@ class UploadHandler
}
protected function is_valid_image_file($file_path) {
+ if (!preg_match('/\.(gif|jpe?g|png)$/i', $file_path)) {
+ return false;
+ }
return !!$this->imagetype($file_path);
}
diff --git a/vendor/blueimp/jquery-file-upload/server/php/index.php b/vendor/blueimp/jquery-file-upload/server/php/index.php
index 9c2cfb8eb..6caabb710 100644
--- a/vendor/blueimp/jquery-file-upload/server/php/index.php
+++ b/vendor/blueimp/jquery-file-upload/server/php/index.php
@@ -9,7 +9,7 @@
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
-exit;
+
error_reporting(E_ALL | E_STRICT);
require('UploadHandler.php');
$upload_handler = new UploadHandler();
diff --git a/vendor/blueimp/jquery-file-upload/test/index.html b/vendor/blueimp/jquery-file-upload/test/index.html
index 0b5cf57b7..b8c585df5 100644
--- a/vendor/blueimp/jquery-file-upload/test/index.html
+++ b/vendor/blueimp/jquery-file-upload/test/index.html
@@ -20,7 +20,7 @@
jQuery File Upload Plugin Test
-
+
@@ -145,7 +145,7 @@
{% } %}
-
+
@@ -166,7 +166,7 @@ window.testBasicWidget = $.blueimp.fileupload;
/* global window, $ */
window.testUIWidget = $.blueimp.fileupload;
-
+