From 6ab55f6ae45d9840aa382c3111e3ce7a881742a4 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Fri, 16 Oct 2026 23:22:25 -0400 Subject: [PATCH 01/10] refactor(auth): migrate custom OAuth app login to the device flow Replace the client-secret OAuth web flow for user-supplied ("custom") OAuth apps with the OAuth device flow, which authorizes using only a public client ID. - Add a custom OAuth app sign-in that collects a hostname and client ID and reuses the shared device-flow authorization and scope UI; no client secret. - Retire the web flow end to end: the /login/github/oauth-app route, the authorization-code + secret exchange, the oauthWebApp adapter bundle, and the gitify:// custom-protocol callback across the Electron main process, preload, and the shared IPC event. - Rename auth-method labels: GitHub App -> Gitify OAuth App, OAuth App -> Custom OAuth App; persist the custom app's client ID for its settings link. - Migrate persisted accounts on load without forcing re-login. - Surface actionable guidance for device_flow_disabled and unknown client IDs. --- src/main/index.ts | 20 +- src/main/lifecycle/startup.test.ts | 36 +- src/main/lifecycle/startup.ts | 53 +- src/preload/index.ts | 10 - src/renderer/App.tsx | 7 +- src/renderer/__helpers__/hook-mocks.ts | 1 - src/renderer/__helpers__/test-utils.tsx | 1 - src/renderer/__helpers__/visual.setup.ts | 1 - src/renderer/__helpers__/vitest.setup.ts | 1 - src/renderer/__mocks__/account-mocks.ts | 18 +- src/renderer/__mocks__/notifications-mocks.ts | 4 +- .../settings/AppearanceSettings.test.tsx | 8 +- src/renderer/hooks/useLogins.test.tsx | 50 +- src/renderer/hooks/useLogins.ts | 51 +- src/renderer/routes/AccountScopes.test.tsx | 22 +- src/renderer/routes/Accounts.test.tsx | 66 ++- src/renderer/routes/Login.test.tsx | 2 +- .../login-dark-classic-chromium-linux.png | Bin 35196 -> 28527 bytes ...-oauth-app-dark-classic-chromium-linux.png | Bin 0 -> 34397 bytes ...oauth-app-light-classic-chromium-linux.png | Bin 0 -> 33539 bytes ...-oauth-app-dark-classic-chromium-linux.png | Bin 40512 -> 0 bytes ...oauth-app-light-classic-chromium-linux.png | Bin 40626 -> 0 bytes .../login-light-classic-chromium-linux.png | Bin 35628 -> 28372 bytes .../routes/__snapshots__/Login.test.tsx.snap | 4 +- .../github/LoginWithCustomOAuthApp.test.tsx | 104 ++++ .../routes/github/LoginWithCustomOAuthApp.tsx | 164 ++++++ .../github/LoginWithDeviceFlow.test.tsx | 59 ++- .../routes/github/LoginWithDeviceFlow.tsx | 50 +- .../routes/github/LoginWithOAuthApp.test.tsx | 145 ------ .../routes/github/LoginWithOAuthApp.tsx | 216 -------- .../LoginWithOAuthApp.test.tsx.snap | 487 ------------------ src/renderer/routes/routes.visual.test.tsx | 8 +- src/renderer/stores/types.ts | 2 + src/renderer/stores/useAccountsStore.test.ts | 51 +- src/renderer/stores/useAccountsStore.ts | 30 +- src/renderer/types.ts | 9 +- .../utils/auth/loginValidation.test.ts | 37 +- src/renderer/utils/auth/loginValidation.ts | 31 +- src/renderer/utils/auth/state.test.ts | 22 - src/renderer/utils/auth/state.ts | 13 - src/renderer/utils/auth/types.ts | 20 +- .../utils/forges/bitbucket/adapter.test.ts | 2 +- .../utils/forges/gitea/adapter.test.ts | 4 +- .../utils/forges/github/adapter.test.ts | 69 ++- src/renderer/utils/forges/github/adapter.ts | 45 +- src/renderer/utils/forges/github/auth.test.ts | 24 +- src/renderer/utils/forges/github/auth.ts | 21 +- .../utils/forges/github/flows.test.ts | 418 +++++---------- src/renderer/utils/forges/github/flows.ts | 199 ++----- .../utils/forges/github/octokit.test.ts | 4 +- .../utils/forges/gitlab/adapter.test.ts | 2 +- src/renderer/utils/forges/types.ts | 52 +- src/shared/events.ts | 2 - 53 files changed, 917 insertions(+), 1728 deletions(-) create mode 100644 src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-custom-oauth-app-dark-classic-chromium-linux.png create mode 100644 src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-custom-oauth-app-light-classic-chromium-linux.png delete mode 100644 src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-oauth-app-dark-classic-chromium-linux.png delete mode 100644 src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-oauth-app-light-classic-chromium-linux.png create mode 100644 src/renderer/routes/github/LoginWithCustomOAuthApp.test.tsx create mode 100644 src/renderer/routes/github/LoginWithCustomOAuthApp.tsx delete mode 100644 src/renderer/routes/github/LoginWithOAuthApp.test.tsx delete mode 100644 src/renderer/routes/github/LoginWithOAuthApp.tsx delete mode 100644 src/renderer/routes/github/__snapshots__/LoginWithOAuthApp.test.tsx.snap delete mode 100644 src/renderer/utils/auth/state.test.ts delete mode 100644 src/renderer/utils/auth/state.ts diff --git a/src/main/index.ts b/src/main/index.ts index 8b9f58646..557b3d008 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -14,16 +14,10 @@ import { registerUpdaterHandlers, } from './handlers'; import { getIdleTrayIcon } from './icons'; -import { - configureWindowEvents, - handleProtocolURL, - initializeAppLifecycle, - onFirstRunMaybe, -} from './lifecycle'; +import { configureWindowEvents, initializeAppLifecycle, onFirstRunMaybe } from './lifecycle'; import MenuBuilder from './menu'; import { applyOzonePlatform } from './ozone'; import AppUpdater from './updater'; -import { isDevMode } from './utils'; // Runs at module load: the Ozone platform is read during app startup, so this // has to happen before `app.whenReady()` below. @@ -48,10 +42,6 @@ const mb = menubar({ const menuBuilder = new MenuBuilder(mb); const contextMenu = menuBuilder.buildMenu(); -// Register your app as the handler for a custom protocol -const protocol = isDevMode() ? 'gitify-dev' : 'gitify'; -app.setAsDefaultProtocolClient(protocol); - const appUpdater = new AppUpdater(mb, menuBuilder); app @@ -59,7 +49,7 @@ app .then(async () => { await onFirstRunMaybe(); - initializeAppLifecycle(mb, contextMenu, protocol); + initializeAppLifecycle(mb, contextMenu); // Configure window event handlers (Escape key, DevTools resize) configureWindowEvents(mb, menuBuilder); @@ -75,9 +65,3 @@ app .catch((err) => { logError('main', 'Failed to initialize application', toError(err)); }); - -// Handle gitify:// custom protocol URL events for OAuth 2.0 callback -app.on('open-url', (event, url) => { - event.preventDefault(); - handleProtocolURL(mb, url, protocol); -}); diff --git a/src/main/lifecycle/startup.test.ts b/src/main/lifecycle/startup.test.ts index f81f9a66f..17ced7ae8 100644 --- a/src/main/lifecycle/startup.test.ts +++ b/src/main/lifecycle/startup.test.ts @@ -1,30 +1,19 @@ import type { Menubar } from 'electron-menubar'; -import { EVENTS } from '../../shared/events'; - -import { handleProtocolURL, initializeAppLifecycle } from './startup'; +import { initializeAppLifecycle } from './startup'; const requestSingleInstanceLockMock = vi.fn(() => true); -const appOnMock = vi.fn(); const appQuitMock = vi.fn(); vi.mock('electron', () => ({ app: { requestSingleInstanceLock: () => requestSingleInstanceLockMock(), - on: (...a: unknown[]) => appOnMock(...a), quit: () => appQuitMock(), - } satisfies Pick, -})); - -const sendRendererEventMock = vi.fn(); -vi.mock('../events', () => ({ - sendRendererEvent: (...a: unknown[]) => sendRendererEventMock(...a), + } satisfies Pick, })); -const logInfoMock = vi.fn(); const logWarnMock = vi.fn(); vi.mock('../../shared/logger', () => ({ - logInfo: (...a: unknown[]) => logInfoMock(...a), logWarn: (...a: unknown[]) => logWarnMock(...a), })); @@ -46,7 +35,7 @@ describe('main/lifecycle/startup.ts', () => { const mb = createMb(); const contextMenu = {} as Electron.Menu; - initializeAppLifecycle(mb as unknown as Menubar, contextMenu, 'gitify'); + initializeAppLifecycle(mb as unknown as Menubar, contextMenu); expect(mb.on).toHaveBeenCalledWith('ready', expect.any(Function)); }); @@ -56,7 +45,7 @@ describe('main/lifecycle/startup.ts', () => { const mb = createMb(); const contextMenu = {} as Electron.Menu; - initializeAppLifecycle(mb as unknown as Menubar, contextMenu, 'gitify'); + initializeAppLifecycle(mb as unknown as Menubar, contextMenu); expect(appQuitMock).toHaveBeenCalled(); expect(logWarnMock).toHaveBeenCalled(); @@ -66,7 +55,7 @@ describe('main/lifecycle/startup.ts', () => { const mb = createMb(); const contextMenu = {} as Electron.Menu; - initializeAppLifecycle(mb as unknown as Menubar, contextMenu, 'gitify'); + initializeAppLifecycle(mb as unknown as Menubar, contextMenu); const readyHandler = (mb.on as unknown as ReturnType).mock.calls[0]?.[1]; expect(readyHandler).toBeDefined(); @@ -75,19 +64,4 @@ describe('main/lifecycle/startup.ts', () => { expect(mb.setContextMenu).toHaveBeenCalledWith(contextMenu); }); }); - - describe('handleProtocolURL', () => { - it('forwards matching protocol URL to renderer as AUTH_CALLBACK', () => { - const mb = createMb(); - const url = 'gitify://callback?code=abc123'; - handleProtocolURL(mb as unknown as Menubar, url, 'gitify'); - expect(sendRendererEventMock).toHaveBeenCalledWith(mb, EVENTS.AUTH_CALLBACK, url); - }); - - it('ignores URLs that do not match the protocol', () => { - const mb = createMb(); - handleProtocolURL(mb as unknown as Menubar, 'https://github.com', 'gitify'); - expect(sendRendererEventMock).not.toHaveBeenCalled(); - }); - }); }); diff --git a/src/main/lifecycle/startup.ts b/src/main/lifecycle/startup.ts index e80a38f71..a7b4faa98 100644 --- a/src/main/lifecycle/startup.ts +++ b/src/main/lifecycle/startup.ts @@ -2,14 +2,11 @@ import { app } from 'electron'; import type { Menubar } from 'electron-menubar'; import { APPLICATION } from '../../shared/constants'; -import { EVENTS } from '../../shared/events'; -import { logInfo, logWarn } from '../../shared/logger'; - -import { sendRendererEvent } from '../events'; +import { logWarn } from '../../shared/logger'; /** - * Set up core application lifecycle events including tray ready setup, - * protocol URL handling, and single-instance enforcement. + * Set up core application lifecycle events: tray ready setup and + * single-instance enforcement. * * The tray's context-menu wiring (Linux `setContextMenu` vs macOS/Windows * right-click popup) and the macOS `setIgnoreDoubleClickEvents` default @@ -18,60 +15,26 @@ import { sendRendererEvent } from '../events'; * * @param mb - The menubar instance to attach lifecycle events to. * @param contextMenu - The tray context menu to attach via `mb.setContextMenu`. - * @param protocol - The custom protocol string (e.g. 'gitify' or 'gitify-dev'). */ -export function initializeAppLifecycle( - mb: Menubar, - contextMenu: Electron.Menu, - protocol: string, -): void { +export function initializeAppLifecycle(mb: Menubar, contextMenu: Electron.Menu): void { mb.on('ready', () => { mb.app.setAppUserModelId(APPLICATION.ID); mb.tray.setToolTip(APPLICATION.NAME); mb.setContextMenu(contextMenu); }); - preventSecondInstance(mb, protocol); -} - -/** - * Handle a gitify:// protocol URL by forwarding it to the renderer process - * as an AUTH_CALLBACK event. - * - * @param mb - The menubar instance to forward the event through. - * @param url - The protocol URL to handle. - * @param protocol - The custom protocol string to match. - */ -export function handleProtocolURL(mb: Menubar, url: string, protocol: string): void { - if (url.startsWith(`${protocol}://`)) { - logInfo('main:handleUrl', `forwarding URL ${url} to renderer process`); - sendRendererEvent(mb, EVENTS.AUTH_CALLBACK, url); - } + preventSecondInstance(); } /** - * Enforce a single application instance. If a second instance is launched, - * any protocol URL in the command line is forwarded to the existing instance. - * - * @param mb - The menubar instance to show when a second instance is detected. - * @param protocol - The custom protocol string to extract from command line args. + * Enforce a single application instance. A second launch quits immediately so + * the already-running tray instance remains the only one. */ -function preventSecondInstance(mb: Menubar, protocol: string): void { +function preventSecondInstance(): void { const gotTheLock = app.requestSingleInstanceLock(); if (!gotTheLock) { logWarn('main:gotTheLock', 'Second instance detected, quitting'); app.quit(); - return; } - - app.on('second-instance', (_event, commandLine) => { - logInfo('main:second-instance', 'Second instance was launched. Extracting command to forward'); - - const url = commandLine.find((arg) => arg.startsWith(`${protocol}://`)); - - if (url) { - handleProtocolURL(mb, url, protocol); - } - }); } diff --git a/src/preload/index.ts b/src/preload/index.ts index f760cd767..b88db7a2a 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -245,16 +245,6 @@ export const api = { return onRendererEvent(EVENTS.SYSTEM_WAKE, () => callback()); }, - /** - * Register a callback invoked when the main process delivers an OAuth callback URL. - * - * @param callback - Called with the full callback URL (e.g. `gitify://oauth?code=...`). - * @returns A function that removes the listener. - */ - onAuthCallback: (callback: (url: string) => void) => { - return onRendererEvent(EVENTS.AUTH_CALLBACK, (_, url) => callback(url)); - }, - /** * Display a native OS notification. * diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 19f4e11ef..29ae186fb 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -11,9 +11,9 @@ import { AccountScopesRoute } from './routes/AccountScopes'; import { BitbucketLoginWithPersonalAccessTokenRoute } from './routes/bitbucket/LoginWithPersonalAccessToken'; import { FiltersRoute } from './routes/Filters'; import { GiteaLoginWithPersonalAccessTokenRoute } from './routes/gitea/LoginWithPersonalAccessToken'; +import { GitHubLoginWithCustomOAuthAppRoute } from './routes/github/LoginWithCustomOAuthApp'; import { GitHubLoginWithDeviceFlowRoute } from './routes/github/LoginWithDeviceFlow'; import { GitHubLoginWithCLIRoute } from './routes/github/LoginWithGitHubCLI'; -import { GitHubLoginWithOAuthAppRoute } from './routes/github/LoginWithOAuthApp'; import { GitHubLoginWithPersonalAccessTokenRoute } from './routes/github/LoginWithPersonalAccessToken'; import { GitLabLoginWithPersonalAccessTokenRoute } from './routes/gitlab/LoginWithPersonalAccessToken'; import { LoginRoute } from './routes/Login'; @@ -108,7 +108,10 @@ export function App() { element={} path="/login/github/personal-access-token" /> - } path="/login/github/oauth-app" /> + } + path="/login/github/custom-oauth-app" + /> } path="/login/gitea/personal-access-token" diff --git a/src/renderer/__helpers__/hook-mocks.ts b/src/renderer/__helpers__/hook-mocks.ts index fcff10597..a99570529 100644 --- a/src/renderer/__helpers__/hook-mocks.ts +++ b/src/renderer/__helpers__/hook-mocks.ts @@ -52,7 +52,6 @@ function buildLoginsDefaults(): LoginsState { loginWithDeviceFlowPoll: vi.fn(), loginWithDeviceFlowComplete: vi.fn(), loginWithCli: vi.fn(), - loginWithOAuthApp: vi.fn(), loginWithPersonalAccessToken: vi.fn(), logoutFromAccount: vi.fn(), }; diff --git a/src/renderer/__helpers__/test-utils.tsx b/src/renderer/__helpers__/test-utils.tsx index 53bf781fd..333e35ab0 100644 --- a/src/renderer/__helpers__/test-utils.tsx +++ b/src/renderer/__helpers__/test-utils.tsx @@ -47,7 +47,6 @@ const LOGIN_KEYS = [ 'loginWithDeviceFlowPoll', 'loginWithDeviceFlowComplete', 'loginWithCli', - 'loginWithOAuthApp', 'loginWithPersonalAccessToken', 'logoutFromAccount', ] as const; diff --git a/src/renderer/__helpers__/visual.setup.ts b/src/renderer/__helpers__/visual.setup.ts index c6bda06ec..3ea8fd8e1 100644 --- a/src/renderer/__helpers__/visual.setup.ts +++ b/src/renderer/__helpers__/visual.setup.ts @@ -105,7 +105,6 @@ function createGitifyBridgeApi(): Window['gitify'] { useUnreadActiveIcon: vi.fn(), }, notificationSoundPath: vi.fn(), - onAuthCallback: vi.fn(() => vi.fn()), onResetApp: vi.fn(() => vi.fn()), onSystemWake: vi.fn(() => vi.fn()), setAutoLaunch: vi.fn(), diff --git a/src/renderer/__helpers__/vitest.setup.ts b/src/renderer/__helpers__/vitest.setup.ts index 87d475fa6..7319d2bf4 100644 --- a/src/renderer/__helpers__/vitest.setup.ts +++ b/src/renderer/__helpers__/vitest.setup.ts @@ -114,7 +114,6 @@ function createGitifyBridgeApi(): Window['gitify'] { useUnreadActiveIcon: vi.fn(), }, notificationSoundPath: vi.fn(), - onAuthCallback: vi.fn(() => vi.fn()), onResetApp: vi.fn(() => vi.fn()), onSystemWake: vi.fn(() => vi.fn()), setAutoLaunch: vi.fn(), diff --git a/src/renderer/__mocks__/account-mocks.ts b/src/renderer/__mocks__/account-mocks.ts index 5c87fd56c..6229c78ad 100644 --- a/src/renderer/__mocks__/account-mocks.ts +++ b/src/renderer/__mocks__/account-mocks.ts @@ -1,14 +1,21 @@ import { Constants } from '../constants'; -import type { Account, AccountNotifications, GitifyError, Hostname, Token } from '../types'; +import type { + Account, + AccountNotifications, + ClientID, + GitifyError, + Hostname, + Token, +} from '../types'; import { getRecommendedScopeNames } from '../utils/auth/scopes'; import { mockGitifyUser } from './user-mocks'; -export const mockGitHubAppAccount: Account = { +export const mockGitifyOAuthAppAccount: Account = { forge: 'github', platform: 'GitHub Cloud', - method: 'GitHub App', + method: 'Gitify OAuth App', token: 'token-987654321' as Token, hostname: Constants.GITHUB_HOSTNAME, user: mockGitifyUser, @@ -37,12 +44,13 @@ export const mockGitHubCliAccount: Account = { scopes: ['gist', 'read:org', 'repo', 'workflow'], }; -export const mockOAuthAccount: Account = { +export const mockCustomOAuthAppAccount: Account = { forge: 'github', platform: 'GitHub Enterprise Server', - method: 'OAuth App', + method: 'Custom OAuth App', token: 'token-1234568790' as Token, hostname: 'github.gitify.io' as Hostname, + clientId: 'CUSTOM_CLIENT_ID_123' as ClientID, user: mockGitifyUser, scopes: getRecommendedScopeNames(), }; diff --git a/src/renderer/__mocks__/notifications-mocks.ts b/src/renderer/__mocks__/notifications-mocks.ts index 6f8d351a1..95560abc0 100644 --- a/src/renderer/__mocks__/notifications-mocks.ts +++ b/src/renderer/__mocks__/notifications-mocks.ts @@ -21,7 +21,7 @@ import { import { mockGiteaAccount, - mockGitHubAppAccount, + mockGitifyOAuthAppAccount, mockGitHubCloudAccount, mockGitHubEnterpriseServerAccount, } from './account-mocks'; @@ -332,7 +332,7 @@ export function mockPartialGitifyNotification( repository?: Partial, ): GitifyNotification { const mockNotification: Partial = { - account: mockGitHubAppAccount, + account: mockGitifyOAuthAppAccount, reason: { code: 'subscribed', title: 'Updated', diff --git a/src/renderer/components/settings/AppearanceSettings.test.tsx b/src/renderer/components/settings/AppearanceSettings.test.tsx index d776e334b..d7d5377dc 100644 --- a/src/renderer/components/settings/AppearanceSettings.test.tsx +++ b/src/renderer/components/settings/AppearanceSettings.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import { renderWithProviders } from '../../__helpers__/test-utils'; import { - mockGitHubAppAccount, + mockGitifyOAuthAppAccount, mockGitHubEnterpriseServerAccount, } from '../../__mocks__/account-mocks'; @@ -91,7 +91,7 @@ describe('renderer/components/settings/AppearanceSettings.tsx', () => { ] as const)('should toggle %s checkbox', async (testId, setting) => { await act(async () => { renderWithProviders(, { - accounts: [mockGitHubAppAccount], + accounts: [mockGitifyOAuthAppAccount], }); }); @@ -135,7 +135,7 @@ describe('renderer/components/settings/AppearanceSettings.tsx', () => { it('reactively hides the account header checkbox when a second account is added', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockGitHubAppAccount], + accounts: [mockGitifyOAuthAppAccount], }); }); @@ -143,7 +143,7 @@ describe('renderer/components/settings/AppearanceSettings.tsx', () => { await act(async () => { useAccountsStore.setState({ - accounts: [mockGitHubAppAccount, mockGitHubEnterpriseServerAccount], + accounts: [mockGitifyOAuthAppAccount, mockGitHubEnterpriseServerAccount], }); }); diff --git a/src/renderer/hooks/useLogins.test.tsx b/src/renderer/hooks/useLogins.test.tsx index 28f23fbfd..635034455 100644 --- a/src/renderer/hooks/useLogins.test.tsx +++ b/src/renderer/hooks/useLogins.test.tsx @@ -14,7 +14,7 @@ import { Constants } from '../constants'; import { useAccountsStore } from '../stores'; -import type { ClientID, ClientSecret, Token } from '../types'; +import type { ClientID, Token } from '../types'; import type { DeviceFlowSession } from '../utils/auth/types'; import { getAdapter } from '../utils/forges/registry'; @@ -113,7 +113,7 @@ describe('renderer/hooks/useLogins.ts', () => { expect(pollSpy).toHaveBeenCalledWith('session'); }); - it('loginWithDeviceFlowComplete creates the account', async () => { + it('loginWithDeviceFlowComplete records the built-in Gitify OAuth App account', async () => { const { result } = renderLoginsHook(); await act(async () => { @@ -124,24 +124,36 @@ describe('renderer/hooks/useLogins.ts', () => { ); }); - expect(createAccountSpy).toHaveBeenCalledWith('GitHub App', 'token', 'github.com', 'github'); + expect(createAccountSpy).toHaveBeenCalledWith( + 'Gitify OAuth App', + 'token', + 'github.com', + 'github', + undefined, + undefined, + ); }); - it('loginWithOAuthApp delegates to the forge adapter', async () => { - const adapter = getAdapter('github'); - const oauthSpy = vi.spyOn(adapter.oauthWebApp!, 'performWebOAuth'); - + it('loginWithDeviceFlowComplete records a custom app client ID', async () => { const { result } = renderLoginsHook(); await act(async () => { - void result.current.loginWithOAuthApp('github', { - clientId: 'id' as ClientID, - clientSecret: 'secret' as ClientSecret, - hostname: Constants.GITHUB_HOSTNAME, - }); + await result.current.loginWithDeviceFlowComplete( + 'github', + 'token' as Token, + Constants.GITHUB_HOSTNAME, + 'CUSTOM_CLIENT_ID_123' as ClientID, + ); }); - expect(oauthSpy).toHaveBeenCalled(); + expect(createAccountSpy).toHaveBeenCalledWith( + 'Custom OAuth App', + 'token', + 'github.com', + 'github', + undefined, + 'CUSTOM_CLIENT_ID_123', + ); }); it('loginWithDeviceFlowStart throws when the forge does not support device flow', async () => { @@ -172,18 +184,6 @@ describe('renderer/hooks/useLogins.ts', () => { ).rejects.toThrow(/does not support device flow/); }); - it('loginWithOAuthApp throws when the forge does not support OAuth app login', async () => { - const { result } = renderLoginsHook(); - - await expect( - result.current.loginWithOAuthApp('gitea', { - clientId: 'id' as ClientID, - clientSecret: 'secret' as ClientSecret, - hostname: Constants.GITHUB_HOSTNAME, - }), - ).rejects.toThrow(/OAuth app login is not supported for forge "gitea"/); - }); - it('logoutFromAccount calls removeAccountNotifications, removeAccount', async () => { useAccountsStore.setState({ accounts: [mockGitHubCloudAccount] }); diff --git a/src/renderer/hooks/useLogins.ts b/src/renderer/hooks/useLogins.ts index 24ac225b4..f6743004e 100644 --- a/src/renderer/hooks/useLogins.ts +++ b/src/renderer/hooks/useLogins.ts @@ -4,10 +4,10 @@ import { useQueryClient } from '@tanstack/react-query'; import { useAccountsStore } from '../stores'; -import type { Account, Forge, Hostname, Token } from '../types'; +import type { Account, ClientID, Forge, Hostname, Token } from '../types'; import type { + AuthMethod, DeviceFlowSession, - LoginOAuthWebOptions, LoginPersonalAccessTokenOptions, } from '../utils/auth/types'; @@ -21,11 +21,16 @@ interface LoginsState { forge: Forge, hostname?: Hostname, scopes?: string[], + clientId?: ClientID, ) => Promise; loginWithDeviceFlowPoll: (forge: Forge, session: DeviceFlowSession) => Promise; - loginWithDeviceFlowComplete: (forge: Forge, token: Token, hostname: Hostname) => Promise; + loginWithDeviceFlowComplete: ( + forge: Forge, + token: Token, + hostname: Hostname, + clientId?: ClientID, + ) => Promise; loginWithCli: (forge: Forge, hostname: Hostname) => Promise; - loginWithOAuthApp: (forge: Forge, data: LoginOAuthWebOptions) => Promise; loginWithPersonalAccessToken: (data: LoginPersonalAccessTokenOptions) => Promise; logoutFromAccount: (account: Account) => void; } @@ -63,12 +68,12 @@ export const useLogins = (): LoginsState => { * Initiate an OAuth device-flow session for the given forge. */ const loginWithDeviceFlowStart = useCallback( - async (forge: Forge, hostname?: Hostname, scopes?: string[]) => { + async (forge: Forge, hostname?: Hostname, scopes?: string[], clientId?: ClientID) => { const { deviceFlow } = getAdapter(forge); if (!deviceFlow) { throw new Error(`Device flow is not supported for forge "${forge}".`); } - return await deviceFlow.start(hostname, scopes); + return await deviceFlow.start(hostname, scopes, clientId); }, [], ); @@ -88,19 +93,21 @@ export const useLogins = (): LoginsState => { * Finalise an OAuth device-flow session by recording the account. */ const loginWithDeviceFlowComplete = useCallback( - async (forge: Forge, token: Token, hostname: Hostname) => { + async (forge: Forge, token: Token, hostname: Hostname, clientId?: ClientID) => { const { deviceFlow } = getAdapter(forge); if (!deviceFlow) { throw new Error(`Forge "${forge}" does not support device flow.`); } - const method = deviceFlow.authMethod; + // A supplied client ID means the user authorized their own app; without + // one the flow used Gitify's preconfigured app. + const method: AuthMethod = clientId ? 'Custom OAuth App' : deviceFlow.authMethod; const existingAccount = accounts.find((a) => a.hostname === hostname && a.method === method); if (existingAccount) { removeAccountNotifications(existingAccount); } - await createAccount(method, token, hostname, forge); + await createAccount(method, token, hostname, forge, undefined, clientId); }, [accounts, createAccount, removeAccountNotifications], ); @@ -135,31 +142,6 @@ export const useLogins = (): LoginsState => { [createAccountInStore, queryClient, removeAccountNotifications], ); - /** - * Login with a custom OAuth app on the given forge. - */ - const loginWithOAuthApp = useCallback( - async (forge: Forge, data: LoginOAuthWebOptions) => { - const { oauthWebApp } = getAdapter(forge); - if (!oauthWebApp) { - throw new Error(`OAuth app login is not supported for forge "${forge}".`); - } - - const { authOptions, authCode } = await oauthWebApp.performWebOAuth(data); - const token = await oauthWebApp.exchangeAuthCodeForToken(authCode, authOptions); - - const existingAccount = accounts.find( - (a) => a.hostname === authOptions.hostname && a.method === 'OAuth App', - ); - if (existingAccount) { - removeAccountNotifications(existingAccount); - } - - await createAccount('OAuth App', token, authOptions.hostname, forge); - }, - [accounts, createAccount, removeAccountNotifications], - ); - /** * Login with Personal Access Token (PAT). */ @@ -203,7 +185,6 @@ export const useLogins = (): LoginsState => { loginWithDeviceFlowPoll, loginWithDeviceFlowComplete, loginWithCli, - loginWithOAuthApp, loginWithPersonalAccessToken, logoutFromAccount, }; diff --git a/src/renderer/routes/AccountScopes.test.tsx b/src/renderer/routes/AccountScopes.test.tsx index 9a0677bed..9754f6dee 100644 --- a/src/renderer/routes/AccountScopes.test.tsx +++ b/src/renderer/routes/AccountScopes.test.tsx @@ -3,9 +3,9 @@ import userEvent from '@testing-library/user-event'; import { renderWithProviders } from '../__helpers__/test-utils'; import { - mockGitHubAppAccount, + mockGitifyOAuthAppAccount, mockGitHubCliAccount, - mockOAuthAccount, + mockCustomOAuthAppAccount, mockPersonalAccessTokenAccount, } from '../__mocks__/account-mocks'; @@ -19,7 +19,7 @@ const navigateMock = vi.fn(); // Mutable variable — individual tests reassign this before rendering to simulate // different account states without needing vi.doMock. let mockLocationAccount: Account = { - ...mockGitHubAppAccount, + ...mockGitifyOAuthAppAccount, scopes: ['read:user', 'notifications', 'repo'], }; @@ -35,7 +35,7 @@ vi.mock('react-router-dom', async (importActual) => { describe('renderer/routes/AccountScopes.tsx', () => { beforeEach(() => { mockLocationAccount = { - ...mockGitHubAppAccount, + ...mockGitifyOAuthAppAccount, scopes: ['read:user', 'notifications', 'repo'], }; }); @@ -97,7 +97,7 @@ describe('renderer/routes/AccountScopes.tsx', () => { it('should show all-granted status when account has public_repo instead of repo', async () => { mockLocationAccount = { - ...mockGitHubAppAccount, + ...mockGitifyOAuthAppAccount, scopes: ['read:user', 'notifications', 'public_repo'], }; @@ -112,7 +112,7 @@ describe('renderer/routes/AccountScopes.tsx', () => { it('should show missing indicator when neither repo nor public_repo is granted', async () => { mockLocationAccount = { - ...mockGitHubAppAccount, + ...mockGitifyOAuthAppAccount, scopes: ['read:user', 'notifications'], }; @@ -128,7 +128,7 @@ describe('renderer/routes/AccountScopes.tsx', () => { it('should show missing indicator when notifications scope is absent', async () => { mockLocationAccount = { - ...mockGitHubAppAccount, + ...mockGitifyOAuthAppAccount, scopes: ['read:user', 'repo'], }; @@ -142,7 +142,7 @@ describe('renderer/routes/AccountScopes.tsx', () => { it('should show extra scopes when token has additional permissions', async () => { mockLocationAccount = { - ...mockGitHubAppAccount, + ...mockGitifyOAuthAppAccount, scopes: ['read:user', 'notifications', 'repo', 'write:packages', 'read:org'], }; @@ -156,7 +156,7 @@ describe('renderer/routes/AccountScopes.tsx', () => { }); it('should show no-scopes message when scopes are not loaded', async () => { - mockLocationAccount = { ...mockGitHubAppAccount, scopes: undefined }; + mockLocationAccount = { ...mockGitifyOAuthAppAccount, scopes: undefined }; await act(async () => { renderWithProviders(); @@ -191,8 +191,8 @@ describe('renderer/routes/AccountScopes.tsx', () => { describe('all auth methods show permissions button', () => { it.each([ - ['GitHub App', mockGitHubAppAccount], - ['OAuth App', mockOAuthAccount], + ['Gitify OAuth App', mockGitifyOAuthAppAccount], + ['Custom OAuth App', mockCustomOAuthAppAccount], ['Personal Access Token', mockPersonalAccessTokenAccount], ])('%s account has a permissions button', async (_method, account) => { mockLocationAccount = { diff --git a/src/renderer/routes/Accounts.test.tsx b/src/renderer/routes/Accounts.test.tsx index 5ff682381..fdf784e2c 100644 --- a/src/renderer/routes/Accounts.test.tsx +++ b/src/renderer/routes/Accounts.test.tsx @@ -4,8 +4,8 @@ import userEvent from '@testing-library/user-event'; import { navigateMock, renderWithProviders } from '../__helpers__/test-utils'; import { mockGiteaAccount, - mockGitHubAppAccount, - mockOAuthAccount, + mockGitifyOAuthAppAccount, + mockCustomOAuthAppAccount, mockPersonalAccessTokenAccount, } from '../__mocks__/account-mocks'; @@ -30,7 +30,11 @@ describe('renderer/routes/Accounts.tsx', () => { it('should render itself & its children', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockPersonalAccessTokenAccount, mockOAuthAccount, mockGitHubAppAccount], + accounts: [ + mockPersonalAccessTokenAccount, + mockCustomOAuthAppAccount, + mockGitifyOAuthAppAccount, + ], }); }); @@ -241,8 +245,8 @@ describe('renderer/routes/Accounts.tsx', () => { ...mockPersonalAccessTokenAccount, scopes: ['read:user', 'notifications'], }, - mockOAuthAccount, - mockGitHubAppAccount, + mockCustomOAuthAppAccount, + mockGitifyOAuthAppAccount, ], }); }); @@ -266,7 +270,11 @@ describe('renderer/routes/Accounts.tsx', () => { it('should set account as primary account', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockPersonalAccessTokenAccount, mockOAuthAccount, mockGitHubAppAccount], + accounts: [ + mockPersonalAccessTokenAccount, + mockCustomOAuthAppAccount, + mockGitifyOAuthAppAccount, + ], }); }); @@ -276,7 +284,7 @@ describe('renderer/routes/Accounts.tsx', () => { await userEvent.click(screen.getAllByTestId('account-set-primary')[1]); - expect(useAccountsStore.getState().accounts[0]).toBe(mockOAuthAccount); + expect(useAccountsStore.getState().accounts[0]).toBe(mockCustomOAuthAppAccount); expect(navigateMock).toHaveBeenCalledWith('/accounts', { replace: true }); }); @@ -318,7 +326,11 @@ describe('renderer/routes/Accounts.tsx', () => { it('should show view-scopes button for all auth methods', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockPersonalAccessTokenAccount, mockOAuthAccount, mockGitHubAppAccount], + accounts: [ + mockPersonalAccessTokenAccount, + mockCustomOAuthAppAccount, + mockGitifyOAuthAppAccount, + ], }); }); @@ -344,7 +356,7 @@ describe('renderer/routes/Accounts.tsx', () => { it('should show github login methods after selecting GitHub forge', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockOAuthAccount], + accounts: [mockCustomOAuthAppAccount], }); }); @@ -367,7 +379,7 @@ describe('renderer/routes/Accounts.tsx', () => { it('should show login with personal access token after selecting GitHub forge', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockOAuthAccount], + accounts: [mockCustomOAuthAppAccount], }); }); @@ -384,7 +396,7 @@ describe('renderer/routes/Accounts.tsx', () => { }); }); - it('should show login with oauth app after selecting GitHub forge', async () => { + it('should show login with a custom OAuth app after selecting GitHub forge', async () => { await act(async () => { renderWithProviders(, { accounts: [mockPersonalAccessTokenAccount], @@ -394,12 +406,14 @@ describe('renderer/routes/Accounts.tsx', () => { await userEvent.click(screen.getByTestId('account-add-new')); await userEvent.click(screen.getByTestId('account-add-forge-github')); - expect(screen.getByTestId('account-add-oauth-app')).toHaveTextContent('OAuth App'); + expect(screen.getByTestId('account-add-custom-oauth-app')).toHaveTextContent( + 'Custom OAuth App', + ); - await userEvent.click(screen.getByTestId('account-add-oauth-app')); + await userEvent.click(screen.getByTestId('account-add-custom-oauth-app')); expect(navigateMock).toHaveBeenCalledTimes(1); - expect(navigateMock).toHaveBeenCalledWith('/login/github/oauth-app', { + expect(navigateMock).toHaveBeenCalledWith('/login/github/custom-oauth-app', { replace: true, }); }); @@ -407,7 +421,7 @@ describe('renderer/routes/Accounts.tsx', () => { it('should navigate directly to gitea login (single method forge)', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockOAuthAccount], + accounts: [mockCustomOAuthAppAccount], }); }); @@ -426,7 +440,7 @@ describe('renderer/routes/Accounts.tsx', () => { it('should navigate directly to bitbucket login (single method forge)', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockOAuthAccount], + accounts: [mockCustomOAuthAppAccount], }); }); @@ -472,10 +486,10 @@ describe('renderer/routes/Accounts.tsx', () => { it('should re-authenticate a github app account', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockGitHubAppAccount], + accounts: [mockGitifyOAuthAppAccount], notifications: [ { - account: mockGitHubAppAccount, + account: mockGitifyOAuthAppAccount, notifications: [], error: Errors.BAD_CREDENTIALS, }, @@ -488,17 +502,17 @@ describe('renderer/routes/Accounts.tsx', () => { expect(navigateMock).toHaveBeenCalledTimes(1); expect(navigateMock).toHaveBeenCalledWith('/login/github/device-flow', { replace: true, - state: { account: mockGitHubAppAccount }, + state: { account: mockGitifyOAuthAppAccount }, }); }); - it('should re-authenticate an oauth app account', async () => { + it('should re-authenticate a custom OAuth app account', async () => { await act(async () => { renderWithProviders(, { - accounts: [mockOAuthAccount], + accounts: [mockCustomOAuthAppAccount], notifications: [ { - account: mockOAuthAccount, + account: mockCustomOAuthAppAccount, notifications: [], error: Errors.BAD_CREDENTIALS, }, @@ -509,9 +523,9 @@ describe('renderer/routes/Accounts.tsx', () => { await userEvent.click(screen.getByTestId('account-reauthenticate')); expect(navigateMock).toHaveBeenCalledTimes(1); - expect(navigateMock).toHaveBeenCalledWith('/login/github/oauth-app', { + expect(navigateMock).toHaveBeenCalledWith('/login/github/custom-oauth-app', { replace: true, - state: { account: mockOAuthAccount }, + state: { account: mockCustomOAuthAppAccount }, }); }); @@ -540,10 +554,10 @@ describe('renderer/routes/Accounts.tsx', () => { it('should log and skip re-authenticate when no login method matches', async () => { const rendererLogErrorSpy = vi.spyOn(logger, 'rendererLogError').mockImplementation(vi.fn()); - // Gitea only registers PAT — a GitHub App method has no matching loginMethod. + // Gitea only registers PAT — a Custom OAuth App method has no matching loginMethod. const unsupportedAccount = { ...mockGiteaAccount, - method: 'GitHub App' as const, + method: 'Custom OAuth App' as const, }; await act(async () => { diff --git a/src/renderer/routes/Login.test.tsx b/src/renderer/routes/Login.test.tsx index f907c2747..55db58e0a 100644 --- a/src/renderer/routes/Login.test.tsx +++ b/src/renderer/routes/Login.test.tsx @@ -31,7 +31,7 @@ describe('renderer/routes/Login.tsx', () => { it.each([ ['login-github', '/login/github/device-flow'], ['login-pat', '/login/github/personal-access-token'], - ['login-oauth-app', '/login/github/oauth-app'], + ['login-custom-oauth-app', '/login/github/custom-oauth-app'], ])('navigates %s', async (testId, route) => { renderWithProviders(); diff --git a/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-dark-classic-chromium-linux.png b/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-dark-classic-chromium-linux.png index caea7edd6b70921f93c7f67f9fd6f8f4c01b4e68..d710632b4566f410f9c07d03cc3df1074a3286a0 100644 GIT binary patch literal 28527 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

