UBERF-8427: Fix desktop oauth flow (#6975)

Signed-off-by: Alexey Zinoviev <alexey.zinoviev@xored.com>
This commit is contained in:
Alexey Zinoviev 2024-10-18 17:19:33 +04:00 committed by GitHub
parent 913849af82
commit f4393df8f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 57 additions and 9 deletions

View File

@ -1483,7 +1483,7 @@ dependencies:
version: 22.8.8
electron:
specifier: ^32.1.1
version: 32.1.1
version: 32.2.1
electron-builder:
specifier: ^25.0.5
version: 25.0.5
@ -13754,8 +13754,8 @@ packages:
resolution: {integrity: sha512-hWFbUk9u3fQHcKzTAcjZAN7XH9bL9oH9g20RRDU/DVDNqdMI03GzlBZfR/R8R1krYu9AT4biLqSCAxnt9LMAfA==}
dev: false
/electron@32.1.1:
resolution: {integrity: sha512-NlWvG6kXOJbZbELmzP3oV7u50I3NHYbCeh+AkUQ9vGyP7b74cFMx9HdTzejODeztW1jhr3SjIBbUZzZ45zflfQ==}
/electron@32.2.1:
resolution: {integrity: sha512-GCPI/5hU34pPcNltNpz+uylhhuTm9BM0N8RmrbVgaWBodLSmmcCkvpgN0BseKhO6IwQOPzWaovrcZ/nPIpfGaQ==}
engines: {node: '>= 12.20.55'}
hasBin: true
requiresBuild: true
@ -27126,7 +27126,7 @@ packages:
'@vercel/webpack-asset-relocator-loader': 1.7.4
cross-env: 7.0.3
dotenv: 16.0.3
electron: 32.1.1
electron: 32.2.1
electron-builder: 25.0.5
electron-squirrel-startup: 1.0.1
node-loader: 2.0.0(webpack@5.90.3)
@ -27262,7 +27262,7 @@ packages:
css-loader: 5.2.7(webpack@5.90.3)
dotenv: 16.0.3
dotenv-webpack: 8.0.1(webpack@5.90.3)
electron: 32.1.1
electron: 32.2.1
electron-context-menu: 4.0.4
electron-log: 5.1.7
electron-squirrel-startup: 1.0.1

View File

@ -124,6 +124,21 @@ function hookOpenWindow (window: BrowserWindow): void {
})
}
function handleAuthRedirects (window: BrowserWindow): void {
window.webContents.on('will-redirect', (event) => {
if (event?.url.startsWith(`${FRONT_URL}/login/auth`)) {
console.log('Auth happened, redirecting to local index')
const urlObj = new URL(decodeURIComponent(event.url))
event.preventDefault()
void (async (): Promise<void> => {
await window.loadFile(path.join('dist', 'ui', 'index.html'))
window.webContents.send('handle-auth', urlObj.searchParams.get('token'))
})()
}
})
}
const createWindow = async (): Promise<void> => {
mainWindow = new BrowserWindow({
width: defaultWidth,
@ -146,6 +161,7 @@ const createWindow = async (): Promise<void> => {
}
await mainWindow.loadFile(path.join('dist', 'ui', 'index.html'))
addPermissionHandlers(mainWindow.webContents.session)
handleAuthRedirects(mainWindow)
// In this example, only windows with the `about:blank` url will be created.
// All other urls will be blocked.

View File

@ -92,6 +92,15 @@ window.addEventListener('DOMContentLoaded', () => {
setDownloadProgress(progress)
})
ipcMain.handleAuth((token) => {
const authLoc = {
path: ['login', 'auth'],
query: { token }
}
navigate(authLoc)
})
ipcMain.on('start-backup', () => {
// We need to obtain current token and endpoint and trigger backup
const token = getMetadata(presentation.metadata.Token)

View File

@ -39,7 +39,7 @@ import { taskId } from '@hcengineering/task'
import telegram, { telegramId } from '@hcengineering/telegram'
import { templatesId } from '@hcengineering/templates'
import tracker, { trackerId } from '@hcengineering/tracker'
import uiPlugin, { getCurrentLocation, locationStorageKeyId, navigate, setLocationStorageKey } from '@hcengineering/ui'
import uiPlugin, { getCurrentLocation, locationStorageKeyId, locationToUrl, navigate, parseLocation, setLocationStorageKey } from '@hcengineering/ui'
import { uploaderId } from '@hcengineering/uploader'
import { viewId } from '@hcengineering/view'
import workbench, { workbenchId } from '@hcengineering/workbench'
@ -337,6 +337,7 @@ export async function configurePlatform (): Promise<void> {
}
const last = localStorage.getItem(locationStorageKeyId)
if (config.INITIAL_URL !== '') {
console.log('NAVIGATE', config.INITIAL_URL, getCurrentLocation())
// NavigationExpandedDefault=false fills buggy:
@ -353,5 +354,6 @@ export async function configurePlatform (): Promise<void> {
} else {
navigate({ path: [] })
}
console.log('Initial location is: ', getCurrentLocation())
}

View File

@ -130,6 +130,12 @@ const expose: IPCMainExposed = {
})
},
handleAuth: (callback) => {
ipcRenderer.on('handle-auth', (event, value) => {
callback(value)
})
},
async setFrontCookie (host: string, name: string, value: string): Promise<void> {
ipcRenderer.send('set-front-cookie', host, name, value)
},

View File

@ -81,6 +81,7 @@ export interface IPCMainExposed {
sendNotification: (notififationParams: NotificationParams) => void
getScreenAccess: () => Promise<boolean>
getScreenSources: () => Promise<ScreenSource[]>
handleAuth: (callback: (token: string) => void) => void
cancelBackup: () => void
startBackup: (token: string, endpoint: string, workspace: string) => void

View File

@ -18,7 +18,7 @@
import { NavLink } from '@hcengineering/presentation'
import { getHref } from '../utils'
import { BottomAction } from '../index'
import { BottomAction, goTo } from '../index'
export let action: BottomAction
</script>
@ -28,7 +28,16 @@
<span><Label label={action.caption} /></span>
{/if}
{#if action.page}
<NavLink href={getHref(action.page)}><Label label={action.i18n} /></NavLink>
<NavLink
href={getHref(action.page)}
onClick={() => {
if (action.func !== undefined) {
action.func()
} else if (action.page !== undefined) {
goTo(action.page)
}
}}><Label label={action.i18n} /></NavLink
>
{:else}
<a href="." on:click|preventDefault={action.func}><Label label={action.i18n} /></a>
{/if}

View File

@ -169,7 +169,12 @@
{#if workspaces.length}
<div>
<span><Label label={login.string.WantAnotherWorkspace} /></span>
<NavLink href={getHref('createWorkspace')}><Label label={login.string.CreateWorkspace} /></NavLink>
<NavLink
href={getHref('createWorkspace')}
onClick={() => {
goTo('createWorkspace')
}}><Label label={login.string.CreateWorkspace} /></NavLink
>
</div>
{/if}
<div>