15:31 < tarek> haypo: ping
15:31 < haypo> tarek: pong
15:31 < tarek> haypo: je test pysandbox et j'ai des questions
15:32 < tarek> j'ai besoin de loader un module puis de lister les elements qu'il contient, puis eventuellement de les executer
15:32 < tarek> pysandbox permet l'execution directe
15:32 < tarek> mais est ce qu'il permet de renvoyer un objet module
15:34 < haypo> "import module"" est autorisé dans pysandbox, ça renvoie un faux module
15:35 < haypo> dir(module) ne liste que les symboles autorisés par ta politique de sécurité
15:36 < haypo> il me semble que dir() marche bien mieux avec Python 2.6 pour pysandbox ;:)
15:37 < tarek> et compile() existe ?
15:37 < tarek> car j'ai un fichier
15:37 < haypo> tarek: tu peux autoriser compile() oui
15:38 < tarek> haypo: bon je vais essayer
15:38 < tarek> en fait il me faut un boostrap si j'ai bien compris
15:39 < tarek> un bout de python qui renvoie un module avec un appel a compile() dans la sandbox
15:39 < haypo> le code non sûr doit être exécuté dans la sandbox
15:40 < tarek> je vais faire un snippet pour te montrer
15:40 < haypo> tarek: c'est la feature 'code' qui autorise compile()
15:41 < haypo> je reboote et je reviens de suite
15:51 < haypo> tarek: pysandbox est encore un projet expérimental, qui manque de doc
15:51 < haypo> je ne comprends pas moi même exactement comment il fonctionne :)
15:51 < haypo> mais avec un exemple de code, je devrais pouvoir t'en dire plus ;)
16:13 < tarek> haypo: ouai j'ecris ca
16:14 < tarek> j'essaye de me rappeler comment passer d'un objet code a un objet module
16:14 < haypo> un objet code n'est pas dangeureux
16:15 < haypo> par contre, pysandbox interdit de crée un objet code arbitraire :-p
16:17 < tarek> j'essaye de passer d'une string qui represente le contenu d'un fichier, vers un module
16:19 < haypo> tarek: et ça marche ou pas ?
16:19 < tarek> ben j'essaye deja en python pur
16:19 < tarek> j;ai oublie comment faire
16:19 < haypo> je ne vois pas ce que tu veux dire par "passer une chaîne à un module"
16:20 < tarek> j'ai dis ca moi ?
16:21 < haypo> "j'essaye de passer d'une string qui represente le contenu d'un fichier, vers un module" je n'ai pas compris ça
16:21 < tarek> s = "def hello(): return 'hello'"
16:21 < tarek> ca c'est une chaine
16:21 < tarek> qui represente du code
16:22 < tarek> je veux creer un oject module avec
16:22 < tarek> j'essaye imp.load_source
16:23 < haypo> import sys; mod=type(sys)('name'); compile(code, '<string>', 'exec') in mod.__dict__ # gruik
16:25 < tarek> compile(code, '<string>', 'exec') ca renvoie un objec code
16:25 < tarek> apres je sais pas comment creer un objet module avec
16:28 < tarek> ah j'ai trouve
16:28 < tarek> module 'new'
16:28 < gawel> m = types.ModuleType()
16:29 < tarek> par contre, mmm comment le remplir
16:29 < tarek> gawel: ouai ou types. tiens new est plus dans py3
16:29 < tarek> gawel: mmm, j'ai le contenu dans un object 'code'
16:29 < gawel> ou exec in mod.__dict__ comme disait haypo
16:30 < tarek> non ca colle pas ca
16:31 < tarek> exec in mod.__dict__ ca renvoie un boolean
16:31 < tarek> compile(code, '<string>', 'exec') ca renvoie un objet code
16:31 < tarek> ce qui me manque c'est letape ou l'objet module est remplie avec l'objet code
16:32 < tarek> j'ai l'impression que je me prends la tete pour rien
16:32 < gawel> je crois aussi
16:32 < tarek> module = load_module_from_string(string) !!
16:32 < tarek> c'est cette fonction que je cherche
16:32 < tarek> module = load_module_from_string(module_name, string)
16:33 < tarek> dans imp il y a tout mais avec les fichiers
16:35 < tarek> en fait c'est presque ce que haypo disais
16:36 < tarek> sauf que compile(code, '<string>', 'exec') != code = compile(code, '<string>', 'exec'); exec code in mod.__dict__
16:37 < haypo> tarek: arg, j'ai loupé "exec "dans mon copier-coller
16:37 < haypo> import sys; mod=type(sys)('name'); exec compile(code, '<string>', 'exec') in mod.__dict__ # gruik
16:38 < tarek> bon ca marche
16:38 < haypo> mod=type(sys)('name') <=> mod = types.ModuleType('name')
16:39 < tarek> etape 1: done
16:39 < tarek> etape 2: haypo, comment passer a pysandbox dans cet exemple ?
16:39 < haypo> tarek: c'est quoi que tu veux exécuter dans pysandbox ?N
16:40 < tarek> de maniere a loader le module dans la sandbox
16:40 < tarek> puis par la suite l'execution de ses elements
16:40 < haypo> tarek: hum. pysandbox ne protège que le code exécuté dans pysandbox
16:41 < tarek> ok. donc, comment executer ce code dans pysandbox ?
16:41 < haypo> tu peux pas charger une module dangeureux dans pysandbox puis l'exécuter en dehors de pysandbox
16:41 < tarek> j'ai pas l'intention de l'executer en dehors
16:42 < haypo> tarek: à la fin, que fais-tu de ton module ? tu exécutés quoi ? une fonction porécise ?
16:42 < tarek> peut etre qu'il manque une abstraction
16:42 < tarek> n'importe quelle fonction dedans
16:42 < tarek> module = SandBoxedModule(name, code)
16:42 < tarek> module.la_func()
16:43 < tarek> tu connais zope ?
16:43 < tarek> sandbox.run(module, function, args)
16:43 < tarek> dans zope il ya RestrictedPython
16:43 < tarek> qui permet d'utiliser des objets "Python"
16:43 < tarek> c'est un peu l'idee
16:44 < tarek> je veux pouvoir loader dynamiquenent des "modules" virtuels
16:44 < tarek> contenant des fonctions
16:44 < tarek> et appeler ces fonctions
16:46 < tarek> c'est pour ca que je parlais de bootstraping tout a l'heure
16:46 < tarek> e.g. la creation de modules dans la sandbox, puis leurs appels
16:48 < haypo> ça pête car écrire dans stdout est dangeureux ! (interdit par la politique par dfaut)
16:48 < haypo> utilise config = SandboxConfig('stdout', 'code') pour autoriser print
16:49 < tarek> ah cool, extra !
16:49 < haypo> pas besoin de créer un module
16:49 < haypo> il te faut juste un espace de nom (dico namespace ici)
16:49 < tarek> au final j'ai une classe qui publie call(nom_fonction, args)
16:50 < tarek> ouai c parfait ca
16:50 < tarek> j'implemente
16:51 < haypo> normalement, .execute() est safe si tu ne passes rien de dangeureux dans locals
16:51 < haypo> il utilise globals={} pour n'avoir aucune variable glboale
16:51 < haypo> tarek: je suis impressioné que ça marche, je pensais que ton use case n'était pas géré :)
16:51 < haypo> si ça marche bien, faudrait que je l'ajoute en exemple
16:51 < tarek> je suis ravi alors
16:52 < tarek> mon use case final:
16:52 < tarek> creation de web services avec redbarrel,
16:52 < tarek> definition avec le dsl du service
16:52 < tarek> et upload de "libs" python (modules)
16:52 < haypo> bon, je vais pouvoir rajouter des portes dérobées pour rooter mozilla alors
16:52 < tarek> puis link des libs dans le dsl
16:52 < tarek> bah, ca va tourner dans des VMs
16:52 < tarek> mais il me faut une sandbox pour l'UI surtout
16:53 < tarek> pour pouvoir prevenir le user etc
16:53 < haypo> tarek: le fichier README de pysandbox liste les limitations (et failles possibles)
16:53 < tarek> ok, je vais voir
16:53 < tarek> la c du prototypage mais
16:53 < tarek> a terme, j'aimerais supporter JS aussi
16:54 < haypo> je pense qu'il y a des outils plus élaborés (simples?) pour sandboxer javascript
16:54 < tarek> aucune idee
16:54 < tarek> dans le proto tout est fonctionel. me manque juste l'upload de code pour creer des libs
16:56 < haypo> attention ! parfois les proto partent en prod :)
16:56 < haypo> une conf en a parlé à pycon fr
16:57 < tarek> ca me derangerais oas
16:57 < tarek> du moment que c'est une VM
16:59 < tarek> haypo: call() peut passer des arguments ?
17:03 < tarek> bon bah ca marche nickel
17:28 < haypo> tarek: tu peux éviter __text en écrivant le texte directement dans l'argument passé à sandbox.execute()
17:28 < haypo> 'exec compile(%r, "<string>", "exec")' % code # encore plus gruik !
17:34 < encolpe> ça marche avec eval ?
17:34 [#] encolpe cours se cacher
17:35 < haypo> encolpe: pysandbox autorise eval(), mais eval() ne permet pas de définir une fonction (hello)
17:38 < haypo> je lis douvent qu'eval est dangeureux, mais en fait non
17:38 < haypo> eval() n'autorise pas import, def, ou autre
17:39 < haypo> exec+compile() est bien plus dangeureux :)
17:39 < haypo> >>> eval('import os')
17:39 < haypo> SyntaxError: invalid syntax
17:39 < haypo> >>> eval('1+1')
22:36 < tarek> benoitc: ping
23:02 < tarek> benoitc: c'est 1.5 millions actives, 4 millions registered
23:03 < benoitc> tarek: k je vais remplacer
23:03 < benoitc> ya d'autres trucs à revoir aussi
23:04 < tarek> je fini un truc et je suis a toi
23:04 < benoitc> enfonin là je re dans 4h
23:04 < benoitc> je vais dormir un peu ..
23:21 < haypo> bonjour gevent ! bonjour <cookie en clair> !
23:22 < haypo> ah ah, ça me rappelle une conférence avec une clé en clair :)
23:24 < haypo> tarek: ton webservice affiche potentiellement des infos sensibles, non ?
23:24 < haypo> dumoins, dans ta vidéo :)
23:24 < tarek> a oui c juste une demo
23:25 < haypo> en tout cas, on dirait que ça marche
23:25 < tarek> c pour montrer que la fonction recoit la rquete
23:25 < misc> amusant, mplayer boucle sur la video
23:25 < tarek> a oui moi auissi
23:27 < tarek> haypo: oui nickel la sandbox :D
23:27 < tarek> l;etape d'apres c la meme en js
23:27 < haypo> misc: pas ici