import {z} from 'zod' export type GetApiRestapiJsonV1PasswordsPoliciesArgs = {orgName?: string | undefined}; export type GetApiRestapiJsonV1PasswordsPoliciesOptions = {baseUrl?: string | undefined, AuthToken?: string | undefined, fetch?: typeof fetch | undefined}; export const operationResult = z.object({message: z.string().optional(), status: z.string().optional()}); export const passwordPolicyResponse = z.object({operation: z.object({result: operationResult.optional(), Details: z.object({POLICIES: z.array(z.object({POLICYID: z.string().optional(), POLICYNAME: z.string().optional(), DESCRIPTION: z.string().optional(), DEFAULTPOLICY: z.string().optional(), "PASSWORD MIN LENGTH": z.string().optional(), "PASSWORD MAX LENGTH": z.string().optional(), "PASSWORD VALIDITY PERIOD": z.string().optional(), "REUSE OF OLD PASSWORDS": z.string().optional(), "ENFORCE MIXED CASE": z.string().optional(), "NUMBER OF UPPERCASE CHARACTERS REQUIRED": z.string().optional(), "NUMBER OF LOWERCASE CHARACTERS REQUIRED": z.string().optional(), "ENFORCE NUMERALS": z.string().optional(), "NUMBER OF NUMERALS": z.string().optional(), "ENFORCE SPL CHARS": z.string().optional(), "NO OF SPL CHARS REQUIRED": z.string().optional(), "ENFORCE STARTING WITH AN ALPHABET": z.string().optional(), "PASSWORD CAN CONTAIN LOGINNAME": z.string().optional(), "CHECK DICTIONARY WORD": z.string().optional(), "DICTIONARY NAME": z.string().optional(), "CHECK ANAGRAM OF LOGINNAME": z.string().optional(), "CHECK SIMILARITY OF PASSWORDS": z.string().optional(), "NUMBER OF PASSWORDS TO CHECK FOR SIMILARITY": z.string().optional(), "CHECK REPEATED SUBSTRING": z.string().optional(), "CHECK SEQUENCE": z.string().optional(), "SEQUENCE LENGTH": z.string().optional(), "CHECK ALPHABET SEQUENCE": z.string().optional(), "CHECK NUMERIC SEQUENCE": z.string().optional(), "CHECK CONSECUTIVE SEQUENCE": z.string().optional(), "CHECK KEYBOARD SEQUENCE": z.string().optional(), "KEYBOARD LAYOUT": z.string().optional(), "CHECK OBVIOUS SUBSTITUTION": z.string().optional()})).optional()}).optional(), name: z.string().optional()}).optional()}); 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 }; /** * Fetch all password policies * * GET /restapi/json/v1/passwords/policies */ export const getApiRestapiJsonV1PasswordsPolicies = async (args: GetApiRestapiJsonV1PasswordsPoliciesArgs, options?: GetApiRestapiJsonV1PasswordsPoliciesOptions) => { const {baseUrl = "https://Hostname:Port", fetch: fetchFn = fetch, AuthToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.orgName != null) headers.set("orgName", String(args.orgName)) if (AuthToken !== undefined) headers.set("AUTHTOKEN", AuthToken) const url = `${baseUrl.replace(/\/+$/, '')}/restapi/json/v1/passwords/policies${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(passwordPolicyResponse, await res.json()) };