desktop-policy-environment.mjs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. /** Resolve the required policy service from the same deployment as updater publication. */
  2. import { resolveDesktopAutoUpdateEnvironment } from './desktop-auto-update-environment.mjs'
  3. function origin(value, name) {
  4. let url
  5. try { url = new URL(value) } catch { throw new Error(`desktop package: ${name} requires an HTTPS origin`) }
  6. if (url.protocol !== 'https:' || url.username || url.password || url.pathname !== '/' || url.search || url.hash) {
  7. throw new Error(`desktop package: ${name} requires an HTTPS origin without credentials, path, query, or fragment`)
  8. }
  9. return url.origin
  10. }
  11. /**
  12. * Resolve mandatory policy metadata before preparing artifacts or accessing signing hardware.
  13. * @param {NodeJS.ProcessEnv} environment File-owned release settings; the unselected origin is not required.
  14. * @returns {{ origin: string, allowedPageOrigins: string[], authentication: 'anonymous' | 'feishu-test', [key: string]: unknown }} Selected policy.
  15. */
  16. export function resolveDesktopPolicyEnvironment(environment) {
  17. const deployment = resolveDesktopAutoUpdateEnvironment(environment)
  18. const name = deployment === 'test' ? 'DSH_DESKTOP_MANDATORY_UPDATE_TEST_ORIGIN' : 'DSH_DESKTOP_MANDATORY_UPDATE_PROD_ORIGIN'
  19. const selected = origin(environment[name], name)
  20. let settings = {}
  21. if (environment.DSH_DESKTOP_MANDATORY_UPDATE_CONFIG !== undefined) {
  22. try { settings = JSON.parse(environment.DSH_DESKTOP_MANDATORY_UPDATE_CONFIG) }
  23. catch { throw new Error('desktop package: DSH_DESKTOP_MANDATORY_UPDATE_CONFIG must be valid JSON') }
  24. }
  25. if (typeof settings !== 'object' || settings === null || Array.isArray(settings)
  26. || 'origin' in settings || 'authentication' in settings) {
  27. throw new Error('desktop package: policy options must be an object without origin or authentication; use the deployment origin settings')
  28. }
  29. const pages = settings.allowedPageOrigins ?? [selected]
  30. if (!Array.isArray(pages) || pages.length === 0) throw new Error('desktop package: allowedPageOrigins must be a nonempty array')
  31. return { ...settings, origin: selected,
  32. allowedPageOrigins: pages.map(value => origin(value, 'allowedPageOrigins')),
  33. authentication: deployment === 'test' ? 'feishu-test' : 'anonymous' }
  34. }