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)
-- DB_UPDATE_VERSION 1486
-- DB_UPDATE_VERSION 1487
-- ------------------------------------------
@ -1577,6 +1577,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`education` text COMMENT 'Deprecated',
`contact` text COMMENT 'Deprecated',
`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',
`matrix` varchar(255) NOT NULL DEFAULT '' COMMENT 'Matrix address',
`photo` varbinary(383) NOT NULL DEFAULT '' COMMENT '',
@ -2674,6 +2675,7 @@ CREATE VIEW `owner-view` AS SELECT
`profile`.`postal-code` AS `postal-code`,
`profile`.`country-name` AS `country-name`,
`profile`.`homepage` AS `homepage`,
`profile`.`homepage_verified` AS `homepage_verified`,
`profile`.`dob` AS `dob`
FROM `user`
INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`

View file

@ -7,7 +7,7 @@ Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| ------------ | --------------------------------------------- | ------------------ | ---- | --- | ---------- | -------------- |
| ----------------- | -------------------------------------------------------------- | ------------------ | ---- | --- | ---------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| uid | Owner User id | mediumint unsigned | NO | | 0 | |
| profile-name | Deprecated | varchar(255) | YES | | NULL | |
@ -45,6 +45,7 @@ Fields
| education | Deprecated | text | YES | | NULL | |
| contact | Deprecated | text | YES | | NULL | |
| homepage | | varchar(255) | NO | | | |
| homepage_verified | was the homepage verified by a rel-me link back to the profile | boolean | NO | | 0 | |
| xmpp | XMPP address | varchar(255) | NO | | | |
| matrix | Matrix address | varchar(255) | NO | | | |
| photo | | varbinary(383) | NO | | | |

View file

