Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
pull/13028/head
Michael Telatynski 2020-04-04 00:48:26 +01:00
parent 8ca9e4ccb1
commit 67cf1e7536
2 changed files with 47 additions and 33 deletions

View File

@ -35,7 +35,7 @@ const tray = require('./tray');
const vectorMenu = require('./vectormenu'); const vectorMenu = require('./vectormenu');
const webContentsHandler = require('./webcontents-handler'); const webContentsHandler = require('./webcontents-handler');
const updater = require('./updater'); const updater = require('./updater');
const protocolInit = require('./protocol'); const {getProfileFromDeeplink, protocolInit} = require('./protocol');
const windowStateKeeper = require('electron-window-state'); const windowStateKeeper = require('electron-window-state');
const Store = require('electron-store'); const Store = require('electron-store');
@ -69,12 +69,9 @@ if (argv["help"]) {
} }
// 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 = argv["_"].find(arg => arg.startsWith('riot://')); const userDataPathInProtocol = getProfileFromDeeplink(argv["_"]);
if (deeplinkUrl && deeplinkUrl.includes('riot-desktop-user-data-path')) { if (userDataPathInProtocol) {
const parsedUrl = new URL(deeplinkUrl); app.setPath('userData', userDataPathInProtocol);
if (parsedUrl.protocol === 'riot:') {
app.setPath('userData', parsedUrl.searchParams.get('riot-desktop-user-data-path'));
}
} else if (argv['profile-dir']) { } else if (argv['profile-dir']) {
app.setPath('userData', argv['profile-dir']); app.setPath('userData', argv['profile-dir']);
} else if (argv['profile']) { } else if (argv['profile']) {

View File

@ -16,38 +16,55 @@ limitations under the License.
const {app} = require('electron'); const {app} = require('electron');
const PROTOCOL = "riot://";
const SEARCH_PARAM = "riot-desktop-user-data-path";
const processUrl = (url) => { const processUrl = (url) => {
if (!global.mainWindow) return; if (!global.mainWindow) return;
console.log("Handling link: ", url); console.log("Handling link: ", url);
global.mainWindow.loadURL(url.replace("riot://", "vector://")); global.mainWindow.loadURL(url.replace(PROTOCOL, "vector://"));
}; };
module.exports = () => { module.exports = {
// get all args except `hidden` as it'd mean the app would not get focused getProfileFromDeeplink: (args) => {
// XXX: passing args to protocol handlers only works on Windows, // check if we are passed a profile in the SSO callback url
// so unpackaged deep-linking and --profile passing won't work on Mac/Linux const deeplinkUrl = args.find(arg => arg.startsWith('riot://'));
const args = process.argv.slice(1).filter(arg => arg !== "--hidden" && arg !== "-hidden"); if (deeplinkUrl && deeplinkUrl.includes(SEARCH_PARAM)) {
if (app.isPackaged) { const parsedUrl = new URL(deeplinkUrl);
app.setAsDefaultProtocolClient('riot', process.execPath, args); if (parsedUrl.protocol === 'riot:') {
} else if (process.platform === 'win32') { // on Mac/Linux this would just cause the electron binary to open const profile = parsedUrl.searchParams.get(SEARCH_PARAM);
// special handler for running without being packaged, e.g `electron .` by passing our app path to electron console.log("Forwarding to profile: ", profile);
app.setAsDefaultProtocolClient('riot', process.execPath, [app.getAppPath(), ...args]); return profile;
} }
}
},
protocolInit: () => {
// get all args except `hidden` as it'd mean the app would not get focused
// XXX: passing args to protocol handlers only works on Windows, so unpackaged deep-linking
// --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");
if (app.isPackaged) {
app.setAsDefaultProtocolClient('riot', process.execPath, args);
} else if (process.platform === 'win32') { // 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
app.setAsDefaultProtocolClient('riot', process.execPath, [app.getAppPath(), ...args]);
}
if (process.platform === 'darwin') { if (process.platform === 'darwin') {
// Protocol handler for macos // Protocol handler for macos
app.on('open-url', function(ev, url) { app.on('open-url', function(ev, url) {
ev.preventDefault(); ev.preventDefault();
processUrl(url); processUrl(url);
}); });
} else { } else {
// 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("riot://")) return; if (!url.startsWith(PROTOCOL)) return;
processUrl(url); processUrl(url);
}); });
} }
},
}; };