Compare commits
	
		
			4 Commits
		
	
	
		
			90b3d6bb64
			...
			9e0757e864
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9e0757e864 | |||
|  | 4dfaa01fed | ||
|  | 4072ae0565 | ||
|  | 5445aec893 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | node_modules/ | ||||||
							
								
								
									
										375
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										375
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,375 @@ | |||||||
|  | Copyright 2019 AJ ONeal | ||||||
|  | 
 | ||||||
|  | Mozilla Public License Version 2.0 | ||||||
|  | ================================== | ||||||
|  | 
 | ||||||
|  | 1. Definitions | ||||||
|  | -------------- | ||||||
|  | 
 | ||||||
|  | 1.1. "Contributor" | ||||||
|  |     means each individual or legal entity that creates, contributes to | ||||||
|  |     the creation of, or owns Covered Software. | ||||||
|  | 
 | ||||||
|  | 1.2. "Contributor Version" | ||||||
|  |     means the combination of the Contributions of others (if any) used | ||||||
|  |     by a Contributor and that particular Contributor's Contribution. | ||||||
|  | 
 | ||||||
|  | 1.3. "Contribution" | ||||||
|  |     means Covered Software of a particular Contributor. | ||||||
|  | 
 | ||||||
|  | 1.4. "Covered Software" | ||||||
|  |     means Source Code Form to which the initial Contributor has attached | ||||||
|  |     the notice in Exhibit A, the Executable Form of such Source Code | ||||||
|  |     Form, and Modifications of such Source Code Form, in each case | ||||||
|  |     including portions thereof. | ||||||
|  | 
 | ||||||
|  | 1.5. "Incompatible With Secondary Licenses" | ||||||
|  |     means | ||||||
|  | 
 | ||||||
|  |     (a) that the initial Contributor has attached the notice described | ||||||
|  |         in Exhibit B to the Covered Software; or | ||||||
|  | 
 | ||||||
|  |     (b) that the Covered Software was made available under the terms of | ||||||
|  |         version 1.1 or earlier of the License, but not also under the | ||||||
|  |         terms of a Secondary License. | ||||||
|  | 
 | ||||||
|  | 1.6. "Executable Form" | ||||||
|  |     means any form of the work other than Source Code Form. | ||||||
|  | 
 | ||||||
|  | 1.7. "Larger Work" | ||||||
|  |     means a work that combines Covered Software with other material, in | ||||||
|  |     a separate file or files, that is not Covered Software. | ||||||
|  | 
 | ||||||
|  | 1.8. "License" | ||||||
|  |     means this document. | ||||||
|  | 
 | ||||||
|  | 1.9. "Licensable" | ||||||
|  |     means having the right to grant, to the maximum extent possible, | ||||||
|  |     whether at the time of the initial grant or subsequently, any and | ||||||
|  |     all of the rights conveyed by this License. | ||||||
|  | 
 | ||||||
|  | 1.10. "Modifications" | ||||||
|  |     means any of the following: | ||||||
|  | 
 | ||||||
|  |     (a) any file in Source Code Form that results from an addition to, | ||||||
|  |         deletion from, or modification of the contents of Covered | ||||||
|  |         Software; or | ||||||
|  | 
 | ||||||
|  |     (b) any new file in Source Code Form that contains any Covered | ||||||
|  |         Software. | ||||||
|  | 
 | ||||||
|  | 1.11. "Patent Claims" of a Contributor | ||||||
|  |     means any patent claim(s), including without limitation, method, | ||||||
|  |     process, and apparatus claims, in any patent Licensable by such | ||||||
|  |     Contributor that would be infringed, but for the grant of the | ||||||
|  |     License, by the making, using, selling, offering for sale, having | ||||||
|  |     made, import, or transfer of either its Contributions or its | ||||||
|  |     Contributor Version. | ||||||
|  | 
 | ||||||
|  | 1.12. "Secondary License" | ||||||
|  |     means either the GNU General Public License, Version 2.0, the GNU | ||||||
|  |     Lesser General Public License, Version 2.1, the GNU Affero General | ||||||
|  |     Public License, Version 3.0, or any later versions of those | ||||||
|  |     licenses. | ||||||
|  | 
 | ||||||
|  | 1.13. "Source Code Form" | ||||||
|  |     means the form of the work preferred for making modifications. | ||||||
|  | 
 | ||||||
|  | 1.14. "You" (or "Your") | ||||||
|  |     means an individual or a legal entity exercising rights under this | ||||||
|  |     License. For legal entities, "You" includes any entity that | ||||||
|  |     controls, is controlled by, or is under common control with You. For | ||||||
|  |     purposes of this definition, "control" means (a) the power, direct | ||||||
|  |     or indirect, to cause the direction or management of such entity, | ||||||
|  |     whether by contract or otherwise, or (b) ownership of more than | ||||||
|  |     fifty percent (50%) of the outstanding shares or beneficial | ||||||
|  |     ownership of such entity. | ||||||
|  | 
 | ||||||
|  | 2. License Grants and Conditions | ||||||
|  | -------------------------------- | ||||||
|  | 
 | ||||||
|  | 2.1. Grants | ||||||
|  | 
 | ||||||
