@linkforty/core 1.26.0 → 1.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/dist/lib/launchpad.d.ts +29 -4
- package/dist/lib/launchpad.d.ts.map +1 -1
- package/dist/lib/launchpad.js +32 -6
- package/dist/lib/launchpad.js.map +1 -1
- package/dist/lib/launchpad.test.js +21 -1
- package/dist/lib/launchpad.test.js.map +1 -1
- package/dist/lib/link-safety.d.ts +11 -0
- package/dist/lib/link-safety.d.ts.map +1 -1
- package/dist/lib/link-safety.js +22 -0
- package/dist/lib/link-safety.js.map +1 -1
- package/dist/routes/redirect.d.ts.map +1 -1
- package/dist/routes/redirect.interstitial.test.d.ts +2 -0
- package/dist/routes/redirect.interstitial.test.d.ts.map +1 -0
- package/dist/routes/redirect.interstitial.test.js +128 -0
- package/dist/routes/redirect.interstitial.test.js.map +1 -0
- package/dist/routes/redirect.js +165 -100
- package/dist/routes/redirect.js.map +1 -1
- package/dist/routes/redirect.launchpad.test.js +143 -0
- package/dist/routes/redirect.launchpad.test.js.map +1 -1
- package/llms.txt +1 -1
- package/package.json +1 -1
package/dist/routes/redirect.js
CHANGED
|
@@ -5,8 +5,8 @@ import { parseUserAgent, getLocationFromIP, buildRedirectUrl, detectDevice, reso
|
|
|
5
5
|
import { storeFingerprintForClick } from '../lib/fingerprint.js';
|
|
6
6
|
import { emitClickEvent } from '../lib/event-emitter.js';
|
|
7
7
|
import { classifyBot, edgeBotSignal } from '../lib/bot-detection.js';
|
|
8
|
-
import { evaluateLinkSafetyDecision, blockCauseIsAbuse, generateWarningLinkHTML, generateBlockedLinkHTML, createOwnerSuspensionSelect, } from '../lib/link-safety.js';
|
|
9
|
-
import { createLaunchpadNonce, defaultLaunchpadContent, launchpadContentSecurityPolicy, readLaunchpadLinkMode, readLaunchpadSettings, renderLaunchpadPage, shouldServeLaunchpadOnDesktop, } from '../lib/launchpad.js';
|
|
8
|
+
import { evaluateLinkSafetyDecision, blockCauseIsAbuse, generateWarningLinkHTML, generateBlockedLinkHTML, createOwnerSuspensionSelect, escapeHtml, safeSchemeHref, } from '../lib/link-safety.js';
|
|
9
|
+
import { createLaunchpadNonce, defaultLaunchpadContent, launchpadContentSecurityPolicy, readLaunchpadLinkMode, readLaunchpadSettings, renderLaunchpadPage, shouldServeLaunchpadOnDesktop, shouldServeLaunchpadOnMobile, } from '../lib/launchpad.js';
|
|
10
10
|
/**
|
|
11
11
|
* Detect iOS in-app browsers where Universal Links don't fire.
|
|
12
12
|
* These browsers use WKWebView which bypasses the Universal Links mechanism.
|
|
@@ -83,6 +83,21 @@ export function pickMobileFallbackUrl(device, userAgent, iosUrl, androidUrl, web
|
|
|
83
83
|
}
|
|
84
84
|
return null;
|
|
85
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* The URI-scheme URL that opens this link's content in the app, with the
|
|
88
|
+
* link's deep-link parameters appended as a query string. Shared by the
|
|
89
|
+
* scheme interstitial and the launchpad page's "Open in app" button so the two
|
|
90
|
+
* can never disagree about where the app is sent.
|
|
91
|
+
*/
|
|
92
|
+
function buildAppSchemeUrl(link) {
|
|
93
|
+
const deepPath = link.deep_link_path ? link.deep_link_path.replace(/^\//, '') : '';
|
|
94
|
+
let schemeUrl = link.custom_scheme_url || `${link.app_scheme}://${deepPath}`;
|
|
95
|
+
if (link.deep_link_parameters && Object.keys(link.deep_link_parameters).length > 0) {
|
|
96
|
+
const params = new URLSearchParams(Object.entries(link.deep_link_parameters).map(([k, v]) => [k, String(v)]));
|
|
97
|
+
schemeUrl += (schemeUrl.includes('?') ? '&' : '?') + params.toString();
|
|
98
|
+
}
|
|
99
|
+
return schemeUrl;
|
|
100
|
+
}
|
|
86
101
|
/**
|
|
87
102
|
* Generate an interstitial HTML page that tries to open the app via custom scheme,
|
|
88
103
|
* then falls back to the App Store / Play Store.
|
|
@@ -92,9 +107,13 @@ export function pickMobileFallbackUrl(device, userAgent, iosUrl, androidUrl, web
|
|
|
92
107
|
* in the fragment and is never sent to the server.
|
|
93
108
|
*/
|
|
94
109
|
function generateInterstitialHTML(schemeUrl, fallbackUrl, title) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
// Both URLs reach the document only as attribute values; the script reads
|
|
111
|
+
// them back from the DOM rather than having them interpolated into JavaScript
|
|
112
|
+
// source, where a quote, backslash or line terminator in a configured value
|
|
113
|
+
// would end the string literal.
|
|
114
|
+
const safeSchemeUrl = escapeHtml(schemeUrl);
|
|
115
|
+
const safeFallbackUrl = escapeHtml(fallbackUrl);
|
|
116
|
+
const safeTitle = escapeHtml(title || 'the app');
|
|
98
117
|
return `<!DOCTYPE html>
|
|
99
118
|
<html><head>
|
|
100
119
|
<meta charset="utf-8">
|
|
@@ -121,31 +140,16 @@ function generateInterstitialHTML(schemeUrl, fallbackUrl, title) {
|
|
|
121
140
|
</div>
|
|
122
141
|
<script>
|
|
123
142
|
// Preserve URL fragment (E2E encryption key) through the scheme redirect
|
|
143
|
+
var openBtn = document.getElementById('open-btn');
|
|
144
|
+
var storeBtn = document.getElementById('store-btn');
|
|
124
145
|
var hash = window.location.hash || '';
|
|
125
|
-
var schemeUrl =
|
|
126
|
-
|
|
146
|
+
var schemeUrl = openBtn.getAttribute('href') + hash;
|
|
147
|
+
openBtn.href = schemeUrl;
|
|
127
148
|
window.location = schemeUrl;
|
|
128
|
-
setTimeout(function() { window.location.replace(
|
|
149
|
+
setTimeout(function() { window.location.replace(storeBtn.getAttribute('href')); }, 1500);
|
|
129
150
|
</script>
|
|
130
151
|
</body></html>`;
|
|
131
152
|
}
|
|
132
|
-
/**
|
|
133
|
-
* Escape a value for interpolation into HTML text or a double-quoted attribute.
|
|
134
|
-
*
|
|
135
|
-
* `&` first, or the other replacements' own ampersands get double-escaped.
|
|
136
|
-
*
|
|
137
|
-
* The older generators above escape only a subset of these, inline. They predate
|
|
138
|
-
* this helper and are left alone rather than changed as a drive-by — the values
|
|
139
|
-
* they interpolate are URLs the workspace owner configured, not free text.
|
|
140
|
-
*/
|
|
141
|
-
function escapeHtml(value) {
|
|
142
|
-
return value
|
|
143
|
-
.replace(/&/g, '&')
|
|
144
|
-
.replace(/</g, '<')
|
|
145
|
-
.replace(/>/g, '>')
|
|
146
|
-
.replace(/"/g, '"')
|
|
147
|
-
.replace(/'/g, ''');
|
|
148
|
-
}
|
|
149
153
|
/**
|
|
150
154
|
* Page shown to a desktop visitor when a link has no web destination at any level
|
|
151
155
|
* of the chain (link, template, workspace) **and** the launchpad page is switched
|
|
@@ -570,6 +574,94 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
570
574
|
const iosUrl = link.ios_app_store_url || templateSettings.defaultIosUrl || orgAppConfig.iosAppStoreUrl || null;
|
|
571
575
|
const androidUrl = link.android_app_store_url || templateSettings.defaultAndroidUrl || orgAppConfig.androidAppStoreUrl || null;
|
|
572
576
|
const webFallbackUrl = link.web_fallback_url || templateSettings.defaultWebFallbackUrl || orgAppConfig.webFallbackUrl || null;
|
|
577
|
+
/**
|
|
578
|
+
* Everything the redirect adds to an http(s) destination before sending a
|
|
579
|
+
* visitor there: the link's UTM parameters, its deep-link parameters as a
|
|
580
|
+
* query string, and — when the link opted in — the originating click id.
|
|
581
|
+
* Used for the 302, and for the "Continue on the web" link on the
|
|
582
|
+
* launchpad page, so a visitor who goes via the page lands on the same
|
|
583
|
+
* URL as one who was redirected.
|
|
584
|
+
*/
|
|
585
|
+
const decorateWebDestination = (destination) => {
|
|
586
|
+
// For HTTP(S) URLs, add UTM parameters
|
|
587
|
+
let url = buildRedirectUrl(destination, link.utm_parameters) || destination;
|
|
588
|
+
// Add deep link parameters as query params
|
|
589
|
+
if (link.deep_link_parameters && Object.keys(link.deep_link_parameters).length > 0) {
|
|
590
|
+
try {
|
|
591
|
+
const parsed = new URL(url);
|
|
592
|
+
Object.entries(link.deep_link_parameters).forEach(([key, value]) => {
|
|
593
|
+
parsed.searchParams.set(key, String(value));
|
|
594
|
+
});
|
|
595
|
+
url = parsed.toString();
|
|
596
|
+
}
|
|
597
|
+
catch (error) {
|
|
598
|
+
// If URL parsing fails, continue without deep link parameters
|
|
599
|
+
console.error('Failed to add deep link parameters:', error);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
// When opted in per link (append_click_id), append the originating click id
|
|
603
|
+
// so a downstream analytics tool on the landing page can correlate the
|
|
604
|
+
// landing visit to this exact click. Opt-in (default off), web/HTTPS only —
|
|
605
|
+
// an absent/false flag (incl. stale cache) leaves the destination untouched.
|
|
606
|
+
if (link.append_click_id === true) {
|
|
607
|
+
try {
|
|
608
|
+
const parsed = new URL(url);
|
|
609
|
+
parsed.searchParams.set('lf_click', clickId);
|
|
610
|
+
url = parsed.toString();
|
|
611
|
+
}
|
|
612
|
+
catch {
|
|
613
|
+
// Non-absolute / unparseable URL — skip the correlation param.
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
return url;
|
|
617
|
+
};
|
|
618
|
+
/**
|
|
619
|
+
* The link's URI scheme, or null when it names something a browser would
|
|
620
|
+
* execute rather than hand to an app (javascript:, data:, …). On the
|
|
621
|
+
* response path such a link is treated as having no scheme at all: it
|
|
622
|
+
* takes the store / web-fallback route like any other link without one.
|
|
623
|
+
* `app_scheme` is validated as a scheme *token* at write time, which does
|
|
624
|
+
* not exclude these names.
|
|
625
|
+
*/
|
|
626
|
+
const appScheme = link.app_scheme && safeSchemeHref(`${link.app_scheme}:`) ? link.app_scheme : null;
|
|
627
|
+
/**
|
|
628
|
+
* Render and send the launchpad page (lib/launchpad.ts). Shared by the
|
|
629
|
+
* desktop and mobile decisions below; the caller decides the two things
|
|
630
|
+
* that differ between them — whether there is a scheme to offer a button
|
|
631
|
+
* for, and whether a QR code makes sense.
|
|
632
|
+
*/
|
|
633
|
+
const serveLaunchpad = async (launchpadSettings, opts) => {
|
|
634
|
+
let content = null;
|
|
635
|
+
try {
|
|
636
|
+
content = (await options.launchpad?.resolveContent?.(link, launchpadSettings)) ?? null;
|
|
637
|
+
}
|
|
638
|
+
catch (err) {
|
|
639
|
+
fastify.log.error({ err, shortCode }, 'Launchpad resolveContent threw; using default content');
|
|
640
|
+
}
|
|
641
|
+
content ?? (content = defaultLaunchpadContent(link, launchpadSettings));
|
|
642
|
+
const nonce = createLaunchpadNonce();
|
|
643
|
+
const beaconUrl = options.launchpad?.beaconUrl;
|
|
644
|
+
const host = request.headers.host || request.hostname;
|
|
645
|
+
const pagePath = templateSlug ? `${templateSlug}/${shortCode}` : shortCode;
|
|
646
|
+
return reply
|
|
647
|
+
.status(200)
|
|
648
|
+
.header('X-Robots-Tag', 'noindex, nofollow')
|
|
649
|
+
.header('Cache-Control', 'no-store')
|
|
650
|
+
.header('Content-Security-Policy', launchpadContentSecurityPolicy(nonce, beaconUrl))
|
|
651
|
+
.type('text/html')
|
|
652
|
+
.send(renderLaunchpadPage({
|
|
653
|
+
content,
|
|
654
|
+
linkId: link.id,
|
|
655
|
+
pageUrl: `${request.protocol}://${host}/${pagePath}`,
|
|
656
|
+
iosUrl: opts.storeUrls ? opts.storeUrls.iosUrl : iosUrl,
|
|
657
|
+
androidUrl: opts.storeUrls ? opts.storeUrls.androidUrl : androidUrl,
|
|
658
|
+
webUrl: opts.webUrl,
|
|
659
|
+
schemeUrl: opts.schemeUrl,
|
|
660
|
+
showQr: opts.showQr,
|
|
661
|
+
nonce,
|
|
662
|
+
beaconUrl,
|
|
663
|
+
}));
|
|
664
|
+
};
|
|
573
665
|
let redirectUrl = link.original_url;
|
|
574
666
|
let useSchemeUrl = false; // Track if we're using a URI scheme URL
|
|
575
667
|
if (device === 'ios') {
|
|
@@ -586,9 +678,9 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
586
678
|
if (link.ios_universal_link) {
|
|
587
679
|
redirectUrl = link.ios_universal_link;
|
|
588
680
|
}
|
|
589
|
-
else if (
|
|
681
|
+
else if (appScheme && link.deep_link_path) {
|
|
590
682
|
// Build URI scheme URL: myapp://product/123
|
|
591
|
-
redirectUrl = `${
|
|
683
|
+
redirectUrl = `${appScheme}://${link.deep_link_path.replace(/^\//, '')}`;
|
|
592
684
|
useSchemeUrl = true;
|
|
593
685
|
}
|
|
594
686
|
else {
|
|
@@ -602,9 +694,9 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
602
694
|
if (link.android_app_link) {
|
|
603
695
|
redirectUrl = link.android_app_link;
|
|
604
696
|
}
|
|
605
|
-
else if (
|
|
697
|
+
else if (appScheme && link.deep_link_path) {
|
|
606
698
|
// Build URI scheme URL: myapp://product/123
|
|
607
|
-
redirectUrl = `${
|
|
699
|
+
redirectUrl = `${appScheme}://${link.deep_link_path.replace(/^\//, '')}`;
|
|
608
700
|
useSchemeUrl = true;
|
|
609
701
|
}
|
|
610
702
|
else {
|
|
@@ -630,42 +722,49 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
630
722
|
* The click has already been recorded above; this is a genuine visit.
|
|
631
723
|
*/
|
|
632
724
|
const launchpadSettings = readLaunchpadSettings(orgSettings);
|
|
633
|
-
const
|
|
725
|
+
const shouldServe = shouldServeLaunchpadOnDesktop({
|
|
634
726
|
hasWebDestination: Boolean(redirectUrl),
|
|
635
727
|
orgMode: launchpadSettings.desktop,
|
|
636
728
|
linkMode: readLaunchpadLinkMode(link.launchpad_mode),
|
|
637
729
|
});
|
|
638
|
-
if (
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
catch (err) {
|
|
644
|
-
fastify.log.error({ err, shortCode }, 'Launchpad resolveContent threw; using default content');
|
|
645
|
-
}
|
|
646
|
-
content ?? (content = defaultLaunchpadContent(link, launchpadSettings));
|
|
647
|
-
const nonce = createLaunchpadNonce();
|
|
648
|
-
const beaconUrl = options.launchpad?.beaconUrl;
|
|
649
|
-
const host = request.headers.host || request.hostname;
|
|
650
|
-
const pagePath = templateSlug ? `${templateSlug}/${shortCode}` : shortCode;
|
|
651
|
-
return reply
|
|
652
|
-
.status(200)
|
|
653
|
-
.header('X-Robots-Tag', 'noindex, nofollow')
|
|
654
|
-
.header('Cache-Control', 'no-store')
|
|
655
|
-
.header('Content-Security-Policy', launchpadContentSecurityPolicy(nonce, beaconUrl))
|
|
656
|
-
.type('text/html')
|
|
657
|
-
.send(renderLaunchpadPage({
|
|
658
|
-
content,
|
|
659
|
-
linkId: link.id,
|
|
660
|
-
pageUrl: `${request.protocol}://${host}/${pagePath}`,
|
|
661
|
-
iosUrl,
|
|
662
|
-
androidUrl,
|
|
663
|
-
// Desktop never attempts the URI scheme: there is no app to open.
|
|
730
|
+
if (shouldServe) {
|
|
731
|
+
// Desktop never attempts the URI scheme: there is no app to open. The
|
|
732
|
+
// web destination, when there is one, is offered as a link so `always`
|
|
733
|
+
// mode never traps a visitor who would otherwise have been redirected.
|
|
734
|
+
return serveLaunchpad(launchpadSettings, {
|
|
664
735
|
schemeUrl: null,
|
|
665
736
|
showQr: true,
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
737
|
+
webUrl: redirectUrl ? decorateWebDestination(redirectUrl) : null,
|
|
738
|
+
});
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Launchpad page for mobile visitors, when the workspace asked for it
|
|
743
|
+
* (`launchpad.mobile = 'page'`). Sits in front of the store redirect and
|
|
744
|
+
* the scheme interstitial below, never in front of a Universal Link / App
|
|
745
|
+
* Link 302 — the OS handles the installed case there, and only there.
|
|
746
|
+
* The page's "Open in app" is a button; the interstitial's scheme attempt
|
|
747
|
+
* is a navigation. That difference is the whole reason the mode exists.
|
|
748
|
+
*/
|
|
749
|
+
if (device === 'ios' || device === 'android') {
|
|
750
|
+
const launchpadSettings = readLaunchpadSettings(orgSettings);
|
|
751
|
+
const hasAppOpenPath = device === 'ios' ? Boolean(link.ios_universal_link) : Boolean(link.android_app_link);
|
|
752
|
+
if (shouldServeLaunchpadOnMobile({
|
|
753
|
+
mobileMode: launchpadSettings.mobile,
|
|
754
|
+
linkMode: readLaunchpadLinkMode(link.launchpad_mode),
|
|
755
|
+
hasAppOpenPath,
|
|
756
|
+
})) {
|
|
757
|
+
// Only this platform's store: a Google Play button on an iPhone is noise.
|
|
758
|
+
// The web fallback stays reachable as a link — inside an in-app browser
|
|
759
|
+
// it is the hop that gives a Universal Link / App Link its second chance
|
|
760
|
+
// to open an installed app, the same reason pickMobileFallbackUrl()
|
|
761
|
+
// prefers it there.
|
|
762
|
+
return serveLaunchpad(launchpadSettings, {
|
|
763
|
+
schemeUrl: appScheme ? buildAppSchemeUrl(link) : null,
|
|
764
|
+
showQr: false,
|
|
765
|
+
webUrl: webFallbackUrl || link.original_url ? decorateWebDestination(webFallbackUrl || link.original_url) : null,
|
|
766
|
+
storeUrls: device === 'ios' ? { iosUrl, androidUrl: null } : { iosUrl: null, androidUrl },
|
|
767
|
+
});
|
|
669
768
|
}
|
|
670
769
|
}
|
|
671
770
|
/**
|
|
@@ -699,36 +798,7 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
699
798
|
// Build final URL with parameters
|
|
700
799
|
let finalUrl = redirectUrl;
|
|
701
800
|
if (!useSchemeUrl) {
|
|
702
|
-
|
|
703
|
-
finalUrl = buildRedirectUrl(redirectUrl, link.utm_parameters) || redirectUrl;
|
|
704
|
-
// Add deep link parameters as query params
|
|
705
|
-
if (link.deep_link_parameters && Object.keys(link.deep_link_parameters).length > 0) {
|
|
706
|
-
try {
|
|
707
|
-
const url = new URL(finalUrl);
|
|
708
|
-
Object.entries(link.deep_link_parameters).forEach(([key, value]) => {
|
|
709
|
-
url.searchParams.set(key, String(value));
|
|
710
|
-
});
|
|
711
|
-
finalUrl = url.toString();
|
|
712
|
-
}
|
|
713
|
-
catch (error) {
|
|
714
|
-
// If URL parsing fails, continue without deep link parameters
|
|
715
|
-
console.error('Failed to add deep link parameters:', error);
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
// When opted in per link (append_click_id), append the originating click id
|
|
719
|
-
// so a downstream analytics tool on the landing page can correlate the
|
|
720
|
-
// landing visit to this exact click. Opt-in (default off), web/HTTPS only —
|
|
721
|
-
// an absent/false flag (incl. stale cache) leaves the destination untouched.
|
|
722
|
-
if (link.append_click_id === true) {
|
|
723
|
-
try {
|
|
724
|
-
const url = new URL(finalUrl);
|
|
725
|
-
url.searchParams.set('lf_click', clickId);
|
|
726
|
-
finalUrl = url.toString();
|
|
727
|
-
}
|
|
728
|
-
catch {
|
|
729
|
-
// Non-absolute / unparseable URL — skip the correlation param.
|
|
730
|
-
}
|
|
731
|
-
}
|
|
801
|
+
finalUrl = decorateWebDestination(redirectUrl);
|
|
732
802
|
}
|
|
733
803
|
else {
|
|
734
804
|
// For URI scheme URLs, append query params differently
|
|
@@ -742,25 +812,20 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
742
812
|
// This works for both in-app browsers (where Universal Links don't fire) and regular
|
|
743
813
|
// browsers (where a 302 to a custom scheme fails silently if the app isn't installed).
|
|
744
814
|
// The interstitial JavaScript preserves the URL fragment (E2E encryption key).
|
|
745
|
-
if ((device === 'ios' || device === 'android') &&
|
|
746
|
-
const deepPath = link.deep_link_path ? link.deep_link_path.replace(/^\//, '') : '';
|
|
747
|
-
const schemeUrl = link.custom_scheme_url
|
|
748
|
-
|| `${link.app_scheme}://${deepPath}`;
|
|
815
|
+
if ((device === 'ios' || device === 'android') && appScheme) {
|
|
749
816
|
// The interstitial JS tries the scheme first; storeFallback is what we
|
|
750
817
|
// navigate to if the scheme doesn't open the app within ~1.5s. Pick it
|
|
751
818
|
// browser-aware: regular browsers prefer the store URL, in-app browsers
|
|
752
819
|
// prefer the web fallback (gives UL a second chance to fire).
|
|
753
820
|
const fb = pickMobileFallbackUrl(device, userAgent, iosUrl, androidUrl, webFallbackUrl);
|
|
754
821
|
const storeFallback = fb?.url || link.original_url;
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
fullSchemeUrl += (fullSchemeUrl.includes('?') ? '&' : '?') + params.toString();
|
|
760
|
-
}
|
|
822
|
+
// `appScheme` is already vetted; this re-checks the assembled URL so a
|
|
823
|
+
// custom scheme URL naming an executable scheme is refused too.
|
|
824
|
+
const schemeUrl = safeSchemeHref(buildAppSchemeUrl(link));
|
|
825
|
+
if (storeFallback && schemeUrl) {
|
|
761
826
|
return reply
|
|
762
827
|
.header('Content-Type', 'text/html; charset=utf-8')
|
|
763
|
-
.send(generateInterstitialHTML(
|
|
828
|
+
.send(generateInterstitialHTML(schemeUrl, storeFallback, link.title || link.og_title));
|
|
764
829
|
}
|
|
765
830
|
}
|
|
766
831
|
// Redirect
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/routes/redirect.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/routes/redirect.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,9 @@ vi.mock('../lib/database.js', () => ({
|
|
|
16
16
|
}));
|
|
17
17
|
const DESKTOP_UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36';
|
|
18
18
|
const IPHONE_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1';
|
|
19
|
+
const ANDROID_UA = 'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Mobile Safari/537.36';
|
|
20
|
+
/** Facebook's iOS in-app browser: Universal Links do not fire here. */
|
|
21
|
+
const FB_IOS_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBAV/450.0.0.0.0]';
|
|
19
22
|
function linkRow(overrides = {}) {
|
|
20
23
|
return {
|
|
21
24
|
id: '00000000-0000-0000-0000-0000000000aa',
|
|
@@ -110,6 +113,36 @@ describe('launchpad page — when it is served', () => {
|
|
|
110
113
|
expect(res.statusCode).toBe(200);
|
|
111
114
|
expect(res.body).toContain('class="lp"');
|
|
112
115
|
});
|
|
116
|
+
it("under 'always' the page links to the destination the 302 would have used", async () => {
|
|
117
|
+
mockDb(linkRow({ web_fallback_url: 'https://example.com/page', org_settings: { launchpad: { desktop: 'always' } } }));
|
|
118
|
+
const res = await get(app, DESKTOP_UA);
|
|
119
|
+
expect(res.body).toContain('href="https://example.com/page">Continue on the web</a>');
|
|
120
|
+
mockDb(linkRow({ original_url: 'https://example.com/original', org_settings: { launchpad: { desktop: 'always' } } }));
|
|
121
|
+
const original = await get(app, DESKTOP_UA);
|
|
122
|
+
expect(original.body).toContain('href="https://example.com/original">Continue on the web</a>');
|
|
123
|
+
});
|
|
124
|
+
it('the web link carries the same UTMs, deep-link params and click id the 302 would have', async () => {
|
|
125
|
+
mockDb(linkRow({
|
|
126
|
+
web_fallback_url: 'https://example.com/page',
|
|
127
|
+
utm_parameters: { source: 'newsletter', medium: 'email' },
|
|
128
|
+
deep_link_parameters: { ref: 'abc' },
|
|
129
|
+
append_click_id: true,
|
|
130
|
+
org_settings: { launchpad: { desktop: 'always' } },
|
|
131
|
+
}));
|
|
132
|
+
const res = await get(app, DESKTOP_UA);
|
|
133
|
+
const href = /data-lp-cta="cta_web" href="([^"]+)"/.exec(res.body)?.[1]?.replace(/&/g, '&');
|
|
134
|
+
expect(href).toBeDefined();
|
|
135
|
+
const url = new URL(href);
|
|
136
|
+
expect(url.origin + url.pathname).toBe('https://example.com/page');
|
|
137
|
+
expect(url.searchParams.get('utm_source')).toBe('newsletter');
|
|
138
|
+
expect(url.searchParams.get('utm_medium')).toBe('email');
|
|
139
|
+
expect(url.searchParams.get('ref')).toBe('abc');
|
|
140
|
+
expect(url.searchParams.get('lf_click')).toMatch(/^[0-9a-f-]{36}$/);
|
|
141
|
+
});
|
|
142
|
+
it('has no web link when the link has no web destination', async () => {
|
|
143
|
+
mockDb(linkRow());
|
|
144
|
+
expect((await get(app, DESKTOP_UA)).body).not.toContain('Continue on the web');
|
|
145
|
+
});
|
|
113
146
|
it("a link set to 'off' wins over a workspace set to 'always'", async () => {
|
|
114
147
|
mockDb(linkRow({
|
|
115
148
|
web_fallback_url: 'https://example.com/page',
|
|
@@ -252,4 +285,114 @@ describe('launchpad page — host hooks', () => {
|
|
|
252
285
|
expect(res.headers['content-security-policy']).toContain("connect-src 'self' https://events.example");
|
|
253
286
|
});
|
|
254
287
|
});
|
|
288
|
+
describe('launchpad page — mobile mode', () => {
|
|
289
|
+
const pageMode = { launchpad: { mobile: 'page' } };
|
|
290
|
+
it("serves the page to an iPhone with a scheme: 'Open in app' is a button, nothing navigates", async () => {
|
|
291
|
+
mockDb(linkRow({ app_scheme: 'demo', deep_link_path: '/p/1', deep_link_parameters: { x: '1' }, org_settings: pageMode }));
|
|
292
|
+
const res = await get(app, IPHONE_UA);
|
|
293
|
+
expect(res.statusCode).toBe(200);
|
|
294
|
+
expect(res.headers['content-security-policy']).toMatch(/script-src 'nonce-/);
|
|
295
|
+
expect(res.body).toContain('class="lp"');
|
|
296
|
+
expect(res.body).toContain('id="lp-open"');
|
|
297
|
+
expect(res.body).toContain('data-scheme="demo://p/1?x=1"');
|
|
298
|
+
expect(res.body).toContain('href="demo://p/1?x=1"');
|
|
299
|
+
expect(res.body).toContain('window.location.hash');
|
|
300
|
+
expect(res.body).not.toContain('setTimeout');
|
|
301
|
+
expect(res.body).not.toContain('location.replace');
|
|
302
|
+
expect(res.body).not.toContain('Opening');
|
|
303
|
+
});
|
|
304
|
+
it('shows only the visitor\'s own store, and no QR block', async () => {
|
|
305
|
+
mockDb(linkRow({ org_settings: pageMode }));
|
|
306
|
+
const iphone = await get(app, IPHONE_UA);
|
|
307
|
+
expect(iphone.body).toContain('Download on the App Store');
|
|
308
|
+
expect(iphone.body).not.toContain('Get it on Google Play');
|
|
309
|
+
expect(iphone.body).not.toContain('class="lp-qr"');
|
|
310
|
+
mockDb(linkRow({ org_settings: pageMode }));
|
|
311
|
+
const android = await get(app, ANDROID_UA);
|
|
312
|
+
expect(android.body).toContain('Get it on Google Play');
|
|
313
|
+
expect(android.body).not.toContain('Download on the App Store');
|
|
314
|
+
});
|
|
315
|
+
it('serves the page without an Open button when the link has no scheme', async () => {
|
|
316
|
+
mockDb(linkRow({ org_settings: pageMode }));
|
|
317
|
+
const res = await get(app, IPHONE_UA);
|
|
318
|
+
expect(res.statusCode).toBe(200);
|
|
319
|
+
expect(res.body).toContain('class="lp"');
|
|
320
|
+
expect(res.body).not.toContain('id="lp-open"');
|
|
321
|
+
expect(res.body).not.toContain('<script');
|
|
322
|
+
});
|
|
323
|
+
it('keeps the 302 to a Universal Link / App Link — the OS owns the installed case', async () => {
|
|
324
|
+
mockDb(linkRow({ ios_universal_link: 'https://app.example/p/1', org_settings: pageMode }));
|
|
325
|
+
const ios = await get(app, IPHONE_UA);
|
|
326
|
+
expect(ios.statusCode).toBe(302);
|
|
327
|
+
expect(ios.headers.location).toBe('https://app.example/p/1');
|
|
328
|
+
mockDb(linkRow({ android_app_link: 'https://app.example/p/1', org_settings: pageMode }));
|
|
329
|
+
const android = await get(app, ANDROID_UA);
|
|
330
|
+
expect(android.statusCode).toBe(302);
|
|
331
|
+
});
|
|
332
|
+
it('a Universal Link for iOS does not stop the page on Android', async () => {
|
|
333
|
+
mockDb(linkRow({ ios_universal_link: 'https://app.example/p/1', org_settings: pageMode }));
|
|
334
|
+
const android = await get(app, ANDROID_UA);
|
|
335
|
+
expect(android.statusCode).toBe(200);
|
|
336
|
+
expect(android.body).toContain('class="lp"');
|
|
337
|
+
});
|
|
338
|
+
it('serves the page inside an in-app browser, where a bare scheme redirect fails silently', async () => {
|
|
339
|
+
mockDb(linkRow({ app_scheme: 'demo', deep_link_path: '/p/1', web_fallback_url: 'https://example.com/p/1', org_settings: pageMode }));
|
|
340
|
+
const res = await get(app, FB_IOS_UA);
|
|
341
|
+
expect(res.statusCode).toBe(200);
|
|
342
|
+
expect(res.body).toContain('id="lp-open"');
|
|
343
|
+
});
|
|
344
|
+
/**
|
|
345
|
+
* In-app browsers bypass Universal Links, so the store redirect that a regular
|
|
346
|
+
* browser gets would send someone who has the app to the store. The redirect
|
|
347
|
+
* path handles that by preferring the web fallback there (pickMobileFallbackUrl),
|
|
348
|
+
* which gives the OS a second chance to open the app on the next hop. In page
|
|
349
|
+
* mode that hop must still exist — as a link.
|
|
350
|
+
*/
|
|
351
|
+
it('keeps the web fallback reachable from the page, so the Universal Link second chance survives', async () => {
|
|
352
|
+
mockDb(linkRow({ web_fallback_url: 'https://app.example/p/1', org_settings: pageMode }));
|
|
353
|
+
const inApp = await get(app, FB_IOS_UA);
|
|
354
|
+
expect(inApp.statusCode).toBe(200);
|
|
355
|
+
expect(inApp.body).toContain('href="https://app.example/p/1">Continue on the web</a>');
|
|
356
|
+
expect(inApp.body).toContain('Download on the App Store');
|
|
357
|
+
// Store mode is untouched either way: regular browser → store, in-app browser → web fallback.
|
|
358
|
+
mockDb(linkRow({ web_fallback_url: 'https://app.example/p/1' }));
|
|
359
|
+
const safari = await get(app, IPHONE_UA);
|
|
360
|
+
expect(safari.statusCode).toBe(302);
|
|
361
|
+
expect(safari.headers.location).toBe('https://apps.apple.com/app/id1');
|
|
362
|
+
mockDb(linkRow({ web_fallback_url: 'https://app.example/p/1' }));
|
|
363
|
+
const fb = await get(app, FB_IOS_UA);
|
|
364
|
+
expect(fb.statusCode).toBe(302);
|
|
365
|
+
expect(fb.headers.location).toBe('https://app.example/p/1');
|
|
366
|
+
});
|
|
367
|
+
it("a link set to 'off' keeps the store behaviour under 'page'", async () => {
|
|
368
|
+
mockDb(linkRow({ launchpad_mode: 'off', org_settings: pageMode }));
|
|
369
|
+
const res = await get(app, IPHONE_UA);
|
|
370
|
+
expect(res.statusCode).toBe(302);
|
|
371
|
+
expect(res.headers.location).toBe('https://apps.apple.com/app/id1');
|
|
372
|
+
});
|
|
373
|
+
it("a link set to 'on' does not force the page onto a workspace that chose 'store'", async () => {
|
|
374
|
+
mockDb(linkRow({ launchpad_mode: 'on' }));
|
|
375
|
+
const res = await get(app, IPHONE_UA);
|
|
376
|
+
expect(res.statusCode).toBe(302);
|
|
377
|
+
});
|
|
378
|
+
it("'store' and an absent setting produce the same interstitial, byte for byte", async () => {
|
|
379
|
+
const row = { app_scheme: 'demo', deep_link_path: '/p/1', deep_link_parameters: { x: '1', y: 'two words' } };
|
|
380
|
+
mockDb(linkRow(row));
|
|
381
|
+
const absent = await get(app, IPHONE_UA);
|
|
382
|
+
mockDb(linkRow({ ...row, org_settings: { launchpad: { mobile: 'store' } } }));
|
|
383
|
+
const explicit = await get(app, IPHONE_UA);
|
|
384
|
+
expect(absent.statusCode).toBe(200);
|
|
385
|
+
expect(absent.body).toContain('Opening');
|
|
386
|
+
expect(absent.body).toContain('setTimeout');
|
|
387
|
+
expect(absent.body).toContain('id="open-btn" href="demo://p/1?x=1&y=two+words"');
|
|
388
|
+
expect(absent.body).not.toContain('class="lp"');
|
|
389
|
+
expect(explicit.body).toBe(absent.body);
|
|
390
|
+
expect(explicit.headers['content-type']).toBe(absent.headers['content-type']);
|
|
391
|
+
});
|
|
392
|
+
it('page mode changes nothing on desktop', async () => {
|
|
393
|
+
mockDb(linkRow({ web_fallback_url: 'https://example.com/page', org_settings: pageMode }));
|
|
394
|
+
const res = await get(app, DESKTOP_UA);
|
|
395
|
+
expect(res.statusCode).toBe(302);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
255
398
|
//# sourceMappingURL=redirect.launchpad.test.js.map
|