π File detail
components/ManagedSettingsSecurityDialog/utils.ts
π§© .tsπ 145 linesπΎ 3,979 bytesπ text
β Back to All Filesπ― Use case
This file lives under βcomponents/β, which covers shared React UI pieces. On the API surface it exposes DangerousSettings, extractDangerousSettings, hasDangerousSettings, hasDangerousSettingsChanged, and formatDangerousSettingsList β mainly functions, hooks, or classes.
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
import { DANGEROUS_SHELL_SETTINGS, SAFE_ENV_VARS, } from '../../utils/managedEnvConstants.js' import type { SettingsJson } from '../../utils/settings/types.js'
π€ Exports (heuristic)
DangerousSettingsextractDangerousSettingshasDangerousSettingshasDangerousSettingsChangedformatDangerousSettingsList
π₯οΈ Source preview
import {
DANGEROUS_SHELL_SETTINGS,
SAFE_ENV_VARS,
} from '../../utils/managedEnvConstants.js'
import type { SettingsJson } from '../../utils/settings/types.js'
import { jsonStringify } from '../../utils/slowOperations.js'
type DangerousShellSetting = (typeof DANGEROUS_SHELL_SETTINGS)[number]
export type DangerousSettings = {
shellSettings: Partial<Record<DangerousShellSetting, string>>
envVars: Record<string, string>
hasHooks: boolean
hooks?: unknown
}
/**
* Extract dangerous settings from a settings object.
*
* Dangerous env vars are determined by checking against SAFE_ENV_VARS -
* any env var NOT in SAFE_ENV_VARS is considered dangerous.
* See managedEnv.ts for the authoritative list and threat categories.
*/
export function extractDangerousSettings(
settings: SettingsJson | null | undefined,
): DangerousSettings {
if (!settings) {
return {
shellSettings: {},
envVars: {},
hasHooks: false,
}
}
// Extract dangerous shell settings
const shellSettings: Partial<Record<DangerousShellSetting, string>> = {}
for (const key of DANGEROUS_SHELL_SETTINGS) {
const value = settings[key]
if (typeof value === 'string' && value.length > 0) {
shellSettings[key] = value
}
}
// Extract dangerous env vars - any var NOT in SAFE_ENV_VARS is dangerous
const envVars: Record<string, string> = {}
if (settings.env && typeof settings.env === 'object') {
for (const [key, value] of Object.entries(settings.env)) {
if (typeof value === 'string' && value.length > 0) {
// Check if this env var is NOT in the safe list
if (!SAFE_ENV_VARS.has(key.toUpperCase())) {
envVars[key] = value
}
}
}
}
// Check for hooks
const hasHooks =
settings.hooks !== undefined &&
settings.hooks !== null &&
typeof settings.hooks === 'object' &&
Object.keys(settings.hooks).length > 0
return {
shellSettings,
envVars,
hasHooks,
hooks: hasHooks ? settings.hooks : undefined,
}
}
/**
* Check if settings contain any dangerous settings
*/
export function hasDangerousSettings(dangerous: DangerousSettings): boolean {
return (
Object.keys(dangerous.shellSettings).length > 0 ||
Object.keys(dangerous.envVars).length > 0 ||
dangerous.hasHooks
)
}
/**
* Compare two sets of dangerous settings to see if the new settings
* have changed or added dangerous settings compared to the old settings
*/
export function hasDangerousSettingsChanged(
oldSettings: SettingsJson | null | undefined,
newSettings: SettingsJson | null | undefined,
): boolean {
const oldDangerous = extractDangerousSettings(oldSettings)
const newDangerous = extractDangerousSettings(newSettings)
// If new settings don't have any dangerous settings, no prompt needed
if (!hasDangerousSettings(newDangerous)) {
return false
}
// If old settings didn't have dangerous settings but new does, prompt needed
if (!hasDangerousSettings(oldDangerous)) {
return true
}
// Compare the dangerous settings - any change triggers a prompt
const oldJson = jsonStringify({
shellSettings: oldDangerous.shellSettings,
envVars: oldDangerous.envVars,
hooks: oldDangerous.hooks,
})
const newJson = jsonStringify({
shellSettings: newDangerous.shellSettings,
envVars: newDangerous.envVars,
hooks: newDangerous.hooks,
})
return oldJson !== newJson
}
/**
* Format dangerous settings as a human-readable list for the UI
* Only returns setting names, not values
*/
export function formatDangerousSettingsList(
dangerous: DangerousSettings,
): string[] {
const items: string[] = []
// Shell settings (names only)
for (const key of Object.keys(dangerous.shellSettings)) {
items.push(key)
}
// Env vars (names only)
for (const key of Object.keys(dangerous.envVars)) {
items.push(key)
}
// Hooks
if (dangerous.hasHooks) {
items.push('hooks')
}
return items
}