|  | Each Contributor hereby grants You a world-wide, royalty-free, | ||||||
|  | non-exclusive license: | ||||||
|  | 
 | ||||||
|  | (a) under intellectual property rights (other than patent or trademark) | ||||||
|  |     Licensable by such Contributor to use, reproduce, make available, | ||||||
|  |     modify, display, perform, distribute, and otherwise exploit its | ||||||
|  |     Contributions, either on an unmodified basis, with Modifications, or | ||||||
|  |     as part of a Larger Work; and | ||||||
|  | 
 | ||||||
|  | (b) under Patent Claims of such Contributor to make, use, sell, offer | ||||||
|  |     for sale, have made, import, and otherwise transfer either its | ||||||
|  |     Contributions or its Contributor Version. | ||||||
|  | 
 | ||||||
|  | 2.2. Effective Date | ||||||
|  | 
 | ||||||
|  | The licenses granted in Section 2.1 with respect to any Contribution | ||||||
|  | become effective for each Contribution on the date the Contributor first | ||||||
|  | distributes such Contribution. | ||||||
|  | 
 | ||||||
|  | 2.3. Limitations on Grant Scope | ||||||
|  | 
 | ||||||
|  | The licenses granted in this Section 2 are the only rights granted under | ||||||
|  | this License. No additional rights or licenses will be implied from the | ||||||
|  | distribution or licensing of Covered Software under this License. | ||||||
|  | Notwithstanding Section 2.1(b) above, no patent license is granted by a | ||||||
|  | Contributor: | ||||||
|  | 
 | ||||||
|  | (a) for any code that a Contributor has removed from Covered Software; | ||||||
|  |     or | ||||||
|  | 
 | ||||||
|  | (b) for infringements caused by: (i) Your and any other third party's | ||||||
|  |     modifications of Covered Software, or (ii) the combination of its | ||||||
|  |     Contributions with other software (except as part of its Contributor | ||||||
|  |     Version); or | ||||||
|  | 
 | ||||||
|  | (c) under Patent Claims infringed by Covered Software in the absence of | ||||||
|  |     its Contributions. | ||||||
|  | 
 | ||||||
|  | This License does not grant any rights in the trademarks, service marks, | ||||||
|  | or logos of any Contributor (except as may be necessary to comply with | ||||||
|  | the notice requirements in Section 3.4). | ||||||
|  | 
 | ||||||
|  | 2.4. Subsequent Licenses | ||||||
|  | 
 | ||||||
|  | No Contributor makes additional grants as a result of Your choice to | ||||||
|  | distribute the Covered Software under a subsequent version of this | ||||||
|  | License (see Section 10.2) or under the terms of a Secondary License (if | ||||||
|  | permitted under the terms of Section 3.3). | ||||||
|  | 
 | ||||||
|  | 2.5. Representation | ||||||
|  | 
 | ||||||
|  | Each Contributor represents that the Contributor believes its | ||||||
|  | Contributions are its original creation(s) or it has sufficient rights | ||||||
|  | to grant the rights to its Contributions conveyed by this License. | ||||||
|  | 
 | ||||||
|  | 2.6. Fair Use | ||||||
|  | 
 | ||||||
|  | This License is not intended to limit any rights You have under | ||||||
|  | applicable copyright doctrines of fair use, fair dealing, or other | ||||||
|  | equivalents. | ||||||
|  | 
 | ||||||
|  | 2.7. Conditions | ||||||
|  | 
 | ||||||
|  | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted | ||||||
|  | in Section 2.1. | ||||||
|  | 
 | ||||||
|  | 3. Responsibilities | ||||||
|  | ------------------- | ||||||
|  | 
 | ||||||
|  | 3.1. Distribution of Source Form | ||||||
|  | 
 | ||||||
|  | All distribution of Covered Software in Source Code Form, including any | ||||||
|  | Modifications that You create or to which You contribute, must be under | ||||||
|  | the terms of this License. You must inform recipients that the Source | ||||||
|  | Code Form of the Covered Software is governed by the terms of this | ||||||
|  | License, and how they can obtain a copy of this License. You may not | ||||||
|  | attempt to alter or restrict the recipients' rights in the Source Code | ||||||
|  | Form. | ||||||
|  | 
 | ||||||
|  | 3.2. Distribution of Executable Form | ||||||
|  | 
 | ||||||
|  | If You distribute Covered Software in Executable Form then: | ||||||
|  | 
 | ||||||
|  | (a) such Covered Software must also be made available in Source Code | ||||||
|  |     Form, as described in Section 3.1, and You must inform recipients of | ||||||
|  |     the Executable Form how they can obtain a copy of such Source Code | ||||||
|  |     Form by reasonable means in a timely manner, at a charge no more | ||||||
|  |     than the cost of distribution to the recipient; and | ||||||
|  | 
 | ||||||
|  | (b) You may distribute such Executable Form under the terms of this | ||||||
|  |     License, or sublicense it under different terms, provided that the | ||||||
|  |     license for the Executable Form does not attempt to limit or alter | ||||||
|  |     the recipients' rights in the Source Code Form under this License. | ||||||
|  | 
 | ||||||
|  | 3.3. Distribution of a Larger Work | ||||||
|  | 
 | ||||||
