koesan commited on
Commit
d96bba5
·
verified ·
1 Parent(s): 0b2bb7b

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +182 -182
templates/index.html CHANGED
@@ -1,5 +1,5 @@
1
  <!DOCTYPE html>
2
- <html lang="tr">
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -835,17 +835,17 @@
835
  <div class="col-md-8">
836
  <h2 class="section-title mb-0">
837
  <i class="bi bi-graph-up text-warning me-2"></i>
838
- Analiz Sonuçları: {{ query }}
839
  </h2>
840
  </div>
841
  <div class="col-md-4 text-end">
842
  {% if data.source_rir != 'Bilinmiyor' %}
843
  <span class="badge badge-success fs-6">
844
- <i class="bi bi-shield-check me-1"></i>Kaynak: {{ data.source_rir }}
845
  </span>
846
  {% endif %}
847
  <span class="badge badge-info fs-6 ms-2">
848
- <i class="bi bi-diagram-3 me-1"></i>IP Sınıfı: {{ data.summary.ip_class }}
849
  </span>
850
  </div>
851
  </div>
@@ -858,7 +858,7 @@
858
  <div class="card-header">
859
  <h5 class="mb-0">
860
  <i class="bi bi-diagram-3-fill me-2"></i>
861
- Gelişmiş ve Yönlendirme Bilgileri
862
  </h5>
863
  </div>
864
  <div class="card-body">
@@ -867,16 +867,16 @@
867
  {% if bgpview_prefix %}
868
  <div class="col-lg-6">
869
  <h6 class="text-primary fw-semibold border-bottom pb-2 mb-3">
870
- <i class="bi bi-signpost-split-fill me-2"></i> Prefix Bilgileri (BGPView)
871
  </h6>
872
  <dl class="row">
873
  <dt class="col-sm-4">Prefix</dt>
874
  <dd class="col-sm-8">{{ bgpview_prefix.prefix }}</dd>
875
 
876
- <dt class="col-sm-4">Prefix Adı</dt>
877
  <dd class="col-sm-8">{{ bgpview_prefix.name }}</dd>
878
 
879
- <dt class="col-sm-4">Açıklama</dt>
880
  <dd class="col-sm-8">{{ bgpview_prefix.description }}</dd>
881
  </dl>
882
  </div>
@@ -886,28 +886,28 @@
886
  {% if peeringdb_data %}
887
  <div class="col-lg-6">
888
  <h6 class="text-primary fw-semibold border-bottom pb-2 mb-3">
889
- <i class="bi bi-building-fill-gear me-2"></i> Servis Sağlayıcı Detayları (PeeringDB)
890
  </h6>
891
  <dl class="row">
892
- <dt class="col-sm-5">Kuruluş (ASN)</dt>
893
  <dd class="col-sm-7">{{ peeringdb_data.name }} (AS{{ origin_asn }})</dd>
894
 
895
- <dt class="col-sm-5">Web Sitesi</dt>
896
  <dd class="col-sm-7">
897
  {% if peeringdb_data.website %}
898
  <a href="{{ peeringdb_data.website }}" target="_blank">{{ peeringdb_data.website }}</a>
899
  {% else %}
900
- Bilinmiyor
901
  {% endif %}
902
  </dd>
903
 
904
- <dt class="col-sm-5">Trafik Türü</dt>
905
  <dd class="col-sm-7">{{ peeringdb_data.traffic_type }}</dd>
906
 
907
- <dt class="col-sm-5">Anons Edilen IPv4/v6</dt>
908
  <dd class="col-sm-7">{{ peeringdb_data.prefix_count_ipv4 }} / {{ peeringdb_data.prefix_count_ipv6 }}</dd>
909
 
910
- <dt class="col-sm-5">Peering Politikası</dt>
911
  <dd class="col-sm-7">{{ peeringdb_data.policy }}</dd>
912
  </dl>
913
  </div>
@@ -925,26 +925,26 @@
925
  <div class="card-header">
926
  <h5 class="mb-0">
927
  <i class="bi bi-info-circle-fill me-2"></i>
928
- Özeti (RDAP)
929
  </h5>
930
  </div>
931
  <div class="card-body">
932
  <div class="row">
933
  <div class="col-md-6">
934
  <dl>
935
- <dt class="text-primary fw-semibold"> Adı</dt>
936
  <dd class="mb-3">{{ data.summary.name }}</dd>
937
 
938
  <dt class="text-primary fw-semibold">Handle</dt>
939
  <dd class="mb-3">{{ data.summary.handle }}</dd>
940
 
941
  {% if data.summary.ip_range %}
942
- <dt class="text-primary fw-semibold">IP Aralığı</dt>
943
  <dd class="mb-3">{{ data.summary.ip_range }}</dd>
944
  {% endif %}
945
 
946
  {% if data.summary.asn_range %}
947
- <dt class="text-primary fw-semibold">ASN Aralığı</dt>
948
  <dd class="mb-3">{{ data.summary.asn_range }}</dd>
949
  {% endif %}
950
  </dl>
@@ -954,11 +954,11 @@
954
  <!-- YENİ: Kaydı yapan kuruluşu bulmak için mantık eklendi -->
955
  {% set org_contact = (data.contacts.registrant or data.contacts.administrative or data.contacts.technical)|first %}
956
  {% if org_contact and org_contact.org != 'Bilinmiyor' %}
957
- <dt class="text-primary fw-semibold">Kaydı Yapan Kuruluş</dt>
958
  <dd class="mb-3">{{ org_contact.org }}</dd>
959
  {% endif %}
960
 
961
- <dt class="text-primary fw-semibold">Ülke</dt>
962
  <dd class="mb-3">
963
  {{ data.summary.country }}
964
  {% if ipinfo_data and ipinfo_data.country_name %}
@@ -966,10 +966,10 @@
966
  {% endif %}
967
  </dd>
968
 
969
- <dt class="text-primary fw-semibold">Kayıt Tipi</dt>
970
  <dd class="mb-3">{{ data.summary.type }}</dd>
971
 
972
- <dt class="text-primary fw-semibold">IP Sınıfı</dt>
973
  <dd class="mb-3">
974
  <span class="badge badge-info">{{ data.summary.ip_class }}</span>
975
  <small class="text-muted">{{ data.summary.ip_class_desc }}</small>
@@ -981,7 +981,7 @@
981
  <!-- YENİ: Önemli Tarihler (Events) bölümü eklendi -->
982
  {% if data.details and data.details.events %}
983
  <hr>
984
- <h6 class="text-primary fw-semibold mb-2">Önemli Tarihler</h6>
985
  <div class="row small">
986
  {% for event in data.details.events %}
987
  <div class="col-md-6 mb-2">
@@ -996,7 +996,7 @@
996
  <!-- YENİ: Kayıt Notları (Remarks) bölümü eklendi -->
997
  {% if data.details and data.details.remarks %}
998
  <hr>
999
- <h6 class="text-primary fw-semibold mb-2">Kayıt Notları</h6>
1000
  {% for remark in data.details.remarks %}
1001
  <div class="alert alert-secondary p-2 small mt-2">
1002
  {% if remark.title %}<p class="fw-bold mb-1">{{ remark.title }}</p>{% endif %}
@@ -1019,7 +1019,7 @@
1019
  <div class="card-header">
1020
  <h5 class="mb-0">
1021
  <i class="bi bi-people-fill me-2"></i>
1022
- İletişim Bilgileri
1023
  </h5>
1024
  </div>
1025
  <div class="card-body" style="max-height: 400px; overflow-y: auto;">
@@ -1052,7 +1052,7 @@
1052
  {% endfor %}
1053
  {% endfor %}
1054
  {% if not has_contacts %}
1055
- <p class="text-muted text-center">Bu kayıt için rol bazlı kişi bilgisi bulunamadı.</p>
1056
  {% endif %}
1057
  </div>
1058
  </div>
@@ -1067,7 +1067,7 @@
1067
  <div class="card-header">
1068
  <h5 class="mb-0">
1069
  <i class="bi bi-speedometer2 me-2"></i>
1070
- Ping & Gecikme Analizi
1071
  </h5>
1072
  </div>
1073
  <div class="card-body">
@@ -1078,7 +1078,7 @@
1078
  {{ ping_data.error }}
1079
  </div>
1080
  {% else %}
1081
- <p class="text-muted mb-3">Hedefe gönderilen paketlerin gidiş-dönüş süreleri:</p>
1082
  <div class="ping-stats">
1083
  <div class="ping-stat">
1084
  <div class="ping-value">{{ ping_data.min }}</div>
@@ -1086,16 +1086,16 @@
1086
  </div>
1087
  <div class="ping-stat">
1088
  <div class="ping-value text-warning">{{ ping_data.avg }}</div>
1089
- <div class="ping-label">Ortalama</div>
1090
  </div>
1091
  <div class="ping-stat">
1092
  <div class="ping-value">{{ ping_data.max }}</div>
1093
- <div class="ping-label">Maksimum</div>
1094
  </div>
1095
  </div>
1096
  {% endif %}
1097
  {% else %}
1098
- <p class="text-muted text-center">Ping verisi alınamadı.</p>
1099
  {% endif %}
1100
  </div>
1101
  </div>
@@ -1107,7 +1107,7 @@
1107
  <div class="card-header">
1108
  <h5 class="mb-0">
1109
  <i class="bi bi-server me-2"></i>
1110
- Sunucu Bilgileri
1111
  </h5>
1112
  </div>
1113
  <div class="card-body">
@@ -1115,35 +1115,35 @@
1115
  <div class="col-md-6">
1116
  <dl>
1117
  <dt class="text-primary fw-semibold">Reverse DNS (PTR)</dt>
1118
- <dd class="mb-3">{{ reverse_dns or 'Bilinmiyor' }}</dd>
1119
 
1120
- <dt class="text-primary fw-semibold">Ping Durumu</dt>
1121
  <dd class="mb-3">
1122
  {% if ping_data and not ping_data.error %}
1123
- <span class="badge badge-success">Başarılı</span>
1124
  {% else %}
1125
- <span class="badge badge-danger">Başarısız</span>
1126
  {% endif %}
1127
  </dd>
1128
  </dl>
1129
  </div>
1130
  <div class="col-md-6">
1131
  <dl>
1132
- <dt class="text-primary fw-semibold">HTTP/HTTPS Erişimi</dt>
1133
  <dd class="mb-3">
1134
  {% if http_headers and not http_headers.error %}
1135
- <span class="badge badge-success">Aktif</span>
1136
  {% else %}
1137
- <span class="badge badge-danger">Kapalı</span>
1138
  {% endif %}
1139
  </dd>
1140
 
1141
- <dt class="text-primary fw-semibold">Açık Portlar</dt>
1142
  <dd class="mb-3">
1143
  {% if security_report.open_ports %}
1144
- <span class="badge badge-warning">{{ security_report.open_ports|length }} adet</span>
1145
  {% else %}
1146
- <span class="badge badge-success">Temiz</span>
1147
  {% endif %}
1148
  </dd>
1149
  </dl>
@@ -1162,7 +1162,7 @@
1162
  <div class="card-header">
1163
  <h5 class="mb-0">
1164
  <i class="bi bi-shield-check me-2"></i>
1165
- Güvenlik Durumu Raporu
1166
  </h5>
1167
  </div>
1168
  <div class="card-body">
@@ -1173,19 +1173,19 @@
1173
  <div class="security-header">
1174
  <i class="bi bi-incognito fs-3 text-primary security-icon"></i>
1175
  <div>
1176
- <h5 class="mb-1">Anonimlik Durumu</h5>
1177
- <p class="text-muted mb-0">Proxy, VPN, Tor veya Botnet Kontrolü</p>
1178
  </div>
1179
  </div>
1180
 
1181
  {% if security_report.proxy_vpn_tor %}
1182
  <div class="alert alert-danger">