@ -38,6 +38,7 @@ use Friendica\Module\Security\Login;
use Friendica\Network\HTTPException;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Temporal;
use Friendica\Core\Worker;
class Index extends BaseSettings
{
@ -127,6 +128,8 @@ class Index extends BaseSettings
DI::userSession()->getLocalUserId()
);
Worker::add(Worker::PRIORITY_MEDIUM, 'CheckRelMeProfileLink', DI::userSession()->getLocalUserId());
if (!$result) {
DI::sysmsg()->addNotice(DI::l10n()->t('Profile couldn\'t be updated.'));
return;
@ -210,6 +213,12 @@ class Index extends BaseSettings
$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');
$o .= Renderer::replaceMacros($tpl, [
'$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'])) . ')' : ''),
'$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.')],
'$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)')],
'$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>

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\DI;
use Friendica\Model\Tag;
use Friendica\Model\User;
use Friendica\Protocol\ActivityPub\Queue;
use Friendica\Protocol\Relay;
@ -85,6 +86,7 @@ class Cron
// Hourly cron calls
if (DI::config()->get('system', 'last_cron_hourly', 0) + 3600 < time()) {
// Update trending tags cache for the community page
Tag::setLocalTrendingHashtags(24, 20);
Tag::setGlobalTrendingHashtags(24, 20);
@ -132,6 +134,10 @@ class Cron
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
Relay::reSubscribe();

View file

@ -55,7 +55,7 @@
use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1486);
define('DB_UPDATE_VERSION', 1487);
}
return [
@ -1580,6 +1580,7 @@ return [
"education" => ["type" => "text", "comment" => "Deprecated"],
"contact" => ["type" => "text", "comment" => "Deprecated"],
"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"],
"matrix" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Matrix address"],
"photo" => ["type" => "varbinary(383)", "not null" => "1", "default" => "", "comment" => ""],

View file

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

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2022.12-dev\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -369,7 +369,7 @@ msgid "Event Finishes:"
msgstr ""
#: 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:"
msgstr ""
@ -401,7 +401,7 @@ msgstr ""
#: src/Module/Install.php:252 src/Module/Install.php:294
#: src/Module/Install.php:331 src/Module/Invite.php:178
#: 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
#: view/theme/frio/config.php:171 view/theme/quattro/config.php:87
#: 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/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"
msgstr ""
@ -2430,39 +2430,39 @@ msgstr ""
msgid "last"
msgstr ""
#: src/Content/Text/BBCode.php:1002 src/Content/Text/BBCode.php:1863
#: src/Content/Text/BBCode.php:1864
#: src/Content/Text/BBCode.php:1003 src/Content/Text/BBCode.php:1865
#: src/Content/Text/BBCode.php:1866
msgid "Image/photo"
msgstr ""
#: src/Content/Text/BBCode.php:1218
#: src/Content/Text/BBCode.php:1220
#, php-format
msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr ""
#: src/Content/Text/BBCode.php:1243 src/Model/Item.php:3471
#: src/Model/Item.php:3477 src/Model/Item.php:3478
#: src/Content/Text/BBCode.php:1245 src/Model/Item.php:3482
#: src/Model/Item.php:3488 src/Model/Item.php:3489
msgid "Link to source"
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"
msgstr ""
#: src/Content/Text/BBCode.php:1812
#: src/Content/Text/BBCode.php:1814
msgid "$1 wrote:"
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"
msgstr ""
#: src/Content/Text/BBCode.php:2092
#: src/Content/Text/BBCode.php:2098
msgid "Invalid source protocol"
msgstr ""
#: src/Content/Text/BBCode.php:2107
#: src/Content/Text/BBCode.php:2113
msgid "Invalid link protocol"
msgstr ""
@ -3577,44 +3577,44 @@ msgstr ""
msgid "Content warning: %s"
msgstr ""
#: src/Model/Item.php:3383
#: src/Model/Item.php:3394
msgid "bytes"
msgstr ""
#: src/Model/Item.php:3414
#: src/Model/Item.php:3425
#, php-format
msgid "%2$s (%3$d%%, %1$d vote)"
msgid_plural "%2$s (%3$d%%, %1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3416
#: src/Model/Item.php:3427
#, php-format
msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3421
#: src/Model/Item.php:3432
#, php-format
msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3423
#: src/Model/Item.php:3434
#, php-format
msgid "%d voter."
msgid_plural "%d voters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3425
#: src/Model/Item.php:3436
#, php-format
msgid "Poll end: %s"
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"
msgstr ""
@ -7206,7 +7206,7 @@ msgid "Sort by post creation date"
msgstr ""
#: src/Module/Conversation/Network.php:280
#: src/Module/Settings/Profile/Index.php:227
#: src/Module/Settings/Profile/Index.php:236
msgid "Personal"
msgstr ""
@ -7430,7 +7430,7 @@ msgid "Twitter Source / Tweet URL (requires API key)"
msgstr ""
#: 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"
msgstr ""
@ -8289,12 +8289,12 @@ msgstr ""
msgid "Birthday:"
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
msgid "Age: "
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
#, php-format
msgid "%d year old"
@ -9514,133 +9514,146 @@ msgstr ""
msgid "Beginning of week:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:83
#: src/Module/Settings/Profile/Index.php:84
msgid "Profile Name is required."
msgstr ""
#: src/Module/Settings/Profile/Index.php:131
#: src/Module/Settings/Profile/Index.php:134
msgid "Profile couldn't be updated."
msgstr ""
#: src/Module/Settings/Profile/Index.php:172
#: src/Module/Settings/Profile/Index.php:192
#: src/Module/Settings/Profile/Index.php:175
#: src/Module/Settings/Profile/Index.php:195
msgid "Label:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:173
#: src/Module/Settings/Profile/Index.php:193
#: src/Module/Settings/Profile/Index.php:176
#: src/Module/Settings/Profile/Index.php:196
msgid "Value:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:183
#: src/Module/Settings/Profile/Index.php:203
#: src/Module/Settings/Profile/Index.php:186
#: src/Module/Settings/Profile/Index.php:206
msgid "Field Permissions"
msgstr ""
#: src/Module/Settings/Profile/Index.php:184
#: src/Module/Settings/Profile/Index.php:204
#: src/Module/Settings/Profile/Index.php:187
#: src/Module/Settings/Profile/Index.php:207
msgid "(click to open/close)"
msgstr ""
#: src/Module/Settings/Profile/Index.php:190
#: src/Module/Settings/Profile/Index.php:193
msgid "Add a new profile field"
msgstr ""
#: src/Module/Settings/Profile/Index.php:220
msgid "Profile Actions"
#: src/Module/Settings/Profile/Index.php:217
msgid ""
"The homepage is verified. A rel=\"me\" link back to your Friendica profile "
"page was found on the homepage."
msgstr ""
#: src/Module/Settings/Profile/Index.php:221
msgid "Edit Profile Details"
msgstr ""
#: src/Module/Settings/Profile/Index.php:223
msgid "Change Profile Photo"
msgstr ""
#: src/Module/Settings/Profile/Index.php:228
msgid "Profile picture"
#: src/Module/Settings/Profile/Index.php:219
#, php-format
msgid ""
"To verify your homepage, add a rel=\"me\" link to it, pointing to your "
"profile URL (%s)."
msgstr ""
#: 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"
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
msgid "Miscellaneous"
msgstr ""
#: src/Module/Settings/Profile/Index.php:231
#: src/Module/Settings/Profile/Index.php:240
msgid "Custom Profile Fields"
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"
msgstr ""
#: src/Module/Settings/Profile/Index.php:237
#: src/Module/Settings/Profile/Index.php:246
msgid "Display name:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:240
#: src/Module/Settings/Profile/Index.php:249
msgid "Street Address:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:241
#: src/Module/Settings/Profile/Index.php:250
msgid "Locality/City:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:242
#: src/Module/Settings/Profile/Index.php:251
msgid "Region/State:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:243
#: src/Module/Settings/Profile/Index.php:252
msgid "Postal/Zip Code:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:244
#: src/Module/Settings/Profile/Index.php:253
msgid "Country:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:246
#: src/Module/Settings/Profile/Index.php:255
msgid "XMPP (Jabber) address:"
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."
msgstr ""
#: src/Module/Settings/Profile/Index.php:247
#: src/Module/Settings/Profile/Index.php:256
msgid "Matrix (Element) address:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:247
#: src/Module/Settings/Profile/Index.php:256
msgid ""
"The Matrix address will be published so that people can follow you there."
msgstr ""
#: src/Module/Settings/Profile/Index.php:248
#: src/Module/Settings/Profile/Index.php:257
msgid "Homepage URL:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:249
#: src/Module/Settings/Profile/Index.php:258
msgid "Public Keywords:"
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)"
msgstr ""
#: src/Module/Settings/Profile/Index.php:250
#: src/Module/Settings/Profile/Index.php:259
msgid "Private Keywords:"
msgstr ""
#: src/Module/Settings/Profile/Index.php:250
#: src/Module/Settings/Profile/Index.php:259
msgid "(Used for searching profiles, never shown to others)"
msgstr ""
#: src/Module/Settings/Profile/Index.php:251
#: src/Module/Settings/Profile/Index.php:260
#, php-format
msgid ""
"<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 $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}}

View file

@ -73,6 +73,7 @@
<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}}"/>
</div>
<div id="profile-edit-homepage-desc">{{$homepage.3}}</div>
<div id="profile-edit-homepage-end"></div>
<div id="profile-edit-xmpp-wrapper">
<label id="profile-edit-xmpp-label" for="profile-edit-xmpp">{{$xmpp.1}} </label>

View file

@ -108,7 +108,7 @@
{{if $homepage}}
<div class="homepage detail">
<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>
{{/if}}

View file

@ -53,7 +53,7 @@
{{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="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>
{{/if}}

View file

@ -45,7 +45,7 @@
{{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}}

View file

@ -78,6 +78,7 @@
<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}}"/>
</div>
<div id="profile-edit-homepage-desc">{{$homepage.3}}</div>
<div id="profile-edit-homepage-end"></div>
<div id="profile-edit-dob-wrapper">