lljz66 commited on
Commit
8c58a56
·
verified ·
1 Parent(s): 226698f

Update server.js

Browse files
Files changed (1) hide show
  1. server.js +112 -141
server.js CHANGED
@@ -217,7 +217,6 @@ async function checkHiddenStorage(url) {
217
 
218
  async function performSecurityCheck(url) {
219
  try {
220
- // استخدام axios لجلب الشهادة بدلاً من tlsing (أكثر موثوقية)
221
  const https = await import('node:https');
222
  const { hostname } = new URL(url);
223
 
@@ -244,7 +243,7 @@ async function performSecurityCheck(url) {
244
  protocol: 'TLS',
245
  grade: valid ? (daysRemaining > 30 ? 'A' : 'B') : 'F'
246
  },
247
- headers: {} // يمكن إضافة فحص الهيدرات لاحقاً
248
  };
249
  } catch (e) {
250
  return { ssl: { valid: false, error: e.message } };
@@ -292,165 +291,137 @@ app.get('/api/scan', async (req, res) => {
292
  const url = normalizeUrl(req.query.url);
293
  if (!url) return res.status(400).json({ error: 'Invalid URL' });
294
 
295
- const format = req.query.format || 'sse';
 
296
 
297
- // وضع JSON المباشر
298
- if (format === 'json') {
299
  try {
300
  const startTime = Date.now();
301
- const [screenshot, blacklight, tosdr, security, hiddenStorage] = await Promise.allSettled([
302
- takeScreenshot(url),
303
- performBlacklightScan(url),
304
- getTosdrGrade(url),
305
- performSecurityCheck(url),
306
- checkHiddenStorage(url)
307
- ]);
308
 
309
- const screenshotData = screenshot.status === 'fulfilled' ? screenshot.value : null;
310
- const blacklightData = blacklight.status === 'fulfilled' ? blacklight.value : { error: blacklight.reason?.message };
311
- const tosdrData = tosdr.status === 'fulfilled' ? tosdr.value : null;
312
- const securityData = security.status === 'fulfilled' ? security.value : { ssl: { valid: false } };
313
- const hiddenData = hiddenStorage.status === 'fulfilled' ? hiddenStorage.value : null;
314
 
315
- const thirdPartyDomains = [
316
- ...(blacklightData.hosts?.thirdParty || []),
317
- ...(blacklightData.hosts?.requests?.third_party || [])
318
- ];
319
- const uniqueDomains = [...new Set(thirdPartyDomains)];
320
-
321
- const enrichedTrackers = [];
322
- for (const domain of uniqueDomains) {
323
- const ddgInfo = getDDGInfo(domain);
324
- const ghosteryInfo = await getGhosteryInfo(domain);
325
- enrichedTrackers.push({
326
- domain,
327
- owner: ghosteryInfo?.organization || ddgInfo?.owner || getBaseDomain(domain),
328
- category: ghosteryInfo?.category || ddgInfo?.category || 'unknown',
329
- prevalence: ddgInfo?.prevalence || 0
330
- });
331
  }
332
 
333
- const { score, grade } = calculatePrivacyScore(blacklightData, enrichedTrackers, tosdrData, securityData);
334
 
335
  const result = {
336
  success: true,
 
337
  url,
338
- final_url: blacklightData.uri_dest || url,
339
  scan_time_sec: (Date.now() - startTime) / 1000,
340
  privacy_score: { score, grade },
341
- trackers: { count: enrichedTrackers.length, list: enrichedTrackers.slice(0, 20) },
342
- cookies: {
343
- total: blacklightData.cookies?.length || 0,
344
- third_party: blacklightData.cookies?.filter(c => c.thirdParty)?.length || 0
345
- },
346
- fingerprinting: {
347
- canvas: !!(blacklightData.canvasFingerprinters?.length),
348
- fonts: !!(blacklightData.canvasFontFingerprinters?.length)
349
- },
350
- session_recording: !!(blacklightData.sessionRecorders?.length),
351
- key_logging: !!(blacklightData.keyLogging?.length),
352
- hidden_storage: hiddenData ? {
353
- localStorage: hiddenData.localStorage?.length || 0,
354
- sessionStorage: hiddenData.sessionStorage?.length || 0,
355
- indexedDB: hiddenData.indexedDB
356
- } : null,
357
- security: securityData,
358
- tosdr: tosdrData,
359
- screenshot: screenshotData,
360
- raw: blacklightData
361
  };
362
 
363
- res.json(result);
364
  } catch (e) {
365
- res.status(500).json({ error: e.message });
366
  }
367
- return;
368
  }
369
 
370
- // وضع SSEدريجي)
371
- res.writeHead(200, {
372
- 'Content-Type': 'text/event-stream',
373
- 'Cache-Control': 'no-cache',
374
- 'Connection': 'keep-alive'
375
- });
376
- const send = (event, data) => res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
377
-
378
- const startTime = Date.now();
379
- const tasks = {
380
- screenshot: { status: 'pending', result: null },
381
- blacklight: { status: 'pending', result: null },
382
- tosdr: { status: 'pending', result: null },
383
- security: { status: 'pending', result: null },
384
- hiddenStorage: { status: 'pending', result: null }
385
- };
386
-
387
- // إرسال الحالة الأولية
388
- send('start', { message: '🚀 Starting parallel deep scan...', tasks: Object.keys(tasks) });
389
-
390
- // تنفيذ المهام بالتوازي مع تحديث SSE
391
- const promises = [
392
- takeScreenshot(url).then(r => { tasks.screenshot = { status: 'done', result: r }; send('partial', { task: 'screenshot', status: 'done' }); return r; }).catch(e => { tasks.screenshot = { status: 'error', error: e.message }; send('partial', { task: 'screenshot', status: 'error' }); return null; }),
393
- performBlacklightScan(url).then(r => { tasks.blacklight = { status: 'done', result: r }; send('partial', { task: 'blacklight', status: 'done' }); return r; }).catch(e => { tasks.blacklight = { status: 'error', error: e.message }; send('partial', { task: 'blacklight', status: 'error' }); return { error: e.message }; }),
394
- getTosdrGrade(url).then(r => { tasks.tosdr = { status: 'done', result: r }; send('partial', { task: 'tosdr', status: 'done' }); return r; }).catch(e => { tasks.tosdr = { status: 'error', error: e.message }; send('partial', { task: 'tosdr', status: 'error' }); return null; }),
395
- performSecurityCheck(url).then(r => { tasks.security = { status: 'done', result: r }; send('partial', { task: 'security', status: 'done' }); return r; }).catch(e => { tasks.security = { status: 'error', error: e.message }; send('partial', { task: 'security', status: 'error' }); return { ssl: { valid: false } }; }),
396
- checkHiddenStorage(url).then(r => { tasks.hiddenStorage = { status: 'done', result: r }; send('partial', { task: 'hiddenStorage', status: 'done' }); return r; }).catch(e => { tasks.hiddenStorage = { status: 'error', error: e.message }; send('partial', { task: 'hiddenStorage', status: 'error' }); return null; })
397
- ];
398
-
399
- const [screenshot, blacklight, tosdr, security, hiddenStorage] = await Promise.all(promises);
400
-
401
- const blacklightData = blacklight;
402
- const tosdrData = tosdr;
403
- const securityData = security;
404
- const hiddenData = hiddenStorage;
405
-
406
- const thirdPartyDomains = [
407
- ...(blacklightData.hosts?.thirdParty || []),
408
- ...(blacklightData.hosts?.requests?.third_party || [])
409
- ];
410
- const uniqueDomains = [...new Set(thirdPartyDomains)];
411
-
412
- const enrichedTrackers = [];
413
- for (const domain of uniqueDomains) {
414
- const ddgInfo = getDDGInfo(domain);
415
- const ghosteryInfo = await getGhosteryInfo(domain);
416
- enrichedTrackers.push({
417
- domain,
418
- owner: ghosteryInfo?.organization || ddgInfo?.owner || getBaseDomain(domain),
419
- category: ghosteryInfo?.category || ddgInfo?.category || 'unknown',
420
- prevalence: ddgInfo?.prevalence || 0
421
- });
422
  }
423
 
424
- const { score, grade } = calculatePrivacyScore(blacklightData, enrichedTrackers, tosdrData, securityData);
425
-
426
- const summary = {
427
- url,
428
- final_url: blacklightData.uri_dest || url,
429
- scan_time_sec: (Date.now() - startTime) / 1000,
430
- privacy_score: { score, grade },
431
- trackers: { count: enrichedTrackers.length, list: enrichedTrackers.slice(0, 20) },
432
- cookies: {
433
- total: blacklightData.cookies?.length || 0,
434
- third_party: blacklightData.cookies?.filter(c => c.thirdParty)?.length || 0
435
- },
436
- fingerprinting: {
437
- canvas: !!(blacklightData.canvasFingerprinters?.length),
438
- fonts: !!(blacklightData.canvasFontFingerprinters?.length)
439
- },
440
- session_recording: !!(blacklightData.sessionRecorders?.length),
441
- key_logging: !!(blacklightData.keyLogging?.length),
442
- hidden_storage: hiddenData ? {
443
- localStorage: hiddenData.localStorage?.length || 0,
444
- sessionStorage: hiddenData.sessionStorage?.length || 0,
445
- indexedDB: hiddenData.indexedDB
446
- } : null,
447
- security: securityData,
448
- tosdr: tosdrData,
449
- screenshot: screenshot
450
- };
451
-
452
- send('result', { success: true, summary, raw: blacklightData });
453
- res.end();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
454
  });
455
 
456
  app.get('/health', (req, res) => res.json({ status: 'ok' }));
@@ -462,5 +433,5 @@ app.use(express.static('public'));
462
  if (Object.keys(ddgTrackerRadar.domains).length === 0) {
463
  await downloadDDGTrackerRadar();
464
  }
465
- app.listen(PORT, '0.0.0.0', () => console.log(`🚀 Private Eye V8.1 Deep-Only running on ${PORT}`));
466
  })();
 
