ios_config 1.3.3 → 1.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c4fd6dbd28429a9e1b572c8c173c7c6772f4d24e
4
+ data.tar.gz: e45a90bada36d9bde551bf5ef3b3c5b358d709a9
5
+ SHA512:
6
+ metadata.gz: 8f6210a45d927fa3dadfab05a736c8a5f72bb9fbc74e9abefc73eac9e9ed10a0fe73fc85e96e7ec1a4b2036761858f767f0d64eb9d991fa4d318410e2121d8e3
7
+ data.tar.gz: d34c19c08e58db0d326bf19b2b2ee96448fe142b099e0eb195e88ec2766aaabeac9fa2889ad0ef8f54a129b6b604e275a7620bc2aea01a853ca627a3f0ec5f27
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ - jruby-19mode
6
+ - ruby-head
7
+ - jruby-head
8
+
9
+ script: bundle exec rspec
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  # ios_config
2
+ [![Build Status](https://travis-ci.org/tboyko/ios_config.png?branch=master)](https://travis-ci.org/tboyko/ios_config)
2
3
 
3
4
  This gem provides an easy way to generate profiles and configuration payloads for use with Apple iOS devices. These profiles and payloads can be delivered via Apple MDM or Apple's Configurator or iPhone Configuration Utility (IPCU).
4
5
 
@@ -37,7 +38,7 @@ vpn_payload = IOSConfig::Payload::VPN.new connection_name: "My VPN",
37
38
  connection_type: :pptp,
38
39
  encryption_level: :auto,
39
40
  proxy_type: :none,
40
- send_all_traffic? true,
41
+ send_all_traffic: true,
41
42
  server: "example.org",
42
43
  username: "macdemarco",
43
44
  password: "viceroy"
@@ -52,8 +53,8 @@ profile = IOSConfig::Profile.new type: "Configuration",
52
53
  organization: "A Company Name",
53
54
  uuid: SecureRandom.uuid,
54
55
  allow_removal: false,
55
- client_certs: [OpenSSL::X509::Certificate.new], # Array of client certificates
56
- payloads: payloads # must be an array when type is "Configuration"
56
+ client_certs: [OpenSSL::X509::Certificate.new(string_with_pem_encoded_cert)], # Array of client certificates
57
+ payloads: payloads # must be an array when type is "Configuration"
57
58
 
58
59
 
59
60
  # Generate a plist version of the profile, ready for delivery to the device
@@ -84,7 +85,7 @@ profile_plist = profile.signed( [signing_cert_path], [intermediate_path], [key_p
84
85
 
85
86
  ```ruby
86
87
  allow_removal # if profile can be deleted by device user. defaults to true
87
- description # (optional) displayed in device settings
88
+ description # (optional) displayed in device settings
88
89
  display_name # displayed in device settings
89
90
  identifier
90
91
  organization # (optional) displayed in device settings
@@ -155,26 +156,26 @@ payload = IOSConfig::Payload::VPN.new(parameters).build
155
156
  Available parameters:
156
157
 
157
158
  ```ruby
158
- connection_name
159
+ connection_name
159
160
  authentication_type # :password, :rsa_securid
160
161
  connection_type # :l2tp, :pptp, :ipsec, :anyconnect, :juniper_ssl, :f5_ssl, :sonicwall_modile_connect, :aruba_via
161
162
  encryption_level # :none, :manual, :auto
162
- group_name
163
+ group_name
163
164
  prompt_for_password # true, false
164
165
  proxy_type # :none, :manual, :auto
165
- proxy_port
166
- proxy_server
166
+ proxy_port
167
+ proxy_server
167
168
  send_all_traffic # true, false
168
- server
169
- proxy_url
170
- group_or_domain
171
- password
172
- username
173
- proxy_password
174
- proxy_username
175
- realm
176
- role
177
- shared_secret
169
+ server
170
+ proxy_url
171
+ group_or_domain
172
+ password
173
+ username
174
+ proxy_password
175
+ proxy_username
176
+ realm
177
+ role
178
+ shared_secret
178
179
  ```
179
180
 
180
181
  #### Wi-Fi
@@ -211,7 +212,7 @@ proxy_url
211
212
 
212
213
  ### Custom Payloads
213
214
 
214
- If you need to create a payload that isn't supported by the library, you can do so using the `IOSConfig::Payload::Custom` class.
215
+ If you need to create a payload that isn't supported by the library, you can do so using the `IOSConfig::Payload::Custom` class.
215
216
 
216
217
  The construction of this payload is similar to the ready-made ones with two exceptions: You must specify the payload type and the actual structure of the payload.
217
218
 
data/ios_config.gemspec CHANGED
@@ -19,6 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "CFPropertyList", "~> 2.2"
22
+ spec.add_dependency "plist", "~> 3.1"
22
23
  spec.add_development_dependency "bundler", "~> 1.3"
23
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec", "~> 2.1"
24
26
  end
@@ -11,7 +11,7 @@ module IOSConfig
11
11
  attributes.each do |name, value|
12
12
  begin
13
13
  send("#{name}=", value)
14
- rescue NoMethodError => e
14
+ rescue NoMethodError => e
15
15
  raise ArgumentError, %{"#{name}" is not a valid attribute}
16
16
  end
17
17
  end
@@ -0,0 +1,73 @@
1
+ module IOSConfig
2
+ module Payload
3
+ class Certificate < Base
4
+
5
+ attr_accessor :type, # pkcs12, caroot
6
+ :filename, # Certificate filename
7
+ :cert_path, # Certificate file path
8
+ :description, # Certificate description
9
+ :displayname, #
10
+ :identifier, # Certificate identifier
11
+ :organization, # Certificate organization
12
+ :password, # Password to unlock certificate
13
+ :payload_version # Payload version
14
+
15
+ def initialize(attributes = {})
16
+ attributes ||= {}
17
+ [ :type,
18
+ :filename,
19
+ :cert_path,
20
+ :description,
21
+ :displayname,
22
+ :identifier,
23
+ :organization ].each do |attribute|
24
+ raise ArgumentError, "#{attribute} must be specified" unless attributes[attribute]
25
+ end
26
+
27
+ super(attributes)
28
+ end
29
+
30
+ private
31
+
32
+ def payload
33
+ p = { 'PayloadCertificateFileName' => @filename,
34
+ 'PayloadContent' => read_cert(@cert_path, @password),
35
+ 'PayloadDescription' => @description,
36
+ 'PayloadDisplayName' => @displayname,
37
+ 'PayloadIdentifier' => @identifier,
38
+ 'PayloadOrganization' => @organization,
39
+ }
40
+
41
+ p['Password'] = @password unless @password.blank?
42
+
43
+ p
44
+ end
45
+
46
+ def read_cert(cert_path, password = nil)
47
+ data = File.read(cert_path)
48
+
49
+ # This will throw an exception if we have an incorrect password
50
+ if !password.nil?
51
+ OpenSSL::PKCS12.new(data, password)
52
+ end
53
+
54
+ StringIO.new data
55
+ end
56
+
57
+ def payload_type
58
+ case @type
59
+ when 'pkcs12'
60
+ 'com.apple.security.pkcs12'
61
+ when 'caroot'
62
+ 'com.apple.security.root'
63
+ else
64
+ raise NotImplementedError
65
+ end
66
+ end
67
+
68
+ def payload_version
69
+ @payload_version || super
70
+ end
71
+ end
72
+ end
73
+ end
@@ -2,7 +2,7 @@ module IOSConfig
2
2
  module Payload
3
3
  class Custom < Base
4
4
 
5
- attr_accessor :payload_type, :payload_version, :payload
5
+ attr_accessor :payload_type, :payload_version, :payload
6
6
 
7
7
  def initialize(attributes = {})
8
8
  attributes ||= {}
@@ -2,13 +2,15 @@ module IOSConfig
2
2
  module Payload
3
3
  class VPN < Base
4
4
 
5
- attr_accessor :authentication_type, # :password, :rsa_securid
6
- :connection_type, # :l2tp, :pptp, :ipsec, :anyconnect, :juniper_ssl, :f5_ssl, :sonicwall_modile_connect, :aruba_via
7
- :encryption_level, # :none, :manual, :auto
5
+ attr_accessor :authentication_method, # :shared_secret, :certificate
6
+ :authentication_type, # :password, :rsa_securid
7
+ :certificate_uuid, # Certificate UUID. Only used with ipsec and authentication method :certificate
8
+ :connection_type, # :l2tp, :pptp, :ipsec, :anyconnect, :juniper_ssl, :f5_ssl, :sonicwall_modile_connect, :aruba_via
9
+ :encryption_level, # :none, :manual, :auto
8
10
  :group_name,
9
11
  :connection_name,
10
12
  :prompt_for_password,
11
- :proxy_type, # :none, :manual, :auto
13
+ :proxy_type, # :none, :manual, :auto
12
14
  :proxy_port,
13
15
  :proxy_server,
14
16
  :send_all_traffic,
@@ -43,7 +45,7 @@ module IOSConfig
43
45
  p_ipsec['SharedSecret'] = StringIO.new(@shared_secret) unless @shared_secret.blank?
44
46
  p['IPSec'] = p_ipsec
45
47
  p['PPP'] = generate_ppp_config
46
-
48
+
47
49
  when :pptp
48
50
  p['VPNType'] = 'PPTP'
49
51
  p['PPP'] = generate_ppp_config.merge({ 'CPPEnabled' => @encryption_level != :none,
@@ -53,16 +55,26 @@ module IOSConfig
53
55
 
54
56
  when :ipsec
55
57
  p['VPNType'] = 'IPSec'
56
- p_ipsec = { 'AuthenticationMethod' => 'SharedSecret',
57
- 'LocalIdentifierType' => 'KeyID',
58
- 'RemoteAddress' => @server }
59
- p_ipsec['LocalIdentifier'] = @group_name unless @group_name.blank?
60
- p_ipsec['SharedSecret'] = StringIO.new(@shared_secret) unless @shared_secret.blank?
58
+ p_ipsec = { 'RemoteAddress' => @server }
59
+
60
+ case @authentication_method
61
+ when :certificate
62
+ p_ipsec['AuthenticationMethod'] = 'Certificate'
63
+ p_ipsec['PayloadCertificateUUID'] = @certificate_uuid
64
+ when :shared_secret
65
+ p_ipsec['AuthenticationMethod'] = 'SharedSecret'
66
+ p_ipsec['LocalIdentifierType'] = 'KeyID'
67
+ p_ipsec['LocalIdentifier'] = @group_name unless @group_name.blank?
68
+ p_ipsec['SharedSecret'] = StringIO.new(@shared_secret) unless @shared_secret.blank?
69
+ end
70
+
61
71
  unless @username.blank?
62
72
  p_ipsec['XAuthEnabled'] = 1
63
73
  p_ipsec['XAuthName'] = @username
74
+ p_ipsec['XAuthPassword'] = @password
75
+ p_ipsec['XAuthPasswordEncryption'] = 'Prompt' unless @prompt_for_password.blank?
64
76
  end
65
- p_ipsec['XAuthPasswordEncryption'] = 'Prompt' unless @prompt_for_password.blank?
77
+
66
78
  p['IPSec'] = p_ipsec
67
79
 
68
80
  when :anyconnect
@@ -79,7 +91,7 @@ module IOSConfig
79
91
  vendor_config['Role'] = @role unless @role.blank?
80
92
  p['VendorConfig'] = vendor_config
81
93
  p['VPN'] = generate_vpn_config
82
-
94
+
83
95
  when :f5_ssl
84
96
  p['VPNType'] = 'VPN'
85
97
  p['VPNSubType'] = 'com.f5.F5-Edge-Client.vpnplugin'
@@ -107,7 +119,7 @@ module IOSConfig
107
119
  case @proxy_type
108
120
  when :none
109
121
  p_proxy = {}
110
-
122
+
111
123
  when :manual
112
124
  p_proxy = { 'HTTPEnable' => 1,
113
125
  'HTTPPort' => @proxy_port,
@@ -118,11 +130,11 @@ module IOSConfig
118
130
 
119
131
  p_proxy['HTTPProxyUsername'] = @proxy_username unless @proxy_username.blank?
120
132
  p_proxy['HTTPProxyPassword'] = @proxy_password unless @proxy_password.blank?
121
-
133
+
122
134
  when :auto
123
135
  p_proxy = { 'ProxyAutoConfigEnable' => 1,
124
136
  'ProxyAutoConfigURLString' => @proxy_url }
125
-
137
+
126
138
  end
127
139
  p['Proxies'] = p_proxy
128
140
 
@@ -37,7 +37,7 @@ module IOSConfig
37
37
  def payload
38
38
  p = { 'EncryptionType' => ENCRYPTION_TYPES[@encryption_type] }
39
39
 
40
-
40
+
41
41
  p['AutoJoin'] = @auto_join unless @auto_join.nil?
42
42
  p['HIDDEN_NETWORK'] = @hidden_network unless @hidden_network.nil?
43
43
  p['SSID_STR'] = @ssid unless @ssid.nil?
@@ -60,7 +60,7 @@ module IOSConfig
60
60
 
61
61
  p['ProxyType'] = @proxy_type.to_s.capitalize unless @proxy_type.nil?
62
62
 
63
- case @proxy_type
63
+ case @proxy_type
64
64
  when :manual
65
65
  p.merge! ({ 'ProxyServer' => @proxy_server,
66
66
  'ProxyServerPort' => @proxy_port })
@@ -1,11 +1,12 @@
1
1
  require 'cfpropertylist'
2
+ require 'plist'
2
3
 
3
4
  module IOSConfig
4
5
  class Profile
5
6
  require 'openssl'
6
7
 
7
8
  attr_accessor :allow_removal, # if profile can be deleted by device user. defaults to true
8
- :description, # (optional) displayed in device settings
9
+ :description, # (optional) displayed in device settings
9
10
  :display_name, # displayed in device settings
10
11
  :identifier,
11
12
  :organization, # (optional) displayed in device settings
@@ -17,57 +18,62 @@ module IOSConfig
17
18
 
18
19
  def initialize(options = {})
19
20
  options.each { |k,v| self.send("#{k}=", v) }
20
- puts self.allow_removal
21
- puts self.allow_removal.nil?
22
- self.allow_removal = true if self.allow_removal.nil?
23
- self.type ||= 'Configuration'
24
- self.version ||= 1
25
- self.payloads ||= []
21
+
22
+ @allow_removal = true if @allow_removal.nil?
23
+ @type ||= 'Configuration'
24
+ @version ||= 1
25
+ @payloads ||= []
26
26
  end
27
-
27
+
28
28
  def signed(mdm_cert, mdm_intermediate_cert, mdm_private_key)
29
29
  certificate = OpenSSL::X509::Certificate.new(File.read(mdm_cert))
30
30
  intermediate = OpenSSL::X509::Certificate.new(File.read(mdm_intermediate_cert))
31
31
  private_key = OpenSSL::PKey::RSA.new(File.read(mdm_private_key))
32
-
32
+
33
33
  signed_profile = OpenSSL::PKCS7.sign(certificate, private_key, unsigned, [intermediate], OpenSSL::PKCS7::BINARY)
34
34
  signed_profile.to_der
35
35
  end
36
-
37
- def unsigned
36
+
37
+ def unsigned(format = :binary)
38
38
  raise_if_blank [:version, :uuid, :type, :identifier, :display_name]
39
-
39
+
40
40
  profile = {
41
- 'PayloadDisplayName' => self.display_name,
42
- 'PayloadVersion' => self.version,
43
- 'PayloadUUID' => self.uuid,
44
- 'PayloadIdentifier' => self.identifier,
45
- 'PayloadType' => self.type,
46
- 'PayloadRemovalDisallowed' => !self.allow_removal
41
+ 'PayloadDisplayName' => @display_name,
42
+ 'PayloadVersion' => @version,
43
+ 'PayloadUUID' => @uuid,
44
+ 'PayloadIdentifier' => @identifier,
45
+ 'PayloadType' => @type,
46
+ 'PayloadRemovalDisallowed' => !@allow_removal
47
47
  }
48
- profile['PayloadOrganization'] = self.organization if self.organization
49
- profile['PayloadDescription'] = self.description if self.description
50
-
51
- if self.client_certs.nil?
52
- profile['PayloadContent'] = payloads
48
+ profile['PayloadOrganization'] = @organization if @organization
49
+ profile['PayloadDescription'] = @description if @description
50
+
51
+ if @client_certs.nil?
52
+ profile['PayloadContent'] = @payloads
53
53
  else
54
- encrypted_payload_content = OpenSSL::PKCS7.encrypt( self.client_certs,
55
- payloads.to_plist,
56
- OpenSSL::Cipher::Cipher::new("des-ede3-cbc"),
54
+ encrypted_payload_content = OpenSSL::PKCS7.encrypt( @client_certs,
55
+ @payloads.to_plist,
56
+ OpenSSL::Cipher::Cipher::new("des-ede3-cbc"),
57
57
  OpenSSL::PKCS7::BINARY)
58
-
58
+
59
59
  profile['EncryptedPayloadContent'] = StringIO.new encrypted_payload_content.to_der
60
60
  end
61
61
 
62
- profile.to_plist
62
+ case format
63
+ when :binary
64
+ profile.to_plist
65
+ when :xml
66
+ Plist::Emit.dump(profile)
67
+ else
68
+ raise ArgumentError, 'unknown format'
69
+ end
70
+
63
71
  end
64
72
 
65
73
  private
66
-
74
+
67
75
  def raise_if_blank(required_attributes)
68
- required_attributes.each { |a| raise "#{a} must be set" if self.send(a).blank? }
76
+ required_attributes.each { |a| raise "#{a} must be set" if self.send(a).nil? }
69
77
  end
70
-
71
78
  end
72
-
73
- end
79
+ end
@@ -1,3 +1,3 @@
1
1
  module IOSConfig
2
- VERSION = "1.3.3"
2
+ VERSION = "1.3.4"
3
3
  end
data/lib/ios_config.rb CHANGED
@@ -4,6 +4,7 @@ require 'ios_config/profile'
4
4
  require 'ios_config/payload/base'
5
5
  require 'ios_config/payload/air_play'
6
6
  require 'ios_config/payload/air_print'
7
+ require 'ios_config/payload/certificate'
7
8
  require 'ios_config/payload/custom'
8
9
  require 'ios_config/payload/single_sign_on_account'
9
10
  require 'ios_config/payload/vpn'
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe IOSConfig::Payload::VPN do
4
+
5
+ subject(:vpn) do
6
+ IOSConfig::Payload::VPN.new connection_name: "My VPN",
7
+ authentication_type: :password,
8
+ connection_type: :pptp,
9
+ encryption_level: :auto,
10
+ proxy_type: :none,
11
+ send_all_traffic: true,
12
+ server: "example.org",
13
+ username: "macdemarco",
14
+ password: "viceroy"
15
+ end
16
+
17
+ it 'builds a payload hash' do
18
+ expect(vpn.build).to be_a_kind_of(Hash)
19
+ end
20
+
21
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe IOSConfig::Profile do
4
+
5
+ subject(:profile) do
6
+ IOSConfig::Profile.new type: "Configuration",
7
+ display_name: "A Profile Name",
8
+ identifier: "org.example.examplemdmservice.exampleprofile",
9
+ organization: "A Company Name",
10
+ uuid: SecureRandom.uuid,
11
+ allow_removal: false,
12
+ client_certs: [],
13
+ payloads: ['dummy payload content']
14
+ end
15
+
16
+ it 'creates an unsigned profile' do
17
+ unsigned = profile.unsigned
18
+
19
+ expect(unsigned).to be_a_kind_of(String)
20
+ expect(unsigned).to have_at_least(100).characters
21
+ end
22
+
23
+ end
@@ -0,0 +1 @@
1
+ require 'ios_config'
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ios_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
5
- prerelease:
4
+ version: 1.3.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Taylor Boyko
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-24 00:00:00.000000000 Z
11
+ date: 2014-03-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: CFPropertyList
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,15 +20,27 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
29
26
  version: '2.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: plist
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
30
41
  - !ruby/object:Gem::Dependency
31
42
  name: bundler
32
43
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
44
  requirements:
35
45
  - - ~>
36
46
  - !ruby/object:Gem::Version
@@ -38,7 +48,6 @@ dependencies:
38
48
  type: :development
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
52
  - - ~>
44
53
  - !ruby/object:Gem::Version
@@ -46,19 +55,31 @@ dependencies:
46
55
  - !ruby/object:Gem::Dependency
47
56
  name: rake
48
57
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
58
  requirements:
51
- - - ! '>='
59
+ - - '>='
52
60
  - !ruby/object:Gem::Version
53
61
  version: '0'
54
62
  type: :development
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
65
  requirements:
59
- - - ! '>='
66
+ - - '>='
60
67
  - !ruby/object:Gem::Version
61
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '2.1'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '2.1'
62
83
  description: Generate configuration profiles and payloads for Apple iOS devices
63
84
  email:
64
85
  - taylorboyko@gmail.com
@@ -67,6 +88,7 @@ extensions: []
67
88
  extra_rdoc_files: []
68
89
  files:
69
90
  - .gitignore
91
+ - .travis.yml
70
92
  - Gemfile
71
93
  - LICENSE
72
94
  - README.md
@@ -77,43 +99,43 @@ files:
77
99
  - lib/ios_config/payload/air_play.rb
78
100
  - lib/ios_config/payload/air_print.rb
79
101
  - lib/ios_config/payload/base.rb
102
+ - lib/ios_config/payload/certificate.rb
80
103
  - lib/ios_config/payload/custom.rb
81
104
  - lib/ios_config/payload/single_sign_on_account.rb
82
105
  - lib/ios_config/payload/vpn.rb
83
106
  - lib/ios_config/payload/wi_fi.rb
84
107
  - lib/ios_config/profile.rb
85
108
  - lib/ios_config/version.rb
109
+ - spec/payload/vpn_spec.rb
110
+ - spec/profile_spec.rb
111
+ - spec/spec_helper.rb
86
112
  homepage: https://github.com/tboyko/ios_config
87
113
  licenses:
88
114
  - MIT
115
+ metadata: {}
89
116
  post_install_message:
90
117
  rdoc_options: []
91
118
  require_paths:
92
119
  - lib
93
120
  required_ruby_version: !ruby/object:Gem::Requirement
94
- none: false
95
121
  requirements:
96
- - - ! '>='
122
+ - - '>='
97
123
  - !ruby/object:Gem::Version
98
124
  version: '0'
99
- segments:
100
- - 0
101
- hash: 4043779232017033479
102
125
  required_rubygems_version: !ruby/object:Gem::Requirement
103
- none: false
104
126
  requirements:
105
- - - ! '>='
127
+ - - '>='
106
128
  - !ruby/object:Gem::Version
107
129
  version: '0'
108
- segments:
109
- - 0
110
- hash: 4043779232017033479
111
130
  requirements: []
112
131
  rubyforge_project:
113
- rubygems_version: 1.8.24
132
+ rubygems_version: 2.0.14
114
133
  signing_key:
115
- specification_version: 3
134
+ specification_version: 4
116
135
  summary: This gen provides an easy way to generate profiles and configuration payloads
117
136
  for use with Apple iOS devices. These profiles and payloads can be delivered via
118
137
  Apple MDM or Apple's Configurator or iPhone Configuration Utility (IPCU).
119
- test_files: []
138
+ test_files:
139
+ - spec/payload/vpn_spec.rb
140
+ - spec/profile_spec.rb
141
+ - spec/spec_helper.rb