def test_link_team_already_linked(self):
        """Test that if a team has already been linked to a Slack channel when a user tries
        to link them again, we reject the attempt and reply with the ALREADY_LINKED_MESSAGE"""
        ExternalActor.objects.create(
            actor_id=self.team.actor_id,
            organization=self.organization,
            integration=self.integration,
            provider=ExternalProviders.SLACK.value,
            external_name="general",
            external_id="CXXXXXXX9",
        )
        assert "Link your Sentry team to this Slack channel!" in self.data["text"]
        linking_url = build_team_linking_url(
            self.integration,
            "UXXXXXXX1",
            "CXXXXXXX9",
            "general",
            "http://example.slack.com/response_url",
        )

        resp = self.client.get(linking_url)

        assert resp.status_code == 200
        self.assertTemplateUsed(resp, "sentry/integrations/slack/link-team.html")

        data = urlencode({"team": self.team.id})
        resp = self.client.post(linking_url, data, content_type="application/x-www-form-urlencoded")
        assert resp.status_code == 200
        self.assertTemplateUsed(resp, "sentry/integrations/slack/post-linked-team.html")
        assert len(responses.calls) >= 1
        data = json.loads(str(responses.calls[0].request.body.decode("utf-8")))
        assert (
            f"The {self.team.slug} team has already been linked to a Slack channel." in data["text"]
        )
Exemple #2
0
    def link_team(self, slack_request: SlackCommandRequest) -> Response:
        if slack_request.channel_name == DIRECT_MESSAGE_CHANNEL_NAME:
            return self.reply(slack_request, LINK_FROM_CHANNEL_MESSAGE)

        identity = self.get_identity(slack_request)
        if not identity:
            return self.reply(slack_request, LINK_USER_FIRST_MESSAGE)

        integration = slack_request.integration
        organization = integration.organizations.all()[0]
        org_member = OrganizationMember.objects.get(user=identity.user,
                                                    organization=organization)

        if self.is_team_linked_to_channel(organization, integration,
                                          slack_request):
            return self.reply(slack_request, CHANNEL_ALREADY_LINKED_MESSAGE)

        if not is_valid_role(org_member):
            return self.reply(slack_request, INSUFFICIENT_ROLE_MESSAGE)

        associate_url = build_team_linking_url(
            integration=slack_request.integration,
            slack_id=slack_request.user_id,
            channel_id=slack_request.channel_id,
            channel_name=slack_request.channel_name,
            response_url=slack_request.response_url,
        )
        return self.reply(
            slack_request,
            LINK_TEAM_MESSAGE.format(associate_url=associate_url))
    def test_link_team_command(self):
        """Test that we successfully link a team to a Slack channel"""
        assert "Link your Sentry team to this Slack channel!" in self.data["text"]
        linking_url = build_team_linking_url(
            self.integration,
            "UXXXXXXX1",
            "CXXXXXXX9",
            "general",
            "http://example.slack.com/response_url",
        )

        resp = self.client.get(linking_url)
        assert resp.status_code == 200
        self.assertTemplateUsed(resp, "sentry/integrations/slack/link-team.html")

        data = urlencode({"team": self.team.id})
        resp = self.client.post(linking_url, data, content_type="application/x-www-form-urlencoded")
        assert resp.status_code == 200
        self.assertTemplateUsed(resp, "sentry/integrations/slack/post-linked-team.html")

        assert len(self.external_actor) == 1
        assert self.external_actor[0].actor_id == self.team.actor_id

        assert len(responses.calls) >= 1
        data = json.loads(str(responses.calls[0].request.body.decode("utf-8")))
        assert (
            f"The {self.team.slug} team will now receive issue alert notifications in the {self.external_actor[0].external_name} channel."
            in data["text"]
        )

        team_settings = NotificationSetting.objects.filter(
            scope_type=NotificationScopeType.TEAM.value, target=self.team.actor.id
        )
        assert len(team_settings) == 1
Exemple #4
0
    def link_team(self, slack_request: SlackDMRequest) -> Response:
        if slack_request.channel_name == DIRECT_MESSAGE_CHANNEL_NAME:
            return self.reply(slack_request, LINK_FROM_CHANNEL_MESSAGE)

        identity = get_identity(slack_request)
        if not identity:
            return self.reply(slack_request, LINK_USER_FIRST_MESSAGE)

        integration = slack_request.integration
        organization_memberships = OrganizationMember.objects.get_for_integration(
            integration, identity.user)

        has_valid_role = False
        for organization_memberships in organization_memberships:
            if is_team_linked_to_channel(organization_memberships.organization,
                                         slack_request):
                return self.reply(slack_request,
                                  CHANNEL_ALREADY_LINKED_MESSAGE)

            if is_valid_role(organization_memberships):
                has_valid_role = True

        if not has_valid_role:
            return self.reply(slack_request, INSUFFICIENT_ROLE_MESSAGE)

        associate_url = build_team_linking_url(
            integration=integration,
            slack_id=slack_request.user_id,
            channel_id=slack_request.channel_id,
            channel_name=slack_request.channel_name,
            response_url=slack_request.response_url,
        )
        return self.reply(
            slack_request,
            LINK_TEAM_MESSAGE.format(associate_url=associate_url))
