Creating Import Hooks

Jean-Michel Pichavant jeanmichel at sequans.com
Thu Feb 18 07:38:30 EST 2010


Sreejith K wrote:
> On Feb 18, 3:49 pm, Jean-Michel Pichavant <jeanmic... at sequans.com>
> wrote:
>   
>> Sreejith K wrote:
>>     
>>> On Feb 18, 1:57 pm, Steven D'Aprano
>>> <ste... at REMOVE.THIS.cybersource.com.au> wrote:
>>>       
>>>> On Thu, 18 Feb 2010 00:03:51 -0800, Jonathan Gardner wrote:
>>>>         
>>>>> On Feb 17, 10:48 pm, Sreejith K <sreejith... at gmail.com> wrote:
>>>>>           
>>>>>> Hi everyone,
>>>>>>             
>>>>>> I need to implement custom import hooks for an application
>>>>>> (http://www.python.org/dev/peps/pep-0302/). I want to restrict an
>>>>>> application to import certain modules (say socket module). Google app
>>>>>> engine is using a module hook to do this (HardenedModulesHook in
>>>>>> google/ appengine/tools/dev_appserver.py). But I want to allow that
>>>>>> application to use an sdk module (custom) which imports and uses socket
>>>>>> module. But the module hook restricts the access by sdk. Finding out,
>>>>>> which file is importing a module give a solution?? ie. If the
>>>>>> application is importing socket module, I want to restrict it. But if
>>>>>> the sdk module is importing socket I want to allow it. Is there any way
>>>>>> I can do this ?
>>>>>>             
>>>>>> Application
>>>>>> ========
>>>>>> import sdk
>>>>>> import socket               # I dont want to allow this (need to raise
>>>>>> ImportError)
>>>>>>             
>>>>>> SDK
>>>>>> ====
>>>>>> import socket               # need to allow this
>>>>>>             
>>>>> SDK
>>>>> ===
>>>>> import socket
>>>>>           
>>>>> App
>>>>> ===
>>>>> import SDK
>>>>> import sys
>>>>> socket = sys.modules['socket']
>>>>>           
>>>> I'm not sure, but I think Sreejith wants to prohibit imports from the App
>>>> layer while allowing them from the SDK layer, not work around a
>>>> prohibition in the SDK layer.
>>>>         
>>>> In other words, he wants the import hook to do something like this:
>>>>         
>>>> if module is socket and the caller is not SKD:
>>>>     prohibit
>>>> else
>>>>     allow
>>>>         
>>>> I could be wrong of course.
>>>>         
>>>> --
>>>> Steven
>>>>         
>>> @Steven, Thats exactly what I want.. Anyway to do that ??
>>>       
>> import sys
>> sys.modules['socket'] = None
>>
>> import socket
>> ---------------------------------------------------------------------------
>> ImportError                               Traceback (most recent call last)
>>
>> ImportError: No module named socket
>>
>> JM
>>     
>
> @Jean. Thanks for the reply. But this is not what I wanted. The import
> hook already restricts socket imports in applications. But I want them
> in sdk package (alone) which is being imported in the application. I
> don't want applications to directly use the socket module. That means
> I want to make some exceptions for sdk in import hooks.
>   
give us your code (the hook import)

in your entry file:

import socket
import sys
sys.modules['sdkSocket'] = sys.modules['socket'] # allow to import 
socket ad sdkSocket
sys.modules['socket'] = None # forbid to import socket
del socket

within your SDK:
import sdkSocket # actually the socket module

print sdkSocket.__file__
'/usr/lib/python2.5/socket.pyc'

JM



More information about the Python-list mailing list