vantuz 3.2.2 → 3.2.3

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/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.3",
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)
144
+ const publicKey = `-----BEGIN PUBLIC KEY-----
145
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5G37WfPSnR+XJhUpyz8A
146
+ O30kCNk7fvf5dKYGOppqjnD1MZSGTIZpbxk2VQedAnPLw0tfGREEmdaH9SQXq+o5
147
+ wwmXWorw3hyD+rc2PQDUnrpoRszfwF3qgyujHmKu/G0fzMB6hWD00WY7KmZZ0n3u
148
+ 8K5GSnF/lAb4Y8mgAkfovpBQRaWxIeMAh49+9tlE1v0yv7Asfvvo00joY/BzpaIA
149
+ eIJ6+evRqCEL2pf+OQEcwZ7e+KZZBw53IUSWO7NSqDzM5B48BZHMcs58ImWxotkJ
150
+ dxirQOnuw5UDkiiRajQcmgvFGR6MtrChZTbupOAcESAjaUCd0fHWPEEG6GKzdfAi
151
+ KQIDAQAB
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
  /**