1183
  <i class="bi bi-exclamation-triangle me-2"></i>
1184
- <strong>Anonim aktivitesi</strong> tespit edildi.
1185
  </div>
1186
 
1187
  {% if security_report.anonymity_services %}
1188
- <p class="mt-3 mb-2 text-muted">Tespit edilen servisler:</p>
1189
  <div>
1190
  {% for service in security_report.anonymity_services %}
1191
  {% set service_lower = service.lower() %}
@@ -1214,7 +1214,7 @@
1214
  {% else %}
1215
  <div class="alert alert-success">
1216
  <i class="bi bi-check-circle me-2"></i>
1217
- Kontrol edilen listelerde anonim veya bot kaydı bulunamadı.
1218
  </div>
1219
  {% endif %}
1220
  </div>
@@ -1224,27 +1224,27 @@
1224
  <div class="security-header">
1225
  <i class="bi bi-shield-lock fs-3 text-primary security-icon"></i>
1226
  <div>
1227
- <h5 class="mb-1">HTTP Güvenlik Başlıkları</h5>
1228
- <p class="text-muted mb-0">Temel güvenlik başlıkları</p>
1229
  </div>
1230
  </div>
1231
  {% if security_report.security_headers %}
1232
  <div class="alert alert-success">
1233
  <i class="bi bi-check-circle me-2"></i>
1234
- <strong>{{ security_report.security_headers|length }} güvenlik başlığı</strong> tespit edildi
1235
  </div>
1236
  <ul class="list-group">
1237
  {% for header in security_report.security_headers %}
1238
  <li class="list-group-item d-flex justify-content-between align-items-center">
1239
  {{ header }}
1240
- <span class="badge bg-success">Mevcut</span>
1241
  </li>
1242
  {% endfor %}
1243
  </ul>
1244
  {% else %}
1245
  <div class="alert alert-warning">
1246
  <i class="bi bi-exclamation-triangle me-2"></i>
1247
- Temel güvenlik başlıkları bulunamadı
1248
  </div>
1249
  {% endif %}
1250
  </div>
@@ -1254,8 +1254,8 @@
1254
  <div class="security-header">
1255
  <i class="bi bi-shield-lock fs-3 text-primary security-icon"></i>
1256
  <div>
1257
- <h5 class="mb-1">SSL/TLS Sertifika Analizi</h5>
1258
- <p class="text-muted mb-0">Sunucu sertifikası ve şifreleme detayları</p>
1259
  </div>
1260
  </div>
1261
  {% if ssl_info %}
@@ -1267,24 +1267,24 @@
1267
  {% else %}
1268
  <div class="alert {% if ssl_info.is_valid %}alert-success{% else %}alert-danger{% endif %}">
1269
  <i class="bi {% if ssl_info.is_valid %}bi-check-circle{% else %}bi-exclamation-triangle{% endif %} me-2"></i>
1270
- <strong>Sertifika Durumu:</strong>
1271
  {% if ssl_info.is_valid %}
1272
- Geçerli ({{ ssl_info.days_remaining }} gün kaldı)
1273
  {% else %}
1274
- Geçersiz/Süresi Dolmuş
1275
  {% endif %}
1276
  </div>
1277
 
1278
  <div class="table-responsive">
1279
  <table class="table table-sm">
1280
  <tbody>
1281
- <tr><th class="text-primary">Ortak Ad (CN)</th><td>{{ ssl_info.common_name or 'Bilinmiyor' }}</td></tr>
1282
- <tr><th class="text-primary">Kuruluş</th><td>{{ ssl_info.organization or 'Bilinmiyor' }}</td></tr>
1283
- <tr><th class="text-primary">Geçerlilik</th><td>{{ ssl_info.valid_from }} - {{ ssl_info.valid_until }}</td></tr>
1284
- <tr><th class="text-primary">Protokol</th><td>{{ ssl_info.protocol }}</td></tr>
1285
- <tr><th class="text-primary">Şifreleme</th><td>{{ ssl_info.cipher }} ({{ ssl_info.key_size }} bit)</td></tr>
1286
- <tr><th class="text-primary">Seri No</th><td>{{ ssl_info.serial_number }}</td></tr>
1287
- <tr><th class="text-primary">İmza Algoritması</th><td>{{ ssl_info.signature_algorithm }}</td></tr>
1288
  </tbody>
1289
  </table>
1290
  </div>
@@ -1292,14 +1292,14 @@
1292
  {% if not ssl_info.is_valid %}
1293
  <div class="security-issue">
1294
  <i class="bi bi-exclamation-triangle-fill text-danger me-2"></i>
1295
- <strong>Uyarı:</strong> Geçersiz veya süresi dolmuş SSL sertifikası
1296
  </div>
1297
  {% endif %}
1298
  {% endif %}
1299
  {% else %}
1300
  <div class="alert alert-warning">
1301
  <i class="bi bi-exclamation-triangle me-2"></i>
1302
- SSL/TLS bilgisi alınamadı veya sunucu SSL bağlantısına izin vermiyor
1303
  </div>
1304
  {% endif %}
1305
  </div>
@@ -1308,8 +1308,8 @@
1308
  <div class="security-header">
1309
  <i class="bi bi-shield-lock fs-3 text-primary security-icon"></i>
1310
  <div>
1311
- <h5 class="mb-1">DNS Blacklist Kontrolü</h5>
1312
- <p class="text-muted mb-0">IP adresinin spam ve kötü amaçlı listelerde olup olmadığı</p>
1313
  </div>
1314
  </div>
1315
 
@@ -1326,7 +1326,7 @@
1326
  {% if listed_entries %}
1327
  <div class="alert alert-danger">
1328
  <i class="bi bi-exclamation-triangle me-2"></i>
1329
- <strong>IP adresi {{ listed_entries | length }} farklı kara listede bulundu!</strong>
1330
  </div>
1331
 
1332
  <div class="accordion" id="dnsblAccordion">
@@ -1338,7 +1338,7 @@
1338
  <button class="accordion-button collapsed" type="button"
1339
  data-bs-toggle="collapse" data-bs-target="#collapse{{ category }}">
1340
  <i class="bi bi-shield-slash me-2"></i>
1341
- {{ category|title }} ({{ valid_entries | length }} liste)
1342
  </button>
1343
  </h2>
1344
  <div id="collapse{{ category }}" class="accordion-collapse collapse"
@@ -1348,9 +1348,9 @@
1348
  <table class="table table-sm">
1349
  <thead>
1350
  <tr>
1351
- <th>Liste</th>
1352
- <th>Açıklama</th>
1353
- <th>Yanıt</th>
1354
  </tr>
1355
  </thead>
1356
  <tbody>
@@ -1374,13 +1374,13 @@
1374
  {% else %}
1375
  <div class="alert alert-success">
1376
  <i class="bi bi-check-circle me-2"></i>
1377
- IP adresi kontrol edilen kara listelerde bulunamadı. Güvenli görünüyor.
1378
  </div>
1379
  {% endif %}
1380
  {% else %}
1381
  <div class="alert alert-warning">
1382
  <i class="bi bi-exclamation-triangle me-2"></i>
1383
- DNSBL sonucu alınamadı.
1384
  </div>
1385
  {% endif %}
1386
  </div>
@@ -1391,8 +1391,8 @@
1391
  <div class="security-header">
1392
  <i class="bi bi-door-open fs-3 text-primary security-icon"></i>
1393
  <div>
1394
- <h5 class="mb-1">Açık Portlar ({{ security_report.open_ports|length }})</h5>
1395
- <p class="text-muted mb-0">Tespit edilen açık portlar ve servisler</p>
1396
  </div>
1397
  </div>
1398
  {% if security_report.open_ports %}
@@ -1400,7 +1400,7 @@
1400
  <table class="table table-hover">
1401
  <thead class="table-dark">
1402
  <tr>
1403
- <th>Port</th><th>Servis</th><th>Ürün</th><th>Versiyon</th><th>Durum</th>
1404
  </tr>
1405
  </thead>
1406
  <tbody>
@@ -1434,7 +1434,7 @@
1434
  {% else %}
1435
  <div class="alert alert-success">
1436
  <i class="bi bi-check-circle me-2"></i>
1437
- Taranan portlar arasında açık port bulunamadı
1438
  </div>
1439
  {% endif %}
1440
  </div>
@@ -1445,8 +1445,8 @@
1445
  <div class="security-header">
1446
  <i class="bi bi-exclamation-triangle fs-3 text-danger security-icon"></i>
1447
  <div>
1448
- <h5 class="mb-1">Güvenlik Uyarıları</h5>
1449
- <p class="text-muted mb-0">Tespit edilen potansiyel güvenlik sorunları</p>
1450
  </div>
1451
  </div>
1452
  <div class="mt-3">
@@ -1463,13 +1463,13 @@
1463
  <div class="security-header">
1464
  <i class="bi bi-shield-check fs-3 text-success security-icon"></i>
1465
  <div>
1466
- <h5 class="mb-1">Güvenlik Durumu</h5>
1467
- <p class="text-muted mb-0">Temel güvenlik kontrolleri başarılı</p>
1468
  </div>
1469
  </div>
1470
  <div class="alert alert-success mt-3">
1471
  <i class="bi bi-check-circle me-2"></i>
1472
- <strong>Güvenlik durumu iyi:</strong> Temel güvenlik kontrollerinde kritik sorun tespit edilmedi
1473
  </div>
1474
  </div>
1475
  {% endif %} <!-- end if security_issues -->
@@ -1483,7 +1483,7 @@
1483
  <!-- Detailed Analysis Accordion -->
1484
  <h3 class="section-title mb-4">
1485
  <i class="bi bi-gear-wide-connected me-2"></i>
1486
- Detaylı Analiz Raporları
1487
  </h3>
1488
 
1489
  <div class="accordion" id="detailsAccordion">
@@ -1493,14 +1493,14 @@
1493
  <h2 class="accordion-header">
1494
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseMtr">
1495
  <i class="bi bi-geo-alt-fill me-2"></i>
1496
- <strong> Yolu ve Kayıp Analizi (MTR)</strong>
1497
  </button>
1498
  </h2>
1499
  <div id="collapseMtr" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
1500
  <div class="accordion-body">
1501
  {% if mtr_data.error %}
1502
  <div class="alert alert-danger" role="alert">
1503
- <h5 class="alert-heading">MTR Analizi Hatası!</h5>
1504
  <p>{{ mtr_data.error }}</p>
1505
  {% if mtr_data.details %}
1506
  <hr>
@@ -1508,17 +1508,17 @@
1508
  {% endif %}
1509
  </div>
1510
  {% elif mtr_data.hops %}
1511
- <p class="text-muted mb-3">Hedefe giden yolu üzerindeki her atlama noktasında paket kaybı ve gecikme analizi.</p>
1512
  <div class="table-responsive">
1513
  <table class="table table-hover table-sm">
1514
  <thead class="table-light">
1515
  <tr>
1516
  <th>#</th>
1517
  <th>Host / IP</th>
