##############################################################################
#
# SafeDAV -- A set of patches to limit DAV access to those objects that
#            can safely/usefully be edited through DAV (i.e. acl_users and
#            its content would be excluded
# Copyright (C) 2004 Iris Advies
#               emiliano@iris-advies.nl
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Some portions of this module are Copyright Zope Corporation and
# Contributors.
# The original copyright statement is reproduced below.
#
##############################################################################
#
# Copyright (c) 2001 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""
$Id$
"""

from zLOG import LOG, INFO

def safeToList(x):
   return (hasattr(x, '__dav_resource__') and x.__dav_resource__ != 0)

def listDAVObjects(self):
   objectValues = getattr(self, 'objectValues', None)
   if objectValues is not None:
      return filter(safeToList, objectValues())
   return []

def log(msg):
   LOG('SafeDAV', INFO, msg)

from App.version_txt import getZopeVersion, version_txt
zope_version = getZopeVersion()
str_version = version_txt().split()[1].strip(',')
if not zope_version < (2, 7, 4):
   log('Zope %s. Patches *NOT* applied.' % str_version)
else:
   log('Zope %s. Applying patches.' % str_version)

   from webdav.Resource import Resource
   from webdav.Collection import Collection

   del Resource.__dav_resource__
   log('General DAV Resource patched')

   Collection.__dav_resource__ = 1
   Collection.listDAVObjects = listDAVObjects
   log('General DAV Collection patched')

   # enable some resources
   try:
      from Products.CMFDefault.Document import Document
   except:
      log('CMFDefault.Document not found, not patching')
   else:
      Document.__dav_resource__ = 1
      log('CMFDefault.Document patched')

   try:
      from Products.CMFDefault.Image import Image
   except:
      log('CMFDefault.Image not found, not patching')
   else:
      Image.__dav_resource__ = 1
      log('CMFDefault.Image patched')

   try:
      from Products.CMFDefault.File import File
   except:
      log('CMFDefault.File not found, not patching')
   else:
      File.__dav_resource__ = 1
      log('CMFDefault.File patched')

   try:
      from Products.CMFPhoto.Photo import Photo
   except:
      log('CMFPhoto.Photo not found, not patching')
   else:
      Photo.__dav_resource__ = 1
      log('CMFPhoto.Photo patched')

   # disable some collections
   try:
      from App.ApplicationManager import ApplicationManager
   except:
      log('App.ApplicationManager not found, not patching')
   else:
      ApplicationManager.__dav_resource__ = 0
      log('App.ApplicationManager patched')

   try:
      from Products.Archetypes.ArchetypeTool import ArchetypeTool
   except:
      log('Products.Archetypes.ArchetypeTool not found, not patching')
   else:
      ArchetypeTool.__dav_resource__ = 0
      log('Products.Archetypes.ArchetypeTool patched')

   try:
      from Products.Archetypes.ArchTTWTool import ArchTTWTool
   except:
      log('Products.Archetypes.ArchTTWTool not found, not patching')
   else:
      ArchTTWTool.__dav_resource__ = 0
      log('Products.Archetypes.ArchTTWTool patched')

   try:
      from Products.CMFBoard.ForumFolder import ForumFolder
   except:
      log('Products.CMFBoard.ForumFolder not found, not patching')
   else:
      ForumFolder.__dav_resource__ = 0
      log('Products.CMFBoard.ForumFolder patched')

   try:
      from Products.CMFCore.ActionsTool import ActionsTool
   except:
      log('Products.CMFCore.ActionsTool not found, not patching')
   else:
      ActionsTool.__dav_resource__ = 0
      log('Products.CMFCore.ActionsTool patched')

   try:
      from Products.CMFCore.SkinsTool import SkinsTool
   except:
      log('Products.CMFCore.SkinsTool not found, not patching')
   else:
      SkinsTool.__dav_resource__ = 0
      log('Products.CMFCore.SkinsTool patched')

   try:
      from Products.CMFCore.TypesTool import TypesTool
   except:
      log('Products.CMFCore.TypesTool not found, not patching')
   else:
      TypesTool.__dav_resource__ = 0
      log('Products.CMFCore.TypesTool patched')

   try:
      from Products.CMFCore.WorkflowTool import WorkflowTool
   except:
      log('Products.CMFCore.WorkflowTool not found, not patching')
   else:
      WorkflowTool.__dav_resource__ = 0
      log('Products.CMFCore.WorkflowTool patched')

   try:
      from Products.CMFCore.CatalogTool import CatalogTool
   except:
      log('Products.CMFCore.CatalogTool not found, not patching')
   else:
      CatalogTool.__dav_resource__ = 0
      log('Products.CMFCore.CatalogTool patched')

   try:
      from Products.CMFPlone.FactoryTool import FactoryTool
   except:
      log('Products.CMFPlone.FactoryTool not found, not patching')
   else:
      FactoryTool.__dav_resource__ = 0
      log('Products.CMFPlone.FactoryTool patched')

   try:
      from Products.CMFPlone.PropertiesTool import PropertiesTool
   except:
      log('Products.CMFPlone.PropertiesTool not found, not patching')
   else:
      PropertiesTool.__dav_resource__ = 0
      log('Products.CMFPlone.PropertiesTool patched')

   try:
      from Products.CMFPlone.PloneControlPanel import PloneControlPanel
   except:
      log('Products.CMFPlone.PloneControlPanel not found, not patching')
   else:
      PloneControlPanel.__dav_resource__ = 0
      log('Products.CMFPlone.PloneControlPanel patched')

   try:
      from Products.CMFTopic.Topic import Topic
   except:
      log('Products.CMFTopic.Topic not found, not patching')
   else:
      Topic.__dav_resource__ = 0
      log('Products.CMFTopic.Topic patched')

   try:
      from Products.DCWorkflow.ContainerTab import ContainerTab
   except:
      log('Products.DCWorkflow.ContainerTab not found, not patching')
   else:
      ContainerTab.__dav_resource__ = 0
      log('Products.DCWorkflow.ContainerTab patched')

   try:
      from Products.DCWorkflow.DCWorkflow import DCWorkflow
   except:
      log('Products.DCWorkflow.DCWorkflow not found, not patching')
   else:
      DCWorkflow.__dav_resource__ = 0
      log('Products.DCWorkflow.DCWorkflow patched')

   try:
      from Products.GroupUserFolder.GRUFFolder import GRUFFolder
   except:
      log('Products.GroupUserFolder.GRUFFolder not found, not patching')
   else:
      GRUFFolder.__dav_resource__ = 0
      log('Products.GroupUserFolder.GRUFFolder patched')

   try:
      from Products.GroupUserFolder.GroupUserFolder import GroupUserFolder
   except:
      log('Products.GroupUserFolder.GroupUserFolder not found, not patching')
   else:
      GroupUserFolder.__dav_resource__ = 0
      log('Products.GroupUserFolder.GroupUserFolder patched')

   try:
      from Products.PlacelessTranslationService.PlacelessTranslationService import PlacelessTranslationService
   except:
      log('Products.PlacelessTranslationService.PlacelessTranslationService not found, not patching')
   else:
      PlacelessTranslationService.__dav_resource__ = 0
      log('Products.PlacelessTranslationService.PlacelessTranslationService patched')

   try:
      from Products.PortalTransforms.zope.MimeTypesTool import MimeTypesTool
   except:
      log('Products.PortalTransforms.zope.MimeTypesTool not found, not patching')
   else:
      MimeTypesTool.__dav_resource__ = 0
      log('Products.PortalTransforms.zope.MimeTypesTool patched')

   try:
      from Products.PortalTransforms.zope.TransformTool import TransformTool
   except:
      log('Products.PortalTransforms.zope.TransformTool not found, not patching')
   else:
      TransformTool.__dav_resource__ = 0
      log('Products.PortalTransforms.zope.TransformTool patched')

   try:
      from Products.CMFQuickInstallerTool.QuickInstallerTool import QuickInstallerTool
   except:
      log('Products.CMFQuickInstallerTool.QuickInstallerTool not found, not patching')
   else:
      QuickInstallerTool.__dav_resource__ = 0
      log('Products.CMFQuickInstallerTool.QuickInstallerTool patched')

   try:
      from Products.ZCatalog.ZCatalog import ZCatalog
   except:
      log('Products.ZCatalog.ZCatalog not found, not patching')
   else:
      ZCatalog.__dav_resource__ = 0
      log('Products.ZCatalog.ZCatalog patched')

