# frozen_string_literal: true require 'openssl' require 'cfpropertylist' require 'app_info/util' module AppInfo # .mobileprovision file parser class MobileProvision def initialize(path) @path = path end def name mobileprovision.try(:[], 'Name') end def app_name mobileprovision.try(:[], 'AppIDName') end def devices mobileprovision.try(:[], 'ProvisionedDevices') end def team_identifier mobileprovision.try(:[], 'TeamIdentifier') end def team_name mobileprovision.try(:[], 'TeamName') end def profile_name mobileprovision.try(:[], 'Name') end def created_date mobileprovision.try(:[], 'CreationDate') end def expired_date mobileprovision.try(:[], 'ExpirationDate') end def entitlements mobileprovision.try(:[], 'Entitlements') end def developer_certs certs = mobileprovision.try(:[], 'DeveloperCertificates') return if certs.empty? certs.each_with_object([]) do |cert, obj| obj << DeveloperCertificate.new(cert) end end def [](key) mobileprovision.try(:[], key.to_s) end def empty? mobileprovision.nil? end def mobileprovision return @mobileprovision = nil unless File.exist?(@path) data = File.read(@path) data = strip_plist_wrapper(data) unless bplist?(data) list = CFPropertyList::List.new(data: data).value @mobileprovision = CFPropertyList.native_types(list) rescue CFFormatError @mobileprovision = nil end def method_missing(method_name, *args, &block) mobileprovision.try(:[], Util.format_key(method_name)) || mobileprovision.send(method_name) || super end def respond_to_missing?(method_name, *args) mobileprovision.key?(Util.format_key(method_name)) || mobileprovision.respond_to?(method_name) || super end private def bplist?(raw) raw[0..5] == 'bplist' end def strip_plist_wrapper(raw) end_tag = '' start_point = raw.index('