1518
- <th class="text-center">Paket Kaybı</th>
1519
- <th class="text-end">Ort. Gecikme</th>
1520
- <th class="text-end">En İyi</th>
1521
- <th class="text-end">En Kötü</th>
1522
  <th class="text-end">Son</th> {# Added 'Last' column #}
1523
  </tr>
1524
  </thead>
@@ -1529,7 +1529,7 @@
1529
  <td>
1530
  {{ hop.host }}
1531
  {% if hop.is_private %}
1532
- <span class="badge bg-secondary ms-1" data-bs-toggle="tooltip" data-bs-placement="top" title="Bu özel bir IP adresidir ve genellikle dahili ağlarda kullanılır.">Özel IP</span>
1533
  {% endif %}
1534
  </td>
1535
  <td class="text-center">
@@ -1546,10 +1546,10 @@
1546
  </tbody>
1547
  </table>
1548
  </div>
1549
- <p class="text-muted mt-3">Toplam Atlama Sayısı: <strong>{{ mtr_data.total_hops }}</strong> | Genel Paket Kaybı: <strong>{{ "%.1f"|format(mtr_data.packet_loss) }}%</strong></p>
1550
  {% else %}
1551
  <div class="alert alert-info text-center" role="alert">
1552
- <i class="bi bi-info-circle-fill me-2"></i> MTR analizi için veri bulunamadı veya analiz tamamlanamadı.
1553
  </div>
1554
  {% endif %}
1555
  </div>
@@ -1561,7 +1561,7 @@
1561
  <h2 class="accordion-header">
1562
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseWhois">
1563
  <i class="bi bi-person-badge-fill me-2"></i>
1564
- <strong>WHOIS Bilgileri</strong>
1565
  </button>
1566
  </h2>
1567
  <div id="collapseWhois" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
@@ -1598,14 +1598,14 @@
1598
  <h2 class="accordion-header">
1599
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseDns">
1600
  <i class="bi bi-list-nested me-2"></i>
1601
- <strong>DNS Kayıtları</strong>
1602
  </button>
1603
  </h2>
1604
  <div id="collapseDns" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
1605
  <div class="accordion-body">
1606
 
1607
  {% if dns_records.A %}
1608
- <h6 class="text-primary mt-2"><i class="bi bi-hdd-network me-1"></i> A Kayıtları (IPv4)</h6>
1609
  <ul class="list-group list-group-flush mb-3">
1610
  {% for ip in dns_records.A %}
1611
  <li class="list-group-item">{{ ip }}</li>
@@ -1614,7 +1614,7 @@
1614
  {% endif %}
1615
 
1616
  {% if dns_records.AAAA %}
1617
- <h6 class="text-primary mt-2">AAAA Kayıtları (IPv6)</h6>
1618
  <ul class="list-group list-group-flush mb-3">
1619
  {% for ip in dns_records.AAAA %}
1620
  <li class="list-group-item">{{ ip }}</li>
@@ -1622,7 +1622,7 @@
1622
  </ul>
1623
  {% endif %}
1624
  {% if dns_records.PTR %}
1625
- <h6 class="text-primary mt-2">PTR Kayıtları</h6>
1626
  <ul class="list-group list-group-flush mb-3">
1627
  {% for ptr in dns_records.PTR %}
1628
  <li class="list-group-item">IP: {{ ptr.ip }} - PTR: {{ ptr.ptr }}</li>
@@ -1631,14 +1631,14 @@
1631
  {% endif %}
1632
 
1633
  {% if dns_records.CNAME %}
1634
- <h6 class="text-primary mt-2"><i class="bi bi-link-45deg me-1"></i> CNAME Kaydı</h6>
1635
  <ul class="list-group list-group-flush mb-3">
1636
  <li class="list-group-item">{{ dns_records.CNAME }}</li>
1637
  </ul>
1638
  {% endif %}
1639
 
1640
  {% if dns_records.MX %}
1641
- <h6 class="text-primary mt-2"><i class="bi bi-envelope-fill me-1"></i> MX Kayıtları (Mail Server)</h6>
1642
  <ul class="list-group list-group-flush mb-3">
1643
  {% for mx in dns_records.MX %}
1644
  <li class="list-group-item"><strong>{{ mx.preference }}</strong> - {{ mx.exchange }}</li>
@@ -1647,7 +1647,7 @@
1647
  {% endif %}
1648
 
1649
  {% if dns_records.NS %}
1650
- <h6 class="text-primary mt-2"><i class="bi bi-diagram-3-fill me-1"></i> NS Kayıtları (Name Server)</h6>
1651
  <ul class="list-group list-group-flush mb-3">
1652
  {% for ns in dns_records.NS %}
1653
  <li class="list-group-item">{{ ns }}</li>
@@ -1656,12 +1656,12 @@
1656
  {% endif %}
1657
 
1658
  {% if dns_records.SOA %}
1659
- <h6 class="text-primary mt-2">SOA Kaydı</h6>
1660
  <pre class="bg-light p-2">{{ dns_records.SOA }}</pre>
1661
  {% endif %}
1662
 
1663
  {% if dns_records.TXT %}
1664
- <h6 class="text-primary mt-2"><i class="bi bi-file-earmark-text me-1"></i> TXT Kayıtları</h6>
1665
  <ul class="list-group list-group-flush mb-3">
1666
  {% for txt in dns_records.TXT %}
1667
  <li class="list-group-item">{{ txt }}</li>
@@ -1671,11 +1671,11 @@
1671
 
1672
  {% if not dns_records.A and not dns_records.AAAA and not dns_records.MX and not dns_records.NS and not dns_records.SOA and not dns_records.TXT and not dns_records.CNAME %}
1673
  <div class="alert alert-info text-center" role="alert">
1674
- <i class="bi bi-info-circle-fill me-2"></i> DNS kaydı bulunamadı.
1675
  </div>
1676
  {% endif %}
1677
  {% if dns_records.CAA %}
1678
- <h6 class="text-primary mt-2">CAA Kayıtları</h6>
1679
  <ul class="list-group list-group-flush mb-3">
1680
  {% for caa in dns_records.CAA %}
1681
  <li class="list-group-item">{{ caa }}</li>
@@ -1693,29 +1693,29 @@
1693
  <h2 class="accordion-header">
1694
  <button class="accordion-button {% if not wayback_snapshots.error %}collapsed{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#collapseWayback">
1695
  <i class="bi bi-archive-fill me-2"></i>
1696
- <strong>Wayback Machine Geçmiş Kayıtları</strong>
1697
  </button>
1698
  </h2>
1699
  <div id="collapseWayback" class="accordion-collapse collapse {% if wayback_snapshots.error %}show{% endif %}" data-bs-parent="#detailsAccordion">
1700
  <div class="accordion-body">
1701
  {% if wayback_snapshots.error %}
1702
  <div class="alert alert-danger" role="alert">
1703
- <h5 class="alert-heading">Wayback Machine Analizi Hatası!</h5>
1704
  <p>{{ wayback_snapshots.error }}</p>
1705
  </div>
1706
  {% elif wayback_snapshots.closest_snapshot %}
1707
- <p class="text-muted mb-3">Wayback Machine'de bulunan en yakın arşivlenmiş kayıt:</p>
1708
  <div class="bg-light p-3 rounded shadow-sm">
1709
  <dl class="row mb-0">
1710
- <dt class="col-sm-4">Tarih:</dt>
1711
  <dd class="col-sm-8">{{ wayback_snapshots.closest_snapshot.timestamp }}</dd>
1712
- <dt class="col-sm-4">Bağlantı:</dt>
1713
  <dd class="col-sm-8 text-break"><a href="{{ wayback_snapshots.closest_snapshot.url }}" target="_blank">{{ wayback_snapshots.closest_snapshot.url }}</a></dd>
1714
  </dl>
1715
  </div>
1716
  {% else %}
1717
  <div class="alert alert-info text-center" role="alert">
1718
- <i class="bi bi-info-circle-fill me-2"></i> Wayback Machine'de geçmiş kayıt bulunamadı.
1719
  </div>
1720
  {% endif %}
1721
  </div>
@@ -1729,7 +1729,7 @@
1729
  <h2 class="accordion-header">
1730
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapsePorts">
1731
  <i class="bi bi-door-open-fill me-2"></i>
1732
- <strong>Açık Port Taraması (Nmap)</strong>
1733
  </button>
1734
  </h2>
1735
  <div id="collapsePorts" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
@@ -1737,16 +1737,16 @@
1737
  {% if port_scan.error %}
1738
  <div class="alert alert-warning">{{ port_scan.error }}</div>
1739
  {% elif port_scan.ports %}
1740
- <p class="text-muted mb-3">Hedef üzerinde bulunan açık TCP portları ve servis bilgileri:</p>
1741
  <div class="table-responsive">
1742
  <table class="table table-hover">
1743
  <thead>
1744
  <tr>
1745
  <th>Port</th>
1746
- <th>Durum</th>
1747
- <th>Servis</th>
1748
- <th>Ürün</th>
1749
- <th>Versiyon</th>
1750
  </tr>
1751
  </thead>
1752
  <tbody>
@@ -1763,7 +1763,7 @@
1763
  </table>
1764
  </div>
1765
  {% else %}
1766
- <p class="text-muted text-center">Taranan portlar arasında açık bir port bulunamadı.</p>
1767
  {% endif %}
1768
  </div>
1769
  </div>
@@ -1775,52 +1775,52 @@
1775
  <h2 class="accordion-header">
1776
  <button class="accordion-button {% if not ssl_info.error %}collapsed{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#collapseSSL">
1777
  <i class="bi bi-file-earmark-lock2-fill me-2"></i>
1778
- <strong>Detaylı SSL/TLS Sertifika Bilgileri</strong>
1779
  </button>
1780
  </h2>
1781
  <div id="collapseSSL" class="accordion-collapse collapse {% if ssl_info.error %}show{% endif %}" data-bs-parent="#detailsAccordion">
1782
  <div class="accordion-body">
1783
  {% if ssl_info.error %}
1784
  <div class="alert alert-danger" role="alert">
1785
- <h5 class="alert-heading">SSL/TLS Analiz Hatası!</h5>
1786
  <p>{{ ssl_info.error }}</p>
1787
  </div>
1788
  {% else %}
1789
  <div class="row mb-4">
1790
  <div class="col-md-6">
1791
- <h6 class="text-primary mb-3"><i class="bi bi-person-fill me-2"></i>Sertifika Konusu (Subject)</h6>
1792
  <div class="bg-light p-3 rounded shadow-sm">
1793
  <dl class="row mb-0">
1794
- <dt class="col-sm-4">Ortak Ad (CN):</dt>
1795
  <dd class="col-sm-8 text-break">{{ ssl_info.common_name if ssl_info.common_name else 'N/A' }}</dd>
1796
 
1797
  {% if ssl_info.subject.C %}
1798
- <dt class="col-sm-4">Ülke (C):</dt>
1799
  <dd class="col-sm-8">{{ ssl_info.subject.C }}</dd>
1800
  {% endif %}
1801
  {% if ssl_info.subject.ST %}
1802
- <dt class="col-sm-4">Eyalet/İl (ST):</dt>
1803
  <dd class="col-sm-8">{{ ssl_info.subject.ST }}</dd>
1804
  {% endif %}
1805
  {% if ssl_info.subject.L %}
1806
- <dt class="col-sm-4">Şehir (L):</dt>
1807
  <dd class="col-sm-8">{{ ssl_info.subject.L }}</dd>
1808
  {% endif %}
1809
- <dt class="col-sm-4">Kuruluş (O):</dt>
1810
  <dd class="col-sm-8 text-break">{{ ssl_info.organization if ssl_info.organization else 'N/A' }}</dd>
1811
  {% if ssl_info.subject.OU %}
1812
- <dt class="col-sm-4">Kuruluş Birimi (OU):</dt>
1813
  <dd class="col-sm-8">{{ ssl_info.subject.OU }}</dd>
1814
  {% endif %}
1815
  {% if ssl_info.subject.emailAddress %}
1816
- <dt class="col-sm-4">E-posta:</dt>
1817
  <dd class="col-sm-8">{{ ssl_info.subject.emailAddress }}</dd>
1818
  {% endif %}
1819
  </dl>
1820
  </div>
1821
  </div>
1822
  <div class="col-md-6">
1823
- <h6 class="text-primary mb-3"><i class="bi bi-building me-2"></i>Sertifika Yayıncısı (Issuer)</h6>
1824
  <div class="bg-light p-3 rounded shadow-sm">
1825
  <dl class="row mb-0">
1826
  <dt class="col-sm-4">Ortak Ad (CN):</dt>
@@ -1848,40 +1848,40 @@
1848
 
1849
  <div class="row mb-4">
1850
  <div class="col-md-6">
1851
- <h6 class="text-primary mb-3"><i class="bi bi-calendar-check-fill me-2"></i>Geçerlilik Tarihleri</h6>
1852
  <div class="bg-light p-3 rounded shadow-sm">
1853
  <dl class="row mb-0">
1854
- <dt class="col-sm-4">Başlangıç:</dt>
1855
  <dd class="col-sm-8">{{ ssl_info.valid_from }}</dd>
1856
- <dt class="col-sm-4">Bitiş:</dt>
1857
  <dd class="col-sm-8">{{ ssl_info.valid_until }}</dd>
1858
- <dt class="col-sm-4">Kalan Gün:</dt>
1859
  <dd class="col-sm-8">
1860
  <span class="badge {% if ssl_info.days_remaining < 30 %}bg-danger{% elif ssl_info.days_remaining < 90 %}bg-warning text-dark{% else %}bg-success{% endif %}">
1861
- {{ ssl_info.days_remaining }} gün
1862
  </span>
1863
  {% if not ssl_info.is_valid %}
1864
- <span class="badge bg-danger ms-2">Süresi Doldu!</span>
1865
  {% endif %}
1866
  </dd>
1867
  </dl>
1868
  </div>
1869
  </div>
1870
  <div class="col-md-6">
1871
- <h6 class="text-primary mb-3"><i class="bi bi-lock-fill me-2"></i>Bağlantı ve Şifreleme</h6>
1872
  <div class="bg-light p-3 rounded shadow-sm">
1873
  <dl class="row mb-0">
1874
- <dt class="col-sm-4">Protokol:</dt>
1875
  <dd class="col-sm-8">{{ ssl_info.protocol if ssl_info.protocol else 'N/A' }}</dd>
1876
  {% if ssl_info.cipher %}
1877
- <dt class="col-sm-4">Şifreleme Adı:</dt>
1878
  <dd class="col-sm-8 text-break">{{ ssl_info.cipher.name }}</dd>
1879
- <dt class="col-sm-4">Şifreleme Versiyonu:</dt>
1880
  <dd class="col-sm-8">{{ ssl_info.cipher.version }}</dd>
1881
- <dt class="col-sm-4">Anahtar Büyüklüğü (Bit):</dt>
1882
  <dd class="col-sm-8">{{ ssl_info.cipher.bits }}</dd>
1883
  {% else %}
1884
- <dt class="col-sm-12">Şifreleme bilgisi alınamadı.</dt>
1885
  {% endif %}
1886
  </dl>
1887
  </div>
@@ -1890,7 +1890,7 @@
1890
 
1891
  <div class="row mb-4">
1892
  <div class="col-md-12">
1893
- <h6 class="text-primary mb-3"><i class="bi bi-globe me-2"></i>Alternatif İsimler (SAN)</h6>
1894
  <div class="bg-light p-3 rounded shadow-sm">
1895
  {% if ssl_info.alt_names %}
1896
  <ul class="list-unstyled mb-0">
@@ -1899,7 +1899,7 @@
1899
  {% endfor %}
1900
  </ul>
1901
  {% else %}
1902
- <p class="mb-0 text-muted">Alternatif isim bulunamadı (SANs).</p>
1903
  {% endif %}
1904
  </div>
1905
  </div>
@@ -1907,12 +1907,12 @@
1907
 
1908
  <div class="row">
1909
  <div class="col-md-12">
1910
- <h6 class="text-primary mb-3"><i class="bi bi-info-circle-fill me-2"></i>Ek Sertifika Detayları</h6>
1911
  <div class="bg-light p-3 rounded shadow-sm">
1912
  <dl class="row mb-0">
1913
- <dt class="col-sm-4">Seri Numarası:</dt>
1914
  <dd class="col-sm-8 text-break">{{ ssl_info.serial_number }}</dd>
1915
- <dt class="col-sm-4">İmza Algoritması:</dt>
1916
  <dd class="col-sm-8">{{ ssl_info.signature_algorithm }}</dd>
1917
  </dl>
1918
  </div>
@@ -1920,7 +1920,7 @@
1920
  </div>
1921
 
1922
  <div class="mt-4">
1923
- <h6 class="text-primary mb-2"><i class="bi bi-code-slash me-2"></i>Ham SSL Verisi</h6>
1924
  <div class="bg-dark text-light p-3 rounded" style="white-space: pre-wrap; word-break: break-word; font-family: monospace; font-size: 0.85em;">
1925
  {{ ssl_info | tojson(indent=2) }}
1926
  </div>
@@ -1937,21 +1937,21 @@
1937
  <h2 class="accordion-header">
1938
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseHeaders">
1939
  <i class="bi bi-file-text-fill me-2"></i>
1940
- <strong>HTTP Başlıkları (Headers)</strong>
1941
  </button>
1942
  </h2>
1943
  <div id="collapseHeaders" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
1944
  <div class="accordion-body">
1945
  <h6 class="text-primary mb-3">
1946
  <i class="bi bi-box-arrow-in-right me-2"></i>
1947
- Nihai Yanıt Başlıkları ({{ http_headers.final_url }})
1948
  </h6>
1949
  <div class="table-responsive mb-4">
1950
  <table class="table table-striped table-bordered align-middle">
1951
  <thead class="table-primary">
1952
  <tr>
1953
- <th style="width: 30%">Başlık</th>
1954
- <th>Değer</th>
1955
  </tr>
1956
  </thead>
1957
  <tbody>
@@ -1968,20 +1968,20 @@
1968
  {% if http_headers.history %}
1969
  <h6 class="text-primary mt-4 mb-3">
1970
  <i class="bi bi-arrow-repeat me-2"></i>
1971
- Yönlendirme Geçmişi
1972
  </h6>
1973
  {% for h in http_headers.history %}
1974
  <div class="redirect-item">
1975
  <span class="redirect-number">{{ loop.index }}.</span>
1976
  <span class="redirect-url">{{ h.url }}</span>
1977
- <span class="badge badge-warning">Kod: {{ h.status_code }}</span>
1978
  </div>
1979
  {% endfor %}
1980
  {% endif %}
1981
 
1982
  <!-- Ham HTTP Başlıkları metin olarak -->
1983
  <div class="mt-4">
1984
- <h6 class="text-primary mb-2"><i class="bi bi-code-slash me-2"></i>Ham HTTP Başlığı</h6>
1985
  <div class="bg-dark text-light p-3 rounded" style="white-space: pre-wrap; word-break: break-word; font-family: monospace;">
1986
  {{ http_headers }}
1987
  </div>
@@ -1997,7 +1997,7 @@
1997
  <h2 class="accordion-header">
1998
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseIpInfo">
1999
  <i class="bi bi-map-fill me-2"></i>
2000
- <strong>Genel IP Bilgisi</strong>
2001
  </button>
2002
  </h2>
2003
  <div id="collapseIpInfo" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
@@ -2009,13 +2009,13 @@
2009
  <dt class="text-primary fw-semibold">Hostname</dt>
2010
  <dd class="mb-2">{{ ipinfo_data.hostname or 'N/A' }}</dd>
2011
 
2012
- <dt class="text-primary fw-semibold">Servis Sağlayıcı</dt>
2013
  <dd class="mb-2">{{ ipinfo_data.org or 'N/A' }}</dd>
2014
  </dl>
2015
  </div>
2016
  <div class="col-md-6">
2017
  <dl>
2018
- <dt class="text-primary fw-semibold">Lokasyon</dt>
2019
  <dd class="mb-2">
2020
  {{ ipinfo_data.city or '' }},
2021
  {{ ipinfo_data.region or '' }},
@@ -2025,7 +2025,7 @@
2025
  {% endif %}
2026
  </dd>
2027
 
2028
- <dt class="text-primary fw-semibold">Koordinatlar</dt>
2029
  <dd class="mb-2">{{ ipinfo_data.loc or 'N/A' }}</dd>
2030
  </dl>
2031
  </div>
@@ -2033,7 +2033,7 @@
2033
 
2034
  <!-- Ham ipinfo_data JSON görünümü -->
2035
  <div class="mt-4">
2036
- <h6 class="text-primary mb-2"><i class="bi bi-code-slash me-2"></i>Ham IP Info Verisi</h6>
2037
  <div class="bg-dark text-light p-3 rounded" style="white-space: pre-wrap; word-break: break-word; font-family: monospace;">
2038
  {{ ipinfo_data }}
2039
  </div>
@@ -2047,15 +2047,15 @@
2047
  <h2 class="accordion-header">
2048
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseDnsRecords">
2049
  <i class="bi bi-card-list me-2"></i>
2050
- <strong>DNS Kayıtları</strong>
2051
  </button>
2052
  </h2>
2053
  <div id="collapseDnsRecords" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
2054
  <div class="accordion-body">
2055
  <div class="row">
2056
  <div class="col-md-6">
2057
- <p><strong>Yetkili DNS:</strong> {{ authoritative_dns if authoritative_dns else "Bulunamadı" }}</p>
2058
- <p><strong>DNSSEC Durumu:</strong> {{ dnssec_status }}</p>
2059
  </div>
2060
  </div>
2061
  <hr>
@@ -2063,11 +2063,11 @@
2063
  {% for record_type, records in dns_records.items() %}
2064
  {% if records %}
2065
  <div class="col-md-6 mb-3">
2066
- <h5>{{ record_type }} Kayıtları</h5>
2067
  <ul class="list-unstyled">
2068
  {% if record_type == 'MX' %}
2069
  {% for mx_record in records %}
2070
- <li><strong>Tercih:</strong> {{ mx_record.preference }} - <strong>Değişim:</strong> {{ mx_record.exchange }}</li>
2071
  {% endfor %}
2072
  {% elif record_type == 'PTR' %}
2073
  {% for ptr_record in records %}
@@ -2079,11 +2079,11 @@
2079
  {% endfor %}
2080
  {% elif record_type == 'SRV' %}
2081
  {% for srv_record in records %}
2082
- <li><strong>Hedef:</strong> {{ srv_record.target }} - <strong>Port:</strong> {{ srv_record.port }} - <strong>Öncelik:</strong> {{ srv_record.priority }} - <strong>Ağırlık:</strong> {{ srv_record.weight }}</li>
2083
  {% endfor %}
2084
  {% elif record_type == 'CAA' %}
2085
  {% for caa_record in records %}
2086
- <li><strong>Bayrak:</strong> {{ caa_record.flags }} - <strong>Etiket:</strong> {{ caa_record.tag }} - <strong>Değer:</strong> {{ caa_record.value }}</li>
2087
  {% endfor %}
2088
  {% elif record_type == 'CNAME' %}
2089
  <li>{{ records }}</li>
@@ -2262,12 +2262,12 @@
2262
  <h2 class="accordion-header">
2263
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseBgpGraph">
2264
  <i class="bi bi-diagram-3-fill me-2"></i>
2265
- <strong>BGP AS Path Görselleştirmesi</strong>
2266
  </button>
2267
  </h2>
2268
  <div id="collapseBgpGraph" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
2269
  <div class="accordion-body">
2270
- <p class="text-muted mb-3">Gözlem noktalarından hedefe giden BGP AS yolları. Farklı renkler, farklı yolları temsil eder. Yakınlaşmak ve sürüklemek için fareyi kullanabilirsiniz.</p>
2271
 
2272
  <div id="bgp-graph-container" class="bgp-graph-container"></div>
2273
 
@@ -2283,7 +2283,7 @@
2283
  <h2 class="accordion-header">
2284
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseRipestat">
2285
  <i class="bi bi-diagram-3-fill me-2"></i>
2286
- <strong>Gelişmiş BGP & Yönlendirme Analizi</strong>
2287
  </button>
2288
  </h2>
2289
  <div id="collapseRipestat" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
@@ -2309,7 +2309,7 @@
2309
  <h2 class="accordion-header">
2310
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseRawJson">
2311
  <i class="bi bi-filetype-json me-2"></i>
2312
- <strong>Tam RDAP Yanıtı</strong>
2313
  </button>
2314
  </h2>
2315
  <div id="collapseRawJson" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
@@ -2443,7 +2443,7 @@
2443
  })
