├── .gitattributes ├── README.md ├── android.html ├── index.html └── js └── clipboard.min.js /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WiFi Mobile Configuration Profile Generator 2 | 3 | ## Table of contents 4 | - [What does it do?](#what-does-it-do) 5 | - [How does it work?](#how-does-it-work) 6 | - [What frameworks are used?](#what-frameworks-are-used) 7 | - [How do I use it?](#how-do-i-use-it) 8 | - [Functions](#functions) 9 | - [Why?](#why) 10 | 11 | ## What does it do? 12 | 13 | [Back to top](#table-of-contents) 14 | 15 | When you manage your mobile devices (specifically, **iOS, Android or Windows devices**) via any source - an MDM, for example... this provider sends your device a *Configuration Profile* - this is the raw data that contain the information that they want to configure on your device. 16 | 17 | I've ran into a lot of scenarios where I need to make a Wi-Fi profile manually - troubleshooting, testing, or simply installing a standalone one without an MDM. 18 | On iOS, this is normally possible with a tool Apple provides called **Apple Configurator** - I do not have a Mac, and this tool only works on Mac devices - so this is the best next thing! 19 | Windows & Android use the same format, so you can typically export a configured Wi-Fi network from a Windows machine, and import into an MDM to deploy widespread, but also to your Android devices. 20 | 21 | This web app makes the job simple - you don't have to do any sort of exports, or use Apple Configurtor - you simply fill out the details, copy the profile to your clipboard, and you can use it however you wish - usually the contents are saved in a format such as ***wifi.mobileConfig*** for iOS, or something such as ***wifi.xml*** format for Windows & Android. 22 | 23 | ## How does it work? 24 | 25 | [Back to top](#table-of-contents) 26 | 27 | It's a standalone webpage (it does have CSS/JavaScript dependencies - more on this later). None of the information you provide ever leaves your browser. It reads the input that you provide into the fields, and replaces the corresponding fields in the generated profile. 28 | 29 | ## What frameworks are used? 30 | 31 | [Back to top](#table-of-contents) 32 | 33 | 1. [Bootstrap](https://getbootstrap.com/) 4.4.1 for the CSS framework 34 | 2. [jQuery](https://jquery.com/) for the data validation / reading / manipulation 35 | 3. [Clipboard.js](https://clipboard.js) for the "Copy to clipboard" function 36 | 37 | Bootstrap and jQuery are loaded from their CDN - the Clipboard.js framework is loaded locally (in the "js" folder) - the source code is simple, I left the line in that you can edit if you simply want a single .html file to use internally. 38 | 39 | ## How do I use it? 40 | 41 | [Back to top](#table-of-contents) 42 | 43 | - You can simply use the GitHub pages link I have hosted! https://daduckmsft.github.io/WiFiProfileGenerator/ 44 | - Alternatively, you can download everything from [here](https://github.com/daduckMSFT/WiFiProfileGenerator/releases/latest), unzip, and enjoy! Nothing else needed - it should just work. 45 | - If you want to host the dependencies yourself, you can surely do so, but it's way outside of the scope that I'll cover here! 46 | - If you simply want a page, without even the clipboard.js local dependency - you can edit the page to load it from the CDN. 47 | 48 | Edit the html files for both, and you'll see some lines in the `````` that look like this: 49 | ```html 50 | 51 | 52 | ``` 53 | 54 | You can comment those out, and make it look like the following to use the Clipboard.js CDN: 55 | 56 | ```html 57 | 59 | 60 | 61 | ``` 62 | 63 | (If this ever fails, they have CDN providers on their GitHub wiki, found [here](https://github.com/zenorocha/clipboard.js/wiki/CDN-Providers) 64 | 65 | ## Functions 66 | 67 | [Back to top](#table-of-contents) 68 | 69 | I tried to document the functions in a manner that's fairly straightforward, but without some basic knowledge of Object Oriented Programming it might not be very clear. 70 | There is more information - you can see more info on them below. 71 | 72 | - [Functions](https://github.com/daduckMSFT/WiFiProfileGenerator/wiki) 73 | 74 | ## Why? 75 | 76 | [Back to top](#table-of-contents) 77 | 78 | I made this because there used to be a website that allowed you to generate a custom / text-based Wi-Fi profile for iOS devices. 79 | Sadly, this no longer exists, and I've made this as it's spiritual successor! Johnathanb, if you're out there, I used your website a lot and was sad to see it was no longer there! -------------------------------------------------------------------------------- /android.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Android & Windows Wi-Fi Profile Generator 8 | 9 | 10 | 11 | 12 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 38 | 39 | 41 | 141 | 146 | 147 | 148 |
149 |
150 | 151 | 166 |
167 | 168 | 169 |
170 |
171 |

