Add support for io.element.desktop scheme for OIDC (#1662)

This commit is contained in:
Michael Telatynski 2024-05-13 11:25:13 +01:00 committed by GitHub
parent 031d5a5d8f
commit 6c98dbed0e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 14 deletions

View file

@ -39,9 +39,7 @@ const pkg: Pkg = JSON.parse(fs.readFileSync("package.json", "utf8"));
interface Configuration extends BaseConfiguration { interface Configuration extends BaseConfiguration {
extraMetadata: Partial<Pick<Pkg, "version">> & Omit<Pkg, "version">; extraMetadata: Partial<Pick<Pkg, "version">> & Omit<Pkg, "version">;
linux: { linux: BaseConfiguration["linux"];
desktop: Record<string, string>;
} & BaseConfiguration["linux"];
win: BaseConfiguration["win"]; win: BaseConfiguration["win"];
mac: BaseConfiguration["mac"]; mac: BaseConfiguration["mac"];
deb: { deb: {
@ -118,9 +116,6 @@ const config: Writable<Configuration> = {
category: "Network;InstantMessaging;Chat", category: "Network;InstantMessaging;Chat",
maintainer: "support@element.io", maintainer: "support@element.io",
icon: "build/icons", icon: "build/icons",
desktop: {
MimeType: "x-scheme-handler/element",
},
}, },
deb: { deb: {
packageCategory: "net", packageCategory: "net",
@ -167,7 +162,7 @@ const config: Writable<Configuration> = {
protocols: [ protocols: [
{ {
name: "element", name: "element",
schemes: ["element"], schemes: ["io.element.desktop", "element"],
}, },
], ],
}; };

View file

@ -19,7 +19,8 @@ import { URL } from "url";
import path from "path"; import path from "path";
import fs from "fs"; import fs from "fs";
const PROTOCOL = "element:"; const LEGACY_PROTOCOL = "element";
const PROTOCOL = "io.element.desktop";
const SEARCH_PARAM = "element-desktop-ssoid"; const SEARCH_PARAM = "element-desktop-ssoid";
const STORE_FILE_NAME = "sso-sessions.json"; const STORE_FILE_NAME = "sso-sessions.json";
@ -33,7 +34,7 @@ function processUrl(url: string): void {
// sanity check: we only register for the one protocol, so we shouldn't // sanity check: we only register for the one protocol, so we shouldn't
// be getting anything else unless the user is forcing a URL to open // be getting anything else unless the user is forcing a URL to open
// with the Element app. // with the Element app.
if (parsed.protocol !== PROTOCOL) { if (parsed.protocol !== `${PROTOCOL}:` && parsed.protocol !== `${LEGACY_PROTOCOL}:`) {
console.log("Ignoring unexpected protocol: ", parsed.protocol); console.log("Ignoring unexpected protocol: ", parsed.protocol);
return; return;
} }
@ -82,10 +83,10 @@ export function recordSSOSession(sessionID: string): void {
export function getProfileFromDeeplink(args: string[]): string | undefined { export function getProfileFromDeeplink(args: string[]): string | undefined {
// check if we are passed a profile in the SSO callback url // check if we are passed a profile in the SSO callback url
const deeplinkUrl = args.find((arg) => arg.startsWith(PROTOCOL + "//")); const deeplinkUrl = args.find((arg) => arg.startsWith(`${PROTOCOL}://`) || arg.startsWith(`${LEGACY_PROTOCOL}://`));
if (deeplinkUrl?.includes(SEARCH_PARAM)) { if (deeplinkUrl?.includes(SEARCH_PARAM)) {
const parsedUrl = new URL(deeplinkUrl); const parsedUrl = new URL(deeplinkUrl);
if (parsedUrl.protocol === PROTOCOL) { if (parsedUrl.protocol === `${PROTOCOL}:` || parsedUrl.protocol === `${LEGACY_PROTOCOL}:`) {
const store = readStore(); const store = readStore();
let ssoID = parsedUrl.searchParams.get(SEARCH_PARAM); let ssoID = parsedUrl.searchParams.get(SEARCH_PARAM);
if (!ssoID) { if (!ssoID) {
@ -105,11 +106,13 @@ export function protocolInit(): void {
// --profile/--profile-dir are passed via the SEARCH_PARAM var in the callback url // --profile/--profile-dir are passed via the SEARCH_PARAM var in the callback url
const args = process.argv.slice(1).filter((arg) => arg !== "--hidden" && arg !== "-hidden"); const args = process.argv.slice(1).filter((arg) => arg !== "--hidden" && arg !== "-hidden");
if (app.isPackaged) { if (app.isPackaged) {
app.setAsDefaultProtocolClient("element", process.execPath, args); app.setAsDefaultProtocolClient(PROTOCOL, process.execPath, args);
app.setAsDefaultProtocolClient(LEGACY_PROTOCOL, process.execPath, args);
} else if (process.platform === "win32") { } else if (process.platform === "win32") {
// on Mac/Linux this would just cause the electron binary to open // on Mac/Linux this would just cause the electron binary to open
// special handler for running without being packaged, e.g `electron .` by passing our app path to electron // special handler for running without being packaged, e.g `electron .` by passing our app path to electron
app.setAsDefaultProtocolClient("element", process.execPath, [app.getAppPath(), ...args]); app.setAsDefaultProtocolClient(PROTOCOL, process.execPath, [app.getAppPath(), ...args]);
app.setAsDefaultProtocolClient(LEGACY_PROTOCOL, process.execPath, [app.getAppPath(), ...args]);
} }
if (process.platform === "darwin") { if (process.platform === "darwin") {
@ -122,7 +125,7 @@ export function protocolInit(): void {
// Protocol handler for win32/Linux // Protocol handler for win32/Linux
app.on("second-instance", (ev, commandLine) => { app.on("second-instance", (ev, commandLine) => {
const url = commandLine[commandLine.length - 1]; const url = commandLine[commandLine.length - 1];
if (!url.startsWith(PROTOCOL + "//")) return; if (!url.startsWith(`${PROTOCOL}://`) && !url.startsWith(`${LEGACY_PROTOCOL}://`)) return;
processUrl(url); processUrl(url);
}); });
} }