{Github} – Rechercher un terme dans un repo

Coucou la compagnie,

 

Encore et toujours  ... pour le meilleur et pour le pire ... un article qui va vous rendre du rêve !
En ce moment je recherche à tout prix des vulnérabilités dans PHP ...
Oui je suis un grand malade ... pourquoi s'attaquer à de petits sites, des petites plateformes ou des applications mobiles lorsque l'on peut s'attaquer directement à la technologie utilisée !!!
Bref là n'est pas mon article ... mais j'avais envie de vous partager un petit script que j'ai écrit pour m'éviter des téléchargements / installations lorsque je m'attaque à ce genre de projet ambitieux ...
Car pour parvenir à mes fins, il m'arrive régulièrement sur Github, lorsque c'est possible, d'analyser directement le code des projets que je souhaite auditer.

 

Les repos sur Github !

J'espère pour vous que vous connaissez Github ...
C'est en tout cas un mot bien apprécié des recruteurs lorsque l'on travaille dans l'IT (technologie de l'information, oui .. apprenez l'anglais avec Dyrk ;) )
Bref, c'est un "gestionnaire de version", cela permet de sauvegarder chaque changement, chaque itération d'un projet lorsque vous développez !
C'est super utile lorsque vous vous emballez un peu trop et que par mégarde ... plus rien ne fonctionne !
Cela vous permet de revenir en arrière sans pour autant supprimer tout votre travail !
Vous pouvez également partager des tâches et savoir qui a fait quoi, quand et comment !!!!
Bref, je fais un peu l’apologie des gestionnaires de version, même si sur le plan perso je n'en utilise pas vraiment ... (ce qui ne veut pas dire que je n'en utilise pas sur le plan professionnel !!! Même que je suis tellement un fou que je suis aujourd'hui confronté à l'utilisation du CVS !!! )

Petit brin de culture générale, le CVS (Concurrent Versions System) est l'ancêtre du SVN, qui est l'ancêtre de GIT ...
Bref si vous êtes un peu curieux vous pourrez jeter un œil sur cette technologie datant des années 90 ... rien que ça !!
https://en.wikipedia.org/wiki/Concurrent_Versions_System

 Github et Git ?

Oui je me suis dit qu'il serait bien de détruire tout de suite le mythe !
Github n'est pas Git et Git n'est pas Github.
Github est une plateforme appartenant depuis peu à Microsoft (qui en est le plus gros contributeur d'après les rumeurs) qui utilise Git

 

Pourquoi est-ce que je vous parle de Github ?

La plupart des projets aujourd'hui passent par la case Github, c'est un moyen communautaire de faire vivre et de partager un projet avec le monde entier.

Le petit souci c'est que la plateforme Github n'offre pas à ma connaissance de moteur de recherche dans les repos ...

Donc lorsque l'on souhaite chercher un terme, on doit d'abord télécharger le projet.
Sauf que devoir télécharger des projets .. c'est sympa 2 minutes, mais je n'ai pas toujours l'envie, le stockage nécessaire, ou l'environnement qui le permet.

 

Rechercher dans Github

J'ai développé un bout de code  en Javascript, à exécuter directement dans la console, qui me permet de faire des recherches en récursif et multi-threadé.
Selon la taille du Repo ça peut aller plus ou moins vite.
Ce bout de code permet de chercher des termes et gère (pour les experts) les regex !

Sans plus attendre je vous propose une petite démo ici :

 

Le script

J'espère que cette démo vous aura plus.
Voici donc le code !

/*
*
*		Search in Github
*		(c) 2018 - 2019
*			Dyrk.org
*
*		Put this script in the developper console (F12)
*		at root of the Github Repository
*
*/

openNewGitFolder = function(url, search){
    x = new XMLHttpRequest();
    x.addEventListener('load', searchInGit = (function(url,search, req){
        var e = new DOMParser(), x = 0;
        doc = e.parseFromString(req.target.response, 'text/html');
        res = doc.getElementsByClassName('files js-navigation-container js-active-navigation-container')[0].getElementsByClassName('js-navigation-item');
        //get folders & files
		for (var i in  res){
			try {
                type = res[i].getElementsByTagName('svg')[0].getAttribute('aria-label');
                link = res[i].getElementsByTagName('a')[0].getAttribute('href');
                switch (type){
                    case 'directory':
                        setTimeout(openNewGitFolder.bind(null, link, search), x++ * 500); 
                    break;
                    case 'file':
                         setTimeout(openNewGitFile.bind(null, link, search), x++ * 500); 
                    break;
                }
            } catch (e){}
        }
    }).bind(null, url, search));
    x.open('GET', url);
    x.send(null);
}, openNewGitFile= function(url, search){
    x = new XMLHttpRequest();
    x.addEventListener('load', searchInGit = (function(url,search, req){
        reg = new RegExp(search);
		if (reg.exec(req.target.response))
			console.log("RESULT ======>   ",[document.location.protocol,'//',document.location.hostname,'/',url].join(''));
    }).bind(null, url, search));
    x.open('GET', url);
    x.send(null);
};
openNewGitFolder(document.location,prompt('Term to search'));

 

 

Conclusion

C'est tout pour aujourd'hui, j'espère que ce script vous sera utile.
Il existe probablement des solutions qui  permettent ce genre de chose.
L’intérêt ici, c'est de vous offrir quelques lignes de code assez "clean" sans que vous n'ayez à installer sur votre machine un truc dont vous n'avez pas la maîtrise.
Ici, il n'y a rien à installer, et le code est suffisamment court pour vous montrer qu'il ne présente (normalement) aucun risque.

 

 

Partagez ce contenu

2 comments

  • Salut,

    Tu dis que « Le petit souci c’est que la plateforme Github n’offre pas à ma connaissance de moteur de recherche dans les repos …« , pourtant quand tu utilises le champ de recherche (celui du header) tu as l’option (« in this repository » ou « all github ») de chercher dans le repos dans lequel tu te situes. Ou alors tu veux juste t’amuser à faire des scripts js, ce qui reste intéressant :D

    Bonne journée

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *