{
  "version": 3,
  "sources": ["../../debug-log.ts", "../../crypto.ts"],
  "sourcesContent": ["/* eslint-disable no-magic-numbers */\n\nComponents.utils.importGlobalProperties(['FormData'])\nimport { CONTENT_ENCRYPTION_ALG, KEY_WRAPPING_ALG, KEYTYPE } from './crypto'\n\nimport * as jose from 'jose'\ntype Encryption = typeof jose\n\nexport function getEncryption(): Encryption {\n  return jose\n}\nexport class Bundler {\n  public name: string\n\n  #refs = false\n\n  #pk?: JsonWebKey\n  #pubKey?: CryptoKey\n  #jose?: Encryption\n\n  #files: Record<string, Uint8Array> = {}\n  #encoder = new TextEncoder()\n\n  constructor(name?: string) {\n    this.name = name ?? Zotero.Utilities.generateObjectKey()\n  }\n\n  public encrypt(encryption: Encryption, pk: JsonWebKey): this {\n    this.#jose = encryption\n    if (pk.kty !== KEYTYPE) throw new Error(`Expected key type ${KEYTYPE}, got ${pk.kty}`)\n    this.#pk = pk\n\n    return this\n  }\n\n  public async add(path: string, data: string, refs = false): Promise<void> {\n    this.#refs = this.#refs || refs\n\n    const encoded = this.#encoder.encode(data)\n\n    if (this.#pk) {\n      this.#pubKey ??= (await this.#jose!.importJWK(this.#pk, KEY_WRAPPING_ALG)) as CryptoKey\n      const jwe = await (new this.#jose!.CompactEncrypt(encoded))\n        .setProtectedHeader({ alg: KEY_WRAPPING_ALG, enc: CONTENT_ENCRYPTION_ALG })\n        .encrypt(this.#pubKey)\n\n      this.#files[`${this.name}/${path}.jwe`] = this.#encoder.encode(jwe)\n    }\n    else {\n      this.#files[`${this.name}/${path}`] = encoded\n    }\n  }\n\n  public zip(): Promise<Uint8Array>\n  public zip(saveTo: string): Promise<undefined>\n  public async zip(saveTo?: string): Promise<Uint8Array | undefined> {\n    const temporary = !saveTo\n    const zipFile = saveTo ? Zotero.File.pathToFile(saveTo) : Zotero.getTempDirectory().clone()\n    if (temporary) {\n      zipFile.append('debug-log.zip')\n      zipFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE!, 0o600)\n    }\n\n    try {\n      const zipWriter = Components.classes['@mozilla.org/zipwriter;1'].createInstance(Components.interfaces.nsIZipWriter)\n      zipWriter.open(zipFile, 0x04 + 0x08 + 0x20)\n\n      for (const [path, data] of Object.entries(this.#files)) {\n        const stringInputStream = Components.classes['@mozilla.org/io/string-input-stream;1'].createInstance(Components.interfaces.nsIStringInputStream)\n\n        let rawString = ''\n        const chunkSize = 8192\n        for (let i = 0; i < data.length; i += chunkSize) {\n          rawString += String.fromCharCode(...Array.from(data.subarray(i, i + chunkSize)))\n        }\n\n        stringInputStream.setByteStringData(rawString)\n        zipWriter.addEntryStream(path, Date.now() * 1000, Components.interfaces.nsIZipWriter.COMPRESSION_DEFAULT!, stringInputStream, true)\n      }\n\n      await new Promise<void>((resolve, reject) => {\n        zipWriter.processQueue({\n          onStartRequest: () => {},\n          onStopRequest: (_request: unknown, status: number) => {\n            if (status) {\n              reject(new Error(`Could not compress debug log: ${status}`))\n              return\n            }\n            try {\n              zipWriter.close()\n              resolve()\n            }\n            catch (err) {\n              reject(err)\n            }\n          },\n        }, null)\n      })\n\n      if (saveTo) return undefined\n      return new Uint8Array(await IOUtils.read(zipFile.path))\n    }\n    finally {\n      if (temporary && zipFile.exists()) zipFile.remove(false)\n    }\n  }\n\n  public get filename(): string {\n    return `${this.name}.zip`\n  }\n\n  public id(host: string): string {\n    return `${this.name}-${host}${this.#refs ? '.refs' : ''}${this.#pubKey ? '.enc' : ''}`\n  }\n\n  public async send(): Promise<string> {\n    const zip = await this.zip()\n    const archive = new ArrayBuffer(zip.byteLength)\n    new Uint8Array(archive).set(zip)\n\n    const response = await fetch(`https://filebin.net/${this.name}/${this.filename}`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/zip',\n      },\n      body: new Blob([archive], { type: 'application/zip' }),\n    })\n\n    if (response.ok) return this.id('fbin')\n    throw new Error(await response.text())\n  }\n}\n\ndeclare var Services: any // eslint-disable-line no-var\ndeclare const Components: any\ndeclare const ChromeUtils: any\n\ntype ExportTranslator = {\n  setHandler: (phase: string, handler: (obj: { string: string }, success: boolean) => void) => void // eslint-disable-line id-blacklist\n  setTranslator: (id: string) => void\n  setItems: (items: any[]) => void\n  translate: () => void\n}\n\nconst zotero_prefs_root = 'extensions.zotero.'\n\nexport class DebugLogSender {\n  // #menu: string | false = false\n  #preferences: string[]\n\n  public enabled = false\n  public debugEnabledAtStart: boolean = (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n\n  constructor(public pluginID: string, public label: string, preferences: string[] = [], private pubKey?: JsonWebKey) {\n    this.#preferences = preferences\n    Zotero.MenuManager.registerMenu({\n      menuID: `debug-log-sender-${pluginID}`,\n      pluginID,\n      target: 'main/menubar/help',\n      menus: [\n        {\n          menuType: 'menuitem',\n          onShowing: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n            context.setVisible(this.enabled)\n            context.menuElem?.setAttribute('label', this.label)\n          },\n          onCommand: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n            void this.send()\n          },\n        },\n      ],\n    })\n  }\n\n  private async send(): Promise<void> {\n    try {\n      await Zotero.Schema.schemaUpdatePromise\n\n      let bundler = new Bundler()\n      if (this.pubKey) bundler.encrypt(getEncryption(), this.pubKey)\n\n      let log = [\n        await this.info(),\n        Zotero.getErrors(true).join('\\n\\n'),\n        Zotero.Debug.getConsoleViewerOutput().slice(-250000).join('\\n'), // eslint-disable-line no-magic-numbers\n      ].filter((txt: string) => txt).join('\\n\\n').trim()\n      await bundler.add('debug.txt', log)\n\n      let rdf = await this.rdf()\n      if (rdf) await bundler.add('items.rdf', rdf, true)\n\n      const logid = await bundler.send()\n      Services.prompt.alert(null, `Debug log ID for ${this.label}`, logid)\n    }\n    catch (err) {\n      const message = err instanceof Error ? err.message : String(err)\n      Services.prompt.alert(null, `Could not post debug log for ${this.label}`, message)\n    }\n  }\n\n  private preferences(): Record<string, string | number | boolean> {\n    const prefs: Record<string, string | number | boolean> = {}\n\n    const names: string[] = []\n    for (let pref of this.#preferences) {\n      if (pref[0] === ':') {\n        pref = pref.substring(1)\n      }\n      else if (!pref.startsWith(zotero_prefs_root)) {\n        pref = zotero_prefs_root + pref\n      }\n      if (pref.endsWith('.')) {\n        const childkeys: string[] = Services.prefs.getBranch(pref).getChildList('', {})\n        for (const key of childkeys) {\n          names.push(pref + key)\n        }\n      }\n      else {\n        names.push(pref)\n      }\n    }\n\n    for (const pref of names.sort()) {\n      const value = Zotero.Prefs.get(pref, true) as string | number | boolean | undefined\n      if (typeof value !== 'undefined') prefs[pref] = value\n    }\n\n    return prefs\n  }\n\n  // general state of Zotero\n  private async info(): Promise<string> {\n    let info = ''\n\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n    const appInfo: { name: string; version: string } = Components.classes['@mozilla.org/xre/app-info;1'].getService(Components.interfaces.nsIXULAppInfo)\n    info += `Application: ${appInfo.name} ${appInfo.version} ${Zotero.locale}\\n`\n\n    const platformFlags = Zotero as unknown as Record<string, unknown>\n    const platform = ['Win', 'Mac', 'Linux'].find(p => Boolean(platformFlags[`is${p}`])) || 'Unknown'\n    info += `Platform: ${platform}\\n`\n\n    const addons: string[] = await Zotero.getInstalledExtensions()\n    if (addons.length) {\n      info += 'Addons:\\n' + addons.map((addon: string) => `  ${addon}\\n`).join('') // eslint-disable-line prefer-template\n    }\n    info += `Debug logging on at Zotero start: ${this.debugEnabledAtStart}\\n`\n    info += `Debug logging on at log submit: ${Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled}\\n`\n\n    for (const [pref, value] of Object.entries(this.preferences())) {\n      info += `${pref} = ${JSON.stringify(value)}\\n`\n    }\n\n    return info\n  }\n\n  private rdf(): Promise<string> {\n    return new Promise((resolve, reject) => {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n      const pane = Zotero.getActiveZoteroPane()\n      if (!pane) return resolve('')\n      const items: any[] = pane.getSelectedItems()\n      if (items.length === 0) return resolve('')\n\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n      const translation: ExportTranslator = new Zotero.Translate.Export() as ExportTranslator\n      translation.setItems(items)\n      translation.setTranslator('14763d24-8ba0-45df-8f52-b8d1108e7ac9') // rdf\n\n      translation.setHandler('done', (obj, success) => {\n        if (success) {\n          resolve(obj?.string || '')\n        }\n        else {\n          reject(new Error('translation failed'))\n        }\n      })\n\n      translation.translate() // eslint-disable-line @typescript-eslint/no-unsafe-call\n    })\n  }\n}\n", "export const KEYTYPE = 'RSA'\nexport const KEY_WRAPPING_ALG = 'RSA-OAEP-256'\nexport const CONTENT_ENCRYPTION_ALG = 'A256GCM'\nexport const RSA_HASH = 'SHA-256'\nexport const RSA_ALGORITHM = 'RSA-OAEP'\nexport const CIPHER_ALGORITHM = 'aes256'\nexport const AES_KEY_LENGTH = 256\n// export const AES_KEY_BYTES = 32\n\n// export const AES_ALGORITHM = 'AES-GCM'\n// export const IV_LENGTH = 12\n"],
  "mappings": "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",
  "names": []
}