|  | You may create and distribute a Larger Work under terms of Your choice, | ||||||
|  | provided that You also comply with the requirements of this License for | ||||||
|  | the Covered Software. If the Larger Work is a combination of Covered | ||||||
|  | Software with a work governed by one or more Secondary Licenses, and the | ||||||
|  | Covered Software is not Incompatible With Secondary Licenses, this | ||||||
|  | License permits You to additionally distribute such Covered Software | ||||||
|  | under the terms of such Secondary License(s), so that the recipient of | ||||||
|  | the Larger Work may, at their option, further distribute the Covered | ||||||
|  | Software under the terms of either this License or such Secondary | ||||||
|  | License(s). | ||||||
|  | 
 | ||||||
|  | 3.4. Notices | ||||||
|  | 
 | ||||||
|  | You may not remove or alter the substance of any license notices | ||||||
|  | (including copyright notices, patent notices, disclaimers of warranty, | ||||||
|  | or limitations of liability) contained within the Source Code Form of | ||||||
|  | the Covered Software, except that You may alter any license notices to | ||||||
|  | the extent required to remedy known factual inaccuracies. | ||||||
|  | 
 | ||||||
|  | 3.5. Application of Additional Terms | ||||||
|  | 
 | ||||||
|  | You may choose to offer, and to charge a fee for, warranty, support, | ||||||
|  | indemnity or liability obligations to one or more recipients of Covered | ||||||
|  | Software. However, You may do so only on Your own behalf, and not on | ||||||
|  | behalf of any Contributor. You must make it absolutely clear that any | ||||||
|  | such warranty, support, indemnity, or liability obligation is offered by | ||||||
|  | You alone, and You hereby agree to indemnify every Contributor for any | ||||||
|  | liability incurred by such Contributor as a result of warranty, support, | ||||||
|  | indemnity or liability terms You offer. You may include additional | ||||||
|  | disclaimers of warranty and limitations of liability specific to any | ||||||
|  | jurisdiction. | ||||||
|  | 
 | ||||||
|  | 4. Inability to Comply Due to Statute or Regulation | ||||||
|  | --------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | If it is impossible for You to comply with any of the terms of this | ||||||
|  | License with respect to some or all of the Covered Software due to | ||||||
|  | statute, judicial order, or regulation then You must: (a) comply with | ||||||
|  | the terms of this License to the maximum extent possible; and (b) | ||||||
|  | describe the limitations and the code they affect. Such description must | ||||||
|  | be placed in a text file included with all distributions of the Covered | ||||||
|  | Software under this License. Except to the extent prohibited by statute | ||||||
|  | or regulation, such description must be sufficiently detailed for a | ||||||
|  | recipient of ordinary skill to be able to understand it. | ||||||
|  | 
 | ||||||
|  | 5. Termination | ||||||
|  | -------------- | ||||||
|  | 
 | ||||||
|  | 5.1. The rights granted under this License will terminate automatically | ||||||
|  | if You fail to comply with any of its terms. However, if You become | ||||||
|  | compliant, then the rights granted under this License from a particular | ||||||
|  | Contributor are reinstated (a) provisionally, unless and until such | ||||||
|  | Contributor explicitly and finally terminates Your grants, and (b) on an | ||||||
|  | ongoing basis, if such Contributor fails to notify You of the | ||||||
|  | non-compliance by some reasonable means prior to 60 days after You have | ||||||
|  | come back into compliance. Moreover, Your grants from a particular | ||||||
|  | Contributor are reinstated on an ongoing basis if such Contributor | ||||||
|  | notifies You of the non-compliance by some reasonable means, this is the | ||||||
|  | first time You have received notice of non-compliance with this License | ||||||
|  | from such Contributor, and You become compliant prior to 30 days after | ||||||
|  | Your receipt of the notice. | ||||||
|  | 
 | ||||||
|  | 5.2. If You initiate litigation against any entity by asserting a patent | ||||||
|  | infringement claim (excluding declaratory judgment actions, | ||||||
|  | counter-claims, and cross-claims) alleging that a Contributor Version | ||||||
|  | directly or indirectly infringes any patent, then the rights granted to | ||||||
|  | You by any and all Contributors for the Covered Software under Section | ||||||
|  | 2.1 of this License shall terminate. | ||||||
|  | 
 | ||||||
|  | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all | ||||||
|  | end user license agreements (excluding distributors and resellers) which | ||||||
|  | have been validly granted by You or Your distributors under this License | ||||||
|  | prior to termination shall survive termination. | ||||||
|  | 
 | ||||||
|  | ************************************************************************ | ||||||
|  | *                                                                      * | ||||||
|  | *  6. Disclaimer of Warranty                                           * | ||||||
|  | *  -------------------------                                           * | ||||||
|  | *                                                                      * | ||||||
|  | *  Covered Software is provided under this License on an "as is"       * | ||||||
|  | *  basis, without warranty of any kind, either expressed, implied, or  * | ||||||
|  | *  statutory, including, without limitation, warranties that the       * | ||||||
|  | *  Covered Software is free of defects, merchantable, fit for a        * | ||||||
|  | *  particular purpose or non-infringing. The entire risk as to the     * | ||||||
|  | *  quality and performance of the Covered Software is with You.        * | ||||||
|  | *  Should any Covered Software prove defective in any respect, You     * | ||||||
|  | *  (not any Contributor) assume the cost of any necessary servicing,   * | ||||||
|  | *  repair, or correction. This disclaimer of warranty constitutes an   * | ||||||
|  | *  essential part of this License. No use of any Covered Software is   * | ||||||
|  | *  authorized under this License except under this disclaimer.         * | ||||||
|  | *                                                                      * | ||||||
|  | ************************************************************************ | ||||||
|  | 
 | ||||||
