@ianacaburian/generate-key-file 1.0.0 → 1.0.1

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/README.md CHANGED
@@ -116,9 +116,9 @@ npm run build # Lint, install tests, and build package.
116
116
  ```
117
117
  npm run test # Start vitest to run all tests.
118
118
  npm run test -- -t "divideBy" # Start vitest to run one test.
119
- npm run clean:test # Clean test build.
120
- npm run open:test/console # Open test/console project in Xcode.
121
- npm run install:test/console # Build and install the test/console bins.
119
+ npm run cm:clean # Clean test build.
120
+ npm run cm:open # Open test/console project in Xcode.
121
+ npm run cm:install # Build and install the test/console bins.
122
122
  ```
123
123
 
124
124
  - Optional: Set "FC_NUM_RUMS" (default=1) to specify how many times to run
package/dist/index.cjs CHANGED
@@ -25,39 +25,6 @@ __export(src_exports, {
25
25
  });
26
26
  module.exports = __toCommonJS(src_exports);
27
27
 
28
- // src/juce/JuceDateString.ts
29
- var JuceDateString = class {
30
- static inHexMs(date) {
31
- return date.getTime().toString(16);
32
- }
33
- static inFormattedComment(date) {
34
- const months = [
35
- "Jan",
36
- "Feb",
37
- "Mar",
38
- "Apr",
39
- "May",
40
- "Jun",
41
- "Jul",
42
- "Aug",
43
- "Sep",
44
- "Oct",
45
- "Nov",
46
- "Dec"
47
- ];
48
- const day = date.getDate().toString();
49
- const month = months[date.getMonth()];
50
- const year = date.getFullYear();
51
- let hours = date.getHours();
52
- const minutes = date.getMinutes().toString().padStart(2, "0");
53
- const seconds = date.getSeconds().toString().padStart(2, "0");
54
- const ampm = hours >= 12 ? "pm" : "am";
55
- hours = hours % 12;
56
- hours = hours ? hours : 12;
57
- return `${day} ${month} ${year} ${hours}:${minutes}:${seconds}${ampm}`;
58
- }
59
- };
60
-
61
28
  // src/juce/JuceKeyFileUtils.ts
62
29
  var import_fast_xml_parser = require("fast-xml-parser");
63
30
 
@@ -133,6 +100,35 @@ var xmlBuilder = new import_fast_xml_parser.XMLBuilder({
133
100
  attributeValueProcessor: (_, value) => xmlAttributeValueProcessor(value)
134
101
  });
