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 +7 -0
- data/.travis.yml +9 -0
- data/README.md +20 -19
- data/ios_config.gemspec +2 -0
- data/lib/ios_config/payload/base.rb +1 -1
- data/lib/ios_config/payload/certificate.rb +73 -0
- data/lib/ios_config/payload/custom.rb +1 -1
- data/lib/ios_config/payload/vpn.rb +27 -15
- data/lib/ios_config/payload/wi_fi.rb +2 -2
- data/lib/ios_config/profile.rb +39 -33
- data/lib/ios_config/version.rb +1 -1
- data/lib/ios_config.rb +1 -0
- data/spec/payload/vpn_spec.rb +21 -0
- data/spec/profile_spec.rb +23 -0
- data/spec/spec_helper.rb +1 -0
- metadata +46 -24
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
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
|
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
|
@@ -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,13 +2,15 @@ module IOSConfig
|
|
2
2
|
module Payload
|
3
3
|
class VPN < Base
|
4
4
|
|
5
|
-
attr_accessor :
|
6
|
-
:
|
7
|
-
:
|
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,
|
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 = { '
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
-
|
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 })
|
data/lib/ios_config/profile.rb
CHANGED
@@ -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
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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' =>
|
42
|
-
'PayloadVersion' =>
|
43
|
-
'PayloadUUID' =>
|
44
|
-
'PayloadIdentifier' =>
|
45
|
-
'PayloadType' =>
|
46
|
-
'PayloadRemovalDisallowed' =>
|
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'] =
|
49
|
-
profile['PayloadDescription'] =
|
50
|
-
|
51
|
-
if
|
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(
|
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
|
-
|
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).
|
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
|
data/lib/ios_config/version.rb
CHANGED
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
|
data/spec/spec_helper.rb
ADDED
@@ -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.
|
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:
|
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:
|
132
|
+
rubygems_version: 2.0.14
|
114
133
|
signing_key:
|
115
|
-
specification_version:
|
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
|