Пример #1
0
    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
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
 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
Пример #8
0
 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
Пример #9
0
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()
Пример #10
0
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()