diff options
| -rw-r--r-- | server/src/leap/soledad/server/_blobs.py | 34 | ||||
| -rw-r--r-- | server/src/leap/soledad/server/_config.py (renamed from server/src/leap/soledad/server/config.py) | 32 | ||||
| -rw-r--r-- | server/src/leap/soledad/server/_resource.py | 22 | ||||
| -rw-r--r-- | server/src/leap/soledad/server/_wsgi.py | 18 | ||||
| -rw-r--r-- | server/src/leap/soledad/server/auth.py | 2 | ||||
| -rw-r--r-- | server/src/leap/soledad/server/entrypoint.py | 4 | ||||
| -rw-r--r-- | testing/tests/server/test_server.py | 3 | 
7 files changed, 82 insertions, 33 deletions
| diff --git a/server/src/leap/soledad/server/_blobs.py b/server/src/leap/soledad/server/_blobs.py new file mode 100644 index 00000000..0424aae0 --- /dev/null +++ b/server/src/leap/soledad/server/_blobs.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# _blobs.py +# Copyright (C) 2017 LEAP +# +# 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 3 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, see <http://www.gnu.org/licenses/>. +""" +Blobs Server implementation. +""" +from twisted.web import resource + + +__all__ = ['blobs_resource'] + + +class BlobsResource(resource.Resource): + +    isLeaf = True + +    def render_GET(self, request): +        return 'blobs is not implemented yet!' + + +blobs_resource = BlobsResource() diff --git a/server/src/leap/soledad/server/config.py b/server/src/leap/soledad/server/_config.py index 3c17ec19..2c7f530d 100644 --- a/server/src/leap/soledad/server/config.py +++ b/server/src/leap/soledad/server/_config.py @@ -19,12 +19,16 @@  import configparser +__all__ = ['get_config'] + +  CONFIG_DEFAULTS = {      'soledad-server': {          'couch_url': 'http://localhost:5984',          'create_cmd': None,          'admin_netrc': '/etc/couchdb/couchdb-admin.netrc', -        'batching': True +        'batching': True, +        'blobs': False,      },      'database-security': {          'members': ['soledad'], @@ -35,7 +39,17 @@ CONFIG_DEFAULTS = {  } -def load_configuration(file_path): +_config = None + + +def get_config(): +    global _config +    if not _config: +        _config = _load_config('/etc/soledad/soledad-server.conf') +    return _config['soledad-server'] + + +def _load_config(file_path):      """      Load server configuration from file. @@ -45,23 +59,23 @@ def load_configuration(file_path):      @return: A dictionary with the configuration.      @rtype: dict      """ -    defaults = dict(CONFIG_DEFAULTS) +    conf = dict(CONFIG_DEFAULTS)      config = configparser.SafeConfigParser()      config.read(file_path) -    for section in defaults: +    for section in conf:          if not config.has_section(section):              continue -        for key, value in defaults[section].items(): +        for key, value in conf[section].items():              if not config.has_option(section, key):                  continue              elif type(value) == bool: -                defaults[section][key] = config.getboolean(section, key) +                conf[section][key] = config.getboolean(section, key)              elif type(value) == list:                  values = config.get(section, key).split(',')                  values = [v.strip() for v in values] -                defaults[section][key] = values +                conf[section][key] = values              else: -                defaults[section][key] = config.get(section, key) +                conf[section][key] = config.get(section, key)      # TODO: implement basic parsing/sanitization of options comming from      # config file. -    return defaults +    return conf diff --git a/server/src/leap/soledad/server/_resource.py b/server/src/leap/soledad/server/_resource.py index 4070d786..4f8e98df 100644 --- a/server/src/leap/soledad/server/_resource.py +++ b/server/src/leap/soledad/server/_resource.py @@ -17,8 +17,10 @@  """  A twisted resource that serves the Soledad Server.  """ +from twisted.web.error import Error  from twisted.web.resource import Resource +from ._blobs import blobs_resource  from ._wsgi import get_sync_resource @@ -33,11 +35,21 @@ class SoledadResource(Resource):      def __init__(self, sync_pool=None):          sync_resource = get_sync_resource(sync_pool) -        self.children = {'': sync_resource} +        self.children = { +            'sync': sync_resource, +            'blobs': blobs_resource, +        }      def getChild(self, path, request): -        # for now, just "rewind" the path and serve the wsgi resource for all -        # requests. In the future, we might look into the request path to -        # decide which child resources should serve each request. +        """ +        Decide which child resource to serve based on the given path. +        """ +        if path == 'blobs': +            if not self._blobs_enabled: +                msg = 'Blobs feature is disabled in this server.' +                raise Error(403, message=msg) +            return self.children['blobs'] + +        # rewind the path and serve the wsgi sync resource          request.postpath.insert(0, request.prepath.pop()) -        return self.children[''] +        return self.children['sync'] diff --git a/server/src/leap/soledad/server/_wsgi.py b/server/src/leap/soledad/server/_wsgi.py index 3e30d560..c00d00ae 100644 --- a/server/src/leap/soledad/server/_wsgi.py +++ b/server/src/leap/soledad/server/_wsgi.py @@ -27,7 +27,6 @@ from twisted.web.wsgi import WSGIResource  from leap.soledad.server import SoledadApp  from leap.soledad.server.gzip_middleware import GzipMiddleware -from leap.soledad.server.config import load_configuration  from leap.soledad.common.backend import SoledadBackend  from leap.soledad.common.couch.state import CouchServerState  from leap.soledad.common.log import getLogger @@ -36,18 +35,7 @@ from leap.soledad.common.log import getLogger  __all__ = ['init_couch_state', 'get_sync_resource'] -_config = None - - -def get_config(): -    global _config -    if not _config: -        _config = load_configuration('/etc/soledad/soledad-server.conf') -    return _config['soledad-server'] - - -def _get_couch_state(): -    conf = get_config() +def _get_couch_state(conf):      state = CouchServerState(conf['couch_url'], create_cmd=conf['create_cmd'],                               check_schema_versions=True)      SoledadBackend.BATCH_SUPPORT = conf.get('batching', False) @@ -67,9 +55,9 @@ wsgi_application = GzipMiddleware(_app)  # work.  Because of that, we delay couch state initialization until the reactor  # is running. -def init_couch_state(_app): +def init_couch_state(conf):      try: -        _app.state = _get_couch_state() +        _app.state = _get_couch_state(conf)      except Exception as e:          logger = getLogger()          logger.error(str(e)) diff --git a/server/src/leap/soledad/server/auth.py b/server/src/leap/soledad/server/auth.py index a5d90c46..d7ccdeb9 100644 --- a/server/src/leap/soledad/server/auth.py +++ b/server/src/leap/soledad/server/auth.py @@ -36,7 +36,7 @@ from twisted.web.resource import IResource  from leap.soledad.common.couch import couch_server  from ._resource import SoledadResource -from ._wsgi import get_config +from ._config import get_config  @implementer(IRealm) diff --git a/server/src/leap/soledad/server/entrypoint.py b/server/src/leap/soledad/server/entrypoint.py index 7501a447..714490ae 100644 --- a/server/src/leap/soledad/server/entrypoint.py +++ b/server/src/leap/soledad/server/entrypoint.py @@ -19,13 +19,13 @@ The entrypoint for Soledad server.  """  from twisted.internet import reactor -from .config import load_configuration +from ._config import get_config  from ._session import SoledadSession  from ._wsgi import init_couch_state  # load configuration from file -conf = load_configuration('/etc/soledad/soledad-server.conf') +conf = get_config  class SoledadEntrypoint(SoledadSession): diff --git a/testing/tests/server/test_server.py b/testing/tests/server/test_server.py index da69c423..866d9eab 100644 --- a/testing/tests/server/test_server.py +++ b/testing/tests/server/test_server.py @@ -379,5 +379,6 @@ class ConfigurationParsingTest(unittest.TestCase):                      'sudo -u soledad-admin /usr/bin/create-user-db',                      'admin_netrc':                      '/etc/couchdb/couchdb-soledad-admin.netrc', -                    'batching': False} +                    'batching': False, +                    'blobs': False}          self.assertDictEqual(expected, config['soledad-server']) | 
