v3.0.0: test harness for le-manage- plugins
This commit is contained in:
		
						commit
						4365e4cdb1
					
				
							
								
								
									
										37
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | # Logs | ||||||
|  | logs | ||||||
|  | *.log | ||||||
|  | npm-debug.log* | ||||||
|  | 
 | ||||||
|  | # Runtime data | ||||||
|  | pids | ||||||
|  | *.pid | ||||||
|  | *.seed | ||||||
|  | 
 | ||||||
|  | # Directory for instrumented libs generated by jscoverage/JSCover | ||||||
|  | lib-cov | ||||||
|  | 
 | ||||||
|  | # Coverage directory used by tools like istanbul | ||||||
|  | coverage | ||||||
|  | 
 | ||||||
|  | # nyc test coverage | ||||||
|  | .nyc_output | ||||||
|  | 
 | ||||||
|  | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) | ||||||
|  | .grunt | ||||||
|  | 
 | ||||||
|  | # node-waf configuration | ||||||
|  | .lock-wscript | ||||||
|  | 
 | ||||||
|  | # Compiled binary addons (http://nodejs.org/api/addons.html) | ||||||
|  | build/Release | ||||||
|  | 
 | ||||||
|  | # Dependency directories | ||||||
|  | node_modules | ||||||
|  | jspm_packages | ||||||
|  | 
 | ||||||
|  | # Optional npm cache directory | ||||||
|  | .npm | ||||||
|  | 
 | ||||||
|  | # Optional REPL history | ||||||
|  | .node_repl_history | ||||||
							
								
								
									
										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. | ||||||
							
								
								
									
										56
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | |||||||
|  | # [le-manage-test](https://git.coolaj86.com/coolaj86/le-manage-test.js.git) | ||||||
|  | 
 | ||||||
