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 de
This commit is contained in:
parent
94498d5b3c
commit
e7f8eb5440
@ -7,33 +7,33 @@
|
||||
> [!TIP]
|
||||
> Dies sind die **Werte des HackTricks-Projekts**:
|
||||
>
|
||||
> - Gebe **KOSTENLOSEN** Zugang zu **EDUCATIONAL hacking** Ressourcen für das **gesamte Internet**.
|
||||
> - **SICHERSTELLEN** von **KOSTENLOSEM** Zugang zu **EDUCATIONAL hacking** Ressourcen für **das gesamte** Internet.
|
||||
> - Hacking dreht sich ums Lernen, und Lernen sollte so frei wie möglich sein.
|
||||
> - Der Zweck dieses Buches ist es, als umfassende **Bildungsressource** zu dienen.
|
||||
> - **SPEICHERN** großartiger **hacking**-Techniken, die die Community veröffentlicht, und den **ORIGINALEN AUTOREN** alle **Anerkennung** geben.
|
||||
> - Der Zweck dieses Buches ist, als umfassende **Bildungsressource** zu dienen.
|
||||
> - **SPEICHERN** großartige **hacking** Techniken, die die Community veröffentlicht, und den **ORIGINALEN** **AUTOREN** alle **CREDITS** geben.
|
||||
> - **Wir wollen nicht die Anerkennung anderer**, wir wollen nur coole Tricks für alle speichern.
|
||||
> - Wir veröffentlichen auch **eigene Forschungsarbeiten** in HackTricks.
|
||||
> - In mehreren Fällen schreiben wir nur **in HackTricks eine Zusammenfassung der wichtigsten Teile** der Technik und **ermutigen den Leser, den Originalbeitrag** für mehr Details zu besuchen.
|
||||
> - **ORGANISIEREN** alle die hacking-Techniken im Buch, sodass es **BESSER ZUGÄNGLICH** ist
|
||||
> - Das HackTricks-Team hat tausende Stunden kostenlos **nur für die Organisation des Inhalts** aufgewendet, damit Menschen **schneller lernen** können
|
||||
> - Wir veröffentlichen auch **unsere eigenen Forschungen** in HackTricks.
|
||||
> - In mehreren Fällen werden wir nur **in HackTricks eine Zusammenfassung der wichtigen Teile** der Technik schreiben und den Leser **ermutigen, den Originalbeitrag** für mehr Details zu besuchen.
|
||||
> - **ORGANISIEREN** aller hacking Techniken im Buch, damit es **BESSER ZUGÄNGLICH** ist
|
||||
> - Das HackTricks-Team hat Tausende von Stunden kostenlos **nur für die Organisation des Inhalts** aufgewendet, damit Menschen **schneller lernen** können
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
## HackTricks faq
|
||||
## HackTricks FAQ
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Vielen Dank für diese Ressourcen, wie kann ich euch danken?**
|
||||
> - **Vielen Dank für diese Ressourcen, wie kann ich mich bedanken?**
|
||||
|
||||
Du kannst dem HackTricks-Team öffentlich danken, indem du in einem Tweet [**@hacktricks_live**](https://twitter.com/hacktricks_live) erwähnst.\
|
||||
Wenn du besonders dankbar bist, kannst du auch [**das Projekt hier sponsern**](https://github.com/sponsors/carlospolop).\
|
||||
Und vergiss nicht, den Github-Projekten einen Stern zu geben! (Finde die Links unten).
|
||||
Und vergiss nicht, den Github-Projekten einen Stern zu geben! (Die Links findest du unten).
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Wie kann ich zum Projekt beitragen?**
|
||||
|
||||
Du kannst **neue Tipps und Tricks mit der Community teilen oder Fehler** in den Büchern beheben, indem du einen **Pull Request** an die jeweiligen Github-Seiten sendest:
|
||||
Du kannst **neue Tipps und Tricks mit der Community teilen oder Bugs beheben**, die du in den Büchern findest, indem du einen **Pull Request** an die jeweiligen Github-Seiten sendest:
|
||||
|
||||
- [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 @@ Vergiss nicht, den Github-Projekten einen Stern zu geben!
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Kann ich Inhalte von HackTricks kopieren und in meinen Blog stellen?**
|
||||
> - **Kann ich Inhalte von HackTricks kopieren und in meinem Blog veröffentlichen?**
|
||||
|
||||
Ja, das kannst du, aber **vergiss nicht, die spezifischen Links** anzugeben, von denen der Inhalt stammt.
|
||||
Ja, das kannst du, aber **vergiss nicht, den spezifischen Link bzw. die Links** anzugeben, von denen der Inhalt stammt.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Wie kann ich eine Seite von HackTricks zitieren?**
|
||||
> - **Wie kann ich auf eine Seite von HackTricks verweisen?**
|
||||
|
||||
Solange der Link der Seite(n), von der/denen du die Informationen entnommen hast, angegeben ist, ist das ausreichend.\
|
||||
Wenn du einen Bibtex-Eintrag brauchst, kannst du etwas wie folgt verwenden:
|
||||
Solange der Link der Seite(n), von der/dem du die Information entnommen hast, angegeben ist, ist das ausreichend.\
|
||||
Wenn du einen bibtex-Eintrag benötigst, kannst du etwas wie Folgendes verwenden:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -64,7 +64,7 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
>
|
||||
> - **Kann ich alle HackTricks in meinem Blog kopieren?**
|
||||
|
||||
**Ich würde das lieber nicht**. Das **wird niemandem nützen**, da alle **Inhalte bereits öffentlich verfügbar** in den offiziellen HackTricks-Büchern kostenlos sind.
|
||||
**Das würde ich lieber nicht**. Das **wird niemandem nützen**, da alle **Inhalte bereits kostenlos öffentlich** in den offiziellen HackTricks-Büchern verfügbar sind.
|
||||
|
||||
Wenn du befürchtest, dass es verschwinden könnte, fork es einfach auf Github oder lade es herunter — wie gesagt, es ist bereits kostenlos.
|
||||
|
||||
@ -72,72 +72,72 @@ Wenn du befürchtest, dass es verschwinden könnte, fork es einfach auf Github o
|
||||
>
|
||||
> - **Warum habt ihr Sponsoren? Sind HackTricks-Bücher für kommerzielle Zwecke?**
|
||||
|
||||
Der erste **HackTricks** **Wert** ist es, der **ganzen** Welt **KOSTENLOSE** Hacking-Bildungsressourcen anzubieten. Das HackTricks-Team hat **Tausende von Stunden** investiert, um diesen Inhalt anzubieten, nochmals, **KOSTENLOS**.
|
||||
Der erste **Wert** von **HackTricks** ist es, **KOSTENLOSE** hacking-Bildungsressourcen für **ALLE** weltweit anzubieten. Das HackTricks-Team hat **Tausende von Stunden** investiert, um diesen Inhalt, wie gesagt, **KOSTENLOS** zur Verfügung zu stellen.
|
||||
|
||||
Wenn du denkst, die HackTricks-Bücher seien für **kommerzielle Zwecke** gemacht, liegst du **KOMPLETT FALSCH**.
|
||||
Wenn du denkst, die HackTricks-Bücher seien für **kommerzielle Zwecke**, liegst du **VÖLLIG FALSCH**.
|
||||
|
||||
Wir haben Sponsoren, weil wir, auch wenn alle Inhalte KOSTENLOS sind, der Community die Möglichkeit bieten wollen, unsere Arbeit zu schätzen, falls sie das möchten. Daher bieten wir Leuten die Option, HackTricks über [**Github sponsors**](https://github.com/sponsors/carlospolop) zu unterstützen, und relevanten Cybersecurity-Unternehmen, HackTricks zu sponsern und etwas **Werbung** im Buch zu platzieren, wobei die **Werbeanzeigen** stets an Stellen platziert werden, an denen sie **sichtbar** sind, aber den Lernprozess nicht stören, wenn sich jemand auf den Inhalt konzentriert.
|
||||
Wir haben Sponsoren, weil wir, auch wenn alle Inhalte KOSTENLOS sind, der Community die Möglichkeit bieten möchten, unsere Arbeit zu würdigen, falls sie das möchten. Daher bieten wir den Menschen die Option, HackTricks über [**Github sponsors**](https://github.com/sponsors/carlospolop) zu unterstützen, und relevante Cybersecurity-Unternehmen sponsern HackTricks und platzieren **einige Anzeigen** im Buch — die **Anzeigen** werden stets an Stellen platziert, an denen sie **sichtbar** sind, aber den Lernprozess nicht stören, wenn sich jemand auf den Inhalt konzentriert.
|
||||
|
||||
Du wirst HackTricks nicht mit nerviger Werbung vollgestopft finden wie andere Blogs mit deutlich weniger Inhalten als HackTricks, denn HackTricks ist nicht für kommerzielle Zwecke gemacht.
|
||||
Du wirst HackTricks nicht voller nerviger Anzeigen finden wie andere Blogs mit deutlich weniger Inhalt, denn HackTricks ist nicht für kommerzielle Zwecke gemacht.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Was soll ich tun, wenn eine HackTricks-Seite auf meinem Blogpost basiert, aber dieser nicht referenziert wird?**
|
||||
> - **Was soll ich tun, wenn eine HackTricks-Seite auf meinem Blogpost basiert, dieser aber nicht referenziert ist?**
|
||||
|
||||
**Es tut uns sehr leid. Das hätte nicht passieren dürfen**. Bitte gib uns Bescheid über Github issues, Twitter, Discord... den Link der HackTricks-Seite mit dem betreffenden Inhalt und den Link zu deinem Blog und **wir werden es prüfen und ASAP hinzufügen**.
|
||||
**Es tut uns sehr leid. Das hätte nicht passieren dürfen**. Bitte lass es uns via Github issues, Twitter, Discord... wissen — sende den Link der HackTricks-Seite mit dem betreffenden Inhalt und den Link zu deinem Blog, und **wir werden es prüfen und so schnell wie möglich hinzufügen**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Was soll ich tun, wenn Inhalte von meinem Blog in HackTricks stehen und ich nicht möchte, dass sie dort sind?**
|
||||
> - **Was soll ich tun, wenn Inhalte von meinem Blog in HackTricks sind und ich sie dort nicht haben möchte?**
|
||||
|
||||
Beachte, dass Links zu deiner Seite in HackTricks:
|
||||
|
||||
- Verbessern dein **SEO**
|
||||
- Der Inhalt wird in **mehr als 15 Sprachen** übersetzt, wodurch mehr Menschen Zugriff auf diesen Inhalt erhalten
|
||||
- **HackTricks ermutigt** Leute, **deine Seite zu besuchen** (mehrere Personen haben uns berichtet, dass sie, seitdem eine ihrer Seiten in HackTricks ist, mehr Besucher erhalten)
|
||||
- Der Inhalt wird in **mehr als 15 Sprachen übersetzt**, wodurch mehr Menschen Zugang zu diesem Inhalt erhalten können
|
||||
- **HackTricks ermutigt** Menschen dazu, **deine Seite zu besuchen** (mehrere Personen teilten uns mit, dass sie seitdem, dass eine ihrer Seiten in HackTricks ist, mehr Besuche erhalten)
|
||||
|
||||
Wenn du dennoch möchtest, dass Inhalte deines Blogs aus HackTricks entfernt werden, sag uns einfach Bescheid und wir werden definitiv **jeden Link zu deinem Blog entfernen**, sowie alle darauf basierenden Inhalte.
|
||||
Wenn du jedoch trotzdem möchtest, dass die Inhalte deines Blogs aus HackTricks entfernt werden, sag uns einfach Bescheid und wir werden definitiv **alle Links zu deinem Blog entfernen** sowie alle darauf basierenden Inhalte.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Was soll ich tun, wenn ich kopierten Inhalt in HackTricks finde?**
|
||||
|
||||
Wir geben den Originalautoren immer **alle Credits**. Wenn du eine Seite mit kopiertem Inhalt findest, bei der die Originalquelle nicht angegeben ist, lass es uns wissen und wir werden entweder **den Inhalt entfernen**, **den Link vor den Text setzen**, oder **den Text umschreiben und den Link hinzufügen**.
|
||||
Wir geben den ursprünglichen Autoren immer **alle Credits**. Wenn du eine Seite mit kopiertem Inhalt ohne Angabe der Originalquelle findest, informiere uns und wir werden entweder **den Inhalt entfernen**, **den Link vor dem Text hinzufügen**, oder **den Text umschreiben und den Link hinzufügen**.
|
||||
|
||||
## LIZENZ
|
||||
|
||||
Copyright © Alle Rechte vorbehalten, sofern nicht anders angegeben.
|
||||
|
||||
#### Lizenzzusammenfassung:
|
||||
#### Lizenzübersicht:
|
||||
|
||||
- Namensnennung: Du darfst:
|
||||
- Share — Kopiere und verbreite das Material in jedem Medium oder Format.
|
||||
- Adapt — Remixe, transformiere und baue auf dem Material auf.
|
||||
- Teilen — das Material in jedem Medium oder Format kopieren und weiterverbreiten.
|
||||
- Anpassen — remixen, transformieren und auf dem Material aufbauen.
|
||||
|
||||
#### Zusätzliche Bedingungen:
|
||||
|
||||
- Third-Party Content: Einige Teile dieses Blogs/Buchs können Inhalte aus anderen Quellen enthalten, wie Auszüge aus anderen Blogs oder Publikationen. Die Nutzung solcher Inhalte erfolgt unter den Grundsätzen des fair use oder mit ausdrücklicher Erlaubnis der jeweiligen Urheberrechtsinhaber. Bitte beziehe dich auf die Originalquellen für spezifische Lizenzinformationen bezüglich Drittinhalte.
|
||||
- Authorship: Die ursprünglich von HackTricks verfassten Inhalte unterliegen den Bedingungen dieser Lizenz. Du wirst ermutigt, dieses Werk beim Teilen oder Anpassen dem Autor zuzuschreiben.
|
||||
- Drittinhalte: Einige Teile dieses Blogs/Buchs können Inhalte aus anderen Quellen enthalten, wie Auszüge aus anderen Blogs oder Publikationen. Die Nutzung solcher Inhalte erfolgt unter den Grundsätzen des Fair Use oder mit ausdrücklicher Genehmigung der jeweiligen Urheberrechtsinhaber. Bitte beziehe dich auf die Originalquellen für spezifische Lizenzinformationen zu Drittinhalten.
|
||||
- Urheberschaft: Die ursprünglich von HackTricks verfassten Inhalte unterliegen den Bestimmungen dieser Lizenz. Es wird empfohlen, dieses Werk beim Teilen oder Anpassen dem Autor zuzuschreiben.
|
||||
|
||||
#### Ausnahmen:
|
||||
|
||||
- Commercial Use: Für Anfragen zur kommerziellen Nutzung dieses Inhalts kontaktiere mich bitte.
|
||||
- Kommerzielle Nutzung: Bei Anfragen zur kommerziellen Nutzung dieses Inhalts kontaktiere mich bitte.
|
||||
|
||||
Diese Lizenz gewährt keine Marken- oder Branding-Rechte in Bezug auf die Inhalte. Alle Marken und Branding, die in diesem Blog/Buch erscheinen, sind Eigentum ihrer jeweiligen Inhaber.
|
||||
Diese Lizenz gewährt keine Marken- oder Branding-Rechte in Bezug auf die Inhalte. Alle Marken und Branding-Elemente in diesem Blog/Buch sind Eigentum ihrer jeweiligen Inhaber.
|
||||
|
||||
**Durch den Zugriff auf oder die Nutzung von HackTricks erklärst du dich damit einverstanden, die Bedingungen dieser Lizenz einzuhalten. Wenn du diesen Bedingungen nicht zustimmst, greife bitte nicht auf diese Website zu.**
|
||||
**Durch den Zugriff auf oder die Nutzung von HackTricks erklärst du dich mit den Bedingungen dieser Lizenz einverstanden. Wenn du diesen Bedingungen nicht zustimmst, greife bitte nicht auf diese Website zu.**
|
||||
|
||||
## **Haftungsausschluss**
|
||||
|
||||
> [!CAUTION]
|
||||
> Dieses Buch „HackTricks“ dient ausschließlich Bildungs- und Informationszwecken. Die Inhalte dieses Buches werden „wie besehen“ bereitgestellt, und die Autoren und Herausgeber machen keinerlei ausdrückliche oder stillschweigende Zusicherungen oder Gewährleistungen irgendeiner Art hinsichtlich der Vollständigkeit, Genauigkeit, Zuverlässigkeit, Eignung oder Verfügbarkeit der in diesem Buch enthaltenen Informationen, Produkte, Dienstleistungen oder zugehörigen Grafiken. Jegliches Vertrauen, das du in solche Informationen setzt, erfolgt daher ausschließlich auf eigenes Risiko.
|
||||
> Dieses Buch, 'HackTricks,' dient ausschließlich Bildungs- und Informationszwecken. Die Inhalte dieses Buches werden "wie gesehen" bereitgestellt, und die Autoren und Herausgeber geben keinerlei ausdrückliche oder stillschweigende Zusicherungen oder Gewährleistungen hinsichtlich Vollständigkeit, Genauigkeit, Zuverlässigkeit, Eignung oder Verfügbarkeit der in diesem Buch enthaltenen Informationen, Produkte, Dienstleistungen oder zugehörigen Grafiken ab. Jegliches Vertrauen, das du in solche Informationen setzt, erfolgt daher ausschließlich auf dein eigenes Risiko.
|
||||
>
|
||||
> Die Autoren und Herausgeber haften in keinem Fall für Verluste oder Schäden, einschließlich, aber nicht beschränkt auf indirekte oder Folgeschäden, oder für jegliche Verluste oder Schäden, die aus dem Verlust von Daten oder Gewinnen entstehen und im Zusammenhang mit der Nutzung dieses Buches stehen.
|
||||
> Die Autoren und Herausgeber haften in keinem Fall für Verluste oder Schäden, einschließlich, aber nicht beschränkt auf indirekte oder Folgeschäden oder Verluste jedweder Art, die aus dem Verlust von Daten oder Gewinnen entstehen und im Zusammenhang mit der Nutzung dieses Buches stehen.
|
||||
>
|
||||
> Darüber hinaus werden die in diesem Buch beschriebenen Techniken und Tipps nur zu Bildungs- und Informationszwecken bereitgestellt und dürfen nicht für illegale oder böswillige Aktivitäten verwendet werden. Die Autoren und Herausgeber billigen oder unterstützen keine illegalen oder unethischen Aktivitäten, und jede Nutzung der in diesem Buch enthaltenen Informationen erfolgt auf eigenes Risiko und nach eigenem Ermessen des Nutzers.
|
||||
> Darüber hinaus werden die in diesem Buch beschriebenen Techniken und Tipps ausschließlich zu Bildungs- und Informationszwecken bereitgestellt und dürfen nicht für illegale oder böswillige Aktivitäten verwendet werden. Die Autoren und Herausgeber billigen oder unterstützen keine illegalen oder unethischen Aktivitäten, und jede Nutzung der in diesem Buch enthaltenen Informationen erfolgt auf eigenes Risiko und eigene Verantwortung des Nutzers.
|
||||
>
|
||||
> Der Nutzer ist allein verantwortlich für alle Handlungen, die auf Basis der in diesem Buch enthaltenen Informationen vorgenommen werden, und sollte stets professionellen Rat und Unterstützung einholen, wenn er versucht, eine der hier beschriebenen Techniken oder Tipps umzusetzen.
|
||||
> Der Nutzer ist allein verantwortlich für alle Maßnahmen, die auf Grundlage der in diesem Buch enthaltenen Informationen ergriffen werden, und sollte stets professionelle Beratung und Unterstützung in Anspruch nehmen, bevor er versucht, eine der hier beschriebenen Techniken oder Tipps umzusetzen.
|
||||
>
|
||||
> Durch die Nutzung dieses Buches erklärt sich der Nutzer damit einverstanden, die Autoren und Herausgeber von jeglicher Haftung und Verantwortung für Schäden, Verluste oder Verletzungen, die aus der Nutzung dieses Buches oder der darin enthaltenen Informationen resultieren können, freizustellen.
|
||||
> Durch die Nutzung dieses Buches erklärt sich der Nutzer damit einverstanden, die Autoren und Herausgeber von jeglicher Haftung und Verantwortung für Schäden, Verluste oder Schäden freizustellen, die sich aus der Nutzung dieses Buches oder der darin enthaltenen Informationen ergeben können.
|
||||
|
||||
{{#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