Skip to content
This repository has been archived by the owner on Apr 9, 2023. It is now read-only.

Commit

Permalink
Fix static file configuration (#67)
Browse files Browse the repository at this point in the history
  • Loading branch information
vangheem committed Feb 27, 2017
1 parent 068cc71 commit 144b724
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 21 deletions.
5 changes: 4 additions & 1 deletion src/plone.server/CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
1.0a13 (unreleased)
-------------------

- Nothing changed yet.
Fixes:

- Fix static file configuration
[vangheem]


1.0a12 (2017-02-27)
Expand Down
10 changes: 5 additions & 5 deletions src/plone.server/plone/server/api/files.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# -*- coding: utf-8 -*-
from aiohttp.web import StreamResponse
from os.path import basename
from plone.server import configure
from plone.server.api.service import DownloadService
from plone.server.api.service import TraversableDownloadService
Expand All @@ -19,13 +18,14 @@
@configure.service(context=IStaticFile, method='GET', permission='plone.AccessContent')
class DefaultGET(DownloadService):
async def __call__(self):
if hasattr(self.context, '_file_path'):
with open(self.context._file_path, 'rb') as f:
filename = basename(self.context._file_path)
if hasattr(self.context, 'file_path'):
filepath = str(self.context.file_path.absolute())
filename = self.context.file_path.name
with open(filepath, 'rb') as f:
resp = StreamResponse(headers=aiohttp.MultiDict({
'CONTENT-DISPOSITION': 'attachment; filename="%s"' % filename
}))
resp.content_type = mimetypes.guess_type(self.context._file_path)
resp.content_type = mimetypes.guess_type(filename)
data = f.read()
resp.content_length = len(data)
await resp.prepare(self.request)
Expand Down
26 changes: 14 additions & 12 deletions src/plone.server/plone/server/content.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
from plone.server import FACTORY_CACHE
from plone.server import PERMISSIONS_CACHE
from plone.server import SCHEMA_CACHE
from plone.server.auth.security_code import PrincipalPermissionManager
from plone.server.auth.users import ANONYMOUS_USER_ID
from plone.server.auth.users import ROOT_USER_ID
from plone.server.auth.security_code import PrincipalPermissionManager
from plone.server.browser import get_physical_path
from plone.server.exceptions import ConflictIdOnContainer
from plone.server.exceptions import NoPermissionToAdd
Expand All @@ -24,8 +24,8 @@
from plone.server.interfaces import IConstrainTypes
from plone.server.interfaces import IContainer
from plone.server.interfaces import IItem
from plone.server.interfaces import IPrincipalRoleManager
from plone.server.interfaces import IPrincipalPermissionManager
from plone.server.interfaces import IPrincipalRoleManager
from plone.server.interfaces import IResource
from plone.server.interfaces import IResourceFactory
from plone.server.interfaces import ISite
Expand All @@ -50,9 +50,10 @@
from zope.lifecycleevent import ObjectAddedEvent
from zope.lifecycleevent import ObjectRemovedEvent
from zope.schema.interfaces import IContextAwareDefaultFactory
from zope.security.interfaces import IPermission
from zope.security.interfaces import IInteraction
from zope.security.interfaces import IPermission

import pathlib
import uuid


Expand Down Expand Up @@ -460,25 +461,26 @@ def install(self):

@implementer(IStaticFile)
class StaticFile(object):
def __init__(self, file_path):
self._file_path = file_path
def __init__(self, file_path: pathlib.Path):
self.file_path = file_path


@implementer(IStaticDirectory)
class StaticDirectory(object):

_items = {}
class StaticDirectory(dict):
"""
Using dict makes this a simple container so traversing works
"""

def __init__(self, file_path):
self._file_path = file_path
def __init__(self, file_path: pathlib.Path):
self.file_path = file_path
for x in file_path.iterdir():
if not x.name.startswith('.') and '/' not in x.name:
self._items[x.name] = StaticFile(str(x.absolute()))
self[x.name] = StaticFile(x)


@configure.adapter(for_=IStaticFile, provides=IPrincipalPermissionManager, trusted=True)
@configure.adapter(for_=IStaticDirectory, provides=IPrincipalPermissionManager, trusted=True)
class StaticFileSpecialPermissions(PrincipalPermissionManager):
def __init__(self, db):
super(StaticFileSpecialPermissions, self).__init__()
self.grantPermissionToPrincipal('plone.AccessContent', ANONYMOUS_USER_ID)
self.grant_permission_to_principal('plone.AccessContent', ANONYMOUS_USER_ID)
12 changes: 9 additions & 3 deletions src/plone.server/plone/server/factory/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@
from plone.server import logger
from plone.server.async import IAsyncUtility
from plone.server.content import load_cached_schema
from plone.server.content import StaticDirectory
from plone.server.content import StaticFile
from plone.server.contentnegotiation import ContentNegotiatorUtility
from plone.server.exceptions import RequestNotFound
from plone.server.factory.content import ApplicationRoot
from plone.server.interfaces import IApplication
from plone.server.interfaces import IDatabase
from plone.server.interfaces import IDatabaseConfigurationFactory
from plone.server.interfaces.content import IContentNegotiation
from plone.server.interfaces import IDatabase
from plone.server.traversal import TraversalRouter
from plone.server.exceptions import RequestNotFound
from zope.component import getAllUtilitiesRegisteredFor
from zope.component import getUtility
from zope.component import provideUtility
Expand All @@ -28,6 +29,7 @@
import collections
import inspect
import json
import pathlib


try:
Expand Down Expand Up @@ -181,7 +183,11 @@ def make_app(config_file=None, settings=None):

for static in app_settings['static']:
for key, file_path in static.items():
root[key] = StaticFile(file_path)
path = pathlib.Path(file_path)
if path.is_dir():
root[key] = StaticDirectory(path)
else:
root[key] = StaticFile(path)

root.set_root_user(app_settings['root_user'])

Expand Down

0 comments on commit 144b724

Please sign in to comment.