Пример #1
0
  def get(self, orgname, parsed_args):
    """ List the organization's robots. """
    permission = OrganizationMemberPermission(orgname)
    if permission.can():
      include_token = (AdministerOrganizationPermission(orgname).can() and
                       parsed_args.get('token', True))
      include_permissions = (AdministerOrganizationPermission(orgname).can() and
                             parsed_args.get('permissions', False))
      return robots_list(orgname, include_permissions=include_permissions,
                         include_token=include_token,
                         limit=parsed_args.get('limit'))

    raise Unauthorized()
Пример #2
0
    def post(self, orgname):
        """
        Creates proxy cache configuration for the organization.
        """
        permission = AdministerOrganizationPermission(orgname)
        if not permission.can():
            raise Unauthorized()

        try:
            model.proxy_cache.get_proxy_cache_config_for_org(orgname)
            raise request_error("Proxy Cache Configuration already exists")
        except model.InvalidProxyCacheConfigException:
            pass

        data = request.get_json()
        # filter None values
        data = {k: v for k, v in data.items() if (v is not None or not "")}

        try:
            config = model.proxy_cache.create_proxy_cache_config(**data)
            if config is not None:
                return "Created", 201
        except model.DataModelException as e:
            logger.error(
                "Error while creating Proxy cache configuration as: %s",
                str(e))

        return request_error("Error while creating Proxy cache configuration")
