| /** | |
| * Shared constants and path builders for MDM settings modules. | |
| * | |
| * This module has ZERO heavy imports (only `os`) — safe to use from mdmRawRead.ts. | |
| * Both mdmRawRead.ts and mdmSettings.ts import from here to avoid duplication. | |
| */ | |
| import { homedir, userInfo } from 'os' | |
| import { join } from 'path' | |
| /** macOS preference domain for Claude Code MDM profiles. */ | |
| export const MACOS_PREFERENCE_DOMAIN = 'com.anthropic.claudecode' | |
| /** | |
| * Windows registry key paths for Claude Code MDM policies. | |
| * | |
| * These keys live under SOFTWARE\Policies which is on the WOW64 shared key | |
| * list — both 32-bit and 64-bit processes see the same values without | |
| * redirection. Do not move these to SOFTWARE\ClaudeCode, as SOFTWARE is | |
| * redirected and 32-bit processes would silently read from WOW6432Node. | |
| * See: https://learn.microsoft.com/en-us/windows/win32/winprog64/shared-registry-keys | |
| */ | |
| export const WINDOWS_REGISTRY_KEY_PATH_HKLM = | |
| 'HKLM\\SOFTWARE\\Policies\\ClaudeCode' | |
| export const WINDOWS_REGISTRY_KEY_PATH_HKCU = | |
| 'HKCU\\SOFTWARE\\Policies\\ClaudeCode' | |
| /** Windows registry value name containing the JSON settings blob. */ | |
| export const WINDOWS_REGISTRY_VALUE_NAME = 'Settings' | |
| /** Path to macOS plutil binary. */ | |
| export const PLUTIL_PATH = '/usr/bin/plutil' | |
| /** Arguments for plutil to convert plist to JSON on stdout (append plist path). */ | |
| export const PLUTIL_ARGS_PREFIX = ['-convert', 'json', '-o', '-', '--'] as const | |
| /** Subprocess timeout in milliseconds. */ | |
| export const MDM_SUBPROCESS_TIMEOUT_MS = 5000 | |
| /** | |
| * Build the list of macOS plist paths in priority order (highest first). | |
| * Evaluates `process.env.USER_TYPE` at call time so ant-only paths are | |
| * included only when appropriate. | |
| */ | |
| export function getMacOSPlistPaths(): Array<{ path: string; label: string }> { | |
| let username = '' | |
| try { | |
| username = userInfo().username | |
| } catch { | |
| // ignore | |
| } | |
| const paths: Array<{ path: string; label: string }> = [] | |
| if (username) { | |
| paths.push({ | |
| path: `/Library/Managed Preferences/${username}/${MACOS_PREFERENCE_DOMAIN}.plist`, | |
| label: 'per-user managed preferences', | |
| }) | |
| } | |
| paths.push({ | |
| path: `/Library/Managed Preferences/${MACOS_PREFERENCE_DOMAIN}.plist`, | |
| label: 'device-level managed preferences', | |
| }) | |
| // Allow user-writable preferences for local MDM testing in ant builds only. | |
| if (process.env.USER_TYPE === 'ant') { | |
| paths.push({ | |
| path: join( | |
| homedir(), | |
| 'Library', | |
| 'Preferences', | |
| `${MACOS_PREFERENCE_DOMAIN}.plist`, | |
| ), | |
| label: 'user preferences (ant-only)', | |
| }) | |
| } | |
| return paths | |
| } | |