Translated ['', 'src/welcome/hacktricks-values-and-faq.md'] to af

This commit is contained in:
Translator 2025-10-04 09:05:47 +00:00
parent fd51511c2c
commit ddc0e259b0
2 changed files with 246 additions and 209 deletions

View File

@ -1,4 +1,4 @@
# HackTricks Waardes & FAQ
# HackTricks Waardes & Vrae
{{#include ../banners/hacktricks-training.md}}
@ -7,33 +7,33 @@
> [!TIP]
> Dit is die **waardes van die HackTricks-projek**:
>
> - Gee **VRYE** toegang tot **OPVOEDENDE hacking** hulpbronne aan **AL die Internet**.
> - Hacking gaan oor leer, en leer behoort so vry as moontlik te wees.
> - Die doel van hierdie boek is om as 'n omvattende **opvoedkundige hulpbron** te dien.
> - **BEWAAR** wonderlike **hacking** tegnieke wat die gemeenskap publiseer en gee die **ORIGINELE** **AUTEURS** al die **krediete**.
> - **Ons wil nie die krediet van ander mense hê nie**, ons wil net cool truuks vir almal bewaar.
> - Gee **VRYE** toegang tot **EDUKASIONELE hacking** hulpbronne aan die **HELE** Internet.
> - Hacking gaan oor leer, en leer moet so veel as moontlik gratis wees.
> - Die doel van hierdie boek is om te dien as 'n omvattende **opvoedkundige hulpbron**.
> - **STORE** fantastiese **hacking** tegnieke wat die gemeenskap publiseer en die **ORIGINELE** **AUTEURS** alle **krediete** gee.
> - **Ons wil nie die erkenning van ander mense hê nie**, ons wil net cool truuks vir almal stoor.
> - Ons skryf ook **ons eie navorsing** in HackTricks.
> - In verskeie gevalle sal ons net **in HackTricks 'n opsomming van die belangrike dele** van die tegniek skryf en die **leser aanmoedig om die oorspronklike pos te besoek** vir meer besonderhede.
> - **ORGANISEER** al die hacking tegnieke in die boek sodat dit **MEER TOEGANKLIK** is
> - Die HackTricks-span het duisende ure gratis bestee **slegs om die inhoud te organiseer** sodat mense **viniger kan leer**
> - In verskeie gevalle sal ons net **in HackTricks 'n samevatting van die belangrike gedeeltes** van die tegniek skryf en die **leser aanmoedig om die oorspronklike pos te besoek** vir meer besonderhede.
> - **ORGANIZE** al die hacking tegnieke in die boek sodat dit **MEER TOEGANKLIK** is
> - Die HackTricks-span het duisende ure vrygewig gegee net **om die inhoud te organiseer** sodat mense **vinnigder kan leer**
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
## HackTricks FAQ
## HackTricks Vrae
> [!TIP]
>
> - **Baie dankie vir hierdie hulpbronne, hoe kan ek julle bedank?**
Jy kan publiekelik die HackTricks-spanne bedank vir die samevoeging van al hierdie hulpbronne in 'n tweet deur [**@hacktricks_live**](https://twitter.com/hacktricks_live) te noem.\
Indien jy besonder dankbaar is kan jy ook [**borg die projek hier**](https://github.com/sponsors/carlospolop).\
Jy kan HackTricks-spanne openlik bedank vir die samevoeging van al hierdie hulpbronne deur 'n tweet te plaas waarin [**@hacktricks_live**](https://twitter.com/hacktricks_live) genoem word.\
As jy besonder dankbaar is, kan jy ook [**die projek hier borg**](https://github.com/sponsors/carlospolop).\
En moenie vergeet om **'n ster aan die Github-projekte te gee nie!** (Vind die skakels hieronder).
> [!TIP]
>
> - **Hoe kan ek bydra tot die projek?**
Jy kan **nuwe wenke en truuks met die gemeenskap deel of foute regmaak** wat jy in die boeke vind deur 'n **Pull Request** na die onderskeie Github-bladsye te stuur:
Jy kan **nuwe wenke en truuks met die gemeenskap deel of foute regmaak** wat jy in die boeke vind deur 'n **Pull Request** aan die onderskeie Github-bladsye te stuur:
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
@ -42,16 +42,16 @@ Moenie vergeet om **'n ster aan die Github-projekte te gee nie!**
> [!TIP]
>
> - **Kan ek inhoud van HackTricks kopieer en dit in my blog plaas?**
> - **Kan ek inhoud van HackTricks kopieer en dit op my blog plaas?**
Ja, jy kan, maar **moet nie vergeet om die spesifieke skakel(s)** te noem waar die inhoud vandaan geneem is nie.
Ja, jy kan, maar **moet nie vergeet om die spesifieke skakel(s) te noem** waarvandaan die inhoud geneem is nie.
> [!TIP]
>
> - **Hoe kan ek 'n bladsy van HackTricks siteer?**
> - **Hoe kan ek na 'n HackTricks-bladsy verwys?**
Solank die skakel **van** die bladsy(s) waaruit jy die inligting geneem het verskyn, is dit genoeg.\
As jy 'n bibtex nodig het, kan jy iets soos gebruik:
Solang die skakel **van** die bladsy(e) waarvandaan jy die inligting geneem het verskyn, is dit genoeg.\
As jy 'n bibtex nodig het kan jy iets soos die volgende gebruik:
```latex
@misc{hacktricks-bibtexing,
author = {"HackTricks Team" or the Authors name of the specific page/trick},
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
```
> [!WARNING]
>
> - **Kan ek al die HackTricks op my blog kopieer?**
> - **Kan ek alle HackTricks in my blog kopieer?**
**Ek sou liewer nie**. Dit gaan **niemand bevoordeel nie**, aangesien al die **inhoud reeds publiek beskikbaar** is in die amptelike HackTricks-boeke vir **GRATIS**.
**Ek sou liewer nie**. Dit gaan **niemand bevoordeel nie** aangesien al die **inhoud reeds publieklik beskikbaar** is in die amptelike HackTricks-boeke, gratis.
As jy vrees dat dit sal verdwyn, fork dit net op Github of laai dit af — soos ek gesê het, dit is reeds gratis.
> [!WARNING]
>
> - **Hoekom het julle sponsore? Is HackTricks-boeke vir kommersiële doeleindes?**
> - **Waarom het julle sponsors? Is HackTricks-boeke vir kommersiële doeleindes?**
Die eerste HackTricks-waarde is om **GRATIS** opvoedkundige hacking-hulpbronne aan **iedereen** wêreldwyd te bied. Die HackTricks-span het **duisende ure** toegewy om hierdie inhoud te verskaf, weer, vir **GRATIS**.
Die eerste **HackTricks** **waarde** is om **GRATIS** hacking-onderrigbronne aan **AL** die wêreld te bied. Die HackTricks-span het **duisende ure toegewyd** om hierdie inhoud te verskaf, weer, **GRATIS**.
As jy dink HackTricks-boeke is gemaak vir **kommersiële doeleindes**, jy is **TEN VOLLE VERKEERD**.
As jy dink HackTricks-boeke is gemaak vir **kommersiële doeleindes**, is jy **VOLLEDIG VERKEERD**.
Ons het sponsore omdat, selfs al is al die inhoud **GRATIS**, ons die gemeenskap die moontlikheid wil gee om ons werk te waardeer as hulle wil. Daarom bied ons mense die opsie om aan HackTricks te skenk via [**Github sponsors**](https://github.com/sponsors/carlospolop), en relevante kuberveiligheidsmaatskappye om HackTricks te borg en om sommige advertensies in die boek te hê — die advertensies word altyd op plekke geplaas waar hulle sigbaar is maar nie die leerproses steur as iemand op die inhoud fokus nie.
Ons het sponsors omdat, selfs al is al die inhoud GRATIS, ons die gemeenskap die moontlikheid wil gee om ons werk te waardeer as hulle wil. Daarom bied ons mense die opsie om aan HackTricks te skenk via [**Github sponsors**](https://github.com/sponsors/carlospolop), en relevante kuberveiligheid-maatskappye om HackTricks te borg en om advertensies in die boek te hê — die advertensies word altyd op maniere geplaas wat hulle sigbaar maak maar nie die leerproses ontwrig as iemand op die inhoud fokus nie.
Jy sal nie HackTricks gevul met irriterende advertensies soos ander blogs met baie minder inhoud as HackTricks vind nie, omdat HackTricks nie vir kommersiële doeleindes gemaak is nie.
Jy sal nie HackTricks gevul met irriterende advertensies vind soos ander blogs met baie minder inhoud as HackTricks nie, want HackTricks is nie vir kommersiële doeleindes geskep nie.
> [!CAUTION]
>
> - **Wat moet ek doen as n HackTricks-bladsy gebaseer is op my blogpos maar dit nie verwys is nie?**
> - **Wat moet ek doen as 'n HackTricks-bladsy gebaseer is op my blogpos maar dit nie verwys word nie?**
**Ons is baie jammer. Dit behoort nie gebeur het nie**. Laat weet ons asseblief via Github issues, Twitter, Discord... die skakel van die HackTricks-bladsy met die inhoud en die skakel van jou blog en **ons sal dit nagaan en dit SO VYFASIGD moontlik byvoeg**.
**Ons is baie jammer. Dit moes nie gebeur het nie.** Kontak ons asseblief via Github issues, Twitter, Discord... die skakel van die HackTricks-bladsy met die inhoud en die skakel van jou blog en **ons sal dit nagaan en dit so spoedig moontlik byvoeg**.
> [!CAUTION]
>
> - **Wat moet ek doen as daar inhoud van my blog in HackTricks is en ek wil dit nie daar hê nie?**
> - **Wat moet ek doen as daar inhoud van my blog in HackTricks is en ek dit nie daar wil hê nie?**
Let daarop dat om skakels na jou bladsy in HackTricks te hê:
Neem asseblief kennis dat skakels na jou bladsy in HackTricks:
- Verbeter jou **SEO**
- Die inhoud word na meer as 15 tale vertaal, wat dit vir meer mense moontlik maak om toegang tot hierdie inhoud te kry
- HackTricks moedig mense aan om **jou bladsy te besoek** (verskeie mense het vir ons gesê dat sedert n bladsy van hulle in HackTricks verskyn het, hulle meer besoeke ontvang)
- Die inhoud word **in meer as 15 tale vertaal**, wat dit moontlik maak dat meer mense toegang tot hierdie inhoud kry
- **HackTricks moedig** mense aan om **jou bladsy te besoek** (veral mense het aan ons genoem dat sedert 'n bladsy van hulle in HackTricks verskyn het, hulle meer besoeke ontvang)
As jy egter steeds wil hê dat die inhoud van jou blog uit HackTricks verwyder word, laat ons weet en ons sal beslis **elke skakel na jou blog verwyder**, en enige inhoud wat daarop gebaseer is.
Indien jy steeds wil hê dat die inhoud van jou blog uit HackTricks verwyder word, laat weet ons gerus en ons sal beslis **elke skakel na jou blog verwyder**, en enige inhoud wat daarop gebaseer is.
> [!CAUTION]
>
> - **Wat moet ek doen as ek gekopieër/plak inhoud in HackTricks vind?**
> - **Wat moet ek doen as ek gekopieërde inhoud in HackTricks vind?**
Ons gee altyd die oorspronklike outeurs alle krediet. As jy n bladsy vind met gekopieër/plak inhoud sonder die oorspronklike bron verwys, laat weet ons en ons sal óf **dit verwyder**, óf **die skakel voor die teks voeg**, of **dit herskryf en die skakel byvoeg**.
Ons gee altyd die oorspronklike outeurs alle krediet. As jy 'n bladsy vind met gekopieërde inhoud sonder 'n verwysing na die oorspronklike bron, laat weet ons en ons sal óf **dit verwyder**, óf **die skakel voor die teks byvoeg**, of **dit herskryf en die skakel byvoeg**.
## LISENSIE
Copyright © Alle regte voorbehou tensy anders vermeld.
Auteursreg © Alle regte voorbehou tensy anders vermeld.
#### Lisensie Opsomming:
- Toekenning: Jy is vry om:
- Deel — kopieer en herverdeel die materiaal in enige medium of formaat.
- Aanpas — remix, transformeer en bou voort op die materiaal.
- Aanpas — remiks, transformeer, en bou voort op die materiaal.
#### Bykomende Voorwaardes:
- Third-Party Content: Sommige dele van hierdie blog/boek kan inhoud van ander bronne insluit, soos uittreksels van ander blogs of publikasies. Die gebruik van sulke inhoud word gedoen onder die beginsels van billike gebruik of met uitdruklike toestemming van die onderskeie kopiereghouers. Verwys asseblief na die oorspronklike bronne vir spesifieke lisensie-inligting rakende derdeparty-inhoud.
- Authorship: Die oorspronklike inhoud geskryf deur HackTricks is onderworpe aan die bepalings van hierdie lisensie. Jy word aangemoedig om hierdie werk aan die outeur toe te ken wanneer jy dit deel of aanpas.
- Inhoud van derde partye: Sommige dele van hierdie blog/boek mag inhoud van ander bronne insluit, soos uittreksels van ander blogs of publikasies. Die gebruik van sulke inhoud geskied onder die beginsels van billike gebruik of met uitdruklike toestemming van die betrokke kopiereghouers. Raadpleeg asseblief die oorspronklike bronne vir spesifieke lisensie-inligting rakende inhoud van derde partye.
- Auteurskap: Die oorspronklike inhoud geskep deur HackTricks is onderhewig aan die bepalings van hierdie lisensie. Jy word aangemoedig om hierdie werk aan die outeur toe te ken wanneer jy dit deel of aanpas.
#### Uitsonderings:
- Commercial Use: Vir navrae oor kommersiële gebruik van hierdie inhoud, kontak my asseblief.
- Kommersiële Gebruik: Vir navrae oor kommersiële gebruik van hierdie inhoud, kontak my asseblief.
Hierdie lisensie verleen geen handelsmerk- of handelsnaamregte met betrekking tot die inhoud nie. Alle handelsmerke en handelsname wat in hierdie blog/boek vertoon word, is die eiendom van hul onderskeie eienaars.
Hierdie lisensie verleen geen handelsmerk- of handelsnaamregte in verband met die inhoud nie. Alle handelsmerke en handelsmerkaanduidings wat in hierdie blog/boek verskyn, is die eiendom van hul onderskeie eienaars.
**Deur toegang tot of gebruik van HackTricks stem jy in om die bepalings van hierdie lisensie na te kom. As jy nie saamstem met hierdie bepalings nie, moenie asseblief hierdie webwerf besoek nie.**
**Deur HackTricks te besoek of te gebruik, stem jy in om die bepalings van hierdie lisensie na te kom. As jy nie met hierdie bepalings saamstem nie, besoek asseblief nie hierdie webwerf nie.**
## **Disclaimer**
## **Vrywaring**
> [!CAUTION]
> Hierdie boek, 'HackTricks,' is bedoel vir opvoedkundige en inligtingsdoeleindes alleen. Die inhoud in hierdie boek word verskaf op 'n "as is"-grondslag, en die outeurs en uitgewers maak geen verklarings of waarborge van enige aard nie, uitdruklik of geïmpliseer, oor die volledigheid, akkuraatheid, betroubaarheid, geskiktheid of beskikbaarheid van die inligting, produkte, dienste of verwante grafika in hierdie boek. Enige vertroue wat jy in sodanige inligting plaas, is dus streng op eie risiko.
> Hierdie boek, 'HackTricks', is slegs vir opvoedkundige en informerende doeleindes bedoel. Die inhoud in hierdie boek word verskaf op 'n "soos dit is" basis, en die outeurs en uitgewers maak geen stellings of waarborge van enige aard, uitdruklik of geïmpliseer, oor die volledigheid, akkuraatheid, betroubaarheid, geskiktheid of beskikbaarheid van die inligting, produkte, dienste of verwante grafika in hierdie boek nie. Enige vertroue wat jy in sodanige inligting plaas, is dus streng op jou eie risiko.
>
> Die outeurs en uitgewers is onder geen omstandighede aanspreeklik vir enige verlies of skade nie, insluitend sonder beperking indirekte of gevolglike verlies of skade, of enige verlies of skade wat voortspruit uit verlies van data of wins wat voortspruit uit, of in verband met, die gebruik van hierdie boek.
> Die outeurs en uitgewers sal in geen geval aanspreeklik wees vir enige verlies of skade nie, insluitend, maar nie beperk tot, indirekte of gevolglike verlies of skade, of enige verlies of skade wat voortspruit uit die verlies van data of winste wat voortspruit uit, of in verband met, die gebruik van hierdie boek nie.
>
> Verder word die tegnieke en wenke wat in hierdie boek beskryf word, slegs vir opvoedkundige en inligtingsdoeleindes verskaf, en moet nie gebruik word vir enige onwettige of kwaadwillige aktiwiteite nie. Die outeurs en uitgewers keur geen onwettige of onetiese aktiwiteite goed of ondersteun dit nie, en enige gebruik van die inligting in hierdie boek is op die gebruiker se eie risiko en diskresie.
> Verder word die tegnieke en wenke in hierdie boek beskryf vir opvoedkundige en informerende doeleindes slegs, en behoort nie gebruik te word vir enige onwettige of kwaadwillige aktiwiteite nie. Die outeurs en uitgewers keur geen onwettige of onetiese aktiwiteite goed of ondersteun dit nie, en enige gebruik van die inligting in hierdie boek is op die gebruiker se eie risiko en diskresie.
>
> Die gebruiker is uitsluitlik verantwoordelik vir enige aksies wat gebaseer is op die inligting in hierdie boek, en behoort altyd professionele advies en hulp te soek wanneer hy probeer om enige van die tegnieke of wenke hier beskryf te implementeer.
> Die gebruiker is uitsluitlik verantwoordelik vir enige aksies wat geneem word gebaseer op die inligting in hierdie boek, en behoort altyd professionele advies en bystand te soek wanneer hulle poog om enige van die tegnieke of wenke hierin te implementeer.
>
> Deur hierdie boek te gebruik, stel die gebruiker die outeurs en uitgewers vry van enige en alle aanspreeklikheid en verpligting vir enige skade, verliese of nadele wat mag voortspruit uit die gebruik van hierdie boek of enige van die inligting daarin.
> Deur hierdie boek te gebruik, stem die gebruiker in om die outeurs en uitgewers van enige en alle aanspreeklikheid en verantwoordelikheid vry te stel vir enige skade, verliese of nadeel wat mag voortspruit uit die gebruik van hierdie boek of enige van die inligting daarin.
{{#include ../banners/hacktricks-training.md}}

View File

@ -6,34 +6,63 @@
*/
(() => {
"use strict";
"use strict";
/* ───────────── 0. helpers (main thread) ───────────── */
const clear = el => { while (el.firstChild) el.removeChild(el.firstChild); };
/* ───────────── 1. WebWorker 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. WebWorker 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={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&#34;','\'':'&#39;'};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={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&#34;','\'':'&#39;'};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);
};
})();