Ejemplo n.º 1
0
def SendRetrievalEmail(permission_type,
                       entity,
                       user,
                       template='retrieval_email.txt',
                       skip_emails=None):
    """Sends a retrieval notification email.

  Args:
    permission_type: string, one of permission.TYPE_* variables.
    entity: base.BasePassphrase instance of retrieved object.
    user: base.User object of the user that retrieved the secret.
    template: str message template.
    skip_emails: list filter emails from recipients.
  """
    data = {
        'entity': entity,
        'helpdesk_email': settings.HELPDESK_EMAIL,
        'helpdesk_name': settings.HELPDESK_NAME,
        'retrieved_by': user.user.email(),
        'user': user,
        'server_hostname': app_identity.get_default_version_hostname(),
    }
    body = util.RenderTemplate(template, data)

    user_email = user.user.email()
    try:
        base_handler.VerifyPermissions(permissions.SILENT_RETRIEVE, user,
                                       permission_type)
        return
    except base.AccessDeniedError:
        pass

    try:
        # If the user has access to "silently" retrieve keys without the owner
        # being notified, email only SILENT_AUDIT_ADDRESSES.
        base_handler.VerifyPermissions(
            permissions.SILENT_RETRIEVE_WITH_AUDIT_EMAIL, user,
            permission_type)
        to = [user_email] + settings.SILENT_AUDIT_ADDRESSES
    except base.AccessDeniedError:
        # Otherwise email the owner and RETRIEVE_AUDIT_ADDRESSES.
        to = [user_email] + settings.RETRIEVE_AUDIT_ADDRESSES
        if entity.owner:
            if '@' in entity.owner:
                owner_email = entity.owner
            else:
                owner_email = '%s@%s' % (entity.owner,
                                         settings.DEFAULT_EMAIL_DOMAIN)
            to.append(owner_email)

    if skip_emails:
        to = [email for email in to if email not in skip_emails]

    subject_var = '%s_RETRIEVAL_EMAIL_SUBJECT' % entity.ESCROW_TYPE_NAME.upper(
    )
    subject = getattr(settings, subject_var,
                      'Escrow secret retrieval notification.')
    util.SendEmail(to, subject, body)
Ejemplo n.º 2
0
  def get(self):
    """Handles GET requests."""
    log_type = self.request.get('log_type')
    base_handler.VerifyPermissions(
        permissions.MASTER, base.GetCurrentUser(), log_type)

    start = self.request.get('start_next', None)
    log_model = models_util.TypeNameToLogModel(log_type)
    logs_query = log_model.all()
    logs_query.order('-paginate_mtime')
    if start:
      logs_query.filter('paginate_mtime <', start)

    logs = logs_query.fetch(PER_PAGE + 1)
    more = len(logs) == PER_PAGE + 1
    start_next = None
    if more:
      start_next = logs[-1].paginate_mtime

    logs = [db.to_dict(log) for log in logs[:PER_PAGE]]
    for log in logs:
      log['user'] = str(log['user'])
      log['mtime'] = str(log['mtime'])
    params = {
        'logs': logs,
        'log_type': log_type,
        'more': more,
        'start': start,
        'start_next': start_next,
    }

    self.response.out.write(util.ToSafeJson(params))
    def post(self, volume_key):
        """Handles POST requests."""
        try:
            db_key = db.Key(volume_key)
        except db.BadKeyError as e:
            logging.warning('Bad volume_key "%s" provided: %s', volume_key, e)
            return self.error(httplib.NOT_FOUND)

        self.entity = self.SECRET_MODEL.get(db_key)
        if not self.entity:
            return self.error(httplib.NOT_FOUND)
        if self.entity and not self.entity.active:
            return self.error(httplib.BAD_REQUEST)

        self.VerifyXsrfToken(base_settings.CHANGE_OWNER_ACTION)
        base_handler.VerifyPermissions(permissions.CHANGE_OWNER,
                                       base.GetCurrentUser(),
                                       self.PERMISSION_TYPE)
        new_entity = self.entity.Clone()
        new_entity.owner = self.request.get('new_owner')
        new_entity.put()
        self.AUDIT_LOG_MODEL.Log(
            entity=self.entity,
            request=self.request,
            message=('Owner changed from "%s" to "%s"' %
                     (self.entity.owner, new_entity.owner)))
