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.
@@ -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
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy... (Buraya gerçek key gelecek)
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-XXXXX-XXXXX-XXXXX-XXXXX-XXXX\n'));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vantuz",
3
- "version": "3.2.2",
3
+ "version": "3.2.4",
4
4
  "description": "Yapay Zeka Destekli E-Ticaret Yönetim Platformu - 7 Pazaryeri + WhatsApp/Telegram",
5
5
  "type": "module",
6
6
  "main": "cli.js",
@@ -48,19 +48,15 @@ export class LicenseManager {
48
48
  * Lisans formatını doğrula (offline)
49
49
  */
50
50
  validateFormat(key) {
51
- const pattern = /^VNTUZ-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{4}$/;
52
- if (!pattern.test(key)) {
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
- // Checksum doğrula
57
- const parts = key.split('-');
58
- const checksum = parts.pop();
59
- const keyWithoutChecksum = parts.join('-');
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 demo modda çalışsın
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
- // Gerçek sunucu olmadan offline doğrulama
125
- // Gerçek implementasyonda fetch kullanılır
126
-
127
- // Şimdilik format doğruysa geçerli say (sunucu kurulunca değişir)
128
- const formatValid = this.validateFormat(key);
129
- if (formatValid.valid) {
130
- const now = new Date();
131
- return {
132
- success: true,
133
- data: {
134
- status: 'active',
135
- activatedAt: now.toISOString(),
136
- expiresAt: new Date(now.getTime() + LICENSE_DURATION_DAYS * 24 * 60 * 60 * 1000).toISOString(),
137
- features: ['repricer', 'vision', 'sentiment', 'crossborder', 'analytics']
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
- return { success: false, error: 'Geçersiz lisans' };
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
  /**