message-policy.ts

6.2 KB · raw

1import type { MessageType } from "../shared/types";23export type MessageContext =4  | "extension-page-only"5  | "content-script-allowed"6  | "background-internal"7  | "page-relay";89/**10 * Every message type has an explicit trust boundary. Keep this record11 * exhaustive: adding a MessageType without choosing its sender context must12 * fail type-checking instead of silently becoming trusted.13 */14export const MESSAGE_CONTEXT_POLICY = {15  // Popup/options operations and sensitive reads/writes.16  GET_SYNC_ALERTS: "extension-page-only",17  GET_PENDING_VOUCHED_DEVICES: "extension-page-only",18  CONFIRM_VOUCHED_DEVICE: "extension-page-only",19  REJECT_VOUCHED_DEVICE: "extension-page-only",20  ROTATE_SYNC_IDENTITY: "extension-page-only",21  UNLOCK: "extension-page-only",22  UNLOCK_WITH_PIN: "extension-page-only",23  LOCK: "extension-page-only",24  IS_UNLOCKED: "extension-page-only",25  HAS_VAULT: "extension-page-only",26  GET_ENTRIES: "extension-page-only",27  BATCH_ADD_ENTRIES: "extension-page-only",28  RESTORE_ENTRIES: "extension-page-only",29  CLEAR_VAULT_ENTRIES: "extension-page-only",30  DELETE_ENTRY: "extension-page-only",31  CREATE_VAULT: "extension-page-only",32  CREATE_VAULT_FROM_ROOT_KEY: "extension-page-only",33  CHECK_ALL_BREACHES: "extension-page-only",34  UPDATE_SETTINGS: "extension-page-only",35  SETUP_PIN: "extension-page-only",36  DISABLE_PIN: "extension-page-only",37  ACTIVATE_LICENSE: "extension-page-only",38  GET_LICENSE: "extension-page-only",39  GET_LICENSE_KEY: "extension-page-only",40  IS_DURESS_ENABLED: "extension-page-only",41  SETUP_DURESS: "extension-page-only",42  DISABLE_DURESS: "extension-page-only",43  VERIFY_MAIN_PASSWORD: "extension-page-only",44  CHANGE_PASSWORD: "extension-page-only",45  GET_LOCAL_IDENTITY: "extension-page-only",46  LIST_PAIRED_DEVICES: "extension-page-only",47  RENAME_PAIRED_DEVICE: "extension-page-only",48  UNPAIR_DEVICE: "extension-page-only",49  RENAME_LOCAL_DEVICE: "extension-page-only",50  START_ADOPTION_SOURCE: "extension-page-only",51  START_ADOPTION_RECEIVER: "extension-page-only",52  CANCEL_ADOPTION_SOURCE: "extension-page-only",53  SOURCE_SAS_DECISION: "extension-page-only",54  TRIGGER_SYNC: "extension-page-only",55  GET_SYNC_STATE: "extension-page-only",56  GET_SYNC_SETTINGS: "extension-page-only",57  SET_SYNC_SETTINGS: "extension-page-only",58  GET_PENDING_PASSKEY: "extension-page-only",59  APPROVE_PASSKEY: "extension-page-only",60  DENY_PASSKEY: "extension-page-only",61  GET_PASSKEY_PROVIDER_STATE: "extension-page-only",62  SET_PASSKEY_PROVIDER_ENABLED: "extension-page-only",63  GET_DELETED_ENTRIES: "extension-page-only",64  RESTORE_ENTRY: "extension-page-only",65  PURGE_ENTRY: "extension-page-only",66  PURGE_EXPIRED_TRASH: "extension-page-only",67  GET_VAULT_HISTORY: "extension-page-only",68  RESTORE_VAULT_SNAPSHOT: "extension-page-only",69  COUNT_DUPLICATES: "extension-page-only",70  DEDUPLICATE_ENTRIES: "extension-page-only",71  GET_VAULT_STATUS: "extension-page-only",72  GET_ADVANCED_HEALTH_REPORT: "extension-page-only",73  DEACTIVATE_LICENSE: "extension-page-only",74  GET_IDENTITIES: "content-script-allowed",75  DESTROY_VAULT: "extension-page-only",76  COMPLETE_FIREFOX_PASSKEY_CREATE: "extension-page-only",77  VALIDATE_RECOVERY_WORDS: "extension-page-only",78  RECOVER_WITH_WORDS: "extension-page-only",79  GET_RECOVERY_WORDS: "extension-page-only",80  GET_RECOVERY_CONFIRM_PENDING: "extension-page-only",81  SET_RECOVERY_CONFIRM_PENDING: "extension-page-only",82  CLEAR_RECOVERY_CONFIRM_PENDING: "extension-page-only",83  GET_IDENTITY_SUGGESTIONS: "extension-page-only",84  SAVE_NOTE: "extension-page-only",85  DELETE_NOTE: "extension-page-only",86  GET_NOTES: "extension-page-only",87  SEARCH_VAULT: "extension-page-only",88  GET_CODEX_VAULT_DATA: "extension-page-only",89  ESTIMATE_CODEX_PAGES: "extension-page-only",90  GENERATE_CODEX: "extension-page-only",91  RESTORE_FROM_CODEX: "extension-page-only",92  OPEN_DETACHED_POPUP: "extension-page-only",9394  // Content-script requests that are intentionally narrow or origin-bound in95  // their handlers. These are not bulk vault export or device-authority APIs.96  ADD_ENTRY: "content-script-allowed",97  UPDATE_ENTRY: "content-script-allowed",98  ADD_ADDITIONAL_URL: "content-script-allowed",99  AUTOFILL_QUERY: "content-script-allowed",100  COPY: "content-script-allowed",101  FIRE_CANARY_PING: "content-script-allowed",102  GET_ENTRY_FOR_FILL: "content-script-allowed",103  GET_ENTRY_FOR_EDIT: "content-script-allowed",104  GET_SETTINGS: "content-script-allowed",105  GET_SITE_PASSWORD_POLICY: "content-script-allowed",106  RECORD_MANUAL_SUMMON: "content-script-allowed",107  DECLINE_CARD_SAVE: "content-script-allowed",108  IS_CARD_DECLINED: "content-script-allowed",109  PASSKEY_AUTH_RESPONSE: "content-script-allowed",110  ML_INIT: "content-script-allowed",111  ML_PREDICT_BATCH: "content-script-allowed",112  OPEN_PRO_GATE: "content-script-allowed",113  OPEN_POPUP: "content-script-allowed",114  TOUCH_AUTO_LOCK: "content-script-allowed",115116  // These seven are the explicit Firefox MAIN-world passkey relay surface.117  INITIATE_FIREFOX_PASSKEY_CREATE: "page-relay",118  PASSKEY_OFFER_DECLINE: "page-relay",119  GET_PASSKEY_OFFER_DECLINED: "page-relay",120  GET_PASSKEY_FOR_DOMAIN: "page-relay",121  PASSKEY_HAS_CREDENTIALS: "page-relay",122  PASSKEY_CREATE: "page-relay",123  PASSKEY_GET: "page-relay",124125  // Messages produced by the background or handled outside messages.ts.126  CLEAR_CLIPBOARD: "background-internal",127  VOUCHED_DEVICE_PENDING: "background-internal",128  DEVICE_KEY_ROTATED: "background-internal",129  ADOPTION_SOURCE_SAS: "background-internal",130  ADOPTION_SOURCE_RESULT: "background-internal",131  PING: "background-internal",132  SUMMON_AUTOFILL: "background-internal",133  VAULT_LOCKED: "background-internal",134  VAULT_UNLOCKED: "background-internal",135  PRO_GATE_TRIGGERED: "background-internal",136  PASSKEY_PRO_GATE: "background-internal",137  SHOW_PASSKEY_TOAST: "background-internal",138  DISMISS_PASSKEY_TOAST: "background-internal",139  SHOULD_PLAY_CELEBRATION: "extension-page-only",140  MARK_CELEBRATION_PLAYED: "extension-page-only",141} satisfies Record<MessageType, MessageContext>;142143export function getMessageContext(type: unknown): MessageContext | undefined {144  if (typeof type !== "string") return undefined;145  return Object.hasOwn(MESSAGE_CONTEXT_POLICY, type)146    ? MESSAGE_CONTEXT_POLICY[type as MessageType]147    : undefined;148}