vantuz 3.2.2 → 3.2.4
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/core/license-manager.js +7 -1
- package/onboard.js +2 -2
- package/package.json +1 -1
- package/plugins/vantuz/services/license.js +73 -32
package/core/license-manager.js
CHANGED
|
@@ -4,7 +4,13 @@ const path = require('path');
|
|
|
4
4
|
|
|
5
5
|
// Müşteriye Gidecek Olan PUBLIC KEY (Sadece doğrulama yapar)
|
|
6
6
|
const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
|
|
7
|
-
|
|
7
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAphjtxJVk8qG3HpXTVKoG
|
|
8
|
+
QKvvUdPeO4dohFFc2S2SP31mapevTgXDklO6fDapEAzRAaySZDYMQhyeK5lZXlXZ
|
|
9
|
+
fSf8OhzM2vyQ/oBp0VuLOv0fcx9oDYsPOoDY6F4X04cfPHlrIXdzeSpk9G+Dv8HL
|
|
10
|
+
/P2uVlLn249Olwhj0bKioFqUggm+m+WIhsHeHtSngzbrqi0A1O8FG8Srj1Zb5O/9
|
|
11
|
+
99c1JjzDa36XwuIEMYHFgewvNuVS8GqB+Tr3EYdA0dbzI27Y273N3Ay9l3LhzfmR
|
|
12
|
+
6faAgQcegPVdrbhqyCQmuDDUBbt4vE+sGGwitl5UyT6Edyaf/GRciXp/KHytvUCe
|
|
13
|
+
vQIDAQAB
|
|
8
14
|
-----END PUBLIC KEY-----`;
|
|
9
15
|
|
|
10
16
|
// NOT: Bu dosya artık lisans ÜRETEMEZ. Sadece doğrular.
|
package/onboard.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* VANTUZ - Profesyonel Kurulum Sihirbazı
|
|
@@ -97,7 +97,7 @@ class OnboardingWizard {
|
|
|
97
97
|
this.printHeader('LİSANS AKTİVASYONU');
|
|
98
98
|
|
|
99
99
|
console.log('Vantuz AI kullanımı için geçerli bir lisans anahtarı gereklidir.');
|
|
100
|
-
console.log(c('dim', 'Format: VNTUZ-
|
|
100
|
+
console.log(c('dim', 'Format: VNTUZ-Payload.Signature (RSA İmzalı)\n'));
|
|
101
101
|
|
|
102
102
|
while (true) {
|
|
103
103
|
const key = await this.prompt('Lisans Anahtarı: '); // Changed from promptSecret to avoid issues
|
package/package.json
CHANGED
|
@@ -48,19 +48,15 @@ export class LicenseManager {
|
|
|
48
48
|
* Lisans formatını doğrula (offline)
|
|
49
49
|
*/
|
|
50
50
|
validateFormat(key) {
|
|
51
|
-
|
|
52
|
-
if (!
|
|
53
|
-
return { valid: false, error: 'Geçersiz lisans formatı' };
|
|
51
|
+
// Yeni Format: VNTUZ-PAYLOAD.SIGNATURE (RSA İmzalı)
|
|
52
|
+
if (!key || !key.startsWith('VNTUZ-')) {
|
|
53
|
+
return { valid: false, error: 'Geçersiz lisans formatı (VNTUZ- prefix eksik)' };
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
//
|
|
57
|
-
const parts = key.split('
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const expectedChecksum = crypto.createHash('md5').update(keyWithoutChecksum).digest('hex').slice(0, 4).toUpperCase();
|
|
61
|
-
|
|
62
|
-
if (checksum !== expectedChecksum) {
|
|
63
|
-
return { valid: false, error: 'Lisans doğrulama başarısız' };
|
|
56
|
+
// İmza ve payload ayrımı kontrolü
|
|
57
|
+
const parts = key.slice(6).split('.');
|
|
58
|
+
if (parts.length !== 2) {
|
|
59
|
+
return { valid: false, error: 'Lisans yapısal olarak bozuk (Payload.Signature bekleniyor)' };
|
|
64
60
|
}
|
|
65
61
|
|
|
66
62
|
return { valid: true };
|
|
@@ -107,12 +103,23 @@ export class LicenseManager {
|
|
|
107
103
|
return { success: true, offline: true, data: cached };
|
|
108
104
|
}
|
|
109
105
|
|
|
110
|
-
// Format doğruysa
|
|
106
|
+
// Format doğruysa offline geçerli say
|
|
107
|
+
if (formatCheck.valid) {
|
|
108
|
+
return {
|
|
109
|
+
success: true,
|
|
110
|
+
offline: true,
|
|
111
|
+
warning: 'Sunucuya ulaşılamadı, offline doğrulama yapıldı',
|
|
112
|
+
data: {
|
|
113
|
+
status: 'active',
|
|
114
|
+
features: ['offline_valid']
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
111
119
|
return {
|
|
112
120
|
success: false,
|
|
113
|
-
error: 'Lisans sunucusuna ulaşılamadı',
|
|
114
|
-
demo: true
|
|
115
|
-
offlineValid: formatCheck.valid
|
|
121
|
+
error: 'Lisans sunucusuna ulaşılamadı ve format geçersiz',
|
|
122
|
+
demo: true
|
|
116
123
|
};
|
|
117
124
|
}
|
|
118
125
|
}
|
|
@@ -121,25 +128,59 @@ export class LicenseManager {
|
|
|
121
128
|
* Sunucu ile iletişim
|
|
122
129
|
*/
|
|
123
130
|
async _verifyWithServer(key) {
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
131
|
+
// RSA İmza Doğrulama (Offline & Secure)
|
|
132
|
+
try {
|
|
133
|
+
// Format: VNTUZ-PAYLOAD.SIGNATURE
|
|
134
|
+
if (!key.startsWith('VNTUZ-')) return { success: false, error: 'Geçersiz format' };
|
|
135
|
+
|
|
136
|
+
const parts = key.slice(6).split('.');
|
|
137
|
+
if (parts.length !== 2) return { success: false, error: 'Bozuk lisans anahtarı' };
|
|
138
|
+
|
|
139
|
+
const [payloadB64, signatureHex] = parts;
|
|
140
|
+
const payload = Buffer.from(payloadB64, 'base64');
|
|
141
|
+
const signature = Buffer.from(signatureHex, 'hex');
|
|
142
|
+
|
|
143
|
+
// Public Key (RSA-2048) - User Generated
|
|
144
|
+
const publicKey = `-----BEGIN PUBLIC KEY-----
|
|
145
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAphjtxJVk8qG3HpXTVKoG
|
|
146
|
+
QKvvUdPeO4dohFFc2S2SP31mapevTgXDklO6fDapEAzRAaySZDYMQhyeK5lZXlXZ
|
|
147
|
+
fSf8OhzM2vyQ/oBp0VuLOv0fcx9oDYsPOoDY6F4X04cfPHlrIXdzeSpk9G+Dv8HL
|
|
148
|
+
/P2uVlLn249Olwhj0bKioFqUggm+m+WIhsHeHtSngzbrqi0A1O8FG8Srj1Zb5O/9
|
|
149
|
+
99c1JjzDa36XwuIEMYHFgewvNuVS8GqB+Tr3EYdA0dbzI27Y273N3Ay9l3LhzfmR
|
|
150
|
+
6faAgQcegPVdrbhqyCQmuDDUBbt4vE+sGGwitl5UyT6Edyaf/GRciXp/KHytvUCe
|
|
151
|
+
vQIDAQAB
|
|
152
|
+
-----END PUBLIC KEY-----`;
|
|
153
|
+
|
|
154
|
+
const isVerified = crypto.verify(
|
|
155
|
+
"sha256",
|
|
156
|
+
payload,
|
|
157
|
+
publicKey,
|
|
158
|
+
signature
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
if (isVerified) {
|
|
162
|
+
const data = JSON.parse(payload.toString());
|
|
163
|
+
|
|
164
|
+
// Tarih kontrolü
|
|
165
|
+
if (new Date(data.expires) < new Date()) {
|
|
166
|
+
return { success: false, error: 'Lisans süresi dolmuş' };
|
|
138
167
|
}
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
168
|
|
|
142
|
-
|
|
169
|
+
return {
|
|
170
|
+
success: true,
|
|
171
|
+
offline: true,
|
|
172
|
+
data: {
|
|
173
|
+
status: 'active',
|
|
174
|
+
expiresAt: data.expires,
|
|
175
|
+
features: data.features
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
} else {
|
|
179
|
+
return { success: false, error: 'Lisans imzası geçersiz (Sahte Lisans)' };
|
|
180
|
+
}
|
|
181
|
+
} catch (e) {
|
|
182
|
+
return { success: false, error: 'Lisans okunamadı' };
|
|
183
|
+
}
|
|
143
184
|
}
|
|
144
185
|
|
|
145
186
|
/**
|