217
 
218
  async function performSecurityCheck(url) {
219
  try {
 
220
  const https = await import('node:https');
221
  const { hostname } = new URL(url);
222
 
 
243
  protocol: 'TLS',
244
  grade: valid ? (daysRemaining > 30 ? 'A' : 'B') : 'F'
245
  },
246
+ headers: {}
247
  };
248
  } catch (e) {
249
  return { ssl: { valid: false, error: e.message } };
 
291
  const url = normalizeUrl(req.query.url);
292
  if (!url) return res.status(400).json({ error: 'Invalid URL' });
293
 
294
+ const format = req.query.format || 'json'; // افتراضيًا JSON
295
+ const mode = req.query.mode || 'deep';
296
 
297
+ // إذا كان الوضع سريع، نعود ببيانات محدودة
298
+ if (mode === 'fast') {
299
  try {
300
  const startTime = Date.now();
301
+ const security = await performSecurityCheck(url);
302
+ const tosdr = await getTosdrGrade(url);
 
 
 
 
 
303
 
304
+ const hostname = new URL(url).hostname;
305
+ const baseDomain = getBaseDomain(hostname);
306
+ const trackers = [];
 
 
307
 
308
+ for (const domain in ddgTrackerRadar.domains) {
309
+ if (domain.includes(baseDomain) || baseDomain.includes(domain)) {
310
+ const info = ddgTrackerRadar.domains[domain];
311
+ trackers.push({
312
+ domain,
313
+ owner: info.owner || domain,
314
+ category: info.category || 'unknown',
315
+ prevalence: info.prevalence || 0
316
+ });
317
+ }
 
 
 
 
 
 
318
  }
319
 
320
+ const { score, grade } = calculatePrivacyScore({}, trackers, tosdr, security);
321
 
322
  const result = {
323
  success: true,
324
+ mode: 'fast',
325
  url,
326
+ final_url: url,
327
  scan_time_sec: (Date.now() - startTime) / 1000,
328
  privacy_score: { score, grade },
329
+ trackers: { count: trackers.length, list: trackers.slice(0, 20) },
330
+ security,
331
+ tosdr,
332
+ screenshot: null
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
333
  };
334
 
335
+ return res.json(result);
336
  } catch (e) {
337
+ return res.status(500).json({ error: e.message });
338
  }
 
339
  }
340
 
341
+ // الوضع العميق (deep) - تنفيذ متوازي
342
+ if (format === 'sse') {
343
+ // ... (نفس كود SSE السابق)
344
+ return res.status(501).json({ error: 'SSE not implemented in this version' });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
345
  }
346
 
347
+ // تنسيق JSON (الافتراضي)
348
+ try {
349
+ const startTime = Date.now();
350
+
351
+ // تنفيذ جميع المهام بالتوازي
352
+ const [screenshot, blacklight, tosdr, security, hiddenStorage] = await Promise.allSettled([
353
+ takeScreenshot(url),
354
+ performBlacklightScan(url),
355
+ getTosdrGrade(url),
356
+ performSecurityCheck(url),
357
+ checkHiddenStorage(url)
358
+ ]);
359
+
360
+ const screenshotData = screenshot.status === 'fulfilled' ? screenshot.value : null;
361
+ const blacklightData = blacklight.status === 'fulfilled' ? blacklight.value : { error: blacklight.reason?.message };
362
+ const tosdrData = tosdr.status === 'fulfilled' ? tosdr.value : null;
363
+ const securityData = security.status === 'fulfilled' ? security.value : { ssl: { valid: false } };
364
+ const hiddenData = hiddenStorage.status === 'fulfilled' ? hiddenStorage.value : null;
365
+
366
+ // استخراج النطاقات الخارجية
367
+ const thirdPartyDomains = [
368
+ ...(blacklightData.hosts?.thirdParty || []),
369
+ ...(blacklightData.hosts?.requests?.third_party || [])
370
+ ];
371
+ const uniqueDomains = [...new Set(thirdPartyDomains)];
372
+
373
+ // إثراء بيانات المتتبعين
374
+ const enrichedTrackers = [];
375
+ for (const domain of uniqueDomains) {
376
+ const ddgInfo = getDDGInfo(domain);
377
+ const ghosteryInfo = await getGhosteryInfo(domain);
378
+ enrichedTrackers.push({
379
+ domain,
380
+ owner: ghosteryInfo?.organization || ddgInfo?.owner || getBaseDomain(domain),
381
+ category: ghosteryInfo?.category || ddgInfo?.category || 'unknown',
382
+ prevalence: ddgInfo?.prevalence || 0
383
+ });
384
+ }
385
+
386
+ const { score, grade } = calculatePrivacyScore(blacklightData, enrichedTrackers, tosdrData, securityData);
387
+
388
+ // بناء الملخص
389
+ const summary = {
390
+ success: true,
391
+ mode: 'deep',
392
+ url,
393
+ final_url: blacklightData.uri_dest || url,
394
+ scan_time_sec: (Date.now() - startTime) / 1000,
395
+ privacy_score: { score, grade },
396
+ trackers: { count: enrichedTrackers.length, list: enrichedTrackers.slice(0, 20) },
397
+ cookies: {
398
+ total: blacklightData.cookies?.length || 0,
399
+ third_party: blacklightData.cookies?.filter(c => c.thirdParty)?.length || 0
400
+ },
401
+ fingerprinting: {
402
+ canvas: !!(blacklightData.canvasFingerprinters?.length),
403
+ fonts: !!(blacklightData.canvasFontFingerprinters?.length)
404
+ },
405
+ session_recording: !!(blacklightData.sessionRecorders?.length),
406
+ key_logging: !!(blacklightData.keyLogging?.length),
407
+ hidden_storage: hiddenData ? {
408
+ localStorage: hiddenData.localStorage?.length || 0,
409
+ sessionStorage: hiddenData.sessionStorage?.length || 0,
410
+ indexedDB: hiddenData.indexedDB
411
+ } : null,
412
+ security: securityData,
413
+ tosdr: tosdrData,
414
+ screenshot: screenshotData,
415
+ // تضمين البيانات الخام للمطورين
416
+ raw: blacklightData
417
+ };
418
+
419
+ res.json(summary);
420
+
421
+ } catch (e) {
422
+ console.error('Scan error:', e);
423
+ res.status(500).json({ error: e.message });
424
+ }
425
  });
426
 
427
  app.get('/health', (req, res) => res.json({ status: 'ok' }));
 
433
  if (Object.keys(ddgTrackerRadar.domains).length === 0) {
434
  await downloadDDGTrackerRadar();
435
  }
436
+ app.listen(PORT, '0.0.0.0', () => console.log(`🚀 Private Eye V8.1 running on ${PORT}`));
437
  })();