gitlab oauth
This commit is contained in:
parent
7426a540dd
commit
3ac884beb4
9 changed files with 88 additions and 14 deletions
5
app.py
5
app.py
|
@ -26,7 +26,7 @@ from data.queue import WorkQueue
|
||||||
from util.analytics import Analytics
|
from util.analytics import Analytics
|
||||||
from util.exceptionlog import Sentry
|
from util.exceptionlog import Sentry
|
||||||
from util.names import urn_generator
|
from util.names import urn_generator
|
||||||
from util.oauth import GoogleOAuthConfig, GithubOAuthConfig
|
from util.oauth import GoogleOAuthConfig, GithubOAuthConfig, GitLabOAuthConfig
|
||||||
from util.signing import Signer
|
from util.signing import Signer
|
||||||
from util.queuemetrics import QueueMetrics
|
from util.queuemetrics import QueueMetrics
|
||||||
from util.config.provider import FileConfigProvider, TestConfigProvider
|
from util.config.provider import FileConfigProvider, TestConfigProvider
|
||||||
|
@ -124,8 +124,9 @@ tf = app.config['DB_TRANSACTION_FACTORY']
|
||||||
|
|
||||||
github_login = GithubOAuthConfig(app.config, 'GITHUB_LOGIN_CONFIG')
|
github_login = GithubOAuthConfig(app.config, 'GITHUB_LOGIN_CONFIG')
|
||||||
github_trigger = GithubOAuthConfig(app.config, 'GITHUB_TRIGGER_CONFIG')
|
github_trigger = GithubOAuthConfig(app.config, 'GITHUB_TRIGGER_CONFIG')
|
||||||
|
gitlab_trigger = GitLabOAuthConfig(app.config, 'GITLAB_TRIGGER_CONFIG')
|
||||||
google_login = GoogleOAuthConfig(app.config, 'GOOGLE_LOGIN_CONFIG')
|
google_login = GoogleOAuthConfig(app.config, 'GOOGLE_LOGIN_CONFIG')
|
||||||
oauth_apps = [github_login, github_trigger, google_login]
|
oauth_apps = [github_login, github_trigger, gitlab_trigger, google_login]
|
||||||
|
|
||||||
image_diff_queue = WorkQueue(app.config['DIFFS_QUEUE_NAME'], tf)
|
image_diff_queue = WorkQueue(app.config['DIFFS_QUEUE_NAME'], tf)
|
||||||
dockerfile_build_queue = WorkQueue(app.config['DOCKERFILE_BUILD_QUEUE_NAME'], tf,
|
dockerfile_build_queue = WorkQueue(app.config['DOCKERFILE_BUILD_QUEUE_NAME'], tf,
|
||||||
|
|
50
endpoints/gitlabtrigger.py
Normal file
50
endpoints/gitlabtrigger.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from flask import Blueprint, request, redirect, url_for
|
||||||
|
from flask.ext.login import current_user
|
||||||
|
|
||||||
|
from app import app, gitlab_trigger
|
||||||
|
from auth.auth import require_session_login
|
||||||
|
from auth.permissions import AdministerRepositoryPermission
|
||||||
|
from data import model
|
||||||
|
from endpoints.common import route_show_if
|
||||||
|
from util.http import abort
|
||||||
|
from util.names import parse_repository_name
|
||||||
|
|
||||||
|
import features
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
client = app.config['HTTPCLIENT']
|
||||||
|
gitlabtrigger = Blueprint('gitlab', __name__)
|
||||||
|
|
||||||
|
@gitlabtrigger.route('/gitlab/callback/trigger', methods=['GET'])
|
||||||
|
@route_show_if(features.GITLAB_BUILD)
|
||||||
|
@require_session_login
|
||||||
|
def attach_gitlab_build_trigger():
|
||||||
|
state = request.args.get('state', None)
|
||||||
|
if not state:
|
||||||
|
abort(400)
|
||||||
|
state = state[len('repo:'):]
|
||||||
|
try:
|
||||||
|
[namespace, repository] = state.split('/')
|
||||||
|
except ValueError:
|
||||||
|
abort(400)
|
||||||
|
|
||||||
|
permission = AdministerRepositoryPermission(namespace, repository)
|
||||||
|
if permission.can():
|
||||||
|
code = request.args.get('code')
|
||||||
|
token = gitlab_trigger.exchange_code_for_token(app.config, client, code)
|
||||||
|
repo = model.get_repository(namespace, repository)
|
||||||
|
if not repo:
|
||||||
|
msg = 'Invalid repository: %s/%s' % (namespace, repository)
|
||||||
|
abort(404, message=msg)
|
||||||
|
|
||||||
|
trigger = model.create_build_trigger(repo, 'gitlab', token, current_user.db_user())
|
||||||
|
repo_path = '%s/%s' % (namespace, repository)
|
||||||
|
full_url = '%s%s%s' % (url_for('web.repository', path=repo_path), '?tab=builds&newtrigger=', trigger.uuid)
|
||||||
|
|
||||||
|
logger.debug('Redirecting to full url: %s', full_url)
|
||||||
|
return redirect(full_url)
|
||||||
|
|
||||||
|
abort(403)
|
|
@ -235,4 +235,4 @@ def github_oauth_attach():
|
||||||
|
|
||||||
return render_ologin_error('GitHub', err)
|
return render_ologin_error('GitHub', err)
|
||||||
|
|
||||||
return redirect(url_for('web.user'))
|
return redirect(url_for('web.user'))
|
||||||
|
|
|
@ -205,6 +205,7 @@ def initialize_database():
|
||||||
BuildTriggerService.create(name='github')
|
BuildTriggerService.create(name='github')
|
||||||
BuildTriggerService.create(name='custom-git')
|
BuildTriggerService.create(name='custom-git')
|
||||||
BuildTriggerService.create(name='bitbucket')
|
BuildTriggerService.create(name='bitbucket')
|
||||||
|
BuildTriggerService.create(name='gitlab')
|
||||||
|
|
||||||
AccessTokenKind.create(name='build-worker')
|
AccessTokenKind.create(name='build-worker')
|
||||||
AccessTokenKind.create(name='pushpull-token')
|
AccessTokenKind.create(name='pushpull-token')
|
||||||
|
|
|
@ -13,7 +13,7 @@ angular.module('quay').factory('KeyService', ['$location', 'Config', function($l
|
||||||
keyService['githubLoginClientId'] = oauth['GITHUB_LOGIN_CONFIG']['CLIENT_ID'];
|
keyService['githubLoginClientId'] = oauth['GITHUB_LOGIN_CONFIG']['CLIENT_ID'];
|
||||||
keyService['googleLoginClientId'] = oauth['GOOGLE_LOGIN_CONFIG']['CLIENT_ID'];
|
keyService['googleLoginClientId'] = oauth['GOOGLE_LOGIN_CONFIG']['CLIENT_ID'];
|
||||||
|
|
||||||
keyService['gitlabRedirectUri'] = Config.getURL('/oauth2/gitlab/callback');
|
keyService['gitlabRedirectUri'] = Config.getUrl('/oauth2/gitlab/callback');
|
||||||
keyService['githubRedirectUri'] = Config.getUrl('/oauth2/github/callback');
|
keyService['githubRedirectUri'] = Config.getUrl('/oauth2/github/callback');
|
||||||
keyService['googleRedirectUri'] = Config.getUrl('/oauth2/google/callback');
|
keyService['googleRedirectUri'] = Config.getUrl('/oauth2/google/callback');
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ angular.module('quay').factory('KeyService', ['$location', 'Config', function($l
|
||||||
keyService['githubTriggerEndpoint'] = oauth['GITHUB_TRIGGER_CONFIG']['GITHUB_ENDPOINT'];
|
keyService['githubTriggerEndpoint'] = oauth['GITHUB_TRIGGER_CONFIG']['GITHUB_ENDPOINT'];
|
||||||
keyService['githubTriggerAuthorizeUrl'] = oauth['GITHUB_TRIGGER_CONFIG']['AUTHORIZE_ENDPOINT'];
|
keyService['githubTriggerAuthorizeUrl'] = oauth['GITHUB_TRIGGER_CONFIG']['AUTHORIZE_ENDPOINT'];
|
||||||
|
|
||||||
keySerivce['gitlabTriggerEndpoint'] = oauth['GITLAB_TRIGGER_CONFIG']['GITLAB_ENDPOINT'];
|
keyService['gitlabTriggerEndpoint'] = oauth['GITLAB_TRIGGER_CONFIG']['GITLAB_ENDPOINT'];
|
||||||
keyService['gitlabTriggerAuthorizeUrl'] = oauth['GITLAB_TRIGGER_CONFIG']['AUTHORIZE_ENDPOINT'];
|
keyService['gitlabTriggerAuthorizeUrl'] = oauth['GITLAB_TRIGGER_CONFIG']['AUTHORIZE_ENDPOINT'];
|
||||||
|
|
||||||
keyService['githubLoginScope'] = 'user:email';
|
keyService['githubLoginScope'] = 'user:email';
|
||||||
|
|
|
@ -104,12 +104,11 @@ angular.module('quay').factory('TriggerService', ['UtilService', '$sanitize', 'K
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
'get_redirect_url': function(namespace, repository) {
|
'get_redirect_url': function(namespace, repository) {
|
||||||
var redirect_uri = KeyService['gitlabRedirectUri'] + '/trigger/' +
|
var redirect_uri = KeyService['gitlabRedirectUri'] + '/trigger';
|
||||||
namespace + '/' + repository;
|
|
||||||
var authorize_url = KeyService['gitlabTriggerAuthorizeUrl'];
|
var authorize_url = KeyService['gitlabTriggerAuthorizeUrl'];
|
||||||
var client_id = KeyService['gitlabTriggerClientId'];
|
var client_id = KeyService['gitlabTriggerClientId'];
|
||||||
|
|
||||||
return authorize_url + 'client_id=' + client_id + '&redirect_uri=' + redirect_uri;
|
return authorize_url + '?client_id=' + client_id + '&redirect_uri=' + redirect_uri + '&response_type=code&state=repo:' + namespace + '/' + repository;
|
||||||
},
|
},
|
||||||
'is_external': false,
|
'is_external': false,
|
||||||
'is_enabled': function() {
|
'is_enabled': function() {
|
||||||
|
|
Binary file not shown.
|
@ -15,9 +15,6 @@ class OAuthConfig(object):
|
||||||
def user_endpoint(self):
|
def user_endpoint(self):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
def login_endpoint(self):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def validate_client_id_and_secret(self, http_client):
|
def validate_client_id_and_secret(self, http_client):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@ -200,4 +197,31 @@ class GoogleOAuthConfig(OAuthConfig):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class GitLabOAuthConfig(OAuthConfig):
|
||||||
|
def __init__(self, config, key_name):
|
||||||
|
super(GitLabOAuthConfig, self).__init__(config, key_name)
|
||||||
|
|
||||||
|
def _endpoint(self):
|
||||||
|
endpoint = self.config.get('GITLAB_ENDPOINT', 'https://gitlab.com')
|
||||||
|
if not endpoint.endswith('/'):
|
||||||
|
endpoint = endpoint + '/'
|
||||||
|
return endpoint
|
||||||
|
|
||||||
|
def service_name(self):
|
||||||
|
return 'GitLab'
|
||||||
|
|
||||||
|
def authorize_endpoint(self):
|
||||||
|
return self._get_url(self._endpoint(), '/oauth/authorize')
|
||||||
|
|
||||||
|
def token_endpoint(self):
|
||||||
|
return self._get_url(self._endpoint(), '/oauth/token')
|
||||||
|
|
||||||
|
def validate_client_id_and_secret(self, http_client):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_public_config(self):
|
||||||
|
return {
|
||||||
|
'CLIENT_ID': self.client_id(),
|
||||||
|
'AUTHORIZE_ENDPOINT': self.authorize_endpoint(),
|
||||||
|
'GITLAB_ENDPOINT': self._endpoint(),
|
||||||
|
}
|
||||||
|
|
5
web.py
5
web.py
|
@ -1,6 +1,3 @@
|
||||||
import logging
|
|
||||||
import logging.config
|
|
||||||
|
|
||||||
from app import app as application
|
from app import app as application
|
||||||
|
|
||||||
from endpoints.api import api_bp
|
from endpoints.api import api_bp
|
||||||
|
@ -9,10 +6,12 @@ from endpoints.webhooks import webhooks
|
||||||
from endpoints.realtime import realtime
|
from endpoints.realtime import realtime
|
||||||
from endpoints.oauthlogin import oauthlogin
|
from endpoints.oauthlogin import oauthlogin
|
||||||
from endpoints.githubtrigger import githubtrigger
|
from endpoints.githubtrigger import githubtrigger
|
||||||
|
from endpoints.gitlabtrigger import gitlabtrigger
|
||||||
from endpoints.bitbuckettrigger import bitbuckettrigger
|
from endpoints.bitbuckettrigger import bitbuckettrigger
|
||||||
|
|
||||||
application.register_blueprint(web)
|
application.register_blueprint(web)
|
||||||
application.register_blueprint(githubtrigger, url_prefix='/oauth2')
|
application.register_blueprint(githubtrigger, url_prefix='/oauth2')
|
||||||
|
application.register_blueprint(gitlabtrigger, url_prefix='/oauth2')
|
||||||
application.register_blueprint(oauthlogin, url_prefix='/oauth2')
|
application.register_blueprint(oauthlogin, url_prefix='/oauth2')
|
||||||
application.register_blueprint(bitbuckettrigger, url_prefix='/oauth1')
|
application.register_blueprint(bitbuckettrigger, url_prefix='/oauth1')
|
||||||
application.register_blueprint(api_bp, url_prefix='/api')
|
application.register_blueprint(api_bp, url_prefix='/api')
|
||||||
|
|
Reference in a new issue