2444
  }).addTo(map)
2445
  .bindPopup(`
2446
- <b>Yaklaşık Konum</b><br>
2447
  ${ipInfoData.city || ''}, ${ipInfoData.region || ''}, ${ipInfoData.country_name || ipInfoData.country || ''}
2448
  `).openPopup();
2449
  });
@@ -2458,7 +2458,7 @@
2458
  let graphInitialized = false;
2459
  const drawGraph = () => {
2460
  if (graphInitialized || !bgpGraphContainer.clientWidth || !bgpGraphContainer.clientHeight) {
2461
- console.warn("BGP Graph: Konteyner boyutu sıfır veya grafik zaten çizilmiş. Çizim atlandı.");
2462
  return;
2463
  }
2464
  graphInitialized = true;
@@ -2537,12 +2537,12 @@
2537
  const tooltip = d3.select("#tooltip");
2538
  function mouseover(event, d) {
2539
  tooltip.html(`
2540
- <h6>AS Bilgisi: <code>${d.id}</code></h6>
2541
- <p><strong>Ad:</strong> ${d.name || 'N/A'}</p>
2542
- <p><strong>Ülke:</strong> ${d.country || 'N/A'}</p>
2543
- <p><strong>Tip:</strong> ${d.node_type ? (d.node_type.charAt(0).toUpperCase() + d.node_type.slice(1)) : 'N/A'}</p>
2544
  <hr>
2545
- <p>${d.description || 'Açıklama mevcut değil.'}</p>
2546
  `)
2547
  .style("left", (event.pageX + 15) + "px")
2548
  .style("top", (event.pageY - 28) + "px")
@@ -2986,7 +2986,7 @@
2986
  if (!form.checkValidity()) return;
2987
  submitBtn.disabled = true;
2988
  submitBtn.dataset.originalHtml = submitBtn.innerHTML;
2989
- submitBtn.innerHTML = '<span class="loading-spinner me-2" aria-hidden="true"></span>Analiz ediliyor...';
2990
  });
