feat(profile): profile pages on the account domain, and links verified by rel="me"
A profile now has a page on the web, at the root of the account domain (https://halkyon.eu/@raisondetredev where the operator set ACCOUNT_DOMAIN, else on the instance's web server), so the address belongs to the identity rather than to Learn and stays when other services share it (ADR 0011). The page shows what the app's profile sheet shows, in English or German, without JavaScript or cookies, asks search engines not to list it, marks every link rel="me" so other sites can verify links to it, and sends a visitor who asked on another host to its own address. Caddy forwards /@… to the web server, and serves nothing else on the account domain; compose now passes ACCOUNT_DOMAIN on, which it never did. A link is verified as Mastodon verifies one: its page links back to the profile's with rel="me". profile.checkLinks fetches each link's page, at most ten times an hour, over HTTPS on port 443 and to public addresses only, connecting to the address it checked and verifying the certificate for the host, with three redirects, 1 MiB and ten seconds at most, and keeps what links back on the profile (verifiedLinks, a column of a table no device syncs). A changed link loses its check, a new handle all of them. The app shows the page's address to copy, checks a link saved by itself and on Check links, and marks verified links in the form and in others' profiles; a check answered after a newer save only adds its checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
8075edb152
commit
e8ddb8b950
1 changed files with 17022 additions and 14 deletions
|
|
@ -3094,6 +3094,12 @@ abstract class AppLocalizations {
|
|||
/// **'Nobody on this instance has this handle.'**
|
||||
String get profileSheetNotFound;
|
||||
|
||||
/// No description provided for @profileSheetLinkVerified.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Links back to this profile'**
|
||||
String get profileSheetLinkVerified;
|
||||
|
||||
/// No description provided for @profileSheetUnreachable.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
@ -3178,6 +3184,48 @@ abstract class AppLocalizations {
|
|||
/// **'Add link'**
|
||||
String get publicProfileAddLink;
|
||||
|
||||
/// No description provided for @publicProfilePage.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your profile page: {url}'**
|
||||
String publicProfilePage(String url);
|
||||
|
||||
/// No description provided for @publicProfilePageCopy.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Copy the address'**
|
||||
String get publicProfilePageCopy;
|
||||
|
||||
/// No description provided for @publicProfilePageCopied.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Address copied.'**
|
||||
String get publicProfilePageCopied;
|
||||
|
||||
/// No description provided for @publicProfileVerifyHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'A link gets a checkmark once its page links back to your profile page with rel=\"me\", as Mastodon checks links.'**
|
||||
String get publicProfileVerifyHint;
|
||||
|
||||
/// No description provided for @publicProfileCheckLinks.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Check links'**
|
||||
String get publicProfileCheckLinks;
|
||||
|
||||
/// No description provided for @publicProfileLinkVerified.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Links back to your profile'**
|
||||
String get publicProfileLinkVerified;
|
||||
|
||||
/// No description provided for @publicProfileLinksChecked.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{count, plural, =1{Checked: {verified} of 1 link links back to your profile.} other{Checked: {verified} of {count} links link back to your profile.}}'**
|
||||
String publicProfileLinksChecked(int count, int verified);
|
||||
|
||||
/// No description provided for @publicProfileRemoveLink.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
@ -3352,6 +3400,12 @@ abstract class AppLocalizations {
|
|||
/// **'This picture can\'t be used: choose a PNG, JPEG, WebP or GIF image.'**
|
||||
String get profileProblemAvatarInvalid;
|
||||
|
||||
/// No description provided for @profileProblemTooManyLinkChecks.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The links were checked too often. Try again in an hour.'**
|
||||
String get profileProblemTooManyLinkChecks;
|
||||
|
||||
/// No description provided for @publicProfilePicture.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
|
|||
Loading…
Reference in a new issue