Skip to content

Commit 716ab63

Browse files
committed
patches
1 parent effc9e6 commit 716ab63

File tree

5 files changed

+59
-33
lines changed

5 files changed

+59
-33
lines changed

lib/commands/login/index.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import prompts from 'prompts'
55
import terminalLink from 'terminal-link'
66

77
import { AuthError, InputError } from '../../utils/errors.js'
8-
import { setupSdk } from '../../utils/sdk.js'
8+
import { FREE_API_KEY, setupSdk } from '../../utils/sdk.js'
99
import { getSetting, updateSetting } from '../../utils/settings.js'
1010

1111
const description = 'Socket API login'
@@ -43,16 +43,18 @@ export const login = {
4343
if (!isInteractive()) {
4444
throw new InputError('cannot prompt for credentials in a non-interactive shell')
4545
}
46-
const { apiKey } = await prompts({
46+
const result = await prompts({
4747
type: 'password',
4848
name: 'apiKey',
4949
message: `Enter your ${terminalLink(
5050
'Socket.dev API key',
5151
'https://docs.socket.dev/docs/api-keys'
52-
)}`,
52+
)} (leave blank for a public key)`,
5353
onState: promptAbortHandler
5454
})
5555

56+
const apiKey = result.apiKey || FREE_API_KEY
57+
5658
const spinner = ora('Verifying API key...').start()
5759

5860
/** @type {import('@socketsecurity/sdk').SocketSdkReturnType<'getSettings'>['data']} */
@@ -77,35 +79,35 @@ export const login = {
7779
value: org.id
7880
}))
7981

80-
/** @type {string | null} */
81-
let enforcedOrg = null
82+
/** @type {string[]} */
83+
let enforcedOrgs = []
8284

8385
if (enforcedChoices.length > 1) {
8486
const { id } = await prompts({
8587
type: 'select',
8688
name: 'id',
8789
hint: '\n Pick "None" if this is a personal device',
88-
message: 'Which organization\'s policies should Socket globally enforce?',
90+
message: 'Which organization\'s policies should Socket enforce system-wide?',
8991
choices: enforcedChoices.concat({
9092
title: 'None',
9193
value: null
9294
}),
9395
onState: promptAbortHandler
9496
})
95-
enforcedOrg = id
97+
if (id) enforcedOrgs = [id]
9698
} else if (enforcedChoices.length) {
9799
const { confirmOrg } = await prompts({
98100
type: 'confirm',
99101
name: 'confirmOrg',
100-
message: `Should Socket globally enforce ${enforcedChoices[0]?.title}'s security policies?`,
102+
message: `Should Socket enforce ${enforcedChoices[0]?.title}'s security policies system-wide?`,
101103
initial: true,
102104
onState: promptAbortHandler
103105
})
104106
if (confirmOrg) {
105-
enforcedOrg = enforcedChoices[0]?.value
107+
enforcedOrgs = [enforcedChoices[0]?.value]
106108
}
107109
}
108-
updateSetting('enforcedOrg', enforcedOrg)
110+
updateSetting('enforcedOrgs', enforcedOrgs)
109111
const oldKey = getSetting('apiKey')
110112
updateSetting('apiKey', apiKey)
111113
spinner.succeed(`API credentials ${oldKey ? 'updated' : 'set'}`)

lib/commands/logout/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const logout = {
2727
if (cli.input.length) cli.showHelp()
2828

2929
updateSetting('apiKey', null)
30-
updateSetting('enforcedOrg', null)
30+
updateSetting('enforcedOrgs', null)
3131
ora('Successfully logged out').succeed()
3232
}
3333
}

lib/shadow/npm-injection.cjs

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,10 @@ const apiKeySettingsPromise = sdkPromise.then(async ({ setupSdk }) => {
4242
return result.data
4343
})
4444

