Welcome to mirror list, hosted at ThFree Co, Russian Federation.

mobile_provision.rb « secure_files « ci « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4ea74e203107bb499b6fa5a45b5d9fae8ce62c2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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