2991
  });
2992
  </script>
 
1
  <!DOCTYPE html>
2
+ <html lang="en">
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
835
  <div class="col-md-8">
836
  <h2 class="section-title mb-0">
837
  <i class="bi bi-graph-up text-warning me-2"></i>
838
+ Analysis Results: {{ query }}
839
  </h2>
840
  </div>
841
  <div class="col-md-4 text-end">
842
  {% if data.source_rir != 'Bilinmiyor' %}
843
  <span class="badge badge-success fs-6">
844
+ <i class="bi bi-shield-check me-1"></i>Source: {{ data.source_rir }}
845
  </span>
846
  {% endif %}
847
  <span class="badge badge-info fs-6 ms-2">
848
+ <i class="bi bi-diagram-3 me-1"></i>IP Class: {{ data.summary.ip_class }}
849
  </span>
850
  </div>
851
  </div>
 
858
  <div class="card-header">
859
  <h5 class="mb-0">
860
  <i class="bi bi-diagram-3-fill me-2"></i>
861
+ Advanced Network and Routing Information
862
  </h5>
863
  </div>
864
  <div class="card-body">
 
867
  {% if bgpview_prefix %}
868
  <div class="col-lg-6">
869
  <h6 class="text-primary fw-semibold border-bottom pb-2 mb-3">
870
+ <i class="bi bi-signpost-split-fill me-2"></i>Network Prefix Information (BGPView)
871
  </h6>
872
  <dl class="row">
873
  <dt class="col-sm-4">Prefix</dt>
874
  <dd class="col-sm-8">{{ bgpview_prefix.prefix }}</dd>
875
 
876
+ <dt class="col-sm-4">Prefix Name</dt>
877
  <dd class="col-sm-8">{{ bgpview_prefix.name }}</dd>
878
 
879
+ <dt class="col-sm-4">Description</dt>
880
  <dd class="col-sm-8">{{ bgpview_prefix.description }}</dd>
881
  </dl>
882
  </div>
 
886
  {% if peeringdb_data %}
887
  <div class="col-lg-6">
888
  <h6 class="text-primary fw-semibold border-bottom pb-2 mb-3">
889
+ <i class="bi bi-building-fill-gear me-2"></i> Service Provider Details (PeeringDB)
890
  </h6>
891
  <dl class="row">
892
+ <dt class="col-sm-5">Organization (ASN)</dt>
893
  <dd class="col-sm-7">{{ peeringdb_data.name }} (AS{{ origin_asn }})</dd>
894
 
895
+ <dt class="col-sm-5">Website</dt>
896
  <dd class="col-sm-7">
897
  {% if peeringdb_data.website %}
898
  <a href="{{ peeringdb_data.website }}" target="_blank">{{ peeringdb_data.website }}</a>
899
  {% else %}
900
+ Unknown
901
  {% endif %}
902
  </dd>
903
 
904
+ <dt class="col-sm-5">Traffic Type</dt>
905
  <dd class="col-sm-7">{{ peeringdb_data.traffic_type }}</dd>
906
 
907
+ <dt class="col-sm-5">Announced IPv4/v6</dt>
908
  <dd class="col-sm-7">{{ peeringdb_data.prefix_count_ipv4 }} / {{ peeringdb_data.prefix_count_ipv6 }}</dd>
909
 
910
+ <dt class="col-sm-5">Peering Policy</dt>
911
  <dd class="col-sm-7">{{ peeringdb_data.policy }}</dd>
912
  </dl>
913
  </div>
 
925
  <div class="card-header">
926
  <h5 class="mb-0">
927
  <i class="bi bi-info-circle-fill me-2"></i>
928
+ Network Summary (RDAP)
929
  </h5>
930
  </div>
931
  <div class="card-body">
932
  <div class="row">
933
  <div class="col-md-6">
934
  <dl>
935
+ <dt class="text-primary fw-semibold">Network Name</dt>
936
  <dd class="mb-3">{{ data.summary.name }}</dd>
937
 
938
  <dt class="text-primary fw-semibold">Handle</dt>
939
  <dd class="mb-3">{{ data.summary.handle }}</dd>
940
 
941
  {% if data.summary.ip_range %}
942
+ <dt class="text-primary fw-semibold">IP Range</dt>
943
  <dd class="mb-3">{{ data.summary.ip_range }}</dd>
944
  {% endif %}
945
 
946
  {% if data.summary.asn_range %}
947
+ <dt class="text-primary fw-semibold">ASN Range</dt>
948
  <dd class="mb-3">{{ data.summary.asn_range }}</dd>
949
  {% endif %}
950
  </dl>
 
954
  <!-- YENİ: Kaydı yapan kuruluşu bulmak için mantık eklendi -->
955
  {% set org_contact = (data.contacts.registrant or data.contacts.administrative or data.contacts.technical)|first %}
956
  {% if org_contact and org_contact.org != 'Bilinmiyor' %}
957
+ <dt class="text-primary fw-semibold">Registrant Organization</dt>
958
  <dd class="mb-3">{{ org_contact.org }}</dd>
959
  {% endif %}
960
 
961
+ <dt class="text-primary fw-semibold">Country</dt>
962
  <dd class="mb-3">
963
  {{ data.summary.country }}
964
  {% if ipinfo_data and ipinfo_data.country_name %}
 
966
  {% endif %}
967
  </dd>
968
 
969
+ <dt class="text-primary fw-semibold">Record Type</dt>
970
  <dd class="mb-3">{{ data.summary.type }}</dd>
971
 
972
+ <dt class="text-primary fw-semibold">IP Class</dt>
973
  <dd class="mb-3">
974
  <span class="badge badge-info">{{ data.summary.ip_class }}</span>
975
  <small class="text-muted">{{ data.summary.ip_class_desc }}</small>
 
981
  <!-- YENİ: Önemli Tarihler (Events) bölümü eklendi -->
982
  {% if data.details and data.details.events %}
983
  <hr>
984
+ <h6 class="text-primary fw-semibold mb-2">Important Dates</h6>
985
  <div class="row small">
986
  {% for event in data.details.events %}
987
  <div class="col-md-6 mb-2">
 
996
  <!-- YENİ: Kayıt Notları (Remarks) bölümü eklendi -->
997
  {% if data.details and data.details.remarks %}
998
  <hr>
999
+ <h6 class="text-primary fw-semibold mb-2">Registration Remarks</h6>
1000
  {% for remark in data.details.remarks %}
1001
  <div class="alert alert-secondary p-2 small mt-2">
1002
  {% if remark.title %}<p class="fw-bold mb-1">{{ remark.title }}</p>{% endif %}
 
1019
  <div class="card-header">
1020
  <h5 class="mb-0">
1021
  <i class="bi bi-people-fill me-2"></i>
1022
+ Contact Information
1023
  </h5>
1024
  </div>
1025
  <div class="card-body" style="max-height: 400px; overflow-y: auto;">
 
1052
  {% endfor %}
1053
  {% endfor %}
1054
  {% if not has_contacts %}
1055
+ <p class="text-muted text-center">No role-based contact information was found for this record.</p>
1056
  {% endif %}
1057
  </div>
1058
  </div>
 
1067
  <div class="card-header">
1068
  <h5 class="mb-0">
1069
  <i class="bi bi-speedometer2 me-2"></i>
1070
+ Ping & Latency Analysis
1071
  </h5>
1072
  </div>
1073
  <div class="card-body">
 
1078
  {{ ping_data.error }}
1079
  </div>
1080
  {% else %}
1081
+ <p class="text-muted mb-3">Round-trip times for packets sent to the target:</p>
1082
  <div class="ping-stats">
1083
  <div class="ping-stat">
1084
  <div class="ping-value">{{ ping_data.min }}</div>
 
1086
  </div>
1087
  <div class="ping-stat">
1088
  <div class="ping-value text-warning">{{ ping_data.avg }}</div>
1089
+ <div class="ping-label">Average</div>
1090
  </div>
1091
  <div class="ping-stat">
1092
  <div class="ping-value">{{ ping_data.max }}</div>
1093
+ <div class="ping-label">Maximum</div>
1094
  </div>
1095
  </div>
1096
  {% endif %}
1097
  {% else %}
1098
+ <p class="text-muted text-center">Ping data could not be retrieved.</p>
1099
  {% endif %}
1100
  </div>
1101
  </div>
 
1107
  <div class="card-header">
1108
  <h5 class="mb-0">
1109
  <i class="bi bi-server me-2"></i>
1110
+ Server Information
1111
  </h5>
1112
  </div>
1113
  <div class="card-body">
 
1115
  <div class="col-md-6">
1116
  <dl>
1117
  <dt class="text-primary fw-semibold">Reverse DNS (PTR)</dt>
1118
+ <dd class="mb-3">{{ reverse_dns or 'Unknown' }}</dd>
1119
 
1120
+ <dt class="text-primary fw-semibold">Ping Status</dt>
1121
  <dd class="mb-3">
1122
  {% if ping_data and not ping_data.error %}
1123
+ <span class="badge badge-success">Successful</span>
1124
  {% else %}
1125
+ <span class="badge badge-danger">Failed</span>
1126
  {% endif %}
1127
  </dd>
1128
  </dl>
1129
  </div>
1130
  <div class="col-md-6">
1131
  <dl>
1132
+ <dt class="text-primary fw-semibold">HTTP/HTTPS Access</dt>
1133
  <dd class="mb-3">
1134
  {% if http_headers and not http_headers.error %}
1135
+ <span class="badge badge-success">Active</span>
1136
  {% else %}
1137
+ <span class="badge badge-danger">Inactive</span>
1138
  {% endif %}
