Porównaj commity

...

15 Commity

Autor SHA1 Wiadomość Data
Matthew Exon 08da3e90de
Merge 2df67fef7e into 9fe0d72461 2024-04-12 09:35:27 +02:00
Hypolite Petovan 9fe0d72461
Merge pull request #14080 from annando/issue-14079
Issue #14079:  Shorten the displayed URL
2024-04-11 21:55:59 -04:00
Michael 45b30825f0 Isolate the link conversion into a dedicated function 2024-04-11 22:10:30 +00:00
Michael 7dc5622dca Issue #14079: Shorten the displayed URL 2024-04-11 04:37:42 +00:00
Hypolite Petovan ce580241e2
Merge pull request #14089 from annando/ping-lock
Prevent concurring ping requests
2024-04-10 19:19:24 -04:00
Michael a440619769 Prevent concurring ping requests 2024-04-10 22:25:14 +00:00
Tobias Diekershoff 9626a76b18
Merge pull request #14083 from annando/issue-13812
Issue 13812: Public groups with manual request approval
2024-04-09 18:46:44 +02:00
Tobias Diekershoff b02a5ed701
Merge pull request #14085 from annando/generator
Use similar values for generator and system actor
2024-04-09 18:38:22 +02:00
Michael 69fc2c04e4 Issue 13812: Public groups with manual request approval 2024-04-08 07:58:45 +00:00
Michael d7e8ee51ae Use similar values for generator and system actor 2024-04-08 06:33:03 +00:00
Tobias Diekershoff 02d8cc2f71
Merge pull request #14076 from annando/follow-vcard
Don't display the "follow/unfollow" vcard-link on pages meant for follow/unfollow
2024-04-08 07:35:16 +02:00
Tobias Diekershoff 0a88d5a94a
Merge pull request #14082 from annando/issue-14055
Issue 14055: Set link to group server for group posts
2024-04-08 07:31:53 +02:00
Michael 8b75aab4ad Don't display the "follow/unfollow" vcard-link on pages meant for follow/unfollow 2024-04-07 21:30:39 +00:00
Michael a2da42640c Issue 14055: Set link to group server for group posts 2024-04-07 15:46:55 +00:00
Matthew Exon 2df67fef7e round scaled dimensions up to avoid zero size 2024-04-06 12:11:50 +08:00
30 zmienionych plików z 428 dodań i 375 usunięć

Wyświetl plik

