@smallwebco/tinypivot-core 1.0.36 → 1.0.47
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/license/index.d.ts +10 -2
- package/dist/license/index.d.ts.map +1 -1
- package/dist/license/index.js +121 -31
- package/dist/license/index.js.map +1 -1
- package/package.json +11 -1
package/dist/license/index.d.ts
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TinyPivot Core - License Management
|
|
3
3
|
* Framework-agnostic license validation logic
|
|
4
|
+
*
|
|
5
|
+
* Uses ECDSA P-256 asymmetric cryptography:
|
|
6
|
+
* - Licenses are SIGNED with a private key (kept secret)
|
|
7
|
+
* - Licenses are VERIFIED with a public key (embedded here)
|
|
4
8
|
*/
|
|
5
9
|
import type { LicenseInfo } from '../types';
|
|
6
10
|
/**
|
|
7
11
|
* Validate a license key and extract info
|
|
12
|
+
*
|
|
13
|
+
* Note: Licenses are PERPETUAL - the expiry date indicates update eligibility,
|
|
14
|
+
* not when features stop working. All Pro features remain active forever.
|
|
8
15
|
*/
|
|
9
16
|
export declare function validateLicenseKey(key: string): Promise<LicenseInfo>;
|
|
10
17
|
/**
|
|
11
|
-
*
|
|
18
|
+
* @deprecated No longer needed - license verification now uses asymmetric cryptography.
|
|
19
|
+
* Kept for backwards compatibility but does nothing.
|
|
12
20
|
*/
|
|
13
|
-
export declare function configureLicenseSecret(
|
|
21
|
+
export declare function configureLicenseSecret(_secret: string): void;
|
|
14
22
|
/**
|
|
15
23
|
* Validate demo secret and return demo license info if valid
|
|
16
24
|
* Returns null if secret is invalid
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,UAAU,CAAA;AAyKxD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiE1E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG5D;AAoBD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAWrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAEhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAE/E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKpD"}
|
package/dist/license/index.js
CHANGED
|
@@ -31,31 +31,104 @@ const DEMO_LICENSE = {
|
|
|
31
31
|
noWatermark: false, // Still show watermark in demo
|
|
32
32
|
},
|
|
33
33
|
};
|
|
34
|
+
// Public key for license verification (ECDSA P-256)
|
|
35
|
+
// This is safe to embed - it can only VERIFY signatures, not create them
|
|
36
|
+
const PUBLIC_KEY_PEM = `-----BEGIN PUBLIC KEY-----
|
|
37
|
+
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE436rfGofder4lfo4UHsRF2M88Gs0
|
|
38
|
+
zLsikg2H9GMkL8hLGuOtnGMpVfLRlc7cD8FdkPBBRgiQ8UFnG8hm+nMIug==
|
|
39
|
+
-----END PUBLIC KEY-----`;
|
|
34
40
|
/**
|
|
35
|
-
*
|
|
36
|
-
* Must match the server-side generation algorithm
|
|
41
|
+
* Convert base64 (or URL-safe base64) to Uint8Array
|
|
37
42
|
*/
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
if
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
function base64ToUint8Array(base64) {
|
|
44
|
+
// Convert URL-safe base64 to standard base64
|
|
45
|
+
let standardBase64 = base64.replace(/-/g, '+').replace(/_/g, '/');
|
|
46
|
+
// Add padding if needed
|
|
47
|
+
while (standardBase64.length % 4) {
|
|
48
|
+
standardBase64 += '=';
|
|
49
|
+
}
|
|
50
|
+
const binaryString = atob(standardBase64);
|
|
51
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
52
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
53
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
54
|
+
}
|
|
55
|
+
return bytes;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Convert DER-encoded ECDSA signature to raw format (r || s)
|
|
59
|
+
* Web Crypto API expects raw format, but Node.js produces DER format
|
|
60
|
+
*/
|
|
61
|
+
function derToRaw(der) {
|
|
62
|
+
// DER format: 0x30 [length] 0x02 [r-length] [r] 0x02 [s-length] [s]
|
|
63
|
+
if (der[0] !== 0x30) {
|
|
64
|
+
throw new Error('Invalid DER signature');
|
|
65
|
+
}
|
|
66
|
+
let offset = 2; // Skip 0x30 and length byte
|
|
67
|
+
// Read r
|
|
68
|
+
if (der[offset] !== 0x02)
|
|
69
|
+
throw new Error('Invalid DER signature');
|
|
70
|
+
offset++;
|
|
71
|
+
const rLen = der[offset];
|
|
72
|
+
offset++;
|
|
73
|
+
let r = der.slice(offset, offset + rLen);
|
|
74
|
+
offset += rLen;
|
|
75
|
+
// Read s
|
|
76
|
+
if (der[offset] !== 0x02)
|
|
77
|
+
throw new Error('Invalid DER signature');
|
|
78
|
+
offset++;
|
|
79
|
+
const sLen = der[offset];
|
|
80
|
+
offset++;
|
|
81
|
+
let s = der.slice(offset, offset + sLen);
|
|
82
|
+
// For P-256, r and s should each be 32 bytes
|
|
83
|
+
// Remove leading zero padding if present (used for positive sign in DER)
|
|
84
|
+
if (r.length === 33 && r[0] === 0)
|
|
85
|
+
r = r.slice(1);
|
|
86
|
+
if (s.length === 33 && s[0] === 0)
|
|
87
|
+
s = s.slice(1);
|
|
88
|
+
// Pad to 32 bytes if shorter
|
|
89
|
+
const padR = new Uint8Array(32);
|
|
90
|
+
const padS = new Uint8Array(32);
|
|
91
|
+
padR.set(r, 32 - r.length);
|
|
92
|
+
padS.set(s, 32 - s.length);
|
|
93
|
+
// Concatenate r || s
|
|
94
|
+
const raw = new Uint8Array(64);
|
|
95
|
+
raw.set(padR, 0);
|
|
96
|
+
raw.set(padS, 32);
|
|
97
|
+
return raw;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Import the public key for verification
|
|
101
|
+
*/
|
|
102
|
+
async function importPublicKey() {
|
|
103
|
+
try {
|
|
104
|
+
// Convert PEM to binary
|
|
105
|
+
const pemContents = PUBLIC_KEY_PEM
|
|
106
|
+
.replace('-----BEGIN PUBLIC KEY-----', '')
|
|
107
|
+
.replace('-----END PUBLIC KEY-----', '')
|
|
108
|
+
.replace(/\s/g, '');
|
|
109
|
+
const binaryKey = base64ToUint8Array(pemContents);
|
|
110
|
+
return await crypto.subtle.importKey('spki', new Uint8Array(binaryKey).buffer, { name: 'ECDSA', namedCurve: 'P-256' }, false, ['verify']);
|
|
44
111
|
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* ECDSA P-256 signature verification
|
|
118
|
+
* Verifies that the license was signed with our private key
|
|
119
|
+
*/
|
|
120
|
+
async function verifySignature(typeCode, signature, expiry) {
|
|
45
121
|
const payload = `TP-${typeCode}-${expiry}`;
|
|
46
122
|
try {
|
|
123
|
+
const publicKey = await importPublicKey();
|
|
124
|
+
if (!publicKey)
|
|
125
|
+
return false;
|
|
47
126
|
const encoder = new TextEncoder();
|
|
48
|
-
const keyData = encoder.encode(secret);
|
|
49
127
|
const msgData = encoder.encode(payload);
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
|
55
|
-
.join('')
|
|
56
|
-
.slice(0, 12)
|
|
57
|
-
.toUpperCase();
|
|
58
|
-
return signature === expectedSig;
|
|
128
|
+
// Convert DER-encoded signature to raw format for Web Crypto
|
|
129
|
+
const derSig = base64ToUint8Array(signature);
|
|
130
|
+
const rawSig = derToRaw(derSig);
|
|
131
|
+
return await crypto.subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, publicKey, new Uint8Array(rawSig).buffer, msgData);
|
|
59
132
|
}
|
|
60
133
|
catch {
|
|
61
134
|
// Fallback for environments without crypto.subtle (SSR, older browsers)
|
|
@@ -64,6 +137,9 @@ async function verifySignature(typeCode, signature, expiry) {
|
|
|
64
137
|
}
|
|
65
138
|
/**
|
|
66
139
|
* Validate a license key and extract info
|
|
140
|
+
*
|
|
141
|
+
* Note: Licenses are PERPETUAL - the expiry date indicates update eligibility,
|
|
142
|
+
* not when features stop working. All Pro features remain active forever.
|
|
67
143
|
*/
|
|
68
144
|
export async function validateLicenseKey(key) {
|
|
69
145
|
// Free tier - no key needed
|
|
@@ -71,27 +147,37 @@ export async function validateLicenseKey(key) {
|
|
|
71
147
|
return FREE_LICENSE;
|
|
72
148
|
}
|
|
73
149
|
// License key format: TP-{TYPE}-{SIGNATURE}-{EXPIRY}
|
|
74
|
-
// Example: TP-PRO1-
|
|
75
|
-
|
|
76
|
-
|
|
150
|
+
// Example: TP-PRO1-base64signature-20251231
|
|
151
|
+
// Note: signature uses URL-safe base64 which can contain dashes
|
|
152
|
+
// So we parse from known positions: prefix (TP), type (4 chars), expiry (8 chars at end)
|
|
153
|
+
if (!key.startsWith('TP-')) {
|
|
154
|
+
return INVALID_LICENSE;
|
|
155
|
+
}
|
|
156
|
+
// Extract expiry (last 8 characters after final dash)
|
|
157
|
+
const lastDashIdx = key.lastIndexOf('-');
|
|
158
|
+
if (lastDashIdx === -1 || key.length - lastDashIdx !== 9) {
|
|
77
159
|
return INVALID_LICENSE;
|
|
78
160
|
}
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
const
|
|
161
|
+
const expiryStr = key.slice(lastDashIdx + 1);
|
|
162
|
+
// Extract type code (between first and second dash)
|
|
163
|
+
const withoutPrefix = key.slice(3); // Remove "TP-"
|
|
164
|
+
const secondDashIdx = withoutPrefix.indexOf('-');
|
|
165
|
+
if (secondDashIdx === -1) {
|
|
166
|
+
return INVALID_LICENSE;
|
|
167
|
+
}
|
|
168
|
+
const typeCode = withoutPrefix.slice(0, secondDashIdx);
|
|
169
|
+
// Extract signature (everything between type and expiry)
|
|
170
|
+
const signature = withoutPrefix.slice(secondDashIdx + 1, withoutPrefix.lastIndexOf('-'));
|
|
82
171
|
// Verify cryptographic signature
|
|
83
172
|
const isValidSignature = await verifySignature(typeCode, signature, expiryStr);
|
|
84
173
|
if (!isValidSignature) {
|
|
85
174
|
return INVALID_LICENSE;
|
|
86
175
|
}
|
|
87
|
-
// Parse expiry date
|
|
176
|
+
// Parse expiry date (for update eligibility tracking, NOT feature expiration)
|
|
88
177
|
const year = Number.parseInt(expiryStr.slice(0, 4));
|
|
89
178
|
const month = Number.parseInt(expiryStr.slice(4, 6)) - 1;
|
|
90
179
|
const day = Number.parseInt(expiryStr.slice(6, 8));
|
|
91
180
|
const expiresAt = new Date(year, month, day);
|
|
92
|
-
if (expiresAt < new Date()) {
|
|
93
|
-
return { ...INVALID_LICENSE, expiresAt };
|
|
94
|
-
}
|
|
95
181
|
// Determine license type
|
|
96
182
|
let type = 'free';
|
|
97
183
|
if (typeCode === 'PRO1')
|
|
@@ -100,6 +186,8 @@ export async function validateLicenseKey(key) {
|
|
|
100
186
|
type = 'pro-unlimited';
|
|
101
187
|
else if (typeCode === 'PROT')
|
|
102
188
|
type = 'pro-team';
|
|
189
|
+
// PERPETUAL LICENSE: Features never expire, only update eligibility does
|
|
190
|
+
// The expiresAt date is retained for informational purposes only
|
|
103
191
|
return {
|
|
104
192
|
type,
|
|
105
193
|
isValid: true,
|
|
@@ -114,10 +202,12 @@ export async function validateLicenseKey(key) {
|
|
|
114
202
|
};
|
|
115
203
|
}
|
|
116
204
|
/**
|
|
117
|
-
*
|
|
205
|
+
* @deprecated No longer needed - license verification now uses asymmetric cryptography.
|
|
206
|
+
* Kept for backwards compatibility but does nothing.
|
|
118
207
|
*/
|
|
119
|
-
export function configureLicenseSecret(
|
|
120
|
-
|
|
208
|
+
export function configureLicenseSecret(_secret) {
|
|
209
|
+
// No-op: Asymmetric verification doesn't need a shared secret
|
|
210
|
+
console.warn('[TinyPivot] configureLicenseSecret() is deprecated and no longer needed.');
|
|
121
211
|
}
|
|
122
212
|
// Hardcoded SHA-256 hash of the demo secret
|
|
123
213
|
const DEMO_SECRET_HASH = 'A48AA0618518D3E62F31FCFCA2DD2B86E7FE0863E2F90756FB0A960AE7A51583';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smallwebco/tinypivot-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.47",
|
|
4
4
|
"description": "Core logic for TinyPivot - framework agnostic pivot table and data grid utilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,6 +29,16 @@
|
|
|
29
29
|
"data-table",
|
|
30
30
|
"csv-export"
|
|
31
31
|
],
|
|
32
|
+
"author": "Small Web, LLC",
|
|
33
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
34
|
+
"homepage": "https://github.com/Small-Web-Co/tinypivot",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/Small-Web-Co/tinypivot.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/Small-Web-Co/tinypivot/issues"
|
|
41
|
+
},
|
|
32
42
|
"scripts": {
|
|
33
43
|
"build": "tsc",
|
|
34
44
|
"dev": "tsc --watch"
|