n=Fm-(Cqj?bl^Y3=aaF4Ut`SXx3<1@VF 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

s@kNg*6)4(5Ti?CtG3 z2jr8TqhqY1XwE{_XAHf#h`S0kq9sj0LEdCgBx350^QYf8_-`Yt&ZEG+QahzYmz!m)amw{H(60{mHX zc6YJ$@g92B9ZLY(mzSj6d;@DF`mL@Wf5*GQM|P+qMLFgq^bs6eS|ZZ{?DTSEG&Aio zWxc0#XSqqiUIY~DklW6x!k`___N9`^pA`N^`|cHhU2krl#Ifm%Vc)(qGNF%!jMDnR zz+f&uog<)7IWF_$`tOm*;h=8(wri^Ru=@+y>u*8c-VbR@jn9-3-=xESDF#EB5HlaC zy*Y>UOo>1+-2#paj9qiD6UwuGaX-mvI%~xBCniDf+nrb6G0{r}Q+kYJtoq*Xn=D~bJJ!V{dyxZ9! zS^7wPMNJAR&@6)90_ii0Ge7=b$6WL!#_o#SvF%AktQC)Tm5jEw<%y3An3meiW%(}z zjR}#5Km8@{kg7On9)=|#Ybre_rn&ccwzjrHYyef&@HooF&i-vNA#%0Ah_JVAxYbtzbKb~*1>7_kvLy#^Gz`KL<6r^bn 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 Oz{tFle_JYU;PWqHULq|3 literal 35196 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 YchSiyNgGVyzr2zZl@loy()0a4076q=O8@`> literal 0 HcmV?d00001 diff --git a/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-custom-oauth-app-light-classic-chromium-linux.png b/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-custom-oauth-app-light-classic-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..e30e7e1f28758dbd5452117ee77ead218d338627 GIT binary patch literal 33539 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
?kR+6yomIas`)+pkqs<&sE@AYH%> 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 aVYn~~IIz$7x4~CnzKY6xE)mxD{yzYCH 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 diff --git a/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-oauth-app-light-classic-chromium-linux.png b/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-oauth-app-light-classic-chromium-linux.png deleted file mode 100644 index cc534051b00d1c15c999cdb6d68f48eafa27abd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40626 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 F0RXFcQGWmc diff --git a/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-light-classic-chromium-linux.png b/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-light-classic-chromium-linux.png index cb7b1528cf2b025cdf275505dc4414d659f3260d..fbc85fc5909bf9b50ed3fb907bdc0cf3cc421f8e 100644 GIT binary patch literal 28372 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 literal 35628 zcmc$`1yq&m+BT|71ySh|De3NRC8ec9LRvz)Qv{?zx2`v=aEH9a#If|c zF&A}s>7ez5@C3?uNfg;+>}Oh?R`z|j%kAT;t!=lS>0!ZOo8Fa6M{hXkWAy7LtnMU# zn_jMEckMrx6K#5<91*}Pm&zQOCAg^JAM=e1Tqe`{$3I&2R%sXM8?)Oi(aqG1PnVb+ z%9>3?%DP_}?(OZ3*Ba1-fAl5|A|)k4AVCn1q)U+Tay!bfYI07rI}=wd(7Ly*u`4;3 zXmdUKrGw@1@gix4Oo}wPnN){VCzY~MSWfu&rM$V%8|9;S*l!P~wYV5cTH1xieeU^0 z8h-Ia8xP6J3Jas=^=+2Dss0y@|Ko$$`Vt_jcSzm4~P!xoV*Z zL{I%y!ET$u4~ek^pP?0@{PDNZ9v`3H1(QF>k{2%f7{u{rNRp&ee_1# z{gN(}j}7B5&HSmM$Kp5A{-w0v1TQ?CjRW>A2KG&0I`?IjclUr1s8}u%n8u$ENIt@H z-lUM~e|yN)D3cFo8_p!s5CDU8`C^gj-u8*&1BwVL(Oume`TR}7FNnRLN&QVAOO5+H zkfNcx6SqB7yYGZvL^L)E{+bt>^?!Td+0N7_j;!7Y-qXfBwAgN)9gdId?tj_(??Uhs zzgY*-U3FHAZlPnuZ;+8^+Kovpt@$mtkgdsxvs{Xw@$4@C48T#I;Dbpo~eHe;rq}U$CW!lUiy1gKe0Q2bR z5QY1t-bWWf4R7zv?cg#>?$wj!54JHs4r_iWG)?OL3_}DMIrt?l^zl!z#VW&Zw^_B7 zrXPNW506)WvJAVq)U}ej&t;59=3$?hC zC;y=kRuk3GpQE-qDQ7OTi8MIj8>u7{<)63hM&(si{YZa}1gs5+CtS7K7N?+YmmS(o z0I_K875`t3M=1e}DMK-fbX3C)p^b17YgwZsTp#;OX6F94ItS=x5a0Ip_fH)U9`j!< zC=er{pqY&q`v60GN1A9;)5j5ERBYJe9CYLVz&hXk%ism?59KRGyfR>Jnd^lpnv#GkeSy#u2cK_#at;SLpWeYm=6 z07j4kBT!K|d;?B29vRbS=VtM`=>uXjbtHrA<=Npg!TSg!dD?w@i!_$Km<_cTJyHow z*ng8+thK>l)p4);m&_OtRISOz#pB}GvNUtBfc?B64j|U@n18Fhw1CDlU#hU$pGQM< z_rb%5VZzU!-+onY_WAgbqey?18APb{^<4#E0RJ-68&e%SbgPz6b5;Tw|chz zpYIzjE?XGxhIWnDyYUc{qg;nF{;_+ln62pPwzeH?lYc@wE)LcY42CiM1w(>NZXu)Y zWclWoFQkmn^pG75Q{x=*9xAB7KK|*%7yM+Tjq7-nY)o9BKuzeE(KfrEvs0A2 zo!b+*A6Pwj@Bqk3{8!YAXEhhDprLO9L6+SN*4!sh(DZv?8Y)on&5(XlNK>D{m-3K) zy(fW0Kz}$pg$Xi+e`lB%jkM~uk%0``O^HqqEqgER#O(*xh6Q#9Wd#(ftjQpA&rG&P zW2ir1ULU=F51DPNY@+a`vkS@d`#(y~l@tqBFWJ}mK?3-;b_f<%9X1noE)hcFRm{N`v*anzM3=N9-f94Q1Wcj#TT;>??Js<; zX+N@u$>q8`{Lhs2uk^Llquu`20TD#^WwP;mRXNK0J87YV4cZo9_u`Q>D$z968iF8L z%3;W;uG=r5Q z0LUj!9`V-}piznA!u3^1BgFqE;@?pKs>ocmyF(!{4?LJle1{^~`Pi+O_n27A=@60K zd;-Mrn~gPxN=93^@geWbkc0xG!~s)D$TA51162uJ)_%~G%QJ!ddq9D{L6{5V+mFp3 z5OJ%{CKASr?Pz+dl42GZR4d&1ytMH;f5d2iHl7!Kd|M79ti}Y>bR@ThtKvM8CMM)B zBm*G}cC)eOe9qd#=Z~B(ocC#YHpq6M1^q2DKzB%i zA|k)GS^$^B95~=4fUOdx9}tfWMeLD&*Sg_CO-kXlyY#pczRVjjU-XGE5XwXXV~XCM zvtLPHB>4GzpqovV2fJTxLooVxZ5ln<_z`v~f%j0x`QBQcvF71TS%MQpgwq zPI^ZQAUN=j-ESm)yZiBW8#3q=(t0ah7DRuq88Wn{xS{mZTQwaGFlTBMRfK4c(2>~R z5pfJ6?y5}_U+%TRof;vTUK8`mRjprG`p*c?S!VrN998DxZsvSFZw^I3hA_Rx#bwE(f3dTl<3dn}M0mB(lg7k))yhIUpGt0zGfR?+Uq3^c0A& z#A==#4t9oe$HK#VBdY2GhpQ^5>ew@LWyI!|=}7+HQYui>+?qM|eB!wt(4LF8y%<4f zjzw)>@gfb=@0tdmPcFJFfM$hdc&{kAlU(u6E8cVxp6<+B)gBkf#vN=vA|(QD1b%q4 zieDcgnQ?9>Dr9NWpfAG+L76*A;*GL0v8Z8QrHAs@1i!(1MnbneF6e1zVl+@G=f-TR zOc5vbd~O<~u+|N(X%?qWsecRR-=DIT@){A{s^=3YxuA^%2_cz$-)$>jj9}7+>h6C$ z{L{ON)rxKJi2^A7TV4EDpa9pZmV0r(zWj^_LSMu;t_rcLv+Rdi%4}Z$Vh%2<1=G;j7~;;`@;_T!jZ3M$SaS^hG# z-{avw*9i!VDAcCpREelguog{dEjgD=zJnE`i#I?0H@g3~ZvOd6YM468$?artC=1Xn zTYcidD$?vYKjW*#u|2k&Y+6`c{Lj_jT=@_Cx=-{2*a)1!{!=zn#U==4SoUu20xUyy zebH7o)S2xW_E+RUefS%@@NbEOPqy4ueA}UTf;~@$LFi!vRkFv!vSO2+#u8-9HL6X( zO8ggb{-94Tvq08jR`+<{1ZAixgr-X>n9hmDr&)^mRRbGAMtcb`Pq@b7m}{+(#x{A%zpzjA|j0^jLz zZ`E8(GuLs&@YPs(sX#fMwrp%;Tbh7Tx6%ARy&Ce+6~{Ry4d?#2(ynVakMVc^EaQNA5IqJxQQ4|ui08`(4|)H zdT-UB^JSeg+uF!fLI_3jv-6|2aP?}|YXr$?`t+$H3N%Ss+2xXcLirLyMEl5y2+4Jl zkk&t^nOy3*PPXZ7hy{2G{Z)lIpN|hJ5F?^^;-r_bT(gar_RKCtieXnY9Y$12N?)Jp z2&2PKSN@9?^e3R~-ucY%GELMjz@$*t?M%Y~k(`XIBZU9VkrnJD)v)J@>;B>L1VYenk~1@Qt$lFn(dhjn?7>o45=q>`86L@4SV7-4kvIeib3hu{nKT; zg^jOTfrciqv{doQhC&Mes3yqv;(OD!@|lBiEDi+6Ki%M$Q(V}Km<Pw|eg&BhPudZ0j09+^tcHhm2L#`A>L9rrI#ss#yeRMa0lLPt$1SLy z8S%xJ7$gs-T1yKR8>};8kWyEFvTr2YR?0bp0!jj5S`G(HJ6zV5i~YDv&ic!ui|A)h zM{1o|ic3_A-7lT%&zyNvJa#cRL%82-hQ-A6eT>mET*_7JPPyiT3Rm%nR#uCV$Uu7D zl!>xpKSXz(`^T{3ry?K|;ogD!+3HSrv{)x+QEb1-tzK>-WVVn{FtGRSPUYcI&0}`g zyCQrXC-;(ZFa9v>?ap#N9Uisa9)B1S9o>2{J~-ZAYRm#DW69(C&VIwSr^#^kz!y1^ z{Pp1oP~z{K*2f*t6$Cj3JMAx*FjK_rEp`+ ztry2UuCZY5T|FS}1>-}0tc(WXw_p%)YA!<~oQ7C>j6jyF|JH#QCfJ!8Kb|g!?}}wQ=tGHHnj= zZ3Gq66Z8e&F((6N9B}4*akrj8z%xeMDGK-OaA_crVWAc9)=n@o%FZ)za1;|+=!xy zV>4w>6L1baIIz`i`VcxZGP$iQwm#DHdg1`5c5iLHb_d2%YUXsScQc5zck_01f$H;I zvvJ!Hu4?>-OpU7IjcjZ z@}(ge3Y)EQBb|W(`BOeXePVf~5Wc5U%EqX3){+KnOzg!b#s@^g?<0Ays(?ke=c+{< zwc&fkvAe+`^RoJ>HvFu6Gm?uCK`uM%L&PBW^5r)H_=a}>&B?*y#oLKPyTV6reb7+k%xgngJ*BHGPD@qaF)%O~ z=gK&~%BMeYbJ3Qhjgvx4V6wqd$dq1gCqc@zN)vUxT2!G`Ekr3H=1Cx8K+F_7reUh8 z%BkE8sbR`Wm$cbr<9jnycpF3&R}i<7FWOjgUsWU%)H$pVF{IhvNoaij_zlw7HzlotOjp>DE09pInaqc=kcu-#AD#8vdS+&fB z4RFL(TcJ?$-r0{&@mI=IkJ7gJ=@Y}ao6vC)KWUEh%^*gjd5gIDnnXv2D~p5y38(b{ zheZwC3XD#$k6`MAZhf@CsC&$+nVxeSPhMW0axFZNVJ0sujqxEiz3x)(Hs{Hw=nD=g zj9wfJ$~Mbv+A@o14j)>FaPQr>x7`JC5j=NHkFphf#~MWfDUr78uWuL0WF`uinG92A z+hj&mE!V@V0ssI&z#^0|($1qcz5*}J-*P7_8c3JyzZ%n1t+YfX=W!u}a;~2n_Y#YF z!#+WXxdX=eb_GKewNk2f%DSbw3K`hy%MwFrU4hF3bg~w@JLU@qC4Ei2AmI1%9n-o? z+8;>-OqdpMZ@k&ATYIS}V@`ifH$G0|pPrE+Pe$UEO0AMFyxyd~YfA3U5*MS5^Zj`G z`dh$8l-X2u6#m=E^5D6h`A`A09EBQo9trY@p)Ab=yY&%05Yt);K=?*o?21bJTJ5qe z0&cKthGY=W_O=n`v=33>LcWMbD}}SM(eMP%+K?zL=MdTyYLu~hH*=xjw6;};U6kGx z4b|ZyNh7C<>V)=`MGimRQd$J)XB)B%y6&uu&EAC&5Xhm;=(2oGY%1C<1!^Vs_##T# zs$uv_UtfBrj^t^!d304DuKO$HYxpM}POMv4&-YZI(P-!60eVBm#Dp4PD!tPHvw*IV zx0CH%T@=b$@*?iiEdiMRd72d=+6r0nWcHE3rwRb`rU}VGJ~?^w&r79s!s@hdh=75ZDZiP<#$XFymML7Md0`-*NQorFT7Y4{9Xla{iHA-Va)|Qg9S?*2y z3WvD1KP_Ld^|Kl9t)1~@rdi=(&&>>EkSyx>0>+|LY-fG%JsdAKcv!?Dvkhw8v2Zd; zDs#l6abFlrDb^ZfNt9jS}P*Du5R$?0CZ>xRd?V>Rs=}*sgX0k-k(_ zZHFgxYqa~dj~N)jC*U--{6EvzmaKTo|Z-i6T7Zx_8@N9EohMYYmSpqpd0 zVs)qln*JfDClUR^XrMUP?a&Wrk>QCNnF|n-SN)^(Cr*+4aOax zLgG4kYGPo3ihJ1Wg2A?ybc}N_7V*e=L;NSfA-%D&F-Q|H6#;Wz1b~L_+?S4K&`6=8 z_I?KS5jJuac#@>d4l?!BYJknw?Qfj}MPowEj|oDTM;^l}+M&x?9=wvFrY8;Dp5+rnYJX|B>HR&$EO{Sl931Fv?1xTMmSPqfSpI_dQQNLdFK-S}3AO);&Mke4#61&rVZZGA_5+8MR`+hzal`8KC~{ zMfVM*ziL#W0q1E8a$e>Wt=lKyn6|wG$+2JscxNs1oSm}1(f%uwp|8CPvb>$|JS)N? zBDyLW>h)pR+VYBEz)FK}!4PauRVSPX*hMGTwYIii^%#8C8AH>Cz!IY8z%_r+dr|nB zhye*-6f`bF`L8f|*2dFtf$5_{HbP&sK>VThfO+W>nSTL1n^}!vexqWK<`)$DUW0fB z08!sAK6n3ewJB6ImGYNj&QnM=FDxt!TxWPjGN^>08{)NXBM|Mh3mp%FOHy&%!63Hk z%;Y(|RFsf-5aUqg{jgUcX3larDu%^sKp(QN3Wbcl&B&~ac+e8+M170g_AA=GV2=9& zk}g06{k5kflpFMBibh3R~I^gX}{LOu^L$1pLe6=$k4Qx>4A zb|iQEt6Um)@Dn!u2CVZv6_9=gz_M2W48BNC3*`=%6*$9YKyvesE2-Dpsyzk4X8_b& zN2dMnCF$$m0TbEyx{euBWHm@G>cJfiV&9KkH3jvJ$;2sOGx88@=1z3v1^SM0+FxP; zwIpyu&V?B-NUL}*Qal0Gry00kmGh{t&t^!X>0gP0vp=8JN-{L2HYKQ)b6;GqpAQsV z-zqm77ZepWh-Wu`zv|p#09r);{V5>^J@IU;rX!J9=j=vC8ww2s7WM3jqgoyj{?k&1 zTNkIfT4nJW(g}qY`-X{5t;Vcx2V&>s%Oo(haIetPe!7JgG$elm-Joz#^++&_gKC}C z9Oefl3-&zZrm7^&C#+Ml7s#&|9mv7)ro{9AUzim@*7jab@@&`lfoAg08v;I$4&*@QH3qjbR8rQRj_W+aKn_K3xJrCw-Vo8(a1x$VqbU-)rLt#= zMXUPa94Ql!Y@-SGV)z~Cvivok6k}Mx&gL`xcu*5Su{M{?^XyMoNb;T$MF|_ zU(hByvp8G8?9_?T8AaCx@blc!D+}_l7bue;vo?vQZC3$LQqlO)B#gg@Dc17Xq?}EC0yd1F)Fgph?v-6uFp!@*|H)I^3UbCOIJ{;2oEj-(of$-Zk34`1Y zjgjJ#BE2y!w~hlClyr%x zx#$E7Qv0{t?m<_!v>7H*)DW-tcH$B6`{w{;=hu|O7acIK#!5RmX^a*KfMTJsYAzgz z)f1q)A0FT6fLIl>6{)uB&XHs|uQ=ULbZ!HzOIT8$&_fc+|GlUUPkLSyk%@{5p&P*G z7o=#eJ3n9Cgr)>IX7@&62wJ_e2u&Sj<2#`q(`{Qj=zLC6%k5ISSK!#}DkxI; z{n!eV-s)5ig)g2fipyphb^{q%*wdr41PdFx3K}kO#>Q!8_IWM9FR_v}8Xc(MJO&^n zch=S|_Qud4!T zD2yi-lw;2_BY2n%H#p5Jjh})a*PfjvJi@ai0gQ^SgClS&h^v9ZQ1_WR`{=YI3l~?_ zBacNTs89kGUo49eeVPD%ps|Z1ZnDP~At@S_#zZ;|#4)k-T}7CyXvqK`4lt#jafef8 z%*@m_qxcmAuT$LKz$#IDFO@(6j_U}*LXqp~gKluPYcZEaCQa~k56|_bq;H{o{4Y8L#EGroO&nYwgb5%Yde+7;Vu4Q|BKUhdM*~Q7ye+)zY~63hD#8 zyW=5PHufPHw+hNwAZdIR28!D+PcsdNY$I-eRSf^w(9kf9N3B=@Jaz0Ow3 zY0YWUo*SNJ*qym_0IZOeZ@!bdNrR~2vdwqU0lZvYD7J!OGQmb7yJS738V2|1+Dr830MLNS=dYg=fMx5 zF(v7ER&wP`d%A3W{X)Y{b(4|Y=gNlUMN2*LyThaN9esTifQ16g7#4%td#IA@+~PZB z3&gr^4>>X|Vh~{i=&7&OE#&lcnQdsw#lqefI)wN21L84JbW(&@mR8-9;cO*?wbE7B z(?w9+@AtjXZS9V0hKkP+Kp$od6T#1GSV_#mrk{a2x+o~7M4e39V20D!M(nfyJvdOBJFEP_ITdr!cInZ07UnOcB^ zq$C-+|5Q4lZ84O<1zpq8+!nyqb+p82^@5tIkcK&1A4Tw6)m$VLi{jZ#P+m1$VFyfr zoRPr3s8d|bOl1z0$$@SO`%@cSuFTGlhO?EQqb-#x@Sx_zsdSt`EwJiyhC#J@!DD-+L8KMa8KCL*qQ=cv+yO2~j4beQkRA(OHc5^y@E7cr&Kt!~p4msC&3RLdI@4VH+?38VjHjZ5qmX6$1#Au<&rf zvTP+LKy*-<0Ltb>TOm{CZFh#W6JV13<`kiVhQ`L43Ruwg2@7b4NXt$4Bn#03BBlG{ zbXpJMir36Fv!bGW)Qa_~dM`7{EVnE^&HGclgs7_>)PiEbIZc+oHEL|OaCH1JAB*w_ z)F7!50`V*yxDWs=1@%X888(>;l-ZzjQOZ|~xU|nuKL?(IX!}bZvQXx-n`G~9!A_FR zl}q~&OC}k!H(uGt)D=_kx;dv{zhNl|qwf01e zba$5`&1qYk5bfNciGlMt-joHjfLJL{NGf2WE8osYZ!~B>wD*00 zNewanPA&^PQ1E!L*mVO<`Y(@vij3yu8~(i5t~%JG8Si&mPVPy^)_$=8v+32p@b-_T z*Q`OWnIG|l*)LDUzCgWxDD%bxPm{hb7TXs|Z;m5^tJ)3z3G0~ec**kX{55B;JS47I zfi$T&W{5I@m|wss7~3>6#TJ7zp`g$KnXL(&bv)s_=i}4d%ekq@onnOq&Q)UA0mk(! zP}(Y>jmSNC?hVdH4ubD3dzdtiC!Q`4>HcEQ6CR$)bi@n}X(iOAMgeX4iag|v3ulVk z8K}eD;yNN4431zqA1VpHmp`o;WW^amWI{<)ge6`P`y*k{Q ztUYRd<+{75B9+1)0nQ@ZfM{j~if9N{$qfOJSZLqF4Kghv7QMQZa~!kAbO8rsDHYRp z$l+H4M>E{@oz+$sJLe(j>$-K{MVBd8&C^9NFfkvB&|=&X#(0S_+uznIc=vg=D2Kd+ zgSprD*2g&|KYL|h4WpNBr*6kj8!5*ZY&0>jF%`6GkGI}b+pjj)o<1BeGh&FLPwy`h z;yF9oYI%2lZpHG`-G($Ewa{uGt2ae9)x;Kq(2eu9^q?gbHT{x_goK3U>O?yF+sV?U zIxE7DNfAQp%5;wUKfGX*X*~3yycZ}qI5@el8vKVOWBfuwbh}q7Rz}KLsIV2{_EtTr zK8C;VF&9EH=g4wSdK_#`yLCczcXk?TOSm#xp;e~`F7fPD${k?-P#)GZA z0taf@qGCk%-&^KnftSfgE?a6J0M`kPodCuL@0iK|U%v-fN^&JVsk-Nbff@5spYFT4 z!)pgl#wU+3uwJ3weU8$J>`>y5mVl@v_fqK|M+7QI395yxgT8nwu^g(oe{P~{vCTtD zO8VBp9z+KR^q&q$*}MS3N6Ycs@VBy4j;|HYFGU;SRS2GKcLw5s({RiTAXVv;II9ut4r) z!JPeofrS}iONE~H{h9uYr`g$-bnzKP??}bL-H{Fi=7zkmZbujAkH#HjbTq!5M7JyB zq$9+qLz=!LeYEOnuzXU!qjusm$zaDSrMfNf3PBo{{aMpfuk1wkrY8Z9Oc;{ zE30%?1gRHPK3DacE4Omzej^;SyyiM$mYWGSP3YfqCver?hxaa~c+x zB&n{9^!$oH5}R2tPUA&aqhZDT_PU61e8#LTcNm!^2d)(hPM87C>{)wpP{O!h&A1<} z=isXFASdZL#9aTBup?Gd)q161_uzvqvTz#YfozmM%Dom}$?yuiB;>Ke%pCOh{?MT>d}0(EBudH(<^cMK)N}X5*@~&DF^QB!Lrz(S zfM09tYxeuV3}dj}ZgP@Ffi8XKIa_Wp0;GG_4i@tw2s^Yh=o?)sFiN`@Ps@!9wZ zFpx+F|K$j(ax5D@Shu;N|06Ljj-8u(Uq#RvT1;6SsW0zOe7YQdN6`vEO4bklBEW@oLaNAlJ zz5dBpsbtvmDu|3HCMLxr+#`Z2MK*oRWYIZRn!NthjJTpP*D0__e|c|jU)H)xZ68ao zqjzy}Ib}hanv!xMs^aJTWq*MJ7jck>S3&)C+_7lghk{TJmGC%YowYueI9{Dc6%)UW zkW+U&>+xo?8fS{fVa9&fk|iQM+9$*KMR>D-w8%*y?7bjx@L$pf+QAT+6}{wkLDHK} z`8KR?WVFAr-xPOthz)bFaOkAog>jKfUj?C4$Xc(;KVi#ONdx`RM^3Jchik(k%UfH$ ziE1or2K!EYI@u*k|y>_z1`?r$8JbN}qW-6C9HhVZ28h0>TwCo0Z{p z@W>Hy#zeasXmU!#R5|~z)^ky0O31QIufOIYkiole%Mp>F?HwA!bIpo5%McJCxnpaS z#wtDd5;G1rD$><+m(bOFE005KJ~>00(`pU_ltj<4v9ZOHxXZXKXHW>;n0>-5f-{u5 zmQK#jtm)v9@t0=53qj?eP>NGPyWf3!t=jev(g{wEJ1Eh#@nVN2N^(k3%5(|ydrhH( zkI%Xl6oW%jQ(t1-`xR=#E47e(Bfhp=w!{r7M#apZ*#F=OdjNPM+t=Z2aPR;B}^W> z))VC>A&@q7K7aqE4IelK>CEjbhMc$@-Sx|DY>`%2e8+vjs(FXALt7#{&M+LoS)4 zOZ7a6b0BtPGjptErex|>O!imR)C|^+^RZgkBh%-pvx`+YOuO3x=-8dil7g-67-H&V z0fT1^GX9o}GsyV(QRO4&H&4;|FJb`~WLs5L1sM466G}z3=RX~fHm2GLJ+?Ar3zA(A zTQVa>oSnIQ)XR*zTG@n^vfi67DQ9gPfJs5B}^h)jdglC3ghP{Z*m&iMP$d!lHbG3>^W%7_v5@#a3zI$JhBPZ!A$p zCFS&W*M`5VYcx6tTnF65m0z7=v=g=>@F@KI678FB!_hbO=E>yvWI<=xP7oWo|F-+ zSE(UmPB1TU6-1!P{Ugm(j5Zq2uvhJcMk7v;C<)@)u;Gr-ogZ~O6K`x8g7KO@!JqvA zhr+i?r_PZ-2TF2E+RM<_^Z$$lWxQnLxXp_Fwm|#0tGY_8K(Yj2l7s1buL#@<1?UlR zhtdp6$Z6GzJ^+Qfy1B)&SujO!Xe4`>Ff!D#KbevwX=7aRii&Ud`wO3Gx7Ov~MlR6sW6JNVPDMMJ9M zpkZSnISg~rV3Yn@HeF77Avl5dC_GME?_y4T4=mq7@dhov%EW>KWLZ9Tzb>3$xYl~U z_sIOGi3I{lehK5v^q$^x)9g%O*5Dh}2710~d*S1jp%lNMN6VKES`<7yF;0Pc zaV3^GLIn8jV-;dM-vNd`%tQyMta7lIO!FyC*ZZzSA4!CV2%k$IQe{=@8>+vkwhU|E zd6~atd!dFWLviVRIAdL3&(C`}_LSa;^~vM&qx<|P3pVvvw#4R!=pGvrZNs#$s(?ND zs`v^>`}gz$ImB@p5fwagc@p#1V?*c1yPvf?8|cmX>TN@WMmwu*+j`7Ts+2H9T9*oK zZj8c#^Cd>y0IRf+oWA)`dMT^z_wUbz#YA=;vXz3#IXV3#V+J^F*uzZ4rFebw&6Buc z56}gYyPHEPY`99srPKf@VcsiKL3oHrM#~y`etxXe)Y?FUaTrMlFj35bdcxlzcAijI#ZqA`^iHU;}(u)F{iEPSK&;kmJ4fP8`_ zL6|700@)gavI?~f!UayrF}G96YaDT;u?&GJSYtdBv>05Bn_PSm2SmG{O*vRS7rP`H*H7~Z%=j^E>+KTAG~HX2wp`wTnUaLwHJTb0yA8E{yO~@hRF9> z%Nc9>)j#Y^l*M8at-}T|M2IL0(F}(3m2Bdt2JdTHTR(6?CNS)bncltnI%;XdVng@& zxo0GnBGtRx4ZQqCd1vxuf-OfU=b3?QCv@9;_k32^&40FT)xn=`f3bQI?oCg}2MU|- zg{Wy&8tTq)i#?t~VwG9|LZoXKY-t2H&E5*WE;3tG*Hy`DOMjbV2)T{9=zpv?-3JbS zR+l|)=je!dFuW)4OZEd%FHfH5A}0@XdOl3eK2ySw041V$cqOWi&gVpKeBWUcgW0)s zh%~2(A3Y3->ST zwwR*z%t3yIC`b65-3%qm3R=S6K9)cu^vit|3Yms>wjJ2?^6IKDP)11@8Q(dVnWpBb z)R5y(mM!HK5kkQB>}aF)Fr4%%xz$dbH$@n5m8#{|_@Ri^gh_Cq40pX;70xH!b!A@k zPbpyNpvuw!$(b;p3=9^OOS`xCaA)t}*=Y45pJD-4u=(a09gJ3b@MN1qK%TDp0f{z_ zsIcn&b0oZ_nDPCpCu-4^!yESSWbC*O?*n$Q;UN1-rGAjkg@>fCwj^r1@*_kcbKY^! zzwNPr4lz73!CVJXs6w5(k}ZX7lHnNxi&~{475(N!>8v_&W7C^~FR0pXEKx_B6R(+p zX7^G7a$V_75$Ma)XHMuJe`~KH&yX$`KWsvFD)<0(R%eAiU5l8PHs}?Y){+K~-#)yc z{yYvuQ6Z^1ZrA<6N4-h18Kuy7HMWqfz5*MpqSw3D$?kJHww||dgJ|$+vRn__0QK>V ztaYb|L``I}%)1l;fW<)TgZWcmo%e^kX@LR}FPzY@o^)4zd05%4UHtx3QrVIWWGL99 zhz`Gs7*I5O6~B<~`&0_-Kb2Z6mF0;d9uho#wAn-Y@1D08urb0T5`04|u&V`*@xDz> zNtJ!2UirX#_B1(}ASjM8PL#N3Bpyq;V7;~d^+XX`)!M|&6vxM!ubv!`ZftdTM!a1R&I zLy5YW0c^e4nc^@zb;E57N%^)|!L=V-@fsCGm!y;w2B>-{e#~M2C{w1bKWF+5t!8;* zVj`aX)h@-Kd1bneuQD7QF9k=xo{Jii8!T=viU4PFIocA6vEC)7QO?U?jp%4@OOYa4 zoD(?$pemQk1|kV7z*3%tlbS21!P&(f^?3MYslbDVO6cnej%%IYoZ*skx z+M02-evsmNM7J6jS6Nk)#*+~1y)_dyuOTI!)@+#h^=s_jQ&!U0;s=NbOQPxNMuo12 z&h%OmnO03_8oiTUfwk`i1M-v~JP7;&@@KJai~8Qf2jfR==5up>1Eq3zY;`^pCCYFH z=6`8!{m?UMmGwl^=f}s_OY|C|08)BvaeV`r_ahkswull!F2=WSSA3^VOB!Gd@CRrC z06!RBm47@4k^;75v&3M~vB$RJTFcvSU}O{lkf;-cQGdFvD}hvX%5(ebs`h*&$95a$ zS-f*#x%~ayr9^L3E5r2)-#0YrDMQ0MO&8?7O<9(4kCpquPlgt)`L&W)ic3m5dOH?P zV6dtFBxxx@hn;pS`iu-Y-4X>w#h|V*J&N&?Z4{@|d)=BCfzOq|`3ty;@TS@3Pn0l( z0FT!@oSj7~TCScR>P5q#$N=P;2E^qI`giCrh&nnsf&W&6tp3c9daBxfDGeDqoGGnw zad{cXV{w~1t^Zr-w1;F_c7LRZr6r0cx5Gkvf12xY6RZ2#DYi^o3;JV4e>scbg{v#K zeziR14EJmFP-J&+iQBgyBf^nOp9V!_%JgSC$bvr{76OMuq4PoMNg;uHmmj2SSzRAP zXAO7eOSM(Y&A4(#^E1UN=$k>gxI^OQ7Z|$S9+q~nKAG^jui?eUUKHSQPYAmk-P( zi&j>}b#xXp>h%ip^1)Vrlw+Ek8!8t}H-<0fh|5&9U%G9jiaO;ek$_Z0fr)`p>@xklGu7sN#M|e?ODx<9Gox+KCV&>jHnQzD zU}e||J-unjhne=lCM!sUJkPC)qOgux8%IZdNyKD#Cf}zw59J6A_+Y&MgGNqKqdTmu|~Ah`!pI)a95^cW@-h?97daE}m_6Wmn-~Wdb##>gRM+sX6#@iQf>BmJG)1z>b4jFFf6SUMU1kgvn?XsswN;%pG#|CR|bv7hnygT{Q z*H5!7WK3!OUvFb2+fVtbZNFu4#Z^#7gX@&-46jdYgkEq)wAYFhfsKasOkRD`t5G(a z+NIdXYSE=D+C4x=Mt_3WoTq3;_gv1P7B+Q~DL%a3{3cS*sttKpwyT%sDInW_JoB&x zoNLXLjQ_C2Ycdb>*2Jp)(>DVcfTfFLF@=Lj0*5tQJU-{6mg(uxz6@8vHl$6ID{8*M z_Z|9zau^_oI=?;F<8V15Xx=JRz{*Y?xJYg-eLMVUc7mC?#PPf?lrj*xwO(BH1*70; zncXtIdqM-o6r^mob*%d;G2zi7WZDd_wXoC7tot6bo2$L2fjE@_h0%6B6(2LRe*_nW zd)VHD++X7$3l6TyG{v4(3VZvqoNaPA9)vvyFpl^_N!%YXiBueLf5C4?v$;0a*~BXO zsPBRPYd7u!_JR$a4$=4fi?7Z{=)PiU-qUn^bHA|+69ZF$jo9x7j;V$3*m5YmR1ES> zzyae>1_+wF^WS!_hdpADl_em&xS#IiSh;`k!wBU{OY8aVfYhhrXo9Dhs95iJwowV5 zyno4l&!@$)Isw2dp68;K#M%rF0eS4UH^hE+wr&MaVRYovi;{rAz@ka~8{Y-{dwO5c zNnS(#eM$_xLqL$F$Q8fV!V!08xjNLX0}>V*KPWjCIp|3Kx6xiO?ZD zXr}^nDkzJ_i=xN=ng~R6Dr#!c%DRAnfDQ)A=GTl*yO@7+Nfz>KoH#pKQgqx` z!Nfs(_JItV4v_s20dGjlRRz4sd$P%}M6aXcyBT|0Hgz#A$*(4fxS(ddj@WgBW1&2M-?Z?jL?PVKr0kUWs>gNs6 z5iHbSeoa@T!yISH@U&Y%pRwdDo$K~li-Bqt{W z%b@K7a{bk#qR7I*>K47@>CPWX0oqas4-cTWl!Q9@?Ruz9bR(o2F+PI313(Wj3uSvG zK=*Ma-M$tlE=aX;WW(K z@zyV6)f(GG0xdNpUv%Fk(uPm5?^AWbFHfADP;l^`iF_i4paTYBbE*Xs}*F1_uzWpth&C2h_~{KWexJyqu+*s0grYtFU^y z`qeQdh~7E9ch>UtGc%gtEzj~M}LZvQqm>TNJ`fNq@^3ArMtV8 zZlt?WQbM|=y9K0Kba&?&>wWjR&i`Cz?~kYa;L^2bj5)?Lp1hxXl51y#Dd-^A)@^{pt8Yfo?-yRAIKol+E8LqF`^^O82Kp2|_I;LDDL zengz8ALa~#)z4&LwN6*mxUN$XB9JS9mKy~i?}%DJX#f3QV-@`SpW~HGgg9dvU}fpL zZ`h$jepUhWahP<(ppy0$v14&y$BFztA?z*UlU}{+d+$A$?}k%}e^85~7R|RrJ)Wnn zJ-xl`5@*^lg%yN>+-~6|AqGL)Pa=n zrhAkw?{K67WgwKJjCG3DvjjlWl|H6hyYSDT(Cv1AnrUfVdDX!hOC ztESCtqJ=_I!=`4@1NkQV2J6nv%KI*H>ZeCIKLy<)#10)BgXow)$fYok%W&DiWBM>e zgTtPj|CvsJJYpb~*gm8#i%b?_jI#8Nt*cvRXj$-Zt>iMhnZ zH|o&HOA&Jn&9urrfi;twP>X>t9{krnGsI546RWhNN)D4B`(-;fW=;H)Yh9m7FlTIv z%lIB+&53dtLu01)r3Jz$`&Cdv)^|MNmAaWDk`g0DTp1YAk~kG*2^7i^mXA{XfjAd} z0hg+MRy{1AAzAEhcIvUckCpd%dXs1Hb|!Un!(-}DG#doIsRF;FJvU<#v-+n*Z^Vur zN@zaW8FAQ_-6l_PQthvAOp6?Iy2n}$7kGTYp>`q?k})GGy?p)1-InD#<0I~3&-AeC zvhfpb^sMu+;k;-u#V+gfr4IK%;Z)p?%1<1<3vW`L)p;#~_mG-$B>p4M+_69lMyl>$P;Jb31d;lbdH*!LtwX9`%RJTVV*8FmrYt zeLhcphdmcozwjIWYFwa^r=02Oi*fIa@?3j77JGPzkg%|bp~I-+3-=cl+uMY#yLSSO zU3GP=pQr5xcEbe>?b+&27FJ#DcpwHiSe!oH9TX+w?rD%u+}A{e0e@BvbO}jqGY97C ztr0s8C@BzKE88P)R}H?YI(56yH%xn#b>$O|6X3wX?Jf7#REJmv6w}Jgu_g?XG`snk z;zp9sq(%pHp~DGuSTN^YF^{r3o$&oB#U9STTN2&+!~UHAzDV_5>enj0{5ACGiTBlL z@|@mZHfT6cZ=!b6r36L(&>YPALTSJAa75Zn&7bz(JiJPOAeU$MN>iVQNUl{h#&^r3 zdqsSw4Ziaw>9M32$OkLm<4V-N5mnF~r~6H;Y1?F5Q`LN^VIPJ4)lYxvxQg3-Uf*vM z9&)~^U_r!7ufGAU5Gt2|17?00>rCQwKUcB3Y$AXrbzwB2x@;jpdB^mVix+>Ama_%Q z8kbLKkhuAvyw&;{$s|vLPf(%!T-8&DqRn?7=O&h;V`SdPW7?)zv{UmV7Pk}#M!>wJ z7{;LiNpbD(jTt!UhQu9DyiLfuE?PdtFj-~fA~f3B#yi8 zV<@-sW6dNtn{?V(zHiaW6k}#6vK;T!W{qhaP^EvA&IV68u&RCeGLdBY%b}6SbAp$+ zyDwC?J`C9ZdzBlBG26{EAQmBmAHfRUG%j)Wf^pLdADs^hNtbJw*{!3&szUiVliS<+-Q3Mv8@3^55t8f~)g+LZnTdKg1oj1D z_w1?Zk&@C^A-|BTkS>sgF>GjXgzCdJNT`77ZG0R3pE9aH^oV$I2J4zirxS>0XypIS zoK47&6ZzO{!Ppl!RDpkcbs&$tZT+KfER^IXm^WtTP7S#V+EsvR6$cvS%4BrvqrLU*jA zlD&JiB5B!1jJUU*T%gBIWU8<$A$en_97w`5}nR5UYYGnLM$$C|0zXba~pWJwWi2y zA3IrXm-PAGn*8-2C&Q#|thvL=0Uiidhv%FVD6B<<3Mn+Huigq!!~~R{rT0s%TB)&u z(>^Z*F^3!@>AMZ~esXufQu9QbiPiYrJ~K>2T7?I%vEe~!lu-cI+9^}q6`t!bdhoKV z1!h!*u4deQAGXp5TYm@GlmkFjc~{hy)Fma!W=?YEz7%hWjqNFB@vVB#=y33n>o8P` zL5v4zPYftl$Au=)1P^=8YyOAjla!?bC{d;4d1Jy?gw{K%O>Ehff*Z6+gA5fbdz+Eb zvnc+hN@^zrp-!c9&t3hA0&B^|Ydv9QMsw@DLud{>|7>D?(#$-+|FFL4S&AU$f9Zwx`RunZW)DZ}^+L z#C@Q3s7dwr=SHvjn&Qw|vVG8f7WnZpz-s1F0egyZsmDE#FvMFC4^z;+7L3V`c04nC z4Pr;fCc!xn?8)$F7oOjg(|h~R*{s5r`$s+TfFbPM0ETS69ZbJ3Rbl~Nv#iE2Z+*lq zS0F4w-;q3NoohUBCm^8RfjNt2#dG05V+5cL&tH`wsHS|?=g)6ZW(U1E!8LdR)) zSEERUuk}D4+v2DeP7epV$>@I1M;JV1+;`7aAD<-|J`kB)X^YA9Mw~0Er8aTmvFd=P zb%_T6!yff#U0w?;1cA8gNm?A^(1DqOWN;^<%ImKoC8hvbx|Do&wO=ebD>7q!Y54pI z7oV>f2t^<o8L?s zVRCzIyiDGxYTLQdx^RLL%#^uqw<`$?Kq+v*Fxo_=Sp^SMdN+LdE3jcvq>MN~=wSpP z%ZnF&yI=GkPlsXBTv3LLpht({|9J8ggRC|FC0|8E00^`UI#x)c4T^P`k5b@-H?0NC zpE$tzhlFa8!ACp)p5SErfL0x4<)^m&0i3cdNAEQDuJPs7^brj9=u1VR!W~Pg{~q71 zpf?lVPSjyc1bNWJ^{hBK9ZIS=uC82fESA!q$sTq> z?Xtn7fhP@c&B&io zOVX&M`QeM8ED_h{cf4Rg!7ck}?Q%3bXeg4Iqqn>ylfoVomMeM237{~JR3O`Wy8Y}$ z4!IH#-#_#8pEgRfJ2?83YSIrC0|!|kfBg{vFv+?gBDD(h%P7#^uXo@ zp56x-AXY&U7M;*R_jz__iX^|ZkuqUX`-W0VMtGkY3;R7cpXLryJ~6G=jRkD2`f$3W zC#)^E0>5)QCCtW~36drz@VWHKn_P~%hpj-<09y0i$b7O4HRwF)$bXkLvDfN(W4u{@ zf4S!bS>V4OHPx$deexNiW@FUi-1-h3#d?DqWYaSQGN)|O;YCF%C7KDC<*grkFAv7} zkH`K=r0XOTsVEGoTXxHs{;8QA4zldw%x%V_OWw(gL+3kFaWfLl5e$Rc(g6Nn zGE=%%r&kc?1bt4gR<;QhLRXptgaX&rhh88D?6fzL;ws)2S{{wwXg+CrJil;bWUR40 z{hjS7!UqeKDxIpfh732$t0Wter6PBy+}18It8J#9FCJ;tv3d8%ppghjZ4AUzTQ7#G z>v}u`HKzaR2T}9kLvz2uRjNvWi68$Z=BVv*u+$kZFSzw*huhEJAD=s0a1`AeAWiBQ zGF$EdZwp>Bhan*g>TZ?o(=$+nh>xR@$08=~qVRvSo>CB$eP=Xa`sr8I$>k|I6I14y zq$Gs%8Z(pdl-tjaz7MS6$4PcpRz^_IRZ4vUGAz;`?cU-kDK#jX#1UltFyGGfgc{%9 z--qb1W|gGw?`d2byuxcd7OSRuss0!jf-ibp_B_0`By#xGvciP z&bbZ9CFG}y$4hlc2D^}ss*KDT+D1}EG`h+@Ns7ARg9n{FTRI%lt52R#`>8wl=g4=x z^W+Gt$xUEqXQ%mO+ROPneH%s=$3nI>wi@If&-Jdb{t@fx_ zS4V@O0bf$K1)vob4Y!wS=;t}h4F~c8kB{${<;@X^tLZ`(r=z(9>$Djb;|bBr1Hs?6 zj$4lWOgd6)J2{=(pe{IHXSLG8k_ThvLBV5&I=p*_=YFz*>2*4e05+MtrU$P`rcczP z_g#haq^5WaPb_J{Lr3wH<+$XpF7RPK^^0e+z5hMe6GYh4=0I9_W$YoO~y}s*$4;| zMTQ8V6zA@BOu=sRC!|~2uyWSQXls4t;2^M|fCkVknjY>GKseUz0T6PQhsVv+6S}h_ z38)iO_&nj|QQgz`D%o9lVlXjb4H8~n&F0Hxs1J7+`X{lU{!PqxcXz)cxqLke;Sabw zJczQ{`L)3wQ8cd&qh_r(y_8;are)klrrI~; z=Nmb}`%8V7dR7lZF9GrHg+u3;0=F}t%f|$}9TfH`si-DF=ZaK`8b@kADCxg=3BPK< znmUGqr!}4daZb(hc?>k{l~+(v2`H1^iqam0Qb>e`%dfyHkuP6dPv+=onLKeORT_%t z@c9a)0Pr0YAajIZD3Y_SxSg?95+<+|qT=G&(o#|;d$lB9cZ=w-@%puYUWuI1Gv2?$ z`qb*ck-_Ku_J@!+=*o>SPfQGLlFdn zELFV3C4+VtTvO4uC;*0zo(CZ43h5He|GWRB?sApkrx#cDGejf#7_w`76PWAQmi$Hy^xi-*cA3lD3uMUbJ9bu}LZsynTL3eo=40PClr)zLvn3s%V`cU8 z9!yl$)YgW8o35@xq3!F@fMGwi28KK)|p6-f#8FH#rB6!baXTqK}w4DFkmzOMj5I< z$}cjAJ8V9i%fqO}ULd=t2J=1w!xOWK#@a}w4b_kDrVl8o^j7?%sVgn7-hc||vxhsN z&0e+SO*URTlWV{qNq%q~GIQ9TiMe zOB&|3rbN;GUXEUm$EKEh47X#Uscr|@4uh>0I$3~Qk{RYI|H}Lr(Q?odB3W0Hln^3W00zAL|K~r#F;*l0 zRy|=5)jrAqJZPZ4sinxLyANQ>&Ujx2J5g4PAo4c`p4lRy?R+!~#_(`Lkw850Fvk>b z#-yLN&Q%FrWw+GM>ImV->OJKkIy*0@Z`(mr)Z3pqKqDAQ${a=LK5Jn{?Fj# zvrM3h!x>|>kJ!@*0hY~S5-BM!YWDj4gVDDqOK1}4)ZT&!RJlMN>*S;WGVCGMwDML3 zbVrFC6(nc5-=4n%#F;Cynym&ndUB!pVrM^`koH1aT1eDa%UP)$cne0-_19@SF@^7w zaLKy(_R=&Q!3H<(t!2b!)O^u$dEoa>>&L4waUo{ze2N?r;g1c@;YWDPA~oh`YEdMQ zk?I?G7&2K){78F$pG^gZCm~wk4V-kg8CqKU@3#9RobTR|`DR9ZH|l>KLBvLw<)Mr1 z1ZL>RXu8-{nGQam3ATr9+Vw=fy~yUsQ&ev>siBQc6vlJx01VrORyc`kvvX0fe+T!R zj*l@rcmtKH%`lO77pwT%g{*1Kz_`tqN|9PTUAF#0m)#bpZU2fURmklxSNR8_df`K? zxaBh;IoVjgnUpj%!B9*Q+P>l81P!(Veb`M_+o}=CmbkCNY)TjLJG;!Q2)G>Z#lpEy zcqu8hjejF}yOUf#T=L6)2lgN_bH}wo=~;zNlM1kslKMC zrw_njE)YXJ>A_)K?W!LQVqtOM)DsoQyy>Pb{mF1cirQ}WvWzNpjyBl5t=h&bZOE^MrHgpolr zLV4o~K!1;2)Lg z05MfWu30kY8WA$D<0bLWdw;;;Cxm#SrwLot8)_B@83fk5E5R0=~9m+)+@$chi zw2GyOfQ&8webB4j(K3EdB%9^XXQY=@g|h#-QdXXQnm;OCu0SepbgrnY%6p68i2zK5 zw1p;NEhlF)9T%5+)RVnmnNEirka&;{$jNTGyR0(YVrp*LeSbB7^qz&Ky>~v`kC>SF z+Q{vNa>4L=&#;l^UCr5^!XZx+}SjmNpyDq#8@7x4KuE>rQs0_65;Z!ou88b;iMv#^jX=!$D%VgixQ z(&ewHt1|`cVi5#)FQ=!c-2iu6fW4vFR4&hrY}yU#q=}D+PnC%r#qVWwvLysUt}8;` zC4;1qZt|`s+Gf2M2mYE^bJIYNEuFFv`OdW$ALU^PBl0r}hj4X_Ob1nMF)MvC9o6d^ znT96|=#z(O&28+7pc*2>db@X-9TinIWToD3g%M-2fI1)=&)4TqWiJf|;(~?@tW3ar zxBtIaC^Fn+1ej2MZlRg(0=FCI5y69yj~IRvCOddDO+o_wHg)8==M)P zBAG61KTLmWfzrrCM5eIp2zvc3K_R`|?TCh{#AANjgm+EM{~x z8D8;kZ2?5`Tb<8DLS`@7UjAIJ2vuWDtvX9ugm_(l>$rZmX^QrScSx|(r;{3x-HnXs zxttwCMSyNHU0>05dTv{(?~g#cHuU4nXkK;x}B1e>Tsn?S1{58UH*j>$Z;}Q z)RocpJIXrk#CicE$zh{Vtp=IQ+CN18Ze13EdFH{AA zTvqf}Ngu(z{VJui=EysvNKR(1>|Oqivwvd^|B(;(5?KeSi1sV=~Yz11np#}F;UTHsM50ko<3hds5@@THGF zfWpG;L@5aE4e0RWLqa|`J+6R4+)rPK>yB&BB%Na4OIe{0d zW_K7Pnc)-yP`W44x-y+Yof2xX^bGTZnb`0orZdR@^{|_p8VjLC-kM6FNAY-=Q^VY!~L z>efJLUrD2&SXo4akeKSga#PMAj4nJiB|${=QX!+cHck;HZ@@4n^_b zna}2vMH0CwcFiKG4*cW;?Z5$rH_}L#wnD(oMD8p%MgdIbVs1%tFv(i}v%^;T>sM}T zG#9vXm(_CnHzBy=VlAQ;AdCXU+yNO)E}&f`IwggGhlgjIsv!TE*9b7UR(T_cz@z>y zv9UgPaCE!@&DSo6b7CMCD+W1%b3nyg?|LNA9fl`zG?3s1;kU?^l9LotZT`dpJa?G8 zXkTf%`nPpY-NVU7eh;^GeQQ?5g@uKzEt~V1C~&X9NNjA%h@aM8 z=rjeKobM>Bm1>Llpk1OZG&m;x0jzj3vhJ!{K4HL1dB4)xnw*^cO-~{1Ke=31r_07%GVld<%)(S*2GBUJ#wJ>;H)k@fV zNB6H^y*UK8l%gOHUrF3yRp0kftxTsWE%_$ZpSY+Crl@k^0Q(zmGPlg!tpfkH3FEIbI#=oTjll^A_j$BV=nfdcA~E zkhb{;N5M4kKa%iJjV%n^PCD?~P~^RnHJbIEQ;gi~^9TfnTYXgZ*JUvY8Ifty8juq8 z9A^|gFv6s@au!o4YwnLInwx3si3wJ_@^x`gJOZukrY`F*(uoho!)Ggl9r2jhSaSuL zCtUkJlDFYU#^v!dJ3g)gg*h)XF>F-&v(%1WFY((4!GU->p^ln8(P6!T(xNptlGkNA zrqlOSqOv5TRrj}d`aXhQ#HeHWG3b$AyQh$(RX|;KA#SrE)4s6qN<@DW*OK>{%x%q+qT+h4#kJ-BzuY4nZ0PZp zC%a7J^Irc#-S4kQfoNVIjIqFy1GYOHW-r*NBisAOGkxg}JB)qiDuV+oXF!ma=U0Nl zn9BaU$^$3BO$SV(iwoLJ8P%$8!|R&|(?130hvShvXSmsl?5_y^l1{}JO^%mn7d^=Pv6r@Obio>Sz^%+boGqi4f);RJU(3UrMPW1QJk9(-5#;`5x0_72rszUKd~ z-@6F#h&*=d=>JTC#^u2)-6S3q-)z~EA6{csY&|_a#E@GAwk@C0W&*6r%32_;LegXh zPY?eANfhPo7S^rR5#{d1j3xd?7Tb1VlhL$jDNCcSFX(rb`fDak+RXvQO5Ml|clK1m z>vh&!x-hqD`A~mb)v>&<>&eTns0gWe@MI<#bi~7XxEkLvw;5QKQi0(EY0)(~9df^( zzRJy!*HMWx9qFuV#Y6Sp&EyVXR3>GlUetx){O(@;>S&MHQWs0xfR`_=V!PNA3b{DS~IWsNzo5`1Eo(Gv`8Z1 zQ8_uMUmebnSkg-yxEyZWMjDk-QA2h6Q9b#zm~^9PXlRnE&tEYxGG1q!nug)n|2P^O zMLf6cNjzvue!4J%_kjcv#Pxi(w(c*!(2{Jl$Lj7w1dj|tKzK1lSOjQXk~f~+-qVxX z{?KS>Z7k_CJ3E{I-E=HlmjuK>3O5{Y>`3w+DS9o*@tEY~B`qep);cESaE)ogV) z1fX!dgMGxa_1IwZd0$RrXk!xQ#`O++Vz*{bQ8x8G?o>lP_gtWh$@ISa_Ha5!@MT6v zgWbvN;z!c+?!SMNQHko_iu#zYGOa4tQNQH*J8xjFFXwZZuuyoQkwJ~>jcC0$x`*M* z5rdQ$1k0bM8Mu6NVoSLPeDK_^P}YkUOJ#+@AE=ce_H9$$tIIWG_u}xO#1faVJMYpX z=Jra*Ye;cOyU?m-Gau@WcyOY1JzUyy2YC~zMB1LAhUK%trR5t2ga3?z7ti!Ipd=L? z=>&uKiaYm!vE4t{7C6JUJ;I?l3L^4k~sK2t-T< z7@I9TkGp+?)<7Tz#%N$;A{AWwSRYS6-0OcAlbG3FUHI~RZz<*7n!tCbPy+^?hBpbh zX58MF5bs9kT+<{pT0+z<=AN_hY)}_ICWyLpDV?uIO~|Fq|1S8sohy!oi%smPtABE# z#WkyvBA8_}uANpK8IPIf+kbcMOuvZ8$Re#0c*j<)o_=Lh$$A$O)uPwk<7VtYAl@@t zJbP$#H5sUvf2Wg+FRflC@tu}XE{k72%O+!co+6?+f!=PvOK+Qm4>LSko$)b(e{i(P z$GD>~`r6|D9-ZNC>nO=yvv>9Uoa|Kji?{_QnGMzR_*b_8mrAEmWbS{kqsoSrXD|n6xg0V+Eth>Jr{chCLr3u#og3y%It~}lv`CD^p`uB z%bxRHq216KSOo!rs@(_apa}e6xdM^A@o&o#aCa3Bi@2P&^J4c?qF}bnXMW(cqBe)} zlSsHH{i<(_7s4SPizTDz$(h^%evnRVm<>}QkX5_YayIrW>)#vKmb77hCDH_~I?aAy zzg1LMf4~|0_0H3mPZaDcMUFB(JT_(Jt|r;R<@frl*cR>{tX6#=EIg(^cbOX2XQfK{ z)Yfv!Wbvl_XpQ8#QD*?e#UDca7#JBo`W|DnEa~t~G+9b0O->M;+!*P0@An~b^UUSp zRT-jhF==nAe$vp)HPyF~Gclotg>l(Zqi$c~^5B@`GEXq*rKQhHe=;_>@JHggU%$t4 zWMezGD*fq}*p;7lU+;pY7e&&(p5n-3cg>y2QS88ZNKUQavu{Y?!&G=KAek zgip1ssV1!#NT-%^n&R-F#`79T&%M$lt6fDMl_0ogU4=^_5COrXrC#(BPKDA!Hgf`k z^vI@`YZaClOTsEsDwmU00lD`tiLyM7hve#5aTPU{uoJ~!J$y^5to@ar zn}z~BQf~WGc9FX)QDZ}Ev6(1q^R<~*Cyz?kX&`J*K5@ndbV;D%H}!XZcDzQKMtBZB z2GG84G74f&*U(Iwj*#>5A&_Nuw~1kuQED3==58!}Yz>qvpx7~C6)au)lIIWil7Psv zzke92%EQNFcW^7KQe?ifP@f{~19&uq5*+r>kY>u1+iQql*4T_EgAD##lioLPAYP(i zR|B?yk*^fJl{K~GZF8AZH^xUtg>U!=*8gTzx~Y}>4fKzHEeYjPcp&fuet?3ilQS9c zgh4iRY{%)|=Nf-h>6a+WDw8fXm`{b32wNiVW-}9Y zk0xNJR+uVPOrS>!rKDaIb>?6R1?Kn|0>Tjxx9g}NMBl?4rRI-ABQ5_}Hc+#m3dieQ zScpgko0p0#2JGs>GHU8diw9g}RxUQVGmr{3x@v{n9)l{?vKQYj)!aNB+k-@tIH+V}f_;y5;xm4VzS!iN^)7}j z`85w58FGmkCQU0oe>(8!Zk+b9Wn^Uww|9jT25`0)Ybah$6>6sNEI<6t;Jd;fDd1cITYP}Oq*Y6+-Xt`&41 z^mIVI!>Uq=iMV!GZ#XmALkpbqk-}*B zZ+ak^KpWO^%Q&x5#R3nu4V}8vchxHKYtBLmp&Cdri{S`4Z!o+fSTg3dggtrdq;PWt*j0P*I!^|MA%d|2dgh7h7~+b6~i^1_O`sGzH1c?4PL+J~+C#%?O%41R$-&dm z@QU;g9$5GKhMBPw+$JX`T#!;BF>u+30-qcH@*oJ~i17cMSpl@;Cz*&=i^OD0s{bz) cNuChmDx0x;Mkd++1O7;g$%&Q;fA;&|07ON^wEzGB diff --git a/src/renderer/routes/__snapshots__/Login.test.tsx.snap b/src/renderer/routes/__snapshots__/Login.test.tsx.snap index e4af27471..da70146dd 100644 --- a/src/renderer/routes/__snapshots__/Login.test.tsx.snap +++ b/src/renderer/routes/__snapshots__/Login.test.tsx.snap @@ -364,7 +364,7 @@ exports[`renderer/routes/Login.tsx > should render itself & its children 1`] = ` data-component="Button" data-loading="false" data-size="medium" - data-testid="login-oauth-app" + data-testid="login-custom-oauth-app" data-variant="invisible" type="button" > @@ -399,7 +399,7 @@ exports[`renderer/routes/Login.tsx > should render itself & its children 1`] = ` class="prc-Button-Label-FWkx3" data-component="text" > - OAuth App + Custom OAuth App diff --git a/src/renderer/routes/github/LoginWithCustomOAuthApp.test.tsx b/src/renderer/routes/github/LoginWithCustomOAuthApp.test.tsx new file mode 100644 index 000000000..0987888e6 --- /dev/null +++ b/src/renderer/routes/github/LoginWithCustomOAuthApp.test.tsx @@ -0,0 +1,104 @@ +import { screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { renderWithProviders } from '../../__helpers__/test-utils'; +import { mockCustomOAuthAppAccount } from '../../__mocks__/account-mocks'; + +import * as comms from '../../utils/system/comms'; +import { GitHubLoginWithCustomOAuthAppRoute } from './LoginWithCustomOAuthApp'; + +describe('renderer/routes/github/LoginWithCustomOAuthApp.tsx', () => { + const copyToClipboardSpy = vi.spyOn(comms, 'copyToClipboard').mockResolvedValue(); + const openExternalLinkSpy = vi.spyOn(comms, 'openExternalLink').mockImplementation(vi.fn()); + + const session = { + hostname: 'github.example.com', + clientId: 'CUSTOM_CLIENT_ID_123', + deviceCode: 'device-code', + userCode: 'USER-1234', + verificationUri: 'https://github.example.com/login/device', + intervalSeconds: 5, + expiresAt: Date.now() + 900000, + }; + + it('collects a hostname and client ID, and no client secret', () => { + renderWithProviders(); + + expect(screen.getByTestId('login-hostname')).toBeInTheDocument(); + expect(screen.getByTestId('login-clientId')).toBeInTheDocument(); + expect(screen.queryByTestId('login-clientSecret')).not.toBeInTheDocument(); + }); + + it('shows validation errors for an invalid hostname and client ID', async () => { + renderWithProviders(); + + const hostname = screen.getByTestId('login-hostname'); + await userEvent.clear(hostname); + await userEvent.type(hostname, 'test'); + await userEvent.type(screen.getByTestId('login-clientId'), 'short'); + + await userEvent.click(screen.getByTestId('login-submit')); + + expect(screen.getByText('Hostname format is invalid')).toBeInTheDocument(); + expect(screen.getByText('Client ID format is invalid')).toBeInTheDocument(); + // Still on the credentials step — the device flow was not started. + expect(screen.getByTestId('login-submit')).toBeInTheDocument(); + }); + + it('reuses the scope step and starts the device flow with the supplied credentials', async () => { + const loginWithDeviceFlowStartMock = vi.fn().mockResolvedValueOnce(session); + + renderWithProviders(, { + loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, + loginWithDeviceFlowPoll: vi.fn().mockResolvedValue(null), + }); + + const hostname = screen.getByTestId('login-hostname'); + await userEvent.clear(hostname); + await userEvent.type(hostname, 'github.example.com'); + await userEvent.type(screen.getByTestId('login-clientId'), 'CUSTOM_CLIENT_ID_123'); + + await userEvent.click(screen.getByTestId('login-submit')); + + // The shared public/recommended scope step is shown before the session starts. + expect(screen.getByTestId('device-scope-full')).toBeInTheDocument(); + await userEvent.click(screen.getByTestId('device-scope-full')); + + await waitFor(() => { + expect(loginWithDeviceFlowStartMock).toHaveBeenCalledWith( + 'github', + 'github.example.com', + ['notifications', 'read:user', 'repo'], + 'CUSTOM_CLIENT_ID_123', + ); + }); + + await screen.findByTestId('device-user-code'); + expect(copyToClipboardSpy).toHaveBeenCalledWith('USER-1234'); + }); + + it('opens the OAuth app registration page without a callback URL', async () => { + renderWithProviders(); + + await userEvent.click(screen.getByTestId('login-create-oauth-app')); + + expect(openExternalLinkSpy).toHaveBeenCalledWith( + expect.stringContaining('https://github.com/settings/applications/new'), + ); + expect(openExternalLinkSpy).not.toHaveBeenCalledWith(expect.stringContaining('callback_url')); + }); + + it('prefills the hostname and client ID from the re-auth account', () => { + renderWithProviders(, { + initialEntries: [ + { + pathname: '/login/github/custom-oauth-app', + state: { account: mockCustomOAuthAppAccount }, + }, + ], + }); + + expect(screen.getByTestId('login-hostname')).toHaveValue('github.gitify.io'); + expect(screen.getByTestId('login-clientId')).toHaveValue('CUSTOM_CLIENT_ID_123'); + }); +}); diff --git a/src/renderer/routes/github/LoginWithCustomOAuthApp.tsx b/src/renderer/routes/github/LoginWithCustomOAuthApp.tsx new file mode 100644 index 000000000..0c9ebc8e5 --- /dev/null +++ b/src/renderer/routes/github/LoginWithCustomOAuthApp.tsx @@ -0,0 +1,164 @@ +import { useState } from 'react'; +import { useLocation } from 'react-router-dom'; + +import { BookIcon, PersonIcon } from '@primer/octicons-react'; +import { Button, FormControl, Stack, Text, TextInput, Tooltip } from '@primer/react'; + +import { Constants } from '../../constants'; + +import { Contents } from '../../components/layout/Contents'; +import { Page } from '../../components/layout/Page'; +import { Footer } from '../../components/primitives/Footer'; +import { Header } from '../../components/primitives/Header'; + +import type { Account, ClientID, Forge, Hostname } from '../../types'; + +import { + type CustomOAuthAppFormData, + type CustomOAuthAppFormErrors, + validateCustomOAuthAppForm, +} from '../../utils/auth/loginValidation'; +import { getAdapter } from '../../utils/forges/registry'; +import { openExternalLink } from '../../utils/system/comms'; +import { GitHubLoginWithDeviceFlowRoute } from './LoginWithDeviceFlow'; + +interface LocationState { + account?: Account; +} + +/** + * Sign in with a user-supplied GitHub OAuth app. + * + * Collects the app's hostname and client ID (a public identifier — never a + * secret), then hands off to the shared device-flow authorization UI. + */ +export function GitHubLoginWithCustomOAuthAppRoute() { + const location = useLocation(); + const { account: reAuthAccount } = (location.state ?? {}) as LocationState; + + const forge: Forge = 'github'; + + const [formData, setFormData] = useState({ + hostname: (reAuthAccount?.hostname ?? Constants.GITHUB_HOSTNAME) as Hostname, + clientId: (reAuthAccount?.clientId ?? '') as ClientID, + }); + const [errors, setErrors] = useState({}); + const [credentials, setCredentials] = useState(null); + + const handleInputChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setFormData((prev) => ({ ...prev, [name]: value })); + }; + + const handleSubmit = () => { + const newErrors = validateCustomOAuthAppForm(formData, forge); + + setErrors(newErrors); + + if (!newErrors.hostname && !newErrors.clientId) { + setCredentials(formData); + } + }; + + if (credentials) { + return ( + + ); + } + + return ( + +

Login with Custom OAuth App
+ + + + + Authorize Gitify with your own GitHub OAuth app. Create an app, enable its device flow, + then paste its client ID below. + + + + Hostname + + Change only if you are using GitHub Enterprise Server + + + {errors.hostname && ( + {errors.hostname} + )} + + + + + + and enable its device flow, then use its client ID below. + + + + + Client ID + + {errors.clientId && ( + {errors.clientId} + )} + + + + +
+ + + + + +
+ + ); +} diff --git a/src/renderer/routes/github/LoginWithDeviceFlow.test.tsx b/src/renderer/routes/github/LoginWithDeviceFlow.test.tsx index 8b42a6158..3623b1c0e 100644 --- a/src/renderer/routes/github/LoginWithDeviceFlow.test.tsx +++ b/src/renderer/routes/github/LoginWithDeviceFlow.test.tsx @@ -2,9 +2,9 @@ import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { navigateMock, renderWithProviders } from '../../__helpers__/test-utils'; -import { mockGitHubAppAccount } from '../../__mocks__/account-mocks'; +import { mockGitifyOAuthAppAccount } from '../../__mocks__/account-mocks'; -import type { Hostname } from '../../types'; +import type { ClientID, Hostname } from '../../types'; import * as logger from '../../utils/core/logger'; import * as comms from '../../utils/system/comms'; @@ -54,11 +54,12 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { await userEvent.click(screen.getByTestId('device-scope-public')); - expect(loginWithDeviceFlowStartMock).toHaveBeenCalledWith('github', undefined, [ - 'notifications', - 'read:user', - 'public_repo', - ]); + expect(loginWithDeviceFlowStartMock).toHaveBeenCalledWith( + 'github', + 'github.com', + ['notifications', 'read:user', 'public_repo'], + undefined, + ); await screen.findByTestId('device-user-code'); expect(screen.getByTestId('open-browser-button')).toBeInTheDocument(); @@ -85,11 +86,12 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { await userEvent.click(screen.getByTestId('device-scope-full')); - expect(loginWithDeviceFlowStartMock).toHaveBeenCalledWith('github', undefined, [ - 'notifications', - 'read:user', - 'repo', - ]); + expect(loginWithDeviceFlowStartMock).toHaveBeenCalledWith( + 'github', + 'github.com', + ['notifications', 'read:user', 'repo'], + undefined, + ); await screen.findByTestId('device-user-code'); }); @@ -234,6 +236,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { 'github', 'access-token', 'github.com', + undefined, ); expect(navigateMock).toHaveBeenCalledWith('/'); }); @@ -314,7 +317,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { pathname: '/login/github/device-flow', state: { account: { - ...mockGitHubAppAccount, + ...mockGitifyOAuthAppAccount, hostname: 'github.enterprise.example' as Hostname, }, }, @@ -328,6 +331,36 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { 'github', 'github.enterprise.example', ['notifications', 'read:user', 'repo'], + undefined, + ); + }); + + it('threads a custom client ID and hostname through the device flow', async () => { + const loginWithDeviceFlowStartMock = vi.fn().mockResolvedValueOnce({ + hostname: 'github.example.com', + clientId: 'CUSTOM_CLIENT_ID_123', + deviceCode: 'device-code', + userCode: 'USER-1234', + verificationUri: 'https://github.example.com/login/device', + intervalSeconds: 5, + expiresAt: Date.now() + 900000, + }); + + renderWithProviders( + , + { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock }, + ); + + await userEvent.click(screen.getByTestId('device-scope-full')); + + expect(loginWithDeviceFlowStartMock).toHaveBeenCalledWith( + 'github', + 'github.example.com', + ['notifications', 'read:user', 'repo'], + 'CUSTOM_CLIENT_ID_123', ); }); diff --git a/src/renderer/routes/github/LoginWithDeviceFlow.tsx b/src/renderer/routes/github/LoginWithDeviceFlow.tsx index eca790539..83f8fbebb 100644 --- a/src/renderer/routes/github/LoginWithDeviceFlow.tsx +++ b/src/renderer/routes/github/LoginWithDeviceFlow.tsx @@ -20,11 +20,12 @@ import { Page } from '../../components/layout/Page'; import { Footer } from '../../components/primitives/Footer'; import { Header } from '../../components/primitives/Header'; -import type { Account, Forge, Hostname, Link } from '../../types'; +import type { Account, ClientID, Forge, Hostname, Link } from '../../types'; import type { DeviceFlowSession } from '../../utils/auth/types'; import { getAlternateScopeNames, getRecommendedScopeNames } from '../../utils/auth/scopes'; import { rendererLogError, toError } from '../../utils/core/logger'; +import { describeDeviceFlowError } from '../../utils/forges/github/flows'; import { getAdapter } from '../../utils/forges/registry'; import { copyToClipboard, openExternalLink } from '../../utils/system/comms'; @@ -32,15 +33,32 @@ interface LocationState { account?: Account; } +interface GitHubLoginWithDeviceFlowRouteProps { + /** OAuth app client ID to authorize; omit to use Gitify's preconfigured app. */ + clientId?: ClientID; + /** Hostname to authenticate against; defaults to the re-auth account or GitHub.com. */ + hostname?: Hostname; + /** Page heading; defaults to authorizing Gitify's preconfigured app. */ + title?: string; +} + type ScopeChoice = 'public' | 'full'; -export function GitHubLoginWithDeviceFlowRoute() { +export function GitHubLoginWithDeviceFlowRoute({ + clientId, + hostname, + title, +}: GitHubLoginWithDeviceFlowRouteProps) { const navigate = useNavigate(); const location = useLocation(); const { account: reAuthAccount } = (location.state ?? {}) as LocationState; const forge: Forge = 'github'; + const effectiveHostname = (hostname ?? + reAuthAccount?.hostname ?? + Constants.GITHUB_HOSTNAME) as Hostname; + const { loginWithDeviceFlowStart, loginWithDeviceFlowPoll, loginWithDeviceFlowComplete } = useLogins(); @@ -56,7 +74,12 @@ export function GitHubLoginWithDeviceFlowRoute() { const scopes = scopeChoice === 'public' ? getAlternateScopeNames() : getRecommendedScopeNames(); - const newSession = await loginWithDeviceFlowStart(forge, reAuthAccount?.hostname, scopes); + const newSession = await loginWithDeviceFlowStart( + forge, + effectiveHostname, + scopes, + clientId, + ); setSession(newSession); // Auto-copy the user code to clipboard @@ -66,14 +89,17 @@ export function GitHubLoginWithDeviceFlowRoute() { openExternalLink(newSession.verificationUri as Link); } catch (err) { rendererLogError('LoginWithDeviceFlow', 'Failed to start device flow', toError(err)); - setError('Failed to start authentication. Please try again.'); + setError( + describeDeviceFlowError(err, effectiveHostname, clientId) ?? + 'Failed to start authentication. Please try again.', + ); } }; if (scopeChoice) { void initializeDeviceFlow(); } - }, [loginWithDeviceFlowStart, reAuthAccount, scopeChoice, forge]); + }, [loginWithDeviceFlowStart, effectiveHostname, clientId, scopeChoice, forge]); // Poll for device flow completion useEffect(() => { @@ -98,7 +124,7 @@ export function GitHubLoginWithDeviceFlowRoute() { const token = await loginWithDeviceFlowPoll(forge, session); if (token && isActive) { - await loginWithDeviceFlowComplete(forge, token, session.hostname); + await loginWithDeviceFlowComplete(forge, token, session.hostname, clientId); void navigate('/'); return; } @@ -133,7 +159,7 @@ export function GitHubLoginWithDeviceFlowRoute() { } }; // oxlint-disable-next-line react/exhaustive-deps -- navigate is stable - }, [session, loginWithDeviceFlowPoll, loginWithDeviceFlowComplete, forge]); + }, [session, loginWithDeviceFlowPoll, loginWithDeviceFlowComplete, clientId, forge]); const handleCopyUserCode = useCallback(async () => { if (session?.userCode) { @@ -249,9 +275,7 @@ export function GitHubLoginWithDeviceFlowRoute() { {(() => { const adapter = getAdapter(forge); - const revokeUrl = adapter.deviceFlow?.getRevokeAccessUrl( - (reAuthAccount?.hostname ?? Constants.GITHUB_HOSTNAME) as Hostname, - ); + const revokeUrl = adapter.deviceFlow?.getRevokeAccessUrl(effectiveHostname, clientId); if (!revokeUrl) { return null; } @@ -259,7 +283,9 @@ export function GitHubLoginWithDeviceFlowRoute() { return ( - Note: to change previously granted permissions, revoke Gitify's access at{' '} + {clientId + ? "Note: to change previously granted permissions, revoke your app's access at" + : "Note: to change previously granted permissions, revoke Gitify's access at"}{' '} - - and use your client id & secret below. - - - - Client ID - - {errors.clientId && ( - {errors.clientId} - )} - - - Client Secret - setShouldMaskClientSecret(!shouldMaskClientSecret)} - /> - } - type={shouldMaskClientSecret ? 'password' : 'text'} - value={formData.clientSecret} - /> - {errors.clientSecret && ( - {errors.clientSecret} - )} - - - - -
- - - - - -
- - ); -} diff --git a/src/renderer/routes/github/__snapshots__/LoginWithOAuthApp.test.tsx.snap b/src/renderer/routes/github/__snapshots__/LoginWithOAuthApp.test.tsx.snap deleted file mode 100644 index 1e0136890..000000000 --- a/src/renderer/routes/github/__snapshots__/LoginWithOAuthApp.test.tsx.snap +++ /dev/null @@ -1,487 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`renderer/routes/github/LoginWithOAuthApp.tsx > renders correctly 1`] = ` -
-
-
-
- - -
-
- -

- Login with OAuth App -

-
-
-
-
-
-
-
-
- - - - - - - Change only if you are using GitHub Enterprise Server - - -
-
- - - and use your - - client id & secret - - below. - -
-
- - - - -
-
- - - - - - - - -
-
-
- -
-
-`; diff --git a/src/renderer/routes/routes.visual.test.tsx b/src/renderer/routes/routes.visual.test.tsx index bb95e71b5..2c955687a 100644 --- a/src/renderer/routes/routes.visual.test.tsx +++ b/src/renderer/routes/routes.visual.test.tsx @@ -17,9 +17,9 @@ import { AccountScopesRoute } from './AccountScopes'; import { BitbucketLoginWithPersonalAccessTokenRoute } from './bitbucket/LoginWithPersonalAccessToken'; import { FiltersRoute } from './Filters'; import { GiteaLoginWithPersonalAccessTokenRoute } from './gitea/LoginWithPersonalAccessToken'; +import { GitHubLoginWithCustomOAuthAppRoute } from './github/LoginWithCustomOAuthApp'; import { GitHubLoginWithDeviceFlowRoute } from './github/LoginWithDeviceFlow'; import { GitHubLoginWithCLIRoute } from './github/LoginWithGitHubCLI'; -import { GitHubLoginWithOAuthAppRoute } from './github/LoginWithOAuthApp'; import { GitHubLoginWithPersonalAccessTokenRoute } from './github/LoginWithPersonalAccessToken'; import { GitLabLoginWithPersonalAccessTokenRoute } from './gitlab/LoginWithPersonalAccessToken'; import { LoginRoute } from './Login'; @@ -89,9 +89,9 @@ const ROUTES: RouteCase[] = [ state: { initialEntries: ['/login/github/personal-access-token'] }, }, { - name: 'login-github-oauth-app', - element: , - state: { initialEntries: ['/login/github/oauth-app'] }, + name: 'login-github-custom-oauth-app', + element: , + state: { initialEntries: ['/login/github/custom-oauth-app'] }, }, { name: 'login-gitea-personal-access-token', diff --git a/src/renderer/stores/types.ts b/src/renderer/stores/types.ts index c7ca4575f..287391c18 100644 --- a/src/renderer/stores/types.ts +++ b/src/renderer/stores/types.ts @@ -1,6 +1,7 @@ import type { Account, AccountUUID, + ClientID, FilterStateType, Forge, GitifyError, @@ -40,6 +41,7 @@ export interface AccountsActions { hostname: Hostname, forge?: Forge, username?: string, + clientId?: ClientID, ) => Promise; /** diff --git a/src/renderer/stores/useAccountsStore.test.ts b/src/renderer/stores/useAccountsStore.test.ts index 8a1b49df6..c900c51c9 100644 --- a/src/renderer/stores/useAccountsStore.test.ts +++ b/src/renderer/stores/useAccountsStore.test.ts @@ -1,6 +1,7 @@ import { act, renderHook } from '@testing-library/react'; import { + mockCustomOAuthAppAccount, mockGiteaAccount, mockGitHubCliAccount, mockGitHubCloudAccount, @@ -8,7 +9,8 @@ import { } from '../__mocks__/account-mocks'; import { mockRawUser } from '../utils/forges/github/__mocks__/response-mocks'; -import type { Account, Forge, Hostname, Link, Token } from '../types'; +import type { Account, ClientID, Forge, Hostname, Link, Token } from '../types'; +import type { AuthMethod } from '../utils/auth/types'; import type { GetAuthenticatedUserResponse } from '../utils/forges/github/types'; import { getRecommendedScopeNames } from '../utils/auth/scopes'; @@ -90,6 +92,25 @@ describe('renderer/stores/useAccountsStore.ts', () => { ); }, ); + + it('relabels a legacy GitHub App account as Gitify OAuth App without losing its token', () => { + const [account] = sanitizeAccounts([ + { ...mockGitHubCloudAccount, method: 'GitHub App' as AuthMethod }, + ]); + + expect(account.method).toBe('Gitify OAuth App'); + expect(account.token).toBe(mockGitHubCloudAccount.token); + }); + + it('relabels a legacy OAuth App account as Custom OAuth App and keeps its client ID', () => { + const [account] = sanitizeAccounts([ + { ...mockCustomOAuthAppAccount, method: 'OAuth App' as AuthMethod }, + ]); + + expect(account.method).toBe('Custom OAuth App'); + expect(account.token).toBe(mockCustomOAuthAppAccount.token); + expect(account.clientId).toBe('CUSTOM_CLIENT_ID_123'); + }); }); it.each([ @@ -201,16 +222,24 @@ describe('renderer/stores/useAccountsStore.ts', () => { ]); }); - test('should add oauth app account', async () => { + test('should add a custom OAuth app account with its client ID', async () => { await useAccountsStore .getState() - .createAccount('OAuth App', '123-456' as Token, 'github.com' as Hostname); + .createAccount( + 'Custom OAuth App', + '123-456' as Token, + 'github.com' as Hostname, + 'github', + undefined, + 'CUSTOM_CLIENT_ID_123' as ClientID, + ); expect(useAccountsStore.getState().accounts).toEqual([ { forge: 'github', hostname: 'github.com' as Hostname, - method: 'OAuth App', + method: 'Custom OAuth App', + clientId: 'CUSTOM_CLIENT_ID_123' as ClientID, platform: 'GitHub Cloud', scopes: getRecommendedScopeNames(), token: 'encrypted' as Token, @@ -306,16 +335,24 @@ describe('renderer/stores/useAccountsStore.ts', () => { ]); }); - test('should add oauth app account', async () => { + test('should add a custom OAuth app account', async () => { await useAccountsStore .getState() - .createAccount('OAuth App', '123-456' as Token, 'github.gitify.io' as Hostname); + .createAccount( + 'Custom OAuth App', + '123-456' as Token, + 'github.gitify.io' as Hostname, + 'github', + undefined, + 'CUSTOM_CLIENT_ID_123' as ClientID, + ); expect(useAccountsStore.getState().accounts).toEqual([ { forge: 'github', hostname: 'github.gitify.io' as Hostname, - method: 'OAuth App', + method: 'Custom OAuth App', + clientId: 'CUSTOM_CLIENT_ID_123' as ClientID, platform: 'GitHub Enterprise Server', scopes: getRecommendedScopeNames(), token: 'encrypted' as Token, diff --git a/src/renderer/stores/useAccountsStore.ts b/src/renderer/stores/useAccountsStore.ts index a689d30a8..eb0e67752 100644 --- a/src/renderer/stores/useAccountsStore.ts +++ b/src/renderer/stores/useAccountsStore.ts @@ -3,7 +3,7 @@ import { persist } from 'zustand/middleware'; import { Constants } from '../constants'; -import type { Account, Forge, Hostname, Token } from '../types'; +import type { Account, ClientID, Forge, Hostname, Token } from '../types'; import type { AuthMethod } from '../utils/auth/types'; import type { AccountsState, AccountsStore } from './types'; @@ -13,11 +13,30 @@ import { getAccountAdapter, getAdapter, isKnownForge } from '../utils/forges/reg import { decryptValue, encryptValue } from '../utils/system/comms'; import { DEFAULT_ACCOUNTS_STATE } from './defaults'; +/** + * Map a persisted auth-method label onto the current vocabulary. + * + * Accounts stored before the custom OAuth app flow moved to the device flow + * carry the retired `GitHub App` / `OAuth App` labels; relabel them so their + * existing tokens keep working without forcing a re-login. + */ +function migrateAuthMethod(method: string): AuthMethod { + switch (method) { + case 'GitHub App': + return 'Gitify OAuth App'; + case 'OAuth App': + return 'Custom OAuth App'; + default: + return method as AuthMethod; + } +} + /** * Sanitise persisted accounts state. Persisted JSON is untrusted (XSS, malicious * extension, file-system tampering), so we project only the known fields, - * coerce `forge` to a registered value, and drop accounts with a - * structurally invalid hostname before the renderer ever touches them. + * coerce `forge` to a registered value, migrate retired auth-method labels, and + * drop accounts with a structurally invalid hostname before the renderer ever + * touches them. */ export function sanitizeAccounts(accounts: Account[]): Account[] { return accounts.flatMap((a) => { @@ -27,11 +46,12 @@ export function sanitizeAccounts(accounts: Account[]): Account[] { } const sanitised: Account = { forge, - method: a.method, + method: migrateAuthMethod(a.method as string), platform: a.platform, version: a.version, hostname: a.hostname, token: a.token, + clientId: a.clientId, username: a.username, user: a.user, scopes: a.scopes, @@ -57,6 +77,7 @@ const useAccountsStore = create()( hostname: Hostname, forge: Forge = 'github', username?: string, + clientId?: ClientID, ) => { const encryptedToken = (await encryptValue(token)) as Token; @@ -66,6 +87,7 @@ const useAccountsStore = create()( method: method, platform: getAdapter(forge).getPlatform(hostname), token: encryptedToken, + clientId, username, user: null, // Will be updated during the refresh call below }; diff --git a/src/renderer/types.ts b/src/renderer/types.ts index 74298639c..6b5ba4be0 100644 --- a/src/renderer/types.ts +++ b/src/renderer/types.ts @@ -27,14 +27,10 @@ type Brand = { [__brand]: B }; export type Branded = T & Brand; -export type AuthCode = Branded; - export type Token = Branded; export type ClientID = Branded; -export type ClientSecret = Branded; - export type Hostname = Branded; export type Link = Branded; @@ -73,6 +69,11 @@ export interface Account { version?: string; hostname: Hostname; token: Token; + /** + * OAuth app client ID for an account authorized through a user-supplied + * custom OAuth app; absent for Gitify's own preconfigured app. + */ + clientId?: ClientID; /** Atlassian account email — required for Bitbucket Basic Auth (email:token). */ username?: string; user: GitifyUser | null; diff --git a/src/renderer/utils/auth/loginValidation.test.ts b/src/renderer/utils/auth/loginValidation.test.ts index 6e4e136cc..0e34e1454 100644 --- a/src/renderer/utils/auth/loginValidation.test.ts +++ b/src/renderer/utils/auth/loginValidation.test.ts @@ -1,10 +1,10 @@ -import type { ClientID, ClientSecret, Forge, Hostname, Token } from '../../types'; +import type { ClientID, Forge, Hostname, Token } from '../../types'; import { - type OAuthAppFormData, + type CustomOAuthAppFormData, type PersonalAccessTokenFormData, summarizeLoginError, - validateOAuthAppForm, + validateCustomOAuthAppForm, validatePersonalAccessTokenForm, } from './loginValidation'; @@ -153,29 +153,34 @@ describe('renderer/utils/auth/loginValidation.ts', () => { }); }); - describe('validateOAuthAppForm', () => { - it('reports missing hostname, client ID, and client secret', () => { - const values: OAuthAppFormData = { + describe('validateCustomOAuthAppForm', () => { + it('reports missing hostname and client ID', () => { + const values: CustomOAuthAppFormData = { hostname: null as unknown as Hostname, clientId: null as unknown as ClientID, - clientSecret: null as unknown as ClientSecret, }; - expect(validateOAuthAppForm(values).hostname).toBe('Hostname is required'); - expect(validateOAuthAppForm(values).clientId).toBe('Client ID is required'); - expect(validateOAuthAppForm(values).clientSecret).toBe('Client Secret is required'); + expect(validateCustomOAuthAppForm(values).hostname).toBe('Hostname is required'); + expect(validateCustomOAuthAppForm(values).clientId).toBe('Client ID is required'); }); - it('reports invalid hostname, client ID, and client secret formats', () => { - const values: OAuthAppFormData = { + it('reports invalid hostname and client ID formats', () => { + const values: CustomOAuthAppFormData = { hostname: 'hello' as Hostname, clientId: '!@£INVALID-.1' as ClientID, - clientSecret: '!@£INVALID-.1' as ClientSecret, }; - expect(validateOAuthAppForm(values).hostname).toBe('Hostname format is invalid'); - expect(validateOAuthAppForm(values).clientId).toBe('Client ID format is invalid'); - expect(validateOAuthAppForm(values).clientSecret).toBe('Client Secret format is invalid'); + expect(validateCustomOAuthAppForm(values).hostname).toBe('Hostname format is invalid'); + expect(validateCustomOAuthAppForm(values).clientId).toBe('Client ID format is invalid'); + }); + + it('passes with a valid hostname and client ID and no client secret', () => { + const values: CustomOAuthAppFormData = { + hostname: 'github.com' as Hostname, + clientId: '1234567890_ASDFGHJKL' as ClientID, + }; + + expect(validateCustomOAuthAppForm(values)).toEqual({}); }); }); diff --git a/src/renderer/utils/auth/loginValidation.ts b/src/renderer/utils/auth/loginValidation.ts index e076f9fde..0b7db50af 100644 --- a/src/renderer/utils/auth/loginValidation.ts +++ b/src/renderer/utils/auth/loginValidation.ts @@ -1,5 +1,4 @@ -import type { Forge, Hostname, Token } from '../../types'; -import type { LoginOAuthWebOptions } from './types'; +import type { ClientID, Forge, Hostname, Token } from '../../types'; import { getAdapter } from '../forges/registry'; import { isValidHostname } from './utils'; @@ -20,14 +19,16 @@ export interface PersonalAccessTokenFormErrors { invalidCredentialsDetail?: string; } -/** OAuth app login form values — mirrors LoginOAuthWebOptions so it passes straight through. */ -export type OAuthAppFormData = LoginOAuthWebOptions; +/** Custom OAuth app login form values. */ +export interface CustomOAuthAppFormData { + hostname: Hostname; + clientId: ClientID; +} -/** OAuth app login form errors. */ -export interface OAuthAppFormErrors { +/** Custom OAuth app login form errors. */ +export interface CustomOAuthAppFormErrors { hostname?: string; clientId?: string; - clientSecret?: string; invalidCredentialsForHost?: string; } @@ -74,11 +75,11 @@ export const validatePersonalAccessTokenForm = ( return errors; }; -export const validateOAuthAppForm = ( - values: OAuthAppFormData, +export const validateCustomOAuthAppForm = ( + values: CustomOAuthAppFormData, forge: Forge = 'github', -): OAuthAppFormErrors => { - const errors: OAuthAppFormErrors = {}; +): CustomOAuthAppFormErrors => { + const errors: CustomOAuthAppFormErrors = {}; const adapter = getAdapter(forge); if (!values.hostname) { @@ -89,15 +90,9 @@ export const validateOAuthAppForm = ( if (!values.clientId) { errors.clientId = 'Client ID is required'; - } else if (!adapter.oauthWebApp?.validateClientId(values.clientId)) { + } else if (!adapter.validateClientId?.(values.clientId)) { errors.clientId = 'Client ID format is invalid'; } - if (!values.clientSecret) { - errors.clientSecret = 'Client Secret is required'; - } else if (!adapter.validateToken(values.clientSecret as unknown as Token)) { - errors.clientSecret = 'Client Secret format is invalid'; - } - return errors; }; diff --git a/src/renderer/utils/auth/state.test.ts b/src/renderer/utils/auth/state.test.ts deleted file mode 100644 index 191a792b1..000000000 --- a/src/renderer/utils/auth/state.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { generateOAuthState } from './state'; - -const UUID_V4 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; - -describe('renderer/utils/auth/state.ts', () => { - describe('generateOAuthState', () => { - it('should return a v4 UUID', () => { - expect(generateOAuthState()).toMatch(UUID_V4); - }); - - it('should return different values across calls', () => { - expect(generateOAuthState()).not.toBe(generateOAuthState()); - }); - - it('should use crypto.randomUUID', () => { - const spy = vi.spyOn(globalThis.crypto, 'randomUUID'); - generateOAuthState(); - expect(spy).toHaveBeenCalledOnce(); - spy.mockRestore(); - }); - }); -}); diff --git a/src/renderer/utils/auth/state.ts b/src/renderer/utils/auth/state.ts deleted file mode 100644 index 3b88de7c3..000000000 --- a/src/renderer/utils/auth/state.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Generate a cryptographically random OAuth 2.0 `state` value. - * - * `crypto.randomUUID()` is backed by the platform CSPRNG and yields 122 random - * bits — ample for a per-attempt, single-use value that an attacker cannot - * guess in order to bind the client to a different account. Using the platform - * primitive avoids hand-rolled random-value encoding entirely. - * - * @returns A random UUID to send as the OAuth `state` parameter. - */ -export function generateOAuthState(): string { - return crypto.randomUUID(); -} diff --git a/src/renderer/utils/auth/types.ts b/src/renderer/utils/auth/types.ts index 60654acc2..d64e6fd1d 100644 --- a/src/renderer/utils/auth/types.ts +++ b/src/renderer/utils/auth/types.ts @@ -1,6 +1,10 @@ -import type { AuthCode, ClientID, ClientSecret, Forge, Hostname, Token } from '../../types'; +import type { ClientID, Forge, Hostname, Token } from '../../types'; -export type AuthMethod = 'GitHub App' | 'GitHub CLI' | 'Personal Access Token' | 'OAuth App'; +export type AuthMethod = + | 'Gitify OAuth App' + | 'Custom OAuth App' + | 'GitHub CLI' + | 'Personal Access Token'; export type PlatformType = | 'Bitbucket Cloud' @@ -11,12 +15,6 @@ export type PlatformType = | 'GitLab Self-Managed' | 'Gitea'; -export interface LoginOAuthWebOptions { - hostname: Hostname; - clientId: ClientID; - clientSecret: ClientSecret; -} - export interface DeviceFlowSession { hostname: Hostname; clientId: ClientID; @@ -35,9 +33,3 @@ export interface LoginPersonalAccessTokenOptions { /** Defaults to GitHub when omitted. */ forge?: Forge; } - -export interface AuthResponse { - authMethod: AuthMethod; - authCode: AuthCode; - authOptions: LoginOAuthWebOptions; -} diff --git a/src/renderer/utils/forges/bitbucket/adapter.test.ts b/src/renderer/utils/forges/bitbucket/adapter.test.ts index 01a78619e..f5936d2d6 100644 --- a/src/renderer/utils/forges/bitbucket/adapter.test.ts +++ b/src/renderer/utils/forges/bitbucket/adapter.test.ts @@ -118,7 +118,7 @@ describe('renderer/utils/forges/bitbucket/adapter.ts', () => { it('returns KeyIcon for every auth method', () => { expect(bitbucketAdapter.getAuthMethodIcon('Personal Access Token')).toBe(KeyIcon); - expect(bitbucketAdapter.getAuthMethodIcon('OAuth App')).toBe(KeyIcon); + expect(bitbucketAdapter.getAuthMethodIcon('Custom OAuth App')).toBe(KeyIcon); }); }); diff --git a/src/renderer/utils/forges/gitea/adapter.test.ts b/src/renderer/utils/forges/gitea/adapter.test.ts index aa5c502f2..bc22f9c11 100644 --- a/src/renderer/utils/forges/gitea/adapter.test.ts +++ b/src/renderer/utils/forges/gitea/adapter.test.ts @@ -74,8 +74,8 @@ describe('renderer/utils/forges/gitea/adapter.ts', () => { it('returns the key icon for every auth method (PAT-only forge today)', () => { expect(giteaAdapter.getAuthMethodIcon('Personal Access Token')).toBe(KeyIcon); - expect(giteaAdapter.getAuthMethodIcon('GitHub App')).toBe(KeyIcon); - expect(giteaAdapter.getAuthMethodIcon('OAuth App')).toBe(KeyIcon); + expect(giteaAdapter.getAuthMethodIcon('Gitify OAuth App')).toBe(KeyIcon); + expect(giteaAdapter.getAuthMethodIcon('Custom OAuth App')).toBe(KeyIcon); }); }); diff --git a/src/renderer/utils/forges/github/adapter.test.ts b/src/renderer/utils/forges/github/adapter.test.ts index b1d588add..510abf19c 100644 --- a/src/renderer/utils/forges/github/adapter.test.ts +++ b/src/renderer/utils/forges/github/adapter.test.ts @@ -1,15 +1,33 @@ -import { AgentIcon, AppsIcon, CopilotIcon, KeyIcon, PersonIcon } from '@primer/octicons-react'; +vi.mock('@octokit/oauth-methods', async () => { + const actual = + await vi.importActual('@octokit/oauth-methods'); + return { + ...actual, + createDeviceCode: vi.fn(), + exchangeDeviceCode: vi.fn(), + }; +}); + +import { AgentIcon, CopilotIcon, KeyIcon, PersonIcon } from '@primer/octicons-react'; + +import { createDeviceCode } from '@octokit/oauth-methods'; + +import type { MockedFunction } from 'vite-plus/test'; import { mockGitHubCliAccount, mockGitHubCloudAccount } from '../../../__mocks__/account-mocks'; import { mockPartialGitifyNotification } from '../../../__mocks__/notifications-mocks'; -import type { GitifyNotificationUser, Hostname, Link, Token } from '../../../types'; +import type { ClientID, GitifyNotificationUser, Hostname, Link, Token } from '../../../types'; import { githubAdapter } from './adapter'; import * as client from './client'; import * as octokit from './octokit'; describe('renderer/utils/forges/github/adapter.ts', () => { + const createDeviceCodeMock = createDeviceCode as unknown as MockedFunction< + typeof createDeviceCode + >; + describe('static fields', () => { it('identifies as github', () => { expect(githubAdapter.id).toBe('github'); @@ -18,7 +36,12 @@ describe('renderer/utils/forges/github/adapter.ts', () => { it('exposes the device-flow / PAT / CLI / OAuth login methods', () => { const ids = githubAdapter.loginMethods.map((m) => m.testId); - expect(ids).toEqual(['login-github', 'login-pat', 'login-github-cli', 'login-oauth-app']); + expect(ids).toEqual([ + 'login-github', + 'login-pat', + 'login-github-cli', + 'login-custom-oauth-app', + ]); }); it('defaults the PAT hostname to github.com', () => { @@ -54,20 +77,44 @@ describe('renderer/utils/forges/github/adapter.ts', () => { }); it('maps each auth method to its icon', () => { - expect(githubAdapter.getAuthMethodIcon('GitHub App')).toBe(AppsIcon); - expect(githubAdapter.getAuthMethodIcon('OAuth App')).toBe(PersonIcon); + expect(githubAdapter.getAuthMethodIcon('Gitify OAuth App')).toBe(PersonIcon); + expect(githubAdapter.getAuthMethodIcon('Custom OAuth App')).toBe(PersonIcon); expect(githubAdapter.getAuthMethodIcon('Personal Access Token')).toBe(KeyIcon); }); - it('wires the device-flow and OAuth-app methods so the context can dispatch via the adapter', () => { - expect(githubAdapter.deviceFlow?.authMethod).toBe('GitHub App'); + it('forwards a custom client ID through the device-flow start', async () => { + createDeviceCodeMock.mockResolvedValueOnce({ + data: { + device_code: 'device-code', + user_code: 'user-code', + verification_uri: 'https://github.example.com/login/device', + expires_in: 600, + interval: 5, + }, + } as unknown as Awaited>); + + const session = await githubAdapter.deviceFlow!.start( + 'github.example.com' as Hostname, + undefined, + 'CUSTOM_CLIENT_ID_123' as ClientID, + ); + + expect(createDeviceCodeMock).toHaveBeenCalledWith({ + clientType: 'oauth-app', + clientId: 'CUSTOM_CLIENT_ID_123', + scopes: expect.anything(), + request: expect.any(Function), + }); + expect(session.clientId).toBe('CUSTOM_CLIENT_ID_123'); + }); + + it('wires the device-flow methods so the context can dispatch via the adapter', () => { + expect(githubAdapter.deviceFlow?.authMethod).toBe('Gitify OAuth App'); expect(githubAdapter.deviceFlow?.start).toBeDefined(); expect(githubAdapter.deviceFlow?.poll).toBeDefined(); expect(githubAdapter.deviceFlow?.getRevokeAccessUrl).toBeDefined(); - expect(githubAdapter.oauthWebApp?.performWebOAuth).toBeDefined(); - expect(githubAdapter.oauthWebApp?.exchangeAuthCodeForToken).toBeDefined(); - expect(githubAdapter.oauthWebApp?.validateClientId).toBeDefined(); - expect(githubAdapter.oauthWebApp?.getNewOAuthAppUrl).toBeDefined(); + expect(githubAdapter.deviceFlow?.getNewOAuthAppUrl).toBeDefined(); + expect(githubAdapter.validateClientId).toBeDefined(); }); }); diff --git a/src/renderer/utils/forges/github/adapter.ts b/src/renderer/utils/forges/github/adapter.ts index 973a2acaf..30aa84f15 100644 --- a/src/renderer/utils/forges/github/adapter.ts +++ b/src/renderer/utils/forges/github/adapter.ts @@ -1,10 +1,4 @@ -import { - AppsIcon, - KeyIcon, - MarkGithubIcon, - PersonIcon, - TerminalIcon, -} from '@primer/octicons-react'; +import { KeyIcon, MarkGithubIcon, PersonIcon, TerminalIcon } from '@primer/octicons-react'; import { Constants, OAUTH_SCOPE } from '../../../constants'; @@ -31,12 +25,7 @@ import { markNotificationThreadAsRead, } from './client'; import { enrichGitHubNotifications } from './enrich'; -import { - exchangeAuthCodeForAccessToken, - performGitHubWebOAuth, - pollGitHubDeviceFlow, - startGitHubDeviceFlow, -} from './flows'; +import { pollGitHubDeviceFlow, startGitHubDeviceFlow } from './flows'; import { createNotificationHandler } from './handlers'; import { clearOctokitClientCacheForAccount, createOctokitClient } from './octokit'; import { getGitHubPlatform } from './platform'; @@ -104,6 +93,7 @@ export const githubAdapter: ForgeAdapter = { defaultHostname: Constants.GITHUB_HOSTNAME, validateToken: isValidToken, + validateClientId: isValidClientId, validateHostname: isValidHostname, getPersonalAccessTokenSettingsUrl: getNewTokenURL, documentationUrl: Constants.GITHUB_DOCS.PAT_URL as Link, @@ -116,7 +106,7 @@ export const githubAdapter: ForgeAdapter = { label: 'GitHub', variant: 'primary', route: '/login/github/device-flow', - authMethod: 'GitHub App', + authMethod: 'Gitify OAuth App', }, { testId: 'login-pat', @@ -133,26 +123,20 @@ export const githubAdapter: ForgeAdapter = { authMethod: 'GitHub CLI', }, { - testId: 'login-oauth-app', + testId: 'login-custom-oauth-app', icon: PersonIcon, - label: 'OAuth App', - route: '/login/github/oauth-app', - authMethod: 'OAuth App', + label: 'Custom OAuth App', + route: '/login/github/custom-oauth-app', + authMethod: 'Custom OAuth App', }, ], deviceFlow: { - authMethod: 'GitHub App', + authMethod: 'Gitify OAuth App', start: startGitHubDeviceFlow, poll: pollGitHubDeviceFlow, - getRevokeAccessUrl: (hostname) => - getDeveloperSettingsURL({ hostname, method: 'GitHub App' } as Account), - }, - - oauthWebApp: { - performWebOAuth: performGitHubWebOAuth, - exchangeAuthCodeForToken: exchangeAuthCodeForAccessToken, - validateClientId: isValidClientId, + getRevokeAccessUrl: (hostname, clientId) => + getDeveloperSettingsURL({ hostname, method: 'Custom OAuth App', clientId } as Account), getNewOAuthAppUrl: getNewOAuthAppURL, }, @@ -231,12 +215,11 @@ function accountHasScopes( function githubAuthMethodIcon(method: AuthMethod) { switch (method) { - case 'GitHub App': - return AppsIcon; + case 'Gitify OAuth App': + case 'Custom OAuth App': + return PersonIcon; case 'GitHub CLI': return TerminalIcon; - case 'OAuth App': - return PersonIcon; default: return KeyIcon; } diff --git a/src/renderer/utils/forges/github/auth.test.ts b/src/renderer/utils/forges/github/auth.test.ts index 618bc917f..07e5442d6 100644 --- a/src/renderer/utils/forges/github/auth.test.ts +++ b/src/renderer/utils/forges/github/auth.test.ts @@ -61,22 +61,32 @@ describe('renderer/utils/forges/github/auth.ts', () => { }); describe('getDeveloperSettingsURL', () => { - it('returns the GitHub App connections URL', () => { + it('returns the connections URL for Gitify OAuth App accounts', () => { expect( getDeveloperSettingsURL({ hostname: 'github.com' as Hostname, - method: 'GitHub App', + method: 'Gitify OAuth App', } as Account), ).toBe('https://github.com/settings/connections/applications/FAKE_CLIENT_ID_123'); }); - it('returns the OAuth App developer URL', () => { + it("returns the connections URL for a custom app's own client ID", () => { expect( getDeveloperSettingsURL({ hostname: 'github.com' as Hostname, - method: 'OAuth App', + method: 'Custom OAuth App', + clientId: 'CUSTOM_CLIENT_ID_123' as ClientID, } as Account), - ).toBe('https://github.com/settings/developers'); + ).toBe('https://github.com/settings/connections/applications/CUSTOM_CLIENT_ID_123'); + }); + + it('falls back to the preconfigured app when a custom account stores no client ID', () => { + expect( + getDeveloperSettingsURL({ + hostname: 'github.com' as Hostname, + method: 'Custom OAuth App', + } as Account), + ).toBe('https://github.com/settings/connections/applications/FAKE_CLIENT_ID_123'); }); it('returns the PAT settings URL', () => { @@ -132,6 +142,10 @@ describe('renderer/utils/forges/github/auth.ts', () => { ), ).toBeTruthy(); }); + + it('does not pre-fill a callback URL for a device-flow custom app', () => { + expect(getNewOAuthAppURL('github.com' as Hostname)).not.toContain('callback_url'); + }); }); describe('isValidClientId', () => { diff --git a/src/renderer/utils/forges/github/auth.ts b/src/renderer/utils/forges/github/auth.ts index 99915c750..c1a155f9d 100644 --- a/src/renderer/utils/forges/github/auth.ts +++ b/src/renderer/utils/forges/github/auth.ts @@ -62,9 +62,9 @@ export function getGitHubAuthBaseUrl(hostname: Hostname): URL { /** * Return the GitHub developer settings URL appropriate for the account's auth method. * - * - GitHub App → application connections page + * - Gitify OAuth App / Custom OAuth App → the OAuth app's connection page for the + * account's own client ID (falling back to Gitify's preconfigured app) * - GitHub CLI → authorized applications page - * - OAuth App → developer settings page * - Personal Access Token → tokens settings page * * @param account - The account whose settings URL to build. @@ -74,15 +74,15 @@ export function getDeveloperSettingsURL(account: Account): Link { const settingsURL = new URL(`https://${account.hostname}`); switch (account.method) { - case 'GitHub App': - settingsURL.pathname = `/settings/connections/applications/${Constants.OAUTH_DEVICE_FLOW_CLIENT_ID}`; + case 'Gitify OAuth App': + case 'Custom OAuth App': + settingsURL.pathname = `/settings/connections/applications/${ + account.clientId ?? Constants.OAUTH_DEVICE_FLOW_CLIENT_ID + }`; break; case 'GitHub CLI': settingsURL.pathname = '/settings/applications'; break; - case 'OAuth App': - settingsURL.pathname = '/settings/developers'; - break; case 'Personal Access Token': settingsURL.pathname = '/settings/tokens'; break; @@ -115,8 +115,10 @@ export function getNewTokenURL(hostname: Hostname): Link { /** * Build a pre-filled URL for registering a new OAuth App. * - * Pre-populates the app name (with creation date), homepage URL, and - * the `gitify://oauth` callback URL. + * Pre-populates the app name (with creation date) and homepage URL. No callback + * URL is set: the custom OAuth app authorizes through the device flow, which + * needs no browser redirect. The user must still enable the device flow in the + * app's settings after registering it. * * @param hostname - The GitHub hostname to register the app on. * @returns The URL with pre-filled query parameters. @@ -129,7 +131,6 @@ export function getNewOAuthAppURL(hostname: Hostname): Link { `${APPLICATION.NAME} (Created on ${date})`, ); newOAuthAppURL.searchParams.append('oauth_application[url]', 'https://gitify.io'); - newOAuthAppURL.searchParams.append('oauth_application[callback_url]', 'gitify://oauth'); return newOAuthAppURL.toString() as Link; } diff --git a/src/renderer/utils/forges/github/flows.test.ts b/src/renderer/utils/forges/github/flows.test.ts index e9adc14fb..5f672853f 100644 --- a/src/renderer/utils/forges/github/flows.test.ts +++ b/src/renderer/utils/forges/github/flows.test.ts @@ -6,23 +6,21 @@ vi.mock('@octokit/oauth-methods', async () => { ...actual, createDeviceCode: vi.fn(), exchangeDeviceCode: vi.fn(), - exchangeWebFlowCode: vi.fn(), }; }); -import { createDeviceCode, exchangeDeviceCode, exchangeWebFlowCode } from '@octokit/oauth-methods'; +import { createDeviceCode, exchangeDeviceCode } from '@octokit/oauth-methods'; import { RequestError } from '@octokit/request-error'; import type { MockedFunction } from 'vite-plus/test'; import { Constants } from '../../../constants'; -import type { AuthCode, ClientID, ClientSecret, Hostname } from '../../../types'; -import type { DeviceFlowSession, LoginOAuthWebOptions } from '../../auth/types'; +import type { ClientID, Hostname } from '../../../types'; +import type { DeviceFlowSession } from '../../auth/types'; import { getRecommendedScopeNames } from '../../auth/scopes'; import * as logger from '../../core/logger'; -import * as comms from '../../system/comms'; import * as flows from './flows'; const createDeviceCodeMock = createDeviceCode as unknown as MockedFunction; @@ -31,327 +29,189 @@ const exchangeDeviceCodeMock = exchangeDeviceCode as unknown as MockedFunction< typeof exchangeDeviceCode >; -const exchangeWebFlowCodeMock = exchangeWebFlowCode as unknown as MockedFunction< - typeof exchangeWebFlowCode ->; - describe('renderer/utils/forges/github/flows.ts', () => { - vi.spyOn(logger, 'rendererLogInfo').mockImplementation(vi.fn()); const rendererLogErrorSpy = vi.spyOn(logger, 'rendererLogError').mockImplementation(vi.fn()); - const rendererLogWarnSpy = vi.spyOn(logger, 'rendererLogWarn').mockImplementation(vi.fn()); - const openExternalLinkSpy = vi.spyOn(comms, 'openExternalLink').mockImplementation(vi.fn()); beforeEach(() => { // Mock OAUTH_DEVICE_FLOW_CLIENT_ID value Constants.OAUTH_DEVICE_FLOW_CLIENT_ID = 'FAKE_CLIENT_ID_123' as ClientID; }); - describe('Gitify GitHub OAuth - Device Code Flow', () => { - describe('startGitHubDeviceFlow', () => { - it('should request a device code and return a session', async () => { - createDeviceCodeMock.mockResolvedValueOnce({ - data: { - device_code: 'device-code-xyz', - user_code: 'user-code-xyz', - verification_uri: 'https://github.com/login/device', - expires_in: 600, - interval: 5, - }, - } as unknown as Awaited>); - - const session = await flows.startGitHubDeviceFlow(); - - expect(createDeviceCodeMock).toHaveBeenCalledWith({ - clientType: 'oauth-app', - clientId: 'FAKE_CLIENT_ID_123', - scopes: getRecommendedScopeNames(), - request: expect.any(Function), - }); - - expect(session.deviceCode).toBe('device-code-xyz'); - expect(session.userCode).toBe('user-code-xyz'); - expect(session.verificationUri).toBe('https://github.com/login/device'); - expect(session.intervalSeconds).toBe(5); - expect(session.expiresAt).toBeGreaterThan(Date.now()); - }); - }); - - describe('pollGitHubDeviceFlow', () => { - const baseSession = { - hostname: 'github.com', - clientId: 'FAKE_CLIENT_ID_123', - deviceCode: 'device-code', - userCode: 'user-code', - verificationUri: 'https://github.com/login/device', - intervalSeconds: 5, - expiresAt: Date.now() + 10000, - } as const; - - it('returns token on successful exchange', async () => { - exchangeDeviceCodeMock.mockResolvedValueOnce({ - authentication: { token: 'device-token-xyz' }, - } as unknown as Awaited>); - - const token = await flows.pollGitHubDeviceFlow(baseSession as DeviceFlowSession); - - expect(exchangeDeviceCodeMock).toHaveBeenCalledWith({ - clientType: 'oauth-app', - clientId: 'FAKE_CLIENT_ID_123', - code: 'device-code', - request: expect.any(Function), - }); - - expect(token).toBe('device-token-xyz'); - }); - - it('returns null and does not change interval when authorization is pending', async () => { - const pendingErr = Object.create(RequestError.prototype); - pendingErr.response = { data: { error: 'authorization_pending' } }; - - exchangeDeviceCodeMock.mockRejectedValueOnce(pendingErr); + describe('startGitHubDeviceFlow', () => { + it('should request a device code and return a session', async () => { + createDeviceCodeMock.mockResolvedValueOnce({ + data: { + device_code: 'device-code-xyz', + user_code: 'user-code-xyz', + verification_uri: 'https://github.com/login/device', + expires_in: 600, + interval: 5, + }, + } as unknown as Awaited>); - const session = { ...baseSession } as DeviceFlowSession; - const token = await flows.pollGitHubDeviceFlow(session); + const session = await flows.startGitHubDeviceFlow(); - expect(token).toBeNull(); - expect(session.intervalSeconds).toBe(5); + expect(createDeviceCodeMock).toHaveBeenCalledWith({ + clientType: 'oauth-app', + clientId: 'FAKE_CLIENT_ID_123', + scopes: getRecommendedScopeNames(), + request: expect.any(Function), }); - it('returns null and increases interval by 5 when slow_down', async () => { - const slowDownErr = Object.create(RequestError.prototype); - slowDownErr.response = { data: { error: 'slow_down' } }; - - exchangeDeviceCodeMock.mockRejectedValueOnce(slowDownErr); - - const session = { ...baseSession } as DeviceFlowSession; - const token = await flows.pollGitHubDeviceFlow(session); - - expect(token).toBeNull(); - expect(session.intervalSeconds).toBe(10); - }); + expect(session.deviceCode).toBe('device-code-xyz'); + expect(session.userCode).toBe('user-code-xyz'); + expect(session.verificationUri).toBe('https://github.com/login/device'); + expect(session.intervalSeconds).toBe(5); + expect(session.expiresAt).toBeGreaterThan(Date.now()); + }); - it('throws on other errors', async () => { - const otherErr = new Error('boom'); + it('authorizes a supplied custom OAuth app client ID', async () => { + createDeviceCodeMock.mockResolvedValueOnce({ + data: { + device_code: 'device-code-xyz', + user_code: 'user-code-xyz', + verification_uri: 'https://github.example.com/login/device', + expires_in: 600, + interval: 5, + }, + } as unknown as Awaited>); - exchangeDeviceCodeMock.mockRejectedValueOnce(otherErr); + const session = await flows.startGitHubDeviceFlow( + 'github.example.com' as Hostname, + getRecommendedScopeNames(), + 'CUSTOM_CLIENT_ID_123' as ClientID, + ); - await expect( - async () => await flows.pollGitHubDeviceFlow(baseSession as DeviceFlowSession), - ).rejects.toThrow('boom'); - expect(rendererLogErrorSpy).toHaveBeenCalledTimes(1); + expect(createDeviceCodeMock).toHaveBeenCalledWith({ + clientType: 'oauth-app', + clientId: 'CUSTOM_CLIENT_ID_123', + scopes: getRecommendedScopeNames(), + request: expect.any(Function), }); + expect(session.clientId).toBe('CUSTOM_CLIENT_ID_123'); + expect(session.hostname).toBe('github.example.com'); }); }); - describe('performGitHubWebOAuth', () => { - const webAuthOptions: LoginOAuthWebOptions = { - hostname: 'github.com' as Hostname, - clientId: 'FAKE_CLIENT_ID_123' as ClientID, - clientSecret: 'FAKE_CLIENT_SECRET_123' as ClientSecret, - }; - - it('should call performGitHubWebOAuth using custom oauth app - success oauth flow', async () => { - let deliverCallback: (callbackUrl: string) => void = () => {}; - window.gitify.onAuthCallback = vi.fn().mockImplementation((callback) => { - deliverCallback = callback; - }); - - const resultPromise = flows.performGitHubWebOAuth({ - clientId: 'BYO_CLIENT_ID' as ClientID, - clientSecret: 'BYO_CLIENT_SECRET' as ClientSecret, - hostname: 'my.git.com' as Hostname, + describe('pollGitHubDeviceFlow', () => { + const baseSession = { + hostname: 'github.com', + clientId: 'FAKE_CLIENT_ID_123', + deviceCode: 'device-code', + userCode: 'user-code', + verificationUri: 'https://github.com/login/device', + intervalSeconds: 5, + expiresAt: Date.now() + 10000, + } as const; + + it('returns token on successful exchange', async () => { + exchangeDeviceCodeMock.mockResolvedValueOnce({ + authentication: { token: 'device-token-xyz' }, + } as unknown as Awaited>); + + const token = await flows.pollGitHubDeviceFlow(baseSession as DeviceFlowSession); + + expect(exchangeDeviceCodeMock).toHaveBeenCalledWith({ + clientType: 'oauth-app', + clientId: 'FAKE_CLIENT_ID_123', + code: 'device-code', + request: expect.any(Function), }); - expect(openExternalLinkSpy).toHaveBeenCalledTimes(1); - expect(openExternalLinkSpy).toHaveBeenCalledWith( - expect.stringContaining( - 'https://my.git.com/login/oauth/authorize?allow_signup=false&client_id=BYO_CLIENT_ID&scope=notifications%2Cread%3Auser%2Crepo', - ), - ); - - // The authorization URL must carry a per-attempt state, and the login - // only completes when the callback echoes that same value back. - const authorizeUrl = new URL(openExternalLinkSpy.mock.calls[0][0] as string); - const state = authorizeUrl.searchParams.get('state'); - expect(state).toBeTruthy(); - - deliverCallback(`gitify://oauth?code=123-456&state=${state}`); - - const res = await resultPromise; - - expect(window.gitify.onAuthCallback).toHaveBeenCalledTimes(1); - expect(window.gitify.onAuthCallback).toHaveBeenCalledWith(expect.any(Function)); - - expect(res.authMethod).toBe('OAuth App'); - expect(res.authCode).toBe('123-456'); + expect(token).toBe('device-token-xyz'); }); - it('does not resolve when the callback state does not match the generated state', async () => { - let deliverCallback: (callbackUrl: string) => void = () => {}; - window.gitify.onAuthCallback = vi.fn().mockImplementation((callback) => { - deliverCallback = callback; - }); - - let resolved = false; - const resultPromise = flows.performGitHubWebOAuth(webAuthOptions).then((res) => { - resolved = true; - return res; + it("uses the session's own client ID when polling a custom app", async () => { + exchangeDeviceCodeMock.mockResolvedValueOnce({ + authentication: { token: 'custom-token' }, + } as unknown as Awaited>); + + const token = await flows.pollGitHubDeviceFlow({ + ...baseSession, + clientId: 'CUSTOM_CLIENT_ID_123', + } as DeviceFlowSession); + + expect(exchangeDeviceCodeMock).toHaveBeenCalledWith({ + clientType: 'oauth-app', + clientId: 'CUSTOM_CLIENT_ID_123', + code: 'device-code', + request: expect.any(Function), }); + expect(token).toBe('custom-token'); + }); - const authorizeUrl = new URL(openExternalLinkSpy.mock.calls[0][0] as string); - const state = authorizeUrl.searchParams.get('state'); + it('returns null and does not change interval when authorization is pending', async () => { + const pendingErr = Object.create(RequestError.prototype); + pendingErr.response = { data: { error: 'authorization_pending' } }; - deliverCallback('gitify://oauth?code=attacker-code&state=not-the-real-state'); - deliverCallback('gitify://oauth?code=attacker-code-no-state'); + exchangeDeviceCodeMock.mockRejectedValueOnce(pendingErr); - // Give any pending microtasks a chance to run, then confirm neither - // injected callback settled the login. - await Promise.resolve(); - await Promise.resolve(); - expect(resolved).toBe(false); - expect(rendererLogWarnSpy).toHaveBeenCalledTimes(2); + const session = { ...baseSession } as DeviceFlowSession; + const token = await flows.pollGitHubDeviceFlow(session); - // The still-pending attempt completes once the matching state arrives. - deliverCallback(`gitify://oauth?code=the-real-code&state=${state}`); - const res = await resultPromise; - expect(res.authCode).toBe('the-real-code'); + expect(token).toBeNull(); + expect(session.intervalSeconds).toBe(5); }); - it('ignores an unparseable callback URL instead of tearing down the pending login', async () => { - let deliverCallback: (callbackUrl: string) => void = () => {}; - window.gitify.onAuthCallback = vi.fn().mockImplementation((callback) => { - deliverCallback = callback; - }); - - let settled = false; - const resultPromise = flows.performGitHubWebOAuth(webAuthOptions).then( - (res) => { - settled = true; - return res; - }, - (err: unknown) => { - settled = true; - throw err; - }, - ); - - // `gitify://[` passes the protocol handler's `gitify://` prefix check but - // is not a parseable URL, so it must be ignored rather than rejecting the - // login before the state is ever compared. - deliverCallback('gitify://['); + it('returns null and increases interval by 5 when slow_down', async () => { + const slowDownErr = Object.create(RequestError.prototype); + slowDownErr.response = { data: { error: 'slow_down' } }; - await Promise.resolve(); - await Promise.resolve(); - expect(settled).toBe(false); - expect(rendererLogWarnSpy).toHaveBeenCalledTimes(1); + exchangeDeviceCodeMock.mockRejectedValueOnce(slowDownErr); - // Settle the still-pending attempt so no listener is left dangling. - const authorizeUrl = new URL(openExternalLinkSpy.mock.calls[0][0] as string); - const state = authorizeUrl.searchParams.get('state'); - deliverCallback(`gitify://oauth?code=real-code&state=${state}`); + const session = { ...baseSession } as DeviceFlowSession; + const token = await flows.pollGitHubDeviceFlow(session); - await expect(resultPromise).resolves.toMatchObject({ authCode: 'real-code' }); + expect(token).toBeNull(); + expect(session.intervalSeconds).toBe(10); }); - it('should call performGitHubWebOAuth - failure', async () => { - let deliverCallback: (callbackUrl: string) => void = () => {}; - window.gitify.onAuthCallback = vi.fn().mockImplementation((callback) => { - deliverCallback = callback; - }); + it('throws on other errors', async () => { + const otherErr = new Error('boom'); - const resultPromise = flows.performGitHubWebOAuth(webAuthOptions); + exchangeDeviceCodeMock.mockRejectedValueOnce(otherErr); - const authorizeUrl = new URL(openExternalLinkSpy.mock.calls[0][0] as string); - const state = authorizeUrl.searchParams.get('state'); + await expect( + async () => await flows.pollGitHubDeviceFlow(baseSession as DeviceFlowSession), + ).rejects.toThrow('boom'); + expect(rendererLogErrorSpy).toHaveBeenCalledTimes(1); + }); + }); - deliverCallback( - `gitify://oauth?state=${state}&error=invalid_request&error_description=The+redirect_uri+is+missing+or+invalid.&error_uri=https://docs.github.com/en/developers/apps/troubleshooting-oauth-errors`, - ); + describe('describeDeviceFlowError', () => { + it('explains how to enable device flow for a custom app', () => { + const err = Object.create(RequestError.prototype); + err.response = { data: { error: 'device_flow_disabled' } }; - await expect(resultPromise).rejects.toEqual( - new Error( - "Oops! Something went wrong and we couldn't log you in using GitHub. Please try again. Reason: The redirect_uri is missing or invalid. Docs: https://docs.github.com/en/developers/apps/troubleshooting-oauth-errors", - ), + const message = flows.describeDeviceFlowError( + err, + 'github.example.com' as Hostname, + 'CUSTOM_CLIENT_ID_123' as ClientID, ); - expect(openExternalLinkSpy).toHaveBeenCalledTimes(1); - expect(openExternalLinkSpy).toHaveBeenCalledWith( - expect.stringContaining( - 'https://github.com/login/oauth/authorize?allow_signup=false&client_id=FAKE_CLIENT_ID_123&scope=notifications%2Cread%3Auser%2Crepo', - ), + expect(message).toContain('Device flow is not enabled'); + expect(message).toContain( + 'https://github.example.com/settings/applications/CUSTOM_CLIENT_ID_123', ); - - expect(window.gitify.onAuthCallback).toHaveBeenCalledTimes(1); - expect(window.gitify.onAuthCallback).toHaveBeenCalledWith(expect.any(Function)); }); - it('ignores a callback error whose state does not match the attempt', async () => { - let deliverCallback: (callbackUrl: string) => void = () => {}; - window.gitify.onAuthCallback = vi.fn().mockImplementation((callback) => { - deliverCallback = callback; - }); - - let settled = false; - const resultPromise = flows.performGitHubWebOAuth(webAuthOptions).then( - (res) => { - settled = true; - return res; - }, - (err: unknown) => { - settled = true; - throw err; - }, - ); - - deliverCallback('gitify://oauth?error=access_denied'); - deliverCallback('gitify://oauth?error=access_denied&state=not-the-real-state'); - - await Promise.resolve(); - await Promise.resolve(); - expect(settled).toBe(false); - expect(rendererLogWarnSpy).toHaveBeenCalledTimes(2); + it('names an unrecognized client ID as invalid for the host', () => { + const err = Object.create(RequestError.prototype); + err.response = { data: { error: 'incorrect_client_credentials' } }; - // Settle the still-pending attempt so no listener is left dangling. - const authorizeUrl = new URL(openExternalLinkSpy.mock.calls[0][0] as string); - const state = authorizeUrl.searchParams.get('state'); - deliverCallback(`gitify://oauth?code=real-code&state=${state}`); - - await expect(resultPromise).resolves.toMatchObject({ authCode: 'real-code' }); + expect( + flows.describeDeviceFlowError( + err, + 'github.example.com' as Hostname, + 'CUSTOM_CLIENT_ID_123' as ClientID, + ), + ).toBe('The client ID is not valid for github.example.com. Check it and try again.'); }); - describe('exchangeAuthCodeForAccessToken', () => { - const authCode = '123-456' as AuthCode; - - it('should exchange auth code for access token', async () => { - exchangeWebFlowCodeMock.mockResolvedValueOnce({ - authentication: { - token: 'this-is-a-token', - }, - } as unknown as Awaited>); - - const res = await flows.exchangeAuthCodeForAccessToken(authCode, { - ...webAuthOptions, - }); - - expect(exchangeWebFlowCodeMock).toHaveBeenCalledWith({ - clientType: 'oauth-app', - clientId: 'FAKE_CLIENT_ID_123', - clientSecret: 'FAKE_CLIENT_SECRET_123', - code: '123-456', - request: expect.any(Function), - }); - expect(res).toBe('this-is-a-token'); - }); - - it('should throw when client secret is missing', async () => { - await expect( - async () => - await flows.exchangeAuthCodeForAccessToken(authCode, { - ...webAuthOptions, - clientSecret: undefined as unknown as ClientSecret, - }), - ).rejects.toThrow('clientSecret is required to exchange an auth code'); - }); + it('returns undefined for a non-RequestError', () => { + expect( + flows.describeDeviceFlowError(new Error('boom'), 'github.com' as Hostname), + ).toBeUndefined(); }); }); }); diff --git a/src/renderer/utils/forges/github/flows.ts b/src/renderer/utils/forges/github/flows.ts index 6b7fe1d22..4c74211f2 100644 --- a/src/renderer/utils/forges/github/flows.ts +++ b/src/renderer/utils/forges/github/flows.ts @@ -1,21 +1,14 @@ -import { - createDeviceCode, - exchangeDeviceCode, - exchangeWebFlowCode, - getWebFlowAuthorizationUrl, -} from '@octokit/oauth-methods'; +import { createDeviceCode, exchangeDeviceCode } from '@octokit/oauth-methods'; import { request } from '@octokit/request'; import { RequestError } from '@octokit/request-error'; import { Constants } from '../../../constants'; -import type { AuthCode, Hostname, Link, Token } from '../../../types'; -import type { AuthResponse, DeviceFlowSession, LoginOAuthWebOptions } from '../../auth/types'; +import type { ClientID, Hostname, Token } from '../../../types'; +import type { DeviceFlowSession } from '../../auth/types'; import { getRecommendedScopeNames } from '../../auth/scopes'; -import { generateOAuthState } from '../../auth/state'; -import { rendererLogError, rendererLogInfo, rendererLogWarn, toError } from '../../core/logger'; -import { openExternalLink } from '../../system/comms'; +import { rendererLogError, toError } from '../../core/logger'; import { getGitHubAuthBaseUrl } from './auth'; type DeviceFlowErrorResponse = { @@ -24,115 +17,6 @@ type DeviceFlowErrorResponse = { error_uri: string; }; -/** - * Initiate a GitHub OAuth Web Flow (OAuth App) authentication. - * - * Opens the GitHub authorization URL in the user's browser, then waits for the - * app's custom `gitify://oauth` callback to receive the authorization code. - * - * The login is bound to a per-attempt random `state` that is sent with the - * authorization request and must be echoed by the callback. A callback - * carrying a missing or mismatched `state` is logged and ignored, so a - * `gitify://oauth` link delivered from outside this attempt cannot bind the - * client to a different GitHub account or tear down the pending login. - * - * @param authOptions - The OAuth App client configuration and target hostname. - * @returns Resolves with the authorization code and options on success. - */ -export function performGitHubWebOAuth(authOptions: LoginOAuthWebOptions): Promise { - return new Promise((resolve, reject) => { - // A per-attempt, unguessable value this app itself tracks and checks on - // callback, so a `gitify://oauth` callback carrying an authorization code - // this specific login attempt never requested (e.g. one an attacker - // obtained for their own GitHub account) is rejected instead of silently - // accepted and exchanged for a token. - // - // Read the state back from the library's result rather than trusting the - // value echoed to us, so the string compared on callback is exactly the one - // the library embedded in the authorization URL. - const { url, state: expectedState } = getWebFlowAuthorizationUrl({ - clientType: 'oauth-app', - clientId: authOptions.clientId, - scopes: getRecommendedScopeNames(), - allowSignup: false, - state: generateOAuthState(), - request: request.defaults({ - baseUrl: `https://${authOptions.hostname}`, - }), - }); - - openExternalLink(url as Link); - - // Assigned once the listener is registered below; optional-chained in - // `handleCallback` so a synchronously-firing callback cannot hit the - // temporal dead zone. - let unsubscribeAuthCallback: (() => void) | undefined; - - const handleCallback = (callbackUrl: string) => { - let url: URL; - try { - url = new URL(callbackUrl); - } catch { - // An unparseable callback cannot carry the state this attempt - // generated, so treat it like any other unmatched callback: log and - // ignore rather than tearing down the pending login. Otherwise a - // forged `gitify://` URL (e.g. `gitify://[`) would abort a legitimate - // login even though the state check never runs. - rendererLogWarn( - 'renderer:auth-callback', - 'Ignored an unparseable authentication callback URL', - ); - return; - } - - const type = url.hostname; - const code = url.searchParams.get('code'); - const state = url.searchParams.get('state'); - const error = url.searchParams.get('error'); - const errorDescription = url.searchParams.get('error_description'); - const errorUri = url.searchParams.get('error_uri'); - - // A callback belongs to this login attempt only when it echoes the state - // this attempt generated. Anything else (missing or mismatched state) is - // logged and ignored, leaving the pending login intact so an injected - // callback can neither bind another account nor tear down the attempt. - if (state !== expectedState) { - rendererLogWarn( - 'renderer:auth-callback', - 'Ignored an authentication callback with a missing or mismatched state parameter', - ); - return; - } - - if (code && type === 'oauth') { - unsubscribeAuthCallback?.(); - resolve({ - authMethod: 'OAuth App', - authCode: code as AuthCode, - authOptions: authOptions, - }); - } else if (error) { - unsubscribeAuthCallback?.(); - reject( - new Error( - `Oops! Something went wrong and we couldn't log you in using GitHub. Please try again. Reason: ${errorDescription} Docs: ${errorUri}`, - ), - ); - } - }; - - // Unsubscribed inside `handleCallback` once the flow settles so repeated - // login attempts do not accumulate stale ipcRenderer listeners. - unsubscribeAuthCallback = window.gitify.onAuthCallback((callbackUrl: string) => { - rendererLogInfo( - 'renderer:auth-callback', - `received authentication callback URL ${callbackUrl}`, - ); - handleCallback(callbackUrl); - }); - }); -} - /** * Start a GitHub Device Flow authorization session. * @@ -141,15 +25,18 @@ export function performGitHubWebOAuth(authOptions: LoginOAuthWebOptions): Promis * * @param hostname - The GitHub hostname to authenticate against. Defaults to github.com. * @param scopes - Array of scope names to request. Defaults to recommended (full) scopes. + * @param clientId - The OAuth app client ID to authorize with. Defaults to Gitify's + * own preconfigured app; a user-supplied custom app passes its own. * @returns The device flow session data. */ export async function startGitHubDeviceFlow( hostname: Hostname = Constants.GITHUB_HOSTNAME, scopes: string[] = getRecommendedScopeNames(), + clientId: ClientID = Constants.OAUTH_DEVICE_FLOW_CLIENT_ID, ): Promise { const deviceCode = await createDeviceCode({ clientType: 'oauth-app' as const, - clientId: Constants.OAUTH_DEVICE_FLOW_CLIENT_ID, + clientId: clientId, scopes: scopes, request: request.defaults({ baseUrl: getGitHubAuthBaseUrl(hostname).toString(), @@ -158,7 +45,7 @@ export async function startGitHubDeviceFlow( return { hostname: hostname, - clientId: Constants.OAUTH_DEVICE_FLOW_CLIENT_ID, + clientId: clientId, deviceCode: deviceCode.data.device_code, userCode: deviceCode.data.user_code, verificationUri: deviceCode.data.verification_uri, @@ -167,6 +54,42 @@ export async function startGitHubDeviceFlow( } as DeviceFlowSession; } +/** + * Describe a device-flow start failure in actionable terms. + * + * A device flow can only start when the app has device flow enabled and the + * client ID is known to the host. Both are common setup mistakes for a + * user-supplied custom app, so they are surfaced with a named cause and fix + * instead of a raw transport error. + * + * @param err - The error thrown while starting the device flow. + * @param hostname - The host the session was started against. + * @param clientId - The client ID supplied for a custom app, when any. + * @returns A user-facing message, or `undefined` for an unrecognised failure. + */ +export function describeDeviceFlowError( + err: unknown, + hostname: Hostname, + clientId?: ClientID, +): string | undefined { + if (!(err instanceof RequestError)) { + return undefined; + } + + const errorCode = (err.response?.data as Partial | undefined)?.error; + + switch (errorCode) { + case 'device_flow_disabled': + return clientId + ? `Device flow is not enabled for this OAuth app. Enable it in that app's settings at https://${hostname}/settings/applications/${clientId}, then try again.` + : `Device flow is not enabled for this OAuth app. Enable it in the app's settings on ${hostname}, then try again.`; + case 'incorrect_client_credentials': + return `The client ID is not valid for ${hostname}. Check it and try again.`; + default: + return undefined; + } +} + /** * Poll GitHub to exchange a device code for an access token. * @@ -209,35 +132,3 @@ export async function pollGitHubDeviceFlow(session: DeviceFlowSession): Promise< throw err; } } - -/** - * Exchange an OAuth authorization code for an access token. - * - * `authOptions.clientSecret` is required; this step must be performed - * server-side or in a trusted context to keep the secret confidential. - * - * @param authCode - The authorization code received from the OAuth callback. - * @param authOptions - The OAuth App options, including the client secret. - * @returns The access token. - * @throws If `clientSecret` is absent. - */ -export async function exchangeAuthCodeForAccessToken( - authCode: AuthCode, - authOptions: LoginOAuthWebOptions, -): Promise { - if (!authOptions.clientSecret) { - throw new Error('clientSecret is required to exchange an auth code'); - } - - const { authentication } = await exchangeWebFlowCode({ - clientType: 'oauth-app', - clientId: authOptions.clientId, - clientSecret: authOptions.clientSecret, - code: authCode, - request: request.defaults({ - baseUrl: getGitHubAuthBaseUrl(authOptions.hostname).toString().replace(/\/$/, ''), - }), - }); - - return authentication.token as Token; -} diff --git a/src/renderer/utils/forges/github/octokit.test.ts b/src/renderer/utils/forges/github/octokit.test.ts index 588c468f4..da1a96693 100644 --- a/src/renderer/utils/forges/github/octokit.test.ts +++ b/src/renderer/utils/forges/github/octokit.test.ts @@ -1,5 +1,5 @@ import { - mockGitHubAppAccount, + mockGitifyOAuthAppAccount, mockGitHubCliAccount, mockGitHubCloudAccount, mockGitHubEnterpriseServerAccount, @@ -113,7 +113,7 @@ describe('renderer/utils/forges/github/octokit.ts', () => { const getGitHubAPIBaseUrlSpy = vi.spyOn(utils, 'getGitHubAPIBaseUrl'); getGitHubAPIBaseUrlSpy.mockReturnValue(new URL('https://api.github.com/')); - const octokit1 = await createOctokitClient(mockGitHubAppAccount, 'rest'); + const octokit1 = await createOctokitClient(mockGitifyOAuthAppAccount, 'rest'); const octokit2 = await createOctokitClient(mockGitHubCloudAccount, 'rest'); diff --git a/src/renderer/utils/forges/gitlab/adapter.test.ts b/src/renderer/utils/forges/gitlab/adapter.test.ts index 1f2ddeddd..275faca28 100644 --- a/src/renderer/utils/forges/gitlab/adapter.test.ts +++ b/src/renderer/utils/forges/gitlab/adapter.test.ts @@ -83,7 +83,7 @@ describe('renderer/utils/forges/gitlab/adapter.ts', () => { it('returns the key icon for every auth method (PAT-only forge today)', () => { expect(gitlabAdapter.getAuthMethodIcon('Personal Access Token')).toBe(KeyIcon); - expect(gitlabAdapter.getAuthMethodIcon('OAuth App')).toBe(KeyIcon); + expect(gitlabAdapter.getAuthMethodIcon('Custom OAuth App')).toBe(KeyIcon); }); it('omits the oauthScopes bundle', () => { diff --git a/src/renderer/utils/forges/types.ts b/src/renderer/utils/forges/types.ts index 745d472d6..96d778c0c 100644 --- a/src/renderer/utils/forges/types.ts +++ b/src/renderer/utils/forges/types.ts @@ -4,7 +4,7 @@ import type { OcticonProps } from '@primer/octicons-react'; import type { Account, - AuthCode, + ClientID, Forge, Hostname, IconColor, @@ -14,13 +14,7 @@ import type { Token, UserType, } from '../../types'; -import type { - AuthMethod, - AuthResponse, - DeviceFlowSession, - LoginOAuthWebOptions, - PlatformType, -} from '../auth/types'; +import type { AuthMethod, DeviceFlowSession, PlatformType } from '../auth/types'; /** * Capability flags exposed by a forge adapter. @@ -153,6 +147,11 @@ export interface ForgeAdapter { getOrigin?(hostname: Hostname): string; /** Whether the supplied token matches the forge's PAT format. */ validateToken(token: Token): boolean; + /** + * Whether the supplied OAuth client ID matches the forge's expected format. + * Omitted by forges with no user-supplied OAuth app flow. + */ + validateClientId?(clientId: string): boolean; /** URL to manage/create a personal access token on the forge. */ getPersonalAccessTokenSettingsUrl(hostname: Hostname): Link; /** Login entries rendered in the Login route. */ @@ -179,12 +178,6 @@ export interface ForgeAdapter { */ deviceFlow?: DeviceFlowSupport; - /** - * Custom-OAuth-app web flow. Forges without OAuth-app support (e.g. Gitea) - * omit this bundle entirely — callers gate the OAuth-app UI on its presence. - */ - oauthWebApp?: OAuthWebAppSupport; - /** * Reuse of a locally installed forge CLI's credential. Forges whose CLI * Gitify cannot read a token from omit this bundle entirely — callers gate @@ -320,22 +313,6 @@ export interface ExternallyManagedScopes { command: string; } -/** - * Custom-OAuth-app web flow capability bundle. Present only on forges that - * support browser-redirect OAuth with user-supplied client credentials - * (GitHub today). - */ -export interface OAuthWebAppSupport { - /** Start the OAuth web flow and return the auth code once the user consents. */ - performWebOAuth(options: LoginOAuthWebOptions): Promise; - /** Exchange an OAuth web-flow authorization code for an access token. */ - exchangeAuthCodeForToken(authCode: AuthCode, options: LoginOAuthWebOptions): Promise; - /** Whether the supplied OAuth client ID matches the forge's expected format. */ - validateClientId(clientId: string): boolean; - /** URL the user visits to create a new OAuth app on the forge. */ - getNewOAuthAppUrl(hostname: Hostname): Link; -} - /** * OAuth device-flow capability bundle. Present only on forges that support * browser-side device authorisation (GitHub today). @@ -343,12 +320,19 @@ export interface OAuthWebAppSupport { export interface DeviceFlowSupport { /** `AuthMethod` recorded on the account when a successful login completes. */ authMethod: AuthMethod; - /** Start a device-flow authorization session. */ - start(hostname?: Hostname, scopes?: string[]): Promise; + /** + * Start a device-flow authorization session. + * + * `clientId` authorizes the user's own OAuth app instead of Gitify's + * preconfigured one; when omitted the forge's built-in app is used. + */ + start(hostname?: Hostname, scopes?: string[], clientId?: ClientID): Promise; /** Poll for completion; resolves to a token when granted. */ poll(session: DeviceFlowSession): Promise; - /** URL the user visits to revoke Gitify's access on this forge. */ - getRevokeAccessUrl(hostname: Hostname): Link; + /** URL the user visits to revoke the authorized OAuth app's access on this forge. */ + getRevokeAccessUrl(hostname: Hostname, clientId?: ClientID): Link; + /** URL the user visits to register an OAuth app that can authorize via the device flow. */ + getNewOAuthAppUrl(hostname: Hostname): Link; } /** diff --git a/src/shared/events.ts b/src/shared/events.ts index 90e88c632..ddac48bd3 100644 --- a/src/shared/events.ts +++ b/src/shared/events.ts @@ -5,7 +5,6 @@ const P = 'gitify:' as const; * Each value is prefixed with `gitify:` to prevent collisions. */ export const EVENTS = { - AUTH_CALLBACK: `${P}auth-callback`, QUIT: `${P}quit`, WINDOW_SHOW: `${P}window-show`, WINDOW_HIDE: `${P}window-hide`, @@ -117,7 +116,6 @@ type AssertEventCoverage> = T; * - For events with no payload, `request` is `undefined`. */ export type EventContracts = AssertEventCoverage<{ - [EVENTS.AUTH_CALLBACK]: { request: string; response: undefined }; [EVENTS.QUIT]: { request: undefined; response: undefined }; [EVENTS.WINDOW_SHOW]: { request: undefined; response: undefined }; [EVENTS.WINDOW_HIDE]: { request: undefined; response: undefined }; From bd3eab624d0fca44a85e28dc46083b01a31b3f49 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Fri, 16 Oct 2026 23:44:22 -0400 Subject: [PATCH 02/10] refactor(auth): clarify device-flow authorizer and custom-app helpers Follow-up naming pass on the device-flow migration: - Rename describeDeviceFlowError -> describeDeviceFlowStartError; it only covers start-time failures (device_flow_disabled / unknown client ID), not poll errors. - Group the custom OAuth app helpers (authMethod, validateClientId, getNewOAuthAppUrl) into a customOAuthApp adapter bundle, so validateClientId and getNewOAuthAppUrl live together instead of split across the top-level adapter and the deviceFlow bundle. - Have useLogins derive the recorded auth method from the adapter's customOAuthApp bundle rather than hardcoding 'Custom OAuth App'. - Extract GitHubDeviceFlowAuthorize as the shared authorization UI and keep GitHubLoginWithDeviceFlowRoute as the thin built-in route element, so the custom route composes a mechanism-named component rather than a login route. - Rename effectiveHostname -> resolvedHostname and migrateAuthMethod -> migrateLegacyAuthMethod. --- src/renderer/hooks/useLogins.ts | 5 +- ....test.tsx => DeviceFlowAuthorize.test.tsx} | 32 +- .../routes/github/DeviceFlowAuthorize.tsx | 384 +++++++++++++++++ .../routes/github/LoginWithCustomOAuthApp.tsx | 6 +- .../routes/github/LoginWithDeviceFlow.tsx | 394 +----------------- src/renderer/stores/useAccountsStore.ts | 4 +- src/renderer/utils/auth/loginValidation.ts | 2 +- .../utils/forges/github/adapter.test.ts | 7 +- src/renderer/utils/forges/github/adapter.ts | 6 +- .../utils/forges/github/flows.test.ts | 8 +- src/renderer/utils/forges/github/flows.ts | 2 +- src/renderer/utils/forges/types.ts | 29 +- 12 files changed, 455 insertions(+), 424 deletions(-) rename src/renderer/routes/github/{LoginWithDeviceFlow.test.tsx => DeviceFlowAuthorize.test.tsx} (92%) create mode 100644 src/renderer/routes/github/DeviceFlowAuthorize.tsx diff --git a/src/renderer/hooks/useLogins.ts b/src/renderer/hooks/useLogins.ts index f6743004e..e5fae7e03 100644 --- a/src/renderer/hooks/useLogins.ts +++ b/src/renderer/hooks/useLogins.ts @@ -94,13 +94,14 @@ export const useLogins = (): LoginsState => { */ const loginWithDeviceFlowComplete = useCallback( async (forge: Forge, token: Token, hostname: Hostname, clientId?: ClientID) => { - const { deviceFlow } = getAdapter(forge); + const { deviceFlow, customOAuthApp } = getAdapter(forge); if (!deviceFlow) { throw new Error(`Forge "${forge}" does not support device flow.`); } // A supplied client ID means the user authorized their own app; without // one the flow used Gitify's preconfigured app. - const method: AuthMethod = clientId ? 'Custom OAuth App' : deviceFlow.authMethod; + const method: AuthMethod = + clientId && customOAuthApp ? customOAuthApp.authMethod : deviceFlow.authMethod; const existingAccount = accounts.find((a) => a.hostname === hostname && a.method === method); if (existingAccount) { diff --git a/src/renderer/routes/github/LoginWithDeviceFlow.test.tsx b/src/renderer/routes/github/DeviceFlowAuthorize.test.tsx similarity index 92% rename from src/renderer/routes/github/LoginWithDeviceFlow.test.tsx rename to src/renderer/routes/github/DeviceFlowAuthorize.test.tsx index 3623b1c0e..91f989d20 100644 --- a/src/renderer/routes/github/LoginWithDeviceFlow.test.tsx +++ b/src/renderer/routes/github/DeviceFlowAuthorize.test.tsx @@ -8,9 +8,9 @@ import type { ClientID, Hostname } from '../../types'; import * as logger from '../../utils/core/logger'; import * as comms from '../../utils/system/comms'; -import { GitHubLoginWithDeviceFlowRoute } from './LoginWithDeviceFlow'; +import { GitHubDeviceFlowAuthorize } from './DeviceFlowAuthorize'; -describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { +describe('renderer/routes/github/DeviceFlowAuthorize.tsx', () => { const copyToClipboardSpy = vi.spyOn(comms, 'copyToClipboard').mockResolvedValue(); const openExternalLinkSpy = vi.spyOn(comms, 'openExternalLink').mockImplementation(vi.fn()); @@ -25,7 +25,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { expiresAt: Date.now() + 900000, }); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, }); @@ -48,7 +48,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { expiresAt: Date.now() + 900000, }); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, }); @@ -80,7 +80,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { expiresAt: Date.now() + 900000, }); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, }); @@ -107,7 +107,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { expiresAt: Date.now() + 900000, }); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, }); @@ -130,7 +130,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { expiresAt: Date.now() + 900000, }); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, }); @@ -159,7 +159,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { expiresAt: Date.now() + 900000, }); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, }); @@ -178,7 +178,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { const rendererLogErrorSpy = vi.spyOn(logger, 'rendererLogError').mockImplementation(vi.fn()); const loginWithDeviceFlowStartMock = vi.fn().mockRejectedValueOnce(new Error('Network error')); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, }); @@ -199,7 +199,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { expiresAt: Date.now() + 900000, }); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, }); @@ -221,7 +221,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { const loginWithDeviceFlowPollMock = vi.fn().mockResolvedValueOnce('access-token'); const loginWithDeviceFlowCompleteMock = vi.fn().mockResolvedValueOnce(undefined); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, loginWithDeviceFlowPoll: loginWithDeviceFlowPollMock, loginWithDeviceFlowComplete: loginWithDeviceFlowCompleteMock, @@ -257,7 +257,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { .fn() .mockRejectedValueOnce(new Error('authorization denied')); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, loginWithDeviceFlowPoll: loginWithDeviceFlowPollMock, }); @@ -284,7 +284,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { }); const loginWithDeviceFlowPollMock = vi.fn(); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, loginWithDeviceFlowPoll: loginWithDeviceFlowPollMock, }); @@ -309,7 +309,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { expiresAt: Date.now() + 900000, }); - renderWithProviders(, { + renderWithProviders(, { loginWithDeviceFlowStart: loginWithDeviceFlowStartMock, loginWithDeviceFlowPoll: vi.fn().mockResolvedValueOnce(null), initialEntries: [ @@ -347,7 +347,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { }); renderWithProviders( - , @@ -365,7 +365,7 @@ describe('renderer/routes/github/LoginWithDeviceFlow.tsx', () => { }); it('should open the revoke-access developer settings link', async () => { - renderWithProviders(); + renderWithProviders(); await userEvent.click(screen.getByTitle('GitHub → Developer Settings')); diff --git a/src/renderer/routes/github/DeviceFlowAuthorize.tsx b/src/renderer/routes/github/DeviceFlowAuthorize.tsx new file mode 100644 index 000000000..eac8ffe0a --- /dev/null +++ b/src/renderer/routes/github/DeviceFlowAuthorize.tsx @@ -0,0 +1,384 @@ +import { type ReactNode, useCallback, useEffect, useState } from 'react'; +import { useLocation, useNavigate } from 'react-router-dom'; + +import { + CheckCircleFillIcon, + CopyIcon, + GlobeIcon, + LinkIcon, + SignInIcon, + SyncIcon, +} from '@primer/octicons-react'; +import { Banner, Button, Heading, IconButton, Stack, Text } from '@primer/react'; + +import { Constants } from '../../constants'; + +import { useLogins } from '../../hooks/useLogins'; + +import { Contents } from '../../components/layout/Contents'; +import { Page } from '../../components/layout/Page'; +import { Footer } from '../../components/primitives/Footer'; +import { Header } from '../../components/primitives/Header'; + +import type { Account, ClientID, Forge, Hostname, Link } from '../../types'; +import type { DeviceFlowSession } from '../../utils/auth/types'; + +import { getAlternateScopeNames, getRecommendedScopeNames } from '../../utils/auth/scopes'; +import { rendererLogError, toError } from '../../utils/core/logger'; +import { describeDeviceFlowStartError } from '../../utils/forges/github/flows'; +import { getAdapter } from '../../utils/forges/registry'; +import { copyToClipboard, openExternalLink } from '../../utils/system/comms'; + +interface LocationState { + account?: Account; +} + +interface GitHubDeviceFlowAuthorizeProps { + /** OAuth app client ID to authorize; omit to use Gitify's preconfigured app. */ + clientId?: ClientID; + /** Hostname to authenticate against; defaults to the re-auth account or GitHub.com. */ + hostname?: Hostname; + /** Page heading; defaults to authorizing Gitify's preconfigured app. */ + title?: string; +} + +type ScopeChoice = 'public' | 'full'; + +export function GitHubDeviceFlowAuthorize({ + clientId, + hostname, + title, +}: GitHubDeviceFlowAuthorizeProps) { + const navigate = useNavigate(); + const location = useLocation(); + const { account: reAuthAccount } = (location.state ?? {}) as LocationState; + + const forge: Forge = 'github'; + + const resolvedHostname = (hostname ?? + reAuthAccount?.hostname ?? + Constants.GITHUB_HOSTNAME) as Hostname; + + const { loginWithDeviceFlowStart, loginWithDeviceFlowPoll, loginWithDeviceFlowComplete } = + useLogins(); + + const [session, setSession] = useState(null); + const [isPolling, setIsPolling] = useState(false); + const [error, setError] = useState(null); + const [scopeChoice, setScopeChoice] = useState(null); + + // Initialize device flow session, copy code, and open browser + useEffect(() => { + const initializeDeviceFlow = async () => { + try { + const scopes = + scopeChoice === 'public' ? getAlternateScopeNames() : getRecommendedScopeNames(); + + const newSession = await loginWithDeviceFlowStart( + forge, + resolvedHostname, + scopes, + clientId, + ); + setSession(newSession); + + // Auto-copy the user code to clipboard + await copyToClipboard(newSession.userCode); + + // Auto-open the verification URL in the browser + openExternalLink(newSession.verificationUri as Link); + } catch (err) { + rendererLogError('LoginWithDeviceFlow', 'Failed to start device flow', toError(err)); + setError( + describeDeviceFlowStartError(err, resolvedHostname, clientId) ?? + 'Failed to start authentication. Please try again.', + ); + } + }; + + if (scopeChoice) { + void initializeDeviceFlow(); + } + }, [loginWithDeviceFlowStart, resolvedHostname, clientId, scopeChoice, forge]); + + // Poll for device flow completion + useEffect(() => { + if (!session) { + return; + } + + let isActive = true; + let timeoutId: NodeJS.Timeout | null = null; + + const startPolling = async () => { + setIsPolling(true); + + const poll = async (): Promise => { + if (!isActive || Date.now() >= session.expiresAt) { + if (isActive) { + setError('Device code expired. Please start again.'); + } + return; + } + + const token = await loginWithDeviceFlowPoll(forge, session); + + if (token && isActive) { + await loginWithDeviceFlowComplete(forge, token, session.hostname, clientId); + void navigate('/'); + return; + } + + const intervalMs = Math.max(5000, session.intervalSeconds * 1000); + await new Promise((resolve) => { + timeoutId = setTimeout(resolve, intervalMs); + }); + await poll(); + }; + + try { + await poll(); + } catch (err) { + if (isActive) { + rendererLogError('LoginWithDeviceFlow', 'Failed to poll device flow', toError(err)); + setError('Authentication failed. Please try again.'); + } + } finally { + if (isActive) { + setIsPolling(false); + } + } + }; + + void startPolling(); + + return () => { + isActive = false; + if (timeoutId) { + clearTimeout(timeoutId); + } + }; + // oxlint-disable-next-line react/exhaustive-deps -- navigate is stable + }, [session, loginWithDeviceFlowPoll, loginWithDeviceFlowComplete, clientId, forge]); + + const handleCopyUserCode = useCallback(async () => { + if (session?.userCode) { + await copyToClipboard(session.userCode); + } + }, [session?.userCode]); + + const handleOpenBrowser = useCallback(() => { + if (session?.verificationUri) { + openExternalLink(session.verificationUri as Link); + } + }, [session?.verificationUri]); + + const handleCopyVerificationLink = useCallback(async () => { + if (session?.verificationUri) { + await copyToClipboard(session.verificationUri); + } + }, [session?.verificationUri]); + + // Render UI states as separate functions for clarity + const renderSessionUI = () => { + if (!session) { + return null; + } + + return ( + + + Authorize the app using this code. + + + + + {session.userCode} + + + + + + + + Code copied to clipboard + + + + + + Opened{' '} + {session.hostname === Constants.GITHUB_HOSTNAME ? 'GitHub.com' : session.hostname} + + + + + + Waiting for authorization... + + + + ); + }; + + const renderScopeChoiceUI = () => ( + + Receive notifications for: + + + + + + + {(() => { + const adapter = getAdapter(forge); + const revokeUrl = adapter.deviceFlow?.getRevokeAccessUrl(resolvedHostname, clientId); + if (!revokeUrl) { + return null; + } + const label = `${adapter.displayName} → Developer Settings`; + return ( + + + {clientId + ? "Note: to change previously granted permissions, revoke your app's access at" + : "Note: to change previously granted permissions, revoke Gitify's access at"}{' '} + + {', then re-authorize above.'} + + + ); + })()} + + + ); + + const renderInitializingUI = () => ( + + + Initializing authentication... + + ); + + let mainContent: ReactNode; + if (session) { + mainContent = renderSessionUI(); + } else if (!scopeChoice) { + mainContent = renderScopeChoiceUI(); + } else { + mainContent = renderInitializingUI(); + } + + return ( + +
{title ?? 'Authorize with GitHub'}
+ + + {error && ( + + + {error} + + + } + hideTitle + title="Login errors" + variant="critical" + /> + )} + {mainContent} + + + {session ? ( +
+ + + + + +
+ ) : ( +
+ +
+ )} +
+ ); +} diff --git a/src/renderer/routes/github/LoginWithCustomOAuthApp.tsx b/src/renderer/routes/github/LoginWithCustomOAuthApp.tsx index 0c9ebc8e5..ab41e6e4d 100644 --- a/src/renderer/routes/github/LoginWithCustomOAuthApp.tsx +++ b/src/renderer/routes/github/LoginWithCustomOAuthApp.tsx @@ -20,7 +20,7 @@ import { } from '../../utils/auth/loginValidation'; import { getAdapter } from '../../utils/forges/registry'; import { openExternalLink } from '../../utils/system/comms'; -import { GitHubLoginWithDeviceFlowRoute } from './LoginWithDeviceFlow'; +import { GitHubDeviceFlowAuthorize } from './DeviceFlowAuthorize'; interface LocationState { account?: Account; @@ -62,7 +62,7 @@ export function GitHubLoginWithCustomOAuthAppRoute() { if (credentials) { return ( - { - const url = getAdapter(forge).deviceFlow?.getNewOAuthAppUrl(formData.hostname); + const url = getAdapter(forge).customOAuthApp?.getNewOAuthAppUrl(formData.hostname); if (url) { openExternalLink(url); } diff --git a/src/renderer/routes/github/LoginWithDeviceFlow.tsx b/src/renderer/routes/github/LoginWithDeviceFlow.tsx index 83f8fbebb..2d7bd7ae5 100644 --- a/src/renderer/routes/github/LoginWithDeviceFlow.tsx +++ b/src/renderer/routes/github/LoginWithDeviceFlow.tsx @@ -1,384 +1,12 @@ -import { type ReactNode, useCallback, useEffect, useState } from 'react'; -import { useLocation, useNavigate } from 'react-router-dom'; - -import { - CheckCircleFillIcon, - CopyIcon, - GlobeIcon, - LinkIcon, - SignInIcon, - SyncIcon, -} from '@primer/octicons-react'; -import { Banner, Button, Heading, IconButton, Stack, Text } from '@primer/react'; - -import { Constants } from '../../constants'; - -import { useLogins } from '../../hooks/useLogins'; - -import { Contents } from '../../components/layout/Contents'; -import { Page } from '../../components/layout/Page'; -import { Footer } from '../../components/primitives/Footer'; -import { Header } from '../../components/primitives/Header'; - -import type { Account, ClientID, Forge, Hostname, Link } from '../../types'; -import type { DeviceFlowSession } from '../../utils/auth/types'; - -import { getAlternateScopeNames, getRecommendedScopeNames } from '../../utils/auth/scopes'; -import { rendererLogError, toError } from '../../utils/core/logger'; -import { describeDeviceFlowError } from '../../utils/forges/github/flows'; -import { getAdapter } from '../../utils/forges/registry'; -import { copyToClipboard, openExternalLink } from '../../utils/system/comms'; - -interface LocationState { - account?: Account; -} - -interface GitHubLoginWithDeviceFlowRouteProps { - /** OAuth app client ID to authorize; omit to use Gitify's preconfigured app. */ - clientId?: ClientID; - /** Hostname to authenticate against; defaults to the re-auth account or GitHub.com. */ - hostname?: Hostname; - /** Page heading; defaults to authorizing Gitify's preconfigured app. */ - title?: string; -} - -type ScopeChoice = 'public' | 'full'; - -export function GitHubLoginWithDeviceFlowRoute({ - clientId, - hostname, - title, -}: GitHubLoginWithDeviceFlowRouteProps) { - const navigate = useNavigate(); - const location = useLocation(); - const { account: reAuthAccount } = (location.state ?? {}) as LocationState; - - const forge: Forge = 'github'; - - const effectiveHostname = (hostname ?? - reAuthAccount?.hostname ?? - Constants.GITHUB_HOSTNAME) as Hostname; - - const { loginWithDeviceFlowStart, loginWithDeviceFlowPoll, loginWithDeviceFlowComplete } = - useLogins(); - - const [session, setSession] = useState(null); - const [isPolling, setIsPolling] = useState(false); - const [error, setError] = useState(null); - const [scopeChoice, setScopeChoice] = useState(null); - - // Initialize device flow session, copy code, and open browser - useEffect(() => { - const initializeDeviceFlow = async () => { - try { - const scopes = - scopeChoice === 'public' ? getAlternateScopeNames() : getRecommendedScopeNames(); - - const newSession = await loginWithDeviceFlowStart( - forge, - effectiveHostname, - scopes, - clientId, - ); - setSession(newSession); - - // Auto-copy the user code to clipboard - await copyToClipboard(newSession.userCode); - - // Auto-open the verification URL in the browser - openExternalLink(newSession.verificationUri as Link); - } catch (err) { - rendererLogError('LoginWithDeviceFlow', 'Failed to start device flow', toError(err)); - setError( - describeDeviceFlowError(err, effectiveHostname, clientId) ?? - 'Failed to start authentication. Please try again.', - ); - } - }; - - if (scopeChoice) { - void initializeDeviceFlow(); - } - }, [loginWithDeviceFlowStart, effectiveHostname, clientId, scopeChoice, forge]); - - // Poll for device flow completion - useEffect(() => { - if (!session) { - return; - } - - let isActive = true; - let timeoutId: NodeJS.Timeout | null = null; - - const startPolling = async () => { - setIsPolling(true); - - const poll = async (): Promise => { - if (!isActive || Date.now() >= session.expiresAt) { - if (isActive) { - setError('Device code expired. Please start again.'); - } - return; - } - - const token = await loginWithDeviceFlowPoll(forge, session); - - if (token && isActive) { - await loginWithDeviceFlowComplete(forge, token, session.hostname, clientId); - void navigate('/'); - return; - } - - const intervalMs = Math.max(5000, session.intervalSeconds * 1000); - await new Promise((resolve) => { - timeoutId = setTimeout(resolve, intervalMs); - }); - await poll(); - }; - - try { - await poll(); - } catch (err) { - if (isActive) { - rendererLogError('LoginWithDeviceFlow', 'Failed to poll device flow', toError(err)); - setError('Authentication failed. Please try again.'); - } - } finally { - if (isActive) { - setIsPolling(false); - } - } - }; - - void startPolling(); - - return () => { - isActive = false; - if (timeoutId) { - clearTimeout(timeoutId); - } - }; - // oxlint-disable-next-line react/exhaustive-deps -- navigate is stable - }, [session, loginWithDeviceFlowPoll, loginWithDeviceFlowComplete, clientId, forge]); - - const handleCopyUserCode = useCallback(async () => { - if (session?.userCode) { - await copyToClipboard(session.userCode); - } - }, [session?.userCode]); - - const handleOpenBrowser = useCallback(() => { - if (session?.verificationUri) { - openExternalLink(session.verificationUri as Link); - } - }, [session?.verificationUri]); - - const handleCopyVerificationLink = useCallback(async () => { - if (session?.verificationUri) { - await copyToClipboard(session.verificationUri); - } - }, [session?.verificationUri]); - - // Render UI states as separate functions for clarity - const renderSessionUI = () => { - if (!session) { - return null; - } - - return ( - - - Authorize the app using this code. - - - - - {session.userCode} - - - - - - - - Code copied to clipboard - - - - - - Opened{' '} - {session.hostname === Constants.GITHUB_HOSTNAME ? 'GitHub.com' : session.hostname} - - - - - - Waiting for authorization... - - - - ); - }; - - const renderScopeChoiceUI = () => ( - - Receive notifications for: - - - - - - - {(() => { - const adapter = getAdapter(forge); - const revokeUrl = adapter.deviceFlow?.getRevokeAccessUrl(effectiveHostname, clientId); - if (!revokeUrl) { - return null; - } - const label = `${adapter.displayName} → Developer Settings`; - return ( - - - {clientId - ? "Note: to change previously granted permissions, revoke your app's access at" - : "Note: to change previously granted permissions, revoke Gitify's access at"}{' '} - - {', then re-authorize above.'} - - - ); - })()} - - - ); - - const renderInitializingUI = () => ( - - - Initializing authentication... - - ); - - let mainContent: ReactNode; - if (session) { - mainContent = renderSessionUI(); - } else if (!scopeChoice) { - mainContent = renderScopeChoiceUI(); - } else { - mainContent = renderInitializingUI(); - } - - return ( - -
{title ?? 'Authorize with GitHub'}
- - - {error && ( - - - {error} - - - } - hideTitle - title="Login errors" - variant="critical" - /> - )} - {mainContent} - - - {session ? ( -
- - - - - -
- ) : ( -
- -
- )} -
- ); +import { GitHubDeviceFlowAuthorize } from './DeviceFlowAuthorize'; + +/** + * Route element for `/login/github/device-flow`. + * + * Authorizes Gitify's preconfigured OAuth app on GitHub.com. A user-supplied + * custom app uses the `/login/github/custom-oauth-app` route instead, which + * composes the same `GitHubDeviceFlowAuthorize` UI with its own client ID. + */ +export function GitHubLoginWithDeviceFlowRoute() { + return ; } diff --git a/src/renderer/stores/useAccountsStore.ts b/src/renderer/stores/useAccountsStore.ts index eb0e67752..e98426ee8 100644 --- a/src/renderer/stores/useAccountsStore.ts +++ b/src/renderer/stores/useAccountsStore.ts @@ -20,7 +20,7 @@ import { DEFAULT_ACCOUNTS_STATE } from './defaults'; * carry the retired `GitHub App` / `OAuth App` labels; relabel them so their * existing tokens keep working without forcing a re-login. */ -function migrateAuthMethod(method: string): AuthMethod { +function migrateLegacyAuthMethod(method: string): AuthMethod { switch (method) { case 'GitHub App': return 'Gitify OAuth App'; @@ -46,7 +46,7 @@ export function sanitizeAccounts(accounts: Account[]): Account[] { } const sanitised: Account = { forge, - method: migrateAuthMethod(a.method as string), + method: migrateLegacyAuthMethod(a.method as string), platform: a.platform, version: a.version, hostname: a.hostname, diff --git a/src/renderer/utils/auth/loginValidation.ts b/src/renderer/utils/auth/loginValidation.ts index 0b7db50af..44289c800 100644 --- a/src/renderer/utils/auth/loginValidation.ts +++ b/src/renderer/utils/auth/loginValidation.ts @@ -90,7 +90,7 @@ export const validateCustomOAuthAppForm = ( if (!values.clientId) { errors.clientId = 'Client ID is required'; - } else if (!adapter.validateClientId?.(values.clientId)) { + } else if (!adapter.customOAuthApp?.validateClientId(values.clientId)) { errors.clientId = 'Client ID format is invalid'; } diff --git a/src/renderer/utils/forges/github/adapter.test.ts b/src/renderer/utils/forges/github/adapter.test.ts index 510abf19c..a9800ed9b 100644 --- a/src/renderer/utils/forges/github/adapter.test.ts +++ b/src/renderer/utils/forges/github/adapter.test.ts @@ -108,13 +108,14 @@ describe('renderer/utils/forges/github/adapter.ts', () => { expect(session.clientId).toBe('CUSTOM_CLIENT_ID_123'); }); - it('wires the device-flow methods so the context can dispatch via the adapter', () => { + it('wires the device-flow and custom-OAuth-app methods so the context can dispatch via the adapter', () => { expect(githubAdapter.deviceFlow?.authMethod).toBe('Gitify OAuth App'); expect(githubAdapter.deviceFlow?.start).toBeDefined(); expect(githubAdapter.deviceFlow?.poll).toBeDefined(); expect(githubAdapter.deviceFlow?.getRevokeAccessUrl).toBeDefined(); - expect(githubAdapter.deviceFlow?.getNewOAuthAppUrl).toBeDefined(); - expect(githubAdapter.validateClientId).toBeDefined(); + expect(githubAdapter.customOAuthApp?.authMethod).toBe('Custom OAuth App'); + expect(githubAdapter.customOAuthApp?.validateClientId).toBeDefined(); + expect(githubAdapter.customOAuthApp?.getNewOAuthAppUrl).toBeDefined(); }); }); diff --git a/src/renderer/utils/forges/github/adapter.ts b/src/renderer/utils/forges/github/adapter.ts index 30aa84f15..08c74e170 100644 --- a/src/renderer/utils/forges/github/adapter.ts +++ b/src/renderer/utils/forges/github/adapter.ts @@ -93,7 +93,6 @@ export const githubAdapter: ForgeAdapter = { defaultHostname: Constants.GITHUB_HOSTNAME, validateToken: isValidToken, - validateClientId: isValidClientId, validateHostname: isValidHostname, getPersonalAccessTokenSettingsUrl: getNewTokenURL, documentationUrl: Constants.GITHUB_DOCS.PAT_URL as Link, @@ -137,6 +136,11 @@ export const githubAdapter: ForgeAdapter = { poll: pollGitHubDeviceFlow, getRevokeAccessUrl: (hostname, clientId) => getDeveloperSettingsURL({ hostname, method: 'Custom OAuth App', clientId } as Account), + }, + + customOAuthApp: { + authMethod: 'Custom OAuth App', + validateClientId: isValidClientId, getNewOAuthAppUrl: getNewOAuthAppURL, }, diff --git a/src/renderer/utils/forges/github/flows.test.ts b/src/renderer/utils/forges/github/flows.test.ts index 5f672853f..b3852cf22 100644 --- a/src/renderer/utils/forges/github/flows.test.ts +++ b/src/renderer/utils/forges/github/flows.test.ts @@ -178,12 +178,12 @@ describe('renderer/utils/forges/github/flows.ts', () => { }); }); - describe('describeDeviceFlowError', () => { + describe('describeDeviceFlowStartError', () => { it('explains how to enable device flow for a custom app', () => { const err = Object.create(RequestError.prototype); err.response = { data: { error: 'device_flow_disabled' } }; - const message = flows.describeDeviceFlowError( + const message = flows.describeDeviceFlowStartError( err, 'github.example.com' as Hostname, 'CUSTOM_CLIENT_ID_123' as ClientID, @@ -200,7 +200,7 @@ describe('renderer/utils/forges/github/flows.ts', () => { err.response = { data: { error: 'incorrect_client_credentials' } }; expect( - flows.describeDeviceFlowError( + flows.describeDeviceFlowStartError( err, 'github.example.com' as Hostname, 'CUSTOM_CLIENT_ID_123' as ClientID, @@ -210,7 +210,7 @@ describe('renderer/utils/forges/github/flows.ts', () => { it('returns undefined for a non-RequestError', () => { expect( - flows.describeDeviceFlowError(new Error('boom'), 'github.com' as Hostname), + flows.describeDeviceFlowStartError(new Error('boom'), 'github.com' as Hostname), ).toBeUndefined(); }); }); diff --git a/src/renderer/utils/forges/github/flows.ts b/src/renderer/utils/forges/github/flows.ts index 4c74211f2..1b49ebf17 100644 --- a/src/renderer/utils/forges/github/flows.ts +++ b/src/renderer/utils/forges/github/flows.ts @@ -67,7 +67,7 @@ export async function startGitHubDeviceFlow( * @param clientId - The client ID supplied for a custom app, when any. * @returns A user-facing message, or `undefined` for an unrecognised failure. */ -export function describeDeviceFlowError( +export function describeDeviceFlowStartError( err: unknown, hostname: Hostname, clientId?: ClientID, diff --git a/src/renderer/utils/forges/types.ts b/src/renderer/utils/forges/types.ts index 96d778c0c..b5da9fe08 100644 --- a/src/renderer/utils/forges/types.ts +++ b/src/renderer/utils/forges/types.ts @@ -147,11 +147,6 @@ export interface ForgeAdapter { getOrigin?(hostname: Hostname): string; /** Whether the supplied token matches the forge's PAT format. */ validateToken(token: Token): boolean; - /** - * Whether the supplied OAuth client ID matches the forge's expected format. - * Omitted by forges with no user-supplied OAuth app flow. - */ - validateClientId?(clientId: string): boolean; /** URL to manage/create a personal access token on the forge. */ getPersonalAccessTokenSettingsUrl(hostname: Hostname): Link; /** Login entries rendered in the Login route. */ @@ -167,9 +162,9 @@ export interface ForgeAdapter { // --- Auth flows --- // Optional because not every forge supports every flow. Gitea today is - // PAT-only and omits both bundles. The orchestrator gates UI on the + // PAT-only and omits every bundle. The orchestrator gates UI on the // presence of these bundles (and on `loginMethods` entries pointing at - // the forge's device-flow or OAuth-app routes). + // the forge's device-flow or custom-OAuth-app routes). /** * OAuth device-flow capability. Forges without device-flow support (e.g. @@ -178,6 +173,13 @@ export interface ForgeAdapter { */ deviceFlow?: DeviceFlowSupport; + /** + * Custom-OAuth-app capability. Forges where a user cannot authorize their + * own OAuth app (e.g. Gitea) omit this bundle entirely — callers gate the + * custom-app UI on its presence. + */ + customOAuthApp?: CustomOAuthAppSupport; + /** * Reuse of a locally installed forge CLI's credential. Forges whose CLI * Gitify cannot read a token from omit this bundle entirely — callers gate @@ -331,7 +333,18 @@ export interface DeviceFlowSupport { poll(session: DeviceFlowSession): Promise; /** URL the user visits to revoke the authorized OAuth app's access on this forge. */ getRevokeAccessUrl(hostname: Hostname, clientId?: ClientID): Link; - /** URL the user visits to register an OAuth app that can authorize via the device flow. */ +} + +/** + * Custom-OAuth-app capability bundle. Present only on forges where a user can + * authorize their own OAuth app (GitHub today). + */ +export interface CustomOAuthAppSupport { + /** `AuthMethod` recorded on accounts created from a user-supplied OAuth app. */ + authMethod: AuthMethod; + /** Whether the supplied OAuth client ID matches the forge's expected format. */ + validateClientId(clientId: string): boolean; + /** URL the user visits to register a new OAuth app on the forge. */ getNewOAuthAppUrl(hostname: Hostname): Link; } From 7c0b8dc0b614f018e603d9c24fc5a529773a7624 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Sat, 17 Oct 2026 09:17:44 -0400 Subject: [PATCH 03/10] refactor(auth): build OAuth app connections URL without a synthetic account `deviceFlow.getRevokeAccessUrl` fabricated an Account (inventing a `method` that was not the account's real one) purely to call `getDeveloperSettingsURL`. Extract `getAuthorizedOAuthAppURL(hostname, clientId?)` as the single builder for the `/settings/connections/applications/:client_id` page, use it directly as the revoke-access URL, and have `getDeveloperSettingsURL` delegate to it for the OAuth-app methods. This removes the cast and keeps the revoke link and the account settings link on one source of truth. --- src/renderer/utils/forges/github/adapter.ts | 4 +- src/renderer/utils/forges/github/auth.test.ts | 18 +++++++++ src/renderer/utils/forges/github/auth.ts | 37 +++++++++++-------- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/renderer/utils/forges/github/adapter.ts b/src/renderer/utils/forges/github/adapter.ts index 08c74e170..05b01973e 100644 --- a/src/renderer/utils/forges/github/adapter.ts +++ b/src/renderer/utils/forges/github/adapter.ts @@ -9,6 +9,7 @@ import type { ForgeAdapter, NotificationDisplayHelpers, RefreshAccountData } fro import { isValidHostname } from '../../auth/utils'; import { extractHostVersion, + getAuthorizedOAuthAppURL, getDeveloperSettingsURL, getNewOAuthAppURL, getNewTokenURL, @@ -134,8 +135,7 @@ export const githubAdapter: ForgeAdapter = { authMethod: 'Gitify OAuth App', start: startGitHubDeviceFlow, poll: pollGitHubDeviceFlow, - getRevokeAccessUrl: (hostname, clientId) => - getDeveloperSettingsURL({ hostname, method: 'Custom OAuth App', clientId } as Account), + getRevokeAccessUrl: getAuthorizedOAuthAppURL, }, customOAuthApp: { diff --git a/src/renderer/utils/forges/github/auth.test.ts b/src/renderer/utils/forges/github/auth.test.ts index 07e5442d6..fb922a6e9 100644 --- a/src/renderer/utils/forges/github/auth.test.ts +++ b/src/renderer/utils/forges/github/auth.test.ts @@ -5,6 +5,7 @@ import type { AuthMethod } from '../../auth/types'; import { extractHostVersion, + getAuthorizedOAuthAppURL, getDeveloperSettingsURL, getGitHubAuthBaseUrl, getNewOAuthAppURL, @@ -60,6 +61,23 @@ describe('renderer/utils/forges/github/auth.ts', () => { }); }); + describe('getAuthorizedOAuthAppURL', () => { + it("builds the connections URL for a custom app's own client ID", () => { + expect( + getAuthorizedOAuthAppURL( + 'github.example.com' as Hostname, + 'CUSTOM_CLIENT_ID_123' as ClientID, + ), + ).toBe('https://github.example.com/settings/connections/applications/CUSTOM_CLIENT_ID_123'); + }); + + it("falls back to Gitify's preconfigured client ID when none is supplied", () => { + expect(getAuthorizedOAuthAppURL('github.com' as Hostname)).toBe( + 'https://github.com/settings/connections/applications/FAKE_CLIENT_ID_123', + ); + }); + }); + describe('getDeveloperSettingsURL', () => { it('returns the connections URL for Gitify OAuth App accounts', () => { expect( diff --git a/src/renderer/utils/forges/github/auth.ts b/src/renderer/utils/forges/github/auth.ts index c1a155f9d..f10568654 100644 --- a/src/renderer/utils/forges/github/auth.ts +++ b/src/renderer/utils/forges/github/auth.ts @@ -59,11 +59,27 @@ export function getGitHubAuthBaseUrl(hostname: Hostname): URL { return url; } +/** + * Build the URL where a user reviews and revokes an authorized OAuth app's access. + * + * Omit `clientId` for Gitify's preconfigured app; pass one for a user-supplied app. + * + * @param hostname - The GitHub hostname the app is authorized on. + * @param clientId - The OAuth app's client ID, when the account supplied one. + * @returns The authorized-applications URL for that client ID. + */ +export function getAuthorizedOAuthAppURL(hostname: Hostname, clientId?: ClientID): Link { + const url = new URL(`https://${hostname}`); + url.pathname = `/settings/connections/applications/${ + clientId ?? Constants.OAUTH_DEVICE_FLOW_CLIENT_ID + }`; + return url.toString() as Link; +} + /** * Return the GitHub developer settings URL appropriate for the account's auth method. * - * - Gitify OAuth App / Custom OAuth App → the OAuth app's connection page for the - * account's own client ID (falling back to Gitify's preconfigured app) + * - Gitify OAuth App / Custom OAuth App → the OAuth app's authorized-applications page * - GitHub CLI → authorized applications page * - Personal Access Token → tokens settings page * @@ -71,26 +87,17 @@ export function getGitHubAuthBaseUrl(hostname: Hostname): URL { * @returns The URL to the relevant GitHub developer settings page. */ export function getDeveloperSettingsURL(account: Account): Link { - const settingsURL = new URL(`https://${account.hostname}`); - switch (account.method) { case 'Gitify OAuth App': case 'Custom OAuth App': - settingsURL.pathname = `/settings/connections/applications/${ - account.clientId ?? Constants.OAUTH_DEVICE_FLOW_CLIENT_ID - }`; - break; + return getAuthorizedOAuthAppURL(account.hostname, account.clientId); case 'GitHub CLI': - settingsURL.pathname = '/settings/applications'; - break; + return `https://${account.hostname}/settings/applications` as Link; case 'Personal Access Token': - settingsURL.pathname = '/settings/tokens'; - break; + return `https://${account.hostname}/settings/tokens` as Link; default: - settingsURL.pathname = '/settings'; - break; + return `https://${account.hostname}/settings` as Link; } - return settingsURL.toString() as Link; } /** From 6167449b236bf64a8c5d4c20be9fd976c2de0345 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Sun, 25 Oct 2026 10:29:56 -0400 Subject: [PATCH 04/10] chore(auth): stop declaring the gitify URL scheme The runtime gitify:// callback was removed with the device-flow migration, so the packaged app should not keep advertising the scheme. Drop the electron-builder protocols declaration and the leftover test mocks. --- electron-builder.js | 6 ------ src/main/index.test.ts | 2 -- 2 files changed, 8 deletions(-) diff --git a/electron-builder.js b/electron-builder.js index dc20ce5d4..9fef15d00 100644 --- a/electron-builder.js +++ b/electron-builder.js @@ -15,12 +15,6 @@ const config = { 'package.json', ], electronLanguages: ['en'], - protocols: [ - { - name: 'Gitify', - schemes: ['gitify', 'gitify-dev'], - }, - ], mac: { category: 'public.app-category.developer-tools', icon: 'assets/images/app-icon.icns', diff --git a/src/main/index.test.ts b/src/main/index.test.ts index 56f7e478e..df8668d58 100644 --- a/src/main/index.test.ts +++ b/src/main/index.test.ts @@ -16,7 +16,6 @@ vi.mock('electron', () => ({ calls.push('whenReady'); return Promise.resolve(); }), - setAsDefaultProtocolClient: vi.fn(), on: vi.fn(), }, })); @@ -96,7 +95,6 @@ describe('main/index.ts', () => { app: { isPackaged: true, whenReady: vi.fn(() => Promise.reject(new Error('ready-failed'))), - setAsDefaultProtocolClient: vi.fn(), on: vi.fn(), }, })); From 50870d230ff25ed93b27aa3fe6f93ca5182a00a7 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Sun, 25 Oct 2026 10:30:02 -0400 Subject: [PATCH 05/10] fix(auth): prefill an inert callback URL when creating a custom app GitHub's OAuth app registration form asks for a callback URL even though the device flow never redirects. Prefill the project site so the Create new OAuth app button opens a submittable form, and assert the value in the URL builder and route tests. --- .../routes/github/LoginWithCustomOAuthApp.test.tsx | 6 ++++-- src/renderer/utils/forges/github/auth.test.ts | 6 ++++-- src/renderer/utils/forges/github/auth.ts | 9 ++++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/renderer/routes/github/LoginWithCustomOAuthApp.test.tsx b/src/renderer/routes/github/LoginWithCustomOAuthApp.test.tsx index 0987888e6..979b15af2 100644 --- a/src/renderer/routes/github/LoginWithCustomOAuthApp.test.tsx +++ b/src/renderer/routes/github/LoginWithCustomOAuthApp.test.tsx @@ -77,7 +77,7 @@ describe('renderer/routes/github/LoginWithCustomOAuthApp.tsx', () => { expect(copyToClipboardSpy).toHaveBeenCalledWith('USER-1234'); }); - it('opens the OAuth app registration page without a callback URL', async () => { + it('opens the OAuth app registration page with an inert callback URL', async () => { renderWithProviders(); await userEvent.click(screen.getByTestId('login-create-oauth-app')); @@ -85,7 +85,9 @@ describe('renderer/routes/github/LoginWithCustomOAuthApp.tsx', () => { expect(openExternalLinkSpy).toHaveBeenCalledWith( expect.stringContaining('https://github.com/settings/applications/new'), ); - expect(openExternalLinkSpy).not.toHaveBeenCalledWith(expect.stringContaining('callback_url')); + expect(openExternalLinkSpy).toHaveBeenCalledWith( + expect.stringContaining('oauth_application%5Bcallback_url%5D=https%3A%2F%2Fgitify.io'), + ); }); it('prefills the hostname and client ID from the re-auth account', () => { diff --git a/src/renderer/utils/forges/github/auth.test.ts b/src/renderer/utils/forges/github/auth.test.ts index fb922a6e9..e85d85140 100644 --- a/src/renderer/utils/forges/github/auth.test.ts +++ b/src/renderer/utils/forges/github/auth.test.ts @@ -161,8 +161,10 @@ describe('renderer/utils/forges/github/auth.ts', () => { ).toBeTruthy(); }); - it('does not pre-fill a callback URL for a device-flow custom app', () => { - expect(getNewOAuthAppURL('github.com' as Hostname)).not.toContain('callback_url'); + it('pre-fills the project site as an inert callback URL', () => { + const url = new URL(getNewOAuthAppURL('github.com' as Hostname)); + + expect(url.searchParams.get('oauth_application[callback_url]')).toBe('https://gitify.io'); }); }); diff --git a/src/renderer/utils/forges/github/auth.ts b/src/renderer/utils/forges/github/auth.ts index f10568654..dc231145c 100644 --- a/src/renderer/utils/forges/github/auth.ts +++ b/src/renderer/utils/forges/github/auth.ts @@ -122,9 +122,11 @@ export function getNewTokenURL(hostname: Hostname): Link { /** * Build a pre-filled URL for registering a new OAuth App. * - * Pre-populates the app name (with creation date) and homepage URL. No callback - * URL is set: the custom OAuth app authorizes through the device flow, which - * needs no browser redirect. The user must still enable the device flow in the + * Pre-populates the app name (with creation date), homepage URL, and an inert + * callback URL. GitHub's registration form asks for a callback URL even though + * the custom OAuth app authorizes through the device flow, which never + * redirects; the project site is used so the form can be submitted without the + * user inventing a value. The user must still enable the device flow in the * app's settings after registering it. * * @param hostname - The GitHub hostname to register the app on. @@ -138,6 +140,7 @@ export function getNewOAuthAppURL(hostname: Hostname): Link { `${APPLICATION.NAME} (Created on ${date})`, ); newOAuthAppURL.searchParams.append('oauth_application[url]', 'https://gitify.io'); + newOAuthAppURL.searchParams.append('oauth_application[callback_url]', 'https://gitify.io'); return newOAuthAppURL.toString() as Link; } From dfda21bb9e26a7f39bb9ed2ab728845776dce1d0 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Sun, 25 Oct 2026 10:41:02 -0400 Subject: [PATCH 06/10] fix(auth): mark device-flow authorizer props as read-only Resolves SonarCloud typescript:S6759 on the new custom OAuth app screen. Follow the existing Readonly convention used by the other renderer components. --- src/renderer/routes/github/DeviceFlowAuthorize.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/routes/github/DeviceFlowAuthorize.tsx b/src/renderer/routes/github/DeviceFlowAuthorize.tsx index eac8ffe0a..c921d40b6 100644 --- a/src/renderer/routes/github/DeviceFlowAuthorize.tsx +++ b/src/renderer/routes/github/DeviceFlowAuthorize.tsx @@ -48,7 +48,7 @@ export function GitHubDeviceFlowAuthorize({ clientId, hostname, title, -}: GitHubDeviceFlowAuthorizeProps) { +}: Readonly) { const navigate = useNavigate(); const location = useLocation(); const { account: reAuthAccount } = (location.state ?? {}) as LocationState; From fe38619be9203e683de1049a85cd72d7cbef9629 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Sun, 25 Oct 2026 12:08:12 -0400 Subject: [PATCH 07/10] fix(auth): keep migrated custom apps on their own settings page Accounts persisted before the device-flow migration never stored a client ID, so the Custom OAuth App settings link fell back to Gitify's preconfigured app. Send those accounts to the host's developer settings instead, where the user can find their own app and client ID. Add coverage for the legacy shape. --- src/renderer/stores/useAccountsStore.test.ts | 10 ++++++++++ src/renderer/utils/forges/github/auth.test.ts | 4 ++-- src/renderer/utils/forges/github/auth.ts | 9 +++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/renderer/stores/useAccountsStore.test.ts b/src/renderer/stores/useAccountsStore.test.ts index d00fc0563..433754e51 100644 --- a/src/renderer/stores/useAccountsStore.test.ts +++ b/src/renderer/stores/useAccountsStore.test.ts @@ -111,6 +111,16 @@ describe('renderer/stores/useAccountsStore.ts', () => { expect(account.token).toBe(mockCustomOAuthAppAccount.token); expect(account.clientId).toBe('CUSTOM_CLIENT_ID_123'); }); + + it('relabels a legacy OAuth App account that never stored a client ID', () => { + const [account] = sanitizeAccounts([ + { ...mockCustomOAuthAppAccount, method: 'OAuth App' as AuthMethod, clientId: undefined }, + ]); + + expect(account.method).toBe('Custom OAuth App'); + expect(account.token).toBe(mockCustomOAuthAppAccount.token); + expect(account.clientId).toBeUndefined(); + }); }); it.each([ diff --git a/src/renderer/utils/forges/github/auth.test.ts b/src/renderer/utils/forges/github/auth.test.ts index e85d85140..d60d19868 100644 --- a/src/renderer/utils/forges/github/auth.test.ts +++ b/src/renderer/utils/forges/github/auth.test.ts @@ -98,13 +98,13 @@ describe('renderer/utils/forges/github/auth.ts', () => { ).toBe('https://github.com/settings/connections/applications/CUSTOM_CLIENT_ID_123'); }); - it('falls back to the preconfigured app when a custom account stores no client ID', () => { + it('points at the developer settings when a migrated custom account stores no client ID', () => { expect( getDeveloperSettingsURL({ hostname: 'github.com' as Hostname, method: 'Custom OAuth App', } as Account), - ).toBe('https://github.com/settings/connections/applications/FAKE_CLIENT_ID_123'); + ).toBe('https://github.com/settings/developers'); }); it('returns the PAT settings URL', () => { diff --git a/src/renderer/utils/forges/github/auth.ts b/src/renderer/utils/forges/github/auth.ts index f161b3808..ba2d6deb8 100644 --- a/src/renderer/utils/forges/github/auth.ts +++ b/src/renderer/utils/forges/github/auth.ts @@ -79,7 +79,9 @@ export function getAuthorizedOAuthAppURL(hostname: Hostname, clientId?: ClientID /** * Return the GitHub developer settings URL appropriate for the account's auth method. * - * - Gitify OAuth App / Custom OAuth App → the OAuth app's authorized-applications page + * - Gitify OAuth App → Gitify's authorized-applications page + * - Custom OAuth App → the account's own app when its client ID is known; otherwise + * the host's OAuth apps list, where a migrated account can find its client ID again * - GitHub CLI → authorized applications page * - Personal Access Token → tokens settings page * @@ -89,8 +91,11 @@ export function getAuthorizedOAuthAppURL(hostname: Hostname, clientId?: ClientID export function getDeveloperSettingsURL(account: Account): Link { switch (account.method) { case 'Gitify OAuth App': + return getAuthorizedOAuthAppURL(account.hostname); case 'Custom OAuth App': - return getAuthorizedOAuthAppURL(account.hostname, account.clientId); + return account.clientId + ? getAuthorizedOAuthAppURL(account.hostname, account.clientId) + : (`https://${account.hostname}/settings/developers` as Link); case 'GitHub CLI': return `https://${account.hostname}/settings/applications` as Link; case 'Personal Access Token': From 2b9a5640854f3172b48e45828f9d63fba295d061 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Wed, 28 Oct 2026 19:12:16 -0400 Subject: [PATCH 08/10] fix(filters): prune account filters that no longer match an account --- src/renderer/stores/subscriptions.test.ts | 20 ++++++++++++++++- src/renderer/stores/subscriptions.ts | 25 ++++++++++++++++++++- src/renderer/stores/types.ts | 1 + src/renderer/stores/useFiltersStore.test.ts | 23 ++++++++++++++++++- src/renderer/stores/useFiltersStore.ts | 10 +++++++++ 5 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/renderer/stores/subscriptions.test.ts b/src/renderer/stores/subscriptions.test.ts index bb2f5c989..127952285 100644 --- a/src/renderer/stores/subscriptions.test.ts +++ b/src/renderer/stores/subscriptions.test.ts @@ -1,8 +1,13 @@ -import type { Percentage } from '../types'; +import { mockGitHubCloudAccount } from '../__mocks__/account-mocks'; +import type { AccountUUID, Percentage } from '../types'; + +import { getAccountUUID } from '../utils/auth/utils'; import * as comms from '../utils/system/comms'; import * as zoom from '../utils/ui/zoom'; import { initializeStoreSubscriptions } from './subscriptions'; +import useAccountsStore from './useAccountsStore'; +import useFiltersStore from './useFiltersStore'; import useSettingsStore from './useSettingsStore'; describe('renderer/stores/subscriptions.ts', () => { @@ -68,6 +73,19 @@ describe('renderer/stores/subscriptions.ts', () => { expect(setUseX11BackendSpy).toHaveBeenCalledWith(true); }); + it('prunes account filters that no longer match an account', () => { + useAccountsStore.setState({ accounts: [mockGitHubCloudAccount] }); + useFiltersStore.setState({ + accounts: [getAccountUUID(mockGitHubCloudAccount), 'stale' as AccountUUID], + }); + + cleanup = initializeStoreSubscriptions(); + expect(useFiltersStore.getState().accounts).toEqual([getAccountUUID(mockGitHubCloudAccount)]); + + useAccountsStore.setState({ accounts: [] }); + expect(useFiltersStore.getState().accounts).toEqual([]); + }); + it('applies zoom level when zoom percentage changes', () => { cleanup = initializeStoreSubscriptions(); vi.clearAllMocks(); diff --git a/src/renderer/stores/subscriptions.ts b/src/renderer/stores/subscriptions.ts index b61e52a27..bae5058d3 100644 --- a/src/renderer/stores/subscriptions.ts +++ b/src/renderer/stores/subscriptions.ts @@ -5,6 +5,7 @@ * to ensure proper lifecycle management and cleanup on unmount. */ +import { getAccountUUID } from '../utils/auth/utils'; import { setAutoLaunch, setKeepWindowOnBlur, @@ -14,7 +15,7 @@ import { setUseX11Backend, } from '../utils/system/comms'; import { zoomLevelToPercentage, zoomPercentageToLevel } from '../utils/ui/zoom'; -import { useSettingsStore } from './'; +import { useAccountsStore, useFiltersStore, useSettingsStore } from './'; /** * Initialize all store side-effect subscriptions and startup values for main. @@ -132,6 +133,28 @@ export function initializeStoreSubscriptions(): () => void { clearTimeout(timeout); }); + // ======================================================================== + // Accounts Store Side Effects + // ======================================================================== + + // Account filters are keyed by account UUID, which embeds the hostname, user + // and auth method. Drop any that no longer match an account (logout, or a + // UUID change such as an auth-method relabel) so they cannot silently hide + // notifications. + const pruneAccountFilters = () => { + useFiltersStore + .getState() + .pruneAccounts(useAccountsStore.getState().accounts.map(getAccountUUID)); + }; + pruneAccountFilters(); + + const unsubAccounts = useAccountsStore.subscribe((state, prevState) => { + if (state.accounts !== prevState.accounts) { + pruneAccountFilters(); + } + }); + unsubscribers.push(unsubAccounts); + // Filter changes need no subscription here: the notifications query caches // unfiltered data and useNotifications recreates its `select` whenever the // filters store changes, so filtering is applied instantly without refetching. diff --git a/src/renderer/stores/types.ts b/src/renderer/stores/types.ts index 287391c18..cb56d150a 100644 --- a/src/renderer/stores/types.ts +++ b/src/renderer/stores/types.ts @@ -159,6 +159,7 @@ export type UpdateFilter = ( export interface FiltersActions { hasActiveFilters: () => boolean; updateFilter: UpdateFilter; + pruneAccounts: (validAccounts: AccountUUID[]) => void; reset: () => void; } diff --git a/src/renderer/stores/useFiltersStore.test.ts b/src/renderer/stores/useFiltersStore.test.ts index 035f77e6e..ecd938e60 100644 --- a/src/renderer/stores/useFiltersStore.test.ts +++ b/src/renderer/stores/useFiltersStore.test.ts @@ -1,6 +1,6 @@ import { act, renderHook } from '@testing-library/react'; -import type { SearchToken } from '../types'; +import type { AccountUUID, SearchToken } from '../types'; import { DEFAULT_FILTERS_STATE } from './defaults'; import useFiltersStore from './useFiltersStore'; @@ -89,4 +89,25 @@ describe('renderer/stores/useFiltersStore.ts', () => { expect(useFiltersStore.getState().hasActiveFilters()).toBe(true); }); }); + + describe('pruneAccounts', () => { + it('keeps only account filters that match a known account', () => { + useFiltersStore.setState({ + accounts: ['valid' as AccountUUID, 'stale' as AccountUUID], + }); + + useFiltersStore.getState().pruneAccounts(['valid' as AccountUUID]); + + expect(useFiltersStore.getState().accounts).toEqual(['valid']); + }); + + it('leaves state untouched when every account filter is still valid', () => { + const accounts = ['valid' as AccountUUID]; + useFiltersStore.setState({ accounts }); + + useFiltersStore.getState().pruneAccounts(['valid' as AccountUUID, 'other' as AccountUUID]); + + expect(useFiltersStore.getState().accounts).toBe(accounts); + }); + }); }); diff --git a/src/renderer/stores/useFiltersStore.ts b/src/renderer/stores/useFiltersStore.ts index 3ac784354..7f492cdb7 100644 --- a/src/renderer/stores/useFiltersStore.ts +++ b/src/renderer/stores/useFiltersStore.ts @@ -47,6 +47,16 @@ const useFiltersStore = create()( }); }, + /** Drops account filters that no longer match any of the given account UUIDs. */ + pruneAccounts: (validAccounts) => { + const current = get().accounts; + const pruned = current.filter((uuid) => validAccounts.includes(uuid)); + + if (pruned.length !== current.length) { + set({ accounts: pruned }); + } + }, + /** Resets the store to its default state, clearing all active filters. */ reset: () => { set({ ...DEFAULT_FILTERS_STATE }); From e90eab93c57e02f9945bbfabe6b304827467f98e Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Wed, 28 Oct 2026 19:12:20 -0400 Subject: [PATCH 09/10] fix(auth): point device-flow-disabled guidance at developer settings --- src/renderer/utils/forges/github/flows.test.ts | 4 +--- src/renderer/utils/forges/github/flows.ts | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/renderer/utils/forges/github/flows.test.ts b/src/renderer/utils/forges/github/flows.test.ts index dd601f413..8211088e7 100644 --- a/src/renderer/utils/forges/github/flows.test.ts +++ b/src/renderer/utils/forges/github/flows.test.ts @@ -190,9 +190,7 @@ describe('renderer/utils/forges/github/flows.ts', () => { ); expect(message).toContain('Device flow is not enabled'); - expect(message).toContain( - 'https://github.example.com/settings/applications/CUSTOM_CLIENT_ID_123', - ); + expect(message).toContain('https://github.example.com/settings/developers'); }); it('names an unrecognized client ID as invalid for the host', () => { diff --git a/src/renderer/utils/forges/github/flows.ts b/src/renderer/utils/forges/github/flows.ts index ffc8a4229..6cb767114 100644 --- a/src/renderer/utils/forges/github/flows.ts +++ b/src/renderer/utils/forges/github/flows.ts @@ -81,7 +81,7 @@ export function describeDeviceFlowStartError( switch (errorCode) { case 'device_flow_disabled': return clientId - ? `Device flow is not enabled for this OAuth app. Enable it in that app's settings at https://${hostname}/settings/applications/${clientId}, then try again.` + ? `Device flow is not enabled for this OAuth app. Enable it in that app's settings under https://${hostname}/settings/developers, then try again.` : `Device flow is not enabled for this OAuth app. Enable it in the app's settings on ${hostname}, then try again.`; case 'incorrect_client_credentials': return `The client ID is not valid for ${hostname}. Check it and try again.`; From 824f38b4a0f5c91d64fb9aec4e0ed5cd9cea8b61 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Wed, 28 Oct 2026 19:28:38 -0400 Subject: [PATCH 10/10] test: update glass visual baselines for the custom OAuth app login --- .../login-dark-glass-chromium-linux.png | Bin 27527 -> 28282 bytes ...om-oauth-app-dark-glass-chromium-linux.png | Bin 0 -> 33770 bytes ...m-oauth-app-light-glass-chromium-linux.png | Bin 0 -> 32348 bytes .../login-light-glass-chromium-linux.png | Bin 27210 -> 27954 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-custom-oauth-app-dark-glass-chromium-linux.png create mode 100644 src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-custom-oauth-app-light-glass-chromium-linux.png diff --git a/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-dark-glass-chromium-linux.png b/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-dark-glass-chromium-linux.png index 25182533a49e6899f66231f881fd9def88e8ecb0..4d44ca267aeec9790bd477880b0c6912f1d4fa08 100644 GIT binary patch literal 28282 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 literal 0 HcmV?d00001 diff --git a/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-custom-oauth-app-light-glass-chromium-linux.png b/src/renderer/routes/__screenshots__/routes.visual.test.tsx/login-github-custom-oauth-app-light-glass-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..994cefa6ae4be5e5f6ad22106d9d87149b7572fa GIT binary patch literal 32348 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 R9ef4hA&r_PCK1` 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