Compare commits

..

3 commits

Author SHA1 Message Date
BitPickups
c17d16b970 adding files login_image.png and login_video.mp4 to the images folder
#These files work in combination with a modified /view/templeates/login.tpl file that integrates the files into the
#login page.
#the video is is just a small example video
#The content of the files can be easily replaced by site specific files that have to have the same name and have to be
#uploaded to the /images folder.

#/view/templeates/login.tpl changes:
#add the following from line 32 on behind the command {{/foreach}}

<video src="/images/login_video.mp4" width="320" controls>
           <p>Your browser doesn't support HTML5 video. Here is no link to another video instead.</p>
        </video>
	<img src="/images/login_image.png">
2021-07-16 07:07:13 +00:00
BitPickups
415f5de926 modified login.tlp: login template with login_image.png and login_video.mp4
#The following code was added to the original login.tpl
#The respective files are located in the folder /images and can be easily replaced with files of the same name with #site specific content by uploading those respective files to the server
#no files no changes in the original login appearance.

<video src="/images/login_video.mp4" width="320" controls>
           <p>Your browser doesn't support HTML5 video. There is no link to another video instead.</p>
        </video>
	<img src="/images/login_image.png">
2021-07-16 06:50:46 +00:00
BitPickups
3bf9d6a0e6 image addons and .tar.gz to replace existing friendica buttons friendica-16→128px.png 2021-07-12 05:24:24 +00:00
80 changed files with 3975 additions and 2075 deletions

BIN
CCBYNCSA.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
CCfleur.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

View file

@ -1,7 +1,3 @@
Version 2021.09 (unreleased)
Friendica Core
Simplified the proxy mechanism. The proxy cache directory (/proxy) can now be removed [annando]
Version 2021.07 (2021-07-04)
Friendica Core
Updates to the translation DE, EN-GB, HU, IT, JA [translation teams]

View file

@ -1 +1 @@
2021.09-dev
2021.07

View file

@ -107,6 +107,8 @@ cp /vagrant/.htaccess-dist /vagrant/.htaccess
# create the friendica database
echo "create database friendica DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" | $MYSQL -u root -proot
# import test database (disabled because too old)
#$MYSQL -uroot -proot friendica < /vagrant/friendica_test_data.sql
# install friendica
bin/console autoinstall -f /vagrant/mods/local.config.vagrant.php

View file

