openSUSE/open-build-service

View on GitHub
src/api/app/helpers/validation_helper.rb

Summary

Maintainability
A
45 mins
Test Coverage
A
94%
require 'api_error'

module ValidationHelper
  class InvalidProjectNameError < APIError
  end

  class InvalidPackageNameError < APIError
  end

  def valid_project_name!(project_name)
    raise InvalidProjectNameError, "invalid project name '#{project_name}'" unless Project.valid_name?(project_name)
  end

  def valid_package_name!(package_name)
    raise InvalidPackageNameError, "invalid package name '#{package_name}'" unless Package.valid_name?(package_name)
  end

  def valid_multibuild_package_name!(package_name)
    raise InvalidPackageNameError, "invalid package name '#{package_name}'" unless Package.valid_multibuild_name?(package_name)
  end

  # load last package meta file and just check if sourceaccess flag was used at all, no per user checking atm
  def validate_read_access_of_deleted_package(project, name)
    prj = Project.get_by_name(project)
    if prj.is_a?(Project)
      raise Project::ReadAccessError, project.to_s if prj.disabled_for?('access', nil, nil)
      raise Package::ReadSourceAccessError, "#{target_project_name}/#{target_package_name}" if prj.disabled_for?('sourceaccess', nil, nil)
    end

    begin
      revisions_list = Backend::Api::Sources::Package.revisions(project, name)
    rescue StandardError
      raise Package::UnknownObjectError, "Package not found: #{project}/#{name}"
    end
    data = Xmlhash.parse(revisions_list)
    lastrev = data.elements('revision').last

    query = { deleted: 1 }
    query[:rev] = lastrev.value('srcmd5') if lastrev
    meta = PackageMetaFile.new(project_name: project, package_name: name).content(query)
    raise Package::UnknownObjectError, "Package not found: #{project}/#{name}" unless meta

    return true if User.admin_session?
    raise Package::ReadSourceAccessError, "#{project}/#{name}" if FlagHelper.xml_disabled_for?(Xmlhash.parse(meta), 'sourceaccess')

    true
  end

  def validate_visibility_of_deleted_project(project)
    begin
      revisions_list = Backend::Api::Sources::Project.revisions(project)
    rescue StandardError
      raise Project::UnknownObjectError, "Project not found: #{project}"
    end
    data = Xmlhash.parse(revisions_list)
    lastrev = data.elements('revision').last
    raise Project::UnknownObjectError, "Project not found: #{project}" unless lastrev

    meta = Backend::Api::Sources::Project.meta(project, revision: lastrev.value('srcmd5'), deleted: 1)
    raise Project::UnknownObjectError, "Project not found: #{project}" unless meta
    return true if User.admin_session?
    # FIXME: actually a per user checking would be more accurate here
    raise Project::UnknownObjectError, "Project not found: #{project}" if FlagHelper.xml_disabled_for?(Xmlhash.parse(meta), 'access')
  end
end