mirror of
https://github.com/Eugeny/tabby.git
synced 2026-08-24 02:34:19 -05:00
warn before opening external app-specific URIs
This commit is contained in:
@@ -262,7 +262,7 @@ export abstract class PlatformService {
|
|||||||
|
|
||||||
abstract getOSRelease (): string
|
abstract getOSRelease (): string
|
||||||
abstract getAppVersion (): string
|
abstract getAppVersion (): string
|
||||||
abstract openExternal (url: string): void
|
abstract openExternal (url: string): Promise<void>
|
||||||
abstract listFonts (): Promise<string[]>
|
abstract listFonts (): Promise<string[]>
|
||||||
abstract setErrorHandler (handler: (_: any) => void): void
|
abstract setErrorHandler (handler: (_: any) => void): void
|
||||||
abstract popupContextMenu (menu: MenuItemOptions[], event?: MouseEvent): void
|
abstract popupContextMenu (menu: MenuItemOptions[], event?: MouseEvent): void
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ try {
|
|||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
export class ElectronPlatformService extends PlatformService {
|
export class ElectronPlatformService extends PlatformService {
|
||||||
supportsWindowControls = true
|
supportsWindowControls = true
|
||||||
|
private safeExternalSchemes = new Set(['http', 'https', 'ftp', 'mailto'])
|
||||||
private configPath: string
|
private configPath: string
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
@@ -140,8 +141,44 @@ export class ElectronPlatformService extends PlatformService {
|
|||||||
this.electron.shell.showItemInFolder(p)
|
this.electron.shell.showItemInFolder(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
openExternal (url: string): void {
|
async openExternal (url: string): Promise<void> {
|
||||||
this.electron.shell.openExternal(url)
|
const scheme = this.getExternalScheme(url)
|
||||||
|
if (scheme && this.safeExternalSchemes.has(scheme)) {
|
||||||
|
await this.electron.shell.openExternal(url)
|
||||||
|
} else {
|
||||||
|
await this.confirmAndOpenExternal(url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private getExternalScheme (url: string): string | null {
|
||||||
|
try {
|
||||||
|
const protocol = new URL(url.trim()).protocol
|
||||||
|
return protocol ? protocol.replace(':', '').toLowerCase() : null
|
||||||
|
} catch {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async confirmAndOpenExternal (url: string): Promise<void> {
|
||||||
|
const scheme = this.getExternalScheme(url)
|
||||||
|
const result = await this.electron.dialog.showMessageBox(
|
||||||
|
this.hostWindow.getWindow(),
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
message: this.translate.instant(`Open this app-specific "${scheme}" URI?`),
|
||||||
|
detail: url,
|
||||||
|
buttons: [
|
||||||
|
this.translate.instant('Open'),
|
||||||
|
this.translate.instant('Cancel'),
|
||||||
|
],
|
||||||
|
defaultId: 0,
|
||||||
|
cancelId: 1,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
if (result.response === 0) {
|
||||||
|
await this.electron.shell.openExternal(url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
openPath (p: string): void {
|
openPath (p: string): void {
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export class WebPlatformService extends PlatformService {
|
|||||||
return '1.0'
|
return '1.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
openExternal (url: string): void {
|
async openExternal (url: string): Promise<void> {
|
||||||
window.open(url)
|
window.open(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user