122 lines
3.5 KiB
Python
122 lines
3.5 KiB
Python
|
import redis
|
||
|
import os
|
||
|
import json
|
||
|
import ldap
|
||
|
|
||
|
from data.users import LDAPConnection
|
||
|
from flask import Flask
|
||
|
from flask.ext.mail import Mail, Message
|
||
|
from data.database import validate_database_url, User
|
||
|
from storage import get_storage_driver
|
||
|
from app import app, OVERRIDE_CONFIG_DIRECTORY
|
||
|
from auth.auth_context import get_authenticated_user
|
||
|
from util.oauth import GoogleOAuthConfig, GithubOAuthConfig
|
||
|
|
||
|
SSL_FILENAMES = ['ssl.cert', 'ssl.key']
|
||
|
|
||
|
def validate_service_for_config(service, config):
|
||
|
""" Attempts to validate the configuration for the given service. """
|
||
|
if not service in _VALIDATORS:
|
||
|
return {
|
||
|
'status': False
|
||
|
}
|
||
|
|
||
|
try:
|
||
|
_VALIDATORS[service](config)
|
||
|
return {
|
||
|
'status': True
|
||
|
}
|
||
|
except Exception as ex:
|
||
|
return {
|
||
|
'status': False,
|
||
|
'reason': str(ex)
|
||
|
}
|
||
|
|
||
|
def _validate_database(config):
|
||
|
""" Validates connecting to the database. """
|
||
|
validate_database_url(config['DB_URI'])
|
||
|
|
||
|
def _validate_redis(config):
|
||
|
""" Validates connecting to redis. """
|
||
|
redis_config = config['BUILDLOGS_REDIS']
|
||
|
client = redis.StrictRedis(socket_connect_timeout=5, **redis_config)
|
||
|
client.ping()
|
||
|
|
||
|
def _validate_registry_storage(config):
|
||
|
""" Validates registry storage. """
|
||
|
parameters = config.get('DISTRIBUTED_STORAGE_CONFIG', {}).get('local', ['LocalStorage', {}])
|
||
|
try:
|
||
|
driver = get_storage_driver(parameters)
|
||
|
except TypeError:
|
||
|
raise Exception('Missing required storage configuration parameter(s)')
|
||
|
|
||
|
# Put and remove a temporary file.
|
||
|
driver.put_content('_verify', 'testing 123')
|
||
|
driver.remove('_verify')
|
||
|
|
||
|
def _validate_mailing(config):
|
||
|
""" Validates sending email. """
|
||
|
test_app = Flask("mail-test-app")
|
||
|
test_app.config.update(config)
|
||
|
test_app.config.update({
|
||
|
'MAIL_FAIL_SILENTLY': False,
|
||
|
'TESTING': False
|
||
|
})
|
||
|
|
||
|
test_mail = Mail(test_app)
|
||
|
test_msg = Message("Test e-mail from %s" % app.config['REGISTRY_TITLE'])
|
||
|
test_msg.add_recipient(get_authenticated_user().email)
|
||
|
test_mail.send(test_msg)
|
||
|
|
||
|
def _validate_github_login(config):
|
||
|
""" Validates the OAuth credentials and API endpoint for Github Login. """
|
||
|
client = app.config['HTTPCLIENT']
|
||
|
oauth = GithubOAuthConfig(config, 'GITHUB_LOGIN_CONFIG')
|
||
|
endpoint = oauth.authorize_endpoint()
|
||
|
# TODO: this
|
||
|
|
||
|
|
||
|
def _validate_ssl(config):
|
||
|
""" Validates the SSL configuration (if enabled). """
|
||
|
if config.get('PREFERRED_URL_SCHEME', 'http') != 'https':
|
||
|
return
|
||
|
|
||
|
for filename in SSL_FILENAMES:
|
||
|
if not os.path.exists(os.path.join(OVERRIDE_CONFIG_DIRECTORY, filename)):
|
||
|
raise Exception('Missing required SSL file: %s' % filename)
|
||
|
|
||
|
|
||
|
def _validate_ldap(config):
|
||
|
""" Validates the LDAP connection. """
|
||
|
if config.get('AUTHENTICATION_TYPE', 'Database') != 'LDAP':
|
||
|
return
|
||
|
|
||
|
# Note: raises ldap.INVALID_CREDENTIALS on failure
|
||
|
admin_dn = config.get('LDAP_ADMIN_DN')
|
||
|
admin_passwd = config.get('LDAP_ADMIN_PASSWD')
|
||
|
|
||
|
if not admin_dn:
|
||
|
raise Exception('Missing Admin DN for LDAP configuration')
|
||
|
|
||
|
if not admin_passwd:
|
||
|
raise Exception('Missing Admin Password for LDAP configuration')
|
||
|
|
||
|
ldap_uri = config.get('LDAP_URI', 'ldap://localhost')
|
||
|
|
||
|
try:
|
||
|
with LDAPConnection(ldap_uri, admin_dn, admin_passwd):
|
||
|
pass
|
||
|
except ldap.LDAPError as ex:
|
||
|
values = ex.args[0] if ex.args else {}
|
||
|
raise Exception(values.get('desc', 'Unknown error'))
|
||
|
|
||
|
|
||
|
_VALIDATORS = {
|
||
|
'database': _validate_database,
|
||
|
'redis': _validate_redis,
|
||
|
'registry-storage': _validate_registry_storage,
|
||
|
'mail': _validate_mailing,
|
||
|
'github-login': _validate_github_login,
|
||
|
'ssl': _validate_ssl,
|
||
|
'ldap': _validate_ldap,
|
||
|
}
|