"""User Folder Extension, tests now also ip number of the host where the original call comes from in case of redirects""" import Globals from AccessControl.User import UserFolder from Globals import MessageDialog class IntranetUserFolder(UserFolder): """User folder for Intranet""" _domain_auth_mode=1 # Identification via domain meta_type="IntranetUserFolder" def authenticate(self, name, password, request): emergency = self._emergency_user if name is None: return None if emergency and name==emergency.getUserName(): user = emergency else: user = self.getUser(name) if user is not None and user.authenticate(password, request): return user else: return None def domainSpecMatch(self,spec, request): host='' addr='' # Fast exit for the match-all case if len(spec) == 1 and spec[0] == '*': return 1 if request.has_key('REMOTE_HOST'): host=request['REMOTE_HOST'] if request.has_key('REMOTE_ADDR'): addr=request['REMOTE_ADDR'] if request.has_key('HTTP_X_FORWARDED_FOR'): addr=request['HTTP_X_FORWARDED_FOR'] if not host and not addr: return 0 if not host: try: host=socket.gethostbyaddr(addr)[0] except: pass if not addr: try: addr=socket.gethostbyname(host) except: pass _host=host.split('.') _addr=addr.split('.') _hlen=len(_host) _alen=len(_addr) for ob in spec: sz=len(ob) _ob=ob.split('.') _sz=len(_ob) mo = addr_match(ob) if mo is not None: if mo.end(0)==sz: fail=0 for i in range(_sz): a=_addr[i] o=_ob[i] if (o != a) and (o != '*'): fail=1 break if fail: continue return 1 mo = host_match(ob) if mo is not None: if mo.end(0)==sz: if _hlen < _sz: continue elif _hlen > _sz: _item=_host[-_sz:] else: _item=_host fail=0 for i in range(_sz): h=_item[i] o=_ob[i] if (o != h) and (o != '*'): fail=1 break if fail: continue return 1 return 0 Globals.default__class_init__(IntranetUserFolder) def manage_addIntranetUserFolder(self,dtself=None,REQUEST=None,**ignored): """add a user folder """ f=IntranetUserFolder() self=self.this() try: self._setObject('acl_users', f) except: return MessageDialog( title ='Item Exists', message='This object already contains a User Folder', action ='%s/manage_main' % REQUEST['URL1']) self.__allow_groups__=f if REQUEST is not None: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main') def manage_addIntranetUserFolderForm(self): """add a user folder form""" return manage_addIntranetUserFolder(self,REQUEST=self.REQUEST)