|
- from __future__ import absolute_import
-
- import json
- import os
- import sys
-
- # noinspection PyUnresolvedReferences
- from six.moves.urllib.parse import urlparse
-
- from realms.lib.util import in_vagrant
-
-
- class Config(object):
-
- urlparse = urlparse
-
- APP_PATH = os.path.abspath(os.path.dirname(__file__) + "/../..")
- USER_HOME = os.path.abspath(os.path.expanduser("~"))
-
- # Best to change to /var/run
- PIDFILE = "/tmp/realms-wiki.pid"
-
- ENV = 'DEV'
-
- HOST = "0.0.0.0"
- PORT = 5000
- BASE_URL = 'http://localhost'
- SITE_TITLE = "Realms"
-
- # http://flask-sqlalchemy.pocoo.org/config/#connection-uri-format
- DB_URI = 'sqlite:////tmp/wiki.db'
- # DB_URI = 'mysql://scott:tiger@localhost/mydatabase'
- # DB_URI = 'postgresql://scott:tiger@localhost/mydatabase'
- # DB_URI = 'oracle://scott:tiger@127.0.0.1:1521/sidname'
- # DB_URI = 'crate://'
-
- # LDAP = {
- # 'URI': '',
- #
- # # This BIND_DN/BIND_PASSWORD default to '', this is shown here for demonstrative purposes
- # # The values '' perform an anonymous bind so we may use search/bind method
- # 'BIND_DN': '',
- # 'BIND_AUTH': '',
- #
- # # Adding the USER_SEARCH field tells the flask-ldap-login that we are using
- # # the search/bind method
- # 'USER_SEARCH': {'base': 'dc=example,dc=com', 'filter': 'uid=%(username)s'},
- #
- # # Map ldap keys into application specific keys
- # 'KEY_MAP': {
- # 'name': 'cn',
- # 'company': 'o',
- # 'location': 'l',
- # 'email': 'mail',
- # }
- # }
-
- # OAUTH = {
- # 'twitter': {
- # 'key': '',
- # 'secret': ''
- # },
- # 'github': {
- # 'key': '',
- # 'secret': ''
- # }
- # }
-
- # Valid options: simple, redis, memcached
- CACHE_TYPE = 'simple'
-
- CACHE_REDIS_HOST = '127.0.0.1'
- CACHE_REDIS_PORT = 6379
- CACHE_REDIS_DB = '0'
-
- CACHE_MEMCACHED_SERVERS = ['127.0.0.1:11211']
-
- # Valid options: simple, elasticsearch, whoosh
- SEARCH_TYPE = 'simple'
-
- ELASTICSEARCH_URL = 'http://127.0.0.1:9200'
- ELASTICSEARCH_FIELDS = ["name"]
-
- WHOOSH_INDEX = '/tmp/whoosh'
- WHOOSH_LANGUAGE = 'en'
-
- # Get ReCaptcha Keys for your domain here:
- # https://www.google.com/recaptcha/admin#whyrecaptcha
- RECAPTCHA_ENABLE = False
- RECAPTCHA_USE_SSL = False
- RECAPTCHA_PUBLIC_KEY = "6LfYbPkSAAAAAB4a2lG2Y_Yjik7MG9l4TDzyKUao"
- RECAPTCHA_PRIVATE_KEY = "6LfYbPkSAAAAAG-KlkwjZ8JLWgwc9T0ytkN7lWRE"
- RECAPTCHA_OPTIONS = {}
-
- SECRET_KEY = 'CHANGE_ME'
-
- # Path on file system where wiki data will reside
- WIKI_PATH = '/tmp/wiki'
-
- # Name of page that will act as home
- WIKI_HOME = 'home'
-
- # Should we trust authentication set by a proxy
- AUTH_PROXY = False
- AUTH_PROXY_HEADER_NAME = "REMOTE_USER"
-
- AUTH_LOCAL_ENABLE = True
- ALLOW_ANON = True
- REGISTRATION_ENABLED = True
- PRIVATE_WIKI = False
-
- # None, firepad, and/or togetherjs
- COLLABORATION = 'togetherjs'
-
- # Required for firepad
- FIREBASE_HOSTNAME = None
-
- # Page names that can't be modified
- WIKI_LOCKED_PAGES = []
-
- ROOT_ENDPOINT = 'wiki.page'
-
- # Used by Flask-Login
- @property
- def LOGIN_DISABLED(self):
- return self.ALLOW_ANON
-
- # Depreciated variable name
- @property
- def LOCKED(self):
- return self.WIKI_LOCKED_PAGES[:]
-
- @property
- def SQLALCHEMY_DATABASE_URI(self):
- return self.DB_URI
-
- @property
- def _url(self):
- return urlparse(self.BASE_URL)
-
- @property
- def RELATIVE_PATH(self):
- return self._url.path
-
- USE_X_SENDFILE = False
-
- DEBUG = False
- ASSETS_DEBUG = False
- SQLALCHEMY_ECHO = False
- SQLALCHEMY_TRACK_MODIFICATIONS = False
-
- MODULES = ['wiki', 'search', 'auth']
-
- def __init__(self):
- for k, v in self.read().iteritems():
- setattr(self, k, v)
- if getattr(self, 'AUTH_LOCAL_ENABLE', True):
- self.MODULES.append('auth.local')
- if hasattr(self, 'OAUTH'):
- self.MODULES.append('auth.oauth')
- if hasattr(self, 'LDAP'):
- self.MODULES.append('auth.ldap')
- if hasattr(self, "AUTH_PROXY"):
- self.MODULES.append('auth.proxy')
- if in_vagrant():
- self.USE_X_SENDFILE = False
- if self.ENV == "DEV":
- self.DEBUG = True
- self.ASSETS_DEBUG = True
- self.SQLALCHEMY_ECHO = True
- self.USE_X_SENDFILE = False
-
- def update(self, data):
- conf = self.read()
- conf.update(data)
- return self.save(data)
-
- def read(self):
- conf = dict()
-
- for k, v in os.environ.items():
- if k.startswith('REALMS_'):
- conf[k[7:]] = v
-
- loc = self.get_path()
-
- if loc:
- with open(loc) as f:
- conf.update(json.load(f))
-
- if 'BASE_URL' in conf and conf['BASE_URL'].endswith('/'):
- conf['BASE_URL'] = conf['BASE_URL'][:-1]
-
- for k in ['APP_PATH', 'USER_HOME']:
- if k in conf:
- del conf[k]
-
- return conf
-
- def save(self, conf):
- loc = self.get_path(check_write=True)
- with open(loc, 'w') as f:
- f.write(json.dumps(conf, sort_keys=True, indent=4, separators=(',', ': ')).strip() + '\n')
- return loc
-
- def get_path(self, check_write=False):
- """Find config path
- """
- for loc in os.curdir, os.path.expanduser("~"), "/etc/realms-wiki":
- if not loc:
- continue
- path = os.path.join(loc, "realms-wiki.json")
- if os.path.isfile(path):
- # file exists
- if not check_write:
- # Don't care if I can write
- return path
-
- if os.access(path, os.W_OK):
- # Has write access, ok!
- return path
- elif os.path.isdir(loc) and check_write:
- # dir exists file doesn't
- if os.access(loc, os.W_OK):
- # can write file
- return path
- return None
-
- conf = Config()
|