def create_webhook(self, base_url, access_token, verify_ssl): webhook_secret = generate_token() session = http.build_session() uri = GitLabApiClientPath.build_api_url( base_url=base_url, path=GitLabApiClientPath.hooks ) resp = session.post( uri, headers={ 'Accept': 'application/json', 'Authorization': 'Bearer %s' % access_token, }, verify=verify_ssl, data={ 'url': absolute_uri('/extensions/gitlab/webhooks/'), 'token': webhook_secret, 'merge_requests_events': True, 'push_events': True, }, ) resp.raise_for_status() return resp.json()['id'], webhook_secret
def create_subscription(self, instance: Optional[str], identity_data: Mapping[str, Any], oauth_redirect_url: str) -> Response: client = self.get_client(Identity(data=identity_data), oauth_redirect_url) shared_secret = generate_token() return client.create_subscription(instance, shared_secret), shared_secret
def get_webhook_secret(self, organization): # TODO(LB): Revisit whether Integrations V3 should be using OrganizationOption for storage lock = locks.get(u"bitbucket:webhook-secret:{}".format(organization.id), duration=60) with lock.acquire(): secret = OrganizationOption.objects.get_value( organization=organization, key="bitbucket:webhook_secret" ) if secret is None: secret = generate_token() OrganizationOption.objects.set_value( organization=organization, key="bitbucket:webhook_secret", value=secret ) return secret
def get_webhook_secret(self, organization): # TODO(LB): Revisit whether Integrations V3 should be using OrganizationOption for storage lock = locks.get(u'bitbucket:webhook-secret:{}'.format(organization.id), duration=60) with lock.acquire(): secret = OrganizationOption.objects.get_value( organization=organization, key='bitbucket:webhook_secret', ) if secret is None: secret = generate_token() OrganizationOption.objects.set_value( organization=organization, key='bitbucket:webhook_secret', value=secret, ) return secret
def create_webhook(self, base_url, access_token, verify_ssl): webhook_secret = generate_token() session = http.build_session() uri = GitLabApiClientPath.build_api_url(base_url=base_url, path=GitLabApiClientPath.hooks) resp = session.post( uri, headers={ 'Accept': 'application/json', 'Authorization': 'Bearer %s' % access_token, }, verify=verify_ssl, data={ 'url': absolute_uri('/extensions/gitlab/webhooks/'), 'token': webhook_secret, 'merge_requests_events': True, 'push_events': True, }, ) resp.raise_for_status() return resp.json()['id'], webhook_secret
def build_integration(self, state): data = state['identity']['data'] oauth_data = self.get_oauth_data(data) user = get_user_info(data['access_token'], state['installation_data']) group = self.get_group_info(data['access_token'], state['installation_data']) scopes = sorted(GitlabIdentityProvider.oauth_scopes) base_url = state['installation_data']['url'] domain_name = '%s/%s' % (re.sub(r'https?://', '', base_url), group['path']) verify_ssl = state['installation_data']['verify_ssl'] integration = { 'name': group['name'], 'external_id': u'{}:{}'.format(urlparse(base_url).netloc, group['id']), 'metadata': { 'icon': group['avatar_url'], 'domain_name': domain_name, 'scopes': scopes, 'verify_ssl': verify_ssl, 'base_url': base_url, 'webhook_secret': generate_token() }, 'user_identity': { 'type': 'gitlab', 'external_id': u'{}:{}'.format(urlparse(base_url).netloc, user['id']), 'scopes': scopes, 'data': oauth_data, }, } return integration
def create_subscription(self, instance, identity_data, oauth_redirect_url): client = self.get_client(Identity(data=identity_data), oauth_redirect_url) shared_secret = generate_token() return client.create_subscription(instance, shared_secret), shared_secret
def vsts_subscription_check(integration_id, organization_id, **kwargs): integration = Integration.objects.get(id=integration_id) installation = integration.get_installation(organization_id=organization_id) client = installation.get_client() try: subscription_id = integration.metadata["subscription"]["id"] subscription = client.get_subscription( instance=installation.instance, subscription_id=subscription_id ) except (KeyError, ApiError) as e: logger.info( "vsts_subscription_check.failed_to_get_subscription", extra={ "integration_id": integration_id, "organization_id": organization_id, "error": six.text_type(e), }, ) subscription = None # https://docs.microsoft.com/en-us/rest/api/vsts/hooks/subscriptions/replace%20subscription?view=vsts-rest-4.1#subscriptionstatus if not subscription or subscription["status"] == "disabledBySystem": # Update subscription does not work for disabled subscriptions # We instead will try to delete and then create a new one. if subscription: try: client.delete_subscription( instance=installation.instance, subscription_id=subscription_id ) except ApiError as e: logger.info( "vsts_subscription_check.failed_to_delete_subscription", extra={ "integration_id": integration_id, "organization_id": organization_id, "subscription_id": subscription_id, "error": six.text_type(e), }, ) try: secret = generate_token() subscription = client.create_subscription( instance=installation.instance, shared_secret=secret ) except ApiError as e: logger.info( "vsts_subscription_check.failed_to_create_subscription", extra={ "integration_id": integration_id, "organization_id": organization_id, "error": six.text_type(e), }, ) else: integration.metadata["subscription"]["id"] = subscription["id"] integration.metadata["subscription"]["secret"] = secret logger.info( "vsts_subscription_check.updated_diabled_subscription", extra={ "integration_id": integration_id, "organization_id": organization_id, "subscription_id": subscription_id, }, ) integration.metadata["subscription"]["check"] = time() integration.save()
def vsts_subscription_check(integration_id, organization_id, **kwargs): integration = Integration.objects.get(id=integration_id) installation = integration.get_installation(organization_id=organization_id) client = installation.get_client() try: subscription_id = integration.metadata['subscription']['id'] subscription = client.get_subscription( instance=installation.instance, subscription_id=subscription_id, ) except (KeyError, ApiError) as e: logger.info( 'vsts_subscription_check.failed_to_get_subscription', extra={ 'integration_id': integration_id, 'organization_id': organization_id, 'error': six.text_type(e), } ) subscription = None # https://docs.microsoft.com/en-us/rest/api/vsts/hooks/subscriptions/replace%20subscription?view=vsts-rest-4.1#subscriptionstatus if not subscription or subscription['status'] == 'disabledBySystem': # Update subscription does not work for disabled subscriptions # We instead will try to delete and then create a new one. if subscription: try: client.delete_subscription( instance=installation.instance, subscription_id=subscription_id, ) except ApiError as e: logger.info( 'vsts_subscription_check.failed_to_delete_subscription', extra={ 'integration_id': integration_id, 'organization_id': organization_id, 'subscription_id': subscription_id, 'error': six.text_type(e), } ) try: secret = generate_token() subscription = client.create_subscription( instance=installation.instance, shared_secret=secret, ) except ApiError as e: logger.info( 'vsts_subscription_check.failed_to_create_subscription', extra={ 'integration_id': integration_id, 'organization_id': organization_id, 'error': six.text_type(e), } ) else: integration.metadata['subscription']['id'] = subscription['id'] integration.metadata['subscription']['secret'] = secret logger.info( 'vsts_subscription_check.updated_diabled_subscription', extra={ 'integration_id': integration_id, 'organization_id': organization_id, 'subscription_id': subscription_id, } ) integration.metadata['subscription']['check'] = time() integration.save()