Files
firezone/website/src/middleware.ts
Jamil fc7b6e3fb0 feat(ci): Publish installer PKG for macOS standalone (#8795)
Microsoft Intune's DMG provisioner currently fails unexpectedly when
trying to provision our published DMG file with the error:

> The DMG file couldn't be mounted for installation. Check the DMG file
if the error persists. (0x87D30139)

I ran the following verification commands locally, which all passed:

```
hdiutil verify -verbose <dmg>
hdiutil imageinfo -verbose <dmg>
hdiutil hfsanalyze -verbose <dmg>
hdiutil checksum -type SHA256 -verbose <dmg>
hdiutil info -verbose
hdiutil pmap -verbose <dmg>
```

So the issue appears to be most likely that Intune doens't like the
`/Applications` shortcut in the DMG. This is a UX feature to make it
easy to drag the application the /Applications folder upon opening the
DMG.

So we're publishing an PKG in addition to the DMG, which should be a
more reliable artifact for MDMs to use.

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
2025-04-16 16:21:40 +00:00

106 lines
4.4 KiB
TypeScript

import { NextResponse, NextRequest } from "next/server";
// This middleware is needed because NextJS doesn't populate params in the destination
// more than once. See https://github.com/vercel/next.js/issues/66891
const versionedRedirects = [
{
source: /^\/dl\/firezone-client-macos\/(\d+\.\d+\.\d+)$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/macos-client-:version/firezone-macos-client-:version.dmg",
},
{
source: /^\/dl\/firezone-client-macos\/pkg\/(\d+\.\d+\.\d+)$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/macos-client-:version/firezone-macos-client-:version.pkg",
},
{
source: /^\/dl\/firezone-client-android\/(\d+\.\d+\.\d+)$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/android-client-:version/firezone-android-client-:version.apk",
},
{
source: /^\/dl\/firezone-client-gui-windows\/(\d+\.\d+\.\d+)\/x86_64$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/gui-client-:version/firezone-client-gui-windows_:version_x86_64.msi",
},
{
source: /^\/dl\/firezone-client-headless-windows\/(\d+\.\d+\.\d+)\/x86_64$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/headless-client-:version/firezone-client-headless-windows_:version_x86_64.exe",
},
{
source: /^\/dl\/firezone-client-gui-linux\/(\d+\.\d+\.\d+)\/x86_64$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/gui-client-:version/firezone-client-gui-linux_:version_x86_64.deb",
},
{
source: /^\/dl\/firezone-client-gui-linux\/(\d+\.\d+\.\d+)\/aarch64$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/gui-client-:version/firezone-client-gui-linux_:version_aarch64.deb",
},
{
source: /^\/dl\/firezone-client-headless-linux\/(\d+\.\d+\.\d+)\/x86_64$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/headless-client-:version/firezone-client-headless-linux_:version_x86_64",
},
{
source: /^\/dl\/firezone-client-headless-linux\/(\d+\.\d+\.\d+)\/aarch64$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/headless-client-:version/firezone-client-headless-linux_:version_aarch64",
},
{
source: /^\/dl\/firezone-client-headless-linux\/(\d+\.\d+\.\d+)\/armv7$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/headless-client-:version/firezone-client-headless-linux_:version_armv7",
},
{
source: /^\/dl\/firezone-gateway\/(\d+\.\d+\.\d+)\/x86_64$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/gateway-:version/firezone-gateway_:version_x86_64",
},
{
source: /^\/dl\/firezone-gateway\/(\d+\.\d+\.\d+)\/aarch64$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/gateway-:version/firezone-gateway_:version_aarch64",
},
{
source: /^\/dl\/firezone-gateway\/(\d+\.\d+\.\d+)\/armv7$/,
destination:
"https://www.github.com/firezone/firezone/releases/download/gateway-:version/firezone-gateway_:version_armv7",
},
];
export const config = {
matcher: [
"/dl/firezone-client-macos/(\\d+).(\\d+).(\\d+)",
"/dl/firezone-client-macos/pkg/(\\d+).(\\d+).(\\d+)",
"/dl/firezone-client-android/(\\d+).(\\d+).(\\d+)",
"/dl/firezone-client-gui-windows/(\\d+).(\\d+).(\\d+)/x86_64",
"/dl/firezone-client-headless-windows/(\\d+).(\\d+).(\\d+)/x86_64",
"/dl/firezone-client-gui-linux/(\\d+).(\\d+).(\\d+)/x86_64",
"/dl/firezone-client-gui-linux/(\\d+).(\\d+).(\\d+)/aarch64",
"/dl/firezone-client-headless-linux/(\\d+).(\\d+).(\\d+)/x86_64",
"/dl/firezone-client-headless-linux/(\\d+).(\\d+).(\\d+)/aarch64",
"/dl/firezone-client-headless-linux/(\\d+).(\\d+).(\\d+)/armv7",
"/dl/firezone-gateway/(\\d+).(\\d+).(\\d+)/x86_64",
"/dl/firezone-gateway/(\\d+).(\\d+).(\\d+)/aarch64",
"/dl/firezone-gateway/(\\d+).(\\d+).(\\d+)/armv7",
],
};
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
for (const redirect of versionedRedirects) {
const match = pathname.match(redirect.source);
if (match) {
const version = match[1];
const destination = redirect.destination.replace(/:version/g, version);
return NextResponse.redirect(destination);
}
}
return NextResponse.next();
}