<gh_stars>0
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

from google.protobuf import empty_pb2

from api import resource_name_converters as rnc
from api.v3 import permission_converters as pc
from api.v3 import monorail_servicer
from api.v3.api_proto import permission_objects_pb2
from api.v3.api_proto import permissions_pb2
from api.v3.api_proto import permissions_prpc_pb2
from businesslogic import work_env
from framework import exceptions


class PermissionsServicer(monorail_servicer.MonorailServicer):
  """Handle API requests related to Permissions.
  Each API request is implemented with a method as defined in the
  .proto file. Each method does any request-specific validation, uses work_env
  to safely operate on business objects, and returns a response proto.
  """

  DESCRIPTION = permissions_prpc_pb2.PermissionsServiceDescription

  @monorail_servicer.PRPCMethod
  def BatchGetPermissionSets(self, mc, request):
    # type: (MonorailContext, BatchGetPermissionSetsRequest) ->
    # BatchGetPermissionSetsResponse
    """pRPC API method that implements BatchGetPermissionSets.

    Raises:
      InputException: if any name in request.names is not a valid resource name
          or a permission string is not recognized.
      PermissionException: if the requester does not have permission to
          view one of the resources.
    """
    api_permission_sets = []
    with work_env.WorkEnv(mc, self.services) as we:
      for name in request.names:
        api_permission_sets.append(self._GetPermissionSet(mc.cnxn, we, name))

    return permissions_pb2.BatchGetPermissionSetsResponse(
        permission_sets=api_permission_sets)

  def _GetPermissionSet(self, cnxn, we, name):
    # type: (sql.MonorailConnection, businesslogic.WorkEnv, str) ->
    # permission_objects_pb2.PermissionSet
    """Takes a resource name and returns the PermissionSet for the resource.

      Args:
        cnxn: MonorailConnection object to the database.
        we: WorkEnv object to get the permission strings.
        name: resource name of a resource we want a PermissionSet for.

      Returns:
        PermissionSet object.

      Raises:
      InputException: if request.name is not a valid resource name or a
          permission string is not recognized.
      PermissionException: if the requester does not have permission to
          view the resource.
    """
    try:
      hotlist_id = rnc.IngestHotlistName(name)
      permissions = we.ListHotlistPermissions(hotlist_id)
      api_permissions = pc.ConvertHotlistPermissions(permissions)
      return permission_objects_pb2.PermissionSet(
          resource=name, permissions=api_permissions)
    except exceptions.InputException:
      pass
    try:
      project_id, field_id = rnc.IngestFieldDefName(cnxn, name, self.services)
      permissions = we.ListFieldDefPermissions(field_id, project_id)
      api_permissions = pc.ConvertFieldDefPermissions(permissions)
      return permission_objects_pb2.PermissionSet(
          resource=name, permissions=api_permissions)
    except exceptions.InputException:
      pass
    # TODO(crbug/monorail/7339): Add more try-except blocks for other
    # resource types.
    raise exceptions.InputException('invalid resource name')

# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

from google.protobuf import empty_pb2

from api import resource_name_converters as rnc
from api.v3 import permission_converters as pc
from api.v3 import monorail_servicer
from api.v3.api_proto import permission_objects_pb2
from api.v3.api_proto import permissions_pb2
from api.v3.api_proto import permissions_prpc_pb2
from businesslogic import work_env
from framework import exceptions


class PermissionsServicer(monorail_servicer.MonorailServicer):
  """Handle API requests related to Permissions.
  Each API request is implemented with a method as defined in the
  .proto file. Each method does any request-specific validation, uses work_env
  to safely operate on business objects, and returns a response proto.
  """

  DESCRIPTION = permissions_prpc_pb2.PermissionsServiceDescription

  @monorail_servicer.PRPCMethod
  def BatchGetPermissionSets(self, mc, request):
    # type: (MonorailContext, BatchGetPermissionSetsRequest) ->
    # BatchGetPermissionSetsResponse
    """pRPC API method that implements BatchGetPermissionSets.

    Raises:
      InputException: if any name in request.names is not a valid resource name
          or a permission string is not recognized.
      PermissionException: if the requester does not have permission to
          view one of the resources.
    """
    api_permission_sets = []
    with work_env.WorkEnv(mc, self.services) as we:
      for name in request.names:
        api_permission_sets.append(self._GetPermissionSet(mc.cnxn, we, name))

    return permissions_pb2.BatchGetPermissionSetsResponse(
        permission_sets=api_permission_sets)

  def _GetPermissionSet(self, cnxn, we, name):
    # type: (sql.MonorailConnection, businesslogic.WorkEnv, str) ->
    # permission_objects_pb2.PermissionSet
    """Takes a resource name and returns the PermissionSet for the resource.

      Args:
        cnxn: MonorailConnection object to the database.
        we: WorkEnv object to get the permission strings.
        name: resource name of a resource we want a PermissionSet for.

      Returns:
        PermissionSet object.

      Raises:
      InputException: if request.name is not a valid resource name or a
          permission string is not recognized.
      PermissionException: if the requester does not have permission to
          view the resource.
    """
    try:
      hotlist_id = rnc.IngestHotlistName(name)
      permissions = we.ListHotlistPermissions(hotlist_id)
      api_permissions = pc.ConvertHotlistPermissions(permissions)
      return permission_objects_pb2.PermissionSet(
          resource=name, permissions=api_permissions)
    except exceptions.InputException:
      pass
    try:
      project_id, field_id = rnc.IngestFieldDefName(cnxn, name, self.services)
      permissions = we.ListFieldDefPermissions(field_id, project_id)
      api_permissions = pc.ConvertFieldDefPermissions(permissions)
      return permission_objects_pb2.PermissionSet(
          resource=name, permissions=api_permissions)
    except exceptions.InputException:
      pass
    # TODO(crbug/monorail/7339): Add more try-except blocks for other
    # resource types.
    raise exceptions.InputException('invalid resource name')
# Copyright 2020 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. Handle API requests related to Permissions.   Each API request is implemented with a method as defined in the   .proto file. Each method does any request-specific validation, uses work_env   to safely operate on business objects, and returns a response proto. # type: (MonorailContext, BatchGetPermissionSetsRequest) -> # BatchGetPermissionSetsResponse pRPC API method that implements BatchGetPermissionSets.      Raises:       InputException: if any name in request.names is not a valid resource name           or a permission string is not recognized.       PermissionException: if the requester does not have permission to           view one of the resources. # type: (sql.MonorailConnection, businesslogic.WorkEnv, str) -> # permission_objects_pb2.PermissionSet Takes a resource name and returns the PermissionSet for the resource.        Args:         cnxn: MonorailConnection object to the database.         we: WorkEnv object to get the permission strings.         name: resource name of a resource we want a PermissionSet for.        Returns:         PermissionSet object.        Raises:       InputException: if request.name is not a valid resource name or a           permission string is not recognized.       PermissionException: if the requester does not have permission to           view the resource. # TODO(crbug/monorail/7339): Add more try-except blocks for other # resource types.