Exemple #5
0
    def test_error_page(self):
        """Test that we successfully render an error page when bad form data is sent."""
        assert "Link your Sentry team to this Slack channel!" in self.data[
            "text"]
        linking_url = build_team_linking_url(
            self.integration,
            "UXXXXXXX1",
            "CXXXXXXX9",
            "general",
            "http://example.slack.com/response_url",
        )

        resp = self.client.get(linking_url)
        assert resp.status_code == 200
        self.assertTemplateUsed(resp,
                                "sentry/integrations/slack/link-team.html")

        data = urlencode({"team": ["some", "garbage"]})
        resp = self.client.post(
            linking_url,
            data,
            content_type="application/x-www-form-urlencoded")
        assert resp.status_code == 200
        self.assertTemplateUsed(
            resp, "sentry/integrations/slack/link-team-error.html")
 def setUp(self):
     super().setUp()
     self.url = build_team_linking_url(
         integration=self.integration,
         slack_id=self.external_id,
         channel_id=self.channel_id,
         channel_name=self.channel_name,
         response_url=self.response_url,
     )
    def test_link_team_insufficient_role_open_membership(self):
        """Test that when a user whose role is insufficient in an open membership organization
        attempts to link a team, we reject them and reply with the INSUFFICIENT_ROLE_MESSAGE"""
        self.organization.flags.allow_joinleave = True
        user2 = self.create_user()
        self.create_member(teams=[self.team],
                           user=user2,
                           role="member",
                           organization=self.organization)
        self.login_as(user2)
        Identity.objects.create(
            external_id="UXXXXXXX2",
            idp=self.idp,
            user=user2,
            status=IdentityStatus.VALID,
            scopes=[],
        )
        assert "Link your Sentry team to this Slack channel!" in self.data[
            "text"]
        linking_url = build_team_linking_url(
            self.integration,
            "UXXXXXXX2",
            "CXXXXXXX9",
            "general",
            "http://example.slack.com/response_url",
        )

        resp = self.client.get(linking_url)

        assert resp.status_code == 200
        self.assertTemplateUsed(resp,
                                "sentry/integrations/slack-link-team.html")

        data = urlencode({"team": self.team.id})
        resp = self.client.post(
            linking_url,
            data,
            content_type="application/x-www-form-urlencoded")
        assert resp.status_code == 200
        self.assertTemplateUsed(
            resp, "sentry/integrations/slack-post-linked-team.html")

        assert len(self.external_actor) == 0

        assert len(responses.calls) >= 1
        data = json.loads(str(responses.calls[0].request.body.decode("utf-8")))
        assert "You must be an admin or higher" in data["text"]
Exemple #8
0
    def link_team(self, slack_request: SlackCommandRequest) -> Response:

        if slack_request.channel_name == DIRECT_MESSAGE_CHANNEL_NAME:
            return self.send_ephemeral_notification(LINK_FROM_CHANNEL_MESSAGE)

        if not slack_request.has_identity:
            return self.send_ephemeral_notification(LINK_USER_FIRST_MESSAGE)

        associate_url = build_team_linking_url(
            integration=slack_request.integration,
            slack_id=slack_request.user_id,
            channel_id=slack_request.channel_id,
            channel_name=slack_request.channel_name,
            response_url=slack_request.response_url,
        )
        return self.send_ephemeral_notification(
            LINK_TEAM_MESSAGE.format(associate_url=associate_url))
Exemple #9
0
 def setUp(self):
     super().setUp()
     self.user = self.create_user("*****@*****.**")
     self.org = self.create_organization(name="Rowdy Tiger",
                                         owner=self.user)
     self.team = self.create_team(organization=self.org,
                                  name="Mariachi Band")
     self.member = self.create_member(
         user=None,
         email="*****@*****.**",
         organization=self.org,
         role="owner",
         teams=[self.team],
     )
     self.create_team_membership(user=self.user, team=self.team)
     self.integration = Integration.objects.create(
         provider="slack",
         name="Team A",
         external_id="TXXXXXXX1",
         metadata={
             "access_token": "xoxp-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxx",
             "installation_type": "born_as_bot",
         },
     )
     self.integration.add_organization(self.org, self.user)
     self.idp = IdentityProvider.objects.create(type="slack",
                                                external_id="TXXXXXXX1",
                                                config={})
     self.identity = Identity.objects.create(
         external_id="UXXXXXXX1",
         idp=self.idp,
         user=self.user,
         status=IdentityStatus.VALID,
         scopes=[],
     )
     linking_url = urlparse(
         build_team_linking_url(
             self.integration,
             "UXXXXXXX1",
             "CXXXXXXX9",
             "general",
             "http://example.slack.com/response_url",
         ))
     self.path = linking_url.path