Пример #3
0
    def put(self, orgname, prototypeid):
        """ Update the role of an existing permission prototype. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            try:
                org = model.organization.get_organization(orgname)
            except model.InvalidOrganizationException:
                raise NotFound()

            existing = model.permission.get_prototype_permission(org, prototypeid)
            if not existing:
                raise NotFound()

            details = request.get_json()
            role_name = details["role"]
            prototype = model.permission.update_prototype_permission(org, prototypeid, role_name)
            if not prototype:
                raise NotFound()

            log_prototype_action(
                "modify_prototype_permission", orgname, prototype, original_role=existing.role.name
            )

            users_filter = {prototype.activating_user, prototype.delegate_user}
            org_members = model.organization.get_organization_member_set(
                org, users_filter=users_filter
            )
            return prototype_view(prototype, org_members)

        raise Unauthorized()
Пример #4
0
    def post(self, orgname):
        permission = AdministerOrganizationPermission(orgname)
        if not permission.can():
            raise Unauthorized()

        try:
            model.proxy_cache.get_proxy_cache_config_for_org(orgname)
            request_error("Proxy Cache Configuration already exists")
        except model.InvalidProxyCacheConfigException:
            pass

        data = request.get_json()

        # filter None values
        data = {k: v for k, v in data.items() if v is not None}

        try:
            config = ProxyCacheConfig(**data)
            existing = model.organization.get_organization(orgname)
            config.organization = existing

            proxy = Proxy(config, "something-totally-fake", True)
            response = proxy.get(f"{proxy.base_url}/v2/")
            if response.status_code == 200:
                return "Valid", 202
        except UpstreamRegistryError as e:
            raise request_error(
                message=
                "Failed login to remote registry. Please verify entered details and try again."
            )
        raise request_error(
            message="Failed to validate Proxy cache configuration")
Пример #5
0
def org_view(o, teams):
    is_admin = AdministerOrganizationPermission(o.username).can()
    is_member = OrganizationMemberPermission(o.username).can()

    view = {
        "name": o.username,
        "email": o.email if is_admin else "",
        "avatar": avatar.get_data_for_user(o),
        "is_admin": is_admin,
        "is_member": is_member,
    }

    if teams is not None:
        teams = sorted(teams, key=lambda team: team.id)
        view["teams"] = {t.name: team_view(o.username, t) for t in teams}
        view["ordered_teams"] = [team.name for team in teams]

    if is_admin:
        view["invoice_email"] = o.invoice_email
        view["invoice_email_address"] = o.invoice_email_address
        view["tag_expiration_s"] = o.removed_tag_expiration_s
        view["is_free_account"] = o.stripe_id is None

        if features.QUOTA_MANAGEMENT:
            quotas = model.namespacequota.get_namespace_quota_list(o.username)
            view["quotas"] = [quota_view(quota)
                              for quota in quotas] if quotas else []
            view["quota_report"] = model.namespacequota.get_quota_for_view(
                o.username)

    return view
Пример #6
0
Файл: team.py Проект: ynnt/quay
    def put(self, orgname, teamname, email):
        """
        Invites an email address to an existing team.
        """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            team = None

            # Find the team.
            try:
                team = model.team.get_organization_team(orgname, teamname)
            except model.InvalidTeamException:
                raise NotFound()

            # Invite the email to the team.
            inviter = get_authenticated_user()
            invite = handle_addinvite_team(inviter, team, email=email)
            log_action(
                "org_invite_team_member",
                orgname,
                {
                    "email": email,
                    "team": teamname,
                    "member": email
                },
            )
            return invite_view(invite)

        raise Unauthorized()
Пример #7
0
    def put(self, orgname, client_id):
        """
        Updates an application under this organization.
        """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            try:
                org = model.organization.get_organization(orgname)
            except model.InvalidOrganizationException:
                raise NotFound()

            application = model.oauth.lookup_application(org, client_id)
            if not application:
                raise NotFound()

            app_data = request.get_json()
            application.name = app_data["name"]
            application.application_uri = app_data["application_uri"]
            application.redirect_uri = app_data["redirect_uri"]
            application.description = app_data.get("description", "")
            application.avatar_email = app_data.get("avatar_email", None)
            application.save()

            app_data.update({
                "application_name": application.name,
                "client_id": application.client_id
            })

            log_action("update_application", orgname, app_data)

            return app_view(application)
        raise Unauthorized()
Пример #8
0
    def post(self, orgname, client_id):
        """
        Resets the client secret of the application.
        """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            try:
                org = model.organization.get_organization(orgname)
            except model.InvalidOrganizationException:
                raise NotFound()

            application = model.oauth.lookup_application(org, client_id)
            if not application:
                raise NotFound()

            application = model.oauth.reset_client_secret(application)
            log_action(
                "reset_application_client_secret",
                orgname,
                {
                    "application_name": application.name,
                    "client_id": client_id
                },
            )

            return app_view(application)
        raise Unauthorized()
Пример #9
0
    def post(self, namespace_name, repo_name, trigger_uuid):
        """
        Analyze the specified build trigger configuration.
        """
        trigger = get_trigger(trigger_uuid)

        if trigger.repository.namespace_user.username != namespace_name:
            raise NotFound()

        if trigger.repository.name != repo_name:
            raise NotFound()

        new_config_dict = request.get_json()["config"]
        handler = BuildTriggerHandler.get_handler(trigger, new_config_dict)
        server_hostname = app.config["SERVER_HOSTNAME"]
        try:
            trigger_analyzer = TriggerAnalyzer(
                handler,
                namespace_name,
                server_hostname,
                new_config_dict,
                AdministerOrganizationPermission(namespace_name).can(),
            )
            return trigger_analyzer.analyze_trigger()
        except TriggerException as rre:
            return {
                "status": "error",
                "message": "Could not analyze the repository: %s" % rre.message,
            }
        except NotImplementedError:
            return {
                "status": "notimplemented",
            }
Пример #10
0
def _syncing_setup_allowed(orgname):
    """ Returns whether syncing setup is allowed for the current user over the matching org. """
    if not features.NONSUPERUSER_TEAM_SYNCING_SETUP and not SuperUserPermission(
    ).can():
        return False

    return AdministerOrganizationPermission(orgname).can()
Пример #11
0
def app_view(application):
    is_admin = AdministerOrganizationPermission(application.organization.username).can()
    client_secret = None
    if is_admin:
        # TODO(remove-unenc): Remove legacy lookup.
        client_secret = None
        if application.secure_client_secret is not None:
            client_secret = application.secure_client_secret.decrypt()

        if (
            ActiveDataMigration.has_flag(ERTMigrationFlags.READ_OLD_FIELDS)
            and client_secret is None
        ):
            client_secret = application.client_secret

    assert (client_secret is not None) == is_admin
    return {
        "name": application.name,
        "description": application.description,
        "application_uri": application.application_uri,
        "client_id": application.client_id,
        "client_secret": client_secret,
        "redirect_uri": application.redirect_uri if is_admin else None,
        "avatar_email": application.avatar_email if is_admin else None,
    }
Пример #12
0
    def post(self, orgname):
        """ Creates a new application under this organization. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            try:
                org = model.organization.get_organization(orgname)
            except model.InvalidOrganizationException:
                raise NotFound()

            app_data = request.get_json()
            application = model.oauth.create_application(
                org,
                app_data['name'],
                app_data.get('application_uri', ''),
                app_data.get('redirect_uri', ''),
                description=app_data.get('description', ''),
                avatar_email=app_data.get('avatar_email', None))

            app_data.update({
                'application_name': application.name,
                'client_id': application.client_id
            })

            log_action('create_application', orgname, app_data)

            return app_view(application)
        raise Unauthorized()
