mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/welcome/hacktricks-values-and-faq.md'] to tr
This commit is contained in:
parent
d0e92ca39e
commit
f4c5a206f0
@ -5,17 +5,17 @@
|
||||
## HackTricks Değerleri
|
||||
|
||||
> [!TIP]
|
||||
> Bunlar HackTricks Projesi'nin **değerleri**:
|
||||
> Bunlar **HackTricks Projesi'nin değerleri**:
|
||||
>
|
||||
> - İnternet'teki **TÜM** kişilere **EĞİTİMSEL hacking** kaynaklarına **ÜCRETSİZ** erişim sağlamak.
|
||||
> - Tüm internete **ÜCRETSİZ** **EĞİTİMSEL hacking** kaynaklara erişim sağlamak.
|
||||
> - Hacking öğrenme ile ilgilidir ve öğrenme mümkün olduğunca ücretsiz olmalıdır.
|
||||
> - Bu kitabın amacı kapsamlı bir **eğitim kaynağı** olarak hizmet etmektir.
|
||||
> - Topluluğun yayınladığı harika **hacking** tekniklerini **DEPOLAMAK** ve orijinal yazarlara tüm **kredileri** vermek.
|
||||
> - **Başkalarından kredi almak istemiyoruz**, sadece herkes için havalı numaraları depolamak istiyoruz.
|
||||
> - Ayrıca HackTricks'te **kendi araştırmalarımızı** da yazıyoruz.
|
||||
> - Bazı durumlarda yalnızca tekniğin önemli kısımlarının **özetini HackTricks'te** yazacağız ve daha fazla ayrıntı için okuyucuyu orijinal gönderiyi ziyaret etmeye **teşvik edeceğiz**.
|
||||
> - Kitaptaki tüm hacking tekniklerini **DÜZENLEMEK** böylece daha **ERİŞİLEBİLİR** hale getirmek
|
||||
> - HackTricks ekibi içeriği **sadece düzenlemek** için binlerce saati ücretsiz adadı ki insanlar **daha hızlı öğrenebilsin**
|
||||
> - Topluluğun yayınladığı harika **hacking** tekniklerini depolayıp **ORİJİNAL** **YAZARLARA** tüm **krediyi** vermek.
|
||||
> - **Başkalarının kredilerini almak istemiyoruz**, sadece harika numaraları herkes için depolamak istiyoruz.
|
||||
> - HackTricks'te ayrıca **kendi araştırmalarımızı** da yazıyoruz.
|
||||
> - Bazı durumlarda tekniklerin önemli kısımlarının **HackTricks'te bir özetini** yazacağız ve daha fazla detay için **okuyucuyu orijinal gönderiyi ziyaret etmeye teşvik edeceğiz**.
|
||||
> - Kitaptaki tüm **hacking** tekniklerini **DÜZENLEYEREK** daha **ERİŞİLEBİLİR** hale getirmek.
|
||||
> - HackTricks ekibi, insanların **daha hızlı öğrenebilmesi** için içeriği sadece düzenlemek amacıyla ücretsiz olarak binlerce saat harcadı.
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -23,17 +23,17 @@
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Bu kaynaklar için çok teşekkür ederim, size nasıl teşekkür edebilirim?**
|
||||
> - **Bu kaynaklar için çok teşekkürler, size nasıl teşekkür edebilirim?**
|
||||
|
||||
Kamuya açık olarak bu kaynakları bir araya getiren HackTricks ekibine bir tweet'te [**@hacktricks_live**](https://twitter.com/hacktricks_live) etiketleyerek teşekkür edebilirsiniz.\
|
||||
Eğer özellikle minnettar iseniz ayrıca [**proje için burada sponsor olabilirsiniz**](https://github.com/sponsors/carlospolop).\
|
||||
Ve Github projelerine **yıldız vermeyi unutmayın!** (Bağlantıları aşağıda bulabilirsiniz).
|
||||
Bu kaynakları bir araya getiren HackTricks ekibine herkese açık bir tweet ile [**@hacktricks_live**](https://twitter.com/hacktricks_live) etiketleyerek kamuya teşekkür edebilirsiniz.\
|
||||
Eğer özellikle minnettar iseniz [**proje için buradan sponsor olabilirsiniz**](https://github.com/sponsors/carlospolop).\
|
||||
Ve Github projelerine **yıldız vermeyi unutmayın!** (Linkleri aşağıda bulun.)
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Projeye nasıl katkıda bulunabilirim?**
|
||||
|
||||
Toplulukla **yeni ipuçları ve püf noktaları paylaşabilir veya** kitaplarda bulduğunuz hataları düzelterek ilgili Github sayfalarına bir **Pull Request** gönderebilirsiniz:
|
||||
Kitaplarda bulduğunuz hataları düzeltmek veya toplulukla **yeni ipuçları ve numaralar paylaşmak** için ilgili Github sayfalarına bir **Pull Request** gönderebilirsiniz:
|
||||
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
@ -44,14 +44,14 @@ Github projelerine **yıldız vermeyi unutmayın!**
|
||||
>
|
||||
> - **HackTricks'ten bazı içerikleri kopyalayıp bloguma koyabilir miyim?**
|
||||
|
||||
Evet, koyabilirsiniz; ancak içeriğin alındığı **belirli link(leri)** belirtmeyi unutmayın.
|
||||
Evet, yapabilirsiniz, fakat içeriğin alındığı **belirli link(leri) belirtmeyi unutmayın**.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **HackTricks'ten bir sayfayı nasıl kaynak gösterebilirim?**
|
||||
> - **HackTricks sayfasına nasıl referans verebilirim?**
|
||||
|
||||
Bilgiyi aldığınız sayfanın link(lerinin) görünmesi yeterlidir.\
|
||||
Bibtex'e ihtiyacınız varsa şu şekilde kullanabilirsiniz:
|
||||
Bilgiyi aldığınız sayfanın linki göründüğü sürece yeterlidir.\
|
||||
Eğer bir bibtex'e ihtiyacınız varsa şöyle bir şey kullanabilirsiniz:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -62,82 +62,84 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **HackTricks'in tüm içeriğini kendi bloguma kopyalayabilir miyim?**
|
||||
> - **Can I copy all HackTricks in my blog?**
|
||||
|
||||
**Tercih etmem**. Bu **kimseye fayda sağlamaz** çünkü tüm **içerik zaten resmi HackTricks kitaplarında ücretsiz olarak** kamuya açıktır.
|
||||
**Bunu yapmanızı tercih etmem**. Bu **kimseye fayda sağlamayacak** çünkü tüm **içerik zaten resmi HackTricks kitaplarında ücretsiz** olarak mevcut.
|
||||
|
||||
Kaybolacağından korkuyorsanız, Github'da fork'layın veya indirin; dediğim gibi zaten ücretsiz.
|
||||
Eğer kaybolacağından endişe ediyorsanız, Github'da forklayın ya da indirin; dediğim gibi zaten ücretsiz.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Neden sponsorlarınız var? HackTricks kitapları ticari amaçlı mı?**
|
||||
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||
|
||||
İlk **HackTricks** **değeri**, dünyaya **ÜCRETSİZ** hacking eğitim kaynakları sunmaktır. HackTricks ekibi bu içeriği sunmak için **binlerce saat** ayırdı, tekrar belirtmek gerekirse, **ÜCRETSİZ**.
|
||||
İlk **HackTricks** **değeri**, tüm dünyaya **ÜCRETSİZ** hacking eğitim kaynakları sunmaktır. HackTricks ekibi bu içeriği sunmak için **binlerce saat** adadı, tekrar söylüyorum, **ÜCRETSİZ**.
|
||||
|
||||
HackTricks kitaplarının **ticari amaçlı** olduğunu düşünüyorsanız **TAMAMEN YANILIYORSUNUZ**.
|
||||
Eğer HackTricks kitaplarının **ticari amaçlı** olduğunu düşünüyorsanız **TAMAMEN YANILIYORSUNUZ**.
|
||||
|
||||
Sponsorlarımızın olmasının nedeni, tüm içerik ÜCRETSİZ olsa bile, topluluğa **çalışmamızı takdir etme imkanı** sunmak istememizdir. Bu nedenle insanlara HackTricks'e bağış yapma seçeneği sunuyoruz via [**Github sponsors**](https://github.com/sponsors/carlospolop) ve **ilgili siber güvenlik şirketleri** HackTricks'e sponsor olabiliyor ve kitapta **bazı reklamlar** yer alabiliyor; bu **reklamlar** her zaman görünür yerlere yerleştirilir ancak birinin içeriğe odaklanmasını **engellemez**.
|
||||
Sponsorlarımızın olmasının sebebi, tüm içerik ÜCRETSİZ olsa bile topluluğa emeğimizi takdir etme imkânı sunmak istememizdir. Bu nedenle, insanlara HackTricks'e [**Github sponsors**](https://github.com/sponsors/carlospolop) aracılığıyla bağış yapma seçeneği sunuyoruz ve ilgili siber güvenlik şirketleri HackTricks'e sponsor olabiliyor ve kitapta bazı reklamlar yer alabiliyor; bu **reklamlar** her zaman görünür ama içeriğe odaklanıldığında öğrenme sürecini **rahatsız etmeyecek** yerlerde konumlandırılır.
|
||||
|
||||
HackTricks'i, içeriği HackTricks'ten çok daha az olan diğer bloglardaki rahatsız edici reklamlara doldurulmuş halde bulamazsınız; çünkü HackTricks ticari amaçla yapılmamıştır.
|
||||
HackTricks'i, HackTricks'ten çok daha az içeriğe sahip diğer bloglar gibi rahatsız edici reklamlarla doldurulmuş halde bulamazsınız; çünkü HackTricks ticari amaçlı yapılmadı.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **HackTricks sayfası benim blog yazıma dayanıyor ama referans verilmemişse ne yapmalıyım?**
|
||||
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||
|
||||
**Çok üzgünüz. Bu olmamalıydı**. Lütfen bize Github issues, Twitter, Discord... üzerinden ilgili HackTricks sayfasının linkini ve blogunuzun linkini bildirin, **inceleyip en kısa sürede ekleyeceğiz**.
|
||||
**Çok özür dileriz. Bu olmamalıydı**. Lütfen Github issues, Twitter, Discord... üzerinden bize ilgili HackTricks sayfasının linkini ve blogunuzun linkini bildirin, **kontrol edip en kısa sürede ekleyeceğiz**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Blogumun içeriği HackTricks'te varsa ve orada olmasını istemiyorsam ne yapmalıyım?**
|
||||
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
|
||||
|
||||
HackTricks'te sayfanıza verilen linklerin olduğunu unutmayın:
|
||||
HackTricks'te sayfanıza verilen linklerin:
|
||||
|
||||
- SEO'nuzu **iyileştirir**
|
||||
- İçerik **15'ten fazla dile** çevrilebilir, böylece daha fazla insan bu içeriğe erişebilir
|
||||
- **HackTricks**, insanların **sayfanızı incelemesini teşvik eder** (bazı kişiler bize, sayfalarının HackTricks'te yer almasından bu yana daha fazla ziyaret aldıklarını bildirdi)
|
||||
- SEO'nuzu **iyileştirdiğini**
|
||||
- İçeriğin **15'ten fazla dile** çevrildiğini ve böylece daha fazla kişinin bu içeriğe erişmesinin mümkün olduğunu
|
||||
- **HackTricks'in** insanları sayfanızı **kontrol etmeye teşvik ettiğini** (bazı kişiler bize, sayfaları HackTricks'te yer aldıktan sonra daha fazla ziyaret aldıklarını bildirdi)
|
||||
|
||||
Ancak hâlâ blogunuzun içeriğinin HackTricks'ten kaldırılmasını istiyorsanız, bize bildirin; blogunuza ait tüm linkleri ve ondan türetilmiş içeriği kesinlikle **kaldıracağız**.
|
||||
lütfen unutmayın.
|
||||
|
||||
Yine de blogunuzun içeriğinin HackTricks'ten kaldırılmasını istiyorsanız bize bildirin; blogunuza yapılan tüm linkleri ve ondan türetilen tüm içeriği kesinlikle **kaldıracağız**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **HackTricks'te kopyala-yapıştır içerik bulursam ne yapmalıyım?**
|
||||
> - **What should I do if I find copy-pasted content in HackTricks?**
|
||||
|
||||
Her zaman **orijinal yazarlara tüm krediyi veriyoruz**. Eğer orijinal kaynak referans verilmeden kopyala-yapıştır yapılmış bir sayfa bulursanız, bize bildirin; ya **kaldıracağız**, ya **metinden önce link ekleyeceğiz**, ya da **link ekleyerek yeniden yazacağız**.
|
||||
Her zaman **orijinal yazarlara tüm krediyi veririz**. Eğer orijinal kaynak belirtilmeden kopyala-yapıştır içerik içeren bir sayfa bulursanız, bize bildirin; içeriği ya **kaldıracağız**, ya **metinden önce linki ekleyeceğiz**, ya da **linki ekleyerek yeniden yazacağız**.
|
||||
|
||||
## LİSANS
|
||||
## LICENSE
|
||||
|
||||
Telif Hakkı © Her hakkı saklıdır, aksi belirtilmedikçe.
|
||||
Copyright © Aksi belirtilmediği sürece tüm hakları saklıdır.
|
||||
|
||||
#### Lisans Özeti:
|
||||
#### License Summary:
|
||||
|
||||
- Atıf: Şunları yapabilirsiniz:
|
||||
- Share — materyali herhangi bir ortamda veya formatta kopyalayın ve yeniden dağıtın.
|
||||
- Adapt — materyali yeniden düzenleyin, dönüştürün ve üzerine inşa edin.
|
||||
- Attribution: You are free to:
|
||||
- Share — copy and redistribute the material in any medium or format.
|
||||
- Adapt — remix, transform, and build upon the material.
|
||||
|
||||
#### Ek Şartlar:
|
||||
#### Additional Terms:
|
||||
|
||||
- Üçüncü Taraf İçeriği: Bu blog/kitabın bazı bölümleri, diğer bloglardan veya yayınlardan alıntılar gibi başka kaynaklardan içerik içerebilir. Bu tür içeriğin kullanımı adil kullanım ilkeleri kapsamında veya ilgili telif hakkı sahiplerinden açık izin alınarak yapılmıştır. Üçüncü taraf içeriğe ilişkin spesifik lisans bilgileri için lütfen orijinal kaynaklara başvurun.
|
||||
- Yazarlık: HackTricks tarafından oluşturulan orijinal içerik bu lisansın şartlarına tabidir. Bu çalışmayı paylaşırken veya uyarlarken yazara atıf yapmanız teşvik edilir.
|
||||
- Third-Party Content: Bu blog/kitabın bazı bölümleri, diğer bloglardan veya yayınlardan alınmış alıntılar gibi üçüncü taraf içerikler içerebilir. Bu tür içeriklerin kullanımı adil kullanım ilkelerine göre veya ilgili telif hakkı sahiplerinden alınmış açık izinlerle yapılmaktadır. Üçüncü taraf içeriklerle ilgili özel lisans bilgileri için lütfen orijinal kaynaklara başvurun.
|
||||
- Authorship: HackTricks tarafından oluşturulan orijinal içerik bu lisansın koşullarına tabidir. Bu eseri paylaşırken veya uyarlarken yazara atıfta bulunmanız teşvik edilir.
|
||||
|
||||
#### Muafiyetler:
|
||||
#### Exemptions:
|
||||
|
||||
- Ticari Kullanım: Bu içeriğin ticari kullanımı ile ilgili sorular için lütfen benimle iletişime geçin.
|
||||
- Commercial Use: Bu içeriğin ticari kullanımı ile ilgili sorular için lütfen benimle iletişime geçin.
|
||||
|
||||
Bu lisans, içerikle ilgili herhangi bir ticari marka veya markalama hakkı vermez. Bu blog/kitapta yer alan tüm ticari markalar ve markalama, ilgili sahiplerinin mülkiyetindedir.
|
||||
Bu lisans, içerikle ilgili herhangi bir ticari marka veya markalama hakkı vermez. Bu blog/kitapta yer alan tüm ticari markalar ve markalamalar ilgili sahiplerinin mülkiyetindedir.
|
||||
|
||||
**HackTricks'e erişerek veya HackTricks'i kullanarak, bu lisansın şartlarına uymayı kabul etmiş olursunuz. Bu şartları kabul etmiyorsanız, lütfen bu web sitesine erişmeyin.**
|
||||
|
||||
## **Feragatname**
|
||||
## **Sorumluluk Reddi**
|
||||
|
||||
> [!CAUTION]
|
||||
> Bu kitap, 'HackTricks', yalnızca eğitim ve bilgilendirme amaçlıdır. Bu kitaptaki içerik "olduğu gibi" sağlanmakta olup, yazarlar ve yayıncılar içerikteki bilgilerin, ürünlerin, hizmetlerin veya ilgili grafiklerin eksiksizliği, doğruluğu, güvenilirliği, uygunluğu veya erişilebilirliği konusunda açık veya zımni herhangi bir beyan veya garanti vermezler. Bu tür bilgilere duyduğunuz güven tamamen sizin sorumluluğunuzdadır.
|
||||
> Bu kitap, 'HackTricks', yalnızca eğitimsel ve bilgilendirme amaçlıdır. Bu kitap içindeki içerik "olduğu gibi" sağlanmaktadır ve yazarlar ile yayıncılar, burada yer alan bilgilerin, ürünlerin, hizmetlerin veya ilişkili grafiklerin eksiksizliği, doğruluğu, güvenilirliği, uygunluğu veya kullanılabilirliği konusunda açık ya da zımni hiçbir beyan veya garanti vermezler. Bu tür bilgilere dayanmanız tamamen kendi sorumluluğunuzdadır.
|
||||
>
|
||||
> Yazarlar ve yayıncılar, hiçbir durumda veri veya kar kaybı dâhil ancak bunlarla sınırlı olmamak üzere dolaylı veya sonuçsal zararlar da dâhil olmak üzere herhangi bir zarar veya kayıp için sorumlu tutulamaz.
|
||||
> Yazarlar ve yayıncılar, bu kitabın kullanımıyla bağlantılı olarak ortaya çıkabilecek veri veya kâr kaybı da dahil olmak üzere dolaylı veya sonuçsal zararlar da dahil hiçbir durumda sorumlu tutulamazlar.
|
||||
>
|
||||
> Ayrıca, bu kitapta açıklanan teknikler ve ipuçları yalnızca eğitim ve bilgilendirme amaçlıdır ve herhangi bir yasadışı veya kötü amaçlı etkinlik için kullanılmamalıdır. Yazarlar ve yayıncılar herhangi bir yasa dışı veya etik olmayan etkinliği onaylamaz veya desteklemez; bu kitaptaki bilgilerin kullanımı kullanıcının kendi riski ve takdirindedir.
|
||||
> Ayrıca, bu kitapta açıklanan teknikler ve ipuçları sadece eğitim ve bilgilendirme amaçlıdır ve hiçbir şekilde yasa dışı veya kötü niyetli faaliyetler için kullanılmamalıdır. Yazarlar ve yayıncılar herhangi bir yasa dışı veya etik dışı faaliyeti desteklemez veya teşvik etmez; bu kitaptaki bilgilerin kullanımı kullanıcının kendi riski ve takdirindedir.
|
||||
>
|
||||
> Kullanıcı, bu kitapta yer alan bilgilere dayanarak yapılan herhangi bir eylemden münhasıran sorumludur ve burada açıklanan teknikleri veya ipuçlarını uygulamaya çalışırken her zaman profesyonel tavsiye ve yardım almalıdır.
|
||||
> Kullanıcı, bu kitaptaki bilgilere dayanarak alınan herhangi bir işlemden münhasıran sorumludur ve burada açıklanan teknikleri veya ipuçlarını uygulamaya çalışmadan önce her zaman profesyonel tavsiye ve yardım aramalıdır.
|
||||
>
|
||||
> Bu kitabı kullanarak, kullanıcı yazarları ve yayıncıları bu kitabın veya içeriğindeki bilgilerin kullanımı sonucunda meydana gelebilecek herhangi bir zarar, kayıp veya zarardan dolayı tüm sorumluluk ve yükümlülükten feragat etmeyi kabul etmiş olur.
|
||||
> Bu kitabı kullanarak, kullanıcı yazarları ve yayıncıları bu kitabın veya içindeki bilgilerin kullanımı sonucunda meydana gelebilecek herhangi bir zarar, kayıp veya zarardan feragat etmeyi kabul eder.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -6,34 +6,63 @@
|
||||
*/
|
||||
|
||||
(() => {
|
||||
"use strict";
|
||||
"use strict";
|
||||
|
||||
/* ───────────── 0. helpers (main thread) ───────────── */
|
||||
const clear = el => { while (el.firstChild) el.removeChild(el.firstChild); };
|
||||
|
||||
/* ───────────── 1. Web‑Worker code ─────────────────── */
|
||||
const workerCode = `
|
||||
self.window = self;
|
||||
self.search = self.search || {};
|
||||
const abs = p => location.origin + p;
|
||||
|
||||
/* 1 — elasticlunr */
|
||||
try { importScripts('https://cdn.jsdelivr.net/npm/elasticlunr@0.9.5/elasticlunr.min.js'); }
|
||||
catch { importScripts(abs('/elasticlunr.min.js')); }
|
||||
|
||||
/* 2 — decompress gzip data */
|
||||
async function decompressGzip(arrayBuffer){
|
||||
if(typeof DecompressionStream !== 'undefined'){
|
||||
/* Modern browsers: use native DecompressionStream */
|
||||
const stream = new Response(arrayBuffer).body.pipeThrough(new DecompressionStream('gzip'));
|
||||
const decompressed = await new Response(stream).arrayBuffer();
|
||||
return new TextDecoder().decode(decompressed);
|
||||
} else {
|
||||
/* Fallback: use pako library */
|
||||
if(typeof pako === 'undefined'){
|
||||
try { importScripts('https://cdn.jsdelivr.net/npm/pako@2.1.0/dist/pako.min.js'); }
|
||||
catch(e){ throw new Error('pako library required for decompression: '+e); }
|
||||
}
|
||||
const uint8Array = new Uint8Array(arrayBuffer);
|
||||
const decompressed = pako.ungzip(uint8Array, {to: 'string'});
|
||||
return decompressed;
|
||||
}
|
||||
}
|
||||
|
||||
/* ───────────── 0. helpers (main thread) ───────────── */
|
||||
const clear = el => { while (el.firstChild) el.removeChild(el.firstChild); };
|
||||
|
||||
/* ───────────── 1. Web‑Worker code ─────────────────── */
|
||||
const workerCode = `
|
||||
self.window = self;
|
||||
self.search = self.search || {};
|
||||
const abs = p => location.origin + p;
|
||||
|
||||
/* 1 — elasticlunr */
|
||||
try { importScripts('https://cdn.jsdelivr.net/npm/elasticlunr@0.9.5/elasticlunr.min.js'); }
|
||||
catch { importScripts(abs('/elasticlunr.min.js')); }
|
||||
|
||||
/* 2 — load a single index (remote → local) */
|
||||
/* 3 — load a single index (remote → local) */
|
||||
async function loadIndex(remote, local, isCloud=false){
|
||||
let rawLoaded = false;
|
||||
if(remote){
|
||||
/* Try ONLY compressed version from GitHub (remote already includes .js.gz) */
|
||||
try {
|
||||
const r = await fetch(remote,{mode:'cors'});
|
||||
if (!r.ok) throw new Error('HTTP '+r.status);
|
||||
importScripts(URL.createObjectURL(new Blob([await r.text()],{type:'application/javascript'})));
|
||||
rawLoaded = true;
|
||||
} catch(e){ console.warn('remote',remote,'failed →',e); }
|
||||
if (r.ok) {
|
||||
const compressed = await r.arrayBuffer();
|
||||
const text = await decompressGzip(compressed);
|
||||
importScripts(URL.createObjectURL(new Blob([text],{type:'application/javascript'})));
|
||||
rawLoaded = true;
|
||||
console.log('Loaded compressed from GitHub:',remote);
|
||||
}
|
||||
} catch(e){ console.warn('compressed GitHub',remote,'failed →',e); }
|
||||
}
|
||||
/* If remote (GitHub) failed, fall back to local uncompressed file */
|
||||
if(!rawLoaded && local){
|
||||
try { importScripts(abs(local)); rawLoaded = true; }
|
||||
try {
|
||||
importScripts(abs(local));
|
||||
rawLoaded = true;
|
||||
console.log('Loaded local fallback:',local);
|
||||
}
|
||||
catch(e){ console.error('local',local,'failed →',e); }
|
||||
}
|
||||
if(!rawLoaded) return null; /* give up on this index */
|
||||
@ -61,151 +90,159 @@
|
||||
|
||||
return local ? loadIndex(null, local, isCloud) : null;
|
||||
}
|
||||
|
||||
let built = [];
|
||||
const MAX = 30, opts = {bool:'AND', expand:true};
|
||||
|
||||
self.onmessage = async ({data}) => {
|
||||
if(data.type === 'init'){
|
||||
const lang = data.lang || 'en';
|
||||
const searchindexBase = 'https://raw.githubusercontent.com/HackTricks-wiki/hacktricks-searchindex/master';
|
||||
|
||||
(async () => {
|
||||
const htmlLang = (document.documentElement.lang || 'en').toLowerCase();
|
||||
const lang = htmlLang.split('-')[0];
|
||||
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
||||
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
|
||||
/* Remote sources are .js.gz (compressed), local fallback is .js (uncompressed) */
|
||||
const mainFilenames = Array.from(new Set(['searchindex-' + lang + '.js.gz', 'searchindex-en.js.gz']));
|
||||
const cloudFilenames = Array.from(new Set(['searchindex-cloud-' + lang + '.js.gz', 'searchindex-cloud-en.js.gz']));
|
||||
|
||||
const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||
const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||
const MAIN_REMOTE_SOURCES = mainFilenames.map(function(filename) { return searchindexBase + '/' + filename; });
|
||||
const CLOUD_REMOTE_SOURCES = cloudFilenames.map(function(filename) { return searchindexBase + '/' + filename; });
|
||||
|
||||
const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
|
||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
|
||||
|
||||
const indices = [];
|
||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
|
||||
const cloud= await loadWithFallback(CLOUD_REMOTE_SOURCES, '/searchindex-cloud.js', true ); if(cloud) indices.push(cloud);
|
||||
|
||||
if(!indices.length){ postMessage({ready:false, error:'no-index'}); return; }
|
||||
|
||||
/* build index objects */
|
||||
const built = indices.map(d => ({
|
||||
idx : elasticlunr.Index.load(d.json),
|
||||
urls: d.urls,
|
||||
cloud: d.cloud,
|
||||
base: d.cloud ? 'https://cloud.hacktricks.wiki/' : ''
|
||||
}));
|
||||
|
||||
postMessage({ready:true});
|
||||
const MAX = 30, opts = {bool:'AND', expand:true};
|
||||
|
||||
self.onmessage = ({data:q}) => {
|
||||
if(!q){ postMessage([]); return; }
|
||||
|
||||
const all = [];
|
||||
for(const s of built){
|
||||
const res = s.idx.search(q,opts);
|
||||
if(!res.length) continue;
|
||||
const max = res[0].score || 1;
|
||||
res.forEach(r => {
|
||||
const doc = s.idx.documentStore.getDoc(r.ref);
|
||||
all.push({
|
||||
norm : r.score / max,
|
||||
title: doc.title,
|
||||
body : doc.body,
|
||||
breadcrumbs: doc.breadcrumbs,
|
||||
url : s.base + s.urls[r.ref],
|
||||
cloud: s.cloud
|
||||
const indices = [];
|
||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex-book.js', false); if(main) indices.push(main);
|
||||
const cloud= await loadWithFallback(CLOUD_REMOTE_SOURCES, '/searchindex.js', true ); if(cloud) indices.push(cloud);
|
||||
if(!indices.length){ postMessage({ready:false, error:'no-index'}); return; }
|
||||
|
||||
/* build index objects */
|
||||
built = indices.map(d => ({
|
||||
idx : elasticlunr.Index.load(d.json),
|
||||
urls: d.urls,
|
||||
cloud: d.cloud,
|
||||
base: d.cloud ? 'https://cloud.hacktricks.wiki/' : ''
|
||||
}));
|
||||
|
||||
postMessage({ready:true});
|
||||
return;
|
||||
}
|
||||
|
||||
const q = data.query || data;
|
||||
if(!q){ postMessage([]); return; }
|
||||
|
||||
const all = [];
|
||||
for(const s of built){
|
||||
const res = s.idx.search(q,opts);
|
||||
if(!res.length) continue;
|
||||
const max = res[0].score || 1;
|
||||
res.forEach(r => {
|
||||
const doc = s.idx.documentStore.getDoc(r.ref);
|
||||
all.push({
|
||||
norm : r.score / max,
|
||||
title: doc.title,
|
||||
body : doc.body,
|
||||
breadcrumbs: doc.breadcrumbs,
|
||||
url : s.base + s.urls[r.ref],
|
||||
cloud: s.cloud
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
all.sort((a,b)=>b.norm-a.norm);
|
||||
postMessage(all.slice(0,MAX));
|
||||
};
|
||||
})();
|
||||
`;
|
||||
}
|
||||
all.sort((a,b)=>b.norm-a.norm);
|
||||
postMessage(all.slice(0,MAX));
|
||||
};
|
||||
`;
|
||||
|
||||
/* ───────────── 2. spawn worker ───────────── */
|
||||
const worker = new Worker(URL.createObjectURL(new Blob([workerCode],{type:'application/javascript'})));
|
||||
|
||||
/* ───────────── 2.1. initialize worker with language ───────────── */
|
||||
const htmlLang = (document.documentElement.lang || 'en').toLowerCase();
|
||||
const lang = htmlLang.split('-')[0];
|
||||
worker.postMessage({type: 'init', lang: lang});
|
||||
|
||||
/* ───────────── 3. DOM refs ─────────────── */
|
||||
const wrap = document.getElementById('search-wrapper');
|
||||
const bar = document.getElementById('searchbar');
|
||||
const list = document.getElementById('searchresults');
|
||||
const listOut = document.getElementById('searchresults-outer');
|
||||
const header = document.getElementById('searchresults-header');
|
||||
const icon = document.getElementById('search-toggle');
|
||||
|
||||
const READY_ICON = icon.innerHTML;
|
||||
icon.textContent = '⏳';
|
||||
icon.setAttribute('aria-label','Loading search …');
|
||||
icon.setAttribute('title','Search is loading, please wait...');
|
||||
|
||||
/* ───────────── 2. spawn worker ───────────── */
|
||||
const worker = new Worker(URL.createObjectURL(new Blob([workerCode],{type:'application/javascript'})));
|
||||
|
||||
/* ───────────── 3. DOM refs ─────────────── */
|
||||
const wrap = document.getElementById('search-wrapper');
|
||||
const bar = document.getElementById('searchbar');
|
||||
const list = document.getElementById('searchresults');
|
||||
const listOut = document.getElementById('searchresults-outer');
|
||||
const header = document.getElementById('searchresults-header');
|
||||
const icon = document.getElementById('search-toggle');
|
||||
|
||||
const READY_ICON = icon.innerHTML;
|
||||
icon.textContent = '⏳';
|
||||
icon.setAttribute('aria-label','Loading search …');
|
||||
icon.setAttribute('title','Search is loading, please wait...');
|
||||
|
||||
const HOT=83, ESC=27, DOWN=40, UP=38, ENTER=13;
|
||||
let debounce, teaserCount=0;
|
||||
|
||||
/* ───────────── helpers (teaser, metric) ───────────── */
|
||||
const escapeHTML = (()=>{const M={'&':'&','<':'<','>':'>','"':'"','\'':'''};return s=>s.replace(/[&<>'"]/g,c=>M[c]);})();
|
||||
const URL_MARK='highlight';
|
||||
function metric(c,t){return c?`${c} search result${c>1?'s':''} for '${t}':`:`No search results for '${t}'.`;}
|
||||
|
||||
function makeTeaser(body,terms){
|
||||
const stem=w=>elasticlunr.stemmer(w.toLowerCase());
|
||||
const T=terms.map(stem),W_S=40,W_F=8,W_N=2,WIN=30;
|
||||
const W=[],sents=body.toLowerCase().split('. ');
|
||||
let i=0,v=W_F,found=false;
|
||||
sents.forEach(s=>{v=W_F; s.split(' ').forEach(w=>{ if(w){ if(T.some(t=>stem(w).startsWith(t))){v=W_S;found=true;} W.push([w,v,i]); v=W_N;} i+=w.length+1; }); i++;});
|
||||
if(!W.length) return body;
|
||||
const win=Math.min(W.length,WIN);
|
||||
const sums=[W.slice(0,win).reduce((a,[,wt])=>a+wt,0)];
|
||||
for(let k=1;k<=W.length-win;k++) sums[k]=sums[k-1]-W[k-1][1]+W[k+win-1][1];
|
||||
const best=found?sums.lastIndexOf(Math.max(...sums)):0;
|
||||
const out=[]; i=W[best][2];
|
||||
for(let k=best;k<best+win;k++){const [w,wt,pos]=W[k]; if(i<pos){out.push(body.substring(i,pos)); i=pos;} if(wt===W_S) out.push('<em>'); out.push(body.substr(pos,w.length)); if(wt===W_S) out.push('</em>'); i=pos+w.length;}
|
||||
return out.join('');
|
||||
}
|
||||
|
||||
function format(d,terms){
|
||||
const teaser=makeTeaser(escapeHTML(d.body),terms);
|
||||
teaserCount++;
|
||||
const enc=encodeURIComponent(terms.join(' ')).replace(/'/g,'%27');
|
||||
const parts=d.url.split('#'); if(parts.length===1) parts.push('');
|
||||
const abs=d.url.startsWith('http');
|
||||
const href=`${abs?'':path_to_root}${parts[0]}?${URL_MARK}=${enc}#${parts[1]}`;
|
||||
const style=d.cloud?" style=\"color:#1e88e5\"":"";
|
||||
const isCloud=d.cloud?" [Cloud]":" [Book]";
|
||||
return `<a href="${href}" aria-details="teaser_${teaserCount}"${style}>`+
|
||||
`${d.breadcrumbs}${isCloud}<span class="teaser" id="teaser_${teaserCount}" aria-label="Search Result Teaser">${teaser}</span></a>`;
|
||||
}
|
||||
|
||||
/* ───────────── UI control ───────────── */
|
||||
function showUI(s){wrap.classList.toggle('hidden',!s); icon.setAttribute('aria-expanded',s); if(s){window.scrollTo(0,0); bar.focus(); bar.select();} else {listOut.classList.add('hidden'); [...list.children].forEach(li=>li.classList.remove('focus'));}}
|
||||
function blur(){const t=document.createElement('input'); t.style.cssText='position:absolute;opacity:0;'; icon.appendChild(t); t.focus(); t.remove();}
|
||||
|
||||
icon.addEventListener('click',()=>showUI(wrap.classList.contains('hidden')));
|
||||
|
||||
document.addEventListener('keydown',e=>{
|
||||
if(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey) return;
|
||||
const f=/^(?:input|select|textarea)$/i.test(e.target.nodeName);
|
||||
if(e.keyCode===HOT && !f){e.preventDefault(); showUI(true);} else if(e.keyCode===ESC){e.preventDefault(); showUI(false); blur();}
|
||||
else if(e.keyCode===DOWN && document.activeElement===bar){e.preventDefault(); const first=list.firstElementChild; if(first){blur(); first.classList.add('focus');}}
|
||||
else if([DOWN,UP,ENTER].includes(e.keyCode) && document.activeElement!==bar){const cur=list.querySelector('li.focus'); if(!cur) return; e.preventDefault(); if(e.keyCode===DOWN){const nxt=cur.nextElementSibling; if(nxt){cur.classList.remove('focus'); nxt.classList.add('focus');}} else if(e.keyCode===UP){const prv=cur.previousElementSibling; cur.classList.remove('focus'); if(prv){prv.classList.add('focus');} else {bar.focus();}} else {const a=cur.querySelector('a'); if(a) window.location.assign(a.href);}}
|
||||
});
|
||||
|
||||
bar.addEventListener('input',e=>{ clearTimeout(debounce); debounce=setTimeout(()=>worker.postMessage(e.target.value.trim()),120); });
|
||||
|
||||
/* ───────────── worker messages ───────────── */
|
||||
worker.onmessage = ({data}) => {
|
||||
if(data && data.ready!==undefined){
|
||||
if(data.ready){
|
||||
icon.innerHTML=READY_ICON;
|
||||
icon.setAttribute('aria-label','Open search (S)');
|
||||
icon.removeAttribute('title');
|
||||
}
|
||||
else {
|
||||
icon.textContent='❌';
|
||||
icon.setAttribute('aria-label','Search unavailable');
|
||||
icon.setAttribute('title','Search is unavailable');
|
||||
}
|
||||
return;
|
||||
|
||||
const HOT=83, ESC=27, DOWN=40, UP=38, ENTER=13;
|
||||
let debounce, teaserCount=0;
|
||||
|
||||
/* ───────────── helpers (teaser, metric) ───────────── */
|
||||
const escapeHTML = (()=>{const M={'&':'&','<':'<','>':'>','"':'"','\'':'''};return s=>s.replace(/[&<>'"]/g,c=>M[c]);})();
|
||||
const URL_MARK='highlight';
|
||||
function metric(c,t){return c?`${c} search result${c>1?'s':''} for '${t}':`:`No search results for '${t}'.`;}
|
||||
|
||||
function makeTeaser(body,terms){
|
||||
const stem=w=>elasticlunr.stemmer(w.toLowerCase());
|
||||
const T=terms.map(stem),W_S=40,W_F=8,W_N=2,WIN=30;
|
||||
const W=[],sents=body.toLowerCase().split('. ');
|
||||
let i=0,v=W_F,found=false;
|
||||
sents.forEach(s=>{v=W_F; s.split(' ').forEach(w=>{ if(w){ if(T.some(t=>stem(w).startsWith(t))){v=W_S;found=true;} W.push([w,v,i]); v=W_N;} i+=w.length+1; }); i++;});
|
||||
if(!W.length) return body;
|
||||
const win=Math.min(W.length,WIN);
|
||||
const sums=[W.slice(0,win).reduce((a,[,wt])=>a+wt,0)];
|
||||
for(let k=1;k<=W.length-win;k++) sums[k]=sums[k-1]-W[k-1][1]+W[k+win-1][1];
|
||||
const best=found?sums.lastIndexOf(Math.max(...sums)):0;
|
||||
const out=[]; i=W[best][2];
|
||||
for(let k=best;k<best+win;k++){const [w,wt,pos]=W[k]; if(i<pos){out.push(body.substring(i,pos)); i=pos;} if(wt===W_S) out.push('<em>'); out.push(body.substr(pos,w.length)); if(wt===W_S) out.push('</em>'); i=pos+w.length;}
|
||||
return out.join('');
|
||||
}
|
||||
const docs=data, q=bar.value.trim(), terms=q.split(/\s+/).filter(Boolean);
|
||||
header.textContent=metric(docs.length,q);
|
||||
clear(list);
|
||||
docs.forEach(d=>{const li=document.createElement('li'); li.innerHTML=format(d,terms); list.appendChild(li);});
|
||||
listOut.classList.toggle('hidden',!docs.length);
|
||||
};
|
||||
})();
|
||||
|
||||
|
||||
function format(d,terms){
|
||||
const teaser=makeTeaser(escapeHTML(d.body),terms);
|
||||
teaserCount++;
|
||||
const enc=encodeURIComponent(terms.join(' ')).replace(/'/g,'%27');
|
||||
const parts=d.url.split('#'); if(parts.length===1) parts.push('');
|
||||
const abs=d.url.startsWith('http');
|
||||
const href=`${abs?'':path_to_root}${parts[0]}?${URL_MARK}=${enc}#${parts[1]}`;
|
||||
const style=d.cloud?" style=\"color:#1e88e5\"":"";
|
||||
const isCloud=d.cloud?" [Cloud]":" [Book]";
|
||||
return `<a href="${href}" aria-details="teaser_${teaserCount}"${style}>`+
|
||||
`${d.breadcrumbs}${isCloud}<span class="teaser" id="teaser_${teaserCount}" aria-label="Search Result Teaser">${teaser}</span></a>`;
|
||||
}
|
||||
|
||||
/* ───────────── UI control ───────────── */
|
||||
function showUI(s){wrap.classList.toggle('hidden',!s); icon.setAttribute('aria-expanded',s); if(s){window.scrollTo(0,0); bar.focus(); bar.select();} else {listOut.classList.add('hidden'); [...list.children].forEach(li=>li.classList.remove('focus'));}}
|
||||
function blur(){const t=document.createElement('input'); t.style.cssText='position:absolute;opacity:0;'; icon.appendChild(t); t.focus(); t.remove();}
|
||||
|
||||
icon.addEventListener('click',()=>showUI(wrap.classList.contains('hidden')));
|
||||
|
||||
document.addEventListener('keydown',e=>{
|
||||
if(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey) return;
|
||||
const f=/^(?:input|select|textarea)$/i.test(e.target.nodeName);
|
||||
if(e.keyCode===HOT && !f){e.preventDefault(); showUI(true);} else if(e.keyCode===ESC){e.preventDefault(); showUI(false); blur();}
|
||||
else if(e.keyCode===DOWN && document.activeElement===bar){e.preventDefault(); const first=list.firstElementChild; if(first){blur(); first.classList.add('focus');}}
|
||||
else if([DOWN,UP,ENTER].includes(e.keyCode) && document.activeElement!==bar){const cur=list.querySelector('li.focus'); if(!cur) return; e.preventDefault(); if(e.keyCode===DOWN){const nxt=cur.nextElementSibling; if(nxt){cur.classList.remove('focus'); nxt.classList.add('focus');}} else if(e.keyCode===UP){const prv=cur.previousElementSibling; cur.classList.remove('focus'); if(prv){prv.classList.add('focus');} else {bar.focus();}} else {const a=cur.querySelector('a'); if(a) window.location.assign(a.href);}}
|
||||
});
|
||||
|
||||
bar.addEventListener('input',e=>{ clearTimeout(debounce); debounce=setTimeout(()=>worker.postMessage({query: e.target.value.trim()}),120); });
|
||||
|
||||
/* ───────────── worker messages ───────────── */
|
||||
worker.onmessage = ({data}) => {
|
||||
if(data && data.ready!==undefined){
|
||||
if(data.ready){
|
||||
icon.innerHTML=READY_ICON;
|
||||
icon.setAttribute('aria-label','Open search (S)');
|
||||
icon.removeAttribute('title');
|
||||
}
|
||||
else {
|
||||
icon.textContent='❌';
|
||||
icon.setAttribute('aria-label','Search unavailable');
|
||||
icon.setAttribute('title','Search is unavailable');
|
||||
}
|
||||
return;
|
||||
}
|
||||
const docs=data, q=bar.value.trim(), terms=q.split(/\s+/).filter(Boolean);
|
||||
header.textContent=metric(docs.length,q);
|
||||
clear(list);
|
||||
docs.forEach(d=>{const li=document.createElement('li'); li.innerHTML=format(d,terms); list.appendChild(li);});
|
||||
listOut.classList.toggle('hidden',!docs.length);
|
||||
};
|
||||
})();
|
||||
|
Loading…
x
Reference in New Issue
Block a user