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 fr
This commit is contained in:
parent
d2bc437554
commit
954d1ef19a
@ -5,35 +5,35 @@
|
||||
## Valeurs de HackTricks
|
||||
|
||||
> [!TIP]
|
||||
> Ces sont les **valeurs du projet HackTricks** :
|
||||
> Voici les **valeurs du projet HackTricks** :
|
||||
>
|
||||
> - Donner un accès **GRATUIT** à des ressources pédagogiques de **hacking** pour **TOUT** Internet.
|
||||
> - Le hacking consiste à apprendre, et l'apprentissage devrait être aussi gratuit que possible.
|
||||
> - Offrir un accès **GRATUIT** à des ressources **ÉDUCATIVES** de hacking à **TOUT** Internet.
|
||||
> - Le hacking, c'est l'apprentissage, et l'apprentissage devrait être aussi gratuit que possible.
|
||||
> - Le but de ce livre est de servir de **ressource éducative** complète.
|
||||
> - **STOCKER** d'incroyables techniques de **hacking** publiées par la communauté en donnant aux **AUTEURS** **ORIGINAUX** tous les **crédits**.
|
||||
> - **Nous ne voulons pas les crédits des autres**, nous voulons juste stocker des astuces sympas pour tout le monde.
|
||||
> - Nous écrivons aussi **nos propres recherches** dans HackTricks.
|
||||
> - Dans plusieurs cas, nous écrirons juste **dans HackTricks un résumé des parties importantes** de la technique et **encouragerons le lecteur à visiter le post original** pour plus de détails.
|
||||
> - **ORGANISER** toutes les techniques de **hacking** dans le livre pour qu'il soit **PLUS ACCESSIBLE**
|
||||
> - L'équipe HackTricks a consacré des milliers d'heures gratuitement **uniquement à organiser le contenu** afin que les gens puissent **apprendre plus vite**
|
||||
> - **STOCKER** des techniques de **hacking** remarquables publiées par la communauté en donnant aux **AUTEURS ORIGINAUX** tous les **crédits**.
|
||||
> - **Nous ne voulons pas le mérite des autres**, nous voulons juste conserver des astuces sympas pour tout le monde.
|
||||
> - Nous rédigeons aussi **nos propres recherches** dans HackTricks.
|
||||
> - Dans plusieurs cas, nous écrirons simplement **un résumé des parties importantes dans HackTricks** de la technique et **encouragerons le lecteur à consulter l'article original** pour plus de détails.
|
||||
> - **ORGANISER** toutes les techniques de **hacking** dans le livre afin qu'elles soient **PLUS ACCESSIBLES**
|
||||
> - L'équipe HackTricks a consacré des milliers d'heures gratuitement **uniquement pour organiser le contenu** afin que les gens puissent **apprendre plus vite**
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
## FAQ de HackTricks
|
||||
## FAQ HackTricks
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Thank you so much for these resources, how can I thank you?**
|
||||
> - **Merci beaucoup pour ces ressources, comment puis-je vous remercier ?**
|
||||
|
||||
Vous pouvez remercier publiquement les équipes HackTricks pour avoir rassemblé toutes ces ressources en publiant un tweet mentionnant [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Vous pouvez remercier publiquement l'équipe HackTricks pour avoir rassemblé toutes ces ressources dans un tweet en mentionnant [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Si vous êtes particulièrement reconnaissant, vous pouvez aussi [**sponsoriser le projet ici**](https://github.com/sponsors/carlospolop).\
|
||||
Et n'oubliez pas de **donner une étoile aux projets Github !** (Trouvez les liens ci-dessous).
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **How can I contribute to the project?**
|
||||
> - **Comment puis-je contribuer au projet ?**
|
||||
|
||||
Vous pouvez **partager de nouveaux tips et astuces avec la communauté ou corriger des bugs** que vous trouvez dans les livres en envoyant une **Pull Request** aux pages Github correspondantes:
|
||||
Vous pouvez **partager de nouveaux conseils et astuces avec la communauté ou corriger des bugs** que vous trouvez dans les livres en envoyant une **Pull Request** sur les pages Github respectives :
|
||||
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
@ -42,15 +42,15 @@ N'oubliez pas de **donner une étoile aux projets Github !**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Can I copy some content from HackTricks and put it in my blog?**
|
||||
> - **Puis-je copier du contenu de HackTricks et le mettre sur mon blog ?**
|
||||
|
||||
Oui, vous pouvez, mais **n'oubliez pas de mentionner le(s) lien(s) spécifique(s)** d'où le contenu a été pris.
|
||||
Oui, vous pouvez, mais **n'oubliez pas de mentionner le(s) lien(s) spécifique(s)** d'où provient le contenu.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **How can I cite a page of HackTricks?**
|
||||
> - **Comment puis-je référencer une page de HackTricks ?**
|
||||
|
||||
Tant que le lien **de** la page (ou des pages) d'où vous avez pris l'information apparaît, cela suffit.\
|
||||
Tant que le lien **de** la ou des pages d'où vous avez pris l'information apparaît, c'est suffisant.\
|
||||
Si vous avez besoin d'un bibtex, vous pouvez utiliser quelque chose comme :
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Puis-je copier l'intégralité de HackTricks sur mon blog ?**
|
||||
> - **Puis-je copier tout HackTricks sur mon blog ?**
|
||||
|
||||
**Je préférerais que non**. Cela **n'avantagera personne** car tout le **contenu est déjà disponible publiquement** dans les livres officiels HackTricks gratuitement.
|
||||
**Je préférerais que non**. Cela **n'apportera rien à personne** car tout le **contenu est déjà publiquement disponible** dans les livres officiels HackTricks gratuitement.
|
||||
|
||||
Si vous craignez qu'il disparaisse, faites-en simplement un fork sur Github ou téléchargez-le, comme je l'ai dit c'est déjà gratuit.
|
||||
Si vous craignez qu'il disparaisse, faites-en un fork sur Github ou téléchargez-le ; comme je l'ai dit, c'est déjà gratuit.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Pourquoi avez-vous des sponsors ? Les livres HackTricks ont-ils des finalités commerciales ?**
|
||||
> - **Pourquoi avez-vous des sponsors ? Les livres HackTricks ont-ils des objectifs commerciaux ?**
|
||||
|
||||
La première **valeur** de **HackTricks** est d'offrir des ressources éducatives de hacking **GRATUITES** à **TOUT LE MONDE**. L'équipe HackTricks a **consacré des milliers d'heures** pour proposer ce contenu, encore une fois, **GRATUITEMENT**.
|
||||
La première **valeur** de **HackTricks** est d'offrir des ressources éducatives de hacking **GRATUITES** à **TOUT** le monde. L'équipe HackTricks a **dédié des milliers d'heures** pour offrir ce contenu, encore une fois, **GRATUITEMENT**.
|
||||
|
||||
Si vous pensez que les livres HackTricks sont faits à des **fins commerciales**, vous avez **COMPLÈTEMENT TORT**.
|
||||
Si vous pensez que les livres HackTricks sont faits à des fins **commerciales**, vous avez **COMPLÈTEMENT TORT**.
|
||||
|
||||
Nous avons des sponsors parce que, même si tout le contenu est GRATUIT, nous souhaitons **offrir à la communauté la possibilité d'apprécier notre travail** si elle le souhaite. Ainsi, nous proposons aux gens l'option de faire un don à HackTricks via [**Github sponsors**](https://github.com/sponsors/carlospolop), et des **entreprises de cybersécurité pertinentes** peuvent sponsoriser HackTricks et **avoir quelques publicités** dans le livre, les **publicités** étant toujours placées à des endroits où elles sont **visibles** mais **n'entravent pas le processus d'apprentissage** si quelqu'un se concentre sur le contenu.
|
||||
Nous avons des sponsors parce que, même si tout le contenu est GRATUIT, nous voulons **offrir à la communauté la possibilité d'apprécier notre travail** si elle le souhaite. Ainsi, nous offrons aux personnes la possibilité de faire un don à HackTricks via [**Github sponsors**](https://github.com/sponsors/carlospolop), et aux **entreprises pertinentes de cybersécurité** de sponsoriser HackTricks et d'**avoir quelques publicités** dans le livre, les **publicités** étant toujours placées à des endroits où elles sont **visibles** mais **ne perturbent pas le processus d'apprentissage** si quelqu'un se concentre sur le contenu.
|
||||
|
||||
Vous ne trouverez pas HackTricks rempli de publicités agaçantes comme d'autres blogs avec beaucoup moins de contenu que HackTricks, parce que HackTricks n'est pas fait à des fins commerciales.
|
||||
Vous ne trouverez pas HackTricks rempli de publicités gênantes comme d'autres blogs avec beaucoup moins de contenu que HackTricks, parce que HackTricks n'est pas fait à des fins commerciales.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Que dois‑je faire si une page HackTricks est basée sur mon article de blog mais n'est pas référencée ?**
|
||||
> - **Que dois-je faire si une page HackTricks est basée sur mon article de blog mais n'est pas référencée ?**
|
||||
|
||||
**Nous sommes vraiment désolés. Cela n'aurait pas dû arriver**. Merci de nous le signaler via Github issues, Twitter, Discord... en fournissant le lien de la page HackTricks contenant le contenu et le lien de votre blog et **nous vérifierons et l'ajouterons dès que possible**.
|
||||
**Nous sommes vraiment désolés. Cela n'aurait pas dû arriver**. Veuillez nous en informer via Github issues, Twitter, Discord... le lien de la page HackTricks contenant le contenu et le lien de votre blog et **nous le vérifierons et l'ajouterons dès que possible**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Que dois‑je faire s'il y a du contenu de mon blog dans HackTricks et que je ne veux pas qu'il y reste ?**
|
||||
> - **Que dois-je faire s'il y a du contenu de mon blog dans HackTricks et que je ne veux pas qu'il y soit ?**
|
||||
|
||||
Notez que la présence de liens vers votre page dans HackTricks :
|
||||
Notez que le fait d'avoir des liens vers votre page dans HackTricks :
|
||||
|
||||
- Améliore votre **SEO**
|
||||
- Le contenu est **traduit en plus de 15 langues**, ce qui permet à plus de personnes d'accéder à ce contenu
|
||||
- **HackTricks encourage** les gens à **consulter votre page** (plusieurs personnes nous ont dit que depuis qu'une de leurs pages figure dans HackTricks, elles reçoivent plus de visites)
|
||||
- Le contenu est **traduit en plus de 15 langues**, permettant à davantage de personnes d'accéder à ce contenu
|
||||
- **HackTricks encourage** les gens à **consulter votre page** (plusieurs personnes nous ont dit que depuis qu'une de leurs pages figure dans HackTricks elles reçoivent plus de visites)
|
||||
|
||||
Cependant, si vous souhaitez toujours que le contenu de votre blog soit retiré de HackTricks, dites-le nous et nous **supprimerons définitivement tout lien vers votre blog**, ainsi que tout contenu basé dessus.
|
||||
Cependant, si vous souhaitez toujours que le contenu de votre blog soit supprimé de HackTricks, faites-le nous savoir et nous **supprimerons définitivement tout lien vers votre blog**, ainsi que tout contenu basé dessus.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Que dois‑je faire si je trouve du contenu copié-collé dans HackTricks ?**
|
||||
> - **Que dois-je faire si je trouve du contenu copié-collé dans HackTricks ?**
|
||||
|
||||
Nous donnons toujours **tous les crédits aux auteurs originaux**. Si vous trouvez une page avec du contenu copié-collé sans la source originale référencée, faites-le nous savoir et nous **le supprimerons**, **ajouterons le lien avant le texte**, ou **le réécrirons en ajoutant le lien**.
|
||||
Nous donnons toujours **tous les crédits aux auteurs originaux**. Si vous trouvez une page avec du contenu copié-collé sans source originale référencée, faites-le nous savoir et nous **le supprimerons**, **ajouterons le lien avant le texte**, ou **le réécrirons en ajoutant le lien**.
|
||||
|
||||
## LICENSE
|
||||
|
||||
Copyright © Tous droits réservés sauf indication contraire.
|
||||
|
||||
#### Récapitulatif de la licence :
|
||||
#### License Summary:
|
||||
|
||||
- Attribution : Vous êtes libre de :
|
||||
- Share — copier et redistribuer le matériel sur n'importe quel support ou format.
|
||||
- Adapt — remixer, transformer et développer le matériel.
|
||||
- Partager — copier et redistribuer le matériel sous tout support ou format.
|
||||
- Adapter — remixer, transformer et développer le matériel.
|
||||
|
||||
#### Conditions supplémentaires :
|
||||
#### Additional Terms:
|
||||
|
||||
- Third-Party Content : Certaines parties de ce blog/livre peuvent inclure du contenu provenant d'autres sources, comme des extraits d'autres blogs ou publications. L'utilisation de ce contenu se fait selon les principes du fair use ou avec l'autorisation explicite des titulaires des droits d'auteur respectifs. Veuillez vous référer aux sources originales pour des informations de licence spécifiques concernant le contenu tiers.
|
||||
- Authorship : Le contenu original rédigé par HackTricks est soumis aux termes de cette licence. Vous êtes encouragé à attribuer ce travail à l'auteur lors du partage ou de l'adaptation.
|
||||
- Contenu tiers : Certaines parties de ce blog/livre peuvent inclure du contenu provenant d'autres sources, comme des extraits d'autres blogs ou publications. L'utilisation de ce contenu se fait sous les principes du fair use ou avec l'autorisation explicite des titulaires des droits d'auteur respectifs. Veuillez vous référer aux sources originales pour des informations spécifiques sur la licence concernant le contenu tiers.
|
||||
- Auteurs : Le contenu original rédigé par HackTricks est soumis aux termes de cette licence. Il est recommandé d'attribuer ce travail à l'auteur lors du partage ou de l'adaptation.
|
||||
|
||||
#### Exceptions :
|
||||
#### Exemptions:
|
||||
|
||||
- Commercial Use : Pour toute demande concernant l'utilisation commerciale de ce contenu, veuillez me contacter.
|
||||
- Utilisation commerciale : Pour toute demande concernant l'utilisation commerciale de ce contenu, veuillez me contacter.
|
||||
|
||||
Cette licence n'accorde aucun droit de marque ou d'image de marque en relation avec le contenu. Toutes les marques et éléments de branding présentés dans ce blog/livre sont la propriété de leurs détenteurs respectifs.
|
||||
Cette licence n'accorde aucun droit de marque ou d'image de marque en relation avec le contenu. Toutes les marques et éléments de branding figurant dans ce blog/livre sont la propriété de leurs détenteurs respectifs.
|
||||
|
||||
**En accédant à ou en utilisant HackTricks, vous acceptez de respecter les termes de cette licence. Si vous n'acceptez pas ces termes, veuillez ne pas accéder à ce site.**
|
||||
**En accédant à HackTricks ou en l'utilisant, vous acceptez de respecter les termes de cette licence. Si vous n'acceptez pas ces termes, veuillez ne pas accéder à ce site.**
|
||||
|
||||
## **Avertissement**
|
||||
## **Disclaimer**
|
||||
|
||||
> [!CAUTION]
|
||||
> Ce livre, 'HackTricks', est destiné à des fins éducatives et informatives uniquement. Le contenu de ce livre est fourni « tel quel », et les auteurs et éditeurs ne donnent aucune garantie, expresse ou implicite, quant à l'exhaustivité, l'exactitude, la fiabilité, l'adéquation ou la disponibilité des informations, produits, services ou graphiques associés contenus dans ce livre. Toute confiance que vous accordez à ces informations est donc strictement sous votre propre responsabilité.
|
||||
> Ce livre, 'HackTricks', est destiné uniquement à des fins éducatives et informatives. Le contenu de ce livre est fourni "tel quel", et les auteurs et éditeurs ne font aucune déclaration ni garantie d'aucune sorte, expresse ou implicite, concernant l'exhaustivité, l'exactitude, la fiabilité, l'adéquation ou la disponibilité des informations, produits, services ou graphiques liés contenus dans ce livre. Toute confiance que vous accordez à de telles informations est donc strictement à vos propres risques.
|
||||
>
|
||||
> Les auteurs et éditeurs ne pourront en aucun cas être tenus responsables de toute perte ou dommage, y compris, sans s'y limiter, les pertes ou dommages indirects ou consécutifs, ou toute perte ou dommage de quelque nature que ce soit résultant de la perte de données ou de profits découlant de, ou en relation avec, l'utilisation de ce livre.
|
||||
> Les auteurs et éditeurs ne pourront en aucun cas être tenus responsables de toute perte ou dommage, y compris, mais sans s'y limiter, les pertes ou dommages indirects ou consécutifs, ou toute perte ou dommage quelconque résultant de la perte de données ou de profits découlant de, ou en relation avec, l'utilisation de ce livre.
|
||||
>
|
||||
> De plus, les techniques et astuces décrites dans ce livre sont fournies à des fins éducatives et informatives uniquement, et ne doivent pas être utilisées pour des activités illégales ou malveillantes. Les auteurs et éditeurs ne cautionnent ni ne soutiennent aucune activité illégale ou contraire à l'éthique, et toute utilisation des informations contenues dans ce livre se fait sous la responsabilité et le jugement de l'utilisateur.
|
||||
> De plus, les techniques et conseils décrits dans ce livre sont fournis uniquement à des fins éducatives et informatives, et ne doivent pas être utilisés pour des activités illégales ou malveillantes. Les auteurs et éditeurs ne cautionnent ni ne soutiennent aucune activité illégale ou contraire à l'éthique, et toute utilisation des informations contenues dans ce livre est à la responsabilité et au risque de l'utilisateur.
|
||||
>
|
||||
> L'utilisateur est seul responsable de toute action entreprise sur la base des informations contenues dans ce livre, et doit toujours demander conseil et assistance professionnels lors de la mise en œuvre des techniques ou astuces décrites ici.
|
||||
> L'utilisateur est seul responsable de toute action entreprise sur la base des informations contenues dans ce livre, et devrait toujours rechercher des conseils professionnels et une assistance lorsqu'il tente de mettre en œuvre l'une quelconque des techniques ou conseils décrits ici.
|
||||
>
|
||||
> En utilisant ce livre, l'utilisateur accepte de dégager les auteurs et éditeurs de toute responsabilité pour tous dommages, pertes ou préjudices pouvant résulter de l'utilisation de ce livre ou de l'une des informations qu'il contient.
|
||||
> En utilisant ce livre, l'utilisateur accepte de dégager les auteurs et éditeurs de toute responsabilité pour tout dommage, perte ou préjudice pouvant résulter de l'utilisation de ce livre ou de l'une quelconque des informations qu'il contient.
|
||||
|
||||
{{#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