1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
##############################################################################
#
# AuthBridge.py
# Classes to pass Zope authentication information to XMLRPC methods
#
# Copyright (c) 2003-2005 Atsushi Shibata. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted, provided that
# the above copyright notice appear in all copies and that both that copyright
# notice and this permission notice appear in supporting documentation, and that
# the name of Atsushi Shibata not be used in advertising or publicity pertaining
# to distribution of the software without specific, written prior permission.
#
# ATSUSHI SHIBAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
# EVENT SHALL SHIBAT ATSUSHI BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
##############################################################################
from OFS.SimpleItem import SimpleItem
import Globals
from base64 import encodestring,decodestring
_debug_mode = 1
class AuthBridge(SimpleItem):
'''
Bridge class to pass Zope authentication via xmlrpc
'''
manage_options = (SimpleItem.manage_options)
def __before_publishing_traverse__(self, container, REQUEST):
'''__before_publishing_traverse__ hook.'''
#Check if TraversalRequest is in procedure map.
if len(REQUEST['TraversalRequestNameStack']) == 1 and \
REQUEST['TraversalRequestNameStack'][0] in self.proc_dict.keys() and \
len(self.proc_dict[REQUEST['TraversalRequestNameStack'][0]]) >= 2:
#then set auth informations
proc_name = REQUEST['TraversalRequestNameStack'][0]
username = REQUEST.args[self.proc_dict[proc_name][0]]
password = REQUEST.args[self.proc_dict[proc_name][1]]
if _debug_mode:
#Log request
try:
import zLOG
log_body = ""
idx = 0
zLOG.LOG("XML-RPC Log.", zLOG.INFO,
self.id + "." + REQUEST['TraversalRequestNameStack'][0],
detail=REQUEST.args)
except:
pass
REQUEST._auth = "basic " + encodestring('%s:%s' % (username,password))
REQUEST.RESPONSE._auth = 1
#remap method if need
if len(self.proc_dict[proc_name]) >= 3:
REQUEST['TraversalRequestNameStack'][0] = self.proc_dict[proc_name][2]
def set_proc_map(self,proc_dict):
self.proc_dict = proc_dict
Globals.InitializeClass(AuthBridge)
|