45-
/** @type {Promise<{ id: string, issueRules: import('../utils/settings.js').IssueRules }[]>} */
45+
/** @type {Promise<{ defaultRules: import('../utils/settings.js').IssueRules, orgRules: { id: string, issueRules: import('../utils/settings.js').IssueRules }[] }>} */
4646
const orgSettingsPromise = settingsPromise.then(async ({ getSetting, updateSetting }) => {
47-
const enforcedOrg = getSetting('enforcedOrg')
47+
const enforcedOrgs = getSetting('enforcedOrgs')
4848
const settings = await apiKeySettingsPromise
49-
const enforcedRules = enforcedOrg && settings.organizations[enforcedOrg] || {}
5049

5150
/**
5251
* @param {import('../utils/settings.js').IssueRules[string]} rule
@@ -62,29 +61,54 @@ const orgSettingsPromise = settingsPromise.then(async ({ getSetting, updateSetti
6261
}
6362
}
6463

65-
return Object.values(settings.organizations).map(({ id, issueRules }) => {
66-
const defaultedRules = { ...issueRules }
67-
for (const rule in enforcedRules) {
64+
/**
65+
*
66+
* @param {import('../utils/settings.js').IssueRules} a
67+
* @param {import('../utils/settings.js').IssueRules} b
68+
* @returns {import('../utils/settings.js').IssueRules}
69+
*/
70+
const mergeRules = (a, b) => {
71+
const merged = { ...a }
72+
for (const rule in b) {
6873
if (
69-
!defaultedRules[rule] ||
70-
ruleStrength(enforcedRules[rule]) > ruleStrength(defaultedRules[rule])
74+
!merged[rule] ||
75+
ruleStrength(b[rule]) > ruleStrength(merged[rule])
7176
) {
72-
defaultedRules[rule] = enforcedRules[rule]
77+
merged[rule] = b[rule]
7378
}
7479
}
80+
return merged
81+
}
82+
83+
const mergeDefaults = (rules) => {
84+
const out = { ...rules }
7585
for (const rule in settings.defaultIssueRules) {
76-
if (!(rule in defaultedRules) || (
77-
typeof defaultedRules[rule] === 'object' &&
78-
defaultedRules[rule].action === 'defer'
86+
const defaultedRule = out[rule]
87+
if (
88+
!(rule in out) || (
89+
typeof defaultedRule === 'object' &&
90+
defaultedRule.action === 'defer'
7991
)) {
80-
defaultedRules[rule] = settings.defaultIssueRules[rule]
92+
out[rule] = settings.defaultIssueRules[rule]
8193
}
8294
}
83-
return {
84-
id,
85-
issueRules: defaultedRules
86-
}
87-
})
95+
return out
96+
}
97+
98+
const enforcedRules = enforcedOrgs
99+
.map(org => settings.organizations[org])
100+
.reduce((a, b) => mergeRules(a, b))
101+
102+
return {
103+
defaultRules: mergeDefaults(enforcedRules),
104+
orgRules: Object.values(settings.organizations).map(({ id, name, issueRules }) => {
105+
return {
106+
id,
107+
name,
108+
issueRules: mergeDefaults(mergeRules(issueRules, enforcedRules))
109+
}
110+
})
111+
}
88112
})
89113

90114
// shadow `npm` and `npx` to mitigate subshells
@@ -467,13 +491,13 @@ async function packagesHaveRiskyIssues (registry, pkgs, ora = null, input, outpu
467491
}
468492
}
469493
if (failures.length || warns.length) {
470-
failed = failures.length > 0
494+
failed ||= failures.length > 0
471495
spinner?.stop()
472496
translations ??= JSON.parse(fs.readFileSync(path.join(__dirname, '/translations.json'), 'utf-8'))
473497
formatter ??= new ((await chalkMarkdownPromise).ChalkOrMarkdown)(false)
474498
const name = pkgData.pkg
475499
const version = pkgData.ver
476-
output.write(`(socket) ${formatter.hyperlink(`${name}@${version}`, `https://socket.dev/npm/package/${name}/overview/${version}`)} contains ${failures.length ? 'serious ' : ''}risks:\n`)
500+
output.write(`(socket) ${formatter.hyperlink(`${name}@${version}`, `https://socket.dev/npm/package/${name}/overview/${version}`)} contains risks:\n`)
477501
if (translations) {
478502
for (const failure of failures) {
479503
// @ts-ignore

lib/utils/sdk.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export async function setupSdk (apiKey = getDefaultKey()) {
3333
const input = await prompts({
3434
type: 'password',
3535
name: 'apiKey',
36-
message: 'Enter your Socket.dev API key (not saved)',
36+
message: 'Enter your Socket.dev API key (not saved, use socket login to persist)',
3737
})
3838

3939
apiKey = defaultKey = input.apiKey

lib/utils/settings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const settingsPath = path.join(dataHome, 'socket', 'settings')
2323
* @typedef {import('@socketsecurity/sdk').SocketSdkReturnType<'getSettings'>['data']['organizations'][string]['issueRules']} IssueRules
2424
*/
2525

26-
/** @type {{apiKey?: string | null, enforcedOrg?: string | null}} */
26+
/** @type {{apiKey?: string | null, enforcedOrgs?: string[] | null}} */
2727
let settings = {}
2828

2929
if (fs.existsSync(settingsPath)) {

0 commit comments

Comments
 (0)