|  | | A [Root](https://rootprojects.org) Project | | ||||||
|  | 
 | ||||||
|  | The test harness you should use when writing a management strategy | ||||||
|  | for [Greenlock](https://git.coolaj86.com/coolaj86/greenlock-express.js) v2.7+ (and v3). | ||||||
|  | 
 | ||||||
|  | All implementations that support multiple domains MUST pass these tests | ||||||
|  | (which is not a hard thing to do). | ||||||
|  | 
 | ||||||
|  | ## Install | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | npm install --save-dev le-manage-test@3.x | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Usage | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | var tester = require('le-manage-test'); | ||||||
|  | 
 | ||||||
|  | // The function that checks the database for the domain (or its wildcard) and returns the results | ||||||
|  | function approveDomains(opts) { | ||||||
|  |   var domain = opts.domain; | ||||||
|  | 
 | ||||||
|  |   // try exact match (ex: www.example.com) | ||||||
|  |   var info = DB.find(domain); | ||||||
|  | 
 | ||||||
|  |   // try wildcard match (ex: *.example.com) | ||||||
|  |   if (!info) { info = DB.find(wild) } | ||||||
|  | 
 | ||||||
|  |   // If there's no info, it didn't exist, return null (not undefined) | ||||||
|  |   if (!info) { return null; } | ||||||
|  | 
 | ||||||
|  |   //return { subject: 'example.com', altnames: [ 'example.com', 'www.example.com' ] }; | ||||||
|  |   return { subject: info.subject, altnames: info.altnames }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function updateDomains(opts) { | ||||||
|  |   // return null (not undefined) | ||||||
|  |   return DB.associate(opts.subject, opts.altnames); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | tester.test({ | ||||||
|  |   set: updateDomains | ||||||
|  | , get: approveDomains | ||||||
|  | }).then(function () { | ||||||
|  |   console.info("PASS"); | ||||||
|  | }); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Example | ||||||
|  | 
 | ||||||
|  | See `example.js`. | ||||||
|  | 
 | ||||||
|  | Will post reference implementations here later... | ||||||
							
								
								
									
										63
									
								
								example.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								example.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | //var tester = require('le-manage-test');
 | ||||||
|  | var tester = require('./'); | ||||||
|  | 
 | ||||||
|  | // This could be implemented in memory, with a database, with the file system, etc
 | ||||||
|  | var db = {}; | ||||||
|  | function searchDb(term) { | ||||||
|  |   var info = db[term]; | ||||||
|  |   // find either the info, or the relation to the info
 | ||||||
|  |   // { subject: ..., altnames: [...] }
 | ||||||
|  |   // { related: ... } // related is the key
 | ||||||
|  |   if (info && info.related) { | ||||||
|  |     info = db[info.related]; | ||||||
|  |   } | ||||||
|  |   return info || null; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // The function that checks the database for the domain (or its wildcard) and returns the results
 | ||||||
|  | function approveDomains(opts) { | ||||||
|  |   // foo.example.com
 | ||||||
|  |   var domain = opts.domain; | ||||||
|  |   // foo.example.com => *.example.com
 | ||||||
|  |   var wildname = opts.wildname; | ||||||
|  | 
 | ||||||
|  |   // try an exact match
 | ||||||
|  |   var info = searchDb(domain); | ||||||
|  |   // try the wildcard
 | ||||||
|  |   if (!info) { | ||||||
|  |     info = searchDb(wildname); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // If there's no info, it didn't exist, return null (not undefined)
 | ||||||
|  |   if (!info) { return null; } | ||||||
|  | 
 | ||||||
|  |   //return { subject: 'example.com', altnames: [ 'example.com', 'www.example.com' ] };
 | ||||||
|  |   return { subject: info.subject, altnames: info.altnames }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function updateDomains(opts) { | ||||||
|  |   // Set the subject
 | ||||||
|  |   //db['example.com'] = { subject: 'example.com', altnames: [ 'example.com', 'www.example.com' ] };
 | ||||||
|  |   db[opts.subject] = { subject: opts.subject, altnames: opts.altnames }; | ||||||
|  | 
 | ||||||
|  |   opts.altnames.forEach(function (altname) { | ||||||
|  |     // Don't overwrite the subject
 | ||||||
|  |     if (altname === opts.subject) { return; } | ||||||
|  | 
 | ||||||
|  |     // Set a relation for each altname
 | ||||||
|  |     //db['www.example.com'] = { related: 'example.com' };
 | ||||||
|  |     db[altname] = { related: opts.subject }; | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   // return null (not undefined)
 | ||||||
|  |   return null; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | tester.test({ | ||||||
|  |   set: updateDomains | ||||||
|  | , get: approveDomains | ||||||
|  | }).then(function () { | ||||||
|  |   console.info("PASS"); | ||||||
|  | }); | ||||||
							
								
								
									
										107
									
								
								index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | |||||||
|  | 'use strict'; | ||||||
|  | /*global Promise*/ | ||||||
|  | 
 | ||||||
|  | // This same test must work for every implementation
 | ||||||
|  | var fixtures = [ | ||||||
|  |   { _input: 'foo.example.com' | ||||||
|  |   , subject: 'foo.example.com' | ||||||
|  |   , altnames: [ 'foo.example.com', '*.foo.example.com' ] | ||||||
|  |   } | ||||||
|  | , { _input: 'foo.bar.example.com' | ||||||
|  |   , subject: 'bar.example.com' | ||||||
|  |   , altnames: [ 'bar.example.com', '*.bar.example.com' ] | ||||||
|  |   } | ||||||
|  | , { _input: 'foo.baz.example.xyz' | ||||||
|  |   , subject: 'bar.baz.example.net' | ||||||
|  |   , altnames: [ 'bar.baz.example.net', 'foo.baz.example.xyz', '*.baz.example.com' ] | ||||||
|  |   } | ||||||
|  | , { _input: 'gralt.example.xyz' | ||||||
|  |   , subject: null | ||||||
|  |   , altnames: null | ||||||
|  |   } | ||||||
|  | ]; | ||||||
|  | 
 | ||||||
|  | // foo.example.com => *.example.com
 | ||||||
|  | function untame(str) { | ||||||
|  |   return str.split('.').slice(1).join('.'); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function compare(input, out) { | ||||||
|  |   var err; | ||||||
|  | 
 | ||||||
|  |   if (!input.subject && !out) { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |   if (!input.subject && out && (out.subject || out.altnames)) { | ||||||
|  |     throw new Error("should not have returned results for query for '" + input._input + "', but got " | ||||||
|  |       + JSON.stringify(out)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   err = new Error("The query for '" + input._input + "' should have been found at or through '" | ||||||
|  |       + input.subject + "' and should have had the altnames '" + input.altnames + "', but instead got " | ||||||
|  |       + JSON.stringify(out)); | ||||||
|  |   if (input.subject && (!out || !out.subject || !Array.isArray(out.altnames))) { | ||||||
|  |     throw err; | ||||||
|  |   } | ||||||
|  |   if (input.subject !== out.subject) { | ||||||
|  |     throw err; | ||||||
|  |   } | ||||||
|  |   if (input.subject !== out.altnames[0]) { | ||||||
|  |     throw new Error("The subject '" + input.subject | ||||||
|  |       + "' MUST be the first element altnames '" + out.altnames.join(' ') + "'."); | ||||||
|  |   } | ||||||
|  |   if (input.altnames.join('|') !== out.altnames.join('|')) { | ||||||
|  |     throw err; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function forEach(arr, fn) { | ||||||
|  |   function next() { | ||||||
|  |     var el = arr.shift(); | ||||||
|  |     if (!el) { return Promise.resolve(); } | ||||||
|  |     return Promise.resolve().then(function () { | ||||||
|  |       return fn(el); | ||||||
|  |     }).then(next); | ||||||
|  |   } | ||||||
|  |   return Promise.resolve().then(next); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module.exports.create = function () { | ||||||
|  |   throw new Error("le-manage-test is a test fixture for le-manage-* plugins, not a plugin itself"); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | module.exports.test = function (manager) { | ||||||
|  |   // Binding to 'this', just in case that's needed
 | ||||||
|  |   var set = manager.set.bind(manager); | ||||||
|  |   var get = (manager.get|| manager.approveDomains).bind(manager); | ||||||
|  | 
 | ||||||
|  |   // call the updateDomains function for each of the fixtures,
 | ||||||
|  |   // setting up the database (or object or filesystem or whatever).
 | ||||||
|  |   function setup() { | ||||||
|  |     var arr = fixtures.slice(0); | ||||||
|  |     return forEach(arr, function (el) { | ||||||
|  |       // don't try to save the absent things (for the negative tests)
 | ||||||
|  |       if (el.subject) { | ||||||
|  |         set(el); | ||||||
|  |       } | ||||||
|  |       return null; | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // call the approveDomains function for each of the fixtures
 | ||||||
|  |   // and see if we get back exactly the response we expect
 | ||||||
|  |   function run() { | ||||||
|  |     var arr = fixtures.slice(0); | ||||||
|  |     return forEach(arr, function (el) { | ||||||
|  |       return Promise.resolve(get({ domain: el._input, wildname: untame(el._input), domains: [ el._input ] })).then(function (out) { | ||||||
|  |         if (!compare(el, out)) { | ||||||
|  |           throw new Error("did not return true (internal test error)"); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return setup().then(run); | ||||||
|  | }; | ||||||
							
								
								
									
										27
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | { | ||||||
|  |   "name": "le-manage-test", | ||||||
|  |   "version": "3.0.0", | ||||||
|  |   "description": "A simple test for Greenlock management strategies. All `le-manage-` plugins should pass this.", | ||||||
|  |   "main": "index.js", | ||||||
|  |   "scripts": { | ||||||
|  |     "test": "test example.com" | ||||||
|  |   }, | ||||||
|  |   "repository": { | ||||||
|  |     "type": "git", | ||||||
|  |     "url": "https://git.coolaj86.com/coolaj86/le-manage-test.js.git" | ||||||
|  |   }, | ||||||
|  |   "keywords": [ | ||||||
|  |     "Greenlock", | ||||||
|  |     "Let's", | ||||||
|  |     "Encrypt", | ||||||
|  |     "ACME", | ||||||
|  |     "test", | ||||||
|  |     "approveDomains", | ||||||
|  |     "wildcard", | ||||||
|  |     "SANS", | ||||||
|  |     "AltNames", | ||||||
|  |     "Subject" | ||||||
|  |   ], | ||||||
|  |   "author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)", | ||||||
|  |   "license": "MPL-2.0" | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user