Ejemplo n.º 4
0
    def VerifyPermissions(self,
                          required_permission,
                          user=None,
                          permission_type=None):
        """Verifies a valid user is logged in.

    Args:
      required_permission: permission string from permissions.*.
      user: optional, base.User entity; default current user.
      permission_type: optional, string, one of permission.TYPE_* variables. if
          omitted, self.PERMISSION_TYPE is used.
    Returns:
      base.User object of the current user.
    Raises:
      base.AccessDeniedError: there was a permissions issue.
    """
        permission_type = permission_type or self.PERMISSION_TYPE

        if user is None:
            user = base.GetCurrentUser()

        base_handler.VerifyPermissions(required_permission, user,
                                       permission_type)

        return user
Ejemplo n.º 5
0
    def get(self, serials):
        base_handler.VerifyPermissions(permissions.RETRIEVE,
                                       base.GetCurrentUser(),
                                       permissions.TYPE_APPLE_FIRMWARE)

        inventory_service = service_factory.GetInventoryService()
        res = {
            'active': [],
            'retired': [],
        }
        for serial in serials.split(','):
            if not inventory_service.IsRetiredMac(serial):
                res['active'].append(serial)
                continue

            entity = firmware.AppleFirmwarePassword.GetLatestForTarget(serial)
            if entity:
                firmware.AppleFirmwarePasswordAccessLog.Log(
                    message='GET', entity=entity, request=self.request)

                res['retired'].append({
                    'serial': serial,
                    'password': entity.password
                })
            else:
                res['retired'].append({'serial': serial, 'password': '******'})

        self.response.write(util.ToSafeJson(res))
Ejemplo n.º 6
0
    def VerifyPermissions(self,
                          required_permission,
                          user=None,
                          permission_type=None):
        """Verifies a valid user is logged in.

    Args:
      required_permission: permission string from permissions.*.
      user: optional, base.User entity; default current user.
      permission_type: optional, string, one of permission.TYPE_* variables. if
          omitted, self.PERMISSION_TYPE is used.
    Returns:
      base.User object of the current user.
    Raises:
      base.AccessDeniedError: there was a permissions issue.
    """
        # TODO(user): Consider making the method accept a list of checks
        #    to be performed, making CheckRetrieveAuthorization simpler.
        permission_type = permission_type or self.PERMISSION_TYPE

        if user is None:
            user = base.GetCurrentUser()

        base_handler.VerifyPermissions(required_permission, user,
                                       permission_type)

        return user
Ejemplo n.º 7
0
    def get(self):
        """Handles GET requests."""

        base_handler.VerifyPermissions(permissions.RETRIEVE_CREATED_BY,
                                       base.GetCurrentUser(),
                                       permissions.TYPE_PROVISIONING)

        volumes = ProvisioningVolumesForUser(users.get_current_user(),
                                             PROVISIONING_FILTER_SECONDS)
        volumes = [volume.ToDict() for volume in volumes]

        self.response.out.write(util.ToSafeJson(volumes))
Ejemplo n.º 8
0
 def post(self, volume_key):
   """Handles POST requests."""
   self.VerifyXsrfToken(base_settings.CHANGE_OWNER_ACTION)
   base_handler.VerifyPermissions(
       permissions.CHANGE_OWNER, base.GetCurrentUser(),
       permissions.TYPE_FILEVAULT)
   new_entity = self.entity.Clone()
   new_entity.owner = self.request.get('new_owner')
   new_entity.put()
   self.AUDIT_LOG_MODEL.Log(
       entity=self.entity, request=self.request, message=(
           'Owner changed from "%s" to "%s"' %
           (self.entity.owner, new_entity.owner)))