1139
  </dd>
1140
 
1141
+ <dt class="text-primary fw-semibold">Open Ports</dt>
1142
  <dd class="mb-3">
1143
  {% if security_report.open_ports %}
1144
+ <span class="badge badge-warning">{{ security_report.open_ports|length }} found</span>
1145
  {% else %}
1146
+ <span class="badge badge-success">Clean</span>
1147
  {% endif %}
1148
  </dd>
1149
  </dl>
 
1162
  <div class="card-header">
1163
  <h5 class="mb-0">
1164
  <i class="bi bi-shield-check me-2"></i>
1165
+ Security Status Report
1166
  </h5>
1167
  </div>
1168
  <div class="card-body">
 
1173
  <div class="security-header">
1174
  <i class="bi bi-incognito fs-3 text-primary security-icon"></i>
1175
  <div>
1176
+ <h5 class="mb-1">Anonymity Status</h5>
1177
+ <p class="text-muted mb-0">Proxy, VPN, Tor or Botnet Check</p>
1178
  </div>
1179
  </div>
1180
 
1181
  {% if security_report.proxy_vpn_tor %}
1182
  <div class="alert alert-danger">
1183
  <i class="bi bi-exclamation-triangle me-2"></i>
1184
+ <strong>Anonymity network activity</strong> detected.
1185
  </div>
1186
 
1187
  {% if security_report.anonymity_services %}
1188
+ <p class="mt-3 mb-2 text-muted">Detected services:</p>
1189
  <div>
1190
  {% for service in security_report.anonymity_services %}
1191
  {% set service_lower = service.lower() %}
 
1214
  {% else %}
1215
  <div class="alert alert-success">
1216
  <i class="bi bi-check-circle me-2"></i>
1217
+ No anonymity network or bot record found in the checked lists.
1218
  </div>
1219
  {% endif %}
1220
  </div>
 
1224
  <div class="security-header">
1225
  <i class="bi bi-shield-lock fs-3 text-primary security-icon"></i>
1226
  <div>
1227
+ <h5 class="mb-1">HTTP Security Headers</h5>
1228
+ <p class="text-muted mb-0">Basic security headers</p>
1229
  </div>
1230
  </div>
1231
  {% if security_report.security_headers %}
1232
  <div class="alert alert-success">
1233
  <i class="bi bi-check-circle me-2"></i>
1234
+ <strong>{{ security_report.security_headers|length }} security header(s)</strong> detected
1235
  </div>
1236
  <ul class="list-group">
1237
  {% for header in security_report.security_headers %}
1238
  <li class="list-group-item d-flex justify-content-between align-items-center">
1239
  {{ header }}
1240
+ <span class="badge bg-success">Present</span>
1241
  </li>
1242
  {% endfor %}
1243
  </ul>
1244
  {% else %}
1245
  <div class="alert alert-warning">
1246
  <i class="bi bi-exclamation-triangle me-2"></i>
1247
+ Basic security headers not found
1248
  </div>
1249
  {% endif %}
1250
  </div>
 
1254
  <div class="security-header">
1255
  <i class="bi bi-shield-lock fs-3 text-primary security-icon"></i>
1256
  <div>
1257
+ <h5 class="mb-1">SSL/TLS Certificate Analysis</h5>
1258
+ <p class="text-muted mb-0">Server certificate and encryption details</p>
1259
  </div>
1260
  </div>
1261
  {% if ssl_info %}
 
1267
  {% else %}
1268
  <div class="alert {% if ssl_info.is_valid %}alert-success{% else %}alert-danger{% endif %}">
1269
  <i class="bi {% if ssl_info.is_valid %}bi-check-circle{% else %}bi-exclamation-triangle{% endif %} me-2"></i>
1270
+ <strong>Certificate Status:</strong>
1271
  {% if ssl_info.is_valid %}
1272
+ Valid ({{ ssl_info.days_remaining }} days remaining)
1273
  {% else %}
1274
+ Invalid/Expired
1275
  {% endif %}
1276
  </div>
1277
 
1278
  <div class="table-responsive">
1279
  <table class="table table-sm">
1280
  <tbody>
1281
+ <tr><th class="text-primary">Common Name (CN)</th><td>{{ ssl_info.common_name or 'Unknown' }}</td></tr>
1282
+ <tr><th class="text-primary">Organization</th><td>{{ ssl_info.organization or 'Unknown' }}</td></tr>
1283
+ <tr><th class="text-primary">Validity</th><td>{{ ssl_info.valid_from }} - {{ ssl_info.valid_until }}</td></tr>
1284
+ <tr><th class="text-primary">Protocol</th><td>{{ ssl_info.protocol }}</td></tr>
1285
+ <tr><th class="text-primary">Cipher</th><td>{{ ssl_info.cipher }} ({{ ssl_info.key_size }} bit)</td></tr>
1286
+ <tr><th class="text-primary">Serial No</th><td>{{ ssl_info.serial_number }}</td></tr>
1287
+ <tr><th class="text-primary">Signature Algorithm</th><td>{{ ssl_info.signature_algorithm }}</td></tr>
1288
  </tbody>
1289
  </table>
1290
  </div>
 
1292
  {% if not ssl_info.is_valid %}
1293
  <div class="security-issue">
1294
  <i class="bi bi-exclamation-triangle-fill text-danger me-2"></i>
1295
+ <strong>Warning:</strong> Invalid or expired SSL certificate
1296
  </div>
1297
  {% endif %}
1298
  {% endif %}
1299
  {% else %}
1300
  <div class="alert alert-warning">
1301
  <i class="bi bi-exclamation-triangle me-2"></i>
1302
+ SSL/TLS info could not be retrieved or the server does not allow SSL connection
1303
  </div>
1304
  {% endif %}
1305
  </div>
 
1308
  <div class="security-header">
1309
  <i class="bi bi-shield-lock fs-3 text-primary security-icon"></i>
1310
  <div>
1311
+ <h5 class="mb-1">DNS Blacklist Check</h5>
1312
+ <p class="text-muted mb-0">Whether the IP address appears on spam and malicious lists</p>
1313
  </div>
1314
  </div>
1315
 
 
1326
  {% if listed_entries %}
1327
  <div class="alert alert-danger">
1328
  <i class="bi bi-exclamation-triangle me-2"></i>
1329
+ <strong>The IP address was found on {{ listed_entries | length }} blacklist(s)!</strong>
1330
  </div>
1331
 
1332
  <div class="accordion" id="dnsblAccordion">
 
1338
  <button class="accordion-button collapsed" type="button"
1339
  data-bs-toggle="collapse" data-bs-target="#collapse{{ category }}">
1340
  <i class="bi bi-shield-slash me-2"></i>
1341
+ {{ category|title }} ({{ valid_entries | length }} lists)
1342
  </button>
1343
  </h2>
1344
  <div id="collapse{{ category }}" class="accordion-collapse collapse"
 
1348
  <table class="table table-sm">
1349
  <thead>
1350
  <tr>
1351
+ <th>List</th>
1352
+ <th>Description</th>
1353
+ <th>Response</th>
1354
  </tr>
1355
  </thead>
1356
  <tbody>
 
1374
  {% else %}
1375
  <div class="alert alert-success">
1376
  <i class="bi bi-check-circle me-2"></i>
1377
+ The IP address was not found in the checked blacklists. It appears safe.
1378
  </div>
1379
  {% endif %}
1380
  {% else %}
1381
  <div class="alert alert-warning">
1382
  <i class="bi bi-exclamation-triangle me-2"></i>
1383
+ DNSBL results could not be retrieved.
1384
  </div>
1385
  {% endif %}
1386
  </div>
 
1391
  <div class="security-header">
1392
  <i class="bi bi-door-open fs-3 text-primary security-icon"></i>
1393
  <div>
1394
+ <h5 class="mb-1">Open Ports ({{ security_report.open_ports|length }})</h5>
1395
+ <p class="text-muted mb-0">Detected open ports and services</p>
1396
  </div>
1397
  </div>
1398
  {% if security_report.open_ports %}
 
1400
  <table class="table table-hover">
1401
  <thead class="table-dark">
1402
  <tr>
1403
+ <th>Port</th><th>Service</th><th>Product</th><th>Version</th><th>Status</th>
1404
  </tr>
1405
  </thead>
1406
  <tbody>
 
1434
  {% else %}
1435
  <div class="alert alert-success">
1436
  <i class="bi bi-check-circle me-2"></i>
1437
+ No open ports were found among the scanned ports
1438
  </div>
1439
  {% endif %}
1440
  </div>
 
1445
  <div class="security-header">
1446
  <i class="bi bi-exclamation-triangle fs-3 text-danger security-icon"></i>
1447
  <div>
1448
+ <h5 class="mb-1">Security Alerts</h5>
1449
+ <p class="text-muted mb-0">Identified potential security issues</p>
1450
  </div>
1451
  </div>
1452
  <div class="mt-3">
 
1463
  <div class="security-header">
1464
  <i class="bi bi-shield-check fs-3 text-success security-icon"></i>
1465
  <div>
1466
+ <h5 class="mb-1">Security Status</h5>
1467
+ <p class="text-muted mb-0">Basic security checks successful</p>
1468
  </div>
1469
  </div>
1470
  <div class="alert alert-success mt-3">
1471
  <i class="bi bi-check-circle me-2"></i>
1472
+ <strong>Good security posture:</strong> No critical issues found in basic security checks
1473
  </div>
1474
  </div>
1475
  {% endif %} <!-- end if security_issues -->
 
1483
  <!-- Detailed Analysis Accordion -->
1484
  <h3 class="section-title mb-4">
1485
  <i class="bi bi-gear-wide-connected me-2"></i>
1486
+ Detailed Analysis Reports
1487
  </h3>
1488
 
1489
  <div class="accordion" id="detailsAccordion">
 
1493
  <h2 class="accordion-header">
1494
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseMtr">
1495
  <i class="bi bi-geo-alt-fill me-2"></i>
1496
+ <strong>Network Path and Loss Analysis (MTR)</strong>
1497
  </button>
1498
  </h2>
1499
  <div id="collapseMtr" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
1500
  <div class="accordion-body">
1501
  {% if mtr_data.error %}
1502
  <div class="alert alert-danger" role="alert">
1503
+ <h5 class="alert-heading">MTR Analysis Error!</h5>
1504
  <p>{{ mtr_data.error }}</p>
1505
  {% if mtr_data.details %}
1506
  <hr>
 
1508
  {% endif %}
1509
  </div>
1510
  {% elif mtr_data.hops %}
1511
+ <p class="text-muted mb-3">Packet loss and latency analysis at each hop along the path to the target.</p>
1512
  <div class="table-responsive">
1513
  <table class="table table-hover table-sm">
1514
  <thead class="table-light">
1515
  <tr>
1516
  <th>#</th>
1517
  <th>Host / IP</th>