Пример #13
0
    def get(self, orgname):
        """ List outside collaborators of the specified organization. """
        permission = AdministerOrganizationPermission(orgname)
        if not permission.can():
            raise Unauthorized()

        try:
            org = model.organization.get_organization(orgname)
        except model.InvalidOrganizationException:
            raise NotFound()

        all_perms = model.permission.list_organization_member_permissions(org)
        membership = model.team.list_organization_members_by_teams(org)

        org_members = set(m.user.username for m in membership)

        collaborators = {}
        for perm in all_perms:
            username = perm.user.username

            # Only interested in non-member permissions.
            if username in org_members:
                continue

            if username not in collaborators:
                collaborators[username] = {
                    "kind": "user",
                    "name": username,
                    "avatar": avatar.get_data_for_user(perm.user),
                    "repositories": [],
                }

            collaborators[username]["repositories"].append(perm.repository.name)

        return {"collaborators": collaborators.values()}
Пример #14
0
    def put(self, orgname, robot_shortname):
        """
        Create a new robot in the organization.
        """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            create_data = request.get_json() or {}
            robot = model.create_org_robot(
                robot_shortname,
                orgname,
                create_data.get("description"),
                create_data.get("unstructured_metadata"),
            )
            log_action(
                "create_robot",
                orgname,
                {
                    "robot":
                    robot_shortname,
                    "description":
                    create_data.get("description"),
                    "unstructured_metadata":
                    create_data.get("unstructured_metadata"),
                },
            )
            return robot.to_dict(include_metadata=True,
                                 include_token=True), 201

        raise Unauthorized()
Пример #15
0
    def get(self, orgname):
        """
        Fetch any existing subscription for the org.
        """
        cus = None
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            private_repos = model.user.get_private_repo_count(orgname)
            organization = model.organization.get_organization(orgname)
            if organization.stripe_id:
                try:
                    cus = billing.Customer.retrieve(organization.stripe_id)
                except stripe.error.APIConnectionError as e:
                    abort(503, message="Cannot contact Stripe")

                if cus.subscription:
                    return subscription_view(cus.subscription, private_repos)

            return {
                "hasSubscription": False,
                "isExistingCustomer": cus is not None,
                "plan": "free",
                "usedPrivateRepos": private_repos,
            }

        raise Unauthorized()
Пример #16
0
    def delete(self, orgname, client_id):
        """
        Deletes the application under this organization.
        """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            try:
                org = model.organization.get_organization(orgname)
            except model.InvalidOrganizationException:
                raise NotFound()

            application = model.oauth.delete_application(org, client_id)
            if not application:
                raise NotFound()

            log_action(
                "delete_application",
                orgname,
                {
                    "application_name": application.name,
                    "client_id": client_id
                },
            )

            return "", 204
        raise Unauthorized()
Пример #17
0
    def get(self, orgname):
        """
        List the existing prototypes for this organization.
        """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            try:
                org = model.organization.get_organization(orgname)
            except model.InvalidOrganizationException:
                raise NotFound()

            permissions = model.permission.get_prototype_permissions(org)

            users_filter = {p.activating_user
                            for p in permissions
                            } | {p.delegate_user
                                 for p in permissions}
            org_members = model.organization.get_organization_member_set(
                org, users_filter=users_filter)
            return {
                "prototypes":
                [prototype_view(p, org_members) for p in permissions]
            }

        raise Unauthorized()
Пример #18
0
    def post(self, orgname):
        """
        Creates a new application under this organization.
        """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            try:
                org = model.organization.get_organization(orgname)
            except model.InvalidOrganizationException:
                raise NotFound()

            app_data = request.get_json()
            application = model.oauth.create_application(
                org,
                app_data["name"],
                app_data.get("application_uri", ""),
                app_data.get("redirect_uri", ""),
                description=app_data.get("description", ""),
                avatar_email=app_data.get("avatar_email", None),
            )

            app_data.update({
                "application_name": application.name,
                "client_id": application.client_id
            })

            log_action("create_application", orgname, app_data)

            return app_view(application)
        raise Unauthorized()
