diff --git a/util/config/validator.py b/util/config/validator.py index 5835d1267..a263d6d89 100644 --- a/util/config/validator.py +++ b/util/config/validator.py @@ -22,6 +22,7 @@ from util.config.validators.validate_torrent import BittorrentValidator from util.config.validators.validate_ssl import SSLValidator, SSL_FILENAMES from util.config.validators.validate_google_login import GoogleLoginValidator from util.config.validators.validate_bitbucket_trigger import BitbucketTriggerValidator +from util.config.validators.validate_gitlab_trigger import GitLabTriggerValidator logger = logging.getLogger(__name__) @@ -71,32 +72,6 @@ def _validate_database(config, user_obj, _): raise ex -def _validate_gitlab(config, user_obj, _): - """ Validates the OAuth credentials and API endpoint for a GitLab service. """ - github_config = config.get('GITLAB_TRIGGER_CONFIG') - if not github_config: - raise ConfigValidationException('Missing GitLab client id and client secret') - - endpoint = github_config.get('GITLAB_ENDPOINT') - if not endpoint: - raise ConfigValidationException('Missing GitLab Endpoint') - - if endpoint.find('http://') != 0 and endpoint.find('https://') != 0: - raise ConfigValidationException('GitLab Endpoint must start with http:// or https://') - - if not github_config.get('CLIENT_ID'): - raise ConfigValidationException('Missing Client ID') - - if not github_config.get('CLIENT_SECRET'): - raise ConfigValidationException('Missing Client Secret') - - client = app.config['HTTPCLIENT'] - oauth = GitLabOAuthService(config, 'GITLAB_TRIGGER_CONFIG') - result = oauth.validate_client_id_and_secret(client, app.config) - if not result: - raise ConfigValidationException('Invalid client id or client secret') - - def _validate_github(config_key): return lambda config, user_obj, _: _validate_github_with_key(config_key, config) @@ -143,7 +118,7 @@ VALIDATORS = { EmailValidator.name: EmailValidator.validate, 'github-login': _validate_github('GITHUB_LOGIN_CONFIG'), 'github-trigger': _validate_github('GITHUB_TRIGGER_CONFIG'), - 'gitlab-trigger': _validate_gitlab, + GitLabTriggerValidator.name: GitLabTriggerValidator.validate, BitbucketTriggerValidator.name: BittorrentValidator.validate, GoogleLoginValidator.name: GoogleLoginValidator.validate, SSLValidator.name: SSLValidator.validate, diff --git a/util/config/validators/test/test_validate_gitlab_trigger.py b/util/config/validators/test/test_validate_gitlab_trigger.py new file mode 100644 index 000000000..eaa855db8 --- /dev/null +++ b/util/config/validators/test/test_validate_gitlab_trigger.py @@ -0,0 +1,41 @@ +import json +import pytest + +from httmock import urlmatch, HTTMock + +from util.config.validators import ConfigValidationException +from util.config.validators.validate_gitlab_trigger import GitLabTriggerValidator + +@pytest.mark.parametrize('unvalidated_config', [ + ({}), + ({'GITLAB_TRIGGER_CONFIG': {}}), + ({'GITLAB_TRIGGER_CONFIG': {'GITLAB_ENDPOINT': 'foo'}}), + ({'GITLAB_TRIGGER_CONFIG': {'GITLAB_ENDPOINT': 'http://someendpoint', 'CLIENT_ID': 'foo'}}), + ({'GITLAB_TRIGGER_CONFIG': {'GITLAB_ENDPOINT': 'http://someendpoint', 'CLIENT_SECRET': 'foo'}}), +]) +def test_validate_invalid_gitlab_trigger_config(unvalidated_config): + validator = GitLabTriggerValidator() + + with pytest.raises(ConfigValidationException): + validator.validate(unvalidated_config, None, None) + +def test_validate_gitlab_trigger(): + url_hit = [False] + + @urlmatch(netloc=r'somegitlab', path='/oauth/token') + def handler(_, __): + url_hit[0] = True + return {'status_code': 400, 'content': json.dumps({'error': 'invalid code'})} + + with HTTMock(handler): + validator = GitLabTriggerValidator() + validator.validate({ + 'GITLAB_TRIGGER_CONFIG': { + 'GITLAB_ENDPOINT': 'http://somegitlab', + 'CLIENT_ID': 'foo', + 'CLIENT_SECRET': 'bar', + }, + }, None, None) + + assert url_hit[0] + diff --git a/util/config/validators/validate_gitlab_trigger.py b/util/config/validators/validate_gitlab_trigger.py new file mode 100644 index 000000000..d507d8ad6 --- /dev/null +++ b/util/config/validators/validate_gitlab_trigger.py @@ -0,0 +1,32 @@ +from app import app +from oauth.services.gitlab import GitLabOAuthService +from util.config.validators import BaseValidator, ConfigValidationException + +class GitLabTriggerValidator(BaseValidator): + name = "gitlab-trigger" + + @classmethod + def validate(cls, config, user, user_password): + """ Validates the OAuth credentials and API endpoint for a GitLab service. """ + github_config = config.get('GITLAB_TRIGGER_CONFIG') + if not github_config: + raise ConfigValidationException('Missing GitLab client id and client secret') + + endpoint = github_config.get('GITLAB_ENDPOINT') + if not endpoint: + raise ConfigValidationException('Missing GitLab Endpoint') + + if endpoint.find('http://') != 0 and endpoint.find('https://') != 0: + raise ConfigValidationException('GitLab Endpoint must start with http:// or https://') + + if not github_config.get('CLIENT_ID'): + raise ConfigValidationException('Missing Client ID') + + if not github_config.get('CLIENT_SECRET'): + raise ConfigValidationException('Missing Client Secret') + + client = app.config['HTTPCLIENT'] + oauth = GitLabOAuthService(config, 'GITLAB_TRIGGER_CONFIG') + result = oauth.validate_client_id_and_secret(client, app.config) + if not result: + raise ConfigValidationException('Invalid client id or client secret')