1518
+ <th class="text-center">Packet Loss</th>
1519
+ <th class="text-end">Avg Latency</th>
1520
+ <th class="text-end">Best</th>
1521
+ <th class="text-end">Worst</th>
1522
  <th class="text-end">Son</th> {# Added 'Last' column #}
1523
  </tr>
1524
  </thead>
 
1529
  <td>
1530
  {{ hop.host }}
1531
  {% if hop.is_private %}
1532
+ <span class="badge bg-secondary ms-1" data-bs-toggle="tooltip" data-bs-placement="top" title="This is a private IP address and is typically used in internal networks.">Private IP</span>
1533
  {% endif %}
1534
  </td>
1535
  <td class="text-center">
 
1546
  </tbody>
1547
  </table>
1548
  </div>
1549
+ <p class="text-muted mt-3">Total Hops: <strong>{{ mtr_data.total_hops }}</strong> | Overall Packet Loss: <strong>{{ "%.1f"|format(mtr_data.packet_loss) }}%</strong></p>
1550
  {% else %}
1551
  <div class="alert alert-info text-center" role="alert">
1552
+ <i class="bi bi-info-circle-fill me-2"></i> No data found for MTR analysis or the analysis could not be completed.
1553
  </div>
1554
  {% endif %}
1555
  </div>
 
1561
  <h2 class="accordion-header">
1562
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseWhois">
1563
  <i class="bi bi-person-badge-fill me-2"></i>
1564
+ <strong>WHOIS Information</strong>
1565
  </button>
1566
  </h2>
1567
  <div id="collapseWhois" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
 
1598
  <h2 class="accordion-header">
1599
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseDns">
1600
  <i class="bi bi-list-nested me-2"></i>
1601
+ <strong>DNS Records</strong>
1602
  </button>
1603
  </h2>
1604
  <div id="collapseDns" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
1605
  <div class="accordion-body">
1606
 
1607
  {% if dns_records.A %}
1608
+ <h6 class="text-primary mt-2"><i class="bi bi-hdd-network me-1"></i> A Records (IPv4)</h6>
1609
  <ul class="list-group list-group-flush mb-3">
1610
  {% for ip in dns_records.A %}
1611
  <li class="list-group-item">{{ ip }}</li>
 
1614
  {% endif %}
1615
 
1616
  {% if dns_records.AAAA %}
1617
+ <h6 class="text-primary mt-2">AAAA Records (IPv6)</h6>
1618
  <ul class="list-group list-group-flush mb-3">
1619
  {% for ip in dns_records.AAAA %}
1620
  <li class="list-group-item">{{ ip }}</li>
 
1622
  </ul>
1623
  {% endif %}
1624
  {% if dns_records.PTR %}
1625
+ <h6 class="text-primary mt-2">PTR Records</h6>
1626
  <ul class="list-group list-group-flush mb-3">
1627
  {% for ptr in dns_records.PTR %}
1628
  <li class="list-group-item">IP: {{ ptr.ip }} - PTR: {{ ptr.ptr }}</li>
 
1631
  {% endif %}
1632
 
1633
  {% if dns_records.CNAME %}
1634
+ <h6 class="text-primary mt-2"><i class="bi bi-link-45deg me-1"></i> CNAME Record</h6>
1635
  <ul class="list-group list-group-flush mb-3">
1636
  <li class="list-group-item">{{ dns_records.CNAME }}</li>
1637
  </ul>
1638
  {% endif %}
1639
 
1640
  {% if dns_records.MX %}
1641
+ <h6 class="text-primary mt-2"><i class="bi bi-envelope-fill me-1"></i> MX Records (Mail Server)</h6>
1642
  <ul class="list-group list-group-flush mb-3">
1643
  {% for mx in dns_records.MX %}
1644
  <li class="list-group-item"><strong>{{ mx.preference }}</strong> - {{ mx.exchange }}</li>
 
1647
  {% endif %}
1648
 
1649
  {% if dns_records.NS %}
1650
+ <h6 class="text-primary mt-2"><i class="bi bi-diagram-3-fill me-1"></i> NS Records (Name Server)</h6>
1651
  <ul class="list-group list-group-flush mb-3">
1652
  {% for ns in dns_records.NS %}
1653
  <li class="list-group-item">{{ ns }}</li>
 
1656
  {% endif %}
1657
 
1658
  {% if dns_records.SOA %}
1659
+ <h6 class="text-primary mt-2">SOA Record</h6>
1660
  <pre class="bg-light p-2">{{ dns_records.SOA }}</pre>
1661
  {% endif %}
1662
 
1663
  {% if dns_records.TXT %}
1664
+ <h6 class="text-primary mt-2"><i class="bi bi-file-earmark-text me-1"></i> TXT Records</h6>
1665
  <ul class="list-group list-group-flush mb-3">
1666
  {% for txt in dns_records.TXT %}
1667
  <li class="list-group-item">{{ txt }}</li>
 
1671
 
1672
  {% if not dns_records.A and not dns_records.AAAA and not dns_records.MX and not dns_records.NS and not dns_records.SOA and not dns_records.TXT and not dns_records.CNAME %}
1673
  <div class="alert alert-info text-center" role="alert">
1674
+ <i class="bi bi-info-circle-fill me-2"></i> No DNS records found.
1675
  </div>
1676
  {% endif %}
1677
  {% if dns_records.CAA %}
1678
+ <h6 class="text-primary mt-2">CAA Records</h6>
1679
  <ul class="list-group list-group-flush mb-3">
1680
  {% for caa in dns_records.CAA %}
1681
  <li class="list-group-item">{{ caa }}</li>
 
1693
  <h2 class="accordion-header">
1694
  <button class="accordion-button {% if not wayback_snapshots.error %}collapsed{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#collapseWayback">
1695
  <i class="bi bi-archive-fill me-2"></i>
1696
+ <strong>Wayback Machine Archive Records</strong>
1697
  </button>
1698
  </h2>
1699
  <div id="collapseWayback" class="accordion-collapse collapse {% if wayback_snapshots.error %}show{% endif %}" data-bs-parent="#detailsAccordion">
1700
  <div class="accordion-body">
1701
  {% if wayback_snapshots.error %}
1702
  <div class="alert alert-danger" role="alert">
1703
+ <h5 class="alert-heading">Wayback Machine Analysis Error!</h5>
1704
  <p>{{ wayback_snapshots.error }}</p>
1705
  </div>
1706
  {% elif wayback_snapshots.closest_snapshot %}
1707
+ <p class="text-muted mb-3">Closest archived record found on the Wayback Machine:</p>
1708
  <div class="bg-light p-3 rounded shadow-sm">
1709
  <dl class="row mb-0">
1710
+ <dt class="col-sm-4">Date:</dt>
1711
  <dd class="col-sm-8">{{ wayback_snapshots.closest_snapshot.timestamp }}</dd>
1712
+ <dt class="col-sm-4">Link:</dt>
1713
  <dd class="col-sm-8 text-break"><a href="{{ wayback_snapshots.closest_snapshot.url }}" target="_blank">{{ wayback_snapshots.closest_snapshot.url }}</a></dd>
1714
  </dl>
1715
  </div>
1716
  {% else %}
1717
  <div class="alert alert-info text-center" role="alert">
1718
+ <i class="bi bi-info-circle-fill me-2"></i> No archived record found on the Wayback Machine.
1719
  </div>
1720
  {% endif %}
1721
  </div>
 
1729
  <h2 class="accordion-header">
1730
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapsePorts">
1731
  <i class="bi bi-door-open-fill me-2"></i>
1732
+ <strong>Open Port Scan (Nmap)</strong>
1733
  </button>
1734
  </h2>
1735
  <div id="collapsePorts" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
 
1737
  {% if port_scan.error %}
1738
  <div class="alert alert-warning">{{ port_scan.error }}</div>
1739
  {% elif port_scan.ports %}
1740
+ <p class="text-muted mb-3">Open TCP ports and service information found on the target:</p>
1741
  <div class="table-responsive">
1742
  <table class="table table-hover">
1743
  <thead>
1744
  <tr>
1745
  <th>Port</th>
1746
+ <th>State</th>
1747
+ <th>Service</th>
1748
+ <th>Product</th>
1749
+ <th>Version</th>
1750
  </tr>
1751
  </thead>
1752
  <tbody>
 
1763
  </table>
1764
  </div>
1765
  {% else %}
1766
+ <p class="text-muted text-center">No open ports were found among the scanned ports.</p>
1767
  {% endif %}
1768
  </div>
1769
  </div>
 
1775
  <h2 class="accordion-header">
1776
  <button class="accordion-button {% if not ssl_info.error %}collapsed{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#collapseSSL">
1777
  <i class="bi bi-file-earmark-lock2-fill me-2"></i>
1778
+ <strong>Detailed SSL/TLS Certificate Information</strong>
1779
  </button>
1780
  </h2>
1781
  <div id="collapseSSL" class="accordion-collapse collapse {% if ssl_info.error %}show{% endif %}" data-bs-parent="#detailsAccordion">
1782
  <div class="accordion-body">
1783
  {% if ssl_info.error %}
1784
  <div class="alert alert-danger" role="alert">
1785
+ <h5 class="alert-heading">SSL/TLS Analysis Error!</h5>
1786
  <p>{{ ssl_info.error }}</p>
1787
  </div>
1788
  {% else %}
1789
  <div class="row mb-4">
1790
  <div class="col-md-6">
1791
+ <h6 class="text-primary mb-3"><i class="bi bi-person-fill me-2"></i>Certificate Subject</h6>
1792
  <div class="bg-light p-3 rounded shadow-sm">
1793
  <dl class="row mb-0">
1794
+ <dt class="col-sm-4">Common Name (CN):</dt>
1795
  <dd class="col-sm-8 text-break">{{ ssl_info.common_name if ssl_info.common_name else 'N/A' }}</dd>
1796
 
1797
  {% if ssl_info.subject.C %}
1798
+ <dt class="col-sm-4">Country (C):</dt>
1799
  <dd class="col-sm-8">{{ ssl_info.subject.C }}</dd>
1800
  {% endif %}
1801
  {% if ssl_info.subject.ST %}
1802
+ <dt class="col-sm-4">State/Province (ST):</dt>
1803
  <dd class="col-sm-8">{{ ssl_info.subject.ST }}</dd>
1804
  {% endif %}
1805
  {% if ssl_info.subject.L %}
1806
+ <dt class="col-sm-4">City (L):</dt>
1807
  <dd class="col-sm-8">{{ ssl_info.subject.L }}</dd>
1808
  {% endif %}
1809
+ <dt class="col-sm-4">Organization (O):</dt>
1810
  <dd class="col-sm-8 text-break">{{ ssl_info.organization if ssl_info.organization else 'N/A' }}</dd>
1811
  {% if ssl_info.subject.OU %}
1812
+ <dt class="col-sm-4">Organizational Unit (OU):</dt>
1813
  <dd class="col-sm-8">{{ ssl_info.subject.OU }}</dd>
1814
  {% endif %}
1815
  {% if ssl_info.subject.emailAddress %}
1816
+ <dt class="col-sm-4">Email:</dt>
1817
  <dd class="col-sm-8">{{ ssl_info.subject.emailAddress }}</dd>
1818
  {% endif %}
1819
  </dl>
1820
  </div>
1821
  </div>
1822
  <div class="col-md-6">
1823
+ <h6 class="text-primary mb-3"><i class="bi bi-building me-2"></i>Certificate Issuer (Issuer)</h6>
1824
  <div class="bg-light p-3 rounded shadow-sm">
1825
  <dl class="row mb-0">
1826
  <dt class="col-sm-4">Ortak Ad (CN):</dt>
 
1848
 
1849
  <div class="row mb-4">
1850
  <div class="col-md-6">
1851
+ <h6 class="text-primary mb-3"><i class="bi bi-calendar-check-fill me-2"></i>Validity Dates</h6>
1852
  <div class="bg-light p-3 rounded shadow-sm">
1853
  <dl class="row mb-0">
1854
+ <dt class="col-sm-4">Start:</dt>
1855
  <dd class="col-sm-8">{{ ssl_info.valid_from }}</dd>
1856
+ <dt class="col-sm-4">End:</dt>
1857
  <dd class="col-sm-8">{{ ssl_info.valid_until }}</dd>
1858
+ <dt class="col-sm-4">Days Remaining:</dt>
1859
  <dd class="col-sm-8">
1860
  <span class="badge {% if ssl_info.days_remaining < 30 %}bg-danger{% elif ssl_info.days_remaining < 90 %}bg-warning text-dark{% else %}bg-success{% endif %}">
1861
+ {{ ssl_info.days_remaining }} days
1862
  </span>
1863
  {% if not ssl_info.is_valid %}
1864
+ <span class="badge bg-danger ms-2">Expired!</span>
1865
  {% endif %}
1866
  </dd>
1867
  </dl>
1868
  </div>
1869
  </div>
1870
  <div class="col-md-6">
1871
+ <h6 class="text-primary mb-3"><i class="bi bi-lock-fill me-2"></i>Connection and Encryption</h6>
1872
  <div class="bg-light p-3 rounded shadow-sm">
1873
  <dl class="row mb-0">
1874
+ <dt class="col-sm-4">Protocol:</dt>
1875
  <dd class="col-sm-8">{{ ssl_info.protocol if ssl_info.protocol else 'N/A' }}</dd>
1876
  {% if ssl_info.cipher %}
1877
+ <dt class="col-sm-4">Cipher Name:</dt>
1878
  <dd class="col-sm-8 text-break">{{ ssl_info.cipher.name }}</dd>
1879
+ <dt class="col-sm-4">Cipher Version:</dt>
1880
  <dd class="col-sm-8">{{ ssl_info.cipher.version }}</dd>
1881
+ <dt class="col-sm-4">Key Size (bits):</dt>
1882
  <dd class="col-sm-8">{{ ssl_info.cipher.bits }}</dd>
1883
  {% else %}
1884
+ <dt class="col-sm-12">Cipher information not available.</dt>
1885
  {% endif %}
1886
  </dl>
1887
  </div>
 
1890
 
1891
  <div class="row mb-4">
1892
  <div class="col-md-12">
1893
+ <h6 class="text-primary mb-3"><i class="bi bi-globe me-2"></i>Alternative Names (SAN)</h6>
1894
  <div class="bg-light p-3 rounded shadow-sm">
1895
  {% if ssl_info.alt_names %}
1896
  <ul class="list-unstyled mb-0">
 
1899
  {% endfor %}
1900
  </ul>
1901
  {% else %}
1902
+ <p class="mb-0 text-muted">No alternative names found (SANs).</p>
1903
  {% endif %}
1904
  </div>
1905
  </div>
 
1907
 
1908
  <div class="row">
1909
  <div class="col-md-12">
1910
+ <h6 class="text-primary mb-3"><i class="bi bi-info-circle-fill me-2"></i>Additional Certificate Details</h6>
1911
  <div class="bg-light p-3 rounded shadow-sm">
1912
  <dl class="row mb-0">
1913
+ <dt class="col-sm-4">Serial Number:</dt>
1914
  <dd class="col-sm-8 text-break">{{ ssl_info.serial_number }}</dd>
1915
+ <dt class="col-sm-4">Signature Algorithm:</dt>
1916
  <dd class="col-sm-8">{{ ssl_info.signature_algorithm }}</dd>
1917
  </dl>
1918
  </div>
 
1920
  </div>
1921
 
1922
  <div class="mt-4">
1923
+ <h6 class="text-primary mb-2"><i class="bi bi-code-slash me-2"></i>Raw SSL Data</h6>
1924
  <div class="bg-dark text-light p-3 rounded" style="white-space: pre-wrap; word-break: break-word; font-family: monospace; font-size: 0.85em;">
1925
  {{ ssl_info | tojson(indent=2) }}
1926
  </div>
 
1937
  <h2 class="accordion-header">
1938
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseHeaders">
1939
  <i class="bi bi-file-text-fill me-2"></i>
1940
+ <strong>HTTP Headers</strong>
1941
  </button>
1942
  </h2>
1943
  <div id="collapseHeaders" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
1944
  <div class="accordion-body">
1945
  <h6 class="text-primary mb-3">
1946
  <i class="bi bi-box-arrow-in-right me-2"></i>
1947
+ Final Response Headers ({{ http_headers.final_url }})
1948
  </h6>
1949
  <div class="table-responsive mb-4">
1950
  <table class="table table-striped table-bordered align-middle">
1951
  <thead class="table-primary">
1952
  <tr>
1953
+ <th style="width: 30%">Header</th>
1954
+ <th>Value</th>
1955
  </tr>
1956
  </thead>
1957
  <tbody>
 
1968
  {% if http_headers.history %}
1969
  <h6 class="text-primary mt-4 mb-3">
1970
  <i class="bi bi-arrow-repeat me-2"></i>
1971
+ Redirect History
1972
  </h6>
1973
  {% for h in http_headers.history %}
1974
  <div class="redirect-item">
1975
  <span class="redirect-number">{{ loop.index }}.</span>
1976
  <span class="redirect-url">{{ h.url }}</span>
1977
+ <span class="badge badge-warning">Code: {{ h.status_code }}</span>
1978
  </div>
1979
  {% endfor %}
1980
  {% endif %}
1981
 
1982
  <!-- Ham HTTP Başlıkları metin olarak -->
1983
  <div class="mt-4">
1984
+ <h6 class="text-primary mb-2"><i class="bi bi-code-slash me-2"></i>Raw HTTP Headers</h6>
1985
  <div class="bg-dark text-light p-3 rounded" style="white-space: pre-wrap; word-break: break-word; font-family: monospace;">
1986
  {{ http_headers }}
1987
  </div>
 
1997
  <h2 class="accordion-header">
1998
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseIpInfo">
1999
  <i class="bi bi-map-fill me-2"></i>
2000
+ <strong>General IP Information</strong>
2001
  </button>
2002
  </h2>
2003
  <div id="collapseIpInfo" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
 
2009
  <dt class="text-primary fw-semibold">Hostname</dt>
2010
  <dd class="mb-2">{{ ipinfo_data.hostname or 'N/A' }}</dd>
2011
 
2012
+ <dt class="text-primary fw-semibold">Service Provider</dt>
2013
  <dd class="mb-2">{{ ipinfo_data.org or 'N/A' }}</dd>
2014
  </dl>
2015
  </div>
2016
  <div class="col-md-6">
2017
  <dl>
2018
+ <dt class="text-primary fw-semibold">Location</dt>
2019
  <dd class="mb-2">
2020
  {{ ipinfo_data.city or '' }},
2021
  {{ ipinfo_data.region or '' }},
 
2025
  {% endif %}
2026
  </dd>
2027
 
2028
+ <dt class="text-primary fw-semibold">Coordinates</dt>
2029
  <dd class="mb-2">{{ ipinfo_data.loc or 'N/A' }}</dd>
2030
  </dl>
2031
  </div>
 
2033
 
2034
  <!-- Ham ipinfo_data JSON görünümü -->
2035
  <div class="mt-4">
2036
+ <h6 class="text-primary mb-2"><i class="bi bi-code-slash me-2"></i>Raw IP Info Data</h6>
2037
  <div class="bg-dark text-light p-3 rounded" style="white-space: pre-wrap; word-break: break-word; font-family: monospace;">
2038
  {{ ipinfo_data }}
2039
  </div>
 
2047
  <h2 class="accordion-header">
2048
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseDnsRecords">
2049
  <i class="bi bi-card-list me-2"></i>
2050
+ <strong>DNS Records</strong>
2051
  </button>
2052
  </h2>
2053
  <div id="collapseDnsRecords" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
2054
  <div class="accordion-body">
2055
  <div class="row">
2056
  <div class="col-md-6">
2057
+ <p><strong>Authoritative DNS:</strong> {{ authoritative_dns if authoritative_dns else "Not found" }}</p>
2058
+ <p><strong>DNSSEC Status:</strong> {{ dnssec_status }}</p>
2059
  </div>
2060
  </div>
2061
  <hr>
 
2063
  {% for record_type, records in dns_records.items() %}
2064
  {% if records %}
2065
  <div class="col-md-6 mb-3">
2066
+ <h5>{{ record_type }} Records</h5>
2067
  <ul class="list-unstyled">
2068
  {% if record_type == 'MX' %}
2069
  {% for mx_record in records %}
2070
+ <li><strong>Preference:</strong> {{ mx_record.preference }} - <strong>Exchange:</strong> {{ mx_record.exchange }}</li>
2071
  {% endfor %}
2072
  {% elif record_type == 'PTR' %}
2073
  {% for ptr_record in records %}
 
2079
  {% endfor %}
2080
  {% elif record_type == 'SRV' %}
2081
  {% for srv_record in records %}
2082
+ <li><strong>Target:</strong> {{ srv_record.target }} - <strong>Port:</strong> {{ srv_record.port }} - <strong>Priority:</strong> {{ srv_record.priority }} - <strong>Weight:</strong> {{ srv_record.weight }}</li>
2083
  {% endfor %}
2084
  {% elif record_type == 'CAA' %}
2085
  {% for caa_record in records %}
2086
+ <li><strong>Flags:</strong> {{ caa_record.flags }} - <strong>Tag:</strong> {{ caa_record.tag }} - <strong>Value:</strong> {{ caa_record.value }}</li>
2087
  {% endfor %}
2088
  {% elif record_type == 'CNAME' %}
2089
  <li>{{ records }}</li>
 
2262
  <h2 class="accordion-header">
2263
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseBgpGraph">
2264
  <i class="bi bi-diagram-3-fill me-2"></i>
2265
+ <strong>BGP AS Path Visualization</strong>
2266
  </button>
2267
  </h2>
2268
  <div id="collapseBgpGraph" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
2269
  <div class="accordion-body">
2270
+ <p class="text-muted mb-3">BGP AS paths from observation points to the target. Different colors represent different paths. Use the mouse to zoom and drag.</p>
2271
 
2272
  <div id="bgp-graph-container" class="bgp-graph-container"></div>
2273
 
 
2283
  <h2 class="accordion-header">
2284
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseRipestat">
2285
  <i class="bi bi-diagram-3-fill me-2"></i>
2286
+ <strong>Advanced BGP & Routing Analysis</strong>
2287
  </button>
2288
  </h2>
2289
  <div id="collapseRipestat" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
 
2309
  <h2 class="accordion-header">
2310
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseRawJson">
2311
  <i class="bi bi-filetype-json me-2"></i>
2312
+ <strong>Full RDAP Response</strong>
2313
  </button>
2314
  </h2>
2315
  <div id="collapseRawJson" class="accordion-collapse collapse" data-bs-parent="#detailsAccordion">
 
2443
  })
