| 
									
										
										
										
											2019-07-10 14:03:25 -06:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | var defaults = { | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 	baseUrl: 'https://dns.api.gandi.net/api/v5/' | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-07-10 14:03:25 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | module.exports.create = function(config) { | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 	var baseUrl = (config.baseUrl || defaults.baseUrl).replace(/\/$/, ''); | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 	var authtoken = config.token; | 
					
						
							|  |  |  | 	var request; | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-10 14:03:25 -06:00
										 |  |  | 	return { | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 		init: function(opts) { | 
					
						
							| 
									
										
										
										
											2019-07-10 14:03:25 -06:00
										 |  |  | 			request = opts.request; | 
					
						
							|  |  |  | 			return null; | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 		zones: function(opts) { | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 			//console.log(opts);
 | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 			return request({ | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 				method: 'GET', | 
					
						
							|  |  |  | 				url: baseUrl + '/zones', | 
					
						
							|  |  |  | 				headers: { | 
					
						
							|  |  |  | 					'X-Api-Key': authtoken | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				json: true | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 			}).then(function(resp) { | 
					
						
							|  |  |  | 				return resp.body.map(function(zone) { | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 					return zone.name; | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 		set: function(opts) { | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 			//console.log(opts);
 | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 			return request({ | 
					
						
							|  |  |  | 				method: 'GET', | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 				url: | 
					
						
							|  |  |  | 					baseUrl + | 
					
						
							|  |  |  | 					'/domains/' + | 
					
						
							|  |  |  | 					opts.challenge.dnsZone + | 
					
						
							|  |  |  | 					'/records/' + | 
					
						
							|  |  |  | 					opts.challenge.dnsPrefix + | 
					
						
							|  |  |  | 					'/TXT', | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 				headers: { | 
					
						
							|  |  |  | 					'X-Api-Key': authtoken | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 				json: true | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 			}).then(function(resp) { | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 				function create() { | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 					return request({ | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 						method: 'POST', | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 						url: | 
					
						
							|  |  |  | 							baseUrl + | 
					
						
							|  |  |  | 							'/domains/' + | 
					
						
							|  |  |  | 							opts.challenge.dnsZone + | 
					
						
							|  |  |  | 							'/records', | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 						headers: { | 
					
						
							|  |  |  | 							'X-Api-Key': authtoken | 
					
						
							|  |  |  | 						}, | 
					
						
							|  |  |  | 						json: { | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 							rrset_name: opts.challenge.dnsPrefix, | 
					
						
							|  |  |  | 							rrset_type: 'TXT', | 
					
						
							|  |  |  | 							rrset_ttl: 300, | 
					
						
							|  |  |  | 							rrset_values: [opts.challenge.dnsAuthorization] | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 				function replace() { | 
					
						
							|  |  |  | 					var body = resp.body; | 
					
						
							|  |  |  | 					var value = body.rrset_values.map(function(x) { | 
					
						
							|  |  |  | 						return JSON.parse(x); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if (!body.rrset_values) { | 
					
						
							|  |  |  | 						return null; | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					return request({ | 
					
						
							|  |  |  | 						method: 'PUT', | 
					
						
							|  |  |  | 						url: | 
					
						
							|  |  |  | 							baseUrl + | 
					
						
							|  |  |  | 							'/domains/' + | 
					
						
							|  |  |  | 							opts.challenge.dnsZone + | 
					
						
							|  |  |  | 							'/records/' + | 
					
						
							|  |  |  | 							opts.challenge.dnsPrefix + | 
					
						
							|  |  |  | 							'/TXT', | 
					
						
							|  |  |  | 						headers: { | 
					
						
							|  |  |  | 							'X-Api-Key': authtoken | 
					
						
							|  |  |  | 						}, | 
					
						
							|  |  |  | 						json: { | 
					
						
							|  |  |  | 							rrset_ttl: 300, | 
					
						
							|  |  |  | 							rrset_values: value.concat([ | 
					
						
							|  |  |  | 								opts.challenge.dnsAuthorization | 
					
						
							|  |  |  | 							]) | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (resp.body.cause === 'Not Found') { | 
					
						
							|  |  |  | 					return create(); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					return replace(); | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2019-07-10 14:03:25 -06:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 		remove: function(opts) { | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 			//console.log(opts);
 | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 			return request({ | 
					
						
							|  |  |  | 				method: 'DELETE', | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 				url: | 
					
						
							|  |  |  | 					baseUrl + | 
					
						
							|  |  |  | 					'/domains/' + | 
					
						
							|  |  |  | 					opts.challenge.dnsZone + | 
					
						
							|  |  |  | 					'/records/' + | 
					
						
							|  |  |  | 					opts.challenge.dnsPrefix + | 
					
						
							|  |  |  | 					'/TXT', | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 				headers: { | 
					
						
							|  |  |  | 					'X-Api-Key': authtoken | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 				json: true | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 		get: function(opts) { | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 			//console.log(opts);
 | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 			return request({ | 
					
						
							|  |  |  | 				method: 'GET', | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 				url: | 
					
						
							|  |  |  | 					baseUrl + | 
					
						
							|  |  |  | 					'/domains/' + | 
					
						
							|  |  |  | 					opts.challenge.dnsZone + | 
					
						
							|  |  |  | 					'/records/' + | 
					
						
							|  |  |  | 					opts.challenge.dnsPrefix, | 
					
						
							| 
									
										
										
										
											2019-07-12 01:32:43 +00:00
										 |  |  | 				headers: { | 
					
						
							|  |  |  | 					'X-Api-Key': authtoken | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 				json: true | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 			}).then(function(resp) { | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 				var body = resp.body; | 
					
						
							|  |  |  | 				if (!(body.length > 0)) { | 
					
						
							|  |  |  | 					return null; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				var value = body[0].rrset_values | 
					
						
							|  |  |  | 					.map(function(x) { | 
					
						
							|  |  |  | 						return JSON.parse(x); | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 					.filter(function(field) { | 
					
						
							|  |  |  | 						return field === opts.challenge.dnsAuthorization; | 
					
						
							|  |  |  | 					})[0]; | 
					
						
							|  |  |  | 				if (!value) { | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 					return null; | 
					
						
							| 
									
										
										
										
											2019-07-11 02:39:15 +00:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-07-11 22:20:52 -06:00
										 |  |  | 				return { | 
					
						
							|  |  |  | 					dnsAuthorization: value | 
					
						
							|  |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2019-07-10 14:03:25 -06:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-11 21:58:22 -06:00
										 |  |  | 	}; | 
					
						
							|  |  |  | }; |