@ -38,7 +38,7 @@ use Friendica\Util\DateTimeFormat;
define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'Siberian Iris');
define('FRIENDICA_VERSION', '2021.09-dev');
define('FRIENDICA_VERSION', '2021.07');
define('DFRN_PROTOCOL_VERSION', '2.23');
define('NEW_TABLE_STRUCTURE_VERSION', 1288);
@ -444,6 +444,93 @@ function get_temppath()
return '';
}
function get_cachefile($file, $writemode = true)
{
$cache = get_itemcachepath();
if ((!$cache) || (!is_dir($cache))) {
return "";
}
$subfolder = $cache . "/" . substr($file, 0, 2);
$cachepath = $subfolder . "/" . $file;
if ($writemode) {
if (!is_dir($subfolder)) {
mkdir($subfolder);
chmod($subfolder, 0777);
}
}
return $cachepath;
}
function clear_cache($basepath = "", $path = "")
{
if ($path == "") {
$basepath = get_itemcachepath();
$path = $basepath;
}
if (($path == "") || (!is_dir($path))) {
return;
}
if (substr(realpath($path), 0, strlen($basepath)) != $basepath) {
return;
}
$cachetime = (int) DI::config()->get('system', 'itemcache_duration');
if ($cachetime == 0) {
$cachetime = 86400;
}
if (is_writable($path)) {
if ($dh = opendir($path)) {
while (($file = readdir($dh)) !== false) {
$fullpath = $path . "/" . $file;
if ((filetype($fullpath) == "dir") && ($file != ".") && ($file != "..")) {
clear_cache($basepath, $fullpath);
}
if ((filetype($fullpath) == "file") && (filectime($fullpath) < (time() - $cachetime))) {
unlink($fullpath);
}
}
closedir($dh);
}
}
}
function get_itemcachepath()
{
// Checking, if the cache is deactivated
$cachetime = (int) DI::config()->get('system', 'itemcache_duration');
if ($cachetime < 0) {
return "";
}
$itemcache = DI::config()->get('system', 'itemcache');
if (($itemcache != "") && System::isDirectoryUsable($itemcache)) {
return BasePath::getRealPath($itemcache);
}
$temppath = get_temppath();
if ($temppath != "") {
$itemcache = $temppath . "/itemcache";
if (!file_exists($itemcache) && !is_dir($itemcache)) {
mkdir($itemcache);
}
if (System::isDirectoryUsable($itemcache)) {
DI::config()->set("system", "itemcache", $itemcache);
return $itemcache;
}
}
return "";
}
/**
* Returns the path where spool files are stored
*

View file

@ -1,6 +1,6 @@
-- ------------------------------------------
-- Friendica 2021.09-dev (Siberian Iris)
-- DB_UPDATE_VERSION 1428
-- Friendica 2021.06-rc (Siberian Iris)
-- DB_UPDATE_VERSION 1424
-- ------------------------------------------
@ -94,18 +94,6 @@ CREATE TABLE IF NOT EXISTS `user` (
FOREIGN KEY (`parent-uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='The local users';
--
-- TABLE item-uri
--
CREATE TABLE IF NOT EXISTS `item-uri` (
`id` int unsigned NOT NULL auto_increment,
`uri` varbinary(255) NOT NULL COMMENT 'URI of an item',
`guid` varbinary(255) COMMENT 'A unique identifier for an item',
PRIMARY KEY(`id`),
UNIQUE INDEX `uri` (`uri`),
INDEX `guid` (`guid`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='URI and GUID for items';
--
-- TABLE contact
--
@ -138,7 +126,6 @@ CREATE TABLE IF NOT EXISTS `contact` (
`dfrn-id` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`nurl` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the contact url',
`addr` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`alias` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`pubkey` text COMMENT 'RSA public key 4096 bit',
@ -215,12 +202,22 @@ CREATE TABLE IF NOT EXISTS `contact` (
INDEX `uid_self_contact-type` (`uid`,`self`,`contact-type`),
INDEX `self_network_uid` (`self`,`network`,`uid`),
INDEX `gsid` (`gsid`),
INDEX `uri-id` (`uri-id`),
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`gsid`) REFERENCES `gserver` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='contact table';
--
-- TABLE item-uri
--
CREATE TABLE IF NOT EXISTS `item-uri` (
`id` int unsigned NOT NULL auto_increment,
`uri` varbinary(255) NOT NULL COMMENT 'URI of an item',
`guid` varbinary(255) COMMENT 'A unique identifier for an item',
PRIMARY KEY(`id`),
UNIQUE INDEX `uri` (`uri`),
INDEX `guid` (`guid`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='URI and GUID for items';
--
-- TABLE tag
--
@ -335,7 +332,6 @@ CREATE TABLE IF NOT EXISTS `addon` (
--
CREATE TABLE IF NOT EXISTS `apcontact` (
`url` varbinary(255) NOT NULL COMMENT 'URL of the contact',
`uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the apcontact url',
`uuid` varchar(255) COMMENT '',
`type` varchar(20) NOT NULL COMMENT '',
`following` varchar(255) COMMENT '',
@ -368,8 +364,6 @@ CREATE TABLE IF NOT EXISTS `apcontact` (
INDEX `baseurl` (`baseurl`(190)),
INDEX `sharedinbox` (`sharedinbox`(190)),
INDEX `gsid` (`gsid`),
UNIQUE INDEX `uri-id` (`uri-id`),
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`gsid`) REFERENCES `gserver` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='ActivityPub compatible contacts - used in the ActivityPub implementation';
@ -569,7 +563,6 @@ CREATE TABLE IF NOT EXISTS `event` (
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id',
`cid` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact_id (ID of the contact in contact table)',
`uri` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the event uri',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'creation time',
`edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'last edit time',
`start` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'event start time',
@ -588,10 +581,8 @@ CREATE TABLE IF NOT EXISTS `event` (
PRIMARY KEY(`id`),
INDEX `uid_start` (`uid`,`start`),
INDEX `cid` (`cid`),
INDEX `uri-id` (`uri-id`),
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Events';
--
@ -601,7 +592,6 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
`guid` varchar(255) NOT NULL DEFAULT '' COMMENT 'unique id',
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the fcontact url',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`photo` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`request` varchar(255) NOT NULL DEFAULT '' COMMENT '',
@ -618,9 +608,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
`updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
PRIMARY KEY(`id`),
INDEX `addr` (`addr`(32)),
UNIQUE INDEX `url` (`url`(190)),
UNIQUE INDEX `uri-id` (`uri-id`),
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
UNIQUE INDEX `url` (`url`(190))
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Diaspora compatible contacts - used in the Diaspora implementation';
--
@ -1115,19 +1103,6 @@ CREATE TABLE IF NOT EXISTS `post-delivery-data` (
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Delivery data for items';
--
-- TABLE post-link
--
CREATE TABLE IF NOT EXISTS `post-link` (
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
`url` varbinary(511) NOT NULL COMMENT 'External URL',
`mimetype` varchar(60) COMMENT '',
PRIMARY KEY(`id`),
UNIQUE INDEX `uri-id-url` (`uri-id`,`url`),
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Post related external links';
--
-- TABLE post-media
--
@ -1303,7 +1278,6 @@ CREATE TABLE IF NOT EXISTS `post-thread-user` (
INDEX `post-user-id` (`post-user-id`),
INDEX `commented` (`commented`),
INDEX `uid_received` (`uid`,`received`),
INDEX `uid_wall_received` (`uid`,`wall`,`received`),
INDEX `uid_pinned` (`uid`,`pinned`),
INDEX `uid_commented` (`uid`,`commented`),
INDEX `uid_starred` (`uid`,`starred`),
@ -2291,7 +2265,6 @@ CREATE VIEW `owner-view` AS SELECT
`contact`.`dfrn-id` AS `dfrn-id`,
`contact`.`url` AS `url`,
`contact`.`nurl` AS `nurl`,
`contact`.`uri-id` AS `uri-id`,
`contact`.`addr` AS `addr`,
`contact`.`alias` AS `alias`,
`contact`.`pubkey` AS `pubkey`,
@ -2395,189 +2368,6 @@ CREATE VIEW `owner-view` AS SELECT
INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`
INNER JOIN `profile` ON `profile`.`uid` = `user`.`uid`;
--
-- VIEW account-view
--
DROP VIEW IF EXISTS `account-view`;
CREATE VIEW `account-view` AS SELECT
`contact`.`id` AS `id`,
`contact`.`url` AS `url`,
`contact`.`nurl` AS `nurl`,
`contact`.`uri-id` AS `uri-id`,
`contact`.`addr` AS `addr`,
`contact`.`alias` AS `alias`,
`contact`.`name` AS `name`,
`contact`.`nick` AS `nick`,
`contact`.`about` AS `about`,
`contact`.`keywords` AS `keywords`,
`contact`.`xmpp` AS `xmpp`,
`contact`.`avatar` AS `avatar`,
`contact`.`photo` AS `photo`,
`contact`.`thumb` AS `thumb`,
`contact`.`micro` AS `micro`,
`contact`.`header` AS `header`,
`contact`.`created` AS `created`,
`contact`.`updated` AS `updated`,
`contact`.`network` AS `network`,
`contact`.`protocol` AS `protocol`,
`contact`.`location` AS `location`,
`contact`.`attag` AS `attag`,
`contact`.`pubkey` AS `pubkey`,
`contact`.`prvkey` AS `prvkey`,
`contact`.`subscribe` AS `subscribe`,
`contact`.`last-update` AS `last-update`,
`contact`.`success_update` AS `success_update`,
`contact`.`failure_update` AS `failure_update`,
`contact`.`failed` AS `failed`,
`contact`.`last-item` AS `last-item`,
`contact`.`last-discovery` AS `last-discovery`,
`contact`.`contact-type` AS `contact-type`,
`contact`.`manually-approve` AS `manually-approve`,
`contact`.`unsearchable` AS `unsearchable`,
`contact`.`sensitive` AS `sensitive`,
`contact`.`baseurl` AS `baseurl`,
`contact`.`gsid` AS `gsid`,
`contact`.`info` AS `info`,
`contact`.`bdyear` AS `bdyear`,
`contact`.`bd` AS `bd`,
`contact`.`poco` AS `poco`,
`contact`.`name-date` AS `name-date`,
`contact`.`uri-date` AS `uri-date`,
`contact`.`avatar-date` AS `avatar-date`,
`contact`.`term-date` AS `term-date`,
`contact`.`hidden` AS `global-ignored`,
`contact`.`blocked` AS `global-blocked`,
`contact`.`hidden` AS `hidden`,
`contact`.`archive` AS `archive`,
`contact`.`deleted` AS `deleted`,
`contact`.`blocked` AS `blocked`,
`contact`.`request` AS `dfrn-request`,
`contact`.`notify` AS `dfrn-notify`,
`contact`.`poll` AS `dfrn-poll`,
`contact`.`confirm` AS `dfrn-confirm`,
`fcontact`.`guid` AS `diaspora-guid`,
`fcontact`.`batch` AS `diaspora-batch`,
`fcontact`.`notify` AS `diaspora-notify`,
`fcontact`.`poll` AS `diaspora-poll`,
`fcontact`.`alias` AS `diaspora-alias`,
`apcontact`.`uuid` AS `ap-uuid`,
`apcontact`.`type` AS `ap-type`,
`apcontact`.`following` AS `ap-following`,
`apcontact`.`followers` AS `ap-followers`,
`apcontact`.`inbox` AS `ap-inbox`,
`apcontact`.`outbox` AS `ap-outbox`,
`apcontact`.`sharedinbox` AS `ap-sharedinbox`,
`apcontact`.`generator` AS `ap-generator`,
`apcontact`.`following_count` AS `ap-following_count`,
`apcontact`.`followers_count` AS `ap-followers_count`,
`apcontact`.`statuses_count` AS `ap-statuses_count`
FROM `contact`
LEFT JOIN `apcontact` ON `apcontact`.`uri-id` = `contact`.`uri-id`
LEFT JOIN `fcontact` ON `fcontact`.`uri-id` = contact.`uri-id`
WHERE `contact`.`uid` = 0;
--
-- VIEW account-user-view
--
DROP VIEW IF EXISTS `account-user-view`;
CREATE VIEW `account-user-view` AS SELECT
`ucontact`.`id` AS `id`,
`contact`.`id` AS `pid`,
`ucontact`.`uid` AS `uid`,
`contact`.`url` AS `url`,
`contact`.`nurl` AS `nurl`,
`contact`.`uri-id` AS `uri-id`,
`contact`.`addr` AS `addr`,
`contact`.`alias` AS `alias`,
`contact`.`name` AS `name`,
`contact`.`nick` AS `nick`,
`contact`.`about` AS `about`,
`contact`.`keywords` AS `keywords`,
`contact`.`xmpp` AS `xmpp`,
`contact`.`avatar` AS `avatar`,
`contact`.`photo` AS `photo`,
`contact`.`thumb` AS `thumb`,
`contact`.`micro` AS `micro`,
`contact`.`header` AS `header`,
`contact`.`created` AS `created`,
`contact`.`updated` AS `updated`,
`ucontact`.`self` AS `self`,
`ucontact`.`remote_self` AS `remote_self`,
`ucontact`.`rel` AS `rel`,
`contact`.`network` AS `network`,
`ucontact`.`protocol` AS `protocol`,
`contact`.`location` AS `location`,
`contact`.`attag` AS `attag`,
`contact`.`pubkey` AS `pubkey`,
`contact`.`prvkey` AS `prvkey`,
`contact`.`subscribe` AS `subscribe`,
`contact`.`last-update` AS `last-update`,
`contact`.`success_update` AS `success_update`,
`contact`.`failure_update` AS `failure_update`,
`contact`.`failed` AS `failed`,
`contact`.`last-item` AS `last-item`,
`contact`.`last-discovery` AS `last-discovery`,
`contact`.`contact-type` AS `contact-type`,
`contact`.`manually-approve` AS `manually-approve`,
`contact`.`unsearchable` AS `unsearchable`,
`contact`.`sensitive` AS `sensitive`,
`contact`.`baseurl` AS `baseurl`,
`contact`.`gsid` AS `gsid`,
`contact`.`info` AS `info`,
`contact`.`bdyear` AS `bdyear`,
`contact`.`bd` AS `bd`,
`contact`.`poco` AS `poco`,
`contact`.`name-date` AS `name-date`,
`contact`.`uri-date` AS `uri-date`,
`contact`.`avatar-date` AS `avatar-date`,
`contact`.`term-date` AS `term-date`,
`contact`.`hidden` AS `global-ignored`,
`contact`.`blocked` AS `global-blocked`,
`ucontact`.`hidden` AS `hidden`,
`ucontact`.`archive` AS `archive`,
`ucontact`.`pending` AS `pending`,
`ucontact`.`deleted` AS `deleted`,
`ucontact`.`notify_new_posts` AS `notify_new_posts`,
`ucontact`.`fetch_further_information` AS `fetch_further_information`,
`ucontact`.`ffi_keyword_denylist` AS `ffi_keyword_denylist`,
`ucontact`.`rating` AS `rating`,
`ucontact`.`readonly` AS `readonly`,
`ucontact`.`blocked` AS `blocked`,
`ucontact`.`block_reason` AS `block_reason`,
`ucontact`.`subhub` AS `subhub`,
`ucontact`.`hub-verify` AS `hub-verify`,
`ucontact`.`reason` AS `reason`,
`ucontact`.`duplex` AS `dfrn-duplex`,
`ucontact`.`ret-aes` AS `dfrn-ret-aes`,
`ucontact`.`site-pubkey` AS `dfrn-site-pubkey`,
`ucontact`.`issued-id` AS `dfrn-issued-id`,
`ucontact`.`dfrn-id` AS `dfrn-id`,
`ucontact`.`aes_allow` AS `dfrn-aes_allow`,
`contact`.`request` AS `dfrn-request`,
`contact`.`notify` AS `dfrn-notify`,
`contact`.`poll` AS `dfrn-poll`,
`contact`.`confirm` AS `dfrn-confirm`,
`fcontact`.`guid` AS `diaspora-guid`,
`fcontact`.`batch` AS `diaspora-batch`,
`fcontact`.`notify` AS `diaspora-notify`,
`fcontact`.`poll` AS `diaspora-poll`,
`fcontact`.`alias` AS `diaspora-alias`,
`apcontact`.`uuid` AS `ap-uuid`,
`apcontact`.`type` AS `ap-type`,
`apcontact`.`following` AS `ap-following`,
`apcontact`.`followers` AS `ap-followers`,
`apcontact`.`inbox` AS `ap-inbox`,
`apcontact`.`outbox` AS `ap-outbox`,
`apcontact`.`sharedinbox` AS `ap-sharedinbox`,
`apcontact`.`generator` AS `ap-generator`,
`apcontact`.`following_count` AS `ap-following_count`,
`apcontact`.`followers_count` AS `ap-followers_count`,
`apcontact`.`statuses_count` AS `ap-statuses_count`
FROM `contact` AS `ucontact`
INNER JOIN `contact` ON `contact`.`uri-id` = `ucontact`.`uri-id` AND `contact`.`uid` = 0
LEFT JOIN `apcontact` ON `apcontact`.`uri-id` = `ucontact`.`uri-id`
LEFT JOIN `fcontact` ON `fcontact`.`uri-id` = `ucontact`.`uri-id` AND `fcontact`.`network` = 'dspr';
--
-- VIEW pending-view
--

View file

@ -53,7 +53,6 @@ Database Tables
| [post-category](help/database/db_post-category) | post relation to categories |
| [post-content](help/database/db_post-content) | Content for all posts |
| [post-delivery-data](help/database/db_post-delivery-data) | Delivery data for items |
| [post-link](help/database/db_post-link) | Post related external links |
| [post-media](help/database/db_post-media) | Attached media |
| [post-tag](help/database/db_post-tag) | post relation to tags |
| [post-thread](help/database/db_post-thread) | Thread related data |

View file

@ -9,7 +9,6 @@ Fields
| Field | Description | Type | Null | Key | Default | Extra |
| ---------------- | ------------------------------------------------------------------- | -------------- | ---- | --- | ------------------- | ----- |
| url | URL of the contact | varbinary(255) | NO | PRI | NULL | |
| uri-id | Id of the item-uri table entry that contains the apcontact url | int unsigned | YES | | NULL | |
| uuid | | varchar(255) | YES | | NULL | |
| type | | varchar(20) | NO | | NULL | |
| following | | varchar(255) | YES | | NULL | |
@ -48,14 +47,12 @@ Indexes
| baseurl | baseurl(190) |
| sharedinbox | sharedinbox(190) |
| gsid | gsid |
| uri-id | UNIQUE, uri-id |
Foreign Keys
------------
| Field | Target Table | Target Field |
|-------|--------------|--------------|
| uri-id | [item-uri](help/database/db_item-uri) | id |
| gsid | [gserver](help/database/db_gserver) | id |
Return to [database documentation](help/database)

View file

@ -6,90 +6,89 @@ contact table
Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| ------------------------- | ------------------------------------------------------------ | ------------------ | ---- | --- | ------------------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| uid | Owner User id | mediumint unsigned | NO | | 0 | |
| created | | datetime | NO | | 0001-01-01 00:00:00 | |
| updated | Date of last contact update | datetime | YES | | 0001-01-01 00:00:00 | |
| self | 1 if the contact is the user him/her self | boolean | NO | | 0 | |
| remote_self | | boolean | NO | | 0 | |
| rel | The kind of the relation between the user and the contact | tinyint unsigned | NO | | 0 | |
| duplex | | boolean | NO | | 0 | |
| network | Network of the contact | char(4) | NO | | | |
| protocol | Protocol of the contact | char(4) | NO | | | |
| name | Name that this contact is known by | varchar(255) | NO | | | |
| nick | Nick- and user name of the contact | varchar(255) | NO | | | |
| location | | varchar(255) | YES | | | |
| about | | text | YES | | NULL | |
| keywords | public keywords (interests) of the contact | text | YES | | NULL | |
| gender | Deprecated | varchar(32) | NO | | | |
| xmpp | | varchar(255) | NO | | | |
| attag | | varchar(255) | NO | | | |
| avatar | | varchar(255) | NO | | | |
| photo | Link to the profile photo of the contact | varchar(255) | YES | | | |
| thumb | Link to the profile photo (thumb size) | varchar(255) | YES | | | |
| micro | Link to the profile photo (micro size) | varchar(255) | YES | | | |
| header | Header picture | varchar(255) | YES | | NULL | |
| site-pubkey | | text | YES | | NULL | |
| issued-id | | varchar(255) | NO | | | |
| dfrn-id | | varchar(255) | NO | | | |
| url | | varchar(255) | NO | | | |
| nurl | | varchar(255) | NO | | | |
| uri-id | Id of the item-uri table entry that contains the contact url | int unsigned | YES | | NULL | |
| addr | | varchar(255) | NO | | | |
| alias | | varchar(255) | NO | | | |
| pubkey | RSA public key 4096 bit | text | YES | | NULL | |
| prvkey | RSA private key 4096 bit | text | YES | | NULL | |
| batch | | varchar(255) | NO | | | |
| request | | varchar(255) | YES | | NULL | |
| notify | | varchar(255) | YES | | NULL | |
| poll | | varchar(255) | YES | | NULL | |
| confirm | | varchar(255) | YES | | NULL | |
| subscribe | | varchar(255) | YES | | NULL | |
| poco | | varchar(255) | YES | | NULL | |
| aes_allow | | boolean | NO | | 0 | |
| ret-aes | | boolean | NO | | 0 | |
| usehub | | boolean | NO | | 0 | |
| subhub | | boolean | NO | | 0 | |
| hub-verify | | varchar(255) | NO | | | |
| last-update | Date of the last try to update the contact info | datetime | NO | | 0001-01-01 00:00:00 | |
| success_update | Date of the last successful contact update | datetime | NO | | 0001-01-01 00:00:00 | |
| failure_update | Date of the last failed update | datetime | NO | | 0001-01-01 00:00:00 | |
| failed | Connection failed | boolean | YES | | NULL | |
| name-date | | datetime | NO | | 0001-01-01 00:00:00 | |
| uri-date | | datetime | NO | | 0001-01-01 00:00:00 | |
| avatar-date | | datetime | NO | | 0001-01-01 00:00:00 | |
| term-date | | datetime | NO | | 0001-01-01 00:00:00 | |
| last-item | date of the last post | datetime | NO | | 0001-01-01 00:00:00 | |
| last-discovery | date of the last follower discovery | datetime | NO | | 0001-01-01 00:00:00 | |
| priority | | tinyint unsigned | NO | | 0 | |
| blocked | Node-wide block status | boolean | NO | | 1 | |
| block_reason | Node-wide block reason | text | YES | | NULL | |
| readonly | posts of the contact are readonly | boolean | NO | | 0 | |
| writable | | boolean | NO | | 0 | |
| forum | contact is a forum | boolean | NO | | 0 | |
| prv | contact is a private group | boolean | NO | | 0 | |
| contact-type | | tinyint | NO | | 0 | |
| manually-approve | | boolean | YES | | NULL | |
| hidden | | boolean | NO | | 0 | |
| archive | | boolean | NO | | 0 | |
| pending | | boolean | NO | | 1 | |
| deleted | Contact has been deleted | boolean | NO | | 0 | |
| rating | | tinyint | NO | | 0 | |
| unsearchable | Contact prefers to not be searchable | boolean | NO | | 0 | |
| sensitive | Contact posts sensitive content | boolean | NO | | 0 | |
| baseurl | baseurl of the contact | varchar(255) | YES | | | |
| gsid | Global Server ID | int unsigned | YES | | NULL | |
| reason | | text | YES | | NULL | |
| closeness | | tinyint unsigned | NO | | 99 | |
| info | | mediumtext | YES | | NULL | |
| profile-id | Deprecated | int unsigned | YES | | NULL | |
| bdyear | | varchar(4) | NO | | | |
| bd | | date | NO | | 0001-01-01 | |
| notify_new_posts | | boolean | NO | | 0 | |
| fetch_further_information | | tinyint unsigned | NO | | 0 | |
| ffi_keyword_denylist | | text | YES | | NULL | |
| Field | Description | Type | Null | Key | Default | Extra |
| ------------------------- | --------------------------------------------------------- | ------------------ | ---- | --- | ------------------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| uid | Owner User id | mediumint unsigned | NO | | 0 | |
| created | | datetime | NO | | 0001-01-01 00:00:00 | |
| updated | Date of last contact update | datetime | YES | | 0001-01-01 00:00:00 | |
| self | 1 if the contact is the user him/her self | boolean | NO | | 0 | |
| remote_self | | boolean | NO | | 0 | |
| rel | The kind of the relation between the user and the contact | tinyint unsigned | NO | | 0 | |
| duplex | | boolean | NO | | 0 | |
| network | Network of the contact | char(4) | NO | | | |
| protocol | Protocol of the contact | char(4) | NO | | | |
| name | Name that this contact is known by | varchar(255) | NO | | | |
| nick | Nick- and user name of the contact | varchar(255) | NO | | | |
| location | | varchar(255) | YES | | | |
| about | | text | YES | | NULL | |
| keywords | public keywords (interests) of the contact | text | YES | | NULL | |
| gender | Deprecated | varchar(32) | NO | | | |
| xmpp | | varchar(255) | NO | | | |
| attag | | varchar(255) | NO | | | |
| avatar | | varchar(255) | NO | | | |
| photo | Link to the profile photo of the contact | varchar(255) | YES | | | |
| thumb | Link to the profile photo (thumb size) | varchar(255) | YES | | | |
| micro | Link to the profile photo (micro size) | varchar(255) | YES | | | |
| header | Header picture | varchar(255) | YES | | NULL | |
| site-pubkey | | text | YES | | NULL | |
| issued-id | | varchar(255) | NO | | | |
| dfrn-id | | varchar(255) | NO | | | |
| url | | varchar(255) | NO | | | |
| nurl | | varchar(255) | NO | | | |
| addr | | varchar(255) | NO | | | |
| alias | | varchar(255) | NO | | | |
| pubkey | RSA public key 4096 bit | text | YES | | NULL | |
| prvkey | RSA private key 4096 bit | text | YES | | NULL | |
| batch | | varchar(255) | NO | | | |
| request | | varchar(255) | YES | | NULL | |
| notify | | varchar(255) | YES | | NULL | |
| poll | | varchar(255) | YES | | NULL | |
| confirm | | varchar(255) | YES | | NULL | |
| subscribe | | varchar(255) | YES | | NULL | |
| poco | | varchar(255) | YES | | NULL | |
| aes_allow | | boolean | NO | | 0 | |
| ret-aes | | boolean | NO | | 0 | |
| usehub | | boolean | NO | | 0 | |
| subhub | | boolean | NO | | 0 | |
| hub-verify | | varchar(255) | NO | | | |
| last-update | Date of the last try to update the contact info | datetime | NO | | 0001-01-01 00:00:00 | |
| success_update | Date of the last successful contact update | datetime | NO | | 0001-01-01 00:00:00 | |
| failure_update | Date of the last failed update | datetime | NO | | 0001-01-01 00:00:00 | |
| failed | Connection failed | boolean | YES | | NULL | |
| name-date | | datetime | NO | | 0001-01-01 00:00:00 | |
| uri-date | | datetime | NO | | 0001-01-01 00:00:00 | |
| avatar-date | | datetime | NO | | 0001-01-01 00:00:00 | |
| term-date | | datetime | NO | | 0001-01-01 00:00:00 | |
| last-item | date of the last post | datetime | NO | | 0001-01-01 00:00:00 | |
| last-discovery | date of the last follower discovery | datetime | NO | | 0001-01-01 00:00:00 | |
| priority | | tinyint unsigned | NO | | 0 | |
| blocked | Node-wide block status | boolean | NO | | 1 | |
| block_reason | Node-wide block reason | text | YES | | NULL | |
| readonly | posts of the contact are readonly | boolean | NO | | 0 | |
| writable | | boolean | NO | | 0 | |
| forum | contact is a forum | boolean | NO | | 0 | |
| prv | contact is a private group | boolean | NO | | 0 | |
| contact-type | | tinyint | NO | | 0 | |
| manually-approve | | boolean | YES | | NULL | |
| hidden | | boolean | NO | | 0 | |
| archive | | boolean | NO | | 0 | |
| pending | | boolean | NO | | 1 | |
| deleted | Contact has been deleted | boolean | NO | | 0 | |
| rating | | tinyint | NO | | 0 | |
| unsearchable | Contact prefers to not be searchable | boolean | NO | | 0 | |
| sensitive | Contact posts sensitive content | boolean | NO | | 0 | |
| baseurl | baseurl of the contact | varchar(255) | YES | | | |
| gsid | Global Server ID | int unsigned | YES | | NULL | |
| reason | | text | YES | | NULL | |
| closeness | | tinyint unsigned | NO | | 99 | |
| info | | mediumtext | YES | | NULL | |
| profile-id | Deprecated | int unsigned | YES | | NULL | |
| bdyear | | varchar(4) | NO | | | |
| bd | | date | NO | | 0001-01-01 | |
| notify_new_posts | | boolean | NO | | 0 | |
| fetch_further_information | | tinyint unsigned | NO | | 0 | |
| ffi_keyword_denylist | | text | YES | | NULL | |
Indexes
------------
@ -119,7 +118,6 @@ Indexes
| uid_self_contact-type | uid, self, contact-type |
| self_network_uid | self, network, uid |
| gsid | gsid |
| uri-id | uri-id |
Foreign Keys
------------
@ -127,7 +125,6 @@ Foreign Keys
| Field | Target Table | Target Field |
|-------|--------------|--------------|
| uid | [user](help/database/db_user) | uid |
| uri-id | [item-uri](help/database/db_item-uri) | id |
| gsid | [gserver](help/database/db_gserver) | id |
Return to [database documentation](help/database)

View file

@ -6,29 +6,28 @@ Events
Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| --------- | ---------------------------------------------------------- | ------------------ | ---- | --- | ------------------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| guid | | varchar(255) | NO | | | |
| uid | Owner User id | mediumint unsigned | NO | | 0 | |
| cid | contact_id (ID of the contact in contact table) | int unsigned | NO | | 0 | |
| uri | | varchar(255) | NO | | | |
| uri-id | Id of the item-uri table entry that contains the event uri | int unsigned | YES | | NULL | |
| created | creation time | datetime | NO | | 0001-01-01 00:00:00 | |
| edited | last edit time | datetime | NO | | 0001-01-01 00:00:00 | |
| start | event start time | datetime | NO | | 0001-01-01 00:00:00 | |
| finish | event end time | datetime | NO | | 0001-01-01 00:00:00 | |
| summary | short description or title of the event | text | YES | | NULL | |
| desc | event description | text | YES | | NULL | |
| location | event location | text | YES | | NULL | |
| type | event or birthday | varchar(20) | NO | | | |
| nofinish | if event does have no end this is 1 | boolean | NO | | 0 | |
| adjust | adjust to timezone of the recipient (0 or 1) | boolean | NO | | 1 | |
| ignore | 0 or 1 | boolean | NO | | 0 | |
| allow_cid | Access Control - list of allowed contact.id '<19><78>' | mediumtext | YES | | NULL | |
| allow_gid | Access Control - list of allowed groups | mediumtext | YES | | NULL | |
| deny_cid | Access Control - list of denied contact.id | mediumtext | YES | | NULL | |
| deny_gid | Access Control - list of denied groups | mediumtext | YES | | NULL | |
| Field | Description | Type | Null | Key | Default | Extra |
| --------- | ------------------------------------------------------ | ------------------ | ---- | --- | ------------------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| guid | | varchar(255) | NO | | | |
| uid | Owner User id | mediumint unsigned | NO | | 0 | |
| cid | contact_id (ID of the contact in contact table) | int unsigned | NO | | 0 | |
| uri | | varchar(255) | NO | | | |
| created | creation time | datetime | NO | | 0001-01-01 00:00:00 | |
| edited | last edit time | datetime | NO | | 0001-01-01 00:00:00 | |
| start | event start time | datetime | NO | | 0001-01-01 00:00:00 | |
| finish | event end time | datetime | NO | | 0001-01-01 00:00:00 | |
| summary | short description or title of the event | text | YES | | NULL | |
| desc | event description | text | YES | | NULL | |
| location | event location | text | YES | | NULL | |
| type | event or birthday | varchar(20) | NO | | | |
| nofinish | if event does have no end this is 1 | boolean | NO | | 0 | |
| adjust | adjust to timezone of the recipient (0 or 1) | boolean | NO | | 1 | |
| ignore | 0 or 1 | boolean | NO | | 0 | |
| allow_cid | Access Control - list of allowed contact.id '<19><78>' | mediumtext | YES | | NULL | |
| allow_gid | Access Control - list of allowed groups | mediumtext | YES | | NULL | |
| deny_cid | Access Control - list of denied contact.id | mediumtext | YES | | NULL | |
| deny_gid | Access Control - list of denied groups | mediumtext | YES | | NULL | |
Indexes
------------
@ -38,7 +37,6 @@ Indexes
| PRIMARY | id |
| uid_start | uid, start |
| cid | cid |
| uri-id | uri-id |
Foreign Keys
------------
@ -47,6 +45,5 @@ Foreign Keys
|-------|--------------|--------------|
| uid | [user](help/database/db_user) | uid |
| cid | [contact](help/database/db_contact) | id |
| uri-id | [item-uri](help/database/db_item-uri) | id |
Return to [database documentation](help/database)

View file

@ -6,26 +6,25 @@ Diaspora compatible contacts - used in the Diaspora implementation
Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| -------- | ------------------------------------------------------------- | ---------------- | ---- | --- | ------------------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| guid | unique id | varchar(255) | NO | | | |
| url | | varchar(255) | NO | | | |
| uri-id | Id of the item-uri table entry that contains the fcontact url | int unsigned | YES | | NULL | |
| name | | varchar(255) | NO | | | |
| photo | | varchar(255) | NO | | | |
| request | | varchar(255) | NO | | | |
| nick | | varchar(255) | NO | | | |
| addr | | varchar(255) | NO | | | |
| batch | | varchar(255) | NO | | | |
| notify | | varchar(255) | NO | | | |
| poll | | varchar(255) | NO | | | |
| confirm | | varchar(255) | NO | | | |
| priority | | tinyint unsigned | NO | | 0 | |
| network | | char(4) | NO | | | |
| alias | | varchar(255) | NO | | | |
| pubkey | | text | YES | | NULL | |
| updated | | datetime | NO | | 0001-01-01 00:00:00 | |
| Field | Description | Type | Null | Key | Default | Extra |
| -------- | ------------- | ---------------- | ---- | --- | ------------------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| guid | unique id | varchar(255) | NO | | | |
| url | | varchar(255) | NO | | | |
| name | | varchar(255) | NO | | | |
| photo | | varchar(255) | NO | | | |
| request | | varchar(255) | NO | | | |
| nick | | varchar(255) | NO | | | |
| addr | | varchar(255) | NO | | | |
| batch | | varchar(255) | NO | | | |
| notify | | varchar(255) | NO | | | |
| poll | | varchar(255) | NO | | | |
| confirm | | varchar(255) | NO | | | |
| priority | | tinyint unsigned | NO | | 0 | |
| network | | char(4) | NO | | | |
| alias | | varchar(255) | NO | | | |
| pubkey | | text | YES | | NULL | |
| updated | | datetime | NO | | 0001-01-01 00:00:00 | |
Indexes
------------
@ -35,13 +34,6 @@ Indexes
| PRIMARY | id |
| addr | addr(32) |
| url | UNIQUE, url(190) |
| uri-id | UNIQUE, uri-id |
Foreign Keys
------------
| Field | Target Table | Target Field |
|-------|--------------|--------------|
| uri-id | [item-uri](help/database/db_item-uri) | id |
Return to [database documentation](help/database)

View file

@ -1,31 +0,0 @@
Table post-link
===========
Post related external links
Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| -------- | --------------------------------------------------------- | -------------- | ---- | --- | ------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | | NULL | |
| url | External URL | varbinary(511) | NO | | NULL | |
| mimetype | | varchar(60) | YES | | NULL | |
Indexes
------------
| Name | Fields |
| ---------- | ------------------- |
| PRIMARY | id |
| uri-id-url | UNIQUE, uri-id, url |
Foreign Keys
------------
| Field | Target Table | Target Field |
|-------|--------------|--------------|
| uri-id | [item-uri](help/database/db_item-uri) | id |
Return to [database documentation](help/database)

View file

@ -35,24 +35,23 @@ Fields
Indexes
------------
| Name | Fields |
| ----------------- | ------------------- |
| PRIMARY | uid, uri-id |
| uri-id | uri-id |
| owner-id | owner-id |
| author-id | author-id |
| causer-id | causer-id |
| uid | uid |
| contact-id | contact-id |
| psid | psid |
| post-user-id | post-user-id |
| commented | commented |
| uid_received | uid, received |
| uid_wall_received | uid, wall, received |
| uid_pinned | uid, pinned |
| uid_commented | uid, commented |
| uid_starred | uid, starred |
| uid_mention | uid, mention |
| Name | Fields |
| ------------- | -------------- |
| PRIMARY | uid, uri-id |
| uri-id | uri-id |
| owner-id | owner-id |
| author-id | author-id |
| causer-id | causer-id |
| uid | uid |
| contact-id | contact-id |
| psid | psid |
| post-user-id | post-user-id |
| commented | commented |
| uid_received | uid, received |
| uid_pinned | uid, pinned |
| uid_commented | uid, commented |
| uid_starred | uid, starred |
| uid_mention | uid, mention |
Foreign Keys
------------

BIN
friendicaCCfleur-128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

2182
friendica_test_data.sql Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

BIN
images/login_image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
images/login_video.mp4 Normal file

Binary file not shown.

View file

@ -64,6 +64,7 @@ use Friendica\Security\OAuth1\OAuthUtil;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Images;
use Friendica\Util\Network;
use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Util\Strings;
use Friendica\Util\XML;
@ -2525,12 +2526,12 @@ function api_format_messages($item, $recipient, $sender)
if (!empty($_GET['getText'])) {
$ret['title'] = $item['title'];
if ($_GET['getText'] == 'html') {
$ret['text'] = BBCode::convertForUriId($item['uri-id'], $item['body'], BBCode::API);
$ret['text'] = BBCode::convert($item['body'], false);
} elseif ($_GET['getText'] == 'plain') {
$ret['text'] = trim(HTML::toPlaintext(BBCode::convertForUriId($item['uri-id'], api_clean_plain_items($item['body']), BBCode::API), 0));
$ret['text'] = trim(HTML::toPlaintext(BBCode::convert(api_clean_plain_items($item['body']), false, BBCode::API, true), 0));
}
} else {
$ret['text'] = $item['title'] . "\n" . HTML::toPlaintext(BBCode::convertForUriId($item['uri-id'], api_clean_plain_items($item['body']), BBCode::API), 0);
$ret['text'] = $item['title'] . "\n" . HTML::toPlaintext(BBCode::convert(api_clean_plain_items($item['body']), false, BBCode::API, true), 0);
}
if (!empty($_GET['getUserObjects']) && $_GET['getUserObjects'] == 'false') {
unset($ret['sender']);
@ -2551,13 +2552,13 @@ function api_convert_item($item)
{
$body = api_add_attachments_to_body($item);
$entities = api_get_entitities($statustext, $body, $item['uri-id']);
$entities = api_get_entitities($statustext, $body);
// Add pictures to the attachment array and remove them from the body
$attachments = api_get_attachments($body, $item['uri-id']);
$attachments = api_get_attachments($body);
// Workaround for ostatus messages where the title is identically to the body
$html = BBCode::convertForUriId($item['uri-id'], api_clean_plain_items($body), BBCode::API);
$html = BBCode::convert(api_clean_plain_items($body), false, BBCode::API, true);
$statusbody = trim(HTML::toPlaintext($html, 0));
// handle data: images
@ -2575,7 +2576,7 @@ function api_convert_item($item)
$statustext = mb_substr($statustext, 0, 1000) . "... \n" . ($item['plink'] ?? '');
}
$statushtml = BBCode::convertForUriId($item['uri-id'], BBCode::removeAttachment($body), BBCode::API);
$statushtml = BBCode::convert(BBCode::removeAttachment($body), false, BBCode::API, true);
// Workaround for clients with limited HTML parser functionality
$search = ["<br>", "<blockquote>", "</blockquote>",
@ -2589,7 +2590,7 @@ function api_convert_item($item)
$statushtml = str_replace($search, $replace, $statushtml);
if ($item['title'] != "") {
$statushtml = "<br><h4>" . BBCode::convertForUriId($item['uri-id'], $item['title']) . "</h4><br>" . $statushtml;
$statushtml = "<br><h4>" . BBCode::convert($item['title']) . "</h4><br>" . $statushtml;
}
do {
@ -2607,7 +2608,7 @@ function api_convert_item($item)
// feeds without body should contain the link
if ((($item['network'] ?? Protocol::PHANTOM) == Protocol::FEED) && (strlen($item['body']) == 0)) {
$statushtml .= BBCode::convertForUriId($item['uri-id'], $item['plink']);
$statushtml .= BBCode::convert($item['plink']);
}
return [
@ -2649,12 +2650,11 @@ function api_add_attachments_to_body(array $item)
/**
*
* @param string $body
* @param int $uriid
*
* @return array
* @throws InternalServerErrorException
*/
function api_get_attachments(&$body, $uriid)
function api_get_attachments(&$body)
{
$body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
$body = preg_replace("/\[img\=(.*?)\](.*?)\[\/img\]/ism", '[img]$1[/img]', $body);
@ -2675,7 +2675,11 @@ function api_get_attachments(&$body, $uriid)
$imagedata = Images::getInfoFromURLCached($image);
if ($imagedata) {
$attachments[] = ["url" => Post\Link::getByLink($uriid, $image), "mimetype" => $imagedata["mime"], "size" => $imagedata["size"]];
if (DI::config()->get("system", "proxy_disabled")) {
$attachments[] = ["url" => $image, "mimetype" => $imagedata["mime"], "size" => $imagedata["size"]];
} else {
$attachments[] = ["url" => ProxyUtils::proxifyUrl($image, false), "mimetype" => $imagedata["mime"], "size" => $imagedata["size"]];
}
}
}
@ -2691,7 +2695,7 @@ function api_get_attachments(&$body, $uriid)
* @throws InternalServerErrorException
* @todo Links at the first character of the post
*/
function api_get_entitities(&$text, $bbcode, $uriid)
function api_get_entitities(&$text, $bbcode)
{
$include_entities = strtolower($_REQUEST['include_entities'] ?? 'false');
@ -2699,7 +2703,7 @@ function api_get_entitities(&$text, $bbcode, $uriid)
preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images);
foreach ($images[1] as $image) {
$replace = Post\Link::getByLink($uriid, $image);
$replace = ProxyUtils::proxifyUrl($image, false);
$text = str_replace($image, $replace, $text);
}
return [];
@ -2811,8 +2815,31 @@ function api_get_entitities(&$text, $bbcode, $uriid)
if (!($start === false)) {
$image = Images::getInfoFromURLCached($url);
if ($image) {
$media_url = Post\Link::getByLink($uriid, $url);
$sizes["medium"] = ["w" => $image[0], "h" => $image[1], "resize" => "fit"];
// If image cache is activated, then use the following sizes:
// thumb (150), small (340), medium (600) and large (1024)
if (!DI::config()->get("system", "proxy_disabled")) {
$media_url = ProxyUtils::proxifyUrl($url, false);
$sizes = [];
$scale = Images::getScalingDimensions($image[0], $image[1], 150);
$sizes["thumb"] = ["w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"];
if (($image[0] > 150) || ($image[1] > 150)) {
$scale = Images::getScalingDimensions($image[0], $image[1], 340);
$sizes["small"] = ["w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"];
}
$scale = Images::getScalingDimensions($image[0], $image[1], 600);
$sizes["medium"] = ["w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"];
if (($image[0] > 600) || ($image[1] > 600)) {
$scale = Images::getScalingDimensions($image[0], $image[1], 1024);
$sizes["large"] = ["w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"];
}
} else {
$media_url = $url;
$sizes["medium"] = ["w" => $image[0], "h" => $image[1], "resize" => "fit"];
}
$entities["media"][] = [
"id" => $start+1,
@ -3054,7 +3081,7 @@ function api_format_item($item, $type = "json", $status_user = null, $author_use
'external_url' => DI::baseUrl() . "/display/" . $item['guid'],
'friendica_activities' => api_format_items_activities($item, $type),
'friendica_title' => $item['title'],
'friendica_html' => BBCode::convertForUriId($item['uri-id'], $item['body'], BBCode::EXTERNAL)
'friendica_html' => BBCode::convert($item['body'], false)
];
if (count($converted["attachments"]) > 0) {

View file

@ -47,6 +47,91 @@ use Friendica\Util\Strings;
use Friendica\Util\Temporal;
use Friendica\Util\XML;
function item_extract_images($body) {
$saved_image = [];
$orig_body = $body;
$new_body = '';
$cnt = 0;
$img_start = strpos($orig_body, '[img');
$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
while (($img_st_close !== false) && ($img_end !== false)) {
$img_st_close++; // make it point to AFTER the closing bracket
$img_end += $img_start;
if (!strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) {
// This is an embedded image
$saved_image[$cnt] = substr($orig_body, $img_start + $img_st_close, $img_end - ($img_start + $img_st_close));
$new_body = $new_body . substr($orig_body, 0, $img_start) . '[!#saved_image' . $cnt . '#!]';
$cnt++;
} else {
$new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]'));
}
$orig_body = substr($orig_body, $img_end + strlen('[/img]'));
if ($orig_body === false) {
// in case the body ends on a closing image tag
$orig_body = '';
}
$img_start = strpos($orig_body, '[img');
$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
}
$new_body = $new_body . $orig_body;
return ['body' => $new_body, 'images' => $saved_image];
}
function item_redir_and_replace_images($body, $images, $cid) {
$origbody = $body;
$newbody = '';
$cnt = 1;
$pos = BBCode::getTagPosition($origbody, 'url', 0);
while ($pos !== false && $cnt < 1000) {
$search = '/\[url\=(.*?)\]\[!#saved_image([0-9]*)#!\]\[\/url\]' . '/is';
$replace = '[url=' . DI::baseUrl() . '/redir/' . $cid
. '?url=' . '$1' . '][!#saved_image' . '$2' .'#!][/url]';
$newbody .= substr($origbody, 0, $pos['start']['open']);
$subject = substr($origbody, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
$origbody = substr($origbody, $pos['end']['close']);
if ($origbody === false) {
$origbody = '';
}
$subject = preg_replace($search, $replace, $subject);
$newbody .= $subject;
$cnt++;
// Isn't this supposed to use $cnt value for $occurrences? - @MrPetovan
$pos = BBCode::getTagPosition($origbody, 'url', 0);
}
$newbody .= $origbody;
$cnt = 0;
foreach ($images as $image) {
/*
* We're depending on the property of 'foreach' (specified on the PHP website) that
* it loops over the array starting from the first element and going sequentially
* to the last element.
*/
$newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody);
$cnt++;
}
return $newbody;
}
/**
* Render actions localized
*
@ -56,6 +141,11 @@ use Friendica\Util\XML;
*/
function localize_item(&$item)
{
$extracted = item_extract_images($item['body']);
if ($extracted['images']) {
$item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
}
/// @todo The following functionality needs to be cleaned up.
if (!empty($item['verb'])) {
$activity = DI::activity();
@ -170,6 +260,13 @@ function localize_item(&$item)
}
}
// add zrl's to public images
$photo_pattern = "/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is";
if (preg_match($photo_pattern, $item['body'])) {
$photo_replace = '[url=' . Profile::zrl('$1' . '/photos/' . '$2' . '/image/' . '$3' , true) . '][img' . '$4' . ']h' . '$5' . '[/img][/url]';
$item['body'] = BBCode::pregReplaceInTag($photo_pattern, $photo_replace, 'url', $item['body']);
}
// add sparkle links to appropriate permalinks
// Only create a redirection to a magic link when logged in
if (!empty($item['plink']) && Session::isAuthenticated()) {

View file

@ -474,7 +474,7 @@ function notification($params)
if ($show_in_notification_page) {
$fields = [
'name' => $params['source_name'] ?? '',
'name_cache' => substr(strip_tags(BBCode::convertForUriId($uri_id, $params['source_name'])), 0, 255),
'name_cache' => substr(strip_tags(BBCode::convert($params['source_name'])), 0, 255),
'url' => $params['source_link'] ?? '',
'photo' => $params['source_photo'] ?? '',
'link' => $itemlink ?? '',

View file

@ -334,8 +334,8 @@ function display_content(App $a, $update = false, $update_uid = 0)
$o .= conversation($a, [$item], 'display', $update_uid, false, 'commented', $item_uid);
// Preparing the meta header
$description = trim(BBCode::toPlaintext($item["body"]));
$title = trim(BBCode::toPlaintext($item["title"]));
$description = trim(HTML::toPlaintext(BBCode::convert($item["body"], false), 0, true));
$title = trim(HTML::toPlaintext(BBCode::convert($item["title"], false), 0, true));
$author_name = $item["author-name"];
$image = DI::baseUrl()->remove($item["author-avatar"]);

View file

@ -314,13 +314,18 @@ function message_content(App $a)
$sparkle = ' sparkle';
}
$extracted = item_extract_images($message['body']);
if ($extracted['images']) {
$message['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $message['contact-id']);
}
$from_name_e = $message['from-name'];
$subject_e = $message['title'];
$body_e = BBCode::convertForUriId($message['uri-id'], $message['body']);
$body_e = BBCode::convert($message['body']);
$to_name_e = $message['name'];
$contact = Contact::getByURL($message['from-url'], false, ['thumb', 'addr', 'id', 'avatar']);
$from_photo = Contact::getThumb($contact);
$from_photo = Contact::getThumb($contact, $message['from-photo']);
$mails[] = [
'id' => $message['id'],
@ -452,7 +457,7 @@ function render_messages(array $msg, $t)
}
$contact = Contact::getByURL($rr['url'], false, ['thumb', 'addr', 'id', 'avatar']);
$from_photo = Contact::getThumb($contact);
$from_photo = Contact::getThumb($contact, $rr['thumb'] ?: $rr['from-photo']);
$rslt .= Renderer::replaceMacros($tpl, [
'$id' => $rr['id'],

View file

@ -37,7 +37,6 @@ use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\Event;
use Friendica\Model\Photo;
use Friendica\Model\Post;
use Friendica\Model\Tag;
use Friendica\Object\Image;
use Friendica\Protocol\Activity;
@ -252,7 +251,7 @@ class BBCode
$post = self::getAttachmentData($body);
// Get all linked images with alternative image description
if (preg_match_all("/\[img=(http[^\[\]]*)\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
if (preg_match_all("/\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) {
if (Photo::isLocal($picture[1])) {
$post['images'][] = ['url' => str_replace('-1.', '-0.', $picture[1]), 'description' => $picture[2]];
@ -434,27 +433,18 @@ class BBCode
*/
public static function toPlaintext($text, $keep_urls = true)
{
// Remove pictures in advance to avoid unneeded proxy calls
$text = preg_replace("/\[img\=(.*?)\](.*?)\[\/img\]/ism", ' $2 ', $text);
$text = preg_replace("/\[img.*?\[\/img\]/ism", ' ', $text);
// Remove attachment
$text = self::removeAttachment($text);
$naked_text = HTML::toPlaintext(self::convert($text, false, 0, true), 0, !$keep_urls);
return $naked_text;
}
private static function proxyUrl($image, $simplehtml = self::INTERNAL, $uriid = 0, $size = '')
private static function proxyUrl($image, $simplehtml = self::INTERNAL)
{
// Only send proxied pictures to API and for internal display
if (!in_array($simplehtml, [self::INTERNAL, self::API])) {
return $image;
} elseif ($uriid) {
return Post\Link::getByLink($uriid, $image, $size);
if (in_array($simplehtml, [self::INTERNAL, self::API])) {
return ProxyUtils::proxifyUrl($image);
} else {
return ProxyUtils::proxifyUrl($image, $size);
return $image;
}
}
@ -618,11 +608,10 @@ class BBCode
* @param integer $simplehtml
* @param bool $tryoembed
* @param array $data
* @param int $uriid
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function convertAttachment($text, $simplehtml = self::INTERNAL, $tryoembed = true, array $data = [], $uriid = 0)
public static function convertAttachment($text, $simplehtml = self::INTERNAL, $tryoembed = true, array $data = [])
{
$data = $data ?: self::getAttachmentData($text);
if (empty($data) || empty($data['url'])) {
@ -659,12 +648,12 @@ class BBCode
if (!empty($data['title']) && !empty($data['url'])) {
if (!empty($data['image']) && empty($data['text']) && ($data['type'] == 'photo')) {
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-image" /></a>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-image" /></a>', $data['url'], self::proxyUrl($data['image'], $simplehtml), $data['title']);
} else {
if (!empty($data['image'])) {
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br>', $data['url'], self::proxyUrl($data['image'], $simplehtml), $data['title']);
} elseif (!empty($data['preview'])) {
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br>', $data['url'], self::proxyUrl($data['preview'], $simplehtml, $uriid), $data['title']);
$return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br>', $data['url'], self::proxyUrl($data['preview'], $simplehtml), $data['title']);
}
$return .= sprintf('<h4><a href="%s">%s</a></h4>', $data['url'], $data['title']);
}
@ -940,7 +929,7 @@ class BBCode
return ['body' => $new_body, 'images' => $saved_image];
}
private static function interpolateSavedImagesIntoItemBody($uriid, $body, array $images)
private static function interpolateSavedImagesIntoItemBody($body, array $images)
{
$newbody = $body;
@ -950,7 +939,7 @@ class BBCode
// it loops over the array starting from the first element and going sequentially
// to the last element
$newbody = str_replace('[$#saved_image' . $cnt . '#$]',
'<img src="' . self::proxyUrl($image, self::INTERNAL, $uriid) . '" alt="' . DI::l10n()->t('Image/photo') . '" />', $newbody);
'<img src="' . self::proxyUrl($image) . '" alt="' . DI::l10n()->t('Image/photo') . '" />', $newbody);
$cnt++;
}
@ -965,7 +954,7 @@ class BBCode
public static function fetchShareAttributes($text)
{
// See Issue https://github.com/friendica/friendica/issues/10454
// Hashtags in usernames are expanded to links. This here is a quick fix.
// Hashtags in usernames are expanded to links. This here is a quick fix.
$text = preg_replace('/([@!#])\[url\=.*?\](.*?)\[\/url\]/ism', '$1$2', $text);
$attributes = [];
@ -1000,11 +989,11 @@ class BBCode
* @param callable $callback
* @return string The BBCode string with all [share] blocks replaced
*/
public static function convertShare($text, callable $callback, int $uriid = 0)
public static function convertShare($text, callable $callback)
{
$return = preg_replace_callback(
"/(.*?)\[share(.*?)\](.*)\[\/share\]/ism",
function ($match) use ($callback, $uriid) {
function ($match) use ($callback) {
$attribute_string = $match[2];
$attributes = [];
foreach (['author', 'profile', 'avatar', 'link', 'posted', 'guid'] as $field) {
@ -1023,7 +1012,7 @@ class BBCode
if (!empty($author_contact['id'])) {
$attributes['avatar'] = Contact::getAvatarUrlForId($author_contact['id'], ProxyUtils::SIZE_THUMB);
} elseif ($attributes['avatar']) {
$attributes['avatar'] = self::proxyUrl($attributes['avatar'], self::INTERNAL, $uriid, ProxyUtils::SIZE_THUMB);
$attributes['avatar'] = ProxyUtils::proxifyUrl($attributes['avatar'], false, ProxyUtils::SIZE_THUMB);
}
$content = preg_replace(Strings::autoLinkRegEx(), '<a href="$1">$1</a>', $match[3]);
@ -1263,37 +1252,6 @@ class BBCode
return $bbcode;
}
/**
* Converts a BBCode message for a given URI-ID to a HTML message
*
* BBcode 2 HTML was written by WAY2WEB.net
* extended to work with Mistpark/Friendica - Mike Macgirvin
*
* Simple HTML values meaning:
* - 0: Friendica display
* - 1: Unused
* - 2: Used for Windows Phone push, Friendica API
* - 3: Used before converting to Markdown in bb2diaspora.php
* - 4: Used for WordPress, Libertree (before Markdown), pump.io and tumblr
* - 5: Unused
* - 6: Unused
* - 7: Used for dfrn, OStatus
* - 8: Used for Twitter, WP backlink text setting
* - 9: ActivityPub
*
* @param int $uriid
* @param string $text
* @param int $simple_html
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function convertForUriId(int $uriid = 0, string $text = null, int $simple_html = self::INTERNAL)
{
$try_oembed = ($simple_html == self::INTERNAL);
return self::convert($text, $try_oembed, $simple_html, false, $uriid);
}
/**
* Converts a BBCode message to HTML message
*
@ -1316,11 +1274,10 @@ class BBCode
* @param bool $try_oembed
* @param int $simple_html
* @param bool $for_plaintext
* @param int $uriid
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function convert(string $text = null, $try_oembed = true, $simple_html = self::INTERNAL, $for_plaintext = false, $uriid = 0)
public static function convert(string $text = null, $try_oembed = true, $simple_html = self::INTERNAL, $for_plaintext = false)
{
// Accounting for null default column values
if (is_null($text) || $text === '') {
@ -1331,8 +1288,8 @@ class BBCode
$a = DI::app();
$text = self::performWithEscapedTags($text, ['code'], function ($text) use ($try_oembed, $simple_html, $for_plaintext, $a, $uriid) {
$text = self::performWithEscapedTags($text, ['noparse', 'nobb', 'pre'], function ($text) use ($try_oembed, $simple_html, $for_plaintext, $a, $uriid) {
$text = self::performWithEscapedTags($text, ['code'], function ($text) use ($try_oembed, $simple_html, $for_plaintext, $a) {
$text = self::performWithEscapedTags($text, ['noparse', 'nobb', 'pre'], function ($text) use ($try_oembed, $simple_html, $for_plaintext, $a) {
/*
* preg_match_callback function to replace potential Oembed tags with Oembed content
*
@ -1441,7 +1398,7 @@ class BBCode
} elseif (!in_array($simple_html, [self::INTERNAL, self::EXTERNAL, self::CONNECTORS])) {
$text = self::removeAttachment($text, true);
} else {
$text = self::convertAttachment($text, $simple_html, $try_oembed, [], $uriid);
$text = self::convertAttachment($text, $simple_html, $try_oembed);
}
$nosmile = strpos($text, '[nosmile]') !== false;
@ -1616,12 +1573,12 @@ class BBCode
// [img=widthxheight]image source[/img]
$text = preg_replace_callback(
"/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism",
function ($matches) use ($simple_html, $uriid) {
function ($matches) use ($simple_html) {
if (strpos($matches[3], "data:image/") === 0) {
return $matches[0];
}
$matches[3] = self::proxyUrl($matches[3], $simple_html, $uriid);
$matches[3] = self::proxyUrl($matches[3], $simple_html);
return "[img=" . $matches[1] . "x" . $matches[2] . "]" . $matches[3] . "[/img]";
},
$text
@ -1631,8 +1588,8 @@ class BBCode
$text = preg_replace("/\[zmg\=([0-9]*)x([0-9]*)\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$3" style="width: $1px;" >', $text);
$text = preg_replace_callback("/\[img\=(.*?)\](.*?)\[\/img\]/ism",
function ($matches) use ($simple_html, $uriid) {
$matches[1] = self::proxyUrl($matches[1], $simple_html, $uriid);
function ($matches) use ($simple_html) {
$matches[1] = self::proxyUrl($matches[1], $simple_html);
$matches[2] = htmlspecialchars($matches[2], ENT_COMPAT);
return '<img src="' . $matches[1] . '" alt="' . $matches[2] . '" title="' . $matches[2] . '">';
},
@ -1642,12 +1599,12 @@ class BBCode
// [img]pathtoimage[/img]
$text = preg_replace_callback(
"/\[img\](.*?)\[\/img\]/ism",
function ($matches) use ($simple_html, $uriid) {
function ($matches) use ($simple_html) {
if (strpos($matches[1], "data:image/") === 0) {
return $matches[0];
}
$matches[1] = self::proxyUrl($matches[1], $simple_html, $uriid);
$matches[1] = self::proxyUrl($matches[1], $simple_html);
return "[img]" . $matches[1] . "[/img]";
},
$text
@ -1729,7 +1686,7 @@ class BBCode
// start which is always required). Allow desc with a missing summary for compatibility.
if ((!empty($ev['desc']) || !empty($ev['summary'])) && !empty($ev['start'])) {
$sub = Event::getHTML($ev, $simple_html, $uriid);
$sub = Event::getHTML($ev, $simple_html);
$text = preg_replace("/\[event\-summary\](.*?)\[\/event\-summary\]/ism", '', $text);
$text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/ism", '', $text);
@ -1892,10 +1849,10 @@ class BBCode
$text,
function (array $attributes, array $author_contact, $content, $is_quote_share) use ($simple_html) {
return self::convertShareCallback($attributes, $author_contact, $content, $is_quote_share, $simple_html);
}, $uriid
}
);
$text = self::interpolateSavedImagesIntoItemBody($uriid, $text, $saved_image);
$text = self::interpolateSavedImagesIntoItemBody($text, $saved_image);
return $text;
}); // Escaped noparse, nobb, pre
@ -2169,8 +2126,8 @@ class BBCode
/**
* Expand tags to URLs
*
* @param string $body
* @return string body with expanded tags
* @param string $body
* @return string body with expanded tags
*/
public static function expandTags(string $body)
{

View file

@ -329,6 +329,8 @@ class System
function info($s)
function is_site_admin()
function get_temppath()
function get_cachefile($file, $writemode = true)
function get_itemcachepath()
function get_spoolpath()
*/
}

View file

@ -91,18 +91,6 @@ class PostUpdate
if (!self::update1400()) {
return false;
}
if (!self::update1424()) {
return false;
}
if (!self::update1425()) {
return false;
}
if (!self::update1426()) {
return false;
}
if (!self::update1427()) {
return false;
}
return true;
}
@ -752,7 +740,7 @@ class PostUpdate
Logger::info('Start', ['rest' => DBA::count('photo', $condition)]);
$rows = 0;
$photos = DBA::select('photo', [], $condition, ['limit' => 100]);
$photos = DBA::select('photo', [], $condition, ['limit' => 10000]);
if (DBA::errorNo() != 0) {
Logger::error('Database error', ['no' => DBA::errorNo(), 'message' => DBA::errorMessage()]);
@ -783,7 +771,7 @@ class PostUpdate
}
/**
* update the "external-id" field in the post table
* update the "hash" field in the photo table
*
* @return bool "true" when the job is done
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
@ -828,187 +816,4 @@ class PostUpdate
return false;
}
/**
* update the "uri-id" field in the contact table
*
* @return bool "true" when the job is done
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function update1424()
{
// Was the script completed?
if (DI::config()->get("system", "post_update_version") >= 1424) {
return true;
}
$condition = ["`uri-id` IS NULL"];
Logger::info('Start', ['rest' => DBA::count('contact', $condition)]);
$rows = 0;
$contacts = DBA::select('contact', ['id', 'url'], $condition, ['limit' => 1000]);
if (DBA::errorNo() != 0) {
Logger::error('Database error', ['no' => DBA::errorNo(), 'message' => DBA::errorMessage()]);
return false;
}
while ($contact = DBA::fetch($contacts)) {
DBA::update('contact', ['uri-id' => ItemURI::getIdByURI($contact['url'])], ['id' => $contact['id']]);
++$rows;
}
DBA::close($contacts);
Logger::info('Processed', ['rows' => $rows]);
if ($rows <= 100) {
DI::config()->set("system", "post_update_version", 1424);
Logger::info('Done');
return true;
}
return false;
}
/**
* update the "uri-id" field in the fcontact table
*
* @return bool "true" when the job is done
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function update1425()
{
// Was the script completed?
if (DI::config()->get("system", "post_update_version") >= 1425) {
return true;
}
$condition = ["`uri-id` IS NULL"];
Logger::info('Start', ['rest' => DBA::count('fcontact', $condition)]);
$rows = 0;
$fcontacts = DBA::select('fcontact', ['id', 'url', 'guid'], $condition, ['limit' => 1000]);
if (DBA::errorNo() != 0) {
Logger::error('Database error', ['no' => DBA::errorNo(), 'message' => DBA::errorMessage()]);
return false;
}
while ($fcontact = DBA::fetch($fcontacts)) {
if (!empty($fcontact['guid'])) {
$uriid = ItemURI::insert(['uri' => $fcontact['url'], 'guid' => $fcontact['guid']]);
} else {
$uriid = ItemURI::getIdByURI($fcontact['url']);
}
DBA::update('fcontact', ['uri-id' => $uriid], ['id' => $fcontact['id']]);
++$rows;
}
DBA::close($fcontacts);
Logger::info('Processed', ['rows' => $rows]);
if ($rows <= 100) {
DI::config()->set("system", "post_update_version", 1425);
Logger::info('Done');
return true;
}
return false;
}
/**
* update the "uri-id" field in the apcontact table
*
* @return bool "true" when the job is done
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function update1426()
{
// Was the script completed?
if (DI::config()->get("system", "post_update_version") >= 1426) {
return true;
}
$condition = ["`uri-id` IS NULL"];
Logger::info('Start', ['rest' => DBA::count('apcontact', $condition)]);
$rows = 0;
$apcontacts = DBA::select('apcontact', ['url', 'uuid'], $condition, ['limit' => 1000]);
if (DBA::errorNo() != 0) {
Logger::error('Database error', ['no' => DBA::errorNo(), 'message' => DBA::errorMessage()]);
return false;
}
while ($apcontact = DBA::fetch($apcontacts)) {
if (!empty($apcontact['uuid'])) {
$uriid = ItemURI::insert(['uri' => $apcontact['url'], 'guid' => $apcontact['uuid']]);
} else {
$uriid = ItemURI::getIdByURI($apcontact['url']);
}
DBA::update('apcontact', ['uri-id' => $uriid], ['url' => $apcontact['url']]);
++$rows;
}
DBA::close($apcontacts);
Logger::info('Processed', ['rows' => $rows]);
if ($rows <= 100) {
DI::config()->set("system", "post_update_version", 1426);
Logger::info('Done');
return true;
}
return false;
}
/**
* update the "uri-id" field in the event table
*
* @return bool "true" when the job is done
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function update1427()
{
// Was the script completed?
if (DI::config()->get("system", "post_update_version") >= 1427) {
return true;
}
$condition = ["`uri-id` IS NULL"];
Logger::info('Start', ['rest' => DBA::count('event', $condition)]);
$rows = 0;
$events = DBA::select('event', ['id', 'uri', 'guid'], $condition, ['limit' => 1000]);
if (DBA::errorNo() != 0) {
Logger::error('Database error', ['no' => DBA::errorNo(), 'message' => DBA::errorMessage()]);
return false;
}
while ($event = DBA::fetch($events)) {
if (!empty($event['guid'])) {
$uriid = ItemURI::insert(['uri' => $event['uri'], 'guid' => $event['guid']]);
} else {
$uriid = ItemURI::getIdByURI($event['uri']);
}
DBA::update('event', ['uri-id' => $uriid], ['id' => $event['id']]);
++$rows;
}
DBA::close($events);
Logger::info('Processed', ['rows' => $rows]);
if ($rows <= 100) {
DI::config()->set("system", "post_update_version", 1427);
Logger::info('Done');
return true;
}
return false;
}
}

View file

@ -124,7 +124,7 @@ class APContact
$apcontact = DBA::selectFirst('apcontact', [], ['addr' => $url]);
}
if (DBA::isResult($apcontact) && ($apcontact['updated'] > $ref_update) && !empty($apcontact['pubkey']) && !empty($apcontact['uri-id'])) {
if (DBA::isResult($apcontact) && ($apcontact['updated'] > $ref_update) && !empty($apcontact['pubkey'])) {
return $apcontact;
}
@ -349,12 +349,6 @@ class APContact
$apcontact['alias'] = null;
}
if (empty($apcontact['uuid'])) {
$apcontact['uri-id'] = ItemURI::getIdByURI($apcontact['url']);
} else {
$apcontact['uri-id'] = ItemURI::insert(['uri' => $apcontact['url'], 'guid' => $apcontact['uuid']]);
}
$apcontact['updated'] = DateTimeFormat::utcNow();
// We delete the old entry when the URL is changed

View file

@ -185,8 +185,6 @@ class Contact
$fields['gsid'] = GServer::getID($fields['baseurl'], true);
}
$fields['uri-id'] = ItemURI::getIdByURI($fields['url']);
if (empty($fields['created'])) {
$fields['created'] = DateTimeFormat::utcNow();
}
@ -1072,12 +1070,12 @@ class Contact
return 0;
}
$contact = self::getByURL($url, false, ['id', 'network', 'uri-id'], $uid);
$contact = self::getByURL($url, false, ['id', 'network'], $uid);
if (!empty($contact)) {
$contact_id = $contact["id"];
if (empty($update) && (!empty($contact['uri-id']) || is_bool($update))) {
if (empty($update)) {
Logger::debug('Contact found', ['url' => $url, 'uid' => $uid, 'update' => $update, 'cid' => $contact_id]);
return $contact_id;
}
@ -1499,46 +1497,67 @@ class Contact
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
private static function getAvatarPath(array $contact, string $size, $no_update = false)
private static function getAvatarPath(array $contact, string $field, string $size, string $avatar, $no_update = false)
{
$contact = self::checkAvatarCacheByArray($contact, $no_update);
return self::getAvatarUrlForId($contact['id'], $size, $contact['updated'] ?? '');
if (!empty($contact)) {
$contact = self::checkAvatarCacheByArray($contact, $no_update);
if (!empty($contact['id'])) {
return self::getAvatarUrlForId($contact['id'], $size, $contact['updated'] ?? '');
} elseif (!empty($contact[$field])) {
return $contact[$field];
} elseif (!empty($contact['avatar'])) {
$avatar = $contact['avatar'];
}
}
if (empty($avatar)) {
$avatar = self::getDefaultAvatar([], $size);
}
if (Proxy::isLocalImage($avatar)) {
return $avatar;
} else {
return Proxy::proxifyUrl($avatar, false, $size);
}
}
/**
* Return the photo path for a given contact array
*
* @param array $contact Contact array
* @param string $avatar Avatar path that is displayed when no photo had been found
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
public static function getPhoto(array $contact, bool $no_update = false)
public static function getPhoto(array $contact, string $avatar = '', bool $no_update = false)
{
return self::getAvatarPath($contact, Proxy::SIZE_SMALL, $no_update);
return self::getAvatarPath($contact, 'photo', Proxy::SIZE_SMALL, $avatar, $no_update);
}
/**
* Return the photo path (thumb size) for a given contact array
*
* @param array $contact Contact array
* @param string $avatar Avatar path that is displayed when no photo had been found
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
public static function getThumb(array $contact, bool $no_update = false)
public static function getThumb(array $contact, string $avatar = '', bool $no_update = false)
{
return self::getAvatarPath($contact, Proxy::SIZE_THUMB, $no_update);
return self::getAvatarPath($contact, 'thumb', Proxy::SIZE_THUMB, $avatar, $no_update);
}
/**
* Return the photo path (micro size) for a given contact array
*
* @param array $contact Contact array
* @param string $avatar Avatar path that is displayed when no photo had been found
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
public static function getMicro(array $contact, bool $no_update = false)
public static function getMicro(array $contact, string $avatar = '', bool $no_update = false)
{
return self::getAvatarPath($contact, Proxy::SIZE_MICRO, $no_update);
return self::getAvatarPath($contact, 'micro', Proxy::SIZE_MICRO, $avatar, $no_update);
}
/**
@ -1888,7 +1907,7 @@ class Contact
{
if (Strings::normaliseLink($new_url) != Strings::normaliseLink($old_url)) {
Logger::notice('New URL differs from old URL', ['old' => $old_url, 'new' => $new_url]);
return;
// @todo It is to decide what to do when the URL is changed
}
if (!DBA::update('contact', $fields, ['id' => $id])) {
@ -2023,7 +2042,7 @@ class Contact
// These fields aren't updated by this routine:
// 'xmpp', 'sensitive'
$fields = ['uid', 'uri-id', 'avatar', 'header', 'name', 'nick', 'location', 'keywords', 'about', 'subscribe',
$fields = ['uid', 'avatar', 'header', 'name', 'nick', 'location', 'keywords', 'about', 'subscribe',
'manually-approve', 'unsearchable', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco',
'network', 'alias', 'baseurl', 'gsid', 'forum', 'prv', 'contact-type', 'pubkey', 'last-item'];
$contact = DBA::selectFirst('contact', $fields, ['id' => $id]);
@ -2052,9 +2071,6 @@ class Contact
$uid = $contact['uid'];
unset($contact['uid']);
$uriid = $contact['uri-id'];
unset($contact['uri-id']);
$pubkey = $contact['pubkey'];
unset($contact['pubkey']);
@ -2078,14 +2094,6 @@ class Contact
return false;
}
if (Strings::normaliseLink($ret['url']) != Strings::normaliseLink($contact['url'])) {
$cid = self::getIdForURL($ret['url']);
if (!empty($cid) && ($cid != $id)) {
Logger::notice('URL of contact changed.', ['id' => $id, 'new_id' => $cid, 'old' => $contact['url'], 'new' => $ret['url']]);
return self::updateFromProbeArray($cid, $ret);
}
}
if (isset($ret['hide']) && is_bool($ret['hide'])) {
$ret['unsearchable'] = $ret['hide'];
}
@ -2108,7 +2116,6 @@ class Contact
}
$update = false;
$guid = $ret['guid'] ?? '';
// make sure to not overwrite existing values with blank entries except some technical fields
$keep = ['batch', 'notify', 'poll', 'request', 'confirm', 'poco', 'baseurl'];
@ -2128,10 +2135,6 @@ class Contact
unset($ret['last-item']);
}
if (empty($uriid)) {
$update = true;
}
if (!empty($ret['photo']) && ($ret['network'] != Protocol::FEED)) {
self::updateAvatar($id, $ret['photo'], $update);
}
@ -2154,15 +2157,9 @@ class Contact
return true;
}
if (empty($guid)) {
$ret['uri-id'] = ItemURI::getIdByURI($ret['url']);
} else {
$ret['uri-id'] = ItemURI::insert(['uri' => $ret['url'], 'guid' => $guid]);
}
$ret['nurl'] = Strings::normaliseLink($ret['url']);
$ret['nurl'] = Strings::normaliseLink($ret['url']);
$ret['updated'] = $updated;
$ret['failed'] = false;
$ret['failed'] = false;
// Only fill the pubkey if it had been empty before. We have to prevent identity theft.
if (empty($pubkey) && !empty($new_pubkey)) {
@ -2992,8 +2989,7 @@ class Contact
$search .= '%';
$results = DBA::p("SELECT * FROM `contact`
WHERE (NOT `unsearchable` OR `nurl` IN (SELECT `nurl` FROM `owner-view` where `publish` OR `net-publish`))
AND `network` IN (?, ?, ?, ?) AND
WHERE NOT `unsearchable` AND `network` IN (?, ?, ?, ?) AND
NOT `failed` AND `uid` = ? AND
(`addr` LIKE ? OR `name` LIKE ? OR `nick` LIKE ?) $extra_sql
ORDER BY `nurl` DESC LIMIT 1000",

View file

@ -41,14 +41,12 @@ use Friendica\Util\XML;
class Event
{
public static function getHTML(array $event, $simple = false, $uriid = 0)
public static function getHTML(array $event, $simple = false)
{
if (empty($event)) {
return '';
}
$uriid = $event['uri-id'] ?? $uriid;
$bd_format = DI::l10n()->t('l F d, Y \@ g:i A'); // Friday January 18, 2011 @ 8 AM.
$event_start = DI::l10n()->getDay(
@ -69,11 +67,11 @@ class Event
$o = '';
if (!empty($event['summary'])) {
$o .= "<h3>" . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['summary']), $simple) . "</h3>";
$o .= "<h3>" . BBCode::convert(Strings::escapeHtml($event['summary']), false, $simple) . "</h3>";
}
if (!empty($event['desc'])) {
$o .= "<div>" . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['desc']), $simple) . "</div>";
$o .= "<div>" . BBCode::convert(Strings::escapeHtml($event['desc']), false, $simple) . "</div>";
}
$o .= "<h4>" . DI::l10n()->t('Starts:') . "</h4><p>" . $event_start . "</p>";
@ -83,7 +81,7 @@ class Event
}
if (!empty($event['location'])) {
$o .= "<h4>" . DI::l10n()->t('Location:') . "</h4><p>" . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['location']), $simple) . "</p>";
$o .= "<h4>" . DI::l10n()->t('Location:') . "</h4><p>" . BBCode::convert(Strings::escapeHtml($event['location']), false, $simple) . "</p>";
}
return $o;
@ -91,7 +89,7 @@ class Event
$o = '<div class="vevent">' . "\r\n";
$o .= '<div class="summary event-summary">' . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['summary']), $simple) . '</div>' . "\r\n";
$o .= '<div class="summary event-summary">' . BBCode::convert(Strings::escapeHtml($event['summary']), false, $simple) . '</div>' . "\r\n";
$o .= '<div class="event-start"><span class="event-label">' . DI::l10n()->t('Starts:') . '</span>&nbsp;<span class="dtstart" title="'
. DateTimeFormat::utc($event['start'], (!empty($event['adjust']) ? DateTimeFormat::ATOM : 'Y-m-d\TH:i:s'))
@ -106,12 +104,12 @@ class Event
}
if (!empty($event['desc'])) {
$o .= '<div class="description event-description">' . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['desc']), $simple) . '</div>' . "\r\n";
$o .= '<div class="description event-description">' . BBCode::convert(Strings::escapeHtml($event['desc']), false, $simple) . '</div>' . "\r\n";
}
if (!empty($event['location'])) {
$o .= '<div class="event-location"><span class="event-label">' . DI::l10n()->t('Location:') . '</span>&nbsp;<span class="location">'
. BBCode::convertForUriId($uriid, Strings::escapeHtml($event['location']), $simple)
. BBCode::convert(Strings::escapeHtml($event['location']), false, $simple)
. '</span></div>' . "\r\n";
// Include a map of the location if the [map] BBCode is used.
@ -275,7 +273,6 @@ class Event
$event['cid'] = intval($arr['cid'] ?? 0);
$event['guid'] = ($arr['guid'] ?? '') ?: System::createUUID();
$event['uri'] = ($arr['uri'] ?? '') ?: Item::newURI($event['uid'], $event['guid']);
$event['uri-id'] = ItemURI::insert(['uri' => $event['uri'], 'guid' => $event['guid']]);
$event['type'] = ($arr['type'] ?? '') ?: 'event';
$event['summary'] = $arr['summary'] ?? '';
$event['desc'] = $arr['desc'] ?? '';
@ -589,10 +586,10 @@ class Event
$last_date = '';
$fmt = DI::l10n()->t('l, F j');
foreach ($event_result as $event) {
$item = Post::selectFirst(['plink', 'author-name', 'author-avatar', 'author-link', 'private', 'uri-id'], ['id' => $event['itemid']]);
$item = Post::selectFirst(['plink', 'author-name', 'author-avatar', 'author-link', 'private'], ['id' => $event['itemid']]);
if (!DBA::isResult($item)) {
// Using default values when no item had been found
$item = ['plink' => '', 'author-name' => '', 'author-avatar' => '', 'author-link' => '', 'private' => Item::PUBLIC, 'uri-id' => ($event['uri-id'] ?? 0)];
$item = ['plink' => '', 'author-name' => '', 'author-avatar' => '', 'author-link' => '', 'private' => Item::PUBLIC];
}
$event = array_merge($event, $item);
@ -623,9 +620,9 @@ class Event
$drop = [DI::baseUrl() . '/events/drop/' . $event['id'] , DI::l10n()->t('Delete event') , '', ''];
}
$title = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['summary']));
$title = BBCode::convert(Strings::escapeHtml($event['summary']));
if (!$title) {
list($title, $_trash) = explode("<br", BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['desc'])), BBCode::API);
list($title, $_trash) = explode("<br", BBCode::convert(Strings::escapeHtml($event['desc'])), BBCode::API);
}
$author_link = $event['author-link'];
@ -633,9 +630,9 @@ class Event
$event['author-link'] = Contact::magicLink($author_link);
$html = self::getHTML($event);
$event['summary'] = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['summary']));
$event['desc'] = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['desc']));
$event['location'] = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['location']));
$event['summary'] = BBCode::convert(Strings::escapeHtml($event['summary']));
$event['desc'] = BBCode::convert(Strings::escapeHtml($event['desc']));
$event['location'] = BBCode::convert(Strings::escapeHtml($event['location']));
$event_list[] = [
'id' => $event['id'],
'start' => $start,
@ -940,7 +937,7 @@ class Event
$tpl = Renderer::getMarkupTemplate('event_stream_item.tpl');
$return = Renderer::replaceMacros($tpl, [
'$id' => $item['event-id'],
'$title' => BBCode::convertForUriId($item['uri-id'], $item['event-summary']),
'$title' => BBCode::convert($item['event-summary']),
'$dtstart_label' => DI::l10n()->t('Starts:'),
'$dtstart_title' => $dtstart_title,
'$dtstart_dt' => $dtstart_dt,
@ -958,7 +955,7 @@ class Event
'$author_name' => $item['author-name'],
'$author_link' => $profile_link,
'$author_avatar' => $item['author-avatar'],
'$description' => BBCode::convertForUriId($item['uri-id'], $item['event-desc']),
'$description' => BBCode::convert($item['event-desc']),
'$location_label' => DI::l10n()->t('Location:'),
'$show_map_label' => DI::l10n()->t('Show map'),
'$hide_map_label' => DI::l10n()->t('Hide map'),

View file

@ -60,7 +60,7 @@ class FContact
$update = true;
}
if (empty($person['guid']) || empty($person['uri-id'])) {
if ($person["guid"] == "") {
$update = true;
}
}
@ -100,7 +100,6 @@ class FContact
'batch' => $arr["batch"], 'notify' => $arr["notify"],
'poll' => $arr["poll"], 'confirm' => $arr["confirm"],
'alias' => $arr["alias"], 'pubkey' => $arr["pubkey"],
'uri-id' => ItemURI::insert(['uri' => $arr['url'], 'guid' => $arr['guid']]),
'updated' => DateTimeFormat::utcNow()];
$condition = ['url' => $arr["url"], 'network' => $arr["network"]];

View file

@ -1008,6 +1008,9 @@ class Item
// Check for hashtags in the body and repair or add hashtag links
$item['body'] = self::setHashtags($item['body']);
// Fill the cache field
self::putInCache($item);
if (stristr($item['verb'], Activity::POKE)) {
$notify_type = Delivery::POKE;
} else {
@ -2640,7 +2643,7 @@ class Item
) {
self::addRedirToImageTags($item);
$item['rendered-html'] = BBCode::convertForUriId($item['uri-id'], $item['body']);
$item['rendered-html'] = BBCode::convert($item['body']);
$item['rendered-hash'] = hash('md5', BBCode::VERSION . '::' . $body);
$hook_data = ['item' => $item, 'rendered-html' => $item['rendered-html'], 'rendered-hash' => $item['rendered-hash']];
@ -2780,13 +2783,13 @@ class Item
if (!empty($shared_attachments)) {
$s = self::addVisualAttachments($shared_attachments, $item, $s, true);
$s = self::addLinkAttachment($shared_uri_id ?: $item['uri-id'], $shared_attachments, $body, $s, true, []);
$s = self::addLinkAttachment($shared_attachments, $body, $s, true, []);
$s = self::addNonVisualAttachments($shared_attachments, $item, $s, true);
$body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
}
$s = self::addVisualAttachments($attachments, $item, $s, false);
$s = self::addLinkAttachment($item['uri-id'], $attachments, $body, $s, false, $shared_links);
$s = self::addLinkAttachment($attachments, $body, $s, false, $shared_links);
$s = self::addNonVisualAttachments($attachments, $item, $s, false);
// Map.
@ -2967,7 +2970,7 @@ class Item
* @param array $ignore_links A list of URLs to ignore
* @return string modified content
*/
private static function addLinkAttachment(int $uriid, array $attachments, string $body, string $content, bool $shared, array $ignore_links)
private static function addLinkAttachment(array $attachments, string $body, string $content, bool $shared, array $ignore_links)
{
$stamp1 = microtime(true);
// @ToDo Check only for audio and video
@ -3053,7 +3056,7 @@ class Item
}
// @todo Use a template
$rendered = BBCode::convertAttachment('', BBCode::INTERNAL, false, $data, $uriid);
$rendered = BBCode::convertAttachment('', BBCode::INTERNAL, false, $data);
} elseif (!self::containsLink($content, $data['url'], Post\Media::HTML)) {
$rendered = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/link.tpl'), [
'$url' => $data['url'],

View file

@ -156,27 +156,6 @@ class Post
return DBA::count('post-user-view', $condition, $params);
}
/**
* Counts the post-thread-user-view records satisfying the provided condition
*
* @param array $condition array of fields for condition
* @param array $params Array of several parameters
*
* @return int
*
* Example:
* $condition = ["uid" => 1, "network" => 'dspr'];
* or:
* $condition = ["`uid` = ? AND `network` IN (?, ?)", 1, 'dfrn', 'dspr'];
*
* $count = Post::count($condition);
* @throws \Exception
*/
public static function countThread(array $condition = [], array $params = [])
{
return DBA::count('post-thread-user-view', $condition, $params);
}
/**
* Counts the post-view records satisfying the provided condition
*

View file

@ -1,127 +0,0 @@
<?php
/**
* @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Model\Post;
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Util\Proxy;
/**
* Class Link
*
* This Model class handles post related external links
*/
class Link
{
public static function getByLink(int $uri_id, string $url, $size = '')
{
if (empty($uri_id) || empty($url) || Proxy::isLocalImage($url)) {
return $url;
}
if (!in_array(parse_url($url, PHP_URL_SCHEME), ['http', 'https'])) {
Logger::info('Bad URL, quitting', ['uri-id' => $uri_id, 'url' => $url, 'callstack' => System::callstack(20)]);
return $url;
}
$link = DBA::selectFirst('post-link', ['id'], ['uri-id' => $uri_id, 'url' => $url]);
if (!empty($link['id'])) {
$id = $link['id'];
Logger::info('Found', ['id' => $id, 'uri-id' => $uri_id, 'url' => $url]);
} else {
$mime = self::fetchMimeType($url);
DBA::insert('post-link', ['uri-id' => $uri_id, 'url' => $url, 'mimetype' => $mime]);
$id = DBA::lastInsertId();
Logger::info('Inserted', ['id' => $id, 'uri-id' => $uri_id, 'url' => $url]);
}
if (empty($id)) {
return $url;
}
$url = DI::baseUrl() . '/photo/link/';
switch ($size) {
case Proxy::SIZE_MICRO:
$url .= Proxy::PIXEL_MICRO . '/';
break;
case Proxy::SIZE_THUMB:
$url .= Proxy::PIXEL_THUMB . '/';
break;
case Proxy::SIZE_SMALL:
$url .= Proxy::PIXEL_SMALL . '/';
break;
case Proxy::SIZE_MEDIUM:
$url .= Proxy::PIXEL_MEDIUM . '/';
break;
case Proxy::SIZE_LARGE:
$url .= Proxy::PIXEL_LARGE . '/';
break;
}
return $url . $id;
}
private static function fetchMimeType(string $url)
{
$timeout = DI::config()->get('system', 'xrd_timeout');
$curlResult = DI::httpRequest()->head($url, ['timeout' => $timeout]);
if ($curlResult->isSuccess()) {
if (empty($media['mimetype'])) {
return $curlResult->getHeader('Content-Type');
}
}
return '';
}
/**
* Add external links and replace them in the body
*
* @param integer $uriid
* @param string $body
* @return string Body with replaced links
*/
public static function insertFromBody(int $uriid, string $body)
{
if (preg_match_all("/\[img\=([0-9]*)x([0-9]*)\](http.*?)\[\/img\]/ism", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) {
$body = str_replace($picture[3], self::getByLink($uriid, $picture[3]), $body);
}
}
if (preg_match_all("/\[img=(http[^\[\]]*)\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) {
$body = str_replace($picture[1], self::getByLink($uriid, $picture[1]), $body);
}
}
if (preg_match_all("/\[img\](http[^\[\]]*)\[\/img\]/ism", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) {
$body = str_replace($picture[1], self::getByLink($uriid, $picture[1]), $body);
}
}
return trim($body);
}
}

View file

@ -486,11 +486,11 @@ class Profile
}
if (isset($p['about'])) {
$p['about'] = BBCode::convertForUriId($profile['uri-id'] ?? 0, $p['about']);
$p['about'] = BBCode::convert($p['about']);
}
if (isset($p['address'])) {
$p['address'] = BBCode::convertForUriId($profile['uri-id'] ?? 0, $p['address']);
$p['address'] = BBCode::convert($p['address']);
}
$p['photo'] = Contact::getAvatarUrlForId($cid, ProxyUtils::SIZE_SMALL);
@ -670,13 +670,13 @@ class Profile
$istoday = true;
}
$title = strip_tags(html_entity_decode(BBCode::convertForUriId($rr['uri-id'], $rr['summary']), ENT_QUOTES, 'UTF-8'));
$title = strip_tags(html_entity_decode(BBCode::convert($rr['summary']), ENT_QUOTES, 'UTF-8'));
if (strlen($title) > 35) {
$title = substr($title, 0, 32) . '... ';
}
$description = substr(strip_tags(BBCode::convertForUriId($rr['uri-id'], $rr['desc'])), 0, 32) . '... ';
$description = substr(strip_tags(BBCode::convert($rr['desc'])), 0, 32) . '... ';
if (!$description) {
$description = DI::l10n()->t('[No description]');
}

View file

@ -146,15 +146,6 @@ class User
$system['sprvkey'] = $system['uprvkey'] = $system['prvkey'];
$system['spubkey'] = $system['upubkey'] = $system['pubkey'];
$system['nickname'] = $system['nick'];
$system['page-flags'] = User::PAGE_FLAGS_SOAPBOX;
$system['account-type'] = $system['contact-type'];
$system['guid'] = '';
$system['nickname'] = $system['nick'];
$system['pubkey'] = $system['pubkey'];
$system['locality'] = '';
$system['region'] = '';
$system['country-name'] = '';
$system['net-publish'] = false;
// Ensure that the user contains data
$user = DBA::selectFirst('user', ['prvkey'], ['uid' => 0]);

View file

@ -194,10 +194,13 @@ class Site extends BaseAdmin
$dbclean_unclaimed = (!empty($_POST['dbclean_unclaimed']) ? intval($_POST['dbclean_unclaimed']) : 0);
$dbclean_expire_conv = (!empty($_POST['dbclean_expire_conv']) ? intval($_POST['dbclean_expire_conv']) : 0);
$suppress_tags = !empty($_POST['suppress_tags']);
$itemcache = (!empty($_POST['itemcache']) ? Strings::escapeTags(trim($_POST['itemcache'])) : '');
$itemcache_duration = (!empty($_POST['itemcache_duration']) ? intval($_POST['itemcache_duration']) : 0);
$max_comments = (!empty($_POST['max_comments']) ? intval($_POST['max_comments']) : 0);
$max_display_comments = (!empty($_POST['max_display_comments']) ? intval($_POST['max_display_comments']) : 0);
$temppath = (!empty($_POST['temppath']) ? Strings::escapeTags(trim($_POST['temppath'])) : '');
$singleuser = (!empty($_POST['singleuser']) ? Strings::escapeTags(trim($_POST['singleuser'])) : '');
$proxy_disabled = !empty($_POST['proxy_disabled']);
$only_tag_search = !empty($_POST['only_tag_search']);
$rino = (!empty($_POST['rino']) ? intval($_POST['rino']) : 0);
$check_new_version_url = (!empty($_POST['check_new_version_url']) ? Strings::escapeTags(trim($_POST['check_new_version_url'])) : 'none');
@ -392,6 +395,12 @@ class Site extends BaseAdmin
DI::config()->set('system', 'dbclean-expire-unclaimed', $dbclean_unclaimed);
if ($itemcache != '') {
$itemcache = BasePath::getRealPath($itemcache);
}
DI::config()->set('system', 'itemcache', $itemcache);
DI::config()->set('system', 'itemcache_duration', $itemcache_duration);
DI::config()->set('system', 'max_comments', $max_comments);
DI::config()->set('system', 'max_display_comments', $max_display_comments);
@ -401,6 +410,7 @@ class Site extends BaseAdmin
DI::config()->set('system', 'temppath', $temppath);
DI::config()->set('system', 'proxy_disabled' , $proxy_disabled);
DI::config()->set('system', 'only_tag_search' , $only_tag_search);
DI::config()->set('system', 'worker_queues' , $worker_queues);
@ -496,6 +506,7 @@ class Site extends BaseAdmin
// Automatically create temporary paths
get_temppath();
get_itemcachepath();
/* Register policy */
$register_choices = [
@ -663,9 +674,12 @@ class Site extends BaseAdmin
'$dbclean_expire_days' => ['dbclean_expire_days', DI::l10n()->t('Lifespan of remote items'), DI::config()->get('system', 'dbclean-expire-days'), DI::l10n()->t('When the database cleanup is enabled, this defines the days after which remote items will be deleted. Own items, and marked or filed items are always kept. 0 disables this behaviour.')],
'$dbclean_unclaimed' => ['dbclean_unclaimed', DI::l10n()->t('Lifespan of unclaimed items'), DI::config()->get('system', 'dbclean-expire-unclaimed'), DI::l10n()->t('When the database cleanup is enabled, this defines the days after which unclaimed remote items (mostly content from the relay) will be deleted. Default value is 90 days. Defaults to the general lifespan value of remote items if set to 0.')],
'$dbclean_expire_conv' => ['dbclean_expire_conv', DI::l10n()->t('Lifespan of raw conversation data'), DI::config()->get('system', 'dbclean_expire_conversation'), DI::l10n()->t('The conversation data is used for ActivityPub and OStatus, as well as for debug purposes. It should be safe to remove it after 14 days, default is 90 days.')],
'$itemcache' => ['itemcache', DI::l10n()->t('Path to item cache'), DI::config()->get('system', 'itemcache'), DI::l10n()->t('The item caches buffers generated bbcode and external images.')],
'$itemcache_duration' => ['itemcache_duration', DI::l10n()->t('Cache duration in seconds'), DI::config()->get('system', 'itemcache_duration'), DI::l10n()->t('How long should the cache files be hold? Default value is 86400 seconds (One day). To disable the item cache, set the value to -1.')],
'$max_comments' => ['max_comments', DI::l10n()->t('Maximum numbers of comments per post'), DI::config()->get('system', 'max_comments'), DI::l10n()->t('How much comments should be shown for each post? Default value is 100.')],
'$max_display_comments' => ['max_display_comments', DI::l10n()->t('Maximum numbers of comments per post on the display page'), DI::config()->get('system', 'max_display_comments'), DI::l10n()->t('How many comments should be shown on the single view for each post? Default value is 1000.')],
'$temppath' => ['temppath', DI::l10n()->t('Temp path'), DI::config()->get('system', 'temppath'), DI::l10n()->t('If you have a restricted system where the webserver can\'t access the system temp path, enter another path here.')],
'$proxy_disabled' => ['proxy_disabled', DI::l10n()->t('Disable picture proxy'), DI::config()->get('system', 'proxy_disabled'), DI::l10n()->t('The picture proxy increases performance and privacy. It shouldn\'t be used on systems with very low bandwidth.')],
'$only_tag_search' => ['only_tag_search', DI::l10n()->t('Only search in tags'), DI::config()->get('system', 'only_tag_search'), DI::l10n()->t('On large systems the text search can slow down the system extremely.')],
'$relocate_url' => ['relocate_url', DI::l10n()->t('New base url'), DI::baseUrl()->get(), DI::l10n()->t('Change base url for this server. Sends relocate message to all Friendica and Diaspora* contacts of all users.')],

View file

@ -55,7 +55,7 @@ class Index extends BaseApi
'cid' => $event['cid'],
'uri' => $event['uri'],
'name' => $event['summary'],
'desc' => BBCode::convertForUriId($event['uri-id'], $event['desc']),
'desc' => BBCode::convert($event['desc']),
'startTime' => $event['start'],
'endTime' => $event['finish'],
'type' => $event['type'],

View file

@ -140,8 +140,6 @@ class Statuses extends BaseApi
$item['gravity'] = GRAVITY_COMMENT;
$item['object-type'] = Activity\ObjectType::COMMENT;
} else {
self::checkThrottleLimit();
$item['gravity'] = GRAVITY_PARENT;
$item['object-type'] = Activity\ObjectType::NOTE;
}

View file

@ -25,11 +25,9 @@ use Friendica\BaseModule;
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
use Friendica\Model\Post;
use Friendica\Network\HTTPException;
use Friendica\Security\BasicAuth;
use Friendica\Security\OAuth;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\HTTPInputData;
require_once __DIR__ . '/../../include/api.php';
@ -284,60 +282,6 @@ class BaseApi extends BaseModule
}
}
public static function checkThrottleLimit()
{
$uid = self::getCurrentUserID();
// Check for throttling (maximum posts per day, week and month)
$throttle_day = DI::config()->get('system', 'throttle_limit_day');
if ($throttle_day > 0) {
$datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60);
$condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom];
$posts_day = Post::countThread($condition);
if ($posts_day > $throttle_day) {
Logger::info('Daily posting limit reached', ['uid' => $uid, 'posts' => $posts_day, 'limit' => $throttle_day]);
$error = DI::l10n()->t('Too Many Requests');
$error_description = DI::l10n()->tt("Daily posting limit of %d post reached. The post was rejected.", "Daily posting limit of %d posts reached. The post was rejected.", $throttle_day);
$errorobj = new \Friendica\Object\Api\Mastodon\Error($error, $error_description);
System::jsonError(429, $errorobj->toArray());
}
}
$throttle_week = DI::config()->get('system', 'throttle_limit_week');
if ($throttle_week > 0) {
$datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*7);
$condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom];
$posts_week = Post::countThread($condition);
if ($posts_week > $throttle_week) {
Logger::info('Weekly posting limit reached', ['uid' => $uid, 'posts' => $posts_week, 'limit' => $throttle_week]);
$error = DI::l10n()->t('Too Many Requests');
$error_description = DI::l10n()->tt("Weekly posting limit of %d post reached. The post was rejected.", "Weekly posting limit of %d posts reached. The post was rejected.", $throttle_week);
$errorobj = new \Friendica\Object\Api\Mastodon\Error($error, $error_description);
System::jsonError(429, $errorobj->toArray());
}
}
$throttle_month = DI::config()->get('system', 'throttle_limit_month');
if ($throttle_month > 0) {
$datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*30);
$condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom];
$posts_month = Post::countThread($condition);
if ($posts_month > $throttle_month) {
Logger::info('Monthly posting limit reached', ['uid' => $uid, 'posts' => $posts_month, 'limit' => $throttle_month]);
$error = DI::l10n()->t('Too Many Requests');
$error_description = DI::l10n()->t("Monthly posting limit of %d post reached. The post was rejected.", "Monthly posting limit of %d posts reached. The post was rejected.", $throttle_month);
$errorobj = new \Friendica\Object\Api\Mastodon\Error($error, $error_description);
System::jsonError(429, $errorobj->toArray());
}
}
}
/**
* Get user info array.
*

View file

@ -650,11 +650,11 @@ class Contact extends BaseModule
'$profileurllabel'=> DI::l10n()->t('Profile URL'),
'$profileurl' => $contact['url'],
'$account_type' => Model\Contact::getAccountType($contact),
'$location' => BBCode::convertForUriId($contact['uri-id'] ?? 0, $contact['location']),
'$location' => BBCode::convert($contact['location']),
'$location_label' => DI::l10n()->t('Location:'),
'$xmpp' => BBCode::convertForUriId($contact['uri-id'] ?? 0, $contact['xmpp']),
'$xmpp' => BBCode::convert($contact['xmpp']),
'$xmpp_label' => DI::l10n()->t('XMPP:'),
'$about' => BBCode::convertForUriId($contact['uri-id'] ?? 0, $contact['about'], BBCode::EXTERNAL),
'$about' => BBCode::convert($contact['about'], false),
'$about_label' => DI::l10n()->t('About:'),
'$keywords' => $contact['keywords'],
'$keywords_label' => DI::l10n()->t('Tags:'),
@ -1111,7 +1111,7 @@ class Contact extends BaseModule
'url' => $url,
'img_hover' => DI::l10n()->t('Visit %s\'s profile [%s]', $contact['name'], $contact['url']),
'photo_menu' => Model\Contact::photoMenu($contact),
'thumb' => Model\Contact::getThumb($contact, true),
'thumb' => Model\Contact::getThumb($contact, '', true),
'alt_text' => $alt_text,
'name' => $contact['name'],
'nick' => $contact['nick'],

View file

@ -176,7 +176,7 @@ class Photo extends BaseModule
{
switch($type) {
case "preview":
$media = DBA::selectFirst('post-media', ['preview', 'url', 'mimetype', 'type', 'uri-id'], ['id' => $uid]);
$media = DBA::selectFirst('post-media', ['preview', 'url', 'type', 'uri-id'], ['id' => $uid]);
if (empty($media)) {
return false;
}
@ -194,9 +194,9 @@ class Photo extends BaseModule
return MPhoto::getPhoto($matches[1], $matches[2]);
}
return MPhoto::createPhotoForExternalResource($url, (int)local_user(), $media['mimetype']);
return MPhoto::createPhotoForExternalResource($url, (int)local_user());
case "media":
$media = DBA::selectFirst('post-media', ['url', 'mimetype', 'uri-id'], ['id' => $uid, 'type' => Post\Media::IMAGE]);
$media = DBA::selectFirst('post-media', ['url', 'uri-id'], ['id' => $uid, 'type' => Post\Media::IMAGE]);
if (empty($media)) {
return false;
}
@ -205,14 +205,7 @@ class Photo extends BaseModule
return MPhoto::getPhoto($matches[1], $matches[2]);
}
return MPhoto::createPhotoForExternalResource($media['url'], (int)local_user(), $media['mimetype']);
case "link":
$link = DBA::selectFirst('post-link', ['url', 'mimetype'], ['id' => $uid]);
if (empty($link)) {
return false;
}
return MPhoto::createPhotoForExternalResource($link['url'], (int)local_user(), $link['mimetype']);
return MPhoto::createPhotoForExternalResource($media['url'], (int)local_user());
case "contact":
$contact = Contact::getById($uid, ['uid', 'url', 'avatar', 'photo', 'xmpp', 'addr']);
if (empty($contact)) {

View file

@ -169,7 +169,7 @@ class Profile extends BaseProfile
}
if ($a->profile['about']) {
$basic_fields += self::buildField('about', DI::l10n()->t('Description:'), BBCode::convertForUriId($a->profile['uri-id'], $a->profile['about']));
$basic_fields += self::buildField('about', DI::l10n()->t('Description:'), BBCode::convert($a->profile['about']));
}
if ($a->profile['xmpp']) {
@ -218,7 +218,7 @@ class Profile extends BaseProfile
$custom_fields += self::buildField(
'custom_' . $profile_field->order,
$profile_field->label,
BBCode::convertForUriId($a->profile['uri-id'], $profile_field->value),
BBCode::convert($profile_field->value),
'aprofile custom'
);
};

View file

@ -24,9 +24,10 @@ namespace Friendica\Module;
use Friendica\BaseModule;
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
use Friendica\Model\Photo;
use Friendica\Object\Image;
use Friendica\Util\HTTPSignature;
use Friendica\Util\Images;
use Friendica\Util\Proxy as ProxyUtils;
/**
@ -40,27 +41,50 @@ class Proxy extends BaseModule
{
/**
* Fetch remote image content
* Initializer method for this class.
*
* Sets application instance and checks if /proxy/ path is writable.
*
*/
public static function rawContent(array $parameters = [])
{
if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
header("HTTP/1.1 304 Not Modified");
header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT");
if (!empty($_SERVER["HTTP_IF_NONE_MATCH"])) {
header("Etag: " . $_SERVER["HTTP_IF_NONE_MATCH"]);
// Set application instance here
$a = DI::app();
/*
* Pictures are stored in one of the following ways:
*
* 1. If a folder "proxy" exists and is writeable, then use this for caching
* 2. If a cache path is defined, use this
* 3. If everything else failed, cache into the database
*
* Question: Do we really need these three methods?
*/
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
header('HTTP/1.1 304 Not Modified');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
header('Etag: ' . $_SERVER['HTTP_IF_NONE_MATCH']);
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + (31536000)) . ' GMT');
header('Cache-Control: max-age=31536000');
if (function_exists('header_remove')) {
header_remove('Last-Modified');
header_remove('Expires');
header_remove('Cache-Control');
}
header("Expires: " . gmdate("D, d M Y H:i:s", time() + (31536000)) . " GMT");
header("Cache-Control: max-age=31536000");
if (function_exists("header_remove")) {
header_remove("Last-Modified");
header_remove("Expires");
header_remove("Cache-Control");
}
exit;
/// @TODO Stop here?
exit();
}
$request = self::getRequestInfo($parameters);
if (function_exists('header_remove')) {
header_remove('Pragma');
header_remove('pragma');
}
$direct_cache = self::setupDirectCache();
$request = self::getRequestInfo();
if (empty($request['url'])) {
throw new \Friendica\Network\HTTPException\BadRequestException();
@ -71,20 +95,35 @@ class Proxy extends BaseModule
System::externalRedirect($request['url']);
}
// Webserver already tried direct cache...
// Try to use filecache;
$cachefile = self::responseFromCache($request);
// Try to use photo from db
self::responseFromDB($request);
//
// If script is here, the requested url has never cached before.
// Let's fetch it, scale it if required, then save it in cache.
//
// It shouldn't happen but it does - spaces in URL
$request['url'] = str_replace(' ', '+', $request['url']);
// Fetch the content with the local user
$fetchResult = HTTPSignature::fetchRaw($request['url'], local_user(), ['timeout' => 10]);
$img_str = $fetchResult->getBody();
if (!$fetchResult->isSuccess() || empty($img_str)) {
// If there is an error then return a blank image
if ((substr($fetchResult->getReturnCode(), 0, 1) == '4') || empty($img_str)) {
Logger::info('Error fetching image', ['image' => $request['url'], 'return' => $fetchResult->getReturnCode(), 'empty' => empty($img_str)]);
self::responseError();
// stop.
}
$mime = Images::getMimeTypeByData($img_str);
$tempfile = tempnam(get_temppath(), 'cache');
file_put_contents($tempfile, $img_str);
$mime = mime_content_type($tempfile);
unlink($tempfile);
$image = new Image($img_str, $mime);
if (!$image->isValid()) {
@ -93,33 +132,80 @@ class Proxy extends BaseModule
// stop.
}
$basepath = $a->getBasePath();
$filepermission = DI::config()->get('system', 'proxy_file_chmod');
// Store original image
if ($direct_cache) {
// direct cache , store under ./proxy/
$filename = $basepath . '/proxy/' . ProxyUtils::proxifyUrl($request['url'], true);
file_put_contents($filename, $image->asString());
if (!empty($filepermission)) {
chmod($filename, $filepermission);
}
} elseif($cachefile !== '') {
// cache file
file_put_contents($cachefile, $image->asString());
} else {
// database
Photo::store($image, 0, 0, $request['urlhash'], $request['url'], '', 100);
}
// reduce quality - if it isn't a GIF
if ($image->getType() != 'image/gif') {
$image->scaleDown($request['size']);
}
// Store scaled image
if ($direct_cache && $request['sizetype'] != '') {
$filename = $basepath . '/proxy/' . ProxyUtils::proxifyUrl($request['url'], true) . $request['sizetype'];
file_put_contents($filename, $image->asString());
if (!empty($filepermission)) {
chmod($filename, $filepermission);
}
}
self::responseImageHttpCache($image);
// stop.
}
/**
* Build info about requested image to be proxied
*
* @return array
* [
* 'url' => requested url,
* 'urlhash' => sha1 has of the url prefixed with 'pic:',
* 'size' => requested image size (int)
* 'sizetype' => requested image size (string): ':micro', ':thumb', ':small', ':medium', ':large'
* ]
* @throws \Exception
*/
private static function getRequestInfo(array $parameters)
private static function getRequestInfo()
{
$a = DI::app();
$size = ProxyUtils::PIXEL_LARGE;
$sizetype = '';
if (!empty($parameters['url']) && empty($_REQUEST['url'])) {
$url = $parameters['url'];
// Look for filename in the arguments
// @TODO: Replace with parameter from router
if (($a->argc > 1) && !isset($_REQUEST['url'])) {
if (isset($a->argv[3])) {
$url = $a->argv[3];
} elseif (isset($a->argv[2])) {
$url = $a->argv[2];
} else {
$url = $a->argv[1];
}
/// @TODO: Why? And what about $url in this case?
/// @TODO: Replace with parameter from router
if (isset($a->argv[3]) && ($a->argv[3] == 'thumb')) {
$size = 200;
}
// thumb, small, medium and large.
if (substr($url, -6) == ':micro') {
@ -152,17 +238,87 @@ class Proxy extends BaseModule
$url = str_replace(['.jpg', '.jpeg', '.gif', '.png'], ['','','',''], $url);
$url = base64_decode(strtr($url, '-_', '+/'), true);
} else {
$url = $_REQUEST['url'] ?? '';
}
return [
'url' => $url,
'urlhash' => 'pic:' . sha1($url),
'size' => $size,
'sizetype' => $sizetype,
];
}
/**
* setup ./proxy folder for direct cache
*
* @return bool False if direct cache can't be used.
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function setupDirectCache()
{
$a = DI::app();
$basepath = $a->getBasePath();
// If the cache path isn't there, try to create it
if (!is_dir($basepath . '/proxy') && is_writable($basepath)) {
mkdir($basepath . '/proxy');
}
// Checking if caching into a folder in the webroot is activated and working
$direct_cache = (is_dir($basepath . '/proxy') && is_writable($basepath . '/proxy'));
// we don't use direct cache if image url is passed in args and not in querystring
$direct_cache = $direct_cache && ($a->argc > 1) && !isset($_REQUEST['url']);
return $direct_cache;
}
/**
* Try to reply with image in cachefile
*
* @param array $request Array from getRequestInfo
*
* @return string Cache file name, empty string if cache is not enabled.
*
* If cachefile exists, script ends here and this function will never returns
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function responseFromCache(&$request)
{
$cachefile = get_cachefile(hash('md5', $request['url']));
if ($cachefile != '' && file_exists($cachefile)) {
$img = new Image(file_get_contents($cachefile), mime_content_type($cachefile));
self::responseImageHttpCache($img);
// stop.
}
return $cachefile;
}
/**
* Try to reply with image in database
*
* @param array $request Array from getRequestInfo
*
* If the image exists in database, then script ends here and this function will never returns
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function responseFromDB(&$request)
{
$photo = Photo::getPhoto($request['urlhash']);
if ($photo !== false) {
$img = Photo::getImageForPhoto($photo);
self::responseImageHttpCache($img);
// stop.
}
}
/**
* In case of an error just stop. We don't return content to avoid caching problems
*

View file

@ -78,7 +78,7 @@ class Acl extends BaseModule
$contacts = [];
foreach ($result as $contact) {
$contacts[] = [
'photo' => Contact::getMicro($contact, true),
'photo' => Contact::getMicro($contact, '', true),
'name' => htmlspecialchars($contact['name']),
'nick' => $contact['addr'] ?: $contact['url'],
'network' => $contact['network'],

View file

@ -111,7 +111,7 @@ class Account extends BaseDataTransferObject
$created = $userContactCreated < $publicContactCreated && ($userContactCreated != DBA::NULL_DATETIME) ? $userContactCreated : $publicContactCreated;
$this->created_at = DateTimeFormat::utc($created, DateTimeFormat::JSON);
$this->note = BBCode::convertForUriId($publicContact['uri-id'] ?? 0, $publicContact['about'], BBCode::EXTERNAL);
$this->note = BBCode::convert($publicContact['about'], false);
$this->url = $publicContact['url'];
$this->avatar = Contact::getAvatarUrlForId($userContact['id'] ?? 0 ?: $publicContact['id'], Proxy::SIZE_SMALL, $userContact['updated'] ?? '' ?: $publicContact['updated']);
$this->avatar_static = $this->avatar;

View file

@ -131,7 +131,7 @@ class Status extends BaseDataTransferObject
$this->muted = $userAttributes->muted;
$this->bookmarked = $userAttributes->bookmarked;
$this->pinned = $userAttributes->pinned;
$this->content = BBCode::convertForUriId($item['uri-id'], ($item['raw-body'] ?? $item['body']), BBCode::EXTERNAL);
$this->content = BBCode::convert($item['raw-body'] ?? $item['body'], false, BBCode::API);
$this->reblog = $reblog;
$this->application = $application->toArray();
$this->account = $account->toArray();

View file

@ -744,7 +744,7 @@ class Processor
$title = $matches[3];
}
$title = trim(BBCode::toPlaintext($title));
$title = trim(HTML::toPlaintext(BBCode::convert($title, false, BBCode::API, true), 0));
if (strlen($title) > 20) {
$title = substr($title, 0, 20) . '...';

View file

@ -333,8 +333,7 @@ class Receiver
$object_type = self::fetchObjectType($activity, $object_id, $uid);
// Fetch the content only on activities where this matters
// We can receive "#emojiReaction" when fetching content from Hubzilla systems
if (in_array($type, ['as:Create', 'as:Update', 'as:Announce']) || strpos($type, '#emojiReaction')) {
if (in_array($type, ['as:Create', 'as:Update', 'as:Announce'])) {
// Always fetch on "Announce"
$object_data = self::fetchObject($object_id, $activity['as:object'], $trust_source && ($type != 'as:Announce'), $uid);
if (empty($object_data)) {
@ -502,7 +501,7 @@ class Receiver
if (!empty($activity['from-relay'])) {
$object_data['from-relay'] = $activity['from-relay'];
}
switch ($type) {
case 'as:Create':
if (in_array($object_data['object_type'], self::CONTENT_TYPES)) {
@ -628,7 +627,7 @@ class Receiver
* @param array $activity
* @param string $actor
* @param array $tags
* @param boolean $fetch_unlisted
* @param boolean $fetch_unlisted
*
* @return array with receivers (user id)
* @throws \Exception
@ -688,7 +687,7 @@ class Receiver
$receivers[0] = ['uid' => 0, 'type' => self::TARGET_GLOBAL];
}
// Add receiver "-1" for unlisted posts
// Add receiver "-1" for unlisted posts
if ($fetch_unlisted && ($receiver == self::PUBLIC_COLLECTION) && ($element == 'as:cc')) {
$receivers[-1] = ['uid' => -1, 'type' => self::TARGET_GLOBAL];
}
@ -951,7 +950,7 @@ class Receiver
Logger::info('Empty id');
return false;
}
if ($id != $object_id) {
Logger::info('Fetched id differs from provided id', ['provided' => $object_id, 'fetched' => $id]);
return false;
@ -1233,7 +1232,7 @@ class Receiver
if (empty($object['as:url'])) {
return $object_data;
}
$urls = $object['as:url'];
$keys = array_keys($urls);
if (!is_numeric(array_pop($keys))) {
@ -1345,7 +1344,8 @@ class Receiver
// Some AP software allow formatted text in post location, so we run all the text converters we have to boil
// down to HTML and then finally format to plaintext.
$location = Markdown::convert($location);
$location = BBCode::toPlaintext($location);
$location = BBCode::convert($location);
$location = HTML::toPlaintext($location);
}
$object_data['sc:identifier'] = JsonLD::fetchElement($object, 'sc:identifier', '@value');

View file

@ -345,7 +345,7 @@ class Transmitter
}
if (!empty($owner['about'])) {
$data['summary'] = BBCode::convertForUriId($owner['uri-id'], $owner['about'], BBCode::EXTERNAL);
$data['summary'] = BBCode::convert($owner['about'], false);
}
$data['url'] = $owner['url'];
@ -1464,7 +1464,7 @@ class Transmitter
{
$event = [];
$event['name'] = $item['event-summary'];
$event['content'] = BBCode::convertForUriId($item['uri-id'], $item['event-desc'], BBCode::ACTIVITYPUB);
$event['content'] = BBCode::convert($item['event-desc'], false, BBCode::ACTIVITYPUB);
$event['startTime'] = DateTimeFormat::utc($item['event-start'] . '+00:00', DateTimeFormat::ATOM);
if (!$item['event-nofinish']) {
@ -1571,7 +1571,7 @@ class Transmitter
$regexp = "/[@!]\[url\=([^\[\]]*)\].*?\[\/url\]/ism";
$body = preg_replace_callback($regexp, ['self', 'mentionCallback'], $body);
$data['content'] = BBCode::convertForUriId($item['uri-id'], $body, BBCode::ACTIVITYPUB);
$data['content'] = BBCode::convert($body, false, BBCode::ACTIVITYPUB);
}
// The regular "content" field does contain a minimized HTML. This is done since systems like
@ -1583,7 +1583,7 @@ class Transmitter
$richbody = preg_replace_callback($regexp, ['self', 'mentionCallback'], $item['body']);
$richbody = BBCode::removeAttachment($richbody);
$data['contentMap'][$language] = BBCode::convertForUriId($item['uri-id'], $richbody, BBCode::EXTERNAL);
$data['contentMap'][$language] = BBCode::convert($richbody, false, BBCode::EXTERNAL);
}
$data['source'] = ['content' => $item['body'], 'mediaType' => "text/bbcode"];

View file

@ -765,13 +765,12 @@ class DFRN
* @param DOMDocument $doc XML document
* @param string $element Element name for the activity
* @param string $activity activity value
* @param int $uriid Uri-Id of the post
*
* @return \DOMElement XML activity object
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find proper type-hints
*/
private static function createActivity(DOMDocument $doc, $element, $activity, $uriid)
private static function createActivity(DOMDocument $doc, $element, $activity)
{
if ($activity) {
$entry = $doc->createElement($element);
@ -818,7 +817,7 @@ class DFRN
}
}
if ($r->content) {
XML::addElement($doc, $entry, "content", BBCode::convertForUriId($uriid, $r->content, BBCode::EXTERNAL), ["type" => "html"]);
XML::addElement($doc, $entry, "content", BBCode::convert($r->content), ["type" => "html"]);
}
return $entry;
@ -919,7 +918,7 @@ class DFRN
$htmlbody = "[b]" . $item['title'] . "[/b]\n\n" . $htmlbody;
}
$htmlbody = BBCode::convertForUriId($item['uri-id'], $htmlbody, BBCode::ACTIVITYPUB);
$htmlbody = BBCode::convert($htmlbody, false, BBCode::OSTATUS);
}
$author = self::addEntryAuthor($doc, "author", $item["author-link"], $item);
@ -1034,12 +1033,12 @@ class DFRN
XML::addElement($doc, $entry, "activity:object-type", Activity\ObjectType::COMMENT);
}
$actobj = self::createActivity($doc, "activity:object", $item['object'], $item['uri-id']);
$actobj = self::createActivity($doc, "activity:object", $item['object']);
if ($actobj) {
$entry->appendChild($actobj);
}
$actarg = self::createActivity($doc, "activity:target", $item['target'], $item['uri-id']);
$actarg = self::createActivity($doc, "activity:target", $item['target']);
if ($actarg) {
$entry->appendChild($actarg);
}

View file

@ -1107,9 +1107,9 @@ class Feed
XML::addElement($doc, $entry, "id", $item["uri"]);
XML::addElement($doc, $entry, "title", html_entity_decode($title, ENT_QUOTES, 'UTF-8'));
$body = OStatus::formatPicturePost($item['body'], $item['uri-id']);
$body = OStatus::formatPicturePost($item['body']);
$body = BBCode::convertForUriId($item['uri-id'], $body, BBCode::ACTIVITYPUB);
$body = BBCode::convert($body, false, BBCode::OSTATUS);
XML::addElement($doc, $entry, "content", $body, ["type" => "html"]);
@ -1186,7 +1186,7 @@ class Feed
private static function getTitle(array $item)
{
if ($item['title'] != '') {
return BBCode::convertForUriId($item['uri-id'], $item['title'], BBCode::ACTIVITYPUB);
return BBCode::convert($item['title'], false, BBCode::OSTATUS);
}
// Fetch information about the post
@ -1199,7 +1199,7 @@ class Feed
// Remove the share element before fetching the first line
$title = trim(preg_replace("/\[share.*?\](.*?)\[\/share\]/ism","\n$1\n",$item['body']));
$title = BBCode::toPlaintext($title)."\n";
$title = HTML::toPlaintext(BBCode::convert($title, false), 0, true)."\n";
$pos = strpos($title, "\n");
$trailer = "";
if (($pos == 0) || ($pos > 100)) {

View file

@ -1195,7 +1195,7 @@ class OStatus
* @return string The cleaned body
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function formatPicturePost($body, $uriid)
public static function formatPicturePost($body)
{
$siteinfo = BBCode::getAttachedData($body);
@ -1207,7 +1207,7 @@ class OStatus
}
// Is it a remote picture? Then make a smaller preview here
$preview = Post\Link::getByLink($uriid, $preview, ProxyUtils::SIZE_SMALL);
$preview = ProxyUtils::proxifyUrl($preview, false, ProxyUtils::SIZE_SMALL);
// Is it a local picture? Then make it smaller here
$preview = str_replace(["-0.jpg", "-0.png"], ["-2.jpg", "-2.png"], $preview);
@ -1418,7 +1418,7 @@ class OStatus
XML::addElement($doc, $author, "name", $owner["nick"]);
XML::addElement($doc, $author, "email", $owner["addr"]);
if ($show_profile) {
XML::addElement($doc, $author, "summary", BBCode::convertForUriId($owner['uri-id'], $owner["about"], BBCode::OSTATUS));
XML::addElement($doc, $author, "summary", BBCode::convert($owner["about"], false, BBCode::OSTATUS));
}
$attributes = ["rel" => "alternate", "type" => "text/html", "href" => $owner["url"]];
@ -1445,7 +1445,7 @@ class OStatus
XML::addElement($doc, $author, "poco:preferredUsername", $owner["nick"]);
XML::addElement($doc, $author, "poco:displayName", $owner["name"]);
if ($show_profile) {
XML::addElement($doc, $author, "poco:note", BBCode::convertForUriId($owner['uri-id'], $owner["about"], BBCode::OSTATUS));
XML::addElement($doc, $author, "poco:note", BBCode::convert($owner["about"], false, BBCode::OSTATUS));
if (trim($owner["location"]) != "") {
$element = $doc->createElement("poco:address");
@ -1803,7 +1803,7 @@ class OStatus
if (!$toplevel) {
if (!empty($item['title'])) {
$title = BBCode::convertForUriId($item['uri-id'], $item['title'], BBCode::OSTATUS);
$title = BBCode::convert($item['title'], false, BBCode::OSTATUS);
} else {
$title = sprintf("New note by %s", $owner["nick"]);
}
@ -1886,13 +1886,13 @@ class OStatus
XML::addElement($doc, $entry, "title", html_entity_decode($title, ENT_QUOTES, 'UTF-8'));
$body = Post\Media::addAttachmentsToBody($item['uri-id'], $item['body']);
$body = self::formatPicturePost($body, $item['uri-id']);
$body = self::formatPicturePost($body);
if (!empty($item['title'])) {
$body = "[b]".$item['title']."[/b]\n\n".$body;
}
$body = BBCode::convertForUriId($item['uri-id'], $body, BBCode::OSTATUS);
$body = BBCode::convert($body, false, BBCode::OSTATUS);
XML::addElement($doc, $entry, "content", $body, ["type" => "html"]);

View file

@ -193,7 +193,18 @@ class Images
$filesize = strlen($img_str);
try {
$data = @getimagesizefromstring($img_str);
if (function_exists("getimagesizefromstring")) {
$data = @getimagesizefromstring($img_str);
} else {
$tempfile = tempnam(get_temppath(), "cache");
$stamp1 = microtime(true);
file_put_contents($tempfile, $img_str);
DI::profiler()->saveTimestamp($stamp1, "file");
$data = getimagesize($tempfile);
unlink($tempfile);
}
} catch (\Exception $e) {
return [];
}

View file

@ -21,8 +21,6 @@
namespace Friendica\Util;
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
/**
@ -30,6 +28,12 @@ use Friendica\DI;
*/
class Proxy
{
/**
* Default time to keep images in proxy storage
*/
const DEFAULT_TIME = 86400; // 1 Day
/**
* Sizes constants
*/
@ -72,30 +76,55 @@ class Proxy
* Transform a remote URL into a local one.
*
* This function only performs the URL replacement on http URL and if the
* provided URL isn't local
* provided URL isn't local, "the isn't deactivated" (sic) and if the config
* system.proxy_disabled is set to false.
*
* @param string $url The URL to proxyfy
* @param bool $writemode Returns a local path the remote URL should be saved to
* @param string $size One of the ProxyUtils::SIZE_* constants
*
* @return string The proxyfied URL or relative path
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function proxifyUrl($url, $size = '')
public static function proxifyUrl($url, $writemode = false, $size = '')
{
// Get application instance
$a = DI::app();
// Trim URL first
$url = trim($url);
// Quit if not an HTTP/HTTPS link or if local
if (!in_array(parse_url($url, PHP_URL_SCHEME), ['http', 'https']) || self::isLocalImage($url)) {
// Is no http in front of it?
/// @TODO To weak test for being a valid URL
if (substr($url, 0, 4) !== 'http') {
return $url;
}
// Only continue if it isn't a local image and the isn't deactivated
if (self::isLocalImage($url)) {
$url = str_replace(Strings::normaliseLink(DI::baseUrl()) . '/', DI::baseUrl() . '/', $url);
return $url;
}
// Is the proxy disabled?
if (DI::config()->get('system', 'proxy_disabled')) {
return $url;
}
// Image URL may have encoded ampersands for display which aren't desirable for proxy
$url = html_entity_decode($url, ENT_NOQUOTES, 'utf-8');
// Creating a sub directory to reduce the amount of files in the cache directory
$basepath = $a->getBasePath() . '/proxy';
$shortpath = hash('md5', $url);
$longpath = substr($shortpath, 0, 2);
if (is_dir($basepath) && $writemode && !is_dir($basepath . '/' . $longpath)) {
mkdir($basepath . '/' . $longpath);
chmod($basepath . '/' . $longpath, 0777);
}
$longpath .= '/' . strtr(base64_encode($url), '+/', '-_');
// Extract the URL extension
@ -112,11 +141,14 @@ class Proxy
$size = ':' . $size;
}
Logger::info('Created proxy link', ['url' => $url, 'callstack' => System::callstack(20)]);
// Too long files aren't supported by Apache
if (strlen($proxypath) > 250) {
// Writemode in combination with long files shouldn't be possible
if ((strlen($proxypath) > 250) && $writemode) {
return $shortpath;
} elseif (strlen($proxypath) > 250) {
return DI::baseUrl() . '/proxy/' . $shortpath . '?url=' . urlencode($url);
} elseif ($writemode) {
return $longpath;
} else {
return $proxypath . $size;
}
@ -157,7 +189,11 @@ class Proxy
return true;
}
return Network::isLocalLink($url);
// links normalised - bug #431
$baseurl = Strings::normaliseLink(DI::baseUrl());
$url = Strings::normaliseLink($url);
return (substr($url, 0, strlen($baseurl)) == $baseurl);
}
/**

View file

@ -38,6 +38,29 @@ class ClearCache
// clear old cache
DI::cache()->clear();
// clear old item cache files
clear_cache();
// clear cache for photos
clear_cache($a->getBasePath(), $a->getBasePath() . "/photo");
// clear smarty cache
clear_cache($a->getBasePath() . "/view/smarty3/compiled", $a->getBasePath() . "/view/smarty3/compiled");
// clear cache for image proxy
if (!DI::config()->get("system", "proxy_disabled")) {
clear_cache($a->getBasePath(), $a->getBasePath() . "/proxy");
$cachetime = DI::config()->get('system', 'proxy_cache_time');
if (!$cachetime) {
$cachetime = ProxyUtils::DEFAULT_TIME;
}
$condition = ['`uid` = 0 AND `resource-id` LIKE "pic:%" AND `created` < NOW() - INTERVAL ? SECOND', $cachetime];
Photo::delete($condition);
}
// Delete the cached OEmbed entries that are older than three month
DBA::delete('oembed', ["`created` < NOW() - INTERVAL 3 MONTH"]);

View file

@ -183,10 +183,6 @@ class ExpirePosts
AND NOT EXISTS(SELECT `thr-parent-id` FROM `post-user` WHERE `thr-parent-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `external-id` FROM `post-user` WHERE `external-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `uri-id` FROM `mail` WHERE `uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `uri-id` FROM `event` WHERE `uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `uri-id` FROM `contact` WHERE `uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `uri-id` FROM `apcontact` WHERE `uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `uri-id` FROM `fcontact` WHERE `uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `parent-uri-id` FROM `mail` WHERE `parent-uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `thr-parent-id` FROM `mail` WHERE `thr-parent-id` = `item-uri`.`id`)", $item['uri-id']]);

View file

@ -55,7 +55,7 @@
use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1428);
define('DB_UPDATE_VERSION', 1424);
}
return [
@ -152,19 +152,6 @@ return [
"email" => ["email(64)"],
]
],
"item-uri" => [
"comment" => "URI and GUID for items",
"fields" => [
"id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"],
"uri" => ["type" => "varbinary(255)", "not null" => "1", "comment" => "URI of an item"],
"guid" => ["type" => "varbinary(255)", "comment" => "A unique identifier for an item"]
],
"indexes" => [
"PRIMARY" => ["id"],
"uri" => ["UNIQUE", "uri"],
"guid" => ["guid"]
]
],
"contact" => [
"comment" => "contact table",
"fields" => [
@ -196,7 +183,6 @@ return [
"dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the contact url"],
"addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
@ -274,8 +260,20 @@ return [
"uid_contact-type" => ["uid", "contact-type"],
"uid_self_contact-type" => ["uid", "self", "contact-type"],
"self_network_uid" => ["self", "network", "uid"],
"gsid" => ["gsid"],
"uri-id" => ["uri-id"],
"gsid" => ["gsid"]
]
],
"item-uri" => [
"comment" => "URI and GUID for items",
"fields" => [
"id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"],
"uri" => ["type" => "varbinary(255)", "not null" => "1", "comment" => "URI of an item"],
"guid" => ["type" => "varbinary(255)", "comment" => "A unique identifier for an item"]
],
"indexes" => [
"PRIMARY" => ["id"],
"uri" => ["UNIQUE", "uri"],
"guid" => ["guid"]
]
],
"tag" => [
@ -395,7 +393,6 @@ return [
"comment" => "ActivityPub compatible contacts - used in the ActivityPub implementation",
"fields" => [
"url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the contact"],
"uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the apcontact url"],
"uuid" => ["type" => "varchar(255)", "comment" => ""],
"type" => ["type" => "varchar(20)", "not null" => "1", "comment" => ""],
"following" => ["type" => "varchar(255)", "comment" => ""],
@ -429,8 +426,7 @@ return [
"followers" => ["followers(190)"],
"baseurl" => ["baseurl(190)"],
"sharedinbox" => ["sharedinbox(190)"],
"gsid" => ["gsid"],
"uri-id" => ["UNIQUE", "uri-id"],
"gsid" => ["gsid"]
]
],
"application" => [
@ -632,7 +628,6 @@ return [
"uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "Owner User id"],
"cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id"], "comment" => "contact_id (ID of the contact in contact table)"],
"uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the event uri"],
"created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
"edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
"start" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event start time"],
@ -653,7 +648,6 @@ return [
"PRIMARY" => ["id"],
"uid_start" => ["uid", "start"],
"cid" => ["cid"],
"uri-id" => ["uri-id"],
]
],
"fcontact" => [
@ -662,7 +656,6 @@ return [
"id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
"guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "unique id"],
"url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the fcontact url"],
"name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
@ -682,7 +675,6 @@ return [
"PRIMARY" => ["id"],
"addr" => ["addr(32)"],
"url" => ["UNIQUE", "url(190)"],
"uri-id" => ["UNIQUE", "uri-id"],
]
],
"fsuggest" => [
@ -1159,19 +1151,6 @@ return [
"PRIMARY" => ["uri-id"],
]
],
"post-link" => [
"comment" => "Post related external links",
"fields" => [
"id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
"uri-id" => ["type" => "int unsigned", "not null" => "1", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
"url" => ["type" => "varbinary(511)", "not null" => "1", "comment" => "External URL"],
"mimetype" => ["type" => "varchar(60)", "comment" => ""],
],
"indexes" => [
"PRIMARY" => ["id"],
"uri-id-url" => ["UNIQUE", "uri-id", "url"],
]
],
"post-media" => [
"comment" => "Attached media",
"fields" => [
@ -1332,7 +1311,6 @@ return [
"post-user-id" => ["post-user-id"],
"commented" => ["commented"],
"uid_received" => ["uid", "received"],
"uid_wall_received" => ["uid", "wall", "received"],
"uid_pinned" => ["uid", "pinned"],
"uid_commented" => ["uid", "commented"],
"uid_starred" => ["uid", "starred"],

View file

@ -729,7 +729,6 @@
"dfrn-id" => ["contact", "dfrn-id"],
"url" => ["contact", "url"],
"nurl" => ["contact", "nurl"],
"uri-id" => ["contact", "uri-id"],
"addr" => ["contact", "addr"],
"alias" => ["contact", "alias"],
"pubkey" => ["contact", "pubkey"],
@ -834,185 +833,6 @@
INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`
INNER JOIN `profile` ON `profile`.`uid` = `user`.`uid`"
],
"account-view" => [
"fields" => [
"id" => ["contact", "id"],
"url" => ["contact", "url"],
"nurl" => ["contact", "nurl"],
"uri-id" => ["contact", "uri-id"],
"addr" => ["contact", "addr"],
"alias" => ["contact", "alias"],
"name" => ["contact", "name"],
"nick" => ["contact", "nick"],
"about" => ["contact", "about"],
"keywords" => ["contact", "keywords"],
"xmpp" => ["contact", "xmpp"],
"avatar" => ["contact", "avatar"],
"photo" => ["contact", "photo"],
"thumb" => ["contact", "thumb"],
"micro" => ["contact", "micro"],
"header" => ["contact", "header"],
"created" => ["contact", "created"],
"updated" => ["contact", "updated"],
"network" => ["contact", "network"],
"protocol" => ["contact", "protocol"],
"location" => ["contact", "location"],
"attag" => ["contact", "attag"],
"pubkey" => ["contact", "pubkey"],
"prvkey" => ["contact", "prvkey"],
"subscribe" => ["contact", "subscribe"],
"last-update" => ["contact", "last-update"],
"success_update" => ["contact", "success_update"],
"failure_update" => ["contact", "failure_update"],
"failed" => ["contact", "failed"],
"last-item" => ["contact", "last-item"],
"last-discovery" => ["contact", "last-discovery"],
"contact-type" => ["contact", "contact-type"],
"manually-approve" => ["contact", "manually-approve"],
"unsearchable" => ["contact", "unsearchable"],
"sensitive" => ["contact", "sensitive"],
"baseurl" => ["contact", "baseurl"],
"gsid" => ["contact", "gsid"],
"info" => ["contact", "info"],
"bdyear" => ["contact", "bdyear"],
"bd" => ["contact", "bd"],
"poco" => ["contact", "poco"],
"name-date" => ["contact", "name-date"],
"uri-date" => ["contact", "uri-date"],
"avatar-date" => ["contact", "avatar-date"],
"term-date" => ["contact", "term-date"],
"global-ignored" => ["contact", "hidden"],
"global-blocked" => ["contact", "blocked"],
"hidden" => ["contact", "hidden"],
"archive" => ["contact", "archive"],
"deleted" => ["contact", "deleted"],
"blocked" => ["contact", "blocked"],
"dfrn-request" => ["contact", "request"],
"dfrn-notify" => ["contact", "notify"],
"dfrn-poll" => ["contact", "poll"],
"dfrn-confirm" => ["contact", "confirm"],
"diaspora-guid" => ["fcontact", "guid"],
"diaspora-batch" => ["fcontact", "batch"],
"diaspora-notify" => ["fcontact", "notify"],
"diaspora-poll" => ["fcontact", "poll"],
"diaspora-alias" => ["fcontact", "alias"],
"ap-uuid" => ["apcontact", "uuid"],
"ap-type" => ["apcontact", "type"],
"ap-following" => ["apcontact", "following"],
"ap-followers" => ["apcontact", "followers"],
"ap-inbox" => ["apcontact", "inbox"],
"ap-outbox" => ["apcontact", "outbox"],
"ap-sharedinbox" => ["apcontact", "sharedinbox"],
"ap-generator" => ["apcontact", "generator"],
"ap-following_count" => ["apcontact", "following_count"],
"ap-followers_count" => ["apcontact", "followers_count"],
"ap-statuses_count" => ["apcontact", "statuses_count"],
],
"query" => "FROM `contact`
LEFT JOIN `apcontact` ON `apcontact`.`uri-id` = `contact`.`uri-id`
LEFT JOIN `fcontact` ON `fcontact`.`uri-id` = contact.`uri-id`
WHERE `contact`.`uid` = 0"
],
"account-user-view" => [
"fields" => [
"id" => ["ucontact", "id"],
"pid" => ["contact", "id"],
"uid" => ["ucontact", "uid"],
"url" => ["contact", "url"],
"nurl" => ["contact", "nurl"],
"uri-id" => ["contact", "uri-id"],
"addr" => ["contact", "addr"],
"alias" => ["contact", "alias"],
"name" => ["contact", "name"],
"nick" => ["contact", "nick"],
"about" => ["contact", "about"],
"keywords" => ["contact", "keywords"],
"xmpp" => ["contact", "xmpp"],
"avatar" => ["contact", "avatar"],
"photo" => ["contact", "photo"],
"thumb" => ["contact", "thumb"],
"micro" => ["contact", "micro"],
"header" => ["contact", "header"],
"created" => ["contact", "created"],
"updated" => ["contact", "updated"],
"self" => ["ucontact", "self"],
"remote_self" => ["ucontact", "remote_self"],
"rel" => ["ucontact", "rel"],
"network" => ["contact", "network"],
"protocol" => ["ucontact", "protocol"],
"location" => ["contact", "location"],
"attag" => ["contact", "attag"],
"pubkey" => ["contact", "pubkey"],
"prvkey" => ["contact", "prvkey"],
"subscribe" => ["contact", "subscribe"],
"last-update" => ["contact", "last-update"],
"success_update" => ["contact", "success_update"],
"failure_update" => ["contact", "failure_update"],
"failed" => ["contact", "failed"],
"last-item" => ["contact", "last-item"],
"last-discovery" => ["contact", "last-discovery"],
"contact-type" => ["contact", "contact-type"],
"manually-approve" => ["contact", "manually-approve"],
"unsearchable" => ["contact", "unsearchable"],
"sensitive" => ["contact", "sensitive"],
"baseurl" => ["contact", "baseurl"],
"gsid" => ["contact", "gsid"],
"info" => ["contact", "info"],
"bdyear" => ["contact", "bdyear"],
"bd" => ["contact", "bd"],
"poco" => ["contact", "poco"],
"name-date" => ["contact", "name-date"],
"uri-date" => ["contact", "uri-date"],
"avatar-date" => ["contact", "avatar-date"],
"term-date" => ["contact", "term-date"],
"global-ignored" => ["contact", "hidden"],
"global-blocked" => ["contact", "blocked"],
"hidden" => ["ucontact", "hidden"],
"archive" => ["ucontact", "archive"],
"pending" => ["ucontact", "pending"],
"deleted" => ["ucontact", "deleted"],
"notify_new_posts" => ["ucontact", "notify_new_posts"],
"fetch_further_information" => ["ucontact", "fetch_further_information"],
"ffi_keyword_denylist" => ["ucontact", "ffi_keyword_denylist"],
"rating" => ["ucontact", "rating"],
"readonly" => ["ucontact", "readonly"],
"blocked" => ["ucontact", "blocked"],
"block_reason" => ["ucontact", "block_reason"],
"subhub" => ["ucontact", "subhub"],
"hub-verify" => ["ucontact", "hub-verify"],
"reason" => ["ucontact", "reason"],
"dfrn-duplex" => ["ucontact", "duplex"],
"dfrn-ret-aes" => ["ucontact", "ret-aes"],
"dfrn-site-pubkey" => ["ucontact", "site-pubkey"],
"dfrn-issued-id" => ["ucontact", "issued-id"],
"dfrn-id" => ["ucontact", "dfrn-id"],
"dfrn-aes_allow" => ["ucontact", "aes_allow"],
"dfrn-request" => ["contact", "request"],
"dfrn-notify" => ["contact", "notify"],
"dfrn-poll" => ["contact", "poll"],
"dfrn-confirm" => ["contact", "confirm"],
"diaspora-guid" => ["fcontact", "guid"],
"diaspora-batch" => ["fcontact", "batch"],
"diaspora-notify" => ["fcontact", "notify"],
"diaspora-poll" => ["fcontact", "poll"],
"diaspora-alias" => ["fcontact", "alias"],
"ap-uuid" => ["apcontact", "uuid"],
"ap-type" => ["apcontact", "type"],
"ap-following" => ["apcontact", "following"],
"ap-followers" => ["apcontact", "followers"],
"ap-inbox" => ["apcontact", "inbox"],
"ap-outbox" => ["apcontact", "outbox"],
"ap-sharedinbox" => ["apcontact", "sharedinbox"],
"ap-generator" => ["apcontact", "generator"],
"ap-following_count" => ["apcontact", "following_count"],
"ap-followers_count" => ["apcontact", "followers_count"],
"ap-statuses_count" => ["apcontact", "statuses_count"],
],
"query" => "FROM `contact` AS `ucontact`
INNER JOIN `contact` ON `contact`.`uri-id` = `ucontact`.`uri-id` AND `contact`.`uid` = 0
LEFT JOIN `apcontact` ON `apcontact`.`uri-id` = `ucontact`.`uri-id`
LEFT JOIN `fcontact` ON `fcontact`.`uri-id` = `ucontact`.`uri-id` AND `fcontact`.`network` = 'dspr'"
],
"pending-view" => [
"fields" => [
"id" => ["register", "id"],

View file

@ -570,6 +570,10 @@ return [
// xrd_timeout (Integer)
// Timeout in seconds for fetching the XRD links.
'xrd_timeout' => 20,
// proxy_file_chmod (Octal Integer like 0640)
// If set, defines the files permissions for downloaded files in the /proxy/ directory, default is system-dependent
'proxy_file_chmod' => 0,
],
'experimental' => [
// exp_themes (Boolean)

View file

@ -71,6 +71,95 @@ return [
'theme' => 'frio',
],
],
'contact' => [
[
'id' => 42,
'uid' => 42,
'name' => 'Self contact',
'nick' => 'selfcontact',
'self' => 1,
'nurl' => 'http://localhost/profile/selfcontact',
'url' => 'http://localhost/profile/selfcontact',
'about' => 'User used in tests',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::FOLLOWER,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
// Having the same name and nick allows us to test
// the fallback to api_get_nick() in api_get_user()
[
'id' => 43,
'uid' => 0,
'name' => 'othercontact',
'nick' => 'othercontact',
'self' => 0,
'nurl' => 'http://localhost/profile/othercontact',
'url' => 'http://localhost/profile/othercontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::NOTHING,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
[
'id' => 44,
'uid' => 42,
'name' => 'Friend contact',
'nick' => 'friendcontact',
'self' => 0,
'nurl' => 'http://localhost/profile/friendcontact',
'url' => 'http://localhost/profile/friendcontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::SHARING,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
[
'id' => 45,
'uid' => 0,
'name' => 'Friend contact',
'nick' => 'friendcontact',
'self' => 0,
'nurl' => 'http://localhost/profile/friendcontact',
'url' => 'http://localhost/profile/friendcontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::SHARING,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
[
'id' => 46,
'uid' => 42,
'name' => 'Mutual contact',
'nick' => 'mutualcontact',
'self' => 0,
'nurl' => 'http://localhost/profile/mutualcontact',
'url' => 'http://localhost/profile/mutualcontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::FRIEND,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
[
'id' => 47,
'uid' => 0,
'name' => 'Mutual contact',
'nick' => 'mutualcontact',
'self' => 0,
'nurl' => 'http://localhost/profile/mutualcontact',
'url' => 'http://localhost/profile/mutualcontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::SHARING,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
],
'item-uri' => [
[
'id' => 1,
@ -102,122 +191,6 @@ return [
'uri' => '6',
'guid' => '6',
],
[
'id' => 42,
'uri' => 'http://localhost/profile/selfcontact',
'guid' => '42',
],
[
'id' => 43,
'uri' => 'http://localhost/profile/othercontact',
'guid' => '43',
],
[
'id' => 44,
'uri' => 'http://localhost/profile/friendcontact',
'guid' => '44',
],
[
'id' => 46,
'uri' => 'http://localhost/profile/mutualcontact',
'guid' => '46',
],
],
'contact' => [
[
'id' => 42,
'uid' => 42,
'uri-id' => 42,
'name' => 'Self contact',
'nick' => 'selfcontact',
'self' => 1,
'nurl' => 'http://localhost/profile/selfcontact',
'url' => 'http://localhost/profile/selfcontact',
'about' => 'User used in tests',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::FOLLOWER,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
// Having the same name and nick allows us to test
// the fallback to api_get_nick() in api_get_user()
[
'id' => 43,
'uid' => 0,
'uri-id' => 43,
'name' => 'othercontact',
'nick' => 'othercontact',
'self' => 0,
'nurl' => 'http://localhost/profile/othercontact',
'url' => 'http://localhost/profile/othercontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::NOTHING,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
[
'id' => 44,
'uid' => 42,
'uri-id' => 44,
'name' => 'Friend contact',
'nick' => 'friendcontact',
'self' => 0,
'nurl' => 'http://localhost/profile/friendcontact',
'url' => 'http://localhost/profile/friendcontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::SHARING,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
[
'id' => 45,
'uid' => 0,
'uri-id' => 44,
'name' => 'Friend contact',
'nick' => 'friendcontact',
'self' => 0,
'nurl' => 'http://localhost/profile/friendcontact',
'url' => 'http://localhost/profile/friendcontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::SHARING,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
[
'id' => 46,
'uid' => 42,
'uri-id' => 46,
'name' => 'Mutual contact',
'nick' => 'mutualcontact',
'self' => 0,
'nurl' => 'http://localhost/profile/mutualcontact',
'url' => 'http://localhost/profile/mutualcontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::FRIEND,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
[
'id' => 47,
'uid' => 0,
'uri-id' => 46,
'name' => 'Mutual contact',
'nick' => 'mutualcontact',
'self' => 0,
'nurl' => 'http://localhost/profile/mutualcontact',
'url' => 'http://localhost/profile/mutualcontact',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::SHARING,
'network' => Protocol::DFRN,
'location' => 'DFRN',
],
],
'verb' => [
[

View file

@ -33,18 +33,10 @@ return [
'theme' => 'frio',
],
],
'item-uri' => [
[
'id' => 42,
'uri' => 'http://localhost/profile/selfcontact',
'guid' => '42',
],
],
'contact' => [
[
'id' => 42,
'uid' => 42,
'uri-id' => 42,
'name' => 'Self contact',
'nick' => 'selfcontact',
'self' => 1,

View file

@ -2192,9 +2192,9 @@ class ApiTest extends FixtureTest
public function testApiFormatMessages()
{
$result = api_format_messages(
['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'],
['id' => 3, 'uri-id' => 2, 'screen_name' => 'sender_name']
['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
['id' => 2, 'screen_name' => 'recipient_name'],
['id' => 3, 'screen_name' => 'sender_name']
);
self::assertEquals('item_title' . "\n" . 'item_body', $result['text']);
self::assertEquals(1, $result['id']);
@ -2213,9 +2213,9 @@ class ApiTest extends FixtureTest
{
$_GET['getText'] = 'html';
$result = api_format_messages(
['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'],
['id' => 3, 'uri-id' => 3, 'screen_name' => 'sender_name']
['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
['id' => 2, 'screen_name' => 'recipient_name'],
['id' => 3, 'screen_name' => 'sender_name']
);
self::assertEquals('item_title', $result['title']);
self::assertEquals('<strong>item_body</strong>', $result['text']);
@ -2230,9 +2230,9 @@ class ApiTest extends FixtureTest
{
$_GET['getText'] = 'plain';
$result = api_format_messages(
['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'],
['id' => 3, 'uri-id' => 3, 'screen_name' => 'sender_name']
['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
['id' => 2, 'screen_name' => 'recipient_name'],
['id' => 3, 'screen_name' => 'sender_name']
);
self::assertEquals('item_title', $result['title']);
self::assertEquals('item_body', $result['text']);
@ -2247,9 +2247,9 @@ class ApiTest extends FixtureTest
{
$_GET['getUserObjects'] = 'false';
$result = api_format_messages(
['id' => 1, 'uri-id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
['id' => 2, 'uri-id' => 2, 'screen_name' => 'recipient_name'],
['id' => 3, 'uri-id' => 3, 'screen_name' => 'sender_name']
['id' => 1, 'title' => 'item_title', 'body' => '[b]item_body[/b]'],
['id' => 2, 'screen_name' => 'recipient_name'],
['id' => 3, 'screen_name' => 'sender_name']
);
self::assertTrue(!isset($result['sender']));
self::assertTrue(!isset($result['recipient']));
@ -2344,7 +2344,7 @@ class ApiTest extends FixtureTest
public function testApiGetAttachments()
{
$body = 'body';
self::assertEmpty(api_get_attachments($body, 0));
self::assertEmpty(api_get_attachments($body));
}
/**
@ -2355,7 +2355,7 @@ class ApiTest extends FixtureTest
public function testApiGetAttachmentsWithImage()
{
$body = '[img]http://via.placeholder.com/1x1.png[/img]';
self::assertIsArray(api_get_attachments($body, 0));
self::assertIsArray(api_get_attachments($body));
}
/**
@ -2367,7 +2367,7 @@ class ApiTest extends FixtureTest
{
$_SERVER['HTTP_USER_AGENT'] = 'AndStatus';
$body = '[img]http://via.placeholder.com/1x1.png[/img]';
self::assertIsArray(api_get_attachments($body, 0));
self::assertIsArray(api_get_attachments($body));
}
/**
@ -2378,7 +2378,7 @@ class ApiTest extends FixtureTest
public function testApiGetEntitities()
{
$text = 'text';
self::assertIsArray(api_get_entitities($text, 'bbcode', 0));
self::assertIsArray(api_get_entitities($text, 'bbcode'));
}
/**
@ -2390,7 +2390,7 @@ class ApiTest extends FixtureTest
{
$_REQUEST['include_entities'] = 'true';
$text = 'text';
$result = api_get_entitities($text, 'bbcode', 0);
$result = api_get_entitities($text, 'bbcode');
self::assertIsArray($result['hashtags']);
self::assertIsArray($result['symbols']);
self::assertIsArray($result['urls']);

View file

@ -51,6 +51,9 @@ class BBCodeTest extends MockedTest
$this->configMock->shouldReceive('get')
->with('system', 'allowed_link_protocols')
->andReturn(null);
$this->configMock->shouldReceive('get')
->with('system', 'itemcache_duration')
->andReturn(-1);
$this->configMock->shouldReceive('get')
->with('system', 'url')
->andReturn('friendica.local');

View file

@ -151,36 +151,13 @@ span.connector {
}
/* Shared Messages */
.shared_header {
display: flex;
justify-content: space-between;
min-height: 32px;
color: #999;
border-top: 1px solid #D2D2D2;
padding-top: 5px;
margin-top: 5px;
}
.shared_header > .avatar {
display: block;
flex: 0 0 41px;
margin-inline-end: 9px;
}
.shared_header > .avatar > img {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.shared_header > .metadata {
flex: 1 0 auto;
}
.shared_header > .metadata > p {
margin: 0;
}
.shared_header > .preferences {
position: static;
flex: 0 0 auto;
}
.shared_header a {
-webkit-transition: all 0.2s ease-in-out;
@ -190,8 +167,16 @@ span.connector {
transition: all 0.2s ease-in-out;
}
.shared_header img {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
float: left;
margin-right: 9px;
}
blockquote.shared_content {
margin-inline-start: 32px;
margin-left: 32px;
color: #000;
border: none;
}

View file

@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 2021.09-dev\n"
"Project-Id-Version: 2021.06-rc\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-07-08 15:39+0000\n"
"POT-Creation-Date: 2021-06-27 23:18-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,29 +18,29 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
#: include/api.php:1135 src/Module/BaseApi.php:302
#: include/api.php:1136
#, php-format
msgid "Daily posting limit of %d post reached. The post was rejected."
msgid_plural "Daily posting limit of %d posts reached. The post was rejected."
msgstr[0] ""
msgstr[1] ""
#: include/api.php:1149 src/Module/BaseApi.php:318
#: include/api.php:1150
#, php-format
msgid "Weekly posting limit of %d post reached. The post was rejected."
msgid_plural "Weekly posting limit of %d posts reached. The post was rejected."
msgstr[0] ""
msgstr[1] ""
#: include/api.php:1163 src/Module/BaseApi.php:334
#: include/api.php:1164
#, php-format
msgid "Monthly posting limit of %d post reached. The post was rejected."
msgstr ""
#: include/api.php:4500 mod/photos.php:106 mod/photos.php:210
#: mod/photos.php:638 mod/photos.php:1042 mod/photos.php:1059
#: mod/photos.php:1608 src/Model/User.php:1114 src/Model/User.php:1122
#: src/Model/User.php:1130 src/Module/Settings/Profile/Photo/Crop.php:98
#: include/api.php:4527 mod/photos.php:107 mod/photos.php:211
#: mod/photos.php:639 mod/photos.php:1043 mod/photos.php:1060
#: mod/photos.php:1609 src/Model/User.php:1105 src/Model/User.php:1113
#: src/Model/User.php:1121 src/Module/Settings/Profile/Photo/Crop.php:98
#: src/Module/Settings/Profile/Photo/Crop.php:114
#: src/Module/Settings/Profile/Photo/Crop.php:130
#: src/Module/Settings/Profile/Photo/Crop.php:176
@ -49,178 +49,178 @@ msgstr ""
msgid "Profile Photos"
msgstr ""
#: include/conversation.php:196
#: include/conversation.php:195
#, php-format
msgid "%1$s poked %2$s"
msgstr ""
#: include/conversation.php:228 src/Model/Item.php:2606
#: include/conversation.php:227 src/Model/Item.php:2609
msgid "event"
msgstr ""
#: include/conversation.php:231 include/conversation.php:240 mod/tagger.php:90
#: include/conversation.php:230 include/conversation.php:239 mod/tagger.php:90
msgid "status"
msgstr ""
#: include/conversation.php:236 mod/tagger.php:90 src/Model/Item.php:2608
#: include/conversation.php:235 mod/tagger.php:90 src/Model/Item.php:2611
msgid "photo"
msgstr ""
#: include/conversation.php:250 mod/tagger.php:123
#: include/conversation.php:249 mod/tagger.php:123
#, php-format
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
#: include/conversation.php:565 mod/photos.php:1469 src/Object/Post.php:226
#: include/conversation.php:564 mod/photos.php:1470 src/Object/Post.php:226
msgid "Select"
msgstr ""
#: include/conversation.php:566 mod/photos.php:1470 mod/settings.php:636
#: include/conversation.php:565 mod/photos.php:1471 mod/settings.php:636
#: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140
#: src/Module/Admin/Users/Index.php:153 src/Module/Contact.php:894
#: src/Module/Contact.php:1198
msgid "Delete"
msgstr ""
#: include/conversation.php:601 src/Object/Post.php:453 src/Object/Post.php:454
#: include/conversation.php:600 src/Object/Post.php:453 src/Object/Post.php:454
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
#: include/conversation.php:614 src/Object/Post.php:441
#: include/conversation.php:613 src/Object/Post.php:441
msgid "Categories:"
msgstr ""
#: include/conversation.php:615 src/Object/Post.php:442
#: include/conversation.php:614 src/Object/Post.php:442
msgid "Filed under:"
msgstr ""
#: include/conversation.php:622 src/Object/Post.php:467
#: include/conversation.php:621 src/Object/Post.php:467
#, php-format
msgid "%s from %s"
msgstr ""
#: include/conversation.php:637
#: include/conversation.php:636
msgid "View in context"
msgstr ""
#: include/conversation.php:639 include/conversation.php:1223
#: include/conversation.php:638 include/conversation.php:1222
#: mod/editpost.php:104 mod/message.php:204 mod/message.php:374
#: mod/photos.php:1535 mod/wallmessage.php:155 src/Module/Item/Compose.php:159
#: mod/photos.php:1536 mod/wallmessage.php:155 src/Module/Item/Compose.php:159
#: src/Object/Post.php:501
msgid "Please wait"
msgstr ""
#: include/conversation.php:703
#: include/conversation.php:702
msgid "remove"
msgstr ""
#: include/conversation.php:708
#: include/conversation.php:707
msgid "Delete Selected Items"
msgstr ""
#: include/conversation.php:743 include/conversation.php:746
#: include/conversation.php:749 include/conversation.php:752
#: include/conversation.php:742 include/conversation.php:745
#: include/conversation.php:748 include/conversation.php:751
#, php-format
msgid "You had been addressed (%s)."
msgstr ""
#: include/conversation.php:755
#: include/conversation.php:754
#, php-format
msgid "You are following %s."
msgstr ""
#: include/conversation.php:758
#: include/conversation.php:757
msgid "Tagged"
msgstr ""
#: include/conversation.php:771 include/conversation.php:1115
#: include/conversation.php:1153
#: include/conversation.php:770 include/conversation.php:1114
#: include/conversation.php:1152
#, php-format
msgid "%s reshared this."
msgstr ""
#: include/conversation.php:773
#: include/conversation.php:772
msgid "Reshared"
msgstr ""
#: include/conversation.php:773
#: include/conversation.php:772
#, php-format
msgid "Reshared by %s <%s>"
msgstr ""
#: include/conversation.php:776
#: include/conversation.php:775
#, php-format
msgid "%s is participating in this thread."
msgstr ""
#: include/conversation.php:779
#: include/conversation.php:778
msgid "Stored"
msgstr ""
#: include/conversation.php:782
#: include/conversation.php:781
msgid "Global"
msgstr ""
#: include/conversation.php:785
#: include/conversation.php:784
msgid "Relayed"
msgstr ""
#: include/conversation.php:785
#: include/conversation.php:784
#, php-format
msgid "Relayed by %s <%s>"
msgstr ""
#: include/conversation.php:788
#: include/conversation.php:787
msgid "Fetched"
msgstr ""
#: include/conversation.php:788
#: include/conversation.php:787
#, php-format
msgid "Fetched because of %s <%s>"
msgstr ""
#: include/conversation.php:948 view/theme/frio/theme.php:323
#: include/conversation.php:947 view/theme/frio/theme.php:323
msgid "Follow Thread"
msgstr ""
#: include/conversation.php:949 src/Model/Contact.php:1002
#: include/conversation.php:948 src/Model/Contact.php:1002
msgid "View Status"
msgstr ""
#: include/conversation.php:950 include/conversation.php:972
#: include/conversation.php:949 include/conversation.php:971
#: src/Model/Contact.php:928 src/Model/Contact.php:994
#: src/Model/Contact.php:1003 src/Module/Directory.php:166
#: src/Module/Settings/Profile/Index.php:224
msgid "View Profile"
msgstr ""
#: include/conversation.php:951 src/Model/Contact.php:1004
#: include/conversation.php:950 src/Model/Contact.php:1004
msgid "View Photos"
msgstr ""
#: include/conversation.php:952 src/Model/Contact.php:995
#: include/conversation.php:951 src/Model/Contact.php:995
#: src/Model/Contact.php:1005
msgid "Network Posts"
msgstr ""
#: include/conversation.php:953 src/Model/Contact.php:996
#: include/conversation.php:952 src/Model/Contact.php:996
#: src/Model/Contact.php:1006
msgid "View Contact"
msgstr ""
#: include/conversation.php:954 src/Model/Contact.php:1008
#: include/conversation.php:953 src/Model/Contact.php:1008
msgid "Send PM"
msgstr ""
#: include/conversation.php:955 src/Module/Admin/Blocklist/Contact.php:84
#: include/conversation.php:954 src/Module/Admin/Blocklist/Contact.php:84
#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154
#: src/Module/Contact.php:633 src/Module/Contact.php:891
#: src/Module/Contact.php:1173
msgid "Block"
msgstr ""
#: include/conversation.php:956 src/Module/Contact.php:634
#: include/conversation.php:955 src/Module/Contact.php:634
#: src/Module/Contact.php:892 src/Module/Contact.php:1181
#: src/Module/Notifications/Introductions.php:113
#: src/Module/Notifications/Introductions.php:191
@ -228,273 +228,273 @@ msgstr ""
msgid "Ignore"
msgstr ""
#: include/conversation.php:960 src/Object/Post.php:428
#: include/conversation.php:959 src/Object/Post.php:428
msgid "Languages"
msgstr ""
#: include/conversation.php:964 src/Model/Contact.php:1009
#: include/conversation.php:963 src/Model/Contact.php:1009
msgid "Poke"
msgstr ""
#: include/conversation.php:969 mod/follow.php:146 src/Content/Widget.php:76
#: include/conversation.php:968 mod/follow.php:146 src/Content/Widget.php:76
#: src/Model/Contact.php:997 src/Model/Contact.php:1010
#: view/theme/vier/theme.php:172
msgid "Connect/Follow"
msgstr ""
#: include/conversation.php:1100
#: include/conversation.php:1099
#, php-format
msgid "%s likes this."
msgstr ""
#: include/conversation.php:1103
#: include/conversation.php:1102
#, php-format
msgid "%s doesn't like this."
msgstr ""
#: include/conversation.php:1106
#: include/conversation.php:1105
#, php-format
msgid "%s attends."
msgstr ""
#: include/conversation.php:1109
#: include/conversation.php:1108
#, php-format
msgid "%s doesn't attend."
msgstr ""
#: include/conversation.php:1112
#: include/conversation.php:1111
#, php-format
msgid "%s attends maybe."
msgstr ""
#: include/conversation.php:1121
#: include/conversation.php:1120
msgid "and"
msgstr ""
#: include/conversation.php:1124
#: include/conversation.php:1123
#, php-format
msgid "and %d other people"
msgstr ""
#: include/conversation.php:1132
#: include/conversation.php:1131
#, php-format
msgid "<span %1$s>%2$d people</span> like this"
msgstr ""
#: include/conversation.php:1133
#: include/conversation.php:1132
#, php-format
msgid "%s like this."
msgstr ""
#: include/conversation.php:1136
#: include/conversation.php:1135
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this"
msgstr ""
#: include/conversation.php:1137
#: include/conversation.php:1136
#, php-format
msgid "%s don't like this."
msgstr ""
#: include/conversation.php:1140
#: include/conversation.php:1139
#, php-format
msgid "<span %1$s>%2$d people</span> attend"
msgstr ""
#: include/conversation.php:1141
#: include/conversation.php:1140
#, php-format
msgid "%s attend."
msgstr ""
#: include/conversation.php:1144
#: include/conversation.php:1143
#, php-format
msgid "<span %1$s>%2$d people</span> don't attend"
msgstr ""
#: include/conversation.php:1145
#: include/conversation.php:1144
#, php-format
msgid "%s don't attend."
msgstr ""
#: include/conversation.php:1148
#: include/conversation.php:1147
#, php-format
msgid "<span %1$s>%2$d people</span> attend maybe"
msgstr ""
#: include/conversation.php:1149
#: include/conversation.php:1148
#, php-format
msgid "%s attend maybe."
msgstr ""
#: include/conversation.php:1152
#: include/conversation.php:1151
#, php-format
msgid "<span %1$s>%2$d people</span> reshared this"
msgstr ""
#: include/conversation.php:1182
#: include/conversation.php:1181
msgid "Visible to <strong>everybody</strong>"
msgstr ""
#: include/conversation.php:1183 src/Module/Item/Compose.php:153
#: include/conversation.php:1182 src/Module/Item/Compose.php:153
#: src/Object/Post.php:970
msgid "Please enter a image/video/audio/webpage URL:"
msgstr ""
#: include/conversation.php:1184
#: include/conversation.php:1183
msgid "Tag term:"
msgstr ""
#: include/conversation.php:1185 src/Module/Filer/SaveTag.php:69
#: include/conversation.php:1184 src/Module/Filer/SaveTag.php:69
msgid "Save to Folder:"
msgstr ""
#: include/conversation.php:1186
#: include/conversation.php:1185
msgid "Where are you right now?"
msgstr ""
#: include/conversation.php:1187
#: include/conversation.php:1186
msgid "Delete item(s)?"
msgstr ""
#: include/conversation.php:1197
#: include/conversation.php:1196
msgid "New Post"
msgstr ""
#: include/conversation.php:1200
#: include/conversation.php:1199
msgid "Share"
msgstr ""
#: include/conversation.php:1201 mod/editpost.php:89 mod/photos.php:1381
#: include/conversation.php:1200 mod/editpost.php:89 mod/photos.php:1382
#: src/Module/Contact/Poke.php:154 src/Object/Post.php:961
msgid "Loading..."
msgstr ""
#: include/conversation.php:1202 mod/editpost.php:90 mod/message.php:202
#: include/conversation.php:1201 mod/editpost.php:90 mod/message.php:202
#: mod/message.php:371 mod/wallmessage.php:153
msgid "Upload photo"
msgstr ""
#: include/conversation.php:1203 mod/editpost.php:91
#: include/conversation.php:1202 mod/editpost.php:91
msgid "upload photo"
msgstr ""
#: include/conversation.php:1204 mod/editpost.php:92
#: include/conversation.php:1203 mod/editpost.php:92
msgid "Attach file"
msgstr ""
#: include/conversation.php:1205 mod/editpost.php:93
#: include/conversation.php:1204 mod/editpost.php:93
msgid "attach file"
msgstr ""
#: include/conversation.php:1206 src/Module/Item/Compose.php:145
#: include/conversation.php:1205 src/Module/Item/Compose.php:145
#: src/Object/Post.php:962
msgid "Bold"
msgstr ""
#: include/conversation.php:1207 src/Module/Item/Compose.php:146
#: include/conversation.php:1206 src/Module/Item/Compose.php:146
#: src/Object/Post.php:963
msgid "Italic"
msgstr ""
#: include/conversation.php:1208 src/Module/Item/Compose.php:147
#: include/conversation.php:1207 src/Module/Item/Compose.php:147
#: src/Object/Post.php:964
msgid "Underline"
msgstr ""
#: include/conversation.php:1209 src/Module/Item/Compose.php:148
#: include/conversation.php:1208 src/Module/Item/Compose.php:148
#: src/Object/Post.php:965
msgid "Quote"
msgstr ""
#: include/conversation.php:1210 src/Module/Item/Compose.php:149
#: include/conversation.php:1209 src/Module/Item/Compose.php:149
#: src/Object/Post.php:966
msgid "Code"
msgstr ""
#: include/conversation.php:1211 src/Module/Item/Compose.php:150
#: include/conversation.php:1210 src/Module/Item/Compose.php:150
#: src/Object/Post.php:967
msgid "Image"
msgstr ""
#: include/conversation.php:1212 src/Module/Item/Compose.php:151
#: include/conversation.php:1211 src/Module/Item/Compose.php:151
#: src/Object/Post.php:968
msgid "Link"
msgstr ""
#: include/conversation.php:1213 src/Module/Item/Compose.php:152
#: include/conversation.php:1212 src/Module/Item/Compose.php:152
#: src/Object/Post.php:969
msgid "Link or Media"
msgstr ""
#: include/conversation.php:1214
#: include/conversation.php:1213
msgid "Video"
msgstr ""
#: include/conversation.php:1215 mod/editpost.php:100
#: include/conversation.php:1214 mod/editpost.php:100
#: src/Module/Item/Compose.php:155
msgid "Set your location"
msgstr ""
#: include/conversation.php:1216 mod/editpost.php:101
#: include/conversation.php:1215 mod/editpost.php:101
msgid "set location"
msgstr ""
#: include/conversation.php:1217 mod/editpost.php:102
#: include/conversation.php:1216 mod/editpost.php:102
msgid "Clear browser location"
msgstr ""
#: include/conversation.php:1218 mod/editpost.php:103
#: include/conversation.php:1217 mod/editpost.php:103
msgid "clear location"
msgstr ""
#: include/conversation.php:1220 mod/editpost.php:117
#: include/conversation.php:1219 mod/editpost.php:117
#: src/Module/Item/Compose.php:160
msgid "Set title"
msgstr ""
#: include/conversation.php:1222 mod/editpost.php:119
#: include/conversation.php:1221 mod/editpost.php:119
#: src/Module/Item/Compose.php:161
msgid "Categories (comma-separated list)"
msgstr ""
#: include/conversation.php:1224 mod/editpost.php:105
#: include/conversation.php:1223 mod/editpost.php:105
msgid "Permission settings"
msgstr ""
#: include/conversation.php:1225 mod/editpost.php:134 mod/events.php:578
#: mod/photos.php:968 mod/photos.php:1334
#: include/conversation.php:1224 mod/editpost.php:134 mod/events.php:578
#: mod/photos.php:969 mod/photos.php:1335
msgid "Permissions"
msgstr ""
#: include/conversation.php:1234 mod/editpost.php:114
#: include/conversation.php:1233 mod/editpost.php:114
msgid "Public post"
msgstr ""
#: include/conversation.php:1238 mod/editpost.php:125 mod/events.php:573
#: mod/photos.php:1380 mod/photos.php:1437 mod/photos.php:1512
#: include/conversation.php:1237 mod/editpost.php:125 mod/events.php:573
#: mod/photos.php:1381 mod/photos.php:1438 mod/photos.php:1513
#: src/Module/Item/Compose.php:154 src/Object/Post.php:971
msgid "Preview"
msgstr ""
#: include/conversation.php:1242 mod/dfrn_request.php:642 mod/editpost.php:128
#: include/conversation.php:1241 mod/dfrn_request.php:642 mod/editpost.php:128
#: mod/fbrowser.php:105 mod/fbrowser.php:134 mod/follow.php:152
#: mod/photos.php:1036 mod/photos.php:1142 mod/tagrm.php:37 mod/tagrm.php:129
#: mod/photos.php:1037 mod/photos.php:1143 mod/tagrm.php:37 mod/tagrm.php:129
#: mod/unfollow.php:100 src/Module/Contact.php:467
#: src/Module/RemoteFollow.php:110
msgid "Cancel"
msgstr ""
#: include/conversation.php:1249 mod/editpost.php:132 src/Model/Profile.php:510
#: include/conversation.php:1248 mod/editpost.php:132 src/Model/Profile.php:524
#: src/Module/Contact.php:344
msgid "Message"
msgstr ""
#: include/conversation.php:1250 mod/editpost.php:133
#: include/conversation.php:1249 mod/editpost.php:133
#: src/Module/Settings/TwoFactor/Trusted.php:101
msgid "Browser"
msgstr ""
#: include/conversation.php:1252 mod/editpost.php:136
#: include/conversation.php:1251 mod/editpost.php:136
msgid "Open Compose page"
msgstr ""
@ -826,15 +826,15 @@ msgstr ""
#: mod/api.php:52 mod/api.php:57 mod/dfrn_confirm.php:78 mod/editpost.php:37
#: mod/events.php:231 mod/follow.php:55 mod/follow.php:135 mod/item.php:185
#: mod/item.php:190 mod/item.php:917 mod/message.php:69 mod/message.php:112
#: mod/notes.php:44 mod/ostatus_subscribe.php:30 mod/photos.php:175
#: mod/photos.php:921 mod/repair_ostatus.php:31 mod/settings.php:47
#: mod/notes.php:44 mod/ostatus_subscribe.php:30 mod/photos.php:176
#: mod/photos.php:922 mod/repair_ostatus.php:31 mod/settings.php:47
#: mod/settings.php:65 mod/settings.php:475 mod/suggest.php:34
#: mod/uimport.php:32 mod/unfollow.php:35 mod/unfollow.php:50
#: mod/unfollow.php:82 mod/wall_attach.php:78 mod/wall_attach.php:81
#: mod/wall_upload.php:99 mod/wall_upload.php:102 mod/wallmessage.php:35
#: mod/wallmessage.php:59 mod/wallmessage.php:96 mod/wallmessage.php:120
#: src/Module/Attach.php:56 src/Module/BaseApi.php:81 src/Module/BaseApi.php:92
#: src/Module/BaseApi.php:103 src/Module/BaseApi.php:114
#: src/Module/Attach.php:56 src/Module/BaseApi.php:79 src/Module/BaseApi.php:90
#: src/Module/BaseApi.php:101 src/Module/BaseApi.php:112
#: src/Module/BaseNotifications.php:88 src/Module/Contact.php:385
#: src/Module/Contact/Advanced.php:43 src/Module/Delegation.php:118
#: src/Module/FollowConfirm.php:16 src/Module/FriendSuggest.php:44
@ -897,7 +897,7 @@ msgstr ""
#: mod/cal.php:72 mod/cal.php:133 src/Module/HoverCard.php:53
#: src/Module/Profile/Common.php:41 src/Module/Profile/Common.php:53
#: src/Module/Profile/Contacts.php:40 src/Module/Profile/Contacts.php:51
#: src/Module/Profile/Status.php:58 src/Module/Register.php:254
#: src/Module/Profile/Status.php:58 src/Module/Register.php:258
msgid "User not found."
msgstr ""
@ -926,21 +926,21 @@ msgstr ""
msgid "Next"
msgstr ""
#: mod/cal.php:280 mod/events.php:426 src/Model/Event.php:464
#: mod/cal.php:280 mod/events.php:426 src/Model/Event.php:463
msgid "today"
msgstr ""
#: mod/cal.php:281 mod/events.php:427 src/Model/Event.php:465
#: mod/cal.php:281 mod/events.php:427 src/Model/Event.php:464
#: src/Util/Temporal.php:330
msgid "month"
msgstr ""
#: mod/cal.php:282 mod/events.php:428 src/Model/Event.php:466
#: mod/cal.php:282 mod/events.php:428 src/Model/Event.php:465
#: src/Util/Temporal.php:331
msgid "week"
msgstr ""
#: mod/cal.php:283 mod/events.php:429 src/Model/Event.php:467
#: mod/cal.php:283 mod/events.php:429 src/Model/Event.php:466
#: src/Util/Temporal.php:332
msgid "day"
msgstr ""
@ -949,7 +949,7 @@ msgstr ""
msgid "list"
msgstr ""
#: mod/cal.php:297 src/Console/User.php:182 src/Model/User.php:676
#: mod/cal.php:297 src/Console/User.php:182 src/Model/User.php:667
#: src/Module/Admin/Users/Active.php:73 src/Module/Admin/Users/Blocked.php:74
#: src/Module/Admin/Users/Index.php:80 src/Module/Admin/Users/Pending.php:71
#: src/Module/Api/Twitter/ContactEndpoint.php:71
@ -1115,11 +1115,11 @@ msgstr ""
msgid "Invalid profile URL."
msgstr ""
#: mod/dfrn_request.php:355 src/Model/Contact.php:2284
#: mod/dfrn_request.php:355 src/Model/Contact.php:2233
msgid "Disallowed profile URL."
msgstr ""
#: mod/dfrn_request.php:361 src/Model/Contact.php:2289
#: mod/dfrn_request.php:361 src/Model/Contact.php:2238
#: src/Module/Friendica.php:80
msgid "Blocked domain"
msgstr ""
@ -1166,8 +1166,8 @@ msgstr ""
msgid "Please confirm your introduction/connection request to %s."
msgstr ""
#: mod/dfrn_request.php:600 mod/display.php:179 mod/photos.php:835
#: mod/videos.php:128 src/Module/Conversation/Community.php:188
#: mod/dfrn_request.php:600 mod/display.php:179 mod/photos.php:836
#: mod/videos.php:129 src/Module/Conversation/Community.php:188
#: src/Module/Debug/Probe.php:39 src/Module/Debug/WebFinger.php:38
#: src/Module/Directory.php:49 src/Module/Search/Index.php:50
#: src/Module/Search/Index.php:55
@ -1329,7 +1329,7 @@ msgid "Description:"
msgstr ""
#: mod/events.php:563 src/Model/Event.php:84 src/Model/Event.php:111
#: src/Model/Event.php:473 src/Model/Event.php:960 src/Model/Profile.php:420
#: src/Model/Event.php:472 src/Model/Event.php:959 src/Model/Profile.php:434
#: src/Module/Contact.php:654 src/Module/Directory.php:156
#: src/Module/Notifications/Introductions.php:172
#: src/Module/Profile/Profile.php:190
@ -1345,8 +1345,8 @@ msgid "Share this event"
msgstr ""
#: mod/events.php:575 mod/message.php:205 mod/message.php:373
#: mod/photos.php:950 mod/photos.php:1053 mod/photos.php:1338
#: mod/photos.php:1379 mod/photos.php:1436 mod/photos.php:1511
#: mod/photos.php:951 mod/photos.php:1054 mod/photos.php:1339
#: mod/photos.php:1380 mod/photos.php:1437 mod/photos.php:1512
#: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:612
#: src/Module/Contact/Advanced.php:132 src/Module/Contact/Poke.php:155
#: src/Module/Debug/ActivityPubConversion.php:141
@ -1366,7 +1366,7 @@ msgstr ""
msgid "Basic"
msgstr ""
#: mod/events.php:577 src/Module/Admin/Site.php:573 src/Module/Contact.php:961
#: mod/events.php:577 src/Module/Admin/Site.php:584 src/Module/Contact.php:961
#: src/Module/Profile/Profile.php:245
msgid "Advanced"
msgstr ""
@ -1766,257 +1766,257 @@ msgstr ""
msgid "Keep this window open until done."
msgstr ""
#: mod/photos.php:128 src/Module/BaseProfile.php:71
#: mod/photos.php:129 src/Module/BaseProfile.php:71
msgid "Photo Albums"
msgstr ""
#: mod/photos.php:129 mod/photos.php:1637
#: mod/photos.php:130 mod/photos.php:1638
msgid "Recent Photos"
msgstr ""
#: mod/photos.php:131 mod/photos.php:1104 mod/photos.php:1639
#: mod/photos.php:132 mod/photos.php:1105 mod/photos.php:1640
msgid "Upload New Photos"
msgstr ""
#: mod/photos.php:149 src/Module/BaseSettings.php:37
#: mod/photos.php:150 src/Module/BaseSettings.php:37
msgid "everybody"
msgstr ""
#: mod/photos.php:182
#: mod/photos.php:183
msgid "Contact information unavailable"
msgstr ""
#: mod/photos.php:221
#: mod/photos.php:222
msgid "Album not found."
msgstr ""
#: mod/photos.php:279
#: mod/photos.php:280
msgid "Album successfully deleted"
msgstr ""
#: mod/photos.php:281
#: mod/photos.php:282
msgid "Album was empty."
msgstr ""
#: mod/photos.php:313
#: mod/photos.php:314
msgid "Failed to delete the photo."
msgstr ""
#: mod/photos.php:588
#: mod/photos.php:589
msgid "a photo"
msgstr ""
#: mod/photos.php:588
#: mod/photos.php:589
#, php-format
msgid "%1$s was tagged in %2$s by %3$s"
msgstr ""
#: mod/photos.php:671 mod/photos.php:674 mod/photos.php:701
#: mod/photos.php:672 mod/photos.php:675 mod/photos.php:702
#: mod/wall_upload.php:216 src/Module/Settings/Profile/Photo/Index.php:61
#, php-format
msgid "Image exceeds size limit of %s"
msgstr ""
#: mod/photos.php:677
#: mod/photos.php:678
msgid "Image upload didn't complete, please try again"
msgstr ""
#: mod/photos.php:680
#: mod/photos.php:681
msgid "Image file is missing"
msgstr ""
#: mod/photos.php:685
#: mod/photos.php:686
msgid ""
"Server can't accept new file upload at this time, please contact your "
"administrator"
msgstr ""
#: mod/photos.php:709
#: mod/photos.php:710
msgid "Image file is empty."
msgstr ""
#: mod/photos.php:724 mod/wall_upload.php:175
#: mod/photos.php:725 mod/wall_upload.php:175
#: src/Module/Settings/Profile/Photo/Index.php:70
msgid "Unable to process image."
msgstr ""
#: mod/photos.php:753 mod/wall_upload.php:241
#: mod/photos.php:754 mod/wall_upload.php:241
#: src/Module/Settings/Profile/Photo/Index.php:97
msgid "Image upload failed."
msgstr ""
#: mod/photos.php:840
#: mod/photos.php:841
msgid "No photos selected"
msgstr ""
#: mod/photos.php:906 mod/videos.php:181
#: mod/photos.php:907 mod/videos.php:182
msgid "Access to this item is restricted."
msgstr ""
#: mod/photos.php:960
#: mod/photos.php:961
msgid "Upload Photos"
msgstr ""
#: mod/photos.php:964 mod/photos.php:1049
#: mod/photos.php:965 mod/photos.php:1050
msgid "New album name: "
msgstr ""
#: mod/photos.php:965
#: mod/photos.php:966
msgid "or select existing album:"
msgstr ""
#: mod/photos.php:966
#: mod/photos.php:967
msgid "Do not show a status post for this upload"
msgstr ""
#: mod/photos.php:1032
#: mod/photos.php:1033
msgid "Do you really want to delete this photo album and all its photos?"
msgstr ""
#: mod/photos.php:1033 mod/photos.php:1054
#: mod/photos.php:1034 mod/photos.php:1055
msgid "Delete Album"
msgstr ""
#: mod/photos.php:1060
#: mod/photos.php:1061
msgid "Edit Album"
msgstr ""
#: mod/photos.php:1061
#: mod/photos.php:1062
msgid "Drop Album"
msgstr ""
#: mod/photos.php:1066
#: mod/photos.php:1067
msgid "Show Newest First"
msgstr ""
#: mod/photos.php:1068
#: mod/photos.php:1069
msgid "Show Oldest First"
msgstr ""
#: mod/photos.php:1089 mod/photos.php:1622
#: mod/photos.php:1090 mod/photos.php:1623
msgid "View Photo"
msgstr ""
#: mod/photos.php:1126
#: mod/photos.php:1127
msgid "Permission denied. Access to this item may be restricted."
msgstr ""
#: mod/photos.php:1128
#: mod/photos.php:1129
msgid "Photo not available"
msgstr ""
#: mod/photos.php:1138
#: mod/photos.php:1139
msgid "Do you really want to delete this photo?"
msgstr ""
#: mod/photos.php:1139 mod/photos.php:1339
#: mod/photos.php:1140 mod/photos.php:1340
msgid "Delete Photo"
msgstr ""
#: mod/photos.php:1230
#: mod/photos.php:1231
msgid "View photo"
msgstr ""
#: mod/photos.php:1232
#: mod/photos.php:1233
msgid "Edit photo"
msgstr ""
#: mod/photos.php:1233
#: mod/photos.php:1234
msgid "Delete photo"
msgstr ""
#: mod/photos.php:1234
#: mod/photos.php:1235
msgid "Use as profile photo"
msgstr ""
#: mod/photos.php:1241
#: mod/photos.php:1242
msgid "Private Photo"
msgstr ""
#: mod/photos.php:1247
#: mod/photos.php:1248
msgid "View Full Size"
msgstr ""
#: mod/photos.php:1307
#: mod/photos.php:1308
msgid "Tags: "
msgstr ""
#: mod/photos.php:1310
#: mod/photos.php:1311
msgid "[Select tags to remove]"
msgstr ""
#: mod/photos.php:1325
#: mod/photos.php:1326
msgid "New album name"
msgstr ""
#: mod/photos.php:1326
#: mod/photos.php:1327
msgid "Caption"
msgstr ""
#: mod/photos.php:1327
#: mod/photos.php:1328
msgid "Add a Tag"
msgstr ""
#: mod/photos.php:1327
#: mod/photos.php:1328
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
#: mod/photos.php:1328
#: mod/photos.php:1329
msgid "Do not rotate"
msgstr ""
#: mod/photos.php:1329
#: mod/photos.php:1330
msgid "Rotate CW (right)"
msgstr ""
#: mod/photos.php:1330
#: mod/photos.php:1331
msgid "Rotate CCW (left)"
msgstr ""
#: mod/photos.php:1376 mod/photos.php:1433 mod/photos.php:1508
#: mod/photos.php:1377 mod/photos.php:1434 mod/photos.php:1509
#: src/Module/Contact.php:1104 src/Module/Item/Compose.php:142
#: src/Object/Post.php:957
msgid "This is you"
msgstr ""
#: mod/photos.php:1378 mod/photos.php:1435 mod/photos.php:1510
#: mod/photos.php:1379 mod/photos.php:1436 mod/photos.php:1511
#: src/Object/Post.php:495 src/Object/Post.php:959
msgid "Comment"
msgstr ""
#: mod/photos.php:1532 src/Object/Post.php:348
#: mod/photos.php:1533 src/Object/Post.php:348
msgid "Like"
msgstr ""
#: mod/photos.php:1533 src/Object/Post.php:348
#: mod/photos.php:1534 src/Object/Post.php:348
msgid "I like this (toggle)"
msgstr ""
#: mod/photos.php:1534 src/Object/Post.php:349
#: mod/photos.php:1535 src/Object/Post.php:349
msgid "Dislike"
msgstr ""
#: mod/photos.php:1536 src/Object/Post.php:349
#: mod/photos.php:1537 src/Object/Post.php:349
msgid "I don't like this (toggle)"
msgstr ""
#: mod/photos.php:1558
#: mod/photos.php:1559
msgid "Map"
msgstr ""
#: mod/photos.php:1628 mod/videos.php:258
#: mod/photos.php:1629 mod/videos.php:259
msgid "View Album"
msgstr ""
#: mod/ping.php:286
#: mod/ping.php:285
msgid "{0} wants to be your friend"
msgstr ""
#: mod/ping.php:303
#: mod/ping.php:302
msgid "{0} requested registration"
msgstr ""
#: mod/ping.php:316
#: mod/ping.php:315
#, php-format
msgid "{0} and %d others requested registration"
msgstr ""
@ -2175,7 +2175,7 @@ msgstr ""
#: mod/settings.php:540 mod/settings.php:638 mod/settings.php:773
#: src/Module/Admin/Addons/Index.php:69 src/Module/Admin/Features.php:87
#: src/Module/Admin/Logs/Settings.php:82 src/Module/Admin/Site.php:568
#: src/Module/Admin/Logs/Settings.php:82 src/Module/Admin/Site.php:579
#: src/Module/Admin/Themes/Index.php:113 src/Module/Admin/Tos.php:66
#: src/Module/Settings/Delegation.php:170 src/Module/Settings/Display.php:189
msgid "Save Settings"
@ -2917,19 +2917,19 @@ msgstr ""
msgid "Disconnect/Unfollow"
msgstr ""
#: mod/videos.php:133
#: mod/videos.php:134
msgid "No videos selected"
msgstr ""
#: mod/videos.php:251
#: mod/videos.php:252
msgid "View Video"
msgstr ""
#: mod/videos.php:266
#: mod/videos.php:267
msgid "Recent Videos"
msgstr ""
#: mod/videos.php:268
#: mod/videos.php:269
msgid "Upload New Videos"
msgstr ""
@ -2956,7 +2956,7 @@ msgstr ""
msgid "File upload failed."
msgstr ""
#: mod/wall_upload.php:233 src/Model/Photo.php:985
#: mod/wall_upload.php:233 src/Model/Photo.php:976
msgid "Wall Photos"
msgstr ""
@ -2984,7 +2984,7 @@ msgstr ""
msgid "No system theme config value set."
msgstr ""
#: src/App/Module.php:240
#: src/App/Module.php:241
msgid "You must be logged in to use addons. "
msgstr ""
@ -3634,39 +3634,39 @@ msgstr ""
msgid "last"
msgstr ""
#: src/Content/Text/BBCode.php:953 src/Content/Text/BBCode.php:1656
#: src/Content/Text/BBCode.php:1657
#: src/Content/Text/BBCode.php:942 src/Content/Text/BBCode.php:1609
#: src/Content/Text/BBCode.php:1610
msgid "Image/photo"
msgstr ""
#: src/Content/Text/BBCode.php:1083
#: src/Content/Text/BBCode.php:1068
#, php-format
msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr ""
#: src/Content/Text/BBCode.php:1108 src/Model/Item.php:3134
#: src/Model/Item.php:3140 src/Model/Item.php:3141
#: src/Content/Text/BBCode.php:1093 src/Model/Item.php:3110
#: src/Model/Item.php:3116 src/Model/Item.php:3117
msgid "Link to source"
msgstr ""
#: src/Content/Text/BBCode.php:1574 src/Content/Text/HTML.php:951
#: src/Content/Text/BBCode.php:1527 src/Content/Text/HTML.php:951
msgid "Click to open/close"
msgstr ""
#: src/Content/Text/BBCode.php:1605
#: src/Content/Text/BBCode.php:1558
msgid "$1 wrote:"
msgstr ""
#: src/Content/Text/BBCode.php:1659 src/Content/Text/BBCode.php:1660
#: src/Content/Text/BBCode.php:1612 src/Content/Text/BBCode.php:1613
msgid "Encrypted content"
msgstr ""
#: src/Content/Text/BBCode.php:1873
#: src/Content/Text/BBCode.php:1826
msgid "Invalid source protocol"
msgstr ""
#: src/Content/Text/BBCode.php:1888
#: src/Content/Text/BBCode.php:1841
msgid "Invalid link protocol"
msgstr ""
@ -3678,7 +3678,7 @@ msgstr ""
msgid "The end"
msgstr ""
#: src/Content/Text/HTML.php:893 src/Model/Profile.php:504
#: src/Content/Text/HTML.php:893 src/Model/Profile.php:518
#: src/Module/Contact.php:340
msgid "Follow"
msgstr ""
@ -4187,137 +4187,137 @@ msgstr ""
msgid "Could not connect to database."
msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:432
#: src/Core/L10n.php:377 src/Model/Event.php:431
#: src/Module/Settings/Display.php:178
msgid "Monday"
msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:433
#: src/Core/L10n.php:377 src/Model/Event.php:432
msgid "Tuesday"
msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:434
#: src/Core/L10n.php:377 src/Model/Event.php:433
msgid "Wednesday"
msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:435
#: src/Core/L10n.php:377 src/Model/Event.php:434
msgid "Thursday"
msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:436
#: src/Core/L10n.php:377 src/Model/Event.php:435
msgid "Friday"
msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:437
#: src/Core/L10n.php:377 src/Model/Event.php:436
msgid "Saturday"
msgstr ""
#: src/Core/L10n.php:377 src/Model/Event.php:431
#: src/Core/L10n.php:377 src/Model/Event.php:430
#: src/Module/Settings/Display.php:178
msgid "Sunday"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:452
#: src/Core/L10n.php:381 src/Model/Event.php:451
msgid "January"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:453
#: src/Core/L10n.php:381 src/Model/Event.php:452
msgid "February"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:454
#: src/Core/L10n.php:381 src/Model/Event.php:453
msgid "March"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:455
#: src/Core/L10n.php:381 src/Model/Event.php:454
msgid "April"
msgstr ""
#: src/Core/L10n.php:381 src/Core/L10n.php:401 src/Model/Event.php:443
#: src/Core/L10n.php:381 src/Core/L10n.php:401 src/Model/Event.php:442
msgid "May"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:456
#: src/Core/L10n.php:381 src/Model/Event.php:455
msgid "June"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:457
#: src/Core/L10n.php:381 src/Model/Event.php:456
msgid "July"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:458
#: src/Core/L10n.php:381 src/Model/Event.php:457
msgid "August"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:459
#: src/Core/L10n.php:381 src/Model/Event.php:458
msgid "September"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:460
#: src/Core/L10n.php:381 src/Model/Event.php:459
msgid "October"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:461
#: src/Core/L10n.php:381 src/Model/Event.php:460
msgid "November"
msgstr ""
#: src/Core/L10n.php:381 src/Model/Event.php:462
#: src/Core/L10n.php:381 src/Model/Event.php:461
msgid "December"
msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:424
#: src/Core/L10n.php:397 src/Model/Event.php:423
msgid "Mon"
msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:425
#: src/Core/L10n.php:397 src/Model/Event.php:424
msgid "Tue"
msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:426
#: src/Core/L10n.php:397 src/Model/Event.php:425
msgid "Wed"
msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:427
#: src/Core/L10n.php:397 src/Model/Event.php:426
msgid "Thu"
msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:428
#: src/Core/L10n.php:397 src/Model/Event.php:427
msgid "Fri"
msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:429
#: src/Core/L10n.php:397 src/Model/Event.php:428
msgid "Sat"
msgstr ""
#: src/Core/L10n.php:397 src/Model/Event.php:423
#: src/Core/L10n.php:397 src/Model/Event.php:422
msgid "Sun"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:439
#: src/Core/L10n.php:401 src/Model/Event.php:438
msgid "Jan"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:440
#: src/Core/L10n.php:401 src/Model/Event.php:439
msgid "Feb"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:441
#: src/Core/L10n.php:401 src/Model/Event.php:440
msgid "Mar"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:442
#: src/Core/L10n.php:401 src/Model/Event.php:441
msgid "Apr"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:444
#: src/Core/L10n.php:401 src/Model/Event.php:443
msgid "Jun"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:445
#: src/Core/L10n.php:401 src/Model/Event.php:444
msgid "Jul"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:446
#: src/Core/L10n.php:401 src/Model/Event.php:445
msgid "Aug"
msgstr ""
@ -4325,15 +4325,15 @@ msgstr ""
msgid "Sep"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:448
#: src/Core/L10n.php:401 src/Model/Event.php:447
msgid "Oct"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:449
#: src/Core/L10n.php:401 src/Model/Event.php:448
msgid "Nov"
msgstr ""
#: src/Core/L10n.php:401 src/Model/Event.php:450
#: src/Core/L10n.php:401 src/Model/Event.php:449
msgid "Dec"
msgstr ""
@ -4644,128 +4644,128 @@ msgstr ""
msgid "Forum"
msgstr ""
#: src/Model/Contact.php:2294
#: src/Model/Contact.php:2243
msgid "Connect URL missing."
msgstr ""
#: src/Model/Contact.php:2303
#: src/Model/Contact.php:2252
msgid ""
"The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page."
msgstr ""
#: src/Model/Contact.php:2346
#: src/Model/Contact.php:2293
msgid ""
"This site is not configured to allow communications with other networks."
msgstr ""
#: src/Model/Contact.php:2347 src/Model/Contact.php:2360
#: src/Model/Contact.php:2294 src/Model/Contact.php:2307
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
#: src/Model/Contact.php:2358
#: src/Model/Contact.php:2305
msgid "The profile address specified does not provide adequate information."
msgstr ""
#: src/Model/Contact.php:2363
#: src/Model/Contact.php:2310
msgid "An author or name was not found."
msgstr ""
#: src/Model/Contact.php:2366
#: src/Model/Contact.php:2313
msgid "No browser URL could be matched to this address."
msgstr ""
#: src/Model/Contact.php:2369
#: src/Model/Contact.php:2316
msgid ""
"Unable to match @-style Identity Address with a known protocol or email "
"contact."
msgstr ""
#: src/Model/Contact.php:2370
#: src/Model/Contact.php:2317
msgid "Use mailto: in front of address to force email check."
msgstr ""
#: src/Model/Contact.php:2376
#: src/Model/Contact.php:2323
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr ""
#: src/Model/Contact.php:2381
#: src/Model/Contact.php:2328
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
#: src/Model/Contact.php:2440
#: src/Model/Contact.php:2387
msgid "Unable to retrieve contact information."
msgstr ""
#: src/Model/Event.php:50 src/Model/Event.php:872
#: src/Model/Event.php:50 src/Model/Event.php:871
#: src/Module/Debug/Localtime.php:36
msgid "l F d, Y \\@ g:i A"
msgstr ""
#: src/Model/Event.php:77 src/Model/Event.php:94 src/Model/Event.php:471
#: src/Model/Event.php:942
#: src/Model/Event.php:77 src/Model/Event.php:94 src/Model/Event.php:470
#: src/Model/Event.php:941
msgid "Starts:"
msgstr ""
#: src/Model/Event.php:80 src/Model/Event.php:100 src/Model/Event.php:472
#: src/Model/Event.php:946
#: src/Model/Event.php:80 src/Model/Event.php:100 src/Model/Event.php:471
#: src/Model/Event.php:945
msgid "Finishes:"
msgstr ""
#: src/Model/Event.php:421
#: src/Model/Event.php:420
msgid "all-day"
msgstr ""
#: src/Model/Event.php:447
#: src/Model/Event.php:446
msgid "Sept"
msgstr ""
#: src/Model/Event.php:469
#: src/Model/Event.php:468
msgid "No events to display"
msgstr ""
#: src/Model/Event.php:588
#: src/Model/Event.php:587
msgid "l, F j"
msgstr ""
#: src/Model/Event.php:619
#: src/Model/Event.php:618
msgid "Edit event"
msgstr ""
#: src/Model/Event.php:620
#: src/Model/Event.php:619
msgid "Duplicate event"
msgstr ""
#: src/Model/Event.php:621
#: src/Model/Event.php:620
msgid "Delete event"
msgstr ""
#: src/Model/Event.php:873
#: src/Model/Event.php:872
msgid "D g:i A"
msgstr ""
#: src/Model/Event.php:874
#: src/Model/Event.php:873
msgid "g:i A"
msgstr ""
#: src/Model/Event.php:961 src/Model/Event.php:963
#: src/Model/Event.php:960 src/Model/Event.php:962
msgid "Show map"
msgstr ""
#: src/Model/Event.php:962
#: src/Model/Event.php:961
msgid "Hide map"
msgstr ""
#: src/Model/Event.php:1054
#: src/Model/Event.php:1053
#, php-format
msgid "%s's birthday"
msgstr ""
#: src/Model/Event.php:1055
#: src/Model/Event.php:1054
#, php-format
msgid "Happy Birthday %s"
msgstr ""
@ -4814,33 +4814,33 @@ msgstr ""
msgid "Edit groups"
msgstr ""
#: src/Model/Item.php:1660
#: src/Model/Item.php:1663
#, php-format
msgid "Detected languages in this post:\\n%s"
msgstr ""
#: src/Model/Item.php:2610
#: src/Model/Item.php:2613
msgid "activity"
msgstr ""
#: src/Model/Item.php:2612
#: src/Model/Item.php:2615
msgid "comment"
msgstr ""
#: src/Model/Item.php:2615
#: src/Model/Item.php:2618
msgid "post"
msgstr ""
#: src/Model/Item.php:2729
#: src/Model/Item.php:2732
#, php-format
msgid "Content warning: %s"
msgstr ""
#: src/Model/Item.php:3099
#: src/Model/Item.php:3075
msgid "bytes"
msgstr ""
#: src/Model/Item.php:3128 src/Model/Item.php:3129
#: src/Model/Item.php:3104 src/Model/Item.php:3105
msgid "View on separate page"
msgstr ""
@ -4848,76 +4848,76 @@ msgstr ""
msgid "[no subject]"
msgstr ""
#: src/Model/Profile.php:408 src/Module/Profile/Profile.php:252
#: src/Model/Profile.php:422 src/Module/Profile/Profile.php:252
#: src/Module/Profile/Profile.php:254
msgid "Edit profile"
msgstr ""
#: src/Model/Profile.php:410
#: src/Model/Profile.php:424
msgid "Change profile photo"
msgstr ""
#: src/Model/Profile.php:423 src/Module/Directory.php:161
#: src/Model/Profile.php:437 src/Module/Directory.php:161
#: src/Module/Profile/Profile.php:180
msgid "Homepage:"
msgstr ""
#: src/Model/Profile.php:424 src/Module/Contact.php:658
#: src/Model/Profile.php:438 src/Module/Contact.php:658
#: src/Module/Notifications/Introductions.php:174
msgid "About:"
msgstr ""
#: src/Model/Profile.php:425 src/Module/Contact.php:656
#: src/Model/Profile.php:439 src/Module/Contact.php:656
#: src/Module/Profile/Profile.php:176
msgid "XMPP:"
msgstr ""
#: src/Model/Profile.php:506 src/Module/Contact.php:342
#: src/Model/Profile.php:520 src/Module/Contact.php:342
msgid "Unfollow"
msgstr ""
#: src/Model/Profile.php:508
#: src/Model/Profile.php:522
msgid "Atom feed"
msgstr ""
#: src/Model/Profile.php:516 src/Module/Contact.php:338
#: src/Model/Profile.php:530 src/Module/Contact.php:338
#: src/Module/Notifications/Introductions.php:186
msgid "Network:"
msgstr ""
#: src/Model/Profile.php:546 src/Model/Profile.php:643
#: src/Model/Profile.php:560 src/Model/Profile.php:657
msgid "g A l F d"
msgstr ""
#: src/Model/Profile.php:547
#: src/Model/Profile.php:561
msgid "F d"
msgstr ""
#: src/Model/Profile.php:609 src/Model/Profile.php:694
#: src/Model/Profile.php:623 src/Model/Profile.php:708
msgid "[today]"
msgstr ""
#: src/Model/Profile.php:619
#: src/Model/Profile.php:633
msgid "Birthday Reminders"
msgstr ""
#: src/Model/Profile.php:620
#: src/Model/Profile.php:634
msgid "Birthdays this week:"
msgstr ""
#: src/Model/Profile.php:681
#: src/Model/Profile.php:695
msgid "[No description]"
msgstr ""
#: src/Model/Profile.php:707
#: src/Model/Profile.php:721
msgid "Event Reminders"
msgstr ""
#: src/Model/Profile.php:708
#: src/Model/Profile.php:722
msgid "Upcoming events the next 7 days:"
msgstr ""
#: src/Model/Profile.php:896
#: src/Model/Profile.php:897
#, php-format
msgid "OpenWebAuth: %1$s welcomes %2$s"
msgstr ""
@ -4958,138 +4958,138 @@ msgstr ""
msgid "Enter a valid existing folder"
msgstr ""
#: src/Model/User.php:195 src/Model/User.php:1000
#: src/Model/User.php:186 src/Model/User.php:991
msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr ""
#: src/Model/User.php:585 src/Model/User.php:618
#: src/Model/User.php:576 src/Model/User.php:609
msgid "Login failed"
msgstr ""
#: src/Model/User.php:650
#: src/Model/User.php:641
msgid "Not enough information to authenticate"
msgstr ""
#: src/Model/User.php:745
#: src/Model/User.php:736
msgid "Password can't be empty"
msgstr ""
#: src/Model/User.php:764
#: src/Model/User.php:755
msgid "Empty passwords are not allowed."
msgstr ""
#: src/Model/User.php:768
#: src/Model/User.php:759
msgid ""
"The new password has been exposed in a public data dump, please choose "
"another."
msgstr ""
#: src/Model/User.php:774
#: src/Model/User.php:765
msgid ""
"The password can't contain accentuated letters, white spaces or colons (:)"
msgstr ""
#: src/Model/User.php:880
#: src/Model/User.php:871
msgid "Passwords do not match. Password unchanged."
msgstr ""
#: src/Model/User.php:887
#: src/Model/User.php:878
msgid "An invitation is required."
msgstr ""
#: src/Model/User.php:891
#: src/Model/User.php:882
msgid "Invitation could not be verified."
msgstr ""
#: src/Model/User.php:899
#: src/Model/User.php:890
msgid "Invalid OpenID url"
msgstr ""
#: src/Model/User.php:912 src/Security/Authentication.php:224
#: src/Model/User.php:903 src/Security/Authentication.php:224
msgid ""
"We encountered a problem while logging in with the OpenID you provided. "
"Please check the correct spelling of the ID."
msgstr ""
#: src/Model/User.php:912 src/Security/Authentication.php:224
#: src/Model/User.php:903 src/Security/Authentication.php:224
msgid "The error message was:"
msgstr ""
#: src/Model/User.php:918
#: src/Model/User.php:909
msgid "Please enter the required information."
msgstr ""
#: src/Model/User.php:932
#: src/Model/User.php:923
#, php-format
msgid ""
"system.username_min_length (%s) and system.username_max_length (%s) are "
"excluding each other, swapping values."
msgstr ""
#: src/Model/User.php:939
#: src/Model/User.php:930
#, php-format
msgid "Username should be at least %s character."
msgid_plural "Username should be at least %s characters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/User.php:943
#: src/Model/User.php:934
#, php-format
msgid "Username should be at most %s character."
msgid_plural "Username should be at most %s characters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/User.php:951
#: src/Model/User.php:942
msgid "That doesn't appear to be your full (First Last) name."
msgstr ""
#: src/Model/User.php:956
#: src/Model/User.php:947
msgid "Your email domain is not among those allowed on this site."
msgstr ""
#: src/Model/User.php:960
#: src/Model/User.php:951
msgid "Not a valid email address."
msgstr ""
#: src/Model/User.php:963
#: src/Model/User.php:954
msgid "The nickname was blocked from registration by the nodes admin."
msgstr ""
#: src/Model/User.php:967 src/Model/User.php:975
#: src/Model/User.php:958 src/Model/User.php:966
msgid "Cannot use that email."
msgstr ""
#: src/Model/User.php:982
#: src/Model/User.php:973
msgid "Your nickname can only contain a-z, 0-9 and _."
msgstr ""
#: src/Model/User.php:990 src/Model/User.php:1047
#: src/Model/User.php:981 src/Model/User.php:1038
msgid "Nickname is already registered. Please choose another."
msgstr ""
#: src/Model/User.php:1034 src/Model/User.php:1038
#: src/Model/User.php:1025 src/Model/User.php:1029
msgid "An error occurred during registration. Please try again."
msgstr ""
#: src/Model/User.php:1061
#: src/Model/User.php:1052
msgid "An error occurred creating your default profile. Please try again."
msgstr ""
#: src/Model/User.php:1068
#: src/Model/User.php:1059
msgid "An error occurred creating your self contact. Please try again."
msgstr ""
#: src/Model/User.php:1073
#: src/Model/User.php:1064
msgid "Friends"
msgstr ""
#: src/Model/User.php:1077
#: src/Model/User.php:1068
msgid ""
"An error occurred creating your default contact group. Please try again."
msgstr ""
#: src/Model/User.php:1306
#: src/Model/User.php:1297
#, php-format
msgid ""
"\n"
@ -5097,7 +5097,7 @@ msgid ""
"\t\t\tthe administrator of %2$s has set up an account for you."
msgstr ""
#: src/Model/User.php:1309
#: src/Model/User.php:1300
#, php-format
msgid ""
"\n"
@ -5134,12 +5134,12 @@ msgid ""
"\t\tThank you and welcome to %4$s."
msgstr ""
#: src/Model/User.php:1342 src/Model/User.php:1449
#: src/Model/User.php:1333 src/Model/User.php:1440
#, php-format
msgid "Registration details for %s"
msgstr ""
#: src/Model/User.php:1362
#: src/Model/User.php:1353
#, php-format
msgid ""
"\n"
@ -5155,12 +5155,12 @@ msgid ""
"\t\t"
msgstr ""
#: src/Model/User.php:1381
#: src/Model/User.php:1372
#, php-format
msgid "Registration at %s"
msgstr ""
#: src/Model/User.php:1405
#: src/Model/User.php:1396
#, php-format
msgid ""
"\n"
@ -5169,7 +5169,7 @@ msgid ""
"\t\t\t"
msgstr ""
#: src/Model/User.php:1413
#: src/Model/User.php:1404
#, php-format
msgid ""
"\n"
@ -5237,7 +5237,7 @@ msgstr ""
#: src/Module/Admin/Blocklist/Server.php:88 src/Module/Admin/Federation.php:159
#: src/Module/Admin/Item/Delete.php:65 src/Module/Admin/Logs/Settings.php:80
#: src/Module/Admin/Logs/View.php:64 src/Module/Admin/Queue.php:72
#: src/Module/Admin/Site.php:565 src/Module/Admin/Summary.php:232
#: src/Module/Admin/Site.php:576 src/Module/Admin/Summary.php:232
#: src/Module/Admin/Themes/Details.php:90 src/Module/Admin/Themes/Index.php:111
#: src/Module/Admin/Tos.php:58 src/Module/Admin/Users/Active.php:136
#: src/Module/Admin/Users/Blocked.php:137 src/Module/Admin/Users/Create.php:61
@ -5791,281 +5791,281 @@ msgstr ""
msgid "Relocation started. Could take a while to complete."
msgstr ""
#: src/Module/Admin/Site.php:245
#: src/Module/Admin/Site.php:248
msgid "Invalid storage backend setting value."
msgstr ""
#: src/Module/Admin/Site.php:436 src/Module/Settings/Display.php:134
#: src/Module/Admin/Site.php:446 src/Module/Settings/Display.php:134
msgid "No special theme for mobile devices"
msgstr ""
#: src/Module/Admin/Site.php:453 src/Module/Settings/Display.php:144
#: src/Module/Admin/Site.php:463 src/Module/Settings/Display.php:144
#, php-format
msgid "%s - (Experimental)"
msgstr ""
#: src/Module/Admin/Site.php:465
#: src/Module/Admin/Site.php:475
msgid "No community page for local users"
msgstr ""
#: src/Module/Admin/Site.php:466
#: src/Module/Admin/Site.php:476
msgid "No community page"
msgstr ""
#: src/Module/Admin/Site.php:467
#: src/Module/Admin/Site.php:477
msgid "Public postings from users of this site"
msgstr ""
#: src/Module/Admin/Site.php:468
#: src/Module/Admin/Site.php:478
msgid "Public postings from the federated network"
msgstr ""
#: src/Module/Admin/Site.php:469
#: src/Module/Admin/Site.php:479
msgid "Public postings from local users and the federated network"
msgstr ""
#: src/Module/Admin/Site.php:475
#: src/Module/Admin/Site.php:485
msgid "Multi user instance"
msgstr ""
#: src/Module/Admin/Site.php:502
#: src/Module/Admin/Site.php:513
msgid "Closed"
msgstr ""
#: src/Module/Admin/Site.php:503
#: src/Module/Admin/Site.php:514
msgid "Requires approval"
msgstr ""
#: src/Module/Admin/Site.php:504
#: src/Module/Admin/Site.php:515
msgid "Open"
msgstr ""
#: src/Module/Admin/Site.php:508 src/Module/Install.php:215
#: src/Module/Admin/Site.php:519 src/Module/Install.php:215
msgid "No SSL policy, links will track page SSL state"
msgstr ""
#: src/Module/Admin/Site.php:509 src/Module/Install.php:216
#: src/Module/Admin/Site.php:520 src/Module/Install.php:216
msgid "Force all links to use SSL"
msgstr ""
#: src/Module/Admin/Site.php:510 src/Module/Install.php:217
#: src/Module/Admin/Site.php:521 src/Module/Install.php:217
msgid "Self-signed certificate, use SSL for local links only (discouraged)"
msgstr ""
#: src/Module/Admin/Site.php:514
#: src/Module/Admin/Site.php:525
msgid "Don't check"
msgstr ""
#: src/Module/Admin/Site.php:515
#: src/Module/Admin/Site.php:526
msgid "check the stable version"
msgstr ""
#: src/Module/Admin/Site.php:516
#: src/Module/Admin/Site.php:527
msgid "check the development version"
msgstr ""
#: src/Module/Admin/Site.php:520
#: src/Module/Admin/Site.php:531
msgid "none"
msgstr ""
#: src/Module/Admin/Site.php:521
#: src/Module/Admin/Site.php:532
msgid "Local contacts"
msgstr ""
#: src/Module/Admin/Site.php:522
#: src/Module/Admin/Site.php:533
msgid "Interactors"
msgstr ""
#: src/Module/Admin/Site.php:535
#: src/Module/Admin/Site.php:546
msgid "Database (legacy)"
msgstr ""
#: src/Module/Admin/Site.php:566 src/Module/BaseAdmin.php:90
#: src/Module/Admin/Site.php:577 src/Module/BaseAdmin.php:90
msgid "Site"
msgstr ""
#: src/Module/Admin/Site.php:567
#: src/Module/Admin/Site.php:578
msgid "General Information"
msgstr ""
#: src/Module/Admin/Site.php:569
#: src/Module/Admin/Site.php:580
msgid "Republish users to directory"
msgstr ""
#: src/Module/Admin/Site.php:570 src/Module/Register.php:139
#: src/Module/Admin/Site.php:581 src/Module/Register.php:139
msgid "Registration"
msgstr ""
#: src/Module/Admin/Site.php:571
#: src/Module/Admin/Site.php:582
msgid "File upload"
msgstr ""
#: src/Module/Admin/Site.php:572
#: src/Module/Admin/Site.php:583
msgid "Policies"
msgstr ""
#: src/Module/Admin/Site.php:574
#: src/Module/Admin/Site.php:585
msgid "Auto Discovered Contact Directory"
msgstr ""
#: src/Module/Admin/Site.php:575
#: src/Module/Admin/Site.php:586
msgid "Performance"
msgstr ""
#: src/Module/Admin/Site.php:576
#: src/Module/Admin/Site.php:587
msgid "Worker"
msgstr ""
#: src/Module/Admin/Site.php:577
#: src/Module/Admin/Site.php:588
msgid "Message Relay"
msgstr ""
#: src/Module/Admin/Site.php:578
#: src/Module/Admin/Site.php:589
msgid ""
"Use the command \"console relay\" in the command line to add or remove "
"relays."
msgstr ""
#: src/Module/Admin/Site.php:579
#: src/Module/Admin/Site.php:590
msgid "The system is not subscribed to any relays at the moment."
msgstr ""
#: src/Module/Admin/Site.php:580
#: src/Module/Admin/Site.php:591
msgid "The system is currently subscribed to the following relays:"
msgstr ""
#: src/Module/Admin/Site.php:582
#: src/Module/Admin/Site.php:593
msgid "Relocate Instance"
msgstr ""
#: src/Module/Admin/Site.php:583
#: src/Module/Admin/Site.php:594
msgid ""
"<strong>Warning!</strong> Advanced function. Could make this server "
"unreachable."
msgstr ""
#: src/Module/Admin/Site.php:587
#: src/Module/Admin/Site.php:598
msgid "Site name"
msgstr ""
#: src/Module/Admin/Site.php:588
#: src/Module/Admin/Site.php:599
msgid "Sender Email"
msgstr ""
#: src/Module/Admin/Site.php:588
#: src/Module/Admin/Site.php:599
msgid ""
"The email address your server shall use to send notification emails from."
msgstr ""
#: src/Module/Admin/Site.php:589
#: src/Module/Admin/Site.php:600
msgid "Name of the system actor"
msgstr ""
#: src/Module/Admin/Site.php:589
#: src/Module/Admin/Site.php:600
msgid ""
"Name of the internal system account that is used to perform ActivityPub "
"requests. This must be an unused username. If set, this can't be changed "
"again."
msgstr ""
#: src/Module/Admin/Site.php:590
#: src/Module/Admin/Site.php:601
msgid "Banner/Logo"
msgstr ""
#: src/Module/Admin/Site.php:591
#: src/Module/Admin/Site.php:602
msgid "Email Banner/Logo"
msgstr ""
#: src/Module/Admin/Site.php:592
#: src/Module/Admin/Site.php:603
msgid "Shortcut icon"
msgstr ""
#: src/Module/Admin/Site.php:592
#: src/Module/Admin/Site.php:603
msgid "Link to an icon that will be used for browsers."
msgstr ""
#: src/Module/Admin/Site.php:593
#: src/Module/Admin/Site.php:604
msgid "Touch icon"
msgstr ""
#: src/Module/Admin/Site.php:593
#: src/Module/Admin/Site.php:604
msgid "Link to an icon that will be used for tablets and mobiles."
msgstr ""
#: src/Module/Admin/Site.php:594
#: src/Module/Admin/Site.php:605
msgid "Additional Info"
msgstr ""
#: src/Module/Admin/Site.php:594
#: src/Module/Admin/Site.php:605
#, php-format
msgid ""
"For public servers: you can add additional information here that will be "
"listed at %s/servers."
msgstr ""
#: src/Module/Admin/Site.php:595
#: src/Module/Admin/Site.php:606
msgid "System language"
msgstr ""
#: src/Module/Admin/Site.php:596
#: src/Module/Admin/Site.php:607
msgid "System theme"
msgstr ""
#: src/Module/Admin/Site.php:596
#: src/Module/Admin/Site.php:607
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href=\"/"
"admin/themes\" id=\"cnftheme\">Change default theme settings</a>"
msgstr ""
#: src/Module/Admin/Site.php:597
#: src/Module/Admin/Site.php:608
msgid "Mobile system theme"
msgstr ""
#: src/Module/Admin/Site.php:597
#: src/Module/Admin/Site.php:608
msgid "Theme for mobile devices"
msgstr ""
#: src/Module/Admin/Site.php:598 src/Module/Install.php:225
#: src/Module/Admin/Site.php:609 src/Module/Install.php:225
msgid "SSL link policy"
msgstr ""
#: src/Module/Admin/Site.php:598 src/Module/Install.php:227
#: src/Module/Admin/Site.php:609 src/Module/Install.php:227
msgid "Determines whether generated links should be forced to use SSL"
msgstr ""
#: src/Module/Admin/Site.php:599
#: src/Module/Admin/Site.php:610
msgid "Force SSL"
msgstr ""
#: src/Module/Admin/Site.php:599
#: src/Module/Admin/Site.php:610
msgid ""
"Force all Non-SSL requests to SSL - Attention: on some systems it could lead "
"to endless loops."
msgstr ""
#: src/Module/Admin/Site.php:600
#: src/Module/Admin/Site.php:611
msgid "Hide help entry from navigation menu"
msgstr ""
#: src/Module/Admin/Site.php:600
#: src/Module/Admin/Site.php:611
msgid ""
"Hides the menu entry for the Help pages from the navigation menu. You can "
"still access it calling /help directly."
msgstr ""
#: src/Module/Admin/Site.php:601
#: src/Module/Admin/Site.php:612
msgid "Single user instance"
msgstr ""
#: src/Module/Admin/Site.php:601
#: src/Module/Admin/Site.php:612
msgid "Make this instance multi-user or single-user for the named user"
msgstr ""
#: src/Module/Admin/Site.php:603
#: src/Module/Admin/Site.php:614
msgid "File storage backend"
msgstr ""
#: src/Module/Admin/Site.php:603
#: src/Module/Admin/Site.php:614
msgid ""
"The backend used to store uploaded data. If you change the storage backend, "
"you can manually move the existing files. If you do not do so, the files "
@ -6074,202 +6074,202 @@ msgid ""
"for more information about the choices and the moving procedure."
msgstr ""
#: src/Module/Admin/Site.php:605
#: src/Module/Admin/Site.php:616
msgid "Maximum image size"
msgstr ""
#: src/Module/Admin/Site.php:605
#: src/Module/Admin/Site.php:616
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr ""
#: src/Module/Admin/Site.php:606
#: src/Module/Admin/Site.php:617
msgid "Maximum image length"
msgstr ""
#: src/Module/Admin/Site.php:606
#: src/Module/Admin/Site.php:617
msgid ""
"Maximum length in pixels of the longest side of uploaded images. Default is "
"-1, which means no limits."
msgstr ""
#: src/Module/Admin/Site.php:607
#: src/Module/Admin/Site.php:618
msgid "JPEG image quality"
msgstr ""
#: src/Module/Admin/Site.php:607
#: src/Module/Admin/Site.php:618
msgid ""
"Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
"100, which is full quality."
msgstr ""
#: src/Module/Admin/Site.php:609
#: src/Module/Admin/Site.php:620
msgid "Register policy"
msgstr ""
#: src/Module/Admin/Site.php:610
#: src/Module/Admin/Site.php:621
msgid "Maximum Daily Registrations"
msgstr ""
#: src/Module/Admin/Site.php:610
#: src/Module/Admin/Site.php:621
msgid ""
"If registration is permitted above, this sets the maximum number of new user "
"registrations to accept per day. If register is set to closed, this setting "
"has no effect."
msgstr ""
#: src/Module/Admin/Site.php:611
#: src/Module/Admin/Site.php:622
msgid "Register text"
msgstr ""
#: src/Module/Admin/Site.php:611
#: src/Module/Admin/Site.php:622
msgid ""
"Will be displayed prominently on the registration page. You can use BBCode "
"here."
msgstr ""
#: src/Module/Admin/Site.php:612
#: src/Module/Admin/Site.php:623
msgid "Forbidden Nicknames"
msgstr ""
#: src/Module/Admin/Site.php:612
#: src/Module/Admin/Site.php:623
msgid ""
"Comma separated list of nicknames that are forbidden from registration. "
"Preset is a list of role names according RFC 2142."
msgstr ""
#: src/Module/Admin/Site.php:613
#: src/Module/Admin/Site.php:624
msgid "Accounts abandoned after x days"
msgstr ""
#: src/Module/Admin/Site.php:613
#: src/Module/Admin/Site.php:624
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr ""
#: src/Module/Admin/Site.php:614
#: src/Module/Admin/Site.php:625
msgid "Allowed friend domains"
msgstr ""
#: src/Module/Admin/Site.php:614
#: src/Module/Admin/Site.php:625
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
#: src/Module/Admin/Site.php:615
#: src/Module/Admin/Site.php:626
msgid "Allowed email domains"
msgstr ""
#: src/Module/Admin/Site.php:615
#: src/Module/Admin/Site.php:626
msgid ""
"Comma separated list of domains which are allowed in email addresses for "
"registrations to this site. Wildcards are accepted. Empty to allow any "
"domains"
msgstr ""
#: src/Module/Admin/Site.php:616
#: src/Module/Admin/Site.php:627
msgid "No OEmbed rich content"
msgstr ""
#: src/Module/Admin/Site.php:616
#: src/Module/Admin/Site.php:627
msgid ""
"Don't show the rich content (e.g. embedded PDF), except from the domains "
"listed below."
msgstr ""
#: src/Module/Admin/Site.php:617
#: src/Module/Admin/Site.php:628
msgid "Trusted third-party domains"
msgstr ""
#: src/Module/Admin/Site.php:617
#: src/Module/Admin/Site.php:628
msgid ""
"Comma separated list of domains from which content is allowed to be embedded "
"in posts like with OEmbed. All sub-domains of the listed domains are allowed "
"as well."
msgstr ""
#: src/Module/Admin/Site.php:618
#: src/Module/Admin/Site.php:629
msgid "Block public"
msgstr ""
#: src/Module/Admin/Site.php:618
#: src/Module/Admin/Site.php:629
msgid ""
"Check to block public access to all otherwise public personal pages on this "
"site unless you are currently logged in."
msgstr ""
#: src/Module/Admin/Site.php:619
#: src/Module/Admin/Site.php:630
msgid "Force publish"
msgstr ""
#: src/Module/Admin/Site.php:619
#: src/Module/Admin/Site.php:630
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr ""
#: src/Module/Admin/Site.php:619
#: src/Module/Admin/Site.php:630
msgid "Enabling this may violate privacy laws like the GDPR"
msgstr ""
#: src/Module/Admin/Site.php:620
#: src/Module/Admin/Site.php:631
msgid "Global directory URL"
msgstr ""
#: src/Module/Admin/Site.php:620
#: src/Module/Admin/Site.php:631
msgid ""
"URL to the global directory. If this is not set, the global directory is "
"completely unavailable to the application."
msgstr ""
#: src/Module/Admin/Site.php:621
#: src/Module/Admin/Site.php:632
msgid "Private posts by default for new users"
msgstr ""
#: src/Module/Admin/Site.php:621
#: src/Module/Admin/Site.php:632
msgid ""
"Set default post permissions for all new members to the default privacy "
"group rather than public."
msgstr ""
#: src/Module/Admin/Site.php:622
#: src/Module/Admin/Site.php:633
msgid "Don't include post content in email notifications"
msgstr ""
#: src/Module/Admin/Site.php:622
#: src/Module/Admin/Site.php:633
msgid ""
"Don't include the content of a post/comment/private message/etc. in the "
"email notifications that are sent out from this site, as a privacy measure."
msgstr ""
#: src/Module/Admin/Site.php:623
#: src/Module/Admin/Site.php:634
msgid "Disallow public access to addons listed in the apps menu."
msgstr ""
#: src/Module/Admin/Site.php:623
#: src/Module/Admin/Site.php:634
msgid ""
"Checking this box will restrict addons listed in the apps menu to members "
"only."
msgstr ""
#: src/Module/Admin/Site.php:624
#: src/Module/Admin/Site.php:635
msgid "Don't embed private images in posts"
msgstr ""
#: src/Module/Admin/Site.php:624
#: src/Module/Admin/Site.php:635
msgid ""
"Don't replace locally-hosted private photos in posts with an embedded copy "
"of the image. This means that contacts who receive posts containing private "
"photos will have to authenticate and load each image, which may take a while."
msgstr ""
#: src/Module/Admin/Site.php:625
#: src/Module/Admin/Site.php:636
msgid "Explicit Content"
msgstr ""
#: src/Module/Admin/Site.php:625
#: src/Module/Admin/Site.php:636
msgid ""
"Set this to announce that your node is used mostly for explicit content that "
"might not be suited for minors. This information will be published in the "
@ -6278,234 +6278,234 @@ msgid ""
"will be shown at the user registration page."
msgstr ""
#: src/Module/Admin/Site.php:626
#: src/Module/Admin/Site.php:637
msgid "Allow Users to set remote_self"
msgstr ""
#: src/Module/Admin/Site.php:626
#: src/Module/Admin/Site.php:637
msgid ""
"With checking this, every user is allowed to mark every contact as a "
"remote_self in the repair contact dialog. Setting this flag on a contact "
"causes mirroring every posting of that contact in the users stream."
msgstr ""
#: src/Module/Admin/Site.php:627
#: src/Module/Admin/Site.php:638
msgid "Block multiple registrations"
msgstr ""
#: src/Module/Admin/Site.php:627
#: src/Module/Admin/Site.php:638
msgid "Disallow users to register additional accounts for use as pages."
msgstr ""
#: src/Module/Admin/Site.php:628
#: src/Module/Admin/Site.php:639
msgid "Disable OpenID"
msgstr ""
#: src/Module/Admin/Site.php:628
#: src/Module/Admin/Site.php:639
msgid "Disable OpenID support for registration and logins."
msgstr ""
#: src/Module/Admin/Site.php:629
#: src/Module/Admin/Site.php:640
msgid "No Fullname check"
msgstr ""
#: src/Module/Admin/Site.php:629
#: src/Module/Admin/Site.php:640
msgid ""
"Allow users to register without a space between the first name and the last "
"name in their full name."
msgstr ""
#: src/Module/Admin/Site.php:630
#: src/Module/Admin/Site.php:641
msgid "Community pages for visitors"
msgstr ""
#: src/Module/Admin/Site.php:630
#: src/Module/Admin/Site.php:641
msgid ""
"Which community pages should be available for visitors. Local users always "
"see both pages."
msgstr ""
#: src/Module/Admin/Site.php:631
#: src/Module/Admin/Site.php:642
msgid "Posts per user on community page"
msgstr ""
#: src/Module/Admin/Site.php:631
#: src/Module/Admin/Site.php:642
msgid ""
"The maximum number of posts per user on the community page. (Not valid for "
"\"Global Community\")"
msgstr ""
#: src/Module/Admin/Site.php:632
#: src/Module/Admin/Site.php:643
msgid "Disable OStatus support"
msgstr ""
#: src/Module/Admin/Site.php:632
#: src/Module/Admin/Site.php:643
msgid ""
"Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
"communications in OStatus are public, so privacy warnings will be "
"occasionally displayed."
msgstr ""
#: src/Module/Admin/Site.php:633
#: src/Module/Admin/Site.php:644
msgid "OStatus support can only be enabled if threading is enabled."
msgstr ""
#: src/Module/Admin/Site.php:635
#: src/Module/Admin/Site.php:646
msgid ""
"Diaspora support can't be enabled because Friendica was installed into a sub "
"directory."
msgstr ""
#: src/Module/Admin/Site.php:636
#: src/Module/Admin/Site.php:647
msgid "Enable Diaspora support"
msgstr ""
#: src/Module/Admin/Site.php:636
#: src/Module/Admin/Site.php:647
msgid "Provide built-in Diaspora network compatibility."
msgstr ""
#: src/Module/Admin/Site.php:637
#: src/Module/Admin/Site.php:648
msgid "Only allow Friendica contacts"
msgstr ""
#: src/Module/Admin/Site.php:637
#: src/Module/Admin/Site.php:648
msgid ""
"All contacts must use Friendica protocols. All other built-in communication "
"protocols disabled."
msgstr ""
#: src/Module/Admin/Site.php:638
#: src/Module/Admin/Site.php:649
msgid "Verify SSL"
msgstr ""
#: src/Module/Admin/Site.php:638
#: src/Module/Admin/Site.php:649
msgid ""
"If you wish, you can turn on strict certificate checking. This will mean you "
"cannot connect (at all) to self-signed SSL sites."
msgstr ""
#: src/Module/Admin/Site.php:639
#: src/Module/Admin/Site.php:650
msgid "Proxy user"
msgstr ""
#: src/Module/Admin/Site.php:640
#: src/Module/Admin/Site.php:651
msgid "Proxy URL"
msgstr ""
#: src/Module/Admin/Site.php:641
#: src/Module/Admin/Site.php:652
msgid "Network timeout"
msgstr ""
#: src/Module/Admin/Site.php:641
#: src/Module/Admin/Site.php:652
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
#: src/Module/Admin/Site.php:642
#: src/Module/Admin/Site.php:653
msgid "Maximum Load Average"
msgstr ""
#: src/Module/Admin/Site.php:642
#: src/Module/Admin/Site.php:653
#, php-format
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default %d."
msgstr ""
#: src/Module/Admin/Site.php:643
#: src/Module/Admin/Site.php:654
msgid "Maximum Load Average (Frontend)"
msgstr ""
#: src/Module/Admin/Site.php:643
#: src/Module/Admin/Site.php:654
msgid "Maximum system load before the frontend quits service - default 50."
msgstr ""
#: src/Module/Admin/Site.php:644
#: src/Module/Admin/Site.php:655
msgid "Minimal Memory"
msgstr ""
#: src/Module/Admin/Site.php:644
#: src/Module/Admin/Site.php:655
msgid ""
"Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
"default 0 (deactivated)."
msgstr ""
#: src/Module/Admin/Site.php:645
#: src/Module/Admin/Site.php:656
msgid "Periodically optimize tables"
msgstr ""
#: src/Module/Admin/Site.php:645
#: src/Module/Admin/Site.php:656
msgid "Periodically optimize tables like the cache and the workerqueue"
msgstr ""
#: src/Module/Admin/Site.php:647
#: src/Module/Admin/Site.php:658
msgid "Discover followers/followings from contacts"
msgstr ""
#: src/Module/Admin/Site.php:647
#: src/Module/Admin/Site.php:658
msgid ""
"If enabled, contacts are checked for their followers and following contacts."
msgstr ""
#: src/Module/Admin/Site.php:648
#: src/Module/Admin/Site.php:659
msgid "None - deactivated"
msgstr ""
#: src/Module/Admin/Site.php:649
#: src/Module/Admin/Site.php:660
msgid ""
"Local contacts - contacts of our local contacts are discovered for their "
"followers/followings."
msgstr ""
#: src/Module/Admin/Site.php:650
#: src/Module/Admin/Site.php:661
msgid ""
"Interactors - contacts of our local contacts and contacts who interacted on "
"locally visible postings are discovered for their followers/followings."
msgstr ""
#: src/Module/Admin/Site.php:652
#: src/Module/Admin/Site.php:663
msgid "Synchronize the contacts with the directory server"
msgstr ""
#: src/Module/Admin/Site.php:652
#: src/Module/Admin/Site.php:663
msgid ""
"if enabled, the system will check periodically for new contacts on the "
"defined directory server."
msgstr ""
#: src/Module/Admin/Site.php:654
#: src/Module/Admin/Site.php:665
msgid "Days between requery"
msgstr ""
#: src/Module/Admin/Site.php:654
#: src/Module/Admin/Site.php:665
msgid "Number of days after which a server is requeried for his contacts."
msgstr ""
#: src/Module/Admin/Site.php:655
#: src/Module/Admin/Site.php:666
msgid "Discover contacts from other servers"
msgstr ""
#: src/Module/Admin/Site.php:655
#: src/Module/Admin/Site.php:666
msgid ""
"Periodically query other servers for contacts. The system queries Friendica, "
"Mastodon and Hubzilla servers."
msgstr ""
#: src/Module/Admin/Site.php:656
#: src/Module/Admin/Site.php:667
msgid "Search the local directory"
msgstr ""
#: src/Module/Admin/Site.php:656
#: src/Module/Admin/Site.php:667
msgid ""
"Search the local directory instead of the global directory. When searching "
"locally, every search will be executed on the global directory in the "
"background. This improves the search results when the search is repeated."
msgstr ""
#: src/Module/Admin/Site.php:658
#: src/Module/Admin/Site.php:669
msgid "Publish server information"
msgstr ""
#: src/Module/Admin/Site.php:658
#: src/Module/Admin/Site.php:669
msgid ""
"If enabled, general server and usage data will be published. The data "
"contains the name and version of the server, number of users with public "
@ -6513,50 +6513,50 @@ msgid ""
"href=\"http://the-federation.info/\">the-federation.info</a> for details."
msgstr ""
#: src/Module/Admin/Site.php:660
#: src/Module/Admin/Site.php:671
msgid "Check upstream version"
msgstr ""
#: src/Module/Admin/Site.php:660
#: src/Module/Admin/Site.php:671
msgid ""
"Enables checking for new Friendica versions at github. If there is a new "
"version, you will be informed in the admin panel overview."
msgstr ""
#: src/Module/Admin/Site.php:661
#: src/Module/Admin/Site.php:672
msgid "Suppress Tags"
msgstr ""
#: src/Module/Admin/Site.php:661
#: src/Module/Admin/Site.php:672
msgid "Suppress showing a list of hashtags at the end of the posting."
msgstr ""
#: src/Module/Admin/Site.php:662
#: src/Module/Admin/Site.php:673
msgid "Clean database"
msgstr ""
#: src/Module/Admin/Site.php:662
#: src/Module/Admin/Site.php:673
msgid ""
"Remove old remote items, orphaned database records and old content from some "
"other helper tables."
msgstr ""
#: src/Module/Admin/Site.php:663
#: src/Module/Admin/Site.php:674
msgid "Lifespan of remote items"
msgstr ""
#: src/Module/Admin/Site.php:663
#: src/Module/Admin/Site.php:674
msgid ""
"When the database cleanup is enabled, this defines the days after which "
"remote items will be deleted. Own items, and marked or filed items are "
"always kept. 0 disables this behaviour."
msgstr ""
#: src/Module/Admin/Site.php:664
#: src/Module/Admin/Site.php:675
msgid "Lifespan of unclaimed items"
msgstr ""
#: src/Module/Admin/Site.php:664
#: src/Module/Admin/Site.php:675
msgid ""
"When the database cleanup is enabled, this defines the days after which "
"unclaimed remote items (mostly content from the relay) will be deleted. "
@ -6564,156 +6564,184 @@ msgid ""
"items if set to 0."
msgstr ""
#: src/Module/Admin/Site.php:665
#: src/Module/Admin/Site.php:676
msgid "Lifespan of raw conversation data"
msgstr ""
#: src/Module/Admin/Site.php:665
#: src/Module/Admin/Site.php:676
msgid ""
"The conversation data is used for ActivityPub and OStatus, as well as for "
"debug purposes. It should be safe to remove it after 14 days, default is 90 "
"days."
msgstr ""
#: src/Module/Admin/Site.php:666
#: src/Module/Admin/Site.php:677
msgid "Path to item cache"
msgstr ""
#: src/Module/Admin/Site.php:677
msgid "The item caches buffers generated bbcode and external images."
msgstr ""
#: src/Module/Admin/Site.php:678
msgid "Cache duration in seconds"
msgstr ""
#: src/Module/Admin/Site.php:678
msgid ""
"How long should the cache files be hold? Default value is 86400 seconds (One "
"day). To disable the item cache, set the value to -1."
msgstr ""
#: src/Module/Admin/Site.php:679
msgid "Maximum numbers of comments per post"
msgstr ""
#: src/Module/Admin/Site.php:666
#: src/Module/Admin/Site.php:679
msgid "How much comments should be shown for each post? Default value is 100."
msgstr ""
#: src/Module/Admin/Site.php:667
#: src/Module/Admin/Site.php:680
msgid "Maximum numbers of comments per post on the display page"
msgstr ""
#: src/Module/Admin/Site.php:667
#: src/Module/Admin/Site.php:680
msgid ""
"How many comments should be shown on the single view for each post? Default "
"value is 1000."
msgstr ""
#: src/Module/Admin/Site.php:668
#: src/Module/Admin/Site.php:681
msgid "Temp path"
msgstr ""
#: src/Module/Admin/Site.php:668
#: src/Module/Admin/Site.php:681
msgid ""
"If you have a restricted system where the webserver can't access the system "
"temp path, enter another path here."
msgstr ""
#: src/Module/Admin/Site.php:669
#: src/Module/Admin/Site.php:682
msgid "Disable picture proxy"
msgstr ""
#: src/Module/Admin/Site.php:682
msgid ""
"The picture proxy increases performance and privacy. It shouldn't be used on "
"systems with very low bandwidth."
msgstr ""
#: src/Module/Admin/Site.php:683
msgid "Only search in tags"
msgstr ""
#: src/Module/Admin/Site.php:669
#: src/Module/Admin/Site.php:683
msgid "On large systems the text search can slow down the system extremely."
msgstr ""
#: src/Module/Admin/Site.php:671
#: src/Module/Admin/Site.php:685
msgid "New base url"
msgstr ""
#: src/Module/Admin/Site.php:671
#: src/Module/Admin/Site.php:685
msgid ""
"Change base url for this server. Sends relocate message to all Friendica and "
"Diaspora* contacts of all users."
msgstr ""
#: src/Module/Admin/Site.php:673
#: src/Module/Admin/Site.php:687
msgid "RINO Encryption"
msgstr ""
#: src/Module/Admin/Site.php:673
#: src/Module/Admin/Site.php:687
msgid "Encryption layer between nodes."
msgstr ""
#: src/Module/Admin/Site.php:673 src/Module/Admin/Site.php:679
#: src/Module/Admin/Site.php:687 src/Module/Admin/Site.php:693
#: src/Module/Contact.php:562 src/Module/Settings/TwoFactor/Index.php:118
msgid "Disabled"
msgstr ""
#: src/Module/Admin/Site.php:673
#: src/Module/Admin/Site.php:687
msgid "Enabled"
msgstr ""
#: src/Module/Admin/Site.php:675
#: src/Module/Admin/Site.php:689
msgid "Maximum number of parallel workers"
msgstr ""
#: src/Module/Admin/Site.php:675
#: src/Module/Admin/Site.php:689
#, php-format
msgid ""
"On shared hosters set this to %d. On larger systems, values of %d are great. "
"Default value is %d."
msgstr ""
#: src/Module/Admin/Site.php:676
#: src/Module/Admin/Site.php:690
msgid "Enable fastlane"
msgstr ""
#: src/Module/Admin/Site.php:676
#: src/Module/Admin/Site.php:690
msgid ""
"When enabed, the fastlane mechanism starts an additional worker if processes "
"with higher priority are blocked by processes of lower priority."
msgstr ""
#: src/Module/Admin/Site.php:678
#: src/Module/Admin/Site.php:692
msgid "Direct relay transfer"
msgstr ""
#: src/Module/Admin/Site.php:678
#: src/Module/Admin/Site.php:692
msgid ""
"Enables the direct transfer to other servers without using the relay servers"
msgstr ""
#: src/Module/Admin/Site.php:679
#: src/Module/Admin/Site.php:693
msgid "Relay scope"
msgstr ""
#: src/Module/Admin/Site.php:679
#: src/Module/Admin/Site.php:693
msgid ""
"Can be \"all\" or \"tags\". \"all\" means that every public post should be "
"received. \"tags\" means that only posts with selected tags should be "
"received."
msgstr ""
#: src/Module/Admin/Site.php:679
#: src/Module/Admin/Site.php:693
msgid "all"
msgstr ""
#: src/Module/Admin/Site.php:679
#: src/Module/Admin/Site.php:693
msgid "tags"
msgstr ""
#: src/Module/Admin/Site.php:680
#: src/Module/Admin/Site.php:694
msgid "Server tags"
msgstr ""
#: src/Module/Admin/Site.php:680
#: src/Module/Admin/Site.php:694
msgid "Comma separated list of tags for the \"tags\" subscription."
msgstr ""
#: src/Module/Admin/Site.php:681
#: src/Module/Admin/Site.php:695
msgid "Deny Server tags"
msgstr ""
#: src/Module/Admin/Site.php:681
#: src/Module/Admin/Site.php:695
msgid "Comma separated list of tags that are rejected."
msgstr ""
#: src/Module/Admin/Site.php:682
#: src/Module/Admin/Site.php:696
msgid "Allow user tags"
msgstr ""
#: src/Module/Admin/Site.php:682
#: src/Module/Admin/Site.php:696
msgid ""
"If enabled, the tags from the saved searches will used for the \"tags\" "
"subscription in addition to the \"relay_server_tags\"."
msgstr ""
#: src/Module/Admin/Site.php:685
#: src/Module/Admin/Site.php:699
msgid "Start Relocation"
msgstr ""
@ -7301,21 +7329,16 @@ msgstr ""
msgid "User registrations waiting for confirmation"
msgstr ""
#: src/Module/BaseApi.php:128
#: src/Module/BaseApi.php:126
#, php-format
msgid "API endpoint %s %s is not implemented"
msgstr ""
#: src/Module/BaseApi.php:129
#: src/Module/BaseApi.php:127
msgid ""
"The API endpoint is currently not implemented but might be in the future."
msgstr ""
#: src/Module/BaseApi.php:301 src/Module/BaseApi.php:317
#: src/Module/BaseApi.php:333
msgid "Too Many Requests"
msgstr ""
#: src/Module/BaseProfile.php:55 src/Module/Contact.php:947
msgid "Profile Details"
msgstr ""
@ -8886,12 +8909,12 @@ msgstr ""
msgid "Visible to:"
msgstr ""
#: src/Module/Photo.php:94
#: src/Module/Photo.php:85
#, php-format
msgid "The Photo with id %s is not available."
msgstr ""
#: src/Module/Photo.php:122
#: src/Module/Photo.php:104
#, php-format
msgid "Invalid photo with id %s."
msgstr ""
@ -8950,19 +8973,19 @@ msgstr ""
#: src/Module/Profile/Profile.php:322 src/Module/Profile/Profile.php:325
#: src/Module/Profile/Status.php:65 src/Module/Profile/Status.php:68
#: src/Protocol/Feed.php:944 src/Protocol/OStatus.php:1256
#: src/Protocol/Feed.php:943 src/Protocol/OStatus.php:1256
#, php-format
msgid "%s's timeline"
msgstr ""
#: src/Module/Profile/Profile.php:323 src/Module/Profile/Status.php:66
#: src/Protocol/Feed.php:948 src/Protocol/OStatus.php:1260
#: src/Protocol/Feed.php:947 src/Protocol/OStatus.php:1260
#, php-format
msgid "%s's posts"
msgstr ""
#: src/Module/Profile/Profile.php:324 src/Module/Profile/Status.php:67
#: src/Protocol/Feed.php:951 src/Protocol/OStatus.php:1263
#: src/Protocol/Feed.php:950 src/Protocol/OStatus.php:1263
#, php-format
msgid "%s's comments"
msgstr ""
@ -9065,39 +9088,39 @@ msgstr ""
msgid "You have entered too much information."
msgstr ""
#: src/Module/Register.php:270
#: src/Module/Register.php:271
msgid "Please enter the identical mail address in the second field."
msgstr ""
#: src/Module/Register.php:297
#: src/Module/Register.php:298
msgid "The additional account was created."
msgstr ""
#: src/Module/Register.php:322
#: src/Module/Register.php:323
msgid ""
"Registration successful. Please check your email for further instructions."
msgstr ""
#: src/Module/Register.php:326
#: src/Module/Register.php:327
#, php-format
msgid ""
"Failed to send email message. Here your accout details:<br> login: %s<br> "
"password: %s<br><br>You can change your password after login."
msgstr ""
#: src/Module/Register.php:332
#: src/Module/Register.php:333
msgid "Registration successful."
msgstr ""
#: src/Module/Register.php:337 src/Module/Register.php:344
#: src/Module/Register.php:338 src/Module/Register.php:345
msgid "Your registration can not be processed."
msgstr ""
#: src/Module/Register.php:343
#: src/Module/Register.php:344
msgid "You have to leave a request note for the admin."
msgstr ""
#: src/Module/Register.php:389
#: src/Module/Register.php:390
msgid "Your registration is pending approval by the site owner."
msgstr ""

View file

@ -106,8 +106,11 @@
<h2>{{$performance}}</h2>
{{include file="field_checkbox.tpl" field=$only_tag_search}}
{{include file="field_input.tpl" field=$itemcache}}
{{include file="field_input.tpl" field=$itemcache_duration}}
{{include file="field_input.tpl" field=$max_comments}}
{{include file="field_input.tpl" field=$max_display_comments}}
{{include file="field_checkbox.tpl" field=$proxy_disabled}}
{{include file="field_checkbox.tpl" field=$dbclean}}
{{include file="field_input.tpl" field=$dbclean_expire_days}}
{{include file="field_input.tpl" field=$dbclean_unclaimed}}

View file

@ -0,0 +1,45 @@
<form id="login-form" action="{{$dest_url}}" role="form" method="post" >
<div id="login-group" role="group" aria-labelledby="login-head">
<input type="hidden" name="auth-params" value="login" />
<h3 id="login-head" class="sr-only">{{$login}}</h3>
<div id="login_standard">
{{include file="field_input.tpl" field=$lname}}
{{include file="field_password.tpl" field=$lpassword}}
<div id="login-lost-password-link">
<a href="lostpass" title="{{$lostpass}}" id="lost-password-link" >{{$lostlink}}</a>
</div>
</div>
{{if $openid}}
<div id="login_openid">
{{include file="field_openid.tpl" field=$lopenid}}
</div>
{{/if}}
<div id="login-submit-wrapper" >
<input type="submit" name="submit" id="login-submit-button" value="{{$login}}" />
</div>
{{include file="field_checkbox.tpl" field=$lremember}}
{{foreach $hiddens as $k=>$v}}
<input type="hidden" name="{{$k}}" value="{{$v}}" />
{{/foreach}}
<video src="/images/login_video.mp4" width="320" controls>
<p>Your browser doesn't support HTML5 video. There is no link to another video instead.</p>
</video>
<img src="/images/login_image.png">
</div>
</form>
{{if $register}}
<div id="login-extra-links">
<h3 id="login-head" class="sr-only">{{$register.title}}</h3>
<a href="{{$register.url}}" title="{{$register.title}}" id="register-link">{{$register.desc}}</a>
</div>
{{/if}}
<script type="text/javascript"> $(document).ready(function() { $("#id_{{$lname.0}}").focus();} );</script>

View file

@ -1,38 +1,12 @@
<div class="shared-wrapper well well-sm">
<div class="shared-wrapper">
<div class="shared_header">
{{if $avatar}}
<a href="{{$profile}}" target="_blank" rel="noopener noreferrer" class="avatar shared-userinfo">
<img src="{{$avatar}}" alt="">
<a href="{{$profile}}" target="_blank" rel="noopener noreferrer" class="shared-userinfo">
<img src="{{$avatar}}" height="32" width="32">
</a>
{{/if}}
<div class="metadata">
<p class="shared-author">
<a href="{{$profile}}" target="_blank" rel="noopener noreferrer" class="shared-wall-item-name">
{{$author}}
</a>
</p>
<p class="shared-wall-item-ago">
{{if $guid}}
<a href="/display/{{$guid}}">
{{/if}}
<span class="shared-time">{{$posted}}</span>
{{if $guid}}
</a>
{{/if}}
</p>
</div>
<div class="preferences">
{{if $network_icon}}
<span class="wall-item-network"><i class="fa fa-{{$network_icon}}" title="{{$network_name}}" aria-hidden="true"></i></span>
{{else}}
<span class="wall-item-network">{{$network_name}}</span>
{{/if}}
{{if $link}}
<a href="{{$link}}" class="plink u-url" aria-label="{{$link_title}}" title="{{$link_title}}">
<i class="fa fa-external-link"></i>
</a>
{{/if}}
</div>
<div><a href="{{$profile}}" target="_blank" rel="noopener noreferrer" class="shared-wall-item-name"><span class="shared-author">{{$author}}</span></a></div>
<div class="shared-wall-item-ago"><small><a href="{{$link}}" target="_blank" rel="noopener noreferrer"><span class="shared-time">{{$posted}}</a></a></small></div>
</div>
<blockquote class="shared_content">{{$content nofilter}}</blockquote>
</div>

View file

@ -1238,13 +1238,44 @@ input#dfrn-url {
background: rgba(0, 0, 0, 0.5) url(shiny.png) no-repeat scroll center center;
}
.shared_header {
height: 32px;
color: #999;
border-top: 1px solid #D2D2D2;
padding-top: 5px;
margin-top: 5px;
}
.shared_header a {
color: black;
-webkit-transition: all 0.2s ease-in-out;
-moz-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
-ms-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
.shared_header a:hover {
color: #36c;
}
.shared_header img {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
float: left;
}
.shared_header span {
margin-left: 9px;
}
blockquote.shared_content {
margin-left: 32px;
color: #000;
border: none;
}
.wall-item-title {
float: left;
font-weight: bold;
@ -3213,6 +3244,10 @@ div.jGrowl div.info {
width: 20px;
}
.shared_header span {
margin-left: 10px;
}
/* small screens */
@media all and (max-width: 1089px) {
.field label { width: 90%; }

View file

@ -1709,20 +1709,10 @@ aside .panel-body {
right: 0;
top: 0;
}
.shared_header {
margin-left: 0px;
margin-top: 0px;
padding-top: 0px;
margin-bottom: 10px;
border-top: none;
color: inherit;
.shared_header .preferences {
top: 7px;
right: 9px;
}
blockquote.shared_content {
padding: 0px;
margin-inline-start: 0px;
color: inherit;
}
.wall-item-network {
font-size: 13px;
}
@ -1847,6 +1837,19 @@ blockquote.shared_content {
.vevent:hover {
box-shadow: 0 0 0 1.5px rgba(0, 0, 0, 0.15) inset, 0 1px 1px rgba(0, 0, 0, 0.05);
}
.shared_header {
margin-left: 0px;
margin-top: 0px;
padding-top: 0px;
margin-bottom: 10px;
border-top: none;
color: inherit;
}
blockquote.shared_content {
padding: 0px;
margin-left: 0px;
color: inherit;
}
code > .hl-main {
padding: 10px 10px 1px 0;
}

View file

@ -241,8 +241,11 @@
<div id="admin-settings-performance-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="admin-settings-performance">
<div class="panel-body">
{{include file="field_checkbox.tpl" field=$only_tag_search}}
{{include file="field_input.tpl" field=$itemcache}}
{{include file="field_input.tpl" field=$itemcache_duration}}
{{include file="field_input.tpl" field=$max_comments}}
{{include file="field_input.tpl" field=$max_display_comments}}
{{include file="field_checkbox.tpl" field=$proxy_disabled}}
{{include file="field_checkbox.tpl" field=$dbclean}}
{{include file="field_input.tpl" field=$dbclean_expire_days}}
{{include file="field_input.tpl" field=$dbclean_unclaimed}}

View file

@ -0,0 +1,32 @@
<div class="shared-wrapper well well-sm">
<div class="shared_header">
{{if $avatar}}
<a href="{{$profile}}" target="_blank" rel="noopener noreferrer" class="shared-userinfo">
<img src="{{$avatar}}" height="32" width="32">
</a>
{{/if}}
<div><a href="{{$profile}}" target="_blank" rel="noopener noreferrer" class="shared-wall-item-name"><span class="shared-author">{{$author}}</span></a></div>
<div class="preferences">
{{if $network_icon}}
<span class="wall-item-network"><i class="fa fa-{{$network_icon}}" title="{{$network_name}}" aria-hidden="true"></i></span>
{{else}}
<span class="wall-item-network">{{$network_name}}</span>
{{/if}}
{{if $link}}
<a href="{{$link}}" class="plink u-url" aria-label="{{$link_title}}" title="{{$link_title}}">
<i class="fa fa-external-link"></i>
</a>
{{/if}}
</div>
<div class="shared-wall-item-ago"><small>
{{if $guid}}
<a href="/display/{{$guid}}">
{{/if}}
<span class="shared-time">{{$posted}}</span>
{{if $guid}}
</a>
{{/if}}
</small></div>
</div>
<blockquote class="shared_content">{{$content nofilter}}</blockquote>
</div>

View file

@ -1437,6 +1437,27 @@ section {
.type-video blockquote {
padding-left: 1em;
}
.shared_header {
height: 32px;
color: #999;
border-top: 1px solid #cccccc;
padding-top: 5px;
margin-top: 5px;
}
.shared_header img {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
float: left;
}
.shared_header span {
margin-left: 9px;
}
blockquote.shared_content {
margin-left: 32px;
color: #000;
border: none;
}
.oembed.video > a.embed_video {
display: block;
position: relative;

View file

@ -1437,6 +1437,27 @@ section {
.type-video blockquote {
padding-left: 1em;
}
.shared_header {
height: 32px;
color: #999;
border-top: 1px solid #cccccc;
padding-top: 5px;
margin-top: 5px;
}
.shared_header img {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
float: left;
}
.shared_header span {
margin-left: 9px;
}
blockquote.shared_content {
margin-left: 32px;
color: #000;
border: none;
}
.oembed.video > a.embed_video {
display: block;
position: relative;

View file

@ -1437,6 +1437,27 @@ section {
.type-video blockquote {
padding-left: 1em;
}
.shared_header {
height: 32px;
color: #999;
border-top: 1px solid #cccccc;
padding-top: 5px;
margin-top: 5px;
}
.shared_header img {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
float: left;
}
.shared_header span {
margin-left: 9px;
}
blockquote.shared_content {
margin-left: 32px;
color: #000;
border: none;
}
.oembed.video > a.embed_video {
display: block;
position: relative;

View file

@ -770,6 +770,22 @@ section {
border-top: 1px solid @ThreadBottomBorderColor;
padding-top: 5px;
margin-top: 5px;
img {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
float: left;
}
span { margin-left: 9px; }
}
blockquote.shared_content {
margin-left: 32px;
color: #000;
border: none;
}
.oembed.video {

View file

@ -1815,13 +1815,44 @@ ul .sidebar-group-li .icon {
.type-link .oembed {
}
.shared_header {
height: 32px;
color: #999;
border-top: 1px solid #D2D2D2;
padding-top: 5px;
margin-top: 5px;
}
.shared_header a {
color: black;
-webkit-transition: all 0.2s ease-in-out;
-moz-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
-ms-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
.shared_header a:hover {
color: #36c;
}
.shared_header img {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
float: left;
}
.shared_header span {
margin-left: 9px;
}
blockquote.shared_content {
margin-left: 32px;
color: #000;
border: none;
}
.icon.drop,
.icon.drophide {
float: left;
@ -4589,6 +4620,7 @@ div #datebrowse-sidebar.widget {
margin: 25px 0 25px 0;
}
#id_itemcache,
#id_basepath,
#id_temppath,
#id_lockpath,
@ -4601,6 +4633,7 @@ div #datebrowse-sidebar.widget {
width: 440px;
}
#id_itemcache_duration,
#id_abandon_days,
#id_maxloadavg,
#id_poll_interval,

View file

@ -345,6 +345,15 @@ div.pager, ul.tabs {
line-height: normal;
}
.shared_header {
min-height: 32px;;
color: #999;
border-top: 0px;
padding-top: 5px;
margin-top: 5px;
}
/* Post footer */
.wall-item-like { font-size:12px; }

View file

@ -1438,6 +1438,10 @@ section.minimal {
font-size: 12px;
}
.shared_header {
line-height: 14px;
}
.wall-item-network {
color: #999;
font-size: 12px;