Class: IosAndroidToolbox::IosProvisioningProfile

Inherits:
Object
  • Object
show all
Defined in:
lib/ios_android_toolbox/ios_prov_profile.rb

Constant Summary collapse

PROV_PROFILE_DIR =
ENV['HOME']+'/Library/MobileDevice/Provisioning Profiles'
UUID_REGEX =
'[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}'
DEBUG =
false

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(contents) ⇒ IosProvisioningProfile

Returns a new instance of IosProvisioningProfile.



129
130
131
132
133
134
135
136
137
138
139
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 129

def initialize(contents)
  # If we specify a path, read it first
  begin
    if File.exists? contents and not File.directory? contents
      contents = File.open(contents).read
    end
  rescue
  end

  @contents = contents
end

Instance Attribute Details

#contentsObject (readonly)

Returns the value of attribute contents.



13
14
15
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 13

def contents
  @contents
end

Class Method Details

.install(path) ⇒ Object



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 156

def self.install(path)
  if not File.directory? PROV_PROFILE_DIR
    FileUtils.mkdir_p PROV_PROFILE_DIR
    FileUtils.chmod 0755, PROV_PROFILE_DIR
  end

  new_profile = IosProvisioningProfile.new(path)
  new_path    = File.join(PROV_PROFILE_DIR, new_profile.uuid+".mobileprovision")

  if File.expand_path(path) != File.expand_path(new_path)
    if profile_worth_installing? new_profile
      self.remove_stale_equivalent_profiles(path)
      FileUtils.copy(path, new_path)
    end
  else
    puts "Cannot install new profile over itself!"
  end
end

.loop_through_profiles_for_app_id(id, &block) ⇒ Object



195
196
197
198
199
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 195

def self.loop_through_profiles_for_app_id(id, &block)
  self.loop_through_existing_profiles do |p,path|
    yield p, path if p.app_id == id
  end
end

.profile_worth_installing?(path_or_profile) ⇒ Boolean

Returns:

  • (Boolean)


175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 175

def self.profile_worth_installing?(path_or_profile)
  if path_or_profile.is_a? String
    new_profile = IosProvisioningProfile.new(path_or_profile)
  elsif path_or_profile.is_a? IosProvisioningProfile
    new_profile = path_or_profile
  else
    raise "Invalid profile or profile path specified"
  end
  loop_through_existing_profiles do |installed_profile, path|
        if installed_profile.app_id == new_profile.app_id and
          (installed_profile.is_development? and new_profile.is_development? or 
           installed_profile.is_production?  and new_profile.is_production? or
           installed_profile.is_adhoc?       and new_profile.is_adhoc?)
         return false if installed_profile.creation_date >= new_profile.creation_date 
        end
  end

  true
end

.remove_stale_equivalent_profiles(path) ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 141

def self.remove_stale_equivalent_profiles(path)
  new_profile = IosProvisioningProfile.new(path)

      self.loop_through_existing_profiles do |installed_profile, installed_profile_path|
        if installed_profile.app_id == new_profile.app_id and 
         installed_profile.creation_date < new_profile.creation_date and 
         (installed_profile.is_development? and new_profile.is_development? or 
           installed_profile.is_production? and new_profile.is_production? or
           installed_profile.is_adhoc?      and new_profile.is_adhoc?)
      puts "Removing stale Prov Profile: #{installed_profile_path}"
          File.delete installed_profile_path
        end
  end
end

Instance Method Details

#app_idObject



46
47
48
49
50
51
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 46

def app_id
  @app_id ||= begin
    id = plist['Entitlements']['application-identifier']
    id.gsub(/^[A-Z0-9]+\./,'')
  end
end

#app_id_nameObject



53
54
55
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 53

def app_id_name
  plist['AppIDName']
end

#app_id_prefixObject



57
58
59
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 57

def app_id_prefix
  plist['ApplicationIdentifierPrefix']
end

#aps_environmentObject



74
75
76
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 74

def aps_environment
  plist['Entitlements']['aps-environment']
end

#creation_dateObject



61
62
63
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 61

def creation_date
  plist['CreationDate']
end

#developer_certificatesObject



90
91
92
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 90

def developer_certificates
  plist['DeveloperCertificates']
end

#get_task_allowObject



78
79
80
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 78

def get_task_allow
  plist['Entitlements']['get-task-allow']
end

#has_provisioned_devices?Boolean

Returns:

  • (Boolean)


65
66
67
68
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 65

def has_provisioned_devices?
  # <key>ProvisionedDevices</key>
  !!(/<key>ProvisionedDevices<\/key>/.match(plist_string))
end

#installObject



122
123
124
125
126
127
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 122

def install
  dst_path = File.join(PROV_PROFILE_DIR,"#{uuid}.mobileprovision")
  File.open(dst_path, "wb") do |f|
    f.write(contents)
  end
end

#is_adhoc?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 110

def is_adhoc?
  provisioned_devices.is_a? Array and get_task_allow == false
end

#is_development?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 102

def is_development?
  provisioned_devices.is_a? Array and get_task_allow == true
end

#is_development_aps_environment?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 114

def is_development_aps_environment?
  aps_environment == 'development'
end

#is_production?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 106

def is_production?
  provisioned_devices.nil? and get_task_allow == false
end

#is_production_aps_environment?Boolean

Returns:

  • (Boolean)


118
119
120
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 118

def is_production_aps_environment?
  aps_environment == 'production'
end

#pathObject



42
43
44
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 42

def path
  File.join(PROV_PROFILE_DIR,uuid+".mobileprovision")
end

#plistObject



27
28
29
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 27

def plist
  plist ||= Plist.parse_xml(plist_string)
end

#plist_stringObject



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 15

def plist_string
  @plist_string ||= begin
    xml_start = contents.index('<?xml version=')
    return nil if xml_start.nil?

    xml_end = contents.index('</plist>', xml_start)
    return nil if xml_end.nil?

    contents.slice(xml_start, xml_end - xml_start + 8)
  end
end

#provisioned_devicesObject



70
71
72
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 70

def provisioned_devices
  plist['ProvisionedDevices']
end

#team_identifierObject



94
95
96
97
98
99
100
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 94

def team_identifier
  if team_identifiers && team_identifiers.size > 0
    team_identifiers[0]
  else
    nil
  end
end

#team_identifiersObject



86
87
88
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 86

def team_identifiers
  plist['TeamIdentifier']
end

#team_nameObject



82
83
84
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 82

def team_name
  plist['TeamName']
end

#uuidObject



31
32
33
34
35
36
37
38
39
40
# File 'lib/ios_android_toolbox/ios_prov_profile.rb', line 31

def uuid
  # <key>UUID</key>
  #  <string>06AF2826-608D-4CE9-99AE-AA917FF1641E</string>
  if /<key>UUID<\/key>\s*<string>(#{UUID_REGEX})<\/string>/.match(plist_string)
    puts "Found UUID: #{$1}" if DEBUG
    uuid = $1
  else
    nil
  end
end