Пример #19
0
Файл: team.py Проект: ynnt/quay
    def delete(self, orgname, teamname, email):
        """
        Delete an invite of an email address to join a team.
        """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            team = None

            # Find the team.
            try:
                team = model.team.get_organization_team(orgname, teamname)
            except model.InvalidTeamException:
                raise NotFound()

            # Delete the invite.
            if not model.team.delete_team_email_invite(team, email):
                raise NotFound()

            log_action(
                "org_delete_team_member_invite",
                orgname,
                {
                    "email": email,
                    "team": teamname,
                    "member": email
                },
            )
            return "", 204

        raise Unauthorized()
Пример #20
0
def receipt():
  if not current_user.is_authenticated:
    abort(401)
    return

  invoice_id = request.args.get('id')
  if invoice_id:
    invoice = stripe.Invoice.retrieve(invoice_id)
    if invoice:
      user_or_org = model.user.get_user_or_org_by_customer_id(invoice.customer)

      if user_or_org:
        if user_or_org.organization:
          admin_org = AdministerOrganizationPermission(user_or_org.username)
          if not admin_org.can():
            abort(404)
            return
        else:
          if not user_or_org.username == current_user.db_user().username:
            abort(404)
            return

      def format_date(timestamp):
        return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d')

      file_data = renderInvoiceToPdf(invoice, user_or_org)
      receipt_filename = 'quay-receipt-%s.pdf' % (format_date(invoice.date))
      return Response(file_data,
                      mimetype="application/pdf",
                      headers={"Content-Disposition": "attachment;filename=" + receipt_filename})
  abort(404)
Пример #21
0
    def get(self, orgname):
        """
        Return whether or not this org is allowed to create new private repositories.
        """
        permission = CreateRepositoryPermission(orgname)
        if permission.can():
            organization = model.organization.get_organization(orgname)
            private_repos = model.user.get_private_repo_count(
                organization.username)
            data = {"privateAllowed": False}

            if organization.stripe_id:
                cus = stripe.Customer.retrieve(organization.stripe_id)
                if cus.subscription:
                    repos_allowed = 0
                    plan = get_plan(cus.subscription.plan.id)
                    if plan:
                        repos_allowed = plan["privateRepos"]

                    data["privateAllowed"] = private_repos < repos_allowed

            if AdministerOrganizationPermission(orgname).can():
                data["privateCount"] = private_repos

            return data

        raise Unauthorized()
Пример #22
0
    def get(self, orgname):
        """ Get the organization's credit card. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            organization = model.organization.get_organization(orgname)
            return get_card(organization)

        raise Unauthorized()
Пример #23
0
    def get(self, orgname, robot_shortname):
        """ Returns the organization's robot with the specified name. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            robot = model.get_org_robot(robot_shortname, orgname)
            return robot.to_dict(include_metadata=True, include_token=True)

        raise Unauthorized()
Пример #24
0
    def post(self, orgname, robot_shortname):
        """ Regenerates the token for an organization robot. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            robot = model.regenerate_org_robot_token(robot_shortname, orgname)
            log_action("regenerate_robot_token", orgname, {"robot": robot_shortname})
            return robot.to_dict(include_token=True)

        raise Unauthorized()
Пример #25
0
Файл: team.py Проект: ynnt/quay
    def get(self, orgname, teamname, parsed_args):
        """
        Retrieve the list of members for the specified team.
        """
        view_permission = ViewTeamPermission(orgname, teamname)
        edit_permission = AdministerOrganizationPermission(orgname)

        if view_permission.can():
            team = None
            try:
                team = model.team.get_organization_team(orgname, teamname)
            except model.InvalidTeamException:
                raise NotFound()

            members = model.organization.get_organization_team_members(team.id)
            invites = []

            if parsed_args["includePending"] and edit_permission.can():
                invites = model.team.get_organization_team_member_invites(
                    team.id)

            data = {
                "name":
                teamname,
                "members":
                [member_view(m)
                 for m in members] + [invite_view(i) for i in invites],
                "can_edit":
                edit_permission.can(),
            }

            if features.TEAM_SYNCING and authentication.federated_service:
                if _syncing_setup_allowed(orgname):
                    data["can_sync"] = {
                        "service": authentication.federated_service,
                    }

                    data["can_sync"].update(authentication.service_metadata())

                sync_info = model.team.get_team_sync_information(
                    orgname, teamname)
                if sync_info is not None:
                    data["synced"] = {
                        "service": sync_info.service.name,
                    }

                    if SuperUserPermission().can():
                        data["synced"].update({
                            "last_updated":
                            format_date(sync_info.last_updated),
                            "config":
                            json.loads(sync_info.config),
                        })

            return data

        raise Unauthorized()
Пример #26
0
    def delete(self, orgname, robot_shortname):
        """ Delete an existing organization robot. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            model.delete_robot(format_robot_username(orgname, robot_shortname))
            log_action("delete_robot", orgname, {"robot": robot_shortname})
            return "", 204

        raise Unauthorized()