2444
  }).addTo(map)
2445
  .bindPopup(`
2446
+ <b>Approximate Location</b><br>
2447
  ${ipInfoData.city || ''}, ${ipInfoData.region || ''}, ${ipInfoData.country_name || ipInfoData.country || ''}
2448
  `).openPopup();
2449
  });
 
2458
  let graphInitialized = false;
2459
  const drawGraph = () => {
2460
  if (graphInitialized || !bgpGraphContainer.clientWidth || !bgpGraphContainer.clientHeight) {
2461
+ console.warn("BGP Graph: Container size is zero or graph already drawn. Skipping render.");
2462
  return;
2463
  }
2464
  graphInitialized = true;
 
2537
  const tooltip = d3.select("#tooltip");
2538
  function mouseover(event, d) {
2539
  tooltip.html(`
2540
+ <h6>AS Info: <code>${d.id}</code></h6>
2541
+ <p><strong>Name:</strong> ${d.name || 'N/A'}</p>
2542
+ <p><strong>Country:</strong> ${d.country || 'N/A'}</p>
2543
+ <p><strong>Type:</strong> ${d.node_type ? (d.node_type.charAt(0).toUpperCase() + d.node_type.slice(1)) : 'N/A'}</p>
2544
  <hr>
2545
+ <p>${d.description || 'No description available.'}</p>
2546
  `)
2547
  .style("left", (event.pageX + 15) + "px")
2548
  .style("top", (event.pageY - 28) + "px")
 
2986
  if (!form.checkValidity()) return;
2987
  submitBtn.disabled = true;
2988
  submitBtn.dataset.originalHtml = submitBtn.innerHTML;
2989
+ submitBtn.innerHTML = '<span class="loading-spinner me-2" aria-hidden="true"></span>Analyzing...';
2990
  });
2991
  });
2992
  </script>