Skip to content

Commit 23032c2

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
refactor(oracle-fusion): narrow shared infrastructure footprint
1 parent 5027685 commit 23032c2

6 files changed

Lines changed: 6 additions & 83 deletions

File tree

apps/docs/components/icons.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9287,9 +9287,6 @@ export function NetSuiteIcon(props: SVGProps<SVGSVGElement>) {
92879287
)
92889288
}
92899289

9290-
/** Oracle's red oval, shared by Oracle product integrations. */
9291-
export const OracleIcon = NetSuiteIcon
9292-
92939290
export function WizaIcon(props: SVGProps<SVGSVGElement>) {
92949291
return (
92959292
<svg {...props} viewBox='0 0 51 49' fill='none' xmlns='http://www.w3.org/2000/svg'>

apps/sim/components/icons.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9287,9 +9287,6 @@ export function NetSuiteIcon(props: SVGProps<SVGSVGElement>) {
92879287
)
92889288
}
92899289

9290-
/** Oracle's red oval, shared by Oracle product integrations. */
9291-
export const OracleIcon = NetSuiteIcon
9292-
92939290
export function WizaIcon(props: SVGProps<SVGSVGElement>) {
92949291
return (
92959292
<svg {...props} viewBox='0 0 51 49' fill='none' xmlns='http://www.w3.org/2000/svg'>

apps/sim/lib/credentials/service-account-secret.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,6 @@ describe('verifyAndBuildServiceAccountSecret', () => {
282282
clientId: ' integration-user ',
283283
clientSecret: ' password ',
284284
certificateId: 'discard-me',
285-
dataCenter: 'discard-me',
286285
authMethod: 'discard-me',
287286
privateKey: 'discard-me',
288287
username: 'discard-me',

apps/sim/lib/credentials/service-account-secret.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ async function buildClientCredentialAccountSecret(
299299
? fields.certificateId?.trim() || undefined
300300
: undefined,
301301
orgId: fields.orgId?.trim() ?? '',
302-
dataCenter: usesField('dataCenter') ? fields.dataCenter?.trim() || undefined : undefined,
302+
dataCenter: fields.dataCenter?.trim() || undefined,
303303
authMethod: resolvedAuthMethod,
304304
clientSecret: usesField('clientSecret') ? fields.clientSecret?.trim() || undefined : undefined,
305305
privateKey: usesField('privateKey') ? fields.privateKey?.trim() || undefined : undefined,

apps/sim/lib/oauth/credential-service.test.ts

Lines changed: 1 addition & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'
77

88
const mocks = vi.hoisted(() => ({
99
coalesceLocally: vi.fn(),
10-
clientCredentialMinter: vi.fn(),
11-
decryptSecret: vi.fn(),
1210
getFreshestSlackChain: vi.fn(),
1311
getRecentTerminalError: vi.fn(),
1412
logger: {
@@ -35,15 +33,6 @@ vi.mock('@/lib/concurrency/leader-lock', () => ({
3533
withLeaderLock: mocks.withLeaderLock,
3634
}))
3735

38-
vi.mock('@/lib/core/security/encryption', () => ({
39-
decryptSecret: mocks.decryptSecret,
40-
}))
41-
42-
vi.mock('@/lib/credentials/client-credential-accounts/server', () => ({
43-
getClientCredentialAccountMinter: () => mocks.clientCredentialMinter,
44-
parseClientCredentialAccountSecretBlob: (decrypted: string) => JSON.parse(decrypted),
45-
}))
46-
4736
vi.mock('@/lib/oauth/instagram', () => ({
4837
isInstagramProvider: vi.fn(() => false),
4938
shouldProactivelyRefreshInstagramToken: vi.fn(() => false),
@@ -75,10 +64,7 @@ vi.mock('@/lib/oauth/terminal-errors', () => ({
7564
markCredentialDead: vi.fn(),
7665
}))
7766

78-
import {
79-
resolveCredentialTokenBundle,
80-
resolveServiceAccountToken,
81-
} from '@/lib/oauth/credential-service'
67+
import { resolveCredentialTokenBundle } from '@/lib/oauth/credential-service'
8268

8369
const RAW_CREDENTIAL_ID = 'credential-raw-secret-id'
8470
const RAW_ACCOUNT_ID = 'account-raw-secret-id'
@@ -214,51 +200,3 @@ describe('resolveCredentialTokenBundle selector privacy', () => {
214200
expect(slack.logs).toContain(RAW_PROVIDER_ERROR)
215201
})
216202
})
217-
218-
describe('resolveServiceAccountToken Oracle Fusion cache', () => {
219-
beforeEach(() => {
220-
vi.clearAllMocks()
221-
resetDbChainMock()
222-
mocks.coalesceLocally.mockImplementation(
223-
async (_key: string, producer: () => Promise<unknown>) => producer()
224-
)
225-
mocks.decryptSecret.mockImplementation(async (encrypted: string) => ({
226-
decrypted: JSON.stringify({
227-
type: 'client_credential_account',
228-
providerId: 'oracle-fusion-service-account',
229-
clientId: 'integration-user',
230-
clientSecret: encrypted,
231-
orgId: 'https://vision.fa.us2.oraclecloud.com',
232-
}),
233-
}))
234-
mocks.clientCredentialMinter.mockImplementation(async (fields: { clientSecret: string }) => ({
235-
accessToken: `basic-${fields.clientSecret}`,
236-
expiresInSeconds: 300,
237-
instanceUrl: 'https://vision.fa.us2.oraclecloud.com',
238-
}))
239-
})
240-
241-
it('reuses Basic material for five minutes and invalidates it on encrypted-secret rotation', async () => {
242-
const credentialId = 'oracle-fusion-cache-test'
243-
const providerId = 'oracle-fusion-service-account'
244-
const encryptedV1 = 'encrypted-v1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
245-
const encryptedV2 = 'encrypted-v2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
246-
247-
queueTableRows(credential, [{ encryptedServiceAccountKey: encryptedV1 }])
248-
await expect(resolveServiceAccountToken(credentialId, providerId)).resolves.toMatchObject({
249-
accessToken: `basic-${encryptedV1}`,
250-
})
251-
252-
queueTableRows(credential, [{ encryptedServiceAccountKey: encryptedV1 }])
253-
await expect(resolveServiceAccountToken(credentialId, providerId)).resolves.toMatchObject({
254-
accessToken: `basic-${encryptedV1}`,
255-
})
256-
expect(mocks.clientCredentialMinter).toHaveBeenCalledTimes(1)
257-
258-
queueTableRows(credential, [{ encryptedServiceAccountKey: encryptedV2 }])
259-
await expect(resolveServiceAccountToken(credentialId, providerId)).resolves.toMatchObject({
260-
accessToken: `basic-${encryptedV2}`,
261-
})
262-
expect(mocks.clientCredentialMinter).toHaveBeenCalledTimes(2)
263-
})
264-
})

apps/sim/lib/oauth/credential-service.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ import { withLeaderLock } from '@/lib/concurrency/leader-lock'
88
import { coalesceLocally } from '@/lib/concurrency/singleflight'
99
import { env } from '@/lib/core/config/env'
1010
import { decryptSecret } from '@/lib/core/security/encryption'
11-
import {
12-
isClientCredentialAccountProviderId,
13-
ORACLE_FUSION_SERVICE_ACCOUNT_PROVIDER_ID,
14-
} from '@/lib/credentials/client-credential-accounts/descriptors'
11+
import { isClientCredentialAccountProviderId } from '@/lib/credentials/client-credential-accounts/descriptors'
1512
import {
1613
getClientCredentialAccountMinter,
1714
parseClientCredentialAccountSecretBlob,
@@ -469,13 +466,11 @@ interface FailedClientCredentialMint {
469466

470467
/**
471468
* Per-instance cache of minted client-credential access tokens (Zoom S2S,
472-
* Box CCG, Salesforce, NetSuite, Oracle Fusion), keyed by credential id. Entries are
469+
* Box CCG, Salesforce, NetSuite), keyed by credential id. Entries are
473470
* served while more than {@link CLIENT_CREDENTIAL_TOKEN_MIN_TTL_MS} of
474471
* validity remains, so a hot credential mints roughly once per token TTL
475472
* (~1h for Zoom/Box/NetSuite; Salesforce reports a conservative 10-minute TTL
476-
* because its responses never carry an expiry) per instance. Oracle Fusion's
477-
* locally derived, non-expiring Basic value instead uses its complete
478-
* five-minute synthetic lifetime.
473+
* because its responses never carry an expiry) per instance.
479474
*
480475
* Every resolution re-reads the credential row (a cheap indexed PK select —
481476
* the mint is the expensive part) and validates the cached entry's secret
@@ -555,10 +550,7 @@ async function resolveClientCredentialAccountToken(
555550
if (
556551
cached &&
557552
cached.secretFingerprint === secretFingerprint &&
558-
cached.expiresAtMs - Date.now() >
559-
(providerId === ORACLE_FUSION_SERVICE_ACCOUNT_PROVIDER_ID
560-
? 0
561-
: CLIENT_CREDENTIAL_TOKEN_MIN_TTL_MS)
553+
cached.expiresAtMs - Date.now() > CLIENT_CREDENTIAL_TOKEN_MIN_TTL_MS
562554
) {
563555
return {
564556
accessToken: cached.accessToken,

0 commit comments

Comments
 (0)