import {z} from 'zod' export type Link = {deprecation?: string | undefined, href?: string | undefined, hreflang?: string | undefined, media?: string | undefined, rel?: string | undefined, title?: string | undefined, type?: string | undefined}; export type ScanTemplateVulnerabilityCheckCategories = {disabled?: Array | undefined, enabled?: Array | undefined, links: Array}; export type ScanTemplateVulnerabilityCheckIndividual = {disabled?: Array> | undefined, enabled?: Array> | undefined, links: Array}; export type VulnerabilityCheckType = {disabled?: Array | undefined, enabled?: Array | undefined, links: Array}; export type ScanTemplateVulnerabilityChecks = {categories?: ScanTemplateVulnerabilityCheckCategories | undefined, correlate?: boolean | undefined, individual?: ScanTemplateVulnerabilityCheckIndividual | undefined, links: Array, potential?: boolean | undefined, types?: VulnerabilityCheckType | undefined, unsafe?: boolean | undefined}; export type ScanTemplateDatabase = {db2?: string | undefined, links: Array, oracle?: Array | undefined, postgres?: string | undefined}; export type ScanTemplateAssetDiscovery = {collectWhoisInformation?: boolean | undefined, fingerprintMinimumCertainty?: number | undefined, fingerprintRetries?: number | undefined, ipFingerprintingEnabled?: boolean | undefined, sendArpPings?: boolean | undefined, sendIcmpPings?: boolean | undefined, tcpPorts?: Array | undefined, treatTcpResetAsAsset?: boolean | undefined, udpPorts?: Array | undefined}; export type ScanTemplateDiscoveryPerformancePacketsRate = {defeatRateLimit?: boolean | undefined, maximum?: number | undefined, minimum?: number | undefined}; export type ScanTemplateDiscoveryPerformanceParallelism = {maximum?: number | undefined, minimum?: number | undefined}; export type ScanTemplateDiscoveryPerformanceScanDelay = {maximum?: string | undefined, minimum?: string | undefined}; export type ScanTemplateDiscoveryPerformanceTimeout = {initial?: string | undefined, maximum?: string | undefined, minimum?: string | undefined}; export type ScanTemplateDiscoveryPerformance = {packetRate?: ScanTemplateDiscoveryPerformancePacketsRate | undefined, parallelism?: ScanTemplateDiscoveryPerformanceParallelism | undefined, retryLimit?: number | undefined, scanDelay?: ScanTemplateDiscoveryPerformanceScanDelay | undefined, timeout?: ScanTemplateDiscoveryPerformanceTimeout | undefined}; export type ScanTemplateServiceDiscoveryTcp = {additionalPorts?: string | undefined, excludedPorts?: string | undefined, links: Array, method?: ('SYN' | 'SYN+RST' | 'SYN+FIN' | 'SYN+ECE' | 'Full') | undefined, ports?: ('all' | 'well-known' | 'custom' | 'none') | undefined}; export type ScanTemplateServiceDiscoveryUdp = {additionalPorts?: string | undefined, excludedPorts?: string | undefined, links: Array, ports?: ('all' | 'well-known' | 'custom' | 'none') | undefined}; export type ScanTemplateServiceDiscovery = {serviceNameFile?: string | undefined, tcp?: ScanTemplateServiceDiscoveryTcp | undefined, udp?: ScanTemplateServiceDiscoveryUdp | undefined}; export type ScanTemplateDiscovery = {asset?: ScanTemplateAssetDiscovery | undefined, performance?: ScanTemplateDiscoveryPerformance | undefined, service?: ScanTemplateServiceDiscovery | undefined}; export type Policy = {enabled?: Array> | undefined, links: Array, recursiveWindowsFSSearch?: boolean | undefined, storeSCAP?: boolean | undefined}; export type Telnet = {characterSet?: string | undefined, failedLoginRegex?: string | undefined, links: Array, loginRegex?: string | undefined, passwordPromptRegex?: string | undefined, questionableLoginRegex?: string | undefined}; export type ScanTemplate = {checks?: ScanTemplateVulnerabilityChecks | undefined, database?: ScanTemplateDatabase | undefined, description?: string | undefined, discovery?: ScanTemplateDiscovery | undefined, discoveryOnly?: boolean | undefined, enableWindowsServices?: boolean | undefined, enhancedLogging?: boolean | undefined, id?: string | undefined, links: Array, maxParallelAssets?: number | undefined, maxScanProcesses?: number | undefined, name?: string | undefined, policy?: Policy | undefined, policyEnabled?: boolean | undefined, telnet?: Telnet | undefined, vulnerabilityEnabled?: boolean | undefined, web?: Record | undefined, webEnabled?: boolean | undefined}; export type CreateApiApi3ScanTemplatesArgs = {body: ScanTemplate}; export type CreateApiApi3ScanTemplatesOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const link = z.object({deprecation: z.string().optional(), href: z.string().optional(), hreflang: z.string().optional(), media: z.string().optional(), rel: z.string().optional(), title: z.string().optional(), type: z.string().optional()}); export const referenceResourceScanTemplateIDLink = z.object({id: z.object({}).optional(), links: z.array(link)}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Scan Templates * * POST /api/3/scan_templates */ export const createApiApi3ScanTemplates = async (args: CreateApiApi3ScanTemplatesArgs, options?: CreateApiApi3ScanTemplatesOptions) => { const {baseUrl = "https://:", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json;charset=UTF-8") const url = `${baseUrl.replace(/\/+$/, '')}/api/3/scan_templates${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(referenceResourceScanTemplateIDLink, await res.json()) };