What is this for?

172 |

If you need to configure your Android or Windows devices, using a Wi-Fi network - you can either use the GUI, or this.
173 | Sometimes the option you need isn't in the UI - so as a workaround, you can find out what the manual option is and generate it.
174 | This is meant to be a supplement to that.

175 |
176 |

Both Android & Windows use the same XML format, as far as I'm aware (there might be fields that vary). 177 | Use this as the basis, and enjoy!
178 | 179 |

This site will help generate a configuration profile based on the network information you provide.
180 | Using this, you can import the profile into your mobile devices (via a method such as an MDM).

181 |

You can see all of the modified output in the bottom as aqua text.

182 |
183 |

All of this is run client-side, within the browser.

184 |
185 |

Extra stuff:

186 | Wireless profile samples
187 | XML Profile Elements
188 |
189 |
190 |
191 | 192 | 193 |
194 |
195 |
Fill out your Wi-Fi network details below. This only supports "Personal" connections.
196 | 197 | 200 |
201 |
202 | 203 |
204 | 205 |
206 | 207 |
208 |
209 | 210 |
211 | 212 | 213 |
214 |
215 |
216 |
217 | Security 218 |
219 |
220 | 222 | 223 | 226 |
227 | 228 |
229 | 230 | 233 |
234 |
235 | 236 | 239 |
240 |
241 | 242 | 245 |
246 |
247 |
248 |
249 |
250 |
251 | 252 | Hidden network? 253 |
254 |
255 | 256 | 259 |
260 |
261 | 262 | 265 |
266 |
267 |
268 |
269 | 270 | 271 |
272 |
273 | 274 | Automatically connect? 275 |
276 |
277 | 278 | 281 |
282 |
283 | 284 | 287 |
288 |
289 |
290 |
291 | 292 |
293 |
294 |

295 | 296 |
297 |
298 | 302 |

Generated Profile

303 | 304 |
305 | 306 |
307 |
308 | 309 |
<?xml version="1.0"?>
310 | <WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
311 | 	<name>Network Name</name>
312 | 	<SSIDConfig>
313 | 		<SSID>
314 |                     <hex>53534944</hex>
315 |                     <name>SSID</name>
316 |                 </SSID>
317 |                 <nonBroadcast>false</nonBroadcast>
318 | 	</SSIDConfig>
319 | 	<connectionType>ESS</connectionType>
320 | 	<connectionMode>auto</connectionMode>
321 | 	<MSM>
322 | 		<security>
323 | 			<authEncryption>
324 | 				<authentication>open</authentication>
325 | 				<encryption>none</encryption>
326 | 				<useOneX>false</useOneX>
327 | 			</authEncryption>
328 | 			<sharedKey>
329 | 				<keyType>passPhrase</keyType>
330 | 				<protected>false</protected>
331 | 				<keyMaterial></keyMaterial>
332 | 			</sharedKey>
333 | 		</security>
334 | 	</MSM>
335 | </WLANProfile>
336 | 
337 |
338 |
339 |
340 |
341 | 342 | 343 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | iOS Wi-Fi Profile Generator 8 | 9 | 10 | 11 | 12 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 38 | 39 | 40 | 47 | 48 | 148 | 153 | 154 | 155 |
156 |
157 | 158 | 172 |
173 | 174 | 175 |
176 |
177 |

What is this for?

178 |

