zotero-plugin 8.0.13 → 8.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/bin/fetch-log.cjs +4 -3
- package/dist/cjs/bin/fetch-log.cjs.map +1 -1
- package/dist/cjs/debug-log.cjs +1 -1
- package/dist/cjs/debug-log.cjs.map +1 -1
- package/dist/esm/bin/fetch-log.js +4 -3
- package/dist/esm/bin/fetch-log.js.map +1 -1
- package/dist/esm/debug-log.js +1 -1
- package/dist/esm/debug-log.js.map +1 -1
- package/package.json +1 -1
|
@@ -109,14 +109,15 @@ async function main() {
|
|
|
109
109
|
const response = await fetch(options.url, {
|
|
110
110
|
method: "GET",
|
|
111
111
|
headers: {
|
|
112
|
-
"User-Agent":
|
|
112
|
+
"User-Agent": "curl/7.81.0",
|
|
113
|
+
// filebin does not seem to accept custom user agents
|
|
114
|
+
"Accept-Encoding": "identity",
|
|
113
115
|
Accept: "*/*"
|
|
114
116
|
}
|
|
115
117
|
});
|
|
116
118
|
if (!response.ok) oops(`Failed to download: ${response.statusText}`);
|
|
117
|
-
const readable = import_node_stream.Readable.fromWeb(response.body);
|
|
118
119
|
const download = import_fs.default.createWriteStream(options.zip);
|
|
119
|
-
await (0, import_promises.finished)(
|
|
120
|
+
await (0, import_promises.finished)(import_node_stream.Readable.fromWeb(response.body).pipe(download));
|
|
120
121
|
const zipfile = new import_node_stream_zip.default.async({ file: options.zip });
|
|
121
122
|
const entries = Object.values(await zipfile.entries()).filter((entry) => !entry.isDirectory);
|
|
122
123
|
const privateKey = await getPrivateKey();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/fetch-log.ts","../../../crypto.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport crypto, { webcrypto } from 'crypto'\nimport fs from 'fs'\nimport * as jose from 'jose'\nimport StreamZip from 'node-stream-zip'\nimport { Readable } from 'node:stream'\nimport { finished } from 'node:stream/promises'\nimport path from 'path'\n\nimport { Entry as KeyRingEntry } from '@napi-rs/keyring'\nimport prompts from 'prompts'\n\nimport { KEY_WRAPPING_ALG } from '../crypto'\nimport { pkg } from './find-root'\n\nasync function getPassphrase(): Promise<string> {\n const service = `${pkg.name} Zotero plugin`\n const account = `${pkg.name}-debug-log`\n const entry = new KeyRingEntry(service, account)\n let passphrase = entry.getPassword()\n if (!passphrase) {\n const response = await prompts({\n type: 'password',\n name: 'passphrase',\n message: `Enter a passphrase to decrypt your private key for ${service} ${account}:`,\n })\n entry.setPassword(passphrase = response.passphrase)\n }\n return passphrase\n}\n\nconst oops = (...args) => {\n console.error(...args)\n process.exit(1)\n}\n\nconst program = new Command()\nprogram\n .description('A script to fetch debug logs.')\n .option('-p, --private <path>', 'Path for the encrypted private key .pem file', 'private.pem')\n .option('-k, --keep', 'Keep the downloaded zip', false)\n .argument('<debug log id>', 'debug log ID to fetch')\n .parse(process.argv)\nconst options = program.opts()\nconst args = program.args\n\nif (!args.length) oops('No log ID')\n\nlet m = args[0].match(/^(?<key>[a-z0-9]+)-(?<host>[^-]+)(?<tags>.*)$/i)\nif (!m) oops(args[0], 'is not a valid log ID')\n\nconst { host, key, tags } = m.groups\nif (host !== 'fbin') oops('Unexpected debug log host', host)\n\noptions.encrypted = tags.split('.').includes('enc')\noptions.zip = path.join('logs', `${key}.zip`)\noptions.url = `https://filebin.net/${key}/${key}.zip`\n\nif (options.encrypted) {\n if (!options.private) oops('No private key provided')\n if (!fs.existsSync(options.private)) oops('Private key', options.private, 'does not exist')\n if (!fs.existsSync('package.json')) oops('package.json does not exist in the current directory')\n}\n\nconst logs = path.join('logs', key)\nconsole.log(options.url, '=>', logs)\nif (!fs.existsSync(logs)) {\n fs.mkdirSync(logs, { recursive: true })\n}\n\nasync function getPrivateKey(): Promise<webcrypto.CryptoKey> {\n if (!options.encrypted) return undefined\n\n const privateKeyObject = crypto.createPrivateKey({\n key: fs.readFileSync(options.private, 'utf-8'),\n format: 'pem',\n passphrase: await getPassphrase(),\n })\n const unencryptedKeyPEM = privateKeyObject.export({\n type: 'pkcs8',\n format: 'pem',\n }).toString()\n return await jose.importPKCS8(\n unencryptedKeyPEM,\n KEY_WRAPPING_ALG,\n )\n}\nasync function main() {\n try {\n const response = await fetch(options.url, {\n method: 'GET',\n headers: {\n 'User-Agent':
|
|
1
|
+
{"version":3,"sources":["../../../bin/fetch-log.ts","../../../crypto.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport crypto, { webcrypto } from 'crypto'\nimport fs from 'fs'\nimport * as jose from 'jose'\nimport StreamZip from 'node-stream-zip'\nimport { Readable } from 'node:stream'\nimport { finished } from 'node:stream/promises'\nimport path from 'path'\n\nimport { Entry as KeyRingEntry } from '@napi-rs/keyring'\nimport prompts from 'prompts'\n\nimport { KEY_WRAPPING_ALG } from '../crypto'\nimport { pkg } from './find-root'\n\nasync function getPassphrase(): Promise<string> {\n const service = `${pkg.name} Zotero plugin`\n const account = `${pkg.name}-debug-log`\n const entry = new KeyRingEntry(service, account)\n let passphrase = entry.getPassword()\n if (!passphrase) {\n const response = await prompts({\n type: 'password',\n name: 'passphrase',\n message: `Enter a passphrase to decrypt your private key for ${service} ${account}:`,\n })\n entry.setPassword(passphrase = response.passphrase)\n }\n return passphrase\n}\n\nconst oops = (...args) => {\n console.error(...args)\n process.exit(1)\n}\n\nconst program = new Command()\nprogram\n .description('A script to fetch debug logs.')\n .option('-p, --private <path>', 'Path for the encrypted private key .pem file', 'private.pem')\n .option('-k, --keep', 'Keep the downloaded zip', false)\n .argument('<debug log id>', 'debug log ID to fetch')\n .parse(process.argv)\nconst options = program.opts()\nconst args = program.args\n\nif (!args.length) oops('No log ID')\n\nlet m = args[0].match(/^(?<key>[a-z0-9]+)-(?<host>[^-]+)(?<tags>.*)$/i)\nif (!m) oops(args[0], 'is not a valid log ID')\n\nconst { host, key, tags } = m.groups\nif (host !== 'fbin') oops('Unexpected debug log host', host)\n\noptions.encrypted = tags.split('.').includes('enc')\noptions.zip = path.join('logs', `${key}.zip`)\noptions.url = `https://filebin.net/${key}/${key}.zip`\n\nif (options.encrypted) {\n if (!options.private) oops('No private key provided')\n if (!fs.existsSync(options.private)) oops('Private key', options.private, 'does not exist')\n if (!fs.existsSync('package.json')) oops('package.json does not exist in the current directory')\n}\n\nconst logs = path.join('logs', key)\nconsole.log(options.url, '=>', logs)\nif (!fs.existsSync(logs)) {\n fs.mkdirSync(logs, { recursive: true })\n}\n\nasync function getPrivateKey(): Promise<webcrypto.CryptoKey> {\n if (!options.encrypted) return undefined\n\n const privateKeyObject = crypto.createPrivateKey({\n key: fs.readFileSync(options.private, 'utf-8'),\n format: 'pem',\n passphrase: await getPassphrase(),\n })\n const unencryptedKeyPEM = privateKeyObject.export({\n type: 'pkcs8',\n format: 'pem',\n }).toString()\n return await jose.importPKCS8(\n unencryptedKeyPEM,\n KEY_WRAPPING_ALG,\n )\n}\nasync function main() {\n try {\n const response = await fetch(options.url, {\n method: 'GET',\n headers: {\n 'User-Agent': 'curl/7.81.0', // filebin does not seem to accept custom user agents\n 'Accept-Encoding': 'identity',\n Accept: '*/*',\n },\n })\n if (!response.ok) oops(`Failed to download: ${response.statusText}`)\n\n const download = fs.createWriteStream(options.zip)\n await finished(Readable.fromWeb(response.body as any).pipe(download))\n\n const zipfile = new StreamZip.async({ file: options.zip })\n const entries = Object.values(await zipfile.entries()).filter(entry => !entry.isDirectory)\n\n const privateKey = await getPrivateKey()\n\n for (const entry of entries) {\n const m = entry.name.match(/(?<filename>.+)\\.(?<type>jwe)$/i)\n const filename = m?.groups!.filename || entry.name\n const type = (m?.groups!.type || '').toLowerCase()\n const target = path.join('logs', filename)\n\n if (options.encrypted && !type) oops('Unexpected unencrypted contents', entry.name)\n if (type && !options.encrypted) oops('Unexpected encrypted contents', entry.name)\n switch (type) {\n case '':\n fs.writeFileSync(target, await zipfile.entryData(entry.name))\n break\n case 'jwe': {\n const { plaintext } = await jose.compactDecrypt((await zipfile.entryData(entry.name)).toString('utf8'), privateKey)\n fs.writeFileSync(target, plaintext)\n break\n }\n default:\n oops('Unexpected log entry', entry.name)\n break\n }\n }\n }\n finally {\n if (!options.keep && fs.existsSync(options.zip)) fs.unlinkSync(options.zip)\n }\n}\n\nmain().catch(err => {\n oops(err.message)\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","import fs from 'node:fs'\nimport path from 'node:path'\n\nconst folders = process.cwd().split(path.sep)\nconst rootIndex = folders.findIndex((folder: string, i: number) => fs.existsSync(path.join(folders.slice(0, i + 1).join(path.sep), 'package.json')))\nexport const root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(path.sep)\nconsole.log('project directory:', root)\n\nexport const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8'))\n"],"mappings":"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","names":["path","fs","KeyRingEntry","prompts","args","path","fs","crypto","StreamZip","m"]}
|
package/dist/cjs/debug-log.cjs
CHANGED
|
@@ -46,7 +46,7 @@ var UZip = __toESM(require("uzip"), 1);
|
|
|
46
46
|
// package.json
|
|
47
47
|
var package_default = {
|
|
48
48
|
"name": "zotero-plugin",
|
|
49
|
-
"version": "8.0.
|
|
49
|
+
"version": "8.0.14",
|
|
50
50
|
"description": "Zotero plugin builder",
|
|
51
51
|
"homepage": "https://github.com/retorquere/zotero-plugin/wiki",
|
|
52
52
|
"type": "module",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../debug-log.ts","../../crypto.ts","../../package.json"],"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'\nimport * as UZip from 'uzip'\nimport pkg from './package.json'\n\nexport class Bundler {\n public key: string\n\n #refs = false\n\n #pk?: JsonWebKey\n #pubKey?: CryptoKey\n\n #files: Record<string, Uint8Array> = {}\n #encoder = new TextEncoder()\n\n constructor(pk?: JsonWebKey) {\n this.key = Zotero.Utilities.generateObjectKey()\n\n if (pk && pk.kty === KEYTYPE) this.#pk = pk\n }\n\n 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 if (!this.#pubKey) this.#pubKey = (await jose.importJWK(this.#pk, KEY_WRAPPING_ALG)) as CryptoKey\n const jwe = await (new jose.CompactEncrypt(encoded))\n .setProtectedHeader({\n alg: KEY_WRAPPING_ALG,\n enc: CONTENT_ENCRYPTION_ALG,\n })\n .encrypt(this.#pubKey)\n\n this.#files[`${this.key}/${path}.jwe`] = this.#encoder.encode(jwe)\n }\n else {\n this.#files[`${this.key}/${path}`] = encoded\n }\n }\n\n public get zip(): ArrayBuffer {\n return UZip.encode(this.#files) as ArrayBuffer\n }\n\n public get name(): string {\n return `${this.key}.zip`\n }\n\n public id(host: string): string {\n return `${this.key}-${host}${this.#refs ? '.refs' : ''}${this.#pubKey ? '.enc' : ''}`\n }\n\n public async send(): Promise<string> {\n const response = await fetch(`https://filebin.net/${this.key}/${this.name}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/zip',\n },\n body: new Blob([this.zip], { 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\ntype Plugin = {\n plugin: string\n preferences: string[]\n pubKey?: JsonWebKey\n}\n\nclass DebugLogSender {\n version = pkg.version\n #menu: string | false\n #plugins: Plugin[] = []\n\n public debugEnabledAtStart: boolean = typeof Zotero !== 'undefined'\n ? (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n : null\n\n public register(plugin: string, preferences: string[] = [], pubKey?: JsonWebKey): void {\n this.#menu ??= Zotero.MenuManager.registerMenu({\n menuID: 'debug-log-sender',\n pluginID: 'debug-log-sender',\n target: 'main/menubar/help',\n menus: [\n {\n menuType: 'submenu',\n onShowing: (event, context) => {\n context.setVisible(!!this.#plugins.length)\n context.menuElem?.setAttribute('label', 'Send plugin debug log')\n },\n menus: Array.from({ length: 20 }, (v, i) => ({\n menuType: 'menuitem',\n onShowing: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n context.setVisible(this.#plugins.length > i)\n context.menuElem?.setAttribute('label', this.#plugins[i]?.plugin || '')\n },\n onCommand: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n void this.send(this.#plugins[i])\n },\n })),\n },\n ],\n })\n\n this.#plugins.push({ plugin, preferences, pubKey })\n }\n\n public unregister(plugin: string) {\n this.#plugins = this.#plugins.filter(p => p.plugin !== plugin)\n }\n\n private async send({ plugin, preferences, pubKey }: Plugin): Promise<void> {\n try {\n await Zotero.Schema.schemaUpdatePromise\n\n const bundler = new Bundler(pubKey || undefined)\n\n let log = [\n await this.info(preferences),\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 ${plugin}`, logid)\n }\n catch (err) {\n Services.prompt.alert(null, `Could not post debug log for ${plugin}`, err.message)\n }\n }\n\n private preferences(preferences: string[]): Record<string, string | number | boolean> {\n const prefs: Record<string, string | number | boolean> = {}\n\n const names: string[] = []\n for (let pref of 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 prefs[pref] = Zotero.Prefs.get(pref, true)\n }\n\n return prefs\n }\n\n // general state of Zotero\n private async info(preferences: string[]): 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 platform = ['Win', 'Mac', 'Linux'].find(p => Zotero[`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(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 items: any[] = Zotero.getActiveZoteroPane().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 ? obj.string : undefined)\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\ndeclare global {\n interface Zotero {\n DebugLogSender?: DebugLogSender\n }\n namespace Zotero {\n var DebugLogSender: DebugLogSender | undefined\n }\n}\n\nfunction upgrade(installed?: string) {\n if (!installed) return true\n return installed.localeCompare(pkg.version, undefined, { numeric: true }) < 0\n}\n\nif (upgrade(Zotero.DebugLogSender?.version)) Zotero.DebugLogSender = new DebugLogSender()\nexport const DebugLog = Zotero.DebugLogSender\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","export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"8.0.13\",\n \"description\": \"Zotero plugin builder\",\n \"homepage\": \"https://github.com/retorquere/zotero-plugin/wiki\",\n \"type\": \"module\",\n \"main\": \"./dist/cjs/index.js\",\n \"module\": \"./dist/esm/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/esm/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./debug-log\": {\n \"import\": \"./dist/esm/debug-log.js\",\n \"require\": \"./dist/cjs/debug-log.cjs\"\n },\n \"./logger\": {\n \"import\": \"./dist/esm/logger.js\",\n \"require\": \"./dist/cjs/logger.cjs\"\n },\n \".loader/json\": {\n \"import\": \"./dist/esm/loader/json.js\",\n \"require\": \"./dist/cjs/loader/json.cjs\"\n },\n \".loader/peggy\": {\n \"import\": \"./dist/esm/loader/peggy.js\",\n \"require\": \"./dist/cjs/loader/peggy.cjs\"\n },\n \".loader/pem\": {\n \"import\": \"./dist/esm/loader/pem.js\",\n \"require\": \"./dist/cjs/loader/pem.cjs\"\n },\n \"./copy-assets\": {\n \"import\": \"./dist/esm/bin/copy-assets.js\",\n \"require\": \"./dist/cjs/bin/copy-assets.cjs\"\n },\n \"./make-dirs\": {\n \"import\": \"./dist/esm/bin/make-dirs.js\",\n \"require\": \"./dist/cjs/bin/make-dirs.cjs\"\n },\n \"./make-manifest\": {\n \"import\": \"./dist/esm/bin/make-manifest.js\",\n \"require\": \"./dist/cjs/bin/make-manifest.cjs\"\n },\n \"./make-version\": {\n \"import\": \"./dist/esm/bin/version.js\",\n \"require\": \"./dist/cjs/bin/version.cjs\"\n }\n },\n \"author\": {\n \"name\": \"Emiliano Heyns\",\n \"email\": \"Emiliano.Heyns@iris-advies.com\"\n },\n \"scripts\": {\n \"preversion\": \"npm test\",\n \"postversion\": \"git push --follow-tags\",\n \"test\": \"dprint fmt *.ts */*.ts && dprint check *.ts */*.ts && npm run build\",\n \"prebuild\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"start\": \"concurrently --raw --group 'npm run check' 'npm run build'\",\n \"pack\": \"npm test && npm pack\",\n \"prepublishOnly\": \"npm install && npm run build\",\n \"ncu\": \"ncu -u && npm i && git add package.json package-lock.json && git commit -m ncu\"\n },\n \"directories\": {\n \"test\": \"test\"\n },\n \"dependencies\": {\n \"@fluent/syntax\": \"^0.19.0\",\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"@octokit/rest\": \"^22.0.1\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^25.3.0\",\n \"@xmldom/xmldom\": \"^0.9.8\",\n \"ajv\": \"^8.18.0\",\n \"ajv-keywords\": \"^5.1.0\",\n \"archiver\": \"^7.0.1\",\n \"clp\": \"^4.0.13\",\n \"commander\": \"^14.0.3\",\n \"dotenv\": \"^17.3.1\",\n \"ejs\": \"^4.0.1\",\n \"fs-extra\": \"^11.3.3\",\n \"glob\": \"^13.0.6\",\n \"ini\": \"^6.0.0\",\n \"jose\": \"^6.1.3\",\n \"jsesc\": \"^3.1.0\",\n \"lodash\": \"^4.17.23\",\n \"moment\": \"^2.30.1\",\n \"node-forge\": \"^1.3.3\",\n \"node-stream-zip\": \"^1.15.0\",\n \"openpgp\": \"^6.3.0\",\n \"peggy\": \"^5.0.6\",\n \"prompts\": \"^2.4.2\",\n \"pug\": \"^3.0.3\",\n \"rimraf\": \"^6.1.3\",\n \"shell-quote\": \"^1.8.3\",\n \"shelljs\": \"^0.10.0\",\n \"string-to-arraybuffer\": \"^1.0.2\",\n \"ts-node\": \"^10.9.2\",\n \"tslib\": \"^2.8.1\",\n \"typescript\": \"^5.9.3\",\n \"uri-templates\": \"^0.2.0\",\n \"url-template\": \"^3.1.1\",\n \"uzip\": \"^0.20201231.0\",\n \"xml-parser\": \"^1.2.1\",\n \"xpath\": \"^0.0.34\",\n \"zotero-types\": \"^4.1.1\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/retorquere/zotero-plugin.git\"\n },\n \"license\": \"ISC\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"dist\"\n ],\n \"bin\": {\n \"zp-release\": \"dist/cjs/bin/release.cjs\",\n \"zp-zipup\": \"dist/cjs/bin/zipup.cjs\",\n \"zp-link\": \"dist/cjs/bin/link.cjs\",\n \"issue-branches\": \"dist/cjs/bin/branches.cjs\",\n \"zotero-start\": \"dist/cjs/bin/start.cjs\",\n \"zp-fetch-log\": \"dist/cjs/bin/fetch-log.cjs\",\n \"zp-keypair\": \"dist/cjs/bin/keypair.cjs\",\n \"zp-copy-assets\": \"dist/cjs/copy-assets.cjs\",\n \"zp-make-dirs\": \"dist/cjs/make-dirs.cjs\",\n \"zp-manifest\": \"dist/cjs/make-manifest.cjs\",\n \"zp-version\": \"dist/cjs/version.cjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/retorquere/zotero-plugin/issues\"\n },\n \"devDependencies\": {\n \"@openpgp/web-stream-tools\": \"^0.3.0\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.51.1\",\n \"esbuild\": \"^0.27.3\",\n \"tsup\": \"^8.5.1\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../debug-log.ts","../../crypto.ts","../../package.json"],"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'\nimport * as UZip from 'uzip'\nimport pkg from './package.json'\n\nexport class Bundler {\n public key: string\n\n #refs = false\n\n #pk?: JsonWebKey\n #pubKey?: CryptoKey\n\n #files: Record<string, Uint8Array> = {}\n #encoder = new TextEncoder()\n\n constructor(pk?: JsonWebKey) {\n this.key = Zotero.Utilities.generateObjectKey()\n\n if (pk && pk.kty === KEYTYPE) this.#pk = pk\n }\n\n 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 if (!this.#pubKey) this.#pubKey = (await jose.importJWK(this.#pk, KEY_WRAPPING_ALG)) as CryptoKey\n const jwe = await (new jose.CompactEncrypt(encoded))\n .setProtectedHeader({\n alg: KEY_WRAPPING_ALG,\n enc: CONTENT_ENCRYPTION_ALG,\n })\n .encrypt(this.#pubKey)\n\n this.#files[`${this.key}/${path}.jwe`] = this.#encoder.encode(jwe)\n }\n else {\n this.#files[`${this.key}/${path}`] = encoded\n }\n }\n\n public get zip(): ArrayBuffer {\n return UZip.encode(this.#files) as ArrayBuffer\n }\n\n public get name(): string {\n return `${this.key}.zip`\n }\n\n public id(host: string): string {\n return `${this.key}-${host}${this.#refs ? '.refs' : ''}${this.#pubKey ? '.enc' : ''}`\n }\n\n public async send(): Promise<string> {\n const response = await fetch(`https://filebin.net/${this.key}/${this.name}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/zip',\n },\n body: new Blob([this.zip], { 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\ntype Plugin = {\n plugin: string\n preferences: string[]\n pubKey?: JsonWebKey\n}\n\nclass DebugLogSender {\n version = pkg.version\n #menu: string | false\n #plugins: Plugin[] = []\n\n public debugEnabledAtStart: boolean = typeof Zotero !== 'undefined'\n ? (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n : null\n\n public register(plugin: string, preferences: string[] = [], pubKey?: JsonWebKey): void {\n this.#menu ??= Zotero.MenuManager.registerMenu({\n menuID: 'debug-log-sender',\n pluginID: 'debug-log-sender',\n target: 'main/menubar/help',\n menus: [\n {\n menuType: 'submenu',\n onShowing: (event, context) => {\n context.setVisible(!!this.#plugins.length)\n context.menuElem?.setAttribute('label', 'Send plugin debug log')\n },\n menus: Array.from({ length: 20 }, (v, i) => ({\n menuType: 'menuitem',\n onShowing: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n context.setVisible(this.#plugins.length > i)\n context.menuElem?.setAttribute('label', this.#plugins[i]?.plugin || '')\n },\n onCommand: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n void this.send(this.#plugins[i])\n },\n })),\n },\n ],\n })\n\n this.#plugins.push({ plugin, preferences, pubKey })\n }\n\n public unregister(plugin: string) {\n this.#plugins = this.#plugins.filter(p => p.plugin !== plugin)\n }\n\n private async send({ plugin, preferences, pubKey }: Plugin): Promise<void> {\n try {\n await Zotero.Schema.schemaUpdatePromise\n\n const bundler = new Bundler(pubKey || undefined)\n\n let log = [\n await this.info(preferences),\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 ${plugin}`, logid)\n }\n catch (err) {\n Services.prompt.alert(null, `Could not post debug log for ${plugin}`, err.message)\n }\n }\n\n private preferences(preferences: string[]): Record<string, string | number | boolean> {\n const prefs: Record<string, string | number | boolean> = {}\n\n const names: string[] = []\n for (let pref of 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 prefs[pref] = Zotero.Prefs.get(pref, true)\n }\n\n return prefs\n }\n\n // general state of Zotero\n private async info(preferences: string[]): 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 platform = ['Win', 'Mac', 'Linux'].find(p => Zotero[`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(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 items: any[] = Zotero.getActiveZoteroPane().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 ? obj.string : undefined)\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\ndeclare global {\n interface Zotero {\n DebugLogSender?: DebugLogSender\n }\n namespace Zotero {\n var DebugLogSender: DebugLogSender | undefined\n }\n}\n\nfunction upgrade(installed?: string) {\n if (!installed) return true\n return installed.localeCompare(pkg.version, undefined, { numeric: true }) < 0\n}\n\nif (upgrade(Zotero.DebugLogSender?.version)) Zotero.DebugLogSender = new DebugLogSender()\nexport const DebugLog = Zotero.DebugLogSender\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","export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"8.0.14\",\n \"description\": \"Zotero plugin builder\",\n \"homepage\": \"https://github.com/retorquere/zotero-plugin/wiki\",\n \"type\": \"module\",\n \"main\": \"./dist/cjs/index.js\",\n \"module\": \"./dist/esm/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/esm/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./debug-log\": {\n \"import\": \"./dist/esm/debug-log.js\",\n \"require\": \"./dist/cjs/debug-log.cjs\"\n },\n \"./logger\": {\n \"import\": \"./dist/esm/logger.js\",\n \"require\": \"./dist/cjs/logger.cjs\"\n },\n \".loader/json\": {\n \"import\": \"./dist/esm/loader/json.js\",\n \"require\": \"./dist/cjs/loader/json.cjs\"\n },\n \".loader/peggy\": {\n \"import\": \"./dist/esm/loader/peggy.js\",\n \"require\": \"./dist/cjs/loader/peggy.cjs\"\n },\n \".loader/pem\": {\n \"import\": \"./dist/esm/loader/pem.js\",\n \"require\": \"./dist/cjs/loader/pem.cjs\"\n },\n \"./copy-assets\": {\n \"import\": \"./dist/esm/bin/copy-assets.js\",\n \"require\": \"./dist/cjs/bin/copy-assets.cjs\"\n },\n \"./make-dirs\": {\n \"import\": \"./dist/esm/bin/make-dirs.js\",\n \"require\": \"./dist/cjs/bin/make-dirs.cjs\"\n },\n \"./make-manifest\": {\n \"import\": \"./dist/esm/bin/make-manifest.js\",\n \"require\": \"./dist/cjs/bin/make-manifest.cjs\"\n },\n \"./make-version\": {\n \"import\": \"./dist/esm/bin/version.js\",\n \"require\": \"./dist/cjs/bin/version.cjs\"\n }\n },\n \"author\": {\n \"name\": \"Emiliano Heyns\",\n \"email\": \"Emiliano.Heyns@iris-advies.com\"\n },\n \"scripts\": {\n \"preversion\": \"npm test\",\n \"postversion\": \"git push --follow-tags\",\n \"test\": \"dprint fmt *.ts */*.ts && dprint check *.ts */*.ts && npm run build\",\n \"prebuild\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"start\": \"concurrently --raw --group 'npm run check' 'npm run build'\",\n \"pack\": \"npm test && npm pack\",\n \"prepublishOnly\": \"npm install && npm run build\",\n \"ncu\": \"ncu -u && npm i && git add package.json package-lock.json && git commit -m ncu\"\n },\n \"directories\": {\n \"test\": \"test\"\n },\n \"dependencies\": {\n \"@fluent/syntax\": \"^0.19.0\",\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"@octokit/rest\": \"^22.0.1\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^25.3.0\",\n \"@xmldom/xmldom\": \"^0.9.8\",\n \"ajv\": \"^8.18.0\",\n \"ajv-keywords\": \"^5.1.0\",\n \"archiver\": \"^7.0.1\",\n \"clp\": \"^4.0.13\",\n \"commander\": \"^14.0.3\",\n \"dotenv\": \"^17.3.1\",\n \"ejs\": \"^4.0.1\",\n \"fs-extra\": \"^11.3.3\",\n \"glob\": \"^13.0.6\",\n \"ini\": \"^6.0.0\",\n \"jose\": \"^6.1.3\",\n \"jsesc\": \"^3.1.0\",\n \"lodash\": \"^4.17.23\",\n \"moment\": \"^2.30.1\",\n \"node-forge\": \"^1.3.3\",\n \"node-stream-zip\": \"^1.15.0\",\n \"openpgp\": \"^6.3.0\",\n \"peggy\": \"^5.0.6\",\n \"prompts\": \"^2.4.2\",\n \"pug\": \"^3.0.3\",\n \"rimraf\": \"^6.1.3\",\n \"shell-quote\": \"^1.8.3\",\n \"shelljs\": \"^0.10.0\",\n \"string-to-arraybuffer\": \"^1.0.2\",\n \"ts-node\": \"^10.9.2\",\n \"tslib\": \"^2.8.1\",\n \"typescript\": \"^5.9.3\",\n \"uri-templates\": \"^0.2.0\",\n \"url-template\": \"^3.1.1\",\n \"uzip\": \"^0.20201231.0\",\n \"xml-parser\": \"^1.2.1\",\n \"xpath\": \"^0.0.34\",\n \"zotero-types\": \"^4.1.1\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/retorquere/zotero-plugin.git\"\n },\n \"license\": \"ISC\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"dist\"\n ],\n \"bin\": {\n \"zp-release\": \"dist/cjs/bin/release.cjs\",\n \"zp-zipup\": \"dist/cjs/bin/zipup.cjs\",\n \"zp-link\": \"dist/cjs/bin/link.cjs\",\n \"issue-branches\": \"dist/cjs/bin/branches.cjs\",\n \"zotero-start\": \"dist/cjs/bin/start.cjs\",\n \"zp-fetch-log\": \"dist/cjs/bin/fetch-log.cjs\",\n \"zp-keypair\": \"dist/cjs/bin/keypair.cjs\",\n \"zp-copy-assets\": \"dist/cjs/copy-assets.cjs\",\n \"zp-make-dirs\": \"dist/cjs/make-dirs.cjs\",\n \"zp-manifest\": \"dist/cjs/make-manifest.cjs\",\n \"zp-version\": \"dist/cjs/version.cjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/retorquere/zotero-plugin/issues\"\n },\n \"devDependencies\": {\n \"@openpgp/web-stream-tools\": \"^0.3.0\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.51.1\",\n \"esbuild\": \"^0.27.3\",\n \"tsup\": \"^8.5.1\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -87,14 +87,15 @@ async function main() {
|
|
|
87
87
|
const response = await fetch(options.url, {
|
|
88
88
|
method: "GET",
|
|
89
89
|
headers: {
|
|
90
|
-
"User-Agent":
|
|
90
|
+
"User-Agent": "curl/7.81.0",
|
|
91
|
+
// filebin does not seem to accept custom user agents
|
|
92
|
+
"Accept-Encoding": "identity",
|
|
91
93
|
Accept: "*/*"
|
|
92
94
|
}
|
|
93
95
|
});
|
|
94
96
|
if (!response.ok) oops(`Failed to download: ${response.statusText}`);
|
|
95
|
-
const readable = Readable.fromWeb(response.body);
|
|
96
97
|
const download = fs2.createWriteStream(options.zip);
|
|
97
|
-
await finished(
|
|
98
|
+
await finished(Readable.fromWeb(response.body).pipe(download));
|
|
98
99
|
const zipfile = new StreamZip.async({ file: options.zip });
|
|
99
100
|
const entries = Object.values(await zipfile.entries()).filter((entry) => !entry.isDirectory);
|
|
100
101
|
const privateKey = await getPrivateKey();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/fetch-log.ts","../../../crypto.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport crypto, { webcrypto } from 'crypto'\nimport fs from 'fs'\nimport * as jose from 'jose'\nimport StreamZip from 'node-stream-zip'\nimport { Readable } from 'node:stream'\nimport { finished } from 'node:stream/promises'\nimport path from 'path'\n\nimport { Entry as KeyRingEntry } from '@napi-rs/keyring'\nimport prompts from 'prompts'\n\nimport { KEY_WRAPPING_ALG } from '../crypto'\nimport { pkg } from './find-root'\n\nasync function getPassphrase(): Promise<string> {\n const service = `${pkg.name} Zotero plugin`\n const account = `${pkg.name}-debug-log`\n const entry = new KeyRingEntry(service, account)\n let passphrase = entry.getPassword()\n if (!passphrase) {\n const response = await prompts({\n type: 'password',\n name: 'passphrase',\n message: `Enter a passphrase to decrypt your private key for ${service} ${account}:`,\n })\n entry.setPassword(passphrase = response.passphrase)\n }\n return passphrase\n}\n\nconst oops = (...args) => {\n console.error(...args)\n process.exit(1)\n}\n\nconst program = new Command()\nprogram\n .description('A script to fetch debug logs.')\n .option('-p, --private <path>', 'Path for the encrypted private key .pem file', 'private.pem')\n .option('-k, --keep', 'Keep the downloaded zip', false)\n .argument('<debug log id>', 'debug log ID to fetch')\n .parse(process.argv)\nconst options = program.opts()\nconst args = program.args\n\nif (!args.length) oops('No log ID')\n\nlet m = args[0].match(/^(?<key>[a-z0-9]+)-(?<host>[^-]+)(?<tags>.*)$/i)\nif (!m) oops(args[0], 'is not a valid log ID')\n\nconst { host, key, tags } = m.groups\nif (host !== 'fbin') oops('Unexpected debug log host', host)\n\noptions.encrypted = tags.split('.').includes('enc')\noptions.zip = path.join('logs', `${key}.zip`)\noptions.url = `https://filebin.net/${key}/${key}.zip`\n\nif (options.encrypted) {\n if (!options.private) oops('No private key provided')\n if (!fs.existsSync(options.private)) oops('Private key', options.private, 'does not exist')\n if (!fs.existsSync('package.json')) oops('package.json does not exist in the current directory')\n}\n\nconst logs = path.join('logs', key)\nconsole.log(options.url, '=>', logs)\nif (!fs.existsSync(logs)) {\n fs.mkdirSync(logs, { recursive: true })\n}\n\nasync function getPrivateKey(): Promise<webcrypto.CryptoKey> {\n if (!options.encrypted) return undefined\n\n const privateKeyObject = crypto.createPrivateKey({\n key: fs.readFileSync(options.private, 'utf-8'),\n format: 'pem',\n passphrase: await getPassphrase(),\n })\n const unencryptedKeyPEM = privateKeyObject.export({\n type: 'pkcs8',\n format: 'pem',\n }).toString()\n return await jose.importPKCS8(\n unencryptedKeyPEM,\n KEY_WRAPPING_ALG,\n )\n}\nasync function main() {\n try {\n const response = await fetch(options.url, {\n method: 'GET',\n headers: {\n 'User-Agent':
|
|
1
|
+
{"version":3,"sources":["../../../bin/fetch-log.ts","../../../crypto.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport crypto, { webcrypto } from 'crypto'\nimport fs from 'fs'\nimport * as jose from 'jose'\nimport StreamZip from 'node-stream-zip'\nimport { Readable } from 'node:stream'\nimport { finished } from 'node:stream/promises'\nimport path from 'path'\n\nimport { Entry as KeyRingEntry } from '@napi-rs/keyring'\nimport prompts from 'prompts'\n\nimport { KEY_WRAPPING_ALG } from '../crypto'\nimport { pkg } from './find-root'\n\nasync function getPassphrase(): Promise<string> {\n const service = `${pkg.name} Zotero plugin`\n const account = `${pkg.name}-debug-log`\n const entry = new KeyRingEntry(service, account)\n let passphrase = entry.getPassword()\n if (!passphrase) {\n const response = await prompts({\n type: 'password',\n name: 'passphrase',\n message: `Enter a passphrase to decrypt your private key for ${service} ${account}:`,\n })\n entry.setPassword(passphrase = response.passphrase)\n }\n return passphrase\n}\n\nconst oops = (...args) => {\n console.error(...args)\n process.exit(1)\n}\n\nconst program = new Command()\nprogram\n .description('A script to fetch debug logs.')\n .option('-p, --private <path>', 'Path for the encrypted private key .pem file', 'private.pem')\n .option('-k, --keep', 'Keep the downloaded zip', false)\n .argument('<debug log id>', 'debug log ID to fetch')\n .parse(process.argv)\nconst options = program.opts()\nconst args = program.args\n\nif (!args.length) oops('No log ID')\n\nlet m = args[0].match(/^(?<key>[a-z0-9]+)-(?<host>[^-]+)(?<tags>.*)$/i)\nif (!m) oops(args[0], 'is not a valid log ID')\n\nconst { host, key, tags } = m.groups\nif (host !== 'fbin') oops('Unexpected debug log host', host)\n\noptions.encrypted = tags.split('.').includes('enc')\noptions.zip = path.join('logs', `${key}.zip`)\noptions.url = `https://filebin.net/${key}/${key}.zip`\n\nif (options.encrypted) {\n if (!options.private) oops('No private key provided')\n if (!fs.existsSync(options.private)) oops('Private key', options.private, 'does not exist')\n if (!fs.existsSync('package.json')) oops('package.json does not exist in the current directory')\n}\n\nconst logs = path.join('logs', key)\nconsole.log(options.url, '=>', logs)\nif (!fs.existsSync(logs)) {\n fs.mkdirSync(logs, { recursive: true })\n}\n\nasync function getPrivateKey(): Promise<webcrypto.CryptoKey> {\n if (!options.encrypted) return undefined\n\n const privateKeyObject = crypto.createPrivateKey({\n key: fs.readFileSync(options.private, 'utf-8'),\n format: 'pem',\n passphrase: await getPassphrase(),\n })\n const unencryptedKeyPEM = privateKeyObject.export({\n type: 'pkcs8',\n format: 'pem',\n }).toString()\n return await jose.importPKCS8(\n unencryptedKeyPEM,\n KEY_WRAPPING_ALG,\n )\n}\nasync function main() {\n try {\n const response = await fetch(options.url, {\n method: 'GET',\n headers: {\n 'User-Agent': 'curl/7.81.0', // filebin does not seem to accept custom user agents\n 'Accept-Encoding': 'identity',\n Accept: '*/*',\n },\n })\n if (!response.ok) oops(`Failed to download: ${response.statusText}`)\n\n const download = fs.createWriteStream(options.zip)\n await finished(Readable.fromWeb(response.body as any).pipe(download))\n\n const zipfile = new StreamZip.async({ file: options.zip })\n const entries = Object.values(await zipfile.entries()).filter(entry => !entry.isDirectory)\n\n const privateKey = await getPrivateKey()\n\n for (const entry of entries) {\n const m = entry.name.match(/(?<filename>.+)\\.(?<type>jwe)$/i)\n const filename = m?.groups!.filename || entry.name\n const type = (m?.groups!.type || '').toLowerCase()\n const target = path.join('logs', filename)\n\n if (options.encrypted && !type) oops('Unexpected unencrypted contents', entry.name)\n if (type && !options.encrypted) oops('Unexpected encrypted contents', entry.name)\n switch (type) {\n case '':\n fs.writeFileSync(target, await zipfile.entryData(entry.name))\n break\n case 'jwe': {\n const { plaintext } = await jose.compactDecrypt((await zipfile.entryData(entry.name)).toString('utf8'), privateKey)\n fs.writeFileSync(target, plaintext)\n break\n }\n default:\n oops('Unexpected log entry', entry.name)\n break\n }\n }\n }\n finally {\n if (!options.keep && fs.existsSync(options.zip)) fs.unlinkSync(options.zip)\n }\n}\n\nmain().catch(err => {\n oops(err.message)\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","import fs from 'node:fs'\nimport path from 'node:path'\n\nconst folders = process.cwd().split(path.sep)\nconst rootIndex = folders.findIndex((folder: string, i: number) => fs.existsSync(path.join(folders.slice(0, i + 1).join(path.sep), 'package.json')))\nexport const root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(path.sep)\nconsole.log('project directory:', root)\n\nexport const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8'))\n"],"mappings":"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","names":["fs","path","args","path","fs","m"]}
|
package/dist/esm/debug-log.js
CHANGED
|
@@ -10,7 +10,7 @@ import * as UZip from "uzip";
|
|
|
10
10
|
// package.json
|
|
11
11
|
var package_default = {
|
|
12
12
|
"name": "zotero-plugin",
|
|
13
|
-
"version": "8.0.
|
|
13
|
+
"version": "8.0.14",
|
|
14
14
|
"description": "Zotero plugin builder",
|
|
15
15
|
"homepage": "https://github.com/retorquere/zotero-plugin/wiki",
|
|
16
16
|
"type": "module",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../crypto.ts","../../debug-log.ts","../../package.json"],"sourcesContent":["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","/* 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'\nimport * as UZip from 'uzip'\nimport pkg from './package.json'\n\nexport class Bundler {\n public key: string\n\n #refs = false\n\n #pk?: JsonWebKey\n #pubKey?: CryptoKey\n\n #files: Record<string, Uint8Array> = {}\n #encoder = new TextEncoder()\n\n constructor(pk?: JsonWebKey) {\n this.key = Zotero.Utilities.generateObjectKey()\n\n if (pk && pk.kty === KEYTYPE) this.#pk = pk\n }\n\n 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 if (!this.#pubKey) this.#pubKey = (await jose.importJWK(this.#pk, KEY_WRAPPING_ALG)) as CryptoKey\n const jwe = await (new jose.CompactEncrypt(encoded))\n .setProtectedHeader({\n alg: KEY_WRAPPING_ALG,\n enc: CONTENT_ENCRYPTION_ALG,\n })\n .encrypt(this.#pubKey)\n\n this.#files[`${this.key}/${path}.jwe`] = this.#encoder.encode(jwe)\n }\n else {\n this.#files[`${this.key}/${path}`] = encoded\n }\n }\n\n public get zip(): ArrayBuffer {\n return UZip.encode(this.#files) as ArrayBuffer\n }\n\n public get name(): string {\n return `${this.key}.zip`\n }\n\n public id(host: string): string {\n return `${this.key}-${host}${this.#refs ? '.refs' : ''}${this.#pubKey ? '.enc' : ''}`\n }\n\n public async send(): Promise<string> {\n const response = await fetch(`https://filebin.net/${this.key}/${this.name}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/zip',\n },\n body: new Blob([this.zip], { 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\ntype Plugin = {\n plugin: string\n preferences: string[]\n pubKey?: JsonWebKey\n}\n\nclass DebugLogSender {\n version = pkg.version\n #menu: string | false\n #plugins: Plugin[] = []\n\n public debugEnabledAtStart: boolean = typeof Zotero !== 'undefined'\n ? (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n : null\n\n public register(plugin: string, preferences: string[] = [], pubKey?: JsonWebKey): void {\n this.#menu ??= Zotero.MenuManager.registerMenu({\n menuID: 'debug-log-sender',\n pluginID: 'debug-log-sender',\n target: 'main/menubar/help',\n menus: [\n {\n menuType: 'submenu',\n onShowing: (event, context) => {\n context.setVisible(!!this.#plugins.length)\n context.menuElem?.setAttribute('label', 'Send plugin debug log')\n },\n menus: Array.from({ length: 20 }, (v, i) => ({\n menuType: 'menuitem',\n onShowing: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n context.setVisible(this.#plugins.length > i)\n context.menuElem?.setAttribute('label', this.#plugins[i]?.plugin || '')\n },\n onCommand: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n void this.send(this.#plugins[i])\n },\n })),\n },\n ],\n })\n\n this.#plugins.push({ plugin, preferences, pubKey })\n }\n\n public unregister(plugin: string) {\n this.#plugins = this.#plugins.filter(p => p.plugin !== plugin)\n }\n\n private async send({ plugin, preferences, pubKey }: Plugin): Promise<void> {\n try {\n await Zotero.Schema.schemaUpdatePromise\n\n const bundler = new Bundler(pubKey || undefined)\n\n let log = [\n await this.info(preferences),\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 ${plugin}`, logid)\n }\n catch (err) {\n Services.prompt.alert(null, `Could not post debug log for ${plugin}`, err.message)\n }\n }\n\n private preferences(preferences: string[]): Record<string, string | number | boolean> {\n const prefs: Record<string, string | number | boolean> = {}\n\n const names: string[] = []\n for (let pref of 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 prefs[pref] = Zotero.Prefs.get(pref, true)\n }\n\n return prefs\n }\n\n // general state of Zotero\n private async info(preferences: string[]): 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 platform = ['Win', 'Mac', 'Linux'].find(p => Zotero[`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(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 items: any[] = Zotero.getActiveZoteroPane().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 ? obj.string : undefined)\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\ndeclare global {\n interface Zotero {\n DebugLogSender?: DebugLogSender\n }\n namespace Zotero {\n var DebugLogSender: DebugLogSender | undefined\n }\n}\n\nfunction upgrade(installed?: string) {\n if (!installed) return true\n return installed.localeCompare(pkg.version, undefined, { numeric: true }) < 0\n}\n\nif (upgrade(Zotero.DebugLogSender?.version)) Zotero.DebugLogSender = new DebugLogSender()\nexport const DebugLog = Zotero.DebugLogSender\n","export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"8.0.13\",\n \"description\": \"Zotero plugin builder\",\n \"homepage\": \"https://github.com/retorquere/zotero-plugin/wiki\",\n \"type\": \"module\",\n \"main\": \"./dist/cjs/index.js\",\n \"module\": \"./dist/esm/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/esm/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./debug-log\": {\n \"import\": \"./dist/esm/debug-log.js\",\n \"require\": \"./dist/cjs/debug-log.cjs\"\n },\n \"./logger\": {\n \"import\": \"./dist/esm/logger.js\",\n \"require\": \"./dist/cjs/logger.cjs\"\n },\n \".loader/json\": {\n \"import\": \"./dist/esm/loader/json.js\",\n \"require\": \"./dist/cjs/loader/json.cjs\"\n },\n \".loader/peggy\": {\n \"import\": \"./dist/esm/loader/peggy.js\",\n \"require\": \"./dist/cjs/loader/peggy.cjs\"\n },\n \".loader/pem\": {\n \"import\": \"./dist/esm/loader/pem.js\",\n \"require\": \"./dist/cjs/loader/pem.cjs\"\n },\n \"./copy-assets\": {\n \"import\": \"./dist/esm/bin/copy-assets.js\",\n \"require\": \"./dist/cjs/bin/copy-assets.cjs\"\n },\n \"./make-dirs\": {\n \"import\": \"./dist/esm/bin/make-dirs.js\",\n \"require\": \"./dist/cjs/bin/make-dirs.cjs\"\n },\n \"./make-manifest\": {\n \"import\": \"./dist/esm/bin/make-manifest.js\",\n \"require\": \"./dist/cjs/bin/make-manifest.cjs\"\n },\n \"./make-version\": {\n \"import\": \"./dist/esm/bin/version.js\",\n \"require\": \"./dist/cjs/bin/version.cjs\"\n }\n },\n \"author\": {\n \"name\": \"Emiliano Heyns\",\n \"email\": \"Emiliano.Heyns@iris-advies.com\"\n },\n \"scripts\": {\n \"preversion\": \"npm test\",\n \"postversion\": \"git push --follow-tags\",\n \"test\": \"dprint fmt *.ts */*.ts && dprint check *.ts */*.ts && npm run build\",\n \"prebuild\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"start\": \"concurrently --raw --group 'npm run check' 'npm run build'\",\n \"pack\": \"npm test && npm pack\",\n \"prepublishOnly\": \"npm install && npm run build\",\n \"ncu\": \"ncu -u && npm i && git add package.json package-lock.json && git commit -m ncu\"\n },\n \"directories\": {\n \"test\": \"test\"\n },\n \"dependencies\": {\n \"@fluent/syntax\": \"^0.19.0\",\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"@octokit/rest\": \"^22.0.1\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^25.3.0\",\n \"@xmldom/xmldom\": \"^0.9.8\",\n \"ajv\": \"^8.18.0\",\n \"ajv-keywords\": \"^5.1.0\",\n \"archiver\": \"^7.0.1\",\n \"clp\": \"^4.0.13\",\n \"commander\": \"^14.0.3\",\n \"dotenv\": \"^17.3.1\",\n \"ejs\": \"^4.0.1\",\n \"fs-extra\": \"^11.3.3\",\n \"glob\": \"^13.0.6\",\n \"ini\": \"^6.0.0\",\n \"jose\": \"^6.1.3\",\n \"jsesc\": \"^3.1.0\",\n \"lodash\": \"^4.17.23\",\n \"moment\": \"^2.30.1\",\n \"node-forge\": \"^1.3.3\",\n \"node-stream-zip\": \"^1.15.0\",\n \"openpgp\": \"^6.3.0\",\n \"peggy\": \"^5.0.6\",\n \"prompts\": \"^2.4.2\",\n \"pug\": \"^3.0.3\",\n \"rimraf\": \"^6.1.3\",\n \"shell-quote\": \"^1.8.3\",\n \"shelljs\": \"^0.10.0\",\n \"string-to-arraybuffer\": \"^1.0.2\",\n \"ts-node\": \"^10.9.2\",\n \"tslib\": \"^2.8.1\",\n \"typescript\": \"^5.9.3\",\n \"uri-templates\": \"^0.2.0\",\n \"url-template\": \"^3.1.1\",\n \"uzip\": \"^0.20201231.0\",\n \"xml-parser\": \"^1.2.1\",\n \"xpath\": \"^0.0.34\",\n \"zotero-types\": \"^4.1.1\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/retorquere/zotero-plugin.git\"\n },\n \"license\": \"ISC\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"dist\"\n ],\n \"bin\": {\n \"zp-release\": \"dist/cjs/bin/release.cjs\",\n \"zp-zipup\": \"dist/cjs/bin/zipup.cjs\",\n \"zp-link\": \"dist/cjs/bin/link.cjs\",\n \"issue-branches\": \"dist/cjs/bin/branches.cjs\",\n \"zotero-start\": \"dist/cjs/bin/start.cjs\",\n \"zp-fetch-log\": \"dist/cjs/bin/fetch-log.cjs\",\n \"zp-keypair\": \"dist/cjs/bin/keypair.cjs\",\n \"zp-copy-assets\": \"dist/cjs/copy-assets.cjs\",\n \"zp-make-dirs\": \"dist/cjs/make-dirs.cjs\",\n \"zp-manifest\": \"dist/cjs/make-manifest.cjs\",\n \"zp-version\": \"dist/cjs/version.cjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/retorquere/zotero-plugin/issues\"\n },\n \"devDependencies\": {\n \"@openpgp/web-stream-tools\": \"^0.3.0\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.51.1\",\n \"esbuild\": \"^0.27.3\",\n \"tsup\": \"^8.5.1\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../crypto.ts","../../debug-log.ts","../../package.json"],"sourcesContent":["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","/* 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'\nimport * as UZip from 'uzip'\nimport pkg from './package.json'\n\nexport class Bundler {\n public key: string\n\n #refs = false\n\n #pk?: JsonWebKey\n #pubKey?: CryptoKey\n\n #files: Record<string, Uint8Array> = {}\n #encoder = new TextEncoder()\n\n constructor(pk?: JsonWebKey) {\n this.key = Zotero.Utilities.generateObjectKey()\n\n if (pk && pk.kty === KEYTYPE) this.#pk = pk\n }\n\n 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 if (!this.#pubKey) this.#pubKey = (await jose.importJWK(this.#pk, KEY_WRAPPING_ALG)) as CryptoKey\n const jwe = await (new jose.CompactEncrypt(encoded))\n .setProtectedHeader({\n alg: KEY_WRAPPING_ALG,\n enc: CONTENT_ENCRYPTION_ALG,\n })\n .encrypt(this.#pubKey)\n\n this.#files[`${this.key}/${path}.jwe`] = this.#encoder.encode(jwe)\n }\n else {\n this.#files[`${this.key}/${path}`] = encoded\n }\n }\n\n public get zip(): ArrayBuffer {\n return UZip.encode(this.#files) as ArrayBuffer\n }\n\n public get name(): string {\n return `${this.key}.zip`\n }\n\n public id(host: string): string {\n return `${this.key}-${host}${this.#refs ? '.refs' : ''}${this.#pubKey ? '.enc' : ''}`\n }\n\n public async send(): Promise<string> {\n const response = await fetch(`https://filebin.net/${this.key}/${this.name}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/zip',\n },\n body: new Blob([this.zip], { 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\ntype Plugin = {\n plugin: string\n preferences: string[]\n pubKey?: JsonWebKey\n}\n\nclass DebugLogSender {\n version = pkg.version\n #menu: string | false\n #plugins: Plugin[] = []\n\n public debugEnabledAtStart: boolean = typeof Zotero !== 'undefined'\n ? (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n : null\n\n public register(plugin: string, preferences: string[] = [], pubKey?: JsonWebKey): void {\n this.#menu ??= Zotero.MenuManager.registerMenu({\n menuID: 'debug-log-sender',\n pluginID: 'debug-log-sender',\n target: 'main/menubar/help',\n menus: [\n {\n menuType: 'submenu',\n onShowing: (event, context) => {\n context.setVisible(!!this.#plugins.length)\n context.menuElem?.setAttribute('label', 'Send plugin debug log')\n },\n menus: Array.from({ length: 20 }, (v, i) => ({\n menuType: 'menuitem',\n onShowing: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n context.setVisible(this.#plugins.length > i)\n context.menuElem?.setAttribute('label', this.#plugins[i]?.plugin || '')\n },\n onCommand: (event: Event, context: _ZoteroTypes.MenuManager.MenuContext) => {\n void this.send(this.#plugins[i])\n },\n })),\n },\n ],\n })\n\n this.#plugins.push({ plugin, preferences, pubKey })\n }\n\n public unregister(plugin: string) {\n this.#plugins = this.#plugins.filter(p => p.plugin !== plugin)\n }\n\n private async send({ plugin, preferences, pubKey }: Plugin): Promise<void> {\n try {\n await Zotero.Schema.schemaUpdatePromise\n\n const bundler = new Bundler(pubKey || undefined)\n\n let log = [\n await this.info(preferences),\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 ${plugin}`, logid)\n }\n catch (err) {\n Services.prompt.alert(null, `Could not post debug log for ${plugin}`, err.message)\n }\n }\n\n private preferences(preferences: string[]): Record<string, string | number | boolean> {\n const prefs: Record<string, string | number | boolean> = {}\n\n const names: string[] = []\n for (let pref of 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 prefs[pref] = Zotero.Prefs.get(pref, true)\n }\n\n return prefs\n }\n\n // general state of Zotero\n private async info(preferences: string[]): 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 platform = ['Win', 'Mac', 'Linux'].find(p => Zotero[`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(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 items: any[] = Zotero.getActiveZoteroPane().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 ? obj.string : undefined)\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\ndeclare global {\n interface Zotero {\n DebugLogSender?: DebugLogSender\n }\n namespace Zotero {\n var DebugLogSender: DebugLogSender | undefined\n }\n}\n\nfunction upgrade(installed?: string) {\n if (!installed) return true\n return installed.localeCompare(pkg.version, undefined, { numeric: true }) < 0\n}\n\nif (upgrade(Zotero.DebugLogSender?.version)) Zotero.DebugLogSender = new DebugLogSender()\nexport const DebugLog = Zotero.DebugLogSender\n","export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"8.0.14\",\n \"description\": \"Zotero plugin builder\",\n \"homepage\": \"https://github.com/retorquere/zotero-plugin/wiki\",\n \"type\": \"module\",\n \"main\": \"./dist/cjs/index.js\",\n \"module\": \"./dist/esm/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/esm/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./debug-log\": {\n \"import\": \"./dist/esm/debug-log.js\",\n \"require\": \"./dist/cjs/debug-log.cjs\"\n },\n \"./logger\": {\n \"import\": \"./dist/esm/logger.js\",\n \"require\": \"./dist/cjs/logger.cjs\"\n },\n \".loader/json\": {\n \"import\": \"./dist/esm/loader/json.js\",\n \"require\": \"./dist/cjs/loader/json.cjs\"\n },\n \".loader/peggy\": {\n \"import\": \"./dist/esm/loader/peggy.js\",\n \"require\": \"./dist/cjs/loader/peggy.cjs\"\n },\n \".loader/pem\": {\n \"import\": \"./dist/esm/loader/pem.js\",\n \"require\": \"./dist/cjs/loader/pem.cjs\"\n },\n \"./copy-assets\": {\n \"import\": \"./dist/esm/bin/copy-assets.js\",\n \"require\": \"./dist/cjs/bin/copy-assets.cjs\"\n },\n \"./make-dirs\": {\n \"import\": \"./dist/esm/bin/make-dirs.js\",\n \"require\": \"./dist/cjs/bin/make-dirs.cjs\"\n },\n \"./make-manifest\": {\n \"import\": \"./dist/esm/bin/make-manifest.js\",\n \"require\": \"./dist/cjs/bin/make-manifest.cjs\"\n },\n \"./make-version\": {\n \"import\": \"./dist/esm/bin/version.js\",\n \"require\": \"./dist/cjs/bin/version.cjs\"\n }\n },\n \"author\": {\n \"name\": \"Emiliano Heyns\",\n \"email\": \"Emiliano.Heyns@iris-advies.com\"\n },\n \"scripts\": {\n \"preversion\": \"npm test\",\n \"postversion\": \"git push --follow-tags\",\n \"test\": \"dprint fmt *.ts */*.ts && dprint check *.ts */*.ts && npm run build\",\n \"prebuild\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"start\": \"concurrently --raw --group 'npm run check' 'npm run build'\",\n \"pack\": \"npm test && npm pack\",\n \"prepublishOnly\": \"npm install && npm run build\",\n \"ncu\": \"ncu -u && npm i && git add package.json package-lock.json && git commit -m ncu\"\n },\n \"directories\": {\n \"test\": \"test\"\n },\n \"dependencies\": {\n \"@fluent/syntax\": \"^0.19.0\",\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"@octokit/rest\": \"^22.0.1\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^25.3.0\",\n \"@xmldom/xmldom\": \"^0.9.8\",\n \"ajv\": \"^8.18.0\",\n \"ajv-keywords\": \"^5.1.0\",\n \"archiver\": \"^7.0.1\",\n \"clp\": \"^4.0.13\",\n \"commander\": \"^14.0.3\",\n \"dotenv\": \"^17.3.1\",\n \"ejs\": \"^4.0.1\",\n \"fs-extra\": \"^11.3.3\",\n \"glob\": \"^13.0.6\",\n \"ini\": \"^6.0.0\",\n \"jose\": \"^6.1.3\",\n \"jsesc\": \"^3.1.0\",\n \"lodash\": \"^4.17.23\",\n \"moment\": \"^2.30.1\",\n \"node-forge\": \"^1.3.3\",\n \"node-stream-zip\": \"^1.15.0\",\n \"openpgp\": \"^6.3.0\",\n \"peggy\": \"^5.0.6\",\n \"prompts\": \"^2.4.2\",\n \"pug\": \"^3.0.3\",\n \"rimraf\": \"^6.1.3\",\n \"shell-quote\": \"^1.8.3\",\n \"shelljs\": \"^0.10.0\",\n \"string-to-arraybuffer\": \"^1.0.2\",\n \"ts-node\": \"^10.9.2\",\n \"tslib\": \"^2.8.1\",\n \"typescript\": \"^5.9.3\",\n \"uri-templates\": \"^0.2.0\",\n \"url-template\": \"^3.1.1\",\n \"uzip\": \"^0.20201231.0\",\n \"xml-parser\": \"^1.2.1\",\n \"xpath\": \"^0.0.34\",\n \"zotero-types\": \"^4.1.1\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/retorquere/zotero-plugin.git\"\n },\n \"license\": \"ISC\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"dist\"\n ],\n \"bin\": {\n \"zp-release\": \"dist/cjs/bin/release.cjs\",\n \"zp-zipup\": \"dist/cjs/bin/zipup.cjs\",\n \"zp-link\": \"dist/cjs/bin/link.cjs\",\n \"issue-branches\": \"dist/cjs/bin/branches.cjs\",\n \"zotero-start\": \"dist/cjs/bin/start.cjs\",\n \"zp-fetch-log\": \"dist/cjs/bin/fetch-log.cjs\",\n \"zp-keypair\": \"dist/cjs/bin/keypair.cjs\",\n \"zp-copy-assets\": \"dist/cjs/copy-assets.cjs\",\n \"zp-make-dirs\": \"dist/cjs/make-dirs.cjs\",\n \"zp-manifest\": \"dist/cjs/make-manifest.cjs\",\n \"zp-version\": \"dist/cjs/version.cjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/retorquere/zotero-plugin/issues\"\n },\n \"devDependencies\": {\n \"@openpgp/web-stream-tools\": \"^0.3.0\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.51.1\",\n \"esbuild\": \"^0.27.3\",\n \"tsup\": \"^8.5.1\"\n }\n}\n"],"mappings":"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","names":[]}
|