Пример #27
0
    def post(self, orgname):
        """ Create a new permission prototype. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            try:
                org = model.organization.get_organization(orgname)
            except model.InvalidOrganizationException:
                raise NotFound()

            details = request.get_json()
            activating_username = None

            if (
                "activating_user" in details
                and details["activating_user"]
                and "name" in details["activating_user"]
            ):
                activating_username = details["activating_user"]["name"]

            delegate = details["delegate"] if "delegate" in details else {}
            delegate_kind = delegate.get("kind", None)
            delegate_name = delegate.get("name", None)

            delegate_username = delegate_name if delegate_kind == "user" else None
            delegate_teamname = delegate_name if delegate_kind == "team" else None

            activating_user = (
                model.user.get_user(activating_username) if activating_username else None
            )
            delegate_user = model.user.get_user(delegate_username) if delegate_username else None
            delegate_team = (
                model.team.get_organization_team(orgname, delegate_teamname)
                if delegate_teamname
                else None
            )

            if activating_username and not activating_user:
                raise request_error(message="Unknown activating user")

            if not delegate_user and not delegate_team:
                raise request_error(message="Missing delegate user or team")

            role_name = details["role"]

            prototype = model.permission.add_prototype_permission(
                org, role_name, activating_user, delegate_user, delegate_team
            )
            log_prototype_action("create_prototype_permission", orgname, prototype)

            users_filter = {prototype.activating_user, prototype.delegate_user}
            org_members = model.organization.get_organization_member_set(
                org, users_filter=users_filter
            )
            return prototype_view(prototype, org_members)

        raise Unauthorized()
Пример #28
0
    def get(self, orgname, robot_shortname):
        """ Returns the list of repository permissions for the org's robot. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            robot = model.get_org_robot(robot_shortname, orgname)
            permissions = model.list_robot_permissions(robot.name)

            return {"permissions": [permission.to_dict() for permission in permissions]}

        abort(403)
Пример #29
0
    def delete(self, orgname, teamname):
        """ Delete the specified team. """
        permission = AdministerOrganizationPermission(orgname)
        if permission.can():
            model.team.remove_team(orgname, teamname,
                                   get_authenticated_user().username)
            log_action("org_delete_team", orgname, {"team": teamname})
            return "", 204

        raise Unauthorized()
Пример #30
0
Файл: team.py Проект: ynnt/quay
    def put(self, orgname, teamname):
        """
        Update the org-wide permission for the specified team.
        """
        edit_permission = AdministerOrganizationPermission(orgname)
        if edit_permission.can():
            team = None

            details = request.get_json()
            is_existing = False
            try:
                team = model.team.get_organization_team(orgname, teamname)
                is_existing = True
            except model.InvalidTeamException:
                # Create the new team.
                description = details[
                    "description"] if "description" in details else ""
                role = details["role"] if "role" in details else "member"

                org = model.organization.get_organization(orgname)
                team = model.team.create_team(teamname, org, role, description)
                log_action("org_create_team", orgname, {"team": teamname})

            if is_existing:
                if "description" in details and team.description != details[
                        "description"]:
                    team.description = details["description"]
                    team.save()
                    log_action(
                        "org_set_team_description",
                        orgname,
                        {
                            "team": teamname,
                            "description": team.description
                        },
                    )

                if "role" in details:
                    role = Team.role.get_name(team.role_id)
                    if role != details["role"]:
                        team = model.team.set_team_org_permission(
                            team, details["role"],
                            get_authenticated_user().username)
                        log_action(
                            "org_set_team_role",
                            orgname,
                            {
                                "team": teamname,
                                "role": details["role"]
                            },
                        )

            return team_view(orgname, team, is_new_team=not is_existing), 200

        raise Unauthorized()