Merge pull request #12109 from tobiasd/verify-homepage-relme

Verify homepage by checking for a rel-me link back to the user profile
This commit is contained in:
Hypolite Petovan 2022-11-07 07:56:00 -05:00 committed by GitHub
commit 6cb6841866
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 252 additions and 119 deletions

View File

@ -1,6 +1,6 @@
-- ------------------------------------------ -- ------------------------------------------
-- Friendica 2022.12-dev (Giant Rhubarb) -- Friendica 2022.12-dev (Giant Rhubarb)
-- DB_UPDATE_VERSION 1486 -- DB_UPDATE_VERSION 1487
-- ------------------------------------------ -- ------------------------------------------
@ -1577,6 +1577,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`education` text COMMENT 'Deprecated', `education` text COMMENT 'Deprecated',
`contact` text COMMENT 'Deprecated', `contact` text COMMENT 'Deprecated',
`homepage` varchar(255) NOT NULL DEFAULT '' COMMENT '', `homepage` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`homepage_verified` boolean NOT NULL DEFAULT '0' COMMENT 'was the homepage verified by a rel-me link back to the profile',
`xmpp` varchar(255) NOT NULL DEFAULT '' COMMENT 'XMPP address', `xmpp` varchar(255) NOT NULL DEFAULT '' COMMENT 'XMPP address',
`matrix` varchar(255) NOT NULL DEFAULT '' COMMENT 'Matrix address', `matrix` varchar(255) NOT NULL DEFAULT '' COMMENT 'Matrix address',
`photo` varbinary(383) NOT NULL DEFAULT '' COMMENT '', `photo` varbinary(383) NOT NULL DEFAULT '' COMMENT '',
@ -2674,6 +2675,7 @@ CREATE VIEW `owner-view` AS SELECT
`profile`.`postal-code` AS `postal-code`, `profile`.`postal-code` AS `postal-code`,
`profile`.`country-name` AS `country-name`, `profile`.`country-name` AS `country-name`,
`profile`.`homepage` AS `homepage`, `profile`.`homepage` AS `homepage`,
`profile`.`homepage_verified` AS `homepage_verified`,
`profile`.`dob` AS `dob` `profile`.`dob` AS `dob`
FROM `user` FROM `user`
INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`

View File

@ -6,51 +6,52 @@ user profiles data
Fields Fields
------ ------
| Field | Description | Type | Null | Key | Default | Extra | | Field | Description | Type | Null | Key | Default | Extra |
| ------------ | --------------------------------------------- | ------------------ | ---- | --- | ---------- | -------------- | | ----------------- | -------------------------------------------------------------- | ------------------ | ---- | --- | ---------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment | | id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| uid | Owner User id | mediumint unsigned | NO | | 0 | | | uid | Owner User id | mediumint unsigned | NO | | 0 | |
| profile-name | Deprecated | varchar(255) | YES | | NULL | | | profile-name | Deprecated | varchar(255) | YES | | NULL | |
| is-default | Deprecated | boolean | YES | | NULL | | | is-default | Deprecated | boolean | YES | | NULL | |
| hide-friends | Hide friend list from viewers of this profile | boolean | NO | | 0 | | | hide-friends | Hide friend list from viewers of this profile | boolean | NO | | 0 | |
| name | | varchar(255) | NO | | | | | name | | varchar(255) | NO | | | |
| pdesc | Deprecated | varchar(255) | YES | | NULL | | | pdesc | Deprecated | varchar(255) | YES | | NULL | |
| dob | Day of birth | varchar(32) | NO | | 0000-00-00 | | | dob | Day of birth | varchar(32) | NO | | 0000-00-00 | |
| address | | varchar(255) | NO | | | | | address | | varchar(255) | NO | | | |
| locality | | varchar(255) | NO | | | | | locality | | varchar(255) | NO | | | |
| region | | varchar(255) | NO | | | | | region | | varchar(255) | NO | | | |
| postal-code | | varchar(32) | NO | | | | | postal-code | | varchar(32) | NO | | | |
| country-name | | varchar(255) | NO | | | | | country-name | | varchar(255) | NO | | | |
| hometown | Deprecated | varchar(255) | YES | | NULL | | | hometown | Deprecated | varchar(255) | YES | | NULL | |
| gender | Deprecated | varchar(32) | YES | | NULL | | | gender | Deprecated | varchar(32) | YES | | NULL | |
| marital | Deprecated | varchar(255) | YES | | NULL | | | marital | Deprecated | varchar(255) | YES | | NULL | |
| with | Deprecated | text | YES | | NULL | | | with | Deprecated | text | YES | | NULL | |
| howlong | Deprecated | datetime | YES | | NULL | | | howlong | Deprecated | datetime | YES | | NULL | |
| sexual | Deprecated | varchar(255) | YES | | NULL | | | sexual | Deprecated | varchar(255) | YES | | NULL | |
| politic | Deprecated | varchar(255) | YES | | NULL | | | politic | Deprecated | varchar(255) | YES | | NULL | |
| religion | Deprecated | varchar(255) | YES | | NULL | | | religion | Deprecated | varchar(255) | YES | | NULL | |
| pub_keywords | | text | YES | | NULL | | | pub_keywords | | text | YES | | NULL | |
| prv_keywords | | text | YES | | NULL | | | prv_keywords | | text | YES | | NULL | |
| likes | Deprecated | text | YES | | NULL | | | likes | Deprecated | text | YES | | NULL | |
| dislikes | Deprecated | text | YES | | NULL | | | dislikes | Deprecated | text | YES | | NULL | |
| about | Profile description | text | YES | | NULL | | | about | Profile description | text | YES | | NULL | |
| summary | Deprecated | varchar(255) | YES | | NULL | | | summary | Deprecated | varchar(255) | YES | | NULL | |
| music | Deprecated | text | YES | | NULL | | | music | Deprecated | text | YES | | NULL | |
| book | Deprecated | text | YES | | NULL | | | book | Deprecated | text | YES | | NULL | |
| tv | Deprecated | text | YES | | NULL | | | tv | Deprecated | text | YES | | NULL | |
| film | Deprecated | text | YES | | NULL | | | film | Deprecated | text | YES | | NULL | |
| interest | Deprecated | text | YES | | NULL | | | interest | Deprecated | text | YES | | NULL | |
| romance | Deprecated | text | YES | | NULL | | | romance | Deprecated | text | YES | | NULL | |
| work | Deprecated | text | YES | | NULL | | | work | Deprecated | text | YES | | NULL | |
| education | Deprecated | text | YES | | NULL | | | education | Deprecated | text | YES | | NULL | |
| contact | Deprecated | text | YES | | NULL | | | contact | Deprecated | text | YES | | NULL | |
| homepage | | varchar(255) | NO | | | | | homepage | | varchar(255) | NO | | | |
| xmpp | XMPP address | varchar(255) | NO | | | | | homepage_verified | was the homepage verified by a rel-me link back to the profile | boolean | NO | | 0 | |
| matrix | Matrix address | varchar(255) | NO | | | | | xmpp | XMPP address | varchar(255) | NO | | | |
| photo | | varbinary(383) | NO | | | | | matrix | Matrix address | varchar(255) | NO | | | |
| thumb | | varbinary(383) | NO | | | | | photo | | varbinary(383) | NO | | | |
| publish | publish default profile in local directory | boolean | NO | | 0 | | | thumb | | varbinary(383) | NO | | | |
| net-publish | publish profile in global directory | boolean | NO | | 0 | | | publish | publish default profile in local directory | boolean | NO | | 0 | |
| net-publish | publish profile in global directory | boolean | NO | | 0 | |
Indexes Indexes
------------ ------------

View File

@ -38,6 +38,7 @@ use Friendica\Module\Security\Login;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Temporal; use Friendica\Util\Temporal;
use Friendica\Core\Worker;
class Index extends BaseSettings class Index extends BaseSettings
{ {
@ -127,6 +128,8 @@ class Index extends BaseSettings
DI::userSession()->getLocalUserId() DI::userSession()->getLocalUserId()
); );
Worker::add(Worker::PRIORITY_MEDIUM, 'CheckRelMeProfileLink', DI::userSession()->getLocalUserId());
if (!$result) { if (!$result) {
DI::sysmsg()->addNotice(DI::l10n()->t('Profile couldn\'t be updated.')); DI::sysmsg()->addNotice(DI::l10n()->t('Profile couldn\'t be updated.'));
return; return;
@ -210,6 +213,12 @@ class Index extends BaseSettings
$personal_account = ($profile['account-type'] != User::ACCOUNT_TYPE_COMMUNITY); $personal_account = ($profile['account-type'] != User::ACCOUNT_TYPE_COMMUNITY);
if ($profile['homepage_verified']) {
$homepage_help_text = DI::l10n()->t('The homepage is verified. A rel="me" link back to your Friendica profile page was found on the homepage.');
} else {
$homepage_help_text = DI::l10n()->t('To verify your homepage, add a rel="me" link to it, pointing to your profile URL (%s).', $profile['url']);
}
$tpl = Renderer::getMarkupTemplate('settings/profile/index.tpl'); $tpl = Renderer::getMarkupTemplate('settings/profile/index.tpl');
$o .= Renderer::replaceMacros($tpl, [ $o .= Renderer::replaceMacros($tpl, [
'$personal_account' => $personal_account, '$personal_account' => $personal_account,
@ -245,7 +254,7 @@ class Index extends BaseSettings
'$age' => ((intval($profile['dob'])) ? '(' . DI::l10n()->t('Age: ') . DI::l10n()->tt('%d year old', '%d years old', Temporal::getAgeByTimezone($profile['dob'], $profile['timezone'])) . ')' : ''), '$age' => ((intval($profile['dob'])) ? '(' . DI::l10n()->t('Age: ') . DI::l10n()->tt('%d year old', '%d years old', Temporal::getAgeByTimezone($profile['dob'], $profile['timezone'])) . ')' : ''),
'$xmpp' => ['xmpp', DI::l10n()->t('XMPP (Jabber) address:'), $profile['xmpp'], DI::l10n()->t('The XMPP address will be published so that people can follow you there.')], '$xmpp' => ['xmpp', DI::l10n()->t('XMPP (Jabber) address:'), $profile['xmpp'], DI::l10n()->t('The XMPP address will be published so that people can follow you there.')],
'$matrix' => ['matrix', DI::l10n()->t('Matrix (Element) address:'), $profile['matrix'], DI::l10n()->t('The Matrix address will be published so that people can follow you there.')], '$matrix' => ['matrix', DI::l10n()->t('Matrix (Element) address:'), $profile['matrix'], DI::l10n()->t('The Matrix address will be published so that people can follow you there.')],
'$homepage' => ['homepage', DI::l10n()->t('Homepage URL:'), $profile['homepage']], '$homepage' => ['homepage', DI::l10n()->t('Homepage URL:'), $profile['homepage'], $homepage_help_text],
'$pub_keywords' => ['pub_keywords', DI::l10n()->t('Public Keywords:'), $profile['pub_keywords'], DI::l10n()->t('(Used for suggesting potential friends, can be seen by others)')], '$pub_keywords' => ['pub_keywords', DI::l10n()->t('Public Keywords:'), $profile['pub_keywords'], DI::l10n()->t('(Used for suggesting potential friends, can be seen by others)')],
'$prv_keywords' => ['prv_keywords', DI::l10n()->t('Private Keywords:'), $profile['prv_keywords'], DI::l10n()->t('(Used for searching profiles, never shown to others)')], '$prv_keywords' => ['prv_keywords', DI::l10n()->t('Private Keywords:'), $profile['prv_keywords'], DI::l10n()->t('(Used for searching profiles, never shown to others)')],
'$custom_fields_description' => DI::l10n()->t("<p>Custom fields appear on <a href=\"%s\">your profile page</a>.</p> '$custom_fields_description' => DI::l10n()->t("<p>Custom fields appear on <a href=\"%s\">your profile page</a>.</p>

View File

@ -0,0 +1,98 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, 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\Worker;
use DOMDocument;
use Friendica\DI;
use Friendica\Core\Logger;
use Friendica\Model\Profile;
use Friendica\Model\User;
use Friendica\Network\HTTPClient\Client\HttpClientAccept;
use Friendica\Network\HTTPClient\Client\HttpClientOptions;
use Friendica\Util\Network;
use Friendica\Util\Strings;
/* This class is used to verify the homepage link of a user profile.
* To do so, we look for rel="me" links in the given homepage, if one
* of them points to the Friendica profile of the user, a verification
* mark is added to the link.
*
* To reverse the process, if a homepage link is given, it is displayed
* with the rel="me" attribute as well, so that 3rd party tools can
* verify the connection between the two pages.
*
* This task will be performed by the worker on a daily basis _and_ every
* time the user changes their homepage link. In the first case the priority
* of the task is set to LOW, with the second case it is MEDIUM.
*
* rel-me microformat docs https://microformats.org/wiki/rel-me
*/
class CheckRelMeProfileLink
{
/* Cheks the homepage of a profile for a rel-me link back to the user profile
*
* @param $uid (int) the UID of the user
*/
public static function execute(int $uid)
{
Logger::notice('Verifying the homepage', ['uid' => $uid]);
Profile::update(['homepage_verified' => false], $uid);
$homepageUrlVerified = false;
$owner = User::getOwnerDataById($uid);
if (!empty($owner['homepage'])) {
$xrd_timeout = DI::config()->get('system', 'xrd_timeout');
$curlResult = DI::httpClient()->get($owner['homepage'], $accept_content = HttpClientAccept::HTML, [HttpClientOptions::TIMEOUT => $xrd_timeout]);
if ($curlResult->isSuccess()) {
$content = $curlResult->getBody();
if (!$content) {
Logger::notice('Empty body of the fetched homepage link). Cannot verify the relation to profile of UID %s.', ['uid' => $uid, 'owner homepage' => $owner['homepage']]);
} else {
$doc = new DOMDocument();
$doc->loadHTML($content);
if (!$doc) {
Logger::notice('Could not parse the content');
} else {
foreach ($doc->getElementsByTagName('a') as $link) {
$rel = $link->getAttribute('rel');
if ($rel == 'me') {
$href = $link->getAttribute('href');
if (!$homepageUrlVerified && Network::isValidHttpUrl($href)) {
$homepageUrlVerified = Strings::compareLink($owner['url'], $href);
}
}
}
}
if ($homepageUrlVerified) {
Profile::update(['homepage_verified' => true], $uid);
Logger::notice('Homepage URL verified', ['uid' => $uid, 'owner homepage' => $owner['homepage']]);
} else {
Logger::notice('Homepage URL could not be verified', ['uid' => $uid, 'owner homepage' => $owner['homepage']]);
}
}
} else {
Logger::notice('Could not cURL the homepage URL', ['owner homepage' => $owner['homepage']]);
}
} else {
Logger::notice('The user has no homepage link.', ['uid' => $uid]);
}
}
}

View File

@ -27,6 +27,7 @@ use Friendica\Core\Worker;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Model\Tag; use Friendica\Model\Tag;
use Friendica\Model\User;
use Friendica\Protocol\ActivityPub\Queue; use Friendica\Protocol\ActivityPub\Queue;
use Friendica\Protocol\Relay; use Friendica\Protocol\Relay;
@ -85,6 +86,7 @@ class Cron
// Hourly cron calls // Hourly cron calls
if (DI::config()->get('system', 'last_cron_hourly', 0) + 3600 < time()) { if (DI::config()->get('system', 'last_cron_hourly', 0) + 3600 < time()) {
// Update trending tags cache for the community page // Update trending tags cache for the community page
Tag::setLocalTrendingHashtags(24, 20); Tag::setLocalTrendingHashtags(24, 20);
Tag::setGlobalTrendingHashtags(24, 20); Tag::setGlobalTrendingHashtags(24, 20);
@ -132,6 +134,10 @@ class Cron
Worker::add(Worker::PRIORITY_LOW, 'OptimizeTables'); Worker::add(Worker::PRIORITY_LOW, 'OptimizeTables');
} }
foreach (User::getList(1, PHP_INT_MAX, 'active') as $user) {
Worker::add(Worker::PRIORITY_LOW, 'CheckRelMeProfileLink', $user['uid']);
}
// Resubscribe to relay servers // Resubscribe to relay servers
Relay::reSubscribe(); Relay::reSubscribe();

View File

@ -55,7 +55,7 @@
use Friendica\Database\DBA; use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) { if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1486); define('DB_UPDATE_VERSION', 1487);
} }
return [ return [
@ -1580,6 +1580,7 @@ return [
"education" => ["type" => "text", "comment" => "Deprecated"], "education" => ["type" => "text", "comment" => "Deprecated"],
"contact" => ["type" => "text", "comment" => "Deprecated"], "contact" => ["type" => "text", "comment" => "Deprecated"],
"homepage" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "homepage" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"homepage_verified" => ["type" => "boolean", "not null" => 1, "default" => "0", "comment" => "was the homepage verified by a rel-me link back to the profile"],
"xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "XMPP address"], "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "XMPP address"],
"matrix" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Matrix address"], "matrix" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Matrix address"],
"photo" => ["type" => "varbinary(383)", "not null" => "1", "default" => "", "comment" => ""], "photo" => ["type" => "varbinary(383)", "not null" => "1", "default" => "", "comment" => ""],

View File

@ -919,6 +919,7 @@
"postal-code" => ["profile", "postal-code"], "postal-code" => ["profile", "postal-code"],
"country-name" => ["profile", "country-name"], "country-name" => ["profile", "country-name"],
"homepage" => ["profile", "homepage"], "homepage" => ["profile", "homepage"],
"homepage_verified" => ["profile", "homepage_verified"],
"dob" => ["profile", "dob"], "dob" => ["profile", "dob"],
], ],
"query" => "FROM `user` "query" => "FROM `user`

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 2022.12-dev\n" "Project-Id-Version: 2022.12-dev\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-11-05 19:31-0400\n" "POT-Creation-Date: 2022-11-07 11:21+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -369,7 +369,7 @@ msgid "Event Finishes:"
msgstr "" msgstr ""
#: mod/events.php:503 src/Module/Profile/Profile.php:171 #: mod/events.php:503 src/Module/Profile/Profile.php:171
#: src/Module/Settings/Profile/Index.php:238 #: src/Module/Settings/Profile/Index.php:247
msgid "Description:" msgid "Description:"
msgstr "" msgstr ""
@ -401,7 +401,7 @@ msgstr ""
#: src/Module/Install.php:252 src/Module/Install.php:294 #: src/Module/Install.php:252 src/Module/Install.php:294
#: src/Module/Install.php:331 src/Module/Invite.php:178 #: src/Module/Install.php:331 src/Module/Invite.php:178
#: src/Module/Item/Compose.php:189 src/Module/Profile/Profile.php:246 #: src/Module/Item/Compose.php:189 src/Module/Profile/Profile.php:246
#: src/Module/Profile/UnkMail.php:156 src/Module/Settings/Profile/Index.php:222 #: src/Module/Profile/UnkMail.php:156 src/Module/Settings/Profile/Index.php:231
#: src/Object/Post.php:986 view/theme/duepuntozero/config.php:85 #: src/Object/Post.php:986 view/theme/duepuntozero/config.php:85
#: view/theme/frio/config.php:171 view/theme/quattro/config.php:87 #: view/theme/frio/config.php:171 view/theme/quattro/config.php:87
#: view/theme/vier/config.php:135 #: view/theme/vier/config.php:135
@ -2102,7 +2102,7 @@ msgstr ""
#: src/Content/Item.php:389 src/Content/Item.php:407 src/Model/Contact.php:1137 #: src/Content/Item.php:389 src/Content/Item.php:407 src/Model/Contact.php:1137
#: src/Model/Contact.php:1191 src/Model/Contact.php:1200 #: src/Model/Contact.php:1191 src/Model/Contact.php:1200
#: src/Module/Directory.php:157 src/Module/Settings/Profile/Index.php:225 #: src/Module/Directory.php:157 src/Module/Settings/Profile/Index.php:234
msgid "View Profile" msgid "View Profile"
msgstr "" msgstr ""
@ -2430,39 +2430,39 @@ msgstr ""
msgid "last" msgid "last"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1002 src/Content/Text/BBCode.php:1863 #: src/Content/Text/BBCode.php:1003 src/Content/Text/BBCode.php:1865
#: src/Content/Text/BBCode.php:1864 #: src/Content/Text/BBCode.php:1866
msgid "Image/photo" msgid "Image/photo"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1218 #: src/Content/Text/BBCode.php:1220
#, php-format #, php-format
msgid "" msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s" "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1243 src/Model/Item.php:3471 #: src/Content/Text/BBCode.php:1245 src/Model/Item.php:3482
#: src/Model/Item.php:3477 src/Model/Item.php:3478 #: src/Model/Item.php:3488 src/Model/Item.php:3489
msgid "Link to source" msgid "Link to source"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1781 src/Content/Text/HTML.php:940 #: src/Content/Text/BBCode.php:1783 src/Content/Text/HTML.php:940
msgid "Click to open/close" msgid "Click to open/close"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1812 #: src/Content/Text/BBCode.php:1814
msgid "$1 wrote:" msgid "$1 wrote:"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1868 src/Content/Text/BBCode.php:1869 #: src/Content/Text/BBCode.php:1870 src/Content/Text/BBCode.php:1871
msgid "Encrypted content" msgid "Encrypted content"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:2092 #: src/Content/Text/BBCode.php:2098
msgid "Invalid source protocol" msgid "Invalid source protocol"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:2107 #: src/Content/Text/BBCode.php:2113
msgid "Invalid link protocol" msgid "Invalid link protocol"
msgstr "" msgstr ""
@ -3577,44 +3577,44 @@ msgstr ""
msgid "Content warning: %s" msgid "Content warning: %s"
msgstr "" msgstr ""
#: src/Model/Item.php:3383 #: src/Model/Item.php:3394
msgid "bytes" msgid "bytes"
msgstr "" msgstr ""
#: src/Model/Item.php:3414 #: src/Model/Item.php:3425
#, php-format #, php-format
msgid "%2$s (%3$d%%, %1$d vote)" msgid "%2$s (%3$d%%, %1$d vote)"
msgid_plural "%2$s (%3$d%%, %1$d votes)" msgid_plural "%2$s (%3$d%%, %1$d votes)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3416 #: src/Model/Item.php:3427
#, php-format #, php-format
msgid "%2$s (%1$d vote)" msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)" msgid_plural "%2$s (%1$d votes)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3421 #: src/Model/Item.php:3432
#, php-format #, php-format
msgid "%d voter. Poll end: %s" msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s" msgid_plural "%d voters. Poll end: %s"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3423 #: src/Model/Item.php:3434
#, php-format #, php-format
msgid "%d voter." msgid "%d voter."
msgid_plural "%d voters." msgid_plural "%d voters."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3425 #: src/Model/Item.php:3436
#, php-format #, php-format
msgid "Poll end: %s" msgid "Poll end: %s"
msgstr "" msgstr ""
#: src/Model/Item.php:3459 src/Model/Item.php:3460 #: src/Model/Item.php:3470 src/Model/Item.php:3471
msgid "View on separate page" msgid "View on separate page"
msgstr "" msgstr ""
@ -7206,7 +7206,7 @@ msgid "Sort by post creation date"
msgstr "" msgstr ""
#: src/Module/Conversation/Network.php:280 #: src/Module/Conversation/Network.php:280
#: src/Module/Settings/Profile/Index.php:227 #: src/Module/Settings/Profile/Index.php:236
msgid "Personal" msgid "Personal"
msgstr "" msgstr ""
@ -7430,7 +7430,7 @@ msgid "Twitter Source / Tweet URL (requires API key)"
msgstr "" msgstr ""
#: src/Module/Debug/Feed.php:52 src/Module/Filer/SaveTag.php:47 #: src/Module/Debug/Feed.php:52 src/Module/Filer/SaveTag.php:47
#: src/Module/Settings/Profile/Index.php:141 #: src/Module/Settings/Profile/Index.php:144
msgid "You must be logged in to use this module" msgid "You must be logged in to use this module"
msgstr "" msgstr ""
@ -8289,12 +8289,12 @@ msgstr ""
msgid "Birthday:" msgid "Birthday:"
msgstr "" msgstr ""
#: src/Module/Profile/Profile.php:166 src/Module/Settings/Profile/Index.php:245 #: src/Module/Profile/Profile.php:166 src/Module/Settings/Profile/Index.php:254
#: src/Util/Temporal.php:168 #: src/Util/Temporal.php:168
msgid "Age: " msgid "Age: "
msgstr "" msgstr ""
#: src/Module/Profile/Profile.php:166 src/Module/Settings/Profile/Index.php:245 #: src/Module/Profile/Profile.php:166 src/Module/Settings/Profile/Index.php:254
#: src/Util/Temporal.php:168 #: src/Util/Temporal.php:168
#, php-format #, php-format
msgid "%d year old" msgid "%d year old"
@ -9514,133 +9514,146 @@ msgstr ""
msgid "Beginning of week:" msgid "Beginning of week:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:83 #: src/Module/Settings/Profile/Index.php:84
msgid "Profile Name is required." msgid "Profile Name is required."
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:131 #: src/Module/Settings/Profile/Index.php:134
msgid "Profile couldn't be updated." msgid "Profile couldn't be updated."
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:172 #: src/Module/Settings/Profile/Index.php:175
#: src/Module/Settings/Profile/Index.php:192 #: src/Module/Settings/Profile/Index.php:195
msgid "Label:" msgid "Label:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:173 #: src/Module/Settings/Profile/Index.php:176
#: src/Module/Settings/Profile/Index.php:193 #: src/Module/Settings/Profile/Index.php:196
msgid "Value:" msgid "Value:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:183 #: src/Module/Settings/Profile/Index.php:186
#: src/Module/Settings/Profile/Index.php:203 #: src/Module/Settings/Profile/Index.php:206
msgid "Field Permissions" msgid "Field Permissions"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:184 #: src/Module/Settings/Profile/Index.php:187
#: src/Module/Settings/Profile/Index.php:204 #: src/Module/Settings/Profile/Index.php:207
msgid "(click to open/close)" msgid "(click to open/close)"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:190 #: src/Module/Settings/Profile/Index.php:193
msgid "Add a new profile field" msgid "Add a new profile field"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:220 #: src/Module/Settings/Profile/Index.php:217
msgid "Profile Actions" msgid ""
"The homepage is verified. A rel=\"me\" link back to your Friendica profile "
"page was found on the homepage."
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:221 #: src/Module/Settings/Profile/Index.php:219
msgid "Edit Profile Details" #, php-format
msgstr "" msgid ""
"To verify your homepage, add a rel=\"me\" link to it, pointing to your "
#: src/Module/Settings/Profile/Index.php:223 "profile URL (%s)."
msgid "Change Profile Photo"
msgstr ""
#: src/Module/Settings/Profile/Index.php:228
msgid "Profile picture"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:229 #: src/Module/Settings/Profile/Index.php:229
msgid "Profile Actions"
msgstr ""
#: src/Module/Settings/Profile/Index.php:230
msgid "Edit Profile Details"
msgstr ""
#: src/Module/Settings/Profile/Index.php:232
msgid "Change Profile Photo"
msgstr ""
#: src/Module/Settings/Profile/Index.php:237
msgid "Profile picture"
msgstr ""
#: src/Module/Settings/Profile/Index.php:238
msgid "Location" msgid "Location"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:230 src/Util/Temporal.php:95 #: src/Module/Settings/Profile/Index.php:239 src/Util/Temporal.php:95
#: src/Util/Temporal.php:97 #: src/Util/Temporal.php:97
msgid "Miscellaneous" msgid "Miscellaneous"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:231 #: src/Module/Settings/Profile/Index.php:240
msgid "Custom Profile Fields" msgid "Custom Profile Fields"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:233 src/Module/Welcome.php:58 #: src/Module/Settings/Profile/Index.php:242 src/Module/Welcome.php:58
msgid "Upload Profile Photo" msgid "Upload Profile Photo"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:237 #: src/Module/Settings/Profile/Index.php:246
msgid "Display name:" msgid "Display name:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:240 #: src/Module/Settings/Profile/Index.php:249
msgid "Street Address:" msgid "Street Address:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:241 #: src/Module/Settings/Profile/Index.php:250
msgid "Locality/City:" msgid "Locality/City:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:242 #: src/Module/Settings/Profile/Index.php:251
msgid "Region/State:" msgid "Region/State:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:243 #: src/Module/Settings/Profile/Index.php:252
msgid "Postal/Zip Code:" msgid "Postal/Zip Code:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:244 #: src/Module/Settings/Profile/Index.php:253
msgid "Country:" msgid "Country:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:246 #: src/Module/Settings/Profile/Index.php:255
msgid "XMPP (Jabber) address:" msgid "XMPP (Jabber) address:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:246 #: src/Module/Settings/Profile/Index.php:255
msgid "The XMPP address will be published so that people can follow you there." msgid "The XMPP address will be published so that people can follow you there."
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:247 #: src/Module/Settings/Profile/Index.php:256
msgid "Matrix (Element) address:" msgid "Matrix (Element) address:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:247 #: src/Module/Settings/Profile/Index.php:256
msgid "" msgid ""
"The Matrix address will be published so that people can follow you there." "The Matrix address will be published so that people can follow you there."
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:248 #: src/Module/Settings/Profile/Index.php:257
msgid "Homepage URL:" msgid "Homepage URL:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:249 #: src/Module/Settings/Profile/Index.php:258
msgid "Public Keywords:" msgid "Public Keywords:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:249 #: src/Module/Settings/Profile/Index.php:258
msgid "(Used for suggesting potential friends, can be seen by others)" msgid "(Used for suggesting potential friends, can be seen by others)"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:250 #: src/Module/Settings/Profile/Index.php:259
msgid "Private Keywords:" msgid "Private Keywords:"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:250 #: src/Module/Settings/Profile/Index.php:259
msgid "(Used for searching profiles, never shown to others)" msgid "(Used for searching profiles, never shown to others)"
msgstr "" msgstr ""
#: src/Module/Settings/Profile/Index.php:251 #: src/Module/Settings/Profile/Index.php:260
#, php-format #, php-format
msgid "" msgid ""
"<p>Custom fields appear on <a href=\"%s\">your profile page</a>.</p>\n" "<p>Custom fields appear on <a href=\"%s\">your profile page</a>.</p>\n"

View File

@ -39,7 +39,7 @@
{{if $updated}}<div class="updated" style="display:none;">{{$updated}}</div>{{/if}} {{if $updated}}<div class="updated" style="display:none;">{{$updated}}</div>{{/if}}
{{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url u-url"><a href="{{$profile.homepage}}" rel="me" target="_blank" rel="noopener noreferrer">{{$profile.homepage}}</a></dd></dl>{{/if}} {{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url u-url"><a href="{{$profile.homepage}}" rel="me" target="_blank" rel="noopener noreferrer">{{$profile.homepage}}</a>{{if $profile.homepage_verified}}{{/if}}</dd></dl>{{/if}}
{{if $about}}<dl class="about"><dt class="about-label">{{$about}}</dt><dd class="x-network" dir="auto">{{$profile.about nofilter}}</dd></dl>{{/if}} {{if $about}}<dl class="about"><dt class="about-label">{{$about}}</dt><dd class="x-network" dir="auto">{{$profile.about nofilter}}</dd></dl>{{/if}}

View File

@ -73,6 +73,7 @@
<label id="profile-edit-homepage-label" for="profile-edit-homepage">{{$homepage.1}} </label> <label id="profile-edit-homepage-label" for="profile-edit-homepage">{{$homepage.1}} </label>
<input type="url" size="32" name="homepage" id="profile-edit-homepage" value="{{$homepage.2}}"/> <input type="url" size="32" name="homepage" id="profile-edit-homepage" value="{{$homepage.2}}"/>
</div> </div>
<div id="profile-edit-homepage-desc">{{$homepage.3}}</div>
<div id="profile-edit-homepage-end"></div> <div id="profile-edit-homepage-end"></div>
<div id="profile-edit-xmpp-wrapper"> <div id="profile-edit-xmpp-wrapper">
<label id="profile-edit-xmpp-label" for="profile-edit-xmpp">{{$xmpp.1}} </label> <label id="profile-edit-xmpp-label" for="profile-edit-xmpp">{{$xmpp.1}} </label>

View File

@ -108,7 +108,7 @@
{{if $homepage}} {{if $homepage}}
<div class="homepage detail"> <div class="homepage detail">
<span class="homepage-label icon"><i class="fa fa-external-link"></i></span> <span class="homepage-label icon"><i class="fa fa-external-link"></i></span>
<span class="homepage-url u-url"><a href="{{$profile.homepage}}" rel="me" target="_blank" rel="noopener noreferrer">{{include file="sub/punct_wrap.tpl" text=$profile.homepage}}</a></span> <span class="homepage-url u-url"><a href="{{$profile.homepage}}" rel="me" target="_blank" rel="noopener noreferrer">{{include file="sub/punct_wrap.tpl" text=$profile.homepage}}</a>{{if $profile.homepage_verified}}{{/if}}</span>
</div> </div>
{{/if}} {{/if}}

View File

@ -53,7 +53,7 @@
{{if $homepage}} {{if $homepage}}
<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt> <dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt>
<dd class="homepage-url"><a href="{{$profile.homepage}}" class="u-url" rel="me" target="external-link">{{$profile.homepage}}</a></dd> <dd class="homepage-url"><a href="{{$profile.homepage}}" class="u-url" rel="me" target="external-link">{{$profile.homepage}}</a>{{if $profile.homepage_verified}}{{/if}}</dd>
</dl> </dl>
{{/if}} {{/if}}

View File

@ -45,7 +45,7 @@
{{if $updated}}<div class="updated" style="display:none;">{{$updated}}</div>{{/if}} {{if $updated}}<div class="updated" style="display:none;">{{$updated}}</div>{{/if}}
{{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url"><a href="{{$profile.homepage}}" class="u-url" rel="me" target="_blank" rel="noopener noreferrer">{{$profile.homepage}}</a></dd></dl>{{/if}} {{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url"><a href="{{$profile.homepage}}" class="u-url" rel="me" target="_blank" rel="noopener noreferrer">{{$profile.homepage}}</a>{{if $profile.homepage_verified}}{{/if}}</dd></dl>{{/if}}
{{if $about}}<dl class="about"><dt class="about-label">{{$about}}</dt><dd class="x-network" dir="auto">{{$profile.about nofilter}}</dd></dl>{{/if}} {{if $about}}<dl class="about"><dt class="about-label">{{$about}}</dt><dd class="x-network" dir="auto">{{$profile.about nofilter}}</dd></dl>{{/if}}

View File

@ -78,6 +78,7 @@
<label id="profile-edit-homepage-label" for="profile-edit-homepage">{{$homepage.1}} </label> <label id="profile-edit-homepage-label" for="profile-edit-homepage">{{$homepage.1}} </label>
<input type="text" size="32" name="homepage" id="profile-edit-homepage" value="{{$homepage.2}}"/> <input type="text" size="32" name="homepage" id="profile-edit-homepage" value="{{$homepage.2}}"/>
</div> </div>
<div id="profile-edit-homepage-desc">{{$homepage.3}}</div>
<div id="profile-edit-homepage-end"></div> <div id="profile-edit-homepage-end"></div>
<div id="profile-edit-dob-wrapper"> <div id="profile-edit-dob-wrapper">