From 5b7ffe0a758eaeeccdd7b7af90355b13779083b9 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Sat, 15 Oct 2022 18:09:16 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- Gemfile | 3 + Gemfile.checksum | 1 + Gemfile.lock | 3 + app/models/ci/secure_file.rb | 4 +- .../ci/secure_files/mobile_provision.rb | 85 ++++++++++ .../ci_secure_files/sample.mobileprovision | Bin 0 -> 12278 bytes .../ci/secure_files/mobile_provision_spec.rb | 149 ++++++++++++++++++ spec/models/ci/secure_file_spec.rb | 5 + 8 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 lib/gitlab/ci/secure_files/mobile_provision.rb create mode 100644 spec/fixtures/ci_secure_files/sample.mobileprovision create mode 100644 spec/lib/gitlab/ci/secure_files/mobile_provision_spec.rb diff --git a/Gemfile b/Gemfile index ac38fbfd530..d4fc7e03d5a 100644 --- a/Gemfile +++ b/Gemfile @@ -579,3 +579,6 @@ gem 'cvss-suite', '~> 3.0.1', require: 'cvss_suite' # Work with RPM packages gem 'arr-pm', '~> 0.0.12' + +# Apple plist parsing +gem 'CFPropertyList' diff --git a/Gemfile.checksum b/Gemfile.checksum index a258da072f5..cbb692d81c8 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -1,4 +1,5 @@ [ +{"name":"CFPropertyList","version":"3.0.5","platform":"ruby","checksum":"a78551cd4768d78ebca98488c27e33652ef818be64697a54676d34e6434674a4"}, {"name":"RedCloth","version":"4.3.2","platform":"ruby","checksum":"1ee7bc55c8dcec92cf7741a2132a9a6cd19e4b884fbc1b3aca23e1a4fcd92d55"}, {"name":"acme-client","version":"2.0.11","platform":"ruby","checksum":"edf6da9f3c5dbe3ab0c6738eb3b97978b7a60e3500445480d2a72fcc610089de"}, {"name":"actioncable","version":"6.1.6.1","platform":"ruby","checksum":"11f079141cf032026881e4a79ae0cc93753351089c1b6ca1ed30a8a6a21f961b"}, diff --git a/Gemfile.lock b/Gemfile.lock index 4f62d212ab8..550dce622a1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -85,6 +85,8 @@ PATH GEM remote: https://rubygems.org/ specs: + CFPropertyList (3.0.5) + rexml RedCloth (4.3.2) acme-client (2.0.11) faraday (>= 1.0, < 3.0.0) @@ -1532,6 +1534,7 @@ PLATFORMS ruby DEPENDENCIES + CFPropertyList RedCloth (~> 4.3.2) acme-client (~> 2.0) activerecord-explain-analyze (~> 0.1) diff --git a/app/models/ci/secure_file.rb b/app/models/ci/secure_file.rb index d9e717df1d0..ffff7eebbee 100644 --- a/app/models/ci/secure_file.rb +++ b/app/models/ci/secure_file.rb @@ -7,7 +7,7 @@ module Ci FILE_SIZE_LIMIT = 5.megabytes.freeze CHECKSUM_ALGORITHM = 'sha256' - PARSABLE_EXTENSIONS = %w[cer p12].freeze + PARSABLE_EXTENSIONS = %w[cer p12 mobileprovision].freeze self.limit_scope = :project self.limit_name = 'project_ci_secure_files' @@ -51,6 +51,8 @@ module Ci Gitlab::Ci::SecureFiles::Cer.new(file.read) when 'p12' Gitlab::Ci::SecureFiles::P12.new(file.read) + when 'mobileprovision' + Gitlab::Ci::SecureFiles::MobileProvision.new(file.read) end end diff --git a/lib/gitlab/ci/secure_files/mobile_provision.rb b/lib/gitlab/ci/secure_files/mobile_provision.rb new file mode 100644 index 00000000000..4ea74e20310 --- /dev/null +++ b/lib/gitlab/ci/secure_files/mobile_provision.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true +require 'cfpropertylist' + +module Gitlab + module Ci + module SecureFiles + class MobileProvision + include Gitlab::Utils::StrongMemoize + + attr_reader :error + + def initialize(filedata) + @filedata = filedata + end + + def decoded_plist + p7 = OpenSSL::PKCS7.new(@filedata) + p7.verify(nil, OpenSSL::X509::Store.new, nil, OpenSSL::PKCS7::NOVERIFY) + p7.data + rescue ArgumentError, OpenSSL::PKCS7::PKCS7Error => err + @error = err.to_s + nil + end + strong_memoize_attr :decoded_plist + + def properties + list = CFPropertyList::List.new(data: decoded_plist, format: CFPropertyList::List::FORMAT_XML).value + CFPropertyList.native_types(list) + rescue CFFormatError, CFPlistError, CFTypeError => err + @error = err.to_s + nil + end + strong_memoize_attr :properties + + def metadata + return {} unless properties + + { + id: id, + expires_at: expires_at, + platforms: properties["Platform"], + team_name: properties['TeamName'], + team_id: properties['TeamIdentifier'], + app_name: properties['AppIDName'], + app_id: properties['Name'], + app_id_prefix: properties['ApplicationIdentifierPrefix'], + xcode_managed: properties['IsXcodeManaged'], + entitlements: properties['Entitlements'], + devices: properties['ProvisionedDevices'], + certificate_ids: certificate_ids + } + end + strong_memoize_attr :metadata + + private + + def id + properties['UUID'] + end + + def expires_at + properties['ExpirationDate'] + end + + def certificate_ids + return [] if developer_certificates.empty? + + developer_certificates.map { |c| c.metadata[:id] } + end + + def developer_certificates + certificates = properties['DeveloperCertificates'] + return if certificates.empty? + + certs = [] + certificates.each_with_object([]) do |cert, obj| + certs << Cer.new(cert) + end + + certs + end + end + end + end +end diff --git a/spec/fixtures/ci_secure_files/sample.mobileprovision b/spec/fixtures/ci_secure_files/sample.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..89bf7246b75350377d62bdacfb413da5744d27a1 GIT binary patch literal 12278 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