135
102
  var JuceKeyFileUtils = class {
103
+ static toString(date) {
104
+ const months = [
105
+ "Jan",
106
+ "Feb",
107
+ "Mar",
108
+ "Apr",
109
+ "May",
110
+ "Jun",
111
+ "Jul",
112
+ "Aug",
113
+ "Sep",
114
+ "Oct",
115
+ "Nov",
116
+ "Dec"
117
+ ];
118
+ const day = date.getDate().toString();
119
+ const month = months[date.getMonth()];
120
+ const year = date.getFullYear();
121
+ let hours = date.getHours();
122
+ const minutes = date.getMinutes().toString().padStart(2, "0");
123
+ const seconds = date.getSeconds().toString().padStart(2, "0");
124
+ const ampm = hours >= 12 ? "pm" : "am";
125
+ hours = hours % 12;
126
+ hours = hours ? hours : 12;
127
+ return `${day} ${month} ${year} ${hours}:${minutes}:${seconds}${ampm}`;
128
+ }
129
+ static toHexStringMilliseconds(date) {
130
+ return date.getTime().toString(16);
131
+ }
136
132
  static createKeyFileContentLine({
137
133
  appName,
138
134
  userEmail,
@@ -225,7 +221,7 @@ var JuceKeyGeneration = class {
225
221
  machineNumbers: params.machineNumbers,
226
222
  machineNumbersAttributeName: "mach"
227
223
  },
228
- JuceDateString.inHexMs(date)
224
+ JuceKeyFileUtils.toHexStringMilliseconds(date)
229
225
  );
230
226
  const comment = JuceKeyFileUtils.createKeyFileComment(
231
227
  {
@@ -234,7 +230,7 @@ var JuceKeyGeneration = class {
234
230
  userName: params.userName,
235
231
  machineNumbers: params.machineNumbers
236
232
  },
237
- JuceDateString.inFormattedComment(date)
233
+ JuceKeyFileUtils.toString(date)
238
234
  );
239
235
  return JuceKeyFileUtils.createKeyFile(
240
236
  comment,
@@ -251,8 +247,8 @@ var JuceKeyGeneration = class {
251
247
  machineNumbers: params.machineNumbers,
252
248
  machineNumbersAttributeName: "expiring_mach"
253
249
  },
254
- JuceDateString.inHexMs(date),
255
- JuceDateString.inHexMs(params.expiryTime)
250
+ JuceKeyFileUtils.toHexStringMilliseconds(date),
251
+ JuceKeyFileUtils.toHexStringMilliseconds(params.expiryTime)
256
252
  );
257
253
  const comment = JuceKeyFileUtils.createKeyFileComment(
258
254
  {
@@ -261,8 +257,8 @@ var JuceKeyGeneration = class {
261
257
  userName: params.userName,
262
258
  machineNumbers: params.machineNumbers
263
259
  },
264
- JuceDateString.inFormattedComment(date),
265
- JuceDateString.inFormattedComment(params.expiryTime)
260
+ JuceKeyFileUtils.toString(date),
261
+ JuceKeyFileUtils.toString(params.expiryTime)
266
262
  );
267
263
  return JuceKeyFileUtils.createKeyFile(
268
264
  comment,
@@ -295,7 +291,9 @@ var generateKeyFileParamsValidator = createKeyFileCommentParamsValidator.extend(
295
291
  privateKey: rsaKeyComponentsValidator
296
292
  });
297
293
  var generateExpiringKeyFileParamsValidator = generateKeyFileParamsValidator.extend({
298
- expiryTime: import_zod.z.date()
294
+ expiryTime: import_zod.z.date().min(/* @__PURE__ */ new Date("1970-01-01T00:00:00.001Z"), {
295
+ message: "Expiry time must be after 1970-01-01T00:00:00.000Z"
296
+ })
299
297
  });
300
298
 
301
299
  // src/generateKeyFile.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/juce/JuceDateString.ts","../src/juce/JuceKeyFileUtils.ts","../src/juce/JuceBigInteger.ts","../src/juce/JuceRSAKey.ts","../src/juce/JuceKeyGeneration.ts","../src/types.ts","../src/generateKeyFile.ts","../src/generateExpiringKeyFile.ts"],"sourcesContent":["export {\n type GenerateKeyFileParams,\n type GenerateExpiringKeyFileParams\n} from './types'\n\nexport { generateKeyFile } from './generateKeyFile'\nexport { generateExpiringKeyFile } from './generateExpiringKeyFile'\n","export class JuceDateString {\n static inHexMs(date: Date): string {\n // Ports juce::String::toHexString (juce::Time::getCurrentTime().toMilliseconds())\n return date.getTime().toString(16)\n }\n\n static inFormattedComment(date: Date): string {\n // Ports juce::Time::getCurrentTime().toString (true, true)\n // prettier-ignore\n const months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', \n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]\n const day = date.getDate().toString()\n const month = months[date.getMonth()]\n const year = date.getFullYear()\n let hours = date.getHours()\n const minutes = date.getMinutes().toString().padStart(2, '0')\n const seconds = date.getSeconds().toString().padStart(2, '0')\n const ampm = hours >= 12 ? 'pm' : 'am'\n hours = hours % 12\n hours = hours ? hours : 12\n return `${day} ${month} ${year} ${hours}:${minutes}:${seconds}${ampm}`\n }\n}\n","import { XMLBuilder } from 'fast-xml-parser'\nimport {\n CreateKeyFileCommentParams,\n CreateKeyFileContentLineParams\n} from 'src/types'\n\nimport { JuceBigInteger } from './JuceBigInteger'\nimport { JuceRSAKey } from './JuceRSAKey'\n\nconst XML_DECLARATION = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\n\nconst legalXmlCharRegex =\n // Ports juce::XmlOutputFunctions::LegalCharLookupTable\n /^[a-zA-Z0-9 .,;:\\-()_+=?!$#@[\\]/|*%~{}'\\\\]$/\n\nconst xmlAttributeCharProcessor = (char: string): string =>\n // Ports juce::XmlOutputFunctions::escapeIllegalXMLChars()\n char.length !== 1\n ? ''\n : legalXmlCharRegex.test(char)\n ? char\n : char === '&'\n ? '&amp;'\n : char === '\"'\n ? '&quot;'\n : char === '>'\n ? '&gt;'\n : char === '<'\n ? '&lt;'\n : `&#${char.charCodeAt(0)};`\n\nconst xmlAttributeValueProcessor = (value: unknown): string =>\n // Ports juce::XmlOutputFunctions::escapeIllegalXMLChars()\n typeof value !== 'string'\n ? ''\n : value.split('').map(xmlAttributeCharProcessor).join('')\n\nconst xmlBuilder = new XMLBuilder({\n ignoreAttributes: false,\n suppressEmptyNode: true,\n // processEntities is disabled since it doesn't port to juce as is\n processEntities: false,\n attributeValueProcessor: (_, value) => xmlAttributeValueProcessor(value)\n})\n\nexport class JuceKeyFileUtils {\n static createKeyFileContentLine(\n {\n appName,\n userEmail,\n userName,\n machineNumbers,\n machineNumbersAttributeName\n }: CreateKeyFileContentLineParams,\n date: string,\n expiryTime?: string\n ): string {\n // Ports juce::KeyFileUtils::createKeyFileContent\n // and juce::KeyFileUtils::encryptXML\n const xml = {\n key: {\n '@_user': userName,\n '@_email': userEmail,\n [`@_${machineNumbersAttributeName}`]: machineNumbers,\n '@_app': appName,\n '@_date': date,\n ...(expiryTime ? { '@_expiryTime': expiryTime } : {})\n }\n }\n return [XML_DECLARATION, xmlBuilder.build(xml).trim()].join(' ')\n }\n\n static createKeyFileComment(\n {\n appName,\n userEmail,\n userName,\n machineNumbers\n }: CreateKeyFileCommentParams,\n created: string,\n expiryTime?: string\n ): string {\n // Ports juce::KeyFileUtils::createKeyFileComment\n return (\n `Keyfile for ${appName}\\r\\n` +\n `${userName ? `User: ${userName}\\r\\n` : ''}` +\n `Email: ${userEmail}\\r\\n` +\n `Machine numbers: ${machineNumbers}\\r\\n` +\n `Created: ${created}` +\n (expiryTime ? `\\r\\nExpires: ${expiryTime}` : '')\n )\n }\n\n static encryptXMLLine(xmlLine: string, privateKey: JuceRSAKey): string {\n // Ports juce::KeyFileUtils::encryptXML\n const val = JuceBigInteger.fromUTF8MemoryBlock(xmlLine)\n privateKey.applyToValue(val)\n return val.toHex()\n }\n\n static createKeyFile(\n comment: string,\n xmlLine: string,\n rsaPrivateKey: JuceRSAKey\n ): string {\n // Ports juce::KeyFileUtils::createKeyFile\n let asHex = '#' + this.encryptXMLLine(xmlLine, rsaPrivateKey)\n\n const lines: string[] = []\n lines.push(comment)\n lines.push('')\n\n const charsPerLine = 70\n while (asHex.length > 0) {\n lines.push(asHex.substring(0, charsPerLine))\n asHex = asHex.substring(charsPerLine)\n }\n\n lines.push('')\n\n return lines.join('\\r\\n')\n }\n}\n","import { BigInteger as JSBN } from 'jsbn'\n\nexport class JuceBigInteger {\n constructor(public value: bigint = 0n) {}\n\n static fromJSBN(b: JSBN): JuceBigInteger {\n return JuceBigInteger.fromHex(b.toString(16))\n }\n\n toJSBN(): JSBN {\n return new JSBN(this.toHex(), 16)\n }\n\n static fromHex(hex: string): JuceBigInteger {\n const h = hex.trim()\n return new JuceBigInteger(h ? BigInt(`0x${h}`) : 0n)\n }\n\n toHex(): string {\n return this.value.toString(16)\n }\n\n static fromUTF8MemoryBlock(input: string): JuceBigInteger {\n // Ports juce::BigInteger::loadFromMemoryBlock()\n const u = Buffer.from(input, 'utf8')\n const b = new JuceBigInteger()\n for (let i = u.length - 1; i >= 0; i--) {\n b.value = (b.value << 8n) | BigInt(u[i])\n }\n return b\n }\n\n isZero(): boolean {\n return this.value === 0n\n }\n\n divideBy(divisor: JuceBigInteger, remainder: JuceBigInteger): void {\n // Ports juce::BigInteger::divideBy()\n if (divisor.isZero()) {\n this.value = 0n\n return\n }\n const b = this.toJSBN()\n const d = divisor.toJSBN()\n const [q, r] = b.divideAndRemainder(d)\n this.value = JuceBigInteger.fromJSBN(q).value\n remainder.value = JuceBigInteger.fromJSBN(r).value\n }\n\n exponentModulo(exponent: JuceBigInteger, modulus: JuceBigInteger): void {\n // Ports juce::BigInteger::exponentModulo()\n const b = this.toJSBN()\n const e = exponent.toJSBN()\n const m = modulus.toJSBN()\n const em = b.modPow(e, m)\n this.value = JuceBigInteger.fromJSBN(em).value\n }\n}\n","import { JuceBigInteger } from './JuceBigInteger'\n\nexport class JuceRSAKey {\n protected part1: JuceBigInteger\n protected part2: JuceBigInteger\n constructor(public s: string) {\n // Ports juce::RSAKey::RSAKey()\n if (s.includes(',')) {\n const [p1, p2] = s.split(',').map(p => JuceBigInteger.fromHex(p))\n this.part1 = p1\n this.part2 = p2\n } else {\n this.part1 = new JuceBigInteger()\n this.part2 = new JuceBigInteger()\n }\n }\n applyToValue(val: JuceBigInteger): void {\n // Ports juce::RSAKey::applyToValue()\n if (this.part1.isZero() || this.part2.isZero() || val.value <= 0n) {\n return\n }\n\n const result = new JuceBigInteger()\n\n while (!val.isZero()) {\n result.value *= this.part2.value\n\n const remainder = new JuceBigInteger()\n val.divideBy(this.part2, remainder)\n\n remainder.exponentModulo(this.part1, this.part2)\n\n result.value += remainder.value\n }\n\n val.value = result.value\n }\n}\n","import { GenerateExpiringKeyFileParams, GenerateKeyFileParams } from 'src/types'\n\nimport { JuceDateString } from './JuceDateString'\nimport { JuceKeyFileUtils } from './JuceKeyFileUtils'\nimport { JuceRSAKey } from './JuceRSAKey'\n\nexport class JuceKeyGeneration {\n static generateKeyFile(\n params: GenerateKeyFileParams,\n date: Date = new Date()\n ) {\n const xml = JuceKeyFileUtils.createKeyFileContentLine(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers,\n machineNumbersAttributeName: 'mach'\n },\n JuceDateString.inHexMs(date)\n )\n const comment = JuceKeyFileUtils.createKeyFileComment(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers\n },\n JuceDateString.inFormattedComment(date)\n )\n return JuceKeyFileUtils.createKeyFile(\n comment,\n xml,\n new JuceRSAKey(params.privateKey)\n )\n }\n\n static generateExpiringKeyFile(\n params: GenerateExpiringKeyFileParams,\n date: Date = new Date()\n ) {\n const xml = JuceKeyFileUtils.createKeyFileContentLine(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers,\n machineNumbersAttributeName: 'expiring_mach'\n },\n JuceDateString.inHexMs(date),\n JuceDateString.inHexMs(params.expiryTime)\n )\n const comment = JuceKeyFileUtils.createKeyFileComment(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers\n },\n JuceDateString.inFormattedComment(date),\n JuceDateString.inFormattedComment(params.expiryTime)\n )\n return JuceKeyFileUtils.createKeyFile(\n comment,\n xml,\n new JuceRSAKey(params.privateKey)\n )\n }\n}\n","import { z } from 'zod'\n\nimport { JuceBigInteger } from './juce/JuceBigInteger'\n\nexport const createKeyFileCommentParamsValidator = z.object({\n appName: z.string().min(1),\n userEmail: z.string().min(1).email(),\n userName: z.string().min(1),\n machineNumbers: z.string().min(1)\n})\nexport type CreateKeyFileCommentParams = z.infer<\n typeof createKeyFileCommentParamsValidator\n>\n\nexport const machineNumbersAttributeNameValidator = z.enum([\n 'mach',\n 'expiring_mach'\n])\nexport type MachineNumbersAttributeName = z.infer<\n typeof machineNumbersAttributeNameValidator\n>\n\nexport const createKeyFileContentLineParamsValidator =\n createKeyFileCommentParamsValidator.extend({\n machineNumbersAttributeName: machineNumbersAttributeNameValidator\n })\nexport type CreateKeyFileContentLineParams = z.infer<\n typeof createKeyFileContentLineParamsValidator\n>\n\nexport const rsaKeyComponentsValidator = z.string().refine(\n // Ports juce::RSAKey::RSAKey() and juce::RSAKey::applyToValue()\n x =>\n x.includes(',') &&\n x.split(',').every(p => !JuceBigInteger.fromHex(p).isZero())\n)\nexport type RSAKeyComponents = z.infer<typeof rsaKeyComponentsValidator>\n\nexport const generateKeyFileParamsValidator =\n createKeyFileCommentParamsValidator.extend({\n privateKey: rsaKeyComponentsValidator\n })\nexport type GenerateKeyFileParams = z.infer<\n typeof generateKeyFileParamsValidator\n>\n\nexport const generateExpiringKeyFileParamsValidator =\n generateKeyFileParamsValidator.extend({\n expiryTime: z.date()\n })\nexport type GenerateExpiringKeyFileParams = z.infer<\n typeof generateExpiringKeyFileParamsValidator\n>\n","import { JuceKeyGeneration } from './juce/JuceKeyGeneration'\nimport { GenerateKeyFileParams, generateKeyFileParamsValidator } from './types'\n\nexport const generateKeyFile = (\n params: GenerateKeyFileParams,\n date: Date = new Date()\n) => {\n const paramsParse = generateKeyFileParamsValidator.parse(params)\n return JuceKeyGeneration.generateKeyFile(paramsParse, date)\n}\n","import { JuceKeyGeneration } from './juce/JuceKeyGeneration'\nimport {\n GenerateExpiringKeyFileParams,\n generateExpiringKeyFileParamsValidator\n} from './types'\n\nexport const generateExpiringKeyFile = (\n params: GenerateExpiringKeyFileParams,\n date: Date = new Date()\n) => {\n const paramsParse = generateExpiringKeyFileParamsValidator.parse(params)\n return JuceKeyGeneration.generateExpiringKeyFile(paramsParse, date)\n}\n"],"mappings":"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","names":["JSBN"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/juce/JuceKeyFileUtils.ts","../src/juce/JuceBigInteger.ts","../src/juce/JuceRSAKey.ts","../src/juce/JuceKeyGeneration.ts","../src/types.ts","../src/generateKeyFile.ts","../src/generateExpiringKeyFile.ts"],"sourcesContent":["export {\n type GenerateKeyFileParams,\n type GenerateExpiringKeyFileParams\n} from './types'\n\nexport { generateKeyFile } from './generateKeyFile'\nexport { generateExpiringKeyFile } from './generateExpiringKeyFile'\n","import { XMLBuilder } from 'fast-xml-parser'\nimport {\n CreateKeyFileCommentParams,\n CreateKeyFileContentLineParams\n} from 'src/types'\n\nimport { JuceBigInteger } from './JuceBigInteger'\nimport { JuceRSAKey } from './JuceRSAKey'\n\nconst XML_DECLARATION = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\n\nconst legalXmlCharRegex =\n // Ports juce::XmlOutputFunctions::LegalCharLookupTable\n /^[a-zA-Z0-9 .,;:\\-()_+=?!$#@[\\]/|*%~{}'\\\\]$/\n\nconst xmlAttributeCharProcessor = (char: string): string =>\n // Ports juce::XmlOutputFunctions::escapeIllegalXMLChars()\n char.length !== 1\n ? ''\n : legalXmlCharRegex.test(char)\n ? char\n : char === '&'\n ? '&amp;'\n : char === '\"'\n ? '&quot;'\n : char === '>'\n ? '&gt;'\n : char === '<'\n ? '&lt;'\n : `&#${char.charCodeAt(0)};`\n\nconst xmlAttributeValueProcessor = (value: unknown): string =>\n // Ports juce::XmlOutputFunctions::escapeIllegalXMLChars()\n typeof value !== 'string'\n ? ''\n : value.split('').map(xmlAttributeCharProcessor).join('')\n\nconst xmlBuilder = new XMLBuilder({\n ignoreAttributes: false,\n suppressEmptyNode: true,\n // processEntities is disabled since it doesn't port to juce as is\n processEntities: false,\n attributeValueProcessor: (_, value) => xmlAttributeValueProcessor(value)\n})\n\nexport class JuceKeyFileUtils {\n static toString(date: Date): string {\n // Ports juce::Time::getCurrentTime().toString (true, true)\n // prettier-ignore\n const months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', \n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]\n const day = date.getDate().toString()\n const month = months[date.getMonth()]\n const year = date.getFullYear()\n let hours = date.getHours()\n const minutes = date.getMinutes().toString().padStart(2, '0')\n const seconds = date.getSeconds().toString().padStart(2, '0')\n const ampm = hours >= 12 ? 'pm' : 'am'\n hours = hours % 12\n hours = hours ? hours : 12\n return `${day} ${month} ${year} ${hours}:${minutes}:${seconds}${ampm}`\n }\n\n static toHexStringMilliseconds(date: Date): string {\n // Ports juce::String::toHexString (juce::Time::getCurrentTime().toMilliseconds())\n return date.getTime().toString(16)\n }\n\n static createKeyFileContentLine(\n {\n appName,\n userEmail,\n userName,\n machineNumbers,\n machineNumbersAttributeName\n }: CreateKeyFileContentLineParams,\n date: string,\n expiryTime?: string\n ): string {\n // Ports juce::KeyFileUtils::createKeyFileContent\n // and juce::KeyFileUtils::encryptXML\n const xml = {\n key: {\n '@_user': userName,\n '@_email': userEmail,\n [`@_${machineNumbersAttributeName}`]: machineNumbers,\n '@_app': appName,\n '@_date': date,\n ...(expiryTime ? { '@_expiryTime': expiryTime } : {})\n }\n }\n return [XML_DECLARATION, xmlBuilder.build(xml).trim()].join(' ')\n }\n\n static createKeyFileComment(\n {\n appName,\n userEmail,\n userName,\n machineNumbers\n }: CreateKeyFileCommentParams,\n created: string,\n expiryTime?: string\n ): string {\n // Ports juce::KeyFileUtils::createKeyFileComment\n return (\n `Keyfile for ${appName}\\r\\n` +\n `${userName ? `User: ${userName}\\r\\n` : ''}` +\n `Email: ${userEmail}\\r\\n` +\n `Machine numbers: ${machineNumbers}\\r\\n` +\n `Created: ${created}` +\n (expiryTime ? `\\r\\nExpires: ${expiryTime}` : '')\n )\n }\n\n static encryptXMLLine(xmlLine: string, privateKey: JuceRSAKey): string {\n // Ports juce::KeyFileUtils::encryptXML\n const val = JuceBigInteger.fromUTF8MemoryBlock(xmlLine)\n privateKey.applyToValue(val)\n return val.toHex()\n }\n\n static createKeyFile(\n comment: string,\n xmlLine: string,\n rsaPrivateKey: JuceRSAKey\n ): string {\n // Ports juce::KeyFileUtils::createKeyFile\n let asHex = '#' + this.encryptXMLLine(xmlLine, rsaPrivateKey)\n\n const lines: string[] = []\n lines.push(comment)\n lines.push('')\n\n const charsPerLine = 70\n while (asHex.length > 0) {\n lines.push(asHex.substring(0, charsPerLine))\n asHex = asHex.substring(charsPerLine)\n }\n\n lines.push('')\n\n return lines.join('\\r\\n')\n }\n}\n","import { BigInteger as JSBN } from 'jsbn'\n\nexport class JuceBigInteger {\n constructor(public value: bigint = 0n) {}\n\n static fromJSBN(b: JSBN): JuceBigInteger {\n return JuceBigInteger.fromHex(b.toString(16))\n }\n\n toJSBN(): JSBN {\n return new JSBN(this.toHex(), 16)\n }\n\n static fromHex(hex: string): JuceBigInteger {\n const h = hex.trim()\n return new JuceBigInteger(h ? BigInt(`0x${h}`) : 0n)\n }\n\n toHex(): string {\n return this.value.toString(16)\n }\n\n static fromUTF8MemoryBlock(input: string): JuceBigInteger {\n // Ports juce::BigInteger::loadFromMemoryBlock()\n const u = Buffer.from(input, 'utf8')\n const b = new JuceBigInteger()\n for (let i = u.length - 1; i >= 0; i--) {\n b.value = (b.value << 8n) | BigInt(u[i])\n }\n return b\n }\n\n isZero(): boolean {\n return this.value === 0n\n }\n\n divideBy(divisor: JuceBigInteger, remainder: JuceBigInteger): void {\n // Ports juce::BigInteger::divideBy()\n if (divisor.isZero()) {\n this.value = 0n\n return\n }\n const b = this.toJSBN()\n const d = divisor.toJSBN()\n const [q, r] = b.divideAndRemainder(d)\n this.value = JuceBigInteger.fromJSBN(q).value\n remainder.value = JuceBigInteger.fromJSBN(r).value\n }\n\n exponentModulo(exponent: JuceBigInteger, modulus: JuceBigInteger): void {\n // Ports juce::BigInteger::exponentModulo()\n const b = this.toJSBN()\n const e = exponent.toJSBN()\n const m = modulus.toJSBN()\n const em = b.modPow(e, m)\n this.value = JuceBigInteger.fromJSBN(em).value\n }\n}\n","import { JuceBigInteger } from './JuceBigInteger'\n\nexport class JuceRSAKey {\n protected part1: JuceBigInteger\n protected part2: JuceBigInteger\n constructor(public s: string) {\n // Ports juce::RSAKey::RSAKey()\n if (s.includes(',')) {\n const [p1, p2] = s.split(',').map(p => JuceBigInteger.fromHex(p))\n this.part1 = p1\n this.part2 = p2\n } else {\n this.part1 = new JuceBigInteger()\n this.part2 = new JuceBigInteger()\n }\n }\n applyToValue(val: JuceBigInteger): void {\n // Ports juce::RSAKey::applyToValue()\n if (this.part1.isZero() || this.part2.isZero() || val.value <= 0n) {\n return\n }\n\n const result = new JuceBigInteger()\n\n while (!val.isZero()) {\n result.value *= this.part2.value\n\n const remainder = new JuceBigInteger()\n val.divideBy(this.part2, remainder)\n\n remainder.exponentModulo(this.part1, this.part2)\n\n result.value += remainder.value\n }\n\n val.value = result.value\n }\n}\n","import { GenerateExpiringKeyFileParams, GenerateKeyFileParams } from 'src/types'\n\nimport { JuceKeyFileUtils } from './JuceKeyFileUtils'\nimport { JuceRSAKey } from './JuceRSAKey'\n\nexport class JuceKeyGeneration {\n static generateKeyFile(\n params: GenerateKeyFileParams,\n date: Date = new Date()\n ) {\n const xml = JuceKeyFileUtils.createKeyFileContentLine(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers,\n machineNumbersAttributeName: 'mach'\n },\n JuceKeyFileUtils.toHexStringMilliseconds(date)\n )\n const comment = JuceKeyFileUtils.createKeyFileComment(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers\n },\n JuceKeyFileUtils.toString(date)\n )\n return JuceKeyFileUtils.createKeyFile(\n comment,\n xml,\n new JuceRSAKey(params.privateKey)\n )\n }\n\n static generateExpiringKeyFile(\n params: GenerateExpiringKeyFileParams,\n date: Date = new Date()\n ) {\n const xml = JuceKeyFileUtils.createKeyFileContentLine(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers,\n machineNumbersAttributeName: 'expiring_mach'\n },\n JuceKeyFileUtils.toHexStringMilliseconds(date),\n JuceKeyFileUtils.toHexStringMilliseconds(params.expiryTime)\n )\n const comment = JuceKeyFileUtils.createKeyFileComment(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers\n },\n JuceKeyFileUtils.toString(date),\n JuceKeyFileUtils.toString(params.expiryTime)\n )\n return JuceKeyFileUtils.createKeyFile(\n comment,\n xml,\n new JuceRSAKey(params.privateKey)\n )\n }\n}\n","import { z } from 'zod'\n\nimport { JuceBigInteger } from './juce/JuceBigInteger'\n\nexport const createKeyFileCommentParamsValidator = z.object({\n appName: z.string().min(1),\n userEmail: z.string().min(1).email(),\n userName: z.string().min(1),\n machineNumbers: z.string().min(1)\n})\nexport type CreateKeyFileCommentParams = z.infer<\n typeof createKeyFileCommentParamsValidator\n>\n\nexport const machineNumbersAttributeNameValidator = z.enum([\n 'mach',\n 'expiring_mach'\n])\nexport type MachineNumbersAttributeName = z.infer<\n typeof machineNumbersAttributeNameValidator\n>\n\nexport const createKeyFileContentLineParamsValidator =\n createKeyFileCommentParamsValidator.extend({\n machineNumbersAttributeName: machineNumbersAttributeNameValidator\n })\nexport type CreateKeyFileContentLineParams = z.infer<\n typeof createKeyFileContentLineParamsValidator\n>\n\nexport const rsaKeyComponentsValidator = z.string().refine(\n // Ports juce::RSAKey::RSAKey() and juce::RSAKey::applyToValue()\n x =>\n x.includes(',') &&\n x.split(',').every(p => !JuceBigInteger.fromHex(p).isZero())\n)\nexport type RSAKeyComponents = z.infer<typeof rsaKeyComponentsValidator>\n\nexport const generateKeyFileParamsValidator =\n createKeyFileCommentParamsValidator.extend({\n privateKey: rsaKeyComponentsValidator\n })\nexport type GenerateKeyFileParams = z.infer<\n typeof generateKeyFileParamsValidator\n>\n\nexport const generateExpiringKeyFileParamsValidator =\n generateKeyFileParamsValidator.extend({\n expiryTime: z.date().min(new Date('1970-01-01T00:00:00.001Z'), {\n message: 'Expiry time must be after 1970-01-01T00:00:00.000Z'\n })\n })\nexport type GenerateExpiringKeyFileParams = z.infer<\n typeof generateExpiringKeyFileParamsValidator\n>\n","import { JuceKeyGeneration } from './juce/JuceKeyGeneration'\nimport { GenerateKeyFileParams, generateKeyFileParamsValidator } from './types'\n\nexport const generateKeyFile = (\n params: GenerateKeyFileParams,\n date: Date = new Date()\n) => {\n const paramsParse = generateKeyFileParamsValidator.parse(params)\n return JuceKeyGeneration.generateKeyFile(paramsParse, date)\n}\n","import { JuceKeyGeneration } from './juce/JuceKeyGeneration'\nimport {\n GenerateExpiringKeyFileParams,\n generateExpiringKeyFileParamsValidator\n} from './types'\n\nexport const generateExpiringKeyFile = (\n params: GenerateExpiringKeyFileParams,\n date: Date = new Date()\n) => {\n const paramsParse = generateExpiringKeyFileParamsValidator.parse(params)\n return JuceKeyGeneration.generateExpiringKeyFile(paramsParse, date)\n}\n"],"mappings":"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","names":["JSBN"]}
package/dist/index.js CHANGED
@@ -1,36 +1,3 @@
1
- // src/juce/JuceDateString.ts
2
- var JuceDateString = class {
3
- static inHexMs(date) {
4
- return date.getTime().toString(16);
5
- }
6
- static inFormattedComment(date) {
7
- const months = [
8
- "Jan",
9
- "Feb",
10
- "Mar",
11
- "Apr",
12
- "May",
13
- "Jun",
14
- "Jul",
15
- "Aug",
16
- "Sep",
17
- "Oct",
18
- "Nov",
19
- "Dec"
20
- ];
21
- const day = date.getDate().toString();
22
- const month = months[date.getMonth()];
23
- const year = date.getFullYear();
24
- let hours = date.getHours();
25
- const minutes = date.getMinutes().toString().padStart(2, "0");
26
- const seconds = date.getSeconds().toString().padStart(2, "0");
27
- const ampm = hours >= 12 ? "pm" : "am";
28
- hours = hours % 12;
29
- hours = hours ? hours : 12;
30
- return `${day} ${month} ${year} ${hours}:${minutes}:${seconds}${ampm}`;
31
- }
32
- };
33
-
34
1
  // src/juce/JuceKeyFileUtils.ts
35
2
  import { XMLBuilder } from "fast-xml-parser";
36
3
 
@@ -106,6 +73,35 @@ var xmlBuilder = new XMLBuilder({
106
73
  attributeValueProcessor: (_, value) => xmlAttributeValueProcessor(value)
107
74
  });
108
75
  var JuceKeyFileUtils = class {
76
+ static toString(date) {
77
+ const months = [
78
+ "Jan",
79
+ "Feb",
80
+ "Mar",
81
+ "Apr",
82
+ "May",
83
+ "Jun",
84
+ "Jul",
85
+ "Aug",
86
+ "Sep",
87
+ "Oct",
88
+ "Nov",
89
+ "Dec"
90
+ ];
91
+ const day = date.getDate().toString();
92
+ const month = months[date.getMonth()];
93
+ const year = date.getFullYear();
94
+ let hours = date.getHours();
95
+ const minutes = date.getMinutes().toString().padStart(2, "0");
96
+ const seconds = date.getSeconds().toString().padStart(2, "0");
97
+ const ampm = hours >= 12 ? "pm" : "am";
98
+ hours = hours % 12;
99
+ hours = hours ? hours : 12;
100
+ return `${day} ${month} ${year} ${hours}:${minutes}:${seconds}${ampm}`;
101
+ }
102
+ static toHexStringMilliseconds(date) {
103
+ return date.getTime().toString(16);
104
+ }
109
105
  static createKeyFileContentLine({
110
106
  appName,
111
107
  userEmail,
@@ -198,7 +194,7 @@ var JuceKeyGeneration = class {
198
194
  machineNumbers: params.machineNumbers,
199
195
  machineNumbersAttributeName: "mach"
200
196
  },
201
- JuceDateString.inHexMs(date)
197
+ JuceKeyFileUtils.toHexStringMilliseconds(date)
202
198
  );
203
199
  const comment = JuceKeyFileUtils.createKeyFileComment(
204
200
  {
@@ -207,7 +203,7 @@ var JuceKeyGeneration = class {
207
203
  userName: params.userName,
208
204
  machineNumbers: params.machineNumbers
209
205
  },
210
- JuceDateString.inFormattedComment(date)
206
+ JuceKeyFileUtils.toString(date)
211
207
  );
212
208
  return JuceKeyFileUtils.createKeyFile(
213
209
  comment,
@@ -224,8 +220,8 @@ var JuceKeyGeneration = class {
224
220
  machineNumbers: params.machineNumbers,
225
221
  machineNumbersAttributeName: "expiring_mach"
226
222
  },
227
- JuceDateString.inHexMs(date),
228
- JuceDateString.inHexMs(params.expiryTime)
223
+ JuceKeyFileUtils.toHexStringMilliseconds(date),
224
+ JuceKeyFileUtils.toHexStringMilliseconds(params.expiryTime)
229
225
  );
230
226
  const comment = JuceKeyFileUtils.createKeyFileComment(
231
227
  {
@@ -234,8 +230,8 @@ var JuceKeyGeneration = class {
234
230
  userName: params.userName,
235
231
  machineNumbers: params.machineNumbers
236
232
  },
237
- JuceDateString.inFormattedComment(date),
238
- JuceDateString.inFormattedComment(params.expiryTime)
233
+ JuceKeyFileUtils.toString(date),
234
+ JuceKeyFileUtils.toString(params.expiryTime)
239
235
  );
240
236
  return JuceKeyFileUtils.createKeyFile(
241
237
  comment,
@@ -268,7 +264,9 @@ var generateKeyFileParamsValidator = createKeyFileCommentParamsValidator.extend(
268
264
  privateKey: rsaKeyComponentsValidator
269
265
  });
270
266
  var generateExpiringKeyFileParamsValidator = generateKeyFileParamsValidator.extend({
271
- expiryTime: z.date()
267
+ expiryTime: z.date().min(/* @__PURE__ */ new Date("1970-01-01T00:00:00.001Z"), {
268
+ message: "Expiry time must be after 1970-01-01T00:00:00.000Z"
269
+ })
272
270
  });
273
271
 
274
272
  // src/generateKeyFile.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/juce/JuceDateString.ts","../src/juce/JuceKeyFileUtils.ts","../src/juce/JuceBigInteger.ts","../src/juce/JuceRSAKey.ts","../src/juce/JuceKeyGeneration.ts","../src/types.ts","../src/generateKeyFile.ts","../src/generateExpiringKeyFile.ts"],"sourcesContent":["export class JuceDateString {\n static inHexMs(date: Date): string {\n // Ports juce::String::toHexString (juce::Time::getCurrentTime().toMilliseconds())\n return date.getTime().toString(16)\n }\n\n static inFormattedComment(date: Date): string {\n // Ports juce::Time::getCurrentTime().toString (true, true)\n // prettier-ignore\n const months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', \n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]\n const day = date.getDate().toString()\n const month = months[date.getMonth()]\n const year = date.getFullYear()\n let hours = date.getHours()\n const minutes = date.getMinutes().toString().padStart(2, '0')\n const seconds = date.getSeconds().toString().padStart(2, '0')\n const ampm = hours >= 12 ? 'pm' : 'am'\n hours = hours % 12\n hours = hours ? hours : 12\n return `${day} ${month} ${year} ${hours}:${minutes}:${seconds}${ampm}`\n }\n}\n","import { XMLBuilder } from 'fast-xml-parser'\nimport {\n CreateKeyFileCommentParams,\n CreateKeyFileContentLineParams\n} from 'src/types'\n\nimport { JuceBigInteger } from './JuceBigInteger'\nimport { JuceRSAKey } from './JuceRSAKey'\n\nconst XML_DECLARATION = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\n\nconst legalXmlCharRegex =\n // Ports juce::XmlOutputFunctions::LegalCharLookupTable\n /^[a-zA-Z0-9 .,;:\\-()_+=?!$#@[\\]/|*%~{}'\\\\]$/\n\nconst xmlAttributeCharProcessor = (char: string): string =>\n // Ports juce::XmlOutputFunctions::escapeIllegalXMLChars()\n char.length !== 1\n ? ''\n : legalXmlCharRegex.test(char)\n ? char\n : char === '&'\n ? '&amp;'\n : char === '\"'\n ? '&quot;'\n : char === '>'\n ? '&gt;'\n : char === '<'\n ? '&lt;'\n : `&#${char.charCodeAt(0)};`\n\nconst xmlAttributeValueProcessor = (value: unknown): string =>\n // Ports juce::XmlOutputFunctions::escapeIllegalXMLChars()\n typeof value !== 'string'\n ? ''\n : value.split('').map(xmlAttributeCharProcessor).join('')\n\nconst xmlBuilder = new XMLBuilder({\n ignoreAttributes: false,\n suppressEmptyNode: true,\n // processEntities is disabled since it doesn't port to juce as is\n processEntities: false,\n attributeValueProcessor: (_, value) => xmlAttributeValueProcessor(value)\n})\n\nexport class JuceKeyFileUtils {\n static createKeyFileContentLine(\n {\n appName,\n userEmail,\n userName,\n machineNumbers,\n machineNumbersAttributeName\n }: CreateKeyFileContentLineParams,\n date: string,\n expiryTime?: string\n ): string {\n // Ports juce::KeyFileUtils::createKeyFileContent\n // and juce::KeyFileUtils::encryptXML\n const xml = {\n key: {\n '@_user': userName,\n '@_email': userEmail,\n [`@_${machineNumbersAttributeName}`]: machineNumbers,\n '@_app': appName,\n '@_date': date,\n ...(expiryTime ? { '@_expiryTime': expiryTime } : {})\n }\n }\n return [XML_DECLARATION, xmlBuilder.build(xml).trim()].join(' ')\n }\n\n static createKeyFileComment(\n {\n appName,\n userEmail,\n userName,\n machineNumbers\n }: CreateKeyFileCommentParams,\n created: string,\n expiryTime?: string\n ): string {\n // Ports juce::KeyFileUtils::createKeyFileComment\n return (\n `Keyfile for ${appName}\\r\\n` +\n `${userName ? `User: ${userName}\\r\\n` : ''}` +\n `Email: ${userEmail}\\r\\n` +\n `Machine numbers: ${machineNumbers}\\r\\n` +\n `Created: ${created}` +\n (expiryTime ? `\\r\\nExpires: ${expiryTime}` : '')\n )\n }\n\n static encryptXMLLine(xmlLine: string, privateKey: JuceRSAKey): string {\n // Ports juce::KeyFileUtils::encryptXML\n const val = JuceBigInteger.fromUTF8MemoryBlock(xmlLine)\n privateKey.applyToValue(val)\n return val.toHex()\n }\n\n static createKeyFile(\n comment: string,\n xmlLine: string,\n rsaPrivateKey: JuceRSAKey\n ): string {\n // Ports juce::KeyFileUtils::createKeyFile\n let asHex = '#' + this.encryptXMLLine(xmlLine, rsaPrivateKey)\n\n const lines: string[] = []\n lines.push(comment)\n lines.push('')\n\n const charsPerLine = 70\n while (asHex.length > 0) {\n lines.push(asHex.substring(0, charsPerLine))\n asHex = asHex.substring(charsPerLine)\n }\n\n lines.push('')\n\n return lines.join('\\r\\n')\n }\n}\n","import { BigInteger as JSBN } from 'jsbn'\n\nexport class JuceBigInteger {\n constructor(public value: bigint = 0n) {}\n\n static fromJSBN(b: JSBN): JuceBigInteger {\n return JuceBigInteger.fromHex(b.toString(16))\n }\n\n toJSBN(): JSBN {\n return new JSBN(this.toHex(), 16)\n }\n\n static fromHex(hex: string): JuceBigInteger {\n const h = hex.trim()\n return new JuceBigInteger(h ? BigInt(`0x${h}`) : 0n)\n }\n\n toHex(): string {\n return this.value.toString(16)\n }\n\n static fromUTF8MemoryBlock(input: string): JuceBigInteger {\n // Ports juce::BigInteger::loadFromMemoryBlock()\n const u = Buffer.from(input, 'utf8')\n const b = new JuceBigInteger()\n for (let i = u.length - 1; i >= 0; i--) {\n b.value = (b.value << 8n) | BigInt(u[i])\n }\n return b\n }\n\n isZero(): boolean {\n return this.value === 0n\n }\n\n divideBy(divisor: JuceBigInteger, remainder: JuceBigInteger): void {\n // Ports juce::BigInteger::divideBy()\n if (divisor.isZero()) {\n this.value = 0n\n return\n }\n const b = this.toJSBN()\n const d = divisor.toJSBN()\n const [q, r] = b.divideAndRemainder(d)\n this.value = JuceBigInteger.fromJSBN(q).value\n remainder.value = JuceBigInteger.fromJSBN(r).value\n }\n\n exponentModulo(exponent: JuceBigInteger, modulus: JuceBigInteger): void {\n // Ports juce::BigInteger::exponentModulo()\n const b = this.toJSBN()\n const e = exponent.toJSBN()\n const m = modulus.toJSBN()\n const em = b.modPow(e, m)\n this.value = JuceBigInteger.fromJSBN(em).value\n }\n}\n","import { JuceBigInteger } from './JuceBigInteger'\n\nexport class JuceRSAKey {\n protected part1: JuceBigInteger\n protected part2: JuceBigInteger\n constructor(public s: string) {\n // Ports juce::RSAKey::RSAKey()\n if (s.includes(',')) {\n const [p1, p2] = s.split(',').map(p => JuceBigInteger.fromHex(p))\n this.part1 = p1\n this.part2 = p2\n } else {\n this.part1 = new JuceBigInteger()\n this.part2 = new JuceBigInteger()\n }\n }\n applyToValue(val: JuceBigInteger): void {\n // Ports juce::RSAKey::applyToValue()\n if (this.part1.isZero() || this.part2.isZero() || val.value <= 0n) {\n return\n }\n\n const result = new JuceBigInteger()\n\n while (!val.isZero()) {\n result.value *= this.part2.value\n\n const remainder = new JuceBigInteger()\n val.divideBy(this.part2, remainder)\n\n remainder.exponentModulo(this.part1, this.part2)\n\n result.value += remainder.value\n }\n\n val.value = result.value\n }\n}\n","import { GenerateExpiringKeyFileParams, GenerateKeyFileParams } from 'src/types'\n\nimport { JuceDateString } from './JuceDateString'\nimport { JuceKeyFileUtils } from './JuceKeyFileUtils'\nimport { JuceRSAKey } from './JuceRSAKey'\n\nexport class JuceKeyGeneration {\n static generateKeyFile(\n params: GenerateKeyFileParams,\n date: Date = new Date()\n ) {\n const xml = JuceKeyFileUtils.createKeyFileContentLine(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers,\n machineNumbersAttributeName: 'mach'\n },\n JuceDateString.inHexMs(date)\n )\n const comment = JuceKeyFileUtils.createKeyFileComment(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers\n },\n JuceDateString.inFormattedComment(date)\n )\n return JuceKeyFileUtils.createKeyFile(\n comment,\n xml,\n new JuceRSAKey(params.privateKey)\n )\n }\n\n static generateExpiringKeyFile(\n params: GenerateExpiringKeyFileParams,\n date: Date = new Date()\n ) {\n const xml = JuceKeyFileUtils.createKeyFileContentLine(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers,\n machineNumbersAttributeName: 'expiring_mach'\n },\n JuceDateString.inHexMs(date),\n JuceDateString.inHexMs(params.expiryTime)\n )\n const comment = JuceKeyFileUtils.createKeyFileComment(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers\n },\n JuceDateString.inFormattedComment(date),\n JuceDateString.inFormattedComment(params.expiryTime)\n )\n return JuceKeyFileUtils.createKeyFile(\n comment,\n xml,\n new JuceRSAKey(params.privateKey)\n )\n }\n}\n","import { z } from 'zod'\n\nimport { JuceBigInteger } from './juce/JuceBigInteger'\n\nexport const createKeyFileCommentParamsValidator = z.object({\n appName: z.string().min(1),\n userEmail: z.string().min(1).email(),\n userName: z.string().min(1),\n machineNumbers: z.string().min(1)\n})\nexport type CreateKeyFileCommentParams = z.infer<\n typeof createKeyFileCommentParamsValidator\n>\n\nexport const machineNumbersAttributeNameValidator = z.enum([\n 'mach',\n 'expiring_mach'\n])\nexport type MachineNumbersAttributeName = z.infer<\n typeof machineNumbersAttributeNameValidator\n>\n\nexport const createKeyFileContentLineParamsValidator =\n createKeyFileCommentParamsValidator.extend({\n machineNumbersAttributeName: machineNumbersAttributeNameValidator\n })\nexport type CreateKeyFileContentLineParams = z.infer<\n typeof createKeyFileContentLineParamsValidator\n>\n\nexport const rsaKeyComponentsValidator = z.string().refine(\n // Ports juce::RSAKey::RSAKey() and juce::RSAKey::applyToValue()\n x =>\n x.includes(',') &&\n x.split(',').every(p => !JuceBigInteger.fromHex(p).isZero())\n)\nexport type RSAKeyComponents = z.infer<typeof rsaKeyComponentsValidator>\n\nexport const generateKeyFileParamsValidator =\n createKeyFileCommentParamsValidator.extend({\n privateKey: rsaKeyComponentsValidator\n })\nexport type GenerateKeyFileParams = z.infer<\n typeof generateKeyFileParamsValidator\n>\n\nexport const generateExpiringKeyFileParamsValidator =\n generateKeyFileParamsValidator.extend({\n expiryTime: z.date()\n })\nexport type GenerateExpiringKeyFileParams = z.infer<\n typeof generateExpiringKeyFileParamsValidator\n>\n","import { JuceKeyGeneration } from './juce/JuceKeyGeneration'\nimport { GenerateKeyFileParams, generateKeyFileParamsValidator } from './types'\n\nexport const generateKeyFile = (\n params: GenerateKeyFileParams,\n date: Date = new Date()\n) => {\n const paramsParse = generateKeyFileParamsValidator.parse(params)\n return JuceKeyGeneration.generateKeyFile(paramsParse, date)\n}\n","import { JuceKeyGeneration } from './juce/JuceKeyGeneration'\nimport {\n GenerateExpiringKeyFileParams,\n generateExpiringKeyFileParamsValidator\n} from './types'\n\nexport const generateExpiringKeyFile = (\n params: GenerateExpiringKeyFileParams,\n date: Date = new Date()\n) => {\n const paramsParse = generateExpiringKeyFileParamsValidator.parse(params)\n return JuceKeyGeneration.generateExpiringKeyFile(paramsParse, date)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/juce/JuceKeyFileUtils.ts","../src/juce/JuceBigInteger.ts","../src/juce/JuceRSAKey.ts","../src/juce/JuceKeyGeneration.ts","../src/types.ts","../src/generateKeyFile.ts","../src/generateExpiringKeyFile.ts"],"sourcesContent":["import { XMLBuilder } from 'fast-xml-parser'\nimport {\n CreateKeyFileCommentParams,\n CreateKeyFileContentLineParams\n} from 'src/types'\n\nimport { JuceBigInteger } from './JuceBigInteger'\nimport { JuceRSAKey } from './JuceRSAKey'\n\nconst XML_DECLARATION = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\n\nconst legalXmlCharRegex =\n // Ports juce::XmlOutputFunctions::LegalCharLookupTable\n /^[a-zA-Z0-9 .,;:\\-()_+=?!$#@[\\]/|*%~{}'\\\\]$/\n\nconst xmlAttributeCharProcessor = (char: string): string =>\n // Ports juce::XmlOutputFunctions::escapeIllegalXMLChars()\n char.length !== 1\n ? ''\n : legalXmlCharRegex.test(char)\n ? char\n : char === '&'\n ? '&amp;'\n : char === '\"'\n ? '&quot;'\n : char === '>'\n ? '&gt;'\n : char === '<'\n ? '&lt;'\n : `&#${char.charCodeAt(0)};`\n\nconst xmlAttributeValueProcessor = (value: unknown): string =>\n // Ports juce::XmlOutputFunctions::escapeIllegalXMLChars()\n typeof value !== 'string'\n ? ''\n : value.split('').map(xmlAttributeCharProcessor).join('')\n\nconst xmlBuilder = new XMLBuilder({\n ignoreAttributes: false,\n suppressEmptyNode: true,\n // processEntities is disabled since it doesn't port to juce as is\n processEntities: false,\n attributeValueProcessor: (_, value) => xmlAttributeValueProcessor(value)\n})\n\nexport class JuceKeyFileUtils {\n static toString(date: Date): string {\n // Ports juce::Time::getCurrentTime().toString (true, true)\n // prettier-ignore\n const months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', \n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]\n const day = date.getDate().toString()\n const month = months[date.getMonth()]\n const year = date.getFullYear()\n let hours = date.getHours()\n const minutes = date.getMinutes().toString().padStart(2, '0')\n const seconds = date.getSeconds().toString().padStart(2, '0')\n const ampm = hours >= 12 ? 'pm' : 'am'\n hours = hours % 12\n hours = hours ? hours : 12\n return `${day} ${month} ${year} ${hours}:${minutes}:${seconds}${ampm}`\n }\n\n static toHexStringMilliseconds(date: Date): string {\n // Ports juce::String::toHexString (juce::Time::getCurrentTime().toMilliseconds())\n return date.getTime().toString(16)\n }\n\n static createKeyFileContentLine(\n {\n appName,\n userEmail,\n userName,\n machineNumbers,\n machineNumbersAttributeName\n }: CreateKeyFileContentLineParams,\n date: string,\n expiryTime?: string\n ): string {\n // Ports juce::KeyFileUtils::createKeyFileContent\n // and juce::KeyFileUtils::encryptXML\n const xml = {\n key: {\n '@_user': userName,\n '@_email': userEmail,\n [`@_${machineNumbersAttributeName}`]: machineNumbers,\n '@_app': appName,\n '@_date': date,\n ...(expiryTime ? { '@_expiryTime': expiryTime } : {})\n }\n }\n return [XML_DECLARATION, xmlBuilder.build(xml).trim()].join(' ')\n }\n\n static createKeyFileComment(\n {\n appName,\n userEmail,\n userName,\n machineNumbers\n }: CreateKeyFileCommentParams,\n created: string,\n expiryTime?: string\n ): string {\n // Ports juce::KeyFileUtils::createKeyFileComment\n return (\n `Keyfile for ${appName}\\r\\n` +\n `${userName ? `User: ${userName}\\r\\n` : ''}` +\n `Email: ${userEmail}\\r\\n` +\n `Machine numbers: ${machineNumbers}\\r\\n` +\n `Created: ${created}` +\n (expiryTime ? `\\r\\nExpires: ${expiryTime}` : '')\n )\n }\n\n static encryptXMLLine(xmlLine: string, privateKey: JuceRSAKey): string {\n // Ports juce::KeyFileUtils::encryptXML\n const val = JuceBigInteger.fromUTF8MemoryBlock(xmlLine)\n privateKey.applyToValue(val)\n return val.toHex()\n }\n\n static createKeyFile(\n comment: string,\n xmlLine: string,\n rsaPrivateKey: JuceRSAKey\n ): string {\n // Ports juce::KeyFileUtils::createKeyFile\n let asHex = '#' + this.encryptXMLLine(xmlLine, rsaPrivateKey)\n\n const lines: string[] = []\n lines.push(comment)\n lines.push('')\n\n const charsPerLine = 70\n while (asHex.length > 0) {\n lines.push(asHex.substring(0, charsPerLine))\n asHex = asHex.substring(charsPerLine)\n }\n\n lines.push('')\n\n return lines.join('\\r\\n')\n }\n}\n","import { BigInteger as JSBN } from 'jsbn'\n\nexport class JuceBigInteger {\n constructor(public value: bigint = 0n) {}\n\n static fromJSBN(b: JSBN): JuceBigInteger {\n return JuceBigInteger.fromHex(b.toString(16))\n }\n\n toJSBN(): JSBN {\n return new JSBN(this.toHex(), 16)\n }\n\n static fromHex(hex: string): JuceBigInteger {\n const h = hex.trim()\n return new JuceBigInteger(h ? BigInt(`0x${h}`) : 0n)\n }\n\n toHex(): string {\n return this.value.toString(16)\n }\n\n static fromUTF8MemoryBlock(input: string): JuceBigInteger {\n // Ports juce::BigInteger::loadFromMemoryBlock()\n const u = Buffer.from(input, 'utf8')\n const b = new JuceBigInteger()\n for (let i = u.length - 1; i >= 0; i--) {\n b.value = (b.value << 8n) | BigInt(u[i])\n }\n return b\n }\n\n isZero(): boolean {\n return this.value === 0n\n }\n\n divideBy(divisor: JuceBigInteger, remainder: JuceBigInteger): void {\n // Ports juce::BigInteger::divideBy()\n if (divisor.isZero()) {\n this.value = 0n\n return\n }\n const b = this.toJSBN()\n const d = divisor.toJSBN()\n const [q, r] = b.divideAndRemainder(d)\n this.value = JuceBigInteger.fromJSBN(q).value\n remainder.value = JuceBigInteger.fromJSBN(r).value\n }\n\n exponentModulo(exponent: JuceBigInteger, modulus: JuceBigInteger): void {\n // Ports juce::BigInteger::exponentModulo()\n const b = this.toJSBN()\n const e = exponent.toJSBN()\n const m = modulus.toJSBN()\n const em = b.modPow(e, m)\n this.value = JuceBigInteger.fromJSBN(em).value\n }\n}\n","import { JuceBigInteger } from './JuceBigInteger'\n\nexport class JuceRSAKey {\n protected part1: JuceBigInteger\n protected part2: JuceBigInteger\n constructor(public s: string) {\n // Ports juce::RSAKey::RSAKey()\n if (s.includes(',')) {\n const [p1, p2] = s.split(',').map(p => JuceBigInteger.fromHex(p))\n this.part1 = p1\n this.part2 = p2\n } else {\n this.part1 = new JuceBigInteger()\n this.part2 = new JuceBigInteger()\n }\n }\n applyToValue(val: JuceBigInteger): void {\n // Ports juce::RSAKey::applyToValue()\n if (this.part1.isZero() || this.part2.isZero() || val.value <= 0n) {\n return\n }\n\n const result = new JuceBigInteger()\n\n while (!val.isZero()) {\n result.value *= this.part2.value\n\n const remainder = new JuceBigInteger()\n val.divideBy(this.part2, remainder)\n\n remainder.exponentModulo(this.part1, this.part2)\n\n result.value += remainder.value\n }\n\n val.value = result.value\n }\n}\n","import { GenerateExpiringKeyFileParams, GenerateKeyFileParams } from 'src/types'\n\nimport { JuceKeyFileUtils } from './JuceKeyFileUtils'\nimport { JuceRSAKey } from './JuceRSAKey'\n\nexport class JuceKeyGeneration {\n static generateKeyFile(\n params: GenerateKeyFileParams,\n date: Date = new Date()\n ) {\n const xml = JuceKeyFileUtils.createKeyFileContentLine(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers,\n machineNumbersAttributeName: 'mach'\n },\n JuceKeyFileUtils.toHexStringMilliseconds(date)\n )\n const comment = JuceKeyFileUtils.createKeyFileComment(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers\n },\n JuceKeyFileUtils.toString(date)\n )\n return JuceKeyFileUtils.createKeyFile(\n comment,\n xml,\n new JuceRSAKey(params.privateKey)\n )\n }\n\n static generateExpiringKeyFile(\n params: GenerateExpiringKeyFileParams,\n date: Date = new Date()\n ) {\n const xml = JuceKeyFileUtils.createKeyFileContentLine(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers,\n machineNumbersAttributeName: 'expiring_mach'\n },\n JuceKeyFileUtils.toHexStringMilliseconds(date),\n JuceKeyFileUtils.toHexStringMilliseconds(params.expiryTime)\n )\n const comment = JuceKeyFileUtils.createKeyFileComment(\n {\n appName: params.appName,\n userEmail: params.userEmail,\n userName: params.userName,\n machineNumbers: params.machineNumbers\n },\n JuceKeyFileUtils.toString(date),\n JuceKeyFileUtils.toString(params.expiryTime)\n )\n return JuceKeyFileUtils.createKeyFile(\n comment,\n xml,\n new JuceRSAKey(params.privateKey)\n )\n }\n}\n","import { z } from 'zod'\n\nimport { JuceBigInteger } from './juce/JuceBigInteger'\n\nexport const createKeyFileCommentParamsValidator = z.object({\n appName: z.string().min(1),\n userEmail: z.string().min(1).email(),\n userName: z.string().min(1),\n machineNumbers: z.string().min(1)\n})\nexport type CreateKeyFileCommentParams = z.infer<\n typeof createKeyFileCommentParamsValidator\n>\n\nexport const machineNumbersAttributeNameValidator = z.enum([\n 'mach',\n 'expiring_mach'\n])\nexport type MachineNumbersAttributeName = z.infer<\n typeof machineNumbersAttributeNameValidator\n>\n\nexport const createKeyFileContentLineParamsValidator =\n createKeyFileCommentParamsValidator.extend({\n machineNumbersAttributeName: machineNumbersAttributeNameValidator\n })\nexport type CreateKeyFileContentLineParams = z.infer<\n typeof createKeyFileContentLineParamsValidator\n>\n\nexport const rsaKeyComponentsValidator = z.string().refine(\n // Ports juce::RSAKey::RSAKey() and juce::RSAKey::applyToValue()\n x =>\n x.includes(',') &&\n x.split(',').every(p => !JuceBigInteger.fromHex(p).isZero())\n)\nexport type RSAKeyComponents = z.infer<typeof rsaKeyComponentsValidator>\n\nexport const generateKeyFileParamsValidator =\n createKeyFileCommentParamsValidator.extend({\n privateKey: rsaKeyComponentsValidator\n })\nexport type GenerateKeyFileParams = z.infer<\n typeof generateKeyFileParamsValidator\n>\n\nexport const generateExpiringKeyFileParamsValidator =\n generateKeyFileParamsValidator.extend({\n expiryTime: z.date().min(new Date('1970-01-01T00:00:00.001Z'), {\n message: 'Expiry time must be after 1970-01-01T00:00:00.000Z'\n })\n })\nexport type GenerateExpiringKeyFileParams = z.infer<\n typeof generateExpiringKeyFileParamsValidator\n>\n","import { JuceKeyGeneration } from './juce/JuceKeyGeneration'\nimport { GenerateKeyFileParams, generateKeyFileParamsValidator } from './types'\n\nexport const generateKeyFile = (\n params: GenerateKeyFileParams,\n date: Date = new Date()\n) => {\n const paramsParse = generateKeyFileParamsValidator.parse(params)\n return JuceKeyGeneration.generateKeyFile(paramsParse, date)\n}\n","import { JuceKeyGeneration } from './juce/JuceKeyGeneration'\nimport {\n GenerateExpiringKeyFileParams,\n generateExpiringKeyFileParamsValidator\n} from './types'\n\nexport const generateExpiringKeyFile = (\n params: GenerateExpiringKeyFileParams,\n date: Date = new Date()\n) => {\n const paramsParse = generateExpiringKeyFileParamsValidator.parse(params)\n return JuceKeyGeneration.generateExpiringKeyFile(paramsParse, date)\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ianacaburian/generate-key-file",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Ports juce_KeyGeneration::generateKeyFile() to node.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -10,12 +10,12 @@
10
10
  "dist"
11
11
  ],
12
12
  "scripts": {
13
- "clean": "rm -rf dist && npm run clean:test",
13
+ "clean": "rm -rf dist && npm run cm:clean",
14
14
  "lint": "eslint src",
15
- "clean:test": "rm -rf test/bin/* && cd test/console && ./script/clean-build.sh",
16
- "open:test/console": "cd test/console && ./script/open-xcode-macos-dev.sh",
17
- "install:test/console": "cmake -S test/console -B test/console/build && cmake --build test/console/build && cmake --install test/console/build --prefix test",
18
- "build": "npm run lint && npm run install:test/console && tsup",
15
+ "cm:clean": "rm -rf test/bin/* && cd test/console && ./cmake/clean-build.sh",
16
+ "cm:open": "cd test/console && ./cmake/open-xcode-macos-dev.sh",
17
+ "cm:install": "cmake -S test/console -B test/console/build && cmake --build test/console/build && cmake --install test/console/build --prefix test",
18
+ "build": "npm run lint && npm run cm:install && tsup",
19
19
  "test": "vitest"
20
20
  },
21
21
  "repository": {