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 sr
This commit is contained in:
parent
ad8e14bcda
commit
02f5e79788
@ -1,56 +1,56 @@
|
||||
# HackTricks Vrednosti i FAQ
|
||||
# Vrednosti HackTricks-a & FAQ
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Vrednosti HackTricks
|
||||
## Vrednosti HackTricks-a
|
||||
|
||||
> [!TIP]
|
||||
> Ovo su **vrednosti HackTricks projekta**:
|
||||
>
|
||||
> - Obezbediti **BESPLATAN** pristup **EDUKATIVNIM hacking** resursima celom Internetu.
|
||||
> - Hacking je o učenju, a učenje treba da bude što je moguće besplatnije.
|
||||
> - Svrha ove knjige je da služi kao sveobuhvatan **edukativni resurs**.
|
||||
> - **ČUVATI** sjajne **hacking** tehnike koje zajednica objavljuje, dajući **IZVORNIM** **AUTORIMA** sve **zasluge**.
|
||||
> - Omogućiti **BESPLATAN** pristup **OBRAZOVNIM hacking** resursima celom Internetu.
|
||||
> - Hacking je o učenju, i učenje bi trebalo da bude što slobodnije.
|
||||
> - Svrha ove knjige je da služi kao sveobuhvatan **obrazovni resurs**.
|
||||
> - **ČUVATI** sjajne **hacking** tehnike koje zajednica objavljuje dajući **IZVORNIM** **AUTORIMA** sve **zasluge**.
|
||||
> - **Ne želimo zasluge drugih ljudi**, samo želimo da sačuvamo kul trikove za sve.
|
||||
> - Takođe pišemo **sva naša istraživanja** u HackTricks.
|
||||
> - Takođe pišemo **svoja istraživanja** u HackTricks.
|
||||
> - U nekoliko slučajeva ćemo samo napisati **u HackTricks sažetak važnih delova** tehnike i **podstaći čitaoca da poseti originalni post** za više detalja.
|
||||
> - **ORGANIZOVATI** sve **hacking** tehnike u knjizi tako da budu **PRISTUPAČNIJE**
|
||||
> - Tim HackTricks-a je posvetio hiljade sati besplatno **isključivo za organizovanje sadržaja** kako bi ljudi mogli **učiti brže**
|
||||
> - **ORGANIZOVATI** sve hacking tehnike u knjizi tako da budu **PRISTUPAČNIJE**
|
||||
> - Tim HackTricks-a je posvetio hiljade sati besplatno **samo za organizaciju sadržaja** kako bi ljudi mogli **brže da uče**
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
## HackTricks faq
|
||||
## HackTricks FAQ
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Hvala vam puno na ovim resursima, kako vam mogu zahvaliti?**
|
||||
> - **Hvala vam puno za ove resurse, kako mogu da vam zahvalim?**
|
||||
|
||||
Možete javno zahvaliti HackTricks timu što je sastavio sve ove resurse javnim tvitom u kojem pominjete [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Možete javno zahvaliti HackTricks timu za objavljivanje svih ovih resursa u tweetu pominjući [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Ako ste posebno zahvalni, možete takođe [**sponzorisati projekat ovde**](https://github.com/sponsors/carlospolop).\
|
||||
I ne zaboravite da **stavite zvezdicu na Github projektima!** (Pogledajte linkove ispod).
|
||||
I ne zaboravite da **date zvezdicu u Github projektima!** (Pronađite linkove dole).
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Kako mogu doprineti projektu?**
|
||||
> - **Kako mogu da doprinesem projektu?**
|
||||
|
||||
Možete **podeliti nove savete i trikove sa zajednicom ili otkloniti greške** koje nađete u knjigama slanjem **Pull Request** na odgovarajuće Github stranice:
|
||||
Možete **podeliti nove tips & tricks sa zajednicom ili ispraviti bagove** koje pronađete u knjigama slanjem **Pull Request** na odgovarajuće Github stranice:
|
||||
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
|
||||
Ne zaboravite da **stavite zvezdicu na Github projektima!**
|
||||
Ne zaboravite da **date zvezdicu u Github projektima!**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Mogu li kopirati deo sadržaja iz HackTricks-a i objaviti ga na svom blogu?**
|
||||
> - **Mogu li kopirati neki sadržaj iz HackTricks-a i staviti ga na svoj blog?**
|
||||
|
||||
Da, možete, ali **ne zaboravite da navedete konkretan(e) link(ove)** odakle je sadržaj preuzet.
|
||||
Da, možete, ali **ne zaboravite da navedete konkretan link ili linkove** odakle je sadržaj preuzet.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Kako mogu citirati stranicu HackTricks-a?**
|
||||
> - **Kako mogu da referenciram stranicu HackTricks-a?**
|
||||
|
||||
Ako se pojavi link stranice/stranica odakle ste uzeli informacije, to je dovoljno.\
|
||||
Sve dok je prikazan link stranice/stranica odakle ste preuzeli informacije, to je dovoljno.\
|
||||
Ako vam treba bibtex, možete koristiti nešto poput:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Can I copy all HackTricks in my blog?**
|
||||
> - **Mogu li da kopiram sve HackTricks na svom blogu?**
|
||||
>
|
||||
> **Radije ne.** To **neće koristiti nikome** jer je **sav sadržaj već javno dostupan** u zvaničnim HackTricks knjigama besplatno.
|
||||
> **Radije ne bih.** To **neće koristiti nikome** jer je sav **sadržaj već javno dostupan** u zvaničnim HackTricks knjigama besplatno.
|
||||
>
|
||||
> Ako se plašite da će nestati, jednostavno ga fork-ujte na Github-u ili preuzmite, kao što sam rekao, već je besplatno.
|
||||
>
|
||||
> Ako se plašiš da će nestati, jednostavno ga forkaj na Github-u ili preuzmi — kao što sam rekao, već je besplatno.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||
> - **Zašto imate sponzore? Da li su HackTricks knjige u komercijalne svrhe?**
|
||||
>
|
||||
> Prva HackTricks **vrednost** je da ponudi **BESPLATNE** obrazovne resurse o hakovanju celom svetu. Tim HackTricks-a je **posvetio hiljade sati** da ponudi ovaj sadržaj, ponovo, **BESPLATNO**.
|
||||
> Prva **HackTricks** **vrednost** je da ponudi **BESPLATNE** edukativne resurse o hakovanju za **CEO** svet. HackTricks tim je uložio **hiljade sati** da ponudi ovaj sadržaj, opet, **BESPLATNO**.
|
||||
>
|
||||
> Ako misliš da su HackTricks knjige napravljene u **komercijalne svrhe**, **POTPUNO GRIJEŠIŠ**.
|
||||
> Ako mislite da su HackTricks knjige napravljene u **komercijalne svrhe**, **skroz grešite**.
|
||||
>
|
||||
> Imamo sponzore zato što, čak i ako je sav sadržaj BESPLATAN, želimo da **ponudimo zajednici mogućnost da podrži naš rad** ako to želi. Zbog toga nudimo ljudima opciju da doniraju HackTricks putem [**Github sponsors**](https://github.com/sponsors/carlospolop), a relevantne kompanije iz oblasti cybersecurity-a mogu sponzorisati HackTricks i imati neke reklame u knjizi — reklame su uvek postavljene na mestima gde su **vidljive** ali **ne ometaju proces učenja** ako se neko fokusira na sadržaj.
|
||||
> Imamo sponzore jer, iako je sav sadržaj BESPLATAN, želimo da **ponudimo zajednici mogućnost da ceni naš rad** ako to žele. Stoga nudimo ljudima opciju da doniraju HackTricks putem [**Github sponsors**](https://github.com/sponsors/carlospolop), i **odgovarajuće kompanije iz oblasti sajber bezbednosti** da sponzorišu HackTricks i da **ima nekoliko oglasa** u knjizi pri čemu su **oglasi** uvek postavljeni na mestima gde su **vidljivi** ali **ne ometaju proces učenja** ako se neko fokusira na sadržaj.
|
||||
>
|
||||
> Nećete naći HackTricks prepun dosadnih oglasa kao na drugim blogovima sa mnogo manje sadržaja od HackTricks, jer HackTricks nije napravljen u komercijalne svrhe.
|
||||
>
|
||||
> Nećete naći HackTricks prepun dosadnih reklama kao na drugim blogovima sa mnogo manje sadržaja od HackTricks-a, jer HackTricks nije napravljen u komercijalne svrhe.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||
> - **Šta da uradim ako je neka HackTricks stranica zasnovana na mom blog postu, ali nije referencirana?**
|
||||
>
|
||||
> **Veoma nam je žao. Ovo se ne bi trebalo desiti.** Molimo vas da nas obavestite preko Github issues, Twitter-a, Discord-a... pošaljite link HackTricks stranice sa sadržajem i link vašeg bloga i **proverićemo i dodaćemo to što pre**.
|
||||
>
|
||||
> **Veoma nam je žao. Ovo se ne bi trebalo dogoditi.** Molimo vas da nas obavestite putem Github issues, Twitter, Discord... pošaljite link HackTricks strane sa sadržajem i link vašeg bloga i **proverićemo i dodaćemo izvor što pre**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
|
||||
> - **Šta da uradim ako postoji sadržaj sa mog bloga u HackTricks i ne želim da bude tamo?**
|
||||
>
|
||||
> Imajte u vidu da linkovi ka vašoj strani u HackTricks:
|
||||
> Imajte na umu da postojanje linkova ka vašoj stranici u HackTricks:
|
||||
>
|
||||
> - Poboljšavaju vaš **SEO**
|
||||
> - Sadržaj se **prevodi na više od 15 jezika**, što omogućava većem broju ljudi pristup tom sadržaju
|
||||
> - **HackTricks podstiče** ljude da **posete vašu stranicu** (nekoliko ljudi nam je reklo da su od kada je neka njihova stranica u HackTricks-u, dobili više poseta)
|
||||
> - Poboljšava vaš **SEO**
|
||||
> - Sadržaj se **prevodi na više od 15 jezika**, omogućavajući većem broju ljudi pristup ovom sadržaju
|
||||
> - **HackTricks podstiče** ljude da **provere vašu stranicu** (nekoliko ljudi nam je reklo da otkako je neka njihova stranica u HackTricks dobili su više poseta)
|
||||
>
|
||||
> Međutim, ako i dalje želite da sadržaj vašeg bloga bude uklonjen iz HackTricks, samo nas obavestite i mi ćemo definitivno **ukloniti svaki link ka vašem blogu**, i sav sadržaj zasnovan na njemu.
|
||||
>
|
||||
> Međutim, ako i dalje želite da sadržaj vašeg bloga bude uklonjen iz HackTricks, samo nas obavestite i mi ćemo definitivno **ukloniti svaki link ka vašem blogu**, i sav sadržaj baziran na njemu.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if I find copy-pasted content in HackTricks?**
|
||||
> - **Šta da uradim ako pronađem kopirani sadržaj u HackTricks?**
|
||||
>
|
||||
> Uvek dajemo **originalnim autorima sve zasluge**. Ako pronađete stranicu sa kopiranim sadržajem bez reference na izvor, obavestite nas i mi ćemo ili **ukloniti sadržaj**, **dodati link pre teksta**, ili **preformulisati dodajući link**.
|
||||
>
|
||||
> ## LICENSE
|
||||
>
|
||||
> Copyright © Sva prava zadržana osim ako nije drugačije navedeno.
|
||||
>
|
||||
> #### Sažetak licence:
|
||||
>
|
||||
> - Attribution: Slobodno možete:
|
||||
> - Share — kopirati i distribuirati materijal u bilo kom medijumu ili formatu.
|
||||
> - Adapt — remiksovati, transformisati i graditi na osnovu materijala.
|
||||
>
|
||||
> #### Dodatni uslovi:
|
||||
>
|
||||
> - Third-Party Content: Delovi ovog bloga/knjige mogu uključivati sadržaj iz drugih izvora, kao što su iseci iz drugih blogova ili publikacija. Korišćenje takvog sadržaja vrši se u skladu sa načelima fair use ili uz izričitu dozvolu od strane nosilaca autorskih prava. Molimo pogledajte originalne izvore za specifične informacije o licenciranju trećeg sadržaja.
|
||||
> - Authorship: Originalni sadržaj koji je autorstvo HackTricks podleže uslovima ove licence. Podstičemo vas da navedete autora kada delite ili prilagođavate ovaj rad.
|
||||
>
|
||||
> #### Izuzeci:
|
||||
>
|
||||
> - Commercial Use: Za upite u vezi komercijalne upotrebe ovog sadržaja, molimo kontaktirajte me.
|
||||
>
|
||||
> Ova licenca ne daje nikakva prava na zaštitne znakove ili brendiranje u vezi sa sadržajem. Svi zaštitni znakovi i brendiranje prikazani u ovom blogu/knjizi su vlasništvo njihovih odgovarajućih vlasnika.
|
||||
>
|
||||
> **Pristupanjem ili korišćenjem HackTricks, slažete se da se pridržavate uslova ove licence. Ako se ne slažete sa ovim uslovima, molimo vas, nemojte pristupati ovom veb-sajtu.**
|
||||
>
|
||||
> ## **Odricanje odgovornosti**
|
||||
>
|
||||
> Uvek **dajemo originalnim autorima svu zaslugu**. Ako nađete stranicu sa copy-paste sadržajem bez reference na originalni izvor, obavestite nas i mi ćemo ili **ukloniti sadržaj**, **dodati link pre teksta**, ili **prepisati ga uz dodavanje linka**.
|
||||
|
||||
## LICENSE
|
||||
|
||||
Copyright © Sva prava zadržana osim ako nije drugačije navedeno.
|
||||
|
||||
#### License Summary:
|
||||
|
||||
- Attribution: Slobodno vam je:
|
||||
- Share — kopirati i redistribuirati materijal u bilo kom medijumu ili formatu.
|
||||
- Adapt — remiksovati, transformisati i izgrađivati na osnovu materijala.
|
||||
|
||||
#### Additional Terms:
|
||||
|
||||
- Third-Party Content: Delovi ovog bloga/knjige mogu uključivati sadržaj iz drugih izvora, kao što su isječci iz drugih blogova ili publikacija. Korišćenje takvog sadržaja vrši se u skladu sa principima fair use ili uz izričitu dozvolu odgovarajućih nosilaca autorskih prava. Molimo vas da se obratite originalnim izvorima za specifične informacije o licenciranju sadržaja trećih strana.
|
||||
- Authorship: Originalni sadržaj koji je autorstvo HackTricks-a podleže uslovima ove licence. Preporučuje se da prilikom deljenja ili prilagođavanja ovom delu navedete autora.
|
||||
|
||||
#### Exemptions:
|
||||
|
||||
- Commercial Use: Za upite u vezi sa komercijalnom upotrebom ovog sadržaja, molimo kontaktirajte me.
|
||||
|
||||
Ova licenca ne dodeljuje nikakva prava na zaštitne znakove ili brendiranje u vezi sa sadržajem. Svi zaštitni znaci i brendovi prikazani u ovom blogu/knjizi su vlasništvo njihovih respektivnih vlasnika.
|
||||
|
||||
**Pristupanjem ili korišćenjem HackTricks, saglasni ste da poštujete uslove ove licence. Ako se ne slažete sa ovim uslovima, molimo vas, ne pristupajte ovom sajtu.**
|
||||
|
||||
## **Disclaimer**
|
||||
|
||||
> [!CAUTION]
|
||||
> Ova knjiga, 'HackTricks', namenjena je isključivo u obrazovne i informativne svrhe. Sadržaj u knjizi dostavljen je "kakav jeste", i autori i izdavači ne daju nikakva izričita ili implicitna obećanja ili garancije o potpunosti, tačnosti, pouzdanosti, pogodnosti ili dostupnosti informacija, proizvoda, usluga ili povezanih grafika sadržanih u ovoj knjizi. Svako oslanjanje na takve informacije je striktno na sopstveni rizik.
|
||||
> Ova knjiga, 'HackTricks,' namenjena je isključivo u edukativne i informativne svrhe. Sadržaj ove knjige pruža se "kakav jeste", i autori i izdavači ne daju nikakve izjave ili garancije, izričite ili implicirane, o potpunosti, tačnosti, pouzdanosti, podobnosti ili dostupnosti informacija, proizvoda, usluga ili povezanih grafika sadržanih u ovoj knjizi. Svako oslanjanje na takve informacije je stoga strogo na vaš rizik.
|
||||
>
|
||||
> Autori i izdavači ni u kom slučaju neće biti odgovorni za bilo kakav gubitak ili štetu, uključujući, bez ograničenja, indirektne ili posledične gubitke ili štete, niti za bilo kakav gubitak podataka ili profita koji proizilazi iz, ili u vezi sa, korišćenjem ove knjige.
|
||||
> Autori i izdavači ni u kom slučaju neće biti odgovorni za bilo kakav gubitak ili štetu, uključujući bez ograničenja, indirektne ili posledične gubitke ili štete, ili bilo kakav gubitak ili štetu proisteklu iz gubitka podataka ili profita koji proizilaze iz ili u vezi sa upotrebom ove knjige.
|
||||
>
|
||||
> Nadalje, tehnike i saveti opisani u ovoj knjizi pruženi su u obrazovne i informativne svrhe i ne bi trebalo da se koriste za bilo koje ilegalne ili zlonamerne aktivnosti. Autori i izdavači ne odobravaju i ne podržavaju bilo kakve ilegalne ili neetičke aktivnosti, i svaka upotreba informacija sadržanih u ovoj knjizi je na sopstveni rizik i diskreciju korisnika.
|
||||
> Nadalje, tehnike i saveti opisani u ovoj knjizi pružaju se u edukativne i informativne svrhe i ne bi trebalo da se koriste za bilo kakve ilegalne ili zlonamerne aktivnosti. Autori i izdavači ne odobravaju niti podržavaju bilo kakve ilegalne ili neetičke aktivnosti, i svaka upotreba informacija sadržanih u ovoj knjizi je na sopstveni rizik i odgovornost korisnika.
|
||||
>
|
||||
> Korisnik je jedini odgovoran za bilo koje radnje preduzete na osnovu informacija sadržanih u ovoj knjizi i uvek bi trebalo da potraži profesionalni savet i pomoć pri pokušaju implementacije bilo koje od opisanih tehnika ili saveta.
|
||||
> Korisnik je isključivo odgovoran za sve radnje preduzete na osnovu informacija sadržanih u ovoj knjizi i uvek bi trebalo da potraži profesionalni savet i pomoć prilikom pokušaja implementacije bilo koje od opisanih tehnika ili saveta.
|
||||
>
|
||||
> Korišćenjem ove knjige, korisnik se slaže da oslobodi autore i izdavače od bilo kakve i sve odgovornosti i odgovornosti za eventualne štete, gubitke ili povrede koje mogu proizaći iz korišćenja ove knjige ili bilo kojih informacija u njoj.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
> Korišćenjem ove knjige, korisnik se slaže da oslobodi autore i izdavače od bilo kakve odgovornosti i odgovornosti za bilo kakvu štetu, gubitke ili povrede koje mogu proisteći iz upotrebe ove knjige ili bilo kojih informacija sadržanih u njoj.
|
||||
>
|
||||
> {{#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