@ -136,7 +136,7 @@ function photos_post(App $a)
$visitor = 0;
$page_owner_uid = intval($user['uid']);
$community_page = $user['page-flags'] == User::PAGE_FLAGS_COMMUNITY;
$community_page = in_array($user['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN]);
if (DI::userSession()->getLocalUserId() && (DI::userSession()->getLocalUserId() == $page_owner_uid)) {
$can_post = true;
@ -618,7 +618,7 @@ function photos_content(App $a)
$owner_uid = $user['uid'];
$community_page = (($user['page-flags'] == User::PAGE_FLAGS_COMMUNITY) ? true : false);
$community_page = in_array($user['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN]);
if (DI::userSession()->getLocalUserId() && (DI::userSession()->getLocalUserId() == $owner_uid)) {
$can_post = true;

Wyświetl plik

@ -51,7 +51,7 @@ use Friendica\Util\XML;
class BBCode
{
// Update this value to the current date whenever changes are made to BBCode::convert
const VERSION = '2021-07-28';
const VERSION = '2024-04-07';
const INTERNAL = 0;
const EXTERNAL = 1;
@ -146,8 +146,7 @@ class BBCode
case 'title':
$value = self::toPlaintext(html_entity_decode($value, ENT_QUOTES, 'UTF-8'));
$value = html_entity_decode($value, ENT_QUOTES, 'UTF-8');
$value = str_replace(['[', ']'], ['[', ']'], $value);
$data['title'] = $value;
$data['title'] = self::escapeUrl($value);
default:
$data[$field] = html_entity_decode($value, ENT_QUOTES, 'UTF-8');
@ -551,71 +550,6 @@ class BBCode
return $text . "\n" . $data['after'];
}
/**
* Converts [url] BBCodes in a format that looks fine on Mastodon. (callback function)
*
* @param array $match Array with the matching values
* @return string reformatted link including HTML codes
*/
private static function convertUrlForActivityPubCallback(array $match): string
{
$url = $match[1];
if (isset($match[2]) && ($match[1] != $match[2])) {
return $match[0];
}
$parts = parse_url($url);
if (!isset($parts['scheme'])) {
return $match[0];
}
return self::convertUrlForActivityPub($url);
}
/**
* Converts [url] BBCodes in a format that looks fine on ActivityPub systems.
*
* @param string $url URL that is about to be reformatted
* @return string reformatted link including HTML codes
*/
private static function convertUrlForActivityPub(string $url): string
{
return sprintf('<a href="%s" target="_blank" rel="noopener noreferrer">%s</a>', $url, Strings::getStyledURL($url));
}
/*
* [noparse][i]italic[/i][/noparse] turns into
* [noparse][ i ]italic[ /i ][/noparse],
* to hide them from parser.
*
* @param array $match
* @return string
*/
private static function escapeNoparseCallback(array $match): string
{
$whole_match = $match[0];
$captured = $match[1];
$spacefied = preg_replace("/\[(.*?)\]/", "[ $1 ]", $captured);
$new_str = str_replace($captured, $spacefied, $whole_match);
return $new_str;
}
/*
* The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
* now turns back and the [noparse] tags are trimmed
* returning [i]italic[/i]
*
* @param array $match
* @return string
*/
private static function unescapeNoparseCallback(array $match): string
{
$captured = $match[1];
$unspacefied = preg_replace("/\[ (.*?)\ ]/", "[$1]", $captured);
return $unspacefied;
}
/**
* Returns the bracket character positions of a set of opening and closing BBCode tags, optionally skipping first
* occurrences
@ -1871,135 +1805,7 @@ class BBCode
$text = '<span style="font-size: xx-large; line-height: normal;">' . $text . '</span>';
}
$text = preg_replace_callback("/\[(url)\](.*?)\[\/url\]/ism", [self::class, 'sanitizeLinksCallback'], $text);
$text = preg_replace_callback("/\[(url)\=(.*?)\](.*?)\[\/url\]/ism", [self::class, 'sanitizeLinksCallback'], $text);
// Handle mentions and hashtag links
if ($simple_html == self::DIASPORA) {
// The ! is converted to @ since Diaspora only understands the @
$text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'@<a href="$2">$3</a>',
$text
);
} elseif (in_array($simple_html, [self::OSTATUS, self::ACTIVITYPUB])) {
$text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<span class="h-card"><a href="$2" class="u-url mention">$1<span>$3</span></a></span>',
$text
);
$text = preg_replace(
"/([#])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<a href="$2" class="mention hashtag" rel="tag">$1<span>$3</span></a>',
$text
);
} elseif (in_array($simple_html, [self::INTERNAL, self::EXTERNAL, self::TWITTER_API])) {
$text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<bdi>$1<a href="$2" class="userinfo mention" title="$3">$3</a></bdi>',
$text
);
} elseif ($simple_html == self::MASTODON_API) {
$text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<a class="u-url mention status-link" href="$2" rel="nofollow noopener noreferrer" target="_blank" title="$3">$1<span>$3</span></a>',
$text
);
$text = preg_replace(
"/([#])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<a class="mention hashtag status-link" href="$2" rel="tag">$1<span>$3</span></a>',
$text
);
} else {
$text = preg_replace("/([#@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", '$1$3', $text);
}
if (!$for_plaintext) {
if (in_array($simple_html, [self::OSTATUS, self::MASTODON_API, self::TWITTER_API, self::ACTIVITYPUB])) {
$text = preg_replace_callback("/\[url\](.*?)\[\/url\]/ism", [self::class, 'convertUrlForActivityPubCallback'], $text);
$text = preg_replace_callback("/\[url\=(.*?)\](.*?)\[\/url\]/ism", [self::class, 'convertUrlForActivityPubCallback'], $text);
}
} else {
$text = preg_replace("(\[url\](.*?)\[\/url\])ism", " $1 ", $text);
$text = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", [self::class, 'removePictureLinksCallback'], $text);
}
// Bookmarks in red - will be converted to bookmarks in friendica
$text = preg_replace("/#\^\[url\](.*?)\[\/url\]/ism", '[bookmark=$1]$1[/bookmark]', $text);
$text = preg_replace("/#\^\[url\=(.*?)\](.*?)\[\/url\]/ism", '[bookmark=$1]$2[/bookmark]', $text);
$text = preg_replace(
"/#\[url\=.*?\]\^\[\/url\]\[url\=(.*?)\](.*?)\[\/url\]/i",
"[bookmark=$1]$2[/bookmark]",
$text
);
if (in_array($simple_html, [self::OSTATUS, self::TWITTER, self::BLUESKY])) {
$text = preg_replace_callback("/([^#@!])\[url\=([^\]]*)\](.*?)\[\/url\]/ism", [self::class, 'expandLinksCallback'], $text);
//$text = preg_replace("/[^#@!]\[url\=([^\]]*)\](.*?)\[\/url\]/ism", ' $2 [url]$1[/url]', $text);
$text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", ' $2 [url]$1[/url]', $text);
}
// Perform URL Search
if ($try_oembed) {
$text = preg_replace_callback("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", $try_oembed_callback, $text);
}
$text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", '[url=$1]$2[/url]', $text);
// Handle Diaspora posts
$text = preg_replace_callback(
"&\[url=/?posts/([^\[\]]*)\](.*)\[\/url\]&Usi",
function ($match) {
return "[url=" . DI::baseUrl() . "/display/" . $match[1] . "]" . $match[2] . "[/url]";
},
$text
);
$text = preg_replace_callback(
"&\[url=/people\?q\=(.*)\](.*)\[\/url\]&Usi",
function ($match) {
return "[url=" . DI::baseUrl() . "/search?search=%40" . $match[1] . "]" . $match[2] . "[/url]";
},
$text
);
// Server independent link to posts and comments
// See issue: https://github.com/diaspora/diaspora_federation/issues/75
$expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism";
$text = preg_replace($expression, DI::baseUrl() . "/display/$1", $text);
/* Tag conversion
* Supports:
* - #[url=<anything>]<term>[/url]
* - [url=<anything>]#<term>[/url]
*/
self::performWithEscapedTags($text, ['url', 'share'], function ($text) use ($simple_html) {
$text = preg_replace_callback("/(?:#\[url\=[^\[\]]*\]|\[url\=[^\[\]]*\]#)(.*?)\[\/url\]/ism", function ($matches) use ($simple_html) {
if ($simple_html == self::ACTIVITYPUB) {
return '<a href="' . DI::baseUrl() . '/search?tag=' . urlencode($matches[1])
. '" data-tag="' . XML::escape($matches[1]) . '" rel="tag ugc">#'
. XML::escape($matches[1]) . '</a>';
} else {
return '#<a href="' . DI::baseUrl() . '/search?tag=' . urlencode($matches[1])
. '" class="tag" rel="tag" title="' . XML::escape($matches[1]) . '">'
. XML::escape($matches[1]) . '</a>';
}
}, $text);
return $text;
});
// We need no target="_blank" rel="noopener noreferrer" for local links
// convert links start with DI::baseUrl() as local link without the target="_blank" rel="noopener noreferrer" attribute
$escapedBaseUrl = preg_quote(DI::baseUrl(), '/');
$text = preg_replace("/\[url\](" . $escapedBaseUrl . ".*?)\[\/url\]/ism", '<a href="$1">$1</a>', $text);
$text = preg_replace("/\[url\=(" . $escapedBaseUrl . ".*?)\](.*?)\[\/url\]/ism", '<a href="$1">$2</a>', $text);
$text = preg_replace("/\[url\](.*?)\[\/url\]/ism", '<a href="$1" target="_blank" rel="noopener noreferrer">$1</a>', $text);
$text = preg_replace("/\[url\=(.*?)\](.*?)\[\/url\]/ism", '<a href="$1" target="_blank" rel="noopener noreferrer">$2</a>', $text);
// Red compatibility, though the link can't be authenticated on Friendica
$text = preg_replace("/\[zrl\=(.*?)\](.*?)\[\/zrl\]/ism", '<a href="$1" target="_blank" rel="noopener noreferrer">$2</a>', $text);
$text = self::convertUrlToHtml($text, $simple_html, $for_plaintext, $try_oembed, $try_oembed_callback);
// we may need to restrict this further if it picks up too many strays
// link acct:user@host to a webfinger profile redirector
@ -2112,6 +1918,176 @@ class BBCode
return trim($text);
}
private static function convertUrlToHtml(string $text, int $simple_html, bool $for_plaintext, bool $try_oembed, \Closure $try_oembed_callback): string
{
$text = preg_replace_callback("/\[(url)\](.*?)\[\/url\]/ism", [self::class, 'sanitizeLinksCallback'], $text);
$text = preg_replace_callback("/\[(url)\=(.*?)\](.*?)\[\/url\]/ism", [self::class, 'sanitizeLinksCallback'], $text);
// Handle mentions and hashtag links
if ($simple_html == self::DIASPORA) {
// The ! is converted to @ since Diaspora only understands the @
$text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'@<a href="$2">$3</a>',
$text
);
} elseif (in_array($simple_html, [self::OSTATUS, self::ACTIVITYPUB])) {
$text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<span class="h-card"><a href="$2" class="u-url mention">$1<span>$3</span></a></span>',
$text
);
$text = preg_replace(
"/([#])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<a href="$2" class="mention hashtag" rel="tag">$1<span>$3</span></a>',
$text
);
} elseif (in_array($simple_html, [self::INTERNAL, self::EXTERNAL, self::TWITTER_API])) {
$text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<bdi>$1<a href="$2" class="userinfo mention" title="$3">$3</a></bdi>',
$text
);
} elseif ($simple_html == self::MASTODON_API) {
$text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<a class="u-url mention status-link" href="$2" rel="nofollow noopener noreferrer" target="_blank" title="$3">$1<span>$3</span></a>',
$text
);
$text = preg_replace(
"/([#])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<a class="mention hashtag status-link" href="$2" rel="tag">$1<span>$3</span></a>',
$text
);
} else {
$text = preg_replace("/([#@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", '$1$3', $text);
}
if ($for_plaintext) {
$text = preg_replace("(\[url\](.*?)\[\/url\])ism", " $1 ", $text);
$text = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", [self::class, 'removePictureLinksCallback'], $text);
}
// Bookmarks in red - will be converted to bookmarks in friendica
$text = preg_replace("/#\^\[url\](.*?)\[\/url\]/ism", '[bookmark=$1]$1[/bookmark]', $text);
$text = preg_replace("/#\^\[url\=(.*?)\](.*?)\[\/url\]/ism", '[bookmark=$1]$2[/bookmark]', $text);
$text = preg_replace(
"/#\[url\=.*?\]\^\[\/url\]\[url\=(.*?)\](.*?)\[\/url\]/i",
"[bookmark=$1]$2[/bookmark]",
$text
);
if (in_array($simple_html, [self::OSTATUS, self::TWITTER, self::BLUESKY])) {
$text = preg_replace_callback("/([^#@!])\[url\=([^\]]*)\](.*?)\[\/url\]/ism", [self::class, 'expandLinksCallback'], $text);
//$text = preg_replace("/[^#@!]\[url\=([^\]]*)\](.*?)\[\/url\]/ism", ' $2 [url]$1[/url]', $text);
$text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", ' $2 [url]$1[/url]', $text);
}
// Perform URL Search
if ($try_oembed) {
$text = preg_replace_callback("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", $try_oembed_callback, $text);
}
$text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", '[url=$1]$2[/url]', $text);
// Handle Diaspora posts
$text = preg_replace_callback(
"&\[url=/?posts/([^\[\]]*)\](.*)\[\/url\]&Usi",
function ($match) {
return "[url=" . DI::baseUrl() . "/display/" . $match[1] . "]" . $match[2] . "[/url]";
},
$text
);
$text = preg_replace_callback(
"&\[url=/people\?q\=(.*)\](.*)\[\/url\]&Usi",
function ($match) {
return "[url=" . DI::baseUrl() . "/search?search=%40" . $match[1] . "]" . $match[2] . "[/url]";
},
$text
);
// Server independent link to posts and comments
// See issue: https://github.com/diaspora/diaspora_federation/issues/75
$expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism";
$text = preg_replace($expression, DI::baseUrl() . "/display/$1", $text);
/* Tag conversion
* Supports:
* - #[url=<anything>]<term>[/url]
* - [url=<anything>]#<term>[/url]
*/
self::performWithEscapedTags($text, ['url', 'share'], function ($text) use ($simple_html) {
$text = preg_replace_callback("/(?:#\[url\=[^\[\]]*\]|\[url\=[^\[\]]*\]#)(.*?)\[\/url\]/ism", function ($matches) use ($simple_html) {
if ($simple_html == self::ACTIVITYPUB) {
return '<a href="' . DI::baseUrl() . '/search?tag=' . urlencode($matches[1])
. '" data-tag="' . XML::escape($matches[1]) . '" rel="tag ugc">#'
. XML::escape($matches[1]) . '</a>';
} else {
return '#<a href="' . DI::baseUrl() . '/search?tag=' . urlencode($matches[1])
. '" class="tag" rel="tag" title="' . XML::escape($matches[1]) . '">'
. XML::escape($matches[1]) . '</a>';
}
}, $text);
return $text;
});
// Red compatibility, though the link can't be authenticated on Friendica
$text = preg_replace("/\[zrl\=(.*?)\](.*?)\[\/zrl\]/ism", '[url=$1]$2[/url]', $text);
if (in_array($simple_html, [self::INTERNAL, self::EXTERNAL, self::DIASPORA, self::OSTATUS, self::MASTODON_API, self::TWITTER_API, self::ACTIVITYPUB])) {
$text = self::shortenLinkDescription($text);
} else {
$text = self::unifyLinks($text);
}
// We need no target="_blank" rel="noopener noreferrer" for local links
// convert links start with DI::baseUrl() as local link without the target="_blank" rel="noopener noreferrer" attribute
$text = preg_replace("/\[url\=(" . preg_quote(DI::baseUrl(), '/') . ".*?)\](.*?)\[\/url\]/ism", '<a href="$1">$2</a>', $text);
$text = preg_replace("/\[url\=(.*?)\](.*?)\[\/url\]/ism", '<a href="$1" target="_blank" rel="noopener noreferrer">$2</a>', $text);
return $text;
}
private static function escapeUrl(string $url): string
{
return str_replace(['[', ']'], ['&#91;', '&#93;'], $url);
}
private static function unifyLinks(string $text): string
{
return preg_replace_callback(
"/\[url\](.*?)\[\/url\]/ism",
function ($match) {
return "[url=" . self::escapeUrl($match[1]) . "]" . $match[1] . "[/url]";
},
$text
);
}
private static function shortenLinkDescription(string $text): string
{
$text = preg_replace_callback(
"/\[url\](.*?)\[\/url\]/ism",
function ($match) {
return "[url=" . self::escapeUrl($match[1]) . "]" . Strings::getStyledURL($match[1]) . "[/url]";
},
$text
);
$text = preg_replace_callback(
"/\[url\=(.*?)\](.*?)\[\/url\]/ism",
function ($match) {
if ($match[1] == $match[2]) {
return "[url=" . self::escapeUrl($match[1]) . "]" . Strings::getStyledURL($match[2]) . "[/url]";
} else {
return "[url=" . self::escapeUrl($match[1]) . "]" . $match[2] . "[/url]";
}
},
$text
);
return $text;
}
/**
* Strips the "abstract" tag from the provided text
*

Wyświetl plik

@ -43,9 +43,10 @@ class VCard
* @template widget/vcard.tpl
* @param array $contact
* @param bool $hide_mention
* @param bool $hide_follow
* @return string
*/
public static function getHTML(array $contact, bool $hide_mention = false): string
public static function getHTML(array $contact, bool $hide_mention = false, bool $hide_follow = false): string
{
if (!isset($contact['network']) || !isset($contact['id'])) {
Logger::warning('Incomplete contact', ['contact' => $contact ?? []]);
@ -87,7 +88,7 @@ class VCard
}
}
if (empty($contact['self']) && Protocol::supportsFollow($contact['network'])) {
if (!$hide_follow && empty($contact['self']) && Protocol::supportsFollow($contact['network'])) {
if (in_array($rel, [Contact::SHARING, Contact::FRIEND])) {
$unfollow_link = 'contact/unfollow?url=' . urlencode($contact_url) . '&auto=1';
} elseif (!$pending) {

Wyświetl plik

@ -892,10 +892,10 @@ class Contact
$fields['avatar'] = User::getAvatarUrl($user);
$fields['header'] = User::getBannerUrl($user);
$fields['forum'] = $user['page-flags'] == User::PAGE_FLAGS_COMMUNITY;
$fields['forum'] = in_array($user['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN]);
$fields['prv'] = $user['page-flags'] == User::PAGE_FLAGS_PRVGROUP;
$fields['unsearchable'] = !$profile['net-publish'];
$fields['manually-approve'] = in_array($user['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP]);
$fields['manually-approve'] = in_array($user['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP, User::PAGE_FLAGS_COMM_MAN]);
$fields['baseurl'] = DI::baseUrl();
$fields['gsid'] = GServer::getID($fields['baseurl'], true);

Wyświetl plik

@ -3990,6 +3990,13 @@ class Item
$plink = $item['uri'];
}
if (($item['post-reason'] == self::PR_ANNOUNCEMENT) && ($item['owner-contact-type'] == Contact::TYPE_COMMUNITY) && ($item['owner-network'] == Protocol::DFRN)) {
$contact = Contact::getById($item['owner-id'], ['baseurl']);
if (!empty($contact['baseurl'])) {
$plink = $contact['baseurl'] . '/display/' . $item['guid'];
}
}
if (DI::userSession()->getLocalUserId()) {
$ret = [
'href' => "display/" . $item['guid'],

Wyświetl plik

@ -25,6 +25,7 @@ use DivineOmega\DOFileCachePSR6\CacheItemPool;
use DivineOmega\PasswordExposed;
use ErrorException;
use Exception;
use Friendica\App;
use Friendica\Content\Pager;
use Friendica\Core\Hook;
use Friendica\Core\L10n;
@ -72,6 +73,7 @@ class User
const PAGE_FLAGS_FREELOVE = 3;
const PAGE_FLAGS_BLOG = 4;
const PAGE_FLAGS_PRVGROUP = 5;
const PAGE_FLAGS_COMM_MAN = 6;
/**
* @}
*/
@ -161,6 +163,7 @@ class User
}
}
$system['name'] = App::PLATFORM . " '" . App::CODENAME . "' " . App::VERSION . '-' . DB_UPDATE_VERSION;
$system['sprvkey'] = $system['uprvkey'] = $system['prvkey'];
$system['spubkey'] = $system['upubkey'] = $system['pubkey'];
$system['nickname'] = $system['nick'];

Wyświetl plik

@ -51,7 +51,7 @@ class Whoami extends BaseApi
$data['name'] = $owner['name'];
$data['preferredUsername'] = $owner['nick'];
$data['alsoKnownAs'] = [];
$data['manuallyApprovesFollowers'] = in_array($owner['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP]);
$data['manuallyApprovesFollowers'] = in_array($owner['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP, User::PAGE_FLAGS_COMM_MAN]);
$data['discoverable'] = (bool)$owner['net-publish'];
$data['tag'] = [];

Wyświetl plik

@ -71,6 +71,7 @@ class UpdateCredentials extends BaseApi
}
if ($user['account-type'] == Contact::TYPE_COMMUNITY) {
// @todo Support for PAGE_FLAGS_COMM_MAN
$user['page-flags'] = $request['locked'] ? User::PAGE_FLAGS_PRVGROUP : User::PAGE_FLAGS_COMMUNITY;
} elseif ($user['account-type'] == Contact::TYPE_PERSON) {
if ($request['locked']) {

Wyświetl plik

@ -186,7 +186,7 @@ class Follow extends BaseModule
$this->page['aside'] = '';
if (!in_array($protocol, [Protocol::PHANTOM, Protocol::MAIL])) {
$this->page['aside'] = VCard::getHTML($contact);
$this->page['aside'] = VCard::getHTML($contact, false, true);
$output .= Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'),
['$title' => $this->t('Posts and Replies')]

Wyświetl plik

@ -133,7 +133,7 @@ class Unfollow extends \Friendica\BaseModule
'$keywords_label' => ''
]);
$this->page['aside'] = Widget\VCard::getHTML(Contact::getByURL($contact['url'], false));
$this->page['aside'] = Widget\VCard::getHTML(Contact::getByURL($contact['url'], false), false, true);
$o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'), ['$title' => $this->t('Posts and Replies')]);

Wyświetl plik

@ -53,7 +53,7 @@ class HCard extends BaseModule
$page = DI::page();
if (!empty($profile['page-flags']) && ($profile['page-flags'] == User::PAGE_FLAGS_COMMUNITY)) {
if (!empty($profile['page-flags']) && in_array($profile['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN])) {
$page['htmlhead'] .= '<meta name="friendica.community" content="true" />';
}
if (!empty($profile['openidserver'])) {

Wyświetl plik

@ -119,6 +119,7 @@ abstract class BaseUsers extends BaseModeration
User::PAGE_FLAGS_NORMAL => $this->t('Normal Account Page'),
User::PAGE_FLAGS_SOAPBOX => $this->t('Soapbox Page'),
User::PAGE_FLAGS_COMMUNITY => $this->t('Public Group'),
User::PAGE_FLAGS_COMM_MAN => $this->t('Public Group - Restricted'),
User::PAGE_FLAGS_FREELOVE => $this->t('Automatic Friend Page'),
User::PAGE_FLAGS_PRVGROUP => $this->t('Private Group')
];

Wyświetl plik

@ -28,17 +28,14 @@ use Friendica\Content\GroupManager;
use Friendica\Core\Cache\Capability\ICanCache;
use Friendica\Core\Cache\Enum\Duration;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\Hook;
use Friendica\Core\L10n;
use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
use Friendica\Core\Session\Capability\IHandleUserSessions;
use Friendica\Database\Database;
use Friendica\Database\DBA;
use Friendica\Model\Circle;
use Friendica\Model\Post;
use Friendica\Model\User;
use Friendica\Model\Verb;
use Friendica\Module\Conversation\Network;
use Friendica\Module\Register;
use Friendica\Module\Response;
use Friendica\Navigation\Notifications\Entity;
@ -191,7 +188,7 @@ class Ping extends BaseModule
if (!$this->notify->shouldShowOnDesktop($notification)) {
return null;
}
if (($notification->type == Post\UserNotification::TYPE_NONE) && in_array($owner['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP])) {
if (($notification->type == Post\UserNotification::TYPE_NONE) && in_array($owner['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP, User::PAGE_FLAGS_COMM_MAN])) {
return null;
}
try {

Wyświetl plik

@ -21,11 +21,43 @@
namespace Friendica\Module\Ping;
use Friendica\App;
use Friendica\App\Mode;
use Friendica\Content\Conversation;
use Friendica\Content\Conversation\Factory\Timeline as TimelineFactory;
use Friendica\Content\Conversation\Repository\UserDefinedChannel;
use Friendica\Content\Conversation\Factory\Channel as ChannelFactory;
use Friendica\Content\Conversation\Factory\UserDefinedChannel as UserDefinedChannelFactory;
use Friendica\Content\Conversation\Factory\Community as CommunityFactory;
use Friendica\Content\Conversation\Factory\Network as NetworkFactory;
use Friendica\Core\Cache\Capability\ICanCache;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\L10n;
use Friendica\Core\Lock\Capability\ICanLock;
use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
use Friendica\Core\Session\Capability\IHandleUserSessions;
use Friendica\Core\System;
use Friendica\Database\Database;
use Friendica\Module\Conversation\Network as NetworkModule;
use Friendica\Module\Response;
use Friendica\Navigation\SystemMessages;
use Friendica\Util\Profiler;
use Psr\Log\LoggerInterface;
class Network extends NetworkModule
{
/**
* @var ICanLock
*/
private $lock;
public function __construct(ICanLock $lock, UserDefinedChannelFactory $userDefinedChannel, NetworkFactory $network, CommunityFactory $community, ChannelFactory $channelFactory, UserDefinedChannel $channel, App $app, TimelineFactory $timeline, SystemMessages $systemMessages, Mode $mode, Conversation $conversation, App\Page $page, IHandleUserSessions $session, Database $database, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, ICanCache $cache, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
{
parent::__construct($userDefinedChannel, $network, $community, $channelFactory, $channel, $app, $timeline, $systemMessages, $mode, $conversation, $page, $session, $database, $pConfig, $config, $cache, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
$this->lock = $lock;
}
protected function rawContent(array $request = [])
{
if (!$this->session->getLocalUserId()) {
@ -46,6 +78,12 @@ class Network extends NetworkModule
System::httpExit('');
}
$lockkey = 'network-ping-' . $this->session->getLocalUserId();
if (!$this->lock->acquire($lockkey, 0)) {
$this->logger->debug('Ping-1-lock', ['uid' => $this->session->getLocalUserId()]);
System::httpExit('');
}
$this->setPing(true);
$this->itemsPerPage = 100;
@ -56,6 +94,7 @@ class Network extends NetworkModule
} else {
$items = $this->getItems();
}
$this->lock->release($lockkey);
$count = count($items);
System::httpExit(($count < 100) ? $count : '99+');
}

Wyświetl plik

@ -144,7 +144,7 @@ class Conversations extends BaseProfile
$o .= Widget::commonFriendsVisitor($profile['uid'], $profile['nickname']);
$commpage = $profile['page-flags'] == User::PAGE_FLAGS_COMMUNITY;
$commpage = in_array($profile['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN]);
$commvisitor = $commpage && $remote_contact;
$this->page['aside'] .= Widget::postedByYear($this->baseUrl . '/profile/' . $profile['nickname'] . '/conversations', $profile['profile_uid'] ?? 0, true);

Wyświetl plik

@ -122,7 +122,7 @@ class Profile extends BaseProfile
$this->baseUrl->redirect('profile/' . $profile['nickname'] . '/restricted');
}
if (!empty($profile['page-flags']) && $profile['page-flags'] == User::PAGE_FLAGS_COMMUNITY) {
if (!empty($profile['page-flags']) && in_array($profile['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN])) {
$this->page['htmlhead'] .= '<meta name="friendica.community" content="true" />' . "\n";
}
@ -319,7 +319,7 @@ class Profile extends BaseProfile
{
$htmlhead = "\n";
if (!empty($profile['page-flags']) && $profile['page-flags'] == User::PAGE_FLAGS_COMMUNITY) {
if (!empty($profile['page-flags']) && in_array($profile['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN])) {
$htmlhead .= '<meta name="friendica.community" content="true" />' . "\n";
}

Wyświetl plik

@ -118,7 +118,7 @@ class RemoteFollow extends BaseModule
protected function content(array $request = []): string
{
$this->page['aside'] = Widget\VCard::getHTML($this->owner);
$this->page['aside'] = Widget\VCard::getHTML($this->owner, false, true);
$target_addr = $this->owner['addr'];
$target_url = $this->owner['url'];

Wyświetl plik

@ -314,7 +314,7 @@ class Account extends BaseSettings
$page_flags = User::PAGE_FLAGS_SOAPBOX;
} elseif ($account_type == User::ACCOUNT_TYPE_NEWS && $page_flags != User::PAGE_FLAGS_SOAPBOX) {
$page_flags = User::PAGE_FLAGS_SOAPBOX;
} elseif ($account_type == User::ACCOUNT_TYPE_COMMUNITY && !in_array($page_flags, [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP])) {
} elseif ($account_type == User::ACCOUNT_TYPE_COMMUNITY && !in_array($page_flags, [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP, User::PAGE_FLAGS_COMM_MAN])) {
$page_flags = User::PAGE_FLAGS_COMMUNITY;
} elseif ($account_type == User::ACCOUNT_TYPE_RELAY && $page_flags != User::PAGE_FLAGS_SOAPBOX) {
$page_flags = User::PAGE_FLAGS_SOAPBOX;
@ -419,7 +419,7 @@ class Account extends BaseSettings
// Set the account type to "Community" when the page is a community page but the account type doesn't fit
// This is only happening on the first visit after the update
if (
in_array($user['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP])
in_array($user['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP, User::PAGE_FLAGS_COMM_MAN])
&& $user['account-type'] != User::ACCOUNT_TYPE_COMMUNITY
) {
$user['account-type'] = User::ACCOUNT_TYPE_COMMUNITY;
@ -498,6 +498,13 @@ class Account extends BaseSettings
DI::l10n()->t('Automatically approves all contact requests.'),
$user['page-flags'] == User::PAGE_FLAGS_COMMUNITY
],
'$page_community_manually' => [
'page-flags',
DI::l10n()->t('Public Group - Restricted'),
User::PAGE_FLAGS_COMM_MAN,
DI::l10n()->t('Contact requests have to be manually approved.'),
$user['page-flags'] == User::PAGE_FLAGS_COMM_MAN
],
'$page_freelove' => [
'page-flags',
DI::l10n()->t('Automatic Friend Page'),

Wyświetl plik

@ -2272,7 +2272,7 @@ class Probe
'inbox' => $approfile['inbox'], 'outbox' => $approfile['outbox'],
'sharedinbox' => $approfile['endpoints']['sharedInbox'], 'network' => Protocol::DFRN,
'pubkey' => $owner['upubkey'], 'baseurl' => $approfile['generator']['url'], 'gsid' => $owner['gsid'],
'manually-approve' => in_array($owner['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP]),
'manually-approve' => in_array($owner['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP, User::PAGE_FLAGS_COMM_MAN]),
'networks' => [
Protocol::DIASPORA => [
'name' => $owner['name'],

Wyświetl plik

@ -591,6 +591,9 @@ class Image
if (!$this->isValid()) {
return false;
}
if ($dest_width <= 0 || $dest_height <= 0) {
return false;
}
if ($this->isImagick()) {
/*

Wyświetl plik

@ -322,16 +322,17 @@ class Transmitter
}
/**
* Return the service array containing information the used software and it's url
* Return the service array containing information the used software and its url
*
* @return array with service data
*/
public static function getService(): array
{
return [
'type' => 'Service',
'id' => (string)DI::baseUrl() . '/friendica',
'type' => 'Application',
'name' => App::PLATFORM . " '" . App::CODENAME . "' " . App::VERSION . '-' . DB_UPDATE_VERSION,
'url' => (string)DI::baseUrl()
'url' => (string)DI::baseUrl(),
];
}

Wyświetl plik

@ -392,7 +392,7 @@ class DFRN
}
// For backward compatibility we keep this element
if ($owner['page-flags'] == User::PAGE_FLAGS_COMMUNITY) {
if (in_array($owner['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN])) {
XML::addElement($doc, $root, 'dfrn:community', 1);
}

Wyświetl plik

@ -418,19 +418,19 @@ class Images
if ((($height * 9) / 16) > $width) {
$dest_width = $max;
$dest_height = intval(($height * $max) / $width);
$dest_height = intval(ceil(($height * $max) / $width));
} elseif ($width > $height) {
// else constrain both dimensions
$dest_width = $max;
$dest_height = intval(($height * $max) / $width);
$dest_height = intval(ceil(($height * $max) / $width));
} else {
$dest_width = intval(($width * $max) / $height);
$dest_width = intval(ceil(($width * $max) / $height));
$dest_height = $max;
}
} else {
if ($width > $max) {
$dest_width = $max;
$dest_height = intval(($height * $max) / $width);
$dest_height = intval(ceil(($height * $max) / $width));
} else {
if ($height > $max) {
// very tall image (greater than 16:9)
@ -440,7 +440,7 @@ class Images
$dest_width = $width;
$dest_height = $height;
} else {
$dest_width = intval(($width * $max) / $height);
$dest_width = intval(ceil(($width * $max) / $height));
$dest_height = $max;
}
} else {

Wyświetl plik

@ -569,6 +569,10 @@ class Strings
public static function getStyledURL(string $url): string
{
$parts = parse_url($url);
if (empty($parts['scheme'])) {
return $url;
}
$scheme = [$parts['scheme'] . '://www.', $parts['scheme'] . '://'];
$styled_url = str_replace($scheme, '', $url);

Wyświetl plik

@ -25,6 +25,7 @@ use Friendica\Content\Text\BBCode;
use Friendica\DI;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Test\FixtureTest;
use Friendica\Util\Strings;
class BBCodeTest extends FixtureTest
{
@ -148,7 +149,7 @@ class BBCodeTest extends FixtureTest
public function testAutoLinking(string $data, bool $assertHTML)
{
$output = BBCode::convert($data);
$assert = $this->HTMLPurifier->purify('<a href="' . $data . '" target="_blank" rel="noopener noreferrer">' . $data . '</a>');
$assert = $this->HTMLPurifier->purify('<a href="' . $data . '" target="_blank" rel="noopener noreferrer">' . Strings::getStyledURL($data) . '</a>');
if ($assertHTML) {
self::assertEquals($assert, $output);
} else {
@ -160,21 +161,21 @@ class BBCodeTest extends FixtureTest
{
return [
'bug-7271-condensed-space' => [
'expectedHtml' => '<ol><li> <a href="http://example.com/" target="_blank" rel="noopener noreferrer">http://example.com/</a></li></ol>',
'expectedHtml' => '<ol><li> <a href="http://example.com/" target="_blank" rel="noopener noreferrer">example.com/</a></li></ol>',
'text' => '[ol][li] http://example.com/[/ol]',
],
'bug-7271-condensed-nospace' => [
'expectedHtml' => '<ol><li><a href="http://example.com/" target="_blank" rel="noopener noreferrer">http://example.com/</a></li></ol>',
'expectedHtml' => '<ol><li><a href="http://example.com/" target="_blank" rel="noopener noreferrer">example.com/</a></li></ol>',
'text' => '[ol][li]http://example.com/[/ol]',
],
'bug-7271-indented-space' => [
'expectedHtml' => '<ul><li> <a href="http://example.com/" target="_blank" rel="noopener noreferrer">http://example.com/</a></li></ul>',
'expectedHtml' => '<ul><li> <a href="http://example.com/" target="_blank" rel="noopener noreferrer">example.com/</a></li></ul>',
'text' => '[ul]
[li] http://example.com/
[/ul]',
],
'bug-7271-indented-nospace' => [
'expectedHtml' => '<ul><li><a href="http://example.com/" target="_blank" rel="noopener noreferrer">http://example.com/</a></li></ul>',
'expectedHtml' => '<ul><li><a href="http://example.com/" target="_blank" rel="noopener noreferrer">example.com/</a></li></ul>',
'text' => '[ul]
[li]http://example.com/
[/ul]',

Wyświetl plik

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2024.06-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-06 11:09+0000\n"
"POT-Creation-Date: 2024-04-07 16:31+0000\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"
@ -957,7 +957,7 @@ msgstr ""
msgid "Enter user nickname: "
msgstr ""
#: src/Console/User.php:182 src/Model/User.php:819
#: src/Console/User.php:182 src/Model/User.php:820
#: src/Module/Api/Twitter/ContactEndpoint.php:74
#: src/Module/Moderation/Users/Active.php:71
#: src/Module/Moderation/Users/Blocked.php:71
@ -1733,7 +1733,7 @@ msgstr ""
#: src/Content/Feature.php:130 src/Content/GroupManager.php:147
#: src/Content/Nav.php:278 src/Content/Text/HTML.php:881
#: src/Content/Widget.php:538 src/Model/User.php:1385
#: src/Content/Widget.php:538 src/Model/User.php:1386
msgid "Groups"
msgstr ""
@ -3310,7 +3310,7 @@ msgstr ""
msgid "Group"
msgstr ""
#: src/Model/Contact.php:1746 src/Module/Moderation/BaseUsers.php:130
#: src/Model/Contact.php:1746 src/Module/Moderation/BaseUsers.php:131
msgid "Relay"
msgstr ""
@ -3726,145 +3726,145 @@ msgstr ""
msgid "Contact information and Social Networks"
msgstr ""
#: src/Model/User.php:228 src/Model/User.php:1298
#: src/Model/User.php:229 src/Model/User.php:1299
msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr ""
#: src/Model/User.php:728 src/Model/User.php:761
#: src/Model/User.php:729 src/Model/User.php:762
msgid "Login failed"
msgstr ""
#: src/Model/User.php:793
#: src/Model/User.php:794
msgid "Not enough information to authenticate"
msgstr ""
#: src/Model/User.php:918
#: src/Model/User.php:919
msgid "Password can't be empty"
msgstr ""
#: src/Model/User.php:960
#: src/Model/User.php:961
msgid "Empty passwords are not allowed."
msgstr ""
#: src/Model/User.php:964
#: src/Model/User.php:965
msgid ""
"The new password has been exposed in a public data dump, please choose "
"another."
msgstr ""
#: src/Model/User.php:968
#: src/Model/User.php:969
msgid "The password length is limited to 72 characters."
msgstr ""
#: src/Model/User.php:972
#: src/Model/User.php:973
msgid "The password can't contain white spaces nor accentuated letters"
msgstr ""
#: src/Model/User.php:1181
#: src/Model/User.php:1182
msgid "Passwords do not match. Password unchanged."
msgstr ""
#: src/Model/User.php:1188
#: src/Model/User.php:1189
msgid "An invitation is required."
msgstr ""
#: src/Model/User.php:1192
#: src/Model/User.php:1193
msgid "Invitation could not be verified."
msgstr ""
#: src/Model/User.php:1200
#: src/Model/User.php:1201
msgid "Invalid OpenID url"
msgstr ""
#: src/Model/User.php:1213 src/Security/Authentication.php:230
#: src/Model/User.php:1214 src/Security/Authentication.php:230
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:1213 src/Security/Authentication.php:230
#: src/Model/User.php:1214 src/Security/Authentication.php:230
msgid "The error message was:"
msgstr ""
#: src/Model/User.php:1219
#: src/Model/User.php:1220
msgid "Please enter the required information."
msgstr ""
#: src/Model/User.php:1233
#: src/Model/User.php:1234
#, 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:1240
#: src/Model/User.php:1241
#, 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:1244
#: src/Model/User.php:1245
#, 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:1252
#: src/Model/User.php:1253
msgid "That doesn't appear to be your full (First Last) name."
msgstr ""
#: src/Model/User.php:1257
#: src/Model/User.php:1258
msgid "Your email domain is not among those allowed on this site."
msgstr ""
#: src/Model/User.php:1261
#: src/Model/User.php:1262
msgid "Not a valid email address."
msgstr ""
#: src/Model/User.php:1264
#: src/Model/User.php:1265
msgid "The nickname was blocked from registration by the nodes admin."
msgstr ""
#: src/Model/User.php:1268 src/Model/User.php:1274
#: src/Model/User.php:1269 src/Model/User.php:1275
msgid "Cannot use that email."
msgstr ""
#: src/Model/User.php:1280
#: src/Model/User.php:1281
msgid "Your nickname can only contain a-z, 0-9 and _."
msgstr ""
#: src/Model/User.php:1288 src/Model/User.php:1345
#: src/Model/User.php:1289 src/Model/User.php:1346
msgid "Nickname is already registered. Please choose another."
msgstr ""
#: src/Model/User.php:1332 src/Model/User.php:1336
#: src/Model/User.php:1333 src/Model/User.php:1337
msgid "An error occurred during registration. Please try again."
msgstr ""
#: src/Model/User.php:1359
#: src/Model/User.php:1360
msgid "An error occurred creating your default profile. Please try again."
msgstr ""
#: src/Model/User.php:1366
#: src/Model/User.php:1367
msgid "An error occurred creating your self contact. Please try again."
msgstr ""
#: src/Model/User.php:1371
#: src/Model/User.php:1372
msgid "Friends"
msgstr ""
#: src/Model/User.php:1375
#: src/Model/User.php:1376
msgid ""
"An error occurred creating your default contact circle. Please try again."
msgstr ""
#: src/Model/User.php:1417
#: src/Model/User.php:1418
msgid "Profile Photos"
msgstr ""
#: src/Model/User.php:1599
#: src/Model/User.php:1600
#, php-format
msgid ""
"\n"
@ -3872,7 +3872,7 @@ msgid ""
"\t\t\tthe administrator of %2$s has set up an account for you."
msgstr ""
#: src/Model/User.php:1602
#: src/Model/User.php:1603
#, php-format
msgid ""
"\n"
@ -3908,12 +3908,12 @@ msgid ""
"\t\tThank you and welcome to %4$s."
msgstr ""
#: src/Model/User.php:1634 src/Model/User.php:1740
#: src/Model/User.php:1635 src/Model/User.php:1741
#, php-format
msgid "Registration details for %s"
msgstr ""
#: src/Model/User.php:1654
#: src/Model/User.php:1655
#, php-format
msgid ""
"\n"
@ -3929,12 +3929,12 @@ msgid ""
"\t\t"
msgstr ""
#: src/Model/User.php:1673
#: src/Model/User.php:1674
#, php-format
msgid "Registration at %s"
msgstr ""
#: src/Model/User.php:1697
#: src/Model/User.php:1698
#, php-format
msgid ""
"\n"
@ -3943,7 +3943,7 @@ msgid ""
"\t\t\t"
msgstr ""
#: src/Model/User.php:1705
#: src/Model/User.php:1706
#, php-format
msgid ""
"\n"
@ -3981,7 +3981,7 @@ msgid ""
"\t\t\tThank you and welcome to %2$s."
msgstr ""
#: src/Model/User.php:1767
#: src/Model/User.php:1768
msgid ""
"User with delegates can't be removed, please remove delegate users first"
msgstr ""
@ -4053,7 +4053,7 @@ msgstr ""
#: src/Module/Admin/Addons/Index.php:69 src/Module/Admin/Features.php:83
#: src/Module/Admin/Logs/Settings.php:87 src/Module/Admin/Site.php:460
#: src/Module/Admin/Themes/Index.php:113 src/Module/Admin/Tos.php:86
#: src/Module/Settings/Account.php:551 src/Module/Settings/Addons.php:78
#: src/Module/Settings/Account.php:558 src/Module/Settings/Addons.php:78
#: src/Module/Settings/Connectors.php:160
#: src/Module/Settings/Connectors.php:246
#: src/Module/Settings/Delegation.php:193 src/Module/Settings/Display.php:312
@ -7957,29 +7957,33 @@ msgid "Public Group"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:122 src/Module/Settings/Account.php:503
msgid "Public Group - Restricted"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:123 src/Module/Settings/Account.php:510
msgid "Automatic Friend Page"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:123
#: src/Module/Moderation/BaseUsers.php:124
msgid "Private Group"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:126 src/Module/Moderation/Summary.php:53
#: src/Module/Moderation/BaseUsers.php:127 src/Module/Moderation/Summary.php:53
#: src/Module/Settings/Account.php:453
msgid "Personal Page"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:127 src/Module/Moderation/Summary.php:54
#: src/Module/Moderation/BaseUsers.php:128 src/Module/Moderation/Summary.php:54
#: src/Module/Settings/Account.php:460
msgid "Organisation Page"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:128 src/Module/Moderation/Summary.php:55
#: src/Module/Moderation/BaseUsers.php:129 src/Module/Moderation/Summary.php:55
#: src/Module/Settings/Account.php:467
msgid "News Page"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:129 src/Module/Moderation/Summary.php:56
#: src/Module/Moderation/BaseUsers.php:130 src/Module/Moderation/Summary.php:56
#: src/Module/Settings/Account.php:474
msgid "Community Group"
msgstr ""
@ -9376,7 +9380,7 @@ msgid "Please repeat your e-mail address:"
msgstr ""
#: src/Module/Register.php:163 src/Module/Security/PasswordTooLong.php:100
#: src/Module/Settings/Account.php:557
#: src/Module/Settings/Account.php:564
msgid "New Password:"
msgstr ""
@ -9385,7 +9389,7 @@ msgid "Leave empty for an auto generated password."
msgstr ""
#: src/Module/Register.php:164 src/Module/Security/PasswordTooLong.php:101
#: src/Module/Settings/Account.php:558
#: src/Module/Settings/Account.php:565
msgid "Confirm:"
msgstr ""
@ -9611,24 +9615,24 @@ msgid "Update Password"
msgstr ""
#: src/Module/Security/PasswordTooLong.php:99
#: src/Module/Settings/Account.php:559
#: src/Module/Settings/Account.php:566
msgid "Current Password:"
msgstr ""
#: src/Module/Security/PasswordTooLong.php:99
#: src/Module/Settings/Account.php:559
#: src/Module/Settings/Account.php:566
msgid "Your current password to confirm the changes"
msgstr ""
#: src/Module/Security/PasswordTooLong.php:100
#: src/Module/Settings/Account.php:543
#: src/Module/Settings/Account.php:550
msgid ""
"Allowed characters are a-z, A-Z, 0-9 and special characters except white "
"spaces and accentuated letters."
msgstr ""
#: src/Module/Security/PasswordTooLong.php:100
#: src/Module/Settings/Account.php:544
#: src/Module/Settings/Account.php:551
msgid "Password length is limited to 72 characters."
msgstr ""
@ -9826,32 +9830,36 @@ msgid "Automatically approves all contact requests."
msgstr ""
#: src/Module/Settings/Account.php:505
msgid "Contact requests have to be manually approved."
msgstr ""
#: src/Module/Settings/Account.php:512
msgid ""
"Account for a popular profile that automatically approves contact requests "
"as \"Friends\"."
msgstr ""
#: src/Module/Settings/Account.php:510
#: src/Module/Settings/Account.php:517
msgid "Private Group [Experimental]"
msgstr ""
#: src/Module/Settings/Account.php:512
#: src/Module/Settings/Account.php:519
msgid "Requires manual approval of contact requests."
msgstr ""
#: src/Module/Settings/Account.php:521
#: src/Module/Settings/Account.php:528
msgid "OpenID:"
msgstr ""
#: src/Module/Settings/Account.php:521
#: src/Module/Settings/Account.php:528
msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
#: src/Module/Settings/Account.php:529
#: src/Module/Settings/Account.php:536
msgid "Publish your profile in your local site directory?"
msgstr ""
#: src/Module/Settings/Account.php:529
#: src/Module/Settings/Account.php:536
#, php-format
msgid ""
"Your profile will be published in this node's <a href=\"%s\">local "
@ -9859,94 +9867,94 @@ msgid ""
"system settings."
msgstr ""
#: src/Module/Settings/Account.php:535
#: src/Module/Settings/Account.php:542
#, php-format
msgid ""
"Your profile will also be published in the global friendica directories (e."
"g. <a href=\"%s\">%s</a>)."
msgstr ""
#: src/Module/Settings/Account.php:548
#: src/Module/Settings/Account.php:555
msgid "Account Settings"
msgstr ""
#: src/Module/Settings/Account.php:549
#: src/Module/Settings/Account.php:556
#, php-format
msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
msgstr ""
#: src/Module/Settings/Account.php:556
#: src/Module/Settings/Account.php:563
msgid "Password Settings"
msgstr ""
#: src/Module/Settings/Account.php:558
#: src/Module/Settings/Account.php:565
msgid "Leave password fields blank unless changing"
msgstr ""
#: src/Module/Settings/Account.php:560
#: src/Module/Settings/Account.php:567
msgid "Password:"
msgstr ""
#: src/Module/Settings/Account.php:560
#: src/Module/Settings/Account.php:567
msgid "Your current password to confirm the changes of the email address"
msgstr ""
#: src/Module/Settings/Account.php:563
#: src/Module/Settings/Account.php:570
msgid "Delete OpenID URL"
msgstr ""
#: src/Module/Settings/Account.php:565
#: src/Module/Settings/Account.php:572
msgid "Basic Settings"
msgstr ""
#: src/Module/Settings/Account.php:566
#: src/Module/Settings/Account.php:573
#: src/Module/Settings/Profile/Index.php:283
msgid "Display name:"
msgstr ""
#: src/Module/Settings/Account.php:567
#: src/Module/Settings/Account.php:574
msgid "Email Address:"
msgstr ""
#: src/Module/Settings/Account.php:568
#: src/Module/Settings/Account.php:575
msgid "Your Timezone:"
msgstr ""
#: src/Module/Settings/Account.php:569
#: src/Module/Settings/Account.php:576
msgid "Your Language:"
msgstr ""
#: src/Module/Settings/Account.php:569
#: src/Module/Settings/Account.php:576
msgid ""
"Set the language we use to show you friendica interface and to send you "
"emails"
msgstr ""
#: src/Module/Settings/Account.php:570
#: src/Module/Settings/Account.php:577
msgid "Default Post Location:"
msgstr ""
#: src/Module/Settings/Account.php:571
#: src/Module/Settings/Account.php:578
msgid "Use Browser Location:"
msgstr ""
#: src/Module/Settings/Account.php:573
#: src/Module/Settings/Account.php:580
msgid "Security and Privacy Settings"
msgstr ""
#: src/Module/Settings/Account.php:575
#: src/Module/Settings/Account.php:582
msgid "Maximum Friend Requests/Day:"
msgstr ""
#: src/Module/Settings/Account.php:575
#: src/Module/Settings/Account.php:582
msgid "(to prevent spam abuse)"
msgstr ""
#: src/Module/Settings/Account.php:577
#: src/Module/Settings/Account.php:584
msgid "Allow your profile to be searchable globally?"
msgstr ""
#: src/Module/Settings/Account.php:577
#: src/Module/Settings/Account.php:584
msgid ""
"Activate this setting if you want others to easily find and follow you. Your "
"profile will be searchable on remote systems. This setting also determines "
@ -9954,43 +9962,43 @@ msgid ""
"indexed or not."
msgstr ""
#: src/Module/Settings/Account.php:578
#: src/Module/Settings/Account.php:585
msgid "Hide your contact/friend list from viewers of your profile?"
msgstr ""
#: src/Module/Settings/Account.php:578
#: src/Module/Settings/Account.php:585
msgid ""
"A list of your contacts is displayed on your profile page. Activate this "
"option to disable the display of your contact list."
msgstr ""
#: src/Module/Settings/Account.php:579
#: src/Module/Settings/Account.php:586
msgid "Hide your public content from anonymous viewers"
msgstr ""
#: src/Module/Settings/Account.php:579
#: src/Module/Settings/Account.php:586
msgid ""
"Anonymous visitors will only see your basic profile details. Your public "
"posts and replies will still be freely accessible on the remote servers of "
"your followers and through relays."
msgstr ""
#: src/Module/Settings/Account.php:580
#: src/Module/Settings/Account.php:587
msgid "Make public posts unlisted"
msgstr ""
#: src/Module/Settings/Account.php:580
#: src/Module/Settings/Account.php:587
msgid ""
"Your public posts will not appear on the community pages or in search "
"results, nor be sent to relay servers. However they can still appear on "
"public feeds on remote servers."
msgstr ""
#: src/Module/Settings/Account.php:581
#: src/Module/Settings/Account.php:588
msgid "Make all posted pictures accessible"
msgstr ""
#: src/Module/Settings/Account.php:581
#: src/Module/Settings/Account.php:588
msgid ""
"This option makes every posted picture accessible via the direct link. This "
"is a workaround for the problem that most other networks can't handle "
@ -9998,227 +10006,227 @@ msgid ""
"public on your photo albums though."
msgstr ""
#: src/Module/Settings/Account.php:582
#: src/Module/Settings/Account.php:589
msgid "Allow friends to post to your profile page?"
msgstr ""
#: src/Module/Settings/Account.php:582
#: src/Module/Settings/Account.php:589
msgid ""
"Your contacts may write posts on your profile wall. These posts will be "
"distributed to your contacts"
msgstr ""
#: src/Module/Settings/Account.php:583
#: src/Module/Settings/Account.php:590
msgid "Allow friends to tag your posts?"
msgstr ""
#: src/Module/Settings/Account.php:583
#: src/Module/Settings/Account.php:590
msgid "Your contacts can add additional tags to your posts."
msgstr ""
#: src/Module/Settings/Account.php:584
#: src/Module/Settings/Account.php:591
msgid "Default privacy circle for new contacts"
msgstr ""
#: src/Module/Settings/Account.php:585
#: src/Module/Settings/Account.php:592
msgid "Default privacy circle for new group contacts"
msgstr ""
#: src/Module/Settings/Account.php:586
#: src/Module/Settings/Account.php:593
msgid "Default Post Permissions"
msgstr ""
#: src/Module/Settings/Account.php:590
#: src/Module/Settings/Account.php:597
msgid "Expiration settings"
msgstr ""
#: src/Module/Settings/Account.php:591
#: src/Module/Settings/Account.php:598
msgid "Automatically expire posts after this many days:"
msgstr ""
#: src/Module/Settings/Account.php:591
#: src/Module/Settings/Account.php:598
msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr ""
#: src/Module/Settings/Account.php:592
#: src/Module/Settings/Account.php:599
msgid "Expire posts"
msgstr ""
#: src/Module/Settings/Account.php:592
#: src/Module/Settings/Account.php:599
msgid "When activated, posts and comments will be expired."
msgstr ""
#: src/Module/Settings/Account.php:593
#: src/Module/Settings/Account.php:600
msgid "Expire personal notes"
msgstr ""
#: src/Module/Settings/Account.php:593
#: src/Module/Settings/Account.php:600
msgid ""
"When activated, the personal notes on your profile page will be expired."
msgstr ""
#: src/Module/Settings/Account.php:594
#: src/Module/Settings/Account.php:601
msgid "Expire starred posts"
msgstr ""
#: src/Module/Settings/Account.php:594
#: src/Module/Settings/Account.php:601
msgid ""
"Starring posts keeps them from being expired. That behaviour is overwritten "
"by this setting."
msgstr ""
#: src/Module/Settings/Account.php:595
#: src/Module/Settings/Account.php:602
msgid "Only expire posts by others"
msgstr ""
#: src/Module/Settings/Account.php:595
#: src/Module/Settings/Account.php:602
msgid ""
"When activated, your own posts never expire. Then the settings above are "
"only valid for posts you received."
msgstr ""
#: src/Module/Settings/Account.php:598
#: src/Module/Settings/Account.php:605
msgid "Notification Settings"
msgstr ""
#: src/Module/Settings/Account.php:599
#: src/Module/Settings/Account.php:606
msgid "Send a notification email when:"
msgstr ""
#: src/Module/Settings/Account.php:600
#: src/Module/Settings/Account.php:607
msgid "You receive an introduction"
msgstr ""
#: src/Module/Settings/Account.php:601
#: src/Module/Settings/Account.php:608
msgid "Your introductions are confirmed"
msgstr ""
#: src/Module/Settings/Account.php:602
#: src/Module/Settings/Account.php:609
msgid "Someone writes on your profile wall"
msgstr ""
#: src/Module/Settings/Account.php:603
#: src/Module/Settings/Account.php:610
msgid "Someone writes a followup comment"
msgstr ""
#: src/Module/Settings/Account.php:604
#: src/Module/Settings/Account.php:611
msgid "You receive a private message"
msgstr ""
#: src/Module/Settings/Account.php:605
#: src/Module/Settings/Account.php:612
msgid "You receive a friend suggestion"
msgstr ""
#: src/Module/Settings/Account.php:606
#: src/Module/Settings/Account.php:613
msgid "You are tagged in a post"
msgstr ""
#: src/Module/Settings/Account.php:608
#: src/Module/Settings/Account.php:615
msgid "Create a desktop notification when:"
msgstr ""
#: src/Module/Settings/Account.php:609
#: src/Module/Settings/Account.php:616
msgid "Someone tagged you"
msgstr ""
#: src/Module/Settings/Account.php:610
#: src/Module/Settings/Account.php:617
msgid "Someone directly commented on your post"
msgstr ""
#: src/Module/Settings/Account.php:611
#: src/Module/Settings/Account.php:618
msgid "Someone liked your content"
msgstr ""
#: src/Module/Settings/Account.php:611 src/Module/Settings/Account.php:612
#: src/Module/Settings/Account.php:618 src/Module/Settings/Account.php:619
msgid "Can only be enabled, when the direct comment notification is enabled."
msgstr ""
#: src/Module/Settings/Account.php:612
#: src/Module/Settings/Account.php:619
msgid "Someone shared your content"
msgstr ""
#: src/Module/Settings/Account.php:613
#: src/Module/Settings/Account.php:620
msgid "Someone commented in your thread"
msgstr ""
#: src/Module/Settings/Account.php:614
#: src/Module/Settings/Account.php:621
msgid "Someone commented in a thread where you commented"
msgstr ""
#: src/Module/Settings/Account.php:615
#: src/Module/Settings/Account.php:622
msgid "Someone commented in a thread where you interacted"
msgstr ""
#: src/Module/Settings/Account.php:617
#: src/Module/Settings/Account.php:624
msgid "Activate desktop notifications"
msgstr ""
#: src/Module/Settings/Account.php:617
#: src/Module/Settings/Account.php:624
msgid "Show desktop popup on new notifications"
msgstr ""
#: src/Module/Settings/Account.php:621
#: src/Module/Settings/Account.php:628
msgid "Text-only notification emails"
msgstr ""
#: src/Module/Settings/Account.php:623
#: src/Module/Settings/Account.php:630
msgid "Send text only notification emails, without the html part"
msgstr ""
#: src/Module/Settings/Account.php:627
#: src/Module/Settings/Account.php:634
msgid "Show detailled notifications"
msgstr ""
#: src/Module/Settings/Account.php:629
#: src/Module/Settings/Account.php:636
msgid ""
"Per default, notifications are condensed to a single notification per item. "
"When enabled every notification is displayed."
msgstr ""
#: src/Module/Settings/Account.php:633
#: src/Module/Settings/Account.php:640
msgid "Show notifications of ignored contacts"
msgstr ""
#: src/Module/Settings/Account.php:635
#: src/Module/Settings/Account.php:642
msgid ""
"You don't see posts from ignored contacts. But you still see their comments. "
"This setting controls if you want to still receive regular notifications "
"that are caused by ignored contacts or not."
msgstr ""
#: src/Module/Settings/Account.php:638
#: src/Module/Settings/Account.php:645
msgid "Advanced Account/Page Type Settings"
msgstr ""
#: src/Module/Settings/Account.php:639
#: src/Module/Settings/Account.php:646
msgid "Change the behaviour of this account for special situations"
msgstr ""
#: src/Module/Settings/Account.php:642
#: src/Module/Settings/Account.php:649
msgid "Import Contacts"
msgstr ""
#: src/Module/Settings/Account.php:643
#: src/Module/Settings/Account.php:650
msgid ""
"Upload a CSV file that contains the handle of your followed accounts in the "
"first column you exported from the old account."
msgstr ""
#: src/Module/Settings/Account.php:644
#: src/Module/Settings/Account.php:651
msgid "Upload File"
msgstr ""
#: src/Module/Settings/Account.php:647
#: src/Module/Settings/Account.php:654
msgid "Relocate"
msgstr ""
#: src/Module/Settings/Account.php:648
#: src/Module/Settings/Account.php:655
msgid ""
"If you have moved this profile from another server, and some of your "
"contacts don't receive your updates, try pushing this button."
msgstr ""
#: src/Module/Settings/Account.php:649
#: src/Module/Settings/Account.php:656
msgid "Resend relocate message to contacts"
msgstr ""

Wyświetl plik

@ -15,6 +15,7 @@
<div id="account-type-sub-3" class="pageflags">
<h5>{{$community}}</h5>
{{include file="field_radio.tpl" field=$page_community}}
{{include file="field_radio.tpl" field=$page_community_manually}}
{{include file="field_radio.tpl" field=$page_prvgroup}}
</div>

Wyświetl plik

@ -76,6 +76,7 @@
{{if $u.page_flags_raw==3}}fa-heart{{/if}} {{* PAGE_FREELOVE *}}
{{if $u.page_flags_raw==4}}fa-rss{{/if}} {{* PAGE_BLOG *}}
{{if $u.page_flags_raw==5}}fa-user-secret{{/if}} {{* PAGE_PRVGROUP *}}
{{if $u.page_flags_raw==6}}fa-users{{/if}} {{* PAGE_COMM_MAN *}}
" title="{{$u.page_flags}}">
</i>
{{if $u.page_flags_raw==0 && $u.account_type_raw > 0}}

Wyświetl plik

@ -75,7 +75,8 @@
{{if $u.page_flags_raw==3}}fa-heart{{/if}} {{* PAGE_FREELOVE *}}
{{if $u.page_flags_raw==4}}fa-rss{{/if}} {{* PAGE_BLOG *}}
{{if $u.page_flags_raw==5}}fa-user-secret{{/if}} {{* PAGE_PRVGROUP *}}
" title="{{$u.page_flags}}">
{{if $u.page_flags_raw==6}}fa-users{{/if}} {{* PAGE_COMM_MAN *}}
" title="{{$u.page_flags}}">
</i>
{{if $u.page_flags_raw==0 && $u.account_type_raw > 0}}
<i class="fa

Wyświetl plik

@ -76,6 +76,7 @@
{{if $u.page_flags_raw==3}}fa-heart{{/if}} {{* PAGE_FREELOVE *}}
{{if $u.page_flags_raw==4}}fa-rss{{/if}} {{* PAGE_BLOG *}}
{{if $u.page_flags_raw==5}}fa-user-secret{{/if}} {{* PAGE_PRVGROUP *}}
{{if $u.page_flags_raw==6}}fa-users{{/if}} {{* PAGE_COMM_MAN *}}
" title="{{$u.page_flags}}">
</i>
{{if $u.page_flags_raw==0 && $u.account_type_raw > 0}}