Apple offers tools, such as Apple Configurator that allow you to create your own iOS Configuration Profiles.
179 | Apple Configurator is only availble for MacOS devices. This is useful if you do not have access to one but still need this.

180 |
181 | 182 |

This site will help generate a configuration profile based on the network information you provide.
183 | Using this, you can import the profile into your mobile devices (via a method such as an MDM).

184 |

You can see all of the modified output in the bottom as aqua text.

185 |
186 |

All of this is run client-side, within the browser.

187 |
188 |

Extra stuff:

189 | Apple MDM Configuration Profile Reference
190 |
191 |
192 |
193 | 194 | 195 |
196 |
197 |
Fill out your Wi-Fi network details below. This only supports "Personal" connections.
198 | 199 | 202 |
203 |
204 | 205 |
206 | 207 |
208 |
209 |
210 | 211 |
212 | 213 | 214 |
215 |
216 |
217 |
218 | Security 219 |
220 |
221 | 223 | 224 | 227 |
228 |
229 | 230 | 233 |
234 |
235 | 236 | 239 |
240 |
241 | 242 | 245 |
246 |
247 |
248 |
249 |
250 |
251 | 252 | Hidden network? 253 |
254 |
255 | 256 | 259 |
260 | 261 |
262 | 263 | 266 |
267 |
268 |
269 |
270 | 271 | 272 |
273 |
274 | 275 | Auto Join? 276 |
277 |
278 | 279 | 282 |
283 |
284 | 285 | 288 |
289 |
290 |
291 |
292 | 293 |
294 | 295 |
296 | 297 |
298 | 299 |
300 |
301 |
302 |

303 | 304 |
305 |
306 | 309 |

Generated Profile

310 | 311 |
312 | 313 |
314 |
315 | 316 |
<?xml version="1.0" encoding="UTF-8"?>
317 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
318 | <plist version="1.0">
319 | <dict>
320 |     <key>PayloadContent</key>
321 |     <array>
322 |         <dict>
323 |             <key>AutoJoin</key>
324 |             <true/>
325 |             <key>CaptiveBypass</key>
326 |             <false/>
327 |             <key>EncryptionType</key>
328 |             <string>None</string>
329 |             <key>HIDDEN_NETWORK</key>
330 |             <false/>
331 |             <key>IsHotspot</key>
332 |             <false/>
333 |             <key>Password</key>
334 |             <string>My-Passphrase</string>
335 |             <key>PayloadDescription</key>
336 |             <string>Configures Wi-Fi settings</string>
337 |             <key>PayloadDisplayName</key>
338 |             <string>Company Wi-Fi</string>
339 |             <key>PayloadIdentifier</key>
340 |             <string>com.apple.wifi.managed.5A2AE473-F6B7-4D60-9778-B25D26317C41</string>
341 |             <key>PayloadType</key>
342 |             <string>com.apple.wifi.managed</string>
343 |             <key>PayloadUUID</key>
344 |             <string>5A2AE473-F6B7-4D60-9778-B25D26317C41</string>
345 |             <key>PayloadVersion</key>
346 |             <integer>1</integer>
347 |             <key>ProxyType</key>
348 |             <string>None</string>
349 |             <key>SSID_STR</key>
350 |             <string>Example-SSID</string>
351 |         </dict>
352 |     </array>
353 |     <key>PayloadDisplayName</key>
354 |     <string>Company Wi-Fi</string>
355 |     <key>PayloadIdentifier</key>
356 |     <string>WiFi-PSK-Sample.D5B78A3C-CDA8-471F-984C-06F977EF870C</string>
357 |     <key>PayloadRemovalDisallowed</key>
358 |     <false/>
359 |     <key>PayloadType</key>
360 |     <string>Configuration</string>
361 |     <key>PayloadUUID</key>
362 |     <string>444C9683-221C-49AF-997D-2B6B84710DAA</string>
363 |     <key>PayloadVersion</key>
364 |     <integer>1</integer>
365 | </dict>
366 | </plist>
367 |
368 |
369 |
370 |
371 | 372 | 373 | -------------------------------------------------------------------------------- /js/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.6 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return o={},r.m=n=[function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o