|  | ************************************************************************ | ||||||
|  | *                                                                      * | ||||||
|  | *  7. Limitation of Liability                                          * | ||||||
|  | *  --------------------------                                          * | ||||||
|  | *                                                                      * | ||||||
|  | *  Under no circumstances and under no legal theory, whether tort      * | ||||||
|  | *  (including negligence), contract, or otherwise, shall any           * | ||||||
|  | *  Contributor, or anyone who distributes Covered Software as          * | ||||||
|  | *  permitted above, be liable to You for any direct, indirect,         * | ||||||
|  | *  special, incidental, or consequential damages of any character      * | ||||||
|  | *  including, without limitation, damages for lost profits, loss of    * | ||||||
|  | *  goodwill, work stoppage, computer failure or malfunction, or any    * | ||||||
|  | *  and all other commercial damages or losses, even if such party      * | ||||||
|  | *  shall have been informed of the possibility of such damages. This   * | ||||||
|  | *  limitation of liability shall not apply to liability for death or   * | ||||||
|  | *  personal injury resulting from such party's negligence to the       * | ||||||
|  | *  extent applicable law prohibits such limitation. Some               * | ||||||
|  | *  jurisdictions do not allow the exclusion or limitation of           * | ||||||
|  | *  incidental or consequential damages, so this exclusion and          * | ||||||
|  | *  limitation may not apply to You.                                    * | ||||||
|  | *                                                                      * | ||||||
|  | ************************************************************************ | ||||||
|  | 
 | ||||||
|  | 8. Litigation | ||||||
|  | ------------- | ||||||
|  | 
 | ||||||
|  | Any litigation relating to this License may be brought only in the | ||||||
|  | courts of a jurisdiction where the defendant maintains its principal | ||||||
|  | place of business and such litigation shall be governed by laws of that | ||||||
|  | jurisdiction, without reference to its conflict-of-law provisions. | ||||||
|  | Nothing in this Section shall prevent a party's ability to bring | ||||||
|  | cross-claims or counter-claims. | ||||||
|  | 
 | ||||||
|  | 9. Miscellaneous | ||||||
|  | ---------------- | ||||||
|  | 
 | ||||||
|  | This License represents the complete agreement concerning the subject | ||||||
|  | matter hereof. If any provision of this License is held to be | ||||||
|  | unenforceable, such provision shall be reformed only to the extent | ||||||
|  | necessary to make it enforceable. Any law or regulation which provides | ||||||
|  | that the language of a contract shall be construed against the drafter | ||||||
|  | shall not be used to construe this License against a Contributor. | ||||||
|  | 
 | ||||||
|  | 10. Versions of the License | ||||||
|  | --------------------------- | ||||||
|  | 
 | ||||||
|  | 10.1. New Versions | ||||||
|  | 
 | ||||||
|  | Mozilla Foundation is the license steward. Except as provided in Section | ||||||
|  | 10.3, no one other than the license steward has the right to modify or | ||||||
|  | publish new versions of this License. Each version will be given a | ||||||
|  | distinguishing version number. | ||||||
|  | 
 | ||||||
|  | 10.2. Effect of New Versions | ||||||
|  | 
 | ||||||
|  | You may distribute the Covered Software under the terms of the version | ||||||
|  | of the License under which You originally received the Covered Software, | ||||||
|  | or under the terms of any subsequent version published by the license | ||||||
|  | steward. | ||||||
|  | 
 | ||||||
|  | 10.3. Modified Versions | ||||||
|  | 
 | ||||||
|  | If you create software not governed by this License, and you want to | ||||||
|  | create a new license for such software, you may create and use a | ||||||
|  | modified version of this License if you rename the license and remove | ||||||
|  | any references to the name of the license steward (except to note that | ||||||
|  | such modified license differs from this License). | ||||||
|  | 
 | ||||||
|  | 10.4. Distributing Source Code Form that is Incompatible With Secondary | ||||||
|  | Licenses | ||||||
|  | 
 | ||||||
|  | If You choose to distribute Source Code Form that is Incompatible With | ||||||
|  | Secondary Licenses under the terms of this version of the License, the | ||||||
|  | notice described in Exhibit B of this License must be attached. | ||||||
|  | 
 | ||||||
|  | Exhibit A - Source Code Form License Notice | ||||||
|  | ------------------------------------------- | ||||||
|  | 
 | ||||||
|  |   This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  |   License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
|  |   file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  | 
 | ||||||
|  | If it is not possible or desirable to put the notice in a particular | ||||||
|  | file, then You may include the notice in a location (such as a LICENSE | ||||||
|  | file in a relevant directory) where a recipient would be likely to look | ||||||
|  | for such a notice. | ||||||
|  | 
 | ||||||
|  | You may add additional accurate notices of copyright ownership. | ||||||
|  | 
 | ||||||
|  | Exhibit B - "Incompatible With Secondary Licenses" Notice | ||||||
|  | --------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  |   This Source Code Form is "Incompatible With Secondary Licenses", as | ||||||
|  |   defined by the Mozilla Public License, v. 2.0. | ||||||
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							| @ -16,23 +16,23 @@ First you create an instance with your credentials: | |||||||
| 
 | 
 | ||||||
| ```js | ```js | ||||||
| var dns01 = require('acme-dns-01-digitalocean').create({ | var dns01 = require('acme-dns-01-digitalocean').create({ | ||||||
|   token: 'xxxx' | 	baseUrl: 'https://api.digitalocean.com', // default | ||||||
|  | 	token: 'xxxx' | ||||||
| }); | }); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Then you can use it with any compatible ACME module, | Then you can use it with any compatible ACME module, | ||||||
| such as Greenlock.js or ACME.js. | such as Greenlock.js or ACME.js. | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| ### Greenlock.js | ### Greenlock.js | ||||||
| 
 | 
 | ||||||
| ```js | ```js | ||||||
| var Greenlock = require('greenlock-express'); | var Greenlock = require('greenlock-express'); | ||||||
| var greenlock = Greenlock.create({ | var greenlock = Greenlock.create({ | ||||||
|   challenges: { | 	challenges: { | ||||||
|     'dns-01': dns01, | 		'dns-01': dns01 | ||||||
|     // ... | 		// ... | ||||||
|   } | 	} | ||||||
| }); | }); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| @ -41,7 +41,6 @@ and/or [Greenlock.js](https://git.rootprojects.org/root/greenlock.js) documentat | |||||||
| 
 | 
 | ||||||
| ### ACME.js | ### ACME.js | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| ```js | ```js | ||||||
| // TODO | // TODO | ||||||
| ``` | ``` | ||||||
| @ -66,8 +65,9 @@ dns01 | |||||||
|   }); |   }); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| See [acme-challenge-test](https://git.rootprojects.org/root/acme-challenge-test.js) | See [acme-dns-01-test](https://git.rootprojects.org/root/acme-dns-01-test.js) | ||||||
| for more implementation details. | for more implementation details. | ||||||
|  | 
 | ||||||
| # Tests | # Tests | ||||||
| 
 | 
 | ||||||
| ```bash | ```bash | ||||||
|  | |||||||
							
								
								
									
										205
									
								
								lib/index.js
									
									
									
									
									
								
							
							
						
						
									
										205
									
								
								lib/index.js
									
									
									
									
									
								
							| @ -11,108 +11,31 @@ module.exports.create = function(config) { | |||||||
| 	// config = { baseUrl, token }
 | 	// config = { baseUrl, token }
 | ||||||
| 	var baseUrl = config.baseUrl || defaults.baseUrl; | 	var baseUrl = config.baseUrl || defaults.baseUrl; | ||||||
| 	var authtoken = config.token; | 	var authtoken = config.token; | ||||||
| 	return { |  | ||||||
| 		set: function(data) { |  | ||||||
| 			var ch = data.challenge; |  | ||||||
| 			var domainname = ch.identifier.value; |  | ||||||
| 			// PROBLEM: zone != domain
 |  | ||||||
| 			// example.com, foo.example.com, and bar.foo.example.com are all in the example.com zone!!
 |  | ||||||
| 			// Need to get list of "domains" (zones) and *then* set "subdomains" (domain records)
 |  | ||||||
| 			// https://developers.digitalocean.com/documentation/v2/#domains
 |  | ||||||
| 			var zone = domainname; |  | ||||||
| 			// PROBLEM: dnsPrefix != dnsHost.split('.')[0]
 |  | ||||||
| 			// _greenlock-dryrun-2277.bar.foo.example.com => _greenlock-dryrun-2277.bar.foo
 |  | ||||||
| 			var dnsPrefix = ch.dnsHost.replace(new RegExp('.' + zone + '$'), ''); |  | ||||||
| 			var txt = ch.dnsAuthorization; |  | ||||||
| 			// If the domain to be verified is
 |  | ||||||
| 			var url = baseUrl + '/v2/domains/' + zone + '/records'; |  | ||||||
| 
 | 
 | ||||||
| 			console.log('adding txt', data); | 	var helpers = { | ||||||
|  | 		getZonenames: function(/*opts*/) { | ||||||
|  | 			// { dnsHosts: [ xxxx.foo.example.com ] }
 | ||||||
|  | 			var url = baseUrl + '/v2/domains/'; | ||||||
|  | 
 | ||||||
| 			return request({ | 			return request({ | ||||||
| 				method: 'POST', | 				method: 'GET', | ||||||
| 				url: url, | 				url: url, | ||||||
| 				headers: { | 				headers: { | ||||||
| 					Authorization: 'Bearer ' + authtoken, | 					Authorization: 'Bearer ' + authtoken, | ||||||
| 					'Content-Type': 'application/json' | 					'Content-Type': 'application/json' | ||||||
| 				}, | 				}, | ||||||
| 				json: { | 				json: true | ||||||
| 					type: 'TXT', |  | ||||||
| 					name: dnsPrefix, |  | ||||||
| 					data: txt, |  | ||||||
| 					// PROBLEM (fixed) set a LOW ttl so that responses are not cached so long
 |  | ||||||
| 					ttl: 300 |  | ||||||
| 				} |  | ||||||
| 			}).then(function(resp) { | 			}).then(function(resp) { | ||||||
| 				resp = resp.body; | 				return resp.body.domains.map(function(x) { | ||||||
| 				console.log(resp); | 					return x.name; | ||||||
| 				if (resp && resp.domain_record && resp.domain_record.data === txt) { | 				}); | ||||||
| 					return true; |  | ||||||
| 				} |  | ||||||
| 				throw new Error('record did not set. check subdomain, api key, etc'); |  | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
| 		remove: function(data) { | 		getTXTRecord: function(data) { | ||||||
| 			var domainname = data.challenge.altname; | 			// data:{dnsPrefix:"_88-acme-challenge-0e.foo",zone:"example.com",txt:"_cdZWaclIbkP1qYpMkZIURTK--ydQIK6d9axFmftWz0"}
 | ||||||
| 			var zone = domainname; | 			var dnsPrefix = data.dnsPrefix; | ||||||
| 			// PROBLEM: domainname != zone
 | 			var txt = data.txt; | ||||||
| 			var url = baseUrl + '/v2/domains/' + zone + '/records'; | 			var url = baseUrl + '/v2/domains/' + data.zone + '/records'; | ||||||
| 
 |  | ||||||
| 			// Digital ocean provides the api to remove records by ID. Since we do not have id, we fetch all the records,
 |  | ||||||
| 			// filter the required TXT record and pass its id to remove API
 |  | ||||||
| 			return request({ |  | ||||||
| 				method: 'GET', |  | ||||||
| 				url: url, |  | ||||||
| 				// PROBLEM (fixed): Remember to set json: true (not need to JSON.parse)
 |  | ||||||
| 				json: true, |  | ||||||
| 				headers: { |  | ||||||
| 					Authorization: 'Bearer ' + authtoken, |  | ||||||
| 					'Content-Type': 'application/json' |  | ||||||
| 				} |  | ||||||
| 			}) |  | ||||||
| 				.then(function(resp) { |  | ||||||
| 					resp = resp.body; |  | ||||||
| 					var entries = |  | ||||||
| 						resp && |  | ||||||
| 						resp.domain_records && |  | ||||||
| 						resp.domain_records.filter(function(x) { |  | ||||||
| 							return x.type === 'TXT'; |  | ||||||
| 						}); |  | ||||||
| 					// PROBLEM entry[0] !== our entry
 |  | ||||||
| 					// (see solution for other entries, down below)
 |  | ||||||
| 					if (entries.length > 0) { |  | ||||||
| 						return entries[0].id; |  | ||||||
| 					} else { |  | ||||||
| 						throw new Error( |  | ||||||
| 							'Couldnt remove record. check subdomain, api key, etc' |  | ||||||
| 						); |  | ||||||
| 					} |  | ||||||
| 				}) |  | ||||||
| 				.then(function(recordId) { |  | ||||||
| 					var domainname = data.challenge.altname; |  | ||||||
| 					var zone = domainname; |  | ||||||
| 					var url = baseUrl + '/v2/domains/' + zone + '/records/' + recordId; |  | ||||||
| 
 |  | ||||||
| 					return request({ |  | ||||||
| 						method: 'DELETE', |  | ||||||
| 						url: url, |  | ||||||
| 						headers: { |  | ||||||
| 							Authorization: 'Bearer ' + authtoken, |  | ||||||
| 							'Content-Type': 'application/json' |  | ||||||
| 						} |  | ||||||
| 					}).then(function(resp) { |  | ||||||
| 						resp = resp.body; |  | ||||||
| 						console.log(resp); |  | ||||||
| 						return true; |  | ||||||
| 					}); |  | ||||||
| 				}); |  | ||||||
| 		}, |  | ||||||
| 		get: function(data) { |  | ||||||
| 			var ch = data.challenge; |  | ||||||
| 			var domainname = data.challenge.altname; |  | ||||||
| 			var zone = domainname; |  | ||||||
| 			// PROBLEM: domainname != zone
 |  | ||||||
| 			var url = baseUrl + '/v2/domains/' + zone + '/records'; |  | ||||||
| 			console.log('getting txt', data); |  | ||||||
| 
 | 
 | ||||||
| 			// Digital ocean provides the api to fetch records by ID. Since we do not have id, we fetch all the records,
 | 			// Digital ocean provides the api to fetch records by ID. Since we do not have id, we fetch all the records,
 | ||||||
| 			// filter the required TXT record
 | 			// filter the required TXT record
 | ||||||
| @ -127,24 +50,98 @@ module.exports.create = function(config) { | |||||||
| 				} | 				} | ||||||
| 			}).then(function(resp) { | 			}).then(function(resp) { | ||||||
| 				resp = resp.body; | 				resp = resp.body; | ||||||
| 
 |  | ||||||
| 				var entries = | 				var entries = | ||||||
| 					resp && | 					resp && | ||||||
| 					resp.domain_records && | 					resp.domain_records && | ||||||
| 					resp.domain_records.filter(function(x) { | 					resp.domain_records.filter(function(x) { | ||||||
| 						// PROBLEM should also check for prefix
 | 						return x.type === 'TXT' && x.name === dnsPrefix && x.data === txt; | ||||||
| 						return x.type === 'TXT'; | 					}); | ||||||
|  | 				return entries && entries[0]; | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	return { | ||||||
|  | 		zones: function(data) { | ||||||
|  | 			//console.info('Get zones');
 | ||||||
|  | 			return helpers.getZonenames(data); | ||||||
|  | 		}, | ||||||
|  | 		set: function(data) { | ||||||
|  | 			var ch = data.challenge; | ||||||
|  | 			var txt = ch.dnsAuthorization; | ||||||
|  | 			var url = baseUrl + '/v2/domains/' + ch.dnsZone + '/records'; | ||||||
|  | 
 | ||||||
|  | 			// console.info('Adding TXT', data);
 | ||||||
|  | 			return request({ | ||||||
|  | 				method: 'POST', | ||||||
|  | 				url: url, | ||||||
|  | 				headers: { | ||||||
|  | 					Authorization: 'Bearer ' + authtoken, | ||||||
|  | 					'Content-Type': 'application/json' | ||||||
|  | 				}, | ||||||
|  | 				json: { | ||||||
|  | 					type: 'TXT', | ||||||
|  | 					// Note: dnsPrefix != dnsHost.split('.')[0]
 | ||||||
|  | 					// _greenlock-dryrun-2277.bar.foo.example.com => _greenlock-dryrun-2277.bar.foo
 | ||||||
|  | 					name: ch.dnsPrefix, | ||||||
|  | 					data: txt, | ||||||
|  | 					// Note: set a LOW ttl so that responses are not cached so long
 | ||||||
|  | 					ttl: 300 | ||||||
|  | 				} | ||||||
|  | 			}).then(function(resp) { | ||||||
|  | 				resp = resp.body; | ||||||
|  | 				if (resp && resp.domain_record && resp.domain_record.data === txt) { | ||||||
|  | 					return true; | ||||||
|  | 				} | ||||||
|  | 				throw new Error('record did not set. check subdomain, api key, etc'); | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
|  | 		remove: function(data) { | ||||||
|  | 			var ch = data.challenge; | ||||||
|  | 
 | ||||||
|  | 			// Digital ocean provides the api to remove records by ID. So we first get the recordId and use it to remove the domain record
 | ||||||
|  | 			// console.info('Removing TXT', data);
 | ||||||
|  | 			var payload = { | ||||||
|  | 				dnsPrefix: ch.dnsPrefix, | ||||||
|  | 				zone: ch.dnsZone, | ||||||
|  | 				txt: ch.dnsAuthorization | ||||||
|  | 			}; | ||||||
|  | 
 | ||||||
|  | 			return helpers.getTXTRecord(payload).then(function(txtRecord) { | ||||||
|  | 				if (txtRecord) { | ||||||
|  | 					var url = | ||||||
|  | 						baseUrl + '/v2/domains/' + ch.dnsZone + '/records/' + txtRecord.id; | ||||||
|  | 
 | ||||||
|  | 					return request({ | ||||||
|  | 						method: 'DELETE', | ||||||
|  | 						url: url, | ||||||
|  | 						headers: { | ||||||
|  | 							Authorization: 'Bearer ' + authtoken, | ||||||
|  | 							'Content-Type': 'application/json' | ||||||
|  | 						} | ||||||
|  | 					}).then(function(resp) { | ||||||
|  | 						resp = resp.body; | ||||||
|  | 						return true; | ||||||
| 					}); | 					}); | ||||||
| 				// PROBLEM (fixed): entries[0] !== our entry
 |  | ||||||
| 				var entry = entries.filter(function(x) { |  | ||||||
| 					console.log('data', x.data); |  | ||||||
| 					console.log('dnsAuth', ch.dnsAuthorization, ch); |  | ||||||
| 					return x.data === ch.dnsAuthorization; |  | ||||||
| 				})[0]; |  | ||||||
| 				if (entry) { |  | ||||||
| 					return { dnsAuthorization: entry.data }; |  | ||||||
| 				} else { | 				} else { | ||||||
|           return null; | 					throw new Error('Txt Record not found for removal'); | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
|  | 		get: function(data) { | ||||||
|  | 			var ch = data.challenge; | ||||||
|  | 
 | ||||||
|  | 			// console.info('Fetching TXT', data);
 | ||||||
|  | 			var payload = { | ||||||
|  | 				dnsPrefix: ch.dnsPrefix, | ||||||
|  | 				zone: ch.dnsZone, | ||||||
|  | 				txt: ch.dnsAuthorization | ||||||
|  | 			}; | ||||||
|  | 			return helpers.getTXTRecord(payload).then(function(txtRecord) { | ||||||
|  | 				if (txtRecord) { | ||||||
|  | 					return { dnsAuthorization: txtRecord.data }; | ||||||
|  | 				} else { | ||||||
|  | 					return null; | ||||||
| 				} | 				} | ||||||
| 			}); | 			}); | ||||||
| 		} | 		} | ||||||
|  | |||||||
							
								
								
									
										43
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										43
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -1,19 +1,28 @@ | |||||||
| { | { | ||||||
|   "name": "acme-dns-01-digitalocean", | 	"name": "acme-dns-01-digitalocean", | ||||||
|   "version": "3.0.0", | 	"version": "3.0.0", | ||||||
|   "lockfileVersion": 1, | 	"lockfileVersion": 1, | ||||||
|   "requires": true, | 	"requires": true, | ||||||
|   "dependencies": { | 	"dependencies": { | ||||||
|     "@root/request": { | 		"@root/request": { | ||||||
|       "version": "1.3.11", | 			"version": "1.3.11", | ||||||
|       "resolved": "https://registry.npmjs.org/@root/request/-/request-1.3.11.tgz", | 			"resolved": "https://registry.npmjs.org/@root/request/-/request-1.3.11.tgz", | ||||||
|       "integrity": "sha512-3a4Eeghcjsfe6zh7EJ+ni1l8OK9Fz2wL1OjP4UCa0YdvtH39kdXB9RGWuzyNv7dZi0+Ffkc83KfH0WbPMiuJFw==" | 			"integrity": "sha512-3a4Eeghcjsfe6zh7EJ+ni1l8OK9Fz2wL1OjP4UCa0YdvtH39kdXB9RGWuzyNv7dZi0+Ffkc83KfH0WbPMiuJFw==" | ||||||
|     }, | 		}, | ||||||
|     "acme-challenge-test": { | 		"acme-challenge-test": { | ||||||
|       "version": "3.1.0", | 			"version": "3.2.1", | ||||||
|       "resolved": "https://registry.npmjs.org/acme-challenge-test/-/acme-challenge-test-3.1.0.tgz", | 			"resolved": "https://registry.npmjs.org/acme-challenge-test/-/acme-challenge-test-3.2.1.tgz", | ||||||
|       "integrity": "sha512-k+2hNED8P245BdJh44+eJjmVr7oNcuxigMbfz2/7Emc5h4ZAI7iuRZ2M6t4Qui+q5YgiPPjnILDzCZTHLzb1Ag==", | 			"integrity": "sha512-8MwL2oWx7vM/SBIeEQfeoRyW0kYCtLFS4FfgIx3lsQmSKhbDo9J88Ud6DejdupRp2T+DlEkWIBVI3qOCVViUaQ==", | ||||||
|       "dev": true | 			"dev": true | ||||||
|     } | 		}, | ||||||
|   } | 		"acme-dns-01-test": { | ||||||
|  | 			"version": "3.2.1", | ||||||
|  | 			"resolved": "https://registry.npmjs.org/acme-dns-01-test/-/acme-dns-01-test-3.2.1.tgz", | ||||||
|  | 			"integrity": "sha512-m4UxltZzTNbQTK30iQQ6BQ99oRJA9p69+eg/u/Plxiw10bD+qsmRZR9rsqZuiSc62wfng/upGvXWMQZ/csn3lA==", | ||||||
|  | 			"dev": true, | ||||||
|  | 			"requires": { | ||||||
|  | 				"acme-challenge-test": "^3.2.0" | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										56
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								package.json
									
									
									
									
									
								
							| @ -1,30 +1,30 @@ | |||||||
| { | { | ||||||
|   "name": "acme-dns-01-digitalocean", | 	"name": "acme-dns-01-digitalocean", | ||||||
|   "version": "3.0.0", | 	"version": "3.0.0", | ||||||
|   "description": "Digital Ocean DNS for Let's Encrypt / ACME dns-01 challenges with ACME.js and Greenlock.js", | 	"description": "Digital Ocean DNS for Let's Encrypt / ACME dns-01 challenges with ACME.js and Greenlock.js", | ||||||
|   "main": "index.js", | 	"main": "index.js", | ||||||
|   "scripts": { | 	"scripts": { | ||||||
|     "test": "node ./test.js" | 		"test": "node ./test.js" | ||||||
|   }, | 	}, | ||||||
|   "repository": { | 	"repository": { | ||||||
|     "type": "git", | 		"type": "git", | ||||||
|     "url": "https://git.rootprojects.org/root/acme-dns-01-digitalocean.git" | 		"url": "https://git.rootprojects.org/root/acme-dns-01-digitalocean.git" | ||||||
|   }, | 	}, | ||||||
|   "keywords": [ | 	"keywords": [ | ||||||
|     "digitalocean", | 		"digitalocean", | ||||||
|     "digital-ocean", | 		"digital-ocean", | ||||||
|     "dns", | 		"dns", | ||||||
|     "dns-01", | 		"dns-01", | ||||||
|     "letsencrypt", | 		"letsencrypt", | ||||||
|     "acme", | 		"acme", | ||||||
|     "greenlock" | 		"greenlock" | ||||||
|   ], | 	], | ||||||
|   "author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)", | 	"author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)", | ||||||
|   "license": "MPL-2.0", | 	"license": "MPL-2.0", | ||||||
|   "dependencies": { | 	"dependencies": { | ||||||
|     "@root/request": "^1.3.11" | 		"@root/request": "^1.3.11" | ||||||
|   }, | 	}, | ||||||
|   "devDependencies": { | 	"devDependencies": { | ||||||
|     "acme-challenge-test": "^3.1.0" | 		"acme-dns-01-test": "^3.2.0" | ||||||
|   } | 	} | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user