Really Simple SSL - Version 5.0

Version Description

Download this release

Release Info

Developer RogierLankhorst
Plugin Icon 128x128 Really Simple SSL
Version 5.0
Comparing to
See all releases

Code changes from version 4.0.15 to 5.0

Files changed (278) hide show
  1. assets/icon-128x128.png +0 -0
  2. assets/really-simple-plugins.png +0 -0
  3. assets/really-simple-ssl-logo.png +0 -0
  4. class-admin.php +192 -111
  5. class-certificate.php +79 -29
  6. class-multisite.php +1 -1
  7. grid/css/grid.css +0 -3
  8. grid/css/grid.css.map +1 -1
  9. grid/css/grid.less +0 -7
  10. grid/css/grid.min.css +1 -1
  11. grid/templates/grid-element.php +8 -8
  12. img/check-icon.png +0 -0
  13. img/cross-icon.png +0 -0
  14. img/warning-icon.png +0 -0
  15. js/scripts.min.js +1 -1
  16. languages/really-simple-ssl.pot +1440 -180
  17. lets-encrypt/class-letsencrypt-handler.php +1714 -0
  18. lets-encrypt/composer.json +6 -0
  19. lets-encrypt/composer.lock +120 -0
  20. lets-encrypt/composer.phar +0 -0
  21. lets-encrypt/cron.php +104 -0
  22. lets-encrypt/download.php +89 -0
  23. lets-encrypt/functions.php +637 -0
  24. lets-encrypt/integrations/cloudways/cloudways.php +266 -0
  25. lets-encrypt/integrations/cloudways/functions.php +74 -0
  26. lets-encrypt/integrations/cpanel/cpanel.php +383 -0
  27. lets-encrypt/integrations/cpanel/functions.php +147 -0
  28. lets-encrypt/integrations/directadmin/directadmin.php +147 -0
  29. lets-encrypt/integrations/directadmin/functions.php +40 -0
  30. lets-encrypt/integrations/directadmin/httpsocket.php +441 -0
  31. lets-encrypt/integrations/hostgator/hostgator.php +7 -0
  32. lets-encrypt/integrations/integrations.php +17 -0
  33. lets-encrypt/integrations/plesk/CertificateInstaller.php +32 -0
  34. lets-encrypt/integrations/plesk/functions.php +44 -0
  35. lets-encrypt/integrations/plesk/plesk.php +100 -0
  36. lets-encrypt/letsencrypt.php +122 -0
  37. lets-encrypt/node_modules/composer/CHANGELOG.md +114 -0
  38. lets-encrypt/node_modules/composer/LICENSE +21 -0
  39. lets-encrypt/node_modules/composer/README.md +608 -0
  40. lets-encrypt/node_modules/composer/index.js +1 -0
  41. lets-encrypt/node_modules/composer/lib/generator.js +645 -0
  42. lets-encrypt/node_modules/composer/lib/parse.js +89 -0
  43. lets-encrypt/node_modules/composer/lib/task.js +131 -0
  44. lets-encrypt/node_modules/composer/lib/tasks.js +409 -0
  45. lets-encrypt/node_modules/composer/lib/timer.js +37 -0
  46. lets-encrypt/node_modules/composer/lib/utils.js +68 -0
  47. lets-encrypt/node_modules/composer/package.json +118 -0
  48. lets-encrypt/node_modules/pretty-time/LICENSE +21 -0
  49. lets-encrypt/node_modules/pretty-time/README.md +169 -0
  50. lets-encrypt/node_modules/pretty-time/index.js +56 -0
  51. lets-encrypt/node_modules/pretty-time/package.json +99 -0
  52. lets-encrypt/node_modules/pretty-time/utils.js +32 -0
  53. lets-encrypt/node_modules/use/LICENSE +21 -0
  54. lets-encrypt/node_modules/use/README.md +90 -0
  55. lets-encrypt/node_modules/use/index.js +155 -0
  56. lets-encrypt/node_modules/use/package.json +108 -0
  57. lets-encrypt/package-lock.json +25 -0
  58. lets-encrypt/vendor/autoload.php +7 -0
  59. lets-encrypt/vendor/composer/ClassLoader.php +479 -0
  60. lets-encrypt/vendor/composer/InstalledVersions.php +303 -0
  61. lets-encrypt/vendor/composer/LICENSE +21 -0
  62. lets-encrypt/vendor/composer/autoload_classmap.php +10 -0
  63. lets-encrypt/vendor/composer/autoload_namespaces.php +10 -0
  64. lets-encrypt/vendor/composer/autoload_psr4.php +10 -0
  65. lets-encrypt/vendor/composer/autoload_real.php +57 -0
  66. lets-encrypt/vendor/composer/autoload_static.php +47 -0
  67. lets-encrypt/vendor/composer/installed.json +113 -0
  68. lets-encrypt/vendor/composer/installed.php +42 -0
  69. lets-encrypt/vendor/composer/platform_check.php +26 -0
  70. lets-encrypt/vendor/fbett/le_acme2/LICENSE.md +19 -0
  71. lets-encrypt/vendor/fbett/le_acme2/README.md +119 -0
  72. lets-encrypt/vendor/fbett/le_acme2/Samples/DNS.php +72 -0
  73. lets-encrypt/vendor/fbett/le_acme2/Samples/HTTP.php +63 -0
  74. lets-encrypt/vendor/fbett/le_acme2/composer.json +25 -0
  75. lets-encrypt/vendor/fbett/le_acme2/phpunit.xml.dist +25 -0
  76. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/AbstractKeyValuable.php +95 -0
  77. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Account.php +162 -0
  78. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractAuthorizer.php +173 -0
  79. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractDNSWriter.php +17 -0
  80. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/DNS.php +69 -0
  81. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/HTTP.php +114 -0
  82. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/AbstractKeyValuableCache.php +13 -0
  83. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/AccountResponse.php +87 -0
  84. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/DirectoryResponse.php +64 -0
  85. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/NewNonceResponse.php +41 -0
  86. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/OrderResponse.php +115 -0
  87. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Connector/Connector.php +110 -0
  88. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Connector/RawResponse.php +53 -0
  89. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/AbstractException.php +18 -0
  90. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/AuthorizationInvalid.php +5 -0
  91. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/DNSAuthorizationInvalid.php +5 -0
  92. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/ExpiredAuthorization.php +10 -0
  93. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/HTTPAuthorizationInvalid.php +5 -0
  94. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/InvalidResponse.php +39 -0
  95. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/OpenSSLException.php +18 -0
  96. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/RateLimitReached.php +13 -0
  97. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/StatusInvalid.php +5 -0
  98. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Order.php +437 -0
  99. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/AbstractRequest.php +25 -0
  100. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/AbstractLocation.php +52 -0
  101. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/ChangeKeys.php +83 -0
  102. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Create.php +50 -0
  103. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Deactivate.php +27 -0
  104. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Get.php +49 -0
  105. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/GetData.php +25 -0
  106. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Update.php +37 -0
  107. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Get.php +50 -0
  108. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Start.php +58 -0
  109. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/GetDirectory.php +27 -0
  110. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/GetNewNonce.php +27 -0
  111. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Create.php +61 -0
  112. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Finalize.php +60 -0
  113. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Get.php +49 -0
  114. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/GetCertificate.php +59 -0
  115. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/RevokeCertificate.php +57 -0
  116. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/AbstractResponse.php +71 -0
  117. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/AbstractAccount.php +17 -0
  118. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/AbstractLocation.php +32 -0
  119. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/ChangeKeys.php +7 -0
  120. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Create.php +5 -0
  121. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Deactivate.php +5 -0
  122. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Get.php +5 -0
  123. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/GetData.php +5 -0
  124. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Update.php +5 -0
  125. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/AbstractAuthorization.php +35 -0
  126. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Get.php +38 -0
  127. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Start.php +5 -0
  128. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Struct/Challenge.php +24 -0
  129. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Struct/Identifier.php +15 -0
  130. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/GetDirectory.php +38 -0
  131. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/GetNewNonce.php +18 -0
  132. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/AbstractOrder.php +67 -0
  133. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Create.php +5 -0
  134. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Finalize.php +5 -0
  135. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Get.php +26 -0
  136. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/GetCertificate.php +56 -0
  137. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/RevokeCertificate.php +7 -0
  138. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/SingletonTrait.php +18 -0
  139. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Struct/CertificateBundle.php +21 -0
  140. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Struct/ChallengeAuthorizationKey.php +39 -0
  141. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Base64.php +32 -0
  142. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Certificate.php +88 -0
  143. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/KeyGenerator.php +65 -0
  144. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Logger.php +64 -0
  145. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/RequestSigner.php +112 -0
  146. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/AbstractTest.php +14 -0
  147. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/AccountTest.php +176 -0
  148. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/Authorizer/HTTPTest.php +40 -0
  149. lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/TestHelper.php +41 -0
  150. lets-encrypt/vendor/plesk/api-php-lib/.styleci.yml +6 -0
  151. lets-encrypt/vendor/plesk/api-php-lib/.travis.yml +4 -0
  152. lets-encrypt/vendor/plesk/api-php-lib/Dockerfile +6 -0
  153. lets-encrypt/vendor/plesk/api-php-lib/LICENSE +13 -0
  154. lets-encrypt/vendor/plesk/api-php-lib/README.md +66 -0
  155. lets-encrypt/vendor/plesk/api-php-lib/composer.json +48 -0
  156. lets-encrypt/vendor/plesk/api-php-lib/composer.lock +2919 -0
  157. lets-encrypt/vendor/plesk/api-php-lib/docker-compose.yml +21 -0
  158. lets-encrypt/vendor/plesk/api-php-lib/phpunit-watcher.yml +3 -0
  159. lets-encrypt/vendor/plesk/api-php-lib/phpunit.xml.dist +25 -0
  160. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Client.php +580 -0
  161. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Client/Exception.php +11 -0
  162. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Exception.php +11 -0
  163. lets-encrypt/vendor/plesk/api-php-lib/src/Api/InternalClient.php +25 -0
  164. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator.php +95 -0
  165. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Aps.php +8 -0
  166. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Certificate.php +64 -0
  167. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Customer.php +60 -0
  168. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Database.php +167 -0
  169. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/DatabaseServer.php +70 -0
  170. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Dns.php +130 -0
  171. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/DnsTemplate.php +88 -0
  172. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/EventLog.php +49 -0
  173. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Ip.php +26 -0
  174. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Locale.php +33 -0
  175. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/LogRotation.php +8 -0
  176. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Mail.php +56 -0
  177. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/PhpHandler.php +59 -0
  178. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ProtectedDirectory.php +123 -0
  179. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Reseller.php +84 -0
  180. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ResellerPlan.php +8 -0
  181. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/SecretKey.php +80 -0
  182. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Server.php +173 -0
  183. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ServicePlan.php +56 -0
  184. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ServicePlanAddon.php +8 -0
  185. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Session.php +36 -0
  186. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Site.php +91 -0
  187. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/SiteAlias.php +75 -0
  188. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Subdomain.php +91 -0
  189. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Ui.php +63 -0
  190. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/VirtualDirectory.php +9 -0
  191. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Webspace.php +146 -0
  192. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct.php +63 -0
  193. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Certificate/Info.php +21 -0
  194. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Customer/GeneralInfo.php +69 -0
  195. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Customer/Info.php +21 -0
  196. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Database/Info.php +37 -0
  197. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Database/UserInfo.php +25 -0
  198. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/DatabaseServer/Info.php +29 -0
  199. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Dns/Info.php +41 -0
  200. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/EventLog/DetailedEvent.php +41 -0
  201. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/EventLog/Event.php +29 -0
  202. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Ip/Info.php +29 -0
  203. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Locale/Info.php +25 -0
  204. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Mail/Info.php +21 -0
  205. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/PhpHandler/Info.php +55 -0
  206. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/ProtectedDirectory/DataInfo.php +23 -0
  207. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/ProtectedDirectory/Info.php +19 -0
  208. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/ProtectedDirectory/UserInfo.php +17 -0
  209. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Reseller/GeneralInfo.php +32 -0
  210. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Reseller/Info.php +21 -0
  211. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SecretKey/Info.php +29 -0
  212. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Admin.php +25 -0
  213. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/GeneralInfo.php +25 -0
  214. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Preferences.php +25 -0
  215. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/SessionPreferences.php +17 -0
  216. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Statistics.php +19 -0
  217. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Statistics/Objects.php +21 -0
  218. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Statistics/Version.php +21 -0
  219. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/UpdatesInfo.php +21 -0
  220. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/ServicePlan/Info.php +29 -0
  221. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Session/Info.php +37 -0
  222. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/GeneralInfo.php +33 -0
  223. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/HostingInfo.php +23 -0
  224. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/Info.php +21 -0
  225. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/GeneralInfo.php +25 -0
  226. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/Info.php +21 -0
  227. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Subdomain/Info.php +32 -0
  228. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Ui/CustomButton.php +45 -0
  229. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/DiskUsage.php +58 -0
  230. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/GeneralInfo.php +25 -0
  231. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/HostingPropertyInfo.php +25 -0
  232. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/Info.php +21 -0
  233. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/Limit.php +21 -0
  234. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/LimitDescriptor.php +19 -0
  235. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/LimitInfo.php +25 -0
  236. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/Limits.php +23 -0
  237. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/PermissionDescriptor.php +19 -0
  238. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/PermissionInfo.php +25 -0
  239. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/PhpSettings.php +19 -0
  240. lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/PhysicalHostingDescriptor.php +19 -0
  241. lets-encrypt/vendor/plesk/api-php-lib/src/Api/XmlResponse.php +22 -0
  242. lets-encrypt/vendor/plesk/api-php-lib/tests/ApiClientTest.php +173 -0
  243. lets-encrypt/vendor/plesk/api-php-lib/tests/CertificateTest.php +24 -0
  244. lets-encrypt/vendor/plesk/api-php-lib/tests/CustomerTest.php +86 -0
  245. lets-encrypt/vendor/plesk/api-php-lib/tests/DatabaseServerTest.php +29 -0
  246. lets-encrypt/vendor/plesk/api-php-lib/tests/DatabaseTest.php +237 -0
  247. lets-encrypt/vendor/plesk/api-php-lib/tests/DnsTemplateTest.php +94 -0
  248. lets-encrypt/vendor/plesk/api-php-lib/tests/DnsTest.php +163 -0
  249. lets-encrypt/vendor/plesk/api-php-lib/tests/EventLogTest.php +31 -0
  250. lets-encrypt/vendor/plesk/api-php-lib/tests/IpTest.php +16 -0
  251. lets-encrypt/vendor/plesk/api-php-lib/tests/LocaleTest.php +22 -0
  252. lets-encrypt/vendor/plesk/api-php-lib/tests/MailTest.php +57 -0
  253. lets-encrypt/vendor/plesk/api-php-lib/tests/PhpHandlerTest.php +36 -0
  254. lets-encrypt/vendor/plesk/api-php-lib/tests/ProtectedDirectoryTest.php +84 -0
  255. lets-encrypt/vendor/plesk/api-php-lib/tests/ResellerTest.php +76 -0
  256. lets-encrypt/vendor/plesk/api-php-lib/tests/SecretKeyTest.php +72 -0
  257. lets-encrypt/vendor/plesk/api-php-lib/tests/ServerTest.php +111 -0
  258. lets-encrypt/vendor/plesk/api-php-lib/tests/ServicePlanTest.php +22 -0
  259. lets-encrypt/vendor/plesk/api-php-lib/tests/SessionTest.php +27 -0
  260. lets-encrypt/vendor/plesk/api-php-lib/tests/SiteTest.php +107 -0
  261. lets-encrypt/vendor/plesk/api-php-lib/tests/SubdomainTest.php +88 -0
  262. lets-encrypt/vendor/plesk/api-php-lib/tests/TestCase.php +73 -0
  263. lets-encrypt/vendor/plesk/api-php-lib/tests/UiTest.php +52 -0
  264. lets-encrypt/vendor/plesk/api-php-lib/tests/Utility/KeyLimitChecker.php +46 -0
  265. lets-encrypt/vendor/plesk/api-php-lib/tests/Utility/PasswordProvider.php +9 -0
  266. lets-encrypt/vendor/plesk/api-php-lib/tests/WebspaceTest.php +177 -0
  267. lets-encrypt/vendor/plesk/api-php-lib/wait-for-plesk.sh +8 -0
  268. lets-encrypt/wizard/assets/css/admin.css +145 -0
  269. lets-encrypt/wizard/assets/css/admin.css.map +1 -0
  270. lets-encrypt/wizard/assets/css/admin.less +165 -0
  271. lets-encrypt/wizard/assets/css/admin.min.css +1 -0
  272. lets-encrypt/wizard/assets/css/variables.css +0 -0
  273. lets-encrypt/wizard/assets/css/variables.css.map +0 -0
  274. lets-encrypt/wizard/assets/css/variables.less +40 -0
  275. lets-encrypt/wizard/assets/css/wizard.css +1939 -0
  276. lets-encrypt/wizard/assets/css/wizard.css.map +1 -0
  277. lets-encrypt/wizard/assets/css/wizard.less +2296 -0
  278. lets-encrypt/wizard/assets/css/wizard.min.css +1 -0
assets/icon-128x128.png CHANGED
Binary file
assets/really-simple-plugins.png CHANGED
Binary file
assets/really-simple-ssl-logo.png ADDED
Binary file
class-admin.php CHANGED
@@ -63,10 +63,10 @@ class rsssl_admin extends rsssl_front_end
63
  }
64
 
65
  register_deactivation_hook(dirname(__FILE__) . "/" . $this->plugin_filename, array($this, 'deactivate'));
66
- add_action('admin_init', array($this, 'add_privacy_info'));
67
- add_action('admin_init', array($this, 'maybe_dismiss_review_notice'));
68
- add_action( 'admin_init', array($this, 'insert_secure_cookie_settings'), 70);
69
-
70
  add_action( "update_option_rlrsssl_options", array( $this, "maybe_clear_transients" ), 10, 3 );
71
 
72
  // Only show deactivate popup when SSL has been enabled.
@@ -228,12 +228,12 @@ class rsssl_admin extends rsssl_front_end
228
  //Add update notification to Settings admin menu
229
  add_action('admin_menu', array($this, 'rsssl_edit_admin_menu') );
230
 
231
-
232
  //callbacks for the ajax dismiss buttons
233
  add_action('wp_ajax_dismiss_success_message', array($this, 'dismiss_success_message_callback'));
234
  add_action('wp_ajax_rsssl_dismiss_review_notice', array($this, 'dismiss_review_notice_callback'));
235
  add_action('wp_ajax_rsssl_dismiss_settings_notice', array($this, 'dismiss_settings_notice_callback'));
236
  add_action('wp_ajax_rsssl_update_task_toggle_option', array($this, 'update_task_toggle_option'));
 
237
 
238
  //handle notices
239
  add_action('admin_notices', array($this, 'show_notices'));
@@ -375,7 +375,6 @@ class rsssl_admin extends rsssl_front_end
375
  private function clicked_activate_ssl()
376
  {
377
  if (!current_user_can($this->capability)) return;
378
-
379
  if (isset($_POST['rsssl_do_activate_ssl'])) {
380
  $this->activate_ssl();
381
  update_option('rsssl_activation_timestamp', time());
@@ -386,6 +385,18 @@ class rsssl_admin extends rsssl_front_end
386
  return false;
387
  }
388
 
 
 
 
 
 
 
 
 
 
 
 
 
389
 
390
  /**
391
  * Activate the SSL for this site
@@ -419,11 +430,11 @@ class rsssl_admin extends rsssl_front_end
419
  * redirect to settings page
420
  */
421
 
422
- public function redirect_to_settings_page() {
423
  if (isset($_GET['page']) && $_GET['page'] == 'rlrsssl_really_simple_ssl') return;
424
  $url = add_query_arg( array(
425
  "page" => "rlrsssl_really_simple_ssl",
426
- "tab" => "configuration",
427
  ), admin_url( "options-general.php" ) );
428
  wp_redirect( $url );
429
  exit;
@@ -446,7 +457,7 @@ class rsssl_admin extends rsssl_front_end
446
  This message is shown when SSL is not enabled by the user yet
447
  */
448
 
449
- public function show_notice_activate_ssl()
450
  {
451
  //prevent showing the review on edit screen, as gutenberg removes the class which makes it editable.
452
  $screen = get_current_screen();
@@ -461,9 +472,11 @@ class rsssl_admin extends rsssl_front_end
461
 
462
  //on multisite, only show this message on the network admin. Per site activated sites have to go to the settings page.
463
  //otherwise sites that do not need SSL possibly get to see this message.
464
-
465
  if (is_multisite() && !is_network_admin()) return;
466
 
 
 
 
467
  if (!$this->wpconfig_ok()) return;
468
 
469
  if (!current_user_can($this->capability)) return;
@@ -478,20 +491,17 @@ class rsssl_admin extends rsssl_front_end
478
 
479
  public function ssl_detected()
480
  {
481
- if ($this->site_has_ssl || (defined('RSSSL_FORCE_ACTIVATE') && RSSSL_FORCE_ACTIVATE)) {
482
-
483
- ob_start();
484
- do_action('rsssl_activation_notice_inner');
485
- $content = ob_get_clean();
486
 
487
- ob_start();
488
- do_action('rsssl_activation_notice_footer');
489
- $footer = ob_get_clean();
490
 
491
- $class = apply_filters("rsssl_activation_notice_classes", "updated activate-ssl rsssl-pro-dismiss-notice");
492
- $title = __("Almost ready to migrate to SSL!", "really-simple-ssl");
493
- echo $this->notice_html( $class, $title, $content, $footer);
494
- }
495
  }
496
 
497
  /**
@@ -500,31 +510,27 @@ class rsssl_admin extends rsssl_front_end
500
  public function almost_ready_to_migrate()
501
  {
502
  _e("Before you migrate, please check for: ", 'really-simple-ssl'); ?>
503
- <p>
504
- <ul>
505
- <li><?php _e('Http references in your .css and .js files: change any http:// into https://', 'really-simple-ssl'); ?></li>
506
- <li><?php _e('Images, stylesheets or scripts from a domain without an SSL certificate: remove them or move to your own server', 'really-simple-ssl'); ?></li><?php
507
-
508
- $backup_link = "https://really-simple-ssl.com/knowledge-base/backing-up-your-site/";
509
- $link_open = '<a target="_blank" href="'.$backup_link.'">';
510
- $link_close = '</a>';
511
- ?>
512
- <li><?php printf(__("We strongly recommend to create a %sbackup%s of your site before activating SSL", 'really-simple-ssl'), $link_open, $link_close); ?> </li>
513
- <li><?php _e("You may need to login in again.", "really-simple-ssl") ?></li>
514
- </ul>
515
- </p>
516
- <p><?php
517
- if (!defined('rsssl_pro_version')) {
518
- _e('You can also let the automatic scan of the pro version handle this for you, and get premium support, increased security with HSTS and more!', 'really-simple-ssl');
519
- ?>
520
- <a target="_blank"
521
- href="<?php
522
- echo $this->pro_url; ?>"><?php _e("Check out Really Simple SSL Pro", "really-simple-ssl");
523
- }
524
- ?>
525
- </a>
526
- </p>
527
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
528
  <?php
529
  }
530
 
@@ -542,7 +548,7 @@ class rsssl_admin extends rsssl_front_end
542
  */
543
 
544
  public function notice_html($class, $title, $content, $footer=false) {
545
-
546
  ob_start();
547
  ?>
548
  <?php if ( is_rtl() ) { ?>
@@ -624,10 +630,16 @@ class rsssl_admin extends rsssl_front_end
624
  margin-right:-30px;
625
  }
626
 
 
 
 
 
 
 
 
627
  .settings_page_rlrsssl_really_simple_ssl #wpcontent #rsssl-message, .settings_page_really-simple-ssl #wpcontent #rsssl-message {
628
  margin: 20px;
629
  }
630
- <?php echo apply_filters('rsssl_pro_inline_style', ''); ?>
631
  </style>
632
  <?php } else { ?>
633
  <style>
@@ -641,7 +653,7 @@ class rsssl_admin extends rsssl_front_end
641
  margin-bottom: 5px;
642
  }
643
 
644
- #rsssl-message .button-primary {
645
  margin-right: 10px;
646
  }
647
 
@@ -707,18 +719,26 @@ class rsssl_admin extends rsssl_front_end
707
  margin-top: 5px;
708
  margin-left:-30px;
709
  }
 
 
 
 
 
 
710
 
711
  .settings_page_rlrsssl_really_simple_ssl #wpcontent #rsssl-message, .settings_page_really-simple-ssl #wpcontent #rsssl-message {
712
  margin: 20px;
713
  }
714
- <?php echo apply_filters('rsssl_pro_inline_style', ''); ?>
715
  </style>
716
  <?php } ?>
717
- <div id="rsssl-message" class="notice <?php echo $class?> really-simple-plugins">
 
718
  <div class="rsssl-notice">
719
- <div class="rsssl-notice-header">
720
- <h1><?php echo $title ?></h1>
721
- </div>
 
 
722
  <div class="rsssl-notice-content">
723
  <?php echo $content ?>
724
  </div>
@@ -743,20 +763,30 @@ class rsssl_admin extends rsssl_front_end
743
  * @access public
744
  */
745
 
746
- public function show_enable_ssl_button()
747
- {
748
- ?>
749
- <form action="" method="post">
750
- <?php wp_nonce_field('rsssl_nonce', 'rsssl_nonce'); ?>
 
 
 
 
 
751
  <input type="submit" class='button button-primary'
752
  value="<?php _e("Go ahead, activate SSL!", "really-simple-ssl"); ?>" id="rsssl_do_activate_ssl"
753
  name="rsssl_do_activate_ssl">
754
- <?php if (!defined("rsssl_pro_version") ) { ?>
 
 
 
 
755
  <a class="button button-default" href="<?php echo $this->pro_url ?>" target="_blank"><?php _e("Get ready with PRO!", "really-simple-ssl"); ?></a>
756
- <?php } ?>
757
- </form>
758
- <?php
759
- }
 
760
 
761
  /**
762
  * @return bool
@@ -2376,7 +2406,7 @@ class rsssl_admin extends rsssl_front_end
2376
  public function has_well_known_needle()
2377
  {
2378
  $htaccess = file_get_contents($this->htaccess_file());
2379
- $well_known_needle = ".well-known";
2380
 
2381
  if (strpos($htaccess, $well_known_needle) !== false) {
2382
  return true;
@@ -2710,7 +2740,7 @@ class rsssl_admin extends rsssl_front_end
2710
  ?>
2711
  <div class="nav-tab-wrapper">
2712
  <div class="rsssl-logo-container">
2713
- <div id="rsssl-logo"><img src="<?php echo rsssl_url?>/assets/really-simple-ssl-logo.svg" alt="review-logo"></div>
2714
  </div>
2715
  <?php
2716
  if (count($tabs)>1) {
@@ -2794,7 +2824,12 @@ class rsssl_admin extends rsssl_front_end
2794
 
2795
  $curl_error = get_transient('rsssl_curl_error');
2796
  $current_plugin_folder = $this->get_current_rsssl_free_dirname();
2797
- $reload_https_url = add_query_arg( array( 'ssl_reload_https' => '1') , esc_url_raw("https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) );
 
 
 
 
 
2798
  $notices = array(
2799
  'deactivation_file_detected' => array(
2800
  'callback' => 'RSSSL()->really_simple_ssl->check_for_uninstall_file',
@@ -2895,19 +2930,31 @@ class rsssl_admin extends rsssl_front_end
2895
  ),
2896
  'no-ssl-detected' => array(
2897
  'title' => __("No SSL detected", "really-simple-ssl"),
2898
- 'msg' => sprintf(__("No SSL detected. See our guide on how to %sget a free SSL certificate%s. If you do have an SSL certificate, try to reload this page over https by clicking this link: %sReload over https.%s", "really-simple-ssl"), '<a target="_blank" href="https://really-simple-ssl.com/knowledge-base/how-to-install-a-free-ssl-certificate-on-your-wordpress-cpanel-hosting/">', '</a>', '<a href="' .$reload_https_url . '">' , '</a>'),
 
 
2899
  'icon' => 'warning',
2900
- 'admin_notice' => true,
2901
  ),
2902
  'ssl-detected' => array(
2903
  'msg' => __('An SSL certificate was detected on your site.', 'really-simple-ssl'),
2904
  'icon' => 'success'
2905
  ),
 
 
 
 
 
 
 
 
 
 
2906
  ),
2907
  ),
2908
 
2909
  'mixed_content_fixer_detected' => array(
2910
- 'condition' => array('rsssl_site_has_ssl', 'rsssl_ssl_enabled'),
2911
  'callback' => 'RSSSL()->really_simple_ssl->mixed_content_fixer_detected',
2912
  'score' => 10,
2913
  'output' => array(
@@ -3108,13 +3155,24 @@ class rsssl_admin extends rsssl_front_end
3108
  ),
3109
  ),
3110
  ),
 
 
 
 
 
 
 
 
 
 
 
 
3111
  );
3112
 
3113
  //on multisite, don't show the notice on subsites.
3114
  if ( is_multisite() && !is_network_admin() ) {
3115
  unset($notices['secure_cookies_set']);
3116
  }
3117
-
3118
  $notices = apply_filters('rsssl_notices', $notices);
3119
  foreach ($notices as $id => $notice) {
3120
  $notices[$id] = wp_parse_args($notice, $notice_defaults);
@@ -3590,15 +3648,17 @@ class rsssl_admin extends rsssl_front_end
3590
  public function settings_page()
3591
  {
3592
  if (!current_user_can($this->capability)) return;
3593
- if (isset ($_GET['tab'])) $this->admin_tabs($_GET['tab']); else $this->admin_tabs('configuration');
3594
- if (isset ($_GET['tab'])) $tab = $_GET['tab']; else $tab = 'configuration';
 
3595
  ?>
3596
  <div class="rsssl-container">
3597
  <div class="rsssl-main"><?php
3598
  switch ($tab) {
3599
  case 'configuration' :
3600
- $this->render_grid($this->general_grid());
3601
- do_action("rsssl_configuration_page");
 
3602
  }
3603
  //possibility to hook into the tabs.
3604
  do_action("show_tab_{$tab}");
@@ -3613,8 +3673,10 @@ class rsssl_admin extends rsssl_front_end
3613
  * @param array $grid
3614
  */
3615
  public function render_grid($grid){
 
3616
  $container = $this->get_template('grid-container.php', rsssl_path . 'grid/');
3617
  $element = $this->get_template('grid-element.php', rsssl_path . 'grid/');
 
3618
  $output = '';
3619
  $defaults = array(
3620
  'title' => '',
@@ -3666,18 +3728,17 @@ class rsssl_admin extends rsssl_front_end
3666
  */
3667
 
3668
  public function get_template_part($grid_item, $key, $index) {
3669
-
3670
- if ( !isset($grid_item[$key]) || !$grid_item[$key] ) {
3671
- $template_part = '';
3672
- } else {
3673
- if ( strpos( $grid_item[ $key ], '.php' ) !== false && file_exists($grid_item[ $key ]) ) {
3674
- ob_start();
3675
- require $grid_item[ $key ];
3676
- $template_part = ob_get_clean();
3677
- } else {
3678
- $template_part = '';
3679
- }
3680
- }
3681
 
3682
  return apply_filters("rsssl_template_part_".$key.'_'.$index, $template_part, $grid_item);
3683
  }
@@ -4624,9 +4685,16 @@ class rsssl_admin extends rsssl_front_end
4624
  }
4625
  }
4626
 
 
 
 
 
 
 
 
 
4627
  public function get_template($file, $path = rsssl_path, $args = array())
4628
  {
4629
-
4630
  $file = trailingslashit($path) . 'templates/' . $file;
4631
  $theme_file = trailingslashit(get_stylesheet_directory()) . dirname(rsssl_path) . $file;
4632
 
@@ -4642,22 +4710,16 @@ class rsssl_admin extends rsssl_front_end
4642
  $contents = file_get_contents($file);
4643
  }
4644
 
 
 
 
 
 
 
4645
  return $contents;
4646
  }
4647
  } //class closure
4648
 
4649
- /**
4650
- * Wrapper functions for dashboard notices()
4651
- * @return string
4652
- */
4653
-
4654
-
4655
- if (!function_exists('rsssl_site_has_ssl')) {
4656
- function rsssl_site_has_ssl() {
4657
- return RSSSL()->really_simple_ssl->site_has_ssl;
4658
- }
4659
- }
4660
-
4661
  if (!function_exists('rsssl_ssl_enabled')) {
4662
  function rsssl_ssl_enabled() {
4663
  return RSSSL()->really_simple_ssl->ssl_enabled;
@@ -4667,23 +4729,23 @@ if (!function_exists('rsssl_ssl_enabled')) {
4667
  if (!function_exists('rsssl_ssl_detected')) {
4668
  function rsssl_ssl_detected() {
4669
 
4670
- if ( RSSSL()->really_simple_ssl->ssl_enabled ) {
4671
- return apply_filters('rsssl_ssl_detected', 'ssl-detected');
4672
- }
4673
-
4674
  if ( ! RSSSL()->really_simple_ssl->wpconfig_ok() ) {
4675
  return apply_filters('rsssl_ssl_detected', 'fail');
4676
  }
4677
 
4678
- if ( RSSSL()->really_simple_ssl->site_has_ssl ) {
4679
- return apply_filters('rsssl_ssl_detected', 'ssl-detected');
4680
- }
4681
-
4682
- if ( !RSSSL()->rsssl_certificate->is_valid() ) {
4683
  return apply_filters('rsssl_ssl_detected', 'no-ssl-detected');
4684
- }
 
 
 
 
 
 
 
 
4685
 
4686
- return apply_filters('rsssl_ssl_detected', 'ssl-detected');
4687
  }
4688
  }
4689
 
@@ -4734,6 +4796,15 @@ if (!function_exists('rsssl_uses_wp_engine')) {
4734
  }
4735
  }
4736
 
 
 
 
 
 
 
 
 
 
4737
  if (!function_exists('rsssl_ssl_activation_time_no_longer_then_3_days_ago')) {
4738
  function rsssl_ssl_activation_time_no_longer_then_3_days_ago() {
4739
 
@@ -4747,3 +4818,13 @@ if (!function_exists('rsssl_ssl_activation_time_no_longer_then_3_days_ago')) {
4747
  }
4748
  }
4749
  }
 
 
 
 
 
 
 
 
 
 
63
  }
64
 
65
  register_deactivation_hook(dirname(__FILE__) . "/" . $this->plugin_filename, array($this, 'deactivate'));
66
+ add_action( 'admin_init', array($this, 'add_privacy_info') );
67
+ add_action( 'admin_init', array($this, 'maybe_dismiss_review_notice') );
68
+ add_action( 'admin_init', array($this, 'insert_secure_cookie_settings'), 70 );
69
+ add_action( 'admin_init', array($this, 'recheck_certificate') );
70
  add_action( "update_option_rlrsssl_options", array( $this, "maybe_clear_transients" ), 10, 3 );
71
 
72
  // Only show deactivate popup when SSL has been enabled.
228
  //Add update notification to Settings admin menu
229
  add_action('admin_menu', array($this, 'rsssl_edit_admin_menu') );
230
 
 
231
  //callbacks for the ajax dismiss buttons
232
  add_action('wp_ajax_dismiss_success_message', array($this, 'dismiss_success_message_callback'));
233
  add_action('wp_ajax_rsssl_dismiss_review_notice', array($this, 'dismiss_review_notice_callback'));
234
  add_action('wp_ajax_rsssl_dismiss_settings_notice', array($this, 'dismiss_settings_notice_callback'));
235
  add_action('wp_ajax_rsssl_update_task_toggle_option', array($this, 'update_task_toggle_option'));
236
+ add_action('wp_ajax_rsssl_redirect_to_le_wizard', array($this, 'rsssl_redirect_to_le_wizard'));
237
 
238
  //handle notices
239
  add_action('admin_notices', array($this, 'show_notices'));
375
  private function clicked_activate_ssl()
376
  {
377
  if (!current_user_can($this->capability)) return;
 
378
  if (isset($_POST['rsssl_do_activate_ssl'])) {
379
  $this->activate_ssl();
380
  update_option('rsssl_activation_timestamp', time());
385
  return false;
386
  }
387
 
388
+ /**
389
+ * If the user has clicked "recheck certificate, clear the cache for the certificate check.
390
+ * @return void
391
+ */
392
+ public function recheck_certificate(){
393
+ if (!current_user_can($this->capability)) return;
394
+
395
+ if (isset($_POST['rsssl_recheck_certificate'])) {
396
+ delete_transient('rsssl_certinfo');
397
+ }
398
+ }
399
+
400
 
401
  /**
402
  * Activate the SSL for this site
430
  * redirect to settings page
431
  */
432
 
433
+ public function redirect_to_settings_page($tab='configuration') {
434
  if (isset($_GET['page']) && $_GET['page'] == 'rlrsssl_really_simple_ssl') return;
435
  $url = add_query_arg( array(
436
  "page" => "rlrsssl_really_simple_ssl",
437
+ "tab" => $tab,
438
  ), admin_url( "options-general.php" ) );
439
  wp_redirect( $url );
440
  exit;
457
  This message is shown when SSL is not enabled by the user yet
458
  */
459
 
460
+ public function show_notice_activate_ssl($hook)
461
  {
462
  //prevent showing the review on edit screen, as gutenberg removes the class which makes it editable.
463
  $screen = get_current_screen();
472
 
473
  //on multisite, only show this message on the network admin. Per site activated sites have to go to the settings page.
474
  //otherwise sites that do not need SSL possibly get to see this message.
 
475
  if (is_multisite() && !is_network_admin()) return;
476
 
477
+ //don't show in our Let's Encrypt wizard
478
+ if (isset($_GET['tab']) && $_GET['tab']==='letsencrypt') return;
479
+
480
  if (!$this->wpconfig_ok()) return;
481
 
482
  if (!current_user_can($this->capability)) return;
491
 
492
  public function ssl_detected()
493
  {
494
+ ob_start();
495
+ do_action('rsssl_activation_notice_inner');
496
+ $content = ob_get_clean();
 
 
497
 
498
+ ob_start();
499
+ do_action('rsssl_activation_notice_footer');
500
+ $footer = ob_get_clean();
501
 
502
+ $class = apply_filters("rsssl_activation_notice_classes", "updated activate-ssl rsssl-pro-dismiss-notice");
503
+ $title = __("Almost ready to migrate to SSL!", "really-simple-ssl");
504
+ echo $this->notice_html( $class, $title, $content, $footer);
 
505
  }
506
 
507
  /**
510
  public function almost_ready_to_migrate()
511
  {
512
  _e("Before you migrate, please check for: ", 'really-simple-ssl'); ?>
513
+ <ul>
514
+ <li><?php _e('Http references in your .css and .js files: change any http:// into https://', 'really-simple-ssl'); ?></li>
515
+ <li><?php _e('Images, stylesheets or scripts from a domain without an SSL certificate: remove them or move to your own server', 'really-simple-ssl'); ?></li><?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
516
 
517
+ $backup_link = "https://really-simple-ssl.com/knowledge-base/backing-up-your-site/";
518
+ $link_open = '<a target="_blank" href="'.$backup_link.'">';
519
+ $link_close = '</a>';
520
+ ?>
521
+ <li><?php printf(__("We strongly recommend to create a %sbackup%s of your site before activating SSL", 'really-simple-ssl'), $link_open, $link_close); ?> </li>
522
+ <li><?php _e("You may need to login in again.", "really-simple-ssl") ?></li>
523
+ <?php
524
+ if (RSSSL()->rsssl_certificate->is_valid()) { ?>
525
+ <li class="rsssl-success"><?php _e("An SSL certificate has been detected", "really-simple-ssl") ?></li>
526
+ <?php } else { ?>
527
+ <li class="rsssl-error"><?php _e("No SSL certificate has been detected. Generate one by pressing the 'Install SSL certificate' button.", "really-simple-ssl") ?></li>
528
+ <?php }?>
529
+ </ul>
530
+ <?php if ( !defined('rsssl_pro_version') ) { ?>
531
+ <?php _e('You can also let the automatic scan of the pro version handle this for you, and get premium support, increased security with HSTS and more!', 'really-simple-ssl'); ?>
532
+ <a target="_blank" href="<?php echo $this->pro_url; ?>"><?php _e("Check out Really Simple SSL Pro", "really-simple-ssl");?></a>
533
+ <?php } ?>
534
  <?php
535
  }
536
 
548
  */
549
 
550
  public function notice_html($class, $title, $content, $footer=false) {
551
+ $class .= ' notice ';
552
  ob_start();
553
  ?>
554
  <?php if ( is_rtl() ) { ?>
630
  margin-right:-30px;
631
  }
632
 
633
+ #rsssl-message li.rsssl-error:before {
634
+ background-color: #D7263D;
635
+ }
636
+ #rsssl-message li.rsssl-success:before {
637
+ background-color: #61ce70;
638
+ }
639
+
640
  .settings_page_rlrsssl_really_simple_ssl #wpcontent #rsssl-message, .settings_page_really-simple-ssl #wpcontent #rsssl-message {
641
  margin: 20px;
642
  }
 
643
  </style>
644
  <?php } else { ?>
645
  <style>
653
  margin-bottom: 5px;
654
  }
655
 
656
+ #rsssl-message .button-primary, #rsssl-message .button-default {
657
  margin-right: 10px;
658
  }
659
 
719
  margin-top: 5px;
720
  margin-left:-30px;
721
  }
722
+ #rsssl-message li.rsssl-error:before {
723
+ background-color: #D7263D;
724
+ }
725
+ #rsssl-message li.rsssl-success:before {
726
+ background-color: #61ce70;
727
+ }
728
 
729
  .settings_page_rlrsssl_really_simple_ssl #wpcontent #rsssl-message, .settings_page_really-simple-ssl #wpcontent #rsssl-message {
730
  margin: 20px;
731
  }
 
732
  </style>
733
  <?php } ?>
734
+
735
+ <div id="rsssl-message" class="<?php echo $class?> really-simple-plugins">
736
  <div class="rsssl-notice">
737
+ <?php if (!empty($title)) {?>
738
+ <div class="rsssl-notice-header">
739
+ <h1><?php echo $title ?></h1>
740
+ </div>
741
+ <?php }?>
742
  <div class="rsssl-notice-content">
743
  <?php echo $content ?>
744
  </div>
763
  * @access public
764
  */
765
 
766
+ public function show_enable_ssl_button()
767
+ {
768
+ ?>
769
+ <form action="" method="post">
770
+ <?php wp_nonce_field('rsssl_nonce', 'rsssl_nonce'); ?>
771
+ <?php if (!RSSSL()->rsssl_certificate->is_valid()) {?>
772
+ <input type="submit" class='button button-primary'
773
+ value="<?php _e("Retry", "really-simple-ssl"); ?>" id="rsssl_recheck_certificate"
774
+ name="rsssl_recheck_certificate">
775
+ <?php } else { ?>
776
  <input type="submit" class='button button-primary'
777
  value="<?php _e("Go ahead, activate SSL!", "really-simple-ssl"); ?>" id="rsssl_do_activate_ssl"
778
  name="rsssl_do_activate_ssl">
779
+ <?php } ?>
780
+ <?php if (!RSSSL()->rsssl_certificate->is_valid() ){?>
781
+ <a href="<?php echo rsssl_letsencrypt_wizard_url()?>" type="submit" class="button button-default"><?php _e("Install SSL certificate", "really-simple-ssl"); ?></a>
782
+ <?php } ?>
783
+ <?php if (!defined("rsssl_pro_version") ) { ?>
784
  <a class="button button-default" href="<?php echo $this->pro_url ?>" target="_blank"><?php _e("Get ready with PRO!", "really-simple-ssl"); ?></a>
785
+ <?php } ?>
786
+ </form>
787
+ <?php
788
+ }
789
+
790
 
791
  /**
792
  * @return bool
2406
  public function has_well_known_needle()
2407
  {
2408
  $htaccess = file_get_contents($this->htaccess_file());
2409
+ $well_known_needle = "RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/";
2410
 
2411
  if (strpos($htaccess, $well_known_needle) !== false) {
2412
  return true;
2740
  ?>
2741
  <div class="nav-tab-wrapper">
2742
  <div class="rsssl-logo-container">
2743
+ <div id="rsssl-logo"><img src="<?php echo rsssl_url?>/assets/really-simple-ssl-logo.png" alt="review-logo"></div>
2744
  </div>
2745
  <?php
2746
  if (count($tabs)>1) {
2824
 
2825
  $curl_error = get_transient('rsssl_curl_error');
2826
  $current_plugin_folder = $this->get_current_rsssl_free_dirname();
2827
+
2828
+ //get expiry date, if we have one.
2829
+ $certinfo = get_transient('rsssl_certinfo');
2830
+ $end_date = isset($certinfo['validTo_time_t']) ? $certinfo['validTo_time_t'] : false;
2831
+ $expiry_date = !empty($end_date) ? date( get_option('date_format'), $end_date ) : __("(Unknown)", "really-simple-ssl");
2832
+
2833
  $notices = array(
2834
  'deactivation_file_detected' => array(
2835
  'callback' => 'RSSSL()->really_simple_ssl->check_for_uninstall_file',
2930
  ),
2931
  'no-ssl-detected' => array(
2932
  'title' => __("No SSL detected", "really-simple-ssl"),
2933
+ 'msg' => __("No SSL detected. Use the retry button to check again.", "really-simple-ssl").
2934
+ '<br><br><form action="" method="POST"><a href="'.add_query_arg(array("page" => "rlrsssl_really_simple_ssl", "tab" => "letsencrypt"),admin_url("options-general.php")) .'" type="submit" class="button button-default">'.__("Install SSL certificate", "really-simple-ssl").'</a>'.
2935
+ '&nbsp;<input type="submit" class="button button-default" value="'.__("Retry", "really-simple-ssl").'" id="rsssl_recheck_certificate" name="rsssl_recheck_certificate"></form>',
2936
  'icon' => 'warning',
2937
+ 'admin_notice' => false,
2938
  ),
2939
  'ssl-detected' => array(
2940
  'msg' => __('An SSL certificate was detected on your site.', 'really-simple-ssl'),
2941
  'icon' => 'success'
2942
  ),
2943
+
2944
+ 'about-to-expire' => array(
2945
+ 'title' => __("Your SSL certificate will expire soon.", "really-simple-ssl"),
2946
+ 'msg' => sprintf(__("SSL certificate will expire on %s.","really-simple-ssl"), $expiry_date).'&nbsp;'.__("If your hosting provider auto-renews your certificate, no action is required. Alternatively, you have the option to generate an SSL certificate with Really Simple SSL.","really-simple-ssl").'&nbsp;'.
2947
+ sprintf(__("Depending on your hosting provider, %smanual installation%s may be required.", "really-simple-ssl"),'<a target="_blank" href="https://really-simple-ssl.com/install-ssl-certificate">','</a>').
2948
+ '<br><br><form action="" method="POST"><a href="'.add_query_arg(array("page" => "rlrsssl_really_simple_ssl", "tab" => "letsencrypt"),admin_url("options-general.php")) .'" type="submit" class="button button-default">'.__("Install SSL certificate", "really-simple-ssl").'</a>'.
2949
+ '&nbsp;<input type="submit" class="button button-default" value="'.__("Re-check", "really-simple-ssl").'" id="rsssl_recheck_certificate" name="rsssl_recheck_certificate"></form>',
2950
+ 'icon' => 'warning',
2951
+ 'admin_notice' => false,
2952
+ ),
2953
  ),
2954
  ),
2955
 
2956
  'mixed_content_fixer_detected' => array(
2957
+ 'condition' => array('rsssl_ssl_enabled'),
2958
  'callback' => 'RSSSL()->really_simple_ssl->mixed_content_fixer_detected',
2959
  'score' => 10,
2960
  'output' => array(
3155
  ),
3156
  ),
3157
  ),
3158
+ 'beta_5_addon_active' => array(
3159
+ 'condition' => array('rsssl_beta_5_addon_active'),
3160
+ 'callback' => '_true_',
3161
+ 'score' => 5,
3162
+ 'output' => array(
3163
+ 'true' => array(
3164
+ 'msg' =>__('You have the Really Simple SSL Let\'s Encrypt beta add-on activated. This functionality has now been integrated in core, so you can deactivate the add-on.', 'really-simple-ssl'),
3165
+ 'icon' => 'open',
3166
+ 'dismissible' => true
3167
+ ),
3168
+ ),
3169
+ ),
3170
  );
3171
 
3172
  //on multisite, don't show the notice on subsites.
3173
  if ( is_multisite() && !is_network_admin() ) {
3174
  unset($notices['secure_cookies_set']);
3175
  }
 
3176
  $notices = apply_filters('rsssl_notices', $notices);
3177
  foreach ($notices as $id => $notice) {
3178
  $notices[$id] = wp_parse_args($notice, $notice_defaults);
3648
  public function settings_page()
3649
  {
3650
  if (!current_user_can($this->capability)) return;
3651
+ if ( isset ($_GET['tab'] ) ) $this->admin_tabs( $_GET['tab'] ); else $this->admin_tabs('configuration');
3652
+ if ( isset ($_GET['tab'] ) ) $tab = $_GET['tab']; else $tab = 'configuration';
3653
+
3654
  ?>
3655
  <div class="rsssl-container">
3656
  <div class="rsssl-main"><?php
3657
  switch ($tab) {
3658
  case 'configuration' :
3659
+ $this->render_grid($this->general_grid());
3660
+ do_action("rsssl_configuration_page");
3661
+ break;
3662
  }
3663
  //possibility to hook into the tabs.
3664
  do_action("show_tab_{$tab}");
3673
  * @param array $grid
3674
  */
3675
  public function render_grid($grid){
3676
+
3677
  $container = $this->get_template('grid-container.php', rsssl_path . 'grid/');
3678
  $element = $this->get_template('grid-element.php', rsssl_path . 'grid/');
3679
+
3680
  $output = '';
3681
  $defaults = array(
3682
  'title' => '',
3728
  */
3729
 
3730
  public function get_template_part($grid_item, $key, $index) {
3731
+ if ( !isset($grid_item[$key]) || !$grid_item[$key] ) {
3732
+ $template_part = '';
3733
+ } else {
3734
+ if ( strpos( $grid_item[ $key ], '.php' ) !== false && file_exists($grid_item[ $key ]) ) {
3735
+ ob_start();
3736
+ require $grid_item[ $key ];
3737
+ $template_part = ob_get_clean();
3738
+ } else {
3739
+ $template_part = '';
3740
+ }
3741
+ }
 
3742
 
3743
  return apply_filters("rsssl_template_part_".$key.'_'.$index, $template_part, $grid_item);
3744
  }
4685
  }
4686
  }
4687
 
4688
+ /**
4689
+ * Get template
4690
+ * @param string $file
4691
+ * @param string $path
4692
+ * @param array $args
4693
+ *
4694
+ * @return string
4695
+ */
4696
  public function get_template($file, $path = rsssl_path, $args = array())
4697
  {
 
4698
  $file = trailingslashit($path) . 'templates/' . $file;
4699
  $theme_file = trailingslashit(get_stylesheet_directory()) . dirname(rsssl_path) . $file;
4700
 
4710
  $contents = file_get_contents($file);
4711
  }
4712
 
4713
+ if ( !empty($args) && is_array($args) ) {
4714
+ foreach($args as $fieldname => $value ) {
4715
+ $contents = str_replace( '{'.$fieldname.'}', $value, $contents );
4716
+ }
4717
+ }
4718
+
4719
  return $contents;
4720
  }
4721
  } //class closure
4722
 
 
 
 
 
 
 
 
 
 
 
 
 
4723
  if (!function_exists('rsssl_ssl_enabled')) {
4724
  function rsssl_ssl_enabled() {
4725
  return RSSSL()->really_simple_ssl->ssl_enabled;
4729
  if (!function_exists('rsssl_ssl_detected')) {
4730
  function rsssl_ssl_detected() {
4731
 
 
 
 
 
4732
  if ( ! RSSSL()->really_simple_ssl->wpconfig_ok() ) {
4733
  return apply_filters('rsssl_ssl_detected', 'fail');
4734
  }
4735
 
4736
+ $valid = RSSSL()->rsssl_certificate->is_valid();
4737
+ if ( !$valid ) {
 
 
 
4738
  return apply_filters('rsssl_ssl_detected', 'no-ssl-detected');
4739
+ } else {
4740
+ $about_to_expire = RSSSL()->rsssl_certificate->about_to_expire();
4741
+ if ( !$about_to_expire ) {
4742
+ return apply_filters('rsssl_ssl_detected', 'ssl-detected');
4743
+ } else {
4744
+ return apply_filters('rsssl_ssl_detected', 'ssl-detected');
4745
+ // return apply_filters('rsssl_ssl_detected', 'about-to-expire');
4746
+ }
4747
+ }
4748
 
 
4749
  }
4750
  }
4751
 
4796
  }
4797
  }
4798
 
4799
+ if (!function_exists('rsssl_beta_5_addon_active')) {
4800
+ function rsssl_beta_5_addon_active() {
4801
+ if (defined('rsssl_beta_addon') && rsssl_beta_addon ) {
4802
+ return true;
4803
+ }
4804
+ return false;
4805
+ }
4806
+ }
4807
+
4808
  if (!function_exists('rsssl_ssl_activation_time_no_longer_then_3_days_ago')) {
4809
  function rsssl_ssl_activation_time_no_longer_then_3_days_ago() {
4810
 
4818
  }
4819
  }
4820
  }
4821
+
4822
+ if ( !function_exists('rsssl_letsencrypt_wizard_url') ) {
4823
+ function rsssl_letsencrypt_wizard_url(){
4824
+ if (is_multisite() && !is_main_site()) {
4825
+ return add_query_arg(array('page' => 'rlrsssl_really_simple_ssl', 'tab' => 'letsencrypt'), get_admin_url(get_main_site_id(),'options-general.php') );
4826
+ } else {
4827
+ return add_query_arg(array('page' => 'rlrsssl_really_simple_ssl', 'tab' => 'letsencrypt'), admin_url('options-general.php') );
4828
+ }
4829
+ }
4830
+ }
class-certificate.php CHANGED
@@ -34,7 +34,6 @@ if ( ! class_exists( 'rsssl_certificate' ) ) {
34
 
35
  public function is_valid()
36
  {
37
-
38
  //Get current domain
39
  $domain = site_url();
40
  //Parse to strip off any /subfolder/
@@ -82,23 +81,44 @@ if ( ! class_exists( 'rsssl_certificate' ) ) {
82
 
83
  public function is_domain_valid($certinfo, $domain)
84
  {
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
- //Get both the common name(s) and the alternative names from the certificate
87
- $certificate_common_names = isset($certinfo['subject']['CN']) ? $certinfo['subject']['CN'] : false;
88
- $certificate_alternative_names = isset($certinfo['extensions']['subjectAltName']) ? $certinfo['extensions']['subjectAltName'] : false;
89
-
90
- //Check if the domain is found in either the certificate common name(s) (CN) or alternative name(s) (AN)
91
-
92
- $pos_cn = strpos($certificate_common_names, $domain);
93
- $pos_an = strpos($certificate_alternative_names, $domain);
94
-
95
- //If the domain is found, return true
96
- if (($pos_cn !== false) || ($pos_an !== false)) return true;
 
 
 
 
 
 
97
 
98
  return false;
99
-
100
  }
101
 
 
 
 
 
102
  public function detection_failed(){
103
  $certinfo = get_transient('rsssl_certinfo');
104
  if ($certinfo && $certinfo === 'no-response' ) {
@@ -136,6 +156,38 @@ if ( ! class_exists( 'rsssl_certificate' ) ) {
136
  return false;
137
  }
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
 
140
  /**
141
  *
@@ -153,22 +205,24 @@ if ( ! class_exists( 'rsssl_certificate' ) ) {
153
  public function is_wildcard()
154
  {
155
  $domain = network_site_url();
156
-
157
  $certinfo = $this->get_certinfo($domain);
158
  //Get the certificate common name
159
  $certificate_common_name = isset($certinfo['subject']['CN']) ? $certinfo['subject']['CN'] : false;
160
-
161
- //A wildcard certificate is indicated by *, using this as our wildcard indicator
162
- $wildcard_indicator = "*";
163
 
164
  //Check if the common name(s) contain an *
165
- $pos = strpos($certificate_common_name, $wildcard_indicator);
166
-
167
- //If so, return true
168
- if ($pos !== false) return true;
169
 
 
 
 
 
 
 
 
170
  return false;
171
-
172
  }
173
 
174
  /**
@@ -184,17 +238,12 @@ if ( ! class_exists( 'rsssl_certificate' ) ) {
184
 
185
  public function get_certinfo( $url )
186
  {
187
- $certinfo = get_transient('rsssl_certinfo');
188
-
189
  //if the last check resulted in a "no response", we skip this check for a day.
190
  if ($certinfo === 'no-response') return false;
191
 
192
  if (!$certinfo || RSSSL()->really_simple_ssl->is_settings_page()) {
193
-
194
- $url = str_replace('https://', '', $url);
195
- $url = str_replace('http://', '', $url);
196
-
197
- $url = 'https://'.$url;
198
 
199
  $original_parse = parse_url($url, PHP_URL_HOST);
200
  if ($original_parse) {
@@ -247,6 +296,7 @@ if ( ! class_exists( 'rsssl_certificate' ) ) {
247
  return true;
248
  }
249
 
 
250
  //class closure
251
  }
252
  }
34
 
35
  public function is_valid()
36
  {
 
37
  //Get current domain
38
  $domain = site_url();
39
  //Parse to strip off any /subfolder/
81
 
82
  public function is_domain_valid($certinfo, $domain)
83
  {
84
+ //first check standard situation
85
+ //Get both the common name(s) and the alternative names from the certificate
86
+ $certificate_common_names = isset($certinfo['subject']['CN']) ? $certinfo['subject']['CN'] : false;
87
+ $certificate_alternative_names = isset($certinfo['extensions']['subjectAltName']) ? $certinfo['extensions']['subjectAltName'] : false;
88
+ //Check if the domain is found in either the certificate common name(s) (CN) or alternative name(s) (AN)
89
+ $pos_cn = strpos($certificate_common_names, $domain);
90
+ $pos_an = strpos($certificate_alternative_names, $domain);
91
+
92
+ //If the domain is found, return true
93
+ if (($pos_cn !== false) || ($pos_an !== false)) {
94
+ return true;
95
+ }
96
 
97
+ //if nothing found, we check for wildcard
98
+ //strip of asterisk, and check if the wildcard domain is part of current domain
99
+ $cert_domains = array();
100
+ if ( $this->is_wildcard() ) {
101
+ $certificate_alternative_names = isset($certinfo['extensions']['subjectAltName']) ? explode(', ',$certinfo['extensions']['subjectAltName']) : false;
102
+ $cert_domains[] = trim(str_replace('*', '', $certificate_common_names));
103
+ foreach ($certificate_alternative_names as $subjectAltName) {
104
+ $cert_domains[] = trim(str_replace('*', '', $subjectAltName));
105
+ }
106
+
107
+ foreach ($cert_domains as $cert_domain){
108
+ //If the wildcard domain is found, return true
109
+ if ( (strpos($domain, $cert_domain ) !== false) ) {
110
+ return true;
111
+ }
112
+ }
113
+ }
114
 
115
  return false;
 
116
  }
117
 
118
+ /**
119
+ * Check if detection failed
120
+ * @return bool
121
+ */
122
  public function detection_failed(){
123
  $certinfo = get_transient('rsssl_certinfo');
124
  if ($certinfo && $certinfo === 'no-response' ) {
156
  return false;
157
  }
158
 
159
+ public function expiry_date_nice(){
160
+ //refresh transient
161
+ $valid = RSSSL()->rsssl_certificate->is_valid();
162
+ $certinfo = get_transient('rsssl_certinfo');
163
+ $end_date = isset($certinfo['validTo_time_t']) ? $certinfo['validTo_time_t'] : false;
164
+ //if the certificate expires within the grace period, allow renewal
165
+ //e.g. expiry date 30 may, now = 10 may => grace period 9 june.
166
+ $expiry_date = !empty($end_date) ? date( get_option('date_format'), $end_date ) : false;
167
+ return $expiry_date;
168
+ }
169
+
170
+ /**
171
+ * Check if the certificate is valid, but about to expire.
172
+ * @return bool
173
+ */
174
+ public function about_to_expire(){
175
+ $valid = $this->is_valid();
176
+ //if not valid, it's already expired
177
+ if (!$valid) {
178
+ return true;
179
+ }
180
+
181
+ //we have now renewed the cert info transient
182
+ $certinfo = get_transient('rsssl_certinfo');
183
+ $end_date = isset($certinfo['validTo_time_t']) ? $certinfo['validTo_time_t'] : false;
184
+ $expiry_days_time = strtotime('+'.rsssl_le_manual_generation_renewal_check.' days');
185
+ if ( $expiry_days_time < $end_date ) {
186
+ return false;
187
+ } else {
188
+ return true;
189
+ }
190
+ }
191
 
192
  /**
193
  *
205
  public function is_wildcard()
206
  {
207
  $domain = network_site_url();
 
208
  $certinfo = $this->get_certinfo($domain);
209
  //Get the certificate common name
210
  $certificate_common_name = isset($certinfo['subject']['CN']) ? $certinfo['subject']['CN'] : false;
211
+ $subjectAltNames = isset($certinfo['extensions']['subjectAltName']) ? explode(', ',$certinfo['extensions']['subjectAltName']) : false;
 
 
212
 
213
  //Check if the common name(s) contain an *
214
+ if (strpos($certificate_common_name, '*')) {
215
+ return true;
216
+ }
 
217
 
218
+ if (is_array($subjectAltNames)) {
219
+ foreach ($subjectAltNames as $subjectAltName) {
220
+ if ( strpos($subjectAltName, '*') !== false ) {
221
+ return true;
222
+ }
223
+ }
224
+ }
225
  return false;
 
226
  }
227
 
228
  /**
238
 
239
  public function get_certinfo( $url )
240
  {
241
+ $certinfo = get_transient('rsssl_certinfo' );
 
242
  //if the last check resulted in a "no response", we skip this check for a day.
243
  if ($certinfo === 'no-response') return false;
244
 
245
  if (!$certinfo || RSSSL()->really_simple_ssl->is_settings_page()) {
246
+ $url = 'https://'.str_replace(array('https://', 'http://'), '', $url);
 
 
 
 
247
 
248
  $original_parse = parse_url($url, PHP_URL_HOST);
249
  if ($original_parse) {
296
  return true;
297
  }
298
 
299
+
300
  //class closure
301
  }
302
  }
class-multisite.php CHANGED
@@ -432,7 +432,7 @@ if (!class_exists('rsssl_multisite')) {
432
 
433
  <div class="nav-tab-wrapper">
434
  <div class="rsssl-logo-container">
435
- <div id="rsssl-logo"><img height="50px" src="<?php echo rsssl_url?>/assets/really-simple-ssl-logo.svg" alt="logo"></div>
436
  </div>
437
 
438
 
432
 
433
  <div class="nav-tab-wrapper">
434
  <div class="rsssl-logo-container">
435
+ <div id="rsssl-logo"><img src="<?php echo rsssl_url?>/assets/really-simple-ssl-logo.png" alt="logo"></div>
436
  </div>
437
 
438
 
grid/css/grid.css CHANGED
@@ -101,9 +101,6 @@
101
  border-radius: 20px;
102
  font-weight: 600;
103
  }
104
- .network-admin .rsssl-logo-container {
105
- height: 60px;
106
- }
107
  .rsssl-grid {
108
  width: calc(100% - 20px);
109
  margin: 10px;
101
  border-radius: 20px;
102
  font-weight: 600;
103
  }
 
 
 
104
  .rsssl-grid {
105
  width: calc(100% - 20px);
106
  margin: 10px;
grid/css/grid.css.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["grid.less"],"names":[],"mappings":"AAwBA,wCAAyC;AAAY,gCAAiC;EACpF,UAAA;;AADF,wCAAyC,WAEvC,mBACE;AAHiD,gCAAiC,WAEpF,mBACE;EACE,WAAA;;AAJN,wCAAyC,WAQvC;AARmD,gCAAiC,WAQpF;EACE,4BAAA;EACA,gBAAA;EACA,WAAA;EACA,mBAAA;EACA,gBAAA;EACA,mBAAA;EACA,SAAA;;AACA,wCAhBqC,WAQvC,SAQG;AAAD,gCAhBkF,WAQpF,SAQG;EACC,gCAAA;EACA,gBAAA;EACA,oBAAA;;AAKJ,mBAAqC;EAArC,wCAxBuC,WAyBrC;EADF,gCAxBoF,WAyBlF;IACE,aAAA;IACA,eAAA;IACA,uBAAA;;EAJJ,wCAxBuC,WAyBrC,iBAIE;EALJ,gCAxBoF,WAyBlF,iBAIE;IACE,iBAAA;;EANN,wCAxBuC,WAyBrC,iBAQE;EATJ,gCAxBoF,WAyBlF,iBAQE;IACE,aAAA;;;AAKN,mBAAqC;EAArC,wCAvCuC,WAwCrC,iBAEE;EAHJ,gCAvCoF,WAwClF,iBAEE;IACE,0BAAA;;EAJN,wCAvCuC,WAwCrC,iBAME;EAPJ,gCAvCoF,WAwClF,iBAME;IACE,oBAAA;;;AA/CR,wCAAyC,WAoDvC;AApDmD,gCAAiC,WAoDpF;EACE,gBAAA;EACA,sBAAA;EACA,aAAA;EACA,mBAAA;EACA,SAAA;;AAzDJ,wCAAyC,WA2DvC;AA3DmD,gCAAiC,WA2DpF;EACE,iBAAA;;AA5DJ,wCAAyC,WA2DvC,sBAEE;AA7DiD,gCAAiC,WA2DpF,sBAEE;EACE,YAAA;EACA,YAAA;;AA/DN,wCAAyC,WA2DvC,sBAEE,YAGE;AAhE+C,gCAAiC,WA2DpF,sBAEE,YAGE;EACE,YAAA;;AAjER,wCAAyC,WAqEvC;AArEmD,gCAAiC,WAqEpF;EACE,aAAA;EACA,OAAA;EACA,yBAAA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;;AA3EJ,wCAAyC,WAqEvC,cAOE;AA5EiD,gCAAiC,WAqEpF,cAOE;EACE,0BAAA;;AA7EN,wCAAyC,WAqEvC,cAUE,eACE;AAhF+C,gCAAiC,WAqEpF,cAUE,eACE;EACE,iBAAA;;AAjFR,wCAAyC,WAqEvC,cAUE,eAIE;AAnF+C,gCAAiC,WAqEpF,cAUE,eAIE;EACE,qBAAA;;AApFR,wCAAyC,WAqEvC,cAUE,eAOE;AAtF+C,gCAAiC,WAqEpF,cAUE,eAOE;EACE,YAAA;EACA,uBAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,gBAAA;;AAMR,cACE;EACE,YAAA;;AAKJ;EACE,OAAO,iBAAP;EACA,YAAA;EACA,kBAAA;EACA,aAAA;EACA,mBAAA;EACA,eAAA;;;;;;;;AANF,WAQE;EACI,yBAAA;EACA,YAAA;EACA,SAAA;;AAXN,WAcE;EACE,YAAA;;AAfJ,WAkBE,gBAEE;EACE,aAAA;EACA,gBAAA;;AAtBN,WAkBE,gBAOE;EACE,0BAAA;;AA1BN,WAkBE,gBAWE;AA7BJ,WAkBE,gBAWoB;EAChB,aAAA;;AA9BN,WAkBE,gBAeE;EACE,kCAAA;EACA,gBAAA;;AACA,WAlBJ,gBAeE,uBAGG;EACC,qBAAA;EACA,gBAAA;EACA,cAAA;;AAvCR,WAkBE,gBA0BE;EACE,0BAAA;EACA,gBAAA;;AA9CN,WAmDE;EACE,YAAA;EAWA,aAAA;EACA,UAAA;;AAXA,WAFF,YAEG;EACC,YAAA;;AAtDN,WAmDE,YAME;EACE,WAAA;EACA,gBAAA;EACA,kBAAA;;AA5DN,WAmDE,YAcE;EAgDE,sBAAA;EACA,kBAAA;EACA,oDAAA;EACA,YAAA;EACA,aAAA;;AArHN,WAmDE,YAcE,gBACI;EACE,aAAA;;AAnEV,WAmDE,YAcE,gBACI,YAEE;EACE,aAAA;EACA,sBAAA;EACA,eAAA;EACA,iBAAA;EACA,sBAAA;;AAzEZ,WAmDE,YAcE,gBACI,YAEE,MAME;EACE,2BAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;EACA,UAAA;;AA/Ed,WAmDE,YAcE,gBACI,YAEE,MAME,GAOE;EACE,UAAA;EACA,SAAA;;AAnFhB,WAmDE,YAcE,gBACI,YAEE,MAME,GAWE;EAIE,cAAA;EACA,UAAA;EACA,aAAA;EACA,mBAAA;EACA,eAAA;EACA,mBAAA;;AA9FhB,WAmDE,YAcE,gBACI,YAEE,MAME,GAWE,GACE;EACE,eAAA;;AAvFlB,WAmDE,YAcE,gBACI,YAEE,MAME,GAWE,GAUE;EACE,mBAAA;EACA,gBAAA;;AAjGlB,WAmDE,YAcE,gBACI,YAEE,MAME,GA0BE;AApGd,WAmDE,YAcE,gBACI,YAEE,MAME,GA0BM;EAEF,yBAAA;EACA,eAAA;;AAvGhB,WAmDE,YAcE,gBACI,YAEE,MAME,GA0BE,GAIE;AAxGhB,WAmDE,YAcE,gBACI,YAEE,MAME,GA0BM,GAIF;EAAG,eAAA;;AAxGnB,WAmDE,YAcE,gBA4CE;EACE,aAAA;;AA9GR,WAmDE,YAcE,gBAqDE;EACE,kBAAA;EACA,cAAA;;AAxHR,WAmDE,YAcE,gBAyDE;EACE,aAAA;EACA,mBAAA;EACA,8BAAA;EACA,YAAA;EACA,gCAAA;EACA,sBAAA;;AAhIR,WAmDE,YAcE,gBAyDE,wBAOE,oBAAoB;EAClB,cAAA;;AAlIV,WAmDE,YAcE,gBAyDE,wBAWE;EACE,aAAA;EACA,cAAA;;AAvIV,WAmDE,YAcE,gBAyDE,wBAWE,6BAGE;AAxIV,WAmDE,YAcE,gBAyDE,wBAWE,6BAGmB;EACf,iBAAA;EACA,gBAAA;;AA1IZ,WAmDE,YAcE,gBAyDE,wBAWE,6BAOE;EACE,iBAAA;;AA7IZ,WAmDE,YAcE,gBAiFE;EACE,kBAAA;;AAnJR,WAmDE,YAcE,gBAqFE;EACE,aAAA;EACA,2BAAA;EACA,gCAAA;;;;;;;;;;;;;;;;;;;;AAzJR,WAmDE,YAcE,gBAqFE,yBASE;EACE,iBAAA;;AAhKV,WAmDE,YAcE,gBAqFE,yBASE,sBAGE;EACE,kBAAA;;AAnKZ,WAmDE,YAcE,gBAqFE,yBASE,sBAOE;EACE,gBAAA;EACA,YAAA;EACA,kBAAA;EACA,yBAAA;;AA1KZ,WAmDE,YAcE,gBAqFE,yBASE,sBAcE,UAAU;EACR,YAAA;EACA,yBAAA;;AA/KZ,WAmDE,YAcE,gBAqFE,yBASE,sBAoBE;EACE,aAAA;EACA,mBAAA;EACA,cAAA;EACA,iBAAA;EACA,oBAAA;;AAxLZ,WAmDE,YAcE,gBAqFE,yBASE,sBAoBE,eAOE;EACE,eAAA;EACA,gBAAA;;AA5Ld,WAmDE,YAcE,gBAqFE,yBASE,sBAoBE,eAYE;EACE,iBAAA;EACA,eAAA;EACA,gBAAA;;AAlMd,WAmDE,YAcE,gBAqFE,yBASE,sBAoBE,eAYE,qBAIE;EACE,gBAAA;;AApMhB,WAmDE,YAcE,gBAqFE,yBASE,sBA0CE,sBACE;EACE,yBAAA;;AA3Md,WAmDE,YAcE,gBAqFE,yBASE,sBA0CE,sBAIE,GAAG;EAAK,kBAAA;;AA7MpB,WAmDE,YAcE,gBAqFE,yBA8DE;EACI,cAAA;EACA,oBAAA;;AAtNZ,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI;EACE,aAAA;EACA,sBAAA;EACA,kBAAA;EACA,aAAA;;AA3Nd,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI,qBAKE;EACE,YAAA;;AA7NhB,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI,qBAKE,iBAGE;EACE,gBAAA;EACA,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,8BAAA;;AApOlB,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI,qBAKE,iBAUE;EACE,mBAAA;;AAvOlB,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI,qBAmBE;EACE,cAAA;;AA3OhB,WAmDE,YAcE,gBAqFE,yBA8DE,mBA4BE,6BAA6B;EAC3B,qBAAA;EACA,mBAAA;;AAlPZ,WAmDE,YAcE,gBAqFE,yBAoGE;EACE,YAAA;EACA,WAAA;EACA,kBAAA;EACA,kBAAA;EACA,2BAAA;EACA,qBAAA;;AAhQV,WAmDE,YAcE,gBAqFE,yBAiHE;EACE,aAAA;EACA,eAAA;EACA,mBAAA;;AA1QV,WAmDE,YAcE,gBAqFE,yBAiHE,gCAIE;EACE,aAAA;EACA,UAAA;;AA7QZ,WAmDE,YAcE,gBAqFE,yBAiHE,gCAIE,sBAGE;EACE,qBAAA;EACA,cAAA;EACA,aAAA;EACA,mBAAA;EACA,cAAA;;AAnRd,WAmDE,YAcE,gBAqFE,yBAiHE,gCAIE,sBAWE;EACE,qBAAA;EACA,2BAAA;EACA,WAAA;;AACA,WAvOZ,YAcE,gBAqFE,yBAiHE,gCAIE,sBAWE,cAIG;EACC,yBAAA;;AA3RhB,WAmDE,YAcE,gBAqFE,yBAiHE,gCAIE,sBAoBE;EACE,WAAA;EACA,cAAA;;AACA,WA/OZ,YAcE,gBAqFE,yBAiHE,gCAIE,sBAoBE,sBAGG;EACG,0BAAA;;AAnSlB,WAmDE,YAcE,gBAqFE,yBAmJE;EACE,cAAA;;AA1SV,WAmDE,YAcE,gBAqFE,yBA2JI;EACE,wBAAA;EACA,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,cAAA;;AAtTZ,WAmDE,YAcE,gBAqFE,yBA2JI,cAOE,aACE;EACE,qBAAA;EACA,cAAA;;AACA,WAzQd,YAcE,gBAqFE,yBA2JI,cAOE,aACE,EAGG;EACC,cAAA;;AA7TlB,WAmDE,YAcE,gBAqFE,yBA2JI,cAiBE;EACE,iBAAA;;AAnUd,WAmDE,YAcE,gBAqFE,yBA2JI,cAqBE;EACE,yBAAA;;AAvUd,WAmDE,YAcE,gBAqFE,yBA2JI,cAwBE;EACE,sBAAA;;AA1Ud,WAmDE,YAcE,gBAqFE,yBA2JI,cA4BE;EACE,yBAAA;;AA9Ud,WAmDE,YAcE,gBAqFE,yBA2JI,cAgCE;EACE,yBAAA;;AAlVd,WAmDE,YAcE,gBAqFE,yBA2JI,cAoCE;EACE,iBAAA;;AAtVd,WAmDE,YAcE,gBAqFE,yBAuME;EACE,cAAA;EACA,eAAA;EACA,kBAAA;EACA,mBAAA;EACA,wBAAA;EACA,gBAAA;EACA,gBAAA;EACA,YAAA;EACA,iBAAA;;AAtWV,WAmDE,YAcE,gBAqFE,yBAmNE;EACE,yBAAA;EACA,YAAA;;AA3WV,WAmDE,YAcE,gBAqFE,yBAuNE;EACE,yBAAA;EACA,YAAA;;AA/WV,WAmDE,YAcE,gBAqFE,yBA4NE;EACE,yBAAA;;AAnXV,WAmDE,YAcE,gBAqFE,yBAgOE;EACE,yBAAA;EACA,YAAA;;AAxXV,WAmDE,YAcE,gBA0TE;EACE,aAAA;EACA,mBAAA;EACA,wBAAA;EACA,YAAA;EACA,SAAA;EACA,UAAA;;AAjYR,WAmDE,YAcE,gBA0TE,wBAOE;EACE,kBAAA;;AAnYV,WAmDE,YAcE,gBA0TE,wBAUE;EACE,gBAAA;EACA,cAAA;EACA,kBAAA;;AAxYV,WAmDE,YAcE,gBA0UE,2BACE;AA5YR,WAmDE,YAcE,gBA0UE,2BACM;EACF,aAAA;;AAIN,WA9VF,YA8VG;EACC,eAAA;;AADF,WA9VF,YA8VG,YAGC;EACE,eAAA;;AAJJ,WA9VF,YA8VG,YAGC,gBAEE;EACE,aAAA;;AANN,WA9VF,YA8VG,YAGC,gBAEE,yBAEE,YAAY,MACV;AARR,WA9VF,YA8VG,YAGC,gBAEE,yBAEE,YAAY,MACN;EACF,WAAA;EACA,eAAA;;AAOV,WA/WF,YA+WG,MACC;EACE,YAAA;;AAFJ,WA/WF,YA+WG,MACC,gBAEE;EACE,qBAAA;;AAJN,WA/WF,YA+WG,MACC,gBAKE,YAAY,MAAM;EAChB,WAAA;;AAIN,WA1XF,YA0XG,UACC;EACE,YAAA;;AAGJ,WA/XF,YA+XG,cACC;EACE,yBAAA;;AApbR,WA4bE;EACE,WAAA;EACA,iBAAA;EACA,kBAAA;;AA/bJ,WA4bE,uBAIE,mBACE;EACE,WAAA;;AAlcR,WA4bE,uBASE,mBAAmB;EACjB,iBAAA;EACA,cAAA;;AAvcN,WA4bE,uBAcE;EACE,WAAA;;AA3cN,WA4bE,uBAcE,aAEE;EACE,eAAA;EACA,kBAAA;;AA9cR,WA4bE,uBAsBE;EACE,YAAA;;AAndN,WA4bE,uBAyBE;EACE,aAAA;;AAtdN,WA0dE;EACE,kBAAA;EACA,WAAA;EACA,iBAAA;;AA7dJ,WA0dE,iCAIE;EACE,gBAAA;;AA/dN,WAseE;EACE,YAAA;EACA,WAAA;EACA,kBAAA;EACA,qBAAA;;AA1eJ,WA4eE;EACE,yBAAA;;AA7eJ,WA+eE;EACE,yBAAA;;AAIJ,sBACE,6BACE;EACE,YAAA;EACA,gBAAA;;AAMN;EACI,kBAAA;;AADJ,WAEI;EACI,OAAO,iBAAP;EACA,aAAA;EACA,aAAA;EACA,iBAAA;EACA,UAAA;;AACA,wBAA8C;EAA9C,WANJ;IAOQ,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAVJ;IAWQ,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAdJ;IAeQ,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAlBJ;IAmBQ,OAAO,iBAAP;;;AAGJ,wBAA8C;EAA9C,WAtBJ;IAuBQ,OAAO,gBAAP;;;AAIJ,WA3BJ,YA2BK;EACG,OAAO,iBAAP;;AAEA,wBAA8C;EAA9C,WA9BR,YA2BK;IAIO,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAlCR,YA2BK;IAQO,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAtCR,YA2BK;IAYO,OAAO,gBAAP;;;AAGJ,wBAA6C;EAA7C,WA1CR,YA2BK;IAgBO,OAAO,gBAAP;;;AAGJ,wBAA8C;EAA9C,WA9CR,YA2BK;IAoBO,OAAO,gBAAP;;;AApBR,WA3BJ,YA2BK,MAsBG;EACI,WAAA;EACA,gBAAA;;AAKR,WAxDJ,YAwDK;EACO,iBAAA;;AACC,wBAA8C;EAA9C,WA1Db,YAwDK;IAGW,eAAA;IACA,iBAAA;;;AAGJ,wBAA6C;EAA7C,WA/DZ,YAwDK;IAQW,iBAAA;IACA,eAAA;;;AAGJ,wBAA6C;EAA7C,WApEZ,YAwDK;IAaW,iBAAA;IACA,eAAA;;;AAGJ,wBAA6C;EAA7C,WAzEZ,YAwDK;IAkBW,iBAAA;IACA,eAAA;;;AAGJ,wBAA8C;EAA9C,WA9EZ,YAwDK;IAuBW,iBAAA;IACA,eAAA;;;AAxBZ,WAxDJ,YAwDK,YA2BG;EACI,WAAA;EACA,gBAAA;EACA,iBAAA;;AAxFhB,WAEI,YAyFI,UAAS;EACP,WAAA;EACA,UAAA;;AAGF,WA9FJ,YA8FK;EACG,UAAA;;AAEJ,WAjGJ,YAiGK;EACG,UAAA;;AAEJ,WApGJ,YAoGK;EACG,UAAA;;AAvGZ,WAEI,YAuGI;EACA,kCAAA;EACI,UAAA;EACA,YAAA;;AA5GZ,WAEI,YAuGI,mBAID;EACS,cAAA;EACA,YAAA;;AA/GhB,WAEI,YAuGI,mBAUI;EACI,eAAA;EACA,eAAA;EACA,eAAA;EACA,iBAAA;EACA,WAAA;;AAxHhB,WAEI,YAuGI,mBAiBI;EACI,YAAA;EACA,gBAAA;EACN,cAAA;;AA7HV,WAEI,YA8HI;EACI,sBAAA;EACA,kBAAA;EACA,gDAAA;EACA,YAAA;EACA,WAAA;;AArIZ,WAEI,YA8HI,gBAOI;EACI,WAAA;EACA,YAAA;EACA,QAAQ,kBAAR;EACA,gBAAA;EACA,oBAAA;;AAKR,WA/IJ,YA+IK,UACG;EACI,YAAA;;AAGR,WApJJ,YAoJK,cACG;EACI,yBAAA;;AAIR,WA1JJ,YA0JK,uBAAwB;EACrB,oBAAA;EACA,UAAA","file":"grid.css"}
1
+ {"version":3,"sources":["grid.less"],"names":[],"mappings":"AAwBA,wCAAyC;AAAY,gCAAiC;EACpF,UAAA;;AADF,wCAAyC,WAEvC,mBACE;AAHiD,gCAAiC,WAEpF,mBACE;EACE,WAAA;;AAJN,wCAAyC,WAQvC;AARmD,gCAAiC,WAQpF;EACE,4BAAA;EACA,gBAAA;EACA,WAAA;EACA,mBAAA;EACA,gBAAA;EACA,mBAAA;EACA,SAAA;;AACA,wCAhBqC,WAQvC,SAQG;AAAD,gCAhBkF,WAQpF,SAQG;EACC,gCAAA;EACA,gBAAA;EACA,oBAAA;;AAKJ,mBAAqC;EAArC,wCAxBuC,WAyBrC;EADF,gCAxBoF,WAyBlF;IACE,aAAA;IACA,eAAA;IACA,uBAAA;;EAJJ,wCAxBuC,WAyBrC,iBAIE;EALJ,gCAxBoF,WAyBlF,iBAIE;IACE,iBAAA;;EANN,wCAxBuC,WAyBrC,iBAQE;EATJ,gCAxBoF,WAyBlF,iBAQE;IACE,aAAA;;;AAKN,mBAAqC;EAArC,wCAvCuC,WAwCrC,iBAEE;EAHJ,gCAvCoF,WAwClF,iBAEE;IACE,0BAAA;;EAJN,wCAvCuC,WAwCrC,iBAME;EAPJ,gCAvCoF,WAwClF,iBAME;IACE,oBAAA;;;AA/CR,wCAAyC,WAoDvC;AApDmD,gCAAiC,WAoDpF;EACE,gBAAA;EACA,sBAAA;EACA,aAAA;EACA,mBAAA;EACA,SAAA;;AAzDJ,wCAAyC,WA2DvC;AA3DmD,gCAAiC,WA2DpF;EACE,iBAAA;;AA5DJ,wCAAyC,WA2DvC,sBAEE;AA7DiD,gCAAiC,WA2DpF,sBAEE;EACE,YAAA;EACA,YAAA;;AA/DN,wCAAyC,WA2DvC,sBAEE,YAGE;AAhE+C,gCAAiC,WA2DpF,sBAEE,YAGE;EACE,YAAA;;AAjER,wCAAyC,WAqEvC;AArEmD,gCAAiC,WAqEpF;EACE,aAAA;EACA,OAAA;EACA,yBAAA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;;AA3EJ,wCAAyC,WAqEvC,cAOE;AA5EiD,gCAAiC,WAqEpF,cAOE;EACE,0BAAA;;AA7EN,wCAAyC,WAqEvC,cAUE,eACE;AAhF+C,gCAAiC,WAqEpF,cAUE,eACE;EACE,iBAAA;;AAjFR,wCAAyC,WAqEvC,cAUE,eAIE;AAnF+C,gCAAiC,WAqEpF,cAUE,eAIE;EACE,qBAAA;;AApFR,wCAAyC,WAqEvC,cAUE,eAOE;AAtF+C,gCAAiC,WAqEpF,cAUE,eAOE;EACE,YAAA;EACA,uBAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,gBAAA;;AAMR;EACE,OAAO,iBAAP;EACA,YAAA;EACA,kBAAA;EACA,aAAA;EACA,mBAAA;EACA,eAAA;;;;;;;;AANF,WAQE;EACI,yBAAA;EACA,YAAA;EACA,SAAA;;AAXN,WAcE;EACE,YAAA;;AAfJ,WAkBE,gBAEE;EACE,aAAA;EACA,gBAAA;;AAtBN,WAkBE,gBAOE;EACE,0BAAA;;AA1BN,WAkBE,gBAWE;AA7BJ,WAkBE,gBAWoB;EAChB,aAAA;;AA9BN,WAkBE,gBAeE;EACE,kCAAA;EACA,gBAAA;;AACA,WAlBJ,gBAeE,uBAGG;EACC,qBAAA;EACA,gBAAA;EACA,cAAA;;AAvCR,WAkBE,gBA0BE;EACE,0BAAA;EACA,gBAAA;;AA9CN,WAmDE;EACE,YAAA;EAWA,aAAA;EACA,UAAA;;AAXA,WAFF,YAEG;EACC,YAAA;;AAtDN,WAmDE,YAME;EACE,WAAA;EACA,gBAAA;EACA,kBAAA;;AA5DN,WAmDE,YAcE;EAgDE,sBAAA;EACA,kBAAA;EACA,oDAAA;EACA,YAAA;EACA,aAAA;;AArHN,WAmDE,YAcE,gBACI;EACE,aAAA;;AAnEV,WAmDE,YAcE,gBACI,YAEE;EACE,aAAA;EACA,sBAAA;EACA,eAAA;EACA,iBAAA;EACA,sBAAA;;AAzEZ,WAmDE,YAcE,gBACI,YAEE,MAME;EACE,2BAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;EACA,UAAA;;AA/Ed,WAmDE,YAcE,gBACI,YAEE,MAME,GAOE;EACE,UAAA;EACA,SAAA;;AAnFhB,WAmDE,YAcE,gBACI,YAEE,MAME,GAWE;EAIE,cAAA;EACA,UAAA;EACA,aAAA;EACA,mBAAA;EACA,eAAA;EACA,mBAAA;;AA9FhB,WAmDE,YAcE,gBACI,YAEE,MAME,GAWE,GACE;EACE,eAAA;;AAvFlB,WAmDE,YAcE,gBACI,YAEE,MAME,GAWE,GAUE;EACE,mBAAA;EACA,gBAAA;;AAjGlB,WAmDE,YAcE,gBACI,YAEE,MAME,GA0BE;AApGd,WAmDE,YAcE,gBACI,YAEE,MAME,GA0BM;EAEF,yBAAA;EACA,eAAA;;AAvGhB,WAmDE,YAcE,gBACI,YAEE,MAME,GA0BE,GAIE;AAxGhB,WAmDE,YAcE,gBACI,YAEE,MAME,GA0BM,GAIF;EAAG,eAAA;;AAxGnB,WAmDE,YAcE,gBA4CE;EACE,aAAA;;AA9GR,WAmDE,YAcE,gBAqDE;EACE,kBAAA;EACA,cAAA;;AAxHR,WAmDE,YAcE,gBAyDE;EACE,aAAA;EACA,mBAAA;EACA,8BAAA;EACA,YAAA;EACA,gCAAA;EACA,sBAAA;;AAhIR,WAmDE,YAcE,gBAyDE,wBAOE,oBAAoB;EAClB,cAAA;;AAlIV,WAmDE,YAcE,gBAyDE,wBAWE;EACE,aAAA;EACA,cAAA;;AAvIV,WAmDE,YAcE,gBAyDE,wBAWE,6BAGE;AAxIV,WAmDE,YAcE,gBAyDE,wBAWE,6BAGmB;EACf,iBAAA;EACA,gBAAA;;AA1IZ,WAmDE,YAcE,gBAyDE,wBAWE,6BAOE;EACE,iBAAA;;AA7IZ,WAmDE,YAcE,gBAiFE;EACE,kBAAA;;AAnJR,WAmDE,YAcE,gBAqFE;EACE,aAAA;EACA,2BAAA;EACA,gCAAA;;;;;;;;;;;;;;;;;;;;AAzJR,WAmDE,YAcE,gBAqFE,yBASE;EACE,iBAAA;;AAhKV,WAmDE,YAcE,gBAqFE,yBASE,sBAGE;EACE,kBAAA;;AAnKZ,WAmDE,YAcE,gBAqFE,yBASE,sBAOE;EACE,gBAAA;EACA,YAAA;EACA,kBAAA;EACA,yBAAA;;AA1KZ,WAmDE,YAcE,gBAqFE,yBASE,sBAcE,UAAU;EACR,YAAA;EACA,yBAAA;;AA/KZ,WAmDE,YAcE,gBAqFE,yBASE,sBAoBE;EACE,aAAA;EACA,mBAAA;EACA,cAAA;EACA,iBAAA;EACA,oBAAA;;AAxLZ,WAmDE,YAcE,gBAqFE,yBASE,sBAoBE,eAOE;EACE,eAAA;EACA,gBAAA;;AA5Ld,WAmDE,YAcE,gBAqFE,yBASE,sBAoBE,eAYE;EACE,iBAAA;EACA,eAAA;EACA,gBAAA;;AAlMd,WAmDE,YAcE,gBAqFE,yBASE,sBAoBE,eAYE,qBAIE;EACE,gBAAA;;AApMhB,WAmDE,YAcE,gBAqFE,yBASE,sBA0CE,sBACE;EACE,yBAAA;;AA3Md,WAmDE,YAcE,gBAqFE,yBASE,sBA0CE,sBAIE,GAAG;EAAK,kBAAA;;AA7MpB,WAmDE,YAcE,gBAqFE,yBA8DE;EACI,cAAA;EACA,oBAAA;;AAtNZ,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI;EACE,aAAA;EACA,sBAAA;EACA,kBAAA;EACA,aAAA;;AA3Nd,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI,qBAKE;EACE,YAAA;;AA7NhB,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI,qBAKE,iBAGE;EACE,gBAAA;EACA,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,8BAAA;;AApOlB,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI,qBAKE,iBAUE;EACE,mBAAA;;AAvOlB,WAmDE,YAcE,gBAqFE,yBA8DE,mBAGI,qBAmBE;EACE,cAAA;;AA3OhB,WAmDE,YAcE,gBAqFE,yBA8DE,mBA4BE,6BAA6B;EAC3B,qBAAA;EACA,mBAAA;;AAlPZ,WAmDE,YAcE,gBAqFE,yBAoGE;EACE,YAAA;EACA,WAAA;EACA,kBAAA;EACA,kBAAA;EACA,2BAAA;EACA,qBAAA;;AAhQV,WAmDE,YAcE,gBAqFE,yBAiHE;EACE,aAAA;EACA,eAAA;EACA,mBAAA;;AA1QV,WAmDE,YAcE,gBAqFE,yBAiHE,gCAIE;EACE,aAAA;EACA,UAAA;;AA7QZ,WAmDE,YAcE,gBAqFE,yBAiHE,gCAIE,sBAGE;EACE,qBAAA;EACA,cAAA;EACA,aAAA;EACA,mBAAA;EACA,cAAA;;AAnRd,WAmDE,YAcE,gBAqFE,yBAiHE,gCAIE,sBAWE;EACE,qBAAA;EACA,2BAAA;EACA,WAAA;;AACA,WAvOZ,YAcE,gBAqFE,yBAiHE,gCAIE,sBAWE,cAIG;EACC,yBAAA;;AA3RhB,WAmDE,YAcE,gBAqFE,yBAiHE,gCAIE,sBAoBE;EACE,WAAA;EACA,cAAA;;AACA,WA/OZ,YAcE,gBAqFE,yBAiHE,gCAIE,sBAoBE,sBAGG;EACG,0BAAA;;AAnSlB,WAmDE,YAcE,gBAqFE,yBAmJE;EACE,cAAA;;AA1SV,WAmDE,YAcE,gBAqFE,yBA2JI;EACE,wBAAA;EACA,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,cAAA;;AAtTZ,WAmDE,YAcE,gBAqFE,yBA2JI,cAOE,aACE;EACE,qBAAA;EACA,cAAA;;AACA,WAzQd,YAcE,gBAqFE,yBA2JI,cAOE,aACE,EAGG;EACC,cAAA;;AA7TlB,WAmDE,YAcE,gBAqFE,yBA2JI,cAiBE;EACE,iBAAA;;AAnUd,WAmDE,YAcE,gBAqFE,yBA2JI,cAqBE;EACE,yBAAA;;AAvUd,WAmDE,YAcE,gBAqFE,yBA2JI,cAwBE;EACE,sBAAA;;AA1Ud,WAmDE,YAcE,gBAqFE,yBA2JI,cA4BE;EACE,yBAAA;;AA9Ud,WAmDE,YAcE,gBAqFE,yBA2JI,cAgCE;EACE,yBAAA;;AAlVd,WAmDE,YAcE,gBAqFE,yBA2JI,cAoCE;EACE,iBAAA;;AAtVd,WAmDE,YAcE,gBAqFE,yBAuME;EACE,cAAA;EACA,eAAA;EACA,kBAAA;EACA,mBAAA;EACA,wBAAA;EACA,gBAAA;EACA,gBAAA;EACA,YAAA;EACA,iBAAA;;AAtWV,WAmDE,YAcE,gBAqFE,yBAmNE;EACE,yBAAA;EACA,YAAA;;AA3WV,WAmDE,YAcE,gBAqFE,yBAuNE;EACE,yBAAA;EACA,YAAA;;AA/WV,WAmDE,YAcE,gBAqFE,yBA4NE;EACE,yBAAA;;AAnXV,WAmDE,YAcE,gBAqFE,yBAgOE;EACE,yBAAA;EACA,YAAA;;AAxXV,WAmDE,YAcE,gBA0TE;EACE,aAAA;EACA,mBAAA;EACA,wBAAA;EACA,YAAA;EACA,SAAA;EACA,UAAA;;AAjYR,WAmDE,YAcE,gBA0TE,wBAOE;EACE,kBAAA;;AAnYV,WAmDE,YAcE,gBA0TE,wBAUE;EACE,gBAAA;EACA,cAAA;EACA,kBAAA;;AAxYV,WAmDE,YAcE,gBA0UE,2BACE;AA5YR,WAmDE,YAcE,gBA0UE,2BACM;EACF,aAAA;;AAIN,WA9VF,YA8VG;EACC,eAAA;;AADF,WA9VF,YA8VG,YAGC;EACE,eAAA;;AAJJ,WA9VF,YA8VG,YAGC,gBAEE;EACE,aAAA;;AANN,WA9VF,YA8VG,YAGC,gBAEE,yBAEE,YAAY,MACV;AARR,WA9VF,YA8VG,YAGC,gBAEE,yBAEE,YAAY,MACN;EACF,WAAA;EACA,eAAA;;AAOV,WA/WF,YA+WG,MACC;EACE,YAAA;;AAFJ,WA/WF,YA+WG,MACC,gBAEE;EACE,qBAAA;;AAJN,WA/WF,YA+WG,MACC,gBAKE,YAAY,MAAM;EAChB,WAAA;;AAIN,WA1XF,YA0XG,UACC;EACE,YAAA;;AAGJ,WA/XF,YA+XG,cACC;EACE,yBAAA;;AApbR,WA4bE;EACE,WAAA;EACA,iBAAA;EACA,kBAAA;;AA/bJ,WA4bE,uBAIE,mBACE;EACE,WAAA;;AAlcR,WA4bE,uBASE,mBAAmB;EACjB,iBAAA;EACA,cAAA;;AAvcN,WA4bE,uBAcE;EACE,WAAA;;AA3cN,WA4bE,uBAcE,aAEE;EACE,eAAA;EACA,kBAAA;;AA9cR,WA4bE,uBAsBE;EACE,YAAA;;AAndN,WA4bE,uBAyBE;EACE,aAAA;;AAtdN,WA0dE;EACE,kBAAA;EACA,WAAA;EACA,iBAAA;;AA7dJ,WA0dE,iCAIE;EACE,gBAAA;;AA/dN,WAseE;EACE,YAAA;EACA,WAAA;EACA,kBAAA;EACA,qBAAA;;AA1eJ,WA4eE;EACE,yBAAA;;AA7eJ,WA+eE;EACE,yBAAA;;AAIJ,sBACE,6BACE;EACE,YAAA;EACA,gBAAA;;AAMN;EACI,kBAAA;;AADJ,WAEI;EACI,OAAO,iBAAP;EACA,aAAA;EACA,aAAA;EACA,iBAAA;EACA,UAAA;;AACA,wBAA8C;EAA9C,WANJ;IAOQ,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAVJ;IAWQ,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAdJ;IAeQ,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAlBJ;IAmBQ,OAAO,iBAAP;;;AAGJ,wBAA8C;EAA9C,WAtBJ;IAuBQ,OAAO,gBAAP;;;AAIJ,WA3BJ,YA2BK;EACG,OAAO,iBAAP;;AAEA,wBAA8C;EAA9C,WA9BR,YA2BK;IAIO,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAlCR,YA2BK;IAQO,OAAO,iBAAP;;;AAGJ,wBAA6C;EAA7C,WAtCR,YA2BK;IAYO,OAAO,gBAAP;;;AAGJ,wBAA6C;EAA7C,WA1CR,YA2BK;IAgBO,OAAO,gBAAP;;;AAGJ,wBAA8C;EAA9C,WA9CR,YA2BK;IAoBO,OAAO,gBAAP;;;AApBR,WA3BJ,YA2BK,MAsBG;EACI,WAAA;EACA,gBAAA;;AAKR,WAxDJ,YAwDK;EACO,iBAAA;;AACC,wBAA8C;EAA9C,WA1Db,YAwDK;IAGW,eAAA;IACA,iBAAA;;;AAGJ,wBAA6C;EAA7C,WA/DZ,YAwDK;IAQW,iBAAA;IACA,eAAA;;;AAGJ,wBAA6C;EAA7C,WApEZ,YAwDK;IAaW,iBAAA;IACA,eAAA;;;AAGJ,wBAA6C;EAA7C,WAzEZ,YAwDK;IAkBW,iBAAA;IACA,eAAA;;;AAGJ,wBAA8C;EAA9C,WA9EZ,YAwDK;IAuBW,iBAAA;IACA,eAAA;;;AAxBZ,WAxDJ,YAwDK,YA2BG;EACI,WAAA;EACA,gBAAA;EACA,iBAAA;;AAxFhB,WAEI,YAyFI,UAAS;EACP,WAAA;EACA,UAAA;;AAGF,WA9FJ,YA8FK;EACG,UAAA;;AAEJ,WAjGJ,YAiGK;EACG,UAAA;;AAEJ,WApGJ,YAoGK;EACG,UAAA;;AAvGZ,WAEI,YAuGI;EACA,kCAAA;EACI,UAAA;EACA,YAAA;;AA5GZ,WAEI,YAuGI,mBAID;EACS,cAAA;EACA,YAAA;;AA/GhB,WAEI,YAuGI,mBAUI;EACI,eAAA;EACA,eAAA;EACA,eAAA;EACA,iBAAA;EACA,WAAA;;AAxHhB,WAEI,YAuGI,mBAiBI;EACI,YAAA;EACA,gBAAA;EACN,cAAA;;AA7HV,WAEI,YA8HI;EACI,sBAAA;EACA,kBAAA;EACA,gDAAA;EACA,YAAA;EACA,WAAA;;AArIZ,WAEI,YA8HI,gBAOI;EACI,WAAA;EACA,YAAA;EACA,QAAQ,kBAAR;EACA,gBAAA;EACA,oBAAA;;AAKR,WA/IJ,YA+IK,UACG;EACI,YAAA;;AAGR,WApJJ,YAoJK,cACG;EACI,yBAAA;;AAIR,WA1JJ,YA0JK,uBAAwB;EACrB,oBAAA;EACA,UAAA","file":"grid.css"}
grid/css/grid.less CHANGED
@@ -122,13 +122,6 @@
122
  }
123
  }
124
 
125
- .network-admin {
126
- .rsssl-logo-container {
127
- height:60px;
128
- }
129
- }
130
-
131
-
132
  .rsssl-grid {
133
  width: calc(100% - 20px);
134
  margin: @grid_margin;
122
  }
123
  }
124
 
 
 
 
 
 
 
 
125
  .rsssl-grid {
126
  width: calc(100% - 20px);
127
  margin: @grid_margin;
grid/css/grid.min.css CHANGED
@@ -1 +1 @@
1
- .settings_page_rlrsssl_really_simple_ssl #wpcontent,.settings_page_really-simple-ssl #wpcontent{padding:0}.settings_page_rlrsssl_really_simple_ssl #wpcontent .rsssl-footer-item form,.settings_page_really-simple-ssl #wpcontent .rsssl-footer-item form{float:left}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab,.settings_page_really-simple-ssl #wpcontent .nav-tab{padding:16px 20px 17px 20px;margin-bottom:0;color:#444;font-weight:normal;font-size:1.2em;background:inherit;border:0}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab.nav-tab-active,.settings_page_really-simple-ssl #wpcontent .nav-tab.nav-tab-active{border-bottom:2px solid #fbc43d !important;background:#fff;padding-bottom:15px}@media screen and (max-width:800px){.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper{display:flex;flex-wrap:wrap;justify-content:center}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper .nav-tab,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper .nav-tab{margin-left:25px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper .documentation,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper .documentation{display:none}}@media screen and (max-width:480px){.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper .nav-tab,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper .nav-tab{padding:22px 3px 10px 3px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper .nav-tab-active,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper .nav-tab-active{padding-bottom:10px}}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper{min-height:60px;background-color:#fff;display:flex;align-items:center;border:0}.settings_page_rlrsssl_really_simple_ssl #wpcontent .rsssl-logo-container,.settings_page_really-simple-ssl #wpcontent .rsssl-logo-container{margin-left:25px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .rsssl-logo-container #rsssl-logo,.settings_page_really-simple-ssl #wpcontent .rsssl-logo-container #rsssl-logo{height:40px;width:200px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .rsssl-logo-container #rsssl-logo img,.settings_page_really-simple-ssl #wpcontent .rsssl-logo-container #rsssl-logo img{width:200px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links,.settings_page_really-simple-ssl #wpcontent .header-links{display:flex;flex:1;justify-content:flex-end;flex-direction:row;align-items:center;margin-right:20px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links .documentation,.settings_page_really-simple-ssl #wpcontent .header-links .documentation{text-decoration:underline}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links .header-upsell .documentation,.settings_page_really-simple-ssl #wpcontent .header-links .header-upsell .documentation{margin-left:25px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links .header-upsell a,.settings_page_really-simple-ssl #wpcontent .header-links .header-upsell a{text-decoration:none}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links .header-upsell .header-upsell-pro,.settings_page_really-simple-ssl #wpcontent .header-links .header-upsell .header-upsell-pro{color:black;border:3px solid black;margin:10px;width:80px;text-align:center;padding:5px;border-radius:20px;font-weight:600}.network-admin .rsssl-logo-container{height:60px}.rsssl-grid{width:calc(100% - 20px);margin:10px;position:relative;display:flex;flex-direction:row;flex-wrap:wrap}.rsssl-grid .button-rsssl-tertiary{background-color:#d7263d;color:white;border:0}.rsssl-grid .rsssl-wide-button{width:220px}.rsssl-grid .rsssl-progress .rsssl-task-list{height:257px;overflow:hidden}.rsssl-grid .rsssl-progress .rsssl-toggle-active{text-decoration:underline}.rsssl-grid .rsssl-progress #rsssl-all-tasks,.rsssl-grid .rsssl-progress #rsssl-remaining-tasks{display:none}.rsssl-grid .rsssl-progress .rsssl-tasks-container{border-bottom:1px solid lightgrey;color:lightgrey}.rsssl-grid .rsssl-progress .rsssl-tasks-container.active{text-decoration:none;border-bottom:0;color:initial}.rsssl-grid .rsssl-progress .rsssl-tasks-inactive{text-decoration:underline;color:lightgrey}.rsssl-grid .rsssl-item{width:800px;height:485px;z-index:1}.rsssl-grid .rsssl-item.small{width:400px}.rsssl-grid .rsssl-item .rsssl-close-warning-x{color:#ccc;font-size:.9em;margin-right:25px}.rsssl-grid .rsssl-item .item-container{background-color:#fff;position:relative;box-shadow:0 0 5px 5px rgba(222,222,222,0.2);width:790px;height:475px}.rsssl-grid .rsssl-item .item-container .form-table{display:flex}.rsssl-grid .rsssl-item .item-container .form-table tbody{display:flex;flex-direction:column;flex-wrap:wrap;max-height:340px;width:100% !important}.rsssl-grid .rsssl-item .item-container .form-table tbody tr{padding:0 0 0 0 !important;display:flex;align-items:center;flex-direction:row;width:50%}.rsssl-grid .rsssl-item .item-container .form-table tbody tr td{padding:0;margin:0}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th{margin-left:0;width:85%;display:flex;align-items:center;font-size:13px;font-weight:normal}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th .dashicons-editor-help{font-size:22px}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th .rsssl-tooltip-right{padding-right:10px;margin-top:-4px}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th,.rsssl-grid .rsssl-item .item-container .form-table tbody tr td{padding:8px 0 !important;font-size:13px}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th p,.rsssl-grid .rsssl-item .item-container .form-table tbody tr td p{font-size:13px}.rsssl-grid .rsssl-item .item-container h2{display:none}.rsssl-grid .rsssl-item .item-container .rsssl-save-settings-feedback{margin-right:20px;color:#d7263d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header{display:flex;align-items:center;justify-content:space-between;height:60px;border-bottom:1px solid #dedede;padding:0 25px 0 25px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-instructions a{color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-secondary-header-item{display:flex;color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-secondary-header-item .all-task-count,.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-secondary-header-item .open-task-count{padding-left:3px;padding-top:3px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-secondary-header-item .all-task-count{margin-right:5px}.rsssl-grid .rsssl-item .item-container .rsssl-table-td-main-content{padding-left:15px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content{height:360px;margin:10px 25px 10px 25px;border-bottom:1px solid #dedede}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block{padding-top:10px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-bar-container{margin:0 0 25px 0}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress{overflow:hidden;height:20px;border-radius:5px;background-color:#f7f7f7}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress .bar{height:100%;background-color:#61ce70}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-text{display:flex;align-items:center;margin:10px 0;padding-top:10px;padding-bottom:10px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-text .rsssl-progress-percentage{font-size:32px;font-weight:700}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-text .rsssl-progress-text{margin-left:35px;font-size:18px;font-weight:600}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-text .rsssl-progress-text a{margin-left:3px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .rsssl-progress-table td{padding:10px 10px 10px 0}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .rsssl-progress-table td+td{padding-left:15px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks{color:#3c3c3c;padding-bottom:15px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content{display:flex;flex-direction:column;margin-right:10px;height:340px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content .tips-tricks-top{flex-grow:1}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content .tips-tricks-top .rsssl-tips-tricks-element{margin-top:10px;margin-bottom:15px;display:flex;flex-direction:row;justify-content:space-between}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content .tips-tricks-top .rsssl-tips-tricks-content{padding-right:20px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content .tips-tricks-bottom{color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .rsssl-tips-tricks-read-more a{text-decoration:none;white-space:nowrap}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-bullet{height:13px;width:13px;border-radius:50%;margin-right:10px;background-color:lightgrey;text-decoration:none}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container{display:flex;flex-wrap:wrap;flex-direction:row}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums{display:flex;width:50%}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums a{text-decoration:none;color:#3c3c3c;display:flex;align-items:center;padding:2px 0}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums .rsssl-bullet{margin:7px 7px 7px 0;background-color:lightgrey;float:left}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums .rsssl-bullet:hover{background-color:#fbc43d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums .rsssl-forums-content{float:left;color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums .rsssl-forums-content:hover{text-decoration:underline}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-feedback{color:#d7263d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell{display:flex !important;flex-direction:row;padding:7px 0 7px 0;align-items:center;color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .plugin-text a{text-decoration:none;color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .plugin-text a:hover{color:#fbc43d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .rsp-image{margin-right:5px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .wpsi-red{background-color:#d7263d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .cmplztc-black{background-color:#333}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .cmplz-blue{background-color:#27adea}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .zip-pink{background-color:#e366a1}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .plugin-status{margin-left:auto}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-status{display:block;min-width:60px;text-align:center;border-radius:15px;padding:4px 8px 4px 8px;font-size:.8em;font-weight:600;height:17px;line-height:17px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-premium{background-color:#29b6f6;color:white}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-success{background-color:#61ce70;color:white}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-open{background-color:#fbc43d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-warning{background-color:#d7263d;color:white}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-footer{display:flex;align-items:center;margin:14px 25px 0 25px;height:40px;bottom:0;width:95%}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-footer .rsssl-button-save{margin-right:25px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-footer #rsssl-feedback{font-weight:600;color:#61ce70;padding-left:10px}.rsssl-grid .rsssl-item .item-container .rsssl-deactivate-keep-ssl th,.rsssl-grid .rsssl-item .item-container .rsssl-deactivate-keep-ssl span{display:none}.rsssl-grid .rsssl-item.half-height{height:247.5px}.rsssl-grid .rsssl-item.half-height .item-container{height:237.5px}.rsssl-grid .rsssl-item.half-height .item-container .rsssl-grid-item-content{height:110px}.rsssl-grid .rsssl-item.half-height .item-container .rsssl-grid-item-content .form-table tbody tr,.rsssl-grid .rsssl-item.half-height .item-container .rsssl-grid-item-content .form-table tbody th{width:100%;max-width:100%}.rsssl-grid .rsssl-item.small .item-container{width:390px}.rsssl-grid .rsssl-item.small .item-container th{width:85% !important}.rsssl-grid .rsssl-item.small .item-container .form-table tbody tr{width:100%}.rsssl-grid .rsssl-item.no-border .item-container{border:0}.rsssl-grid .rsssl-item.no-background .item-container{background-color:#f2f2f2}.rsssl-grid #rsssl-progress-footer{width:100%;text-align:right;margin-right:10px}.rsssl-grid #rsssl-progress-footer .rsssl-footer-item form{float:left}.rsssl-grid #rsssl-progress-footer .rsssl-footer-item+.rsssl-footer-item{margin-left:20px;padding:4px 0}.rsssl-grid #rsssl-progress-footer .footer-left{float:left}.rsssl-grid #rsssl-progress-footer .footer-left .upsell{min-width:80px;text-align:center}.rsssl-grid #rsssl-progress-footer .footer-right{float:right}.rsssl-grid #rsssl-progress-footer .hidden{display:none}.rsssl-grid .rsssl-system-status-footer-info{margin-right:20px;width:100%;text-align:right}.rsssl-grid .rsssl-system-status-footer-info .system-status-info{margin-left:6px}.rsssl-grid .dot{height:10px;width:10px;border-radius:50%;display:inline-block}.rsssl-grid .rsssl-dot-success{background-color:#61ce70}.rsssl-grid .rsssl-dot-error{background-color:#d7263d}.upsell-grid-container .rsssl-secondary-header-item img{height:30px;padding-top:5px}.rsssl-grid{position:relative}.rsssl-grid .rsssl-item{width:calc(100% - 20px);padding:10px;height:475px;min-height:500px;z-index:1}@media only screen and (min-width:400px){.rsssl-grid .rsssl-item{width:calc(100% - 20px)}}@media only screen and (min-width:600px){.rsssl-grid .rsssl-item{width:calc(100% - 20px)}}@media only screen and (min-width:768px){.rsssl-grid .rsssl-item{width:calc(100% - 20px)}}@media only screen and (min-width:992px){.rsssl-grid .rsssl-item{width:calc(100% - 20px)}}@media only screen and (min-width:1555px){.rsssl-grid .rsssl-item{width:calc(50% - 20px)}}.rsssl-grid .rsssl-item.small{width:calc(100% - 20px)}@media only screen and (min-width:400px){.rsssl-grid .rsssl-item.small{width:calc(100% - 20px)}}@media only screen and (min-width:600px){.rsssl-grid .rsssl-item.small{width:calc(100% - 20px)}}@media only screen and (min-width:768px){.rsssl-grid .rsssl-item.small{width:calc(50% - 20px)}}@media only screen and (min-width:992px){.rsssl-grid .rsssl-item.small{width:calc(50% - 20px)}}@media only screen and (min-width:1555px){.rsssl-grid .rsssl-item.small{width:calc(25% - 20px)}}.rsssl-grid .rsssl-item.small .item-container{width:100%;min-width:200px}.rsssl-grid .rsssl-item.half-height{min-height:250px}@media only screen and (min-width:400px){.rsssl-grid .rsssl-item.half-height{height:237.5px;min-height:250px}}@media only screen and (min-width:600px){.rsssl-grid .rsssl-item.half-height{min-height:250px;height:237.5px}}@media only screen and (min-width:768px){.rsssl-grid .rsssl-item.half-height{min-height:250px;height:237.5px}}@media only screen and (min-width:992px){.rsssl-grid .rsssl-item.half-height{min-height:250px;height:237.5px}}@media only screen and (min-width:1555px){.rsssl-grid .rsssl-item.half-height{min-height:250px;height:237.5px}}.rsssl-grid .rsssl-item.half-height .item-container{width:100%;min-width:200px;min-height:250px}.rsssl-grid .rsssl-item .settings.rsssl-item{width:100%;padding:0}.rsssl-grid .rsssl-item.muuri-item-hidden{z-index:0}.rsssl-grid .rsssl-item.muuri-item-releasing{z-index:2}.rsssl-grid .rsssl-item.muuri-item-dragging{z-index:3}.rsssl-grid .rsssl-item .rsssl-grid-header{border-bottom:1px solid lightgrey;padding:0;height:60px}.rsssl-grid .rsssl-item .rsssl-grid-header .rsssl-grid-header-container{margin:0 20px;height:100%}.rsssl-grid .rsssl-item .rsssl-grid-header .rsssl-grid-title{cursor:pointer;font-size:20px;padding:20px 0;font-weight:bold;float:left}.rsssl-grid .rsssl-item .rsssl-grid-header .rsssl-grid-controls{float:right;margin-top:20px;color:#cecece}.rsssl-grid .rsssl-item .item-container{background-color:#fff;position:relative;box-shadow:0 0 5px 5px rgba(222,222,222,0.2);height:100%;width:100%}.rsssl-grid .rsssl-item .item-container .item-content{clear:both;margin:15px;height:calc(100% - 100px);padding-top:0;padding-bottom:10px}.rsssl-grid .rsssl-item.no-border .item-container{border:0}.rsssl-grid .rsssl-item.no-background .item-container{background-color:#f1f1f1}.rsssl-grid .rsssl-item.muuri-item-placeholder .item-container{border-style:dashed;padding:0}
1
+ .settings_page_rlrsssl_really_simple_ssl #wpcontent,.settings_page_really-simple-ssl #wpcontent{padding:0}.settings_page_rlrsssl_really_simple_ssl #wpcontent .rsssl-footer-item form,.settings_page_really-simple-ssl #wpcontent .rsssl-footer-item form{float:left}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab,.settings_page_really-simple-ssl #wpcontent .nav-tab{padding:16px 20px 17px 20px;margin-bottom:0;color:#444;font-weight:normal;font-size:1.2em;background:inherit;border:0}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab.nav-tab-active,.settings_page_really-simple-ssl #wpcontent .nav-tab.nav-tab-active{border-bottom:2px solid #fbc43d !important;background:#fff;padding-bottom:15px}@media screen and (max-width:800px){.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper{display:flex;flex-wrap:wrap;justify-content:center}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper .nav-tab,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper .nav-tab{margin-left:25px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper .documentation,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper .documentation{display:none}}@media screen and (max-width:480px){.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper .nav-tab,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper .nav-tab{padding:22px 3px 10px 3px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper .nav-tab-active,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper .nav-tab-active{padding-bottom:10px}}.settings_page_rlrsssl_really_simple_ssl #wpcontent .nav-tab-wrapper,.settings_page_really-simple-ssl #wpcontent .nav-tab-wrapper{min-height:60px;background-color:#fff;display:flex;align-items:center;border:0}.settings_page_rlrsssl_really_simple_ssl #wpcontent .rsssl-logo-container,.settings_page_really-simple-ssl #wpcontent .rsssl-logo-container{margin-left:25px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .rsssl-logo-container #rsssl-logo,.settings_page_really-simple-ssl #wpcontent .rsssl-logo-container #rsssl-logo{height:40px;width:200px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .rsssl-logo-container #rsssl-logo img,.settings_page_really-simple-ssl #wpcontent .rsssl-logo-container #rsssl-logo img{width:200px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links,.settings_page_really-simple-ssl #wpcontent .header-links{display:flex;flex:1;justify-content:flex-end;flex-direction:row;align-items:center;margin-right:20px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links .documentation,.settings_page_really-simple-ssl #wpcontent .header-links .documentation{text-decoration:underline}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links .header-upsell .documentation,.settings_page_really-simple-ssl #wpcontent .header-links .header-upsell .documentation{margin-left:25px}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links .header-upsell a,.settings_page_really-simple-ssl #wpcontent .header-links .header-upsell a{text-decoration:none}.settings_page_rlrsssl_really_simple_ssl #wpcontent .header-links .header-upsell .header-upsell-pro,.settings_page_really-simple-ssl #wpcontent .header-links .header-upsell .header-upsell-pro{color:black;border:3px solid black;margin:10px;width:80px;text-align:center;padding:5px;border-radius:20px;font-weight:600}.rsssl-grid{width:calc(100% - 20px);margin:10px;position:relative;display:flex;flex-direction:row;flex-wrap:wrap}.rsssl-grid .button-rsssl-tertiary{background-color:#d7263d;color:white;border:0}.rsssl-grid .rsssl-wide-button{width:220px}.rsssl-grid .rsssl-progress .rsssl-task-list{height:257px;overflow:hidden}.rsssl-grid .rsssl-progress .rsssl-toggle-active{text-decoration:underline}.rsssl-grid .rsssl-progress #rsssl-all-tasks,.rsssl-grid .rsssl-progress #rsssl-remaining-tasks{display:none}.rsssl-grid .rsssl-progress .rsssl-tasks-container{border-bottom:1px solid lightgrey;color:lightgrey}.rsssl-grid .rsssl-progress .rsssl-tasks-container.active{text-decoration:none;border-bottom:0;color:initial}.rsssl-grid .rsssl-progress .rsssl-tasks-inactive{text-decoration:underline;color:lightgrey}.rsssl-grid .rsssl-item{width:800px;height:485px;z-index:1}.rsssl-grid .rsssl-item.small{width:400px}.rsssl-grid .rsssl-item .rsssl-close-warning-x{color:#ccc;font-size:.9em;margin-right:25px}.rsssl-grid .rsssl-item .item-container{background-color:#fff;position:relative;box-shadow:0 0 5px 5px rgba(222,222,222,0.2);width:790px;height:475px}.rsssl-grid .rsssl-item .item-container .form-table{display:flex}.rsssl-grid .rsssl-item .item-container .form-table tbody{display:flex;flex-direction:column;flex-wrap:wrap;max-height:340px;width:100% !important}.rsssl-grid .rsssl-item .item-container .form-table tbody tr{padding:0 0 0 0 !important;display:flex;align-items:center;flex-direction:row;width:50%}.rsssl-grid .rsssl-item .item-container .form-table tbody tr td{padding:0;margin:0}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th{margin-left:0;width:85%;display:flex;align-items:center;font-size:13px;font-weight:normal}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th .dashicons-editor-help{font-size:22px}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th .rsssl-tooltip-right{padding-right:10px;margin-top:-4px}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th,.rsssl-grid .rsssl-item .item-container .form-table tbody tr td{padding:8px 0 !important;font-size:13px}.rsssl-grid .rsssl-item .item-container .form-table tbody tr th p,.rsssl-grid .rsssl-item .item-container .form-table tbody tr td p{font-size:13px}.rsssl-grid .rsssl-item .item-container h2{display:none}.rsssl-grid .rsssl-item .item-container .rsssl-save-settings-feedback{margin-right:20px;color:#d7263d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header{display:flex;align-items:center;justify-content:space-between;height:60px;border-bottom:1px solid #dedede;padding:0 25px 0 25px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-instructions a{color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-secondary-header-item{display:flex;color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-secondary-header-item .all-task-count,.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-secondary-header-item .open-task-count{padding-left:3px;padding-top:3px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-header .rsssl-secondary-header-item .all-task-count{margin-right:5px}.rsssl-grid .rsssl-item .item-container .rsssl-table-td-main-content{padding-left:15px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content{height:360px;margin:10px 25px 10px 25px;border-bottom:1px solid #dedede}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block{padding-top:10px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-bar-container{margin:0 0 25px 0}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress{overflow:hidden;height:20px;border-radius:5px;background-color:#f7f7f7}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress .bar{height:100%;background-color:#61ce70}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-text{display:flex;align-items:center;margin:10px 0;padding-top:10px;padding-bottom:10px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-text .rsssl-progress-percentage{font-size:32px;font-weight:700}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-text .rsssl-progress-text{margin-left:35px;font-size:18px;font-weight:600}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .progress-text .rsssl-progress-text a{margin-left:3px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .rsssl-progress-table td{padding:10px 10px 10px 0}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-block .rsssl-progress-table td+td{padding-left:15px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks{color:#3c3c3c;padding-bottom:15px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content{display:flex;flex-direction:column;margin-right:10px;height:340px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content .tips-tricks-top{flex-grow:1}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content .tips-tricks-top .rsssl-tips-tricks-element{margin-top:10px;margin-bottom:15px;display:flex;flex-direction:row;justify-content:space-between}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content .tips-tricks-top .rsssl-tips-tricks-content{padding-right:20px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .tips-tricks-content .tips-tricks-bottom{color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-tips-tricks .rsssl-tips-tricks-read-more a{text-decoration:none;white-space:nowrap}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-bullet{height:13px;width:13px;border-radius:50%;margin-right:10px;background-color:lightgrey;text-decoration:none}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container{display:flex;flex-wrap:wrap;flex-direction:row}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums{display:flex;width:50%}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums a{text-decoration:none;color:#3c3c3c;display:flex;align-items:center;padding:2px 0}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums .rsssl-bullet{margin:7px 7px 7px 0;background-color:lightgrey;float:left}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums .rsssl-bullet:hover{background-color:#fbc43d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums .rsssl-forums-content{float:left;color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-support-forums-container .rsssl-support-forums .rsssl-forums-content:hover{text-decoration:underline}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content #rsssl-feedback{color:#d7263d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell{display:flex !important;flex-direction:row;padding:7px 0 7px 0;align-items:center;color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .plugin-text a{text-decoration:none;color:#3c3c3c}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .plugin-text a:hover{color:#fbc43d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .rsp-image{margin-right:5px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .wpsi-red{background-color:#d7263d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .cmplztc-black{background-color:#333}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .cmplz-blue{background-color:#27adea}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .zip-pink{background-color:#e366a1}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-upsell .plugin-status{margin-left:auto}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-progress-status{display:block;min-width:60px;text-align:center;border-radius:15px;padding:4px 8px 4px 8px;font-size:.8em;font-weight:600;height:17px;line-height:17px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-premium{background-color:#29b6f6;color:white}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-success{background-color:#61ce70;color:white}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-open{background-color:#fbc43d}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-content .rsssl-warning{background-color:#d7263d;color:white}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-footer{display:flex;align-items:center;margin:14px 25px 0 25px;height:40px;bottom:0;width:95%}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-footer .rsssl-button-save{margin-right:25px}.rsssl-grid .rsssl-item .item-container .rsssl-grid-item-footer #rsssl-feedback{font-weight:600;color:#61ce70;padding-left:10px}.rsssl-grid .rsssl-item .item-container .rsssl-deactivate-keep-ssl th,.rsssl-grid .rsssl-item .item-container .rsssl-deactivate-keep-ssl span{display:none}.rsssl-grid .rsssl-item.half-height{height:247.5px}.rsssl-grid .rsssl-item.half-height .item-container{height:237.5px}.rsssl-grid .rsssl-item.half-height .item-container .rsssl-grid-item-content{height:110px}.rsssl-grid .rsssl-item.half-height .item-container .rsssl-grid-item-content .form-table tbody tr,.rsssl-grid .rsssl-item.half-height .item-container .rsssl-grid-item-content .form-table tbody th{width:100%;max-width:100%}.rsssl-grid .rsssl-item.small .item-container{width:390px}.rsssl-grid .rsssl-item.small .item-container th{width:85% !important}.rsssl-grid .rsssl-item.small .item-container .form-table tbody tr{width:100%}.rsssl-grid .rsssl-item.no-border .item-container{border:0}.rsssl-grid .rsssl-item.no-background .item-container{background-color:#f2f2f2}.rsssl-grid #rsssl-progress-footer{width:100%;text-align:right;margin-right:10px}.rsssl-grid #rsssl-progress-footer .rsssl-footer-item form{float:left}.rsssl-grid #rsssl-progress-footer .rsssl-footer-item+.rsssl-footer-item{margin-left:20px;padding:4px 0}.rsssl-grid #rsssl-progress-footer .footer-left{float:left}.rsssl-grid #rsssl-progress-footer .footer-left .upsell{min-width:80px;text-align:center}.rsssl-grid #rsssl-progress-footer .footer-right{float:right}.rsssl-grid #rsssl-progress-footer .hidden{display:none}.rsssl-grid .rsssl-system-status-footer-info{margin-right:20px;width:100%;text-align:right}.rsssl-grid .rsssl-system-status-footer-info .system-status-info{margin-left:6px}.rsssl-grid .dot{height:10px;width:10px;border-radius:50%;display:inline-block}.rsssl-grid .rsssl-dot-success{background-color:#61ce70}.rsssl-grid .rsssl-dot-error{background-color:#d7263d}.upsell-grid-container .rsssl-secondary-header-item img{height:30px;padding-top:5px}.rsssl-grid{position:relative}.rsssl-grid .rsssl-item{width:calc(100% - 20px);padding:10px;height:475px;min-height:500px;z-index:1}@media only screen and (min-width:400px){.rsssl-grid .rsssl-item{width:calc(100% - 20px)}}@media only screen and (min-width:600px){.rsssl-grid .rsssl-item{width:calc(100% - 20px)}}@media only screen and (min-width:768px){.rsssl-grid .rsssl-item{width:calc(100% - 20px)}}@media only screen and (min-width:992px){.rsssl-grid .rsssl-item{width:calc(100% - 20px)}}@media only screen and (min-width:1555px){.rsssl-grid .rsssl-item{width:calc(50% - 20px)}}.rsssl-grid .rsssl-item.small{width:calc(100% - 20px)}@media only screen and (min-width:400px){.rsssl-grid .rsssl-item.small{width:calc(100% - 20px)}}@media only screen and (min-width:600px){.rsssl-grid .rsssl-item.small{width:calc(100% - 20px)}}@media only screen and (min-width:768px){.rsssl-grid .rsssl-item.small{width:calc(50% - 20px)}}@media only screen and (min-width:992px){.rsssl-grid .rsssl-item.small{width:calc(50% - 20px)}}@media only screen and (min-width:1555px){.rsssl-grid .rsssl-item.small{width:calc(25% - 20px)}}.rsssl-grid .rsssl-item.small .item-container{width:100%;min-width:200px}.rsssl-grid .rsssl-item.half-height{min-height:250px}@media only screen and (min-width:400px){.rsssl-grid .rsssl-item.half-height{height:237.5px;min-height:250px}}@media only screen and (min-width:600px){.rsssl-grid .rsssl-item.half-height{min-height:250px;height:237.5px}}@media only screen and (min-width:768px){.rsssl-grid .rsssl-item.half-height{min-height:250px;height:237.5px}}@media only screen and (min-width:992px){.rsssl-grid .rsssl-item.half-height{min-height:250px;height:237.5px}}@media only screen and (min-width:1555px){.rsssl-grid .rsssl-item.half-height{min-height:250px;height:237.5px}}.rsssl-grid .rsssl-item.half-height .item-container{width:100%;min-width:200px;min-height:250px}.rsssl-grid .rsssl-item .settings.rsssl-item{width:100%;padding:0}.rsssl-grid .rsssl-item.muuri-item-hidden{z-index:0}.rsssl-grid .rsssl-item.muuri-item-releasing{z-index:2}.rsssl-grid .rsssl-item.muuri-item-dragging{z-index:3}.rsssl-grid .rsssl-item .rsssl-grid-header{border-bottom:1px solid lightgrey;padding:0;height:60px}.rsssl-grid .rsssl-item .rsssl-grid-header .rsssl-grid-header-container{margin:0 20px;height:100%}.rsssl-grid .rsssl-item .rsssl-grid-header .rsssl-grid-title{cursor:pointer;font-size:20px;padding:20px 0;font-weight:bold;float:left}.rsssl-grid .rsssl-item .rsssl-grid-header .rsssl-grid-controls{float:right;margin-top:20px;color:#cecece}.rsssl-grid .rsssl-item .item-container{background-color:#fff;position:relative;box-shadow:0 0 5px 5px rgba(222,222,222,0.2);height:100%;width:100%}.rsssl-grid .rsssl-item .item-container .item-content{clear:both;margin:15px;height:calc(100% - 100px);padding-top:0;padding-bottom:10px}.rsssl-grid .rsssl-item.no-border .item-container{border:0}.rsssl-grid .rsssl-item.no-background .item-container{background-color:#f1f1f1}.rsssl-grid .rsssl-item.muuri-item-placeholder .item-container{border-style:dashed;padding:0}
grid/templates/grid-element.php CHANGED
@@ -1,16 +1,16 @@
1
  <div class="rsssl-item {class}">
2
- <div class="item-container">
3
  {form_open}
4
  <div class="rsssl-grid-item-header">
5
  <h3>{title}</h3>
6
  {header}
7
  </div>
8
- <div class="rsssl-grid-item-content">
9
- {content}
10
- </div>
11
- <div class="rsssl-grid-item-footer">
12
- {footer}
13
- </div>
14
  {form_close}
15
- </div>
16
  </div>
1
  <div class="rsssl-item {class}">
2
+ <div class="item-container">
3
  {form_open}
4
  <div class="rsssl-grid-item-header">
5
  <h3>{title}</h3>
6
  {header}
7
  </div>
8
+ <div class="rsssl-grid-item-content">
9
+ {content}
10
+ </div>
11
+ <div class="rsssl-grid-item-footer">
12
+ {footer}
13
+ </div>
14
  {form_close}
15
+ </div>
16
  </div>
img/check-icon.png CHANGED
Binary file
img/cross-icon.png CHANGED
Binary file
img/warning-icon.png CHANGED
Binary file
js/scripts.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function(c){c(document).on("click",".rsssl-slider",function(){e(c(this))});c(document).on("click",".rsssl-container .item-content input",function(){e(c(this))});c(document).on("change",".rsssl-container .item-content input",function(){e(c(this))});c(document).on("change",".rsssl-container select",function(){e(c(this))});c(".rsssl-button-save").prop("disabled",true);function e(f){console.log(c(this));f.closest(".rsssl-item").find(".rsssl-save-settings-feedback").fadeIn();f.closest(".rsssl-item").find(".rsssl-button-save").prop("disabled",false)}function d(){c.ajax({type:"post",data:{action:"rsssl_get_updated_task_count",token:rsssl.token,},url:rsssl.ajaxurl,success:function(h){if(h!==""){if(h===0){c(".open-task-text").text("");c(".open-task-count").text("")}if(h===rsssl.lowest_possible_task_count){c(".rsssl-progress-text").html(rsssl.finished_text)}else{var i=rsssl.not_complete_text.replace("%s",h);c(".rsssl-progress-text").html(i)}if(h!==0){var g=c("#rsssl-remaining-tasks-label").text();var f=g.replace(/(?<=\().+?(?=\))/,h);c("#rsssl-remaining-tasks-label").text(f);c(".rsssl-progress-count").text(h)}}}})}c(".rsssl-support-forums a").hover(function(){c(this).find(".rsssl-bullet").css("background-color","#FBC43D")},function(){c(this).find(".rsssl-bullet").css("background-color","")});c(document).on("click","#rsssl-remaining-tasks",function(f){if(c("#rsssl-all-tasks").is(":checked")){c("#rsssl-all-tasks").prop("checked",false)}a()});c(document).on("click","#rsssl-all-tasks",function(f){if(c("#rsssl-remaining-tasks").is(":checked")){c("#rsssl-remaining-tasks").prop("checked",false)}a()});function a(){var f;var g;b();if(c("#rsssl-all-tasks").is(":checked")){f="checked";g="unchecked"}else{f="unchecked";g="checked"}c.ajax({type:"post",data:{action:"rsssl_update_task_toggle_option",token:rsssl.token,alltasks:f,remainingtasks:g,},url:rsssl.ajaxurl,success:function(){location.reload()}})}b();function b(){var f=c("#rsssl-all-tasks");if(f.is(":checked")){c(".rsssl-tasks-container.rsssl-all-tasks").addClass("active");c(".rsssl-tasks-container.rsssl-remaining-tasks").removeClass("active")}else{c(".rsssl-tasks-container.rsssl-all-tasks").removeClass("active");c(".rsssl-tasks-container.rsssl-remaining-tasks").addClass("active")}}c(document).on("click",".rsssl-close-warning, .rsssl-close-warning-x",function(g){var f=c(this).closest(".rsssl-dashboard-dismiss").data("dismiss_type");var h={action:"rsssl_dismiss_settings_notice",type:f,token:rsssl.token,};c.post(ajaxurl,h,function(i){});c(this).closest("tr").remove();c.ajax({type:"post",data:{action:"rsssl_get_updated_percentage",token:rsssl.token,},url:rsssl.ajaxurl,success:function(i){if(i!=""){c(".rsssl-progress-percentage").text(i+"%");d()}}})})});
1
+ jQuery(document).ready(function(e){var h=window.location.href;var a=h.split("?");if(a.length===1){return false}var f="";var d=a[1].split("&");for(var i in d){if(d.hasOwnProperty(i)){var c=d[i].split("=");if(c[0]==="highlight"){f=c[1]}}}if(f!==""&&e("#rsssl-maybe-highlight-"+f).length){var b=e("#rsssl-maybe-highlight-"+f).closest("tr");e([document.documentElement,document.body]).animate({scrollTop:b.offset().top},1000);b.addClass("rsssl-highlight")}e(document).on("click",".rsssl-slider",function(){j(e(this))});e(document).on("click",".rsssl-container .rsssl-grid-item-content input",function(){j(e(this))});e(document).on("change",".rsssl-container .rsssl-grid-item-content input",function(){j(e(this))});e(document).on("change",".rsssl-container select",function(){j(e(this))});e(".rsssl-button-save").prop("disabled",true);function j(l){l.closest(".rsssl-item").find(".rsssl-save-settings-feedback").fadeIn();l.closest(".rsssl-item").find(".rsssl-button-save").prop("disabled",false)}e(".rsssl-support-forums a").hover(function(){e(this).find(".rsssl-bullet").css("background-color","#FBC43D")},function(){e(this).find(".rsssl-bullet").css("background-color","")});e(document).on("click","#rsssl-remaining-tasks",function(l){if(e("#rsssl-all-tasks").is(":checked")){e("#rsssl-all-tasks").prop("checked",false)}g()});e(document).on("click","#rsssl-all-tasks",function(l){if(e("#rsssl-remaining-tasks").is(":checked")){e("#rsssl-remaining-tasks").prop("checked",false)}g()});function g(){var l;var m;k();if(e("#rsssl-all-tasks").is(":checked")){l="checked";m="unchecked"}else{l="unchecked";m="checked"}e.ajax({type:"post",data:{action:"rsssl_update_task_toggle_option",token:rsssl.token,alltasks:l,remainingtasks:m},url:rsssl.ajaxurl,success:function(){location.reload()}})}k();function k(){var l=e("#rsssl-all-tasks");if(l.is(":checked")){e(".rsssl-tasks-container.rsssl-all-tasks").addClass("active");e(".rsssl-tasks-container.rsssl-remaining-tasks").removeClass("active")}else{e(".rsssl-tasks-container.rsssl-all-tasks").removeClass("active");e(".rsssl-tasks-container.rsssl-remaining-tasks").addClass("active")}}e(document).on("click",".rsssl-close-warning, .rsssl-close-warning-x",function(m){var l=e(this).closest(".rsssl-dashboard-dismiss").data("dismiss_type");var n=e(this).closest("tr");e.ajax({type:"post",data:{type:l,action:"rsssl_dismiss_settings_notice",token:rsssl.token},url:rsssl.ajaxurl,success:function(o){n.remove();if(o.percentage!==""){e(".rsssl-progress-percentage").text(o.percentage+"%");e(".progress-bar-container .progress .bar").css("width",o.percentage+"%")}if(o.tasks!==""){if(o.tasks===rsssl.lowest_possible_task_count){e(".rsssl-progress-text").html(rsssl.finished_text)}else{var p="";if(o.tasks===0){p=rsssl.finished_text}else{if(o.tasks===1){p=rsssl.not_complete_text_singular.replace("%s",o.tasks)}else{p=rsssl.not_complete_text_plural.replace("%s",o.tasks)}}e(".rsssl-progress-text").html(p)}e(".rsssl_remaining_task_count").html(o.tasks);e(".rsssl-progress-count").html(o.tasks)}}})})});
languages/really-simple-ssl.pot CHANGED
@@ -3,8 +3,8 @@ msgid ""
3
  msgstr ""
4
  "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
5
  "Project-Id-Version: Really Simple SSL\n"
6
- "POT-Creation-Date: 2020-12-07 09:09+0100\n"
7
- "PO-Revision-Date: 2020-12-07 09:09+0100\n"
8
  "Last-Translator: Rogier Lankhorst <rogierlankhorst@gmail.com>\n"
9
  "Language-Team: Rogier Lankhorst <rogierlankhorst@gmail.com>\n"
10
  "MIME-Version: 1.0\n"
@@ -23,12 +23,13 @@ msgstr ""
23
 
24
  #: class-admin.php:49 class-cache.php:10 class-certificate.php:14
25
  #: class-front-end.php:18 class-help.php:9 class-mixed-content-fixer.php:13
26
- #: class-multisite.php:27 class-server.php:10 class-site-health.php:12
 
27
  #, php-format
28
  msgid "%s is a singleton class and you cannot create a second instance."
29
  msgstr ""
30
 
31
- #: class-admin.php:113
32
  #, php-format
33
  msgid ""
34
  "Really Simple SSL and Really Simple SSL add-ons do not process any personal "
@@ -37,89 +38,114 @@ msgid ""
37
  "href=\"%s\" target=\"_blank\">here</a>."
38
  msgstr ""
39
 
40
- #: class-admin.php:487
41
  msgid "Almost ready to migrate to SSL!"
42
  msgstr ""
43
 
44
- #: class-admin.php:497
45
  msgid "Before you migrate, please check for: "
46
  msgstr ""
47
 
48
- #: class-admin.php:500 class-multisite.php:545
 
 
49
  msgid ""
50
  "Http references in your .css and .js files: change any http:// into https://"
51
  msgstr ""
52
 
53
- #: class-admin.php:501
54
  msgid ""
55
  "Images, stylesheets or scripts from a domain without an SSL certificate: "
56
  "remove them or move to your own server"
57
  msgstr ""
58
 
59
- #: class-admin.php:507
60
  #, php-format
61
  msgid ""
62
  "We strongly recommend to create a %sbackup%s of your site before activating "
63
  "SSL"
64
  msgstr ""
65
 
66
- #: class-admin.php:508
67
  msgid "You may need to login in again."
68
  msgstr ""
69
 
70
- #: class-admin.php:513
 
 
 
 
 
 
 
 
 
 
 
71
  msgid ""
72
  "You can also let the automatic scan of the pro version handle this for you, "
73
  "and get premium support, increased security with HSTS and more!"
74
  msgstr ""
75
 
76
- #: class-admin.php:517
 
77
  msgid "Check out Really Simple SSL Pro"
78
  msgstr ""
79
 
80
- #: class-admin.php:663
 
 
 
 
 
81
  msgid "Go ahead, activate SSL!"
82
  msgstr ""
83
 
84
- #: class-admin.php:666
 
 
 
 
85
  msgid "Get ready with PRO!"
86
  msgstr ""
87
 
88
- #: class-admin.php:2191
89
  msgid ""
90
  "A definition of a siteurl or homeurl was detected in your wp-config.php, but "
91
  "the file is not writable."
92
  msgstr ""
93
 
94
- #: class-admin.php:2193 class-admin.php:2220
95
- msgid "Set your wp-config.php to writable and reload this page."
 
96
  msgstr ""
97
 
98
- #: class-admin.php:2196
99
  msgid "Your wp-config.php has to be edited, but is not writable."
100
  msgstr ""
101
 
102
- #: class-admin.php:2197
103
  msgid ""
104
  "Because your site is behind a loadbalancer and is_ssl() returns false, you "
105
  "should add the following line of code to your wp-config.php."
106
  msgstr ""
107
 
108
- #: class-admin.php:2213
109
- msgid "Or set your wp-config.php to writable and reload this page."
 
110
  msgstr ""
111
 
112
- #: class-admin.php:2219
113
  msgid ""
114
  "Because your server does not pass a variable with which WordPress can detect "
115
  "SSL, WordPress may create redirect loops on SSL."
116
  msgstr ""
117
 
118
- #: class-admin.php:2226
119
  msgid "System detection encountered issues"
120
  msgstr ""
121
 
122
- #: class-admin.php:2315
123
  #, php-format
124
  msgid ""
125
  "Hi, Really Simple SSL has kept your site secure for some time now, awesome! "
@@ -128,7 +154,7 @@ msgid ""
128
  "feedback, leave us a %smessage%s."
129
  msgstr ""
130
 
131
- #: class-admin.php:2317
132
  #, php-format
133
  msgid ""
134
  "Hi, Really Simple SSL has kept your site secure for a month now, awesome! If "
@@ -137,135 +163,170 @@ msgid ""
137
  "feedback, leave us a %smessage%s."
138
  msgstr ""
139
 
140
- #: class-admin.php:2323
141
  msgid "Leave a review"
142
  msgstr ""
143
 
144
- #: class-admin.php:2324
145
  msgid "Maybe later"
146
  msgstr ""
147
 
148
- #: class-admin.php:2325
149
  msgid "Don't show again"
150
  msgstr ""
151
 
152
- #: class-admin.php:2507
153
  msgid "SSL settings"
154
  msgstr ""
155
 
156
- #: class-admin.php:2508
157
  msgid "SSL"
158
  msgstr ""
159
 
160
- #: class-admin.php:2530 class-admin.php:3274 class-admin.php:3647
161
- #: class-admin.php:4082 class-multisite.php:224 class-multisite.php:335
162
  #: class-multisite.php:382
163
  msgid "Settings"
164
  msgstr ""
165
 
166
- #: class-admin.php:2567
167
  msgid "General"
168
  msgstr ""
169
 
170
- #: class-admin.php:2585 class-multisite.php:441
171
  #: grid/templates/tips-tricks-footer.php:3
172
  msgid "Documentation"
173
  msgstr ""
174
 
175
- #: class-admin.php:2591 class-admin.php:4086 class-multisite.php:228
176
- #: class-multisite.php:447
177
  msgid "Support"
178
  msgstr ""
179
 
180
- #: class-admin.php:2646
181
  msgid "No recommended redirect rules detected."
182
  msgstr ""
183
 
184
- #: class-admin.php:2664
 
 
 
 
185
  msgid "Major security issue!"
186
  msgstr ""
187
 
188
- #: class-admin.php:2665
189
  msgid ""
190
  "The 'force-deactivate.php' file has to be renamed to .txt. Otherwise your "
191
  "ssl can be deactivated by anyone on the internet."
192
  msgstr ""
193
 
194
- #: class-admin.php:2666
195
  msgid "Check again"
196
  msgstr ""
197
 
198
- #: class-admin.php:2682
 
 
 
 
 
 
 
 
 
199
  msgid ""
200
  "SSL is now activated. Check if your website is secure by following this "
201
  "article."
202
  msgstr ""
203
 
204
- #: class-admin.php:2697
205
  msgid ""
206
  "Don't forget to change your settings in Google Analytics and Search Console."
207
  msgstr ""
208
 
209
- #: class-admin.php:2711
210
  msgid "https://really-simple-ssl.com/really-simple-ssl-4-a-new-dashboard"
211
  msgstr ""
212
 
213
- #: class-admin.php:2712
214
  msgid "Really Simple SSL 4.0. Learn more about our newest major release."
215
  msgstr ""
216
 
217
- #: class-admin.php:2725
218
  msgid "SSL is enabled on your site."
219
  msgstr ""
220
 
221
- #: class-admin.php:2729
222
  msgid "SSL is not enabled yet."
223
  msgstr ""
224
 
225
- #: class-admin.php:2740
226
  msgid "Cannot activate SSL due to system configuration."
227
  msgstr ""
228
 
229
- #: class-admin.php:2744
230
  msgid "No SSL detected"
231
  msgstr ""
232
 
233
- #: class-admin.php:2745
 
 
 
 
 
 
 
 
 
 
 
 
234
  #, php-format
 
 
 
 
235
  msgid ""
236
- "No SSL detected. See our guide on how to %sget a free SSL certificate%s. If "
237
- "you do have an SSL certificate, try to reload this page over https by "
238
- "clicking this link: %sReload over https.%s"
239
  msgstr ""
240
 
241
- #: class-admin.php:2750
242
- msgid "An SSL certificate was detected on your site."
 
 
243
  msgstr ""
244
 
245
- #: class-admin.php:2762
 
 
 
 
246
  msgid "Mixed content fixer was successfully detected on the front-end."
247
  msgstr ""
248
 
249
- #: class-admin.php:2767
250
  msgid "Really Simple SSL has received no response from the webpage."
251
  msgstr ""
252
 
253
- #: class-admin.php:2774
254
  msgid ""
255
  "The mixed content fixer is active, but was not detected on the frontpage."
256
  msgstr ""
257
 
258
- #: class-admin.php:2779
259
  msgid "Error occurred when retrieving the webpage."
260
  msgstr ""
261
 
262
- #: class-admin.php:2785
263
  msgid ""
264
  "Mixed content fixer not enabled. Enable the option to fix mixed content on "
265
  "your site."
266
  msgstr ""
267
 
268
- #: class-admin.php:2791
269
  #, php-format
270
  msgid ""
271
  "The mixed content fixer could not be detected due to a cURL error: %s. cURL "
@@ -273,200 +334,220 @@ msgid ""
273
  "affect the front-end of your site. Contact your hosting provider for a fix."
274
  msgstr ""
275
 
276
- #: class-admin.php:2804
277
  msgid "301 redirect to https set."
278
  msgstr ""
279
 
280
- #: class-admin.php:2808
281
  msgid ""
282
  "No 301 redirect is set. Enable the WordPress 301 redirect in the settings to "
283
  "get a 301 permanent redirect."
284
  msgstr ""
285
 
286
- #: class-admin.php:2820
287
  msgid "301 redirect to https set: .htaccess redirect."
288
  msgstr ""
289
 
290
- #: class-admin.php:2825
291
  msgid ""
292
  "WordPress 301 redirect enabled. We recommend to enable a 301 .htaccess "
293
  "redirect."
294
  msgstr ""
295
 
296
- #: class-admin.php:2832
297
  msgid ""
298
  "Enable a .htaccess redirect or WordPress redirect in the settings to create "
299
  "a 301 redirect."
300
  msgstr ""
301
 
302
- #: class-admin.php:2838
303
  #, php-format
304
  msgid ""
305
  "The %s file is not writable. You can either use the WordPress redirect, add "
306
- "the rules manually, or set the file to writable."
307
  msgstr ""
308
 
309
- #: class-admin.php:2844
310
  msgid ""
311
  "The .htaccess redirect rules selected by this plugin failed in the test. Set "
312
  "manually or dismiss to leave on WordPress redirect."
313
  msgstr ""
314
 
315
- #: class-admin.php:2859
316
  msgid ""
317
  "Your site uses Elementor. This can require some additional steps before "
318
  "getting the secure lock."
319
  msgstr ""
320
 
321
- #: class-admin.php:2873
322
  msgid ""
323
  "Your site uses Divi. This can require some additional steps before getting "
324
  "the secure lock."
325
  msgstr ""
326
 
327
- #: class-admin.php:2886
328
  msgid "HTTP Strict Transport Security was enabled."
329
  msgstr ""
330
 
331
- #: class-admin.php:2890
332
  #, php-format
333
  msgid "HTTP Strict Transport Security is not enabled %s(Read more)%s."
334
  msgstr ""
335
 
336
- #: class-admin.php:2902
337
- msgid "Secure cookies set."
338
  msgstr ""
339
 
340
- #: class-admin.php:2906
341
- #, php-format
342
- msgid "Secure cookie settings not enabled (%sRead more%s)."
343
  msgstr ""
344
 
345
- #: class-admin.php:2917
 
 
 
 
 
 
 
 
 
 
 
 
 
 
346
  #, php-format
347
  msgid "Recommended security headers not enabled (%sRead more%s)."
348
  msgstr ""
349
 
350
- #: class-admin.php:2928
 
 
 
 
 
 
351
  msgid ""
352
- "Your .htaccess file is not writable. This prevents Really Simple SSL from "
353
- "writing redirects or security headers to your .htaccess file."
 
354
  msgstr ""
355
 
356
- #: class-admin.php:3032
357
  #, php-format
358
  msgid "%sMore info%s or %sdismiss%s"
359
  msgstr ""
360
 
361
- #: class-admin.php:3035
362
  #, php-format
363
  msgid "%sEnable%s or %sdismiss%s"
364
  msgstr ""
365
 
366
- #: class-admin.php:3266 class-multisite.php:374
367
  msgid "Your progress"
368
  msgstr ""
369
 
370
- #: class-admin.php:3281
371
  msgid "Tips & Tricks"
372
  msgstr ""
373
 
374
- #: class-admin.php:3289 class-multisite.php:398
375
  msgid "Our plugins"
376
  msgstr ""
377
 
378
- #: class-admin.php:3296 class-multisite.php:390
379
  msgid "Support forum"
380
  msgstr ""
381
 
382
- #: class-admin.php:3388
383
  msgid "Install"
384
  msgstr ""
385
 
386
- #: class-admin.php:3391
387
- msgid "Installed"
388
  msgstr ""
389
 
390
- #: class-admin.php:3394
391
- msgid "Upgrade to pro"
392
  msgstr ""
393
 
394
- #: class-admin.php:3448
395
  msgid "Instructions manual"
396
  msgstr ""
397
 
398
- #: class-admin.php:3515
399
  msgid "Completed"
400
  msgstr ""
401
 
402
- #: class-admin.php:3517
403
  msgid "Warning"
404
  msgstr ""
405
 
406
- #: class-admin.php:3519
407
  msgid "Open"
408
  msgstr ""
409
 
410
- #: class-admin.php:3521
411
  msgid "Premium"
412
  msgstr ""
413
 
414
- #: class-admin.php:3569
415
  msgid "More info"
416
  msgstr ""
417
 
418
- #: class-admin.php:3608 grid/templates/progress.php:33
419
  #, php-format
420
  msgid ""
421
  "Basic SSL configuration finished! Improve your score with %sReally Simple "
422
  "SSL Pro%s."
423
  msgstr ""
424
 
425
- #: class-admin.php:3610 grid/templates/progress.php:25
426
  msgid "SSL is activated on your site."
427
  msgstr ""
428
 
429
- #: class-admin.php:3612 grid/templates/progress.php:39
430
  msgid "SSL is not yet enabled on this site."
431
  msgstr ""
432
 
433
- #: class-admin.php:3615 grid/templates/progress.php:25
434
  #, fuzzy, php-format
435
  msgid "You still have %s task open."
436
  msgstr ""
437
  "#-#-#-#-# legacy_PHP_extracted.pot (PACKAGE VERSION) #-#-#-#-#\n"
438
  "#-#-#-#-# 1legacy_PHP_extracted.pot (PACKAGE VERSION) #-#-#-#-#\n"
439
 
440
- #: class-admin.php:3616
441
  #, php-format
442
  msgid " You still have %s tasks open."
443
  msgstr ""
444
 
445
- #: class-admin.php:3622
446
  msgid "Copied!"
447
  msgstr ""
448
 
449
- #: class-admin.php:3649
450
  msgid ""
451
  "In most cases you need to leave this enabled, to prevent mixed content "
452
  "issues on your site."
453
  msgstr ""
454
 
455
- #: class-admin.php:3650
456
  msgid "Mixed content fixer"
457
  msgstr ""
458
 
459
- #: class-admin.php:3654
460
  msgid ""
461
  "Redirects all requests over HTTP to HTTPS using a PHP 301 redirect. Enable "
462
  "if the .htaccess redirect cannot be used, for example on NGINX servers."
463
  msgstr ""
464
 
465
- #: class-admin.php:3655
466
  msgid "Enable WordPress 301 redirect"
467
  msgstr ""
468
 
469
- #: class-admin.php:3659
470
  msgid ""
471
  "A .htaccess redirect is faster and works better with caching. Really Simple "
472
  "SSL detects the redirect code that is most likely to work (99% of websites), "
@@ -474,117 +555,118 @@ msgid ""
474
  "if anything goes wrong!"
475
  msgstr ""
476
 
477
- #: class-admin.php:3660 class-site-health.php:155
478
  msgid "Enable 301 .htaccess redirect"
479
  msgstr ""
480
 
481
- #: class-admin.php:3666
482
  msgid ""
483
  "If you want to customize the Really Simple SSL .htaccess, you need to "
484
  "prevent Really Simple SSL from rewriting it. Enabling this option will do "
485
  "that."
486
  msgstr ""
487
 
488
- #: class-admin.php:3667
489
  msgid "Stop editing the .htaccess file"
490
  msgstr ""
491
 
492
- #: class-admin.php:3672
493
  msgid ""
494
  "If this option is set to true, the mixed content fixer will fire on the init "
495
  "hook instead of the template_redirect hook. Only use this option when you "
496
  "experience problems with the mixed content fixer.\""
497
  msgstr ""
498
 
499
- #: class-admin.php:3673
500
  msgid "Fire mixed content fixer with different method"
501
  msgstr ""
502
 
503
- #: class-admin.php:3676
504
  msgid ""
505
  "Enable this option to permanently dismiss all +1 notices in the 'Your "
506
  "progress' tab"
507
  msgstr ""
508
 
509
- #: class-admin.php:3677
510
  msgid "Dismiss all Really Simple SSL notices"
511
  msgstr ""
512
 
513
- #: class-admin.php:3784 class-admin.php:3814 class-admin.php:4055
514
  msgid "This option is enabled on the network menu."
515
  msgstr ""
516
 
517
- #: class-admin.php:3810
518
  #, php-format
519
  msgid ""
520
  "Before you enable the htaccess redirect, make sure you know how to %sregain "
521
  "access%s to your site in case of a redirect loop."
522
  msgstr ""
523
 
524
- #: class-admin.php:3817
525
  msgid ""
526
  "If the setting 'stop editing the .htaccess file' is enabled, you can't "
527
  "change this setting."
528
  msgstr ""
529
 
530
- #: class-admin.php:3849
531
- msgid ".htaccess is currently not writable."
 
532
  msgstr ""
533
 
534
- #: class-admin.php:3999
535
  msgid "Are you sure?"
536
  msgstr ""
537
 
538
- #: class-admin.php:4012
539
  msgid "To deactivate the plugin correctly, please select if you want to:"
540
  msgstr ""
541
 
542
- #: class-admin.php:4014
543
  msgid "Deactivate, but stay on SSL."
544
  msgstr ""
545
 
546
- #: class-admin.php:4015
547
  msgid ""
548
  "Deactivate, and revert to http. This will remove all changes by the plugin."
549
  msgstr ""
550
 
551
- #: class-admin.php:4017
552
  msgid "Deactivating the plugin while keeping SSL will do the following:"
553
  msgstr ""
554
 
555
- #: class-admin.php:4019
556
  msgid "The mixed content fixer will stop working"
557
  msgstr ""
558
 
559
- #: class-admin.php:4020
560
  msgid "The WordPress 301 redirect will stop working"
561
  msgstr ""
562
 
563
- #: class-admin.php:4021
564
  msgid "Your site address will remain https://"
565
  msgstr ""
566
 
567
- #: class-admin.php:4022
568
  msgid "The .htaccess redirect will remain active"
569
  msgstr ""
570
 
571
- #: class-admin.php:4032
572
  msgid "Cancel"
573
  msgstr ""
574
 
575
- #: class-admin.php:4033
576
  msgid "Deactivate, keep https"
577
  msgstr ""
578
 
579
- #: class-admin.php:4034
580
  msgid "Deactivate, revert to http"
581
  msgstr ""
582
 
583
- #: class-admin.php:4088 class-multisite.php:230
584
  msgid "Premium Support"
585
  msgstr ""
586
 
587
- #: class-admin.php:4094 class-multisite.php:236
588
  msgid "Upgrade to premium"
589
  msgstr ""
590
 
@@ -600,47 +682,47 @@ msgstr ""
600
  msgid "SSL is activated per site."
601
  msgstr ""
602
 
603
- #: class-multisite.php:122
604
  msgid "SSL is enabled networkwide."
605
  msgstr ""
606
 
607
- #: class-multisite.php:126
608
  msgid "SSL is enabled per site."
609
  msgstr ""
610
 
611
- #: class-multisite.php:130
612
  msgid "SSL is not enabled yet"
613
  msgstr ""
614
 
615
- #: class-multisite.php:144
616
  msgid ""
617
  "You run a Multisite installation with subfolders, which prevents this plugin "
618
  "from fixing your missing server variable in the wp-config.php."
619
  msgstr ""
620
 
621
- #: class-multisite.php:145
622
  msgid ""
623
  "Because the $_SERVER[\"HTTPS\"] variable is not set, your website may "
624
  "experience redirect loops."
625
  msgstr ""
626
 
627
- #: class-multisite.php:146
628
  msgid "Activate networkwide to fix this."
629
  msgstr ""
630
 
631
- #: class-multisite.php:157
632
  msgid ""
633
  "You run a Multisite installation with subdomains, but your site doesn't have "
634
  "a wildcard certificate."
635
  msgstr ""
636
 
637
- #: class-multisite.php:158
638
  msgid ""
639
  "This leads to issues when activating SSL networkwide since subdomains will "
640
  "be forced over SSL as well while they don't have a valid certificate."
641
  msgstr ""
642
 
643
- #: class-multisite.php:159
644
  msgid "Activate SSL per site or install a wildcard certificate to fix this."
645
  msgstr ""
646
 
@@ -678,7 +760,8 @@ msgid ""
678
  "for: "
679
  msgstr ""
680
 
681
- #: class-multisite.php:546
 
682
  msgid ""
683
  "Images, stylesheets or scripts from a domain without an SSL certificate: "
684
  "remove them or move to your own server."
@@ -734,86 +817,87 @@ msgstr ""
734
  msgid "Really Simple SSL has converted all your websites to SSL."
735
  msgstr ""
736
 
737
- #: class-multisite.php:1013
738
  msgid "Really Simple SSL has converted all your websites to non SSL."
739
  msgstr ""
740
 
741
- #: class-site-health.php:29
742
  msgid "SSL Status Test"
743
  msgstr ""
744
 
745
- #: class-site-health.php:35
746
  msgid "Security Headers Test"
747
  msgstr ""
748
 
749
- #: class-site-health.php:52
750
  msgid "Recommended security headers installed"
751
  msgstr ""
752
 
753
- #: class-site-health.php:60
754
  msgid "The recommended security headers are detected on your site."
755
  msgstr ""
756
 
757
- #: class-site-health.php:72
758
  msgid "Not all recommended security headers are installed"
759
  msgstr ""
760
 
761
- #: class-site-health.php:73
762
  msgid "Your .htaccess file does not contain all recommended security headers."
763
  msgstr ""
764
 
765
- #: class-site-health.php:77
766
  msgid "Learn more about security headers"
767
  msgstr ""
768
 
769
- #: class-site-health.php:96
770
  msgid "301 SSL redirect enabled"
771
  msgstr ""
772
 
773
- #: class-site-health.php:104
774
  msgid "You have set a 301 redirect to SSL. This is important for SEO purposes"
775
  msgstr ""
776
 
777
- #: class-site-health.php:113
778
  msgid "SSL is not enabled."
779
  msgstr ""
780
 
781
- #: class-site-health.php:116
782
  msgid ""
783
  "Really Simple SSL detected an SSL certificate, but has not been configured "
784
  "to enforce SSL."
785
  msgstr ""
786
 
787
- #: class-site-health.php:122 grid/templates/progress-footer.php:25
 
788
  msgid "Activate SSL"
789
  msgstr ""
790
 
791
- #: class-site-health.php:126
792
  msgid "No SSL detected."
793
  msgstr ""
794
 
795
- #: class-site-health.php:129
796
  msgid ""
797
  "Really Simple SSL is installed, but no valid SSL certificate is detected."
798
  msgstr ""
799
 
800
- #: class-site-health.php:135
801
  msgid "No 301 redirect to SSL enabled."
802
  msgstr ""
803
 
804
- #: class-site-health.php:138
805
  msgid "To ensure all traffic passes through SSL, please enable a 301 redirect."
806
  msgstr ""
807
 
808
- #: class-site-health.php:143
809
  msgid "Enable 301 redirect"
810
  msgstr ""
811
 
812
- #: class-site-health.php:147
813
  msgid "301 .htaccess redirect is not enabled."
814
  msgstr ""
815
 
816
- #: class-site-health.php:150
817
  msgid ""
818
  "The 301 .htaccess redirect is the fastest and most reliable redirect option."
819
  msgstr ""
@@ -822,15 +906,7 @@ msgstr ""
822
  msgid "Save settings"
823
  msgstr ""
824
 
825
- #: grid/templates/other-plugins.php:32
826
- msgid "Track searches on your website"
827
- msgstr ""
828
-
829
- #: grid/templates/other-plugins.php:43
830
- msgid "Consent Management as it should be "
831
- msgstr ""
832
-
833
- #: grid/templates/other-plugins.php:54
834
  msgid "Beautiful recipes optimized for Google "
835
  msgstr ""
836
 
@@ -863,6 +939,7 @@ msgid "SSL configuration finished!"
863
  msgstr ""
864
 
865
  #: grid/templates/settings-footer.php:3
 
866
  msgid "Save"
867
  msgstr ""
868
 
@@ -908,7 +985,7 @@ msgstr ""
908
 
909
  #: grid/templates/tips-tricks.php:10 grid/templates/tips-tricks.php:18
910
  #: grid/templates/tips-tricks.php:26 grid/templates/tips-tricks.php:34
911
- #: grid/templates/tips-tricks.php:42
912
  msgid "Read more"
913
  msgstr ""
914
 
@@ -921,18 +998,1201 @@ msgid "Improve security: Add security headers"
921
  msgstr ""
922
 
923
  #: grid/templates/tips-tricks.php:31
924
- msgid "Improve security: Secure cookies"
925
  msgstr ""
926
 
927
  #: grid/templates/tips-tricks.php:39
 
 
 
 
928
  msgid "Information about landing page redirects"
929
  msgstr ""
930
 
931
- #: grid/templates/tips-tricks.php:48
932
  #, php-format
933
  msgid "Any questions? See the %sdocumentation%s or the %sWordPress Forum%s."
934
  msgstr ""
935
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
936
  #: multisite-cron.php:11
937
  msgid "Once every minute"
938
  msgstr ""
@@ -948,17 +2208,17 @@ msgid ""
948
  "higher"
949
  msgstr ""
950
 
951
- #: rlrsssl-really-simple-ssl.php:160
952
  msgid "Plugin dependency error"
953
  msgstr ""
954
 
955
- #: rlrsssl-really-simple-ssl.php:161
956
  msgid ""
957
  "You have a premium add-on with a version that is not compatible with the "
958
  ">4.0 release of Really Simple SSL."
959
  msgstr ""
960
 
961
- #: rlrsssl-really-simple-ssl.php:162
962
  msgid ""
963
  "Please upgrade to the latest version to be able use the full functionality "
964
  "of the plugin."
3
  msgstr ""
4
  "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
5
  "Project-Id-Version: Really Simple SSL\n"
6
+ "POT-Creation-Date: 2021-07-06 09:43+0200\n"
7
+ "PO-Revision-Date: 2021-07-06 09:42+0200\n"
8
  "Last-Translator: Rogier Lankhorst <rogierlankhorst@gmail.com>\n"
9
  "Language-Team: Rogier Lankhorst <rogierlankhorst@gmail.com>\n"
10
  "MIME-Version: 1.0\n"
23
 
24
  #: class-admin.php:49 class-cache.php:10 class-certificate.php:14
25
  #: class-front-end.php:18 class-help.php:9 class-mixed-content-fixer.php:13
26
+ #: class-multisite.php:27 class-site-health.php:12
27
+ #: lets-encrypt/class-letsencrypt-handler.php:30
28
  #, php-format
29
  msgid "%s is a singleton class and you cannot create a second instance."
30
  msgstr ""
31
 
32
+ #: class-admin.php:115
33
  #, php-format
34
  msgid ""
35
  "Really Simple SSL and Really Simple SSL add-ons do not process any personal "
38
  "href=\"%s\" target=\"_blank\">here</a>."
39
  msgstr ""
40
 
41
+ #: class-admin.php:503 lets-encrypt/wizard/templates/last-step.php:13
42
  msgid "Almost ready to migrate to SSL!"
43
  msgstr ""
44
 
45
+ #: class-admin.php:512 lets-encrypt/wizard/templates/activate.php:45
46
  msgid "Before you migrate, please check for: "
47
  msgstr ""
48
 
49
+ #: class-admin.php:514 class-multisite.php:545
50
+ #: lets-encrypt/wizard/templates/activate.php:19
51
+ #: lets-encrypt/wizard/templates/activate.php:48
52
  msgid ""
53
  "Http references in your .css and .js files: change any http:// into https://"
54
  msgstr ""
55
 
56
+ #: class-admin.php:515
57
  msgid ""
58
  "Images, stylesheets or scripts from a domain without an SSL certificate: "
59
  "remove them or move to your own server"
60
  msgstr ""
61
 
62
+ #: class-admin.php:521 lets-encrypt/wizard/templates/activate.php:55
63
  #, php-format
64
  msgid ""
65
  "We strongly recommend to create a %sbackup%s of your site before activating "
66
  "SSL"
67
  msgstr ""
68
 
69
+ #: class-admin.php:522 lets-encrypt/wizard/templates/activate.php:56
70
  msgid "You may need to login in again."
71
  msgstr ""
72
 
73
+ #: class-admin.php:525 lets-encrypt/wizard/templates/activate.php:58
74
+ msgid "An SSL certificate has been detected"
75
+ msgstr ""
76
+
77
+ #: class-admin.php:527
78
+ msgid ""
79
+ "No SSL certificate has been detected. Generate one by pressing the 'Install "
80
+ "SSL certificate' button."
81
+ msgstr ""
82
+
83
+ #: class-admin.php:531 lets-encrypt/wizard/templates/activate.php:26
84
+ #: lets-encrypt/wizard/templates/activate.php:66
85
  msgid ""
86
  "You can also let the automatic scan of the pro version handle this for you, "
87
  "and get premium support, increased security with HSTS and more!"
88
  msgstr ""
89
 
90
+ #: class-admin.php:532 lets-encrypt/wizard/templates/activate.php:30
91
+ #: lets-encrypt/wizard/templates/activate.php:70
92
  msgid "Check out Really Simple SSL Pro"
93
  msgstr ""
94
 
95
+ #: class-admin.php:773 class-admin.php:2935
96
+ #: lets-encrypt/wizard/class-wizard.php:907
97
+ msgid "Retry"
98
+ msgstr ""
99
+
100
+ #: class-admin.php:777 lets-encrypt/wizard/class-wizard.php:903
101
  msgid "Go ahead, activate SSL!"
102
  msgstr ""
103
 
104
+ #: class-admin.php:781 class-admin.php:2934 class-admin.php:2948
105
+ msgid "Install SSL certificate"
106
+ msgstr ""
107
+
108
+ #: class-admin.php:784 lets-encrypt/wizard/class-wizard.php:912
109
  msgid "Get ready with PRO!"
110
  msgstr ""
111
 
112
+ #: class-admin.php:2340
113
  msgid ""
114
  "A definition of a siteurl or homeurl was detected in your wp-config.php, but "
115
  "the file is not writable."
116
  msgstr ""
117
 
118
+ #: class-admin.php:2342 class-admin.php:2369
119
+ #, php-format
120
+ msgid "Set your wp-config.php to %swritable%s and reload this page."
121
  msgstr ""
122
 
123
+ #: class-admin.php:2345
124
  msgid "Your wp-config.php has to be edited, but is not writable."
125
  msgstr ""
126
 
127
+ #: class-admin.php:2346
128
  msgid ""
129
  "Because your site is behind a loadbalancer and is_ssl() returns false, you "
130
  "should add the following line of code to your wp-config.php."
131
  msgstr ""
132
 
133
+ #: class-admin.php:2362
134
+ #, php-format
135
+ msgid "Or set your wp-config.php to %swritable%s and reload this page."
136
  msgstr ""
137
 
138
+ #: class-admin.php:2368
139
  msgid ""
140
  "Because your server does not pass a variable with which WordPress can detect "
141
  "SSL, WordPress may create redirect loops on SSL."
142
  msgstr ""
143
 
144
+ #: class-admin.php:2375
145
  msgid "System detection encountered issues"
146
  msgstr ""
147
 
148
+ #: class-admin.php:2485
149
  #, php-format
150
  msgid ""
151
  "Hi, Really Simple SSL has kept your site secure for some time now, awesome! "
154
  "feedback, leave us a %smessage%s."
155
  msgstr ""
156
 
157
+ #: class-admin.php:2487
158
  #, php-format
159
  msgid ""
160
  "Hi, Really Simple SSL has kept your site secure for a month now, awesome! If "
163
  "feedback, leave us a %smessage%s."
164
  msgstr ""
165
 
166
+ #: class-admin.php:2493
167
  msgid "Leave a review"
168
  msgstr ""
169
 
170
+ #: class-admin.php:2494
171
  msgid "Maybe later"
172
  msgstr ""
173
 
174
+ #: class-admin.php:2495
175
  msgid "Don't show again"
176
  msgstr ""
177
 
178
+ #: class-admin.php:2677
179
  msgid "SSL settings"
180
  msgstr ""
181
 
182
+ #: class-admin.php:2678
183
  msgid "SSL"
184
  msgstr ""
185
 
186
+ #: class-admin.php:2700 class-admin.php:3514 class-admin.php:3893
187
+ #: class-admin.php:4410 class-multisite.php:224 class-multisite.php:335
188
  #: class-multisite.php:382
189
  msgid "Settings"
190
  msgstr ""
191
 
192
+ #: class-admin.php:2737
193
  msgid "General"
194
  msgstr ""
195
 
196
+ #: class-admin.php:2755 class-multisite.php:441
197
  #: grid/templates/tips-tricks-footer.php:3
198
  msgid "Documentation"
199
  msgstr ""
200
 
201
+ #: class-admin.php:2761 class-admin.php:4414 class-multisite.php:228
202
+ #: class-multisite.php:447 lets-encrypt/wizard/class-wizard.php:405
203
  msgid "Support"
204
  msgstr ""
205
 
206
+ #: class-admin.php:2816
207
  msgid "No recommended redirect rules detected."
208
  msgstr ""
209
 
210
+ #: class-admin.php:2831
211
+ msgid "(Unknown)"
212
+ msgstr ""
213
+
214
+ #: class-admin.php:2839
215
  msgid "Major security issue!"
216
  msgstr ""
217
 
218
+ #: class-admin.php:2840
219
  msgid ""
220
  "The 'force-deactivate.php' file has to be renamed to .txt. Otherwise your "
221
  "ssl can be deactivated by anyone on the internet."
222
  msgstr ""
223
 
224
+ #: class-admin.php:2841
225
  msgid "Check again"
226
  msgstr ""
227
 
228
+ #: class-admin.php:2854
229
+ #, php-format
230
+ msgid ""
231
+ "The Really Simple SSL plugin folder in the /wp-content/plugins/ directory "
232
+ "has been renamed to %s. This might cause issues when deactivating, or with "
233
+ "premium add-ons. To fix this you can rename the Really Simple SSL folder "
234
+ "back to the default %s."
235
+ msgstr ""
236
+
237
+ #: class-admin.php:2870
238
  msgid ""
239
  "SSL is now activated. Check if your website is secure by following this "
240
  "article."
241
  msgstr ""
242
 
243
+ #: class-admin.php:2885
244
  msgid ""
245
  "Don't forget to change your settings in Google Analytics and Search Console."
246
  msgstr ""
247
 
248
+ #: class-admin.php:2899
249
  msgid "https://really-simple-ssl.com/really-simple-ssl-4-a-new-dashboard"
250
  msgstr ""
251
 
252
+ #: class-admin.php:2900
253
  msgid "Really Simple SSL 4.0. Learn more about our newest major release."
254
  msgstr ""
255
 
256
+ #: class-admin.php:2913
257
  msgid "SSL is enabled on your site."
258
  msgstr ""
259
 
260
+ #: class-admin.php:2917
261
  msgid "SSL is not enabled yet."
262
  msgstr ""
263
 
264
+ #: class-admin.php:2928
265
  msgid "Cannot activate SSL due to system configuration."
266
  msgstr ""
267
 
268
+ #: class-admin.php:2932
269
  msgid "No SSL detected"
270
  msgstr ""
271
 
272
+ #: class-admin.php:2933
273
+ msgid "No SSL detected. Use the retry button to check again."
274
+ msgstr ""
275
+
276
+ #: class-admin.php:2940
277
+ msgid "An SSL certificate was detected on your site."
278
+ msgstr ""
279
+
280
+ #: class-admin.php:2945
281
+ msgid "Your SSL certificate will expire soon."
282
+ msgstr ""
283
+
284
+ #: class-admin.php:2946
285
  #, php-format
286
+ msgid "SSL certificate will expire on %s."
287
+ msgstr ""
288
+
289
+ #: class-admin.php:2946
290
  msgid ""
291
+ "If your hosting provider auto-renews your certificate, no action is "
292
+ "required. Alternatively, you have the option to generate an SSL certificate "
293
+ "with Really Simple SSL."
294
  msgstr ""
295
 
296
+ #: class-admin.php:2947
297
+ #, php-format
298
+ msgid ""
299
+ "Depending on your hosting provider, %smanual installation%s may be required."
300
  msgstr ""
301
 
302
+ #: class-admin.php:2949
303
+ msgid "Re-check"
304
+ msgstr ""
305
+
306
+ #: class-admin.php:2962
307
  msgid "Mixed content fixer was successfully detected on the front-end."
308
  msgstr ""
309
 
310
+ #: class-admin.php:2967
311
  msgid "Really Simple SSL has received no response from the webpage."
312
  msgstr ""
313
 
314
+ #: class-admin.php:2974
315
  msgid ""
316
  "The mixed content fixer is active, but was not detected on the frontpage."
317
  msgstr ""
318
 
319
+ #: class-admin.php:2979
320
  msgid "Error occurred when retrieving the webpage."
321
  msgstr ""
322
 
323
+ #: class-admin.php:2985
324
  msgid ""
325
  "Mixed content fixer not enabled. Enable the option to fix mixed content on "
326
  "your site."
327
  msgstr ""
328
 
329
+ #: class-admin.php:2991
330
  #, php-format
331
  msgid ""
332
  "The mixed content fixer could not be detected due to a cURL error: %s. cURL "
334
  "affect the front-end of your site. Contact your hosting provider for a fix."
335
  msgstr ""
336
 
337
+ #: class-admin.php:3004
338
  msgid "301 redirect to https set."
339
  msgstr ""
340
 
341
+ #: class-admin.php:3008
342
  msgid ""
343
  "No 301 redirect is set. Enable the WordPress 301 redirect in the settings to "
344
  "get a 301 permanent redirect."
345
  msgstr ""
346
 
347
+ #: class-admin.php:3020
348
  msgid "301 redirect to https set: .htaccess redirect."
349
  msgstr ""
350
 
351
+ #: class-admin.php:3025
352
  msgid ""
353
  "WordPress 301 redirect enabled. We recommend to enable a 301 .htaccess "
354
  "redirect."
355
  msgstr ""
356
 
357
+ #: class-admin.php:3031
358
  msgid ""
359
  "Enable a .htaccess redirect or WordPress redirect in the settings to create "
360
  "a 301 redirect."
361
  msgstr ""
362
 
363
+ #: class-admin.php:3037
364
  #, php-format
365
  msgid ""
366
  "The %s file is not writable. You can either use the WordPress redirect, add "
367
+ "the rules manually, or set the file to %swritable%s."
368
  msgstr ""
369
 
370
+ #: class-admin.php:3043
371
  msgid ""
372
  "The .htaccess redirect rules selected by this plugin failed in the test. Set "
373
  "manually or dismiss to leave on WordPress redirect."
374
  msgstr ""
375
 
376
+ #: class-admin.php:3058
377
  msgid ""
378
  "Your site uses Elementor. This can require some additional steps before "
379
  "getting the secure lock."
380
  msgstr ""
381
 
382
+ #: class-admin.php:3072
383
  msgid ""
384
  "Your site uses Divi. This can require some additional steps before getting "
385
  "the secure lock."
386
  msgstr ""
387
 
388
+ #: class-admin.php:3085
389
  msgid "HTTP Strict Transport Security was enabled."
390
  msgstr ""
391
 
392
+ #: class-admin.php:3089
393
  #, php-format
394
  msgid "HTTP Strict Transport Security is not enabled %s(Read more)%s."
395
  msgstr ""
396
 
397
+ #: class-admin.php:3104
398
+ msgid "New feature! HttpOnly Secure cookies have been set automatically!"
399
  msgstr ""
400
 
401
+ #: class-admin.php:3111
402
+ msgid "HttpOnly Secure cookies not set."
 
403
  msgstr ""
404
 
405
+ #: class-admin.php:3118
406
+ msgid ""
407
+ "To set the httponly secure cookie settings, your wp-config.php has to be "
408
+ "edited, but the file is not writable."
409
+ msgstr ""
410
+
411
+ #: class-admin.php:3118
412
+ msgid "Add the following lines of code to your wp-config.php."
413
+ msgstr ""
414
+
415
+ #: class-admin.php:3126
416
+ msgid "Or set your wp-config.php to writable and reload this page."
417
+ msgstr ""
418
+
419
+ #: class-admin.php:3140
420
  #, php-format
421
  msgid "Recommended security headers not enabled (%sRead more%s)."
422
  msgstr ""
423
 
424
+ #: class-admin.php:3151
425
+ msgid ""
426
+ "Due to a recent update by WP Engine, we have changed your settings "
427
+ "automatically to adapt."
428
+ msgstr ""
429
+
430
+ #: class-admin.php:3164
431
  msgid ""
432
+ "You have the Really Simple SSL Let's Encrypt beta add-on activated. This "
433
+ "functionality has now been integrated in core, so you can deactivate the add-"
434
+ "on."
435
  msgstr ""
436
 
437
+ #: class-admin.php:3272
438
  #, php-format
439
  msgid "%sMore info%s or %sdismiss%s"
440
  msgstr ""
441
 
442
+ #: class-admin.php:3275
443
  #, php-format
444
  msgid "%sEnable%s or %sdismiss%s"
445
  msgstr ""
446
 
447
+ #: class-admin.php:3506 class-multisite.php:374
448
  msgid "Your progress"
449
  msgstr ""
450
 
451
+ #: class-admin.php:3521
452
  msgid "Tips & Tricks"
453
  msgstr ""
454
 
455
+ #: class-admin.php:3529 class-multisite.php:398
456
  msgid "Our plugins"
457
  msgstr ""
458
 
459
+ #: class-admin.php:3536 class-multisite.php:390
460
  msgid "Support forum"
461
  msgstr ""
462
 
463
+ #: class-admin.php:3634
464
  msgid "Install"
465
  msgstr ""
466
 
467
+ #: class-admin.php:3637
468
+ msgid "Upgrade to pro"
469
  msgstr ""
470
 
471
+ #: class-admin.php:3639
472
+ msgid "Installed"
473
  msgstr ""
474
 
475
+ #: class-admin.php:3696
476
  msgid "Instructions manual"
477
  msgstr ""
478
 
479
+ #: class-admin.php:3761
480
  msgid "Completed"
481
  msgstr ""
482
 
483
+ #: class-admin.php:3763
484
  msgid "Warning"
485
  msgstr ""
486
 
487
+ #: class-admin.php:3765
488
  msgid "Open"
489
  msgstr ""
490
 
491
+ #: class-admin.php:3767
492
  msgid "Premium"
493
  msgstr ""
494
 
495
+ #: class-admin.php:3815
496
  msgid "More info"
497
  msgstr ""
498
 
499
+ #: class-admin.php:3854 grid/templates/progress.php:33
500
  #, php-format
501
  msgid ""
502
  "Basic SSL configuration finished! Improve your score with %sReally Simple "
503
  "SSL Pro%s."
504
  msgstr ""
505
 
506
+ #: class-admin.php:3856 grid/templates/progress.php:25
507
  msgid "SSL is activated on your site."
508
  msgstr ""
509
 
510
+ #: class-admin.php:3858 grid/templates/progress.php:39
511
  msgid "SSL is not yet enabled on this site."
512
  msgstr ""
513
 
514
+ #: class-admin.php:3861 grid/templates/progress.php:25
515
  #, fuzzy, php-format
516
  msgid "You still have %s task open."
517
  msgstr ""
518
  "#-#-#-#-# legacy_PHP_extracted.pot (PACKAGE VERSION) #-#-#-#-#\n"
519
  "#-#-#-#-# 1legacy_PHP_extracted.pot (PACKAGE VERSION) #-#-#-#-#\n"
520
 
521
+ #: class-admin.php:3862
522
  #, php-format
523
  msgid " You still have %s tasks open."
524
  msgstr ""
525
 
526
+ #: class-admin.php:3868
527
  msgid "Copied!"
528
  msgstr ""
529
 
530
+ #: class-admin.php:3895
531
  msgid ""
532
  "In most cases you need to leave this enabled, to prevent mixed content "
533
  "issues on your site."
534
  msgstr ""
535
 
536
+ #: class-admin.php:3896
537
  msgid "Mixed content fixer"
538
  msgstr ""
539
 
540
+ #: class-admin.php:3900
541
  msgid ""
542
  "Redirects all requests over HTTP to HTTPS using a PHP 301 redirect. Enable "
543
  "if the .htaccess redirect cannot be used, for example on NGINX servers."
544
  msgstr ""
545
 
546
+ #: class-admin.php:3901
547
  msgid "Enable WordPress 301 redirect"
548
  msgstr ""
549
 
550
+ #: class-admin.php:3905
551
  msgid ""
552
  "A .htaccess redirect is faster and works better with caching. Really Simple "
553
  "SSL detects the redirect code that is most likely to work (99% of websites), "
555
  "if anything goes wrong!"
556
  msgstr ""
557
 
558
+ #: class-admin.php:3906 class-site-health.php:159
559
  msgid "Enable 301 .htaccess redirect"
560
  msgstr ""
561
 
562
+ #: class-admin.php:3912
563
  msgid ""
564
  "If you want to customize the Really Simple SSL .htaccess, you need to "
565
  "prevent Really Simple SSL from rewriting it. Enabling this option will do "
566
  "that."
567
  msgstr ""
568
 
569
+ #: class-admin.php:3913
570
  msgid "Stop editing the .htaccess file"
571
  msgstr ""
572
 
573
+ #: class-admin.php:3918
574
  msgid ""
575
  "If this option is set to true, the mixed content fixer will fire on the init "
576
  "hook instead of the template_redirect hook. Only use this option when you "
577
  "experience problems with the mixed content fixer.\""
578
  msgstr ""
579
 
580
+ #: class-admin.php:3919
581
  msgid "Fire mixed content fixer with different method"
582
  msgstr ""
583
 
584
+ #: class-admin.php:3922
585
  msgid ""
586
  "Enable this option to permanently dismiss all +1 notices in the 'Your "
587
  "progress' tab"
588
  msgstr ""
589
 
590
+ #: class-admin.php:3923
591
  msgid "Dismiss all Really Simple SSL notices"
592
  msgstr ""
593
 
594
+ #: class-admin.php:4030 class-admin.php:4060 class-admin.php:4383
595
  msgid "This option is enabled on the network menu."
596
  msgstr ""
597
 
598
+ #: class-admin.php:4056
599
  #, php-format
600
  msgid ""
601
  "Before you enable the htaccess redirect, make sure you know how to %sregain "
602
  "access%s to your site in case of a redirect loop."
603
  msgstr ""
604
 
605
+ #: class-admin.php:4063
606
  msgid ""
607
  "If the setting 'stop editing the .htaccess file' is enabled, you can't "
608
  "change this setting."
609
  msgstr ""
610
 
611
+ #: class-admin.php:4095
612
+ #, php-format
613
+ msgid ".htaccess is currently not %swritable%s."
614
  msgstr ""
615
 
616
+ #: class-admin.php:4327
617
  msgid "Are you sure?"
618
  msgstr ""
619
 
620
+ #: class-admin.php:4340
621
  msgid "To deactivate the plugin correctly, please select if you want to:"
622
  msgstr ""
623
 
624
+ #: class-admin.php:4342
625
  msgid "Deactivate, but stay on SSL."
626
  msgstr ""
627
 
628
+ #: class-admin.php:4343
629
  msgid ""
630
  "Deactivate, and revert to http. This will remove all changes by the plugin."
631
  msgstr ""
632
 
633
+ #: class-admin.php:4345
634
  msgid "Deactivating the plugin while keeping SSL will do the following:"
635
  msgstr ""
636
 
637
+ #: class-admin.php:4347
638
  msgid "The mixed content fixer will stop working"
639
  msgstr ""
640
 
641
+ #: class-admin.php:4348
642
  msgid "The WordPress 301 redirect will stop working"
643
  msgstr ""
644
 
645
+ #: class-admin.php:4349
646
  msgid "Your site address will remain https://"
647
  msgstr ""
648
 
649
+ #: class-admin.php:4350
650
  msgid "The .htaccess redirect will remain active"
651
  msgstr ""
652
 
653
+ #: class-admin.php:4360
654
  msgid "Cancel"
655
  msgstr ""
656
 
657
+ #: class-admin.php:4361
658
  msgid "Deactivate, keep https"
659
  msgstr ""
660
 
661
+ #: class-admin.php:4362
662
  msgid "Deactivate, revert to http"
663
  msgstr ""
664
 
665
+ #: class-admin.php:4416 class-multisite.php:230
666
  msgid "Premium Support"
667
  msgstr ""
668
 
669
+ #: class-admin.php:4422 class-multisite.php:236
670
  msgid "Upgrade to premium"
671
  msgstr ""
672
 
682
  msgid "SSL is activated per site."
683
  msgstr ""
684
 
685
+ #: class-multisite.php:121
686
  msgid "SSL is enabled networkwide."
687
  msgstr ""
688
 
689
+ #: class-multisite.php:125
690
  msgid "SSL is enabled per site."
691
  msgstr ""
692
 
693
+ #: class-multisite.php:129
694
  msgid "SSL is not enabled yet"
695
  msgstr ""
696
 
697
+ #: class-multisite.php:143
698
  msgid ""
699
  "You run a Multisite installation with subfolders, which prevents this plugin "
700
  "from fixing your missing server variable in the wp-config.php."
701
  msgstr ""
702
 
703
+ #: class-multisite.php:144
704
  msgid ""
705
  "Because the $_SERVER[\"HTTPS\"] variable is not set, your website may "
706
  "experience redirect loops."
707
  msgstr ""
708
 
709
+ #: class-multisite.php:145
710
  msgid "Activate networkwide to fix this."
711
  msgstr ""
712
 
713
+ #: class-multisite.php:156
714
  msgid ""
715
  "You run a Multisite installation with subdomains, but your site doesn't have "
716
  "a wildcard certificate."
717
  msgstr ""
718
 
719
+ #: class-multisite.php:157
720
  msgid ""
721
  "This leads to issues when activating SSL networkwide since subdomains will "
722
  "be forced over SSL as well while they don't have a valid certificate."
723
  msgstr ""
724
 
725
+ #: class-multisite.php:158
726
  msgid "Activate SSL per site or install a wildcard certificate to fix this."
727
  msgstr ""
728
 
760
  "for: "
761
  msgstr ""
762
 
763
+ #: class-multisite.php:546 lets-encrypt/wizard/templates/activate.php:20
764
+ #: lets-encrypt/wizard/templates/activate.php:49
765
  msgid ""
766
  "Images, stylesheets or scripts from a domain without an SSL certificate: "
767
  "remove them or move to your own server."
817
  msgid "Really Simple SSL has converted all your websites to SSL."
818
  msgstr ""
819
 
820
+ #: class-multisite.php:1014
821
  msgid "Really Simple SSL has converted all your websites to non SSL."
822
  msgstr ""
823
 
824
+ #: class-site-health.php:33
825
  msgid "SSL Status Test"
826
  msgstr ""
827
 
828
+ #: class-site-health.php:39
829
  msgid "Security Headers Test"
830
  msgstr ""
831
 
832
+ #: class-site-health.php:56
833
  msgid "Recommended security headers installed"
834
  msgstr ""
835
 
836
+ #: class-site-health.php:64
837
  msgid "The recommended security headers are detected on your site."
838
  msgstr ""
839
 
840
+ #: class-site-health.php:76
841
  msgid "Not all recommended security headers are installed"
842
  msgstr ""
843
 
844
+ #: class-site-health.php:77
845
  msgid "Your .htaccess file does not contain all recommended security headers."
846
  msgstr ""
847
 
848
+ #: class-site-health.php:81
849
  msgid "Learn more about security headers"
850
  msgstr ""
851
 
852
+ #: class-site-health.php:100
853
  msgid "301 SSL redirect enabled"
854
  msgstr ""
855
 
856
+ #: class-site-health.php:108
857
  msgid "You have set a 301 redirect to SSL. This is important for SEO purposes"
858
  msgstr ""
859
 
860
+ #: class-site-health.php:117
861
  msgid "SSL is not enabled."
862
  msgstr ""
863
 
864
+ #: class-site-health.php:120
865
  msgid ""
866
  "Really Simple SSL detected an SSL certificate, but has not been configured "
867
  "to enforce SSL."
868
  msgstr ""
869
 
870
+ #: class-site-health.php:126 grid/templates/progress-footer.php:25
871
+ #: lets-encrypt/wizard/config/steps.php:151
872
  msgid "Activate SSL"
873
  msgstr ""
874
 
875
+ #: class-site-health.php:130
876
  msgid "No SSL detected."
877
  msgstr ""
878
 
879
+ #: class-site-health.php:133
880
  msgid ""
881
  "Really Simple SSL is installed, but no valid SSL certificate is detected."
882
  msgstr ""
883
 
884
+ #: class-site-health.php:139
885
  msgid "No 301 redirect to SSL enabled."
886
  msgstr ""
887
 
888
+ #: class-site-health.php:142
889
  msgid "To ensure all traffic passes through SSL, please enable a 301 redirect."
890
  msgstr ""
891
 
892
+ #: class-site-health.php:147
893
  msgid "Enable 301 redirect"
894
  msgstr ""
895
 
896
+ #: class-site-health.php:151
897
  msgid "301 .htaccess redirect is not enabled."
898
  msgstr ""
899
 
900
+ #: class-site-health.php:154
901
  msgid ""
902
  "The 301 .htaccess redirect is the fastest and most reliable redirect option."
903
  msgstr ""
906
  msgid "Save settings"
907
  msgstr ""
908
 
909
+ #: grid/templates/other-plugins.php:40
 
 
 
 
 
 
 
 
910
  msgid "Beautiful recipes optimized for Google "
911
  msgstr ""
912
 
939
  msgstr ""
940
 
941
  #: grid/templates/settings-footer.php:3
942
+ #: lets-encrypt/wizard/class-field.php:1302
943
  msgid "Save"
944
  msgstr ""
945
 
985
 
986
  #: grid/templates/tips-tricks.php:10 grid/templates/tips-tricks.php:18
987
  #: grid/templates/tips-tricks.php:26 grid/templates/tips-tricks.php:34
988
+ #: grid/templates/tips-tricks.php:42 grid/templates/tips-tricks.php:50
989
  msgid "Read more"
990
  msgstr ""
991
 
998
  msgstr ""
999
 
1000
  #: grid/templates/tips-tricks.php:31
1001
+ msgid "Adding a Content Security Policy"
1002
  msgstr ""
1003
 
1004
  #: grid/templates/tips-tricks.php:39
1005
+ msgid "Adding a Permission Policy"
1006
+ msgstr ""
1007
+
1008
+ #: grid/templates/tips-tricks.php:47
1009
  msgid "Information about landing page redirects"
1010
  msgstr ""
1011
 
1012
+ #: grid/templates/tips-tricks.php:56
1013
  #, php-format
1014
  msgid "Any questions? See the %sdocumentation%s or the %sWordPress Forum%s."
1015
  msgstr ""
1016
 
1017
+ #: lets-encrypt/class-letsencrypt-handler.php:189
1018
+ msgid ""
1019
+ "It is not possible to install Let's Encrypt on a subsite. Please go to the "
1020
+ "main site of your website."
1021
+ msgstr ""
1022
+
1023
+ #: lets-encrypt/class-letsencrypt-handler.php:194
1024
+ #: lets-encrypt/class-letsencrypt-handler.php:199
1025
+ msgid ""
1026
+ "It is not possible to install Let's Encrypt on a subfolder configuration."
1027
+ msgstr ""
1028
+
1029
+ #: lets-encrypt/class-letsencrypt-handler.php:204
1030
+ msgid "It is not possible to install Let's Encrypt on a localhost environment."
1031
+ msgstr ""
1032
+
1033
+ #: lets-encrypt/class-letsencrypt-handler.php:208
1034
+ msgid "Your domain meets the requirements for Let's Encrypt."
1035
+ msgstr ""
1036
+
1037
+ #: lets-encrypt/class-letsencrypt-handler.php:272
1038
+ msgid "(unknown)"
1039
+ msgstr ""
1040
+
1041
+ #: lets-encrypt/class-letsencrypt-handler.php:278
1042
+ #, php-format
1043
+ msgid "Your certificate will expire on %s."
1044
+ msgstr ""
1045
+
1046
+ #: lets-encrypt/class-letsencrypt-handler.php:278
1047
+ msgid "Continue to renew."
1048
+ msgstr ""
1049
+
1050
+ #: lets-encrypt/class-letsencrypt-handler.php:282
1051
+ msgid "You already have a valid SSL certificate."
1052
+ msgstr ""
1053
+
1054
+ #: lets-encrypt/class-letsencrypt-handler.php:288
1055
+ msgid "SSL certificate should be generated and installed."
1056
+ msgstr ""
1057
+
1058
+ #: lets-encrypt/class-letsencrypt-handler.php:319
1059
+ msgid ""
1060
+ "The Hosting Panel software was not recognized. Depending on your hosting "
1061
+ "provider, the generated certificate may need to be installed manually."
1062
+ msgstr ""
1063
+
1064
+ #: lets-encrypt/class-letsencrypt-handler.php:323
1065
+ msgid ""
1066
+ "CPanel recognized. Possibly the certificate can be installed automatically."
1067
+ msgstr ""
1068
+
1069
+ #: lets-encrypt/class-letsencrypt-handler.php:326
1070
+ msgid ""
1071
+ "Plesk recognized. Possibly the certificate can be installed automatically."
1072
+ msgstr ""
1073
+
1074
+ #: lets-encrypt/class-letsencrypt-handler.php:329
1075
+ msgid ""
1076
+ "DirectAdmin recognized. Possibly the certificate can be installed "
1077
+ "automatically."
1078
+ msgstr ""
1079
+
1080
+ #: lets-encrypt/class-letsencrypt-handler.php:345
1081
+ msgid ""
1082
+ "The PHP function CURL is not available on your server, which is required. "
1083
+ "Please contact your hosting provider."
1084
+ msgstr ""
1085
+
1086
+ #: lets-encrypt/class-letsencrypt-handler.php:349
1087
+ msgid "The PHP function CURL has successfully been detected."
1088
+ msgstr ""
1089
+
1090
+ #: lets-encrypt/class-letsencrypt-handler.php:369
1091
+ msgid "Successfully retrieved account"
1092
+ msgstr ""
1093
+
1094
+ #: lets-encrypt/class-letsencrypt-handler.php:377
1095
+ msgid "The used domain for your email address is not allowed."
1096
+ msgstr ""
1097
+
1098
+ #: lets-encrypt/class-letsencrypt-handler.php:378
1099
+ #, php-format
1100
+ msgid "Please change your email address %shere%s and try again."
1101
+ msgstr ""
1102
+
1103
+ #: lets-encrypt/class-letsencrypt-handler.php:387
1104
+ msgid "The email address was not set. Please set the email address"
1105
+ msgstr ""
1106
+
1107
+ #: lets-encrypt/class-letsencrypt-handler.php:424
1108
+ #: lets-encrypt/class-letsencrypt-handler.php:432
1109
+ msgid "Token successfully retrieved."
1110
+ msgstr ""
1111
+
1112
+ #: lets-encrypt/class-letsencrypt-handler.php:439
1113
+ msgid "Token not received yet."
1114
+ msgstr ""
1115
+
1116
+ #: lets-encrypt/class-letsencrypt-handler.php:468
1117
+ msgid "Configured for HTTP challenge"
1118
+ msgstr ""
1119
+
1120
+ #: lets-encrypt/class-letsencrypt-handler.php:495
1121
+ #: lets-encrypt/integrations/cpanel/functions.php:72
1122
+ msgid "Token not generated. Please complete the previous step."
1123
+ msgstr ""
1124
+
1125
+ #: lets-encrypt/class-letsencrypt-handler.php:509
1126
+ msgid "Successfully verified DNS records"
1127
+ msgstr ""
1128
+
1129
+ #: lets-encrypt/class-letsencrypt-handler.php:516
1130
+ #, php-format
1131
+ msgid "The DNS response for %s was %s, while it should be %s."
1132
+ msgstr ""
1133
+
1134
+ #: lets-encrypt/class-letsencrypt-handler.php:525
1135
+ #, php-format
1136
+ msgid "Could not verify TXT record for domain %s"
1137
+ msgstr ""
1138
+
1139
+ #: lets-encrypt/class-letsencrypt-handler.php:564
1140
+ msgid ""
1141
+ "The certificate generation was rate limited for 10 minutes because the "
1142
+ "authorization failed."
1143
+ msgstr ""
1144
+
1145
+ #: lets-encrypt/class-letsencrypt-handler.php:566
1146
+ msgid "Please double check your DNS txt record."
1147
+ msgstr ""
1148
+
1149
+ #: lets-encrypt/class-letsencrypt-handler.php:580
1150
+ msgid "DNS records were not verified yet. Please complete the previous step."
1151
+ msgstr ""
1152
+
1153
+ #: lets-encrypt/class-letsencrypt-handler.php:611
1154
+ msgid "Certificate already generated. It was renewed if required."
1155
+ msgstr ""
1156
+
1157
+ #: lets-encrypt/class-letsencrypt-handler.php:636
1158
+ msgid "Authorization not completed yet."
1159
+ msgstr ""
1160
+
1161
+ #: lets-encrypt/class-letsencrypt-handler.php:653
1162
+ msgid ""
1163
+ "The order is invalid, possibly due to too many failed authorization "
1164
+ "attempts. Please start at the previous step."
1165
+ msgstr ""
1166
+
1167
+ #: lets-encrypt/class-letsencrypt-handler.php:656
1168
+ msgid ""
1169
+ "As your order will be regenerated, you'll need to update your DNS text "
1170
+ "records."
1171
+ msgstr ""
1172
+
1173
+ #: lets-encrypt/class-letsencrypt-handler.php:664
1174
+ msgid "OCSP not supported, the certificate will be generated without OCSP."
1175
+ msgstr ""
1176
+
1177
+ #: lets-encrypt/class-letsencrypt-handler.php:704
1178
+ msgid "Successfully generated certificate."
1179
+ msgstr ""
1180
+
1181
+ #: lets-encrypt/class-letsencrypt-handler.php:710
1182
+ msgid "Files not created yet..."
1183
+ msgstr ""
1184
+
1185
+ #: lets-encrypt/class-letsencrypt-handler.php:718
1186
+ msgid "Bundle not available yet..."
1187
+ msgstr ""
1188
+
1189
+ #: lets-encrypt/class-letsencrypt-handler.php:761
1190
+ msgid "Order successfully created."
1191
+ msgstr ""
1192
+
1193
+ #: lets-encrypt/class-letsencrypt-handler.php:778
1194
+ msgid "Order successfully retrieved."
1195
+ msgstr ""
1196
+
1197
+ #: lets-encrypt/class-letsencrypt-handler.php:1033
1198
+ #, php-format
1199
+ msgid "Please complete the following step(s) first: %s"
1200
+ msgstr ""
1201
+
1202
+ #: lets-encrypt/class-letsencrypt-handler.php:1049
1203
+ msgid ""
1204
+ "The following directories do not have the necessary writing permissions."
1205
+ msgstr ""
1206
+
1207
+ #: lets-encrypt/class-letsencrypt-handler.php:1049
1208
+ msgid "Set permissions to 644 to enable SSL generation."
1209
+ msgstr ""
1210
+
1211
+ #: lets-encrypt/class-letsencrypt-handler.php:1056
1212
+ msgid "The required directories have the necessary writing permissions."
1213
+ msgstr ""
1214
+
1215
+ #: lets-encrypt/class-letsencrypt-handler.php:1071
1216
+ msgid "The challenge directory is not created yet."
1217
+ msgstr ""
1218
+
1219
+ #: lets-encrypt/class-letsencrypt-handler.php:1075
1220
+ msgid "The challenge directory was successfully created."
1221
+ msgstr ""
1222
+
1223
+ #: lets-encrypt/class-letsencrypt-handler.php:1088
1224
+ msgid "The key directory is not created yet."
1225
+ msgstr ""
1226
+
1227
+ #: lets-encrypt/class-letsencrypt-handler.php:1092
1228
+ msgid "Trying to create directory in root of website."
1229
+ msgstr ""
1230
+
1231
+ #: lets-encrypt/class-letsencrypt-handler.php:1100
1232
+ msgid "The key directory was successfully created."
1233
+ msgstr ""
1234
+
1235
+ #: lets-encrypt/class-letsencrypt-handler.php:1115
1236
+ msgid "The certs directory is not created yet."
1237
+ msgstr ""
1238
+
1239
+ #: lets-encrypt/class-letsencrypt-handler.php:1119
1240
+ msgid "The certs directory was successfully created."
1241
+ msgstr ""
1242
+
1243
+ #: lets-encrypt/class-letsencrypt-handler.php:1174
1244
+ #: lets-encrypt/class-letsencrypt-handler.php:1434
1245
+ msgid "no response"
1246
+ msgstr ""
1247
+
1248
+ #: lets-encrypt/class-letsencrypt-handler.php:1178
1249
+ #, php-format
1250
+ msgid "Could not reach challenge directory over %s."
1251
+ msgstr ""
1252
+
1253
+ #: lets-encrypt/class-letsencrypt-handler.php:1184
1254
+ msgid "Challenge directory not writable."
1255
+ msgstr ""
1256
+
1257
+ #: lets-encrypt/class-letsencrypt-handler.php:1198
1258
+ #: lets-encrypt/class-letsencrypt-handler.php:1202
1259
+ #, php-format
1260
+ msgid "Error code %s."
1261
+ msgstr ""
1262
+
1263
+ #: lets-encrypt/class-letsencrypt-handler.php:1211
1264
+ #: lets-encrypt/class-letsencrypt-handler.php:1457
1265
+ #: lets-encrypt/class-letsencrypt-handler.php:1508
1266
+ msgid "Successfully verified alias domain."
1267
+ msgstr ""
1268
+
1269
+ #: lets-encrypt/class-letsencrypt-handler.php:1392
1270
+ #, php-format
1271
+ msgid ""
1272
+ "This is a multisite configuration with subdomains, which requires a wildcard "
1273
+ "certificate. Wildcard certificates are part of the %spremium%s plan."
1274
+ msgstr ""
1275
+
1276
+ #: lets-encrypt/class-letsencrypt-handler.php:1397
1277
+ msgid "No subdomain setup detected."
1278
+ msgstr ""
1279
+
1280
+ #: lets-encrypt/class-letsencrypt-handler.php:1427
1281
+ msgid "Alias domain check is not relevant for a subdomain"
1282
+ msgstr ""
1283
+
1284
+ #: lets-encrypt/class-letsencrypt-handler.php:1446
1285
+ msgid ""
1286
+ "Please check if the non www version of your site also points to this website."
1287
+ msgstr ""
1288
+
1289
+ #: lets-encrypt/class-letsencrypt-handler.php:1448
1290
+ msgid ""
1291
+ "Please check if the www version of your site also points to this website."
1292
+ msgstr ""
1293
+
1294
+ #: lets-encrypt/class-letsencrypt-handler.php:1450
1295
+ msgid "Could not verify alias domain."
1296
+ msgstr ""
1297
+
1298
+ #: lets-encrypt/class-letsencrypt-handler.php:1450
1299
+ msgid "If this is not the case, don't add this alias to your certificate."
1300
+ msgstr ""
1301
+
1302
+ #: lets-encrypt/class-letsencrypt-handler.php:1479
1303
+ msgid "Could not create test folder and file."
1304
+ msgstr ""
1305
+
1306
+ #: lets-encrypt/class-letsencrypt-handler.php:1480
1307
+ msgid ""
1308
+ "Please create a folder 'rsssl' in the uploads directory, with 644 "
1309
+ "permissions."
1310
+ msgstr ""
1311
+
1312
+ #: lets-encrypt/class-letsencrypt-handler.php:1497
1313
+ #, php-format
1314
+ msgid "Error code %s"
1315
+ msgstr ""
1316
+
1317
+ #: lets-encrypt/class-letsencrypt-handler.php:1581
1318
+ msgid "The certificate installation was rate limited. Please try again later."
1319
+ msgstr ""
1320
+
1321
+ #: lets-encrypt/class-letsencrypt-handler.php:1607
1322
+ msgid "Not recognized server."
1323
+ msgstr ""
1324
+
1325
+ #: lets-encrypt/class-letsencrypt-handler.php:1613
1326
+ msgid "Installation failed."
1327
+ msgstr ""
1328
+
1329
+ #: lets-encrypt/class-letsencrypt-handler.php:1618
1330
+ #: lets-encrypt/integrations/cloudways/functions.php:22
1331
+ #: lets-encrypt/integrations/cpanel/functions.php:16
1332
+ #: lets-encrypt/integrations/cpanel/functions.php:33
1333
+ #: lets-encrypt/integrations/cpanel/functions.php:60
1334
+ #: lets-encrypt/integrations/directadmin/functions.php:16
1335
+ #: lets-encrypt/integrations/plesk/functions.php:16
1336
+ msgid ""
1337
+ "The system is not ready for the installation yet. Please run the wizard "
1338
+ "again."
1339
+ msgstr ""
1340
+
1341
+ #: lets-encrypt/cron.php:81
1342
+ msgid "Once every week"
1343
+ msgstr ""
1344
+
1345
+ #: lets-encrypt/cron.php:85
1346
+ msgid "Once every day"
1347
+ msgstr ""
1348
+
1349
+ #: lets-encrypt/cron.php:89
1350
+ msgid "Once every 5 minutes"
1351
+ msgstr ""
1352
+
1353
+ #: lets-encrypt/download.php:47
1354
+ msgid "File missing. Please retry the previous steps."
1355
+ msgstr ""
1356
+
1357
+ #: lets-encrypt/functions.php:316
1358
+ #, php-format
1359
+ msgid ""
1360
+ "The minimum requirements for the PHP version have not been met. Please "
1361
+ "upgrade to %s"
1362
+ msgstr ""
1363
+
1364
+ #: lets-encrypt/functions.php:320
1365
+ msgid "You have the required PHP version to continue."
1366
+ msgstr ""
1367
+
1368
+ #: lets-encrypt/functions.php:378 lets-encrypt/functions.php:379
1369
+ msgid "Instructions"
1370
+ msgstr ""
1371
+
1372
+ #: lets-encrypt/functions.php:382
1373
+ msgid "Please complete manually in your hosting dashboard."
1374
+ msgstr ""
1375
+
1376
+ #: lets-encrypt/functions.php:383
1377
+ msgid "Please activate it manually on your hosting dashboard."
1378
+ msgstr ""
1379
+
1380
+ #: lets-encrypt/functions.php:385
1381
+ #, php-format
1382
+ msgid "Please complete %smanually%s"
1383
+ msgstr ""
1384
+
1385
+ #: lets-encrypt/functions.php:386
1386
+ #, php-format
1387
+ msgid "Please activate it on your dashboard %smanually%s"
1388
+ msgstr ""
1389
+
1390
+ #: lets-encrypt/functions.php:387
1391
+ msgid "Go to activation"
1392
+ msgstr ""
1393
+
1394
+ #: lets-encrypt/functions.php:388
1395
+ msgid "Go to installation"
1396
+ msgstr ""
1397
+
1398
+ #: lets-encrypt/functions.php:392
1399
+ #, php-format
1400
+ msgid ""
1401
+ "According to our information, your hosting provider supplies your account "
1402
+ "with an SSL certificate by default. Please contact your %shosting support%s "
1403
+ "if this is not the case."
1404
+ msgstr ""
1405
+
1406
+ #: lets-encrypt/functions.php:393 lets-encrypt/functions.php:397
1407
+ #: lets-encrypt/functions.php:405
1408
+ msgid ""
1409
+ "After completing the installation, you can continue to the next step to "
1410
+ "complete your configuration."
1411
+ msgstr ""
1412
+
1413
+ #: lets-encrypt/functions.php:395
1414
+ msgid "You already have free SSL on your hosting environment."
1415
+ msgstr ""
1416
+
1417
+ #: lets-encrypt/functions.php:400
1418
+ #, php-format
1419
+ msgid ""
1420
+ "According to our information, your hosting provider does not allow any kind "
1421
+ "of SSL installation, other then their own paid certificate. For an "
1422
+ "alternative hosting provider with SSL, see this %sarticle%s."
1423
+ msgstr ""
1424
+
1425
+ #: lets-encrypt/functions.php:402
1426
+ msgid "Your hosting environment does not allow automatic SSL installation."
1427
+ msgstr ""
1428
+
1429
+ #: lets-encrypt/functions.php:404
1430
+ #, php-format
1431
+ msgid "You can follow these %sinstructions%s."
1432
+ msgstr ""
1433
+
1434
+ #: lets-encrypt/functions.php:503
1435
+ #, php-format
1436
+ msgid "For more information on this subject, please read this %sarticle%s"
1437
+ msgstr ""
1438
+
1439
+ #: lets-encrypt/integrations/cloudways/cloudways.php:166
1440
+ msgid "Failed retrieving access token"
1441
+ msgstr ""
1442
+
1443
+ #: lets-encrypt/integrations/cloudways/cloudways.php:186
1444
+ #: lets-encrypt/integrations/cloudways/cloudways.php:192
1445
+ msgid "Successfully installed Let's Encrypt"
1446
+ msgstr ""
1447
+
1448
+ #: lets-encrypt/integrations/cloudways/cloudways.php:201
1449
+ msgid "Error enabling auto renew for Let's Encrypt"
1450
+ msgstr ""
1451
+
1452
+ #: lets-encrypt/integrations/cloudways/cloudways.php:217
1453
+ #: lets-encrypt/integrations/cloudways/cloudways.php:252
1454
+ msgid "Successfully retrieved server id and app id"
1455
+ msgstr ""
1456
+
1457
+ #: lets-encrypt/integrations/cloudways/cloudways.php:259
1458
+ msgid "Could not retrieve server list"
1459
+ msgstr ""
1460
+
1461
+ #: lets-encrypt/integrations/cloudways/functions.php:39
1462
+ msgid "Retrieving Cloudways server data..."
1463
+ msgstr ""
1464
+
1465
+ #: lets-encrypt/integrations/cloudways/functions.php:45
1466
+ msgid "Installing SSL certificate..."
1467
+ msgstr ""
1468
+
1469
+ #: lets-encrypt/integrations/cloudways/functions.php:51
1470
+ msgid "Enabling auto renew..."
1471
+ msgstr ""
1472
+
1473
+ #: lets-encrypt/integrations/cpanel/cpanel.php:59
1474
+ #: lets-encrypt/integrations/cpanel/cpanel.php:163
1475
+ #: lets-encrypt/integrations/directadmin/directadmin.php:64
1476
+ msgid "No valid list of domains."
1477
+ msgstr ""
1478
+
1479
+ #: lets-encrypt/integrations/cpanel/cpanel.php:129
1480
+ #: lets-encrypt/integrations/cpanel/cpanel.php:208
1481
+ #: lets-encrypt/integrations/directadmin/directadmin.php:124
1482
+ #, php-format
1483
+ msgid "SSL successfully installed on %s"
1484
+ msgstr ""
1485
+
1486
+ #: lets-encrypt/integrations/cpanel/cpanel.php:214
1487
+ msgid "Errors were reported during installation"
1488
+ msgstr ""
1489
+
1490
+ #: lets-encrypt/integrations/cpanel/cpanel.php:254
1491
+ msgid "Errors were reported during installation."
1492
+ msgstr ""
1493
+
1494
+ #: lets-encrypt/integrations/cpanel/cpanel.php:339
1495
+ msgid "Unable to connect to cPanel"
1496
+ msgstr ""
1497
+
1498
+ #: lets-encrypt/integrations/cpanel/cpanel.php:343
1499
+ msgid "Login credentials incorrect"
1500
+ msgstr ""
1501
+
1502
+ #: lets-encrypt/integrations/cpanel/cpanel.php:351
1503
+ #: lets-encrypt/integrations/cpanel/cpanel.php:371
1504
+ msgid "Successfully added TXT record."
1505
+ msgstr ""
1506
+
1507
+ #: lets-encrypt/integrations/cpanel/cpanel.php:355
1508
+ #: lets-encrypt/integrations/cpanel/cpanel.php:376
1509
+ msgid ""
1510
+ "Could not automatically add TXT record. Please proceed manually, following "
1511
+ "the steps below."
1512
+ msgstr ""
1513
+
1514
+ #: lets-encrypt/integrations/cpanel/functions.php:88
1515
+ msgid ""
1516
+ "The system is not ready for the DNS verification yet. Please run the wizard "
1517
+ "again."
1518
+ msgstr ""
1519
+
1520
+ #: lets-encrypt/integrations/cpanel/functions.php:113
1521
+ msgid "Attempting to install certificate using AutoSSL..."
1522
+ msgstr ""
1523
+
1524
+ #: lets-encrypt/integrations/cpanel/functions.php:122
1525
+ msgid "Attempting to set DNS txt record..."
1526
+ msgstr ""
1527
+
1528
+ #: lets-encrypt/integrations/cpanel/functions.php:129
1529
+ #: lets-encrypt/integrations/directadmin/functions.php:30
1530
+ msgid "Attempting to install certificate..."
1531
+ msgstr ""
1532
+
1533
+ #: lets-encrypt/integrations/cpanel/functions.php:139
1534
+ msgid "Attempting to install certificate using shell..."
1535
+ msgstr ""
1536
+
1537
+ #: lets-encrypt/integrations/plesk/functions.php:34
1538
+ msgid "Installing SSL certificate using PLESK API..."
1539
+ msgstr ""
1540
+
1541
+ #: lets-encrypt/integrations/plesk/plesk.php:88
1542
+ msgid "Successfully installed SSL"
1543
+ msgstr ""
1544
+
1545
+ #: lets-encrypt/wizard/class-field.php:1294
1546
+ msgid "Start"
1547
+ msgstr ""
1548
+
1549
+ #: lets-encrypt/wizard/class-field.php:1311
1550
+ msgid "Refresh"
1551
+ msgstr ""
1552
+
1553
+ #: lets-encrypt/wizard/class-wizard.php:57
1554
+ msgid "Verifying DNS records..."
1555
+ msgstr ""
1556
+
1557
+ #: lets-encrypt/wizard/class-wizard.php:63
1558
+ #: lets-encrypt/wizard/config/steps.php:129
1559
+ msgid "Generating SSL certificate..."
1560
+ msgstr ""
1561
+
1562
+ #: lets-encrypt/wizard/class-wizard.php:86
1563
+ msgid "Checking for subdomain setup..."
1564
+ msgstr ""
1565
+
1566
+ #: lets-encrypt/wizard/class-wizard.php:180
1567
+ #, php-format
1568
+ msgid "Attempt %s."
1569
+ msgstr ""
1570
+
1571
+ #: lets-encrypt/wizard/class-wizard.php:402
1572
+ msgid "Before you begin!"
1573
+ msgstr ""
1574
+
1575
+ #: lets-encrypt/wizard/class-wizard.php:403
1576
+ msgid ""
1577
+ "We're currently in Beta. This means we need your help! During this process "
1578
+ "you might discover you want to give some feedback about your experiences or "
1579
+ "need some help. If so, keep or form ready and try to be so complete and "
1580
+ "precise as possible so we can assist as fast as possible."
1581
+ msgstr ""
1582
+
1583
+ #: lets-encrypt/wizard/class-wizard.php:649
1584
+ #, php-format
1585
+ msgid "The wizard is currently being edited by %s"
1586
+ msgstr ""
1587
+
1588
+ #: lets-encrypt/wizard/class-wizard.php:651
1589
+ #, php-format
1590
+ msgid "If this user stops editing, the lock will expire after %s minutes."
1591
+ msgstr ""
1592
+
1593
+ #: lets-encrypt/wizard/class-wizard.php:827
1594
+ msgid "Changes saved successfully"
1595
+ msgstr ""
1596
+
1597
+ #: lets-encrypt/wizard/class-wizard.php:834
1598
+ msgid "Previous"
1599
+ msgstr ""
1600
+
1601
+ #: lets-encrypt/wizard/class-wizard.php:843
1602
+ msgid "Next"
1603
+ msgstr ""
1604
+
1605
+ #: lets-encrypt/wizard/class-wizard.php:900
1606
+ msgid "Go to dashboard"
1607
+ msgstr ""
1608
+
1609
+ #: lets-encrypt/wizard/class-wizard.php:969
1610
+ #: lets-encrypt/wizard/config/class-config.php:258
1611
+ msgid "I don't know, or not listed, proceed with installation"
1612
+ msgstr ""
1613
+
1614
+ #: lets-encrypt/wizard/config/class-config.php:251
1615
+ msgid "Yes"
1616
+ msgstr ""
1617
+
1618
+ #: lets-encrypt/wizard/config/class-config.php:252
1619
+ msgid "No"
1620
+ msgstr ""
1621
+
1622
+ #: lets-encrypt/wizard/config/questions.php:39
1623
+ msgid ""
1624
+ "This email address will used to create a Let's Encrypt account. This is also "
1625
+ "where you will receive renewal notifications."
1626
+ msgstr ""
1627
+
1628
+ #: lets-encrypt/wizard/config/questions.php:41
1629
+ msgid "Email address"
1630
+ msgstr ""
1631
+
1632
+ #: lets-encrypt/wizard/config/questions.php:42
1633
+ #: lets-encrypt/wizard/config/questions.php:63
1634
+ msgid "This field is prefilled based on your configuration"
1635
+ msgstr ""
1636
+
1637
+ #: lets-encrypt/wizard/config/questions.php:52
1638
+ msgid "Terms & Conditions"
1639
+ msgstr ""
1640
+
1641
+ #: lets-encrypt/wizard/config/questions.php:53
1642
+ #, php-format
1643
+ msgid "I agree to the Let's Encrypt %sTerms & Conditions%s"
1644
+ msgstr ""
1645
+
1646
+ #: lets-encrypt/wizard/config/questions.php:62
1647
+ #: lets-encrypt/wizard/config/steps.php:51
1648
+ msgid "Domain"
1649
+ msgstr ""
1650
+
1651
+ #: lets-encrypt/wizard/config/questions.php:74
1652
+ msgid "This will include both the www. and non-www. version of your domain."
1653
+ msgstr ""
1654
+
1655
+ #: lets-encrypt/wizard/config/questions.php:74
1656
+ msgid ""
1657
+ "You should have the www domain pointed to the same website as the non-www "
1658
+ "domain."
1659
+ msgstr ""
1660
+
1661
+ #: lets-encrypt/wizard/config/questions.php:76
1662
+ msgid "Include alias domain too?"
1663
+ msgstr ""
1664
+
1665
+ #: lets-encrypt/wizard/config/questions.php:88
1666
+ msgid ""
1667
+ "By selecting your hosting provider we can tell you if your hosting provider "
1668
+ "already supports free SSL, and how you can activate it."
1669
+ msgstr ""
1670
+
1671
+ #: lets-encrypt/wizard/config/questions.php:90
1672
+ msgid ""
1673
+ "By selecting your hosting provider we can tell you if your hosting provider "
1674
+ "already supports free SSL, and/or where you can activate it."
1675
+ msgstr ""
1676
+
1677
+ #: lets-encrypt/wizard/config/questions.php:91
1678
+ #, php-format
1679
+ msgid ""
1680
+ "If your hosting provider is not listed, and there's an SSL activation/"
1681
+ "installation link, please let us %sknow%s."
1682
+ msgstr ""
1683
+
1684
+ #: lets-encrypt/wizard/config/questions.php:93
1685
+ msgid "Hosting provider"
1686
+ msgstr ""
1687
+
1688
+ #: lets-encrypt/wizard/config/questions.php:104
1689
+ msgid "CPanel host"
1690
+ msgstr ""
1691
+
1692
+ #: lets-encrypt/wizard/config/questions.php:105
1693
+ msgid "The URL you use to access your cPanel dashboard. Ends on :2083."
1694
+ msgstr ""
1695
+
1696
+ #: lets-encrypt/wizard/config/questions.php:122
1697
+ msgid "CPanel username"
1698
+ msgstr ""
1699
+
1700
+ #: lets-encrypt/wizard/config/questions.php:139
1701
+ msgid "CPanel password"
1702
+ msgstr ""
1703
+
1704
+ #: lets-encrypt/wizard/config/questions.php:155
1705
+ msgid "DirectAdmin host"
1706
+ msgstr ""
1707
+
1708
+ #: lets-encrypt/wizard/config/questions.php:156
1709
+ msgid "The URL you use to access your DirectAdmin dashboard. Ends on :2222."
1710
+ msgstr ""
1711
+
1712
+ #: lets-encrypt/wizard/config/questions.php:173
1713
+ msgid "DirectAdmin username"
1714
+ msgstr ""
1715
+
1716
+ #: lets-encrypt/wizard/config/questions.php:190
1717
+ msgid "DirectAdmin password"
1718
+ msgstr ""
1719
+
1720
+ #: lets-encrypt/wizard/config/questions.php:208
1721
+ msgid "CloudWays user email"
1722
+ msgstr ""
1723
+
1724
+ #: lets-encrypt/wizard/config/questions.php:221
1725
+ msgid "CloudWays api key"
1726
+ msgstr ""
1727
+
1728
+ #: lets-encrypt/wizard/config/questions.php:224
1729
+ #, php-format
1730
+ msgid ""
1731
+ "You can find your api key %shere%s (make sure you're logged in with your "
1732
+ "main account)."
1733
+ msgstr ""
1734
+
1735
+ #: lets-encrypt/wizard/config/questions.php:236
1736
+ msgid "Plesk host"
1737
+ msgstr ""
1738
+
1739
+ #: lets-encrypt/wizard/config/questions.php:237
1740
+ msgid "The URL you use to access your Plesk dashboard. Ends on :8443."
1741
+ msgstr ""
1742
+
1743
+ #: lets-encrypt/wizard/config/questions.php:253
1744
+ msgid "Plesk username"
1745
+ msgstr ""
1746
+
1747
+ #: lets-encrypt/wizard/config/questions.php:254
1748
+ #, php-format
1749
+ msgid "You can find your Plesk username and password in %s"
1750
+ msgstr ""
1751
+
1752
+ #: lets-encrypt/wizard/config/questions.php:271
1753
+ msgid "Plesk password"
1754
+ msgstr ""
1755
+
1756
+ #: lets-encrypt/wizard/config/questions.php:288
1757
+ msgid "Credentials storage"
1758
+ msgstr ""
1759
+
1760
+ #: lets-encrypt/wizard/config/questions.php:289
1761
+ msgid ""
1762
+ "Store for renewal purposes. If not stored, renewal may need to be done "
1763
+ "manually."
1764
+ msgstr ""
1765
+
1766
+ #: lets-encrypt/wizard/config/steps.php:8
1767
+ msgid "System Status"
1768
+ msgstr ""
1769
+
1770
+ #: lets-encrypt/wizard/config/steps.php:9
1771
+ msgid "Detected status of your setup."
1772
+ msgstr ""
1773
+
1774
+ #: lets-encrypt/wizard/config/steps.php:12
1775
+ msgid "Checking PHP version..."
1776
+ msgstr ""
1777
+
1778
+ #: lets-encrypt/wizard/config/steps.php:17
1779
+ msgid "Checking SSL certificate..."
1780
+ msgstr ""
1781
+
1782
+ #: lets-encrypt/wizard/config/steps.php:22
1783
+ msgid "Checking if CURL is available..."
1784
+ msgstr ""
1785
+
1786
+ #: lets-encrypt/wizard/config/steps.php:27
1787
+ msgid "Checking server software..."
1788
+ msgstr ""
1789
+
1790
+ #: lets-encrypt/wizard/config/steps.php:32
1791
+ msgid "Checking alias domain..."
1792
+ msgstr ""
1793
+
1794
+ #: lets-encrypt/wizard/config/steps.php:37
1795
+ msgid "Checking for website configuration..."
1796
+ msgstr ""
1797
+
1798
+ #: lets-encrypt/wizard/config/steps.php:45
1799
+ msgid "General settings"
1800
+ msgstr ""
1801
+
1802
+ #: lets-encrypt/wizard/config/steps.php:47
1803
+ #, php-format
1804
+ msgid ""
1805
+ "We have tried to make our Wizard as simple and fast as possible. Although "
1806
+ "these questions are all necessary, if there’s any way you think we can "
1807
+ "improve the plugin, please let us %sknow%s!"
1808
+ msgstr ""
1809
+
1810
+ #: lets-encrypt/wizard/config/steps.php:48
1811
+ #, php-format
1812
+ msgid ""
1813
+ " Please note that you can always save and finish the wizard later, use our "
1814
+ "%sdocumentation%s for additional information or log a %ssupport ticket%s if "
1815
+ "you need our assistance."
1816
+ msgstr ""
1817
+
1818
+ #: lets-encrypt/wizard/config/steps.php:52
1819
+ msgid ""
1820
+ "Letʼs Encrypt is a free, automated and open certificate authority brought to "
1821
+ "you by the nonprofit Internet Security Research Group (ISRG)."
1822
+ msgstr ""
1823
+
1824
+ #: lets-encrypt/wizard/config/steps.php:55
1825
+ msgid "Hosting"
1826
+ msgstr ""
1827
+
1828
+ #: lets-encrypt/wizard/config/steps.php:56
1829
+ msgid ""
1830
+ "Below you will find the instructions for different hosting environments and "
1831
+ "configurations. If you start the process with the necessary instructions and "
1832
+ "credentials the next view steps will be done in no time."
1833
+ msgstr ""
1834
+
1835
+ #: lets-encrypt/wizard/config/steps.php:64
1836
+ msgid "Directories"
1837
+ msgstr ""
1838
+
1839
+ #: lets-encrypt/wizard/config/steps.php:67
1840
+ msgid "Checking challenge directory..."
1841
+ msgstr ""
1842
+
1843
+ #: lets-encrypt/wizard/config/steps.php:73
1844
+ msgid "Checking key directory..."
1845
+ msgstr ""
1846
+
1847
+ #: lets-encrypt/wizard/config/steps.php:79
1848
+ msgid "Checking certs directory..."
1849
+ msgstr ""
1850
+
1851
+ #: lets-encrypt/wizard/config/steps.php:85
1852
+ msgid "Checking permissions..."
1853
+ msgstr ""
1854
+
1855
+ #: lets-encrypt/wizard/config/steps.php:92
1856
+ msgid "Checking challenge directory reachable over http..."
1857
+ msgstr ""
1858
+
1859
+ #: lets-encrypt/wizard/config/steps.php:101
1860
+ msgid "DNS Verification"
1861
+ msgstr ""
1862
+
1863
+ #: lets-encrypt/wizard/config/steps.php:104
1864
+ #: lets-encrypt/wizard/config/steps.php:123
1865
+ msgid "Creating account..."
1866
+ msgstr ""
1867
+
1868
+ #: lets-encrypt/wizard/config/steps.php:110
1869
+ msgid "Retrieving DNS verification token..."
1870
+ msgstr ""
1871
+
1872
+ #: lets-encrypt/wizard/config/steps.php:119
1873
+ msgid "Generation"
1874
+ msgstr ""
1875
+
1876
+ #: lets-encrypt/wizard/config/steps.php:120
1877
+ msgid "We will now generate your SSL Certificate"
1878
+ msgstr ""
1879
+
1880
+ #: lets-encrypt/wizard/config/steps.php:139
1881
+ #: lets-encrypt/wizard/templates/menu.php:2
1882
+ msgid "Installation"
1883
+ msgstr ""
1884
+
1885
+ #: lets-encrypt/wizard/config/steps.php:142
1886
+ msgid "Searching for link to SSL installation page on your server..."
1887
+ msgstr ""
1888
+
1889
+ #: lets-encrypt/wizard/notices.php:9
1890
+ msgid ""
1891
+ "The non-www version of your site does not point to this website. This is "
1892
+ "recommended, as it will allow you to add it to the certificate as well."
1893
+ msgstr ""
1894
+
1895
+ #: lets-encrypt/wizard/notices.php:11
1896
+ msgid ""
1897
+ "The www version of your site does not point to this website. This is "
1898
+ "recommended, as it will allow you to add it to the certificate as well."
1899
+ msgstr ""
1900
+
1901
+ #: lets-encrypt/wizard/notices.php:48
1902
+ #, php-format
1903
+ msgid "Your certificate is valid to: %s"
1904
+ msgstr ""
1905
+
1906
+ #: lets-encrypt/wizard/notices.php:52
1907
+ #, php-format
1908
+ msgid "Your certificate will expire on %s. You can renew it %shere%s."
1909
+ msgstr ""
1910
+
1911
+ #: lets-encrypt/wizard/notices.php:67
1912
+ #, php-format
1913
+ msgid ""
1914
+ "The automatic installation of your certificate has failed. Please check your "
1915
+ "credentials, and retry the %sinstallation%s."
1916
+ msgstr ""
1917
+
1918
+ #: lets-encrypt/wizard/notices.php:74
1919
+ #, php-format
1920
+ msgid ""
1921
+ "The SSL certificate has been renewed, and requires manual %sinstallation%s "
1922
+ "in your hosting dashboard."
1923
+ msgstr ""
1924
+
1925
+ #: lets-encrypt/wizard/notices.php:81
1926
+ msgid ""
1927
+ "Automatic renewal of your certificate was not possible. The SSL certificate "
1928
+ "should be %srenewed%s manually."
1929
+ msgstr ""
1930
+
1931
+ #: lets-encrypt/wizard/notices.php:88
1932
+ msgid "Your certificate will be renewed and installed automatically."
1933
+ msgstr ""
1934
+
1935
+ #: lets-encrypt/wizard/notices.php:105
1936
+ msgid "Your Key and Certificate directories are not properly protected."
1937
+ msgstr ""
1938
+
1939
+ #: lets-encrypt/wizard/notices.php:125
1940
+ msgid "You have switched to DNS verification."
1941
+ msgstr ""
1942
+
1943
+ #: lets-encrypt/wizard/notices.php:126
1944
+ msgid "You can switch back to directory verification here."
1945
+ msgstr ""
1946
+
1947
+ #: lets-encrypt/wizard/notices.php:127
1948
+ msgid "Switch to directory verification"
1949
+ msgstr ""
1950
+
1951
+ #: lets-encrypt/wizard/notices.php:130
1952
+ #, php-format
1953
+ msgid ""
1954
+ "If you also want to secure subdomains like mail.domain.com, cpanel.domain."
1955
+ "com, you have to use the %sDNS%s challenge."
1956
+ msgstr ""
1957
+
1958
+ #: lets-encrypt/wizard/notices.php:131
1959
+ msgid ""
1960
+ "Please note that auto-renewal with a DNS challenge might not be possible."
1961
+ msgstr ""
1962
+
1963
+ #: lets-encrypt/wizard/notices.php:132
1964
+ #: lets-encrypt/wizard/templates/directories.php:17
1965
+ #: lets-encrypt/wizard/templates/directories.php:42
1966
+ msgid "Switch to DNS verification"
1967
+ msgstr ""
1968
+
1969
+ #: lets-encrypt/wizard/templates/activate.php:13
1970
+ msgid "Your site is secured with a valid SSL certificate!"
1971
+ msgstr ""
1972
+
1973
+ #: lets-encrypt/wizard/templates/activate.php:13
1974
+ #: lets-encrypt/wizard/templates/activate.php:42
1975
+ msgid ""
1976
+ "In some cases it takes a few minutes for the certificate to get detected. In "
1977
+ "that case, check back in a few minutes."
1978
+ msgstr ""
1979
+
1980
+ #: lets-encrypt/wizard/templates/activate.php:16
1981
+ msgid "If you just activated SSL, please check for: "
1982
+ msgstr ""
1983
+
1984
+ #: lets-encrypt/wizard/templates/activate.php:21
1985
+ msgid "SSL was already activated on your website!"
1986
+ msgstr ""
1987
+
1988
+ #: lets-encrypt/wizard/templates/activate.php:42
1989
+ msgid "Almost ready to activate SSL!"
1990
+ msgstr ""
1991
+
1992
+ #: lets-encrypt/wizard/templates/activate.php:60
1993
+ msgid ""
1994
+ "No SSL certificate has been detected yet. In some cases this takes a few "
1995
+ "minutes."
1996
+ msgstr ""
1997
+
1998
+ #: lets-encrypt/wizard/templates/content.php:10
1999
+ msgid "Back to Dashboard"
2000
+ msgstr ""
2001
+
2002
+ #: lets-encrypt/wizard/templates/content.php:13
2003
+ msgid "Notifications"
2004
+ msgstr ""
2005
+
2006
+ #: lets-encrypt/wizard/templates/directories.php:9
2007
+ #: lets-encrypt/wizard/templates/dns-verification.php:7
2008
+ #: lets-encrypt/wizard/templates/installation.php:18
2009
+ msgid "Next step"
2010
+ msgstr ""
2011
+
2012
+ #: lets-encrypt/wizard/templates/directories.php:15
2013
+ msgid ""
2014
+ "If the challenge directory cannot be created, or is not reachable, you can "
2015
+ "either remove the server limitation, or change to DNS verification."
2016
+ msgstr ""
2017
+
2018
+ #: lets-encrypt/wizard/templates/directories.php:21
2019
+ msgid "Create a challenge directory"
2020
+ msgstr ""
2021
+
2022
+ #: lets-encrypt/wizard/templates/directories.php:22
2023
+ msgid "The challenge directory is used to verify the domain ownership."
2024
+ msgstr ""
2025
+
2026
+ #: lets-encrypt/wizard/templates/directories.php:25
2027
+ msgid ""
2028
+ "Navigate in FTP or File Manager to the root of your WordPress installation:"
2029
+ msgstr ""
2030
+
2031
+ #: lets-encrypt/wizard/templates/directories.php:29
2032
+ msgid "Create a folder called “.well-known”"
2033
+ msgstr ""
2034
+
2035
+ #: lets-encrypt/wizard/templates/directories.php:32
2036
+ msgid ""
2037
+ "Inside the folder called “.well-known” create a new folder called “acme-"
2038
+ "challenge”, with 644 writing permissions."
2039
+ msgstr ""
2040
+
2041
+ #: lets-encrypt/wizard/templates/directories.php:35
2042
+ #: lets-encrypt/wizard/templates/directories.php:60
2043
+ #: lets-encrypt/wizard/templates/directories.php:79
2044
+ msgid "Click the refresh button."
2045
+ msgstr ""
2046
+
2047
+ #: lets-encrypt/wizard/templates/directories.php:39
2048
+ msgid "Or you can switch to DNS verification"
2049
+ msgstr ""
2050
+
2051
+ #: lets-encrypt/wizard/templates/directories.php:41
2052
+ msgid ""
2053
+ "If the challenge directory cannot be created, you can either remove the "
2054
+ "server limitation, or change to DNS verification."
2055
+ msgstr ""
2056
+
2057
+ #: lets-encrypt/wizard/templates/directories.php:46
2058
+ msgid "Create a key directory"
2059
+ msgstr ""
2060
+
2061
+ #: lets-encrypt/wizard/templates/directories.php:47
2062
+ msgid "The key directory is needed to store the generated keys."
2063
+ msgstr ""
2064
+
2065
+ #: lets-encrypt/wizard/templates/directories.php:47
2066
+ #: lets-encrypt/wizard/templates/directories.php:66
2067
+ msgid ""
2068
+ "By placing it outside the root folder, it is not accessible over the "
2069
+ "internet."
2070
+ msgstr ""
2071
+
2072
+ #: lets-encrypt/wizard/templates/directories.php:50
2073
+ #: lets-encrypt/wizard/templates/directories.php:69
2074
+ msgid ""
2075
+ "Navigate in FTP or File Manager to one level above the root of your "
2076
+ "WordPress installation:"
2077
+ msgstr ""
2078
+
2079
+ #: lets-encrypt/wizard/templates/directories.php:54
2080
+ #: lets-encrypt/wizard/templates/directories.php:73
2081
+ msgid "Create a folder called “ssl”"
2082
+ msgstr ""
2083
+
2084
+ #: lets-encrypt/wizard/templates/directories.php:57
2085
+ msgid ""
2086
+ "Inside the folder called “ssl” create a new folder called “keys”, with 644 "
2087
+ "writing permissions."
2088
+ msgstr ""
2089
+
2090
+ #: lets-encrypt/wizard/templates/directories.php:65
2091
+ msgid "Create a certs directory"
2092
+ msgstr ""
2093
+
2094
+ #: lets-encrypt/wizard/templates/directories.php:66
2095
+ msgid "The certificate will get stored in this directory."
2096
+ msgstr ""
2097
+
2098
+ #: lets-encrypt/wizard/templates/directories.php:76
2099
+ msgid ""
2100
+ "Inside the folder called “ssl” create a new folder called “certs”, with 644 "
2101
+ "writing permissions."
2102
+ msgstr ""
2103
+
2104
+ #: lets-encrypt/wizard/templates/dns-verification.php:8
2105
+ msgid ""
2106
+ "Add the following token as text record to your DNS records. We recommend to "
2107
+ "use a short TTL during installation, in case you need to change it."
2108
+ msgstr ""
2109
+
2110
+ #: lets-encrypt/wizard/templates/generation.php:11
2111
+ msgid ""
2112
+ "We could not check the DNS records. If you just added the record, please "
2113
+ "check in a few minutes."
2114
+ msgstr ""
2115
+
2116
+ #: lets-encrypt/wizard/templates/generation.php:12
2117
+ #, php-format
2118
+ msgid "You can manually check the DNS records in an %sonline tool%s."
2119
+ msgstr ""
2120
+
2121
+ #: lets-encrypt/wizard/templates/generation.php:13
2122
+ msgid ""
2123
+ "If you're sure it's set correctly, you can click the button to skip the DNS "
2124
+ "check."
2125
+ msgstr ""
2126
+
2127
+ #: lets-encrypt/wizard/templates/generation.php:16
2128
+ msgid "Skip DNS check"
2129
+ msgstr ""
2130
+
2131
+ #: lets-encrypt/wizard/templates/installation.php:14
2132
+ msgid "copied!"
2133
+ msgstr ""
2134
+
2135
+ #: lets-encrypt/wizard/templates/installation.php:22
2136
+ msgid "Install your certificate."
2137
+ msgstr ""
2138
+
2139
+ #: lets-encrypt/wizard/templates/installation.php:25
2140
+ msgid "Certificate (CRT)"
2141
+ msgstr ""
2142
+
2143
+ #: lets-encrypt/wizard/templates/installation.php:26
2144
+ msgid ""
2145
+ "This is the certificate, which you need to install in your hosting dashboard."
2146
+ msgstr ""
2147
+
2148
+ #: lets-encrypt/wizard/templates/installation.php:30
2149
+ #: lets-encrypt/wizard/templates/installation.php:38
2150
+ #: lets-encrypt/wizard/templates/installation.php:45
2151
+ msgid "Download"
2152
+ msgstr ""
2153
+
2154
+ #: lets-encrypt/wizard/templates/installation.php:31
2155
+ #: lets-encrypt/wizard/templates/installation.php:39
2156
+ #: lets-encrypt/wizard/templates/installation.php:46
2157
+ msgid "Copy content"
2158
+ msgstr ""
2159
+
2160
+ #: lets-encrypt/wizard/templates/installation.php:34
2161
+ msgid "Private Key (KEY)"
2162
+ msgstr ""
2163
+
2164
+ #: lets-encrypt/wizard/templates/installation.php:35
2165
+ msgid ""
2166
+ "The private key can be uploaded or pasted in the appropriate field on your "
2167
+ "hosting dashboard."
2168
+ msgstr ""
2169
+
2170
+ #: lets-encrypt/wizard/templates/installation.php:41
2171
+ msgid "Certificate Authority Bundle (CABUNDLE)"
2172
+ msgstr ""
2173
+
2174
+ #: lets-encrypt/wizard/templates/installation.php:42
2175
+ msgid ""
2176
+ "The CA Bundle will sometimes be automatically detected. If not, you can use "
2177
+ "this file."
2178
+ msgstr ""
2179
+
2180
+ #: lets-encrypt/wizard/templates/other-plugins.php:12
2181
+ msgid "Easily migrate your website to SSL."
2182
+ msgstr ""
2183
+
2184
+ #: lets-encrypt/wizard/templates/other-plugins.php:21
2185
+ msgid "The Privacy Suite for WordPress"
2186
+ msgstr ""
2187
+
2188
+ #: lets-encrypt/wizard/templates/other-plugins.php:29
2189
+ msgid "Beautiful recipes optimized for Google."
2190
+ msgstr ""
2191
+
2192
+ #: lets-encrypt/wizard/templates/other-plugins.php:38
2193
+ msgid "Our Plugins"
2194
+ msgstr ""
2195
+
2196
  #: multisite-cron.php:11
2197
  msgid "Once every minute"
2198
  msgstr ""
2208
  "higher"
2209
  msgstr ""
2210
 
2211
+ #: rlrsssl-really-simple-ssl.php:185
2212
  msgid "Plugin dependency error"
2213
  msgstr ""
2214
 
2215
+ #: rlrsssl-really-simple-ssl.php:186
2216
  msgid ""
2217
  "You have a premium add-on with a version that is not compatible with the "
2218
  ">4.0 release of Really Simple SSL."
2219
  msgstr ""
2220
 
2221
+ #: rlrsssl-really-simple-ssl.php:187
2222
  msgid ""
2223
  "Please upgrade to the latest version to be able use the full functionality "
2224
  "of the plugin."
lets-encrypt/class-letsencrypt-handler.php ADDED
@@ -0,0 +1,1714 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') or die("you do not have access to this page!");
3
+
4
+ require_once rsssl_le_path . 'vendor/autoload.php';
5
+ use LE_ACME2\Account;
6
+ use LE_ACME2\Authorizer\AbstractDNSWriter;
7
+ use LE_ACME2\Authorizer\DNS;
8
+ use LE_ACME2\Authorizer\HTTP;
9
+ use LE_ACME2\Connector\Connector;
10
+ use LE_ACME2\Order;
11
+ use LE_ACME2\Utilities\Certificate;
12
+ use LE_ACME2\Utilities\Logger;
13
+
14
+ class rsssl_letsencrypt_handler {
15
+
16
+ private static $_this;
17
+ /**
18
+ * Account object
19
+ * @var bool|LE_ACME2\Account
20
+ */
21
+ public $account = false;
22
+ public $challenge_directory = false;
23
+ public $key_directory = false;
24
+ public $certs_directory = false;
25
+ public $subjects = array();
26
+
27
+ function __construct() {
28
+
29
+ if ( isset( self::$_this ) ) {
30
+ wp_die( sprintf( __( '%s is a singleton class and you cannot create a second instance.', 'really-simple-ssl' ), get_class( $this ) ) );
31
+ }
32
+ add_action( 'rsssl_before_save_lets-encrypt_option', array( $this, 'before_save_wizard_option' ), 10, 4 );
33
+ add_action( 'rsssl_le_activation', array( $this, 'cleanup_on_ssl_activation'));
34
+ add_action( 'rsssl_le_activation', array( $this, 'plugin_activation_actions'));
35
+ add_action( 'admin_init', array( $this, 'maybe_add_htaccess_exclude'));
36
+ add_action( 'admin_init', array( $this, 'maybe_create_htaccess_directories'));
37
+
38
+ $this->key_directory = $this->key_directory();
39
+ $this->challenge_directory = $this->challenge_directory();
40
+ $this->certs_directory = $this->certs_directory();
41
+
42
+ // Config the desired paths
43
+ if ( $this->key_directory ) {
44
+ Account::setCommonKeyDirectoryPath( $this->key_directory );
45
+ }
46
+
47
+ if ( $this->challenge_directory ) {
48
+ HTTP::setDirectoryPath( $this->challenge_directory );
49
+ }
50
+
51
+ // General configs
52
+ Connector::getInstance()->useStagingServer( false );
53
+ Logger::getInstance()->setDesiredLevel( Logger::LEVEL_DISABLED );
54
+
55
+ if ( !get_option('rsssl_disable_ocsp') ) {
56
+ Certificate::enableFeatureOCSPMustStaple();
57
+ }
58
+
59
+ Order::setPreferredChain('ISRG Root X1');
60
+ $this->subjects = $this->get_subjects();
61
+ $this->verify_dns();
62
+ self::$_this = $this;
63
+ }
64
+
65
+ static function this() {
66
+ return self::$_this;
67
+ }
68
+
69
+ /**
70
+ * If we're on apache, add a line to the .htaccess so the acme challenge directory won't get blocked.
71
+ */
72
+ public function maybe_add_htaccess_exclude(){
73
+
74
+ if (!current_user_can('manage_options')) {
75
+ return;
76
+ }
77
+
78
+ if ( !RSSSL()->rsssl_server->uses_htaccess() ) {
79
+ return;
80
+ }
81
+
82
+ $htaccess_file = RSSSL()->really_simple_ssl->htaccess_file();
83
+ if ( !file_exists($htaccess_file) ) {
84
+ return;
85
+ }
86
+
87
+ if ( !is_writable($htaccess_file) ) {
88
+ return;
89
+ }
90
+
91
+ $htaccess = file_get_contents( $htaccess_file );
92
+
93
+ //if it's already inserted, skip.
94
+ if ( strpos($htaccess, 'Really Simple SSL LETS ENCRYPT') !== FALSE ) {
95
+ return;
96
+ }
97
+
98
+ $htaccess = preg_replace("/#\s?BEGIN\s?Really Simple SSL LETS ENCRYPT.*?#\s?END\s?Really Simple SSL LETS ENCRYPT/s", "", $htaccess);
99
+ $htaccess = preg_replace("/\n+/", "\n", $htaccess);
100
+
101
+ $rules = '#BEGIN Really Simple SSL LETS ENCRYPT'."\n";
102
+ $rules .= 'RewriteRule ^.well-known/(.*)$ - [L]'."\n";
103
+ $rules .= '#END Really Simple SSL LETS ENCRYPT'."\n";
104
+ $htaccess = $rules . $htaccess;
105
+ file_put_contents($htaccess_file, $htaccess);
106
+
107
+ }
108
+
109
+ /**
110
+ * Check if we have an installation failed state.
111
+ * @return bool
112
+ */
113
+ public function installation_failed(){
114
+ $installation_active = get_option("rsssl_le_start_installation");
115
+ $installation_failed = get_option("rsssl_installation_error");
116
+
117
+ return $installation_active && $installation_failed;
118
+ }
119
+
120
+ public function plugin_activation_actions(){
121
+ if (get_option('rsssl_activated_plugin')) {
122
+ //do some actions
123
+
124
+ delete_option('rsssl_activated_plugin');
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Cleanup. If user did not consent to storage, all password fields should be removed on activation, unless they're needed for renewals
130
+ */
131
+ public function cleanup_on_ssl_activation(){
132
+ if (!current_user_can('manage_options')) return;
133
+ $delete_credentials = !rsssl_get_value('store_credentials');
134
+ if ( !$this->certificate_automatic_install_possible() || !$this->certificate_install_required() || $delete_credentials ) {
135
+ $fields = RSSSL_LE()->config->fields;
136
+ $fields = array_filter($fields, function($i){
137
+ return isset( $i['type'] ) && $i['type'] === 'password';
138
+ });
139
+ $options = get_option( 'rsssl_options_lets-encrypt' );
140
+ foreach ($fields as $fieldname => $field ) {
141
+ unset($options[$fieldname]);
142
+ }
143
+ update_option( 'rsssl_options_lets-encrypt', $options );
144
+ }
145
+ }
146
+
147
+ public function before_save_wizard_option(
148
+ $fieldname, $fieldvalue, $prev_value, $type
149
+ ) {
150
+ rsssl_progress_add('domain');
151
+ //only run when changes have been made
152
+ if ( $fieldvalue === $prev_value ) {
153
+ return;
154
+ }
155
+
156
+ if ($fieldname==='accept_le_terms'){
157
+ if (!$fieldvalue) {
158
+ rsssl_progress_remove('domain');
159
+ }
160
+ }
161
+
162
+ if ($fieldname==='other_host_type'){
163
+ if ( !rsssl_do_local_lets_encrypt_generation() ) {
164
+ rsssl_progress_add('directories');
165
+ rsssl_progress_add('generation');
166
+ rsssl_progress_add('dns-verification');
167
+ }
168
+ }
169
+
170
+ if ( $fieldname==='email' ){
171
+ if ( !is_email($fieldvalue) ) {
172
+ rsssl_progress_remove('domain');
173
+ }
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Test for localhost or subfolder usage
179
+ * @return RSSSL_RESPONSE
180
+ */
181
+ public function check_domain(){
182
+ $details = parse_url(site_url());
183
+ $path = isset($details['path']) ? $details['path'] : '';
184
+
185
+ if (is_multisite() && get_current_blog_id() !== get_main_site_id() ) {
186
+ rsssl_progress_remove('system-status');
187
+ $action = 'stop';
188
+ $status = 'error';
189
+ $message = __("It is not possible to install Let's Encrypt on a subsite. Please go to the main site of your website.", "really-simple-ssl" );
190
+ } else if ( strlen($path)>0 ) {
191
+ rsssl_progress_remove('system-status');
192
+ $action = 'stop';
193
+ $status = 'error';
194
+ $message = __("It is not possible to install Let's Encrypt on a subfolder configuration.", "really-simple-ssl" ).rsssl_read_more('https://really-simple-ssl.com/install-ssl-on-subfolders');
195
+ } else if ( strlen($path)>0 ) {
196
+ rsssl_progress_remove('system-status');
197
+ $action = 'stop';
198
+ $status = 'error';
199
+ $message = __("It is not possible to install Let's Encrypt on a subfolder configuration.", "really-simple-ssl" );
200
+ } else if ( strpos(site_url(), 'localhost')!==false ) {
201
+ rsssl_progress_remove('system-status');
202
+ $action = 'stop';
203
+ $status = 'error';
204
+ $message = __("It is not possible to install Let's Encrypt on a localhost environment.", "really-simple-ssl" );
205
+ } else {
206
+ $action = 'continue';
207
+ $status = 'success';
208
+ $message = __("Your domain meets the requirements for Let's Encrypt.", "really-simple-ssl" );
209
+ }
210
+ return new RSSSL_RESPONSE($status, $action, $message);
211
+ }
212
+
213
+ /**
214
+ * Get certificate installation URL
215
+ * @return RSSSL_RESPONSE
216
+ */
217
+
218
+ public function search_ssl_installation_url(){
219
+ //start with most generic, then more specific if possible.
220
+ $url = 'https://really-simple-ssl.com/install-ssl-certificate';
221
+ $host = 'enter-your-dashboard-url-here';
222
+
223
+ if (function_exists('wp_get_direct_update_https_url') && !empty(wp_get_direct_update_https_url())) {
224
+ $url = wp_get_direct_update_https_url();
225
+ }
226
+
227
+ if ( rsssl_is_cpanel() ) {
228
+ $cpanel = new rsssl_cPanel();
229
+ $host = $cpanel->host;
230
+ $url = $cpanel->ssl_installation_url;
231
+ } else if ( rsssl_is_plesk() ) {
232
+ $plesk = new rsssl_plesk();
233
+ $host = $plesk->host;
234
+ $url = $plesk->ssl_installation_url;
235
+ } else if ( rsssl_is_directadmin() ) {
236
+ $directadmin = new rsssl_directadmin();
237
+ $host = $directadmin->host;
238
+ $url = $directadmin->ssl_installation_url;
239
+ }
240
+
241
+ $hosting_company = rsssl_get_other_host();
242
+ if ( $hosting_company && $hosting_company !== 'none' ) {
243
+ $hosting_specific_link = RSSSL_LE()->config->hosts[$hosting_company]['ssl_installation_link'];
244
+ if ($hosting_specific_link) {
245
+ $site = trailingslashit( str_replace(array('https://','http://', 'www.'),'', site_url()) );
246
+ if ( strpos($hosting_specific_link,'{host}') !==false && empty($host) ) {
247
+ $url = '';
248
+ } else {
249
+ $url = str_replace(array('{host}', '{domain}'), array($host, $site), $hosting_specific_link);
250
+ }
251
+ }
252
+ }
253
+
254
+ $action = 'continue';
255
+ $status = 'warning';
256
+ $message = rsssl_get_manual_instructions_text($url);
257
+ $output = $url;
258
+ return new RSSSL_RESPONSE($status, $action, $message, $output );
259
+ }
260
+
261
+ /**
262
+ * Test for localhost usage
263
+ * @return RSSSL_RESPONSE
264
+ */
265
+ public function certificate_status(){
266
+ delete_transient('rsssl_certinfo');
267
+ if ( RSSSL()->rsssl_certificate->is_valid() ) {
268
+ //we have now renewed the cert info transient
269
+ $certinfo = get_transient('rsssl_certinfo');
270
+ $end_date = isset($certinfo['validTo_time_t']) ? $certinfo['validTo_time_t'] : false;
271
+ $grace_period = strtotime('+'.rsssl_le_manual_generation_renewal_check.' days');
272
+ $expiry_date = !empty($end_date) ? date( get_option('date_format'), $end_date ) : __("(unknown)","really-simple-ssl");
273
+ //if the certificate expires within the grace period, allow renewal
274
+ //e.g. expiry date 30 may, now = 10 may => grace period 9 june.
275
+ if ( $grace_period > $end_date ) {
276
+ $action = 'continue';
277
+ $status = 'success';
278
+ $message = sprintf(__("Your certificate will expire on %s.", "really-simple-ssl" ).' '.__("Continue to renew.", "really-simple-ssl" ), $expiry_date); ;
279
+ } else {
280
+ $action = 'stop';
281
+ $status = 'error';
282
+ $message = __("You already have a valid SSL certificate.", "really-simple-ssl" );
283
+ }
284
+
285
+ } else {
286
+ $action = 'continue';
287
+ $status = 'success';
288
+ $message = __("SSL certificate should be generated and installed.", "really-simple-ssl" );
289
+ }
290
+ return new RSSSL_RESPONSE($status, $action, $message);
291
+ }
292
+
293
+ /**
294
+ * Check if the certifiate is to expire in max rsssl_le_manual_generation_renewal_check days.
295
+ * Used in notices list
296
+ * @return bool
297
+ */
298
+
299
+ public function certificate_about_to_expire(){
300
+ $about_to_expire = RSSSL()->rsssl_certificate->about_to_expire();
301
+ if ( !$about_to_expire ) {
302
+ //if the certificate is valid, stop any attempt to renew.
303
+ delete_option('rsssl_le_start_renewal');
304
+ delete_option('rsssl_le_start_installation');
305
+ return false;
306
+ } else {
307
+ return true;
308
+ }
309
+ }
310
+
311
+ /**
312
+ * Test for server software
313
+ * @return RSSSL_RESPONSE
314
+ */
315
+
316
+ public function server_software(){
317
+ $action = 'continue';
318
+ $status = 'warning';
319
+ $message = __("The Hosting Panel software was not recognized. Depending on your hosting provider, the generated certificate may need to be installed manually.", "really-simple-ssl" );
320
+
321
+ if ( rsssl_is_cpanel() ) {
322
+ $status = 'success';
323
+ $message = __("CPanel recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" );
324
+ } else if ( rsssl_is_plesk() ) {
325
+ $status = 'success';
326
+ $message = __("Plesk recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" );
327
+ } else if ( rsssl_is_directadmin() ) {
328
+ $status = 'success';
329
+ $message = __("DirectAdmin recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" );
330
+ }
331
+
332
+ return new RSSSL_RESPONSE($status, $action, $message);
333
+ }
334
+
335
+ /**
336
+ * Check if CURL is available
337
+ *
338
+ * @return RSSSL_RESPONSE
339
+ */
340
+
341
+ public function curl_exists(){
342
+ if(function_exists('curl_init') === false){
343
+ $action = 'stop';
344
+ $status = 'error';
345
+ $message = __("The PHP function CURL is not available on your server, which is required. Please contact your hosting provider.", "really-simple-ssl" );
346
+ } else {
347
+ $action = 'continue';
348
+ $status = 'success';
349
+ $message = __("The PHP function CURL has successfully been detected.", "really-simple-ssl" );
350
+ }
351
+
352
+ return new RSSSL_RESPONSE($status, $action, $message);
353
+ }
354
+
355
+ /**
356
+ * Get or create an account
357
+ * @return RSSSL_RESPONSE
358
+ */
359
+ public function get_account(){
360
+ $account_email = $this->account_email();
361
+ if ( is_email($account_email) ) {
362
+ try {
363
+ $this->account
364
+ = ! Account::exists( $account_email ) ?
365
+ Account::create( $account_email ) :
366
+ Account::get( $account_email );
367
+ $status = 'success';
368
+ $action = 'continue';
369
+ $message = __("Successfully retrieved account", "really-simple-ssl");
370
+ } catch(Exception $e) {
371
+ error_log(print_r($e, true));
372
+ $response = $this->get_error($e);
373
+ $status = 'error';
374
+ $action = 'retry';
375
+ if ( strpos($response, 'invalid contact domain')) {
376
+ $action = 'stop';
377
+ $response = __("The used domain for your email address is not allowed.","really-simple-ssl").'&nbsp;'.
378
+ sprintf(__("Please change your email address %shere%s and try again.", "really-simple-ssl"),'<a href="'.rsssl_letsencrypt_wizard_url().'&step=2'.'">','</a>');
379
+ }
380
+
381
+ $message = $response;
382
+ }
383
+ } else {
384
+ error_log("no email set");
385
+ $status = 'error';
386
+ $action = 'stop';
387
+ $message = __("The email address was not set. Please set the email address",'really-simple-ssl');
388
+ }
389
+ return new RSSSL_RESPONSE($status, $action, $message);
390
+ }
391
+
392
+ /**
393
+ * @return RSSSL_RESPONSE
394
+ */
395
+ public function get_dns_token(){
396
+ if (rsssl_is_ready_for('dns-verification')) {
397
+ $use_dns = rsssl_dns_verification_required();
398
+ $challenge_type = $use_dns ? Order::CHALLENGE_TYPE_DNS : Order::CHALLENGE_TYPE_HTTP;
399
+ if ( $use_dns ) {
400
+ try {
401
+ $this->get_account();
402
+ $dnsWriter = new class extends AbstractDNSWriter {
403
+ public function write( Order $order, string $identifier, string $digest ): bool {
404
+ $tokens = get_option( 'rsssl_le_dns_tokens', array() );
405
+ $tokens[ $identifier ] = $digest;
406
+ update_option( "rsssl_le_dns_tokens", $tokens );
407
+ rsssl_progress_add( 'dns-verification' );
408
+
409
+ //return false, as we will continue later on.
410
+ return false;
411
+ }
412
+ };
413
+ DNS::setWriter( $dnsWriter );
414
+ $response = $this->get_order();
415
+ $order = $response->output;
416
+ $response->output = false;
417
+
418
+ if ( $order ) {
419
+ try {
420
+ if ( $order->authorize( $challenge_type ) ) {
421
+ $response = new RSSSL_RESPONSE(
422
+ 'success',
423
+ 'continue',
424
+ __( "Token successfully retrieved.", 'really-simple-ssl' ),
425
+ json_encode( get_option( 'rsssl_le_dns_tokens' ) )
426
+ );
427
+ } else {
428
+ if ( get_option( 'rsssl_le_dns_tokens' ) ) {
429
+ $response = new RSSSL_RESPONSE(
430
+ 'success',
431
+ 'continue',
432
+ __( "Token successfully retrieved.", 'really-simple-ssl' ),
433
+ json_encode( get_option( 'rsssl_le_dns_tokens' ) )
434
+ );
435
+ } else {
436
+ $response = new RSSSL_RESPONSE(
437
+ 'error',
438
+ 'retry',
439
+ __( "Token not received yet.", 'really-simple-ssl' )
440
+ );
441
+ }
442
+
443
+ }
444
+ } catch ( Exception $e ) {
445
+ error_log( print_r( $e, true ) );
446
+ $response = new RSSSL_RESPONSE(
447
+ 'error',
448
+ 'retry',
449
+ $this->get_error( $e )
450
+ );
451
+ }
452
+ }
453
+
454
+ } catch ( Exception $e ) {
455
+ rsssl_progress_remove( 'dns-verification' );
456
+ $response = $this->get_error( $e );
457
+ error_log( print_r( $e, true ) );
458
+ $response = new RSSSL_RESPONSE(
459
+ 'error',
460
+ 'retry',
461
+ $response
462
+ );
463
+ }
464
+ } else {
465
+ $response = new RSSSL_RESPONSE(
466
+ 'error',
467
+ 'stop',
468
+ __( "Configured for HTTP challenge", 'really-simple-ssl' )
469
+ );
470
+ }
471
+ } else {
472
+ rsssl_progress_remove( 'dns-verification' );
473
+ $response = new RSSSL_RESPONSE(
474
+ 'error',
475
+ 'stop',
476
+ $this->not_completed_steps_message('dns-verification')
477
+ );
478
+ }
479
+ return $response;
480
+ }
481
+
482
+ /**
483
+ * Check DNS txt records.
484
+ * @return string|void
485
+ */
486
+
487
+ public function verify_dns(){
488
+ if (rsssl_is_ready_for('generation')) {
489
+ update_option('rsssl_le_dns_records_verified', false);
490
+
491
+ $tokens = get_option('rsssl_le_dns_tokens');
492
+ if ( !$tokens) {
493
+ $status = 'error';
494
+ $action = 'stop';
495
+ $message = __('Token not generated. Please complete the previous step.',"really-simple-ssl");
496
+ return new RSSSL_RESPONSE($status, $action, $message);
497
+ }
498
+
499
+ foreach ($tokens as $identifier => $token){
500
+ if (strpos($identifier, '*') !== false) continue;
501
+ set_error_handler(array($this, 'custom_error_handling'));
502
+ $response = dns_get_record( "_acme-challenge.$identifier", DNS_TXT );
503
+ restore_error_handler();
504
+ if ( isset($response[0]['txt']) ){
505
+ if ($response[0]['txt'] === $token) {
506
+ $response = new RSSSL_RESPONSE(
507
+ 'success',
508
+ 'continue',
509
+ sprintf(__('Successfully verified DNS records', "really-simple-ssl"), "_acme-challenge.$identifier")
510
+ );
511
+ update_option('rsssl_le_dns_records_verified', true);
512
+ } else {
513
+ $response = new RSSSL_RESPONSE(
514
+ 'error',
515
+ 'stop',
516
+ sprintf(__('The DNS response for %s was %s, while it should be %s.', "really-simple-ssl"), "_acme-challenge.$identifier", $response[0]['txt'], $token )
517
+ );
518
+ break;
519
+ }
520
+ } else {
521
+ $action = get_option('rsssl_skip_dns_check') ? 'continue' : 'stop';
522
+ $response = new RSSSL_RESPONSE(
523
+ 'warning',
524
+ $action,
525
+ sprintf(__('Could not verify TXT record for domain %s', "really-simple-ssl"), "_acme-challenge.$identifier")
526
+ );
527
+ }
528
+ }
529
+
530
+ } else {
531
+ $response = new RSSSL_RESPONSE(
532
+ 'error',
533
+ 'stop',
534
+ $this->not_completed_steps_message('dns-verification')
535
+ );
536
+ }
537
+
538
+ return $response;
539
+ }
540
+
541
+ /**
542
+ * Clear an existing order
543
+ */
544
+ public function clear_order(){
545
+ $this->get_account();
546
+ $response = $this->get_order();
547
+ $order = $response->output;
548
+ if ( $order ) {
549
+ $order->clear();
550
+ }
551
+ }
552
+
553
+ /**
554
+ * Authorize the order
555
+ * @return string|void
556
+ */
557
+
558
+ public function create_bundle_or_renew(){
559
+ $bundle_completed = false;
560
+ $use_dns = rsssl_dns_verification_required();
561
+ $attempt_count = intval(get_transient('rsssl_le_generate_attempt_count'));
562
+ if ( $attempt_count>5 ){
563
+ delete_option("rsssl_le_start_renewal");
564
+ $message = __("The certificate generation was rate limited for 10 minutes because the authorization failed.",'really-simple-ssl');
565
+ if ($use_dns){
566
+ $message .= '&nbsp;'.__("Please double check your DNS txt record.",'really-simple-ssl');
567
+ }
568
+ return new RSSSL_RESPONSE(
569
+ 'error',
570
+ 'stop',
571
+ $message
572
+ );
573
+ }
574
+
575
+ if ( !get_option('rsssl_skip_dns_check') ) {
576
+ if ( $use_dns && ! get_option( 'rsssl_le_dns_records_verified' ) ) {
577
+ return new RSSSL_RESPONSE(
578
+ 'error',
579
+ 'stop',
580
+ __( "DNS records were not verified yet. Please complete the previous step.", 'really-simple-ssl' )
581
+ );
582
+ }
583
+ }
584
+
585
+ if (rsssl_is_ready_for('generation') ) {
586
+ $this->get_account();
587
+ if ( $use_dns ) {
588
+ $dnsWriter = new class extends AbstractDNSWriter {
589
+ public function write( Order $order, string $identifier, string $digest): bool {
590
+ $status = false;
591
+ if ( get_option('rsssl_le_dns_tokens') ) {
592
+ $status = true;
593
+ }
594
+ return $status;
595
+ }
596
+ };
597
+ DNS::setWriter($dnsWriter);
598
+ }
599
+
600
+ $response = $this->get_order();
601
+ $order = $response->output;
602
+ $response->output = false;
603
+
604
+ if ( $order ) {
605
+ if ( $order->isCertificateBundleAvailable() ) {
606
+ try {
607
+ $order->enableAutoRenewal();
608
+ $response = new RSSSL_RESPONSE(
609
+ 'success',
610
+ 'continue',
611
+ __("Certificate already generated. It was renewed if required.",'really-simple-ssl')
612
+ );
613
+ $bundle_completed = true;
614
+ } catch ( Exception $e ) {
615
+ error_log( print_r( $e, true ) );
616
+ $response = new RSSSL_RESPONSE(
617
+ 'error',
618
+ 'retry',
619
+ $this->get_error( $e )
620
+ );
621
+ $bundle_completed = false;
622
+ }
623
+ } else {
624
+ $finalized = false;
625
+ $challenge_type = $use_dns ? Order::CHALLENGE_TYPE_DNS : Order::CHALLENGE_TYPE_HTTP;
626
+ try {
627
+ if ( $order->authorize( $challenge_type ) ) {
628
+ $order->finalize();
629
+ $this->reset_attempt();
630
+ $finalized = true;
631
+ } else {
632
+ $this->count_attempt();
633
+ $response = new RSSSL_RESPONSE(
634
+ 'error',
635
+ 'retry',
636
+ __('Authorization not completed yet.',"really-simple-ssl")
637
+ );
638
+ $bundle_completed = false;
639
+ }
640
+ } catch ( Exception $e ) {
641
+
642
+ $this->count_attempt();
643
+ $message = $this->get_error( $e );
644
+ error_log( print_r( $e, true ) );
645
+ $response = new RSSSL_RESPONSE(
646
+ 'error',
647
+ 'stop',
648
+ $message
649
+ );
650
+
651
+ if (strpos($message, 'Order has status "invalid"')!==false) {
652
+ $order->clear();
653
+ $response->message = __("The order is invalid, possibly due to too many failed authorization attempts. Please start at the previous step.","really-simple-ssl");
654
+ if ($use_dns) {
655
+ rsssl_progress_remove('dns-verification');
656
+ $response->message .= '&nbsp;'.__("As your order will be regenerated, you'll need to update your DNS text records.","really-simple-ssl");
657
+ }
658
+ } else {
659
+ //if OCSP is not disabled yet, and the order status is not invalid, we disable ocsp, and try again.
660
+ if ( !get_option('rsssl_disable_ocsp' ) ) {
661
+ update_option('rsssl_disable_ocsp', true);
662
+ $response->action = 'retry';
663
+ $response->status = 'warning';
664
+ $response->message = __("OCSP not supported, the certificate will be generated without OCSP.","really-simple-ssl");
665
+ }
666
+
667
+
668
+ }
669
+ }
670
+
671
+ if ($finalized) {
672
+ try {
673
+ if ( $order->isCertificateBundleAvailable() ) {
674
+ error_log( "cert bundle available" );
675
+ $bundle_completed = true;
676
+ $success_cert = $success_intermediate = $success_private = false;
677
+ $bundle = $order->getCertificateBundle();
678
+ $pathToPrivateKey = $bundle->path . $bundle->private;
679
+ $pathToCertificate = $bundle->path . $bundle->certificate;
680
+ $pathToIntermediate = $bundle->path . $bundle->intermediate;
681
+
682
+ if ( file_exists( $pathToPrivateKey ) ) {
683
+ $success_private = true;
684
+ update_option( 'rsssl_private_key_path', $pathToPrivateKey );
685
+ }
686
+ if ( file_exists( $pathToCertificate ) ) {
687
+ $success_cert = true;
688
+ update_option( 'rsssl_certificate_path', $pathToCertificate );
689
+ }
690
+
691
+ if ( file_exists( $pathToIntermediate ) ) {
692
+ $success_intermediate = true;
693
+ update_option( 'rsssl_intermediate_path', $pathToIntermediate );
694
+ }
695
+
696
+ if ( ! $success_cert || ! $success_private || ! $success_intermediate ) {
697
+ $bundle_completed = false;
698
+ }
699
+
700
+ if ( $bundle_completed ) {
701
+ $response = new RSSSL_RESPONSE(
702
+ 'success',
703
+ 'continue',
704
+ __("Successfully generated certificate.",'really-simple-ssl')
705
+ );
706
+ } else {
707
+ $response = new RSSSL_RESPONSE(
708
+ 'error',
709
+ 'retry',
710
+ __("Files not created yet...",'really-simple-ssl')
711
+ );
712
+ }
713
+
714
+ } else {
715
+ $response = new RSSSL_RESPONSE(
716
+ 'error',
717
+ 'retry',
718
+ __("Bundle not available yet...",'really-simple-ssl')
719
+ );
720
+ }
721
+ } catch ( Exception $e ) {
722
+ error_log( print_r( $e, true ) );
723
+ $response = new RSSSL_RESPONSE(
724
+ 'error',
725
+ 'retry',
726
+ $this->get_error( $e )
727
+ );
728
+ }
729
+ }
730
+ }
731
+ }
732
+ } else {
733
+ $response = new RSSSL_RESPONSE(
734
+ 'error',
735
+ 'stop',
736
+ $this->not_completed_steps_message('generation')
737
+ );
738
+ }
739
+
740
+ if ( $bundle_completed ){
741
+ rsssl_progress_add('generation');
742
+ update_option('rsssl_le_certificate_generated_by_rsssl', true);
743
+ delete_option("rsssl_le_start_renewal");
744
+ } else {
745
+ rsssl_progress_remove('generation');
746
+ }
747
+
748
+ return $response;
749
+ }
750
+
751
+ /**
752
+ * Get the order object
753
+ * @return RSSSL_RESPONSE
754
+ */
755
+ public function get_order(){
756
+ if ( ! Order::exists( $this->account, $this->subjects ) ) {
757
+ try {
758
+ $response = new RSSSL_RESPONSE(
759
+ 'success',
760
+ 'continue',
761
+ __("Order successfully created.",'really-simple-ssl')
762
+ );
763
+ $response->output = Order::create( $this->account, $this->subjects );
764
+
765
+ } catch(Exception $e) {
766
+ error_log(print_r($e, true));
767
+ $response = new RSSSL_RESPONSE(
768
+ 'error',
769
+ 'retry',
770
+ $this->get_error($e)
771
+ );
772
+ }
773
+ } else {
774
+ //order exists already
775
+ $response = new RSSSL_RESPONSE(
776
+ 'success',
777
+ 'continue',
778
+ __( "Order successfully retrieved.", 'really-simple-ssl' )
779
+ );
780
+ $response->output = Order::get( $this->account, $this->subjects );
781
+ }
782
+
783
+ return $response;
784
+ }
785
+
786
+ /**
787
+ * Keep track of certain request counts, to prevent rate limiting by LE
788
+ */
789
+ public function count_attempt(){
790
+ $attempt_count = intval(get_transient('rsssl_le_generate_attempt_count'));
791
+ $attempt_count++;
792
+ set_transient('rsssl_le_generate_attempt_count', $attempt_count, 10 * MINUTE_IN_SECONDS);
793
+ }
794
+
795
+ public function reset_attempt(){
796
+ delete_transient('rsssl_le_generate_attempt_count');
797
+ }
798
+
799
+ /**
800
+ * If a bundle generation is completed, this value is set to true.
801
+ * @return bool
802
+ */
803
+ public function generated_by_rsssl(){
804
+ return get_option('rsssl_le_certificate_generated_by_rsssl');
805
+ }
806
+
807
+ /**
808
+ * Check if SSL generation renewal can be handled automatically
809
+ * @return bool
810
+ */
811
+ public function ssl_generation_can_auto_renew(){
812
+ if ( get_option('rsssl_verification_type')==='DNS' && !get_option('rsssl_le_dns_configured_by_rsssl') ) {
813
+ return false;
814
+ } else {
815
+ return true;
816
+ }
817
+ }
818
+
819
+ /**
820
+ * Check if it's possible to autorenew
821
+ * @return bool
822
+ */
823
+ public function certificate_automatic_install_possible(){
824
+
825
+ $install_method = get_option('rsssl_le_certificate_installed_by_rsssl');
826
+
827
+ //if it was never auto installed, we probably can't autorenew.
828
+ if ($install_method === false ) {
829
+ return false;
830
+ } else {
831
+ return true;
832
+ }
833
+ }
834
+
835
+ /**
836
+ * Check if the manual renewal should start.
837
+ *
838
+ * @return bool
839
+ */
840
+ public function should_start_manual_installation_renewal(){
841
+ if ( !$this->should_start_manual_ssl_generation() && get_option( "rsssl_le_start_installation" ) ) {
842
+ return true;
843
+ }
844
+ return false;
845
+ }
846
+
847
+ public function should_start_manual_ssl_generation(){
848
+ return get_option( "rsssl_le_start_renewal" );
849
+ }
850
+
851
+ /**
852
+ * Only used if
853
+ * - SSL generated by RSSSL
854
+ * - certificate is about to expire
855
+ *
856
+ * @return string
857
+ */
858
+ public function certificate_renewal_status_notice(){
859
+ if ( !RSSSL_LE()->letsencrypt_handler->ssl_generation_can_auto_renew()){
860
+ return 'manual-generation';
861
+ }
862
+
863
+ if ( $this->certificate_install_required() &&
864
+ $this->certificate_automatic_install_possible() &&
865
+ $this->installation_failed()
866
+ ){
867
+ return 'automatic-installation-failed';
868
+ }
869
+
870
+ if ( $this->certificate_install_required() && !$this->certificate_automatic_install_possible() ) {
871
+ return 'manual-installation';
872
+ }
873
+
874
+ return 'automatic';
875
+ }
876
+
877
+ /**
878
+ * Check if the certificate has to be installed on each renewal
879
+ * defaults to true.
880
+ *
881
+ */
882
+
883
+ public function certificate_install_required(){
884
+ $install_method = get_option('rsssl_le_certificate_installed_by_rsssl');
885
+ $hosting_company = rsssl_get_other_host();
886
+ if ( in_array($install_method, RSSSL_LE()->config->no_installation_renewal_needed) || in_array($hosting_company, RSSSL_LE()->config->no_installation_renewal_needed)) {
887
+ return false;
888
+ }
889
+
890
+ return true;
891
+ }
892
+
893
+ /**
894
+ * Check if the certificate needs renewal.
895
+ *
896
+ * @return bool
897
+ */
898
+ public function cron_certificate_needs_renewal(){
899
+
900
+ $cert_file = get_option('rsssl_certificate_path');
901
+ $certificate = file_get_contents($cert_file);
902
+ $certificateInfo = openssl_x509_parse($certificate);
903
+ $valid_to = $certificateInfo['validTo_time_t'];
904
+ $in_expiry_days = strtotime( "+".rsssl_le_cron_generation_renewal_check." days" );
905
+ if ( $in_expiry_days > $valid_to ) {
906
+ return true;
907
+ } else {
908
+ return false;
909
+ }
910
+ }
911
+
912
+
913
+ /**
914
+ * Get account email
915
+ * @return string
916
+ */
917
+ public function account_email(){
918
+ //don't use the default value: we want users to explicitly enter a value
919
+ return rsssl_get_value('email_address', false);
920
+ }
921
+ /**
922
+ * Get terms accepted
923
+ * @return bool
924
+ */
925
+ public function terms_accepted(){
926
+ //don't use the default value: we want users to explicitly enter a value
927
+ return rsssl_get_value('accept_le_terms', false);
928
+ }
929
+
930
+
931
+
932
+ /**
933
+ * Change the email address in an account
934
+ * @param $new_email
935
+ */
936
+
937
+ public function update_account( $new_email ){
938
+ if (!$this->account) return;
939
+
940
+ try {
941
+ $this->account->update($new_email);
942
+ } catch (Exception $e) {
943
+ error_log("Lets encrypt email update failed");
944
+ error_log(print_r($e, true));
945
+ }
946
+ }
947
+
948
+ /**
949
+ * Get list of common names on the certificate
950
+ * @return array
951
+ */
952
+ public function get_subjects(){
953
+ $subjects = array();
954
+ $domain = rsssl_get_domain();
955
+ $root = str_replace( 'www.', '', $domain );;
956
+ $subjects[] = $domain;
957
+ //don't offer aliasses for subdomains
958
+ if ( !rsssl_is_subdomain() ) {
959
+ if (rsssl_get_value( 'include_alias' )) {
960
+ //main is www.
961
+ if ( strpos( $domain, 'www.' ) !== false ) {
962
+ $alias_domain = $root;
963
+ } else {
964
+ $alias_domain = 'www.'.$root;
965
+ }
966
+ $subjects[] = $alias_domain;
967
+ }
968
+ }
969
+
970
+ if ( rsssl_wildcard_certificate_required() ) {
971
+ $domain = rsssl_get_domain();
972
+ //in theory, the main site of a subdomain setup can be a www. domain. But we have to request a certificate without the www.
973
+ $domain = str_replace( 'www.', '', $domain );
974
+ $subjects = array(
975
+ $domain,
976
+ '*.' . $domain,
977
+ );
978
+ }
979
+
980
+ return apply_filters('rsssl_le_subjects', $subjects);
981
+ }
982
+
983
+ /**
984
+ * Check if we're ready for the next step.
985
+ * @param string $item
986
+ *
987
+ * @return array | bool
988
+ */
989
+ public function is_ready_for($item) {
990
+ if ( !rsssl_do_local_lets_encrypt_generation() ) {
991
+ rsssl_progress_add('directories');
992
+ rsssl_progress_add('generation');
993
+ rsssl_progress_add('dns-verification');
994
+ }
995
+
996
+ if ( !rsssl_dns_verification_required() ) {
997
+ rsssl_progress_add('dns-verification');
998
+ }
999
+
1000
+ if (empty(rsssl_get_not_completed_steps($item))){
1001
+ return true;
1002
+ } else{
1003
+ return false;
1004
+ }
1005
+ }
1006
+
1007
+ /**
1008
+ * Catch errors
1009
+ *
1010
+ * @since 3.0
1011
+ *
1012
+ * @access public
1013
+ * @param $errno
1014
+ * @param $errstr
1015
+ * @param $errfile
1016
+ * @param $errline
1017
+ * @param array $errcontext
1018
+ *
1019
+ * @return bool
1020
+ */
1021
+
1022
+ public function custom_error_handling( $errno, $errstr, $errfile, $errline, $errcontext = array() ) {
1023
+ return true;
1024
+ }
1025
+
1026
+ public function not_completed_steps_message($step){
1027
+ $not_completed_steps = rsssl_get_not_completed_steps($step);
1028
+ $nice_names = array();
1029
+ foreach ($not_completed_steps as $not_completed_step ) {
1030
+ $index = array_search($not_completed_step, array_column( RSSSL_LE()->config->steps['lets-encrypt'], 'id'));
1031
+ $nice_names[] = RSSSL_LE()->config->steps['lets-encrypt'][$index+1]['title'];
1032
+ }
1033
+ return sprintf(__('Please complete the following step(s) first: %s', "really-simple-ssl"), implode(", ", $nice_names) );
1034
+ }
1035
+
1036
+ /**
1037
+ * Test for writing permissions
1038
+ * @return RSSSL_RESPONSE
1039
+ */
1040
+
1041
+ public function check_writing_permissions(){
1042
+ $directories_without_permissions = $this->directories_without_writing_permissions();
1043
+ $has_missing_permissions = count($directories_without_permissions)>0;
1044
+
1045
+ if ( $has_missing_permissions ) {
1046
+ rsssl_progress_remove('directories');
1047
+ $action = 'stop';
1048
+ $status = 'error';
1049
+ $message = __("The following directories do not have the necessary writing permissions.", "really-simple-ssl" )."&nbsp;".__("Set permissions to 644 to enable SSL generation.", "really-simple-ssl" );
1050
+ foreach ($directories_without_permissions as $directories_without_permission) {
1051
+ $message .= "<br> - ".$directories_without_permission;
1052
+ }
1053
+ } else {
1054
+ $action = 'continue';
1055
+ $status = 'success';
1056
+ $message = __("The required directories have the necessary writing permissions.", "really-simple-ssl" );
1057
+ }
1058
+ return new RSSSL_RESPONSE($status, $action, $message);
1059
+ }
1060
+
1061
+ /**
1062
+ * Test for directory
1063
+ * @return RSSSL_RESPONSE
1064
+ */
1065
+
1066
+ public function check_challenge_directory(){
1067
+ if ( !$this->challenge_directory() ) {
1068
+ rsssl_progress_remove('directories');
1069
+ $action = 'stop';
1070
+ $status = 'error';
1071
+ $message = __("The challenge directory is not created yet.", "really-simple-ssl" );
1072
+ } else {
1073
+ $action = 'continue';
1074
+ $status = 'success';
1075
+ $message = __("The challenge directory was successfully created.", "really-simple-ssl" );
1076
+ }
1077
+
1078
+ return new RSSSL_RESPONSE($status, $action, $message);
1079
+ }
1080
+ /**
1081
+ * Test for directory
1082
+ * @return RSSSL_RESPONSE
1083
+ */
1084
+
1085
+ public function check_key_directory(){
1086
+ $action = 'stop';
1087
+ $status = 'error';
1088
+ $message = __("The key directory is not created yet.", "really-simple-ssl" );
1089
+ //this option is set in the key_dir function, so we need to check it now.
1090
+ if ( !get_option('rsssl_create_folders_in_root')) {
1091
+ $action = 'retry';
1092
+ $message = __("Trying to create directory in root of website.", "really-simple-ssl" );
1093
+ }
1094
+
1095
+ if ( !$this->key_directory() ) {
1096
+ rsssl_progress_remove('directories');
1097
+ } else {
1098
+ $action = 'continue';
1099
+ $status = 'success';
1100
+ $message = __("The key directory was successfully created.", "really-simple-ssl" );
1101
+ }
1102
+ return new RSSSL_RESPONSE($status, $action, $message);
1103
+ }
1104
+
1105
+ /**
1106
+ * Test for directory
1107
+ * @return RSSSL_RESPONSE
1108
+ */
1109
+
1110
+ public function check_certs_directory(){
1111
+ if ( !$this->certs_directory() ) {
1112
+ rsssl_progress_remove('directories');
1113
+ $action = 'stop';
1114
+ $status = 'error';
1115
+ $message = __("The certs directory is not created yet.", "really-simple-ssl" );
1116
+ } else {
1117
+ $action = 'continue';
1118
+ $status = 'success';
1119
+ $message = __("The certs directory was successfully created.", "really-simple-ssl" );
1120
+ }
1121
+ return new RSSSL_RESPONSE($status, $action, $message);
1122
+ }
1123
+
1124
+ /**
1125
+ * Check if our created directories have the necessary writing permissions
1126
+ */
1127
+
1128
+ public function directories_without_writing_permissions( ){
1129
+ $required_folders = array(
1130
+ $this->key_directory,
1131
+ $this->certs_directory,
1132
+ );
1133
+
1134
+ if ( !rsssl_dns_verification_required() ) {
1135
+ $required_folders[] = $this->challenge_directory;
1136
+ }
1137
+
1138
+ $no_writing_permissions = array();
1139
+ foreach ($required_folders as $required_folder){
1140
+ if (!$this->directory_has_writing_permissions( $required_folder )) {
1141
+ $no_writing_permissions[] = $required_folder;
1142
+ }
1143
+ }
1144
+
1145
+ return $no_writing_permissions;
1146
+ }
1147
+
1148
+ /**
1149
+ * Check if a directory has writing permissions
1150
+ * @param string $directory
1151
+ *
1152
+ * @return bool
1153
+ */
1154
+ public function directory_has_writing_permissions( $directory ){
1155
+ set_error_handler(array($this, 'custom_error_handling'));
1156
+ $test_file = fopen( $directory . "/really-simple-ssl-permissions-check.txt", "w" );
1157
+ fwrite($test_file, 'file to test writing permissions for Really Simple SSL');
1158
+ fclose( $test_file );
1159
+ restore_error_handler();
1160
+ if (!file_exists($directory . "/really-simple-ssl-permissions-check.txt")) {
1161
+ return false;
1162
+ } else {
1163
+ return true;
1164
+ }
1165
+ }
1166
+
1167
+ /**
1168
+ * Check if the challenage directory is reachable over the http protocol
1169
+ * @return RSSSL_RESPONSE
1170
+ */
1171
+
1172
+ public function challenge_directory_reachable(){
1173
+ $file_content = false;
1174
+ $status_code = __('no response','really-simple-ssl');
1175
+ //make sure we request over http, otherwise the request might fail if the url is already https.
1176
+ $url = str_replace('https://', 'http://', site_url('.well-known/acme-challenge/really-simple-ssl-permissions-check.txt'));
1177
+
1178
+ $error_message = sprintf(__( "Could not reach challenge directory over %s.", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">'.$url.'</a>');
1179
+ $test_string = 'Really Simple SSL';
1180
+ $folders = $this->directories_without_writing_permissions();
1181
+ if ( !$this->challenge_directory() || count($folders) !==0 ) {
1182
+ $status = 'error';
1183
+ $action = 'stop';
1184
+ $message = __( "Challenge directory not writable.", "really-simple-ssl");
1185
+ return new RSSSL_RESPONSE($status, $action, $message);
1186
+ }
1187
+
1188
+ $response = wp_remote_get( $url );
1189
+ if ( is_array( $response ) ) {
1190
+ $status_code = wp_remote_retrieve_response_code( $response );
1191
+ $file_content = wp_remote_retrieve_body( $response );
1192
+ }
1193
+
1194
+ if ( $status_code !== 200 ) {
1195
+ if (get_option('rsssl_skip_challenge_directory_request')) {
1196
+ $status = 'warning';
1197
+ $action = 'continue';
1198
+ $message = $error_message.' '.sprintf( __( "Error code %s.", "really-simple-ssl" ), $status_code );
1199
+ } else {
1200
+ $status = 'error';
1201
+ $action = 'stop';
1202
+ $message = $error_message.' '.sprintf( __( "Error code %s.", "really-simple-ssl" ), $status_code );
1203
+ rsssl_progress_remove('directories');
1204
+ }
1205
+
1206
+
1207
+ } else {
1208
+ if ( ! is_wp_error( $response ) && ( strpos( $file_content, $test_string ) !== false ) ) {
1209
+ $status = 'success';
1210
+ $action = 'continue';
1211
+ $message = __( "Successfully verified alias domain.", "really-simple-ssl" );
1212
+ set_transient('rsssl_alias_domain_available', 'available', 30 * MINUTE_IN_SECONDS );
1213
+ } else {
1214
+ $status = 'error';
1215
+ $action = 'stop';
1216
+ $message = $error_message;
1217
+ rsssl_progress_remove('directories');
1218
+ }
1219
+ }
1220
+ return new RSSSL_RESPONSE($status, $action, $message);
1221
+ }
1222
+
1223
+ /**
1224
+ * Check if exists, create .well-known/acme-challenge directory if not existing
1225
+ * @return bool|string
1226
+ */
1227
+ public function challenge_directory() {
1228
+ $root_directory = trailingslashit(ABSPATH);
1229
+ if ( ! file_exists( $root_directory . '.well-known' ) ) {
1230
+ mkdir( $root_directory . '.well-known' );
1231
+ }
1232
+
1233
+ if ( ! file_exists( $root_directory . '.well-known/acme-challenge' ) ) {
1234
+ mkdir( $root_directory . '.well-known/acme-challenge' );
1235
+ }
1236
+
1237
+ if ( file_exists( $root_directory . '.well-known/acme-challenge' ) ){
1238
+ return $root_directory . '.well-known/acme-challenge';
1239
+ } else {
1240
+ return false;
1241
+ }
1242
+ }
1243
+
1244
+ /**
1245
+ * Check if exists, create ssl/certs directory above the wp root if not existing
1246
+ * @return bool|string
1247
+ */
1248
+ public function certs_directory(){
1249
+ $directory = $this->get_directory_path();
1250
+ if ( ! file_exists( $directory . 'ssl' ) ) {
1251
+ mkdir( $directory . 'ssl' );
1252
+ }
1253
+
1254
+ if ( ! file_exists( $directory . 'ssl/certs' ) ) {
1255
+ mkdir( $directory . 'ssl/certs' );
1256
+ }
1257
+
1258
+ if ( file_exists( $directory . 'ssl/certs' ) ){
1259
+ return $directory . 'ssl/certs';
1260
+ } else {
1261
+ return false;
1262
+ }
1263
+ }
1264
+
1265
+ /**
1266
+ * Get path to location where to create the directories.
1267
+ * @return string
1268
+ */
1269
+ public function get_directory_path(){
1270
+ $root_directory = trailingslashit(ABSPATH);
1271
+ if ( get_option('rsssl_create_folders_in_root') ) {
1272
+ if ( !get_option('rsssl_ssl_dirname') ) {
1273
+ $token = str_shuffle ( time() );
1274
+ update_option('rsssl_ssl_dirname', $token );
1275
+ }
1276
+ if ( ! file_exists( $root_directory . get_option('rsssl_ssl_dirname') ) ) {
1277
+ mkdir( $root_directory . get_option('rsssl_ssl_dirname') );
1278
+ }
1279
+ return $root_directory . trailingslashit( get_option('rsssl_ssl_dirname') );
1280
+ } else {
1281
+ return trailingslashit(dirname($root_directory));
1282
+ }
1283
+ }
1284
+
1285
+ /**
1286
+ * Check if exists, create ssl/keys directory above the wp root if not existing
1287
+ * @return bool|string
1288
+ */
1289
+
1290
+ public function key_directory(){
1291
+ $directory = $this->get_directory_path();
1292
+ if ( ! file_exists( $directory . 'ssl' ) ) {
1293
+ mkdir( $directory . 'ssl' );
1294
+ }
1295
+
1296
+ if ( ! file_exists( $directory . 'ssl/keys' ) ) {
1297
+ mkdir( $directory . 'ssl/keys' );
1298
+ }
1299
+
1300
+ if ( file_exists( $directory . 'ssl/keys' ) ){
1301
+ return $directory . 'ssl/keys';
1302
+ } else {
1303
+ //if creating the folder has failed, we're on apache, and can write to these folders, we create a root directory.
1304
+ $challenge_dir = $this->challenge_directory;
1305
+ $has_writing_permissions = $this->directory_has_writing_permissions( $challenge_dir );
1306
+ //we're guessing that if the challenge dir has writing permissions, the new dir will also have it.
1307
+ if ( RSSSL()->rsssl_server->uses_htaccess() && $has_writing_permissions ) {
1308
+ update_option('rsssl_create_folders_in_root', true);
1309
+ }
1310
+ return false;
1311
+ }
1312
+ }
1313
+
1314
+ /**
1315
+ * Clear the keys directory, used in reset function
1316
+ */
1317
+ public function clear_keys_directory(){
1318
+ if (!current_user_can('manage_options')) {
1319
+ return;
1320
+ }
1321
+ $path = $this->key_directory();
1322
+ if ( file_exists( $path ) && $handle = opendir( $path ) ) {
1323
+ while ( false !== ( $file = readdir( $handle ) ) ) {
1324
+ if ( strpos($file, 'account_live_')!==false || strpos($file, 'account_staging_')!==false ){
1325
+ unlink($path.'/'.$file);
1326
+ }
1327
+ }
1328
+ closedir( $handle );
1329
+ }
1330
+
1331
+ }
1332
+
1333
+ public function maybe_create_htaccess_directories(){
1334
+ if (!current_user_can('manage_options')) {
1335
+ return;
1336
+ }
1337
+
1338
+ if ( !RSSSL()->rsssl_server->uses_htaccess() ) {
1339
+ return;
1340
+ }
1341
+
1342
+ if ( !get_option('rsssl_create_folders_in_root') ) {
1343
+ return;
1344
+ }
1345
+
1346
+ if ( !empty($this->get_directory_path()) ) {
1347
+ $this->write_htaccess_dir_file( $this->get_directory_path().'ssl/.htaccess' ,'ssl');
1348
+ }
1349
+
1350
+ if ( !empty($this->key_directory()) ) {
1351
+ $this->write_htaccess_dir_file( trailingslashit($this->key_directory()).'.htaccess' ,'key');
1352
+ }
1353
+ if ( !empty($this->certs_directory()) ) {
1354
+ $this->write_htaccess_dir_file( trailingslashit($this->certs_directory()).'.htaccess' ,'certs');
1355
+ }
1356
+ }
1357
+
1358
+ public function write_htaccess_dir_file($path, $type){
1359
+ $htaccess = '<ifModule mod_authz_core.c>' . "\n"
1360
+ . ' Require all denied' . "\n"
1361
+ . '</ifModule>' . "\n"
1362
+ . '<ifModule !mod_authz_core.c>' . "\n"
1363
+ . ' Deny from all' . "\n"
1364
+ . '</ifModule>';
1365
+ insert_with_markers($path, 'Really Simple SSL LETS ENCRYPT', $htaccess);
1366
+
1367
+ $htaccess = file_get_contents( $path );
1368
+ if ( strpos($htaccess, 'deny from all') !== FALSE ) {
1369
+ update_option('rsssl_htaccess_file_set_'.$type, true);
1370
+ return;
1371
+ }
1372
+ }
1373
+
1374
+ /**
1375
+ * Check if it's a subdomain multisite
1376
+ * @return RSSSL_RESPONSE
1377
+ */
1378
+ public function is_subdomain_setup(){
1379
+ if ( !is_multisite() ) {
1380
+ $is_subdomain = false;
1381
+ } else {
1382
+ if ( defined('SUBDOMAIN_INSTALL') && SUBDOMAIN_INSTALL ) {
1383
+ $is_subdomain = true;
1384
+ } else {
1385
+ $is_subdomain = false;
1386
+ }
1387
+ }
1388
+
1389
+ if ($is_subdomain) {
1390
+ $status = 'error';
1391
+ $action = 'stop';
1392
+ $message = sprintf(__("This is a multisite configuration with subdomains, which requires a wildcard certificate. Wildcard certificates are part of the %spremium%s plan.",'really-simple-ssl'), '<a href="https://really-simple-ssl.com/pro" target="_blank">','</a>');
1393
+ rsssl_progress_remove('system-status');
1394
+ } else {
1395
+ $status = 'success';
1396
+ $action = 'continue';
1397
+ $message = __("No subdomain setup detected.","really-simple-ssl");
1398
+ }
1399
+
1400
+ return new RSSSL_RESPONSE($status, $action, $message);
1401
+ }
1402
+
1403
+ /**
1404
+ * Check if we're about to create a wilcard certificate
1405
+ * @return bool
1406
+ */
1407
+
1408
+ public function is_wildcard(){
1409
+ $subjects = $this->get_subjects();
1410
+ $is_wildcard = false;
1411
+ foreach ($subjects as $domain ) {
1412
+ if ( strpos($domain, '*') !== false ) {
1413
+ $is_wildcard = true;
1414
+ }
1415
+ }
1416
+
1417
+ return $is_wildcard;
1418
+ }
1419
+
1420
+ /**
1421
+ * Check if the alias domain is available
1422
+ *
1423
+ * @return RSSSL_RESPONSE
1424
+ */
1425
+ public function alias_domain_available(){
1426
+ if ( rsssl_is_subdomain() ) {
1427
+ return new RSSSL_RESPONSE('success', 'continue',__("Alias domain check is not relevant for a subdomain","really-simple-ssl"));
1428
+ }
1429
+ //write a test file to the uploads directory
1430
+ $uploads = wp_upload_dir();
1431
+ $upload_dir = trailingslashit($uploads['basedir']);
1432
+ $upload_url = trailingslashit($uploads['baseurl']);
1433
+ $file_content = false;
1434
+ $status_code = __('no response','really-simple-ssl');
1435
+ $domain = rsssl_get_domain();
1436
+
1437
+ if ( strpos( $domain, 'www.' ) !== false ) {
1438
+ $is_www = true;
1439
+ $alias_domain = str_replace( 'www.', '', $domain );
1440
+ } else {
1441
+ $is_www = false;
1442
+ $alias_domain = 'www.'.$domain;
1443
+ }
1444
+
1445
+ if ( $is_www ) {
1446
+ $message = __("Please check if the non www version of your site also points to this website.", "really-simple-ssl" );
1447
+ } else {
1448
+ $message = __("Please check if the www version of your site also points to this website.", "really-simple-ssl" );
1449
+ }
1450
+ $error_message = __( "Could not verify alias domain.", "really-simple-ssl") .' '. $message.' '. __( "If this is not the case, don't add this alias to your certificate.", "really-simple-ssl");
1451
+ //get cached status first.
1452
+ $cached_status = get_transient('rsssl_alias_domain_available');
1453
+ if ( $cached_status ) {
1454
+ if ( $cached_status === 'available' ) {
1455
+ $status = 'success';
1456
+ $action = 'continue';
1457
+ $message = __( "Successfully verified alias domain.", "really-simple-ssl" );
1458
+ } else {
1459
+ $status = 'warning';
1460
+ $action = 'continue';
1461
+ $message = $error_message;
1462
+ }
1463
+ return new RSSSL_RESPONSE($status, $action, $message);
1464
+ }
1465
+
1466
+ if ( ! file_exists( $upload_dir . 'rsssl' ) ) {
1467
+ mkdir( $upload_dir . 'rsssl' );
1468
+ }
1469
+
1470
+ $test_string = 'file to test alias domain existence';
1471
+ $test_file = $upload_dir . 'rsssl/test.txt';
1472
+ file_put_contents($test_file, $test_string );
1473
+ $test_url = $upload_url . 'rsssl/test.txt';
1474
+
1475
+
1476
+ if ( ! file_exists( $test_file ) ) {
1477
+ $status = 'error';
1478
+ $action = 'stop';
1479
+ $message = __("Could not create test folder and file.", "really-simple-ssl").' '.
1480
+ __("Please create a folder 'rsssl' in the uploads directory, with 644 permissions.", "really-simple-ssl");
1481
+ } else {
1482
+ set_transient('rsssl_alias_domain_available', 'not-available', 30 * MINUTE_IN_SECONDS );
1483
+ $alias_test_url = str_replace( $domain, $alias_domain, $test_url );
1484
+ //always over http:
1485
+ $alias_test_url = str_replace('https://','http://', $alias_test_url);
1486
+ $response = wp_remote_get( $alias_test_url );
1487
+ if ( is_array( $response ) ) {
1488
+ $status_code = wp_remote_retrieve_response_code( $response );
1489
+ $file_content = wp_remote_retrieve_body( $response );
1490
+ }
1491
+
1492
+ if ( $status_code !== 200 ) {
1493
+ $status = 'warning';
1494
+ $action = 'continue';
1495
+ $message = $error_message;
1496
+ if (intval($status_code) != 0 ) {
1497
+ $message .= ' '.sprintf( __( "Error code %s", "really-simple-ssl" ), $status_code );
1498
+ }
1499
+ } else {
1500
+ if ( ! is_wp_error( $response ) && ( strpos( $file_content, $test_string ) !== false ) ) {
1501
+ //make sure we only set this value once, during first setup.
1502
+ if ( !get_option('rsssl_initial_alias_domain_value_set') ) {
1503
+ RSSSL_LE()->field->save_field('rsssl_include_alias', true);
1504
+ update_option('rsssl_initial_alias_domain_value_set', true);
1505
+ }
1506
+ $status = 'success';
1507
+ $action = 'continue';
1508
+ $message = __( "Successfully verified alias domain.", "really-simple-ssl" );
1509
+ set_transient('rsssl_alias_domain_available', 'available', 30 * MINUTE_IN_SECONDS );
1510
+ } else {
1511
+ $status = 'warning';
1512
+ $action = 'continue';
1513
+ $message = $error_message;
1514
+ }
1515
+ }
1516
+ }
1517
+
1518
+ return new RSSSL_RESPONSE($status, $action, $message);
1519
+ }
1520
+
1521
+ /**
1522
+ * Get string error from error message.
1523
+ * @param mixed|LE_ACME2\Exception\InvalidResponse $e
1524
+ *
1525
+ * @return string
1526
+ */
1527
+ private function get_error($e){
1528
+ $is_raw_response = false;
1529
+ if (method_exists($e, 'getRawResponse') && isset($e->getRawResponse()->body['detail'])) {
1530
+ $is_raw_response = true;
1531
+ $error = $e->getRawResponse()->body['detail'];
1532
+ error_log($error);
1533
+ //check for subproblems
1534
+ if (isset($e->getRawResponse()->body['subproblems'])){
1535
+ $error .= '<ul>';
1536
+ foreach($e->getRawResponse()->body['subproblems'] as $index => $problem) {
1537
+ $error .= '<li>'. $this->cleanup_error_message($e->getRawResponse()->body['subproblems'][$index]['detail']).'</li>';
1538
+ }
1539
+ $error .= '</ul>';
1540
+ }
1541
+
1542
+ } else {
1543
+ $error = $e->getMessage();
1544
+ }
1545
+
1546
+
1547
+ $max = strpos($error, 'CURL response');
1548
+ if ($max===false) {
1549
+ $max = 200;
1550
+ }
1551
+ if (!$is_raw_response){
1552
+ $error = substr( $error, 0, $max);
1553
+ }
1554
+ return $error;
1555
+
1556
+ }
1557
+
1558
+ /**
1559
+ * Generic SSL cert installation function
1560
+ * @param $server
1561
+ * @param $type
1562
+ *
1563
+ * @return RSSSL_RESPONSE
1564
+ */
1565
+ public function cron_renew_installation($server, $type) {
1566
+ //autodetect if empty
1567
+ if (!$server) {
1568
+ $install_method = get_option('rsssl_le_certificate_installed_by_rsssl');
1569
+ $data = explode($install_method, ':');
1570
+ $server = isset($data[0]) ? $data[0] : false;
1571
+ $type = isset($data[1]) ? $data[1] : false;
1572
+ }
1573
+
1574
+ $attempt_count = intval(get_transient('rsssl_le_install_attempt_count'));
1575
+ $attempt_count++;
1576
+ set_transient('rsssl_le_install_attempt_count', $attempt_count, DAY_IN_SECONDS);
1577
+ if ( $attempt_count>10 ){
1578
+ delete_option("rsssl_le_start_installation");
1579
+ $status = 'error';
1580
+ $action = 'stop';
1581
+ $message = __("The certificate installation was rate limited. Please try again later.",'really-simple-ssl');
1582
+ return new RSSSL_RESPONSE($status, $action, $message);
1583
+ }
1584
+
1585
+ if (rsssl_is_ready_for('installation')) {
1586
+ try {
1587
+ if ( $server === 'cpanel' ) {
1588
+ if ($type==='default') {
1589
+ $response = rsssl_install_cpanel_default();
1590
+ } else {
1591
+ $response = rsssl_install_cpanel_shell();
1592
+ }
1593
+
1594
+ if ( $response->status === 'success' ) {
1595
+ delete_option( "rsssl_le_start_installation" );
1596
+ }
1597
+ return $response;
1598
+ } else if ( $server === 'plesk') {
1599
+ $response = rsssl_plesk_install();
1600
+ if ( $response->status === 'success' ) {
1601
+ delete_option( "rsssl_le_start_installation" );
1602
+ }
1603
+ return $response;
1604
+ } else {
1605
+ $status = 'error';
1606
+ $action = 'stop';
1607
+ $message = __("Not recognized server.", "really-simple-ssl");
1608
+ }
1609
+ } catch (Exception $e) {
1610
+ error_log(print_r($e, true));
1611
+ $status = 'error';
1612
+ $action = 'stop';
1613
+ $message = __("Installation failed.", "really-simple-ssl");
1614
+ }
1615
+ } else {
1616
+ $status = 'error';
1617
+ $action = 'stop';
1618
+ $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
1619
+ }
1620
+
1621
+ return new RSSSL_RESPONSE($status, $action, $message);
1622
+ }
1623
+
1624
+ /**
1625
+ * Cleanup the default message a bit
1626
+ *
1627
+ * @param $msg
1628
+ *
1629
+ * @return string|string[]
1630
+ */
1631
+ private function cleanup_error_message($msg){
1632
+ return str_replace(array(
1633
+ 'Refer to sub-problems for more information.',
1634
+ 'Error creating new order ::',
1635
+ ), '', $msg);
1636
+ }
1637
+
1638
+ /**
1639
+ * Encode a string
1640
+ * @param string $string
1641
+ * @return string
1642
+ */
1643
+
1644
+ public function encode( $string ) {
1645
+ if ( strlen(trim($string)) === 0 ) {
1646
+ return $string;
1647
+ }
1648
+
1649
+ if (strpos( $string , 'rsssl_') !== FALSE ) {
1650
+ return $string;
1651
+ }
1652
+
1653
+ $key = $this->get_key();
1654
+ if ( !$key ) {
1655
+ $key = $this->set_key();
1656
+ }
1657
+
1658
+ $ivlength = openssl_cipher_iv_length('aes-256-cbc');
1659
+ $iv = openssl_random_pseudo_bytes($ivlength);
1660
+ $ciphertext_raw = openssl_encrypt($string, 'aes-256-cbc', $key, 0, $iv);
1661
+ $key = base64_encode( $iv.$ciphertext_raw );
1662
+
1663
+ return 'rsssl_'.$key;
1664
+ }
1665
+
1666
+ /**
1667
+ * Decode a string
1668
+ * @param $string
1669
+ *
1670
+ * @return string
1671
+ */
1672
+ public function decode($string){
1673
+ if ( !wp_doing_cron() && !current_user_can('manage_options') ) {
1674
+ return '';
1675
+ }
1676
+
1677
+ if (strpos( $string , 'rsssl_') !== FALSE ) {
1678
+ $key = $this->get_key();
1679
+ $string = str_replace('rsssl_', '', $string);
1680
+
1681
+ // To decrypt, split the encrypted data from our IV
1682
+ $ivlength = openssl_cipher_iv_length('aes-256-cbc');
1683
+ $iv = substr(base64_decode($string), 0, $ivlength);
1684
+ $encrypted_data = substr(base64_decode($string), $ivlength);
1685
+
1686
+ $decrypted = openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
1687
+ return $decrypted;
1688
+ }
1689
+
1690
+ //not encoded, return
1691
+ return $string;
1692
+ }
1693
+
1694
+ /**
1695
+ * Set a new key
1696
+ * @return string
1697
+ */
1698
+
1699
+ private function set_key(){
1700
+ update_site_option( 'rsssl_key' , time() );
1701
+ return get_site_option('rsssl_key');
1702
+ }
1703
+
1704
+ /**
1705
+ * Get a decode/encode key
1706
+ * @return false|string
1707
+ */
1708
+
1709
+ private function get_key() {
1710
+ return get_site_option( 'rsssl_key' );
1711
+ }
1712
+
1713
+
1714
+ }
lets-encrypt/composer.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ {
2
+ "require": {
3
+ "fbett/le_acme2": "^1.5",
4
+ "plesk/api-php-lib": "^1.0"
5
+ }
6
+ }
lets-encrypt/composer.lock ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "b389e777ede0e3ee4826bceeb4a31f85",
8
+ "packages": [
9
+ {
10
+ "name": "fbett/le_acme2",
11
+ "version": "1.5.6",
12
+ "source": {
13
+ "type": "git",
14
+ "url": "https://github.com/fbett/le-acme2-php.git",
15
+ "reference": "26b2c421764b173326f6bcb0713a86bd614f77fa"
16
+ },
17
+ "dist": {
18
+ "type": "zip",
19
+ "url": "https://api.github.com/repos/fbett/le-acme2-php/zipball/26b2c421764b173326f6bcb0713a86bd614f77fa",
20
+ "reference": "26b2c421764b173326f6bcb0713a86bd614f77fa",
21
+ "shasum": ""
22
+ },
23
+ "require": {
24
+ "ext-curl": "*",
25
+ "ext-json": "*",
26
+ "ext-openssl": "*",
27
+ "php": ">=7.3"
28
+ },
29
+ "type": "library",
30
+ "autoload": {
31
+ "psr-0": {
32
+ "LE_ACME2": "src/"
33
+ }
34
+ },
35
+ "notification-url": "https://packagist.org/downloads/",
36
+ "license": [
37
+ "MIT"
38
+ ],
39
+ "authors": [
40
+ {
41
+ "name": "Fabian Bett",
42
+ "homepage": "https://www.bett-ingenieure.de",
43
+ "role": "Developer"
44
+ }
45
+ ],
46
+ "description": "Letsencrypt PHP ACME v2 client",
47
+ "homepage": "https://github.com/fbett/le-acme2-php",
48
+ "support": {
49
+ "issues": "https://github.com/fbett/le-acme2-php/issues",
50
+ "source": "https://github.com/fbett/le-acme2-php/tree/v1.5.6"
51
+ },
52
+ "time": "2021-05-17T07:08:46+00:00"
53
+ },
54
+ {
55
+ "name": "plesk/api-php-lib",
56
+ "version": "v1.0.7",
57
+ "source": {
58
+ "type": "git",
59
+ "url": "https://github.com/plesk/api-php-lib.git",
60
+ "reference": "7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605"
61
+ },
62
+ "dist": {
63
+ "type": "zip",
64
+ "url": "https://api.github.com/repos/plesk/api-php-lib/zipball/7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605",
65
+ "reference": "7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605",
66
+ "shasum": ""
67
+ },
68
+ "require": {
69
+ "ext-curl": "*",
70
+ "ext-simplexml": "*",
71
+ "ext-xml": "*",
72
+ "php": "^7.3"
73
+ },
74
+ "require-dev": {
75
+ "phpunit/phpunit": "^9",
76
+ "spatie/phpunit-watcher": "^1.22"
77
+ },
78
+ "type": "library",
79
+ "extra": {
80
+ "branch-alias": {
81
+ "dev-master": "2.0.x-dev"
82
+ }
83
+ },
84
+ "autoload": {
85
+ "psr-4": {
86
+ "PleskX\\": "src/"
87
+ }
88
+ },
89
+ "notification-url": "https://packagist.org/downloads/",
90
+ "license": [
91
+ "Apache-2.0"
92
+ ],
93
+ "authors": [
94
+ {
95
+ "name": "Alexei Yuzhakov",
96
+ "email": "sibprogrammer@gmail.com"
97
+ },
98
+ {
99
+ "name": "Plesk International GmbH.",
100
+ "email": "plesk-dev-leads@plesk.com"
101
+ }
102
+ ],
103
+ "description": "PHP object-oriented library for Plesk XML-RPC API",
104
+ "support": {
105
+ "issues": "https://github.com/plesk/api-php-lib/issues",
106
+ "source": "https://github.com/plesk/api-php-lib/tree/v1.0.7"
107
+ },
108
+ "time": "2020-12-24T07:20:26+00:00"
109
+ }
110
+ ],
111
+ "packages-dev": [],
112
+ "aliases": [],
113
+ "minimum-stability": "stable",
114
+ "stability-flags": [],
115
+ "prefer-stable": false,
116
+ "prefer-lowest": false,
117
+ "platform": [],
118
+ "platform-dev": [],
119
+ "plugin-api-version": "2.0.0"
120
+ }
lets-encrypt/composer.phar ADDED
Binary file
lets-encrypt/cron.php ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) or die();
3
+
4
+ /*
5
+ Schedule cron jobs if useCron is true
6
+ Else start the functions.
7
+
8
+
9
+ */
10
+ add_action( 'plugins_loaded', 'rsssl_le_schedule_cron' );
11
+ function rsssl_le_schedule_cron() {
12
+ //only run if SSL is enabled.
13
+ if ( !RSSSL()->rsssl_front_end->ssl_enabled ) {
14
+ return;
15
+ }
16
+
17
+ if ( !RSSSL_LE()->letsencrypt_handler->generated_by_rsssl() ) {
18
+ return;
19
+ }
20
+
21
+ $useCron = true;
22
+ if ( $useCron ) {
23
+ if ( ! wp_next_scheduled( 'rsssl_le_every_week_hook' ) ) {
24
+ wp_schedule_event( time(), 'rsssl_le_weekly',
25
+ 'rsssl_le_every_week_hook' );
26
+ }
27
+
28
+ if ( ! wp_next_scheduled( 'rsssl_le_every_day_hook' ) ) {
29
+ wp_schedule_event( time(), 'rsssl_le_daily', 'rsssl_le_every_day_hook' );
30
+ }
31
+ if ( ! wp_next_scheduled( 'rsssl_le_every_five_minutes_hook' ) ) {
32
+ wp_schedule_event( time(), 'rsssl_le_five_minutes', 'rsssl_le_every_five_minutes_hook' );
33
+ }
34
+ add_action( 'rsssl_le_every_week_hook', 'rsssl_le_cron_maybe_start_renewal' );
35
+ add_action( 'rsssl_le_every_five_minutes_hook', 'rsssl_le_check_renewal_status' );
36
+ } else {
37
+ add_action( 'init', 'rsssl_le_cron_maybe_start_renewal' );
38
+ add_action( 'init', 'rsssl_le_check_renewal_status' );
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Check if the certificate is generated by RSSSL. If so, renew if necessary
44
+ */
45
+ function rsssl_le_cron_maybe_start_renewal(){
46
+
47
+ if ( !RSSSL_LE()->letsencrypt_handler->generated_by_rsssl() ) {
48
+ return;
49
+ }
50
+
51
+ if ( RSSSL_LE()->letsencrypt_handler->cron_certificate_needs_renewal() ) {
52
+ update_option("rsssl_le_start_renewal", true);
53
+ }
54
+
55
+ if ( RSSSL_LE()->letsencrypt_handler->certificate_install_required() ) {
56
+ update_option("rsssl_le_start_installation", true);
57
+ }
58
+
59
+ }
60
+
61
+ function rsssl_le_check_renewal_status(){
62
+ //when DNS validated, without api, we cannot autorenew
63
+ if ( !RSSSL_LE()->letsencrypt_handler->ssl_generation_can_auto_renew() ) {
64
+ return;
65
+ }
66
+
67
+ $renewal_active = get_option("rsssl_le_start_renewal");
68
+ $installation_active = get_option("rsssl_le_start_installation");
69
+
70
+ if ( $renewal_active ) {
71
+ RSSSL_LE()->letsencrypt_handler->create_bundle_or_renew();
72
+ } else if ( $installation_active ) {
73
+ RSSSL_LE()->letsencrypt_handler->cron_renew_installation();
74
+ }
75
+ }
76
+
77
+ add_filter( 'cron_schedules', 'rsssl_le_filter_cron_schedules' );
78
+ function rsssl_le_filter_cron_schedules( $schedules ) {
79
+ $schedules['rsssl_le_weekly'] = array(
80
+ 'interval' => WEEK_IN_SECONDS,
81
+ 'display' => __( 'Once every week' )
82
+ );
83
+ $schedules['rsssl_le_daily'] = array(
84
+ 'interval' => DAY_IN_SECONDS,
85
+ 'display' => __( 'Once every day' )
86
+ );
87
+ $schedules['rsssl_le_five_minutes'] = array(
88
+ 'interval' => 5 * MINUTE_IN_SECONDS,
89
+ 'display' => __( 'Once every 5 minutes' )
90
+ );
91
+
92
+ return $schedules;
93
+ }
94
+
95
+
96
+ register_deactivation_hook( rsssl_file, 'rsssl_le_clear_scheduled_hooks' );
97
+ function rsssl_le_clear_scheduled_hooks() {
98
+ wp_clear_scheduled_hook( 'rsssl_le_every_week_hook' );
99
+ wp_clear_scheduled_hook( 'rsssl_le_every_day_hook' );
100
+ }
101
+
102
+
103
+
104
+
lets-encrypt/download.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ # No need for the template engine
3
+ define( 'WP_USE_THEMES', false );
4
+
5
+ #find the base path
6
+ define( 'BASE_PATH', rsssl_find_wordpress_base_path()."/" );
7
+
8
+ # Load WordPress Core
9
+ require_once( BASE_PATH.'wp-load.php' );
10
+ require_once( BASE_PATH.'wp-includes/class-phpass.php' );
11
+ require_once( BASE_PATH . 'wp-admin/includes/image.php' );
12
+
13
+ if ( !current_user_can('manage_options') ) {
14
+ die();
15
+ }
16
+ if ( !isset($_GET["type"]) ) {
17
+ die();
18
+ }
19
+
20
+ if (!isset($_GET['token'])) {
21
+ die();
22
+ }
23
+
24
+ if (!wp_verify_nonce($_GET['token'], 'rsssl_download_cert')){
25
+ die();
26
+ }
27
+
28
+ $type = sanitize_title($_GET['type']);
29
+ switch($type) {
30
+ case 'certificate':
31
+ $file = get_option('rsssl_certificate_path');
32
+ $file_name = 'certificate.cert';
33
+ break;
34
+ case 'private_key':
35
+ $file = get_option('rsssl_private_key_path');
36
+ $file_name = 'private.pem';
37
+ break;
38
+ case 'intermediate':
39
+ $file = get_option('rsssl_intermediate_path');
40
+ $file_name = 'intermediate.pem';
41
+ break;
42
+ default:
43
+ $file = false;
44
+ }
45
+
46
+ if (!file_exists($file)) {
47
+ echo __("File missing. Please retry the previous steps.", "really-simple-ssl");
48
+ die();
49
+ } else {
50
+ $content = file_get_contents($file);
51
+ }
52
+
53
+ $fp = fopen($file, 'rb');
54
+ if ($fp) {
55
+ if (function_exists('mb_strlen')) {
56
+ $fsize = mb_strlen($content, '8bit');
57
+ } else {
58
+ $fsize = strlen($content);
59
+ }
60
+ $path_parts = pathinfo($file);
61
+
62
+ header("Content-type: text/plain");
63
+ header("Content-Disposition: attachment; filename=\"".$file_name."\"");
64
+ header("Content-length: $fsize");
65
+ header("Cache-Control: private",false); // required for certain browsers
66
+ header("Pragma: public"); // required
67
+ header("Expires: 0");
68
+ header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
69
+ header("Content-Transfer-Encoding: binary");
70
+ echo $content;
71
+ } else {
72
+ echo "Someting went wrong #2";
73
+ }
74
+ fclose($fp);
75
+
76
+
77
+ function rsssl_find_wordpress_base_path() {
78
+ $dir = dirname(__FILE__);
79
+ do {
80
+ if( file_exists($dir."/wp-config.php") ) {
81
+ if (file_exists($dir."/current")){
82
+ return $dir.'/current';
83
+ } else {
84
+ return $dir;
85
+ }
86
+ }
87
+ } while( $dir = realpath("$dir/..") );
88
+ return null;
89
+ }
lets-encrypt/functions.php ADDED
@@ -0,0 +1,637 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ defined( 'ABSPATH' ) or die( "you do not have access to this page!" );
4
+
5
+ if ( ! function_exists( 'rsssl_user_can_manage' ) ) {
6
+ function rsssl_user_can_manage() {
7
+ if ( ! is_user_logged_in() ) {
8
+ return false;
9
+ }
10
+
11
+ if ( ! current_user_can( 'manage_options' ) ) {
12
+ return false;
13
+ }
14
+
15
+ return true;
16
+ }
17
+ }
18
+
19
+
20
+
21
+ /**
22
+ * Check if we need to use DNS verification
23
+ * @return bool
24
+ */
25
+ function rsssl_dns_verification_required(){
26
+
27
+ /**
28
+ * If our current hosting provider does not allow or require local SSL certificate generation,
29
+ * We do not need to DNS verification either.
30
+ */
31
+
32
+ if ( !rsssl_do_local_lets_encrypt_generation() ) {
33
+ return false;
34
+ }
35
+
36
+ if ( get_option('rsssl_verification_type')==='DNS' ) {
37
+ return true;
38
+ }
39
+
40
+ if ( rsssl_wildcard_certificate_required() ) {
41
+ return true;
42
+ }
43
+
44
+ return false;
45
+ }
46
+
47
+ if ( !function_exists('rsssl_is_cpanel')) {
48
+ /**
49
+ * Check if we're on CPanel
50
+ *
51
+ * @return bool
52
+ */
53
+ function rsssl_is_cpanel() {
54
+ if (get_option('rsssl_force_cpanel')) {
55
+ return true;
56
+ }
57
+
58
+ $open_basedir = ini_get("open_basedir");
59
+ if ( empty($open_basedir) && file_exists( "/usr/local/cpanel" ) ) {
60
+ return true;
61
+ } else if (rsssl_check_port(2082)) {
62
+ return true;
63
+ } else {
64
+ return false;
65
+ }
66
+ }
67
+ }
68
+
69
+ if (!function_exists('rsssl_cpanel_api_supported')) {
70
+ /**
71
+ * Check if CPanel supports the api
72
+ *
73
+ * @return bool
74
+ */
75
+ function rsssl_cpanel_api_supported() {
76
+ return rsssl_is_cpanel() && file_exists( "/usr/local/cpanel/php/cpanel.php" );
77
+ }
78
+ }
79
+
80
+ if (!function_exists('rsssl_activated_by_default')) {
81
+ /**
82
+ * Check if the host has ssl, activated by default
83
+ *
84
+ * @return bool
85
+ */
86
+ function rsssl_activated_by_default() {
87
+ $activated_by_default = false;
88
+ $activated_by_default_hosts = RSSSL_LE()->config->activated_by_default;
89
+ $current_host = rsssl_get_other_host();
90
+ if ( in_array( $current_host, $activated_by_default_hosts ) ) {
91
+ $activated_by_default = true;
92
+ }
93
+ return $activated_by_default;
94
+ }
95
+ }
96
+
97
+ if (!function_exists('rsssl_activation_required')) {
98
+ /**
99
+ * Check if the host has ssl, activation required
100
+ *
101
+ * @return bool
102
+ */
103
+ function rsssl_activation_required() {
104
+ $dashboard_activation_required = false;
105
+ $dashboard_activation_required_hosts = RSSSL_LE()->config->dashboard_activation_required;
106
+ $current_host = rsssl_get_other_host();
107
+ if ( in_array( $current_host, $dashboard_activation_required_hosts ) ) {
108
+ $dashboard_activation_required = true;
109
+ }
110
+ return $dashboard_activation_required;
111
+ }
112
+ }
113
+
114
+ if (!function_exists('rsssl_paid_only')) {
115
+ /**
116
+ * Check if the host has ssl, paid only
117
+ *
118
+ * @return bool
119
+ */
120
+ function rsssl_paid_only() {
121
+ $paid_only = false;
122
+ $paid_only_hosts = RSSSL_LE()->config->paid_only;
123
+ $current_host = rsssl_get_other_host();
124
+ if ( in_array( $current_host, $paid_only_hosts ) ) {
125
+ $paid_only = true;
126
+ }
127
+ return $paid_only;
128
+ }
129
+ }
130
+
131
+ if ( !function_exists('rsssl_is_plesk')) {
132
+ /**
133
+ * https://stackoverflow.com/questions/26927248/how-to-detect-servers-control-panel-type-with-php
134
+ * @return false
135
+ */
136
+ function rsssl_is_plesk() {
137
+ if (get_option('rsssl_force_plesk')) {
138
+ return true;
139
+ }
140
+
141
+ if ( get_option('rsssl_hosting_dashboard')==='plesk' ){
142
+ return true;
143
+ }
144
+
145
+ //cpanel takes precedence, as it's more precise
146
+ if ( rsssl_is_cpanel() ) {
147
+ return false;
148
+ }
149
+
150
+ $open_basedir = ini_get("open_basedir");
151
+ if ( empty($open_basedir) && is_dir( '/usr/local/psa' ) ) {
152
+ return true;
153
+ } else if (rsssl_check_port(2222)) {
154
+ return true;
155
+ } else {
156
+ return false;
157
+ }
158
+ }
159
+ }
160
+
161
+ if ( !function_exists('rsssl_is_directadmin')) {
162
+ /**
163
+ * https://stackoverflow.com/questions/26927248/how-to-detect-servers-control-panel-type-with-php
164
+ * @return bool
165
+ */
166
+ function rsssl_is_directadmin() {
167
+ if (get_option('rsssl_force_directadmin')) {
168
+ return true;
169
+ }
170
+
171
+ if ( get_option('rsssl_hosting_dashboard')==='directadmin' ){
172
+ return true;
173
+ }
174
+
175
+ //cpanel takes precedence, as it's more precise
176
+ if ( rsssl_is_cpanel() ) {
177
+ return false;
178
+ }
179
+
180
+ if ( rsssl_is_plesk() ) {
181
+ return false;
182
+ }
183
+
184
+ if (rsssl_check_port(2222)) {
185
+ return true;
186
+ } else {
187
+ return false;
188
+ }
189
+ }
190
+ }
191
+
192
+ /**
193
+ * @param int $port
194
+ *
195
+ * @return bool
196
+ * @throws Exception
197
+ */
198
+ function rsssl_check_port( $port)
199
+ {
200
+ try {
201
+ $ipAddress = gethostbyname('localhost');
202
+ $link = @fsockopen($ipAddress, $port, $errno, $error);
203
+ if ($error) {
204
+ return false;
205
+ }
206
+ } catch (\Exception $ex) {
207
+ return false;
208
+ }
209
+
210
+ if ( $link ) {
211
+ return true;
212
+ }
213
+ return false;
214
+ }
215
+
216
+ if ( !function_exists('rsssl_get_other_host') ) {
217
+ /**
218
+ * Get the selected hosting provider, if any.
219
+ * @return bool|string
220
+ */
221
+ function rsssl_get_other_host() {
222
+ return rsssl_get_value( 'other_host_type', false );
223
+ }
224
+ }
225
+
226
+ if ( !function_exists('rsssl_progress_add')) {
227
+ /**
228
+ * @param string $item
229
+ */
230
+ function rsssl_progress_add( $item ) {
231
+ $progress = get_option( "rsssl_le_installation_progress", array() );
232
+ if ( ! in_array( $item, $progress ) ) {
233
+ $progress[] = $item;
234
+ update_option( "rsssl_le_installation_progress", $progress );
235
+ }
236
+ }
237
+ }
238
+
239
+ if ( !function_exists('rsssl_uses_known_dashboard')) {
240
+ /**
241
+ * Check if website uses any of the known dashboards.
242
+ */
243
+ function rsssl_uses_known_dashboard( ) {
244
+ if ( rsssl_is_cpanel() || rsssl_is_plesk() || rsssl_is_directadmin() ) {
245
+ return true;
246
+ } else {
247
+ return false;
248
+ }
249
+ }
250
+ }
251
+
252
+ if ( !function_exists('rsssl_is_ready_for')) {
253
+ /**
254
+ * @param string $item
255
+ */
256
+ function rsssl_is_ready_for( $item ) {
257
+ if ( !rsssl_do_local_lets_encrypt_generation() ) {
258
+ rsssl_progress_add('directories');
259
+ rsssl_progress_add('generation');
260
+ rsssl_progress_add('dns-verification');
261
+ }
262
+
263
+ if ( !rsssl_dns_verification_required() ) {
264
+ rsssl_progress_add('dns-verification');
265
+ }
266
+
267
+ if (empty(rsssl_get_not_completed_steps($item))){
268
+ return true;
269
+ } else{
270
+ return false;
271
+ }
272
+ }
273
+ }
274
+
275
+ function rsssl_get_not_completed_steps($item){
276
+ $sequence = array_column( RSSSL_LE()->config->steps['lets-encrypt'], 'id');
277
+ //drop all statuses after $item. We only need to know if all previous ones have been completed
278
+ $index = array_search($item, $sequence);
279
+ $sequence = array_slice($sequence, 0, $index, true);
280
+ $not_completed = array();
281
+ $finished = get_option("rsssl_le_installation_progress", array());
282
+ foreach ($sequence as $status ) {
283
+ if (!in_array($status, $finished)) {
284
+ $not_completed[] = $status;
285
+ }
286
+ }
287
+
288
+ return $not_completed;
289
+ }
290
+
291
+ if ( !function_exists('rsssl_progress_remove')) {
292
+ /**
293
+ * @param string $item
294
+ */
295
+ function rsssl_progress_remove( $item ) {
296
+ $progress = get_option( "rsssl_le_installation_progress", array() );
297
+ if ( in_array( $item, $progress ) ) {
298
+ $index = array_search( $item, $progress );
299
+ unset( $progress[ $index ] );
300
+ update_option( "rsssl_le_installation_progress", $progress );
301
+ }
302
+ }
303
+ }
304
+
305
+ if ( !function_exists('rsssl_php_requirement_met')) {
306
+ /**
307
+ * Get PHP version status for tests
308
+ *
309
+ * @return RSSSL_RESPONSE
310
+ */
311
+ function rsssl_php_requirement_met() {
312
+ if ( version_compare( PHP_VERSION, rsssl_le_php_version, '<' ) ) {
313
+ rsssl_progress_remove( 'system-status' );
314
+ $action = 'stop';
315
+ $status = 'error';
316
+ $message = sprintf( __( "The minimum requirements for the PHP version have not been met. Please upgrade to %s", "really-simple-ssl" ), rsssl_le_php_version );
317
+ } else {
318
+ $action = 'continue';
319
+ $status = 'success';
320
+ $message = __( "You have the required PHP version to continue.", "really-simple-ssl" );
321
+ }
322
+
323
+ return new RSSSL_RESPONSE( $status, $action, $message );
324
+ }
325
+ }
326
+
327
+
328
+ if ( ! function_exists( 'rsssl_get_value' ) ) {
329
+
330
+ /**
331
+ * Get value for an a rsssl option
332
+ * For usage very early in the execution order, use the $page option. This bypasses the class usage.
333
+ *
334
+ * @param string $fieldname
335
+ * @param bool $use_default
336
+ *
337
+ * @return array|bool|mixed|string
338
+ */
339
+
340
+ function rsssl_get_value(
341
+ $fieldname, $use_default = true
342
+ ) {
343
+ $default = false;
344
+ $fields = get_option( 'rsssl_options_lets-encrypt' );
345
+ if ($use_default) {
346
+ if ( ! isset( RSSSL_LE()->config->fields[ $fieldname ] ) ) {
347
+ return false;
348
+ }
349
+ $default = ( isset( RSSSL_LE()->config->fields[ $fieldname ]['default'] ) ) ? RSSSL_LE()->config->fields[ $fieldname ]['default'] : '';
350
+ }
351
+
352
+ $value = isset( $fields[ $fieldname ] ) ? $fields[ $fieldname ] : $default;
353
+ return $value;
354
+ }
355
+ }
356
+
357
+ if ( !function_exists('rsssl_do_local_lets_encrypt_generation')) {
358
+ /**
359
+ * Check if the setup requires local certificate generation
360
+ * @return bool
361
+ */
362
+ function rsssl_do_local_lets_encrypt_generation() {
363
+ $not_local_cert_hosts = RSSSL_LE()->config->not_local_certificate_hosts;
364
+ $current_host = rsssl_get_other_host();
365
+ if ( in_array( $current_host, $not_local_cert_hosts ) ) {
366
+ return false;
367
+ }
368
+
369
+ return true;
370
+ }
371
+ }
372
+
373
+ function rsssl_get_manual_instructions_text( $url ){
374
+ $default_url = 'https://really-simple-ssl.com/install-ssl-certificate';
375
+ $dashboard_activation_required = rsssl_activation_required();
376
+ $activated_by_default = rsssl_activated_by_default();
377
+ $paid_only = rsssl_paid_only();
378
+ $button_activate = '<br><a href="'.$default_url.'" target="_blank" class="button button-primary">'.__("Instructions","really-simple-ssl").'</a>&nbsp;&nbsp;';
379
+ $button_complete = '<br><a href="'.$default_url.'" target="_blank" class="button button-primary">'.__("Instructions","really-simple-ssl").'</a>&nbsp;&nbsp;';
380
+
381
+ if ( $url === $default_url ) {
382
+ $complete_manually = sprintf(__("Please complete manually in your hosting dashboard.", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>');
383
+ $activate_manually = sprintf(__("Please activate it manually on your hosting dashboard.", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>');
384
+ } else {
385
+ $complete_manually = sprintf(__("Please complete %smanually%s", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>');
386
+ $activate_manually = sprintf(__("Please activate it on your dashboard %smanually%s", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>');
387
+ $button_activate .= '<a href="'.$url.'" target="_blank" class="button button-primary">'.__("Go to activation","really-simple-ssl").'</a>';
388
+ $button_complete .= '<a href="'.$url.'" target="_blank" class="button button-primary">'.__("Go to installation","really-simple-ssl").'</a>';
389
+ }
390
+
391
+ if ( $activated_by_default ) {
392
+ $msg = sprintf(__("According to our information, your hosting provider supplies your account with an SSL certificate by default. Please contact your %shosting support%s if this is not the case.","really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>').'&nbsp'.
393
+ __("After completing the installation, you can continue to the next step to complete your configuration.","really-simple-ssl");
394
+ } else if ( $dashboard_activation_required ) {
395
+ $msg = __( "You already have free SSL on your hosting environment.", "really-simple-ssl" ).'&nbsp'.
396
+ $activate_manually.' '.
397
+ __("After completing the installation, you can continue to the next step to complete your configuration.","really-simple-ssl")
398
+ .$button_activate;
399
+ } else if ( $paid_only ) {
400
+ $msg = sprintf(__("According to our information, your hosting provider does not allow any kind of SSL installation, other then their own paid certificate. For an alternative hosting provider with SSL, see this %sarticle%s.","really-simple-ssl"), '<a target="_blank" href="https://really-simple-ssl.com/hosting-providers-with-free-ssl">', '</a>');
401
+ } else {
402
+ $msg = __("Your hosting environment does not allow automatic SSL installation.","really-simple-ssl").' '.
403
+ $complete_manually.' '.
404
+ sprintf(__("You can follow these %sinstructions%s.","really-simple-ssl"), '<a target="_blank" href="'.$default_url.'">', '</a>').'&nbsp'.
405
+ __("After completing the installation, you can continue to the next step to complete your configuration.","really-simple-ssl")
406
+ .$button_complete;
407
+ }
408
+
409
+ return $msg;
410
+ }
411
+
412
+ if ( ! function_exists( 'rsssl_notice' ) ) {
413
+ /**
414
+ * Notification without arrow on the left. Should be used outside notifications center
415
+ * @param string $msg
416
+ * @param string $type notice | warning | success
417
+ * @param bool $remove_after_change
418
+ * @param bool $echo
419
+ * @param array $condition $condition['question'] $condition['answer']
420
+ *
421
+ * @return string|void
422
+ */
423
+ function rsssl_notice( $msg, $type = 'notice', $remove_after_change = false, $echo = true, $condition = false) {
424
+ if ( $msg == '' ) {
425
+ return;
426
+ }
427
+
428
+ // Condition
429
+ $condition_check = "";
430
+ $condition_question = "";
431
+ $condition_answer = "";
432
+ $rsssl_hidden = "";
433
+ if ($condition) {
434
+ $condition_check = "condition-check";
435
+ $condition_question = "data-condition-question='{$condition['question']}'";
436
+ $condition_answer = "data-condition-answer='{$condition['answer']}'";
437
+ $args['condition'] = array($condition['question'] => $condition['answer']);
438
+ $rsssl_hidden = rsssl_field::this()->condition_applies($args) ? "" : "rsssl-hidden";;
439
+ }
440
+
441
+ // Hide
442
+ $remove_after_change_class = $remove_after_change ? "rsssl-remove-after-change" : "";
443
+
444
+ $html = "<div class='rsssl-panel-wrap'><div class='rsssl-panel rsssl-notification rsssl-{$type} {$remove_after_change_class} {$rsssl_hidden} {$condition_check}' {$condition_question} {$condition_answer}><div>{$msg}</div></div></div>";
445
+
446
+ if ( $echo ) {
447
+ echo $html;
448
+ } else {
449
+ return $html;
450
+ }
451
+ }
452
+ }
453
+
454
+ if ( ! function_exists( 'rsssl_sidebar_notice' ) ) {
455
+ /**
456
+ * @param string $msg
457
+ * @param string $type notice | warning | success
458
+ * @param bool $echo
459
+ * @param bool|array $condition $condition['question'] $condition['answer']
460
+ *
461
+ * @return string|void
462
+ */
463
+
464
+ function rsssl_sidebar_notice( $msg, $type = 'notice', $echo = true, $condition = false) {
465
+ if ( $msg == '' ) {
466
+ return;
467
+ }
468
+
469
+ // Condition
470
+ $condition_check = "";
471
+ $condition_question = "";
472
+ $condition_answer = "";
473
+ $rsssl_hidden = "";
474
+ if ($condition) {
475
+ $condition_check = "condition-check";
476
+ $condition_question = "data-condition-question='{$condition['question']}'";
477
+ $condition_answer = "data-condition-answer='{$condition['answer']}'";
478
+ $args['condition'] = array($condition['question'] => $condition['answer']);
479
+ $rsssl_hidden = rsssl_field::this()->condition_applies($args) ? "" : "rsssl-hidden";;
480
+ }
481
+
482
+ $html = "<div class='rsssl-help-modal rsssl-notice rsssl-{$type} {$rsssl_hidden} {$condition_check}' {$condition_question} {$condition_answer}>{$msg}</div>";
483
+
484
+ if ( $echo ) {
485
+ echo $html;
486
+ } else {
487
+ return $html;
488
+ }
489
+ }
490
+ }
491
+
492
+
493
+ if (!function_exists('rsssl_read_more')) {
494
+ /**
495
+ * Create a generic read more text with link for help texts.
496
+ *
497
+ * @param string $url
498
+ * @param bool $add_space
499
+ *
500
+ * @return string
501
+ */
502
+ function rsssl_read_more( $url, $add_space = true ) {
503
+ $html = sprintf( __( "For more information on this subject, please read this %sarticle%s",
504
+ 'really-simple-ssl' ), '<a target="_blank" href="' . $url . '">',
505
+ '</a>' );
506
+ if ( $add_space ) {
507
+ $html = '&nbsp;' . $html;
508
+ }
509
+
510
+ return $html;
511
+ }
512
+ }
513
+
514
+
515
+ register_activation_hook( __FILE__, 'rsssl_set_activation_time_stamp' );
516
+ if ( ! function_exists( 'rsssl_set_activation_time_stamp' ) ) {
517
+ function rsssl_set_activation_time_stamp( $networkwide ) {
518
+ update_option( 'rsssl_activation_time', time() );
519
+ }
520
+ }
521
+
522
+ if ( ! function_exists( 'rsssl_array_filter_multidimensional' ) ) {
523
+ function rsssl_array_filter_multidimensional(
524
+ $array, $filter_key, $filter_value
525
+ ) {
526
+ $new = array_filter( $array,
527
+ function ( $var ) use ( $filter_value, $filter_key ) {
528
+ return isset( $var[ $filter_key ] ) ? ( $var[ $filter_key ]
529
+ == $filter_value )
530
+ : false;
531
+ } );
532
+
533
+ return $new;
534
+ }
535
+ }
536
+
537
+ if ( !function_exists('rsssl_is_subdomain') ) {
538
+ /**
539
+ * Check if we're on a subdomain.
540
+ * If this is a www domain, we return false
541
+ */
542
+ function rsssl_is_subdomain(){
543
+ $domain = rsssl_get_domain();
544
+ if ( strpos($domain, 'www.') !== false ) return false;
545
+
546
+ $root = rsssl_get_root_domain($domain);
547
+
548
+ if ($root === $domain ) {
549
+ return false;
550
+ } else {
551
+ return true;
552
+ }
553
+ }
554
+ }
555
+
556
+ if ( !function_exists('rsssl_get_subdomain') ) {
557
+ /**
558
+ * Get root domain of a domain
559
+ */
560
+ function rsssl_get_root_domain($domain){
561
+ $sub = strtolower(trim($domain));
562
+ $count = substr_count($sub, '.');
563
+ if($count === 2){
564
+ if(strlen(explode('.', $sub)[1]) > 3) $sub = explode('.', $sub, 2)[1];
565
+ } else if($count > 2){
566
+ $sub = rsssl_get_root_domain(explode('.', $sub, 2)[1]);
567
+ }
568
+ return $sub;
569
+ }
570
+ }
571
+
572
+ if ( ! function_exists( 'rsssl_get_domain' ) ) {
573
+ function rsssl_get_domain() {
574
+
575
+ //Get current domain
576
+ $domain = site_url();
577
+ //Parse to strip off any /subfolder/
578
+ $parse = parse_url($domain);
579
+ $domain = $parse['host'];
580
+
581
+ $domain = str_replace(array('http://', 'https://' ), '', $domain);
582
+
583
+ return $domain;
584
+ }
585
+ }
586
+
587
+ function rsssl_insert_after_key($array, $key, $items){
588
+ $keys = array_keys($array);
589
+ $key = array_search($key, $keys);
590
+ $array = array_slice($array, 0, $key, true) +
591
+ $items +
592
+ array_slice($array, 3, count($array)-3, true);
593
+
594
+ return $array;
595
+ }
596
+
597
+ if ( !function_exists('rsssl_wildcard_certificate_required') ) {
598
+ /**
599
+ * Check if the site requires a wildcard
600
+ *
601
+ * @return bool
602
+ */
603
+ function rsssl_wildcard_certificate_required() {
604
+ //if DNS verification, create wildcard.
605
+ if ( get_option('rsssl_verification_type') === 'DNS' ) {
606
+ return true;
607
+ }
608
+
609
+ if ( ! is_multisite() ) {
610
+ return false;
611
+ } else {
612
+ if ( defined( 'SUBDOMAIN_INSTALL' ) && SUBDOMAIN_INSTALL ) {
613
+ return true;
614
+ } else {
615
+ return false;
616
+ }
617
+ }
618
+ }
619
+ }
620
+
621
+ if ( !function_exists('rsssl_maybe_drop_subdomain_test') ) {
622
+ function rsssl_maybe_drop_subdomain_test( $steps ) {
623
+ if ( is_multisite() ) {
624
+ $index = array_search( 'system-status', array_column( $steps['lets-encrypt'], 'id' ) );
625
+ $index ++;
626
+ $actions = $steps['lets-encrypt'][ $index ]['actions'];
627
+ //get the is_subdomain_setup
628
+ $sub_index = array_search( 'is_subdomain_setup', array_column( $actions, 'action' ) );
629
+ unset( $actions[ $sub_index ] );
630
+ $steps['lets-encrypt'][ $index ]['actions'] = $actions;
631
+ }
632
+
633
+ return $steps;
634
+ }
635
+
636
+ add_filter( 'rsssl_steps', 'rsssl_maybe_drop_subdomain_test', 20 );
637
+ }
lets-encrypt/integrations/cloudways/cloudways.php ADDED
@@ -0,0 +1,266 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package CloudWays
4
+ * @author Rogier Lankhorst
5
+ * @copyright Copyright (C) 2021, Rogier Lankhorst
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3
7
+ * @link https://really-simple-ssl.com
8
+ * @since Class available since Release 5.0.0
9
+ *
10
+ *
11
+ * This program is free software: you can redistribute it and/or modify
12
+ * it under the terms of the GNU General Public License as published by
13
+ * the Free Software Foundation, either version 3 of the License, or
14
+ * (at your option) any later version.
15
+ *
16
+ * This program is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ * GNU General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU General Public License
22
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
23
+ *
24
+ */
25
+ class rsssl_Cloudways {
26
+ private $email;
27
+ private $api_key;
28
+ public $ssl_installation_url;
29
+
30
+ /**
31
+ * Initiates the cloudways class.
32
+ *
33
+ * @param string $email
34
+ * @param string $api_key
35
+ */
36
+
37
+ public function __construct( ) {
38
+ $this->email = rsssl_get_value('cloudways_user_email');
39
+ $this->api_key = RSSSL_LE()->letsencrypt_handler->decode( rsssl_get_value('cloudways_api_key') );
40
+ $this->ssl_installation_url = "";
41
+ }
42
+
43
+ /**
44
+ *
45
+ * @param string $method GET|POST|PUT|DELETE
46
+ * @param string $url relative URL for the call
47
+ * @param string $accessToken Access token generated using OAuth Call
48
+ * @param array $post Optional post data for the call
49
+ *
50
+ * @return RSSSL_RESPONSE
51
+ */
52
+ private function callCloudwaysAPI( $method, $url, $accessToken, $post = [] ) {
53
+ $baseURL = 'https://api.cloudways.com/api/v1/';
54
+ try {
55
+ $ch = curl_init();
56
+ curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, $method );
57
+ curl_setopt( $ch, CURLOPT_URL, $baseURL . $url );
58
+ curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
59
+ if ( $accessToken ) {
60
+ curl_setopt( $ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $accessToken ] );
61
+ }
62
+
63
+ //ssl_domains[]=fungibleownership.com&ssl_domains[]=www.fungibleownership.com
64
+ $encoded = '';
65
+ if ( count( $post ) ) {
66
+ foreach ( $post as $name => $value ) {
67
+ if ( is_array( $value) ) {
68
+ foreach ( $value as $sub_value ) {
69
+ $encoded .= $name.'[]='.urlencode( $sub_value) . '&';
70
+ }
71
+ } else {
72
+ $encoded .= urlencode( $name ) . '=' . urlencode( $value ) . '&';
73
+ }
74
+ }
75
+ $encoded = substr( $encoded, 0, strlen( $encoded ) - 1 );
76
+ curl_setopt( $ch, CURLOPT_POSTFIELDS, $encoded );
77
+ curl_setopt( $ch, CURLOPT_POST, 1 );
78
+ }
79
+
80
+ $output = curl_exec( $ch );
81
+
82
+ $httpcode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
83
+ if ($output && isset($output->error_description)) {
84
+ return new RSSSL_RESPONSE( 'error', 'stop', $output->error_description, false );
85
+ } else if ($httpcode != '200' && $output && isset($output->message) ){
86
+ return new RSSSL_RESPONSE( 'error', 'stop', $output->message );
87
+ } else if ( $httpcode != '200' ) {
88
+ $message = $httpcode . ' output: ' . substr( $output, 0, 10000 );
89
+ error_log(print_r($message, true));
90
+ return new RSSSL_RESPONSE( 'error', 'stop', $message );
91
+ }
92
+ curl_close( $ch );
93
+ return new RSSSL_RESPONSE( 'success', 'continue', '', json_decode( $output ) );
94
+ } catch(Exception $e) {
95
+ error_log(print_r($e,true));
96
+ return new RSSSL_RESPONSE( 'error', 'stop', $e->getMessage() );
97
+ }
98
+ }
99
+
100
+
101
+ /**
102
+ * Get an access token
103
+ * @return RSSSL_RESPONSE
104
+ */
105
+
106
+ private function getAccessToken() {
107
+ error_log("try retrieving access token");
108
+ $accessToken = get_transient('rsssl_cw_t');
109
+ if (!$accessToken) {
110
+ error_log("not found, get new");
111
+
112
+ $response = $this->callCloudwaysAPI( 'POST', '/oauth/access_token', null, [ 'email' => $this->email, 'api_key' => $this->api_key ] );
113
+ error_log("api call output");
114
+ error_log(print_r($response, true));
115
+ if ($response->status === 'success' ) {
116
+ $accessToken = $response->output->access_token;
117
+ set_transient('rsssl_cw_t', $accessToken, 1800);
118
+ } else {
119
+ return new RSSSL_RESPONSE( 'error', 'stop', $response->message );
120
+ }
121
+ }
122
+ return new RSSSL_RESPONSE( 'success', 'continue','', $accessToken );
123
+ }
124
+
125
+ /**
126
+ * @param array $domains
127
+ *
128
+ * @return RSSSL_RESPONSE
129
+ */
130
+
131
+ public function installSSL($domains){
132
+ error_log("starting installation");
133
+
134
+ $response = $this->getAccessToken();
135
+ if ( $response->status !== 'success' ) {
136
+ return new RSSSL_RESPONSE('error','stop',$response->message);
137
+ }
138
+ $accessToken = $response->output;
139
+ $response = $this->getServerInfo();
140
+
141
+
142
+ if ($response->status === 'success' ) {
143
+ $server_id = get_transient('rsssl_cw_server_id' );
144
+ $app_id = get_transient('rsssl_cw_app_id');
145
+ $args = [
146
+ 'server_id' => $server_id,
147
+ 'app_id' => $app_id,
148
+ 'ssl_email' => $this->email,
149
+ 'wild_card' => RSSSL_LE()->letsencrypt_handler->is_wildcard(),
150
+ 'ssl_domains' => $domains,
151
+ ];
152
+
153
+ $response = $this->callCloudWaysAPI( 'POST', 'security/lets_encrypt_install', $accessToken, $args );
154
+ }
155
+
156
+ return $response;
157
+ }
158
+
159
+ /**
160
+ *
161
+ * @return RSSSL_RESPONSE
162
+ */
163
+ public function enableAutoRenew(){
164
+ $response = $this->getAccessToken();
165
+ if ( $response->status !== 'success' ) {
166
+ return new RSSSL_RESPONSE('error','stop', __("Failed retrieving access token","really-simple-ssl"));
167
+ }
168
+ $accessToken = $response->output;
169
+
170
+ $response = $this->getServerInfo();
171
+ if ($response->status === 'success' ) {
172
+ $app_id = get_transient('rsssl_cw_app_id');
173
+ $server_id = get_transient('rsssl_cw_server_id' );
174
+ $response = $this->callCloudWaysAPI( 'POST', 'security/lets_encrypt_auto', $accessToken,
175
+ [
176
+ 'server_id' => $server_id,
177
+ 'app_id' => $app_id,
178
+ 'auto' => true,
179
+ ]
180
+ );
181
+ }
182
+
183
+ if ( $response->status === 'success' ) {
184
+ $status = 'success';
185
+ $action = 'continue';
186
+ $message = __("Successfully installed Let's Encrypt","really-simple-ssl");
187
+ } elseif ($response->status === 'error') {
188
+ //in some cases, the process is already started, which also signifies success.
189
+ if ( strpos($response->message, 'An operation is already in progress for this server')) {
190
+ $status = 'success';
191
+ $action = 'continue';
192
+ $message = __("Successfully installed Let's Encrypt","really-simple-ssl");
193
+ } else {
194
+ $status = $response->status;
195
+ $action = $response->action;
196
+ $message = $response->message;
197
+ }
198
+ } else {
199
+ $status = $response->status;
200
+ $action = $response->action;
201
+ $message = __("Error enabling auto renew for Let's Encrypt","really-simple-ssl");
202
+ }
203
+
204
+ return new RSSSL_RESPONSE( $status, $action, $message );
205
+ }
206
+
207
+
208
+ /**
209
+ * Get the server id and app id
210
+ *
211
+ * @return RSSSL_RESPONSE
212
+ */
213
+ public function getServerInfo(){
214
+ if ( get_transient('rsssl_cw_app_id') && get_transient('rsssl_cw_server_id' ) ) {
215
+ $status = 'success';
216
+ $action = 'continue';
217
+ $message = __("Successfully retrieved server id and app id","really-simple-ssl");
218
+ return new RSSSL_RESPONSE( $status, $action, $message );
219
+ }
220
+
221
+ $response = $this->getAccessToken();
222
+ if ( $response->status !== 'success' ) {
223
+ return new RSSSL_RESPONSE('error','stop', $response->message);
224
+ }
225
+ $accessToken = $response->output;
226
+
227
+ $response = $this->callCloudwaysAPI('GET', '/server', $accessToken );
228
+ $success = false;
229
+ if ($response->status === 'success') {
230
+ $serverList = $response->output;
231
+ $servers = $serverList->servers;
232
+ error_log(print_r($servers, true));
233
+ foreach ($servers as $server ){
234
+ $apps = $server->apps;
235
+ foreach ($apps as $app ){
236
+ $app_domain = $app->cname;
237
+ error_log("app domain ".$app_domain);
238
+ $this_site_domain = str_replace(array('https://', 'http://', 'www.'), '',site_url());
239
+ if (strpos($app_domain, $this_site_domain) !== false ) {
240
+ $success = true;
241
+ set_transient('rsssl_cw_app_id', $app->id, WEEK_IN_SECONDS);
242
+ set_transient('rsssl_cw_server_id', $server->id, WEEK_IN_SECONDS);
243
+ break 2;
244
+ }
245
+ }
246
+ }
247
+ }
248
+
249
+ if ( $success ) {
250
+ $status = 'success';
251
+ $action = 'continue';
252
+ $message = __("Successfully retrieved server id and app id","really-simple-ssl");
253
+ } else {
254
+ $status = 'error';
255
+ $action = 'stop';
256
+ if ( isset($serverList->error_description) ) {
257
+ $message = $serverList->error_description;
258
+ } else {
259
+ $message = __("Could not retrieve server list","really-simple-ssl");
260
+ }
261
+ }
262
+
263
+ return new RSSSL_RESPONSE( $status, $action, $message );
264
+ }
265
+
266
+ }
lets-encrypt/integrations/cloudways/functions.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php defined( 'ABSPATH' ) or die();
2
+
3
+ function rsssl_cloudways_server_data(){
4
+ require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' );
5
+ $cloudways = new rsssl_Cloudways();
6
+ return $cloudways->getServerInfo();
7
+ }
8
+
9
+ function rsssl_cloudways_install_ssl(){
10
+ if (rsssl_is_ready_for('installation')) {
11
+ require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' );
12
+ $domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
13
+ $cloudways = new rsssl_Cloudways();
14
+ $response = $cloudways->installSSL($domains);
15
+ if ($response->status === 'success') {
16
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'cloudways');
17
+ }
18
+ return $response;
19
+ } else {
20
+ $status = 'error';
21
+ $action = 'stop';
22
+ $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
23
+ return new RSSSL_RESPONSE($status, $action, $message);
24
+ }
25
+ }
26
+
27
+ function rsssl_cloudways_auto_renew(){
28
+ require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' );
29
+ $cloudways = new rsssl_Cloudways();
30
+ return $cloudways->enableAutoRenew();
31
+ }
32
+
33
+ function rsssl_cloudways_add_condition_actions($steps){
34
+ $index = array_search('installation',array_column($steps['lets-encrypt'],'id'));
35
+ $index++;
36
+
37
+ $steps['lets-encrypt'][$index]['actions'] = array(
38
+ array(
39
+ 'description' => __("Retrieving Cloudways server data...", "really-simple-ssl"),
40
+ 'action'=> 'rsssl_cloudways_server_data',
41
+ 'attempts' => 5,
42
+ 'speed' => 'normal',
43
+ ),
44
+ array(
45
+ 'description' => __("Installing SSL certificate...", "really-simple-ssl"),
46
+ 'action'=> 'rsssl_cloudways_install_ssl',
47
+ 'attempts' => 5,
48
+ 'speed' => 'normal',
49
+ ),
50
+ array(
51
+ 'description' => __("Enabling auto renew...", "really-simple-ssl"),
52
+ 'action'=> 'rsssl_cloudways_auto_renew',
53
+ 'attempts' => 5,
54
+ 'speed' => 'normal',
55
+ ),
56
+ );
57
+
58
+ return $steps;
59
+ }
60
+ add_filter( 'rsssl_steps', 'rsssl_cloudways_add_condition_actions' );
61
+
62
+ /**
63
+ * Drop store credentials field
64
+ * @param $fields
65
+ *
66
+ * @return mixed
67
+ */
68
+ function rsssl_cloudways_fields($fields){
69
+ unset($fields['store_credentials']);
70
+
71
+ return $fields;
72
+ }
73
+ add_filter( 'rsssl_fields_load_types', 'rsssl_cloudways_fields' );
74
+
lets-encrypt/integrations/cpanel/cpanel.php ADDED
@@ -0,0 +1,383 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) or die();
3
+
4
+ require_once( rsssl_le_path . 'integrations/cpanel/functions.php' );
5
+ /**
6
+ * Completely rebuilt and improved on the FreeSSL.tech Auto CPanel class by Anindya Sundar Mandal
7
+ */
8
+ class rsssl_cPanel
9
+ {
10
+ public $host;
11
+ private $username;
12
+ private $password;
13
+ public $ssl_installation_url;
14
+
15
+ /**
16
+ * Initiates the cPanel class.
17
+ */
18
+ public function __construct()
19
+ {
20
+ $username = rsssl_get_value('cpanel_username');
21
+ $password = RSSSL_LE()->letsencrypt_handler->decode( rsssl_get_value('cpanel_password') );
22
+ $host = rsssl_get_value('cpanel_host');
23
+ $this->host = str_replace( array('http://', 'https://', ':2083',':'), '', $host );
24
+ $this->username = $username;
25
+ $this->password = $password;
26
+ $this->ssl_installation_url = 'https://'.$this->host.":2083/frontend/paper_lantern/ssl/install.html";
27
+ }
28
+ /**
29
+ * Check if all creds are available
30
+ * @return bool
31
+ */
32
+ public function credentials_available(){
33
+ if (!empty($this->host) && !empty($this->password) && !empty($this->username)) {
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+
39
+
40
+ public function installSSLShell($domains){
41
+ $response = false;
42
+
43
+ if ( is_array($domains) && count($domains)>0 ) {
44
+ foreach( $domains as $domain ) {
45
+ $response_item = $this->installSSLShellPerDomain($domain);
46
+ //set on first iteration
47
+ if ( !$response ) {
48
+ $response = $response_item;
49
+ }
50
+
51
+ //override if not successfull, to always get the error.
52
+ if ( $response->status !== 'success' ) {
53
+ $response = $response_item;
54
+ }
55
+ }
56
+ }
57
+
58
+ if ( !$response ) {
59
+ $response = new RSSSL_RESPONSE('error', 'stop', __("No valid list of domains.", "really-simple-ssl"));
60
+ }
61
+
62
+ if ( $response->status === 'success' ) {
63
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:shell');
64
+ }
65
+
66
+ return $response;
67
+ }
68
+
69
+ /**
70
+ * Attempt shell installation of SSL
71
+ * @param $domain
72
+ *
73
+ * @return RSSSL_RESPONSE
74
+ */
75
+
76
+ public function installSSLShellPerDomain($domain){
77
+ $key_file = get_option('rsssl_private_key_path');
78
+ $cert_file = get_option('rsssl_certificate_path');
79
+ $cabundle_file = get_option('rsssl_intermediate_path');
80
+
81
+ $cert = file_get_contents($cert_file);
82
+ $key = file_get_contents($key_file);
83
+ $cabundle = file_get_contents($cabundle_file);
84
+
85
+ if (function_exists('escapeshellarg')) {
86
+ $enc_cert = escapeshellarg(urlencode(str_replace("\r\n", "\n", $cert)));
87
+ $enc_key = escapeshellarg(urlencode(str_replace("\r\n", "\n", $key)));
88
+ $enc_cacert = escapeshellarg(urlencode(str_replace("\r\n", "\n", $cabundle)));
89
+ } else {
90
+ $enc_cert = urlencode(str_replace("\r\n", "\n", $cert));
91
+ $enc_key = urlencode(str_replace("\r\n", "\n", $key));
92
+ $enc_cacert = urlencode(str_replace("\r\n", "\n", $cabundle));
93
+ }
94
+
95
+ if ( function_exists('shell_exec') ) {
96
+ $shell = shell_exec("uapi SSL install_ssl domain=$domain cert=$enc_cert key=$enc_key cabundle=$enc_cacert");
97
+ } else if (function_exists('system')) {
98
+ ob_start();
99
+ system("uapi SSL install_ssl domain=$domain cert=$enc_cert key=$enc_key cabundle=$enc_cacert", $var);
100
+ $shell = ob_get_contents();
101
+ ob_end_clean();
102
+ } else if (function_exists('passthru')) {
103
+ ob_start();
104
+ passthru("uapi SSL install_ssl domain=$domain cert=$enc_cert key=$enc_key cabundle=$enc_cacert", $var);
105
+ $shell = ob_get_contents();
106
+ ob_end_clean();
107
+ } else if (function_exists('exec')) {
108
+ exec("uapi SSL install_ssl domain=$domain cert=$enc_cert key=$enc_key cabundle=$enc_cacert", $output, $var);
109
+ $shell = implode(',', $output);
110
+ }
111
+
112
+ if ( empty($shell) ) {
113
+ $message = rsssl_get_manual_instructions_text(RSSSL_LE()->letsencrypt_handler->ssl_installation_url);
114
+ return new RSSSL_RESPONSE('error', 'skip', $message );
115
+ }
116
+
117
+ $shell = str_ireplace(array('<br>', '<br />', '<b>', '</b>', '\n'), array('', '', '', '', ''), $shell);
118
+ $fbr = stripos(htmlentities($shell), 'domain:');
119
+ $finalshell = substr(htmlentities($shell), $fbr);
120
+ $line_explode = explode("\n", $finalshell);
121
+
122
+ $res_arr = array();
123
+ foreach ($line_explode as $item) {
124
+ $res_param = explode(":", $item);
125
+ $res_arr[trim($res_param[0])] = isset($res_param[1]) ? $res_param[1] : '';
126
+ }
127
+
128
+ if ($res_arr['status'] == 1) {
129
+ $message = sprintf(__("SSL successfully installed on %s","really-simple-ssl"), $domain);
130
+ return new RSSSL_RESPONSE('success', 'continue', $message );
131
+ } else {
132
+ $message = rsssl_get_manual_instructions_text(RSSSL_LE()->letsencrypt_handler->ssl_installation_url);
133
+ return new RSSSL_RESPONSE('error', 'skip', $message );
134
+ }
135
+
136
+ }
137
+
138
+ /**
139
+ * Install SSL for all passed domains
140
+ * @param array $domains
141
+ *
142
+ * @return RSSSL_RESPONSE
143
+ */
144
+ public function installSSL($domains) {
145
+ $response = false;
146
+
147
+ if ( is_array($domains) && count($domains)>0 ) {
148
+ foreach( $domains as $domain ) {
149
+ $response_item = $this->installSSLPerDomain($domain);
150
+ //set on first iteration
151
+ if ( !$response ) {
152
+ $response = $response_item;
153
+ }
154
+
155
+ //override if not successfull, to always get the error.
156
+ if ( $response->status !== 'success' ) {
157
+ $response = $response_item;
158
+ }
159
+ }
160
+ }
161
+
162
+ if ( !$response ) {
163
+ $response = new RSSSL_RESPONSE('error', 'stop', __("No valid list of domains.", "really-simple-ssl"));
164
+ }
165
+
166
+ if ( $response->status === 'success' ) {
167
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default');
168
+ }
169
+
170
+ return $response;
171
+ }
172
+
173
+ /**
174
+ * Install an SSL certificate on the domain provided - using cPanel UAPI.
175
+ *
176
+ * @param string $domain
177
+ *
178
+ * @return RSSSL_RESPONSE
179
+ */
180
+ public function installSSLPerDomain($domain)
181
+ {
182
+ $key_file = get_option('rsssl_private_key_path');
183
+ $cert_file = get_option('rsssl_certificate_path');
184
+ $cabundle_file = get_option('rsssl_intermediate_path');
185
+ $request_uri = 'https://'.$this->host.':2083/execute/SSL/install_ssl';
186
+
187
+ $payload = [
188
+ 'domain' => $domain,
189
+ 'cert' => file_get_contents($cert_file),
190
+ 'key' => file_get_contents($key_file),
191
+ 'cabundle' => file_get_contents($cabundle_file),
192
+ ];
193
+
194
+ $response = $this->connectUapi($request_uri, $payload);
195
+ //Validate $response
196
+ if (empty($response)) {
197
+ error_log('Not able to login');
198
+ update_option('rsssl_installation_error', 'cpanel:default');
199
+ $status = 'warning';
200
+ $action = 'stop';
201
+ $message = rsssl_get_manual_instructions_text($this->ssl_installation_url);
202
+ } else if ($response->status) {
203
+ delete_option('rsssl_installation_error' );
204
+
205
+ error_log('SSL successfully installed on '.$domain.' successfully.');
206
+ $status = 'success';
207
+ $action = 'continue';
208
+ $message = sprintf(__("SSL successfully installed on %s","really-simple-ssl"), $domain);
209
+ } else {
210
+ update_option('rsssl_installation_error', 'cpanel:default');
211
+ error_log($response->errors[0]);
212
+ $status = 'error';
213
+ $action = 'stop';
214
+ $message = __("Errors were reported during installation","really-simple-ssl").'<br> '.$response->errors[0];
215
+ }
216
+
217
+ return new RSSSL_RESPONSE($status, $action, $message);
218
+ }
219
+
220
+
221
+ /**
222
+ * @param $domains
223
+ *
224
+ * @return RSSSL_RESPONSE
225
+ */
226
+ public function enableAutoSSL($domains){
227
+ $domains = implode(',', $domains);
228
+ $request_uri = 'https://'.$this->host.':2083/execute/SSL/remove_autossl_excluded_domains';
229
+ $payload = [
230
+ 'domains' => $domains,
231
+ ];
232
+
233
+ $response = $this->connectUapi($request_uri, $payload);
234
+
235
+ //Validate $response
236
+ if (empty($response)) {
237
+ update_option('rsssl_installation_error', 'cpanel:autossl');
238
+ error_log('The install_ssl cURL call did not return valid JSON');
239
+ $status = 'error';
240
+ $action = 'skip';
241
+ $message = rsssl_get_manual_instructions_text($this->ssl_installation_url);
242
+ } else if ($response->status) {
243
+ delete_option('rsssl_installation_error');
244
+ error_log('Congrats! SSL installed on '.$domains.' successfully.');
245
+ $status = 'success';
246
+ $action = 'finalize';
247
+ $message = __("SSL successfully installed on $domains","really-simple-ssl");
248
+ } else {
249
+ update_option('rsssl_installation_error', 'cpanel:autossl');
250
+ error_log('The auto SSL cURL call returned valid JSON, but reported errors:');
251
+ error_log($response->errors[0]);
252
+ $status = 'error';
253
+ $action = 'skip';//we try the default next
254
+ $message = __("Errors were reported during installation.","really-simple-ssl").'<br> '.$response->errors[0];
255
+ }
256
+ return new RSSSL_RESPONSE($status, $action, $message);
257
+ }
258
+
259
+ /**
260
+ * Connect to the cPanel using UAPI.
261
+ *
262
+ * @param string $request_uri
263
+ * @param null|array $payload
264
+ *
265
+ * @return mixed
266
+ */
267
+ public function connectUapi($request_uri, $payload = null)
268
+ {
269
+ // Set up the cURL request object.
270
+ $ch = curl_init($request_uri);
271
+ curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
272
+ curl_setopt($ch, CURLOPT_USERPWD, $this->username.':'.$this->password);
273
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
274
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
275
+ curl_setopt($ch, CURLOPT_BUFFERSIZE, 131072);
276
+
277
+ if (null !== $payload) {
278
+ // Set up a POST request with the payload.
279
+ curl_setopt($ch, CURLOPT_POST, true);
280
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
281
+ }
282
+
283
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
284
+
285
+ // Make the call, and then terminate the cURL caller object.
286
+ $curl_response = curl_exec($ch);
287
+ error_log(print_r($curl_response, true));
288
+ curl_close($ch);
289
+
290
+ // Decode and return output.
291
+ return json_decode($curl_response);
292
+ }
293
+
294
+ /**
295
+ * Set DNS TXT record using Json API through cPanel XMLAPI.
296
+ *
297
+ * @param string $domain
298
+ * @param string $value
299
+ *
300
+ * @return RSSSL_RESPONSE
301
+ */
302
+ public function set_txt_record($domain, $value)
303
+ {
304
+ $args = [
305
+ 'domain' => $domain,
306
+ 'name' => '_acme-challenge',
307
+ 'type' => 'TXT',
308
+ 'txtdata' => $value,
309
+ 'ttl' => '600',
310
+ 'class' => 'IN',
311
+ 'cpanel_jsonapi_user' => $this->username,
312
+ 'cpanel_jsonapi_module' => 'ZoneEdit',
313
+ 'cpanel_jsonapi_func' => 'add_zone_record',
314
+ 'cpanel_jsonapi_apiversion' => '2',
315
+ ];
316
+
317
+ $args = http_build_query($args, '', '&');
318
+ $url = 'https://'.$this->host.':2083/json-api/cpanel';
319
+ $authstr = 'Authorization: Basic '.base64_encode($this->username.':'.$this->password)."\r\n";
320
+
321
+ $curl = curl_init();
322
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
323
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
324
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
325
+ curl_setopt($curl, CURLOPT_URL, $url);
326
+ curl_setopt($curl, CURLOPT_BUFFERSIZE, 131072);
327
+
328
+ $header[0] = $authstr.
329
+ "Content-Type: application/x-www-form-urlencoded\r\n".
330
+ 'Content-Length: '.\strlen($args)."\r\n"."\r\n".$args;
331
+
332
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
333
+ curl_setopt($curl, CURLOPT_POST, 1);
334
+
335
+ $response = curl_exec($curl);
336
+ curl_close($curl);
337
+
338
+ if (false === $response) {
339
+ return new RSSSL_RESPONSE('error', 'stop', __("Unable to connect to cPanel", "really-simple-ssl").' '.curl_error($curl));
340
+ }
341
+
342
+ if (true === stristr($response, '<html>')) {
343
+ return new RSSSL_RESPONSE('error', 'stop', __("Login credentials incorrect", "really-simple-ssl"));
344
+ }
345
+ $response_array = json_decode($response, true);
346
+
347
+ if ( isset($response_array['cpanelresult']['data'][0]['result']['status']) ) {
348
+ if ($response_array['cpanelresult']['data'][0]['result']['status']) {
349
+ $status = 'success';
350
+ $action = 'continue';
351
+ $message = __("Successfully added TXT record.","really-simple-ssl");
352
+ } else {
353
+ $status = 'warning';
354
+ $action = 'continue';
355
+ $message = __("Could not automatically add TXT record. Please proceed manually, following the steps below.","really-simple-ssl");
356
+ if (isset($response_array['cpanelresult']['data'][0]['result']['statusmsg'])) {
357
+ $message .= '<br>'.$response_array['cpanelresult']['data'][0]['result']['statusmsg'];
358
+ }
359
+ }
360
+ return new RSSSL_RESPONSE($status, $action, $message);
361
+ }
362
+
363
+ //legacy ??
364
+ $event_result = (bool) $response_array['cpanelresult']['event']['result'];
365
+ $preevent_result = isset($response_array['cpanelresult']['preevent']) ? (bool) $response_array['cpanelresult']['preevent']['result'] : true; //Some cPanel doesn't provide this key. In that case, ignore it by setting 'true'.
366
+ $postevent_result = isset($response_array['cpanelresult']['postevent']) ? (bool) $response_array['cpanelresult']['postevent']['result'] : true; //Some cPanel doesn't provide this key. In that case, ignore it by setting 'true'.
367
+
368
+ if ($event_result && $preevent_result && $postevent_result) {
369
+ $status = 'success';
370
+ $action = 'continue';
371
+ $message = __("Successfully added TXT record.","really-simple-ssl");
372
+ } else {
373
+ error_log(print_r($response_array, true));
374
+ $status = 'warning';
375
+ $action = 'continue';
376
+ $message = __("Could not automatically add TXT record. Please proceed manually, following the steps below.","really-simple-ssl");
377
+ }
378
+
379
+ return new RSSSL_RESPONSE($status, $action, $message);
380
+ }
381
+
382
+
383
+ }
lets-encrypt/integrations/cpanel/functions.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) or die();
3
+
4
+ function rsssl_install_cpanel_autossl(){
5
+ if (rsssl_is_ready_for('installation')) {
6
+ $cpanel = new rsssl_cPanel();
7
+ $domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
8
+ $response = $cpanel->enableAutoSSL($domains);
9
+ if ( $response->status === 'success' ) {
10
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:autossl');
11
+ }
12
+ return $response;
13
+ } else {
14
+ $status = 'error';
15
+ $action = 'stop';
16
+ $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
17
+ return new RSSSL_RESPONSE($status, $action, $message);
18
+ }
19
+ }
20
+
21
+ function rsssl_install_cpanel_default(){
22
+ if (rsssl_is_ready_for('installation')) {
23
+ $cpanel = new rsssl_cPanel();
24
+ $domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
25
+ $response = $cpanel->installSSL($domains);
26
+ if ( $response->status === 'success' ) {
27
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default');
28
+ }
29
+ return $response;
30
+ } else {
31
+ $status = 'error';
32
+ $action = 'stop';
33
+ $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
34
+ return new RSSSL_RESPONSE($status, $action, $message);
35
+ }
36
+ }
37
+
38
+ function rsssl_install_cpanel_shell(){
39
+
40
+ if (rsssl_is_ready_for('installation')) {
41
+ $cpanel = new rsssl_cPanel();
42
+ $domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
43
+
44
+ if ( function_exists('shell_exec') || function_exists('system') || function_exists('passthru') || function_exists('exec') ) {
45
+ $response = $cpanel->installSSLShell( $domains );
46
+ if ( $response->status === 'success' ) {
47
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default');
48
+ }
49
+ return $response;
50
+ } else {
51
+ $status = 'error';
52
+ $action = 'skip';
53
+ $message = rsssl_get_manual_instructions_text(RSSSL_LE()->letsencrypt_handler->ssl_installation_url);
54
+ return new RSSSL_RESPONSE($status, $action, $message);
55
+ }
56
+
57
+ } else {
58
+ $status = 'error';
59
+ $action = 'stop';
60
+ $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
61
+ return new RSSSL_RESPONSE($status, $action, $message);
62
+ }
63
+ }
64
+
65
+ function rsssl_cpanel_set_txt_record(){
66
+ if ( rsssl_is_ready_for('dns-verification') ) {
67
+ $cpanel = new rsssl_cPanel();
68
+ $tokens = get_option('rsssl_le_dns_tokens');
69
+ if ( !$tokens) {
70
+ $status = 'error';
71
+ $action = 'stop';
72
+ $message = __('Token not generated. Please complete the previous step.',"really-simple-ssl");
73
+ return new RSSSL_RESPONSE($status, $action, $message);
74
+ }
75
+
76
+ foreach ($tokens as $domain => $token){
77
+ if (strpos($domain, '*') !== false) continue;
78
+ $response = $cpanel->set_txt_record($domain, $token);
79
+ }
80
+
81
+ if ( $response->status === 'success' ) {
82
+ update_option('rsssl_le_dns_configured_by_rsssl', true);
83
+ }
84
+ return $response;
85
+ } else {
86
+ $status = 'error';
87
+ $action = 'stop';
88
+ $message = __("The system is not ready for the DNS verification yet. Please run the wizard again.", "really-simple-ssl");
89
+ return new RSSSL_RESPONSE($status, $action, $message);
90
+ }
91
+ }
92
+
93
+
94
+
95
+
96
+ function rsssl_cpanel_add_condition_actions($steps){
97
+ $cpanel = new rsssl_cPanel();
98
+ if ( $cpanel->credentials_available() ) {
99
+ //this defaults to true, if not known.
100
+ $auto_ssl = RSSSL_LE()->config->host_api_supported( 'cpanel:autossl' );
101
+ $default_ssl = RSSSL_LE()->config->host_api_supported( 'cpanel:default' );
102
+
103
+ $installation_index = array_search( 'installation', array_column( $steps['lets-encrypt'], 'id' ) );
104
+ $dns_index = array_search( 'dns-verification', array_column( $steps['lets-encrypt'], 'id' ) );
105
+ $installation_index ++;
106
+ $dns_index ++;
107
+
108
+ //clear existing array
109
+ if ($auto_ssl || $default_ssl ) $steps['lets-encrypt'][ $installation_index ]['actions'] = array();
110
+ if ( $auto_ssl ) {
111
+ $steps['lets-encrypt'][ $installation_index ]['actions'][]
112
+ = array(
113
+ 'description' => __( "Attempting to install certificate using AutoSSL...", "really-simple-ssl" ),
114
+ 'action' => 'rsssl_install_cpanel_autossl',
115
+ 'attempts' => 1,
116
+ );
117
+ }
118
+
119
+ if ( $default_ssl ) {
120
+ $steps['lets-encrypt'][ $dns_index ]['actions'][]
121
+ = array(
122
+ 'description' => __( "Attempting to set DNS txt record...", "really-simple-ssl" ),
123
+ 'action' => 'rsssl_cpanel_set_txt_record',
124
+ 'attempts' => 1,
125
+ );
126
+
127
+ $steps['lets-encrypt'][ $installation_index ]['actions'][]
128
+ = array(
129
+ 'description' => __( "Attempting to install certificate...", "really-simple-ssl" ),
130
+ 'action' => 'rsssl_install_cpanel_default',
131
+ 'attempts' => 1,
132
+ );
133
+ }
134
+ }
135
+
136
+ if ( function_exists('shell_exec') || function_exists('system') || function_exists('passthru') || function_exists('exec') ) {
137
+ $steps['lets-encrypt'][ $installation_index ]['actions'][]
138
+ = array(
139
+ 'description' => __( "Attempting to install certificate using shell...", "really-simple-ssl" ),
140
+ 'action' => 'rsssl_install_cpanel_shell',
141
+ 'attempts' => 1,
142
+ );
143
+ }
144
+ return $steps;
145
+ }
146
+
147
+ add_filter( 'rsssl_steps', 'rsssl_cpanel_add_condition_actions' );
lets-encrypt/integrations/directadmin/directadmin.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) or die();
3
+
4
+ /**
5
+ * @package DirectAdmin
6
+ * @author Rogier Lankhorst
7
+ * @copyright Copyright (C) 2021, Rogier Lankhorst
8
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3
9
+ * @link https://really-simple-ssl.com
10
+ * @since Class available since Release 5.0.0
11
+ *
12
+ */
13
+
14
+ require_once( rsssl_le_path . 'integrations/directadmin/httpsocket.php' );
15
+ require_once( rsssl_le_path . 'integrations/directadmin/functions.php' );
16
+
17
+ class rsssl_directadmin {
18
+ public $host;
19
+ private $login;
20
+ private $password;
21
+ public $ssl_installation_url;
22
+
23
+ /**
24
+ * Initiates the directadmin class.
25
+ *
26
+ */
27
+ public function __construct() {
28
+ $password = RSSSL_LE()->letsencrypt_handler->decode( rsssl_get_value( 'directadmin_password' ) );
29
+ $host = rsssl_get_value( 'directadmin_host' );
30
+ $this->host = str_replace( array( 'http://', 'https://', ':2222' ), '', $host );
31
+ $this->login = rsssl_get_value( 'directadmin_username' );
32
+ $this->password = $password;
33
+ $this->ssl_installation_url = 'https://' . $this->host . "";
34
+ }
35
+ /**
36
+ * Check if all creds are available
37
+ * @return bool
38
+ */
39
+ public function credentials_available(){
40
+ if (!empty($this->host) && !empty($this->password) && !empty($this->login)) {
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+
46
+ public function installSSL( $domains ) {
47
+ $response = false;
48
+ if ( is_array($domains) && count($domains)>0 ) {
49
+ foreach( $domains as $domain ) {
50
+ $response_item = $this->installSSLPerDomain($domain);
51
+ //set on first iteration
52
+ if ( !$response ) {
53
+ $response = $response_item;
54
+ }
55
+
56
+ //override if not successfull, to always get the error.
57
+ if ( $response->status !== 'success' ) {
58
+ $response = $response_item;
59
+ }
60
+ }
61
+ }
62
+
63
+ if ( !$response ) {
64
+ $response = new RSSSL_RESPONSE('error', 'stop', __("No valid list of domains.", "really-simple-ssl"));
65
+ }
66
+
67
+ return $response;
68
+ }
69
+
70
+ /**
71
+ * Install certificate
72
+ *
73
+ * @param string $domain
74
+ *
75
+ * @return RSSSL_RESPONSE
76
+ */
77
+ public function installSSLPerDomain( $domain ) {
78
+ $key_file = get_option( 'rsssl_private_key_path' );
79
+ $cert_file = get_option( 'rsssl_certificate_path' );
80
+ $cabundle_file = get_option( 'rsssl_intermediate_path' );
81
+
82
+ try {
83
+ $server_ssl=true;
84
+ $server_port=2222;
85
+ $sock = new HTTPSocket;
86
+ if ($server_ssl){
87
+ $sock->connect("ssl://".$this->host, $server_port);
88
+ } else {
89
+ $sock->connect($this->host, $server_port);
90
+ }
91
+ $sock->set_login($this->login, $this->password);
92
+ $sock->method = "POST";
93
+ $sock->query('/CMD_API_SSL',
94
+ array(
95
+ 'domain' => $domain,
96
+ 'action' => 'save',
97
+ 'type' => 'paste',
98
+ 'certificate' => file_get_contents( $key_file ) . file_get_contents( $cert_file )
99
+ ));
100
+ $response = $sock->fetch_parsed_body();
101
+ error_log( print_r( $response, true ) );
102
+
103
+ //set a default error response
104
+ $status = 'warning';
105
+ $action = 'stop';
106
+ $message = rsssl_get_manual_instructions_text($this->ssl_installation_url);
107
+
108
+
109
+ //if successful, proceed to next step
110
+ if ( empty($response['details']) && stripos($response[0], 'Error' ) ) {
111
+ $sock->query('/CMD_SSL',
112
+ array(
113
+ 'domain' => $domain,
114
+ 'action' => 'save',
115
+ 'type' => 'cacert',
116
+ 'active' => 'yes',
117
+ 'cacert' => file_get_contents( $cabundle_file )
118
+ ));
119
+ $response = $sock->fetch_parsed_body();
120
+ error_log( print_r( $response, true ) );
121
+ if ( empty($response['details']) && stripos($response[0], 'Error' ) ) {
122
+ $status = 'success';
123
+ $action = 'finalize';
124
+ $message = sprintf(__("SSL successfully installed on %s","really-simple-ssl"), $domain);
125
+ update_option( 'rsssl_le_certificate_installed_by_rsssl', 'directadmin' );
126
+ delete_option( 'rsssl_installation_error' );
127
+ }
128
+ }
129
+
130
+
131
+ } catch ( Exception $e ) {
132
+ error_log( print_r( $e, true ) );
133
+ update_option( 'rsssl_installation_error', 'directadmin' );
134
+ $status = 'warning';
135
+ $action = 'continue';
136
+ $message = $e->getMessage();
137
+ }
138
+
139
+ return new RSSSL_RESPONSE( $status, $action, $message );
140
+ }
141
+
142
+ }
143
+
144
+
145
+
146
+
147
+
lets-encrypt/integrations/directadmin/functions.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) or die();
3
+
4
+ function rsssl_install_directadmin(){
5
+ if (rsssl_is_ready_for('installation')) {
6
+ $directadmin = new rsssl_directadmin();
7
+ $domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
8
+ $response = $directadmin->installSSL($domains);
9
+ if ( $response->status === 'success' ) {
10
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'directadmin');
11
+ }
12
+ return $response;
13
+ } else {
14
+ $status = 'error';
15
+ $action = 'stop';
16
+ $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
17
+ return new RSSSL_RESPONSE($status, $action, $message);
18
+ }
19
+ }
20
+
21
+ function rsssl_directadmin_add_condition_actions($steps){
22
+ $directadmin = new rsssl_directadmin();
23
+ if ( $directadmin->credentials_available() ) {
24
+ $index = array_search( 'installation', array_column( $steps['lets-encrypt'], 'id' ) );
25
+ $index ++;
26
+ //clear existing array
27
+ $steps['lets-encrypt'][ $index ]['actions'] = array();
28
+ $steps['lets-encrypt'][ $index ]['actions'][]
29
+ = array(
30
+ 'description' => __( "Attempting to install certificate...", "really-simple-ssl" ),
31
+ 'action' => 'rsssl_install_directadmin',
32
+ 'attempts' => 1,
33
+ 'speed' => 'normal',
34
+ );
35
+ }
36
+
37
+ return $steps;
38
+ }
39
+
40
+ add_filter( 'rsssl_steps', 'rsssl_directadmin_add_condition_actions' );
lets-encrypt/integrations/directadmin/httpsocket.php ADDED
@@ -0,0 +1,441 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Socket communication class.
5
+ *
6
+ * Originally designed for use with DirectAdmin's API, this class will fill any HTTP socket need.
7
+ *
8
+ * Very, very basic usage:
9
+ * $Socket = new HTTPSocket;
10
+ * echo $Socket->get('http://user:pass@somesite.com/somedir/some.file?query=string&this=that');
11
+ *
12
+ * @author Phi1 'l0rdphi1' Stier <l0rdphi1@liquenox.net>
13
+ * @package HTTPSocket
14
+ * @version 3.0.4
15
+ */
16
+ class HTTPSocket {
17
+
18
+ var $version = '3.0.4';
19
+
20
+ /* all vars are private except $error, $query_cache, and $doFollowLocationHeader */
21
+
22
+ var $method = 'GET';
23
+
24
+ var $remote_host;
25
+ var $remote_port;
26
+ var $remote_uname;
27
+ var $remote_passwd;
28
+
29
+ var $result;
30
+ var $result_header;
31
+ var $result_body;
32
+ var $result_status_code;
33
+
34
+ var $lastTransferSpeed;
35
+
36
+ var $bind_host;
37
+
38
+ var $error = array();
39
+ var $warn = array();
40
+ var $query_cache = array();
41
+
42
+ var $doFollowLocationHeader = TRUE;
43
+ var $redirectURL;
44
+ var $max_redirects = 5;
45
+ var $ssl_setting_message = 'DirectAdmin appears to be using SSL. Change your script to connect to ssl://';
46
+
47
+ var $extra_headers = array();
48
+
49
+ var $proxy = false;
50
+ var $proxy_headers = array();
51
+
52
+ /**
53
+ * Create server "connection".
54
+ *
55
+ */
56
+ function connect($host, $port = '' )
57
+ {
58
+ if (!is_numeric($port))
59
+ {
60
+ $port = 80;
61
+ }
62
+
63
+ $this->remote_host = $host;
64
+ $this->remote_port = $port;
65
+ }
66
+
67
+ function bind( $ip = '' )
68
+ {
69
+ if ( $ip == '' )
70
+ {
71
+ $ip = $_SERVER['SERVER_ADDR'];
72
+ }
73
+
74
+ $this->bind_host = $ip;
75
+ }
76
+
77
+ /**
78
+ * Change the method being used to communicate.
79
+ *
80
+ * @param string|null request method. supports GET, POST, and HEAD. default is GET
81
+ */
82
+ function set_method( $method = 'GET' )
83
+ {
84
+ $this->method = strtoupper($method);
85
+ }
86
+
87
+ /**
88
+ * Specify a username and password.
89
+ *
90
+ * @param string|null username. defualt is null
91
+ * @param string|null password. defualt is null
92
+ */
93
+ function set_login( $uname = '', $passwd = '' )
94
+ {
95
+ if ( strlen($uname) > 0 )
96
+ {
97
+ $this->remote_uname = $uname;
98
+ }
99
+
100
+ if ( strlen($passwd) > 0 )
101
+ {
102
+ $this->remote_passwd = $passwd;
103
+ }
104
+
105
+ }
106
+ /**
107
+ * For pass through, this function writes the data in chunks.
108
+ */
109
+ private function stream_chunk($ch, $data)
110
+ {
111
+ echo($data);
112
+ return strlen($data);
113
+ }
114
+ private function stream_header($ch, $data)
115
+ {
116
+ if (!preg_match('/^HTTP/i', $data))
117
+ {
118
+ header($data);
119
+ }
120
+ return strlen($data);
121
+ }
122
+
123
+
124
+ /**
125
+ * Query the server
126
+ *
127
+ * @param string containing properly formatted server API. See DA API docs and examples. Http:// URLs O.K. too.
128
+ * @param string|array query to pass to url
129
+ * @param int if connection KB/s drops below value here, will drop connection
130
+ */
131
+ function query( $request, $content = '', $doSpeedCheck = 0 )
132
+ {
133
+ $this->error = $this->warn = array();
134
+ $this->result_status_code = NULL;
135
+
136
+ $is_ssl = FALSE;
137
+
138
+ // is our request a http:// ... ?
139
+ if (preg_match('!^http://!i',$request) || preg_match('!^https://!i',$request))
140
+ {
141
+ $location = parse_url($request);
142
+ if (preg_match('!^https://!i',$request))
143
+ {
144
+ $this->connect('https://'.$location['host'],$location['port']);
145
+ }
146
+ else
147
+ $this->connect('http://'.$location['host'],$location['port']);
148
+
149
+ $this->set_login($location['user'],$location['pass']);
150
+
151
+ $request = $location['path'];
152
+ $content = $location['query'];
153
+
154
+ if ( strlen($request) < 1 )
155
+ {
156
+ $request = '/';
157
+ }
158
+
159
+ }
160
+
161
+ if (preg_match('!^ssl://!i', $this->remote_host))
162
+ $this->remote_host = 'https://'.substr($this->remote_host, 6);
163
+
164
+ if (preg_match('!^tcp://!i', $this->remote_host))
165
+ $this->remote_host = 'http://'.substr($this->remote_host, 6);
166
+
167
+ if (preg_match('!^https://!i', $this->remote_host))
168
+ $is_ssl = TRUE;
169
+
170
+ $array_headers = array(
171
+ 'Host' => ( $this->remote_port == 80 ? $this->remote_host : "$this->remote_host:$this->remote_port" ),
172
+ 'Accept' => '*/*',
173
+ 'Connection' => 'Close' );
174
+
175
+ foreach ( $this->extra_headers as $key => $value )
176
+ {
177
+ $array_headers[$key] = $value;
178
+ }
179
+
180
+ $this->result = $this->result_header = $this->result_body = '';
181
+
182
+ // was content sent as an array? if so, turn it into a string
183
+ if (is_array($content))
184
+ {
185
+ $pairs = array();
186
+
187
+ foreach ( $content as $key => $value )
188
+ {
189
+ $pairs[] = "$key=".urlencode($value);
190
+ }
191
+
192
+ $content = join('&',$pairs);
193
+ unset($pairs);
194
+ }
195
+
196
+ $OK = TRUE;
197
+
198
+ if ($this->method == 'GET' && isset($content) && $content != '')
199
+ $request .= '?'.$content;
200
+
201
+ $ch = curl_init($this->remote_host.':'.$this->remote_port.$request);
202
+
203
+ if ($is_ssl)
204
+ {
205
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //1
206
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //2
207
+ //curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
208
+ }
209
+
210
+ curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
211
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
212
+ curl_setopt($ch, CURLOPT_USERAGENT, "HTTPSocket/$this->version");
213
+ curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
214
+ curl_setopt($ch, CURLOPT_TIMEOUT, 100);
215
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
216
+ curl_setopt($ch, CURLOPT_HEADER, 1);
217
+
218
+ if ($this->proxy)
219
+ {
220
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER,false);
221
+ curl_setopt($ch, CURLOPT_HEADER, false);
222
+ curl_setopt($ch, CURLINFO_HEADER_OUT, false);
223
+ curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192); // 8192
224
+ curl_setopt($ch, CURLOPT_WRITEFUNCTION, array($this, "stream_chunk"));
225
+ curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, "stream_header"));
226
+ }
227
+
228
+ curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 512);
229
+ curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 120);
230
+
231
+ // instance connection
232
+ if ($this->bind_host)
233
+ {
234
+ curl_setopt($ch, CURLOPT_INTERFACE, $this->bind_host);
235
+ }
236
+
237
+ // if we have a username and password, add the header
238
+ if ( isset($this->remote_uname) && isset($this->remote_passwd) )
239
+ {
240
+ curl_setopt($ch, CURLOPT_USERPWD, $this->remote_uname.':'.$this->remote_passwd);
241
+ }
242
+
243
+ // for DA skins: if $this->remote_passwd is NULL, try to use the login key system
244
+ if ( isset($this->remote_uname) && $this->remote_passwd == NULL )
245
+ {
246
+ curl_setopt($ch, CURLOPT_COOKIE, "session={$_SERVER['SESSION_ID']}; key={$_SERVER['SESSION_KEY']}");
247
+ }
248
+
249
+ // if method is POST, add content length & type headers
250
+ if ( $this->method == 'POST' )
251
+ {
252
+ curl_setopt($ch, CURLOPT_POST, 1);
253
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
254
+
255
+ //$array_headers['Content-type'] = 'application/x-www-form-urlencoded';
256
+ $array_headers['Content-length'] = strlen($content);
257
+ }
258
+
259
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $array_headers);
260
+
261
+
262
+ if( !($this->result = curl_exec($ch)) )
263
+ {
264
+ $this->error[] .= curl_error($ch);
265
+ $OK = FALSE;
266
+ }
267
+
268
+ $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
269
+ $this->result_header = substr($this->result, 0, $header_size);
270
+ $this->result_body = substr($this->result, $header_size);
271
+ $this->result_status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
272
+
273
+ $this->lastTransferSpeed = curl_getinfo($ch, CURLINFO_SPEED_DOWNLOAD) / 1024;
274
+
275
+ curl_close($ch);
276
+
277
+ $this->query_cache[] = $this->remote_host.':'.$this->remote_port.$request;
278
+
279
+ $headers = $this->fetch_header();
280
+
281
+ // did we get the full file?
282
+ if ( !empty($headers['content-length']) && $headers['content-length'] != strlen($this->result_body) )
283
+ {
284
+ $this->result_status_code = 206;
285
+ }
286
+
287
+ // now, if we're being passed a location header, should we follow it?
288
+ if ($this->doFollowLocationHeader)
289
+ {
290
+ //dont bother if we didn't even setup the script correctly
291
+ if (isset($headers['x-use-https']) && $headers['x-use-https']=='yes')
292
+ die($this->ssl_setting_message);
293
+
294
+ if (isset($headers['location']))
295
+ {
296
+ if ($this->max_redirects <= 0)
297
+ die("Too many redirects on: ".$headers['location']);
298
+
299
+ $this->max_redirects--;
300
+ $this->redirectURL = $headers['location'];
301
+ $this->query($headers['location']);
302
+ }
303
+ }
304
+
305
+ }
306
+
307
+ function getTransferSpeed()
308
+ {
309
+ return $this->lastTransferSpeed;
310
+ }
311
+
312
+ /**
313
+ * The quick way to get a URL's content :)
314
+ *
315
+ * @param string URL
316
+ * @param boolean return as array? (like PHP's file() command)
317
+ * @return string result body
318
+ */
319
+ function get($location, $asArray = FALSE )
320
+ {
321
+ $this->query($location);
322
+
323
+ if ( $this->get_status_code() == 200 )
324
+ {
325
+ if ($asArray)
326
+ {
327
+ return preg_split("/\n/",$this->fetch_body());
328
+ }
329
+
330
+ return $this->fetch_body();
331
+ }
332
+
333
+ return FALSE;
334
+ }
335
+
336
+ /**
337
+ * Returns the last status code.
338
+ * 200 = OK;
339
+ * 403 = FORBIDDEN;
340
+ * etc.
341
+ *
342
+ * @return int status code
343
+ */
344
+ function get_status_code()
345
+ {
346
+ return $this->result_status_code;
347
+ }
348
+
349
+ /**
350
+ * Adds a header, sent with the next query.
351
+ *
352
+ * @param string header name
353
+ * @param string header value
354
+ */
355
+ function add_header($key,$value)
356
+ {
357
+ $this->extra_headers[$key] = $value;
358
+ }
359
+
360
+ /**
361
+ * Clears any extra headers.
362
+ *
363
+ */
364
+ function clear_headers()
365
+ {
366
+ $this->extra_headers = array();
367
+ }
368
+
369
+ /**
370
+ * Return the result of a query.
371
+ *
372
+ * @return string result
373
+ */
374
+ function fetch_result()
375
+ {
376
+ return $this->result;
377
+ }
378
+
379
+ /**
380
+ * Return the header of result (stuff before body).
381
+ *
382
+ * @param string (optional) header to return
383
+ * @return array result header
384
+ */
385
+ function fetch_header( $header = '' )
386
+ {
387
+ if ($this->proxy)
388
+ return $this->proxy_headers;
389
+
390
+ $array_headers = preg_split("/\r\n/",$this->result_header);
391
+
392
+ $array_return = array( 0 => $array_headers[0] );
393
+ unset($array_headers[0]);
394
+
395
+ foreach ( $array_headers as $pair )
396
+ {
397
+ if ($pair == '' || $pair == "\r\n") continue;
398
+ list($key,$value) = preg_split("/: /",$pair,2);
399
+ $array_return[strtolower($key)] = $value;
400
+ }
401
+
402
+ if ( $header != '' )
403
+ {
404
+ return $array_return[strtolower($header)];
405
+ }
406
+
407
+ return $array_return;
408
+ }
409
+
410
+ /**
411
+ * Return the body of result (stuff after header).
412
+ *
413
+ * @return string result body
414
+ */
415
+ function fetch_body()
416
+ {
417
+ return $this->result_body;
418
+ }
419
+
420
+ /**
421
+ * Return parsed body in array format.
422
+ *
423
+ * @return array result parsed
424
+ */
425
+ function fetch_parsed_body()
426
+ {
427
+ parse_str($this->result_body,$x);
428
+ return $x;
429
+ }
430
+
431
+
432
+ /**
433
+ * Set a specifc message on how to change the SSL setting, in the event that it's not set correctly.
434
+ */
435
+ function set_ssl_setting_message($str)
436
+ {
437
+ $this->ssl_setting_message = $str;
438
+ }
439
+
440
+
441
+ }
lets-encrypt/integrations/hostgator/hostgator.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) or die();
3
+
4
+ /**
5
+ * On hostgator, we don't have the cpanel api, so remove these steps.
6
+ * This is managed in the config, in the hosts array
7
+ */
lets-encrypt/integrations/integrations.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php defined( 'ABSPATH' ) or die();
2
+ $other_host = rsssl_get_other_host();
3
+ if (file_exists( rsssl_le_path . "integrations/$other_host/$other_host.php" )) {
4
+ require_once( rsssl_le_path . "integrations/$other_host/$other_host.php" );
5
+ }
6
+ if (file_exists( rsssl_le_path . "integrations/$other_host/functions.php" )){
7
+ require_once( rsssl_le_path . "integrations/$other_host/functions.php" );
8
+ }
9
+
10
+ if ( rsssl_is_cpanel() ) {
11
+ require_once( rsssl_le_path . 'integrations/cpanel/cpanel.php' );
12
+ } else if ( rsssl_is_plesk() ) {
13
+ require_once( rsssl_le_path . 'integrations/plesk/plesk.php' );
14
+ } else if ( rsssl_is_directadmin() ) {
15
+ require_once( rsssl_le_path . 'integrations/directadmin/directadmin.php' );
16
+ }
17
+
lets-encrypt/integrations/plesk/CertificateInstaller.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace PleskX\Api\Operator;
3
+ require_once rsssl_le_path . 'vendor/autoload.php';
4
+
5
+ use PleskX\Api\Struct\CertificateInstaller as Struct;
6
+
7
+ class CertificateInstaller extends \PleskX\Api\Operator\Certificate
8
+ {
9
+ /**
10
+ * @param array $properties
11
+ *
12
+ * @return Struct\Info
13
+ */
14
+ public function install($domains, $properties)
15
+ {
16
+ $packet = $this->_client->getPacket();
17
+ foreach ($domains as $domain) {
18
+ $install = $packet->addChild($this->_wrapperTag)->addChild('install');
19
+ $install->addChild('name', $domain);
20
+ $install->addChild('webspace', $domain);
21
+ $content = $install->addChild('content');
22
+
23
+ foreach ($properties as $name => $value) {
24
+ $content->addChild($name, $value);
25
+ }
26
+ }
27
+
28
+ $response = $this->_client->request($packet);
29
+
30
+ return new Struct\Info($response);
31
+ }
32
+ }
lets-encrypt/integrations/plesk/functions.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) or die();
3
+
4
+ function rsssl_plesk_install(){
5
+ if (rsssl_is_ready_for('installation')) {
6
+ $cpanel = new rsssl_plesk();
7
+ $domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
8
+ $response = $cpanel->installSSL($domains);
9
+ if ( $response->status === 'success' ) {
10
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default');
11
+ }
12
+ return $response;
13
+ } else {
14
+ $status = 'error';
15
+ $action = 'stop';
16
+ $message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
17
+ return new RSSSL_RESPONSE($status, $action, $message);
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Add the step to install SSL using Plesk
23
+ * @param $steps
24
+ *
25
+ * @return mixed
26
+ */
27
+ function rsssl_plesk_add_installation_step($steps){
28
+ $plesk = new rsssl_plesk();
29
+ if ( $plesk->credentials_available() ) {
30
+ $index = array_search( 'installation', array_column( $steps['lets-encrypt'], 'id' ) );
31
+ $index ++;
32
+ $steps['lets-encrypt'][ $index ]['actions'] = array_merge(array(
33
+ array(
34
+ 'description' => __("Installing SSL certificate using PLESK API...", "really-simple-ssl"),
35
+ 'action'=> 'rsssl_plesk_install',
36
+ 'attempts' => 1,
37
+ 'speed' => 'normal',
38
+ )
39
+ ) , $steps['lets-encrypt'][ $index ]['actions'] );
40
+ }
41
+
42
+ return $steps;
43
+ }
44
+ add_filter( 'rsssl_steps', 'rsssl_plesk_add_installation_step' );
lets-encrypt/integrations/plesk/plesk.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package PLESK
4
+ * @author Rogier Lankhorst
5
+ * @copyright Copyright (C) 2021, Rogier Lankhorst
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3
7
+ * @link https://really-simple-ssl.com
8
+ * @since Class available since Release 5.0.0
9
+ *
10
+ *
11
+ * This program is free software: you can redistribute it and/or modify
12
+ * it under the terms of the GNU General Public License as published by
13
+ * the Free Software Foundation, either version 3 of the License, or
14
+ * (at your option) any later version.
15
+ *
16
+ * This program is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ * GNU General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU General Public License
22
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
23
+ *
24
+ */
25
+
26
+ use PleskX\Api\Client;
27
+
28
+ require_once rsssl_le_path . 'vendor/autoload.php';
29
+ require_once( rsssl_le_path . 'integrations/plesk/functions.php' );
30
+
31
+ class rsssl_plesk
32
+ {
33
+ public $host;
34
+ private $login;
35
+ private $password;
36
+ public $ssl_installation_url;
37
+
38
+ /**
39
+ * Initiates the Plesk class.
40
+ *
41
+ */
42
+ public function __construct()
43
+ {
44
+ $password = RSSSL_LE()->letsencrypt_handler->decode( rsssl_get_value('plesk_password') );
45
+ $host = rsssl_get_value('plesk_host');
46
+ $this->host = str_replace(array('http://', 'https://', ':8443'), '', $host);
47
+ $this->login = rsssl_get_value('plesk_username');
48
+ $this->password = $password;
49
+ $this->ssl_installation_url = 'https://'.$this->host.":8443/smb/ssl-certificate/list/id/21";
50
+ }
51
+
52
+ /**
53
+ * Check if all creds are available
54
+ * @return bool
55
+ */
56
+ public function credentials_available(){
57
+ if (!empty($this->host) && !empty($this->password) && !empty($this->login)) {
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+
63
+ /**
64
+ * Install certificate
65
+ * @param $domains
66
+ *
67
+ * @return RSSSL_RESPONSE
68
+ */
69
+ public function installSSL($domains){
70
+ $key_file = get_option('rsssl_private_key_path');
71
+ $cert_file = get_option('rsssl_certificate_path');
72
+ $cabundle_file = get_option('rsssl_intermediate_path');
73
+
74
+ try {
75
+ $client = new Client($this->host);
76
+ $client->setCredentials($this->login, $this->password);
77
+ $response = $client->certificate()->install($domains, [
78
+ 'csr' => '',
79
+ 'pvt' => file_get_contents($key_file),
80
+ 'cert' => file_get_contents($cert_file),
81
+ 'ca' => file_get_contents($cabundle_file),
82
+ ]);
83
+ error_log(print_r($response,true));
84
+ update_option('rsssl_le_certificate_installed_by_rsssl', 'plesk');
85
+ delete_option('rsssl_installation_error' );
86
+ $status = 'success';
87
+ $action = 'stop';
88
+ $message = __('Successfully installed SSL',"really-simple-ssl");
89
+ } catch(Exception $e) {
90
+ error_log(print_r($e,true));
91
+ update_option('rsssl_installation_error', 'plesk');
92
+ $status = 'warning';
93
+ $action = 'continue';
94
+ $message = $e->getMessage();
95
+ }
96
+ return new RSSSL_RESPONSE($status, $action, $message);
97
+ }
98
+
99
+ }
100
+
lets-encrypt/letsencrypt.php ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') or die();
3
+ /**
4
+ * Capability handling for Let's Encrypt
5
+ * @return bool
6
+ *
7
+ * php -r "readfile('https://getcomposer.org/installer');" | php
8
+ */
9
+ if (!function_exists('rsssl_letsencrypt_generation_allowed')) {
10
+ function rsssl_letsencrypt_generation_allowed() {
11
+
12
+ if ( wp_doing_cron() ) {
13
+ return true;
14
+ }
15
+
16
+ if ( !current_user_can( 'manage_options' ) ) {
17
+ return false;
18
+ }
19
+
20
+ if ( isset($_GET['tab']) && $_GET['tab'] === 'letsencrypt' ){
21
+ return true;
22
+ }
23
+
24
+ if ( isset($_GET['action']) && $_GET['action'] === 'rsssl_installation_progress' ){
25
+ return true;
26
+ }
27
+
28
+ if ( isset($_POST['rsssl_le_nonce']) && wp_verify_nonce( $_POST['rsssl_le_nonce'], 'rsssl_save' )){
29
+ return true;
30
+ }
31
+
32
+ return false;
33
+ }
34
+ }
35
+
36
+ if ( rsssl_letsencrypt_generation_allowed() ) {
37
+
38
+ class RSSSL_LETSENCRYPT {
39
+ private static $instance;
40
+
41
+ public $wizard;
42
+ public $field;
43
+ public $config;
44
+ public $letsencrypt_handler;
45
+
46
+ private function __construct() {
47
+
48
+ }
49
+
50
+ public static function instance() {
51
+ if ( ! isset( self::$instance ) && ! ( self::$instance instanceof RSSSL_LETSENCRYPT ) ) {
52
+ self::$instance = new RSSSL_LETSENCRYPT;
53
+ self::$instance->setup_constants();
54
+ self::$instance->includes();
55
+ self::$instance->field = new rsssl_field();
56
+ self::$instance->wizard = new rsssl_wizard();
57
+ self::$instance->config = new rsssl_config();
58
+ if (version_compare(PHP_VERSION, rsssl_le_php_version, '>')) {
59
+ self::$instance->letsencrypt_handler = new rsssl_letsencrypt_handler();
60
+ }
61
+ }
62
+
63
+ return self::$instance;
64
+ }
65
+
66
+ private function setup_constants() {
67
+ define('rsssl_le_php_version', '7.1');
68
+ define('rsssl_le_url', plugin_dir_url(__FILE__));
69
+ define('rsssl_le_path', trailingslashit(plugin_dir_path(__FILE__)));
70
+ define('rsssl_le_wizard_path', trailingslashit(plugin_dir_path(__FILE__)).'/wizard/');
71
+ }
72
+
73
+ private function includes() {
74
+ require_once( rsssl_le_path . 'cron.php' );
75
+ require_once( rsssl_le_path . 'wizard/assets/icons.php' );
76
+ require_once( rsssl_le_path . 'wizard/class-field.php' );
77
+ require_once( rsssl_le_path . 'wizard/class-wizard.php' );
78
+ require_once( rsssl_le_path . 'wizard/config/class-config.php' );
79
+ require_once( rsssl_le_path . 'functions.php');
80
+
81
+ if (version_compare(PHP_VERSION, rsssl_le_php_version, '>=')) {
82
+ require_once( rsssl_le_path . 'wizard/notices.php' );
83
+ require_once( rsssl_le_path . 'class-letsencrypt-handler.php' );
84
+ require_once( rsssl_le_path . 'integrations/integrations.php' );
85
+ }
86
+
87
+ }
88
+
89
+ /**
90
+ * Notice about possible compatibility issues with add ons
91
+ */
92
+ public static function admin_notices() {
93
+
94
+ }
95
+ }
96
+
97
+ function RSSSL_LE() {
98
+ return RSSSL_LETSENCRYPT::instance();
99
+ }
100
+
101
+ add_action( 'plugins_loaded', 'RSSSL_LE', 9 );
102
+ }
103
+
104
+
105
+ class RSSSL_RESPONSE
106
+ {
107
+ public $message;
108
+ public $action;
109
+ public $status;
110
+ public $output;
111
+
112
+ public function __construct($status, $action, $message, $output = false )
113
+ {
114
+ $this->status = $status;
115
+ $this->action = $action;
116
+ $this->message = $message;
117
+ $this->output = $output;
118
+ }
119
+
120
+ }
121
+
122
+
lets-encrypt/node_modules/composer/CHANGELOG.md ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### v3.0.0
2
+
3
+ **Breaking changes**
4
+
5
+ - Support for custom inspect methods was removed. Please follow Node's [recommended practices](https://nodejs.org/api/util.html#util_util_inspect_custom) for creating a custom inspect method.
6
+
7
+ ### v3.0.0
8
+
9
+ - Completely refactored from the ground up.
10
+ - For the most part, `.task`, `.build`, `.series` and `.parallel` work the same way. However, event handling has changed. Please see the readme for more information and documentation.
11
+
12
+ ### v2.0.0
13
+
14
+ - Now requires Node.js v4.0 or higher
15
+
16
+ ### v1.0.0
17
+
18
+ - Updates the events that are emitted and adds statuses to the objects emitted on the events. see issues [#20](../../issues/20) and [#21](../../issues/21)
19
+ - Updates the event objects to expose human readable durations. [see issue #23](../../issues/23)
20
+ - Removes unused properties. [see issue #24](../../issues/24)
21
+ - Updates `.build` to return a promise when the callback is not passed in. [see issue #28](../../issues/28)
22
+
23
+ ### v0.14.0
24
+
25
+ - Updates [bach][] to `1.0.0`.
26
+ - Errors emitted from inside a task now have the `'in task "foo":'` prefixed to the error message. [see issue #22](../../issues/22)
27
+ - Expose `.runInfo` on the task object for use in event listeners and task functions.
28
+ - Add `.duration` to the `.run/.runInfo` object that shows the duration in a human friendly format. This will also show the current duration from the time the task started to the time it's called if used inside a task function. [see issue #23](../../issues/23)
29
+
30
+ ```js
31
+ app.task('foo', function(cb) {
32
+ console.log(this.runInfo.duration);
33
+ });
34
+ ```
35
+
36
+ ### v0.13.0
37
+
38
+ - Skip tasks by setting the `options.skip` option to the name of the task or an array of task names.
39
+ - Making additional `err` properties non-enumerable to cut down on error output.
40
+
41
+ ### v0.12.0
42
+
43
+ - You can no longer get a task from the `.task()` method by passing only the name. Instead do `var task = app.tasks[name];`
44
+ - Passing only a name and no dependencies to `.task()` will result in a `noop` task being created.
45
+ - `options` may be passed to `.build()`, `.series()` and `.parallel()`
46
+ - `options` passed to `.build()` will be merged onto task options before running the task.
47
+ - Skip tasks by setting their `options.run` option to `false`.
48
+
49
+ ### v0.11.3
50
+
51
+ - Allow passing es2015 javascript generator functions to `.task()`.
52
+
53
+ ### v0.11.2
54
+
55
+ - Allow using glob patterns for task dependencies.
56
+
57
+ ### v0.11.0
58
+
59
+ - **BREAKING CHANGE**: Removed `.watch()`. Watch functionality can be added to [base][] applications using [base-watch][].
60
+
61
+ ### v0.10.0
62
+
63
+ - Removes `session`.
64
+
65
+ ### v0.9.0
66
+
67
+ - Use `default` when no tasks are passed to `.build()`.
68
+
69
+ ### v0.8.4
70
+
71
+ - Ensure task dependencies are unique.
72
+
73
+ ### v0.8.2
74
+
75
+ - Emitting `task` when adding a task through `.task()`
76
+ - Returning task when calling `.task(name)` with only a name.
77
+
78
+ ### v0.8.0
79
+
80
+ - Emitting `task:*` events instead of generic `*` events. See [event docs](#events) for more information.
81
+
82
+ ### v0.7.0
83
+
84
+ - No longer returning the current task when `.task()` is called without a name.
85
+ - Throwing an error when `.task()` is called without a name.
86
+
87
+ ### v0.6.0
88
+
89
+ - Adding properties to `err` instances and emitting instead of emitting multiple parameters.
90
+ - Adding series and parallel flows/methods.
91
+
92
+ ### v0.5.0
93
+
94
+ - **BREAKING CHANGE** Renamed `.run()` to `.build()`
95
+
96
+ ### v0.4.2
97
+
98
+ - `.watch` returns an instance of `FSWatcher`
99
+
100
+ ### v0.4.1
101
+
102
+ - Currently running task returned when calling `.task()` without a name.
103
+
104
+ ### v0.4.0
105
+
106
+ - Add session-cache to enable per-task data contexts.
107
+
108
+ ### v0.3.0
109
+
110
+ - Event bubbling/emitting changed.
111
+
112
+ ### v0.1.0
113
+
114
+ - Initial release.
lets-encrypt/node_modules/composer/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-present, Brian Woodward.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
lets-encrypt/node_modules/composer/README.md ADDED
@@ -0,0 +1,608 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # composer [![NPM version](https://img.shields.io/npm/v/composer.svg?style=flat)](https://www.npmjs.com/package/composer) [![NPM monthly downloads](https://img.shields.io/npm/dm/composer.svg?style=flat)](https://npmjs.org/package/composer) [![NPM total downloads](https://img.shields.io/npm/dt/composer.svg?style=flat)](https://npmjs.org/package/composer) [![Linux Build Status](https://img.shields.io/travis/doowb/composer.svg?style=flat&label=Travis)](https://travis-ci.org/doowb/composer) [![Windows Build Status](https://img.shields.io/appveyor/ci/doowb/composer.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/doowb/composer)
2
+
3
+ > Run and compose async tasks. Easily define groups of tasks to run in series or parallel.
4
+
5
+ Please consider following this project's author, [Brian Woodward](https://github.com/doowb), and consider starring the project to show your :heart: and support.
6
+
7
+ - [Install](#install)
8
+ - [Usage](#usage)
9
+ - [API](#api)
10
+ * [Tasks](#tasks)
11
+ * [Generators](#generators)
12
+ - [Events](#events)
13
+ * [task](#task)
14
+ * [task-pending](#task-pending)
15
+ * [task-preparing](#task-preparing)
16
+ - [Release history](#release-history)
17
+ - [About](#about)
18
+
19
+ _(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_
20
+
21
+ ## Install
22
+
23
+ Install with [npm](https://www.npmjs.com/):
24
+
25
+ ```sh
26
+ $ npm install --save composer
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ```js
32
+ // Create an instance of `Composer`
33
+ const Composer = require('composer');
34
+ const composer = new Composer();
35
+
36
+ // Define tasks with the .task() method
37
+ composer.task('foo', callback => {
38
+ callback(); // do stuff
39
+ });
40
+ composer.task('bar', callback => {
41
+ callback(); // do stuff
42
+ });
43
+
44
+ composer.task('baz', ['foo'. 'bar']);
45
+
46
+ // Run tasks with the .build() method
47
+ composer.build('baz')
48
+ .then(() => console.log('done!'))
49
+ .catch(console.error);
50
+ ```
51
+
52
+ ## API
53
+
54
+ ### [.factory](lib/tasks.js#L27)
55
+
56
+ Factory for creating a custom `Tasks` class that extends the given `Emitter`. Or, simply call the factory function to use the built-in emitter.
57
+
58
+ **Params**
59
+
60
+ * `Emitter` **{function}**: Event emitter.
61
+ * `returns` **{Class}**: Returns a custom `Tasks` class.
62
+
63
+ **Example**
64
+
65
+ ```js
66
+ // custom emitter
67
+ const Emitter = require('events');
68
+ const Tasks = require('composer/lib/tasks')(Emitter);
69
+ // built-in emitter
70
+ const Tasks = require('composer/lib/tasks')();
71
+ const composer = new Tasks();
72
+ ```
73
+
74
+ ### [Tasks](lib/tasks.js#L42)
75
+
76
+ Create an instance of `Tasks` with the given `options`.
77
+
78
+ **Params**
79
+
80
+ * `options` **{object}**
81
+
82
+ **Example**
83
+
84
+ ```js
85
+ const Tasks = require('composer').Tasks;
86
+ const composer = new Tasks();
87
+ ```
88
+
89
+ ### [.task](lib/tasks.js#L86)
90
+
91
+ Define a task. Tasks run asynchronously, either in series (by default) or parallel (when `options.parallel` is true). In order for the build to determine when a task is complete, _one of the following_ things must happen: 1) the callback must be called, 2) a promise must be returned, or 3) a stream must be returned. Inside tasks, the "this" object is a composer Task instance created for each task with useful properties like the task name, options and timing information, which can be useful for logging, etc.
92
+
93
+ **Params**
94
+
95
+ * `name` **{String}**: The task name.
96
+ * `deps` **{Object|Array|String|Function}**: Any of the following: task dependencies, callback(s), or options object, defined in any order.
97
+ * `callback` **{Function}**: (optional) If the last argument is a function, it will be called after all of the task's dependencies have been run.
98
+ * `returns` **{undefined}**
99
+
100
+ **Example**
101
+
102
+ ```js
103
+ // 1. callback
104
+ app.task('default', cb => {
105
+ // do stuff
106
+ cb();
107
+ });
108
+ // 2. promise
109
+ app.task('default', () => {
110
+ return Promise.resolve(null);
111
+ });
112
+ // 3. stream (using vinyl-fs or your stream of choice)
113
+ app.task('default', function() {
114
+ return vfs.src('foo/*.js');
115
+ });
116
+ ```
117
+
118
+ ### [.build](lib/tasks.js#L209)
119
+
120
+ Run one or more tasks.
121
+
122
+ **Params**
123
+
124
+ * `tasks` **{object|array|string|function}**: One or more tasks to run, options, or callback function. If no tasks are defined, the default task is automatically run.
125
+ * `callback` **{function}**: (optional)
126
+ * `returns` **{undefined}**
127
+
128
+ **Example**
129
+
130
+ ```js
131
+ const build = app.series(['foo', 'bar', 'baz']);
132
+ // promise
133
+ build().then(console.log).catch(console.error);
134
+ // or callback
135
+ build(function() {
136
+ if (err) return console.error(err);
137
+ });
138
+ ```
139
+
140
+ ### [.series](lib/tasks.js#L251)
141
+
142
+ Compose a function to run the given tasks in series.
143
+
144
+ **Params**
145
+
146
+ * `tasks` **{object|array|string|function}**: Tasks to run, options, or callback function. If no tasks are defined, the `default` task is automatically run, if one exists.
147
+ * `callback` **{function}**: (optional)
148
+ * `returns` **{promise|undefined}**: Returns a promise if no callback is passed.
149
+
150
+ **Example**
151
+
152
+ ```js
153
+ const build = app.series(['foo', 'bar', 'baz']);
154
+ // promise
155
+ build().then(console.log).catch(console.error);
156
+ // or callback
157
+ build(function() {
158
+ if (err) return console.error(err);
159
+ });
160
+ ```
161
+
162
+ ### [.parallel](lib/tasks.js#L304)
163
+
164
+ Compose a function to run the given tasks in parallel.
165
+
166
+ **Params**
167
+
168
+ * `tasks` **{object|array|string|function}**: Tasks to run, options, or callback function. If no tasks are defined, the `default` task is automatically run, if one exists.
169
+ * `callback` **{function}**: (optional)
170
+ * `returns` **{promise|undefined}**: Returns a promise if no callback is passed.
171
+
172
+ **Example**
173
+
174
+ ```js
175
+ // call the returned function to start the build
176
+ const build = app.parallel(['foo', 'bar', 'baz']);
177
+ // promise
178
+ build().then(console.log).catch(console.error);
179
+ // callback
180
+ build(function() {
181
+ if (err) return console.error(err);
182
+ });
183
+ // example task usage
184
+ app.task('default', build);
185
+ ```
186
+
187
+ ### [.create](lib/tasks.js#L388)
188
+
189
+ Static method for creating a custom Tasks class with the given `Emitter.
190
+
191
+ **Params**
192
+
193
+ * `Emitter` **{Function}**
194
+ * `returns` **{Class}**: Returns the custom class.
195
+
196
+ ### [.create](lib/generator.js#L30)
197
+
198
+ Static factory method for creating a custom `Composer` class that extends the given `Emitter`.
199
+
200
+ **Params**
201
+
202
+ * `Emitter` **{Function}**: Event emitter.
203
+ * `returns` **{Class}**: Returns a custom `Composer` class.
204
+
205
+ **Example**
206
+
207
+ ```js
208
+ // Composer extends a basic event emitter by default
209
+ const Composer = require('composer');
210
+ const composer = new Composer();
211
+
212
+ // Create a custom Composer class with your even emitter of choice
213
+ const Emitter = require('some-emitter');
214
+ const CustomComposer = Composer.create(Emitter);
215
+ const composer = new CustomComposer();
216
+ ```
217
+
218
+ **Params**
219
+
220
+ * `name` **{String}**
221
+ * `options` **{Object}**
222
+ * `returns` **{Object}**: Returns an instance of Composer.
223
+
224
+ **Example**
225
+
226
+ ```js
227
+ const composer = new Composer();
228
+ ```
229
+
230
+ Create a wrapped generator function with the given `name`, `config`, and `fn`.
231
+
232
+ **Params**
233
+
234
+ * `name` **{String}**
235
+ * `config` **{Object}**: (optional)
236
+ * `fn` **{Function}**
237
+ * `returns` **{Function}**
238
+
239
+ Returns true if the given value is a Composer generator object.
240
+
241
+ **Params**
242
+
243
+ * `val` **{Object}**
244
+ * `returns` **{Boolean}**
245
+
246
+ ### [.register](lib/generator.js#L167)
247
+
248
+ Alias to `.setGenerator`.
249
+
250
+ **Params**
251
+
252
+ * `name` **{String}**: The generator's name
253
+ * `options` **{Object|Function|String}**: or generator
254
+ * `generator` **{Object|Function|String}**: Generator function, instance or filepath.
255
+ * `returns` **{Object}**: Returns the generator instance.
256
+
257
+ **Example**
258
+
259
+ ```js
260
+ app.register('foo', function(app, base) {
261
+ // "app" is a private instance created for the generator
262
+ // "base" is a shared instance
263
+ });
264
+ ```
265
+
266
+ ### [.generator](lib/generator.js#L190)
267
+
268
+ Get and invoke generator `name`, or register generator `name` with the given `val` and `options`, then invoke and return the generator instance. This method differs from `.register`, which lazily invokes generator functions when `.generate` is called.
269
+
270
+ **Params**
271
+
272
+ * `name` **{String}**
273
+ * `fn` **{Function|Object}**: Generator function, instance or filepath.
274
+ * `returns` **{Object}**: Returns the generator instance or undefined if not resolved.
275
+
276
+ **Example**
277
+
278
+ ```js
279
+ app.generator('foo', function(app, options) {
280
+ // "app" - private instance created for generator "foo"
281
+ // "options" - options passed to the generator
282
+ });
283
+ ```
284
+
285
+ ### [.setGenerator](lib/generator.js#L222)
286
+
287
+ Store a generator by file path or instance with the given `name` and `options`.
288
+
289
+ **Params**
290
+
291
+ * `name` **{String}**: The generator's name
292
+ * `options` **{Object|Function|String}**: or generator
293
+ * `generator` **{Object|Function|String}**: Generator function, instance or filepath.
294
+ * `returns` **{Object}**: Returns the generator instance.
295
+
296
+ **Example**
297
+
298
+ ```js
299
+ app.setGenerator('foo', function(app, options) {
300
+ // "app" - new instance of Generator created for generator "foo"
301
+ // "options" - options passed to the generator
302
+ });
303
+ ```
304
+
305
+ ### [.getGenerator](lib/generator.js#L247)
306
+
307
+ Get generator `name` from `app.generators`, same as [findGenerator], but also invokes the returned generator with the current instance. Dot-notation may be used for getting sub-generators.
308
+
309
+ **Params**
310
+
311
+ * `name` **{String}**: Generator name.
312
+ * `returns` **{Object|undefined}**: Returns the generator instance or undefined.
313
+
314
+ **Example**
315
+
316
+ ```js
317
+ const foo = app.getGenerator('foo');
318
+
319
+ // get a sub-generator
320
+ const baz = app.getGenerator('foo.bar.baz');
321
+ ```
322
+
323
+ ### [.findGenerator](lib/generator.js#L280)
324
+
325
+ Find generator `name`, by first searching the cache, then searching the cache of the `base` generator. Use this to get a generator without invoking it.
326
+
327
+ **Params**
328
+
329
+ * `name` **{String}**
330
+ * `options` **{Function}**: Optionally supply a rename function on `options.toAlias`
331
+ * `returns` **{Object|undefined}**: Returns the generator instance if found, or undefined.
332
+
333
+ **Example**
334
+
335
+ ```js
336
+ // search by "alias"
337
+ const foo = app.findGenerator('foo');
338
+
339
+ // search by "full name"
340
+ const foo = app.findGenerator('generate-foo');
341
+ ```
342
+
343
+ **Params**
344
+
345
+ * `name` **{String}**
346
+ * `returns` **{Boolean}**
347
+
348
+ **Example**
349
+
350
+ ```js
351
+ console.log(app.hasGenerator('foo'));
352
+ console.log(app.hasGenerator('foo.bar'));
353
+ ```
354
+
355
+ ### [.generate](lib/generator.js#L362)
356
+
357
+ Run one or more tasks or sub-generators and returns a promise.
358
+
359
+ **Params**
360
+
361
+ * `name` **{String}**
362
+ * `tasks` **{String|Array}**
363
+ * `returns` **{Promise}**
364
+
365
+ **Events**
366
+
367
+ * `emits`: `generate` with the generator `name` and the array of `tasks` that are queued to run.
368
+
369
+ **Example**
370
+
371
+ ```js
372
+ // run tasks `bar` and `baz` on generator `foo`
373
+ app.generate('foo', ['bar', 'baz']);
374
+
375
+ // or use shorthand
376
+ app.generate('foo:bar,baz');
377
+
378
+ // run the `default` task on generator `foo`
379
+ app.generate('foo');
380
+
381
+ // run the `default` task on the `default` generator, if defined
382
+ app.generate();
383
+ ```
384
+
385
+ ### [.toAlias](lib/generator.js#L413)
386
+
387
+ Create a generator alias from the given `name`. By default, `generate-` is stripped from beginning of the generator name.
388
+
389
+ **Params**
390
+
391
+ * `name` **{String}**
392
+ * `options` **{Object}**
393
+ * `returns` **{String}**: Returns the alias.
394
+
395
+ **Example**
396
+
397
+ ```js
398
+ // customize the alias
399
+ const app = new Generate({ toAlias: require('camel-case') });
400
+ ```
401
+
402
+ ### [.isGenerators](lib/generator.js#L434)
403
+
404
+ Returns true if every name in the given array is a registered generator.
405
+
406
+ **Params**
407
+
408
+ * `names` **{Array}**
409
+ * `returns` **{Boolean}**
410
+
411
+ ### [.formatError](lib/generator.js#L446)
412
+
413
+ Format task and generator errors.
414
+
415
+ **Params**
416
+
417
+ * `name` **{String}**
418
+ * `returns` **{Error}**
419
+
420
+ ### [.disableInspect](lib/generator.js#L466)
421
+
422
+ Disable inspect. Returns a function to re-enable inspect. Useful for debugging.
423
+
424
+ ### [.base](lib/generator.js#L504)
425
+
426
+ Get the first ancestor instance of Composer. Only works if `generator.parent` is
427
+ defined on child instances.
428
+
429
+ ### [.name](lib/generator.js#L517)
430
+
431
+ Get or set the generator name.
432
+
433
+ **Params**
434
+
435
+ * **{String}**
436
+
437
+ * `returns` **{String}**
438
+
439
+ ### [.alias](lib/generator.js#L534)
440
+
441
+ Get or set the generator `alias`. By default, the generator alias is created
442
+ by passing the generator name to the [.toAlias](#toAlias) method.
443
+
444
+ **Params**
445
+
446
+ * **{String}**
447
+
448
+ * `returns` **{String}**
449
+
450
+ ### [.namespace](lib/generator.js#L551)
451
+
452
+ Get the generator namespace. The namespace is created by joining the generator's `alias`
453
+ to the alias of each ancestor generator.
454
+
455
+ **Params**
456
+
457
+ * **{String}**
458
+
459
+ * `returns` **{String}**
460
+
461
+ ### [.depth](lib/generator.js#L564)
462
+
463
+ Get the depth of a generator - useful for debugging. The root generator
464
+ has a depth of `0`, sub-generators add `1` for each level of nesting.
465
+
466
+ * `returns` **{Number}**
467
+
468
+ ### [Composer#parse](lib/generator.js#L577)
469
+
470
+ Static method that returns a function for parsing task arguments.
471
+
472
+ **Params**
473
+
474
+ * `register` **{Function}**: Function that receives a name of a task or generator that cannot be found by the parse function. This allows the `register` function to dynamically register tasks or generators.
475
+ * `returns` **{Function}**: Returns a function for parsing task args.
476
+
477
+ ### [Composer#isGenerator](lib/generator.js#L590)
478
+
479
+ Static method that returns true if the given `val` is an instance of Generate.
480
+
481
+ **Params**
482
+
483
+ * `val` **{Object}**
484
+ * `returns` **{Boolean}**
485
+
486
+ ### [Composer#create](lib/generator.js#L603)
487
+
488
+ Static method for creating a custom Composer class with the given `Emitter.
489
+
490
+ **Params**
491
+
492
+ * `Emitter` **{Function}**
493
+ * `returns` **{Class}**: Returns the custom class.
494
+
495
+ ### [Composer#Tasks](lib/generator.js#L617)
496
+
497
+ Static getter for getting the Tasks class with the same `Emitter` class as Composer.
498
+
499
+ **Params**
500
+
501
+ * `Emitter` **{Function}**
502
+ * `returns` **{Class}**: Returns the Tasks class.
503
+
504
+ ### [Composer#Task](lib/generator.js#L633)
505
+
506
+ Static getter for getting the `Task` class.
507
+
508
+ **Example**
509
+
510
+ ```js
511
+ const { Task } = require('composer');
512
+ ```
513
+
514
+ ## Events
515
+
516
+ ### task
517
+
518
+ ```js
519
+ app.on('task', function(task) {
520
+ switch (task.status) {
521
+ case 'starting':
522
+ // Task is running
523
+ break;
524
+ case 'finished':
525
+ // Task is finished running
526
+ break;
527
+ }
528
+ });
529
+ ```
530
+
531
+ ### task-pending
532
+
533
+ Emitted after a task is registered.
534
+
535
+ ### task-preparing
536
+
537
+ Emitted when a task is preparing to run, right before it's called. You can use this event to dynamically skip tasks by updating `task.skip` to `true` or a function.
538
+
539
+ ## Release history
540
+
541
+ See the [changelog](./CHANGELOG.md).
542
+
543
+ ## About
544
+
545
+ <details>
546
+ <summary><strong>Contributing</strong></summary>
547
+
548
+ Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
549
+
550
+ </details>
551
+
552
+ <details>
553
+ <summary><strong>Running Tests</strong></summary>
554
+
555
+ Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
556
+
557
+ ```sh
558
+ $ npm install && npm test
559
+ ```
560
+
561
+ </details>
562
+
563
+ <details>
564
+ <summary><strong>Building docs</strong></summary>
565
+
566
+ _(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
567
+
568
+ To generate the readme, run the following command:
569
+
570
+ ```sh
571
+ $ npm install -g verbose/verb#dev verb-generate-readme && verb
572
+ ```
573
+
574
+ </details>
575
+
576
+ ### Related projects
577
+
578
+ You might also be interested in these projects:
579
+
580
+ * [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit")
581
+ * [enquirer](https://www.npmjs.com/package/enquirer): Stylish, intuitive and user-friendly prompt system. Fast and lightweight enough for small projects, powerful and… [more](https://github.com/enquirer/enquirer) | [homepage](https://github.com/enquirer/enquirer "Stylish, intuitive and user-friendly prompt system. Fast and lightweight enough for small projects, powerful and extensible enough for the most advanced use cases.")
582
+ * [generate](https://www.npmjs.com/package/generate): Command line tool and developer framework for scaffolding out new GitHub projects. Generate offers the… [more](https://github.com/generate/generate) | [homepage](https://github.com/generate/generate "Command line tool and developer framework for scaffolding out new GitHub projects. Generate offers the robustness and configurability of Yeoman, the expressiveness and simplicity of Slush, and more powerful flow control and composability than either.")
583
+ * [update](https://www.npmjs.com/package/update): Be scalable! Update is a new, open source developer framework and CLI for automating updates… [more](https://github.com/update/update) | [homepage](https://github.com/update/update "Be scalable! Update is a new, open source developer framework and CLI for automating updates of any kind in code projects.")
584
+ * [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.")
585
+
586
+ ### Contributors
587
+
588
+ | **Commits** | **Contributor** |
589
+ | --- | --- |
590
+ | 227 | [doowb](https://github.com/doowb) |
591
+ | 72 | [jonschlinkert](https://github.com/jonschlinkert) |
592
+
593
+ ### Author
594
+
595
+ **Brian Woodward**
596
+
597
+ * [GitHub Profile](https://github.com/doowb)
598
+ * [Twitter Profile](https://twitter.com/doowb)
599
+ * [LinkedIn Profile](https://linkedin.com/in/woodwardbrian)
600
+
601
+ ### License
602
+
603
+ Copyright © 2018, [Brian Woodward](https://github.com/doowb).
604
+ Released under the [MIT License](LICENSE).
605
+
606
+ ***
607
+
608
+ _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on November 11, 2018._
lets-encrypt/node_modules/composer/index.js ADDED
@@ -0,0 +1 @@
 
1
+ module.exports = require('./lib/generator');
lets-encrypt/node_modules/composer/lib/generator.js ADDED
@@ -0,0 +1,645 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ const util = require('util');
4
+ const Task = require('./task');
5
+ const Tasks = require('./tasks');
6
+ const parse = require('./parse');
7
+ const Events = require('events');
8
+ const { define } = require('./utils');
9
+
10
+ /**
11
+ * Static factory method for creating a custom `Composer` class that
12
+ * extends the given `Emitter`.
13
+ *
14
+ * ```js
15
+ * // Composer extends a basic event emitter by default
16
+ * const Composer = require('composer');
17
+ * const composer = new Composer();
18
+ *
19
+ * // Create a custom Composer class with your even emitter of choice
20
+ * const Emitter = require('some-emitter');
21
+ * const CustomComposer = Composer.create(Emitter);
22
+ * const composer = new CustomComposer();
23
+ * ```
24
+ * @name .create
25
+ * @param {Function} `Emitter` Event emitter.
26
+ * @return {Class} Returns a custom `Composer` class.
27
+ * @api public
28
+ */
29
+
30
+ const factory = (Emitter = Events) => {
31
+
32
+ /**
33
+ * Create a new instance of Composer.
34
+ *
35
+ * ```js
36
+ * const composer = new Composer();
37
+ * ```
38
+ * @extends EventEmitter
39
+ * @param {String} `name`
40
+ * @param {Object} `options`
41
+ * @return {Object} Returns an instance of Composer.
42
+ * @api public
43
+ */
44
+
45
+ class Generator extends Tasks.create(Emitter) {
46
+ constructor(name, options = {}) {
47
+ if (name && typeof name !== 'string') {
48
+ options = name;
49
+ name = void 0;
50
+ }
51
+ // ensure that options aren't passed to generic
52
+ // emitter to prevent unintended side-effects
53
+ super(!/(Event)?Emitter/i.test(Emitter.name) ? options : null);
54
+ if (this.setMaxListeners) this.setMaxListeners(0);
55
+ this.name = name;
56
+ this.options = options;
57
+ this.namespaces = new Map();
58
+ this.generators = new Map();
59
+ this.isGenerate = true;
60
+ if (!this.use) {
61
+ require('use')(this);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Create a wrapped generator function with the given `name`, `config`, and `fn`.
67
+ *
68
+ * @param {String} `name`
69
+ * @param {Object} `config` (optional)
70
+ * @param {Function} `fn`
71
+ * @return {Function}
72
+ * @api public
73
+ */
74
+
75
+ toGenerator(name, config, fn) {
76
+ if (typeof config === 'function' || this.isGenerator(config)) {
77
+ fn = config;
78
+ config = fn || {};
79
+ }
80
+
81
+ let alias = this.toAlias(name);
82
+ let generator = options => {
83
+ if (generator.instance && generator.once !== false) {
84
+ return generator.instance;
85
+ }
86
+
87
+ let opts = Object.assign({}, config, options);
88
+ let app = this.isGenerator(fn) ? fn : new this.constructor(opts);
89
+ this.run(app);
90
+
91
+ generator.instance = app;
92
+ generator.called++;
93
+ fn.called = generator.called;
94
+
95
+ app.createGenerator = generator;
96
+ app.alias = alias;
97
+ app.name = name;
98
+ app.fn = fn;
99
+
100
+ define(app, 'parent', this);
101
+ this.emit('generator', app);
102
+
103
+ // emit errors that happen on initialization
104
+ let listeners = {};
105
+ let bubble = events => {
106
+ for (let name of events) {
107
+ let listener = listeners[name] || (listeners[name] = this.emit.bind(this, name));
108
+ app.off(name, listener);
109
+ app.on(name, listener);
110
+ }
111
+ };
112
+
113
+ bubble(['error', 'task', 'build', 'plugin']);
114
+
115
+ if (typeof fn === 'function') {
116
+ fn.call(app, app, opts);
117
+ // re-register emitters that we just registered a few lines ago,
118
+ // to ensure that errors are bubbled up in the correct order
119
+ bubble(['error', 'task', 'build', 'plugin']);
120
+ }
121
+
122
+ if (opts && opts.once === false) {
123
+ generator.once = false;
124
+ }
125
+ return app;
126
+ };
127
+
128
+ define(generator, 'name', alias);
129
+ define(generator, 'parent', this);
130
+ define(generator, 'instance', null);
131
+ generator.called = 0;
132
+ generator.isGenerator = true;
133
+ generator.alias = alias;
134
+ generator.fn = fn;
135
+ return generator;
136
+ }
137
+
138
+ /**
139
+ * Returns true if the given value is a Composer generator object.
140
+ *
141
+ * @param {Object} `val`
142
+ * @return {Boolean}
143
+ * @api public
144
+ */
145
+
146
+ isGenerator(val) {
147
+ return this.constructor.isGenerator(val);
148
+ }
149
+
150
+ /**
151
+ * Alias to `.setGenerator`.
152
+ *
153
+ * ```js
154
+ * app.register('foo', function(app, base) {
155
+ * // "app" is a private instance created for the generator
156
+ * // "base" is a shared instance
157
+ * });
158
+ * ```
159
+ * @name .register
160
+ * @param {String} `name` The generator's name
161
+ * @param {Object|Function|String} `options` or generator
162
+ * @param {Object|Function|String} `generator` Generator function, instance or filepath.
163
+ * @return {Object} Returns the generator instance.
164
+ * @api public
165
+ */
166
+
167
+ register(...args) {
168
+ return this.setGenerator(...args);
169
+ }
170
+
171
+ /**
172
+ * Get and invoke generator `name`, or register generator `name` with
173
+ * the given `val` and `options`, then invoke and return the generator
174
+ * instance. This method differs from `.register`, which lazily invokes
175
+ * generator functions when `.generate` is called.
176
+ *
177
+ * ```js
178
+ * app.generator('foo', function(app, options) {
179
+ * // "app" - private instance created for generator "foo"
180
+ * // "options" - options passed to the generator
181
+ * });
182
+ * ```
183
+ * @name .generator
184
+ * @param {String} `name`
185
+ * @param {Function|Object} `fn` Generator function, instance or filepath.
186
+ * @return {Object} Returns the generator instance or undefined if not resolved.
187
+ * @api public
188
+ */
189
+
190
+ generator(name, options, fn) {
191
+ if (typeof options === 'function') {
192
+ fn = options;
193
+ options = {};
194
+ }
195
+
196
+ if (typeof fn !== 'function') {
197
+ return this.getGenerator(name, options);
198
+ }
199
+
200
+ this.setGenerator(name, options, fn);
201
+ return this.getGenerator(name);
202
+ }
203
+
204
+ /**
205
+ * Store a generator by file path or instance with the given
206
+ * `name` and `options`.
207
+ *
208
+ * ```js
209
+ * app.setGenerator('foo', function(app, options) {
210
+ * // "app" - new instance of Generator created for generator "foo"
211
+ * // "options" - options passed to the generator
212
+ * });
213
+ * ```
214
+ * @name .setGenerator
215
+ * @param {String} `name` The generator's name
216
+ * @param {Object|Function|String} `options` or generator
217
+ * @param {Object|Function|String} `generator` Generator function, instance or filepath.
218
+ * @return {Object} Returns the generator instance.
219
+ * @api public
220
+ */
221
+
222
+ setGenerator(name, options, fn) {
223
+ const generator = this.toGenerator(name, options, fn);
224
+ const alias = generator.alias;
225
+ this.base.namespaces.set(`${this.namespace}.${alias}`, generator);
226
+ this.generators.set(alias, generator);
227
+ return this;
228
+ }
229
+
230
+ /**
231
+ * Get generator `name` from `app.generators`, same as [findGenerator], but also invokes
232
+ * the returned generator with the current instance. Dot-notation may be used for getting
233
+ * sub-generators.
234
+ *
235
+ * ```js
236
+ * const foo = app.getGenerator('foo');
237
+ *
238
+ * // get a sub-generator
239
+ * const baz = app.getGenerator('foo.bar.baz');
240
+ * ```
241
+ * @name .getGenerator
242
+ * @param {String} `name` Generator name.
243
+ * @return {Object|undefined} Returns the generator instance or undefined.
244
+ * @api public
245
+ */
246
+
247
+ getGenerator(name, options) {
248
+ const fn = this.findGenerator(name);
249
+
250
+ if (!this.isGenerator(fn)) {
251
+ throw this.formatError(name);
252
+ }
253
+
254
+ if (typeof fn === 'function') {
255
+ // return the generator instance if one has already created,
256
+ // otherwise call the generator function with the parent instance
257
+ return fn.instance || fn.call(fn.parent, options);
258
+ }
259
+ return fn;
260
+ }
261
+
262
+ /**
263
+ * Find generator `name`, by first searching the cache, then searching the
264
+ * cache of the `base` generator. Use this to get a generator without invoking it.
265
+ *
266
+ * ```js
267
+ * // search by "alias"
268
+ * const foo = app.findGenerator('foo');
269
+ *
270
+ * // search by "full name"
271
+ * const foo = app.findGenerator('generate-foo');
272
+ * ```
273
+ * @name .findGenerator
274
+ * @param {String} `name`
275
+ * @param {Function} `options` Optionally supply a rename function on `options.toAlias`
276
+ * @return {Object|undefined} Returns the generator instance if found, or undefined.
277
+ * @api public
278
+ */
279
+
280
+ findGenerator(name) {
281
+ if (!name) return null;
282
+ let cached = this.base.namespaces.get(name);
283
+ let names = [];
284
+ let app = this;
285
+
286
+ if (this.isGenerator(cached)) {
287
+ return cached;
288
+ }
289
+
290
+ names = typeof name === 'string'
291
+ ? name.split('.').map(n => this.toAlias(n))
292
+ : name;
293
+
294
+ let key = names.join('.');
295
+
296
+ if (names.length === 1) {
297
+ app = this.generators.get(key);
298
+
299
+ } else {
300
+ do {
301
+ let alias = names.shift();
302
+ let gen = app.generators.get(alias);
303
+
304
+ if (!this.isGenerator(gen)) {
305
+ return null;
306
+ }
307
+
308
+ // only invoke the generator if it's not the last one
309
+ if (names.length) {
310
+ app = gen.instance || app.getGenerator(alias);
311
+ } else {
312
+ app = gen;
313
+ }
314
+
315
+ } while (app && names.length);
316
+ }
317
+
318
+ return this.isGenerator(app) ? app : null;
319
+ }
320
+
321
+ /**
322
+ * Returns true if the given name is a registered generator. Dot-notation may be
323
+ * used to check for sub-generators.
324
+ *
325
+ * ```js
326
+ * console.log(app.hasGenerator('foo'));
327
+ * console.log(app.hasGenerator('foo.bar'));
328
+ * ```
329
+ * @param {String} `name`
330
+ * @return {Boolean}
331
+ * @api public
332
+ */
333
+
334
+ hasGenerator(name) {
335
+ return this.findGenerator(name) != null;
336
+ }
337
+
338
+ /**
339
+ * Run one or more tasks or sub-generators and returns a promise.
340
+ *
341
+ * ```js
342
+ * // run tasks `bar` and `baz` on generator `foo`
343
+ * app.generate('foo', ['bar', 'baz']);
344
+ *
345
+ * // or use shorthand
346
+ * app.generate('foo:bar,baz');
347
+ *
348
+ * // run the `default` task on generator `foo`
349
+ * app.generate('foo');
350
+ *
351
+ * // run the `default` task on the `default` generator, if defined
352
+ * app.generate();
353
+ * ```
354
+ * @name .generate
355
+ * @emits `generate` with the generator `name` and the array of `tasks` that are queued to run.
356
+ * @param {String} `name`
357
+ * @param {String|Array} `tasks`
358
+ * @return {Promise}
359
+ * @api public
360
+ */
361
+
362
+ async generate(...args) {
363
+ let parsed = this.parseTasks(...args);
364
+ let { tasks, missing, options, callback } = parsed;
365
+
366
+ let promise = new Promise(async(resolve, reject) => {
367
+ if (missing.length > 0) {
368
+ reject(new Error('Invalid task(s) or generator(s): ' + missing.join(', ')));
369
+ return;
370
+ }
371
+
372
+ let generator = name => {
373
+ let app = this.hasGenerator(name) ? this.getGenerator(name, options) : this;
374
+ this.emit('generate', app);
375
+ return app;
376
+ };
377
+
378
+ if (options.parallel === true) {
379
+ let pending = [];
380
+ for (let ele of tasks) pending.push(generator(ele.name).build(ele.tasks));
381
+ Promise.all(pending).then(resolve).catch(reject);
382
+ } else {
383
+ for (let ele of tasks) {
384
+ await generator(ele.name).build(ele.tasks).catch(reject);
385
+ }
386
+ resolve();
387
+ }
388
+ });
389
+
390
+ if (typeof callback === 'function') {
391
+ promise.then(() => callback()).catch(callback);
392
+ return;
393
+ }
394
+
395
+ return promise;
396
+ }
397
+
398
+ /**
399
+ * Create a generator alias from the given `name`. By default, `generate-`
400
+ * is stripped from beginning of the generator name.
401
+ *
402
+ * ```js
403
+ * // customize the alias
404
+ * const app = new Generate({ toAlias: require('camel-case') });
405
+ * ```
406
+ * @name .toAlias
407
+ * @param {String} `name`
408
+ * @param {Object} `options`
409
+ * @return {String} Returns the alias.
410
+ * @api public
411
+ */
412
+
413
+ toAlias(name, options) {
414
+ if (typeof options === 'function') {
415
+ return options(name);
416
+ }
417
+ if (options && typeof options.toAlias === 'function') {
418
+ return options.toAlias(name);
419
+ }
420
+ if (typeof this.options.toAlias === 'function') {
421
+ return this.options.toAlias(name);
422
+ }
423
+ return name ? name.replace(/^generate-/, '') : '';
424
+ }
425
+
426
+ /**
427
+ * Returns true if every name in the given array is a registered generator.
428
+ * @name .isGenerators
429
+ * @param {Array} `names`
430
+ * @return {Boolean}
431
+ * @api public
432
+ */
433
+
434
+ isGenerators(names) {
435
+ return names.every(name => this.hasGenerator(name));
436
+ }
437
+
438
+ /**
439
+ * Format task and generator errors.
440
+ * @name .formatError
441
+ * @param {String} `name`
442
+ * @return {Error}
443
+ * @api public
444
+ */
445
+
446
+ formatError(name, type = 'generator', appname = 'generator') {
447
+ let key = this.namespace || 'default';
448
+ let suffix = '.';
449
+
450
+ // if not the base instance, remove the first name segment
451
+ if (this !== this.base) {
452
+ key = key.split('.').slice(1).join('.');
453
+ suffix = ` on ${appname} "${key}"`;
454
+ }
455
+
456
+ let message = `${type} "${name}" is not registered`;
457
+ return new Error(message + suffix);
458
+ }
459
+
460
+ /**
461
+ * Disable inspect. Returns a function to re-enable inspect. Useful for debugging.
462
+ * @name .disableInspect
463
+ * @api public
464
+ */
465
+
466
+ disableInspect() {
467
+ let inspect = this[util.inspect.custom];
468
+ this[util.inspect.custom] = void 0;
469
+
470
+ return () => {
471
+ define(this, util.inspect.custom, inspect);
472
+ };
473
+ }
474
+
475
+ /**
476
+ * Parse task arguments into an array of task configuration objects.
477
+ */
478
+
479
+ parseTasks(...args) {
480
+ return parse(this.options.register)(this, ...args);
481
+ }
482
+
483
+ /**
484
+ * Custom inspect function
485
+ */
486
+
487
+ [util.inspect.custom]() {
488
+ if (typeof this.options.inspectFn === 'function') {
489
+ return this.options.inspectFn(this);
490
+ }
491
+ const names = this.generators ? [...this.generators.keys()].join(', ') : '';
492
+ const tasks = this.tasks ? [...this.tasks.keys()].join(', ') : '';
493
+ return `<Generator "${this.namespace}" tasks: [${tasks}], generators: [${names}]>`;
494
+ }
495
+
496
+ /**
497
+ * Get the first ancestor instance of Composer. Only works if `generator.parent` is
498
+ * defined on child instances.
499
+ * @name .base
500
+ * @getter
501
+ * @api public
502
+ */
503
+
504
+ get base() {
505
+ return this.parent ? this.parent.base : this;
506
+ }
507
+
508
+ /**
509
+ * Get or set the generator name.
510
+ * @name .name
511
+ * @getter
512
+ * @param {String} [name="root"]
513
+ * @return {String}
514
+ * @api public
515
+ */
516
+
517
+ set name(val) {
518
+ define(this, '_name', val);
519
+ }
520
+ get name() {
521
+ return this._name || 'generate';
522
+ }
523
+
524
+ /**
525
+ * Get or set the generator `alias`. By default, the generator alias is created
526
+ * by passing the generator name to the [.toAlias](#toAlias) method.
527
+ * @name .alias
528
+ * @getter
529
+ * @param {String} [alias="generate"]
530
+ * @return {String}
531
+ * @api public
532
+ */
533
+
534
+ set alias(val) {
535
+ define(this, '_alias', val);
536
+ }
537
+ get alias() {
538
+ return this._alias || this.toAlias(this.name, this.options);
539
+ }
540
+
541
+ /**
542
+ * Get the generator namespace. The namespace is created by joining the generator's `alias`
543
+ * to the alias of each ancestor generator.
544
+ * @name .namespace
545
+ * @getter
546
+ * @param {String} [namespace="root"]
547
+ * @return {String}
548
+ * @api public
549
+ */
550
+
551
+ get namespace() {
552
+ return this.parent ? this.parent.namespace + '.' + this.alias : this.alias;
553
+ }
554
+
555
+ /**
556
+ * Get the depth of a generator - useful for debugging. The root generator
557
+ * has a depth of `0`, sub-generators add `1` for each level of nesting.
558
+ * @name .depth
559
+ * @getter
560
+ * @return {Number}
561
+ * @api public
562
+ */
563
+
564
+ get depth() {
565
+ return this.parent ? this.parent.depth + 1 : 0;
566
+ }
567
+
568
+ /**
569
+ * Static method that returns a function for parsing task arguments.
570
+ * @name Composer#parse
571
+ * @param {Function} `register` Function that receives a name of a task or generator that cannot be found by the parse function. This allows the `register` function to dynamically register tasks or generators.
572
+ * @return {Function} Returns a function for parsing task args.
573
+ * @api public
574
+ * @static
575
+ */
576
+
577
+ static parseTasks(register) {
578
+ return parse(register);
579
+ }
580
+
581
+ /**
582
+ * Static method that returns true if the given `val` is an instance of Generate.
583
+ * @name Composer#isGenerator
584
+ * @param {Object} `val`
585
+ * @return {Boolean}
586
+ * @api public
587
+ * @static
588
+ */
589
+
590
+ static isGenerator(val) {
591
+ return val instanceof this || (typeof val === 'function' && val.isGenerator === true);
592
+ }
593
+
594
+ /**
595
+ * Static method for creating a custom Composer class with the given `Emitter.
596
+ * @name Composer#create
597
+ * @param {Function} `Emitter`
598
+ * @return {Class} Returns the custom class.
599
+ * @static
600
+ * @api public
601
+ */
602
+
603
+ static create(Emitter) {
604
+ return factory(Emitter);
605
+ }
606
+
607
+ /**
608
+ * Static getter for getting the Tasks class with the same `Emitter` class as Composer.
609
+ * @name Composer#Tasks
610
+ * @param {Function} `Emitter`
611
+ * @return {Class} Returns the Tasks class.
612
+ * @getter
613
+ * @static
614
+ * @api public
615
+ */
616
+
617
+ static get Tasks() {
618
+ return Tasks.create(Emitter);
619
+ }
620
+
621
+ /**
622
+ * Static getter for getting the `Task` class.
623
+ *
624
+ * ```js
625
+ * const { Task } = require('composer');
626
+ * ```
627
+ * @name Composer#Task
628
+ * @getter
629
+ * @static
630
+ * @api public
631
+ */
632
+
633
+ static get Task() {
634
+ return Task;
635
+ }
636
+ }
637
+
638
+ return Generator;
639
+ };
640
+
641
+ /**
642
+ * Expose `factory` function
643
+ */
644
+
645
+ module.exports = factory();
lets-encrypt/node_modules/composer/lib/parse.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ const { isObject } = require('./utils');
4
+ const noop = () => {};
5
+
6
+ /**
7
+ * Parse task expressions from the argv._ (splat) array
8
+ */
9
+
10
+ module.exports = (register = noop) => {
11
+ return function parse(app, ...rest) {
12
+ if (rest.length === 1 && Array.isArray(rest[0])) rest = rest[0];
13
+ let options = rest.find(val => isObject(val) && val.isTask !== true);
14
+ rest = rest.filter(val => val !== options);
15
+
16
+ let callback = rest.find(val => typeof val === 'function');
17
+ let args = rest.filter(val => val !== options && val !== callback);
18
+ let opts = { ...app.options, ...options };
19
+
20
+ if (typeof args[0] === 'string' && Array.isArray(args[1])) {
21
+ args = [args[0] + ':' + args[1].join(',')];
22
+ }
23
+
24
+ args = args.join(' ').split(' ');
25
+ let missing = [];
26
+ let result = [];
27
+
28
+ for (const arg of args) {
29
+ let segs = arg.split(':');
30
+ if (segs.length > 2) {
31
+ throw new SyntaxError('spaces must be used to separate multiple generator names');
32
+ }
33
+
34
+ let tasks = segs[1] ? segs[1].split(',') : segs[0].split(',');
35
+ let name = segs[1] ? segs[0] : null;
36
+ let task = { name: null, tasks: [] };
37
+
38
+ tasks.forEach(val => {
39
+ if (!app.tasks.has(val) && app.hasGenerator(name + '.' + val)) {
40
+ result.push({ name: [name, val].join('.'), tasks: ['default'] });
41
+ tasks = tasks.filter(v => v !== val);
42
+ }
43
+ });
44
+
45
+ if (segs.length === 2 && tasks.length) {
46
+ task.name = name;
47
+ task.tasks = tasks;
48
+ result.push(task);
49
+ continue;
50
+ }
51
+
52
+ for (let key of tasks) {
53
+ if ((!app.tasks.has(key) || app.taskStack.has(key)) && app.hasGenerator(key)) {
54
+ if (app.name === 'default' && !key.startsWith('default.')) {
55
+ key = `default.${key}`;
56
+ }
57
+ result.push({ name: key, tasks: ['default' ]});
58
+ } else if (key && app.tasks.has(key)) {
59
+ task.name = 'default';
60
+ task.tasks.push(key);
61
+ } else if (key) {
62
+ missing.push(key);
63
+ }
64
+ }
65
+
66
+ if (task.name) {
67
+ result.push(task);
68
+ }
69
+ }
70
+
71
+ if (rest.length && !result.length && app.name !== 'default') {
72
+ if (app.hasGenerator('default')) {
73
+ return parse(app.getGenerator('default'), ...rest);
74
+ }
75
+ }
76
+
77
+ if (!rest.length && !result.length && !missing.length) {
78
+ result = [{ name: 'default', tasks: ['default'] }];
79
+ }
80
+
81
+ if (missing.length && register(missing) === true) {
82
+ return parse(app, ...rest);
83
+ }
84
+
85
+ register(result.map(task => task.name));
86
+
87
+ return { options: opts, callback, tasks: result, missing };
88
+ };
89
+ };
lets-encrypt/node_modules/composer/lib/task.js ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ const util = require('util');
4
+ const Events = require('events');
5
+ const Timer = require('./timer');
6
+ const { define, noop } = require('./utils');
7
+
8
+ class Task extends Events {
9
+ constructor(task = {}) {
10
+ if (typeof task.name !== 'string') {
11
+ throw new TypeError('expected task name to be a string');
12
+ }
13
+ super();
14
+ define(this, 'isTask', true);
15
+ define(this, 'app', task.app);
16
+ this.name = task.name;
17
+ this.status = 'pending';
18
+ this.options = Object.assign({ deps: [] }, task.options);
19
+ this.callback = task.callback || noop;
20
+ this.deps = [...task.deps || [], ...this.options.deps];
21
+ this.time = new Timer();
22
+ if (this.setMaxListeners) {
23
+ this.setMaxListeners(0);
24
+ }
25
+ }
26
+
27
+ [util.inspect.custom]() {
28
+ return `<Task "${this.name}" deps: [${this.deps.join(', ')}]>`;
29
+ }
30
+
31
+ run(options) {
32
+ let finished = false;
33
+ let orig = Object.assign({}, this.options);
34
+ this.options = Object.assign({}, this.options, options);
35
+ this.status = 'preparing';
36
+ this.emit('preparing', this);
37
+
38
+ if (this.skip(options)) {
39
+ return () => Promise.resolve(null);
40
+ }
41
+
42
+ this.time = new Timer();
43
+ this.time.start();
44
+ this.status = 'starting';
45
+ this.emit('starting', this);
46
+
47
+ return () => new Promise(async(resolve, reject) => {
48
+ const finish = (err, value) => {
49
+ if (finished) return;
50
+ finished = true;
51
+ try {
52
+ this.options = orig;
53
+ this.time.end();
54
+ this.status = 'finished';
55
+ this.emit('finished', this);
56
+ if (err) {
57
+ define(err, 'task', this);
58
+ reject(err);
59
+ this.emit('error', err);
60
+ } else {
61
+ resolve(value);
62
+ }
63
+ } catch (err) {
64
+ reject(err);
65
+ }
66
+ };
67
+
68
+ try {
69
+ if (typeof this.callback !== 'function') {
70
+ finish();
71
+ return;
72
+ }
73
+
74
+ let res = this.callback.call(this, finish);
75
+ if (res instanceof Promise) {
76
+ let val = await res;
77
+ if (val) res = val;
78
+ }
79
+
80
+ if (isEmitter(res)) {
81
+ res.on('error', finish);
82
+ res.on('finish', finish);
83
+ res.on('end', finish);
84
+ return;
85
+ }
86
+
87
+ if (this.callback.length === 0) {
88
+ if (res && res.then) {
89
+ res.then(() => finish());
90
+ } else {
91
+ finish(null, res);
92
+ }
93
+ }
94
+
95
+ } catch (err) {
96
+ finish(err);
97
+ }
98
+ });
99
+ }
100
+
101
+ skip(options) {
102
+ let app = this.app || {};
103
+ let opts = Object.assign({}, app.options, this.options, options);
104
+
105
+ if (opts.run === false) {
106
+ return true;
107
+ }
108
+
109
+ if (Array.isArray(opts.skip)) {
110
+ return opts.skip.includes(this.name);
111
+ }
112
+
113
+ switch (typeof opts.skip) {
114
+ case 'boolean':
115
+ return opts.skip === true;
116
+ case 'function':
117
+ return opts.skip(this) === true;
118
+ case 'string':
119
+ return opts.skip === this.name;
120
+ default: {
121
+ return false;
122
+ }
123
+ }
124
+ }
125
+ }
126
+
127
+ function isEmitter(val) {
128
+ return val && (typeof val.on === 'function' || typeof val.pipe === 'function');
129
+ }
130
+
131
+ module.exports = Task;
lets-encrypt/node_modules/composer/lib/tasks.js ADDED
@@ -0,0 +1,409 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ const Task = require('./task');
4
+ const Timer = require('./timer');
5
+ const Events = require('events');
6
+ const { createOptions, flatten, noop } = require('./utils');
7
+
8
+ /**
9
+ * Factory for creating a custom `Tasks` class that extends the
10
+ * given `Emitter`. Or, simply call the factory function to use
11
+ * the built-in emitter.
12
+ *
13
+ * ```js
14
+ * // custom emitter
15
+ * const Emitter = require('events');
16
+ * const Tasks = require('composer/lib/tasks')(Emitter);
17
+ * // built-in emitter
18
+ * const Tasks = require('composer/lib/tasks')();
19
+ * const composer = new Tasks();
20
+ * ```
21
+ * @name .factory
22
+ * @param {function} `Emitter` Event emitter.
23
+ * @return {Class} Returns a custom `Tasks` class.
24
+ * @api public
25
+ */
26
+
27
+ const factory = (Emitter = Events) => {
28
+
29
+ /**
30
+ * Create an instance of `Tasks` with the given `options`.
31
+ *
32
+ * ```js
33
+ * const Tasks = require('composer').Tasks;
34
+ * const composer = new Tasks();
35
+ * ```
36
+ * @class
37
+ * @name Tasks
38
+ * @param {object} `options`
39
+ * @api public
40
+ */
41
+
42
+ class Tasks extends Emitter {
43
+ constructor(options = {}) {
44
+ super(!Emitter.name.includes('Emitter') ? options : null);
45
+ this.options = options;
46
+ this.taskStack = new Map();
47
+ this.tasks = new Map();
48
+ this.taskId = 0;
49
+
50
+ if (this.off === void 0 && typeof this.removeListener === 'function') {
51
+ this.off = this.removeListener.bind(this);
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Define a task. Tasks run asynchronously, either in series (by default) or parallel
57
+ * (when `options.parallel` is true). In order for the build to determine when a task is
58
+ * complete, _one of the following_ things must happen: 1) the callback must be called, 2) a
59
+ * promise must be returned, or 3) a stream must be returned. Inside tasks, the "this"
60
+ * object is a composer Task instance created for each task with useful properties like
61
+ * the task name, options and timing information, which can be useful for logging, etc.
62
+ *
63
+ * ```js
64
+ * // 1. callback
65
+ * app.task('default', cb => {
66
+ * // do stuff
67
+ * cb();
68
+ * });
69
+ * // 2. promise
70
+ * app.task('default', () => {
71
+ * return Promise.resolve(null);
72
+ * });
73
+ * // 3. stream (using vinyl-fs or your stream of choice)
74
+ * app.task('default', function() {
75
+ * return vfs.src('foo/*.js');
76
+ * });
77
+ * ```
78
+ * @name .task
79
+ * @param {String} `name` The task name.
80
+ * @param {Object|Array|String|Function} `deps` Any of the following: task dependencies, callback(s), or options object, defined in any order.
81
+ * @param {Function} `callback` (optional) If the last argument is a function, it will be called after all of the task's dependencies have been run.
82
+ * @return {undefined}
83
+ * @api public
84
+ */
85
+
86
+ task(name, ...rest) {
87
+ if (typeof name !== 'string') {
88
+ throw new TypeError('expected task "name" to be a string');
89
+ }
90
+ const { options, tasks } = createOptions(this, false, ...rest);
91
+ const callback = typeof tasks[tasks.length - 1] === 'function' ? tasks.pop() : noop;
92
+ return this.setTask(name, options, tasks, callback);
93
+ }
94
+
95
+ /**
96
+ * Set a task on `app.tasks`
97
+ * @name .setTask
98
+ * @param {string} name Task name
99
+ * @param {object} name Task options
100
+ * @param {object|array|string|function} `deps` Task dependencies
101
+ * @param {Function} `callback` (optional) Final callback function to call after all task dependencies have been run.
102
+ * @return {object} Returns the instance.
103
+ */
104
+
105
+ setTask(name, options = {}, deps = [], callback) {
106
+ const task = new Task({ name, options, deps, callback, app: this });
107
+ const emit = (key = 'task') => this.emit(key, task);
108
+ task.on('error', this.emit.bind(this, 'error'));
109
+ task.on('preparing', () => emit('task-preparing'));
110
+ task.on('starting', task => {
111
+ this.taskStack.set(task.name, task);
112
+ emit();
113
+ });
114
+ task.on('finished', task => {
115
+ this.taskStack.delete(task.name);
116
+ emit();
117
+ });
118
+ this.tasks.set(name, task);
119
+ task.status = 'registered';
120
+ emit('task-registered');
121
+ return this;
122
+ }
123
+
124
+ /**
125
+ * Get a task from `app.tasks`.
126
+ * @name .getTask
127
+ * @param {string} name
128
+ * @return {object} Returns the task object.
129
+ */
130
+
131
+ getTask(name) {
132
+ if (!this.tasks.has(name)) {
133
+ throw this.formatError(name, 'task');
134
+ }
135
+ return this.tasks.get(name);
136
+ }
137
+
138
+ /**
139
+ * Returns true if all values in the array are registered tasks.
140
+ * @name .isTasks
141
+ * @param {array} tasks
142
+ * @return {boolean}
143
+ */
144
+
145
+ isTasks(arr) {
146
+ return Array.isArray(arr) && arr.every(name => this.tasks.has(name));
147
+ }
148
+
149
+ /**
150
+ * Create an array of tasks to run by resolving registered tasks from the values
151
+ * in the given array.
152
+ * @name .expandTasks
153
+ * @param {...[string|function|glob]} tasks
154
+ * @return {array}
155
+ */
156
+
157
+ expandTasks(...args) {
158
+ let vals = flatten(args).filter(Boolean);
159
+ let keys = [...this.tasks.keys()];
160
+ let tasks = [];
161
+
162
+ for (let task of vals) {
163
+ if (typeof task === 'function') {
164
+ let name = `task-${this.taskId++}`;
165
+ this.task(name, task);
166
+ tasks.push(name);
167
+ continue;
168
+ }
169
+
170
+ if (typeof task === 'string') {
171
+ if (/\*/.test(task)) {
172
+ let matches = match(keys, task);
173
+ if (matches.length === 0) {
174
+ throw new Error(`glob "${task}" does not match any registered tasks`);
175
+ }
176
+ tasks.push.apply(tasks, matches);
177
+ continue;
178
+ }
179
+
180
+ tasks.push(task);
181
+ continue;
182
+ }
183
+
184
+ let msg = 'expected task dependency to be a string or function, but got: ';
185
+ throw new TypeError(msg + typeof task);
186
+ }
187
+ return tasks;
188
+ }
189
+
190
+ /**
191
+ * Run one or more tasks.
192
+ *
193
+ * ```js
194
+ * const build = app.series(['foo', 'bar', 'baz']);
195
+ * // promise
196
+ * build().then(console.log).catch(console.error);
197
+ * // or callback
198
+ * build(function() {
199
+ * if (err) return console.error(err);
200
+ * });
201
+ * ```
202
+ * @name .build
203
+ * @param {object|array|string|function} `tasks` One or more tasks to run, options, or callback function. If no tasks are defined, the default task is automatically run.
204
+ * @param {function} `callback` (optional)
205
+ * @return {undefined}
206
+ * @api public
207
+ */
208
+
209
+ async build(...args) {
210
+ let state = { status: 'starting', time: new Timer(), app: this };
211
+ state.time.start();
212
+ this.emit('build', state);
213
+
214
+ args = flatten(args);
215
+ let cb = typeof args[args.length - 1] === 'function' ? args.pop() : null;
216
+
217
+ let { options, tasks } = createOptions(this, true, ...args);
218
+ if (!tasks.length) tasks = ['default'];
219
+
220
+ let each = options.parallel ? this.parallel : this.series;
221
+ let build = each.call(this, options, ...tasks);
222
+ let promise = build()
223
+ .then(() => {
224
+ state.time.end();
225
+ state.status = 'finished';
226
+ this.emit('build', state);
227
+ });
228
+
229
+ return resolveBuild(promise, cb);
230
+ }
231
+
232
+ /**
233
+ * Compose a function to run the given tasks in series.
234
+ *
235
+ * ```js
236
+ * const build = app.series(['foo', 'bar', 'baz']);
237
+ * // promise
238
+ * build().then(console.log).catch(console.error);
239
+ * // or callback
240
+ * build(function() {
241
+ * if (err) return console.error(err);
242
+ * });
243
+ * ```
244
+ * @name .series
245
+ * @param {object|array|string|function} `tasks` Tasks to run, options, or callback function. If no tasks are defined, the `default` task is automatically run, if one exists.
246
+ * @param {function} `callback` (optional)
247
+ * @return {promise|undefined} Returns a promise if no callback is passed.
248
+ * @api public
249
+ */
250
+
251
+ series(...args) {
252
+ let stack = new Set();
253
+ let compose = this.iterator('series', async(tasks, options, resolve) => {
254
+ for (let ele of tasks) {
255
+ let task = this.getTask(ele);
256
+ task.series = true;
257
+
258
+ if (task.skip(options) || stack.has(task)) {
259
+ continue;
260
+ }
261
+
262
+ task.once('finished', () => stack.delete(task));
263
+ task.once('starting', () => stack.add(task));
264
+ let run = task.run(options);
265
+
266
+ if (task.deps.length) {
267
+ let opts = Object.assign({}, options, task.options);
268
+ let each = opts.parallel ? this.parallel : this.series;
269
+ let build = each.call(this, ...task.deps);
270
+ await build();
271
+ }
272
+
273
+ await run();
274
+ }
275
+
276
+ resolve();
277
+ });
278
+
279
+ return compose(...args);
280
+ }
281
+
282
+ /**
283
+ * Compose a function to run the given tasks in parallel.
284
+ *
285
+ * ```js
286
+ * // call the returned function to start the build
287
+ * const build = app.parallel(['foo', 'bar', 'baz']);
288
+ * // promise
289
+ * build().then(console.log).catch(console.error);
290
+ * // callback
291
+ * build(function() {
292
+ * if (err) return console.error(err);
293
+ * });
294
+ * // example task usage
295
+ * app.task('default', build);
296
+ * ```
297
+ * @name .parallel
298
+ * @param {object|array|string|function} `tasks` Tasks to run, options, or callback function. If no tasks are defined, the `default` task is automatically run, if one exists.
299
+ * @param {function} `callback` (optional)
300
+ * @return {promise|undefined} Returns a promise if no callback is passed.
301
+ * @api public
302
+ */
303
+
304
+ parallel(...args) {
305
+ let stack = new Set();
306
+ let compose = this.iterator('parallel', (tasks, options, resolve) => {
307
+ let pending = [];
308
+
309
+ for (let ele of tasks) {
310
+ let task = this.getTask(ele);
311
+ task.parallel = true;
312
+
313
+ if (task.skip(options) || stack.has(task)) {
314
+ continue;
315
+ }
316
+
317
+ task.once('finished', () => stack.delete(task));
318
+ task.once('starting', () => stack.add(task));
319
+ let run = task.run(options);
320
+
321
+ if (task.deps.length) {
322
+ let opts = Object.assign({}, options, task.options);
323
+ let each = opts.parallel ? this.parallel : this.series;
324
+ let build = each.call(this, ...task.deps);
325
+ pending.push(build().then(() => run()));
326
+ } else {
327
+ pending.push(run());
328
+ }
329
+ }
330
+
331
+ resolve(Promise.all(pending));
332
+ });
333
+
334
+ return compose(...args);
335
+ }
336
+
337
+ /**
338
+ * Create an async iterator function that ensures that either a promise is
339
+ * returned or the user-provided callback is called.
340
+ * @param {function} `fn` Function to invoke inside the promise.
341
+ * @return {function}
342
+ */
343
+
344
+ iterator(type, fn) {
345
+ return (...args) => {
346
+ let { options, tasks } = createOptions(this, true, ...args);
347
+
348
+ return cb => {
349
+ let promise = new Promise(async(resolve, reject) => {
350
+ if (tasks.length === 0) {
351
+ resolve();
352
+ return;
353
+ }
354
+
355
+ try {
356
+ let p = fn(tasks, options, resolve);
357
+ if (type === 'series') await p;
358
+ } catch (err) {
359
+ reject(err);
360
+ }
361
+ });
362
+
363
+ return resolveBuild(promise, cb);
364
+ };
365
+ };
366
+ }
367
+
368
+ /**
369
+ * Format task and generator errors.
370
+ * @name .formatError
371
+ * @param {String} `name`
372
+ * @return {Error}
373
+ */
374
+
375
+ formatError(name) {
376
+ return new Error(`task "${name}" is not registered`);
377
+ }
378
+
379
+ /**
380
+ * Static method for creating a custom Tasks class with the given `Emitter.
381
+ * @name .create
382
+ * @param {Function} `Emitter`
383
+ * @return {Class} Returns the custom class.
384
+ * @api public
385
+ * @static
386
+ */
387
+
388
+ static create(Emitter) {
389
+ return factory(Emitter);
390
+ }
391
+ }
392
+ return Tasks;
393
+ };
394
+
395
+ function resolveBuild(promise, cb) {
396
+ if (typeof cb === 'function') {
397
+ promise.then(val => cb(null, val)).catch(cb);
398
+ } else {
399
+ return promise;
400
+ }
401
+ }
402
+
403
+ function match(keys, pattern) {
404
+ let chars = [...pattern].map(ch => ({ '*': '.*?', '.': '\\.' }[ch] || ch));
405
+ let regex = new RegExp(chars.join(''));
406
+ return keys.filter(key => regex.test(key));
407
+ }
408
+
409
+ module.exports = factory();
lets-encrypt/node_modules/composer/lib/timer.js ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ const { nano } = require('./utils');
4
+
5
+ class Timer {
6
+ constructor() {
7
+ this.date = {};
8
+ this.hr = {};
9
+ }
10
+
11
+ start() {
12
+ this.date.start = new Date();
13
+ this.hr.start = process.hrtime();
14
+ return this;
15
+ }
16
+
17
+ end() {
18
+ this.date.end = new Date();
19
+ this.hr.end = process.hrtime();
20
+ this.hr.duration = process.hrtime(this.hr.start);
21
+ return this;
22
+ }
23
+
24
+ get diff() {
25
+ return nano(this.hr.end) - nano(this.hr.start);
26
+ }
27
+
28
+ get duration() {
29
+ return this.hr.duration ? require('pretty-time')(this.hr.duration) : '';
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Expose `Timer`
35
+ */
36
+
37
+ module.exports = Timer;
lets-encrypt/node_modules/composer/lib/utils.js ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ /**
4
+ * Get hr time in nanoseconds
5
+ */
6
+
7
+ const nano = time => +time[0] * 1e9 + +time[1];
8
+
9
+ /**
10
+ * Flatten an array
11
+ */
12
+
13
+ const flatten = arr => [].concat.apply([], arr);
14
+
15
+ /**
16
+ * Return true if `val` is an object
17
+ */
18
+
19
+ const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
20
+
21
+ /**
22
+ * Create an options object from the given arguments.
23
+ * @param {object} `app`
24
+ * @param {...[function|string|object]} `rest`
25
+ * @return {object}
26
+ */
27
+
28
+ const createOptions = (app, expand, ...rest) => {
29
+ const args = flatten(rest);
30
+ const config = args.find(val => isObject(val) && !val.isTask) || {};
31
+ const options = Object.assign({}, app.options, config);
32
+ const tasks = expand === true
33
+ ? app.expandTasks(args.filter(val => val && val !== config))
34
+ : args.filter(val => val && val !== config);
35
+ return { tasks, options };
36
+ };
37
+
38
+ /**
39
+ * Noop for tasks
40
+ */
41
+
42
+ const noop = cb => cb();
43
+
44
+ /**
45
+ * Create a non-enumerable property on `obj`
46
+ */
47
+
48
+ const define = (obj, key, value) => {
49
+ Reflect.defineProperty(obj, key, {
50
+ configurable: true,
51
+ enumerable: false,
52
+ writable: true,
53
+ value
54
+ });
55
+ };
56
+
57
+ /**
58
+ * Expose "utils"
59
+ */
60
+
61
+ module.exports = {
62
+ createOptions,
63
+ define,
64
+ flatten,
65
+ isObject,
66
+ nano,
67
+ noop
68
+ };
lets-encrypt/node_modules/composer/package.json ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from": "composer",
3
+ "_id": "composer@4.1.0",
4
+ "_inBundle": false,
5
+ "_integrity": "sha512-qIIoNYjwFHrQFUdB8kD3pZs30+JeYK9149EpOYr/NVrii00KMO31IonzZMeRSU4qazyWZpEgVzkBmQ6VFWxedA==",
6
+ "_location": "/composer",
7
+ "_phantomChildren": {},
8
+ "_requested": {
9
+ "type": "tag",
10
+ "registry": true,
11
+ "raw": "composer",
12
+ "name": "composer",
13
+ "escapedName": "composer",
14
+ "rawSpec": "",
15
+ "saveSpec": null,
16
+ "fetchSpec": "latest"
17
+ },
18
+ "_requiredBy": [
19
+ "#USER",
20
+ "/"
21
+ ],
22
+ "_resolved": "https://registry.npmjs.org/composer/-/composer-4.1.0.tgz",
23
+ "_shasum": "d8b610a862b0a950aa29e760cec8520d903a051c",
24
+ "_spec": "composer",
25
+ "_where": "/Users/rlankhorst/Sites/localhost/reallysimplessl/wp-content/plugins/really-simple-ssl/lets-encrypt",
26
+ "author": {
27
+ "name": "Brian Woodward",
28
+ "url": "https://github.com/doowb"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/doowb/composer/issues"
32
+ },
33
+ "bundleDependencies": false,
34
+ "contributors": [
35
+ {
36
+ "name": "Brian Woodward",
37
+ "url": "https://twitter.com/doowb"
38
+ },
39
+ {
40
+ "name": "Jon Schlinkert",
41
+ "url": "http://twitter.com/jonschlinkert"
42
+ }
43
+ ],
44
+ "dependencies": {
45
+ "pretty-time": "^1.1.0",
46
+ "use": "^3.1.1"
47
+ },
48
+ "deprecated": false,
49
+ "description": "Run and compose async tasks. Easily define groups of tasks to run in series or parallel.",
50
+ "devDependencies": {
51
+ "gulp-format-md": "^1.0.0",
52
+ "minimist": "^1.2.0",
53
+ "mocha": "^5.2.0",
54
+ "through2": "^2.0.3"
55
+ },
56
+ "engines": {
57
+ "node": ">=8"
58
+ },
59
+ "files": [
60
+ "index.js",
61
+ "lib"
62
+ ],
63
+ "homepage": "https://github.com/doowb/composer",
64
+ "keywords": [
65
+ "async",
66
+ "await",
67
+ "build",
68
+ "build-system",
69
+ "compose",
70
+ "composer",
71
+ "composition",
72
+ "control",
73
+ "flow",
74
+ "run",
75
+ "system",
76
+ "task",
77
+ "workflow"
78
+ ],
79
+ "license": "MIT",
80
+ "main": "index.js",
81
+ "name": "composer",
82
+ "repository": {
83
+ "type": "git",
84
+ "url": "git+https://github.com/doowb/composer.git"
85
+ },
86
+ "scripts": {
87
+ "test": "mocha"
88
+ },
89
+ "verb": {
90
+ "toc": true,
91
+ "layout": "default",
92
+ "data": {
93
+ "author": {
94
+ "linkedin": "woodwardbrian",
95
+ "twitter": "doowb"
96
+ }
97
+ },
98
+ "tasks": [
99
+ "readme"
100
+ ],
101
+ "plugins": [
102
+ "gulp-format-md"
103
+ ],
104
+ "related": {
105
+ "list": [
106
+ "enquirer",
107
+ "assemble",
108
+ "generate",
109
+ "update",
110
+ "verb"
111
+ ]
112
+ },
113
+ "lint": {
114
+ "reflinks": true
115
+ }
116
+ },
117
+ "version": "4.1.0"
118
+ }
lets-encrypt/node_modules/pretty-time/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-present, Jon Schlinkert.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
lets-encrypt/node_modules/pretty-time/README.md ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # pretty-time [![NPM version](https://img.shields.io/npm/v/pretty-time.svg?style=flat)](https://www.npmjs.com/package/pretty-time) [![NPM monthly downloads](https://img.shields.io/npm/dm/pretty-time.svg?style=flat)](https://npmjs.org/package/pretty-time) [![NPM total downloads](https://img.shields.io/npm/dt/pretty-time.svg?style=flat)](https://npmjs.org/package/pretty-time) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/pretty-time.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/pretty-time)
2
+
3
+ > Easily format the time from node.js `process.hrtime`. Works with timescales ranging from weeks to nanoseconds.
4
+
5
+ Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
6
+
7
+ ## Install
8
+
9
+ Install with [npm](https://www.npmjs.com/):
10
+
11
+ ```sh
12
+ $ npm install --save pretty-time
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```js
18
+ var pretty = require('pretty-time');
19
+
20
+ var start = process.hrtime();
21
+ var time = process.hrtime(start);
22
+ console.log(pretty(time));
23
+ //=> 3μs
24
+ ```
25
+
26
+ ## API
27
+
28
+ By default, when no time increment is given as the second argument, the closest timescale is used (e.g. _most granular without being less than zero_).
29
+
30
+ **Examples:**
31
+
32
+ ```js
33
+ pretty([1200708, 795428088]);
34
+ //=> '2w'
35
+
36
+ pretty([800708, 795428088]);
37
+ //=> '1w'
38
+
39
+ pretty([400708, 795428088]);
40
+ //=> '5d'
41
+
42
+ pretty([70708, 795428088]);
43
+ //=> '20h'
44
+
45
+ pretty([12708, 795428088]);
46
+ //=> '4h'
47
+
48
+ pretty([3708, 795428088]);
49
+ //=> '1h'
50
+
51
+ pretty([208, 795428088]);
52
+ //=> '3m'
53
+
54
+ pretty([20, 795428088]);
55
+ //=> '21s'
56
+
57
+ pretty([0, 795428088]);
58
+ //=> '795ms'
59
+
60
+ pretty([0, 000428088]);
61
+ //=> '428μs'
62
+
63
+ pretty([0, 000000088]);
64
+ //=> '88ns'
65
+
66
+ pretty([0, 000000018]);
67
+ //=> '18ns'
68
+ ```
69
+
70
+ ### Minimum time increment
71
+
72
+ _(All of the following examples use `[6740, 795428088]` as the hrtime array.)_
73
+
74
+ This value is passed as the second argument and determines how granular to make the time.
75
+
76
+ **Examples**
77
+
78
+ ```js
79
+ pretty(time, 'h');
80
+ //=> '2h'
81
+
82
+ pretty(time, 'm');
83
+ //=> '1h 52m'
84
+
85
+ pretty(time, 's');
86
+ //=> '1h 52m 21s'
87
+ ```
88
+
89
+ **Valid time increments**
90
+
91
+ Any of the following may be used:
92
+
93
+ * `ns` | `nano` | `nanosecond` | `nanoseconds`
94
+ * `μs` | `micro` | `microsecond` | `microseconds`
95
+ * `ms` | `milli` | `millisecond` | `milliseconds`
96
+ * `s` | `sec` | `second` | `seconds`
97
+ * `m` | `min` | `minute` | `minutes`
98
+ * `h` | `hr` | `hour` | `hours`
99
+ * `d` | `day` | `days`
100
+ * `w` | `wk` | `week` | `weeks`
101
+
102
+ ## About
103
+
104
+ <details>
105
+ <summary><strong>Contributing</strong></summary>
106
+
107
+ Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
108
+
109
+ </details>
110
+
111
+ <details>
112
+ <summary><strong>Running Tests</strong></summary>
113
+
114
+ Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
115
+
116
+ ```sh
117
+ $ npm install && npm test
118
+ ```
119
+
120
+ </details>
121
+
122
+ <details>
123
+ <summary><strong>Building docs</strong></summary>
124
+
125
+ _(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
126
+
127
+ To generate the readme, run the following command:
128
+
129
+ ```sh
130
+ $ npm install -g verbose/verb#dev verb-generate-readme && verb
131
+ ```
132
+
133
+ </details>
134
+
135
+ ### Related projects
136
+
137
+ You might also be interested in these projects:
138
+
139
+ * [o-clock](https://www.npmjs.com/package/o-clock): Simple javascript utility for displaying the time in 12-hour clock format. | [homepage](https://github.com/jonschlinkert/o-clock "Simple javascript utility for displaying the time in 12-hour clock format.")
140
+ * [seconds](https://www.npmjs.com/package/seconds): Get the number of seconds for a minute, hour, day and week. | [homepage](https://github.com/jonschlinkert/seconds "Get the number of seconds for a minute, hour, day and week.")
141
+ * [time-stamp](https://www.npmjs.com/package/time-stamp): Get a formatted timestamp. | [homepage](https://github.com/jonschlinkert/time-stamp "Get a formatted timestamp.")
142
+ * [timescale](https://www.npmjs.com/package/timescale): Convert from one time scale to another. Nanosecond is the most atomic unit, week is… [more](https://github.com/jonschlinkert/timescale) | [homepage](https://github.com/jonschlinkert/timescale "Convert from one time scale to another. Nanosecond is the most atomic unit, week is the largest unit.")
143
+ * [week](https://www.npmjs.com/package/week): Get the current week number. | [homepage](https://github.com/datetime/week "Get the current week number.")
144
+ * [weekday](https://www.npmjs.com/package/weekday): Get the name and number of the current weekday. Or get the name of the… [more](https://github.com/datetime/weekday) | [homepage](https://github.com/datetime/weekday "Get the name and number of the current weekday. Or get the name of the weekday for a given number.")
145
+ * [year](https://www.npmjs.com/package/year): Simple utility to get the current year with 2 or 4 digits. | [homepage](https://github.com/jonschlinkert/year "Simple utility to get the current year with 2 or 4 digits.")
146
+
147
+ ### Contributors
148
+
149
+ | **Commits** | **Contributor** |
150
+ | --- | --- |
151
+ | 14 | [jonschlinkert](https://github.com/jonschlinkert) |
152
+ | 5 | [doowb](https://github.com/doowb) |
153
+
154
+ ### Author
155
+
156
+ **Jon Schlinkert**
157
+
158
+ * [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
159
+ * [GitHub Profile](https://github.com/jonschlinkert)
160
+ * [Twitter Profile](https://twitter.com/jonschlinkert)
161
+
162
+ ### License
163
+
164
+ Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
165
+ Released under the [MIT License](LICENSE).
166
+
167
+ ***
168
+
169
+ _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 12, 2018._
lets-encrypt/node_modules/pretty-time/index.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * pretty-time <https://github.com/jonschlinkert/pretty-time>
3
+ *
4
+ * Copyright (c) 2015-2018, present, Jon Schlinkert.
5
+ * Released under the MIT License.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ const utils = require('./utils');
11
+
12
+ module.exports = (time, smallest, digits) => {
13
+ const isNumber = /^[0-9]+$/.test(time);
14
+ if (!isNumber && !Array.isArray(time)) {
15
+ throw new TypeError('expected an array or number in nanoseconds');
16
+ }
17
+ if (Array.isArray(time) && time.length !== 2) {
18
+ throw new TypeError('expected an array from process.hrtime()');
19
+ }
20
+
21
+ if (/^[0-9]+$/.test(smallest)) {
22
+ digits = smallest;
23
+ smallest = null;
24
+ }
25
+
26
+ let num = isNumber ? time : utils.nano(time);
27
+ let res = '';
28
+ let prev;
29
+
30
+ for (const uom of Object.keys(utils.scale)) {
31
+ const step = utils.scale[uom];
32
+ let inc = num / step;
33
+
34
+ if (smallest && utils.isSmallest(uom, smallest)) {
35
+ inc = utils.round(inc, digits);
36
+ if (prev && (inc === (prev / step))) --inc;
37
+ res += inc + uom;
38
+ return res.trim();
39
+ }
40
+
41
+ if (inc < 1) continue;
42
+ if (!smallest) {
43
+ inc = utils.round(inc, digits);
44
+ res += inc + uom;
45
+ return res;
46
+ }
47
+
48
+ prev = step;
49
+
50
+ inc = Math.floor(inc);
51
+ num -= (inc * step);
52
+ res += inc + uom + ' ';
53
+ }
54
+
55
+ return res.trim();
56
+ };
lets-encrypt/node_modules/pretty-time/package.json ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from": "pretty-time@^1.1.0",
3
+ "_id": "pretty-time@1.1.0",
4
+ "_inBundle": false,
5
+ "_integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==",
6
+ "_location": "/pretty-time",
7
+ "_phantomChildren": {},
8
+ "_requested": {
9
+ "type": "range",
10
+ "registry": true,
11
+ "raw": "pretty-time@^1.1.0",
12
+ "name": "pretty-time",
13
+ "escapedName": "pretty-time",
14
+ "rawSpec": "^1.1.0",
15
+ "saveSpec": null,
16
+ "fetchSpec": "^1.1.0"
17
+ },
18
+ "_requiredBy": [
19
+ "/composer"
20
+ ],
21
+ "_resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz",
22
+ "_shasum": "ffb7429afabb8535c346a34e41873adf3d74dd0e",
23
+ "_spec": "pretty-time@^1.1.0",
24
+ "_where": "/Users/rlankhorst/Sites/localhost/reallysimplessl/wp-content/plugins/really-simple-ssl/lets-encrypt/node_modules/composer",
25
+ "author": {
26
+ "name": "Jon Schlinkert",
27
+ "url": "https://github.com/jonschlinkert"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/jonschlinkert/pretty-time/issues"
31
+ },
32
+ "bundleDependencies": false,
33
+ "deprecated": false,
34
+ "description": "Easily format the time from node.js `process.hrtime`. Works with timescales ranging from weeks to nanoseconds.",
35
+ "devDependencies": {
36
+ "gulp-format-md": "^1.0.0",
37
+ "mocha": "^3.5.3"
38
+ },
39
+ "engines": {
40
+ "node": ">=4"
41
+ },
42
+ "files": [
43
+ "index.js",
44
+ "utils.js"
45
+ ],
46
+ "homepage": "https://github.com/jonschlinkert/pretty-time",
47
+ "keywords": [
48
+ "convert",
49
+ "date",
50
+ "format",
51
+ "formatting",
52
+ "hour",
53
+ "hrtime",
54
+ "micro",
55
+ "milli",
56
+ "minute",
57
+ "nano",
58
+ "nanosecond",
59
+ "pretty",
60
+ "second",
61
+ "time",
62
+ "week"
63
+ ],
64
+ "license": "MIT",
65
+ "main": "index.js",
66
+ "name": "pretty-time",
67
+ "repository": {
68
+ "type": "git",
69
+ "url": "git+https://github.com/jonschlinkert/pretty-time.git"
70
+ },
71
+ "scripts": {
72
+ "test": "mocha"
73
+ },
74
+ "verb": {
75
+ "toc": false,
76
+ "layout": "default",
77
+ "tasks": [
78
+ "readme"
79
+ ],
80
+ "plugins": [
81
+ "gulp-format-md"
82
+ ],
83
+ "related": {
84
+ "list": [
85
+ "o-clock",
86
+ "seconds",
87
+ "time-stamp",
88
+ "timescale",
89
+ "week",
90
+ "weekday",
91
+ "year"
92
+ ]
93
+ },
94
+ "lint": {
95
+ "reflinks": true
96
+ }
97
+ },
98
+ "version": "1.1.0"
99
+ }
lets-encrypt/node_modules/pretty-time/utils.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ exports.nano = time => +time[0] * 1e9 + +time[1];
2
+
3
+ exports.scale = {
4
+ 'w': 6048e11,
5
+ 'd': 864e11,
6
+ 'h': 36e11,
7
+ 'm': 6e10,
8
+ 's': 1e9,
9
+ 'ms': 1e6,
10
+ 'μs': 1e3,
11
+ 'ns': 1,
12
+ };
13
+
14
+ exports.regex = {
15
+ 'w': /^(w((ee)?k)?s?)$/,
16
+ 'd': /^(d(ay)?s?)$/,
17
+ 'h': /^(h((ou)?r)?s?)$/,
18
+ 'm': /^(min(ute)?s?|m)$/,
19
+ 's': /^((sec(ond)?)s?|s)$/,
20
+ 'ms': /^(milli(second)?s?|ms)$/,
21
+ 'μs': /^(micro(second)?s?|μs)$/,
22
+ 'ns': /^(nano(second)?s?|ns?)$/,
23
+ };
24
+
25
+ exports.isSmallest = function(uom, unit) {
26
+ return exports.regex[uom].test(unit);
27
+ };
28
+
29
+ exports.round = function(num, digits) {
30
+ const n = Math.abs(num);
31
+ return /[0-9]/.test(digits) ? n.toFixed(digits) : Math.round(n);
32
+ };
lets-encrypt/node_modules/use/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-present, Jon Schlinkert.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
lets-encrypt/node_modules/use/README.md ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # use [![NPM version](https://img.shields.io/npm/v/use.svg?style=flat)](https://www.npmjs.com/package/use) [![NPM monthly downloads](https://img.shields.io/npm/dm/use.svg?style=flat)](https://npmjs.org/package/use) [![NPM total downloads](https://img.shields.io/npm/dt/use.svg?style=flat)](https://npmjs.org/package/use) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/use.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/use)
2
+
3
+ > Easily add plugin support to your node.js application.
4
+
5
+ Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
6
+
7
+ ## Install
8
+
9
+ Install with [npm](https://www.npmjs.com/):
10
+
11
+ ```sh
12
+ $ npm install --save use
13
+ ```
14
+
15
+ A different take on plugin handling! This is not a middleware system, if you need something that handles async middleware, [ware](https://github.com/segmentio/ware) is great for that.
16
+
17
+ ## Usage
18
+
19
+ ```js
20
+ const use = require('use');
21
+ ```
22
+
23
+ See the [examples folder](./examples) for usage examples.
24
+
25
+ ## About
26
+
27
+ <details>
28
+ <summary><strong>Contributing</strong></summary>
29
+
30
+ Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
31
+
32
+ </details>
33
+
34
+ <details>
35
+ <summary><strong>Running Tests</strong></summary>
36
+
37
+ Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
38
+
39
+ ```sh
40
+ $ npm install && npm test
41
+ ```
42
+
43
+ </details>
44
+
45
+ <details>
46
+ <summary><strong>Building docs</strong></summary>
47
+
48
+ _(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
49
+
50
+ To generate the readme, run the following command:
51
+
52
+ ```sh
53
+ $ npm install -g verbose/verb#dev verb-generate-readme && verb
54
+ ```
55
+
56
+ </details>
57
+
58
+ ### Related projects
59
+
60
+ You might also be interested in these projects:
61
+
62
+ * [base-plugins](https://www.npmjs.com/package/base-plugins): Adds 'smart plugin' support to your base application. | [homepage](https://github.com/node-base/base-plugins "Adds 'smart plugin' support to your base application.")
63
+ * [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks")
64
+ * [ware](https://www.npmjs.com/package/ware): Easily create your own middleware layer. | [homepage](https://github.com/segmentio/ware "Easily create your own middleware layer.")
65
+
66
+ ### Contributors
67
+
68
+ | **Commits** | **Contributor** |
69
+ | --- | --- |
70
+ | 37 | [jonschlinkert](https://github.com/jonschlinkert) |
71
+ | 7 | [charlike-old](https://github.com/charlike-old) |
72
+ | 2 | [doowb](https://github.com/doowb) |
73
+ | 2 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) |
74
+
75
+ ### Author
76
+
77
+ **Jon Schlinkert**
78
+
79
+ * [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
80
+ * [GitHub Profile](https://github.com/jonschlinkert)
81
+ * [Twitter Profile](https://twitter.com/jonschlinkert)
82
+
83
+ ### License
84
+
85
+ Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
86
+ Released under the [MIT License](LICENSE).
87
+
88
+ ***
89
+
90
+ _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 12, 2018._
lets-encrypt/node_modules/use/index.js ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * use <https://github.com/jonschlinkert/use>
3
+ *
4
+ * Copyright (c) 2015-2017, Jon Schlinkert.
5
+ * Released under the MIT License.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ module.exports = function base(app, options) {
11
+ if (!isObject(app) && typeof app !== 'function') {
12
+ throw new TypeError('expected an object or function');
13
+ }
14
+
15
+ var opts = isObject(options) ? options : {};
16
+ var prop = typeof opts.prop === 'string' ? opts.prop : 'fns';
17
+ if (!Array.isArray(app[prop])) {
18
+ define(app, prop, []);
19
+ }
20
+
21
+ /**
22
+ * Define a plugin function to be passed to use. The only
23
+ * parameter exposed to the plugin is `app`, the object or function.
24
+ * passed to `use(app)`. `app` is also exposed as `this` in plugins.
25
+ *
26
+ * Additionally, **if a plugin returns a function, the function will
27
+ * be pushed onto the `fns` array**, allowing the plugin to be
28
+ * called at a later point by the `run` method.
29
+ *
30
+ * ```js
31
+ * var use = require('use');
32
+ *
33
+ * // define a plugin
34
+ * function foo(app) {
35
+ * // do stuff
36
+ * }
37
+ *
38
+ * var app = function(){};
39
+ * use(app);
40
+ *
41
+ * // register plugins
42
+ * app.use(foo);
43
+ * app.use(bar);
44
+ * app.use(baz);
45
+ * ```
46
+ * @name .use
47
+ * @param {Function} `fn` plugin function to call
48
+ * @api public
49
+ */
50
+
51
+ define(app, 'use', use);
52
+
53
+ /**
54
+ * Run all plugins on `fns`. Any plugin that returns a function
55
+ * when called by `use` is pushed onto the `fns` array.
56
+ *
57
+ * ```js
58
+ * var config = {};
59
+ * app.run(config);
60
+ * ```
61
+ * @name .run
62
+ * @param {Object} `value` Object to be modified by plugins.
63
+ * @return {Object} Returns the object passed to `run`
64
+ * @api public
65
+ */
66
+
67
+ define(app, 'run', function(val) {
68
+ if (!isObject(val)) return;
69
+
70
+ if (!val.use || !val.run) {
71
+ define(val, prop, val[prop] || []);
72
+ define(val, 'use', use);
73
+ }
74
+
75
+ if (!val[prop] || val[prop].indexOf(base) === -1) {
76
+ val.use(base);
77
+ }
78
+
79
+ var self = this || app;
80
+ var fns = self[prop];
81
+ var len = fns.length;
82
+ var idx = -1;
83
+
84
+ while (++idx < len) {
85
+ val.use(fns[idx]);
86
+ }
87
+ return val;
88
+ });
89
+
90
+ /**
91
+ * Call plugin `fn`. If a function is returned push it into the
92
+ * `fns` array to be called by the `run` method.
93
+ */
94
+
95
+ function use(type, fn, options) {
96
+ var offset = 1;
97
+
98
+ if (typeof type === 'string' || Array.isArray(type)) {
99
+ fn = wrap(type, fn);
100
+ offset++;
101
+ } else {
102
+ options = fn;
103
+ fn = type;
104
+ }
105
+
106
+ if (typeof fn !== 'function') {
107
+ throw new TypeError('expected a function');
108
+ }
109
+
110
+ var self = this || app;
111
+ var fns = self[prop];
112
+
113
+ var args = [].slice.call(arguments, offset);
114
+ args.unshift(self);
115
+
116
+ if (typeof opts.hook === 'function') {
117
+ opts.hook.apply(self, args);
118
+ }
119
+
120
+ var val = fn.apply(self, args);
121
+ if (typeof val === 'function' && fns.indexOf(val) === -1) {
122
+ fns.push(val);
123
+ }
124
+ return self;
125
+ }
126
+
127
+ /**
128
+ * Wrap a named plugin function so that it's only called on objects of the
129
+ * given `type`
130
+ *
131
+ * @param {String} `type`
132
+ * @param {Function} `fn` Plugin function
133
+ * @return {Function}
134
+ */
135
+
136
+ function wrap(type, fn) {
137
+ return function plugin() {
138
+ return this.type === type ? fn.apply(this, arguments) : plugin;
139
+ };
140
+ }
141
+
142
+ return app;
143
+ };
144
+
145
+ function isObject(val) {
146
+ return val && typeof val === 'object' && !Array.isArray(val);
147
+ }
148
+
149
+ function define(obj, key, val) {
150
+ Object.defineProperty(obj, key, {
151
+ configurable: true,
152
+ writable: true,
153
+ value: val
154
+ });
155
+ }
lets-encrypt/node_modules/use/package.json ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from": "use@^3.1.1",
3
+ "_id": "use@3.1.1",
4
+ "_inBundle": false,
5
+ "_integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
6
+ "_location": "/use",
7
+ "_phantomChildren": {},
8
+ "_requested": {
9
+ "type": "range",
10
+ "registry": true,
11
+ "raw": "use@^3.1.1",
12
+ "name": "use",
13
+ "escapedName": "use",
14
+ "rawSpec": "^3.1.1",
15
+ "saveSpec": null,
16
+ "fetchSpec": "^3.1.1"
17
+ },
18
+ "_requiredBy": [
19
+ "/composer"
20
+ ],
21
+ "_resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
22
+ "_shasum": "d50c8cac79a19fbc20f2911f56eb973f4e10070f",
23
+ "_spec": "use@^3.1.1",
24
+ "_where": "/Users/rlankhorst/Sites/localhost/reallysimplessl/wp-content/plugins/really-simple-ssl/lets-encrypt/node_modules/composer",
25
+ "author": {
26
+ "name": "Jon Schlinkert",
27
+ "url": "https://github.com/jonschlinkert"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/jonschlinkert/use/issues"
31
+ },
32
+ "bundleDependencies": false,
33
+ "contributors": [
34
+ {
35
+ "name": "Brian Woodward",
36
+ "url": "https://twitter.com/doowb"
37
+ },
38
+ {
39
+ "name": "Jon Schlinkert",
40
+ "url": "http://twitter.com/jonschlinkert"
41
+ },
42
+ {
43
+ "name": "Olsten Larck",
44
+ "url": "https://i.am.charlike.online"
45
+ },
46
+ {
47
+ "url": "https://github.com/wtgtybhertgeghgtwtg"
48
+ }
49
+ ],
50
+ "deprecated": false,
51
+ "description": "Easily add plugin support to your node.js application.",
52
+ "devDependencies": {
53
+ "base-plugins": "^1.0.0",
54
+ "define-property": "^2.0.0",
55
+ "extend-shallow": "^3.0.1",
56
+ "gulp": "^3.9.1",
57
+ "gulp-eslint": "^4.0.0",
58
+ "gulp-format-md": "^1.0.0",
59
+ "gulp-istanbul": "^1.1.2",
60
+ "gulp-mocha": "^3.0.1",
61
+ "mocha": "^4.0.1"
62
+ },
63
+ "engines": {
64
+ "node": ">=0.10.0"
65
+ },
66
+ "files": [
67
+ "index.js"
68
+ ],
69
+ "homepage": "https://github.com/jonschlinkert/use",
70
+ "keywords": [
71
+ "use"
72
+ ],
73
+ "license": "MIT",
74
+ "main": "index.js",
75
+ "name": "use",
76
+ "repository": {
77
+ "type": "git",
78
+ "url": "git+https://github.com/jonschlinkert/use.git"
79
+ },
80
+ "scripts": {
81
+ "test": "mocha"
82
+ },
83
+ "verb": {
84
+ "toc": false,
85
+ "layout": "default",
86
+ "tasks": [
87
+ "readme"
88
+ ],
89
+ "plugins": [
90
+ "gulp-format-md"
91
+ ],
92
+ "related": {
93
+ "list": [
94
+ "base",
95
+ "base-plugins",
96
+ "ware"
97
+ ]
98
+ },
99
+ "reflinks": [
100
+ "verb",
101
+ "ware"
102
+ ],
103
+ "lint": {
104
+ "reflinks": true
105
+ }
106
+ },
107
+ "version": "3.1.1"
108
+ }
lets-encrypt/package-lock.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "requires": true,
3
+ "lockfileVersion": 1,
4
+ "dependencies": {
5
+ "composer": {
6
+ "version": "4.1.0",
7
+ "resolved": "https://registry.npmjs.org/composer/-/composer-4.1.0.tgz",
8
+ "integrity": "sha512-qIIoNYjwFHrQFUdB8kD3pZs30+JeYK9149EpOYr/NVrii00KMO31IonzZMeRSU4qazyWZpEgVzkBmQ6VFWxedA==",
9
+ "requires": {
10
+ "pretty-time": "^1.1.0",
11
+ "use": "^3.1.1"
12
+ }
13
+ },
14
+ "pretty-time": {
15
+ "version": "1.1.0",
16
+ "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz",
17
+ "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA=="
18
+ },
19
+ "use": {
20
+ "version": "3.1.1",
21
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
22
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
23
+ }
24
+ }
25
+ }
lets-encrypt/vendor/autoload.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload.php @generated by Composer
4
+
5
+ require_once __DIR__ . '/composer/autoload_real.php';
6
+
7
+ return ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4::getLoader();
lets-encrypt/vendor/composer/ClassLoader.php ADDED
@@ -0,0 +1,479 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
+
13
+ namespace Composer\Autoload;
14
+
15
+ /**
16
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17
+ *
18
+ * $loader = new \Composer\Autoload\ClassLoader();
19
+ *
20
+ * // register classes with namespaces
21
+ * $loader->add('Symfony\Component', __DIR__.'/component');
22
+ * $loader->add('Symfony', __DIR__.'/framework');
23
+ *
24
+ * // activate the autoloader
25
+ * $loader->register();
26
+ *
27
+ * // to enable searching the include path (eg. for PEAR packages)
28
+ * $loader->setUseIncludePath(true);
29
+ *
30
+ * In this example, if you try to use a class in the Symfony\Component
31
+ * namespace or one of its children (Symfony\Component\Console for instance),
32
+ * the autoloader will first look for the class under the component/
33
+ * directory, and it will then fallback to the framework/ directory if not
34
+ * found before giving up.
35
+ *
36
+ * This class is loosely based on the Symfony UniversalClassLoader.
37
+ *
38
+ * @author Fabien Potencier <fabien@symfony.com>
39
+ * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see https://www.php-fig.org/psr/psr-0/
41
+ * @see https://www.php-fig.org/psr/psr-4/
42
+ */
43
+ class ClassLoader
44
+ {
45
+ private $vendorDir;
46
+
47
+ // PSR-4
48
+ private $prefixLengthsPsr4 = array();
49
+ private $prefixDirsPsr4 = array();
50
+ private $fallbackDirsPsr4 = array();
51
+
52
+ // PSR-0
53
+ private $prefixesPsr0 = array();
54
+ private $fallbackDirsPsr0 = array();
55
+
56
+ private $useIncludePath = false;
57
+ private $classMap = array();
58
+ private $classMapAuthoritative = false;
59
+ private $missingClasses = array();
60
+ private $apcuPrefix;
61
+
62
+ private static $registeredLoaders = array();
63
+
64
+ public function __construct($vendorDir = null)
65
+ {
66
+ $this->vendorDir = $vendorDir;
67
+ }
68
+
69
+ public function getPrefixes()
70
+ {
71
+ if (!empty($this->prefixesPsr0)) {
72
+ return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
73
+ }
74
+
75
+ return array();
76
+ }
77
+
78
+ public function getPrefixesPsr4()
79
+ {
80
+ return $this->prefixDirsPsr4;
81
+ }
82
+
83
+ public function getFallbackDirs()
84
+ {
85
+ return $this->fallbackDirsPsr0;
86
+ }
87
+
88
+ public function getFallbackDirsPsr4()
89
+ {
90
+ return $this->fallbackDirsPsr4;
91
+ }
92
+
93
+ public function getClassMap()
94
+ {
95
+ return $this->classMap;
96
+ }
97
+
98
+ /**
99
+ * @param array $classMap Class to filename map
100
+ */
101
+ public function addClassMap(array $classMap)
102
+ {
103
+ if ($this->classMap) {
104
+ $this->classMap = array_merge($this->classMap, $classMap);
105
+ } else {
106
+ $this->classMap = $classMap;
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Registers a set of PSR-0 directories for a given prefix, either
112
+ * appending or prepending to the ones previously set for this prefix.
113
+ *
114
+ * @param string $prefix The prefix
115
+ * @param array|string $paths The PSR-0 root directories
116
+ * @param bool $prepend Whether to prepend the directories
117
+ */
118
+ public function add($prefix, $paths, $prepend = false)
119
+ {
120
+ if (!$prefix) {
121
+ if ($prepend) {
122
+ $this->fallbackDirsPsr0 = array_merge(
123
+ (array) $paths,
124
+ $this->fallbackDirsPsr0
125
+ );
126
+ } else {
127
+ $this->fallbackDirsPsr0 = array_merge(
128
+ $this->fallbackDirsPsr0,
129
+ (array) $paths
130
+ );
131
+ }
132
+
133
+ return;
134
+ }
135
+
136
+ $first = $prefix[0];
137
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
138
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
139
+
140
+ return;
141
+ }
142
+ if ($prepend) {
143
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
144
+ (array) $paths,
145
+ $this->prefixesPsr0[$first][$prefix]
146
+ );
147
+ } else {
148
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
149
+ $this->prefixesPsr0[$first][$prefix],
150
+ (array) $paths
151
+ );
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Registers a set of PSR-4 directories for a given namespace, either
157
+ * appending or prepending to the ones previously set for this namespace.
158
+ *
159
+ * @param string $prefix The prefix/namespace, with trailing '\\'
160
+ * @param array|string $paths The PSR-4 base directories
161
+ * @param bool $prepend Whether to prepend the directories
162
+ *
163
+ * @throws \InvalidArgumentException
164
+ */
165
+ public function addPsr4($prefix, $paths, $prepend = false)
166
+ {
167
+ if (!$prefix) {
168
+ // Register directories for the root namespace.
169
+ if ($prepend) {
170
+ $this->fallbackDirsPsr4 = array_merge(
171
+ (array) $paths,
172
+ $this->fallbackDirsPsr4
173
+ );
174
+ } else {
175
+ $this->fallbackDirsPsr4 = array_merge(
176
+ $this->fallbackDirsPsr4,
177
+ (array) $paths
178
+ );
179
+ }
180
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
181
+ // Register directories for a new namespace.
182
+ $length = strlen($prefix);
183
+ if ('\\' !== $prefix[$length - 1]) {
184
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
185
+ }
186
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
187
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
188
+ } elseif ($prepend) {
189
+ // Prepend directories for an already registered namespace.
190
+ $this->prefixDirsPsr4[$prefix] = array_merge(
191
+ (array) $paths,
192
+ $this->prefixDirsPsr4[$prefix]
193
+ );
194
+ } else {
195
+ // Append directories for an already registered namespace.
196
+ $this->prefixDirsPsr4[$prefix] = array_merge(
197
+ $this->prefixDirsPsr4[$prefix],
198
+ (array) $paths
199
+ );
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Registers a set of PSR-0 directories for a given prefix,
205
+ * replacing any others previously set for this prefix.
206
+ *
207
+ * @param string $prefix The prefix
208
+ * @param array|string $paths The PSR-0 base directories
209
+ */
210
+ public function set($prefix, $paths)
211
+ {
212
+ if (!$prefix) {
213
+ $this->fallbackDirsPsr0 = (array) $paths;
214
+ } else {
215
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Registers a set of PSR-4 directories for a given namespace,
221
+ * replacing any others previously set for this namespace.
222
+ *
223
+ * @param string $prefix The prefix/namespace, with trailing '\\'
224
+ * @param array|string $paths The PSR-4 base directories
225
+ *
226
+ * @throws \InvalidArgumentException
227
+ */
228
+ public function setPsr4($prefix, $paths)
229
+ {
230
+ if (!$prefix) {
231
+ $this->fallbackDirsPsr4 = (array) $paths;
232
+ } else {
233
+ $length = strlen($prefix);
234
+ if ('\\' !== $prefix[$length - 1]) {
235
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
236
+ }
237
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
238
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
239
+ }
240
+ }
241
+
242
+ /**
243
+ * Turns on searching the include path for class files.
244
+ *
245
+ * @param bool $useIncludePath
246
+ */
247
+ public function setUseIncludePath($useIncludePath)
248
+ {
249
+ $this->useIncludePath = $useIncludePath;
250
+ }
251
+
252
+ /**
253
+ * Can be used to check if the autoloader uses the include path to check
254
+ * for classes.
255
+ *
256
+ * @return bool
257
+ */
258
+ public function getUseIncludePath()
259
+ {
260
+ return $this->useIncludePath;
261
+ }
262
+
263
+ /**
264
+ * Turns off searching the prefix and fallback directories for classes
265
+ * that have not been registered with the class map.
266
+ *
267
+ * @param bool $classMapAuthoritative
268
+ */
269
+ public function setClassMapAuthoritative($classMapAuthoritative)
270
+ {
271
+ $this->classMapAuthoritative = $classMapAuthoritative;
272
+ }
273
+
274
+ /**
275
+ * Should class lookup fail if not found in the current class map?
276
+ *
277
+ * @return bool
278
+ */
279
+ public function isClassMapAuthoritative()
280
+ {
281
+ return $this->classMapAuthoritative;
282
+ }
283
+
284
+ /**
285
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
286
+ *
287
+ * @param string|null $apcuPrefix
288
+ */
289
+ public function setApcuPrefix($apcuPrefix)
290
+ {
291
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
292
+ }
293
+
294
+ /**
295
+ * The APCu prefix in use, or null if APCu caching is not enabled.
296
+ *
297
+ * @return string|null
298
+ */
299
+ public function getApcuPrefix()
300
+ {
301
+ return $this->apcuPrefix;
302
+ }
303
+
304
+ /**
305
+ * Registers this instance as an autoloader.
306
+ *
307
+ * @param bool $prepend Whether to prepend the autoloader or not
308
+ */
309
+ public function register($prepend = false)
310
+ {
311
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
312
+
313
+ if (null === $this->vendorDir) {
314
+ return;
315
+ }
316
+
317
+ if ($prepend) {
318
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
319
+ } else {
320
+ unset(self::$registeredLoaders[$this->vendorDir]);
321
+ self::$registeredLoaders[$this->vendorDir] = $this;
322
+ }
323
+ }
324
+
325
+ /**
326
+ * Unregisters this instance as an autoloader.
327
+ */
328
+ public function unregister()
329
+ {
330
+ spl_autoload_unregister(array($this, 'loadClass'));
331
+
332
+ if (null !== $this->vendorDir) {
333
+ unset(self::$registeredLoaders[$this->vendorDir]);
334
+ }
335
+ }
336
+
337
+ /**
338
+ * Loads the given class or interface.
339
+ *
340
+ * @param string $class The name of the class
341
+ * @return bool|null True if loaded, null otherwise
342
+ */
343
+ public function loadClass($class)
344
+ {
345
+ if ($file = $this->findFile($class)) {
346
+ includeFile($file);
347
+
348
+ return true;
349
+ }
350
+ }
351
+
352
+ /**
353
+ * Finds the path to the file where the class is defined.
354
+ *
355
+ * @param string $class The name of the class
356
+ *
357
+ * @return string|false The path if found, false otherwise
358
+ */
359
+ public function findFile($class)
360
+ {
361
+ // class map lookup
362
+ if (isset($this->classMap[$class])) {
363
+ return $this->classMap[$class];
364
+ }
365
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
366
+ return false;
367
+ }
368
+ if (null !== $this->apcuPrefix) {
369
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
370
+ if ($hit) {
371
+ return $file;
372
+ }
373
+ }
374
+
375
+ $file = $this->findFileWithExtension($class, '.php');
376
+
377
+ // Search for Hack files if we are running on HHVM
378
+ if (false === $file && defined('HHVM_VERSION')) {
379
+ $file = $this->findFileWithExtension($class, '.hh');
380
+ }
381
+
382
+ if (null !== $this->apcuPrefix) {
383
+ apcu_add($this->apcuPrefix.$class, $file);
384
+ }
385
+
386
+ if (false === $file) {
387
+ // Remember that this class does not exist.
388
+ $this->missingClasses[$class] = true;
389
+ }
390
+
391
+ return $file;
392
+ }
393
+
394
+ /**
395
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
396
+ *
397
+ * @return self[]
398
+ */
399
+ public static function getRegisteredLoaders()
400
+ {
401
+ return self::$registeredLoaders;
402
+ }
403
+
404
+ private function findFileWithExtension($class, $ext)
405
+ {
406
+ // PSR-4 lookup
407
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
408
+
409
+ $first = $class[0];
410
+ if (isset($this->prefixLengthsPsr4[$first])) {
411
+ $subPath = $class;
412
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
413
+ $subPath = substr($subPath, 0, $lastPos);
414
+ $search = $subPath . '\\';
415
+ if (isset($this->prefixDirsPsr4[$search])) {
416
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
417
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
418
+ if (file_exists($file = $dir . $pathEnd)) {
419
+ return $file;
420
+ }
421
+ }
422
+ }
423
+ }
424
+ }
425
+
426
+ // PSR-4 fallback dirs
427
+ foreach ($this->fallbackDirsPsr4 as $dir) {
428
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
429
+ return $file;
430
+ }
431
+ }
432
+
433
+ // PSR-0 lookup
434
+ if (false !== $pos = strrpos($class, '\\')) {
435
+ // namespaced class name
436
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
437
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
438
+ } else {
439
+ // PEAR-like class name
440
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
441
+ }
442
+
443
+ if (isset($this->prefixesPsr0[$first])) {
444
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
445
+ if (0 === strpos($class, $prefix)) {
446
+ foreach ($dirs as $dir) {
447
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
448
+ return $file;
449
+ }
450
+ }
451
+ }
452
+ }
453
+ }
454
+
455
+ // PSR-0 fallback dirs
456
+ foreach ($this->fallbackDirsPsr0 as $dir) {
457
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
458
+ return $file;
459
+ }
460
+ }
461
+
462
+ // PSR-0 include paths.
463
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
464
+ return $file;
465
+ }
466
+
467
+ return false;
468
+ }
469
+ }
470
+
471
+ /**
472
+ * Scope isolated include.
473
+ *
474
+ * Prevents access to $this/self from included files.
475
+ */
476
+ function includeFile($file)
477
+ {
478
+ include $file;
479
+ }
lets-encrypt/vendor/composer/InstalledVersions.php ADDED
@@ -0,0 +1,303 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+ namespace Composer;
14
+
15
+ use Composer\Autoload\ClassLoader;
16
+ use Composer\Semver\VersionParser;
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+ class InstalledVersions
26
+ {
27
+ private static $installed = array (
28
+ 'root' =>
29
+ array (
30
+ 'pretty_version' => 'dev-master',
31
+ 'version' => 'dev-master',
32
+ 'aliases' =>
33
+ array (
34
+ ),
35
+ 'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13',
36
+ 'name' => '__root__',
37
+ ),
38
+ 'versions' =>
39
+ array (
40
+ '__root__' =>
41
+ array (
42
+ 'pretty_version' => 'dev-master',
43
+ 'version' => 'dev-master',
44
+ 'aliases' =>
45
+ array (
46
+ ),
47
+ 'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13',
48
+ ),
49
+ 'fbett/le_acme2' =>
50
+ array (
51
+ 'pretty_version' => '1.5.6',
52
+ 'version' => '1.5.6.0',
53
+ 'aliases' =>
54
+ array (
55
+ ),
56
+ 'reference' => '26b2c421764b173326f6bcb0713a86bd614f77fa',
57
+ ),
58
+ 'plesk/api-php-lib' =>
59
+ array (
60
+ 'pretty_version' => 'v1.0.7',
61
+ 'version' => '1.0.7.0',
62
+ 'aliases' =>
63
+ array (
64
+ ),
65
+ 'reference' => '7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605',
66
+ ),
67
+ ),
68
+ );
69
+ private static $canGetVendors;
70
+ private static $installedByVendor = array();
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+ public static function getInstalledPackages()
79
+ {
80
+ $packages = array();
81
+ foreach (self::getInstalled() as $installed) {
82
+ $packages[] = array_keys($installed['versions']);
83
+ }
84
+
85
+ if (1 === \count($packages)) {
86
+ return $packages[0];
87
+ }
88
+
89
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
90
+ }
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+ public static function isInstalled($packageName)
101
+ {
102
+ foreach (self::getInstalled() as $installed) {
103
+ if (isset($installed['versions'][$packageName])) {
104
+ return true;
105
+ }
106
+ }
107
+
108
+ return false;
109
+ }
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
125
+ {
126
+ $constraint = $parser->parseConstraints($constraint);
127
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
128
+
129
+ return $provided->matches($constraint);
130
+ }
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+ public static function getVersionRanges($packageName)
142
+ {
143
+ foreach (self::getInstalled() as $installed) {
144
+ if (!isset($installed['versions'][$packageName])) {
145
+ continue;
146
+ }
147
+
148
+ $ranges = array();
149
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
150
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
151
+ }
152
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
153
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
154
+ }
155
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
156
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
157
+ }
158
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
159
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
160
+ }
161
+
162
+ return implode(' || ', $ranges);
163
+ }
164
+
165
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
166
+ }
167
+
168
+
169
+
170
+
171
+
172
+ public static function getVersion($packageName)
173
+ {
174
+ foreach (self::getInstalled() as $installed) {
175
+ if (!isset($installed['versions'][$packageName])) {
176
+ continue;
177
+ }
178
+
179
+ if (!isset($installed['versions'][$packageName]['version'])) {
180
+ return null;
181
+ }
182
+
183
+ return $installed['versions'][$packageName]['version'];
184
+ }
185
+
186
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
187
+ }
188
+
189
+
190
+
191
+
192
+
193
+ public static function getPrettyVersion($packageName)
194
+ {
195
+ foreach (self::getInstalled() as $installed) {
196
+ if (!isset($installed['versions'][$packageName])) {
197
+ continue;
198
+ }
199
+
200
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
201
+ return null;
202
+ }
203
+
204
+ return $installed['versions'][$packageName]['pretty_version'];
205
+ }
206
+
207
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
208
+ }
209
+
210
+
211
+
212
+
213
+
214
+ public static function getReference($packageName)
215
+ {
216
+ foreach (self::getInstalled() as $installed) {
217
+ if (!isset($installed['versions'][$packageName])) {
218
+ continue;
219
+ }
220
+
221
+ if (!isset($installed['versions'][$packageName]['reference'])) {
222
+ return null;
223
+ }
224
+
225
+ return $installed['versions'][$packageName]['reference'];
226
+ }
227
+
228
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
229
+ }
230
+
231
+
232
+
233
+
234
+
235
+ public static function getRootPackage()
236
+ {
237
+ $installed = self::getInstalled();
238
+
239
+ return $installed[0]['root'];
240
+ }
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+ public static function getRawData()
249
+ {
250
+ return self::$installed;
251
+ }
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+ public static function reload($data)
272
+ {
273
+ self::$installed = $data;
274
+ self::$installedByVendor = array();
275
+ }
276
+
277
+
278
+
279
+
280
+
281
+ private static function getInstalled()
282
+ {
283
+ if (null === self::$canGetVendors) {
284
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
285
+ }
286
+
287
+ $installed = array();
288
+
289
+ if (self::$canGetVendors) {
290
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
291
+ if (isset(self::$installedByVendor[$vendorDir])) {
292
+ $installed[] = self::$installedByVendor[$vendorDir];
293
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
294
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
295
+ }
296
+ }
297
+ }
298
+
299
+ $installed[] = self::$installed;
300
+
301
+ return $installed;
302
+ }
303
+ }
lets-encrypt/vendor/composer/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Copyright (c) Nils Adermann, Jordi Boggiano
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is furnished
9
+ to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
21
+
lets-encrypt/vendor/composer/autoload_classmap.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_classmap.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
10
+ );
lets-encrypt/vendor/composer/autoload_namespaces.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_namespaces.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'LE_ACME2' => array($vendorDir . '/fbett/le_acme2/src'),
10
+ );
lets-encrypt/vendor/composer/autoload_psr4.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_psr4.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'PleskX\\' => array($vendorDir . '/plesk/api-php-lib/src'),
10
+ );
lets-encrypt/vendor/composer/autoload_real.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_real.php @generated by Composer
4
+
5
+ class ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4
6
+ {
7
+ private static $loader;
8
+
9
+ public static function loadClassLoader($class)
10
+ {
11
+ if ('Composer\Autoload\ClassLoader' === $class) {
12
+ require __DIR__ . '/ClassLoader.php';
13
+ }
14
+ }
15
+
16
+ /**
17
+ * @return \Composer\Autoload\ClassLoader
18
+ */
19
+ public static function getLoader()
20
+ {
21
+ if (null !== self::$loader) {
22
+ return self::$loader;
23
+ }
24
+
25
+ require __DIR__ . '/platform_check.php';
26
+
27
+ spl_autoload_register(array('ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4', 'loadClassLoader'), true, true);
28
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4', 'loadClassLoader'));
30
+
31
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
+ if ($useStaticLoader) {
33
+ require __DIR__ . '/autoload_static.php';
34
+
35
+ call_user_func(\Composer\Autoload\ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::getInitializer($loader));
36
+ } else {
37
+ $map = require __DIR__ . '/autoload_namespaces.php';
38
+ foreach ($map as $namespace => $path) {
39
+ $loader->set($namespace, $path);
40
+ }
41
+
42
+ $map = require __DIR__ . '/autoload_psr4.php';
43
+ foreach ($map as $namespace => $path) {
44
+ $loader->setPsr4($namespace, $path);
45
+ }
46
+
47
+ $classMap = require __DIR__ . '/autoload_classmap.php';
48
+ if ($classMap) {
49
+ $loader->addClassMap($classMap);
50
+ }
51
+ }
52
+
53
+ $loader->register(true);
54
+
55
+ return $loader;
56
+ }
57
+ }
lets-encrypt/vendor/composer/autoload_static.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_static.php @generated by Composer
4
+
5
+ namespace Composer\Autoload;
6
+
7
+ class ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4
8
+ {
9
+ public static $prefixLengthsPsr4 = array (
10
+ 'P' =>
11
+ array (
12
+ 'PleskX\\' => 7,
13
+ ),
14
+ );
15
+
16
+ public static $prefixDirsPsr4 = array (
17
+ 'PleskX\\' =>
18
+ array (
19
+ 0 => __DIR__ . '/..' . '/plesk/api-php-lib/src',
20
+ ),
21
+ );
22
+
23
+ public static $prefixesPsr0 = array (
24
+ 'L' =>
25
+ array (
26
+ 'LE_ACME2' =>
27
+ array (
28
+ 0 => __DIR__ . '/..' . '/fbett/le_acme2/src',
29
+ ),
30
+ ),
31
+ );
32
+
33
+ public static $classMap = array (
34
+ 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
35
+ );
36
+
37
+ public static function getInitializer(ClassLoader $loader)
38
+ {
39
+ return \Closure::bind(function () use ($loader) {
40
+ $loader->prefixLengthsPsr4 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixLengthsPsr4;
41
+ $loader->prefixDirsPsr4 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixDirsPsr4;
42
+ $loader->prefixesPsr0 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixesPsr0;
43
+ $loader->classMap = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$classMap;
44
+
45
+ }, null, ClassLoader::class);
46
+ }
47
+ }
lets-encrypt/vendor/composer/installed.json ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "packages": [
3
+ {
4
+ "name": "fbett/le_acme2",
5
+ "version": "1.5.6",
6
+ "version_normalized": "1.5.6.0",
7
+ "source": {
8
+ "type": "git",
9
+ "url": "https://github.com/fbett/le-acme2-php.git",
10
+ "reference": "26b2c421764b173326f6bcb0713a86bd614f77fa"
11
+ },
12
+ "dist": {
13
+ "type": "zip",
14
+ "url": "https://api.github.com/repos/fbett/le-acme2-php/zipball/26b2c421764b173326f6bcb0713a86bd614f77fa",
15
+ "reference": "26b2c421764b173326f6bcb0713a86bd614f77fa",
16
+ "shasum": ""
17
+ },
18
+ "require": {
19
+ "ext-curl": "*",
20
+ "ext-json": "*",
21
+ "ext-openssl": "*",
22
+ "php": ">=7.3"
23
+ },
24
+ "time": "2021-05-17T07:08:46+00:00",
25
+ "type": "library",
26
+ "installation-source": "dist",
27
+ "autoload": {
28
+ "psr-0": {
29
+ "LE_ACME2": "src/"
30
+ }
31
+ },
32
+ "notification-url": "https://packagist.org/downloads/",
33
+ "license": [
34
+ "MIT"
35
+ ],
36
+ "authors": [
37
+ {
38
+ "name": "Fabian Bett",
39
+ "homepage": "https://www.bett-ingenieure.de",
40
+ "role": "Developer"
41
+ }
42
+ ],
43
+ "description": "Letsencrypt PHP ACME v2 client",
44
+ "homepage": "https://github.com/fbett/le-acme2-php",
45
+ "support": {
46
+ "issues": "https://github.com/fbett/le-acme2-php/issues",
47
+ "source": "https://github.com/fbett/le-acme2-php/tree/v1.5.6"
48
+ },
49
+ "install-path": "../fbett/le_acme2"
50
+ },
51
+ {
52
+ "name": "plesk/api-php-lib",
53
+ "version": "v1.0.7",
54
+ "version_normalized": "1.0.7.0",
55
+ "source": {
56
+ "type": "git",
57
+ "url": "https://github.com/plesk/api-php-lib.git",
58
+ "reference": "7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605"
59
+ },
60
+ "dist": {
61
+ "type": "zip",
62
+ "url": "https://api.github.com/repos/plesk/api-php-lib/zipball/7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605",
63
+ "reference": "7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605",
64
+ "shasum": ""
65
+ },
66
+ "require": {
67
+ "ext-curl": "*",
68
+ "ext-simplexml": "*",
69
+ "ext-xml": "*",
70
+ "php": "^7.3"
71
+ },
72
+ "require-dev": {
73
+ "phpunit/phpunit": "^9",
74
+ "spatie/phpunit-watcher": "^1.22"
75
+ },
76
+ "time": "2020-12-24T07:20:26+00:00",
77
+ "type": "library",
78
+ "extra": {
79
+ "branch-alias": {
80
+ "dev-master": "2.0.x-dev"
81
+ }
82
+ },
83
+ "installation-source": "dist",
84
+ "autoload": {
85
+ "psr-4": {
86
+ "PleskX\\": "src/"
87
+ }
88
+ },
89
+ "notification-url": "https://packagist.org/downloads/",
90
+ "license": [
91
+ "Apache-2.0"
92
+ ],
93
+ "authors": [
94
+ {
95
+ "name": "Alexei Yuzhakov",
96
+ "email": "sibprogrammer@gmail.com"
97
+ },
98
+ {
99
+ "name": "Plesk International GmbH.",
100
+ "email": "plesk-dev-leads@plesk.com"
101
+ }
102
+ ],
103
+ "description": "PHP object-oriented library for Plesk XML-RPC API",
104
+ "support": {
105
+ "issues": "https://github.com/plesk/api-php-lib/issues",
106
+ "source": "https://github.com/plesk/api-php-lib/tree/v1.0.7"
107
+ },
108
+ "install-path": "../plesk/api-php-lib"
109
+ }
110
+ ],
111
+ "dev": true,
112
+ "dev-package-names": []
113
+ }
lets-encrypt/vendor/composer/installed.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php return array (
2
+ 'root' =>
3
+ array (
4
+ 'pretty_version' => 'dev-master',
5
+ 'version' => 'dev-master',
6
+ 'aliases' =>
7
+ array (
8
+ ),
9
+ 'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13',
10
+ 'name' => '__root__',
11
+ ),
12
+ 'versions' =>
13
+ array (
14
+ '__root__' =>
15
+ array (
16
+ 'pretty_version' => 'dev-master',
17
+ 'version' => 'dev-master',
18
+ 'aliases' =>
19
+ array (
20
+ ),
21
+ 'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13',
22
+ ),
23
+ 'fbett/le_acme2' =>
24
+ array (
25
+ 'pretty_version' => '1.5.6',
26
+ 'version' => '1.5.6.0',
27
+ 'aliases' =>
28
+ array (
29
+ ),
30
+ 'reference' => '26b2c421764b173326f6bcb0713a86bd614f77fa',
31
+ ),
32
+ 'plesk/api-php-lib' =>
33
+ array (
34
+ 'pretty_version' => 'v1.0.7',
35
+ 'version' => '1.0.7.0',
36
+ 'aliases' =>
37
+ array (
38
+ ),
39
+ 'reference' => '7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605',
40
+ ),
41
+ ),
42
+ );
lets-encrypt/vendor/composer/platform_check.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // platform_check.php @generated by Composer
4
+
5
+ $issues = array();
6
+
7
+ if (!(PHP_VERSION_ID >= 70100)) {
8
+ $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.';
9
+ }
10
+
11
+ if ($issues) {
12
+ if (!headers_sent()) {
13
+ header('HTTP/1.1 500 Internal Server Error');
14
+ }
15
+ if (!ini_get('display_errors')) {
16
+ if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
17
+ fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
18
+ } elseif (!headers_sent()) {
19
+ echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
20
+ }
21
+ }
22
+ trigger_error(
23
+ 'Composer detected issues in your platform: ' . implode(' ', $issues),
24
+ E_USER_ERROR
25
+ );
26
+ }
lets-encrypt/vendor/fbett/le_acme2/LICENSE.md ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
lets-encrypt/vendor/fbett/le_acme2/README.md ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # le-acme2-php
2
+ LetsEncrypt client library for ACME v2 written in PHP.
3
+
4
+ This library is inspired by [yourivw/LEClient](https://github.com/yourivw/LEClient), completely rewritten and enhanced with some new features:
5
+ - Support for Composer autoload (including separated Namespaces)
6
+ - Automatic renewal process
7
+ - Managed HTTP authentication process
8
+ - Response caching mechanism
9
+ - Prevents blocking while waiting for server results
10
+ - Optional certificate feature "OCSP Must-Staple"
11
+ - Optional set a preferred chain
12
+
13
+ The aim of this client is to make an easy-to-use and integrated solution to create a LetsEncrypt-issued SSL/TLS certificate with PHP.
14
+
15
+ You have the possibility to use the HTTP authentication:
16
+ You need to be able to redirect specific requests (see below)
17
+
18
+ You have also the possibility to use DNS authentication:
19
+ You need to be able to set dynamic DNS configurations.
20
+
21
+ Wildcard certificates can only be requested by using the dns authentication.
22
+
23
+ ## Current version
24
+
25
+ Tested with LetsEncrypt staging and production servers.
26
+
27
+ [Transitioning to ISRG's Root](https://letsencrypt.org/2019/04/15/transitioning-to-isrg-root.html):
28
+
29
+ This library supports it to set a preferred chain in `Order::setPreferredChain($issuerCN))`.
30
+
31
+ If the preferred chain is not set or set to IdenTrust’s chain,
32
+ this library will try to use the IdenTrust’s chain as long as possible.
33
+ Please see: https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/
34
+
35
+ ## Prerequisites
36
+
37
+ The minimum required PHP version is 7.3.
38
+
39
+ This client also depends on cURL and OpenSSL.
40
+
41
+ ## Getting Started
42
+
43
+ Install via composer:
44
+
45
+ ```
46
+ composer require fbett/le_acme2
47
+ ```
48
+
49
+ Also have a look at the [LetsEncrypt documentation](https://letsencrypt.org/docs/) for more information and documentation on LetsEncrypt and ACME.
50
+
51
+ ## Example Integration
52
+
53
+ - Create a working directory.
54
+ Warning: This directory will also include private keys, so i suggest to place this directory somewhere not in the root document path of the web server.
55
+ Additionally this directory should be protected to be read from other web server users.
56
+
57
+ ```
58
+ mkdir /etc/ssl/le-storage/
59
+ chown root:root /etc/ssl/le-storage
60
+ chmod 0600 /etc/ssl/le-storage
61
+ ```
62
+
63
+ - (HTTP authorization only) Create a directory for the acme challenges. It must be reachable by http/https.
64
+
65
+ ```
66
+ mkdir /var/www/acme-challenges
67
+ ```
68
+
69
+ - (HTTP authorization only) Redirect specific requests to your acme-challenges directory
70
+
71
+ Example apache virtual host configuration:
72
+
73
+ ```
74
+ <VirtualHost ...>
75
+ <IfModule mod_rewrite.c>
76
+ RewriteEngine On
77
+ RewriteCond %{HTTPS} off
78
+ RewriteRule \.well-known/acme-challenge/(.*)$ https://your-domain.com/path/to/acme-challenges/$1 [R=302,L]
79
+ </IfModule>
80
+ </VirtualHost>
81
+ ```
82
+
83
+ - (DNS authorization only) Set the DNS configuration
84
+
85
+ If `DNSWriter::write(...)` is called, set the DNS configuration like described in:
86
+
87
+ [https://letsencrypt.org/docs/challenge-types/#dns-01-challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge)
88
+
89
+ (By adding the digest as a TXT record for the subdomain '_acme-challenge'.)
90
+
91
+
92
+ - Use the certificate bundle, if the certificate is issued:
93
+
94
+ ```
95
+ if($order->isCertificateBundleAvailable()) {
96
+
97
+ $bundle = $order->getCertificateBundle();
98
+
99
+ $pathToPrivateKey = $bundle->path . $bundle->private;
100
+ $pathToCertificate = $bundle->path . $bundle->certificate;
101
+ $pathToIntermediate = $bundle->path . $bundle->intermediate;
102
+
103
+ $order->enableAutoRenewal(); // If the date of expiration is closer than thirty days, the order will automatically start the renewal process.
104
+ }
105
+ ```
106
+
107
+ If a certificate is renewed, the path will also change.
108
+
109
+ My integrated workflow is the following:
110
+ - User enables SSL to a specific domain in my control panel
111
+ - The cronjob of this control panel will detect these changes and tries to create or get an order like in the sample.
112
+ - The cronjob will fetch the information within the certificate bundle, if the certificate bundle is ready (mostly on the second run for challenge type HTTP and on the third run for challenge type DNS)
113
+ - The cronjob will also build the Apache virtual host files and will restart the Apache2 service, if the new config file is different.
114
+
115
+ Please take a look on the Samples for a full sample workflow.
116
+
117
+ ## License
118
+
119
+ This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.
lets-encrypt/vendor/fbett/le_acme2/Samples/DNS.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'autoload.php'; //Path to composer autoload
4
+
5
+ $dnsWriter = new class extends \LE_ACME2\Authorizer\AbstractDNSWriter {
6
+ public function write(\LE_ACME2\Order $order, string $identifier, string $digest): bool {
7
+ $status = false;
8
+ error_log(print_r($order,true));
9
+ error_log("Identifier");
10
+
11
+ error_log(print_r($identifier,true));
12
+ error_log("digest");
13
+
14
+ error_log(print_r($digest,true));
15
+ // Write digest to DNS system
16
+ // return true, if the dns configuration is usable and the process should be progressed
17
+ return $status;
18
+ }
19
+ };
20
+
21
+
22
+ // Config the desired paths
23
+ \LE_ACME2\Account::setCommonKeyDirectoryPath('/etc/ssl/le-storage/');
24
+ \LE_ACME2\Authorizer\DNS::setWriter($dnsWriter);
25
+
26
+ $account_email = 'test@example.org';
27
+
28
+ $account = !\LE_ACME2\Account::exists($account_email) ?
29
+ \LE_ACME2\Account::create($account_email) :
30
+ \LE_ACME2\Account::get($account_email);
31
+
32
+ // Update email address
33
+ // $account->update('new-test@example.org');
34
+
35
+ // Deactivate account
36
+ // Warning: It seems not possible to reactivate an account.
37
+ // $account->deactivate();
38
+
39
+ $subjects = [
40
+ 'example.org', // First item will be set as common name on the certificate
41
+ 'www.example.org'
42
+ ];
43
+
44
+ if(!\LE_ACME2\Order::exists($account, $subjects)) {
45
+
46
+ // Do some pre-checks, f.e. external dns checks - not required
47
+
48
+ $order = \LE_ACME2\Order::create($account, $subjects);
49
+ } else {
50
+ $order = \LE_ACME2\Order::get($account, $subjects);
51
+ }
52
+
53
+ // Clear current order (in case to restart on status "invalid")
54
+ // Already received certificate bundles will not be affected
55
+ // $order->clear();
56
+
57
+ if($order->shouldStartAuthorization(\LE_ACME2\Order::CHALLENGE_TYPE_DNS)) {
58
+ // Do some pre-checks, f.e. external dns checks - not required
59
+ }
60
+
61
+ if($order->authorize(\LE_ACME2\Order::CHALLENGE_TYPE_DNS)) {
62
+ $order->finalize();
63
+ }
64
+
65
+ if($order->isCertificateBundleAvailable()) {
66
+
67
+ $bundle = $order->getCertificateBundle();
68
+ $order->enableAutoRenewal();
69
+
70
+ // Revoke certificate
71
+ // $order->revokeCertificate($reason = 0);
72
+ }
lets-encrypt/vendor/fbett/le_acme2/Samples/HTTP.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'autoload.php'; //Path to composer autoload
4
+
5
+ // Config the desired paths
6
+ \LE_ACME2\Account::setCommonKeyDirectoryPath('/etc/ssl/le-storage/');
7
+ \LE_ACME2\Authorizer\HTTP::setDirectoryPath('/var/www/acme-challenges/');
8
+
9
+ // General configs
10
+ \LE_ACME2\Connector\Connector::getInstance()->useStagingServer(true);
11
+ \LE_ACME2\Utilities\Logger::getInstance()->setDesiredLevel(\LE_ACME2\Utilities\Logger::LEVEL_INFO);
12
+
13
+ // Optional configs
14
+ //\LE_ACME2\Utilities\Certificate::enableFeatureOCSPMustStaple();
15
+ //\LE_ACME2\Order::setPreferredChain(\LE_ACME2\Order::IDENTRUST_ISSUER_CN);
16
+
17
+ $account_email = 'test@example.org';
18
+
19
+ $account = !\LE_ACME2\Account::exists($account_email) ?
20
+ \LE_ACME2\Account::create($account_email) :
21
+ \LE_ACME2\Account::get($account_email);
22
+
23
+ // Update email address
24
+ // $account->update('new-test@example.org');
25
+
26
+ // Deactivate account
27
+ // Warning: It seems not possible to reactivate an account.
28
+ // $account->deactivate();
29
+
30
+ $subjects = [
31
+ 'example.org', // First item will be set as common name on the certificate
32
+ 'www.example.org'
33
+ ];
34
+
35
+ if(!\LE_ACME2\Order::exists($account, $subjects)) {
36
+
37
+ // Do some pre-checks, f.e. external dns checks - not required
38
+
39
+ $order = \LE_ACME2\Order::create($account, $subjects);
40
+ } else {
41
+ $order = \LE_ACME2\Order::get($account, $subjects);
42
+ }
43
+
44
+ // Clear current order (in case to restart on status "invalid")
45
+ // Already received certificate bundles will not be affected
46
+ // $order->clear();
47
+
48
+ if($order->shouldStartAuthorization(\LE_ACME2\Order::CHALLENGE_TYPE_HTTP)) {
49
+ // Do some pre-checks, f.e. external dns checks - not required
50
+ }
51
+
52
+ if($order->authorize(\LE_ACME2\Order::CHALLENGE_TYPE_HTTP)) {
53
+ $order->finalize();
54
+ }
55
+
56
+ if($order->isCertificateBundleAvailable()) {
57
+
58
+ $bundle = $order->getCertificateBundle();
59
+ $order->enableAutoRenewal();
60
+
61
+ // Revoke certificate
62
+ // $order->revokeCertificate($reason = 0);
63
+ }
lets-encrypt/vendor/fbett/le_acme2/composer.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "fbett/le_acme2",
3
+ "description": "Letsencrypt PHP ACME v2 client",
4
+ "homepage": "https://github.com/fbett/le-acme2-php",
5
+ "version": "1.5.6",
6
+ "license": "MIT",
7
+ "authors": [
8
+ {
9
+ "name": "Fabian Bett",
10
+ "homepage": "https://www.bett-ingenieure.de",
11
+ "role": "Developer"
12
+ }
13
+ ],
14
+ "autoload": {
15
+ "psr-0": {
16
+ "LE_ACME2": "src/"
17
+ }
18
+ },
19
+ "require": {
20
+ "php": ">=7.3",
21
+ "ext-curl": "*",
22
+ "ext-openssl": "*",
23
+ "ext-json": "*"
24
+ }
25
+ }
lets-encrypt/vendor/fbett/le_acme2/phpunit.xml.dist ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
+ backupGlobals="false"
4
+ backupStaticAttributes="false"
5
+ colors="true"
6
+ forceCoversAnnotation="true"
7
+ convertErrorsToExceptions="true"
8
+ convertNoticesToExceptions="true"
9
+ convertWarningsToExceptions="true"
10
+ processIsolation="false"
11
+ stopOnFailure="true"
12
+ bootstrap="../../autoload.php"
13
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
14
+ >
15
+ <coverage processUncoveredFiles="true">
16
+ <include>
17
+ <directory suffix=".php">./src/LE_ACME2</directory>
18
+ </include>
19
+ </coverage>
20
+ <testsuites>
21
+ <testsuite name="LE_ACME2 Test Suite">
22
+ <directory>./src/LE_ACME2Tests</directory>
23
+ </testsuite>
24
+ </testsuites>
25
+ </phpunit>
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/AbstractKeyValuable.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2;
4
+
5
+ use LE_ACME2\Connector\Connector;
6
+
7
+ abstract class AbstractKeyValuable {
8
+
9
+ const KEY_TYPE_RSA = "RSA";
10
+ const KEY_TYPE_EC = "EC";
11
+
12
+ protected $_identifier;
13
+
14
+ protected static $_directoryPath = null;
15
+
16
+ public static function setCommonKeyDirectoryPath(string $directoryPath) {
17
+
18
+ if(!file_exists($directoryPath)) {
19
+ throw new \RuntimeException('Common Key Directory Path does not exist');
20
+ }
21
+
22
+ self::$_directoryPath = realpath($directoryPath) . DIRECTORY_SEPARATOR;
23
+ }
24
+
25
+ public static function getCommonKeyDirectoryPath() : ?string {
26
+ return self::$_directoryPath;
27
+ }
28
+
29
+ protected function _getKeyDirectoryPath(string $appendix = '') : string {
30
+
31
+ return self::$_directoryPath . $this->_identifier . $appendix . DIRECTORY_SEPARATOR;
32
+ }
33
+
34
+ public function getKeyDirectoryPath() : string {
35
+
36
+ return $this->_getKeyDirectoryPath('');
37
+ }
38
+
39
+ protected function _initKeyDirectory(string $keyType = self::KEY_TYPE_RSA, bool $ignoreIfKeysExist = false) {
40
+
41
+ if(!file_exists($this->getKeyDirectoryPath())) {
42
+
43
+ mkdir($this->getKeyDirectoryPath());
44
+ }
45
+
46
+ if(!$ignoreIfKeysExist && (
47
+ file_exists($this->getKeyDirectoryPath() . 'private.pem') ||
48
+ file_exists($this->getKeyDirectoryPath() . 'public.pem')
49
+ )
50
+ ) {
51
+
52
+ throw new \RuntimeException(
53
+ 'Keys exist already. Exists the ' . get_class($this) . ' already?' . PHP_EOL .
54
+ 'Path: ' . $this->getKeyDirectoryPath()
55
+ );
56
+ }
57
+
58
+ if($keyType == self::KEY_TYPE_RSA) {
59
+
60
+ Utilities\KeyGenerator::RSA(
61
+ $this->getKeyDirectoryPath(),
62
+ 'private.pem',
63
+ 'public.pem'
64
+ );
65
+ } else if($keyType == self::KEY_TYPE_EC) {
66
+
67
+ Utilities\KeyGenerator::EC(
68
+ $this->getKeyDirectoryPath(),
69
+ 'private.pem',
70
+ 'public.pem'
71
+ );
72
+ } else {
73
+
74
+ throw new \RuntimeException('Key type "' . $keyType . '" not supported.');
75
+ }
76
+ }
77
+
78
+ protected function _clearKeyDirectory() {
79
+
80
+ if(file_exists($this->getKeyDirectoryPath() . 'private.pem')) {
81
+ unlink($this->getKeyDirectoryPath() . 'private.pem');
82
+ }
83
+
84
+ if(file_exists($this->getKeyDirectoryPath() . 'public.pem')) {
85
+ unlink($this->getKeyDirectoryPath() . 'public.pem');
86
+ }
87
+ }
88
+
89
+ protected function _getAccountIdentifier(Account $account) : string {
90
+
91
+ $staging = Connector::getInstance()->isUsingStagingServer();
92
+
93
+ return 'account_' . ($staging ? 'staging_' : 'live_') . $account->getEmail();
94
+ }
95
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Account.php ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2;
3
+
4
+ use LE_ACME2\Request;
5
+ use LE_ACME2\Response;
6
+
7
+ use LE_ACME2\Utilities;
8
+ use LE_ACME2\Exception;
9
+
10
+ class Account extends AbstractKeyValuable {
11
+
12
+ private $_email = NULL;
13
+
14
+ public function __construct(string $email) {
15
+
16
+ $this->_setEmail($email);
17
+
18
+ Utilities\Logger::getInstance()->add(
19
+ Utilities\Logger::LEVEL_INFO,
20
+ get_class() . '::' . __FUNCTION__ . ' email: "' . $email . '"'
21
+ );
22
+ Utilities\Logger::getInstance()->add(
23
+ Utilities\Logger::LEVEL_DEBUG,
24
+ get_class() . '::' . __FUNCTION__ . ' path: ' . $this->getKeyDirectoryPath()
25
+ );
26
+ }
27
+
28
+ private function _setEmail(string $email) {
29
+
30
+ $this->_email = $email;
31
+ $this->_identifier = $this->_getAccountIdentifier($this);
32
+ }
33
+
34
+ public function getEmail() : string {
35
+
36
+ return $this->_email;
37
+ }
38
+
39
+ /**
40
+ * @param string $email
41
+ * @return Account|null
42
+ * @throws Exception\AbstractException
43
+ */
44
+ public static function create(string $email) : Account {
45
+
46
+ $account = new self($email);
47
+ $account->_initKeyDirectory();
48
+
49
+ $request = new Request\Account\Create($account);
50
+
51
+ try {
52
+ $response = $request->getResponse();
53
+
54
+ Cache\AccountResponse::getInstance()->set($account, $response);
55
+
56
+ return $account;
57
+
58
+ } catch(Exception\AbstractException $e) {
59
+
60
+ $account->_clearKeyDirectory();
61
+ throw $e;
62
+ }
63
+ }
64
+
65
+ public static function exists(string $email) : bool {
66
+
67
+ $account = new self($email);
68
+
69
+ return file_exists($account->getKeyDirectoryPath()) &&
70
+ file_exists($account->getKeyDirectoryPath() . 'private.pem') &&
71
+ file_exists($account->getKeyDirectoryPath() . 'public.pem');
72
+ }
73
+
74
+ public static function get(string $email) : Account {
75
+
76
+ $account = new self($email);
77
+
78
+ if(!self::exists($email))
79
+ throw new \RuntimeException('Keys not found - does this account exist?');
80
+
81
+ return $account;
82
+ }
83
+
84
+ /**
85
+ * @return Response\AbstractResponse|Response\Account\GetData
86
+ * @throws Exception\InvalidResponse
87
+ * @throws Exception\RateLimitReached
88
+ */
89
+ public function getData() : Response\Account\GetData {
90
+
91
+ $request = new Request\Account\GetData($this);
92
+ return $request->getResponse();
93
+ }
94
+
95
+ /**
96
+ * @param string $email
97
+ * @return bool
98
+ * @throws Exception\RateLimitReached
99
+ */
100
+ public function update(string $email) : bool {
101
+
102
+ $request = new Request\Account\Update($this, $email);
103
+
104
+ try {
105
+ /* $response = */ $request->getResponse();
106
+
107
+ $previousKeyDirectoryPath = $this->getKeyDirectoryPath();
108
+
109
+ $this->_setEmail($email);
110
+
111
+ if($previousKeyDirectoryPath != $this->getKeyDirectoryPath())
112
+ rename($previousKeyDirectoryPath, $this->getKeyDirectoryPath());
113
+
114
+ return true;
115
+
116
+ } catch(Exception\InvalidResponse $e) {
117
+ return false;
118
+ }
119
+ }
120
+
121
+ /**
122
+ * @return bool
123
+ * @throws Exception\RateLimitReached
124
+ */
125
+ public function changeKeys() : bool {
126
+
127
+ Utilities\KeyGenerator::RSA($this->getKeyDirectoryPath(), 'private-replacement.pem', 'public-replacement.pem');
128
+
129
+ $request = new Request\Account\ChangeKeys($this);
130
+ try {
131
+ /* $response = */ $request->getResponse();
132
+
133
+ unlink($this->getKeyDirectoryPath() . 'private.pem');
134
+ unlink($this->getKeyDirectoryPath() . 'public.pem');
135
+ rename($this->getKeyDirectoryPath() . 'private-replacement.pem', $this->getKeyDirectoryPath() . 'private.pem');
136
+ rename($this->getKeyDirectoryPath() . 'public-replacement.pem', $this->getKeyDirectoryPath() . 'public.pem');
137
+ return true;
138
+
139
+ } catch(Exception\InvalidResponse $e) {
140
+
141
+ return false;
142
+ }
143
+ }
144
+
145
+ /**
146
+ * @return bool
147
+ * @throws Exception\RateLimitReached
148
+ */
149
+ public function deactivate() : bool {
150
+
151
+ $request = new Request\Account\Deactivate($this);
152
+
153
+ try {
154
+ /* $response = */ $request->getResponse();
155
+
156
+ return true;
157
+
158
+ } catch(Exception\InvalidResponse $e) {
159
+ return false;
160
+ }
161
+ }
162
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractAuthorizer.php ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Authorizer;
4
+
5
+ use LE_ACME2\Request;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Cache;
9
+ use LE_ACME2\Utilities;
10
+ use LE_ACME2\Exception;
11
+
12
+ use LE_ACME2\Account;
13
+ use LE_ACME2\Order;
14
+
15
+ abstract class AbstractAuthorizer {
16
+
17
+ protected $_account;
18
+ protected $_order;
19
+
20
+ /**
21
+ * AbstractAuthorizer constructor.
22
+ *
23
+ * @param Account $account
24
+ * @param Order $order
25
+ *
26
+ * @throws Exception\InvalidResponse
27
+ * @throws Exception\RateLimitReached
28
+ * @throws Exception\ExpiredAuthorization
29
+ */
30
+ public function __construct(Account $account, Order $order) {
31
+
32
+ $this->_account = $account;
33
+ $this->_order = $order;
34
+
35
+ $this->_fetchAuthorizationResponses();
36
+ }
37
+
38
+ /** @var Response\Authorization\Get[] $_authorizationResponses */
39
+ protected $_authorizationResponses = [];
40
+
41
+ /**
42
+ * @throws Exception\InvalidResponse
43
+ * @throws Exception\RateLimitReached
44
+ * @throws Exception\ExpiredAuthorization
45
+ */
46
+ protected function _fetchAuthorizationResponses() {
47
+
48
+ if(!file_exists($this->_order->getKeyDirectoryPath() . 'private.pem')) {
49
+
50
+ Utilities\Logger::getInstance()->add(
51
+ Utilities\Logger::LEVEL_DEBUG,
52
+ get_class() . '::' . __FUNCTION__ . ' result suppressed (Order has finished already)'
53
+ );
54
+
55
+ return;
56
+ }
57
+
58
+ $orderResponse = Cache\OrderResponse::getInstance()->get($this->_order);
59
+
60
+ foreach($orderResponse->getAuthorizations() as $authorization) {
61
+
62
+ $request = new Request\Authorization\Get($this->_account, $authorization);
63
+ $this->_authorizationResponses[] = $request->getResponse();
64
+ }
65
+ }
66
+
67
+ protected function _hasValidAuthorizationResponses() : bool {
68
+
69
+ return count($this->_authorizationResponses) > 0;
70
+ }
71
+
72
+ public function shouldStartAuthorization() : bool {
73
+
74
+ foreach($this->_authorizationResponses as $response) {
75
+
76
+ $challenge = $response->getChallenge($this->_getChallengeType());
77
+ if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) {
78
+
79
+ Utilities\Logger::getInstance()->add(
80
+ Utilities\Logger::LEVEL_DEBUG,
81
+ get_class() . '::' . __FUNCTION__ . ' "Pending challenge found',
82
+ $challenge
83
+ );
84
+
85
+ return true;
86
+ }
87
+ }
88
+ return false;
89
+ }
90
+
91
+ abstract protected function _getChallengeType() : string;
92
+
93
+ /**
94
+ * @throws Exception\AuthorizationInvalid
95
+ * @throws Exception\InvalidResponse
96
+ * @throws Exception\RateLimitReached
97
+ * @throws Exception\ExpiredAuthorization
98
+ */
99
+ public function progress() {
100
+
101
+ if(!$this->_hasValidAuthorizationResponses())
102
+ return;
103
+
104
+ $existsNotValidChallenges = false;
105
+
106
+ foreach($this->_authorizationResponses as $authorizationResponse) {
107
+
108
+ $challenge = $authorizationResponse->getChallenge($this->_getChallengeType());
109
+
110
+ if($this->_existsNotValidChallenges($challenge, $authorizationResponse)) {
111
+ $existsNotValidChallenges = true;
112
+ }
113
+ }
114
+
115
+ $this->_finished = !$existsNotValidChallenges;
116
+ }
117
+
118
+ /**
119
+ * @param Response\Authorization\Struct\Challenge $challenge
120
+ * @param Response\Authorization\Get $authorizationResponse
121
+ * @return bool
122
+ *
123
+ * @throws Exception\AuthorizationInvalid
124
+ */
125
+ protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge,
126
+ Response\Authorization\Get $authorizationResponse
127
+ ) : bool {
128
+
129
+ if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) {
130
+
131
+ Utilities\Logger::getInstance()->add(
132
+ Utilities\Logger::LEVEL_DEBUG,
133
+ get_class() . '::' . __FUNCTION__ . ' "Non valid challenge found',
134
+ $challenge
135
+ );
136
+
137
+ return true;
138
+ }
139
+ else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PROGRESSING) {
140
+
141
+ // Should come back later
142
+ return true;
143
+ }
144
+ else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_VALID) {
145
+
146
+ }
147
+ else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) {
148
+ throw new Exception\AuthorizationInvalid(
149
+ 'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified'
150
+ );
151
+ }
152
+ else {
153
+
154
+ throw new \RuntimeException('Challenge status "' . $challenge->status . '" is not implemented');
155
+ }
156
+
157
+ return false;
158
+ }
159
+
160
+ protected $_finished = false;
161
+
162
+ public function hasFinished() : bool {
163
+
164
+ Utilities\Logger::getInstance()->add(
165
+ Utilities\Logger::LEVEL_DEBUG,
166
+ get_called_class() . '::' . __FUNCTION__,
167
+ $this->_finished
168
+ );
169
+
170
+ return $this->_finished;
171
+ }
172
+ }
173
+
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractDNSWriter.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Authorizer;
4
+
5
+ use LE_ACME2\Order;
6
+
7
+ abstract class AbstractDNSWriter {
8
+
9
+ /**
10
+ * @param Order $order
11
+ * @param string $identifier
12
+ * @param string $digest
13
+ *
14
+ * @return bool return true, if the dns configuration is usable and the process should be progressed
15
+ */
16
+ abstract public function write(Order $order, string $identifier, string $digest) : bool;
17
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/DNS.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Authorizer;
4
+
5
+ use LE_ACME2\Request;
6
+ use LE_ACME2\Response;
7
+ use LE_ACME2\Exception;
8
+
9
+ use LE_ACME2\Order;
10
+ use LE_ACME2\Struct\ChallengeAuthorizationKey;
11
+ use LE_ACME2\Utilities;
12
+
13
+ class DNS extends AbstractAuthorizer {
14
+
15
+ protected function _getChallengeType(): string {
16
+ return Order::CHALLENGE_TYPE_DNS;
17
+ }
18
+
19
+ /** @var AbstractDNSWriter $_dnsWriter */
20
+ private static $_dnsWriter = null;
21
+
22
+ public static function setWriter(AbstractDNSWriter $dnsWriter) : void {
23
+ self::$_dnsWriter = $dnsWriter;
24
+ }
25
+
26
+ /**
27
+ * @param Response\Authorization\Struct\Challenge $challenge
28
+ * @param Response\Authorization\Get $authorizationResponse
29
+ * @return bool
30
+ *
31
+ * @throws Exception\AuthorizationInvalid
32
+ * @throws Exception\DNSAuthorizationInvalid
33
+ * @throws Exception\ExpiredAuthorization
34
+ * @throws Exception\InvalidResponse
35
+ * @throws Exception\RateLimitReached
36
+ */
37
+ protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge,
38
+ Response\Authorization\Get $authorizationResponse
39
+ ) : bool {
40
+
41
+ if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) {
42
+
43
+ if(self::$_dnsWriter === null) {
44
+ throw new \RuntimeException('DNS writer is not set');
45
+ }
46
+
47
+ if( self::$_dnsWriter->write(
48
+ $this->_order,
49
+ $authorizationResponse->getIdentifier()->value,
50
+ (new ChallengeAuthorizationKey($this->_account))->getEncoded($challenge->token)
51
+ )
52
+ ) {
53
+ $request = new Request\Authorization\Start($this->_account, $this->_order, $challenge);
54
+ /* $response = */ $request->getResponse();
55
+ } else {
56
+
57
+ Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Pending challenge deferred');
58
+ }
59
+ }
60
+
61
+ if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) {
62
+ throw new Exception\DNSAuthorizationInvalid(
63
+ 'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified'
64
+ );
65
+ }
66
+
67
+ return parent::_existsNotValidChallenges($challenge, $authorizationResponse);
68
+ }
69
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/HTTP.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Authorizer;
4
+
5
+ use LE_ACME2\Request;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Struct\ChallengeAuthorizationKey;
9
+ use LE_ACME2\Utilities;
10
+ use LE_ACME2\Exception;
11
+
12
+ use LE_ACME2\Order;
13
+
14
+ class HTTP extends AbstractAuthorizer {
15
+
16
+ protected static $_directoryPath = null;
17
+
18
+ public static function setDirectoryPath(string $directoryPath) {
19
+
20
+ if(!file_exists($directoryPath)) {
21
+ throw new \RuntimeException('HTTP authorization directory path does not exist');
22
+ }
23
+
24
+ self::$_directoryPath = realpath($directoryPath) . DIRECTORY_SEPARATOR;
25
+ }
26
+
27
+ public static function getDirectoryPath() : ?string {
28
+ return self::$_directoryPath;
29
+ }
30
+
31
+ protected function _getChallengeType(): string {
32
+ return Order::CHALLENGE_TYPE_HTTP;
33
+ }
34
+
35
+ /**
36
+ * @param Response\Authorization\Struct\Challenge $challenge
37
+ * @param Response\Authorization\Get $authorizationResponse
38
+ * @return bool
39
+ *
40
+ * @throws Exception\AuthorizationInvalid
41
+ * @throws Exception\ExpiredAuthorization
42
+ * @throws Exception\InvalidResponse
43
+ * @throws Exception\RateLimitReached
44
+ */
45
+ protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge,
46
+ Response\Authorization\Get $authorizationResponse
47
+ ) : bool {
48
+
49
+ Utilities\Logger::getInstance()->add(
50
+ Utilities\Logger::LEVEL_DEBUG,
51
+ 'Challenge "' . $challenge->token . '" has status:' . $challenge->status
52
+ );
53
+
54
+ if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) {
55
+
56
+ $this->_writeToFile($challenge);
57
+ if($this->_validateFile($authorizationResponse->getIdentifier()->value, $challenge)) {
58
+
59
+ $request = new Request\Authorization\Start($this->_account, $this->_order, $challenge);
60
+ /* $response = */ $request->getResponse();
61
+ } else {
62
+
63
+ Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Could not validate HTTP Authorization file');
64
+ }
65
+ }
66
+
67
+ if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) {
68
+ throw new Exception\HTTPAuthorizationInvalid(
69
+ 'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified'
70
+ );
71
+ }
72
+
73
+ return parent::_existsNotValidChallenges($challenge, $authorizationResponse);
74
+ }
75
+
76
+ private function _writeToFile(Response\Authorization\Struct\Challenge $challenge) : void {
77
+
78
+ file_put_contents(
79
+ self::$_directoryPath . $challenge->token,
80
+ (new ChallengeAuthorizationKey($this->_account))->get($challenge->token)
81
+ );
82
+ }
83
+
84
+ /**
85
+ * @param string $domain
86
+ * @param Response\Authorization\Struct\Challenge $challenge
87
+ * @return bool
88
+ *
89
+ * @throws Exception\HTTPAuthorizationInvalid
90
+ */
91
+ private function _validateFile(string $domain, Response\Authorization\Struct\Challenge $challenge) : bool {
92
+
93
+ $challengeAuthorizationKey = new ChallengeAuthorizationKey($this->_account);
94
+
95
+ $requestURL = 'http://' . $domain . '/.well-known/acme-challenge/' . $challenge->token;
96
+ $handle = curl_init();
97
+ curl_setopt($handle, CURLOPT_URL, $requestURL);
98
+ curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
99
+ curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
100
+ $response = curl_exec($handle);
101
+
102
+ $result = !empty($response) && $response == $challengeAuthorizationKey->get($challenge->token);
103
+
104
+ if(!$result) {
105
+
106
+ throw new Exception\HTTPAuthorizationInvalid(
107
+ 'HTTP challenge for "' . $domain . '"": ' .
108
+ $domain . '/.well-known/acme-challenge/' . $challenge->token .
109
+ ' tested, found invalid. CURL response: ' . var_export($response, true)
110
+ );
111
+ }
112
+ return true;
113
+ }
114
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/AbstractKeyValuableCache.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2\Cache;
3
+
4
+ use LE_ACME2\AbstractKeyValuable;
5
+
6
+ abstract class AbstractKeyValuableCache {
7
+
8
+ protected function __construct() {}
9
+
10
+ protected function _getObjectIdentifier(AbstractKeyValuable $object) : string {
11
+ return $object->getKeyDirectoryPath();
12
+ }
13
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/AccountResponse.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2\Cache;
3
+
4
+ use LE_ACME2\Account;
5
+ use LE_ACME2\Connector;
6
+ use LE_ACME2\Request;
7
+ use LE_ACME2\Response;
8
+ use LE_ACME2\Exception;
9
+ use LE_ACME2\Utilities;
10
+ use LE_ACME2\SingletonTrait;
11
+
12
+ class AccountResponse extends AbstractKeyValuableCache {
13
+
14
+ use SingletonTrait;
15
+
16
+ private const _FILE = 'CacheResponse';
17
+ private const _DEPRECATED_FILE = 'DirectoryNewAccountResponse';
18
+
19
+ private $_responses = [];
20
+
21
+ /**
22
+ * @param Account $account
23
+ * @return Response\Account\AbstractAccount
24
+ * @throws Exception\InvalidResponse
25
+ * @throws Exception\RateLimitReached
26
+ */
27
+ public function get(Account $account): Response\Account\AbstractAccount {
28
+
29
+ $accountIdentifier = $this->_getObjectIdentifier($account);
30
+
31
+ if(array_key_exists($accountIdentifier, $this->_responses)) {
32
+ return $this->_responses[ $accountIdentifier ];
33
+ }
34
+ $this->_responses[ $accountIdentifier ] = null;
35
+
36
+ $cacheFile = $account->getKeyDirectoryPath() . self::_FILE;
37
+ $deprecatedCacheFile = $account->getKeyDirectoryPath() . self::_DEPRECATED_FILE;
38
+
39
+ if(file_exists($deprecatedCacheFile) && !file_exists($cacheFile)) {
40
+ rename($deprecatedCacheFile, $cacheFile);
41
+ }
42
+
43
+ if(file_exists($cacheFile) && filemtime($cacheFile) > strtotime('-7 days')) {
44
+
45
+ $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile));
46
+
47
+ $response = new Response\Account\Create($rawResponse);
48
+
49
+ $this->_responses[ $accountIdentifier ] = $response;
50
+
51
+ Utilities\Logger::getInstance()->add(
52
+ Utilities\Logger::LEVEL_DEBUG,
53
+ get_class() . '::' . __FUNCTION__ . ' response from cache'
54
+ );
55
+
56
+ return $response;
57
+ }
58
+
59
+ $request = new Request\Account\Get($account);
60
+ $response = $request->getResponse();
61
+
62
+ $this->set($account, $response);
63
+
64
+ return $response;
65
+ }
66
+
67
+ public function set(Account $account, Response\Account\AbstractAccount $response = null) : void {
68
+
69
+ $accountIdentifier = $this->_getObjectIdentifier($account);
70
+
71
+ $filePath = $account->getKeyDirectoryPath() . self::_FILE;
72
+
73
+ if($response === null) {
74
+
75
+ unset($this->_responses[$accountIdentifier]);
76
+
77
+ if(file_exists($filePath)) {
78
+ unlink($filePath);
79
+ }
80
+
81
+ return;
82
+ }
83
+
84
+ $this->_responses[$accountIdentifier] = $response;
85
+ file_put_contents($filePath, $response->getRaw()->toString());
86
+ }
87
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/DirectoryResponse.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2\Cache;
3
+
4
+ use LE_ACME2\Connector;
5
+
6
+ use LE_ACME2\Account;
7
+ use LE_ACME2\SingletonTrait;
8
+
9
+ use LE_ACME2\Exception;
10
+ use LE_ACME2\Request;
11
+ use LE_ACME2\Response;
12
+
13
+ class DirectoryResponse {
14
+
15
+ use SingletonTrait;
16
+
17
+ private const _FILE = 'DirectoryResponse';
18
+
19
+ private function __construct() {}
20
+
21
+ private $_responses = [];
22
+ private $_index = 0;
23
+
24
+ /**
25
+ * @return Response\GetDirectory
26
+ * @throws Exception\InvalidResponse
27
+ * @throws Exception\RateLimitReached
28
+ */
29
+ public function get() : Response\GetDirectory {
30
+
31
+ if(array_key_exists($this->_index, $this->_responses)) {
32
+ return $this->_responses[$this->_index];
33
+ }
34
+ $this->_responses[$this->_index] = null;
35
+
36
+ $cacheFile = Account::getCommonKeyDirectoryPath() . self::_FILE;
37
+
38
+ if(file_exists($cacheFile) && filemtime($cacheFile) > strtotime('-2 days')) {
39
+
40
+ $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile));
41
+
42
+ try {
43
+ return $this->_responses[$this->_index] = new Response\GetDirectory($rawResponse);
44
+
45
+ } catch(Exception\AbstractException $e) {
46
+ unlink($cacheFile);
47
+ }
48
+ }
49
+
50
+ $request = new Request\GetDirectory();
51
+ $response = $request->getResponse();
52
+ $this->set($response);
53
+
54
+ return $response;
55
+ }
56
+
57
+ public function set(Response\GetDirectory $response) : void {
58
+
59
+ $cacheFile = Account::getCommonKeyDirectoryPath() . self::_FILE;
60
+
61
+ $this->_responses[$this->_index] = $response;
62
+ file_put_contents($cacheFile, $response->getRaw()->toString());
63
+ }
64
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/NewNonceResponse.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2\Cache;
3
+
4
+ use LE_ACME2\SingletonTrait;
5
+
6
+ use LE_ACME2\Exception;
7
+ use LE_ACME2\Request;
8
+ use LE_ACME2\Response;
9
+
10
+ class NewNonceResponse {
11
+
12
+ use SingletonTrait;
13
+
14
+ private function __construct() {}
15
+
16
+ private $_responses = [];
17
+ private $_index = 0;
18
+
19
+ /**
20
+ * @return Response\GetNewNonce
21
+ * @throws Exception\InvalidResponse
22
+ * @throws Exception\RateLimitReached
23
+ */
24
+ public function get() : Response\GetNewNonce {
25
+
26
+ if(array_key_exists($this->_index, $this->_responses)) {
27
+ return $this->_responses[$this->_index];
28
+ }
29
+ $this->_responses[$this->_index] = null;
30
+
31
+ $request = new Request\GetNewNonce();
32
+ $response = $request->getResponse();
33
+ $this->set($response);
34
+
35
+ return $response;
36
+ }
37
+
38
+ public function set(Response\GetNewNonce $response) : void {
39
+ $this->_responses[$this->_index] = $response;
40
+ }
41
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/OrderResponse.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2\Cache;
3
+
4
+ use LE_ACME2\Connector;
5
+ use LE_ACME2\Order;
6
+ use LE_ACME2\Request;
7
+ use LE_ACME2\Response;
8
+ use LE_ACME2\Exception;
9
+ use LE_ACME2\Utilities;
10
+ use LE_ACME2\SingletonTrait;
11
+
12
+ class OrderResponse extends AbstractKeyValuableCache {
13
+
14
+ use SingletonTrait;
15
+
16
+ private const _FILE = 'CacheResponse';
17
+ private const _DEPRECATED_FILE = 'DirectoryNewOrderResponse';
18
+
19
+ private $_responses = [];
20
+
21
+ public function exists(Order $order) : bool {
22
+
23
+ $cacheFile = $order->getKeyDirectoryPath() . self::_FILE;
24
+ $deprecatedCacheFile = $order->getKeyDirectoryPath() . self::_DEPRECATED_FILE;
25
+
26
+ return file_exists($cacheFile) || file_exists($deprecatedCacheFile);
27
+ }
28
+
29
+ /**
30
+ * @param Order $order
31
+ * @return Response\Order\AbstractOrder
32
+ * @throws Exception\InvalidResponse
33
+ * @throws Exception\RateLimitReached
34
+ */
35
+ public function get(Order $order): Response\Order\AbstractOrder {
36
+
37
+ $accountIdentifier = $this->_getObjectIdentifier($order->getAccount());
38
+ $orderIdentifier = $this->_getObjectIdentifier($order);
39
+
40
+ if(!isset($this->_responses[$accountIdentifier])) {
41
+ $this->_responses[$accountIdentifier] = [];
42
+ }
43
+
44
+ if(array_key_exists($orderIdentifier, $this->_responses[$accountIdentifier])) {
45
+ return $this->_responses[ $accountIdentifier ][ $orderIdentifier ];
46
+ }
47
+ $this->_responses[ $accountIdentifier ][ $orderIdentifier ] = null;
48
+
49
+ $cacheFile = $order->getKeyDirectoryPath() . self::_FILE;
50
+ $deprecatedCacheFile = $order->getKeyDirectoryPath() . self::_DEPRECATED_FILE;
51
+
52
+ if(file_exists($deprecatedCacheFile) && !file_exists($cacheFile)) {
53
+ rename($deprecatedCacheFile, $cacheFile);
54
+ }
55
+
56
+ if(file_exists($cacheFile)) {
57
+
58
+ $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile));
59
+
60
+ $response = new Response\Order\Create($rawResponse);
61
+
62
+ if(
63
+ $response->getStatus() != Response\Order\AbstractOrder::STATUS_VALID
64
+ ) {
65
+
66
+ Utilities\Logger::getInstance()->add(
67
+ Utilities\Logger::LEVEL_DEBUG,
68
+ get_class() . '::' . __FUNCTION__ . ' (cache did not satisfy, status "' . $response->getStatus() . '")'
69
+ );
70
+
71
+ $request = new Request\Order\Get($order, $response);
72
+ $response = $request->getResponse();
73
+ $this->set($order, $response);
74
+ return $response;
75
+ }
76
+
77
+ Utilities\Logger::getInstance()->add(
78
+ Utilities\Logger::LEVEL_DEBUG,
79
+ get_class() . '::' . __FUNCTION__ . ' (from cache, status "' . $response->getStatus() . '")'
80
+ );
81
+
82
+ $this->_responses[$accountIdentifier][$orderIdentifier] = $response;
83
+
84
+ return $response;
85
+ }
86
+
87
+ throw new \RuntimeException(
88
+ self::_FILE . ' could not be found for order: ' .
89
+ '- Path: ' . $order->getKeyDirectoryPath() . PHP_EOL .
90
+ '- Subjects: ' . var_export($order->getSubjects(), true) . PHP_EOL
91
+ );
92
+ }
93
+
94
+ public function set(Order $order, Response\Order\AbstractOrder $response = null) : void {
95
+
96
+ $accountIdentifier = $this->_getObjectIdentifier($order->getAccount());
97
+ $orderIdentifier = $this->_getObjectIdentifier($order);
98
+
99
+ $filePath = $order->getKeyDirectoryPath() . self::_FILE;
100
+
101
+ if($response === null) {
102
+
103
+ unset($this->_responses[$accountIdentifier][$orderIdentifier]);
104
+
105
+ if(file_exists($filePath)) {
106
+ unlink($filePath);
107
+ }
108
+
109
+ return;
110
+ }
111
+
112
+ $this->_responses[$accountIdentifier][$orderIdentifier] = $response;
113
+ file_put_contents($filePath, $response->getRaw()->toString());
114
+ }
115
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Connector/Connector.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Connector;
4
+
5
+ use LE_ACME2\Request;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\SingletonTrait;
9
+ use LE_ACME2\Cache;
10
+ use LE_ACME2\Utilities;
11
+ use LE_ACME2\Exception;
12
+
13
+ class Connector {
14
+
15
+ use SingletonTrait;
16
+
17
+ const METHOD_GET = 'GET';
18
+ const METHOD_HEAD = 'HEAD';
19
+ const METHOD_POST = 'POST';
20
+
21
+ private function __construct() {}
22
+
23
+ protected $_baseURL = 'https://acme-v02.api.letsencrypt.org';
24
+ protected $_stagingBaseURL = 'https://acme-staging-v02.api.letsencrypt.org';
25
+
26
+ protected $_useStagingServer = true;
27
+
28
+ public function useStagingServer(bool $useStagingServer) {
29
+ $this->_useStagingServer = $useStagingServer;
30
+ }
31
+
32
+ public function isUsingStagingServer() : bool {
33
+ return $this->_useStagingServer;
34
+ }
35
+
36
+ public function getBaseURL() : string {
37
+ return $this->_useStagingServer ? $this->_stagingBaseURL : $this->_baseURL;
38
+ }
39
+
40
+ /**
41
+ * Makes a Curl request.
42
+ *
43
+ * @param string $method The HTTP method to use. Accepting GET, POST and HEAD requests.
44
+ * @param string $url The URL to make the request to.
45
+ * @param string $data The body to attach to a POST request. Expected as a JSON encoded string.
46
+ *
47
+ * @return RawResponse
48
+ * @throws Exception\InvalidResponse
49
+ * @throws Exception\RateLimitReached
50
+ */
51
+ public function request(string $method, string $url, string $data = null) : RawResponse {
52
+
53
+ Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'will request from ' . $url, $data);
54
+
55
+ $handle = curl_init();
56
+
57
+ $headers = array(
58
+ 'Accept: application/json',
59
+ 'Content-Type: ' . ($method == self::METHOD_POST ? 'application/jose+json' : 'application/json') // ACME draft-10, section 6.2
60
+ );
61
+
62
+ curl_setopt($handle, CURLOPT_URL, $url);
63
+ curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
64
+ curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
65
+ curl_setopt($handle, CURLOPT_HEADER, true);
66
+
67
+ switch ($method) {
68
+ case self::METHOD_GET:
69
+ break;
70
+ case self::METHOD_POST:
71
+ curl_setopt($handle, CURLOPT_POST, true);
72
+ curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
73
+ break;
74
+ case self::METHOD_HEAD:
75
+ curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'HEAD');
76
+ curl_setopt($handle, CURLOPT_NOBODY, true);
77
+ break;
78
+ default:
79
+ throw new \RuntimeException('HTTP request ' . $method . ' not supported.');
80
+ break;
81
+ }
82
+ $response = curl_exec($handle);
83
+
84
+ if(curl_errno($handle)) {
85
+ throw new \RuntimeException('Curl: ' . curl_error($handle));
86
+ }
87
+
88
+ $header_size = curl_getinfo($handle, CURLINFO_HEADER_SIZE);
89
+
90
+ $rawResponse = new RawResponse();
91
+ $rawResponse->init($method, $url, $response, $header_size);
92
+
93
+ Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, self::class . ': response received', $rawResponse);
94
+
95
+
96
+ try {
97
+ $getNewNonceResponse = new Response\GetNewNonce($rawResponse);
98
+ Cache\NewNonceResponse::getInstance()->set($getNewNonceResponse);
99
+
100
+ } catch(Exception\InvalidResponse $e) {
101
+
102
+ if($method == self::METHOD_POST) {
103
+ $request = new Request\GetNewNonce();
104
+ Cache\NewNonceResponse::getInstance()->set($request->getResponse());
105
+ }
106
+ }
107
+
108
+ return $rawResponse;
109
+ }
110
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Connector/RawResponse.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Connector;
4
+
5
+ class RawResponse {
6
+
7
+ /** @var string */
8
+ public $request;
9
+
10
+ /** @var array */
11
+ public $header;
12
+
13
+ /** @var array|string */
14
+ public $body;
15
+
16
+ public function init(string $method, string $url, string $response, int $headerSize) {
17
+
18
+ $header = substr($response, 0, $headerSize);
19
+ $body = substr($response, $headerSize);
20
+
21
+ $body_json = json_decode($body, true);
22
+
23
+ $this->request = $method . ' ' . $url;
24
+
25
+ $this->header = array_map(function($line) {
26
+ return trim($line);
27
+ }, explode("\n", $header));
28
+
29
+ $this->body = $body_json === null ? $body : $body_json;
30
+ }
31
+
32
+ public function toString() : string {
33
+
34
+ return serialize([
35
+ 'request' => $this->request,
36
+ 'header' => $this->header,
37
+ 'body' => $this->body,
38
+ ]);
39
+ }
40
+
41
+ public static function getFromString(string $string) : self {
42
+
43
+ $array = unserialize($string);
44
+
45
+ $rawResponse = new self();
46
+
47
+ $rawResponse->request = $array['request'];
48
+ $rawResponse->header = $array['header'];
49
+ $rawResponse->body = $array['body'];
50
+
51
+ return $rawResponse;
52
+ }
53
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/AbstractException.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ use LE_ACME2\Utilities;
6
+
7
+ abstract class AbstractException extends \Exception {
8
+
9
+ public function __construct(string $message) {
10
+
11
+ Utilities\Logger::getInstance()->add(
12
+ Utilities\Logger::LEVEL_DEBUG,
13
+ 'Exception "' . get_called_class() . '" thrown '
14
+ );
15
+
16
+ parent::__construct($message);
17
+ }
18
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/AuthorizationInvalid.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ class AuthorizationInvalid extends AbstractException {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/DNSAuthorizationInvalid.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ class DNSAuthorizationInvalid extends AuthorizationInvalid {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/ExpiredAuthorization.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ class ExpiredAuthorization extends AbstractException {
6
+
7
+ public function __construct() {
8
+ parent::__construct("Expired authorization received");
9
+ }
10
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/HTTPAuthorizationInvalid.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ class HTTPAuthorizationInvalid extends AuthorizationInvalid {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/InvalidResponse.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ use LE_ACME2\Connector\RawResponse;
6
+
7
+ class InvalidResponse extends AbstractException {
8
+
9
+ private $_rawResponse;
10
+ private $_responseStatus;
11
+
12
+ public function __construct(RawResponse $rawResponse, string $responseStatus = null) {
13
+
14
+ $this->_rawResponse = $rawResponse;
15
+ $this->_responseStatus = $responseStatus;
16
+
17
+ if($responseStatus === '') {
18
+ $responseStatus = 'Unknown response status';
19
+ }
20
+
21
+ if(isset($this->_rawResponse->body['type'])) {
22
+ $responseStatus = $this->_rawResponse->body['type'];
23
+ }
24
+
25
+ if(isset($this->_rawResponse->body['detail'])) {
26
+ $responseStatus .= ' - ' . $this->_rawResponse->body['detail'];
27
+ }
28
+
29
+ parent::__construct('Invalid response received: ' . $responseStatus);
30
+ }
31
+
32
+ public function getRawResponse() : RawResponse {
33
+ return $this->_rawResponse;
34
+ }
35
+
36
+ public function getResponseStatus() : ?string {
37
+ return $this->_responseStatus;
38
+ }
39
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/OpenSSLException.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ class OpenSSLException extends AbstractException {
6
+
7
+ public function __construct(string $function) {
8
+
9
+ $errors = [];
10
+ while(($error = openssl_error_string()) !== false) {
11
+ $errors[] = $error;
12
+ }
13
+
14
+ parent::__construct(
15
+ $function . ' failed - error messages: ' . var_export($errors, true)
16
+ );
17
+ }
18
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/RateLimitReached.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ class RateLimitReached extends AbstractException {
6
+
7
+ public function __construct(string $request, string $detail) {
8
+ parent::__construct(
9
+ "Invalid response received for request (" . $request . "): " .
10
+ "rate limit reached - " . $detail
11
+ );
12
+ }
13
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/StatusInvalid.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Exception;
4
+
5
+ class StatusInvalid extends AbstractException {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Order.php ADDED
@@ -0,0 +1,437 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2;
4
+
5
+ use LE_ACME2\Request;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Cache;
9
+ use LE_ACME2\Authorizer;
10
+ use LE_ACME2\Exception;
11
+ use LE_ACME2\Utilities;
12
+
13
+ class Order extends AbstractKeyValuable {
14
+
15
+ const CHALLENGE_TYPE_HTTP = 'http-01';
16
+ const CHALLENGE_TYPE_DNS = 'dns-01';
17
+
18
+ /**
19
+ * @deprecated
20
+ * @param $directoryPath
21
+ */
22
+ public static function setHTTPAuthorizationDirectoryPath(string $directoryPath) {
23
+
24
+ Authorizer\HTTP::setDirectoryPath($directoryPath);
25
+ }
26
+
27
+ CONST IDENTRUST_ISSUER_CN = 'DST Root CA X3';
28
+
29
+ /** @var string|null $_preferredChain */
30
+ private static $_preferredChain = null;
31
+
32
+ public static function setPreferredChain(string $issuerCN = null) {
33
+ self::$_preferredChain = $issuerCN;
34
+ }
35
+
36
+ protected $_account;
37
+ protected $_subjects;
38
+
39
+ public function __construct(Account $account, array $subjects) {
40
+
41
+ array_map(function($subject) {
42
+
43
+ if(preg_match_all('~(\*\.)~', $subject) > 1)
44
+ throw new \RuntimeException('Cannot create orders with multiple wildcards in one domain.');
45
+
46
+ }, $subjects);
47
+
48
+ $this->_account = $account;
49
+ $this->_subjects = $subjects;
50
+
51
+ $this->_identifier = $this->_getAccountIdentifier($account) . DIRECTORY_SEPARATOR .
52
+ 'order_' . md5(implode('|', $subjects));
53
+
54
+ Utilities\Logger::getInstance()->add(
55
+ Utilities\Logger::LEVEL_INFO,
56
+ get_class() . '::' . __FUNCTION__ . ' "' . implode(':', $this->getSubjects()) . '"'
57
+ );
58
+
59
+ Utilities\Logger::getInstance()->add(
60
+ Utilities\Logger::LEVEL_DEBUG,
61
+ get_class() . '::' . __FUNCTION__ . ' path: ' . $this->getKeyDirectoryPath()
62
+ );
63
+ }
64
+
65
+ public function getAccount() : Account {
66
+ return $this->_account;
67
+ }
68
+
69
+ public function getSubjects() : array {
70
+
71
+ return $this->_subjects;
72
+ }
73
+
74
+ /**
75
+ * @param Account $account
76
+ * @param array $subjects
77
+ * @param string $keyType
78
+ * @return Order
79
+ * @throws Exception\AbstractException
80
+ */
81
+ public static function create(Account $account, array $subjects, string $keyType = self::KEY_TYPE_RSA) : Order {
82
+
83
+ $order = new self($account, $subjects);
84
+ return $order->_create($keyType, false);
85
+ }
86
+
87
+ /**
88
+ * @param $keyType
89
+ * @param bool $ignoreIfKeysExist
90
+ * @return Order
91
+ * @throws Exception\AbstractException
92
+ */
93
+ protected function _create(string $keyType, bool $ignoreIfKeysExist = false) : Order {
94
+
95
+ $this->_initKeyDirectory($keyType, $ignoreIfKeysExist);
96
+
97
+ $request = new Request\Order\Create($this);
98
+
99
+ try {
100
+ $response = $request->getResponse();
101
+
102
+ Cache\OrderResponse::getInstance()->set($this, $response);
103
+ return $this;
104
+
105
+ } catch(Exception\AbstractException $e) {
106
+ $this->_clearKeyDirectory();
107
+ throw $e;
108
+ }
109
+ }
110
+
111
+ public static function exists(Account $account, array $subjects) : bool {
112
+
113
+ $order = new self($account, $subjects);
114
+ return Cache\OrderResponse::getInstance()->exists($order);
115
+ }
116
+
117
+ public static function get(Account $account, array $subjects) : Order {
118
+
119
+ $order = new self($account, $subjects);
120
+
121
+ if(!self::exists($account, $subjects))
122
+ throw new \RuntimeException('Order does not exist');
123
+
124
+ return $order;
125
+ }
126
+
127
+ /** @var Authorizer\AbstractAuthorizer|Authorizer\HTTP|null $_authorizer */
128
+ protected $_authorizer = null;
129
+
130
+ /**
131
+ * @param $type
132
+ * @return Authorizer\AbstractAuthorizer|Authorizer\HTTP|null
133
+ * @throws Exception\InvalidResponse
134
+ * @throws Exception\RateLimitReached
135
+ * @throws Exception\ExpiredAuthorization
136
+ */
137
+ protected function _getAuthorizer(string $type) : Authorizer\AbstractAuthorizer {
138
+
139
+ if($this->_authorizer === null) {
140
+
141
+ if($type == self::CHALLENGE_TYPE_HTTP) {
142
+ $this->_authorizer = new Authorizer\HTTP($this->_account, $this);
143
+ } else if($type == self::CHALLENGE_TYPE_DNS) {
144
+ $this->_authorizer = new Authorizer\DNS($this->_account, $this);
145
+ } else {
146
+ throw new \RuntimeException('Challenge type not implemented');
147
+ }
148
+ }
149
+ return $this->_authorizer;
150
+ }
151
+
152
+ /**
153
+ * The Authorization has expired, so we clean the complete order to restart again on the next call
154
+ */
155
+ protected function _clearAfterExpiredAuthorization() {
156
+
157
+ Utilities\Logger::getInstance()->add(
158
+ Utilities\Logger::LEVEL_INFO,
159
+ get_class() . '::' . __FUNCTION__ . ' "Will clear after expired authorization'
160
+ );
161
+
162
+ $this->clear();
163
+ }
164
+
165
+ public function clear() {
166
+ Cache\OrderResponse::getInstance()->set($this, null);
167
+ $this->_clearKeyDirectory();
168
+ }
169
+
170
+ /**
171
+ * @return bool
172
+ * @param $type
173
+ * @throws Exception\InvalidResponse
174
+ * @throws Exception\RateLimitReached
175
+ */
176
+ public function shouldStartAuthorization(string $type) : bool {
177
+
178
+ try {
179
+ return $this->_getAuthorizer($type)->shouldStartAuthorization();
180
+ } catch(Exception\ExpiredAuthorization $e) {
181
+
182
+ $this->_clearAfterExpiredAuthorization();
183
+
184
+ return false;
185
+ }
186
+ }
187
+
188
+ /**
189
+ * @param $type
190
+ * @return bool
191
+ * @throws Exception\InvalidResponse
192
+ * @throws Exception\RateLimitReached
193
+ * @throws Exception\AuthorizationInvalid
194
+ */
195
+ public function authorize(string $type) : bool {
196
+
197
+ try {
198
+ $authorizer = $this->_getAuthorizer($type);
199
+ $authorizer->progress();
200
+
201
+ return $authorizer->hasFinished();
202
+ } catch(Exception\ExpiredAuthorization $e) {
203
+
204
+ $this->_clearAfterExpiredAuthorization();
205
+
206
+ return false;
207
+ }
208
+ }
209
+
210
+ /**
211
+ * @throws Exception\InvalidResponse
212
+ * @throws Exception\RateLimitReached
213
+ */
214
+ public function finalize() {
215
+
216
+ if(!is_object($this->_authorizer) || !$this->_authorizer->hasFinished()) {
217
+
218
+ throw new \RuntimeException('Not all challenges are valid. Please check result of authorize() first!');
219
+ }
220
+
221
+ Utilities\Logger::getInstance()->add(
222
+ Utilities\Logger::LEVEL_INFO,
223
+ get_class() . '::' . __FUNCTION__ . ' "Will finalize'
224
+ );
225
+
226
+ $orderResponse = Cache\OrderResponse::getInstance()->get($this);
227
+
228
+ if(
229
+ $orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_PENDING /* DEPRECATED AFTER JULI 5TH 2018 */ ||
230
+ $orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_READY // ACME draft-12 Section 7.1.6
231
+ ) {
232
+
233
+ $request = new Request\Order\Finalize($this, $orderResponse);
234
+ $orderResponse = $request->getResponse();
235
+ Cache\OrderResponse::getInstance()->set($this, $orderResponse);
236
+ }
237
+
238
+ if($orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_VALID) {
239
+
240
+ $request = new Request\Order\GetCertificate($this, $orderResponse);
241
+ $response = $request->getResponse();
242
+
243
+ $certificate = $response->getCertificate();
244
+ $intermediate = $response->getIntermediate();
245
+
246
+ //$certificateInfo = openssl_x509_parse($certificate);
247
+ //$certificateValidToTimeTimestamp = $certificateInfo['validTo_time_t'];
248
+ $intermediateInfo = openssl_x509_parse($intermediate);
249
+
250
+ if(self::$_preferredChain !== null) {
251
+ Utilities\Logger::getInstance()->add(
252
+ Utilities\Logger::LEVEL_INFO,
253
+ 'Preferred chain is set: ' . self::$_preferredChain
254
+ );
255
+ }
256
+
257
+ $found = false;
258
+ if(self::$_preferredChain !== null && $intermediateInfo['issuer']['CN'] != self::$_preferredChain) {
259
+
260
+ Utilities\Logger::getInstance()->add(
261
+ Utilities\Logger::LEVEL_INFO,
262
+ 'Default certificate does not satisfy preferred chain, trying to fetch alternative'
263
+ );
264
+
265
+ foreach($response->getAlternativeLinks() as $link) {
266
+
267
+ $request = new Request\Order\GetCertificate($this, $orderResponse, $link);
268
+ $response = $request->getResponse();
269
+
270
+ $alternativeCertificate = $response->getCertificate();
271
+ $alternativeIntermediate = $response->getIntermediate();
272
+
273
+ $intermediateInfo = openssl_x509_parse($intermediate);
274
+ if($intermediateInfo['issuer']['CN'] != self::$_preferredChain) {
275
+ continue;
276
+ }
277
+
278
+ $found = true;
279
+
280
+ $certificate = $alternativeCertificate;
281
+ $intermediate = $alternativeIntermediate;
282
+
283
+ break;
284
+ }
285
+
286
+ if(!$found) {
287
+ Utilities\Logger::getInstance()->add(
288
+ Utilities\Logger::LEVEL_INFO,
289
+ 'Preferred chain could not be satisfied, returning default chain'
290
+ );
291
+ }
292
+ }
293
+
294
+ $this->_saveCertificate($certificate, $intermediate);
295
+ }
296
+ }
297
+
298
+ private function _saveCertificate(string $certificate, string $intermediate) : void {
299
+
300
+ $certificateInfo = openssl_x509_parse($certificate);
301
+ $certificateValidToTimeTimestamp = $certificateInfo['validTo_time_t'];
302
+
303
+ $path = $this->getKeyDirectoryPath() . self::BUNDLE_DIRECTORY_PREFIX . $certificateValidToTimeTimestamp . DIRECTORY_SEPARATOR;
304
+
305
+ mkdir($path);
306
+ rename($this->getKeyDirectoryPath() . 'private.pem', $path . 'private.pem');
307
+ file_put_contents($path . 'certificate.crt', $certificate);
308
+ file_put_contents($path . 'intermediate.pem', $intermediate);
309
+
310
+ Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Certificate received');
311
+ }
312
+
313
+ const BUNDLE_DIRECTORY_PREFIX = 'bundle_';
314
+
315
+ protected function _getLatestCertificateDirectory() : ?string {
316
+
317
+ $files = scandir($this->getKeyDirectoryPath(), SORT_NUMERIC | SORT_DESC);
318
+ foreach($files as $file) {
319
+ if(
320
+ substr($file, 0, strlen(self::BUNDLE_DIRECTORY_PREFIX)) == self::BUNDLE_DIRECTORY_PREFIX &&
321
+ is_dir($this->getKeyDirectoryPath() . $file)
322
+ ) {
323
+ return $file;
324
+ }
325
+ }
326
+ return null;
327
+ }
328
+
329
+ public function isCertificateBundleAvailable() : bool {
330
+
331
+ return $this->_getLatestCertificateDirectory() !== NULL;
332
+ }
333
+
334
+ public function getCertificateBundle() : Struct\CertificateBundle {
335
+
336
+ if(!$this->isCertificateBundleAvailable()) {
337
+ throw new \RuntimeException('There is no certificate available');
338
+ }
339
+
340
+ $certificatePath = $this->getKeyDirectoryPath() . $this->_getLatestCertificateDirectory();
341
+
342
+ return new Struct\CertificateBundle(
343
+ $certificatePath . DIRECTORY_SEPARATOR,
344
+ 'private.pem',
345
+ 'certificate.crt',
346
+ 'intermediate.pem',
347
+ self::_getExpireTimeFromCertificateDirectoryPath($certificatePath)
348
+ );
349
+ }
350
+
351
+ /**
352
+ * @param string $keyType
353
+ * @param int|null $renewBefore Unix timestamp
354
+ * @throws Exception\AbstractException
355
+ */
356
+ public function enableAutoRenewal($keyType = self::KEY_TYPE_RSA, int $renewBefore = null) {
357
+
358
+ if($keyType === null) {
359
+ $keyType = self::KEY_TYPE_RSA;
360
+ }
361
+
362
+ if(!$this->isCertificateBundleAvailable()) {
363
+ throw new \RuntimeException('There is no certificate available');
364
+ }
365
+
366
+ $orderResponse = Cache\OrderResponse::getInstance()->get($this);
367
+ if(
368
+ $orderResponse === null ||
369
+ $orderResponse->getStatus() != Response\Order\AbstractOrder::STATUS_VALID
370
+ ) {
371
+ return;
372
+ }
373
+
374
+ Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_DEBUG,'Auto renewal triggered');
375
+
376
+ $directory = $this->_getLatestCertificateDirectory();
377
+
378
+ $expireTime = self::_getExpireTimeFromCertificateDirectoryPath($directory);
379
+
380
+ if($renewBefore === null) {
381
+ $renewBefore = strtotime('-30 days', $expireTime);
382
+ }
383
+
384
+ if($renewBefore < time()) {
385
+
386
+ Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO,'Auto renewal: Will recreate order');
387
+
388
+ $this->_create($keyType, true);
389
+ }
390
+ }
391
+
392
+ /**
393
+ * @param int $reason The reason to revoke the LetsEncrypt Order instance certificate.
394
+ * Possible reasons can be found in section 5.3.1 of RFC5280.
395
+ * @return bool
396
+ * @throws Exception\RateLimitReached
397
+ */
398
+ public function revokeCertificate(int $reason = 0) : bool {
399
+
400
+ if(!$this->isCertificateBundleAvailable()) {
401
+ throw new \RuntimeException('There is no certificate available to revoke');
402
+ }
403
+
404
+ $bundle = $this->getCertificateBundle();
405
+
406
+ $request = new Request\Order\RevokeCertificate($bundle, $reason);
407
+
408
+ try {
409
+ /* $response = */ $request->getResponse();
410
+ rename(
411
+ $this->getKeyDirectoryPath(),
412
+ $this->_getKeyDirectoryPath('-revoked-' . microtime(true))
413
+ );
414
+ return true;
415
+ } catch(Exception\InvalidResponse $e) {
416
+ return false;
417
+ }
418
+ }
419
+
420
+ protected static function _getExpireTimeFromCertificateDirectoryPath(string $path) {
421
+
422
+ $stringPosition = strrpos($path, self::BUNDLE_DIRECTORY_PREFIX);
423
+ if($stringPosition === false) {
424
+ throw new \RuntimeException('ExpireTime not found in' . $path);
425
+ }
426
+
427
+ $expireTime = substr($path, $stringPosition + strlen(self::BUNDLE_DIRECTORY_PREFIX));
428
+ if(
429
+ !is_numeric($expireTime) ||
430
+ $expireTime < strtotime('-10 years') ||
431
+ $expireTime > strtotime('+10 years')
432
+ ) {
433
+ throw new \RuntimeException('Unexpected expireTime: ' . $expireTime);
434
+ }
435
+ return $expireTime;
436
+ }
437
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/AbstractRequest.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request;
4
+
5
+ use LE_ACME2\Response\AbstractResponse;
6
+
7
+ use LE_ACME2\Exception;
8
+
9
+ abstract class AbstractRequest {
10
+
11
+ /**
12
+ * @return AbstractResponse
13
+ * @throws Exception\InvalidResponse
14
+ * @throws Exception\RateLimitReached
15
+ */
16
+ abstract public function getResponse() : AbstractResponse;
17
+
18
+ protected function _buildContactPayload(string $email) : array {
19
+
20
+ $result = [
21
+ 'mailto:' . $email
22
+ ];
23
+ return $result;
24
+ }
25
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/AbstractLocation.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Account;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+
7
+ use LE_ACME2\Connector;
8
+ use LE_ACME2\Cache;
9
+ use LE_ACME2\Utilities;
10
+ use LE_ACME2\Exception;
11
+
12
+ use LE_ACME2\Account;
13
+
14
+ abstract class AbstractLocation extends AbstractRequest {
15
+
16
+ protected $_account;
17
+
18
+ public function __construct(Account $account) {
19
+ $this->_account = $account;
20
+ }
21
+
22
+ /**
23
+ * @return Connector\RawResponse
24
+ * @throws Exception\InvalidResponse
25
+ * @throws Exception\RateLimitReached
26
+ */
27
+ protected function _getRawResponse() : Connector\RawResponse {
28
+
29
+ $payload = $this->_getPayload();
30
+ if(count($payload) == 0) {
31
+ $payload['rand-' . rand(100000, 1000000)] = 1;
32
+ }
33
+
34
+ $kid = Utilities\RequestSigner::KID(
35
+ $payload,
36
+ Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
37
+ Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
38
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
39
+ $this->_account->getKeyDirectoryPath()
40
+ );
41
+
42
+ $result = Connector\Connector::getInstance()->request(
43
+ Connector\Connector::METHOD_POST,
44
+ Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
45
+ $kid
46
+ );
47
+
48
+ return $result;
49
+ }
50
+
51
+ abstract protected function _getPayload() : array;
52
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/ChangeKeys.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Account;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Connector;
9
+ use LE_ACME2\Cache;
10
+ use LE_ACME2\Utilities;
11
+ use LE_ACME2\Exception;
12
+
13
+ use LE_ACME2\Account;
14
+
15
+ class ChangeKeys extends AbstractRequest {
16
+
17
+ protected $_account;
18
+
19
+ public function __construct(Account $account) {
20
+ $this->_account = $account;
21
+ }
22
+
23
+ /**
24
+ * @return Response\AbstractResponse|Response\Account\ChangeKeys
25
+ * @throws Exception\InvalidResponse
26
+ * @throws Exception\RateLimitReached
27
+ */
28
+ public function getResponse() : Response\AbstractResponse {
29
+
30
+ $currentPrivateKey = openssl_pkey_get_private(
31
+ file_get_contents($this->_account->getKeyDirectoryPath() . 'private.pem')
32
+ );
33
+ $currentPrivateKeyDetails = openssl_pkey_get_details($currentPrivateKey);
34
+
35
+ /**
36
+ * draft-13 Section 7.3.6
37
+ * "newKey" is deprecated after August 23rd 2018
38
+ */
39
+ $newPrivateKey = openssl_pkey_get_private(
40
+ file_get_contents($this->_account->getKeyDirectoryPath() . 'private-replacement.pem')
41
+ );
42
+ $newPrivateKeyDetails = openssl_pkey_get_details($newPrivateKey);
43
+
44
+ $innerPayload = [
45
+ 'account' => Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
46
+ 'oldKey' => [
47
+ "kty" => "RSA",
48
+ "n" => Utilities\Base64::UrlSafeEncode($currentPrivateKeyDetails["rsa"]["n"]),
49
+ "e" => Utilities\Base64::UrlSafeEncode($currentPrivateKeyDetails["rsa"]["e"])
50
+ ],
51
+ 'newKey' => [
52
+ "kty" => "RSA",
53
+ "n" => Utilities\Base64::UrlSafeEncode($newPrivateKeyDetails["rsa"]["n"]),
54
+ "e" => Utilities\Base64::UrlSafeEncode($newPrivateKeyDetails["rsa"]["e"])
55
+ ]
56
+ ];
57
+
58
+ $outerPayload = Utilities\RequestSigner::JWK(
59
+ $innerPayload,
60
+ Cache\DirectoryResponse::getInstance()->get()->getKeyChange(),
61
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
62
+ $this->_account->getKeyDirectoryPath(),
63
+ 'private-replacement.pem'
64
+ );
65
+
66
+ $data = Utilities\RequestSigner::KID(
67
+ $outerPayload,
68
+ Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
69
+ Cache\DirectoryResponse::getInstance()->get()->getKeyChange(),
70
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
71
+ $this->_account->getKeyDirectoryPath(),
72
+ 'private.pem'
73
+ );
74
+
75
+ $result = Connector\Connector::getInstance()->request(
76
+ Connector\Connector::METHOD_POST,
77
+ Cache\DirectoryResponse::getInstance()->get()->getKeyChange(),
78
+ $data
79
+ );
80
+
81
+ return new Response\Account\ChangeKeys($result);
82
+ }
83
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Create.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Account;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Connector;
9
+ use LE_ACME2\Cache;
10
+ use LE_ACME2\Utilities;
11
+ use LE_ACME2\Exception;
12
+
13
+ use LE_ACME2\Account;
14
+
15
+ class Create extends AbstractRequest {
16
+
17
+ protected $_account;
18
+
19
+ public function __construct(Account $account) {
20
+ $this->_account = $account;
21
+ }
22
+
23
+ /**
24
+ * @return Response\AbstractResponse|Response\Account\Create
25
+ * @throws Exception\InvalidResponse
26
+ * @throws Exception\RateLimitReached
27
+ */
28
+ public function getResponse() : Response\AbstractResponse {
29
+
30
+ $payload = [
31
+ 'contact' => $this->_buildContactPayload($this->_account->getEmail()),
32
+ 'termsOfServiceAgreed' => true,
33
+ ];
34
+
35
+ $jwk = Utilities\RequestSigner::JWKString(
36
+ $payload,
37
+ Cache\DirectoryResponse::getInstance()->get()->getNewAccount(),
38
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
39
+ $this->_account->getKeyDirectoryPath()
40
+ );
41
+
42
+ $result = Connector\Connector::getInstance()->request(
43
+ Connector\Connector::METHOD_POST,
44
+ Cache\DirectoryResponse::getInstance()->get()->getNewAccount(),
45
+ $jwk
46
+ );
47
+
48
+ return new Response\Account\Create($result);
49
+ }
50
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Deactivate.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Account;
4
+
5
+ use LE_ACME2\Response;
6
+
7
+ use LE_ACME2\Exception;
8
+
9
+ class Deactivate extends AbstractLocation {
10
+
11
+ protected function _getPayload() : array {
12
+
13
+ return [
14
+ 'status' => 'deactivated',
15
+ ];
16
+ }
17
+
18
+ /**
19
+ * @return Response\AbstractResponse|Response\Account\Deactivate
20
+ * @throws Exception\InvalidResponse
21
+ * @throws Exception\RateLimitReached
22
+ */
23
+ public function getResponse() : Response\AbstractResponse {
24
+
25
+ return new Response\Account\Deactivate($this->_getRawResponse());
26
+ }
27
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Get.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Account;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Connector;
9
+ use LE_ACME2\Cache;
10
+ use LE_ACME2\Exception;
11
+ use LE_ACME2\Utilities;
12
+
13
+ use LE_ACME2\Account;
14
+
15
+ class Get extends AbstractRequest {
16
+
17
+ protected $_account;
18
+
19
+ public function __construct(Account $account) {
20
+ $this->_account = $account;
21
+ }
22
+
23
+ /**
24
+ * @return Response\AbstractResponse|Response\Account\Get
25
+ * @throws Exception\InvalidResponse
26
+ * @throws Exception\RateLimitReached
27
+ */
28
+ public function getResponse() : Response\AbstractResponse {
29
+
30
+ $payload = [
31
+ 'onlyReturnExisting' => true,
32
+ ];
33
+
34
+ $jwk = Utilities\RequestSigner::JWKString(
35
+ $payload,
36
+ Cache\DirectoryResponse::getInstance()->get()->getNewAccount(),
37
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
38
+ $this->_account->getKeyDirectoryPath()
39
+ );
40
+
41
+ $result = Connector\Connector::getInstance()->request(
42
+ Connector\Connector::METHOD_POST,
43
+ Cache\DirectoryResponse::getInstance()->get()->getNewAccount(),
44
+ $jwk
45
+ );
46
+
47
+ return new Response\Account\Get($result);
48
+ }
49
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/GetData.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Account;
4
+
5
+ use LE_ACME2\Response;
6
+
7
+ use LE_ACME2\Exception;
8
+
9
+ class GetData extends AbstractLocation {
10
+
11
+ protected function _getPayload() : array {
12
+
13
+ return [];
14
+ }
15
+
16
+ /**
17
+ * @return Response\AbstractResponse|Response\Account\GetData
18
+ * @throws Exception\InvalidResponse
19
+ * @throws Exception\RateLimitReached
20
+ */
21
+ public function getResponse() : Response\AbstractResponse {
22
+
23
+ return new Response\Account\GetData($this->_getRawResponse());
24
+ }
25
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Update.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Account;
4
+
5
+ use LE_ACME2\Response;
6
+
7
+ use LE_ACME2\Exception;
8
+
9
+ use LE_ACME2\Account;
10
+
11
+ class Update extends AbstractLocation {
12
+
13
+ protected $_newEmail;
14
+
15
+ public function __construct(Account $account, $newEmail) {
16
+
17
+ parent::__construct($account);
18
+
19
+ $this->_newEmail = $newEmail;
20
+ }
21
+
22
+ protected function _getPayload() : array {
23
+
24
+ return [
25
+ 'contact' => $this->_buildContactPayload($this->_newEmail),
26
+ ];
27
+ }
28
+
29
+ /**
30
+ * @return Response\AbstractResponse|Response\Account\Update
31
+ * @throws Exception\InvalidResponse
32
+ * @throws Exception\RateLimitReached
33
+ */
34
+ public function getResponse() : Response\AbstractResponse {
35
+ return new Response\Account\Update($this->_getRawResponse());
36
+ }
37
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Get.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Authorization;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+
7
+ use LE_ACME2\Connector;
8
+ use LE_ACME2\Cache;
9
+ use LE_ACME2\Exception;
10
+ use LE_ACME2\Response;
11
+ use LE_ACME2\Utilities;
12
+
13
+ use LE_ACME2\Account;
14
+
15
+ class Get extends AbstractRequest {
16
+
17
+ protected $_account;
18
+ protected $_authorizationURL;
19
+
20
+ public function __construct(Account $account, string $authorizationURL) {
21
+
22
+ $this->_account = $account;
23
+ $this->_authorizationURL = $authorizationURL;
24
+ }
25
+
26
+ /**
27
+ * @return Response\AbstractResponse|Response\Authorization\Get
28
+ * @throws Exception\InvalidResponse
29
+ * @throws Exception\RateLimitReached
30
+ * @throws Exception\ExpiredAuthorization
31
+ */
32
+ public function getResponse() : Response\AbstractResponse {
33
+
34
+ $kid = Utilities\RequestSigner::KID(
35
+ null,
36
+ Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
37
+ $this->_authorizationURL,
38
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
39
+ $this->_account->getKeyDirectoryPath()
40
+ );
41
+
42
+ $result = Connector\Connector::getInstance()->request(
43
+ Connector\Connector::METHOD_POST,
44
+ $this->_authorizationURL,
45
+ $kid
46
+ );
47
+
48
+ return new Response\Authorization\Get($result);
49
+ }
50
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Start.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Authorization;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+
7
+ use LE_ACME2\Connector;
8
+ use LE_ACME2\Cache;
9
+ use LE_ACME2\Exception;
10
+ use LE_ACME2\Response;
11
+ use LE_ACME2\Struct\ChallengeAuthorizationKey;
12
+ use LE_ACME2\Utilities;
13
+
14
+ use LE_ACME2\Account;
15
+ use LE_ACME2\Order;
16
+
17
+ class Start extends AbstractRequest {
18
+
19
+ protected $_account;
20
+ protected $_order;
21
+ protected $_challenge;
22
+
23
+ public function __construct(Account $account, Order $order, Response\Authorization\Struct\Challenge $challenge) {
24
+
25
+ $this->_account = $account;
26
+ $this->_order = $order;
27
+ $this->_challenge = $challenge;
28
+ }
29
+
30
+ /**
31
+ * @return Response\AbstractResponse|Response\Authorization\Start
32
+ * @throws Exception\InvalidResponse
33
+ * @throws Exception\RateLimitReached
34
+ * @throws Exception\ExpiredAuthorization
35
+ */
36
+ public function getResponse() : Response\AbstractResponse {
37
+
38
+ $payload = [
39
+ 'keyAuthorization' => (new ChallengeAuthorizationKey($this->_account))->get($this->_challenge->token)
40
+ ];
41
+
42
+ $kid = Utilities\RequestSigner::KID(
43
+ $payload,
44
+ Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
45
+ $this->_challenge->url,
46
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
47
+ $this->_account->getKeyDirectoryPath()
48
+ );
49
+
50
+ $result = Connector\Connector::getInstance()->request(
51
+ Connector\Connector::METHOD_POST,
52
+ $this->_challenge->url,
53
+ $kid
54
+ );
55
+
56
+ return new Response\Authorization\Start($result);
57
+ }
58
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/GetDirectory.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request;
4
+
5
+ use LE_ACME2\Response;
6
+
7
+ use LE_ACME2\Connector\Connector;
8
+ use LE_ACME2\Exception;
9
+
10
+ class GetDirectory extends AbstractRequest {
11
+
12
+ /**
13
+ * @return Response\AbstractResponse|Response\GetDirectory
14
+ * @throws Exception\InvalidResponse
15
+ * @throws Exception\RateLimitReached
16
+ */
17
+ public function getResponse() : Response\AbstractResponse {
18
+
19
+ $connector = Connector::getInstance();
20
+
21
+ $result = $connector->request(
22
+ Connector::METHOD_GET,
23
+ $connector->getBaseURL() . '/directory'
24
+ );
25
+ return new Response\GetDirectory($result);
26
+ }
27
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/GetNewNonce.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request;
4
+
5
+ use LE_ACME2\Response;
6
+
7
+ use LE_ACME2\Connector;
8
+ use LE_ACME2\Cache;
9
+ use LE_ACME2\Exception;
10
+
11
+ class GetNewNonce extends AbstractRequest {
12
+
13
+ /**
14
+ * @return Response\AbstractResponse|Response\GetNewNonce
15
+ * @throws Exception\InvalidResponse
16
+ * @throws Exception\RateLimitReached
17
+ */
18
+ public function getResponse() : Response\AbstractResponse {
19
+
20
+ $result = Connector\Connector::getInstance()->request(
21
+ Connector\Connector::METHOD_HEAD,
22
+ Cache\DirectoryResponse::getInstance()->get()->getNewNonce()
23
+ );
24
+
25
+ return new Response\GetNewNonce($result);
26
+ }
27
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Create.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Order;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Connector;
9
+ use LE_ACME2\Cache;
10
+ use LE_ACME2\Exception;
11
+ use LE_ACME2\Utilities;
12
+
13
+ use LE_ACME2\Order;
14
+
15
+ class Create extends AbstractRequest {
16
+
17
+ protected $_order;
18
+
19
+ public function __construct(Order $order) {
20
+
21
+ $this->_order = $order;
22
+ }
23
+
24
+ /**
25
+ * @return Response\AbstractResponse|Response\Order\Create
26
+ * @throws Exception\InvalidResponse
27
+ * @throws Exception\RateLimitReached
28
+ */
29
+ public function getResponse() : Response\AbstractResponse {
30
+
31
+ $identifiers = [];
32
+ foreach($this->_order->getSubjects() as $subject) {
33
+
34
+ $identifiers[] = [
35
+ 'type' => 'dns',
36
+ 'value' => $subject
37
+ ];
38
+ }
39
+
40
+ $payload = [
41
+ 'identifiers' => $identifiers,
42
+ 'notBefore' => '',
43
+ 'notAfter' => '',
44
+ ];
45
+
46
+ $kid = Utilities\RequestSigner::KID(
47
+ $payload,
48
+ Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(),
49
+ Cache\DirectoryResponse::getInstance()->get()->getNewOrder(),
50
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
51
+ $this->_order->getAccount()->getKeyDirectoryPath()
52
+ );
53
+ $result = Connector\Connector::getInstance()->request(
54
+ Connector\Connector::METHOD_POST,
55
+ Cache\DirectoryResponse::getInstance()->get()->getNewOrder(),
56
+ $kid
57
+ );
58
+
59
+ return new Response\Order\Create($result);
60
+ }
61
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Finalize.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Order;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Connector;
9
+ use LE_ACME2\Cache;
10
+ use LE_ACME2\Exception;
11
+ use LE_ACME2\Utilities;
12
+
13
+ use LE_ACME2\Order;
14
+
15
+ class Finalize extends AbstractRequest {
16
+
17
+ protected $_order;
18
+ protected $_orderResponse;
19
+
20
+ public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse) {
21
+
22
+ $this->_order = $order;
23
+ $this->_orderResponse = $orderResponse;
24
+ }
25
+
26
+ /**
27
+ * @return Response\AbstractResponse|Response\Order\Finalize
28
+ * @throws Exception\InvalidResponse
29
+ * @throws Exception\RateLimitReached
30
+ */
31
+ public function getResponse() : Response\AbstractResponse {
32
+
33
+ $csr = Utilities\Certificate::generateCSR($this->_order);
34
+
35
+ if(preg_match('~-----BEGIN\sCERTIFICATE\sREQUEST-----(.*)-----END\sCERTIFICATE\sREQUEST-----~s', $csr, $matches))
36
+ $csr = $matches[1];
37
+
38
+ $csr = trim(Utilities\Base64::UrlSafeEncode(base64_decode($csr)));
39
+
40
+ $payload = [
41
+ 'csr' => $csr
42
+ ];
43
+
44
+ $kid = Utilities\RequestSigner::KID(
45
+ $payload,
46
+ Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(),
47
+ $this->_orderResponse->getFinalize(),
48
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
49
+ $this->_order->getAccount()->getKeyDirectoryPath()
50
+ );
51
+
52
+ $result = Connector\Connector::getInstance()->request(
53
+ Connector\Connector::METHOD_POST,
54
+ $this->_orderResponse->getFinalize(),
55
+ $kid
56
+ );
57
+
58
+ return new Response\Order\Finalize($result);
59
+ }
60
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Get.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Order;
4
+
5
+ use LE_ACME2\Request\AbstractRequest;
6
+ use LE_ACME2\Response;
7
+
8
+ use LE_ACME2\Connector;
9
+ use LE_ACME2\Cache;
10
+ use LE_ACME2\Exception;
11
+ use LE_ACME2\Utilities;
12
+
13
+ use LE_ACME2\Order;
14
+
15
+ class Get extends AbstractRequest {
16
+
17
+ protected $_order;
18
+ protected $_orderResponse;
19
+
20
+ public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse) {
21
+
22
+ $this->_order = $order;
23
+ $this->_orderResponse = $orderResponse;
24
+ }
25
+
26
+ /**
27
+ * @return Response\AbstractResponse|Response\Order\Get
28
+ * @throws Exception\InvalidResponse
29
+ * @throws Exception\RateLimitReached
30
+ */
31
+ public function getResponse() : Response\AbstractResponse {
32
+
33
+ $kid = Utilities\RequestSigner::KID(
34
+ null,
35
+ Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(),
36
+ $this->_orderResponse->getLocation(),
37
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
38
+ $this->_order->getAccount()->getKeyDirectoryPath()
39
+ );
40
+
41
+ $result = Connector\Connector::getInstance()->request(
42
+ Connector\Connector::METHOD_POST,
43
+ $this->_orderResponse->getLocation(),
44
+ $kid
45
+ );
46
+
47
+ return new Response\Order\Get($result, $this->_orderResponse->getLocation());
48
+ }
49
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/GetCertificate.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Order;
4
+
5
+ use LE_ACME2\Order;
6
+ use LE_ACME2\Request\AbstractRequest;
7
+ use LE_ACME2\Response;
8
+
9
+ use LE_ACME2\Connector;
10
+ use LE_ACME2\Cache;
11
+ use LE_ACME2\Exception;
12
+ use LE_ACME2\Utilities;
13
+
14
+ class GetCertificate extends AbstractRequest {
15
+
16
+ protected $_order;
17
+ protected $_orderResponse;
18
+
19
+ private $_alternativeUrl = null;
20
+
21
+ public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse,
22
+ string $alternativeUrl = null
23
+ ) {
24
+ $this->_order = $order;
25
+ $this->_orderResponse = $orderResponse;
26
+
27
+ if($alternativeUrl !== null) {
28
+ $this->_alternativeUrl = $alternativeUrl;
29
+ }
30
+ }
31
+
32
+ /**
33
+ * @return Response\AbstractResponse|Response\Order\GetCertificate
34
+ * @throws Exception\InvalidResponse
35
+ * @throws Exception\RateLimitReached
36
+ */
37
+ public function getResponse() : Response\AbstractResponse {
38
+
39
+ $url = $this->_alternativeUrl === null ?
40
+ $this->_orderResponse->getCertificate() :
41
+ $this->_alternativeUrl;
42
+
43
+ $kid = Utilities\RequestSigner::KID(
44
+ null,
45
+ Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(),
46
+ $url,
47
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
48
+ $this->_order->getAccount()->getKeyDirectoryPath()
49
+ );
50
+
51
+ $result = Connector\Connector::getInstance()->request(
52
+ Connector\Connector::METHOD_POST,
53
+ $url,
54
+ $kid
55
+ );
56
+
57
+ return new Response\Order\GetCertificate($result);
58
+ }
59
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/RevokeCertificate.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Request\Order;
4
+
5
+ use LE_ACME2\Response;
6
+ use LE_ACME2\Request\AbstractRequest;
7
+
8
+ use LE_ACME2\Connector;
9
+ use LE_ACME2\Cache;
10
+ use LE_ACME2\Exception;
11
+ use LE_ACME2\Struct;
12
+ use LE_ACME2\Utilities;
13
+
14
+ class RevokeCertificate extends AbstractRequest {
15
+
16
+ protected $_certificateBundle;
17
+ protected $_reason;
18
+
19
+ public function __construct(Struct\CertificateBundle $certificateBundle, $reason) {
20
+
21
+ $this->_certificateBundle = $certificateBundle;
22
+ $this->_reason = $reason;
23
+ }
24
+
25
+ /**
26
+ * @return Response\AbstractResponse|Response\Order\RevokeCertificate
27
+ * @throws Exception\InvalidResponse
28
+ * @throws Exception\RateLimitReached
29
+ */
30
+ public function getResponse() : Response\AbstractResponse {
31
+
32
+ $certificate = file_get_contents($this->_certificateBundle->path . $this->_certificateBundle->certificate);
33
+ preg_match('~-----BEGIN\sCERTIFICATE-----(.*)-----END\sCERTIFICATE-----~s', $certificate, $matches);
34
+ $certificate = trim(Utilities\Base64::UrlSafeEncode(base64_decode(trim($matches[1]))));
35
+
36
+ $payload = [
37
+ 'certificate' => $certificate,
38
+ 'reason' => $this->_reason
39
+ ];
40
+
41
+ $jwk = Utilities\RequestSigner::JWKString(
42
+ $payload,
43
+ Cache\DirectoryResponse::getInstance()->get()->getRevokeCert(),
44
+ Cache\NewNonceResponse::getInstance()->get()->getNonce(),
45
+ $this->_certificateBundle->path,
46
+ $this->_certificateBundle->private
47
+ );
48
+
49
+ $result = Connector\Connector::getInstance()->request(
50
+ Connector\Connector::METHOD_POST,
51
+ Cache\DirectoryResponse::getInstance()->get()->getRevokeCert(),
52
+ $jwk
53
+ );
54
+
55
+ return new Response\Order\RevokeCertificate($result);
56
+ }
57
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/AbstractResponse.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response;
4
+
5
+ use LE_ACME2\Exception;
6
+
7
+ use LE_ACME2\Connector\RawResponse;
8
+
9
+ abstract class AbstractResponse {
10
+
11
+ protected $_raw = NULL;
12
+
13
+ protected $_pattern_header_location = '/^Location: (\S+)$/i';
14
+
15
+ /**
16
+ * AbstractResponse constructor.
17
+ *
18
+ * @param RawResponse $raw
19
+ * @throws Exception\InvalidResponse
20
+ * @throws Exception\RateLimitReached
21
+ */
22
+ public function __construct(RawResponse $raw) {
23
+
24
+ $this->_raw = $raw;
25
+
26
+ if($this->_isRateLimitReached()) {
27
+
28
+ $detail = "";
29
+ if(isset($raw->body['type']) && $raw->body['type'] == 'urn:ietf:params:acme:error:rateLimited') {
30
+ $detail = $raw->body['detail'];
31
+ }
32
+
33
+ throw new Exception\RateLimitReached($raw->request, $detail);
34
+ }
35
+
36
+ $result = $this->_isValid();
37
+ if(!$result) {
38
+
39
+ $responseStatus = $this->_preg_match_headerLine('/^HTTP\/.* [0-9]{3,} /i');
40
+ throw new Exception\InvalidResponse(
41
+ $raw,
42
+ $responseStatus ? $responseStatus[1] : null
43
+ );
44
+ }
45
+ }
46
+
47
+ protected function _preg_match_headerLine(string $pattern) : ?array {
48
+
49
+ foreach($this->_raw->header as $line) {
50
+
51
+ if(preg_match($pattern, $line, $matches) === 1)
52
+ return $matches;
53
+ }
54
+ return null;
55
+ }
56
+
57
+ protected function _isRateLimitReached() : bool {
58
+ return $this->_preg_match_headerLine('/^HTTP\/.* 429/i') !== null;
59
+ }
60
+
61
+ protected function _isValid() : bool {
62
+
63
+ return $this->_preg_match_headerLine('/^HTTP\/.* 201/i') !== null || //Created
64
+ $this->_preg_match_headerLine('/^HTTP\/.* 200/i') !== null ||
65
+ $this->_preg_match_headerLine('/^HTTP\/.* 204/i') !== null;
66
+ }
67
+
68
+ public function getRaw() : RawResponse {
69
+ return $this->_raw;
70
+ }
71
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/AbstractAccount.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Account;
4
+
5
+ use LE_ACME2\Response\AbstractResponse;
6
+
7
+ abstract class AbstractAccount extends AbstractResponse {
8
+
9
+ const STATUS_VALID = 'valid';
10
+
11
+
12
+ public function getLocation() : string {
13
+
14
+ $matches = $this->_preg_match_headerLine($this->_pattern_header_location);
15
+ return trim($matches[1]);
16
+ }
17
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/AbstractLocation.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Account;
4
+
5
+ use LE_ACME2\Response\AbstractResponse;
6
+
7
+ abstract class AbstractLocation extends AbstractResponse {
8
+
9
+ public function getKey() : string {
10
+ return $this->_raw->body['key'];
11
+ }
12
+
13
+ public function getContact() : string {
14
+ return $this->_raw->body['contact'];
15
+ }
16
+
17
+ public function getAgreement() : string {
18
+ return $this->_raw->body['agreement'];
19
+ }
20
+
21
+ public function getInitialIP() : string {
22
+ return $this->_raw->body['initialIp'];
23
+ }
24
+
25
+ public function getCreatedAt() : string {
26
+ return $this->_raw->body['createdAt'];
27
+ }
28
+
29
+ public function getStatus() : string {
30
+ return $this->_raw->body['status'];
31
+ }
32
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/ChangeKeys.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Account;
4
+
5
+ use LE_ACME2\Response\AbstractResponse;
6
+
7
+ class ChangeKeys extends AbstractResponse {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Create.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Account;
4
+
5
+ class Create extends AbstractAccount {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Deactivate.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Account;
4
+
5
+ class Deactivate extends AbstractLocation {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Get.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Account;
4
+
5
+ class Get extends AbstractAccount {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/GetData.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Account;
4
+
5
+ class GetData extends AbstractLocation {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Update.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Account;
4
+
5
+ class Update extends AbstractLocation {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/AbstractAuthorization.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Authorization;
4
+
5
+ use LE_ACME2\Response\AbstractResponse;
6
+
7
+ use LE_ACME2\Connector\RawResponse;
8
+ use LE_ACME2\Exception;
9
+
10
+ class AbstractAuthorization extends AbstractResponse {
11
+
12
+ /**
13
+ * AbstractAuthorization constructor.
14
+ * @param RawResponse $raw
15
+ * @throws Exception\InvalidResponse
16
+ * @throws Exception\RateLimitReached
17
+ * @throws Exception\ExpiredAuthorization
18
+ */
19
+ public function __construct(RawResponse $raw) {
20
+ parent::__construct($raw);
21
+ }
22
+
23
+ /**
24
+ * @return bool
25
+ * @throws Exception\ExpiredAuthorization
26
+ */
27
+ protected function _isValid() : bool {
28
+
29
+ if($this->_preg_match_headerLine('/^HTTP\/.* 404/i') !== null) {
30
+ throw new Exception\ExpiredAuthorization();
31
+ }
32
+
33
+ return parent::_isValid();
34
+ }
35
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Get.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Authorization;
4
+
5
+ use LE_ACME2\Response\Authorization\Struct;
6
+
7
+ class Get extends AbstractAuthorization {
8
+
9
+ public function getIdentifier() : Struct\Identifier {
10
+ return new Struct\Identifier($this->_raw->body['identifier']['type'], $this->_raw->body['identifier']['value']);
11
+ }
12
+
13
+ public function getStatus() : string {
14
+ return $this->_raw->body['status'];
15
+ }
16
+
17
+ public function getExpires() : string {
18
+ return $this->_raw->body['expires'];
19
+ }
20
+
21
+ public function getChallenges() : array {
22
+ return $this->_raw->body['challenges'];
23
+ }
24
+
25
+ /**
26
+ * @param $type
27
+ * @return Struct\Challenge
28
+ */
29
+ public function getChallenge(string $type) : Struct\Challenge {
30
+
31
+ foreach($this->getChallenges() as $challenge) {
32
+
33
+ if($type == $challenge['type'])
34
+ return new Struct\Challenge($challenge['type'], $challenge['status'], $challenge['url'], $challenge['token']);
35
+ }
36
+ throw new \RuntimeException('No challenge found with given type');
37
+ }
38
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Start.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Authorization;
4
+
5
+ class Start extends AbstractAuthorization {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Struct/Challenge.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Authorization\Struct;
4
+
5
+ class Challenge {
6
+
7
+ const STATUS_PROGRESSING = 'processing';
8
+ const STATUS_PENDING = 'pending';
9
+ const STATUS_VALID = 'valid';
10
+ const STATUS_INVALID = 'invalid';
11
+
12
+ public $type;
13
+ public $status;
14
+ public $url;
15
+ public $token;
16
+
17
+ public function __construct(string $type, string $status, string $url, string $token) {
18
+
19
+ $this->type = $type;
20
+ $this->status = $status;
21
+ $this->url = $url;
22
+ $this->token = $token;
23
+ }
24
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Struct/Identifier.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Authorization\Struct;
4
+
5
+ class Identifier {
6
+
7
+ public $type;
8
+ public $value;
9
+
10
+ public function __construct(string $type, string $value) {
11
+
12
+ $this->type = $type;
13
+ $this->value = $value;
14
+ }
15
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/GetDirectory.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response;
4
+
5
+ class GetDirectory extends AbstractResponse {
6
+
7
+ public function getKeyChange() : string {
8
+ return $this->_raw->body['keyChange'];
9
+ }
10
+
11
+ public function getNewAccount() : string {
12
+ return $this->_raw->body['newAccount'];
13
+ }
14
+
15
+ public function getNewNonce() : string {
16
+ return $this->_raw->body['newNonce'];
17
+ }
18
+
19
+ public function getNewOrder() : string {
20
+ return $this->_raw->body['newOrder'];
21
+ }
22
+
23
+ public function getRevokeCert() : string {
24
+ return $this->_raw->body['revokeCert'];
25
+ }
26
+
27
+ public function getTermsOfService() : string {
28
+ return $this->_raw->body['meta']['termsOfService'];
29
+ }
30
+
31
+ public function getWebsite() : string {
32
+ return $this->_raw->body['meta']['website'];
33
+ }
34
+
35
+ public function getCaaIdentities() : string {
36
+ return $this->_raw->body['meta']['caaIdentities'];
37
+ }
38
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/GetNewNonce.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response;
4
+
5
+ class GetNewNonce extends AbstractResponse {
6
+
7
+ protected $_pattern = '/^Replay\-Nonce: (\S+)$/i';
8
+
9
+ protected function _isValid() : bool {
10
+ return $this->_preg_match_headerLine($this->_pattern) !== null;
11
+ }
12
+
13
+ public function getNonce() : string {
14
+
15
+ $matches = $this->_preg_match_headerLine($this->_pattern);
16
+ return trim($matches[1]);
17
+ }
18
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/AbstractOrder.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Order;
4
+
5
+ use LE_ACME2\Response\AbstractResponse;
6
+ use LE_ACME2\Exception;
7
+
8
+ abstract class AbstractOrder extends AbstractResponse {
9
+
10
+ const STATUS_PENDING = 'pending';
11
+ const STATUS_VALID = 'valid';
12
+ const STATUS_READY = 'ready';
13
+ const STATUS_INVALID = 'invalid';
14
+
15
+ public function getLocation() : string {
16
+
17
+ $matches = $this->_preg_match_headerLine($this->_pattern_header_location);
18
+ return trim($matches[1]);
19
+ }
20
+
21
+ public function getStatus() : string {
22
+ return $this->_raw->body['status'];
23
+ }
24
+
25
+ public function getExpires() : string {
26
+ return $this->_raw->body['expires'];
27
+ }
28
+
29
+ public function getIdentifiers() : array {
30
+ return $this->_raw->body['identifiers'];
31
+ }
32
+
33
+ public function getAuthorizations() : array {
34
+ return $this->_raw->body['authorizations'];
35
+ }
36
+
37
+ public function getFinalize() : string {
38
+ return $this->_raw->body['finalize'];
39
+ }
40
+
41
+ public function getCertificate() : string {
42
+ return $this->_raw->body['certificate'];
43
+ }
44
+
45
+ /**
46
+ * @return bool
47
+ * @throws Exception\StatusInvalid
48
+ */
49
+ protected function _isValid(): bool {
50
+
51
+ if(!parent::_isValid()) {
52
+ return false;
53
+ }
54
+
55
+ if(
56
+ $this->getStatus() == AbstractOrder::STATUS_INVALID
57
+ ) {
58
+ throw new Exception\StatusInvalid('Order has status "' . AbstractOrder::STATUS_INVALID . '"'.
59
+ '. Probably all authorizations have failed. ' . PHP_EOL .
60
+ 'Please see: ' . $this->getLocation() . PHP_EOL .
61
+ 'Continue by using $order->clear() after getting rid of the problem'
62
+ );
63
+ }
64
+
65
+ return true;
66
+ }
67
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Create.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Order;
4
+
5
+ class Create extends AbstractOrder {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Finalize.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Order;
4
+
5
+ class Finalize extends AbstractOrder {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Get.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Order;
4
+
5
+ use LE_ACME2\Connector\RawResponse;
6
+ use LE_ACME2\Exception;
7
+
8
+ class Get extends AbstractOrder {
9
+
10
+ /**
11
+ * Get constructor.
12
+ *
13
+ * @param RawResponse $raw
14
+ * @param $orderURL
15
+ * @throws Exception\InvalidResponse
16
+ * @throws Exception\RateLimitReached
17
+ */
18
+ public function __construct(RawResponse $raw, string $orderURL) {
19
+
20
+ // Dirty fix: Header of response "Get" does not contain an order url, instead of response "Create"
21
+ // Is needed on production server, not on staging server - tested: 12.04.2021
22
+ $raw->header[] = 'Location: ' . $orderURL;
23
+
24
+ parent::__construct($raw);
25
+ }
26
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/GetCertificate.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Order;
4
+
5
+ use LE_ACME2\Response\AbstractResponse;
6
+
7
+ class GetCertificate extends AbstractResponse {
8
+
9
+ protected $_pattern = '~(-----BEGIN\sCERTIFICATE-----[\s\S]+?-----END\sCERTIFICATE-----)~i';
10
+
11
+
12
+ public function getCertificate() : string {
13
+
14
+ if(preg_match_all($this->_pattern, $this->_raw->body, $matches)) {
15
+
16
+ return $matches[0][0];
17
+ }
18
+
19
+ throw new \RuntimeException('Preg_match_all has returned false - invalid pattern?');
20
+ }
21
+
22
+ public function getIntermediate() : string {
23
+
24
+ if(preg_match_all($this->_pattern, $this->_raw->body, $matches)) {
25
+
26
+ $result = '';
27
+
28
+ for($i=1; $i<count($matches[0]); $i++) {
29
+
30
+ $result .= "\n" . $matches[0][$i];
31
+ }
32
+ return $result;
33
+ }
34
+
35
+ throw new \RuntimeException('Preg_match_all has returned false - invalid pattern?');
36
+ }
37
+
38
+ /**
39
+ * @return string[]
40
+ */
41
+ public function getAlternativeLinks() : array {
42
+
43
+ $result = [];
44
+
45
+ foreach($this->_raw->header as $line) {
46
+ $matches = [];
47
+ preg_match_all('/^link: <(.*)>;rel="alternate"$/', $line, $matches);
48
+
49
+ if(isset($matches[1][0])) {
50
+ $result[] = $matches[1][0];
51
+ }
52
+ }
53
+
54
+ return $result;
55
+ }
56
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/RevokeCertificate.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Response\Order;
4
+
5
+ use LE_ACME2\Response\AbstractResponse;
6
+
7
+ class RevokeCertificate extends AbstractResponse {}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/SingletonTrait.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2;
3
+
4
+ trait SingletonTrait {
5
+
6
+ private static $_instance = NULL;
7
+
8
+ /**
9
+ * @return static
10
+ */
11
+ final public static function getInstance(): self {
12
+
13
+ if( self::$_instance === NULL ) {
14
+ self::$_instance = new self();
15
+ }
16
+ return self::$_instance;
17
+ }
18
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Struct/CertificateBundle.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Struct;
4
+
5
+ class CertificateBundle {
6
+
7
+ public $path;
8
+ public $private;
9
+ public $certificate;
10
+ public $intermediate;
11
+ public $expireTime;
12
+
13
+ public function __construct(string $path, string $private, string $certificate, string $intermediate, int $expireTime) {
14
+
15
+ $this->path = $path;
16
+ $this->private = $private;
17
+ $this->certificate = $certificate;
18
+ $this->intermediate = $intermediate;
19
+ $this->expireTime = $expireTime;
20
+ }
21
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Struct/ChallengeAuthorizationKey.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Struct;
4
+
5
+ use LE_ACME2\Account;
6
+ use LE_ACME2\Utilities;
7
+
8
+ class ChallengeAuthorizationKey {
9
+
10
+ private $_account;
11
+
12
+ public function __construct(Account $account) {
13
+ $this->_account = $account;
14
+ }
15
+
16
+ public function get(string $token) : string {
17
+ return $token . '.' . $this->_getDigest();
18
+ }
19
+
20
+ public function getEncoded(string $token) : string {
21
+ return Utilities\Base64::UrlSafeEncode(
22
+ hash('sha256', $this->get($token), true)
23
+ );
24
+ }
25
+
26
+ private function _getDigest() : string {
27
+
28
+ $privateKey = openssl_pkey_get_private(file_get_contents($this->_account->getKeyDirectoryPath() . 'private.pem'));
29
+ $details = openssl_pkey_get_details($privateKey);
30
+
31
+ $header = array(
32
+ "e" => Utilities\Base64::UrlSafeEncode($details["rsa"]["e"]),
33
+ "kty" => "RSA",
34
+ "n" => Utilities\Base64::UrlSafeEncode($details["rsa"]["n"])
35
+
36
+ );
37
+ return Utilities\Base64::UrlSafeEncode(hash('sha256', json_encode($header), true));
38
+ }
39
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Base64.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Utilities;
4
+
5
+ class Base64 {
6
+
7
+ /**
8
+ * Encodes a string input to a base64 encoded string which is URL safe.
9
+ *
10
+ * @param string $input The input string to encode.
11
+ * @return string Returns a URL safe base64 encoded string.
12
+ */
13
+ public static function UrlSafeEncode(string $input) : string {
14
+ return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
15
+ }
16
+
17
+ /**
18
+ * Decodes a string that is URL safe base64 encoded.
19
+ *
20
+ * @param string $input The encoded input string to decode.
21
+ * @return string Returns the decoded input string.
22
+ */
23
+ public static function UrlSafeDecode(string $input) : string {
24
+
25
+ $remainder = strlen($input) % 4;
26
+ if ($remainder) {
27
+ $padlen = 4 - $remainder;
28
+ $input .= str_repeat('=', $padlen);
29
+ }
30
+ return base64_decode(strtr($input, '-_', '+/'));
31
+ }
32
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Certificate.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Utilities;
4
+
5
+ use LE_ACME2\Order;
6
+ use LE_ACME2\Exception\OpenSSLException;
7
+
8
+ class Certificate {
9
+
10
+ protected static $_featureOCSPMustStapleEnabled = false;
11
+
12
+ public static function enableFeatureOCSPMustStaple() {
13
+ self::$_featureOCSPMustStapleEnabled = true;
14
+ }
15
+
16
+ public static function disableFeatureOCSPMustStaple() {
17
+ self::$_featureOCSPMustStapleEnabled = false;
18
+ }
19
+
20
+ /**
21
+ * @param Order $order
22
+ * @return string
23
+ * @throws OpenSSLException
24
+ */
25
+ public static function generateCSR(Order $order) : string {
26
+
27
+ $dn = [
28
+ "commonName" => $order->getSubjects()[0]
29
+ ];
30
+
31
+ $san = implode(",", array_map(function ($dns) {
32
+
33
+ return "DNS:" . $dns;
34
+ }, $order->getSubjects())
35
+ );
36
+
37
+ $configFilePath = $order->getKeyDirectoryPath() . 'csr_config';
38
+
39
+ $config = 'HOME = .
40
+ RANDFILE = ' . $order->getKeyDirectoryPath() . '.rnd
41
+ [ req ]
42
+ default_bits = 4096
43
+ default_keyfile = privkey.pem
44
+ distinguished_name = req_distinguished_name
45
+ req_extensions = v3_req
46
+ [ req_distinguished_name ]
47
+ countryName = Country Name (2 letter code)
48
+ [ v3_req ]
49
+ basicConstraints = CA:FALSE
50
+ subjectAltName = ' . $san . '
51
+ keyUsage = nonRepudiation, digitalSignature, keyEncipherment';
52
+
53
+ if(self::$_featureOCSPMustStapleEnabled) {
54
+ $config .= PHP_EOL . 'tlsfeature=status_request';
55
+ }
56
+
57
+ file_put_contents($configFilePath, $config);
58
+
59
+ $privateKey = openssl_pkey_get_private(
60
+ file_get_contents($order->getKeyDirectoryPath() . 'private.pem')
61
+ );
62
+
63
+ if($privateKey === false) {
64
+ throw new OpenSSLException('openssl_pkey_get_private');
65
+ }
66
+
67
+ $csr = openssl_csr_new(
68
+ $dn,
69
+ $privateKey,
70
+ [
71
+ 'config' => $configFilePath,
72
+ 'digest_alg' => 'sha256'
73
+ ]
74
+ );
75
+
76
+ if($csr === false) {
77
+ throw new OpenSSLException('openssl_csr_new');
78
+ }
79
+
80
+ if(!openssl_csr_export($csr, $csr)) {
81
+ throw new OpenSSLException('openssl_csr_export');
82
+ }
83
+
84
+ unlink($configFilePath);
85
+
86
+ return $csr;
87
+ }
88
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/KeyGenerator.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Utilities;
4
+
5
+ class KeyGenerator {
6
+
7
+ /**
8
+ * Generates a new RSA keypair and saves both keys to a new file.
9
+ *
10
+ * @param string $directory The directory in which to store the new keys.
11
+ * @param string $privateKeyFile The filename for the private key file.
12
+ * @param string $publicKeyFile The filename for the public key file.
13
+ */
14
+ public static function RSA(string $directory, string $privateKeyFile = 'private.pem', string $publicKeyFile = 'public.pem') {
15
+
16
+ $res = openssl_pkey_new([
17
+ "private_key_type" => OPENSSL_KEYTYPE_RSA,
18
+ "private_key_bits" => 4096,
19
+ ]);
20
+
21
+ if(!openssl_pkey_export($res, $privateKey))
22
+ throw new \RuntimeException("RSA keypair export failed!");
23
+
24
+ $details = openssl_pkey_get_details($res);
25
+
26
+ file_put_contents($directory . $privateKeyFile, $privateKey);
27
+ file_put_contents($directory . $publicKeyFile, $details['key']);
28
+
29
+ if(PHP_MAJOR_VERSION < 8) {
30
+ // deprecated after PHP 8.0.0 and not needed anymore
31
+ openssl_pkey_free($res);
32
+ }
33
+ }
34
+
35
+ /**
36
+ * Generates a new EC prime256v1 keypair and saves both keys to a new file.
37
+ *
38
+ * @param string $directory The directory in which to store the new keys.
39
+ * @param string $privateKeyFile The filename for the private key file.
40
+ * @param string $publicKeyFile The filename for the public key file.
41
+ */
42
+ public static function EC(string $directory, string $privateKeyFile = 'private.pem', string $publicKeyFile = 'public.pem') {
43
+
44
+ if (version_compare(PHP_VERSION, '7.1.0') == -1)
45
+ throw new \RuntimeException("PHP 7.1+ required for EC keys");
46
+
47
+ $res = openssl_pkey_new([
48
+ "private_key_type" => OPENSSL_KEYTYPE_EC,
49
+ "curve_name" => "prime256v1",
50
+ ]);
51
+
52
+ if(!openssl_pkey_export($res, $privateKey))
53
+ throw new \RuntimeException("EC keypair export failed!");
54
+
55
+ $details = openssl_pkey_get_details($res);
56
+
57
+ file_put_contents($directory . $privateKeyFile, $privateKey);
58
+ file_put_contents($directory . $publicKeyFile, $details['key']);
59
+
60
+ if(PHP_MAJOR_VERSION < 8) {
61
+ // deprecated after PHP 8.0.0 and not needed anymore
62
+ openssl_pkey_free($res);
63
+ }
64
+ }
65
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Logger.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Utilities;
4
+
5
+ use LE_ACME2\SingletonTrait;
6
+
7
+ class Logger {
8
+
9
+ use SingletonTrait;
10
+
11
+ const LEVEL_DISABLED = 0;
12
+ const LEVEL_INFO = 1;
13
+ const LEVEL_DEBUG = 2;
14
+
15
+ private function __construct() {}
16
+
17
+ protected $_desiredLevel = self::LEVEL_DISABLED;
18
+
19
+ public function setDesiredLevel(int $desiredLevel) {
20
+ $this->_desiredLevel = $desiredLevel;
21
+ }
22
+
23
+ /**
24
+ * @param int $level
25
+ * @param string $message
26
+ * @param string|array|object $data
27
+ */
28
+ public function add(int $level, string $message, $data = array()) {
29
+
30
+ if($level > $this->_desiredLevel)
31
+ return;
32
+
33
+ $e = new \Exception();
34
+ $trace = $e->getTrace();
35
+ unset($trace[0]);
36
+
37
+ $output = '<b>' . date('d-m-Y H:i:s') . ': ' . $message . '</b><br>' . "\n";
38
+
39
+ if($this->_desiredLevel == self::LEVEL_DEBUG) {
40
+
41
+ $step = 0;
42
+ foreach ($trace as $traceItem) {
43
+
44
+ if(!isset($traceItem['class']) || !isset($traceItem['function'])) {
45
+ continue;
46
+ }
47
+
48
+ $output .= 'Trace #' . $step . ': ' . $traceItem['class'] . '::' . $traceItem['function'] . '<br/>' . "\n";
49
+ $step++;
50
+ }
51
+
52
+ if ((is_array($data) && count($data) > 0) || !is_array($data))
53
+ $output .= "\n" .'<br/>Data:<br/>' . "\n" . '<pre>' . var_export($data, true) . '</pre>';
54
+
55
+ $output .= '<br><br>' . "\n\n";
56
+ }
57
+
58
+ if(PHP_SAPI == 'cli') {
59
+
60
+ $output = strip_tags($output);
61
+ }
62
+ echo $output;
63
+ }
64
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/RequestSigner.php ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace LE_ACME2\Utilities;
4
+
5
+ class RequestSigner {
6
+
7
+ /**
8
+ * Generates a JSON Web Key signature to attach to the request.
9
+ *
10
+ * @param array $payload The payload to add to the signature.
11
+ * @param string $url The URL to use in the signature.
12
+ * @param string $nonce
13
+ * @param string $privateKeyDir The directory to get the private key from. Default to the account keys directory given in the constructor. (optional)
14
+ * @param string $privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional)
15
+ *
16
+ * @return array Returns an array containing the signature.
17
+ */
18
+ public static function JWK(array $payload, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : array {
19
+
20
+ Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'JWK sign request for ' . $url, $payload);
21
+
22
+ $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyDir . $privateKeyFile));
23
+ $details = openssl_pkey_get_details($privateKey);
24
+
25
+ $protected = [
26
+ "alg" => "RS256",
27
+ "jwk" => [
28
+ "kty" => "RSA",
29
+ "n" => Base64::UrlSafeEncode($details["rsa"]["n"]),
30
+ "e" => Base64::UrlSafeEncode($details["rsa"]["e"]),
31
+ ],
32
+ "nonce" => $nonce,
33
+ "url" => $url
34
+ ];
35
+
36
+ $payload64 = Base64::UrlSafeEncode(str_replace('\\/', '/', json_encode($payload)));
37
+ $protected64 = Base64::UrlSafeEncode(json_encode($protected));
38
+
39
+ openssl_sign($protected64.'.'.$payload64, $signed, $privateKey, "SHA256");
40
+ $signed64 = Base64::UrlSafeEncode($signed);
41
+
42
+ $data = array(
43
+ 'protected' => $protected64,
44
+ 'payload' => $payload64,
45
+ 'signature' => $signed64
46
+ );
47
+
48
+ return $data;
49
+ }
50
+
51
+ /**
52
+ * Generates a JSON Web Key signature to attach to the request.
53
+ *
54
+ * @param array $payload The payload to add to the signature.
55
+ * @param string $url The URL to use in the signature.
56
+ * @param string $nonce
57
+ * @param string $privateKeyDir The directory to get the private key from. Default to the account keys directory given in the constructor. (optional)
58
+ * @param string $privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional)
59
+ *
60
+ * @return string Returns a JSON encoded string containing the signature.
61
+ */
62
+ public static function JWKString(array $payload, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : string {
63
+
64
+ $jwk = self::JWK($payload, $url, $nonce, $privateKeyDir, $privateKeyFile);
65
+ return json_encode($jwk);
66
+ }
67
+
68
+ /**
69
+ * Generates a Key ID signature to attach to the request.
70
+ *
71
+ * @param array|null $payload The payload to add to the signature.
72
+ * @param string $kid The Key ID to use in the signature.
73
+ * @param string $url The URL to use in the signature.
74
+ * @param string $nonce
75
+ * @param string $privateKeyDir The directory to get the private key from.
76
+ * @param string $privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional)
77
+ *
78
+ * @return string Returns a JSON encoded string containing the signature.
79
+ */
80
+ public static function KID(?array $payload, string $kid, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : string {
81
+
82
+ Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'KID sign request for ' . $url, $payload);
83
+
84
+ $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyDir . $privateKeyFile));
85
+ // TODO: unused - $details = openssl_pkey_get_details($privateKey);
86
+
87
+ $protected = [
88
+ "alg" => "RS256",
89
+ "kid" => $kid,
90
+ "nonce" => $nonce,
91
+ "url" => $url
92
+ ];
93
+
94
+ Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'KID: ready to sign request for: ' . $url, $protected);
95
+
96
+ $payload = $payload === null ? "" : str_replace('\\/', '/', json_encode($payload));
97
+
98
+ $payload64 = Base64::UrlSafeEncode($payload);
99
+ $protected64 = Base64::UrlSafeEncode(json_encode($protected));
100
+
101
+ openssl_sign($protected64.'.'.$payload64, $signed, $privateKey, "SHA256");
102
+ $signed64 = Base64::UrlSafeEncode($signed);
103
+
104
+ $data = [
105
+ 'protected' => $protected64,
106
+ 'payload' => $payload64,
107
+ 'signature' => $signed64
108
+ ];
109
+
110
+ return json_encode($data);
111
+ }
112
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/AbstractTest.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2Tests;
3
+
4
+ use PHPUnit\Framework\TestCase;
5
+ use LE_ACME2;
6
+
7
+ abstract class AbstractTest extends TestCase {
8
+
9
+ public function __construct() {
10
+ parent::__construct();
11
+
12
+ LE_ACME2\Connector\Connector::getInstance()->useStagingServer(true);
13
+ }
14
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/AccountTest.php ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2Tests;
3
+
4
+ use LE_ACME2\Exception\InvalidResponse;
5
+
6
+ /**
7
+ * @covers \LE_ACME2\Account
8
+ */
9
+ class AccountTest extends AbstractTest {
10
+
11
+ private $_commonKeyDirectoryPath;
12
+
13
+ private $_email;
14
+
15
+ public function __construct() {
16
+ parent::__construct();
17
+
18
+ $this->_commonKeyDirectoryPath = TestHelper::getInstance()->getTempPath() . 'le-storage/';
19
+
20
+ $this->_email = 'le_acme2_php_client@test.com';
21
+ }
22
+
23
+ public function testNonExistingCommonKeyDirectoryPath() {
24
+
25
+ $this->assertTrue(\LE_ACME2\Account::getCommonKeyDirectoryPath() === null);
26
+
27
+ $notExistingPath = TestHelper::getInstance()->getTempPath() . 'should-not-exist/';
28
+
29
+ $this->expectException(\RuntimeException::class);
30
+
31
+ \LE_ACME2\Account::setCommonKeyDirectoryPath($notExistingPath);
32
+ }
33
+
34
+ public function testCommonKeyDirectoryPath() {
35
+
36
+ if(!file_exists($this->_commonKeyDirectoryPath)) {
37
+ mkdir($this->_commonKeyDirectoryPath);
38
+ }
39
+
40
+ \LE_ACME2\Account::setCommonKeyDirectoryPath($this->_commonKeyDirectoryPath);
41
+
42
+ $this->assertTrue(
43
+ \LE_ACME2\Account::getCommonKeyDirectoryPath() === $this->_commonKeyDirectoryPath
44
+ );
45
+ }
46
+
47
+ public function testNonExisting() {
48
+
49
+ if(\LE_ACME2\Account::exists($this->_email)) {
50
+ $this->markTestSkipped('Skipped: Account does already exist');
51
+ }
52
+
53
+ $this->assertTrue(!\LE_ACME2\Account::exists($this->_email));
54
+
55
+ $this->expectException(\RuntimeException::class);
56
+ \LE_ACME2\Account::get($this->_email);
57
+ }
58
+
59
+ public function testCreate() {
60
+
61
+ if(\LE_ACME2\Account::exists($this->_email)) {
62
+ // Skipping account modification tests, when the account already exists
63
+ // to reduce the LE api usage while developing
64
+ TestHelper::getInstance()->setSkipAccountModificationTests(true);
65
+ $this->markTestSkipped('Account modifications skipped: Account does already exist');
66
+ }
67
+
68
+ $this->assertTrue(!\LE_ACME2\Account::exists($this->_email));
69
+
70
+ $account = \LE_ACME2\Account::create($this->_email);
71
+ $this->assertTrue(is_object($account));
72
+ $this->assertTrue($account->getEmail() === $this->_email);
73
+
74
+ $account = \LE_ACME2\Account::get($this->_email);
75
+ $this->assertTrue(is_object($account));
76
+
77
+ $result = $account->getData();
78
+ $this->assertTrue($result->getStatus() === \LE_ACME2\Response\Account\AbstractAccount::STATUS_VALID);
79
+ }
80
+
81
+ public function testInvalidCreate() {
82
+
83
+ if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) {
84
+ $this->expectNotToPerformAssertions();
85
+ return;
86
+ }
87
+
88
+ $this->expectException(InvalidResponse::class);
89
+ $this->expectExceptionMessage(
90
+ 'Invalid response received: ' .
91
+ 'urn:ietf:params:acme:error:invalidEmail' .
92
+ ' - ' .
93
+ 'Error creating new account :: invalid contact domain. Contact emails @example.org are forbidden'
94
+ );
95
+ \LE_ACME2\Account::create('test@example.org');
96
+ }
97
+
98
+ public function testModification() {
99
+
100
+ if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) {
101
+ $this->expectNotToPerformAssertions();
102
+ return;
103
+ }
104
+
105
+ $account = \LE_ACME2\Account::get($this->_email);
106
+ $this->assertTrue(is_object($account));
107
+
108
+ $keyDirectoryPath = $account->getKeyDirectoryPath();
109
+ $newEmail = 'new-' . $this->_email;
110
+
111
+ // An email from example.org is not allowed
112
+ $result = $account->update('test@example.org');
113
+ $this->assertTrue($result === false);
114
+
115
+ $result = $account->update($newEmail);
116
+ $this->assertTrue($result === true);
117
+
118
+ $this->assertTrue($account->getKeyDirectoryPath() !== $keyDirectoryPath);
119
+ $this->assertTrue(file_exists($account->getKeyDirectoryPath()));
120
+
121
+ $result = $account->update($this->_email);
122
+ $this->assertTrue($result === true);
123
+
124
+ $result = $account->changeKeys();
125
+ $this->assertTrue($result === true);
126
+ }
127
+
128
+ public function testDeactivation() {
129
+
130
+ if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) {
131
+ $this->expectNotToPerformAssertions();
132
+ return;
133
+ }
134
+
135
+ $account = \LE_ACME2\Account::get($this->_email);
136
+ $this->assertTrue(is_object($account));
137
+
138
+ $result = $account->deactivate();
139
+ $this->assertTrue($result === true);
140
+
141
+ // The account is already deactivated
142
+ $result = $account->deactivate();
143
+ $this->assertTrue($result === false);
144
+
145
+ // The account is already deactivated
146
+ $result = $account->changeKeys();
147
+ $this->assertTrue($result === false);
148
+
149
+ // The account is already deactivated
150
+ $this->expectException(\LE_ACME2\Exception\InvalidResponse::class);
151
+ $account->getData();
152
+ }
153
+
154
+ public function testCreationAfterDeactivation() {
155
+
156
+ if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) {
157
+ $this->expectNotToPerformAssertions();
158
+ return;
159
+ }
160
+
161
+ $account = \LE_ACME2\Account::get($this->_email);
162
+ $this->assertTrue(is_object($account));
163
+
164
+ system('rm -R ' . $account->getKeyDirectoryPath());
165
+ $this->assertTrue(!\LE_ACME2\Account::exists($this->_email));
166
+
167
+ $account = \LE_ACME2\Account::create($this->_email);
168
+ $this->assertTrue(is_object($account));
169
+ }
170
+
171
+ public function test() {
172
+
173
+ $account = \LE_ACME2\Account::get($this->_email);
174
+ $this->assertTrue(is_object($account));
175
+ }
176
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/Authorizer/HTTPTest.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2Tests\Authorizer;
3
+
4
+ use LE_ACME2Tests\AbstractTest;
5
+ use LE_ACME2Tests\TestHelper;
6
+
7
+ /**
8
+ * @covers \LE_ACME2\Authorizer\HTTP
9
+ */
10
+ class HTTPTest extends AbstractTest {
11
+
12
+ private $_directoryPath;
13
+
14
+ public function __construct() {
15
+ parent::__construct();
16
+
17
+ $this->_directoryPath = TestHelper::getInstance()->getTempPath() . 'acme-challenges/';
18
+ }
19
+
20
+ public function testNonExistingDirectoryPath() {
21
+
22
+ $this->assertTrue(\LE_ACME2\Authorizer\HTTP::getDirectoryPath() === null);
23
+
24
+ $this->expectException(\RuntimeException::class);
25
+ \LE_ACME2\Authorizer\HTTP::setDirectoryPath(TestHelper::getInstance()->getNonExistingPath());
26
+ }
27
+
28
+ public function testDirectoryPath() {
29
+
30
+ if(!file_exists($this->_directoryPath)) {
31
+ mkdir($this->_directoryPath);
32
+ }
33
+
34
+ \LE_ACME2\Authorizer\HTTP::setDirectoryPath($this->_directoryPath);
35
+
36
+ $this->assertTrue(
37
+ \LE_ACME2\Authorizer\HTTP::getDirectoryPath() === $this->_directoryPath
38
+ );
39
+ }
40
+ }
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/TestHelper.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LE_ACME2Tests;
3
+
4
+ use LE_ACME2\SingletonTrait;
5
+
6
+ class TestHelper {
7
+
8
+ private $_tempPath;
9
+ private $_nonExistingPath;
10
+
11
+ use SingletonTrait;
12
+
13
+ private function __construct() {
14
+
15
+ $projectPath = realpath($_SERVER[ 'PWD' ]) . '/';
16
+ $this->_tempPath = $projectPath . 'temp/';
17
+ if( !file_exists($this->_tempPath) ) {
18
+ mkdir($this->_tempPath);
19
+ }
20
+
21
+ $this->_nonExistingPath = $this->getTempPath() . 'should-not-exist/';
22
+ }
23
+
24
+ public function getTempPath() : string {
25
+ return $this->_tempPath;
26
+ }
27
+
28
+ public function getNonExistingPath() : string {
29
+ return $this->_nonExistingPath;
30
+ }
31
+
32
+ private $_skipAccountModificationTests = false;
33
+
34
+ public function setSkipAccountModificationTests(bool $value) : void {
35
+ $this->_skipAccountModificationTests = $value;
36
+ }
37
+
38
+ public function shouldSkipAccountModificationTests() : bool {
39
+ return $this->_skipAccountModificationTests;
40
+ }
41
+ }
lets-encrypt/vendor/plesk/api-php-lib/.styleci.yml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ preset: recommended
2
+
3
+ disabled:
4
+ - align_double_arrow
5
+ - phpdoc_align
6
+ - blank_line_after_opening_tag
lets-encrypt/vendor/plesk/api-php-lib/.travis.yml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ services: docker
2
+
3
+ script:
4
+ - docker-compose run tests
lets-encrypt/vendor/plesk/api-php-lib/Dockerfile ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ FROM php:7.3-cli
2
+
3
+ RUN apt-get update \
4
+ && apt-get install -y unzip \
5
+ && docker-php-ext-install pcntl \
6
+ && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
lets-encrypt/vendor/plesk/api-php-lib/LICENSE ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright 1999-2020. Plesk International GmbH.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
lets-encrypt/vendor/plesk/api-php-lib/README.md ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## PHP library for Plesk XML-RPC API
2
+
3
+ [![Build Status](https://travis-ci.com/plesk/api-php-lib.svg?branch=master)](https://travis-ci.com/plesk/api-php-lib) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/plesk/api-php-lib/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/plesk/api-php-lib/?branch=master)
4
+ [![StyleCI](https://styleci.io/repos/26514840/shield?branch=master)](https://styleci.io/repos/26514840)
5
+
6
+ PHP object-oriented library for Plesk XML-RPC API.
7
+
8
+ ## Install Via Composer
9
+
10
+ [Composer](https://getcomposer.org/) is a preferable way to install the library:
11
+
12
+ `composer require plesk/api-php-lib`
13
+
14
+ ## Usage Examples
15
+
16
+ Here is an example on how to use the library and create a customer with desired properties:
17
+ ```php
18
+ $client = new \PleskX\Api\Client($host);
19
+ $client->setCredentials($login, $password);
20
+
21
+ $client->customer()->create([
22
+ 'cname' => 'Plesk',
23
+ 'pname' => 'John Smith',
24
+ 'login' => 'john',
25
+ 'passwd' => 'secret',
26
+ 'email' => 'john@smith.com',
27
+ ]);
28
+ ```
29
+
30
+ It is possible to use a secret key instead of password for authentication.
31
+
32
+ ```php
33
+ $client = new \PleskX\Api\Client($host);
34
+ $client->setSecretKey($secretKey)
35
+ ```
36
+
37
+ In case of Plesk extension creation one can use an internal mechanism to access XML-RPC API. It does not require to pass authentication because the extension works in the context of Plesk.
38
+
39
+ ```php
40
+ $client = new \PleskX\Api\InternalClient();
41
+ $protocols = $client->server()->getProtos();
42
+ ```
43
+
44
+ For additional examples see tests/ directory.
45
+
46
+ ## How to Run Unit Tests
47
+
48
+ One the possible ways to become familiar with the library is to check the unit tests.
49
+
50
+ To run the unit tests use the following command:
51
+
52
+ `REMOTE_HOST=your-plesk-host.dom REMOTE_PASSWORD=password composer test`
53
+
54
+ To use custom port one can provide a URL (e.g. for Docker container):
55
+
56
+ `REMOTE_URL=https://your-plesk-host.dom:port REMOTE_PASSWORD=password composer test`
57
+
58
+ One more way to run tests is to use Docker:
59
+
60
+ `docker-compose run tests`
61
+
62
+ ## Continuous Testing
63
+
64
+ During active development it could be more convenient to run tests in continuous manner. Here is the way how to achieve it:
65
+
66
+ `REMOTE_URL=https://your-plesk-host.dom:port REMOTE_PASSWORD=password composer test:watch`
lets-encrypt/vendor/plesk/api-php-lib/composer.json ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "plesk/api-php-lib",
3
+ "type": "library",
4
+ "description": "PHP object-oriented library for Plesk XML-RPC API",
5
+ "license": "Apache-2.0",
6
+ "authors": [
7
+ {
8
+ "name": "Alexei Yuzhakov",
9
+ "email": "sibprogrammer@gmail.com"
10
+ },
11
+ {
12
+ "name": "Plesk International GmbH.",
13
+ "email": "plesk-dev-leads@plesk.com"
14
+ }
15
+ ],
16
+ "require": {
17
+ "php": "^7.3",
18
+ "ext-curl": "*",
19
+ "ext-xml": "*",
20
+ "ext-simplexml": "*"
21
+ },
22
+ "require-dev": {
23
+ "phpunit/phpunit": "^9",
24
+ "spatie/phpunit-watcher": "^1.22"
25
+ },
26
+ "config": {
27
+ "process-timeout": 0
28
+ },
29
+ "scripts": {
30
+ "test": "phpunit",
31
+ "test:watch": "phpunit-watcher watch"
32
+ },
33
+ "autoload": {
34
+ "psr-4": {
35
+ "PleskX\\": "src/"
36
+ }
37
+ },
38
+ "autoload-dev": {
39
+ "psr-4": {
40
+ "PleskXTest\\": "tests/"
41
+ }
42
+ },
43
+ "extra": {
44
+ "branch-alias": {
45
+ "dev-master": "2.0.x-dev"
46
+ }
47
+ }
48
+ }
lets-encrypt/vendor/plesk/api-php-lib/composer.lock ADDED
@@ -0,0 +1,2919 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "554cb70d6a29bd690fd9e966b98003d0",
8
+ "packages": [],
9
+ "packages-dev": [
10
+ {
11
+ "name": "clue/stdio-react",
12
+ "version": "v2.3.0",
13
+ "source": {
14
+ "type": "git",
15
+ "url": "https://github.com/clue/reactphp-stdio.git",
16
+ "reference": "5f42a3a5a29f52432f0f68b57890353e8ca65069"
17
+ },
18
+ "dist": {
19
+ "type": "zip",
20
+ "url": "https://api.github.com/repos/clue/reactphp-stdio/zipball/5f42a3a5a29f52432f0f68b57890353e8ca65069",
21
+ "reference": "5f42a3a5a29f52432f0f68b57890353e8ca65069",
22
+ "shasum": ""
23
+ },
24
+ "require": {
25
+ "clue/term-react": "^1.0 || ^0.1.1",
26
+ "clue/utf8-react": "^1.0 || ^0.1",
27
+ "php": ">=5.3",
28
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3",
29
+ "react/stream": "^1.0 || ^0.7 || ^0.6"
30
+ },
31
+ "require-dev": {
32
+ "clue/arguments": "^2.0",
33
+ "clue/commander": "^1.2",
34
+ "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
35
+ },
36
+ "suggest": {
37
+ "ext-mbstring": "Using ext-mbstring should provide slightly better performance for handling I/O"
38
+ },
39
+ "type": "library",
40
+ "autoload": {
41
+ "psr-4": {
42
+ "Clue\\React\\Stdio\\": "src/"
43
+ }
44
+ },
45
+ "notification-url": "https://packagist.org/downloads/",
46
+ "license": [
47
+ "MIT"
48
+ ],
49
+ "authors": [
50
+ {
51
+ "name": "Christian Lück",
52
+ "email": "christian@lueck.tv"
53
+ }
54
+ ],
55
+ "description": "Async, event-driven console input & output (STDIN, STDOUT) for truly interactive CLI applications, built on top of ReactPHP",
56
+ "homepage": "https://github.com/clue/reactphp-stdio",
57
+ "keywords": [
58
+ "async",
59
+ "autocomplete",
60
+ "autocompletion",
61
+ "cli",
62
+ "history",
63
+ "interactive",
64
+ "reactphp",
65
+ "readline",
66
+ "stdin",
67
+ "stdio",
68
+ "stdout"
69
+ ],
70
+ "time": "2019-08-28T12:01:30+00:00"
71
+ },
72
+ {
73
+ "name": "clue/term-react",
74
+ "version": "v1.2.0",
75
+ "source": {
76
+ "type": "git",
77
+ "url": "https://github.com/clue/reactphp-term.git",
78
+ "reference": "3cec1164073455a85a3f2b3c3fe6db2170d21c2a"
79
+ },
80
+ "dist": {
81
+ "type": "zip",
82
+ "url": "https://api.github.com/repos/clue/reactphp-term/zipball/3cec1164073455a85a3f2b3c3fe6db2170d21c2a",
83
+ "reference": "3cec1164073455a85a3f2b3c3fe6db2170d21c2a",
84
+ "shasum": ""
85
+ },
86
+ "require": {
87
+ "php": ">=5.3",
88
+ "react/stream": "^1.0 || ^0.7"
89
+ },
90
+ "require-dev": {
91
+ "phpunit/phpunit": "^5.0 || ^4.8",
92
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3"
93
+ },
94
+ "type": "library",
95
+ "autoload": {
96
+ "psr-4": {
97
+ "Clue\\React\\Term\\": "src/"
98
+ }
99
+ },
100
+ "notification-url": "https://packagist.org/downloads/",
101
+ "license": [
102
+ "MIT"
103
+ ],
104
+ "authors": [
105
+ {
106
+ "name": "Christian Lück",
107
+ "email": "christian@lueck.tv"
108
+ }
109
+ ],
110
+ "description": "Streaming terminal emulator, built on top of ReactPHP",
111
+ "homepage": "https://github.com/clue/reactphp-term",
112
+ "keywords": [
113
+ "C0",
114
+ "CSI",
115
+ "ansi",
116
+ "apc",
117
+ "ascii",
118
+ "c1",
119
+ "control codes",
120
+ "dps",
121
+ "osc",
122
+ "pm",
123
+ "reactphp",
124
+ "streaming",
125
+ "terminal",
126
+ "vt100",
127
+ "xterm"
128
+ ],
129
+ "time": "2018-07-09T08:20:33+00:00"
130
+ },
131
+ {
132
+ "name": "clue/utf8-react",
133
+ "version": "v1.1.0",
134
+ "source": {
135
+ "type": "git",
136
+ "url": "https://github.com/clue/php-utf8-react.git",
137
+ "reference": "c6111a22e1056627c119233ff5effe00f5d3cc1d"
138
+ },
139
+ "dist": {
140
+ "type": "zip",
141
+ "url": "https://api.github.com/repos/clue/php-utf8-react/zipball/c6111a22e1056627c119233ff5effe00f5d3cc1d",
142
+ "reference": "c6111a22e1056627c119233ff5effe00f5d3cc1d",
143
+ "shasum": ""
144
+ },
145
+ "require": {
146
+ "php": ">=5.3",
147
+ "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3"
148
+ },
149
+ "require-dev": {
150
+ "phpunit/phpunit": "^5.0 || ^4.8",
151
+ "react/stream": "^1.0 || ^0.7"
152
+ },
153
+ "type": "library",
154
+ "autoload": {
155
+ "psr-4": {
156
+ "Clue\\React\\Utf8\\": "src/"
157
+ }
158
+ },
159
+ "notification-url": "https://packagist.org/downloads/",
160
+ "license": [
161
+ "MIT"
162
+ ],
163
+ "authors": [
164
+ {
165
+ "name": "Christian Lück",
166
+ "email": "christian@lueck.tv"
167
+ }
168
+ ],
169
+ "description": "Streaming UTF-8 parser, built on top of ReactPHP",
170
+ "homepage": "https://github.com/clue/php-utf8-react",
171
+ "keywords": [
172
+ "reactphp",
173
+ "streaming",
174
+ "unicode",
175
+ "utf-8",
176
+ "utf8"
177
+ ],
178
+ "time": "2017-07-06T07:43:22+00:00"
179
+ },
180
+ {
181
+ "name": "doctrine/instantiator",
182
+ "version": "1.3.1",
183
+ "source": {
184
+ "type": "git",
185
+ "url": "https://github.com/doctrine/instantiator.git",
186
+ "reference": "f350df0268e904597e3bd9c4685c53e0e333feea"
187
+ },
188
+ "dist": {
189
+ "type": "zip",
190
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea",
191
+ "reference": "f350df0268e904597e3bd9c4685c53e0e333feea",
192
+ "shasum": ""
193
+ },
194
+ "require": {
195
+ "php": "^7.1 || ^8.0"
196
+ },
197
+ "require-dev": {
198
+ "doctrine/coding-standard": "^6.0",
199
+ "ext-pdo": "*",
200
+ "ext-phar": "*",
201
+ "phpbench/phpbench": "^0.13",
202
+ "phpstan/phpstan-phpunit": "^0.11",
203
+ "phpstan/phpstan-shim": "^0.11",
204
+ "phpunit/phpunit": "^7.0"
205
+ },
206
+ "type": "library",
207
+ "extra": {
208
+ "branch-alias": {
209
+ "dev-master": "1.2.x-dev"
210
+ }
211
+ },
212
+ "autoload": {
213
+ "psr-4": {
214
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
215
+ }
216
+ },
217
+ "notification-url": "https://packagist.org/downloads/",
218
+ "license": [
219
+ "MIT"
220
+ ],
221
+ "authors": [
222
+ {
223
+ "name": "Marco Pivetta",
224
+ "email": "ocramius@gmail.com",
225
+ "homepage": "http://ocramius.github.com/"
226
+ }
227
+ ],
228
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
229
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
230
+ "keywords": [
231
+ "constructor",
232
+ "instantiate"
233
+ ],
234
+ "time": "2020-05-29T17:27:14+00:00"
235
+ },
236
+ {
237
+ "name": "evenement/evenement",
238
+ "version": "v3.0.1",
239
+ "source": {
240
+ "type": "git",
241
+ "url": "https://github.com/igorw/evenement.git",
242
+ "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7"
243
+ },
244
+ "dist": {
245
+ "type": "zip",
246
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
247
+ "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
248
+ "shasum": ""
249
+ },
250
+ "require": {
251
+ "php": ">=7.0"
252
+ },
253
+ "require-dev": {
254
+ "phpunit/phpunit": "^6.0"
255
+ },
256
+ "type": "library",
257
+ "autoload": {
258
+ "psr-0": {
259
+ "Evenement": "src"
260
+ }
261
+ },
262
+ "notification-url": "https://packagist.org/downloads/",
263
+ "license": [
264
+ "MIT"
265
+ ],
266
+ "authors": [
267
+ {
268
+ "name": "Igor Wiedler",
269
+ "email": "igor@wiedler.ch"
270
+ }
271
+ ],
272
+ "description": "Événement is a very simple event dispatching library for PHP",
273
+ "keywords": [
274
+ "event-dispatcher",
275
+ "event-emitter"
276
+ ],
277
+ "time": "2017-07-23T21:35:13+00:00"
278
+ },
279
+ {
280
+ "name": "jolicode/jolinotif",
281
+ "version": "v2.2.0",
282
+ "source": {
283
+ "type": "git",
284
+ "url": "https://github.com/jolicode/JoliNotif.git",
285
+ "reference": "52f5b98f964f6009b8ec4c0e951edcd0862e2ac7"
286
+ },
287
+ "dist": {
288
+ "type": "zip",
289
+ "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/52f5b98f964f6009b8ec4c0e951edcd0862e2ac7",
290
+ "reference": "52f5b98f964f6009b8ec4c0e951edcd0862e2ac7",
291
+ "shasum": ""
292
+ },
293
+ "require": {
294
+ "php": ">=7.0",
295
+ "symfony/process": "^3.3|^4.0|^5.0"
296
+ },
297
+ "require-dev": {
298
+ "friendsofphp/php-cs-fixer": "^2.0",
299
+ "symfony/finder": "^3.3|^4.0|^5.0",
300
+ "symfony/phpunit-bridge": "^3.4.26|^4.0|^5.0"
301
+ },
302
+ "bin": [
303
+ "jolinotif"
304
+ ],
305
+ "type": "library",
306
+ "extra": {
307
+ "branch-alias": {
308
+ "dev-master": "2.1.x-dev"
309
+ }
310
+ },
311
+ "autoload": {
312
+ "psr-4": {
313
+ "Joli\\JoliNotif\\": "src/"
314
+ }
315
+ },
316
+ "notification-url": "https://packagist.org/downloads/",
317
+ "license": [
318
+ "MIT"
319
+ ],
320
+ "authors": [
321
+ {
322
+ "name": "Loïck Piera",
323
+ "email": "pyrech@gmail.com"
324
+ }
325
+ ],
326
+ "description": "Send desktop notifications on Windows, Linux, MacOS.",
327
+ "keywords": [
328
+ "MAC",
329
+ "growl",
330
+ "linux",
331
+ "notification",
332
+ "windows"
333
+ ],
334
+ "time": "2020-06-17T08:25:38+00:00"
335
+ },
336
+ {
337
+ "name": "myclabs/deep-copy",
338
+ "version": "1.10.1",
339
+ "source": {
340
+ "type": "git",
341
+ "url": "https://github.com/myclabs/DeepCopy.git",
342
+ "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5"
343
+ },
344
+ "dist": {
345
+ "type": "zip",
346
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
347
+ "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
348
+ "shasum": ""
349
+ },
350
+ "require": {
351
+ "php": "^7.1 || ^8.0"
352
+ },
353
+ "replace": {
354
+ "myclabs/deep-copy": "self.version"
355
+ },
356
+ "require-dev": {
357
+ "doctrine/collections": "^1.0",
358
+ "doctrine/common": "^2.6",
359
+ "phpunit/phpunit": "^7.1"
360
+ },
361
+ "type": "library",
362
+ "autoload": {
363
+ "psr-4": {
364
+ "DeepCopy\\": "src/DeepCopy/"
365
+ },
366
+ "files": [
367
+ "src/DeepCopy/deep_copy.php"
368
+ ]
369
+ },
370
+ "notification-url": "https://packagist.org/downloads/",
371
+ "license": [
372
+ "MIT"
373
+ ],
374
+ "description": "Create deep copies (clones) of your objects",
375
+ "keywords": [
376
+ "clone",
377
+ "copy",
378
+ "duplicate",
379
+ "object",
380
+ "object graph"
381
+ ],
382
+ "time": "2020-06-29T13:22:24+00:00"
383
+ },
384
+ {
385
+ "name": "phar-io/manifest",
386
+ "version": "1.0.3",
387
+ "source": {
388
+ "type": "git",
389
+ "url": "https://github.com/phar-io/manifest.git",
390
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
391
+ },
392
+ "dist": {
393
+ "type": "zip",
394
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
395
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
396
+ "shasum": ""
397
+ },
398
+ "require": {
399
+ "ext-dom": "*",
400
+ "ext-phar": "*",
401
+ "phar-io/version": "^2.0",
402
+ "php": "^5.6 || ^7.0"
403
+ },
404
+ "type": "library",
405
+ "extra": {
406
+ "branch-alias": {
407
+ "dev-master": "1.0.x-dev"
408
+ }
409
+ },
410
+ "autoload": {
411
+ "classmap": [
412
+ "src/"
413
+ ]
414
+ },
415
+ "notification-url": "https://packagist.org/downloads/",
416
+ "license": [
417
+ "BSD-3-Clause"
418
+ ],
419
+ "authors": [
420
+ {
421
+ "name": "Arne Blankerts",
422
+ "email": "arne@blankerts.de",
423
+ "role": "Developer"
424
+ },
425
+ {
426
+ "name": "Sebastian Heuer",
427
+ "email": "sebastian@phpeople.de",
428
+ "role": "Developer"
429
+ },
430
+ {
431
+ "name": "Sebastian Bergmann",
432
+ "email": "sebastian@phpunit.de",
433
+ "role": "Developer"
434
+ }
435
+ ],
436
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
437
+ "time": "2018-07-08T19:23:20+00:00"
438
+ },
439
+ {
440
+ "name": "phar-io/version",
441
+ "version": "2.0.1",
442
+ "source": {
443
+ "type": "git",
444
+ "url": "https://github.com/phar-io/version.git",
445
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
446
+ },
447
+ "dist": {
448
+ "type": "zip",
449
+ "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
450
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
451
+ "shasum": ""
452
+ },
453
+ "require": {
454
+ "php": "^5.6 || ^7.0"
455
+ },
456
+ "type": "library",
457
+ "autoload": {
458
+ "classmap": [
459
+ "src/"
460
+ ]
461
+ },
462
+ "notification-url": "https://packagist.org/downloads/",
463
+ "license": [
464
+ "BSD-3-Clause"
465
+ ],
466
+ "authors": [
467
+ {
468
+ "name": "Arne Blankerts",
469
+ "email": "arne@blankerts.de",
470
+ "role": "Developer"
471
+ },
472
+ {
473
+ "name": "Sebastian Heuer",
474
+ "email": "sebastian@phpeople.de",
475
+ "role": "Developer"
476
+ },
477
+ {
478
+ "name": "Sebastian Bergmann",
479
+ "email": "sebastian@phpunit.de",
480
+ "role": "Developer"
481
+ }
482
+ ],
483
+ "description": "Library for handling version information and constraints",
484
+ "time": "2018-07-08T19:19:57+00:00"
485
+ },
486
+ {
487
+ "name": "phpdocumentor/reflection-common",
488
+ "version": "2.2.0",
489
+ "source": {
490
+ "type": "git",
491
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
492
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
493
+ },
494
+ "dist": {
495
+ "type": "zip",
496
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
497
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
498
+ "shasum": ""
499
+ },
500
+ "require": {
501
+ "php": "^7.2 || ^8.0"
502
+ },
503
+ "type": "library",
504
+ "extra": {
505
+ "branch-alias": {
506
+ "dev-2.x": "2.x-dev"
507
+ }
508
+ },
509
+ "autoload": {
510
+ "psr-4": {
511
+ "phpDocumentor\\Reflection\\": "src/"
512
+ }
513
+ },
514
+ "notification-url": "https://packagist.org/downloads/",
515
+ "license": [
516
+ "MIT"
517
+ ],
518
+ "authors": [
519
+ {
520
+ "name": "Jaap van Otterdijk",
521
+ "email": "opensource@ijaap.nl"
522
+ }
523
+ ],
524
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
525
+ "homepage": "http://www.phpdoc.org",
526
+ "keywords": [
527
+ "FQSEN",
528
+ "phpDocumentor",
529
+ "phpdoc",
530
+ "reflection",
531
+ "static analysis"
532
+ ],
533
+ "time": "2020-06-27T09:03:43+00:00"
534
+ },
535
+ {
536
+ "name": "phpdocumentor/reflection-docblock",
537
+ "version": "5.2.0",
538
+ "source": {
539
+ "type": "git",
540
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
541
+ "reference": "3170448f5769fe19f456173d833734e0ff1b84df"
542
+ },
543
+ "dist": {
544
+ "type": "zip",
545
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/3170448f5769fe19f456173d833734e0ff1b84df",
546
+ "reference": "3170448f5769fe19f456173d833734e0ff1b84df",
547
+ "shasum": ""
548
+ },
549
+ "require": {
550
+ "ext-filter": "*",
551
+ "php": "^7.2 || ^8.0",
552
+ "phpdocumentor/reflection-common": "^2.2",
553
+ "phpdocumentor/type-resolver": "^1.3",
554
+ "webmozart/assert": "^1.9.1"
555
+ },
556
+ "require-dev": {
557
+ "mockery/mockery": "~1.3.2"
558
+ },
559
+ "type": "library",
560
+ "extra": {
561
+ "branch-alias": {
562
+ "dev-master": "5.x-dev"
563
+ }
564
+ },
565
+ "autoload": {
566
+ "psr-4": {
567
+ "phpDocumentor\\Reflection\\": "src"
568
+ }
569
+ },
570
+ "notification-url": "https://packagist.org/downloads/",
571
+ "license": [
572
+ "MIT"
573
+ ],
574
+ "authors": [
575
+ {
576
+ "name": "Mike van Riel",
577
+ "email": "me@mikevanriel.com"
578
+ },
579
+ {
580
+ "name": "Jaap van Otterdijk",
581
+ "email": "account@ijaap.nl"
582
+ }
583
+ ],
584
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
585
+ "time": "2020-07-20T20:05:34+00:00"
586
+ },
587
+ {
588
+ "name": "phpdocumentor/type-resolver",
589
+ "version": "1.3.0",
590
+ "source": {
591
+ "type": "git",
592
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
593
+ "reference": "e878a14a65245fbe78f8080eba03b47c3b705651"
594
+ },
595
+ "dist": {
596
+ "type": "zip",
597
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651",
598
+ "reference": "e878a14a65245fbe78f8080eba03b47c3b705651",
599
+ "shasum": ""
600
+ },
601
+ "require": {
602
+ "php": "^7.2 || ^8.0",
603
+ "phpdocumentor/reflection-common": "^2.0"
604
+ },
605
+ "require-dev": {
606
+ "ext-tokenizer": "*"
607
+ },
608
+ "type": "library",
609
+ "extra": {
610
+ "branch-alias": {
611
+ "dev-1.x": "1.x-dev"
612
+ }
613
+ },
614
+ "autoload": {
615
+ "psr-4": {
616
+ "phpDocumentor\\Reflection\\": "src"
617
+ }
618
+ },
619
+ "notification-url": "https://packagist.org/downloads/",
620
+ "license": [
621
+ "MIT"
622
+ ],
623
+ "authors": [
624
+ {
625
+ "name": "Mike van Riel",
626
+ "email": "me@mikevanriel.com"
627
+ }
628
+ ],
629
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
630
+ "time": "2020-06-27T10:12:23+00:00"
631
+ },
632
+ {
633
+ "name": "phpspec/prophecy",
634
+ "version": "1.11.1",
635
+ "source": {
636
+ "type": "git",
637
+ "url": "https://github.com/phpspec/prophecy.git",
638
+ "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160"
639
+ },
640
+ "dist": {
641
+ "type": "zip",
642
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160",
643
+ "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160",
644
+ "shasum": ""
645
+ },
646
+ "require": {
647
+ "doctrine/instantiator": "^1.2",
648
+ "php": "^7.2",
649
+ "phpdocumentor/reflection-docblock": "^5.0",
650
+ "sebastian/comparator": "^3.0 || ^4.0",
651
+ "sebastian/recursion-context": "^3.0 || ^4.0"
652
+ },
653
+ "require-dev": {
654
+ "phpspec/phpspec": "^6.0",
655
+ "phpunit/phpunit": "^8.0"
656
+ },
657
+ "type": "library",
658
+ "extra": {
659
+ "branch-alias": {
660
+ "dev-master": "1.11.x-dev"
661
+ }
662
+ },
663
+ "autoload": {
664
+ "psr-4": {
665
+ "Prophecy\\": "src/Prophecy"
666
+ }
667
+ },
668
+ "notification-url": "https://packagist.org/downloads/",
669
+ "license": [
670
+ "MIT"
671
+ ],
672
+ "authors": [
673
+ {
674
+ "name": "Konstantin Kudryashov",
675
+ "email": "ever.zet@gmail.com",
676
+ "homepage": "http://everzet.com"
677
+ },
678
+ {
679
+ "name": "Marcello Duarte",
680
+ "email": "marcello.duarte@gmail.com"
681
+ }
682
+ ],
683
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
684
+ "homepage": "https://github.com/phpspec/prophecy",
685
+ "keywords": [
686
+ "Double",
687
+ "Dummy",
688
+ "fake",
689
+ "mock",
690
+ "spy",
691
+ "stub"
692
+ ],
693
+ "time": "2020-07-08T12:44:21+00:00"
694
+ },
695
+ {
696
+ "name": "phpunit/php-code-coverage",
697
+ "version": "8.0.2",
698
+ "source": {
699
+ "type": "git",
700
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
701
+ "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc"
702
+ },
703
+ "dist": {
704
+ "type": "zip",
705
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca6647ffddd2add025ab3f21644a441d7c146cdc",
706
+ "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc",
707
+ "shasum": ""
708
+ },
709
+ "require": {
710
+ "ext-dom": "*",
711
+ "ext-xmlwriter": "*",
712
+ "php": "^7.3",
713
+ "phpunit/php-file-iterator": "^3.0",
714
+ "phpunit/php-text-template": "^2.0",
715
+ "phpunit/php-token-stream": "^4.0",
716
+ "sebastian/code-unit-reverse-lookup": "^2.0",
717
+ "sebastian/environment": "^5.0",
718
+ "sebastian/version": "^3.0",
719
+ "theseer/tokenizer": "^1.1.3"
720
+ },
721
+ "require-dev": {
722
+ "phpunit/phpunit": "^9.0"
723
+ },
724
+ "suggest": {
725
+ "ext-pcov": "*",
726
+ "ext-xdebug": "*"
727
+ },
728
+ "type": "library",
729
+ "extra": {
730
+ "branch-alias": {
731
+ "dev-master": "8.0-dev"
732
+ }
733
+ },
734
+ "autoload": {
735
+ "classmap": [
736
+ "src/"
737
+ ]
738
+ },
739
+ "notification-url": "https://packagist.org/downloads/",
740
+ "license": [
741
+ "BSD-3-Clause"
742
+ ],
743
+ "authors": [
744
+ {
745
+ "name": "Sebastian Bergmann",
746
+ "email": "sebastian@phpunit.de",
747
+ "role": "lead"
748
+ }
749
+ ],
750
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
751
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
752
+ "keywords": [
753
+ "coverage",
754
+ "testing",
755
+ "xunit"
756
+ ],
757
+ "time": "2020-05-23T08:02:54+00:00"
758
+ },
759
+ {
760
+ "name": "phpunit/php-file-iterator",
761
+ "version": "3.0.4",
762
+ "source": {
763
+ "type": "git",
764
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
765
+ "reference": "25fefc5b19835ca653877fe081644a3f8c1d915e"
766
+ },
767
+ "dist": {
768
+ "type": "zip",
769
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/25fefc5b19835ca653877fe081644a3f8c1d915e",
770
+ "reference": "25fefc5b19835ca653877fe081644a3f8c1d915e",
771
+ "shasum": ""
772
+ },
773
+ "require": {
774
+ "php": "^7.3 || ^8.0"
775
+ },
776
+ "require-dev": {
777
+ "phpunit/phpunit": "^9.0"
778
+ },
779
+ "type": "library",
780
+ "extra": {
781
+ "branch-alias": {
782
+ "dev-master": "3.0-dev"
783
+ }
784
+ },
785
+ "autoload": {
786
+ "classmap": [
787
+ "src/"
788
+ ]
789
+ },
790
+ "notification-url": "https://packagist.org/downloads/",
791
+ "license": [
792
+ "BSD-3-Clause"
793
+ ],
794
+ "authors": [
795
+ {
796
+ "name": "Sebastian Bergmann",
797
+ "email": "sebastian@phpunit.de",
798
+ "role": "lead"
799
+ }
800
+ ],
801
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
802
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
803
+ "keywords": [
804
+ "filesystem",
805
+ "iterator"
806
+ ],
807
+ "time": "2020-07-11T05:18:21+00:00"
808
+ },
809
+ {
810
+ "name": "phpunit/php-invoker",
811
+ "version": "3.0.2",
812
+ "source": {
813
+ "type": "git",
814
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
815
+ "reference": "f6eedfed1085dd1f4c599629459a0277d25f9a66"
816
+ },
817
+ "dist": {
818
+ "type": "zip",
819
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f6eedfed1085dd1f4c599629459a0277d25f9a66",
820
+ "reference": "f6eedfed1085dd1f4c599629459a0277d25f9a66",
821
+ "shasum": ""
822
+ },
823
+ "require": {
824
+ "php": "^7.3 || ^8.0"
825
+ },
826
+ "require-dev": {
827
+ "ext-pcntl": "*",
828
+ "phpunit/phpunit": "^9.0"
829
+ },
830
+ "suggest": {
831
+ "ext-pcntl": "*"
832
+ },
833
+ "type": "library",
834
+ "extra": {
835
+ "branch-alias": {
836
+ "dev-master": "3.0-dev"
837
+ }
838
+ },
839
+ "autoload": {
840
+ "classmap": [
841
+ "src/"
842
+ ]
843
+ },
844
+ "notification-url": "https://packagist.org/downloads/",
845
+ "license": [
846
+ "BSD-3-Clause"
847
+ ],
848
+ "authors": [
849
+ {
850
+ "name": "Sebastian Bergmann",
851
+ "email": "sebastian@phpunit.de",
852
+ "role": "lead"
853
+ }
854
+ ],
855
+ "description": "Invoke callables with a timeout",
856
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
857
+ "keywords": [
858
+ "process"
859
+ ],
860
+ "time": "2020-06-26T11:53:53+00:00"
861
+ },
862
+ {
863
+ "name": "phpunit/php-text-template",
864
+ "version": "2.0.2",
865
+ "source": {
866
+ "type": "git",
867
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
868
+ "reference": "6ff9c8ea4d3212b88fcf74e25e516e2c51c99324"
869
+ },
870
+ "dist": {
871
+ "type": "zip",
872
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/6ff9c8ea4d3212b88fcf74e25e516e2c51c99324",
873
+ "reference": "6ff9c8ea4d3212b88fcf74e25e516e2c51c99324",
874
+ "shasum": ""
875
+ },
876
+ "require": {
877
+ "php": "^7.3 || ^8.0"
878
+ },
879
+ "require-dev": {
880
+ "phpunit/phpunit": "^9.0"
881
+ },
882
+ "type": "library",
883
+ "extra": {
884
+ "branch-alias": {
885
+ "dev-master": "2.0-dev"
886
+ }
887
+ },
888
+ "autoload": {
889
+ "classmap": [
890
+ "src/"
891
+ ]
892
+ },
893
+ "notification-url": "https://packagist.org/downloads/",
894
+ "license": [
895
+ "BSD-3-Clause"
896
+ ],
897
+ "authors": [
898
+ {
899
+ "name": "Sebastian Bergmann",
900
+ "email": "sebastian@phpunit.de",
901
+ "role": "lead"
902
+ }
903
+ ],
904
+ "description": "Simple template engine.",
905
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
906
+ "keywords": [
907
+ "template"
908
+ ],
909
+ "time": "2020-06-26T11:55:37+00:00"
910
+ },
911
+ {
912
+ "name": "phpunit/php-timer",
913
+ "version": "5.0.1",
914
+ "source": {
915
+ "type": "git",
916
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
917
+ "reference": "cc49734779cbb302bf51a44297dab8c4bbf941e7"
918
+ },
919
+ "dist": {
920
+ "type": "zip",
921
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/cc49734779cbb302bf51a44297dab8c4bbf941e7",
922
+ "reference": "cc49734779cbb302bf51a44297dab8c4bbf941e7",
923
+ "shasum": ""
924
+ },
925
+ "require": {
926
+ "php": "^7.3 || ^8.0"
927
+ },
928
+ "require-dev": {
929
+ "phpunit/phpunit": "^9.2"
930
+ },
931
+ "type": "library",
932
+ "extra": {
933
+ "branch-alias": {
934
+ "dev-master": "5.0-dev"
935
+ }
936
+ },
937
+ "autoload": {
938
+ "classmap": [
939
+ "src/"
940
+ ]
941
+ },
942
+ "notification-url": "https://packagist.org/downloads/",
943
+ "license": [
944
+ "BSD-3-Clause"
945
+ ],
946
+ "authors": [
947
+ {
948
+ "name": "Sebastian Bergmann",
949
+ "email": "sebastian@phpunit.de",
950
+ "role": "lead"
951
+ }
952
+ ],
953
+ "description": "Utility class for timing",
954
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
955
+ "keywords": [
956
+ "timer"
957
+ ],
958
+ "time": "2020-06-26T11:58:13+00:00"
959
+ },
960
+ {
961
+ "name": "phpunit/php-token-stream",
962
+ "version": "4.0.3",
963
+ "source": {
964
+ "type": "git",
965
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
966
+ "reference": "5672711b6b07b14d5ab694e700c62eeb82fcf374"
967
+ },
968
+ "dist": {
969
+ "type": "zip",
970
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/5672711b6b07b14d5ab694e700c62eeb82fcf374",
971
+ "reference": "5672711b6b07b14d5ab694e700c62eeb82fcf374",
972
+ "shasum": ""
973
+ },
974
+ "require": {
975
+ "ext-tokenizer": "*",
976
+ "php": "^7.3 || ^8.0"
977
+ },
978
+ "require-dev": {
979
+ "phpunit/phpunit": "^9.0"
980
+ },
981
+ "type": "library",
982
+ "extra": {
983
+ "branch-alias": {
984
+ "dev-master": "4.0-dev"
985
+ }
986
+ },
987
+ "autoload": {
988
+ "classmap": [
989
+ "src/"
990
+ ]
991
+ },
992
+ "notification-url": "https://packagist.org/downloads/",
993
+ "license": [
994
+ "BSD-3-Clause"
995
+ ],
996
+ "authors": [
997
+ {
998
+ "name": "Sebastian Bergmann",
999
+ "email": "sebastian@phpunit.de"
1000
+ }
1001
+ ],
1002
+ "description": "Wrapper around PHP's tokenizer extension.",
1003
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
1004
+ "keywords": [
1005
+ "tokenizer"
1006
+ ],
1007
+ "time": "2020-06-27T06:36:25+00:00"
1008
+ },
1009
+ {
1010
+ "name": "phpunit/phpunit",
1011
+ "version": "9.2.6",
1012
+ "source": {
1013
+ "type": "git",
1014
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
1015
+ "reference": "1c6a9e4312e209e659f1fce3ce88dd197c2448f6"
1016
+ },
1017
+ "dist": {
1018
+ "type": "zip",
1019
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c6a9e4312e209e659f1fce3ce88dd197c2448f6",
1020
+ "reference": "1c6a9e4312e209e659f1fce3ce88dd197c2448f6",
1021
+ "shasum": ""
1022
+ },
1023
+ "require": {
1024
+ "doctrine/instantiator": "^1.3.1",
1025
+ "ext-dom": "*",
1026
+ "ext-json": "*",
1027
+ "ext-libxml": "*",
1028
+ "ext-mbstring": "*",
1029
+ "ext-xml": "*",
1030
+ "ext-xmlwriter": "*",
1031
+ "myclabs/deep-copy": "^1.9.5",
1032
+ "phar-io/manifest": "^1.0.3",
1033
+ "phar-io/version": "^2.0.1",
1034
+ "php": "^7.3",
1035
+ "phpspec/prophecy": "^1.10.3",
1036
+ "phpunit/php-code-coverage": "^8.0.2",
1037
+ "phpunit/php-file-iterator": "^3.0.3",
1038
+ "phpunit/php-invoker": "^3.0.2",
1039
+ "phpunit/php-text-template": "^2.0.2",
1040
+ "phpunit/php-timer": "^5.0.1",
1041
+ "sebastian/code-unit": "^1.0.5",
1042
+ "sebastian/comparator": "^4.0.3",
1043
+ "sebastian/diff": "^4.0.1",
1044
+ "sebastian/environment": "^5.1.2",
1045
+ "sebastian/exporter": "^4.0.2",
1046
+ "sebastian/global-state": "^4.0",
1047
+ "sebastian/object-enumerator": "^4.0.2",
1048
+ "sebastian/resource-operations": "^3.0.2",
1049
+ "sebastian/type": "^2.1.1",
1050
+ "sebastian/version": "^3.0.1"
1051
+ },
1052
+ "require-dev": {
1053
+ "ext-pdo": "*",
1054
+ "phpspec/prophecy-phpunit": "^2.0"
1055
+ },
1056
+ "suggest": {
1057
+ "ext-soap": "*",
1058
+ "ext-xdebug": "*"
1059
+ },
1060
+ "bin": [
1061
+ "phpunit"
1062
+ ],
1063
+ "type": "library",
1064
+ "extra": {
1065
+ "branch-alias": {
1066
+ "dev-master": "9.2-dev"
1067
+ }
1068
+ },
1069
+ "autoload": {
1070
+ "classmap": [
1071
+ "src/"
1072
+ ],
1073
+ "files": [
1074
+ "src/Framework/Assert/Functions.php"
1075
+ ]
1076
+ },
1077
+ "notification-url": "https://packagist.org/downloads/",
1078
+ "license": [
1079
+ "BSD-3-Clause"
1080
+ ],
1081
+ "authors": [
1082
+ {
1083
+ "name": "Sebastian Bergmann",
1084
+ "email": "sebastian@phpunit.de",
1085
+ "role": "lead"
1086
+ }
1087
+ ],
1088
+ "description": "The PHP Unit Testing framework.",
1089
+ "homepage": "https://phpunit.de/",
1090
+ "keywords": [
1091
+ "phpunit",
1092
+ "testing",
1093
+ "xunit"
1094
+ ],
1095
+ "time": "2020-07-13T17:55:55+00:00"
1096
+ },
1097
+ {
1098
+ "name": "psr/container",
1099
+ "version": "1.0.0",
1100
+ "source": {
1101
+ "type": "git",
1102
+ "url": "https://github.com/php-fig/container.git",
1103
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
1104
+ },
1105
+ "dist": {
1106
+ "type": "zip",
1107
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
1108
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
1109
+ "shasum": ""
1110
+ },
1111
+ "require": {
1112
+ "php": ">=5.3.0"
1113
+ },
1114
+ "type": "library",
1115
+ "extra": {
1116
+ "branch-alias": {
1117
+ "dev-master": "1.0.x-dev"
1118
+ }
1119
+ },
1120
+ "autoload": {
1121
+ "psr-4": {
1122
+ "Psr\\Container\\": "src/"
1123
+ }
1124
+ },
1125
+ "notification-url": "https://packagist.org/downloads/",
1126
+ "license": [
1127
+ "MIT"
1128
+ ],
1129
+ "authors": [
1130
+ {
1131
+ "name": "PHP-FIG",
1132
+ "homepage": "http://www.php-fig.org/"
1133
+ }
1134
+ ],
1135
+ "description": "Common Container Interface (PHP FIG PSR-11)",
1136
+ "homepage": "https://github.com/php-fig/container",
1137
+ "keywords": [
1138
+ "PSR-11",
1139
+ "container",
1140
+ "container-interface",
1141
+ "container-interop",
1142
+ "psr"
1143
+ ],
1144
+ "time": "2017-02-14T16:28:37+00:00"
1145
+ },
1146
+ {
1147
+ "name": "react/event-loop",
1148
+ "version": "v1.1.1",
1149
+ "source": {
1150
+ "type": "git",
1151
+ "url": "https://github.com/reactphp/event-loop.git",
1152
+ "reference": "6d24de090cd59cfc830263cfba965be77b563c13"
1153
+ },
1154
+ "dist": {
1155
+ "type": "zip",
1156
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6d24de090cd59cfc830263cfba965be77b563c13",
1157
+ "reference": "6d24de090cd59cfc830263cfba965be77b563c13",
1158
+ "shasum": ""
1159
+ },
1160
+ "require": {
1161
+ "php": ">=5.3.0"
1162
+ },
1163
+ "require-dev": {
1164
+ "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
1165
+ },
1166
+ "suggest": {
1167
+ "ext-event": "~1.0 for ExtEventLoop",
1168
+ "ext-pcntl": "For signal handling support when using the StreamSelectLoop",
1169
+ "ext-uv": "* for ExtUvLoop"
1170
+ },
1171
+ "type": "library",
1172
+ "autoload": {
1173
+ "psr-4": {
1174
+ "React\\EventLoop\\": "src"
1175
+ }
1176
+ },
1177
+ "notification-url": "https://packagist.org/downloads/",
1178
+ "license": [
1179
+ "MIT"
1180
+ ],
1181
+ "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
1182
+ "keywords": [
1183
+ "asynchronous",
1184
+ "event-loop"
1185
+ ],
1186
+ "time": "2020-01-01T18:39:52+00:00"
1187
+ },
1188
+ {
1189
+ "name": "react/stream",
1190
+ "version": "v1.1.1",
1191
+ "source": {
1192
+ "type": "git",
1193
+ "url": "https://github.com/reactphp/stream.git",
1194
+ "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a"
1195
+ },
1196
+ "dist": {
1197
+ "type": "zip",
1198
+ "url": "https://api.github.com/repos/reactphp/stream/zipball/7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
1199
+ "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
1200
+ "shasum": ""
1201
+ },
1202
+ "require": {
1203
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
1204
+ "php": ">=5.3.8",
1205
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5"
1206
+ },
1207
+ "require-dev": {
1208
+ "clue/stream-filter": "~1.2",
1209
+ "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
1210
+ },
1211
+ "type": "library",
1212
+ "autoload": {
1213
+ "psr-4": {
1214
+ "React\\Stream\\": "src"
1215
+ }
1216
+ },
1217
+ "notification-url": "https://packagist.org/downloads/",
1218
+ "license": [
1219
+ "MIT"
1220
+ ],
1221
+ "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
1222
+ "keywords": [
1223
+ "event-driven",
1224
+ "io",
1225
+ "non-blocking",
1226
+ "pipe",
1227
+ "reactphp",
1228
+ "readable",
1229
+ "stream",
1230
+ "writable"
1231
+ ],
1232
+ "time": "2020-05-04T10:17:57+00:00"
1233
+ },
1234
+ {
1235
+ "name": "sebastian/code-unit",
1236
+ "version": "1.0.5",
1237
+ "source": {
1238
+ "type": "git",
1239
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
1240
+ "reference": "c1e2df332c905079980b119c4db103117e5e5c90"
1241
+ },
1242
+ "dist": {
1243
+ "type": "zip",
1244
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/c1e2df332c905079980b119c4db103117e5e5c90",
1245
+ "reference": "c1e2df332c905079980b119c4db103117e5e5c90",
1246
+ "shasum": ""
1247
+ },
1248
+ "require": {
1249
+ "php": "^7.3 || ^8.0"
1250
+ },
1251
+ "require-dev": {
1252
+ "phpunit/phpunit": "^9.0"
1253
+ },
1254
+ "type": "library",
1255
+ "extra": {
1256
+ "branch-alias": {
1257
+ "dev-master": "1.0-dev"
1258
+ }
1259
+ },
1260
+ "autoload": {
1261
+ "classmap": [
1262
+ "src/"
1263
+ ]
1264
+ },
1265
+ "notification-url": "https://packagist.org/downloads/",
1266
+ "license": [
1267
+ "BSD-3-Clause"
1268
+ ],
1269
+ "authors": [
1270
+ {
1271
+ "name": "Sebastian Bergmann",
1272
+ "email": "sebastian@phpunit.de",
1273
+ "role": "lead"
1274
+ }
1275
+ ],
1276
+ "description": "Collection of value objects that represent the PHP code units",
1277
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
1278
+ "time": "2020-06-26T12:50:45+00:00"
1279
+ },
1280
+ {
1281
+ "name": "sebastian/code-unit-reverse-lookup",
1282
+ "version": "2.0.2",
1283
+ "source": {
1284
+ "type": "git",
1285
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1286
+ "reference": "ee51f9bb0c6d8a43337055db3120829fa14da819"
1287
+ },
1288
+ "dist": {
1289
+ "type": "zip",
1290
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ee51f9bb0c6d8a43337055db3120829fa14da819",
1291
+ "reference": "ee51f9bb0c6d8a43337055db3120829fa14da819",
1292
+ "shasum": ""
1293
+ },
1294
+ "require": {
1295
+ "php": "^7.3 || ^8.0"
1296
+ },
1297
+ "require-dev": {
1298
+ "phpunit/phpunit": "^9.0"
1299
+ },
1300
+ "type": "library",
1301
+ "extra": {
1302
+ "branch-alias": {
1303
+ "dev-master": "2.0-dev"
1304
+ }
1305
+ },
1306
+ "autoload": {
1307
+ "classmap": [
1308
+ "src/"
1309
+ ]
1310
+ },
1311
+ "notification-url": "https://packagist.org/downloads/",
1312
+ "license": [
1313
+ "BSD-3-Clause"
1314
+ ],
1315
+ "authors": [
1316
+ {
1317
+ "name": "Sebastian Bergmann",
1318
+ "email": "sebastian@phpunit.de"
1319
+ }
1320
+ ],
1321
+ "description": "Looks up which function or method a line of code belongs to",
1322
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1323
+ "time": "2020-06-26T12:04:00+00:00"
1324
+ },
1325
+ {
1326
+ "name": "sebastian/comparator",
1327
+ "version": "4.0.3",
1328
+ "source": {
1329
+ "type": "git",
1330
+ "url": "https://github.com/sebastianbergmann/comparator.git",
1331
+ "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f"
1332
+ },
1333
+ "dist": {
1334
+ "type": "zip",
1335
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f",
1336
+ "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f",
1337
+ "shasum": ""
1338
+ },
1339
+ "require": {
1340
+ "php": "^7.3 || ^8.0",
1341
+ "sebastian/diff": "^4.0",
1342
+ "sebastian/exporter": "^4.0"
1343
+ },
1344
+ "require-dev": {
1345
+ "phpunit/phpunit": "^9.0"
1346
+ },
1347
+ "type": "library",
1348
+ "extra": {
1349
+ "branch-alias": {
1350
+ "dev-master": "4.0-dev"
1351
+ }
1352
+ },
1353
+ "autoload": {
1354
+ "classmap": [
1355
+ "src/"
1356
+ ]
1357
+ },
1358
+ "notification-url": "https://packagist.org/downloads/",
1359
+ "license": [
1360
+ "BSD-3-Clause"
1361
+ ],
1362
+ "authors": [
1363
+ {
1364
+ "name": "Sebastian Bergmann",
1365
+ "email": "sebastian@phpunit.de"
1366
+ },
1367
+ {
1368
+ "name": "Jeff Welch",
1369
+ "email": "whatthejeff@gmail.com"
1370
+ },
1371
+ {
1372
+ "name": "Volker Dusch",
1373
+ "email": "github@wallbash.com"
1374
+ },
1375
+ {
1376
+ "name": "Bernhard Schussek",
1377
+ "email": "bschussek@2bepublished.at"
1378
+ }
1379
+ ],
1380
+ "description": "Provides the functionality to compare PHP values for equality",
1381
+ "homepage": "https://github.com/sebastianbergmann/comparator",
1382
+ "keywords": [
1383
+ "comparator",
1384
+ "compare",
1385
+ "equality"
1386
+ ],
1387
+ "time": "2020-06-26T12:05:46+00:00"
1388
+ },
1389
+ {
1390
+ "name": "sebastian/diff",
1391
+ "version": "4.0.2",
1392
+ "source": {
1393
+ "type": "git",
1394
+ "url": "https://github.com/sebastianbergmann/diff.git",
1395
+ "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113"
1396
+ },
1397
+ "dist": {
1398
+ "type": "zip",
1399
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113",
1400
+ "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113",
1401
+ "shasum": ""
1402
+ },
1403
+ "require": {
1404
+ "php": "^7.3 || ^8.0"
1405
+ },
1406
+ "require-dev": {
1407
+ "phpunit/phpunit": "^9.0",
1408
+ "symfony/process": "^4.2 || ^5"
1409
+ },
1410
+ "type": "library",
1411
+ "extra": {
1412
+ "branch-alias": {
1413
+ "dev-master": "4.0-dev"
1414
+ }
1415
+ },
1416
+ "autoload": {
1417
+ "classmap": [
1418
+ "src/"
1419
+ ]
1420
+ },
1421
+ "notification-url": "https://packagist.org/downloads/",
1422
+ "license": [
1423
+ "BSD-3-Clause"
1424
+ ],
1425
+ "authors": [
1426
+ {
1427
+ "name": "Sebastian Bergmann",
1428
+ "email": "sebastian@phpunit.de"
1429
+ },
1430
+ {
1431
+ "name": "Kore Nordmann",
1432
+ "email": "mail@kore-nordmann.de"
1433
+ }
1434
+ ],
1435
+ "description": "Diff implementation",
1436
+ "homepage": "https://github.com/sebastianbergmann/diff",
1437
+ "keywords": [
1438
+ "diff",
1439
+ "udiff",
1440
+ "unidiff",
1441
+ "unified diff"
1442
+ ],
1443
+ "time": "2020-06-30T04:46:02+00:00"
1444
+ },
1445
+ {
1446
+ "name": "sebastian/environment",
1447
+ "version": "5.1.2",
1448
+ "source": {
1449
+ "type": "git",
1450
+ "url": "https://github.com/sebastianbergmann/environment.git",
1451
+ "reference": "0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2"
1452
+ },
1453
+ "dist": {
1454
+ "type": "zip",
1455
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2",
1456
+ "reference": "0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2",
1457
+ "shasum": ""
1458
+ },
1459
+ "require": {
1460
+ "php": "^7.3 || ^8.0"
1461
+ },
1462
+ "require-dev": {
1463
+ "phpunit/phpunit": "^9.0"
1464
+ },
1465
+ "suggest": {
1466
+ "ext-posix": "*"
1467
+ },
1468
+ "type": "library",
1469
+ "extra": {
1470
+ "branch-alias": {
1471
+ "dev-master": "5.0-dev"
1472
+ }
1473
+ },
1474
+ "autoload": {
1475
+ "classmap": [
1476
+ "src/"
1477
+ ]
1478
+ },
1479
+ "notification-url": "https://packagist.org/downloads/",
1480
+ "license": [
1481
+ "BSD-3-Clause"
1482
+ ],
1483
+ "authors": [
1484
+ {
1485
+ "name": "Sebastian Bergmann",
1486
+ "email": "sebastian@phpunit.de"
1487
+ }
1488
+ ],
1489
+ "description": "Provides functionality to handle HHVM/PHP environments",
1490
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
1491
+ "keywords": [
1492
+ "Xdebug",
1493
+ "environment",
1494
+ "hhvm"
1495
+ ],
1496
+ "time": "2020-06-26T12:07:24+00:00"
1497
+ },
1498
+ {
1499
+ "name": "sebastian/exporter",
1500
+ "version": "4.0.2",
1501
+ "source": {
1502
+ "type": "git",
1503
+ "url": "https://github.com/sebastianbergmann/exporter.git",
1504
+ "reference": "571d721db4aec847a0e59690b954af33ebf9f023"
1505
+ },
1506
+ "dist": {
1507
+ "type": "zip",
1508
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/571d721db4aec847a0e59690b954af33ebf9f023",
1509
+ "reference": "571d721db4aec847a0e59690b954af33ebf9f023",
1510
+ "shasum": ""
1511
+ },
1512
+ "require": {
1513
+ "php": "^7.3 || ^8.0",
1514
+ "sebastian/recursion-context": "^4.0"
1515
+ },
1516
+ "require-dev": {
1517
+ "ext-mbstring": "*",
1518
+ "phpunit/phpunit": "^9.2"
1519
+ },
1520
+ "type": "library",
1521
+ "extra": {
1522
+ "branch-alias": {
1523
+ "dev-master": "4.0-dev"
1524
+ }
1525
+ },
1526
+ "autoload": {
1527
+ "classmap": [
1528
+ "src/"
1529
+ ]
1530
+ },
1531
+ "notification-url": "https://packagist.org/downloads/",
1532
+ "license": [
1533
+ "BSD-3-Clause"
1534
+ ],
1535
+ "authors": [
1536
+ {
1537
+ "name": "Sebastian Bergmann",
1538
+ "email": "sebastian@phpunit.de"
1539
+ },
1540
+ {
1541
+ "name": "Jeff Welch",
1542
+ "email": "whatthejeff@gmail.com"
1543
+ },
1544
+ {
1545
+ "name": "Volker Dusch",
1546
+ "email": "github@wallbash.com"
1547
+ },
1548
+ {
1549
+ "name": "Adam Harvey",
1550
+ "email": "aharvey@php.net"
1551
+ },
1552
+ {
1553
+ "name": "Bernhard Schussek",
1554
+ "email": "bschussek@gmail.com"
1555
+ }
1556
+ ],
1557
+ "description": "Provides the functionality to export PHP variables for visualization",
1558
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
1559
+ "keywords": [
1560
+ "export",
1561
+ "exporter"
1562
+ ],
1563
+ "time": "2020-06-26T12:08:55+00:00"
1564
+ },
1565
+ {
1566
+ "name": "sebastian/global-state",
1567
+ "version": "4.0.0",
1568
+ "source": {
1569
+ "type": "git",
1570
+ "url": "https://github.com/sebastianbergmann/global-state.git",
1571
+ "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72"
1572
+ },
1573
+ "dist": {
1574
+ "type": "zip",
1575
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bdb1e7c79e592b8c82cb1699be3c8743119b8a72",
1576
+ "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72",
1577
+ "shasum": ""
1578
+ },
1579
+ "require": {
1580
+ "php": "^7.3",
1581
+ "sebastian/object-reflector": "^2.0",
1582
+ "sebastian/recursion-context": "^4.0"
1583
+ },
1584
+ "require-dev": {
1585
+ "ext-dom": "*",
1586
+ "phpunit/phpunit": "^9.0"
1587
+ },
1588
+ "suggest": {
1589
+ "ext-uopz": "*"
1590
+ },
1591
+ "type": "library",
1592
+ "extra": {
1593
+ "branch-alias": {
1594
+ "dev-master": "4.0-dev"
1595
+ }
1596
+ },
1597
+ "autoload": {
1598
+ "classmap": [
1599
+ "src/"
1600
+ ]
1601
+ },
1602
+ "notification-url": "https://packagist.org/downloads/",
1603
+ "license": [
1604
+ "BSD-3-Clause"
1605
+ ],
1606
+ "authors": [
1607
+ {
1608
+ "name": "Sebastian Bergmann",
1609
+ "email": "sebastian@phpunit.de"
1610
+ }
1611
+ ],
1612
+ "description": "Snapshotting of global state",
1613
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
1614
+ "keywords": [
1615
+ "global state"
1616
+ ],
1617
+ "time": "2020-02-07T06:11:37+00:00"
1618
+ },
1619
+ {
1620
+ "name": "sebastian/object-enumerator",
1621
+ "version": "4.0.2",
1622
+ "source": {
1623
+ "type": "git",
1624
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
1625
+ "reference": "074fed2d0a6d08e1677dd8ce9d32aecb384917b8"
1626
+ },
1627
+ "dist": {
1628
+ "type": "zip",
1629
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/074fed2d0a6d08e1677dd8ce9d32aecb384917b8",
1630
+ "reference": "074fed2d0a6d08e1677dd8ce9d32aecb384917b8",
1631
+ "shasum": ""
1632
+ },
1633
+ "require": {
1634
+ "php": "^7.3 || ^8.0",
1635
+ "sebastian/object-reflector": "^2.0",
1636
+ "sebastian/recursion-context": "^4.0"
1637
+ },
1638
+ "require-dev": {
1639
+ "phpunit/phpunit": "^9.0"
1640
+ },
1641
+ "type": "library",
1642
+ "extra": {
1643
+ "branch-alias": {
1644
+ "dev-master": "4.0-dev"
1645
+ }
1646
+ },
1647
+ "autoload": {
1648
+ "classmap": [
1649
+ "src/"
1650
+ ]
1651
+ },
1652
+ "notification-url": "https://packagist.org/downloads/",
1653
+ "license": [
1654
+ "BSD-3-Clause"
1655
+ ],
1656
+ "authors": [
1657
+ {
1658
+ "name": "Sebastian Bergmann",
1659
+ "email": "sebastian@phpunit.de"
1660
+ }
1661
+ ],
1662
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
1663
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
1664
+ "time": "2020-06-26T12:11:32+00:00"
1665
+ },
1666
+ {
1667
+ "name": "sebastian/object-reflector",
1668
+ "version": "2.0.2",
1669
+ "source": {
1670
+ "type": "git",
1671
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
1672
+ "reference": "127a46f6b057441b201253526f81d5406d6c7840"
1673
+ },
1674
+ "dist": {
1675
+ "type": "zip",
1676
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/127a46f6b057441b201253526f81d5406d6c7840",
1677
+ "reference": "127a46f6b057441b201253526f81d5406d6c7840",
1678
+ "shasum": ""
1679
+ },
1680
+ "require": {
1681
+ "php": "^7.3 || ^8.0"
1682
+ },
1683
+ "require-dev": {
1684
+ "phpunit/phpunit": "^9.0"
1685
+ },
1686
+ "type": "library",
1687
+ "extra": {
1688
+ "branch-alias": {
1689
+ "dev-master": "2.0-dev"
1690
+ }
1691
+ },
1692
+ "autoload": {
1693
+ "classmap": [
1694
+ "src/"
1695
+ ]
1696
+ },
1697
+ "notification-url": "https://packagist.org/downloads/",
1698
+ "license": [
1699
+ "BSD-3-Clause"
1700
+ ],
1701
+ "authors": [
1702
+ {
1703
+ "name": "Sebastian Bergmann",
1704
+ "email": "sebastian@phpunit.de"
1705
+ }
1706
+ ],
1707
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
1708
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
1709
+ "time": "2020-06-26T12:12:55+00:00"
1710
+ },
1711
+ {
1712
+ "name": "sebastian/recursion-context",
1713
+ "version": "4.0.2",
1714
+ "source": {
1715
+ "type": "git",
1716
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
1717
+ "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63"
1718
+ },
1719
+ "dist": {
1720
+ "type": "zip",
1721
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/062231bf61d2b9448c4fa5a7643b5e1829c11d63",
1722
+ "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63",
1723
+ "shasum": ""
1724
+ },
1725
+ "require": {
1726
+ "php": "^7.3 || ^8.0"
1727
+ },
1728
+ "require-dev": {
1729
+ "phpunit/phpunit": "^9.0"
1730
+ },
1731
+ "type": "library",
1732
+ "extra": {
1733
+ "branch-alias": {
1734
+ "dev-master": "4.0-dev"
1735
+ }
1736
+ },
1737
+ "autoload": {
1738
+ "classmap": [
1739
+ "src/"
1740
+ ]
1741
+ },
1742
+ "notification-url": "https://packagist.org/downloads/",
1743
+ "license": [
1744
+ "BSD-3-Clause"
1745
+ ],
1746
+ "authors": [
1747
+ {
1748
+ "name": "Sebastian Bergmann",
1749
+ "email": "sebastian@phpunit.de"
1750
+ },
1751
+ {
1752
+ "name": "Jeff Welch",
1753
+ "email": "whatthejeff@gmail.com"
1754
+ },
1755
+ {
1756
+ "name": "Adam Harvey",
1757
+ "email": "aharvey@php.net"
1758
+ }
1759
+ ],
1760
+ "description": "Provides functionality to recursively process PHP variables",
1761
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
1762
+ "time": "2020-06-26T12:14:17+00:00"
1763
+ },
1764
+ {
1765
+ "name": "sebastian/resource-operations",
1766
+ "version": "3.0.2",
1767
+ "source": {
1768
+ "type": "git",
1769
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
1770
+ "reference": "0653718a5a629b065e91f774595267f8dc32e213"
1771
+ },
1772
+ "dist": {
1773
+ "type": "zip",
1774
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0653718a5a629b065e91f774595267f8dc32e213",
1775
+ "reference": "0653718a5a629b065e91f774595267f8dc32e213",
1776
+ "shasum": ""
1777
+ },
1778
+ "require": {
1779
+ "php": "^7.3 || ^8.0"
1780
+ },
1781
+ "require-dev": {
1782
+ "phpunit/phpunit": "^9.0"
1783
+ },
1784
+ "type": "library",
1785
+ "extra": {
1786
+ "branch-alias": {
1787
+ "dev-master": "3.0-dev"
1788
+ }
1789
+ },
1790
+ "autoload": {
1791
+ "classmap": [
1792
+ "src/"
1793
+ ]
1794
+ },
1795
+ "notification-url": "https://packagist.org/downloads/",
1796
+ "license": [
1797
+ "BSD-3-Clause"
1798
+ ],
1799
+ "authors": [
1800
+ {
1801
+ "name": "Sebastian Bergmann",
1802
+ "email": "sebastian@phpunit.de"
1803
+ }
1804
+ ],
1805
+ "description": "Provides a list of PHP built-in functions that operate on resources",
1806
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
1807
+ "time": "2020-06-26T12:16:22+00:00"
1808
+ },
1809
+ {
1810
+ "name": "sebastian/type",
1811
+ "version": "2.2.1",
1812
+ "source": {
1813
+ "type": "git",
1814
+ "url": "https://github.com/sebastianbergmann/type.git",
1815
+ "reference": "86991e2b33446cd96e648c18bcdb1e95afb2c05a"
1816
+ },
1817
+ "dist": {
1818
+ "type": "zip",
1819
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/86991e2b33446cd96e648c18bcdb1e95afb2c05a",
1820
+ "reference": "86991e2b33446cd96e648c18bcdb1e95afb2c05a",
1821
+ "shasum": ""
1822
+ },
1823
+ "require": {
1824
+ "php": "^7.3 || ^8.0"
1825
+ },
1826
+ "require-dev": {
1827
+ "phpunit/phpunit": "^9.2"
1828
+ },
1829
+ "type": "library",
1830
+ "extra": {
1831
+ "branch-alias": {
1832
+ "dev-master": "2.2-dev"
1833
+ }
1834
+ },
1835
+ "autoload": {
1836
+ "classmap": [
1837
+ "src/"
1838
+ ]
1839
+ },
1840
+ "notification-url": "https://packagist.org/downloads/",
1841
+ "license": [
1842
+ "BSD-3-Clause"
1843
+ ],
1844
+ "authors": [
1845
+ {
1846
+ "name": "Sebastian Bergmann",
1847
+ "email": "sebastian@phpunit.de",
1848
+ "role": "lead"
1849
+ }
1850
+ ],
1851
+ "description": "Collection of value objects that represent the types of the PHP type system",
1852
+ "homepage": "https://github.com/sebastianbergmann/type",
1853
+ "time": "2020-07-05T08:31:53+00:00"
1854
+ },
1855
+ {
1856
+ "name": "sebastian/version",
1857
+ "version": "3.0.1",
1858
+ "source": {
1859
+ "type": "git",
1860
+ "url": "https://github.com/sebastianbergmann/version.git",
1861
+ "reference": "626586115d0ed31cb71483be55beb759b5af5a3c"
1862
+ },
1863
+ "dist": {
1864
+ "type": "zip",
1865
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/626586115d0ed31cb71483be55beb759b5af5a3c",
1866
+ "reference": "626586115d0ed31cb71483be55beb759b5af5a3c",
1867
+ "shasum": ""
1868
+ },
1869
+ "require": {
1870
+ "php": "^7.3 || ^8.0"
1871
+ },
1872
+ "type": "library",
1873
+ "extra": {
1874
+ "branch-alias": {
1875
+ "dev-master": "3.0-dev"
1876
+ }
1877
+ },
1878
+ "autoload": {
1879
+ "classmap": [
1880
+ "src/"
1881
+ ]
1882
+ },
1883
+ "notification-url": "https://packagist.org/downloads/",
1884
+ "license": [
1885
+ "BSD-3-Clause"
1886
+ ],
1887
+ "authors": [
1888
+ {
1889
+ "name": "Sebastian Bergmann",
1890
+ "email": "sebastian@phpunit.de",
1891
+ "role": "lead"
1892
+ }
1893
+ ],
1894
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
1895
+ "homepage": "https://github.com/sebastianbergmann/version",
1896
+ "time": "2020-06-26T12:18:43+00:00"
1897
+ },
1898
+ {
1899
+ "name": "spatie/phpunit-watcher",
1900
+ "version": "1.22.0",
1901
+ "source": {
1902
+ "type": "git",
1903
+ "url": "https://github.com/spatie/phpunit-watcher.git",
1904
+ "reference": "dee58ae54d3bc4eccc2b3d7006444f535a693f18"
1905
+ },
1906
+ "dist": {
1907
+ "type": "zip",
1908
+ "url": "https://api.github.com/repos/spatie/phpunit-watcher/zipball/dee58ae54d3bc4eccc2b3d7006444f535a693f18",
1909
+ "reference": "dee58ae54d3bc4eccc2b3d7006444f535a693f18",
1910
+ "shasum": ""
1911
+ },
1912
+ "require": {
1913
+ "clue/stdio-react": "^2.0",
1914
+ "jolicode/jolinotif": "^2.0",
1915
+ "php": "^7.2",
1916
+ "symfony/console": "^4.0|^5.0",
1917
+ "symfony/process": "^4.0|^5.0",
1918
+ "symfony/yaml": "^4.0|^5.0",
1919
+ "yosymfony/resource-watcher": "^2.0"
1920
+ },
1921
+ "conflict": {
1922
+ "yosymfony/resource-watcher": "<2.0"
1923
+ },
1924
+ "require-dev": {
1925
+ "phpunit/phpunit": "^8.0"
1926
+ },
1927
+ "bin": [
1928
+ "phpunit-watcher"
1929
+ ],
1930
+ "type": "library",
1931
+ "autoload": {
1932
+ "psr-4": {
1933
+ "Spatie\\PhpUnitWatcher\\": "src"
1934
+ }
1935
+ },
1936
+ "notification-url": "https://packagist.org/downloads/",
1937
+ "license": [
1938
+ "MIT"
1939
+ ],
1940
+ "authors": [
1941
+ {
1942
+ "name": "Freek Van der Herten",
1943
+ "email": "freek@spatie.be",
1944
+ "homepage": "https://spatie.be",
1945
+ "role": "Developer"
1946
+ }
1947
+ ],
1948
+ "description": "Automatically rerun PHPUnit tests when source code changes",
1949
+ "homepage": "https://github.com/spatie/phpunit-watcher",
1950
+ "keywords": [
1951
+ "phpunit-watcher",
1952
+ "spatie"
1953
+ ],
1954
+ "time": "2020-01-04T22:46:42+00:00"
1955
+ },
1956
+ {
1957
+ "name": "symfony/console",
1958
+ "version": "v5.1.3",
1959
+ "source": {
1960
+ "type": "git",
1961
+ "url": "https://github.com/symfony/console.git",
1962
+ "reference": "2226c68009627934b8cfc01260b4d287eab070df"
1963
+ },
1964
+ "dist": {
1965
+ "type": "zip",
1966
+ "url": "https://api.github.com/repos/symfony/console/zipball/2226c68009627934b8cfc01260b4d287eab070df",
1967
+ "reference": "2226c68009627934b8cfc01260b4d287eab070df",
1968
+ "shasum": ""
1969
+ },
1970
+ "require": {
1971
+ "php": ">=7.2.5",
1972
+ "symfony/polyfill-mbstring": "~1.0",
1973
+ "symfony/polyfill-php73": "^1.8",
1974
+ "symfony/polyfill-php80": "^1.15",
1975
+ "symfony/service-contracts": "^1.1|^2",
1976
+ "symfony/string": "^5.1"
1977
+ },
1978
+ "conflict": {
1979
+ "symfony/dependency-injection": "<4.4",
1980
+ "symfony/dotenv": "<5.1",
1981
+ "symfony/event-dispatcher": "<4.4",
1982
+ "symfony/lock": "<4.4",
1983
+ "symfony/process": "<4.4"
1984
+ },
1985
+ "provide": {
1986
+ "psr/log-implementation": "1.0"
1987
+ },
1988
+ "require-dev": {
1989
+ "psr/log": "~1.0",
1990
+ "symfony/config": "^4.4|^5.0",
1991
+ "symfony/dependency-injection": "^4.4|^5.0",
1992
+ "symfony/event-dispatcher": "^4.4|^5.0",
1993
+ "symfony/lock": "^4.4|^5.0",
1994
+ "symfony/process": "^4.4|^5.0",
1995
+ "symfony/var-dumper": "^4.4|^5.0"
1996
+ },
1997
+ "suggest": {
1998
+ "psr/log": "For using the console logger",
1999
+ "symfony/event-dispatcher": "",
2000
+ "symfony/lock": "",
2001
+ "symfony/process": ""
2002
+ },
2003
+ "type": "library",
2004
+ "extra": {
2005
+ "branch-alias": {
2006
+ "dev-master": "5.1-dev"
2007
+ }
2008
+ },
2009
+ "autoload": {
2010
+ "psr-4": {
2011
+ "Symfony\\Component\\Console\\": ""
2012
+ },
2013
+ "exclude-from-classmap": [
2014
+ "/Tests/"
2015
+ ]
2016
+ },
2017
+ "notification-url": "https://packagist.org/downloads/",
2018
+ "license": [
2019
+ "MIT"
2020
+ ],
2021
+ "authors": [
2022
+ {
2023
+ "name": "Fabien Potencier",
2024
+ "email": "fabien@symfony.com"
2025
+ },
2026
+ {
2027
+ "name": "Symfony Community",
2028
+ "homepage": "https://symfony.com/contributors"
2029
+ }
2030
+ ],
2031
+ "description": "Symfony Console Component",
2032
+ "homepage": "https://symfony.com",
2033
+ "time": "2020-07-06T13:23:11+00:00"
2034
+ },
2035
+ {
2036
+ "name": "symfony/deprecation-contracts",
2037
+ "version": "v2.1.3",
2038
+ "source": {
2039
+ "type": "git",
2040
+ "url": "https://github.com/symfony/deprecation-contracts.git",
2041
+ "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14"
2042
+ },
2043
+ "dist": {
2044
+ "type": "zip",
2045
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5e20b83385a77593259c9f8beb2c43cd03b2ac14",
2046
+ "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14",
2047
+ "shasum": ""
2048
+ },
2049
+ "require": {
2050
+ "php": ">=7.1"
2051
+ },
2052
+ "type": "library",
2053
+ "extra": {
2054
+ "branch-alias": {
2055
+ "dev-master": "2.1-dev"
2056
+ },
2057
+ "thanks": {
2058
+ "name": "symfony/contracts",
2059
+ "url": "https://github.com/symfony/contracts"
2060
+ }
2061
+ },
2062
+ "autoload": {
2063
+ "files": [
2064
+ "function.php"
2065
+ ]
2066
+ },
2067
+ "notification-url": "https://packagist.org/downloads/",
2068
+ "license": [
2069
+ "MIT"
2070
+ ],
2071
+ "authors": [
2072
+ {
2073
+ "name": "Nicolas Grekas",
2074
+ "email": "p@tchwork.com"
2075
+ },
2076
+ {
2077
+ "name": "Symfony Community",
2078
+ "homepage": "https://symfony.com/contributors"
2079
+ }
2080
+ ],
2081
+ "description": "A generic function and convention to trigger deprecation notices",
2082
+ "homepage": "https://symfony.com",
2083
+ "time": "2020-06-06T08:49:21+00:00"
2084
+ },
2085
+ {
2086
+ "name": "symfony/finder",
2087
+ "version": "v5.1.3",
2088
+ "source": {
2089
+ "type": "git",
2090
+ "url": "https://github.com/symfony/finder.git",
2091
+ "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187"
2092
+ },
2093
+ "dist": {
2094
+ "type": "zip",
2095
+ "url": "https://api.github.com/repos/symfony/finder/zipball/4298870062bfc667cb78d2b379be4bf5dec5f187",
2096
+ "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187",
2097
+ "shasum": ""
2098
+ },
2099
+ "require": {
2100
+ "php": ">=7.2.5"
2101
+ },
2102
+ "type": "library",
2103
+ "extra": {
2104
+ "branch-alias": {
2105
+ "dev-master": "5.1-dev"
2106
+ }
2107
+ },
2108
+ "autoload": {
2109
+ "psr-4": {
2110
+ "Symfony\\Component\\Finder\\": ""
2111
+ },
2112
+ "exclude-from-classmap": [
2113
+ "/Tests/"
2114
+ ]
2115
+ },
2116
+ "notification-url": "https://packagist.org/downloads/",
2117
+ "license": [
2118
+ "MIT"
2119
+ ],
2120
+ "authors": [
2121
+ {
2122
+ "name": "Fabien Potencier",
2123
+ "email": "fabien@symfony.com"
2124
+ },
2125
+ {
2126
+ "name": "Symfony Community",
2127
+ "homepage": "https://symfony.com/contributors"
2128
+ }
2129
+ ],
2130
+ "description": "Symfony Finder Component",
2131
+ "homepage": "https://symfony.com",
2132
+ "time": "2020-05-20T17:43:50+00:00"
2133
+ },
2134
+ {
2135
+ "name": "symfony/polyfill-ctype",
2136
+ "version": "v1.18.0",
2137
+ "source": {
2138
+ "type": "git",
2139
+ "url": "https://github.com/symfony/polyfill-ctype.git",
2140
+ "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
2141
+ },
2142
+ "dist": {
2143
+ "type": "zip",
2144
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
2145
+ "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
2146
+ "shasum": ""
2147
+ },
2148
+ "require": {
2149
+ "php": ">=5.3.3"
2150
+ },
2151
+ "suggest": {
2152
+ "ext-ctype": "For best performance"
2153
+ },
2154
+ "type": "library",
2155
+ "extra": {
2156
+ "branch-alias": {
2157
+ "dev-master": "1.18-dev"
2158
+ },
2159
+ "thanks": {
2160
+ "name": "symfony/polyfill",
2161
+ "url": "https://github.com/symfony/polyfill"
2162
+ }
2163
+ },
2164
+ "autoload": {
2165
+ "psr-4": {
2166
+ "Symfony\\Polyfill\\Ctype\\": ""
2167
+ },
2168
+ "files": [
2169
+ "bootstrap.php"
2170
+ ]
2171
+ },
2172
+ "notification-url": "https://packagist.org/downloads/",
2173
+ "license": [
2174
+ "MIT"
2175
+ ],
2176
+ "authors": [
2177
+ {
2178
+ "name": "Gert de Pagter",
2179
+ "email": "BackEndTea@gmail.com"
2180
+ },
2181
+ {
2182
+ "name": "Symfony Community",
2183
+ "homepage": "https://symfony.com/contributors"
2184
+ }
2185
+ ],
2186
+ "description": "Symfony polyfill for ctype functions",
2187
+ "homepage": "https://symfony.com",
2188
+ "keywords": [
2189
+ "compatibility",
2190
+ "ctype",
2191
+ "polyfill",
2192
+ "portable"
2193
+ ],
2194
+ "time": "2020-07-14T12:35:20+00:00"
2195
+ },
2196
+ {
2197
+ "name": "symfony/polyfill-intl-grapheme",
2198
+ "version": "v1.18.0",
2199
+ "source": {
2200
+ "type": "git",
2201
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
2202
+ "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5"
2203
+ },
2204
+ "dist": {
2205
+ "type": "zip",
2206
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b740103edbdcc39602239ee8860f0f45a8eb9aa5",
2207
+ "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5",
2208
+ "shasum": ""
2209
+ },
2210
+ "require": {
2211
+ "php": ">=5.3.3"
2212
+ },
2213
+ "suggest": {
2214
+ "ext-intl": "For best performance"
2215
+ },
2216
+ "type": "library",
2217
+ "extra": {
2218
+ "branch-alias": {
2219
+ "dev-master": "1.18-dev"
2220
+ },
2221
+ "thanks": {
2222
+ "name": "symfony/polyfill",
2223
+ "url": "https://github.com/symfony/polyfill"
2224
+ }
2225
+ },
2226
+ "autoload": {
2227
+ "psr-4": {
2228
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
2229
+ },
2230
+ "files": [
2231
+ "bootstrap.php"
2232
+ ]
2233
+ },
2234
+ "notification-url": "https://packagist.org/downloads/",
2235
+ "license": [
2236
+ "MIT"
2237
+ ],
2238
+ "authors": [
2239
+ {
2240
+ "name": "Nicolas Grekas",
2241
+ "email": "p@tchwork.com"
2242
+ },
2243
+ {
2244
+ "name": "Symfony Community",
2245
+ "homepage": "https://symfony.com/contributors"
2246
+ }
2247
+ ],
2248
+ "description": "Symfony polyfill for intl's grapheme_* functions",
2249
+ "homepage": "https://symfony.com",
2250
+ "keywords": [
2251
+ "compatibility",
2252
+ "grapheme",
2253
+ "intl",
2254
+ "polyfill",
2255
+ "portable",
2256
+ "shim"
2257
+ ],
2258
+ "time": "2020-07-14T12:35:20+00:00"
2259
+ },
2260
+ {
2261
+ "name": "symfony/polyfill-intl-normalizer",
2262
+ "version": "v1.18.0",
2263
+ "source": {
2264
+ "type": "git",
2265
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
2266
+ "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e"
2267
+ },
2268
+ "dist": {
2269
+ "type": "zip",
2270
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e",
2271
+ "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e",
2272
+ "shasum": ""
2273
+ },
2274
+ "require": {
2275
+ "php": ">=5.3.3"
2276
+ },
2277
+ "suggest": {
2278
+ "ext-intl": "For best performance"
2279
+ },
2280
+ "type": "library",
2281
+ "extra": {
2282
+ "branch-alias": {
2283
+ "dev-master": "1.18-dev"
2284
+ },
2285
+ "thanks": {
2286
+ "name": "symfony/polyfill",
2287
+ "url": "https://github.com/symfony/polyfill"
2288
+ }
2289
+ },
2290
+ "autoload": {
2291
+ "psr-4": {
2292
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
2293
+ },
2294
+ "files": [
2295
+ "bootstrap.php"
2296
+ ],
2297
+ "classmap": [
2298
+ "Resources/stubs"
2299
+ ]
2300
+ },
2301
+ "notification-url": "https://packagist.org/downloads/",
2302
+ "license": [
2303
+ "MIT"
2304
+ ],
2305
+ "authors": [
2306
+ {
2307
+ "name": "Nicolas Grekas",
2308
+ "email": "p@tchwork.com"
2309
+ },
2310
+ {
2311
+ "name": "Symfony Community",
2312
+ "homepage": "https://symfony.com/contributors"
2313
+ }
2314
+ ],
2315
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
2316
+ "homepage": "https://symfony.com",
2317
+ "keywords": [
2318
+ "compatibility",
2319
+ "intl",
2320
+ "normalizer",
2321
+ "polyfill",
2322
+ "portable",
2323
+ "shim"
2324
+ ],
2325
+ "time": "2020-07-14T12:35:20+00:00"
2326
+ },
2327
+ {
2328
+ "name": "symfony/polyfill-mbstring",
2329
+ "version": "v1.18.0",
2330
+ "source": {
2331
+ "type": "git",
2332
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
2333
+ "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a"
2334
+ },
2335
+ "dist": {
2336
+ "type": "zip",
2337
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a",
2338
+ "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a",
2339
+ "shasum": ""
2340
+ },
2341
+ "require": {
2342
+ "php": ">=5.3.3"
2343
+ },
2344
+ "suggest": {
2345
+ "ext-mbstring": "For best performance"
2346
+ },
2347
+ "type": "library",
2348
+ "extra": {
2349
+ "branch-alias": {
2350
+ "dev-master": "1.18-dev"
2351
+ },
2352
+ "thanks": {
2353
+ "name": "symfony/polyfill",
2354
+ "url": "https://github.com/symfony/polyfill"
2355
+ }
2356
+ },
2357
+ "autoload": {
2358
+ "psr-4": {
2359
+ "Symfony\\Polyfill\\Mbstring\\": ""
2360
+ },
2361
+ "files": [
2362
+ "bootstrap.php"
2363
+ ]
2364
+ },
2365
+ "notification-url": "https://packagist.org/downloads/",
2366
+ "license": [
2367
+ "MIT"
2368
+ ],
2369
+ "authors": [
2370
+ {
2371
+ "name": "Nicolas Grekas",
2372
+ "email": "p@tchwork.com"
2373
+ },
2374
+ {
2375
+ "name": "Symfony Community",
2376
+ "homepage": "https://symfony.com/contributors"
2377
+ }
2378
+ ],
2379
+ "description": "Symfony polyfill for the Mbstring extension",
2380
+ "homepage": "https://symfony.com",
2381
+ "keywords": [
2382
+ "compatibility",
2383
+ "mbstring",
2384
+ "polyfill",
2385
+ "portable",
2386
+ "shim"
2387
+ ],
2388
+ "time": "2020-07-14T12:35:20+00:00"
2389
+ },
2390
+ {
2391
+ "name": "symfony/polyfill-php73",
2392
+ "version": "v1.18.0",
2393
+ "source": {
2394
+ "type": "git",
2395
+ "url": "https://github.com/symfony/polyfill-php73.git",
2396
+ "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca"
2397
+ },
2398
+ "dist": {
2399
+ "type": "zip",
2400
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca",
2401
+ "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca",
2402
+ "shasum": ""
2403
+ },
2404
+ "require": {
2405
+ "php": ">=5.3.3"
2406
+ },
2407
+ "type": "library",
2408
+ "extra": {
2409
+ "branch-alias": {
2410
+ "dev-master": "1.18-dev"
2411
+ },
2412
+ "thanks": {
2413
+ "name": "symfony/polyfill",
2414
+ "url": "https://github.com/symfony/polyfill"
2415
+ }
2416
+ },
2417
+ "autoload": {
2418
+ "psr-4": {
2419
+ "Symfony\\Polyfill\\Php73\\": ""
2420
+ },
2421
+ "files": [
2422
+ "bootstrap.php"
2423
+ ],
2424
+ "classmap": [
2425
+ "Resources/stubs"
2426
+ ]
2427
+ },
2428
+ "notification-url": "https://packagist.org/downloads/",
2429
+ "license": [
2430
+ "MIT"
2431
+ ],
2432
+ "authors": [
2433
+ {
2434
+ "name": "Nicolas Grekas",
2435
+ "email": "p@tchwork.com"
2436
+ },
2437
+ {
2438
+ "name": "Symfony Community",
2439
+ "homepage": "https://symfony.com/contributors"
2440
+ }
2441
+ ],
2442
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
2443
+ "homepage": "https://symfony.com",
2444
+ "keywords": [
2445
+ "compatibility",
2446
+ "polyfill",
2447
+ "portable",
2448
+ "shim"
2449
+ ],
2450
+ "time": "2020-07-14T12:35:20+00:00"
2451
+ },
2452
+ {
2453
+ "name": "symfony/polyfill-php80",
2454
+ "version": "v1.18.0",
2455
+ "source": {
2456
+ "type": "git",
2457
+ "url": "https://github.com/symfony/polyfill-php80.git",
2458
+ "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981"
2459
+ },
2460
+ "dist": {
2461
+ "type": "zip",
2462
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981",
2463
+ "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981",
2464
+ "shasum": ""
2465
+ },
2466
+ "require": {
2467
+ "php": ">=7.0.8"
2468
+ },
2469
+ "type": "library",
2470
+ "extra": {
2471
+ "branch-alias": {
2472
+ "dev-master": "1.18-dev"
2473
+ },
2474
+ "thanks": {
2475
+ "name": "symfony/polyfill",
2476
+ "url": "https://github.com/symfony/polyfill"
2477
+ }
2478
+ },
2479
+ "autoload": {
2480
+ "psr-4": {
2481
+ "Symfony\\Polyfill\\Php80\\": ""
2482
+ },
2483
+ "files": [
2484
+ "bootstrap.php"
2485
+ ],
2486
+ "classmap": [
2487
+ "Resources/stubs"
2488
+ ]
2489
+ },
2490
+ "notification-url": "https://packagist.org/downloads/",
2491
+ "license": [
2492
+ "MIT"
2493
+ ],
2494
+ "authors": [
2495
+ {
2496
+ "name": "Ion Bazan",
2497
+ "email": "ion.bazan@gmail.com"
2498
+ },
2499
+ {
2500
+ "name": "Nicolas Grekas",
2501
+ "email": "p@tchwork.com"
2502
+ },
2503
+ {
2504
+ "name": "Symfony Community",
2505
+ "homepage": "https://symfony.com/contributors"
2506
+ }
2507
+ ],
2508
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
2509
+ "homepage": "https://symfony.com",
2510
+ "keywords": [
2511
+ "compatibility",
2512
+ "polyfill",
2513
+ "portable",
2514
+ "shim"
2515
+ ],
2516
+ "time": "2020-07-14T12:35:20+00:00"
2517
+ },
2518
+ {
2519
+ "name": "symfony/process",
2520
+ "version": "v5.1.3",
2521
+ "source": {
2522
+ "type": "git",
2523
+ "url": "https://github.com/symfony/process.git",
2524
+ "reference": "1864216226af21eb76d9477f691e7cbf198e0402"
2525
+ },
2526
+ "dist": {
2527
+ "type": "zip",
2528
+ "url": "https://api.github.com/repos/symfony/process/zipball/1864216226af21eb76d9477f691e7cbf198e0402",
2529
+ "reference": "1864216226af21eb76d9477f691e7cbf198e0402",
2530
+ "shasum": ""
2531
+ },
2532
+ "require": {
2533
+ "php": ">=7.2.5",
2534
+ "symfony/polyfill-php80": "^1.15"
2535
+ },
2536
+ "type": "library",
2537
+ "extra": {
2538
+ "branch-alias": {
2539
+ "dev-master": "5.1-dev"
2540
+ }
2541
+ },
2542
+ "autoload": {
2543
+ "psr-4": {
2544
+ "Symfony\\Component\\Process\\": ""
2545
+ },
2546
+ "exclude-from-classmap": [
2547
+ "/Tests/"
2548
+ ]
2549
+ },
2550
+ "notification-url": "https://packagist.org/downloads/",
2551
+ "license": [
2552
+ "MIT"
2553
+ ],
2554
+ "authors": [
2555
+ {
2556
+ "name": "Fabien Potencier",
2557
+ "email": "fabien@symfony.com"
2558
+ },
2559
+ {
2560
+ "name": "Symfony Community",
2561
+ "homepage": "https://symfony.com/contributors"
2562
+ }
2563
+ ],
2564
+ "description": "Symfony Process Component",
2565
+ "homepage": "https://symfony.com",
2566
+ "time": "2020-07-23T08:36:24+00:00"
2567
+ },
2568
+ {
2569
+ "name": "symfony/service-contracts",
2570
+ "version": "v2.1.3",
2571
+ "source": {
2572
+ "type": "git",
2573
+ "url": "https://github.com/symfony/service-contracts.git",
2574
+ "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442"
2575
+ },
2576
+ "dist": {
2577
+ "type": "zip",
2578
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/58c7475e5457c5492c26cc740cc0ad7464be9442",
2579
+ "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442",
2580
+ "shasum": ""
2581
+ },
2582
+ "require": {
2583
+ "php": ">=7.2.5",
2584
+ "psr/container": "^1.0"
2585
+ },
2586
+ "suggest": {
2587
+ "symfony/service-implementation": ""
2588
+ },
2589
+ "type": "library",
2590
+ "extra": {
2591
+ "branch-alias": {
2592
+ "dev-master": "2.1-dev"
2593
+ },
2594
+ "thanks": {
2595
+ "name": "symfony/contracts",
2596
+ "url": "https://github.com/symfony/contracts"
2597
+ }
2598
+ },
2599
+ "autoload": {
2600
+ "psr-4": {
2601
+ "Symfony\\Contracts\\Service\\": ""
2602
+ }
2603
+ },
2604
+ "notification-url": "https://packagist.org/downloads/",
2605
+ "license": [
2606
+ "MIT"
2607
+ ],
2608
+ "authors": [
2609
+ {
2610
+ "name": "Nicolas Grekas",
2611
+ "email": "p@tchwork.com"
2612
+ },
2613
+ {
2614
+ "name": "Symfony Community",
2615
+ "homepage": "https://symfony.com/contributors"
2616
+ }
2617
+ ],
2618
+ "description": "Generic abstractions related to writing services",
2619
+ "homepage": "https://symfony.com",
2620
+ "keywords": [
2621
+ "abstractions",
2622
+ "contracts",
2623
+ "decoupling",
2624
+ "interfaces",
2625
+ "interoperability",
2626
+ "standards"
2627
+ ],
2628
+ "time": "2020-07-06T13:23:11+00:00"
2629
+ },
2630
+ {
2631
+ "name": "symfony/string",
2632
+ "version": "v5.1.3",
2633
+ "source": {
2634
+ "type": "git",
2635
+ "url": "https://github.com/symfony/string.git",
2636
+ "reference": "f629ba9b611c76224feb21fe2bcbf0b6f992300b"
2637
+ },
2638
+ "dist": {
2639
+ "type": "zip",
2640
+ "url": "https://api.github.com/repos/symfony/string/zipball/f629ba9b611c76224feb21fe2bcbf0b6f992300b",
2641
+ "reference": "f629ba9b611c76224feb21fe2bcbf0b6f992300b",
2642
+ "shasum": ""
2643
+ },
2644
+ "require": {
2645
+ "php": ">=7.2.5",
2646
+ "symfony/polyfill-ctype": "~1.8",
2647
+ "symfony/polyfill-intl-grapheme": "~1.0",
2648
+ "symfony/polyfill-intl-normalizer": "~1.0",
2649
+ "symfony/polyfill-mbstring": "~1.0",
2650
+ "symfony/polyfill-php80": "~1.15"
2651
+ },
2652
+ "require-dev": {
2653
+ "symfony/error-handler": "^4.4|^5.0",
2654
+ "symfony/http-client": "^4.4|^5.0",
2655
+ "symfony/translation-contracts": "^1.1|^2",
2656
+ "symfony/var-exporter": "^4.4|^5.0"
2657
+ },
2658
+ "type": "library",
2659
+ "extra": {
2660
+ "branch-alias": {
2661
+ "dev-master": "5.1-dev"
2662
+ }
2663
+ },
2664
+ "autoload": {
2665
+ "psr-4": {
2666
+ "Symfony\\Component\\String\\": ""
2667
+ },
2668
+ "files": [
2669
+ "Resources/functions.php"
2670
+ ],
2671
+ "exclude-from-classmap": [
2672
+ "/Tests/"
2673
+ ]
2674
+ },
2675
+ "notification-url": "https://packagist.org/downloads/",
2676
+ "license": [
2677
+ "MIT"
2678
+ ],
2679
+ "authors": [
2680
+ {
2681
+ "name": "Nicolas Grekas",
2682
+ "email": "p@tchwork.com"
2683
+ },
2684
+ {
2685
+ "name": "Symfony Community",
2686
+ "homepage": "https://symfony.com/contributors"
2687
+ }
2688
+ ],
2689
+ "description": "Symfony String component",
2690
+ "homepage": "https://symfony.com",
2691
+ "keywords": [
2692
+ "grapheme",
2693
+ "i18n",
2694
+ "string",
2695
+ "unicode",
2696
+ "utf-8",
2697
+ "utf8"
2698
+ ],
2699
+ "time": "2020-07-08T08:27:49+00:00"
2700
+ },
2701
+ {
2702
+ "name": "symfony/yaml",
2703
+ "version": "v5.1.3",
2704
+ "source": {
2705
+ "type": "git",
2706
+ "url": "https://github.com/symfony/yaml.git",
2707
+ "reference": "ea342353a3ef4f453809acc4ebc55382231d4d23"
2708
+ },
2709
+ "dist": {
2710
+ "type": "zip",
2711
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/ea342353a3ef4f453809acc4ebc55382231d4d23",
2712
+ "reference": "ea342353a3ef4f453809acc4ebc55382231d4d23",
2713
+ "shasum": ""
2714
+ },
2715
+ "require": {
2716
+ "php": ">=7.2.5",
2717
+ "symfony/deprecation-contracts": "^2.1",
2718
+ "symfony/polyfill-ctype": "~1.8"
2719
+ },
2720
+ "conflict": {
2721
+ "symfony/console": "<4.4"
2722
+ },
2723
+ "require-dev": {
2724
+ "symfony/console": "^4.4|^5.0"
2725
+ },
2726
+ "suggest": {
2727
+ "symfony/console": "For validating YAML files using the lint command"
2728
+ },
2729
+ "bin": [
2730
+ "Resources/bin/yaml-lint"
2731
+ ],
2732
+ "type": "library",
2733
+ "extra": {
2734
+ "branch-alias": {
2735
+ "dev-master": "5.1-dev"
2736
+ }
2737
+ },
2738
+ "autoload": {
2739
+ "psr-4": {
2740
+ "Symfony\\Component\\Yaml\\": ""
2741
+ },
2742
+ "exclude-from-classmap": [
2743
+ "/Tests/"
2744
+ ]
2745
+ },
2746
+ "notification-url": "https://packagist.org/downloads/",
2747
+ "license": [
2748
+ "MIT"
2749
+ ],
2750
+ "authors": [
2751
+ {
2752
+ "name": "Fabien Potencier",
2753
+ "email": "fabien@symfony.com"
2754
+ },
2755
+ {
2756
+ "name": "Symfony Community",
2757
+ "homepage": "https://symfony.com/contributors"
2758
+ }
2759
+ ],
2760
+ "description": "Symfony Yaml Component",
2761
+ "homepage": "https://symfony.com",
2762
+ "time": "2020-05-20T17:43:50+00:00"
2763
+ },
2764
+ {
2765
+ "name": "theseer/tokenizer",
2766
+ "version": "1.2.0",
2767
+ "source": {
2768
+ "type": "git",
2769
+ "url": "https://github.com/theseer/tokenizer.git",
2770
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
2771
+ },
2772
+ "dist": {
2773
+ "type": "zip",
2774
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
2775
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
2776
+ "shasum": ""
2777
+ },
2778
+ "require": {
2779
+ "ext-dom": "*",
2780
+ "ext-tokenizer": "*",
2781
+ "ext-xmlwriter": "*",
2782
+ "php": "^7.2 || ^8.0"
2783
+ },
2784
+ "type": "library",
2785
+ "autoload": {
2786
+ "classmap": [
2787
+ "src/"
2788
+ ]
2789
+ },
2790
+ "notification-url": "https://packagist.org/downloads/",
2791
+ "license": [
2792
+ "BSD-3-Clause"
2793
+ ],
2794
+ "authors": [
2795
+ {
2796
+ "name": "Arne Blankerts",
2797
+ "email": "arne@blankerts.de",
2798
+ "role": "Developer"
2799
+ }
2800
+ ],
2801
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2802
+ "time": "2020-07-12T23:59:07+00:00"
2803
+ },
2804
+ {
2805
+ "name": "webmozart/assert",
2806
+ "version": "1.9.1",
2807
+ "source": {
2808
+ "type": "git",
2809
+ "url": "https://github.com/webmozart/assert.git",
2810
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
2811
+ },
2812
+ "dist": {
2813
+ "type": "zip",
2814
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
2815
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
2816
+ "shasum": ""
2817
+ },
2818
+ "require": {
2819
+ "php": "^5.3.3 || ^7.0 || ^8.0",
2820
+ "symfony/polyfill-ctype": "^1.8"
2821
+ },
2822
+ "conflict": {
2823
+ "phpstan/phpstan": "<0.12.20",
2824
+ "vimeo/psalm": "<3.9.1"
2825
+ },
2826
+ "require-dev": {
2827
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
2828
+ },
2829
+ "type": "library",
2830
+ "autoload": {
2831
+ "psr-4": {
2832
+ "Webmozart\\Assert\\": "src/"
2833
+ }
2834
+ },
2835
+ "notification-url": "https://packagist.org/downloads/",
2836
+ "license": [
2837
+ "MIT"
2838
+ ],
2839
+ "authors": [
2840
+ {
2841
+ "name": "Bernhard Schussek",
2842
+ "email": "bschussek@gmail.com"
2843
+ }
2844
+ ],
2845
+ "description": "Assertions to validate method input/output with nice error messages.",
2846
+ "keywords": [
2847
+ "assert",
2848
+ "check",
2849
+ "validate"
2850
+ ],
2851
+ "time": "2020-07-08T17:02:28+00:00"
2852
+ },
2853
+ {
2854
+ "name": "yosymfony/resource-watcher",
2855
+ "version": "v2.0.1",
2856
+ "source": {
2857
+ "type": "git",
2858
+ "url": "https://github.com/yosymfony/resource-watcher.git",
2859
+ "reference": "a8c34f704e6bd4f786c97f3c0ba65bd86cb2bd73"
2860
+ },
2861
+ "dist": {
2862
+ "type": "zip",
2863
+ "url": "https://api.github.com/repos/yosymfony/resource-watcher/zipball/a8c34f704e6bd4f786c97f3c0ba65bd86cb2bd73",
2864
+ "reference": "a8c34f704e6bd4f786c97f3c0ba65bd86cb2bd73",
2865
+ "shasum": ""
2866
+ },
2867
+ "require": {
2868
+ "php": ">=5.6",
2869
+ "symfony/finder": "^2.7|^3.0|^4.0|^5.0"
2870
+ },
2871
+ "require-dev": {
2872
+ "phpunit/phpunit": "^5.7",
2873
+ "symfony/filesystem": "^2.7|^3.0|^4.0|^5.0"
2874
+ },
2875
+ "type": "library",
2876
+ "extra": {
2877
+ "branch-alias": {
2878
+ "dev-master": "2.0-dev"
2879
+ }
2880
+ },
2881
+ "autoload": {
2882
+ "psr-4": {
2883
+ "Yosymfony\\ResourceWatcher\\": "src/"
2884
+ }
2885
+ },
2886
+ "notification-url": "https://packagist.org/downloads/",
2887
+ "license": [
2888
+ "MIT"
2889
+ ],
2890
+ "authors": [
2891
+ {
2892
+ "name": "Victor Puertas",
2893
+ "email": "vpgugr@gmail.com"
2894
+ }
2895
+ ],
2896
+ "description": "A simple resource watcher using Symfony Finder",
2897
+ "homepage": "http://yosymfony.com",
2898
+ "keywords": [
2899
+ "finder",
2900
+ "resources",
2901
+ "symfony",
2902
+ "watcher"
2903
+ ],
2904
+ "time": "2020-01-04T15:36:55+00:00"
2905
+ }
2906
+ ],
2907
+ "aliases": [],
2908
+ "minimum-stability": "stable",
2909
+ "stability-flags": [],
2910
+ "prefer-stable": false,
2911
+ "prefer-lowest": false,
2912
+ "platform": {
2913
+ "php": "^7.3",
2914
+ "ext-curl": "*",
2915
+ "ext-xml": "*",
2916
+ "ext-simplexml": "*"
2917
+ },
2918
+ "platform-dev": []
2919
+ }
lets-encrypt/vendor/plesk/api-php-lib/docker-compose.yml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: '2'
2
+ services:
3
+ plesk:
4
+ image: plesk/plesk
5
+ logging:
6
+ driver: none
7
+ ports:
8
+ ["8443:8443"]
9
+ tests:
10
+ build: .
11
+ environment:
12
+ REMOTE_URL: https://plesk:8443
13
+ REMOTE_PASSWORD: changeme1Q**
14
+ command: bash -c "cd /opt/api-php-lib && composer install && ./wait-for-plesk.sh && composer test -- --testdox"
15
+ depends_on:
16
+ - plesk
17
+ links:
18
+ - plesk
19
+ volumes:
20
+ - .:/opt/api-php-lib
21
+
lets-encrypt/vendor/plesk/api-php-lib/phpunit-watcher.yml ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ phpunit:
2
+ arguments: '--stop-on-failure'
3
+ timeout: 0
lets-encrypt/vendor/plesk/api-php-lib/phpunit.xml.dist ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Copyright 1999-2020. Plesk International GmbH. -->
3
+ <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
5
+ bootstrap="vendor/autoload.php"
6
+ verbose="true"
7
+ colors="true">
8
+ <testsuites>
9
+ <testsuite name="E2E">
10
+ <directory>./tests</directory>
11
+ </testsuite>
12
+ </testsuites>
13
+
14
+ <filter>
15
+ <whitelist processUncoveredFilesFromWhitelist="true">
16
+ <directory suffix=".php">./src</directory>
17
+ </whitelist>
18
+ </filter>
19
+
20
+ <php>
21
+ <ini name="error_reporting" value="-1"/>
22
+ <env name="REMOTE_URL" value=""/>
23
+ <env name="REMOTE_PASSWORD" value=""/>
24
+ </php>
25
+ </phpunit>
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Client.php ADDED
@@ -0,0 +1,580 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api;
5
+
6
+ use SimpleXMLElement;
7
+
8
+ /**
9
+ * Client for Plesk XML-RPC API.
10
+ */
11
+ class Client
12
+ {
13
+ const RESPONSE_SHORT = 1;
14
+ const RESPONSE_FULL = 2;
15
+
16
+ protected $_host;
17
+ protected $_port;
18
+ protected $_protocol;
19
+ protected $_login;
20
+ protected $_password;
21
+ protected $_secretKey;
22
+ protected $_version = '';
23
+
24
+ protected $_operatorsCache = [];
25
+
26
+ /**
27
+ * @var callable
28
+ */
29
+ protected $_verifyResponseCallback;
30
+
31
+ /**
32
+ * Create client.
33
+ *
34
+ * @param string $host
35
+ * @param int $port
36
+ * @param string $protocol
37
+ */
38
+ public function __construct($host, $port = 8443, $protocol = 'https')
39
+ {
40
+ $this->_host = $host;
41
+ $this->_port = $port;
42
+ $this->_protocol = $protocol;
43
+ }
44
+
45
+ /**
46
+ * Setup credentials for authentication.
47
+ *
48
+ * @param string $login
49
+ * @param string $password
50
+ */
51
+ public function setCredentials($login, $password)
52
+ {
53
+ $this->_login = $login;
54
+ $this->_password = $password;
55
+ }
56
+
57
+ /**
58
+ * Define secret key for alternative authentication.
59
+ *
60
+ * @param string $secretKey
61
+ */
62
+ public function setSecretKey($secretKey)
63
+ {
64
+ $this->_secretKey = $secretKey;
65
+ }
66
+
67
+ /**
68
+ * Set default version for requests.
69
+ *
70
+ * @param string $version
71
+ */
72
+ public function setVersion($version)
73
+ {
74
+ $this->_version = $version;
75
+ }
76
+
77
+ /**
78
+ * Set custom function to verify response of API call according your own needs. Default verifying will be used if it is not specified.
79
+ *
80
+ * @param callable|null $function
81
+ */
82
+ public function setVerifyResponse(callable $function = null)
83
+ {
84
+ $this->_verifyResponseCallback = $function;
85
+ }
86
+
87
+ /**
88
+ * Retrieve host used for communication.
89
+ *
90
+ * @return string
91
+ */
92
+ public function getHost()
93
+ {
94
+ return $this->_host;
95
+ }
96
+
97
+ /**
98
+ * Retrieve port used for communication.
99
+ *
100
+ * @return int
101
+ */
102
+ public function getPort()
103
+ {
104
+ return $this->_port;
105
+ }
106
+
107
+ /**
108
+ * Retrieve name of the protocol (http or https) used for communication.
109
+ *
110
+ * @return string
111
+ */
112
+ public function getProtocol()
113
+ {
114
+ return $this->_protocol;
115
+ }
116
+
117
+ /**
118
+ * Retrieve XML template for packet.
119
+ *
120
+ * @param string|null $version
121
+ *
122
+ * @return SimpleXMLElement
123
+ */
124
+ public function getPacket($version = null)
125
+ {
126
+ $protocolVersion = !is_null($version) ? $version : $this->_version;
127
+ $content = "<?xml version='1.0' encoding='UTF-8' ?>";
128
+ $content .= '<packet'.('' === $protocolVersion ? '' : " version='$protocolVersion'").'/>';
129
+
130
+ return new SimpleXMLElement($content);
131
+ }
132
+
133
+ /**
134
+ * Perform API request.
135
+ *
136
+ * @param string|array|SimpleXMLElement $request
137
+ * @param int $mode
138
+ *
139
+ * @return XmlResponse
140
+ */
141
+ public function request($request, $mode = self::RESPONSE_SHORT)
142
+ {
143
+ if ($request instanceof SimpleXMLElement) {
144
+ $request = $request->asXml();
145
+ } else {
146
+ $xml = $this->getPacket();
147
+
148
+ if (is_array($request)) {
149
+ $request = $this->_arrayToXml($request, $xml)->asXML();
150
+ } elseif (preg_match('/^[a-z]/', $request)) {
151
+ $request = $this->_expandRequestShortSyntax($request, $xml);
152
+ }
153
+ }
154
+
155
+ if ('sdk' == $this->_protocol) {
156
+ $version = ('' == $this->_version) ? null : $this->_version;
157
+ $requestXml = new SimpleXMLElement((string) $request);
158
+ $xml = \pm_ApiRpc::getService($version)->call($requestXml->children()[0]->asXml(), $this->_login);
159
+ } else {
160
+ $xml = $this->_performHttpRequest($request);
161
+ }
162
+
163
+ $this->_verifyResponseCallback
164
+ ? call_user_func($this->_verifyResponseCallback, $xml)
165
+ : $this->_verifyResponse($xml);
166
+
167
+ return (self::RESPONSE_FULL == $mode) ? $xml : $xml->xpath('//result')[0];
168
+ }
169
+
170
+ /**
171
+ * Perform HTTP request to end-point.
172
+ *
173
+ * @param string $request
174
+ *
175
+ * @throws Client\Exception
176
+ *
177
+ * @return XmlResponse
178
+ */
179
+ private function _performHttpRequest($request)
180
+ {
181
+ $curl = curl_init();
182
+
183
+ curl_setopt($curl, CURLOPT_URL, "$this->_protocol://$this->_host:$this->_port/enterprise/control/agent.php");
184
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
185
+ curl_setopt($curl, CURLOPT_POST, true);
186
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
187
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
188
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $this->_getHeaders());
189
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
190
+
191
+ $result = curl_exec($curl);
192
+
193
+ if (false === $result) {
194
+ throw new Client\Exception(curl_error($curl), curl_errno($curl));
195
+ }
196
+
197
+ curl_close($curl);
198
+
199
+ $xml = new XmlResponse($result);
200
+
201
+ return $xml;
202
+ }
203
+
204
+ /**
205
+ * Perform multiple API requests using single HTTP request.
206
+ *
207
+ * @param $requests
208
+ * @param int $mode
209
+ *
210
+ * @throws Client\Exception
211
+ *
212
+ * @return array
213
+ */
214
+ public function multiRequest($requests, $mode = self::RESPONSE_SHORT)
215
+ {
216
+ $requestXml = $this->getPacket();
217
+
218
+ foreach ($requests as $request) {
219
+ if ($request instanceof SimpleXMLElement) {
220
+ throw new Client\Exception('SimpleXML type of request is not supported for multi requests.');
221
+ } else {
222
+ if (is_array($request)) {
223
+ $request = $this->_arrayToXml($request, $requestXml)->asXML();
224
+ } elseif (preg_match('/^[a-z]/', $request)) {
225
+ $this->_expandRequestShortSyntax($request, $requestXml);
226
+ }
227
+ }
228
+ $responses[] = $this->request($request);
229
+ }
230
+
231
+ if ('sdk' == $this->_protocol) {
232
+ throw new Client\Exception('Multi requests are not supported via SDK.');
233
+ } else {
234
+ $responseXml = $this->_performHttpRequest($requestXml->asXML());
235
+ }
236
+
237
+ $responses = [];
238
+ foreach ($responseXml->children() as $childNode) {
239
+ $xml = $this->getPacket();
240
+ $dom = dom_import_simplexml($xml)->ownerDocument;
241
+
242
+ $childDomNode = dom_import_simplexml($childNode);
243
+ $childDomNode = $dom->importNode($childDomNode, true);
244
+ $dom->documentElement->appendChild($childDomNode);
245
+
246
+ $response = simplexml_load_string($dom->saveXML());
247
+ $responses[] = (self::RESPONSE_FULL == $mode) ? $response : $response->xpath('//result')[0];
248
+ }
249
+
250
+ return $responses;
251
+ }
252
+
253
+ /**
254
+ * Retrieve list of headers needed for request.
255
+ *
256
+ * @return array
257
+ */
258
+ protected function _getHeaders()
259
+ {
260
+ $headers = [
261
+ 'Content-Type: text/xml',
262
+ 'HTTP_PRETTY_PRINT: TRUE',
263
+ ];
264
+
265
+ if ($this->_secretKey) {
266
+ $headers[] = "KEY: $this->_secretKey";
267
+ } else {
268
+ $headers[] = "HTTP_AUTH_LOGIN: $this->_login";
269
+ $headers[] = "HTTP_AUTH_PASSWD: $this->_password";
270
+ }
271
+
272
+ return $headers;
273
+ }
274
+
275
+ /**
276
+ * Verify that response does not contain errors.
277
+ *
278
+ * @param XmlResponse $xml
279
+ *
280
+ * @throws Exception
281
+ */
282
+ protected function _verifyResponse($xml)
283
+ {
284
+ if ($xml->system && $xml->system->status && 'error' == (string) $xml->system->status) {
285
+ throw new Exception((string) $xml->system->errtext, (int) $xml->system->errcode);
286
+ }
287
+
288
+ if ($xml->xpath('//status[text()="error"]') && $xml->xpath('//errcode') && $xml->xpath('//errtext')) {
289
+ $errorCode = (int) $xml->xpath('//errcode')[0];
290
+ $errorMessage = (string) $xml->xpath('//errtext')[0];
291
+
292
+ throw new Exception($errorMessage, $errorCode);
293
+ }
294
+ }
295
+
296
+ /**
297
+ * Expand short syntax (some.method.call) into full XML representation.
298
+ *
299
+ * @param string $request
300
+ * @param SimpleXMLElement $xml
301
+ *
302
+ * @return string
303
+ */
304
+ protected function _expandRequestShortSyntax($request, SimpleXMLElement $xml)
305
+ {
306
+ $parts = explode('.', $request);
307
+ $node = $xml;
308
+
309
+ foreach ($parts as $part) {
310
+ @list($name, $value) = explode('=', $part);
311
+ $node = $node->addChild($name, $value);
312
+ }
313
+
314
+ return $xml->asXML();
315
+ }
316
+
317
+ /**
318
+ * Convert array to XML representation.
319
+ *
320
+ * @param array $array
321
+ * @param SimpleXMLElement $xml
322
+ * @param string $parentEl
323
+ *
324
+ * @return SimpleXMLElement
325
+ */
326
+ protected function _arrayToXml(array $array, SimpleXMLElement $xml, $parentEl = null)
327
+ {
328
+ foreach ($array as $key => $value) {
329
+ $el = is_int($key) && $parentEl ? $parentEl : $key;
330
+ if (is_array($value)) {
331
+ $this->_arrayToXml($value, $this->_isAssocArray($value) ? $xml->addChild($el) : $xml, $el);
332
+ } else {
333
+ $xml->addChild($el, $value);
334
+ }
335
+ }
336
+
337
+ return $xml;
338
+ }
339
+
340
+ /**
341
+ * @param array $array
342
+ *
343
+ * @return bool
344
+ */
345
+ protected function _isAssocArray(array $array)
346
+ {
347
+ return $array && array_keys($array) !== range(0, count($array) - 1);
348
+ }
349
+
350
+ /**
351
+ * @param string $name
352
+ *
353
+ * @return \PleskX\Api\Operator
354
+ */
355
+ protected function _getOperator($name)
356
+ {
357
+ if (!isset($this->_operatorsCache[$name])) {
358
+ $className = '\\PleskX\\Api\\Operator\\'.$name;
359
+ $this->_operatorsCache[$name] = new $className($this);
360
+ }
361
+
362
+ return $this->_operatorsCache[$name];
363
+ }
364
+
365
+ /**
366
+ * @return Operator\Server
367
+ */
368
+ public function server()
369
+ {
370
+ return $this->_getOperator('Server');
371
+ }
372
+
373
+ /**
374
+ * @return Operator\Customer
375
+ */
376
+ public function customer()
377
+ {
378
+ return $this->_getOperator('Customer');
379
+ }
380
+
381
+ /**
382
+ * @return Operator\Webspace
383
+ */
384
+ public function webspace()
385
+ {
386
+ return $this->_getOperator('Webspace');
387
+ }
388
+
389
+ /**
390
+ * @return Operator\Subdomain
391
+ */
392
+ public function subdomain()
393
+ {
394
+ return $this->_getOperator('Subdomain');
395
+ }
396
+
397
+ /**
398
+ * @return Operator\Dns
399
+ */
400
+ public function dns()
401
+ {
402
+ return $this->_getOperator('Dns');
403
+ }
404
+
405
+ /**
406
+ * @return Operator\DnsTemplate
407
+ */
408
+ public function dnsTemplate()
409
+ {
410
+ return $this->_getOperator('DnsTemplate');
411
+ }
412
+
413
+ /**
414
+ * @return Operator\DatabaseServer
415
+ */
416
+ public function databaseServer()
417
+ {
418
+ return $this->_getOperator('DatabaseServer');
419
+ }
420
+
421
+ /**
422
+ * @return Operator\Mail
423
+ */
424
+ public function mail()
425
+ {
426
+ return $this->_getOperator('Mail');
427
+ }
428
+
429
+ /**
430
+ * @return Operator\Certificate
431
+ */
432
+ public function certificate()
433
+ {
434
+ return $this->_getOperator('Certificate');
435
+ }
436
+
437
+ /**
438
+ * @return Operator\SiteAlias
439
+ */
440
+ public function siteAlias()
441
+ {
442
+ return $this->_getOperator('SiteAlias');
443
+ }
444
+
445
+ /**
446
+ * @return Operator\Ip
447
+ */
448
+ public function ip()
449
+ {
450
+ return $this->_getOperator('Ip');
451
+ }
452
+
453
+ /**
454
+ * @return Operator\EventLog
455
+ */
456
+ public function eventLog()
457
+ {
458
+ return $this->_getOperator('EventLog');
459
+ }
460
+
461
+ /**
462
+ * @return Operator\SecretKey
463
+ */
464
+ public function secretKey()
465
+ {
466
+ return $this->_getOperator('SecretKey');
467
+ }
468
+
469
+ /**
470
+ * @return Operator\Ui
471
+ */
472
+ public function ui()
473
+ {
474
+ return $this->_getOperator('Ui');
475
+ }
476
+
477
+ /**
478
+ * @return Operator\ServicePlan
479
+ */
480
+ public function servicePlan()
481
+ {
482
+ return $this->_getOperator('ServicePlan');
483
+ }
484
+
485
+ /**
486
+ * @return Operator\VirtualDirectory
487
+ */
488
+ public function virtualDirectory()
489
+ {
490
+ return $this->_getOperator('VirtualDirectory');
491
+ }
492
+
493
+ /**
494
+ * @return Operator\Database
495
+ */
496
+ public function database()
497
+ {
498
+ return $this->_getOperator('Database');
499
+ }
500
+
501
+ /**
502
+ * @return Operator\Session
503
+ */
504
+ public function session()
505
+ {
506
+ return $this->_getOperator('Session');
507
+ }
508
+
509
+ /**
510
+ * @return Operator\Locale
511
+ */
512
+ public function locale()
513
+ {
514
+ return $this->_getOperator('Locale');
515
+ }
516
+
517
+ /**
518
+ * @return Operator\LogRotation
519
+ */
520
+ public function logRotation()
521
+ {
522
+ return $this->_getOperator('LogRotation');
523
+ }
524
+
525
+ /**
526
+ * @return Operator\ProtectedDirectory
527
+ */
528
+ public function protectedDirectory()
529
+ {
530
+ return $this->_getOperator('ProtectedDirectory');
531
+ }
532
+
533
+ /**
534
+ * @return Operator\Reseller
535
+ */
536
+ public function reseller()
537
+ {
538
+ return $this->_getOperator('Reseller');
539
+ }
540
+
541
+ /**
542
+ * @return Operator\ResellerPlan
543
+ */
544
+ public function resellerPlan()
545
+ {
546
+ return $this->_getOperator('ResellerPlan');
547
+ }
548
+
549
+ /**
550
+ * @return Operator\Aps
551
+ */
552
+ public function aps()
553
+ {
554
+ return $this->_getOperator('Aps');
555
+ }
556
+
557
+ /**
558
+ * @return Operator\ServicePlanAddon
559
+ */
560
+ public function servicePlanAddon()
561
+ {
562
+ return $this->_getOperator('ServicePlanAddon');
563
+ }
564
+
565
+ /**
566
+ * @return Operator\Site
567
+ */
568
+ public function site()
569
+ {
570
+ return $this->_getOperator('Site');
571
+ }
572
+
573
+ /**
574
+ * @return Operator\PhpHandler
575
+ */
576
+ public function phpHandler()
577
+ {
578
+ return $this->_getOperator('PhpHandler');
579
+ }
580
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Client/Exception.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Client;
5
+
6
+ /**
7
+ * Transport layer exception.
8
+ */
9
+ class Exception extends \Exception
10
+ {
11
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Exception.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api;
5
+
6
+ /**
7
+ * Exceptions for XML-RPC API client.
8
+ */
9
+ class Exception extends \Exception
10
+ {
11
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/InternalClient.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api;
5
+
6
+ /**
7
+ * Internal client for Plesk XML-RPC API (via SDK).
8
+ */
9
+ class InternalClient extends Client
10
+ {
11
+ public function __construct()
12
+ {
13
+ parent::__construct('localhost', 0, 'sdk');
14
+ }
15
+
16
+ /**
17
+ * Setup login to execute requests under certain user.
18
+ *
19
+ * @param $login
20
+ */
21
+ public function setLogin($login)
22
+ {
23
+ $this->_login = $login;
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api;
5
+
6
+ class Operator
7
+ {
8
+ /** @var string|null */
9
+ protected $_wrapperTag = null;
10
+
11
+ /** @var \PleskX\Api\Client */
12
+ protected $_client;
13
+
14
+ public function __construct($client)
15
+ {
16
+ $this->_client = $client;
17
+
18
+ if (is_null($this->_wrapperTag)) {
19
+ $classNameParts = explode('\\', get_class($this));
20
+ $this->_wrapperTag = end($classNameParts);
21
+ $this->_wrapperTag = strtolower(preg_replace('/([a-z])([A-Z])/', '\1-\2', $this->_wrapperTag));
22
+ }
23
+ }
24
+
25
+ /**
26
+ * Perform plain API request.
27
+ *
28
+ * @param string|array $request
29
+ * @param int $mode
30
+ *
31
+ * @return XmlResponse
32
+ */
33
+ public function request($request, $mode = Client::RESPONSE_SHORT)
34
+ {
35
+ $wrapperTag = $this->_wrapperTag;
36
+
37
+ if (is_array($request)) {
38
+ $request = [$wrapperTag => $request];
39
+ } elseif (preg_match('/^[a-z]/', $request)) {
40
+ $request = "$wrapperTag.$request";
41
+ } else {
42
+ $request = "<$wrapperTag>$request</$wrapperTag>";
43
+ }
44
+
45
+ return $this->_client->request($request, $mode);
46
+ }
47
+
48
+ /**
49
+ * @param string $field
50
+ * @param int|string $value
51
+ * @param string $deleteMethodName
52
+ *
53
+ * @return bool
54
+ */
55
+ protected function _delete($field, $value, $deleteMethodName = 'del')
56
+ {
57
+ $response = $this->request("$deleteMethodName.filter.$field=$value");
58
+
59
+ return 'ok' === (string) $response->status;
60
+ }
61
+
62
+ /**
63
+ * @param string $structClass
64
+ * @param string $infoTag
65
+ * @param string|null $field
66
+ * @param int|string|null $value
67
+ * @param callable|null $filter
68
+ *
69
+ * @return mixed
70
+ */
71
+ protected function _getItems($structClass, $infoTag, $field = null, $value = null, callable $filter = null)
72
+ {
73
+ $packet = $this->_client->getPacket();
74
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
75
+
76
+ $filterTag = $getTag->addChild('filter');
77
+ if (!is_null($field)) {
78
+ $filterTag->addChild($field, $value);
79
+ }
80
+
81
+ $getTag->addChild('dataset')->addChild($infoTag);
82
+
83
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
84
+
85
+ $items = [];
86
+ foreach ($response->xpath('//result') as $xmlResult) {
87
+ if (!is_null($filter) && !$filter($xmlResult->data->$infoTag)) {
88
+ continue;
89
+ }
90
+ $items[] = new $structClass($xmlResult->data->$infoTag);
91
+ }
92
+
93
+ return $items;
94
+ }
95
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Aps.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ class Aps extends \PleskX\Api\Operator
7
+ {
8
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Certificate.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Certificate as Struct;
7
+
8
+ class Certificate extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param array $properties
12
+ *
13
+ * @return Struct\Info
14
+ */
15
+ public function generate($properties)
16
+ {
17
+ $packet = $this->_client->getPacket();
18
+ $info = $packet->addChild($this->_wrapperTag)->addChild('generate')->addChild('info');
19
+
20
+ foreach ($properties as $name => $value) {
21
+ $info->addChild($name, $value);
22
+ }
23
+
24
+ $response = $this->_client->request($packet);
25
+
26
+ return new Struct\Info($response);
27
+ }
28
+
29
+ public function create($properties)
30
+ {
31
+ $packet = $this->_client->getPacket();
32
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add')->addChild('gen_info');
33
+
34
+ foreach ($properties as $name => $value) {
35
+ $info->addChild($name, $value);
36
+ }
37
+
38
+ $response = $this->_client->request($packet);
39
+
40
+ return new Struct\Info($response);
41
+ }
42
+
43
+ public function install($domains, $properties)
44
+ {
45
+ $packet = $this->_client->getPacket();
46
+ foreach ($domains as $domain) {
47
+ $install = $packet->addChild($this->_wrapperTag)->addChild('install');
48
+ $install->addChild('name', $domain);
49
+ $install->addChild('webspace', $domain);
50
+ $content = $install->addChild('content');
51
+
52
+ foreach ($properties as $name => $value) {
53
+ $content->addChild($name, $value);
54
+ }
55
+
56
+ }
57
+
58
+
59
+ $response = $this->_client->request($packet);
60
+
61
+ return new Struct\Info($response);
62
+ }
63
+
64
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Customer.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Customer as Struct;
7
+
8
+ class Customer extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param array $properties
12
+ *
13
+ * @return Struct\Info
14
+ */
15
+ public function create($properties)
16
+ {
17
+ $packet = $this->_client->getPacket();
18
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add')->addChild('gen_info');
19
+
20
+ foreach ($properties as $name => $value) {
21
+ $info->addChild($name, $value);
22
+ }
23
+
24
+ $response = $this->_client->request($packet);
25
+
26
+ return new Struct\Info($response);
27
+ }
28
+
29
+ /**
30
+ * @param string $field
31
+ * @param int|string $value
32
+ *
33
+ * @return bool
34
+ */
35
+ public function delete($field, $value)
36
+ {
37
+ return $this->_delete($field, $value);
38
+ }
39
+
40
+ /**
41
+ * @param string $field
42
+ * @param int|string $value
43
+ *
44
+ * @return Struct\GeneralInfo
45
+ */
46
+ public function get($field, $value)
47
+ {
48
+ $items = $this->_getItems(Struct\GeneralInfo::class, 'gen_info', $field, $value);
49
+
50
+ return reset($items);
51
+ }
52
+
53
+ /**
54
+ * @return Struct\GeneralInfo[]
55
+ */
56
+ public function getAll()
57
+ {
58
+ return $this->_getItems(Struct\GeneralInfo::class, 'gen_info');
59
+ }
60
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Database.php ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Database as Struct;
7
+
8
+ class Database extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param array $properties
12
+ *
13
+ * @return Struct\Info
14
+ */
15
+ public function create($properties)
16
+ {
17
+ return new Struct\Info($this->_process('add-db', $properties));
18
+ }
19
+
20
+ /**
21
+ * @param array $properties
22
+ *
23
+ * @return Struct\UserInfo
24
+ */
25
+ public function createUser($properties)
26
+ {
27
+ return new Struct\UserInfo($this->_process('add-db-user', $properties));
28
+ }
29
+
30
+ /**
31
+ * @param string $command
32
+ * @param array $properties
33
+ *
34
+ * @return \PleskX\Api\XmlResponse
35
+ */
36
+ private function _process($command, array $properties)
37
+ {
38
+ $packet = $this->_client->getPacket();
39
+ $info = $packet->addChild($this->_wrapperTag)->addChild($command);
40
+
41
+ foreach ($properties as $name => $value) {
42
+ if (false !== strpos($value, '&')) {
43
+ $info->$name = $value;
44
+ continue;
45
+ }
46
+ $info->addChild($name, $value);
47
+ }
48
+
49
+ return $this->_client->request($packet);
50
+ }
51
+
52
+ /**
53
+ * @param array $properties
54
+ *
55
+ * @return bool
56
+ */
57
+ public function updateUser(array $properties)
58
+ {
59
+ $response = $this->_process('set-db-user', $properties);
60
+
61
+ return 'ok' === (string) $response->status;
62
+ }
63
+
64
+ /**
65
+ * @param string $field
66
+ * @param int|string $value
67
+ *
68
+ * @return Struct\Info
69
+ */
70
+ public function get($field, $value)
71
+ {
72
+ $items = $this->getAll($field, $value);
73
+
74
+ return reset($items);
75
+ }
76
+
77
+ /**
78
+ * @param string $field
79
+ * @param int|string $value
80
+ *
81
+ * @return Struct\UserInfo
82
+ */
83
+ public function getUser($field, $value)
84
+ {
85
+ $items = $this->getAllUsers($field, $value);
86
+
87
+ return reset($items);
88
+ }
89
+
90
+ /**
91
+ * @param string $field
92
+ * @param int|string $value
93
+ *
94
+ * @return Struct\Info[]
95
+ */
96
+ public function getAll($field, $value)
97
+ {
98
+ $response = $this->_get('get-db', $field, $value);
99
+ $items = [];
100
+ foreach ($response->xpath('//result') as $xmlResult) {
101
+ $items[] = new Struct\Info($xmlResult);
102
+ }
103
+
104
+ return $items;
105
+ }
106
+
107
+ /**
108
+ * @param string $field
109
+ * @param int|string $value
110
+ *
111
+ * @return Struct\UserInfo[]
112
+ */
113
+ public function getAllUsers($field, $value)
114
+ {
115
+ $response = $this->_get('get-db-users', $field, $value);
116
+ $items = [];
117
+ foreach ($response->xpath('//result') as $xmlResult) {
118
+ $items[] = new Struct\UserInfo($xmlResult);
119
+ }
120
+
121
+ return $items;
122
+ }
123
+
124
+ /**
125
+ * @param string $command
126
+ * @param string $field
127
+ * @param int|string $value
128
+ *
129
+ * @return \PleskX\Api\XmlResponse
130
+ */
131
+ private function _get($command, $field, $value)
132
+ {
133
+ $packet = $this->_client->getPacket();
134
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild($command);
135
+
136
+ $filterTag = $getTag->addChild('filter');
137
+ if (!is_null($field)) {
138
+ $filterTag->addChild($field, $value);
139
+ }
140
+
141
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
142
+
143
+ return $response;
144
+ }
145
+
146
+ /**
147
+ * @param string $field
148
+ * @param int|string $value
149
+ *
150
+ * @return bool
151
+ */
152
+ public function delete($field, $value)
153
+ {
154
+ return $this->_delete($field, $value, 'del-db');
155
+ }
156
+
157
+ /**
158
+ * @param string $field
159
+ * @param int|string $value
160
+ *
161
+ * @return bool
162
+ */
163
+ public function deleteUser($field, $value)
164
+ {
165
+ return $this->_delete($field, $value, 'del-db-user');
166
+ }
167
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/DatabaseServer.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\DatabaseServer as Struct;
7
+
8
+ class DatabaseServer extends \PleskX\Api\Operator
9
+ {
10
+ protected $_wrapperTag = 'db_server';
11
+
12
+ /**
13
+ * @return array
14
+ */
15
+ public function getSupportedTypes()
16
+ {
17
+ $response = $this->request('get-supported-types');
18
+
19
+ return (array) $response->type;
20
+ }
21
+
22
+ /**
23
+ * @param string $field
24
+ * @param int|string $value
25
+ *
26
+ * @return Struct\Info
27
+ */
28
+ public function get($field, $value)
29
+ {
30
+ $items = $this->_get($field, $value);
31
+
32
+ return reset($items);
33
+ }
34
+
35
+ /**
36
+ * @return Struct\Info[]
37
+ */
38
+ public function getAll()
39
+ {
40
+ return $this->_get();
41
+ }
42
+
43
+ /**
44
+ * @param string|null $field
45
+ * @param int|string|null $value
46
+ *
47
+ * @return Struct\Info|Struct\Info[]
48
+ */
49
+ private function _get($field = null, $value = null)
50
+ {
51
+ $packet = $this->_client->getPacket();
52
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
53
+
54
+ $filterTag = $getTag->addChild('filter');
55
+ if (!is_null($field)) {
56
+ $filterTag->addChild($field, $value);
57
+ }
58
+
59
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
60
+
61
+ $items = [];
62
+ foreach ($response->xpath('//result') as $xmlResult) {
63
+ $item = new Struct\Info($xmlResult->data);
64
+ $item->id = (int) $xmlResult->id;
65
+ $items[] = $item;
66
+ }
67
+
68
+ return $items;
69
+ }
70
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Dns.php ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Dns as Struct;
7
+
8
+ class Dns extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param array $properties
12
+ *
13
+ * @return Struct\Info
14
+ */
15
+ public function create($properties)
16
+ {
17
+ $packet = $this->_client->getPacket();
18
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add_rec');
19
+
20
+ foreach ($properties as $name => $value) {
21
+ $info->addChild($name, $value);
22
+ }
23
+
24
+ return new Struct\Info($this->_client->request($packet));
25
+ }
26
+
27
+ /**
28
+ * Send multiply records by one request.
29
+ *
30
+ * @param array $records
31
+ *
32
+ * @return \PleskX\Api\XmlResponse[]
33
+ */
34
+ public function bulkCreate(array $records)
35
+ {
36
+ $packet = $this->_client->getPacket();
37
+
38
+ foreach ($records as $properties) {
39
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add_rec');
40
+
41
+ foreach ($properties as $name => $value) {
42
+ $info->addChild($name, $value);
43
+ }
44
+ }
45
+
46
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
47
+ $items = [];
48
+ foreach ($response->xpath('//result') as $xmlResult) {
49
+ $items[] = $xmlResult;
50
+ }
51
+
52
+ return $items;
53
+ }
54
+
55
+ /**
56
+ * @param string $field
57
+ * @param int|string $value
58
+ *
59
+ * @return Struct\Info
60
+ */
61
+ public function get($field, $value)
62
+ {
63
+ $items = $this->getAll($field, $value);
64
+
65
+ return reset($items);
66
+ }
67
+
68
+ /**
69
+ * @param string $field
70
+ * @param int|string $value
71
+ *
72
+ * @return Struct\Info[]
73
+ */
74
+ public function getAll($field, $value)
75
+ {
76
+ $packet = $this->_client->getPacket();
77
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get_rec');
78
+
79
+ $filterTag = $getTag->addChild('filter');
80
+ if (!is_null($field)) {
81
+ $filterTag->addChild($field, $value);
82
+ }
83
+
84
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
85
+ $items = [];
86
+ foreach ($response->xpath('//result') as $xmlResult) {
87
+ $item = new Struct\Info($xmlResult->data);
88
+ $item->id = (int) $xmlResult->id;
89
+ $items[] = $item;
90
+ }
91
+
92
+ return $items;
93
+ }
94
+
95
+ /**
96
+ * @param string $field
97
+ * @param int|string $value
98
+ *
99
+ * @return bool
100
+ */
101
+ public function delete($field, $value)
102
+ {
103
+ return $this->_delete($field, $value, 'del_rec');
104
+ }
105
+
106
+ /**
107
+ * Delete multiply records by one request.
108
+ *
109
+ * @param array $recordIds
110
+ *
111
+ * @return \PleskX\Api\XmlResponse[]
112
+ */
113
+ public function bulkDelete(array $recordIds)
114
+ {
115
+ $packet = $this->_client->getPacket();
116
+
117
+ foreach ($recordIds as $recordId) {
118
+ $packet->addChild($this->_wrapperTag)->addChild('del_rec')
119
+ ->addChild('filter')->addChild('id', $recordId);
120
+ }
121
+
122
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
123
+ $items = [];
124
+ foreach ($response->xpath('//result') as $xmlResult) {
125
+ $items[] = $xmlResult;
126
+ }
127
+
128
+ return $items;
129
+ }
130
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/DnsTemplate.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Dns as Struct;
7
+
8
+ class DnsTemplate extends \PleskX\Api\Operator
9
+ {
10
+ protected $_wrapperTag = 'dns';
11
+
12
+ /**
13
+ * @param array $properties
14
+ *
15
+ * @return Struct\Info
16
+ */
17
+ public function create(array $properties)
18
+ {
19
+ $packet = $this->_client->getPacket();
20
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add_rec');
21
+
22
+ unset($properties['site-id'], $properties['site-alias-id']);
23
+ foreach ($properties as $name => $value) {
24
+ $info->addChild($name, $value);
25
+ }
26
+
27
+ return new Struct\Info($this->_client->request($packet));
28
+ }
29
+
30
+ /**
31
+ * @param string $field
32
+ * @param int|string $value
33
+ *
34
+ * @return Struct\Info|null
35
+ */
36
+ public function get($field, $value)
37
+ {
38
+ $items = $this->getAll($field, $value);
39
+
40
+ return reset($items);
41
+ }
42
+
43
+ /**
44
+ * @param string $field
45
+ * @param int|string $value
46
+ *
47
+ * @return Struct\Info[]
48
+ */
49
+ public function getAll($field = null, $value = null)
50
+ {
51
+ $packet = $this->_client->getPacket();
52
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get_rec');
53
+
54
+ $filterTag = $getTag->addChild('filter');
55
+ if (!is_null($field)) {
56
+ $filterTag->addChild($field, $value);
57
+ }
58
+ $getTag->addChild('template');
59
+
60
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
61
+ $items = [];
62
+ foreach ($response->xpath('//result') as $xmlResult) {
63
+ $item = new Struct\Info($xmlResult->data);
64
+ $item->id = (int) $xmlResult->id;
65
+ $items[] = $item;
66
+ }
67
+
68
+ return $items;
69
+ }
70
+
71
+ /**
72
+ * @param string $field
73
+ * @param int|string $value
74
+ *
75
+ * @return bool
76
+ */
77
+ public function delete($field, $value)
78
+ {
79
+ $packet = $this->_client->getPacket();
80
+ $delTag = $packet->addChild($this->_wrapperTag)->addChild('del_rec');
81
+ $delTag->addChild('filter')->addChild($field, $value);
82
+ $delTag->addChild('template');
83
+
84
+ $response = $this->_client->request($packet);
85
+
86
+ return 'ok' === (string) $response->status;
87
+ }
88
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/EventLog.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\EventLog as Struct;
7
+
8
+ class EventLog extends \PleskX\Api\Operator
9
+ {
10
+ protected $_wrapperTag = 'event_log';
11
+
12
+ /**
13
+ * @return Struct\Event[]
14
+ */
15
+ public function get()
16
+ {
17
+ $records = [];
18
+ $response = $this->request('get');
19
+
20
+ foreach ($response->event as $eventInfo) {
21
+ $records[] = new Struct\Event($eventInfo);
22
+ }
23
+
24
+ return $records;
25
+ }
26
+
27
+ /**
28
+ * @return Struct\DetailedEvent[]
29
+ */
30
+ public function getDetailedLog()
31
+ {
32
+ $records = [];
33
+ $response = $this->request('get_events');
34
+
35
+ foreach ($response->event as $eventInfo) {
36
+ $records[] = new Struct\DetailedEvent($eventInfo);
37
+ }
38
+
39
+ return $records;
40
+ }
41
+
42
+ /**
43
+ * @return int
44
+ */
45
+ public function getLastId()
46
+ {
47
+ return (int) $this->request('get-last-id')->getValue('id');
48
+ }
49
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Ip.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Ip as Struct;
7
+
8
+ class Ip extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @return Struct\Info[]
12
+ */
13
+ public function get()
14
+ {
15
+ $ips = [];
16
+ $packet = $this->_client->getPacket();
17
+ $packet->addChild($this->_wrapperTag)->addChild('get');
18
+ $response = $this->_client->request($packet);
19
+
20
+ foreach ($response->addresses->ip_info as $ipInfo) {
21
+ $ips[] = new Struct\Info($ipInfo);
22
+ }
23
+
24
+ return $ips;
25
+ }
26
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Locale.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Locale as Struct;
7
+
8
+ class Locale extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param string|null $id
12
+ *
13
+ * @return Struct\Info|Struct\Info[]
14
+ */
15
+ public function get($id = null)
16
+ {
17
+ $locales = [];
18
+ $packet = $this->_client->getPacket();
19
+ $filter = $packet->addChild($this->_wrapperTag)->addChild('get')->addChild('filter');
20
+
21
+ if (!is_null($id)) {
22
+ $filter->addChild('id', $id);
23
+ }
24
+
25
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
26
+
27
+ foreach ($response->locale->get->result as $localeInfo) {
28
+ $locales[(string) $localeInfo->info->id] = new Struct\Info($localeInfo->info);
29
+ }
30
+
31
+ return !is_null($id) ? reset($locales) : $locales;
32
+ }
33
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/LogRotation.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ class LogRotation extends \PleskX\Api\Operator
7
+ {
8
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Mail.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Mail as Struct;
7
+
8
+ class Mail extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param string $name
12
+ * @param int $siteId
13
+ * @param bool $mailbox
14
+ * @param string $password
15
+ *
16
+ * @return Struct\Info
17
+ */
18
+ public function create($name, $siteId, $mailbox = false, $password = '')
19
+ {
20
+ $packet = $this->_client->getPacket();
21
+ $info = $packet->addChild($this->_wrapperTag)->addChild('create');
22
+
23
+ $filter = $info->addChild('filter');
24
+ $filter->addChild('site-id', $siteId);
25
+ $mailname = $filter->addChild('mailname');
26
+ $mailname->addChild('name', $name);
27
+ if ($mailbox) {
28
+ $mailname->addChild('mailbox')->addChild('enabled', 'true');
29
+ }
30
+ if (!empty($password)) {
31
+ $mailname->addChild('password')->addChild('value', $password);
32
+ }
33
+
34
+ $response = $this->_client->request($packet);
35
+
36
+ return new Struct\Info($response->mailname);
37
+ }
38
+
39
+ /**
40
+ * @param string $field
41
+ * @param int|string $value
42
+ * @param int $siteId
43
+ *
44
+ * @return bool
45
+ */
46
+ public function delete($field, $value, $siteId)
47
+ {
48
+ $packet = $this->_client->getPacket();
49
+ $filter = $packet->addChild($this->_wrapperTag)->addChild('remove')->addChild('filter');
50
+ $filter->addChild('site-id', $siteId);
51
+ $filter->addChild($field, $value);
52
+ $response = $this->_client->request($packet);
53
+
54
+ return 'ok' === (string) $response->status;
55
+ }
56
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/PhpHandler.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Client;
7
+ use PleskX\Api\Operator;
8
+ use PleskX\Api\Struct\PhpHandler\Info;
9
+
10
+ class PhpHandler extends Operator
11
+ {
12
+ /**
13
+ * @param string $field
14
+ * @param int|string $value
15
+ *
16
+ * @return Info
17
+ */
18
+ public function get($field, $value)
19
+ {
20
+ $packet = $this->_client->getPacket();
21
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
22
+ $filterTag = $getTag->addChild('filter');
23
+
24
+ if (!is_null($field)) {
25
+ $filterTag->addChild($field, $value);
26
+ }
27
+
28
+ $response = $this->_client->request($packet, Client::RESPONSE_FULL);
29
+ $xmlResult = $response->xpath('//result')[0];
30
+
31
+ return new Info($xmlResult);
32
+ }
33
+
34
+ /**
35
+ * @param string|null $field
36
+ * @param int|string $value
37
+ *
38
+ * @return Info[]
39
+ */
40
+ public function getAll($field = null, $value = null)
41
+ {
42
+ $packet = $this->_client->getPacket();
43
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
44
+
45
+ $filterTag = $getTag->addChild('filter');
46
+ if (!is_null($field)) {
47
+ $filterTag->addChild($field, $value);
48
+ }
49
+
50
+ $response = $this->_client->request($packet, Client::RESPONSE_FULL);
51
+ $items = [];
52
+ foreach ($response->xpath('//result') as $xmlResult) {
53
+ $item = new Info($xmlResult);
54
+ $items[] = $item;
55
+ }
56
+
57
+ return $items;
58
+ }
59
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ProtectedDirectory.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\ProtectedDirectory as Struct;
7
+
8
+ class ProtectedDirectory extends \PleskX\Api\Operator
9
+ {
10
+ protected $_wrapperTag = 'protected-dir';
11
+
12
+ /**
13
+ * @param string $name
14
+ * @param int $siteId
15
+ * @param string $header
16
+ *
17
+ * @return Struct\Info
18
+ */
19
+ public function add($name, $siteId, $header = '')
20
+ {
21
+ $packet = $this->_client->getPacket();
22
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add');
23
+
24
+ $info->addChild('site-id', $siteId);
25
+ $info->addChild('name', $name);
26
+ $info->addChild('header', $header);
27
+
28
+ return new Struct\Info($this->_client->request($packet));
29
+ }
30
+
31
+ /**
32
+ * @param string $field
33
+ * @param int|string $value
34
+ *
35
+ * @return bool
36
+ */
37
+ public function delete($field, $value)
38
+ {
39
+ return $this->_delete($field, $value, 'delete');
40
+ }
41
+
42
+ /**
43
+ * @param string $field
44
+ * @param int|string $value
45
+ *
46
+ * @return Struct\DataInfo|false
47
+ */
48
+ public function get($field, $value)
49
+ {
50
+ $items = $this->getAll($field, $value);
51
+
52
+ return reset($items);
53
+ }
54
+
55
+ /**
56
+ * @param string $field
57
+ * @param int|string $value
58
+ *
59
+ * @return Struct\DataInfo[]
60
+ */
61
+ public function getAll($field, $value)
62
+ {
63
+ $response = $this->_get('get', $field, $value);
64
+ $items = [];
65
+ foreach ($response->xpath('//result/data') as $xmlResult) {
66
+ $items[] = new Struct\DataInfo($xmlResult);
67
+ }
68
+
69
+ return $items;
70
+ }
71
+
72
+ /**
73
+ * @param Struct\Info $protectedDirectory
74
+ * @param string $login
75
+ * @param string $password
76
+ *
77
+ * @return Struct\UserInfo
78
+ */
79
+ public function addUser($protectedDirectory, $login, $password)
80
+ {
81
+ $packet = $this->_client->getPacket();
82
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add-user');
83
+
84
+ $info->addChild('pd-id', $protectedDirectory->id);
85
+ $info->addChild('login', $login);
86
+ $info->addChild('password', $password);
87
+
88
+ return new Struct\UserInfo($this->_client->request($packet));
89
+ }
90
+
91
+ /**
92
+ * @param string $field
93
+ * @param int|string $value
94
+ *
95
+ * @return bool
96
+ */
97
+ public function deleteUser($field, $value)
98
+ {
99
+ return $this->_delete($field, $value, 'delete-user');
100
+ }
101
+
102
+ /**
103
+ * @param $command
104
+ * @param $field
105
+ * @param $value
106
+ *
107
+ * @return \PleskX\Api\XmlResponse
108
+ */
109
+ private function _get($command, $field, $value)
110
+ {
111
+ $packet = $this->_client->getPacket();
112
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild($command);
113
+
114
+ $filterTag = $getTag->addChild('filter');
115
+ if (!is_null($field)) {
116
+ $filterTag->addChild($field, $value);
117
+ }
118
+
119
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
120
+
121
+ return $response;
122
+ }
123
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Reseller.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Reseller as Struct;
7
+
8
+ class Reseller extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param array $properties
12
+ *
13
+ * @return Struct\Info
14
+ */
15
+ public function create($properties)
16
+ {
17
+ $packet = $this->_client->getPacket();
18
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add')->addChild('gen-info');
19
+
20
+ foreach ($properties as $name => $value) {
21
+ $info->addChild($name, $value);
22
+ }
23
+
24
+ $response = $this->_client->request($packet);
25
+
26
+ return new Struct\Info($response);
27
+ }
28
+
29
+ /**
30
+ * @param string $field
31
+ * @param int|string $value
32
+ *
33
+ * @return bool
34
+ */
35
+ public function delete($field, $value)
36
+ {
37
+ return $this->_delete($field, $value);
38
+ }
39
+
40
+ /**
41
+ * @param string $field
42
+ * @param int|string $value
43
+ *
44
+ * @return Struct\GeneralInfo
45
+ */
46
+ public function get($field, $value)
47
+ {
48
+ $items = $this->getAll($field, $value);
49
+
50
+ return reset($items);
51
+ }
52
+
53
+ /**
54
+ * @param string $field
55
+ * @param int|string $value
56
+ *
57
+ * @return Struct\GeneralInfo[]
58
+ */
59
+ public function getAll($field = null, $value = null)
60
+ {
61
+ $packet = $this->_client->getPacket();
62
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
63
+
64
+ $filterTag = $getTag->addChild('filter');
65
+ if (!is_null($field)) {
66
+ $filterTag->addChild($field, $value);
67
+ }
68
+
69
+ $datasetTag = $getTag->addChild('dataset');
70
+ $datasetTag->addChild('gen-info');
71
+ $datasetTag->addChild('permissions');
72
+
73
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
74
+
75
+ $items = [];
76
+ foreach ($response->xpath('//result') as $xmlResult) {
77
+ $item = new Struct\GeneralInfo($xmlResult->data);
78
+ $item->id = (int) $xmlResult->id;
79
+ $items[] = $item;
80
+ }
81
+
82
+ return $items;
83
+ }
84
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ResellerPlan.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ class ResellerPlan extends \PleskX\Api\Operator
7
+ {
8
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/SecretKey.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\SecretKey as Struct;
7
+
8
+ class SecretKey extends \PleskX\Api\Operator
9
+ {
10
+ protected $_wrapperTag = 'secret_key';
11
+
12
+ /**
13
+ * @param string $ipAddress
14
+ *
15
+ * @return string
16
+ */
17
+ public function create($ipAddress)
18
+ {
19
+ $packet = $this->_client->getPacket();
20
+ $packet->addChild($this->_wrapperTag)->addChild('create')->addChild('ip_address', $ipAddress);
21
+ $response = $this->_client->request($packet);
22
+
23
+ return (string) $response->key;
24
+ }
25
+
26
+ /**
27
+ * @param string $keyId
28
+ *
29
+ * @return bool
30
+ */
31
+ public function delete($keyId)
32
+ {
33
+ return $this->_delete('key', $keyId, 'delete');
34
+ }
35
+
36
+ /**
37
+ * @param string $keyId
38
+ *
39
+ * @return Struct\Info
40
+ */
41
+ public function get($keyId)
42
+ {
43
+ $items = $this->_get($keyId);
44
+
45
+ return reset($items);
46
+ }
47
+
48
+ /**
49
+ * @return Struct\Info[]
50
+ */
51
+ public function getAll()
52
+ {
53
+ return $this->_get();
54
+ }
55
+
56
+ /**
57
+ * @param string|null $keyId
58
+ *
59
+ * @return Struct\Info[]
60
+ */
61
+ public function _get($keyId = null)
62
+ {
63
+ $packet = $this->_client->getPacket();
64
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get_info');
65
+
66
+ $filterTag = $getTag->addChild('filter');
67
+ if (!is_null($keyId)) {
68
+ $filterTag->addChild('key', $keyId);
69
+ }
70
+
71
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
72
+
73
+ $items = [];
74
+ foreach ($response->xpath('//result/key_info') as $keyInfo) {
75
+ $items[] = new Struct\Info($keyInfo);
76
+ }
77
+
78
+ return $items;
79
+ }
80
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Server.php ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Server as Struct;
7
+
8
+ class Server extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @return array
12
+ */
13
+ public function getProtos()
14
+ {
15
+ $packet = $this->_client->getPacket();
16
+ $packet->addChild($this->_wrapperTag)->addChild('get_protos');
17
+ $response = $this->_client->request($packet);
18
+
19
+ return (array) $response->protos->proto;
20
+ }
21
+
22
+ public function getGeneralInfo()
23
+ {
24
+ return new Struct\GeneralInfo($this->_getInfo('gen_info'));
25
+ }
26
+
27
+ public function getPreferences()
28
+ {
29
+ return new Struct\Preferences($this->_getInfo('prefs'));
30
+ }
31
+
32
+ public function getAdmin()
33
+ {
34
+ return new Struct\Admin($this->_getInfo('admin'));
35
+ }
36
+
37
+ /**
38
+ * @return array
39
+ */
40
+ public function getKeyInfo()
41
+ {
42
+ $keyInfo = [];
43
+ $keyInfoXml = $this->_getInfo('key');
44
+
45
+ foreach ($keyInfoXml->property as $property) {
46
+ $keyInfo[(string) $property->name] = (string) $property->value;
47
+ }
48
+
49
+ return $keyInfo;
50
+ }
51
+
52
+ /**
53
+ * @return array
54
+ */
55
+ public function getComponents()
56
+ {
57
+ $components = [];
58
+ $componentsXml = $this->_getInfo('components');
59
+
60
+ foreach ($componentsXml->component as $component) {
61
+ $components[(string) $component->name] = (string) $component->version;
62
+ }
63
+
64
+ return $components;
65
+ }
66
+
67
+ /**
68
+ * @return array
69
+ */
70
+ public function getServiceStates()
71
+ {
72
+ $states = [];
73
+ $statesXml = $this->_getInfo('services_state');
74
+
75
+ foreach ($statesXml->srv as $service) {
76
+ $states[(string) $service->id] = [
77
+ 'id' => (string) $service->id,
78
+ 'title' => (string) $service->title,
79
+ 'state' => (string) $service->state,
80
+ ];
81
+ }
82
+
83
+ return $states;
84
+ }
85
+
86
+ public function getSessionPreferences()
87
+ {
88
+ return new Struct\SessionPreferences($this->_getInfo('session_setup'));
89
+ }
90
+
91
+ /**
92
+ * @return array
93
+ */
94
+ public function getShells()
95
+ {
96
+ $shells = [];
97
+ $shellsXml = $this->_getInfo('shells');
98
+
99
+ foreach ($shellsXml->shell as $shell) {
100
+ $shells[(string) $shell->name] = (string) $shell->path;
101
+ }
102
+
103
+ return $shells;
104
+ }
105
+
106
+ /**
107
+ * @return array
108
+ */
109
+ public function getNetworkInterfaces()
110
+ {
111
+ $interfacesXml = $this->_getInfo('interfaces');
112
+
113
+ return (array) $interfacesXml->interface;
114
+ }
115
+
116
+ public function getStatistics()
117
+ {
118
+ return new Struct\Statistics($this->_getInfo('stat'));
119
+ }
120
+
121
+ /**
122
+ * @return array
123
+ */
124
+ public function getSiteIsolationConfig()
125
+ {
126
+ $config = [];
127
+ $configXml = $this->_getInfo('site-isolation-config');
128
+
129
+ foreach ($configXml->property as $property) {
130
+ $config[(string) $property->name] = (string) $property->value;
131
+ }
132
+
133
+ return $config;
134
+ }
135
+
136
+ public function getUpdatesInfo()
137
+ {
138
+ return new Struct\UpdatesInfo($this->_getInfo('updates'));
139
+ }
140
+
141
+ /**
142
+ * @param string $login
143
+ * @param string $clientIp
144
+ *
145
+ * @return string
146
+ */
147
+ public function createSession($login, $clientIp)
148
+ {
149
+ $packet = $this->_client->getPacket();
150
+ $sessionNode = $packet->addChild($this->_wrapperTag)->addChild('create_session');
151
+ $sessionNode->addChild('login', $login);
152
+ $dataNode = $sessionNode->addChild('data');
153
+ $dataNode->addChild('user_ip', base64_encode($clientIp));
154
+ $dataNode->addChild('source_server');
155
+ $response = $this->_client->request($packet);
156
+
157
+ return (string) $response->id;
158
+ }
159
+
160
+ /**
161
+ * @param string $operation
162
+ *
163
+ * @return \SimpleXMLElement
164
+ */
165
+ private function _getInfo($operation)
166
+ {
167
+ $packet = $this->_client->getPacket();
168
+ $packet->addChild($this->_wrapperTag)->addChild('get')->addChild($operation);
169
+ $response = $this->_client->request($packet);
170
+
171
+ return $response->$operation;
172
+ }
173
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ServicePlan.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\ServicePlan as Struct;
7
+
8
+ class ServicePlan extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param string $field
12
+ * @param int|string $value
13
+ *
14
+ * @return Struct\Info
15
+ */
16
+ public function get($field, $value)
17
+ {
18
+ $items = $this->_get($field, $value);
19
+
20
+ return reset($items);
21
+ }
22
+
23
+ /**
24
+ * @return Struct\Info[]
25
+ */
26
+ public function getAll()
27
+ {
28
+ return $this->_get();
29
+ }
30
+
31
+ /**
32
+ * @param string|null $field
33
+ * @param int|string|null $value
34
+ *
35
+ * @return Struct\Info|Struct\Info[]
36
+ */
37
+ private function _get($field = null, $value = null)
38
+ {
39
+ $packet = $this->_client->getPacket();
40
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
41
+
42
+ $filterTag = $getTag->addChild('filter');
43
+ if (!is_null($field)) {
44
+ $filterTag->addChild($field, $value);
45
+ }
46
+
47
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
48
+
49
+ $items = [];
50
+ foreach ($response->xpath('//result') as $xmlResult) {
51
+ $items[] = new Struct\Info($xmlResult);
52
+ }
53
+
54
+ return $items;
55
+ }
56
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ServicePlanAddon.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ class ServicePlanAddon extends \PleskX\Api\Operator
7
+ {
8
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Session.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Session as Struct;
7
+
8
+ class Session extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @return Struct\Info[]
12
+ */
13
+ public function get()
14
+ {
15
+ $sessions = [];
16
+ $response = $this->request('get');
17
+
18
+ foreach ($response->session as $sessionInfo) {
19
+ $sessions[(string) $sessionInfo->id] = new Struct\Info($sessionInfo);
20
+ }
21
+
22
+ return $sessions;
23
+ }
24
+
25
+ /**
26
+ * @param string $sessionId
27
+ *
28
+ * @return bool
29
+ */
30
+ public function terminate($sessionId)
31
+ {
32
+ $response = $this->request("terminate.session-id=$sessionId");
33
+
34
+ return 'ok' === (string) $response->status;
35
+ }
36
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Site.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Site as Struct;
7
+
8
+ class Site extends \PleskX\Api\Operator
9
+ {
10
+ const PROPERTIES_HOSTING = 'hosting';
11
+
12
+ /**
13
+ * @param array $properties
14
+ *
15
+ * @return Struct\Info
16
+ */
17
+ public function create(array $properties)
18
+ {
19
+ $packet = $this->_client->getPacket();
20
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add');
21
+
22
+ $infoGeneral = $info->addChild('gen_setup');
23
+ foreach ($properties as $name => $value) {
24
+ if (!is_scalar($value)) {
25
+ continue;
26
+ }
27
+ $infoGeneral->addChild($name, $value);
28
+ }
29
+
30
+ // set hosting properties
31
+ if (isset($properties[static::PROPERTIES_HOSTING]) && is_array($properties[static::PROPERTIES_HOSTING])) {
32
+ $hostingNode = $info->addChild('hosting')->addChild('vrt_hst');
33
+ foreach ($properties[static::PROPERTIES_HOSTING] as $name => $value) {
34
+ $propertyNode = $hostingNode->addChild('property');
35
+ $propertyNode->addChild('name', $name);
36
+ $propertyNode->addChild('value', $value);
37
+ }
38
+ }
39
+
40
+ $response = $this->_client->request($packet);
41
+
42
+ return new Struct\Info($response);
43
+ }
44
+
45
+ /**
46
+ * @param string $field
47
+ * @param int|string $value
48
+ *
49
+ * @return bool
50
+ */
51
+ public function delete($field, $value)
52
+ {
53
+ return $this->_delete($field, $value);
54
+ }
55
+
56
+ /**
57
+ * @param string $field
58
+ * @param int|string $value
59
+ *
60
+ * @return Struct\GeneralInfo
61
+ */
62
+ public function get($field, $value)
63
+ {
64
+ $items = $this->_getItems(Struct\GeneralInfo::class, 'gen_info', $field, $value);
65
+
66
+ return reset($items);
67
+ }
68
+
69
+ /**
70
+ * @param string $field
71
+ * @param int|string $value
72
+ *
73
+ * @return Struct\HostingInfo|null
74
+ */
75
+ public function getHosting($field, $value)
76
+ {
77
+ $items = $this->_getItems(Struct\HostingInfo::class, 'hosting', $field, $value, function ($node) {
78
+ return isset($node->vrt_hst);
79
+ });
80
+
81
+ return empty($items) ? null : reset($items);
82
+ }
83
+
84
+ /**
85
+ * @return Struct\GeneralInfo[]
86
+ */
87
+ public function getAll()
88
+ {
89
+ return $this->_getItems(Struct\GeneralInfo::class, 'gen_info');
90
+ }
91
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/SiteAlias.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\SiteAlias as Struct;
7
+
8
+ class SiteAlias extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param array $properties
12
+ * @param array $preferences
13
+ *
14
+ * @return Struct\Info
15
+ */
16
+ public function create(array $properties, array $preferences = [])
17
+ {
18
+ $packet = $this->_client->getPacket();
19
+ $info = $packet->addChild($this->_wrapperTag)->addChild('create');
20
+
21
+ if (count($preferences) > 0) {
22
+ $prefs = $info->addChild('pref');
23
+
24
+ foreach ($preferences as $key => $value) {
25
+ $prefs->addChild($key, is_bool($value) ? ($value ? 1 : 0) : $value);
26
+ }
27
+ }
28
+
29
+ $info->addChild('site-id', $properties['site-id']);
30
+ $info->addChild('name', $properties['name']);
31
+
32
+ $response = $this->_client->request($packet);
33
+
34
+ return new Struct\Info($response);
35
+ }
36
+
37
+ /**
38
+ * @param string $field
39
+ * @param int|string $value
40
+ *
41
+ * @return Struct\Info
42
+ */
43
+ public function get($field, $value)
44
+ {
45
+ $items = $this->getAll($field, $value);
46
+
47
+ return reset($items);
48
+ }
49
+
50
+ /**
51
+ * @param string $field
52
+ * @param int|string $value
53
+ *
54
+ * @return Struct\Info[]
55
+ */
56
+ public function getAll($field = null, $value = null)
57
+ {
58
+ $packet = $this->_client->getPacket();
59
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
60
+
61
+ $filterTag = $getTag->addChild('filter');
62
+ if (!is_null($field)) {
63
+ $filterTag->addChild($field, $value);
64
+ }
65
+
66
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
67
+ $items = [];
68
+ foreach ($response->xpath('//result') as $xmlResult) {
69
+ $item = new Struct\GeneralInfo($xmlResult->info);
70
+ $items[] = $item;
71
+ }
72
+
73
+ return $items;
74
+ }
75
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Subdomain.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Subdomain as Struct;
7
+
8
+ class Subdomain extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @param array $properties
12
+ *
13
+ * @return Struct\Info
14
+ */
15
+ public function create($properties)
16
+ {
17
+ $packet = $this->_client->getPacket();
18
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add');
19
+
20
+ foreach ($properties as $name => $value) {
21
+ if (is_array($value)) {
22
+ foreach ($value as $propertyName => $propertyValue) {
23
+ $property = $info->addChild($name);
24
+ $property->addChild('name', $propertyName);
25
+ $property->addChild('value', $propertyValue);
26
+ }
27
+ continue;
28
+ }
29
+ $info->addChild($name, $value);
30
+ }
31
+
32
+ $response = $this->_client->request($packet);
33
+
34
+ return new Struct\Info($response);
35
+ }
36
+
37
+ /**
38
+ * @param string $field
39
+ * @param int|string $value
40
+ *
41
+ * @return bool
42
+ */
43
+ public function delete($field, $value)
44
+ {
45
+ return $this->_delete($field, $value);
46
+ }
47
+
48
+ /**
49
+ * @param string $field
50
+ * @param int|string $value
51
+ *
52
+ * @return Struct\Info
53
+ */
54
+ public function get($field, $value)
55
+ {
56
+ $items = $this->getAll($field, $value);
57
+
58
+ return reset($items);
59
+ }
60
+
61
+ /**
62
+ * @param string $field
63
+ * @param int|string $value
64
+ *
65
+ * @return Struct\Info[]
66
+ */
67
+ public function getAll($field = null, $value = null)
68
+ {
69
+ $packet = $this->_client->getPacket();
70
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
71
+
72
+ $filterTag = $getTag->addChild('filter');
73
+ if (!is_null($field)) {
74
+ $filterTag->addChild($field, $value);
75
+ }
76
+
77
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
78
+
79
+ $items = [];
80
+ foreach ($response->xpath('//result') as $xmlResult) {
81
+ if (empty($xmlResult->data)) {
82
+ continue;
83
+ }
84
+ $item = new Struct\Info($xmlResult->data);
85
+ $item->id = (int) $xmlResult->id;
86
+ $items[] = $item;
87
+ }
88
+
89
+ return $items;
90
+ }
91
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Ui.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Ui as Struct;
7
+
8
+ class Ui extends \PleskX\Api\Operator
9
+ {
10
+ /**
11
+ * @return array
12
+ */
13
+ public function getNavigation()
14
+ {
15
+ $response = $this->request('get-navigation');
16
+
17
+ return unserialize(base64_decode($response->navigation));
18
+ }
19
+
20
+ /**
21
+ * @param string $owner
22
+ * @param array $properties
23
+ *
24
+ * @return int
25
+ */
26
+ public function createCustomButton($owner, $properties)
27
+ {
28
+ $packet = $this->_client->getPacket();
29
+ $buttonNode = $packet->addChild($this->_wrapperTag)->addChild('create-custombutton');
30
+ $buttonNode->addChild('owner')->addChild($owner);
31
+ $propertiesNode = $buttonNode->addChild('properties');
32
+
33
+ foreach ($properties as $name => $value) {
34
+ $propertiesNode->addChild($name, $value);
35
+ }
36
+
37
+ $response = $this->_client->request($packet);
38
+
39
+ return (int) $response->id;
40
+ }
41
+
42
+ /**
43
+ * @param int $id
44
+ *
45
+ * @return Struct\CustomButton
46
+ */
47
+ public function getCustomButton($id)
48
+ {
49
+ $response = $this->request("get-custombutton.filter.custombutton-id=$id");
50
+
51
+ return new Struct\CustomButton($response);
52
+ }
53
+
54
+ /**
55
+ * @param int $id
56
+ *
57
+ * @return bool
58
+ */
59
+ public function deleteCustomButton($id)
60
+ {
61
+ return $this->_delete('custombutton-id', $id, 'delete-custombutton');
62
+ }
63
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/VirtualDirectory.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ class VirtualDirectory extends \PleskX\Api\Operator
7
+ {
8
+ protected $_wrapperTag = 'virtdir';
9
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Webspace.php ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Operator;
5
+
6
+ use PleskX\Api\Struct\Webspace as Struct;
7
+
8
+ class Webspace extends \PleskX\Api\Operator
9
+ {
10
+ public function getPermissionDescriptor()
11
+ {
12
+ $response = $this->request('get-permission-descriptor.filter');
13
+
14
+ return new Struct\PermissionDescriptor($response);
15
+ }
16
+
17
+ public function getLimitDescriptor()
18
+ {
19
+ $response = $this->request('get-limit-descriptor.filter');
20
+
21
+ return new Struct\LimitDescriptor($response);
22
+ }
23
+
24
+ public function getPhysicalHostingDescriptor()
25
+ {
26
+ $response = $this->request('get-physical-hosting-descriptor.filter');
27
+
28
+ return new Struct\PhysicalHostingDescriptor($response);
29
+ }
30
+
31
+ /**
32
+ * @param string $field
33
+ * @param int|string $value
34
+ *
35
+ * @return Struct\PhpSettings
36
+ */
37
+ public function getPhpSettings($field, $value)
38
+ {
39
+ $packet = $this->_client->getPacket();
40
+ $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
41
+
42
+ $getTag->addChild('filter')->addChild($field, $value);
43
+ $getTag->addChild('dataset')->addChild('php-settings');
44
+
45
+ $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
46
+
47
+ return new Struct\PhpSettings($response);
48
+ }
49
+
50
+ /**
51
+ * @param string $field
52
+ * @param int|string $value
53
+ *
54
+ * @return Struct\Limits
55
+ */
56
+ public function getLimits($field, $value)
57
+ {
58
+ $items = $this->_getItems(Struct\Limits::class, 'limits', $field, $value);
59
+
60
+ return reset($items);
61
+ }
62
+
63
+ /**
64
+ * @param array $properties
65
+ * @param array|null $hostingProperties
66
+ * @param $planName
67
+ *
68
+ * @return Struct\Info
69
+ */
70
+ public function create(array $properties, array $hostingProperties = null, $planName = null)
71
+ {
72
+ $packet = $this->_client->getPacket();
73
+ $info = $packet->addChild($this->_wrapperTag)->addChild('add');
74
+
75
+ $infoGeneral = $info->addChild('gen_setup');
76
+ foreach ($properties as $name => $value) {
77
+ $infoGeneral->addChild($name, $value);
78
+ }
79
+
80
+ if ($hostingProperties) {
81
+ $infoHosting = $info->addChild('hosting')->addChild('vrt_hst');
82
+ foreach ($hostingProperties as $name => $value) {
83
+ $property = $infoHosting->addChild('property');
84
+ $property->addChild('name', $name);
85
+ $property->addChild('value', $value);
86
+ }
87
+
88
+ if (isset($properties['ip_address'])) {
89
+ $infoHosting->addChild('ip_address', $properties['ip_address']);
90
+ }
91
+ }
92
+
93
+ if ($planName) {
94
+ $info->addChild('plan-name', $planName);
95
+ }
96
+
97
+ $response = $this->_client->request($packet);
98
+
99
+ return new Struct\Info($response);
100
+ }
101
+
102
+ /**
103
+ * @param string $field
104
+ * @param int|string $value
105
+ *
106
+ * @return bool
107
+ */
108
+ public function delete($field, $value)
109
+ {
110
+ return $this->_delete($field, $value);
111
+ }
112
+
113
+ /**
114
+ * @param string $field
115
+ * @param int|string $value
116
+ *
117
+ * @return Struct\GeneralInfo
118
+ */
119
+ public function get($field, $value)
120
+ {
121
+ $items = $this->_getItems(Struct\GeneralInfo::class, 'gen_info', $field, $value);
122
+
123
+ return reset($items);
124
+ }
125
+
126
+ /**
127
+ * @return Struct\GeneralInfo[]
128
+ */
129
+ public function getAll()
130
+ {
131
+ return $this->_getItems(Struct\GeneralInfo::class, 'gen_info');
132
+ }
133
+
134
+ /**
135
+ * @param string $field
136
+ * @param int|string $value
137
+ *
138
+ * @return Struct\DiskUsage
139
+ */
140
+ public function getDiskUsage($field, $value)
141
+ {
142
+ $items = $this->_getItems(Struct\DiskUsage::class, 'disk_usage', $field, $value);
143
+
144
+ return reset($items);
145
+ }
146
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api;
5
+
6
+ abstract class Struct
7
+ {
8
+ public function __set($property, $value)
9
+ {
10
+ throw new \Exception("Try to set an undeclared property '$property'.");
11
+ }
12
+
13
+ /**
14
+ * Initialize list of scalar properties by response.
15
+ *
16
+ * @param \SimpleXMLElement $apiResponse
17
+ * @param array $properties
18
+ *
19
+ * @throws \Exception
20
+ */
21
+ protected function _initScalarProperties($apiResponse, array $properties)
22
+ {
23
+ foreach ($properties as $property) {
24
+ if (is_array($property)) {
25
+ $classPropertyName = current($property);
26
+ $value = $apiResponse->{key($property)};
27
+ } else {
28
+ $classPropertyName = $this->_underToCamel(str_replace('-', '_', $property));
29
+ $value = $apiResponse->$property;
30
+ }
31
+
32
+ $reflectionProperty = new \ReflectionProperty($this, $classPropertyName);
33
+ $docBlock = $reflectionProperty->getDocComment();
34
+ $propertyType = preg_replace('/^.+ @var ([a-z]+) .+$/', '\1', $docBlock);
35
+
36
+ if ('string' == $propertyType) {
37
+ $value = (string) $value;
38
+ } elseif ('int' == $propertyType) {
39
+ $value = (int) $value;
40
+ } elseif ('bool' == $propertyType) {
41
+ $value = in_array((string) $value, ['true', 'on', 'enabled']);
42
+ } else {
43
+ throw new \Exception("Unknown property type '$propertyType'.");
44
+ }
45
+
46
+ $this->$classPropertyName = $value;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Convert underscore separated words into camel case.
52
+ *
53
+ * @param string $under
54
+ *
55
+ * @return string
56
+ */
57
+ private function _underToCamel($under)
58
+ {
59
+ $under = '_'.str_replace('_', ' ', strtolower($under));
60
+
61
+ return ltrim(str_replace(' ', '', ucwords($under)), '_');
62
+ }
63
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Certificate/Info.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Certificate;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $request;
10
+
11
+ /** @var string */
12
+ public $privateKey;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ ['csr' => 'request'],
18
+ ['pvt' => 'privateKey'],
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Customer/GeneralInfo.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Customer;
5
+
6
+ class GeneralInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $company;
10
+
11
+ /** @var string */
12
+ public $personalName;
13
+
14
+ /** @var string */
15
+ public $login;
16
+
17
+ /** @var string */
18
+ public $guid;
19
+
20
+ /** @var string */
21
+ public $email;
22
+
23
+ /** @var string */
24
+ public $phone;
25
+
26
+ /** @var string */
27
+ public $fax;
28
+
29
+ /** @var string */
30
+ public $address;
31
+
32
+ /** @var string */
33
+ public $postalCode;
34
+
35
+ /** @var string */
36
+ public $city;
37
+
38
+ /** @var string */
39
+ public $state;
40
+
41
+ /** @var string */
42
+ public $country;
43
+
44
+ /** @var string */
45
+ public $description;
46
+
47
+ /** @var string */
48
+ public $externalId;
49
+
50
+ public function __construct($apiResponse)
51
+ {
52
+ $this->_initScalarProperties($apiResponse, [
53
+ ['cname' => 'company'],
54
+ ['pname' => 'personalName'],
55
+ 'login',
56
+ 'guid',
57
+ 'email',
58
+ 'phone',
59
+ 'fax',
60
+ 'address',
61
+ ['pcode' => 'postalCode'],
62
+ 'city',
63
+ 'state',
64
+ 'country',
65
+ 'external-id',
66
+ 'description',
67
+ ]);
68
+ }
69
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Customer/Info.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Customer;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $guid;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'id',
18
+ 'guid',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Database/Info.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Database;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $name;
13
+
14
+ /** @var string */
15
+ public $type;
16
+
17
+ /** @var int */
18
+ public $webspaceId;
19
+
20
+ /** @var int */
21
+ public $dbServerId;
22
+
23
+ /** @var int */
24
+ public $defaultUserId;
25
+
26
+ public function __construct($apiResponse)
27
+ {
28
+ $this->_initScalarProperties($apiResponse, [
29
+ 'id',
30
+ 'name',
31
+ 'type',
32
+ 'webspace-id',
33
+ 'db-server-id',
34
+ 'default-user-id',
35
+ ]);
36
+ }
37
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Database/UserInfo.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Database;
5
+
6
+ class UserInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $login;
13
+
14
+ /** @var int */
15
+ public $dbId;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'id',
21
+ 'login',
22
+ 'db-id',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/DatabaseServer/Info.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\DatabaseServer;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $host;
13
+
14
+ /** @var int */
15
+ public $port;
16
+
17
+ /** @var string */
18
+ public $type;
19
+
20
+ public function __construct($apiResponse)
21
+ {
22
+ $this->_initScalarProperties($apiResponse, [
23
+ 'id',
24
+ 'host',
25
+ 'port',
26
+ 'type',
27
+ ]);
28
+ }
29
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Dns/Info.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Dns;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var int */
12
+ public $siteId;
13
+
14
+ /** @var int */
15
+ public $siteAliasId;
16
+
17
+ /** @var string */
18
+ public $type;
19
+
20
+ /** @var string */
21
+ public $host;
22
+
23
+ /** @var string */
24
+ public $value;
25
+
26
+ /** @var string */
27
+ public $opt;
28
+
29
+ public function __construct($apiResponse)
30
+ {
31
+ $this->_initScalarProperties($apiResponse, [
32
+ 'id',
33
+ 'site-id',
34
+ 'site-alias-id',
35
+ 'type',
36
+ 'host',
37
+ 'value',
38
+ 'opt',
39
+ ]);
40
+ }
41
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/EventLog/DetailedEvent.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\EventLog;
5
+
6
+ class DetailedEvent extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $type;
13
+
14
+ /** @var int */
15
+ public $time;
16
+
17
+ /** @var string */
18
+ public $class;
19
+
20
+ /** @var string */
21
+ public $objectId;
22
+
23
+ /** @var string */
24
+ public $user;
25
+
26
+ /** @var string */
27
+ public $host;
28
+
29
+ public function __construct($apiResponse)
30
+ {
31
+ $this->_initScalarProperties($apiResponse, [
32
+ 'id',
33
+ 'type',
34
+ 'time',
35
+ 'class',
36
+ ['obj_id' => 'objectId'],
37
+ 'user',
38
+ 'host',
39
+ ]);
40
+ }
41
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/EventLog/Event.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\EventLog;
5
+
6
+ class Event extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $type;
10
+
11
+ /** @var int */
12
+ public $time;
13
+
14
+ /** @var string */
15
+ public $class;
16
+
17
+ /** @var string */
18
+ public $id;
19
+
20
+ public function __construct($apiResponse)
21
+ {
22
+ $this->_initScalarProperties($apiResponse, [
23
+ 'type',
24
+ 'time',
25
+ 'class',
26
+ 'id',
27
+ ]);
28
+ }
29
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Ip/Info.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Ip;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $ipAddress;
10
+
11
+ /** @var string */
12
+ public $netmask;
13
+
14
+ /** @var string */
15
+ public $type;
16
+
17
+ /** @var string */
18
+ public $interface;
19
+
20
+ public function __construct($apiResponse)
21
+ {
22
+ $this->_initScalarProperties($apiResponse, [
23
+ 'ip_address',
24
+ 'netmask',
25
+ 'type',
26
+ 'interface',
27
+ ]);
28
+ }
29
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Locale/Info.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Locale;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $language;
13
+
14
+ /** @var string */
15
+ public $country;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'id',
21
+ ['lang' => 'language'],
22
+ 'country',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Mail/Info.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Mail;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $name;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'id',
18
+ 'name',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/PhpHandler/Info.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\PhpHandler;
5
+
6
+ use PleskX\Api\Struct;
7
+
8
+ class Info extends Struct
9
+ {
10
+ /** @var string */
11
+ public $id;
12
+
13
+ /** @var string */
14
+ public $displayName;
15
+
16
+ /** @var string */
17
+ public $fullVersion;
18
+
19
+ /** @var string */
20
+ public $version;
21
+
22
+ /** @var string */
23
+ public $type;
24
+
25
+ /** @var string */
26
+ public $path;
27
+
28
+ /** @var string */
29
+ public $clipath;
30
+
31
+ /** @var string */
32
+ public $phpini;
33
+
34
+ /** @var string */
35
+ public $custom;
36
+
37
+ /** @var string */
38
+ public $handlerStatus;
39
+
40
+ public function __construct($apiResponse)
41
+ {
42
+ $this->_initScalarProperties($apiResponse, [
43
+ 'id',
44
+ 'display-name',
45
+ 'full-version',
46
+ 'version',
47
+ 'type',
48
+ 'path',
49
+ 'clipath',
50
+ 'phpini',
51
+ 'custom',
52
+ 'handler-status',
53
+ ]);
54
+ }
55
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/ProtectedDirectory/DataInfo.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\ProtectedDirectory;
5
+
6
+ use PleskX\Api\Struct;
7
+
8
+ class DataInfo extends Struct
9
+ {
10
+ /** @var string */
11
+ public $name;
12
+
13
+ /** @var string */
14
+ public $header;
15
+
16
+ public function __construct($apiResponse)
17
+ {
18
+ $this->_initScalarProperties($apiResponse, [
19
+ 'name',
20
+ 'header',
21
+ ]);
22
+ }
23
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/ProtectedDirectory/Info.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\ProtectedDirectory;
5
+
6
+ use PleskX\Api\Struct;
7
+
8
+ class Info extends Struct
9
+ {
10
+ /** @var int */
11
+ public $id;
12
+
13
+ public function __construct($apiResponse)
14
+ {
15
+ $this->_initScalarProperties($apiResponse, [
16
+ 'id',
17
+ ]);
18
+ }
19
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/ProtectedDirectory/UserInfo.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\ProtectedDirectory;
5
+
6
+ class UserInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ public function __construct($apiResponse)
12
+ {
13
+ $this->_initScalarProperties($apiResponse, [
14
+ 'id',
15
+ ]);
16
+ }
17
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Reseller/GeneralInfo.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Reseller;
5
+
6
+ class GeneralInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $personalName;
13
+
14
+ /** @var string */
15
+ public $login;
16
+
17
+ /** @var array */
18
+ public $permissions;
19
+
20
+ public function __construct($apiResponse)
21
+ {
22
+ $this->_initScalarProperties($apiResponse->{'gen-info'}, [
23
+ ['pname' => 'personalName'],
24
+ 'login',
25
+ ]);
26
+
27
+ $this->permissions = [];
28
+ foreach ($apiResponse->permissions->permission as $permissionInfo) {
29
+ $this->permissions[(string) $permissionInfo->name] = (string) $permissionInfo->value;
30
+ }
31
+ }
32
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Reseller/Info.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Reseller;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $guid;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'id',
18
+ 'guid',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SecretKey/Info.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\SecretKey;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $key;
10
+
11
+ /** @var string */
12
+ public $ipAddress;
13
+
14
+ /** @var string */
15
+ public $description;
16
+
17
+ /** @var string */
18
+ public $login;
19
+
20
+ public function __construct($apiResponse)
21
+ {
22
+ $this->_initScalarProperties($apiResponse, [
23
+ 'key',
24
+ 'ip_address',
25
+ 'description',
26
+ 'login',
27
+ ]);
28
+ }
29
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Admin.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Server;
5
+
6
+ class Admin extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $companyName;
10
+
11
+ /** @var string */
12
+ public $name;
13
+
14
+ /** @var string */
15
+ public $email;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ ['admin_cname' => 'companyName'],
21
+ ['admin_pname' => 'name'],
22
+ ['admin_email' => 'email'],
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/GeneralInfo.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Server;
5
+
6
+ class GeneralInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $serverName;
10
+
11
+ /** @var string */
12
+ public $serverGuid;
13
+
14
+ /** @var string */
15
+ public $mode;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'server_name',
21
+ 'server_guid',
22
+ 'mode',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Preferences.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Server;
5
+
6
+ class Preferences extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $statTtl;
10
+
11
+ /** @var int */
12
+ public $trafficAccounting;
13
+
14
+ /** @var int */
15
+ public $restartApacheInterval;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'stat_ttl',
21
+ 'traffic_accounting',
22
+ 'restart_apache_interval',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/SessionPreferences.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Server;
5
+
6
+ class SessionPreferences extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $loginTimeout;
10
+
11
+ public function __construct($apiResponse)
12
+ {
13
+ $this->_initScalarProperties($apiResponse, [
14
+ 'login_timeout',
15
+ ]);
16
+ }
17
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Statistics.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Server;
5
+
6
+ class Statistics extends \PleskX\Api\Struct
7
+ {
8
+ /** @var Statistics\Objects */
9
+ public $objects;
10
+
11
+ /** @var Statistics\Version */
12
+ public $version;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->objects = new Statistics\Objects($apiResponse->objects);
17
+ $this->version = new Statistics\Version($apiResponse->version);
18
+ }
19
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Statistics/Objects.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Server\Statistics;
5
+
6
+ class Objects extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $clients;
10
+
11
+ /** @var int */
12
+ public $domains;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'clients',
18
+ 'domains',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/Statistics/Version.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Server\Statistics;
5
+
6
+ class Version extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $internalName;
10
+
11
+ /** @var string */
12
+ public $version;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ ['plesk_name' => 'internalName'],
18
+ ['plesk_version' => 'version'],
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Server/UpdatesInfo.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Server;
5
+
6
+ class UpdatesInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $lastInstalledUpdate;
10
+
11
+ /** @var bool */
12
+ public $installUpdatesAutomatically;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'last_installed_update',
18
+ 'install_updates_automatically',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/ServicePlan/Info.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\ServicePlan;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $name;
13
+
14
+ /** @var string */
15
+ public $guid;
16
+
17
+ /** @var string */
18
+ public $externalId;
19
+
20
+ public function __construct($apiResponse)
21
+ {
22
+ $this->_initScalarProperties($apiResponse, [
23
+ 'id',
24
+ 'name',
25
+ 'guid',
26
+ 'external-id',
27
+ ]);
28
+ }
29
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Session/Info.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Session;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $type;
13
+
14
+ /** @var string */
15
+ public $ipAddress;
16
+
17
+ /** @var string */
18
+ public $login;
19
+
20
+ /** @var string */
21
+ public $loginTime;
22
+
23
+ /** @var string */
24
+ public $idle;
25
+
26
+ public function __construct($apiResponse)
27
+ {
28
+ $this->_initScalarProperties($apiResponse, [
29
+ 'id',
30
+ 'type',
31
+ 'ip-address',
32
+ 'login',
33
+ 'login-time',
34
+ 'idle',
35
+ ]);
36
+ }
37
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/GeneralInfo.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Site;
5
+
6
+ class GeneralInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $name;
10
+
11
+ /** @var string */
12
+ public $asciiName;
13
+
14
+ /** @var string */
15
+ public $guid;
16
+
17
+ /** @var string */
18
+ public $status;
19
+
20
+ /** @var string */
21
+ public $description;
22
+
23
+ public function __construct($apiResponse)
24
+ {
25
+ $this->_initScalarProperties($apiResponse, [
26
+ 'name',
27
+ 'ascii-name',
28
+ 'status',
29
+ 'guid',
30
+ 'description',
31
+ ]);
32
+ }
33
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/HostingInfo.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Site;
5
+
6
+ class HostingInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var array */
9
+ public $properties = [];
10
+
11
+ /** @var string */
12
+ public $ipAddress;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ foreach ($apiResponse->vrt_hst->property as $property) {
17
+ $this->properties[(string) $property->name] = (string) $property->value;
18
+ }
19
+ $this->_initScalarProperties($apiResponse->vrt_hst, [
20
+ 'ip_address',
21
+ ]);
22
+ }
23
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/Info.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Site;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $guid;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'id',
18
+ 'guid',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/GeneralInfo.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\SiteAlias;
5
+
6
+ class GeneralInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $name;
10
+
11
+ /** @var string */
12
+ public $asciiName;
13
+
14
+ /** @var string */
15
+ public $status;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'name',
21
+ 'ascii-name',
22
+ 'status',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/Info.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\SiteAlias;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $status;
10
+
11
+ /** @var int */
12
+ public $id;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'id',
18
+ 'status',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Subdomain/Info.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Subdomain;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $parent;
13
+
14
+ /** @var string */
15
+ public $name;
16
+
17
+ /** @var array */
18
+ public $properties;
19
+
20
+ public function __construct($apiResponse)
21
+ {
22
+ $this->properties = [];
23
+ $this->_initScalarProperties($apiResponse, [
24
+ 'id',
25
+ 'parent',
26
+ 'name',
27
+ ]);
28
+ foreach ($apiResponse->property as $propertyInfo) {
29
+ $this->properties[(string) $propertyInfo->name] = (string) $propertyInfo->value;
30
+ }
31
+ }
32
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Ui/CustomButton.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Ui;
5
+
6
+ class CustomButton extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $id;
10
+
11
+ /** @var int */
12
+ public $sortKey;
13
+
14
+ /** @var bool */
15
+ public $public;
16
+
17
+ /** @var bool */
18
+ public $internal;
19
+
20
+ /** @var bool */
21
+ public $noFrame;
22
+
23
+ /** @var string */
24
+ public $place;
25
+
26
+ /** @var string */
27
+ public $url;
28
+
29
+ /** @var string */
30
+ public $text;
31
+
32
+ public function __construct($apiResponse)
33
+ {
34
+ $this->_initScalarProperties($apiResponse, ['id']);
35
+ $this->_initScalarProperties($apiResponse->properties, [
36
+ 'sort_key',
37
+ 'public',
38
+ 'internal',
39
+ ['noframe' => 'noFrame'],
40
+ 'place',
41
+ 'url',
42
+ 'text',
43
+ ]);
44
+ }
45
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/DiskUsage.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+ // Author: Frederic Leclercq
4
+
5
+ namespace PleskX\Api\Struct\Webspace;
6
+
7
+ class DiskUsage extends \PleskX\Api\Struct
8
+ {
9
+ /** @var int */
10
+ public $httpdocs;
11
+
12
+ /** @var int */
13
+ public $httpsdocs;
14
+
15
+ /** @var int */
16
+ public $subdomains;
17
+
18
+ /** @var int */
19
+ public $anonftp;
20
+
21
+ /** @var int */
22
+ public $logs;
23
+
24
+ /** @var int */
25
+ public $dbases;
26
+
27
+ /** @var int */
28
+ public $mailboxes;
29
+
30
+ /** @var int */
31
+ public $maillists;
32
+
33
+ /** @var int */
34
+ public $domaindumps;
35
+
36
+ /** @var int */
37
+ public $configs;
38
+
39
+ /** @var int */
40
+ public $chroot;
41
+
42
+ public function __construct($apiResponse)
43
+ {
44
+ $this->_initScalarProperties($apiResponse, [
45
+ 'httpdocs',
46
+ 'httpsdocs',
47
+ 'subdomains',
48
+ 'anonftp',
49
+ 'logs',
50
+ 'dbases',
51
+ 'mailboxes',
52
+ 'maillists',
53
+ 'domaindumps',
54
+ 'configs',
55
+ 'chroot',
56
+ ]);
57
+ }
58
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/GeneralInfo.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class GeneralInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $name;
10
+
11
+ /** @var string */
12
+ public $guid;
13
+
14
+ /** @var int */
15
+ public $realSize;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'name',
21
+ 'guid',
22
+ 'real_size',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/HostingPropertyInfo.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class HostingPropertyInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $name;
10
+
11
+ /** @var string */
12
+ public $type;
13
+
14
+ /** @var string */
15
+ public $label;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'name',
21
+ 'type',
22
+ 'label',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/Info.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class Info extends \PleskX\Api\Struct
7
+ {
8
+ /** @var int */
9
+ public $id;
10
+
11
+ /** @var string */
12
+ public $guid;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'id',
18
+ 'guid',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/Limit.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class Limit extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $name;
10
+
11
+ /** @var string */
12
+ public $value;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, [
17
+ 'name',
18
+ 'value',
19
+ ]);
20
+ }
21
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/LimitDescriptor.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class LimitDescriptor extends \PleskX\Api\Struct
7
+ {
8
+ /** @var array */
9
+ public $limits;
10
+
11
+ public function __construct($apiResponse)
12
+ {
13
+ $this->limits = [];
14
+
15
+ foreach ($apiResponse->descriptor->property as $propertyInfo) {
16
+ $this->limits[(string) $propertyInfo->name] = new LimitInfo($propertyInfo);
17
+ }
18
+ }
19
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/LimitInfo.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class LimitInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $name;
10
+
11
+ /** @var string */
12
+ public $type;
13
+
14
+ /** @var string */
15
+ public $label;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'name',
21
+ 'type',
22
+ 'label',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/Limits.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class Limits extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $overuse;
10
+
11
+ /** @var array */
12
+ public $limits;
13
+
14
+ public function __construct($apiResponse)
15
+ {
16
+ $this->_initScalarProperties($apiResponse, ['overuse']);
17
+ $this->limits = [];
18
+
19
+ foreach ($apiResponse->limit as $limit) {
20
+ $this->limits[(string) $limit->name] = new Limit($limit);
21
+ }
22
+ }
23
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/PermissionDescriptor.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class PermissionDescriptor extends \PleskX\Api\Struct
7
+ {
8
+ /** @var array */
9
+ public $permissions;
10
+
11
+ public function __construct($apiResponse)
12
+ {
13
+ $this->permissions = [];
14
+
15
+ foreach ($apiResponse->descriptor->property as $propertyInfo) {
16
+ $this->permissions[(string) $propertyInfo->name] = new PermissionInfo($propertyInfo);
17
+ }
18
+ }
19
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/PermissionInfo.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class PermissionInfo extends \PleskX\Api\Struct
7
+ {
8
+ /** @var string */
9
+ public $name;
10
+
11
+ /** @var string */
12
+ public $type;
13
+
14
+ /** @var string */
15
+ public $label;
16
+
17
+ public function __construct($apiResponse)
18
+ {
19
+ $this->_initScalarProperties($apiResponse, [
20
+ 'name',
21
+ 'type',
22
+ 'label',
23
+ ]);
24
+ }
25
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/PhpSettings.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class PhpSettings extends \PleskX\Api\Struct
7
+ {
8
+ /** @var array */
9
+ public $properties;
10
+
11
+ public function __construct($apiResponse)
12
+ {
13
+ $this->properties = [];
14
+
15
+ foreach ($apiResponse->webspace->get->result->data->{'php-settings'}->setting as $setting) {
16
+ $this->properties[(string) $setting->name] = (string) $setting->value;
17
+ }
18
+ }
19
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Webspace/PhysicalHostingDescriptor.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api\Struct\Webspace;
5
+
6
+ class PhysicalHostingDescriptor extends \PleskX\Api\Struct
7
+ {
8
+ /** @var array */
9
+ public $properties;
10
+
11
+ public function __construct($apiResponse)
12
+ {
13
+ $this->properties = [];
14
+
15
+ foreach ($apiResponse->descriptor->property as $propertyInfo) {
16
+ $this->properties[(string) $propertyInfo->name] = new HostingPropertyInfo($propertyInfo);
17
+ }
18
+ }
19
+ }
lets-encrypt/vendor/plesk/api-php-lib/src/Api/XmlResponse.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskX\Api;
5
+
6
+ /**
7
+ * XML wrapper for responses.
8
+ */
9
+ class XmlResponse extends \SimpleXMLElement
10
+ {
11
+ /**
12
+ * Retrieve value by node name.
13
+ *
14
+ * @param string $node
15
+ *
16
+ * @return string
17
+ */
18
+ public function getValue($node)
19
+ {
20
+ return (string) $this->xpath('//'.$node)[0];
21
+ }
22
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/ApiClientTest.php ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskX\Api\Client\Exception;
7
+
8
+ class ApiClientTest extends TestCase
9
+ {
10
+ public function testWrongProtocol()
11
+ {
12
+ $this->expectException(\PleskX\Api\Exception::class);
13
+ $this->expectExceptionCode(1005);
14
+
15
+ $packet = static::$_client->getPacket('100.0.0');
16
+ $packet->addChild('server')->addChild('get_protos');
17
+ static::$_client->request($packet);
18
+ }
19
+
20
+ public function testUnknownOperator()
21
+ {
22
+ $this->expectException(\PleskX\Api\Exception::class);
23
+ $this->expectExceptionCode(1014);
24
+
25
+ $packet = static::$_client->getPacket();
26
+ $packet->addChild('unknown');
27
+ static::$_client->request($packet);
28
+ }
29
+
30
+ public function testInvalidXmlRequest()
31
+ {
32
+ $this->expectException(\PleskX\Api\Exception::class);
33
+ $this->expectExceptionCode(1014);
34
+
35
+ static::$_client->request('<packet><wrongly formatted xml</packet>');
36
+ }
37
+
38
+ public function testInvalidCredentials()
39
+ {
40
+ $this->expectException(\PleskX\Api\Exception::class);
41
+ $this->expectExceptionCode(1001);
42
+
43
+ $host = static::$_client->getHost();
44
+ $port = static::$_client->getPort();
45
+ $protocol = static::$_client->getProtocol();
46
+ $client = new \PleskX\Api\Client($host, $port, $protocol);
47
+ $client->setCredentials('bad-login', 'bad-password');
48
+ $packet = static::$_client->getPacket();
49
+ $packet->addChild('server')->addChild('get_protos');
50
+ $client->request($packet);
51
+ }
52
+
53
+ public function testInvalidSecretKey()
54
+ {
55
+ $this->expectException(\PleskX\Api\Exception::class);
56
+ $this->expectExceptionCode(11003);
57
+
58
+ $host = static::$_client->getHost();
59
+ $port = static::$_client->getPort();
60
+ $protocol = static::$_client->getProtocol();
61
+ $client = new \PleskX\Api\Client($host, $port, $protocol);
62
+ $client->setSecretKey('bad-key');
63
+ $packet = static::$_client->getPacket();
64
+ $packet->addChild('server')->addChild('get_protos');
65
+ $client->request($packet);
66
+ }
67
+
68
+ public function testLatestMajorProtocol()
69
+ {
70
+ $packet = static::$_client->getPacket('1.6');
71
+ $packet->addChild('server')->addChild('get_protos');
72
+ $result = static::$_client->request($packet);
73
+ $this->assertEquals('ok', $result->status);
74
+ }
75
+
76
+ public function testLatestMinorProtocol()
77
+ {
78
+ $packet = static::$_client->getPacket('1.6.5');
79
+ $packet->addChild('server')->addChild('get_protos');
80
+ $result = static::$_client->request($packet);
81
+ $this->assertEquals('ok', $result->status);
82
+ }
83
+
84
+ public function testRequestShortSyntax()
85
+ {
86
+ $response = static::$_client->request('server.get.gen_info');
87
+ $this->assertGreaterThan(0, strlen($response->gen_info->server_name));
88
+ }
89
+
90
+ public function testOperatorPlainRequest()
91
+ {
92
+ $response = static::$_client->server()->request('get.gen_info');
93
+ $this->assertGreaterThan(0, strlen($response->gen_info->server_name));
94
+ $this->assertEquals(36, strlen($response->getValue('server_guid')));
95
+ }
96
+
97
+ public function testRequestArraySyntax()
98
+ {
99
+ $response = static::$_client->request([
100
+ 'server' => [
101
+ 'get' => [
102
+ 'gen_info' => '',
103
+ ],
104
+ ],
105
+ ]);
106
+ $this->assertGreaterThan(0, strlen($response->gen_info->server_name));
107
+ }
108
+
109
+ public function testOperatorArraySyntax()
110
+ {
111
+ $response = static::$_client->server()->request(['get' => ['gen_info' => '']]);
112
+ $this->assertGreaterThan(0, strlen($response->gen_info->server_name));
113
+ }
114
+
115
+ public function testMultiRequest()
116
+ {
117
+ $responses = static::$_client->multiRequest([
118
+ 'server.get_protos',
119
+ 'server.get.gen_info',
120
+ ]);
121
+
122
+ $this->assertCount(2, $responses);
123
+
124
+ $protos = (array) $responses[0]->protos->proto;
125
+ $generalInfo = $responses[1];
126
+
127
+ $this->assertContains('1.6.6.0', $protos);
128
+ $this->assertGreaterThan(0, strlen($generalInfo->gen_info->server_name));
129
+ }
130
+
131
+ public function testConnectionError()
132
+ {
133
+ $this->expectException(\PleskX\Api\Client\Exception::class);
134
+
135
+ $client = new \PleskX\Api\Client('invalid-host.dom');
136
+ $client->server()->getProtos();
137
+ }
138
+
139
+ public function testGetHost()
140
+ {
141
+ $client = new \PleskX\Api\Client('example.dom');
142
+ $this->assertEquals('example.dom', $client->getHost());
143
+ }
144
+
145
+ public function testGetPort()
146
+ {
147
+ $client = new \PleskX\Api\Client('example.dom', 12345);
148
+ $this->assertEquals(12345, $client->getPort());
149
+ }
150
+
151
+ public function testGetProtocol()
152
+ {
153
+ $client = new \PleskX\Api\Client('example.dom', 8880, 'http');
154
+ $this->assertEquals('http', $client->getProtocol());
155
+ }
156
+
157
+ public function testSetVerifyResponse()
158
+ {
159
+ static::$_client->setVerifyResponse(function ($xml) {
160
+ if ($xml->xpath('//proto')) {
161
+ throw new Exception('proto');
162
+ }
163
+ });
164
+
165
+ try {
166
+ static::$_client->server()->getProtos();
167
+ } catch (Exception $e) {
168
+ $this->assertEquals('proto', $e->getMessage());
169
+ } finally {
170
+ static::$_client->setVerifyResponse();
171
+ }
172
+ }
173
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/CertificateTest.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class CertificateTest extends TestCase
7
+ {
8
+ public function testGenerate()
9
+ {
10
+ $certificate = static::$_client->certificate()->generate([
11
+ 'bits' => 2048,
12
+ 'country' => 'RU',
13
+ 'state' => 'NSO',
14
+ 'location' => 'Novosibirsk',
15
+ 'company' => 'Plesk',
16
+ 'email' => 'info@plesk.com',
17
+ 'name' => 'plesk.com',
18
+ ]);
19
+ $this->assertGreaterThan(0, strlen($certificate->request));
20
+ $this->assertStringStartsWith('-----BEGIN CERTIFICATE REQUEST-----', $certificate->request);
21
+ $this->assertGreaterThan(0, strlen($certificate->privateKey));
22
+ $this->assertStringStartsWith('-----BEGIN PRIVATE KEY-----', $certificate->privateKey);
23
+ }
24
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/CustomerTest.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskXTest\Utility\KeyLimitChecker;
7
+ use PleskXTest\Utility\PasswordProvider;
8
+
9
+ class CustomerTest extends TestCase
10
+ {
11
+ private $_customerProperties;
12
+
13
+ public function setUp(): void
14
+ {
15
+ $this->_customerProperties = [
16
+ 'cname' => 'Plesk',
17
+ 'pname' => 'John Smith',
18
+ 'login' => 'john-unit-test',
19
+ 'passwd' => PasswordProvider::STRONG_PASSWORD,
20
+ 'email' => 'john@smith.com',
21
+ 'external-id' => 'link:12345',
22
+ 'description' => 'Good guy',
23
+ ];
24
+ }
25
+
26
+ public function testCreate()
27
+ {
28
+ $customer = static::$_client->customer()->create($this->_customerProperties);
29
+ $this->assertIsInt($customer->id);
30
+ $this->assertGreaterThan(0, $customer->id);
31
+
32
+ static::$_client->customer()->delete('id', $customer->id);
33
+ }
34
+
35
+ public function testDelete()
36
+ {
37
+ $customer = static::$_client->customer()->create($this->_customerProperties);
38
+ $result = static::$_client->customer()->delete('id', $customer->id);
39
+ $this->assertTrue($result);
40
+ }
41
+
42
+ public function testGet()
43
+ {
44
+ $customer = static::$_client->customer()->create($this->_customerProperties);
45
+ $customerInfo = static::$_client->customer()->get('id', $customer->id);
46
+ $this->assertEquals('Plesk', $customerInfo->company);
47
+ $this->assertEquals('John Smith', $customerInfo->personalName);
48
+ $this->assertEquals('john-unit-test', $customerInfo->login);
49
+ $this->assertEquals('john@smith.com', $customerInfo->email);
50
+ $this->assertEquals('Good guy', $customerInfo->description);
51
+ $this->assertEquals('link:12345', $customerInfo->externalId);
52
+
53
+ static::$_client->customer()->delete('id', $customer->id);
54
+ }
55
+
56
+ public function testGetAll()
57
+ {
58
+ $keyInfo = static::$_client->server()->getKeyInfo();
59
+
60
+ if (!KeyLimitChecker::checkByType($keyInfo, KeyLimitChecker::LIMIT_CLIENTS, 2)) {
61
+ $this->markTestSkipped('License does not allow to create more than 1 customer.');
62
+ }
63
+
64
+ static::$_client->customer()->create([
65
+ 'pname' => 'John Smith',
66
+ 'login' => 'customer-a',
67
+ 'passwd' => PasswordProvider::STRONG_PASSWORD,
68
+ ]);
69
+ static::$_client->customer()->create([
70
+ 'pname' => 'Mike Black',
71
+ 'login' => 'customer-b',
72
+ 'passwd' => PasswordProvider::STRONG_PASSWORD,
73
+ ]);
74
+
75
+ $customersInfo = static::$_client->customer()->getAll();
76
+ $this->assertIsArray($customersInfo);
77
+
78
+ $customersCheck = array_filter($customersInfo, function ($value) {
79
+ return $value->personalName === 'John Smith' || $value->personalName === 'Mike Black';
80
+ });
81
+ $this->assertCount(2, $customersCheck);
82
+
83
+ static::$_client->customer()->delete('login', 'customer-a');
84
+ static::$_client->customer()->delete('login', 'customer-b');
85
+ }
86
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/DatabaseServerTest.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class DatabaseServerTest extends TestCase
7
+ {
8
+ public function testGetSupportedTypes()
9
+ {
10
+ $types = static::$_client->databaseServer()->getSupportedTypes();
11
+ $this->assertGreaterThan(0, count($types));
12
+ $this->assertContains('mysql', $types);
13
+ }
14
+
15
+ public function testGet()
16
+ {
17
+ $dbServer = static::$_client->databaseServer()->get('id', 1);
18
+ $this->assertEquals('localhost', $dbServer->host);
19
+ $this->assertGreaterThan(0, $dbServer->port);
20
+ }
21
+
22
+ public function testGetAll()
23
+ {
24
+ $dbServers = static::$_client->databaseServer()->getAll();
25
+ $this->assertIsArray($dbServers);
26
+ $this->assertGreaterThan(0, count($dbServers));
27
+ $this->assertEquals('localhost', $dbServers[0]->host);
28
+ }
29
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/DatabaseTest.php ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskXTest\Utility\PasswordProvider;
7
+
8
+ class DatabaseTest extends TestCase
9
+ {
10
+ /** @var \PleskX\Api\Struct\Webspace\Info */
11
+ private static $webspace;
12
+
13
+ public static function setUpBeforeClass(): void
14
+ {
15
+ parent::setUpBeforeClass();
16
+ static::$webspace = static::_createWebspace();
17
+ }
18
+
19
+ public function testCreate()
20
+ {
21
+ $database = $this->_createDatabase([
22
+ 'webspace-id' => static::$webspace->id,
23
+ 'name' => 'test1',
24
+ 'type' => 'mysql',
25
+ 'db-server-id' => 1,
26
+ ]);
27
+ static::$_client->database()->delete('id', $database->id);
28
+ }
29
+
30
+ public function testCreateUser()
31
+ {
32
+ $database = $this->_createDatabase([
33
+ 'webspace-id' => static::$webspace->id,
34
+ 'name' => 'test1',
35
+ 'type' => 'mysql',
36
+ 'db-server-id' => 1,
37
+ ]);
38
+ $user = $this->_createUser([
39
+ 'db-id' => $database->id,
40
+ 'login' => 'test_user1',
41
+ 'password' => PasswordProvider::STRONG_PASSWORD,
42
+ ]);
43
+ static::$_client->database()->deleteUser('id', $user->id);
44
+ static::$_client->database()->delete('id', $database->id);
45
+ }
46
+
47
+ public function testUpdateUser()
48
+ {
49
+ $database = $this->_createDatabase([
50
+ 'webspace-id' => static::$webspace->id,
51
+ 'name' => 'test1',
52
+ 'type' => 'mysql',
53
+ 'db-server-id' => 1,
54
+ ]);
55
+ $user = $this->_createUser([
56
+ 'db-id' => $database->id,
57
+ 'login' => 'test_user1',
58
+ 'password' => PasswordProvider::STRONG_PASSWORD,
59
+ ]);
60
+ $updatedUser = static::$_client->database()->updateUser([
61
+ 'id' => $user->id,
62
+ 'login' => 'test_user2',
63
+ 'password' => PasswordProvider::STRONG_PASSWORD,
64
+ ]);
65
+ $this->assertEquals(true, $updatedUser);
66
+ static::$_client->database()->deleteUser('id', $user->id);
67
+ static::$_client->database()->delete('id', $database->id);
68
+ }
69
+
70
+ public function testGetById()
71
+ {
72
+ $database = $this->_createDatabase([
73
+ 'webspace-id' => static::$webspace->id,
74
+ 'name' => 'test1',
75
+ 'type' => 'mysql',
76
+ 'db-server-id' => 1,
77
+ ]);
78
+
79
+ $db = static::$_client->database()->get('id', $database->id);
80
+ $this->assertEquals('test1', $db->name);
81
+ $this->assertEquals('mysql', $db->type);
82
+ $this->assertEquals(static::$webspace->id, $db->webspaceId);
83
+ $this->assertEquals(1, $db->dbServerId);
84
+
85
+ static::$_client->database()->delete('id', $database->id);
86
+ }
87
+
88
+ public function testGetAllByWebspaceId()
89
+ {
90
+ $db1 = $this->_createDatabase([
91
+ 'webspace-id' => static::$webspace->id,
92
+ 'name' => 'test1',
93
+ 'type' => 'mysql',
94
+ 'db-server-id' => 1,
95
+ ]);
96
+ $db2 = $this->_createDatabase([
97
+ 'webspace-id' => static::$webspace->id,
98
+ 'name' => 'test2',
99
+ 'type' => 'mysql',
100
+ 'db-server-id' => 1,
101
+ ]);
102
+ $databases = static::$_client->database()->getAll('webspace-id', static::$webspace->id);
103
+ $this->assertEquals('test1', $databases[0]->name);
104
+ $this->assertEquals('test2', $databases[1]->name);
105
+ $this->assertEquals(static::$webspace->id, $databases[0]->webspaceId);
106
+ $this->assertEquals(1, $databases[1]->dbServerId);
107
+
108
+ static::$_client->database()->delete('id', $db1->id);
109
+ static::$_client->database()->delete('id', $db2->id);
110
+ }
111
+
112
+ public function testGetUserById()
113
+ {
114
+ $database = $this->_createDatabase([
115
+ 'webspace-id' => static::$webspace->id,
116
+ 'name' => 'test1',
117
+ 'type' => 'mysql',
118
+ 'db-server-id' => 1,
119
+ ]);
120
+
121
+ $user = $this->_createUser([
122
+ 'db-id' => $database->id,
123
+ 'login' => 'test_user1',
124
+ 'password' => PasswordProvider::STRONG_PASSWORD,
125
+ ]);
126
+
127
+ $dbUser = static::$_client->database()->getUser('id', $user->id);
128
+ $this->assertEquals('test_user1', $dbUser->login);
129
+ $this->assertEquals($database->id, $dbUser->dbId);
130
+
131
+ static::$_client->database()->deleteUser('id', $user->id);
132
+ static::$_client->database()->delete('id', $database->id);
133
+ }
134
+
135
+ public function testGetAllUsersByDbId()
136
+ {
137
+ $db1 = $this->_createDatabase([
138
+ 'webspace-id' => static::$webspace->id,
139
+ 'name' => 'test1',
140
+ 'type' => 'mysql',
141
+ 'db-server-id' => 1,
142
+ ]);
143
+ $db2 = $this->_createDatabase([
144
+ 'webspace-id' => static::$webspace->id,
145
+ 'name' => 'test2',
146
+ 'type' => 'mysql',
147
+ 'db-server-id' => 1,
148
+ ]);
149
+ $user1 = $this->_createUser([
150
+ 'db-id' => $db1->id,
151
+ 'login' => 'test_user1',
152
+ 'password' => PasswordProvider::STRONG_PASSWORD,
153
+ ]);
154
+
155
+ $user2 = $this->_createUser([
156
+ 'db-id' => $db1->id,
157
+ 'login' => 'test_user2',
158
+ 'password' => PasswordProvider::STRONG_PASSWORD,
159
+ ]);
160
+
161
+ $user3 = $this->_createUser([
162
+ 'db-id' => $db2->id,
163
+ 'login' => 'test_user3',
164
+ 'password' => PasswordProvider::STRONG_PASSWORD,
165
+ ]);
166
+
167
+ $dbUsers = static::$_client->database()->getAllUsers('db-id', $db1->id);
168
+ $this->assertEquals(2, count($dbUsers));
169
+ $this->assertEquals('test_user1', $dbUsers[0]->login);
170
+ $this->assertEquals('test_user2', $dbUsers[1]->login);
171
+
172
+ static::$_client->database()->deleteUser('id', $user1->id);
173
+ static::$_client->database()->deleteUser('id', $user2->id);
174
+ static::$_client->database()->deleteUser('id', $user3->id);
175
+ static::$_client->database()->delete('id', $db1->id);
176
+ static::$_client->database()->delete('id', $db2->id);
177
+ }
178
+
179
+ public function testDelete()
180
+ {
181
+ $database = $this->_createDatabase([
182
+ 'webspace-id' => static::$webspace->id,
183
+ 'name' => 'test1',
184
+ 'type' => 'mysql',
185
+ 'db-server-id' => 1,
186
+ ]);
187
+ $result = static::$_client->database()->delete('id', $database->id);
188
+ $this->assertTrue($result);
189
+ }
190
+
191
+ public function testDeleteUser()
192
+ {
193
+ $database = $this->_createDatabase([
194
+ 'webspace-id' => static::$webspace->id,
195
+ 'name' => 'test1',
196
+ 'type' => 'mysql',
197
+ 'db-server-id' => 1,
198
+ ]);
199
+ $user = $this->_createUser([
200
+ 'db-id' => $database->id,
201
+ 'login' => 'test_user1',
202
+ 'password' => PasswordProvider::STRONG_PASSWORD,
203
+ ]);
204
+
205
+ $result = static::$_client->database()->deleteUser('id', $user->id);
206
+ $this->assertTrue($result);
207
+ static::$_client->database()->delete('id', $database->id);
208
+ }
209
+
210
+ /**
211
+ * @param array $params
212
+ *
213
+ * @return \PleskX\Api\Struct\Database\Info
214
+ */
215
+ private function _createDatabase(array $params)
216
+ {
217
+ $database = static::$_client->database()->create($params);
218
+ $this->assertIsInt($database->id);
219
+ $this->assertGreaterThan(0, $database->id);
220
+
221
+ return $database;
222
+ }
223
+
224
+ /**
225
+ * @param array $params
226
+ *
227
+ * @return \PleskX\Api\Struct\Database\UserInfo
228
+ */
229
+ private function _createUser(array $params)
230
+ {
231
+ $user = static::$_client->database()->createUser($params);
232
+ $this->assertIsInt($user->id);
233
+ $this->assertGreaterThan(0, $user->id);
234
+
235
+ return $user;
236
+ }
237
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/DnsTemplateTest.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class DnsTemplateTest extends TestCase
7
+ {
8
+ /**
9
+ * @var bool
10
+ */
11
+ private static $_isDnsSupported;
12
+
13
+ public static function setUpBeforeClass(): void
14
+ {
15
+ parent::setUpBeforeClass();
16
+
17
+ $serviceStates = static::$_client->server()->getServiceStates();
18
+ static::$_isDnsSupported = $serviceStates['dns'] && ('running' == $serviceStates['dns']['state']);
19
+ }
20
+
21
+ protected function setUp(): void
22
+ {
23
+ parent::setUp();
24
+
25
+ if (!static::$_isDnsSupported) {
26
+ $this->markTestSkipped('DNS system is not supported.');
27
+ }
28
+ }
29
+
30
+ public function testCreate()
31
+ {
32
+ $dns = static::$_client->dnsTemplate()->create([
33
+ 'type' => 'TXT',
34
+ 'host' => 'test.create',
35
+ 'value' => 'value',
36
+ ]);
37
+ $this->assertIsInt($dns->id);
38
+ $this->assertGreaterThan(0, $dns->id);
39
+ $this->assertEquals(0, $dns->siteId);
40
+ $this->assertEquals(0, $dns->siteAliasId);
41
+ static::$_client->dnsTemplate()->delete('id', $dns->id);
42
+ }
43
+
44
+ public function testGetById()
45
+ {
46
+ $dns = static::$_client->dnsTemplate()->create([
47
+ 'type' => 'TXT',
48
+ 'host' => 'test.get.by.id',
49
+ 'value' => 'value',
50
+ ]);
51
+
52
+ $dnsInfo = static::$_client->dnsTemplate()->get('id', $dns->id);
53
+ $this->assertEquals('TXT', $dnsInfo->type);
54
+ $this->assertEquals('value', $dnsInfo->value);
55
+
56
+ static::$_client->dnsTemplate()->delete('id', $dns->id);
57
+ }
58
+
59
+ public function testGetAll()
60
+ {
61
+ $dns = static::$_client->dnsTemplate()->create([
62
+ 'type' => 'TXT',
63
+ 'host' => 'test.get.all',
64
+ 'value' => 'value',
65
+ ]);
66
+ $dns2 = static::$_client->dnsTemplate()->create([
67
+ 'type' => 'TXT',
68
+ 'host' => 'test.get.all',
69
+ 'value' => 'value2',
70
+ ]);
71
+ $dnsInfo = static::$_client->dnsTemplate()->getAll();
72
+ $dsRecords = [];
73
+ foreach ($dnsInfo as $dnsRec) {
74
+ if ('TXT' === $dnsRec->type && 0 === strpos($dnsRec->host, 'test.get.all')) {
75
+ $dsRecords[] = $dnsRec;
76
+ }
77
+ }
78
+ $this->assertCount(2, $dsRecords);
79
+
80
+ static::$_client->dnsTemplate()->delete('id', $dns->id);
81
+ static::$_client->dnsTemplate()->delete('id', $dns2->id);
82
+ }
83
+
84
+ public function testDelete()
85
+ {
86
+ $dns = static::$_client->dnsTemplate()->create([
87
+ 'type' => 'TXT',
88
+ 'host' => 'test.delete',
89
+ 'value' => 'value',
90
+ ]);
91
+ $result = static::$_client->dnsTemplate()->delete('id', $dns->id);
92
+ $this->assertTrue($result);
93
+ }
94
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/DnsTest.php ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class DnsTest extends TestCase
7
+ {
8
+ /** @var \PleskX\Api\Struct\Webspace\Info */
9
+ private static $webspace;
10
+
11
+ private static $isDnsSupported;
12
+
13
+ public static function setUpBeforeClass(): void
14
+ {
15
+ parent::setUpBeforeClass();
16
+
17
+ $serviceStates = static::$_client->server()->getServiceStates();
18
+ static::$isDnsSupported = isset($serviceStates['dns']) && ('running' == $serviceStates['dns']['state']);
19
+
20
+ if (static::$isDnsSupported) {
21
+ static::$webspace = static::_createWebspace();
22
+ }
23
+ }
24
+
25
+ protected function setUp(): void
26
+ {
27
+ parent::setUp();
28
+
29
+ if (!static::$isDnsSupported) {
30
+ $this->markTestSkipped('DNS system is not supported.');
31
+ }
32
+ }
33
+
34
+ public function testCreate()
35
+ {
36
+ $dns = static::$_client->dns()->create([
37
+ 'site-id' => static::$webspace->id,
38
+ 'type' => 'TXT',
39
+ 'host' => 'host',
40
+ 'value' => 'value',
41
+ ]);
42
+ $this->assertIsInt($dns->id);
43
+ $this->assertGreaterThan(0, $dns->id);
44
+ static::$_client->dns()->delete('id', $dns->id);
45
+ }
46
+
47
+ /**
48
+ * @return \PleskX\Api\XmlResponse[]
49
+ */
50
+ public function testBulkCreate()
51
+ {
52
+ $response = static::$_client->dns()->bulkCreate([
53
+ [
54
+ 'site-id' => static::$webspace->id,
55
+ 'type' => 'TXT',
56
+ 'host' => 'host',
57
+ 'value' => 'value',
58
+ ],
59
+ [
60
+ 'site-id' => static::$webspace->id,
61
+ 'type' => 'A',
62
+ 'host' => 'host',
63
+ 'value' => '1.1.1.1',
64
+ ],
65
+ [
66
+ 'site-id' => static::$webspace->id,
67
+ 'type' => 'MX',
68
+ 'host' => 'custom-mail',
69
+ 'value' => '1.1.1.1',
70
+ 'opt' => '10',
71
+ ],
72
+ ]);
73
+
74
+ $this->assertCount(3, $response);
75
+
76
+ foreach ($response as $xml) {
77
+ $this->assertEquals('ok', (string) $xml->status);
78
+ $this->assertGreaterThan(0, (int) $xml->id);
79
+ }
80
+
81
+ return $response;
82
+ }
83
+
84
+ /**
85
+ * @depends testBulkCreate
86
+ *
87
+ * @param \PleskX\Api\XmlResponse[] $createdRecords
88
+ */
89
+ public function testBulkDelete(array $createdRecords)
90
+ {
91
+ $createdRecordIds = array_map(function ($record) {
92
+ return (int) $record->id;
93
+ }, $createdRecords);
94
+
95
+ $response = static::$_client->dns()->bulkDelete($createdRecordIds);
96
+
97
+ $this->assertCount(3, $response);
98
+
99
+ foreach ($response as $xml) {
100
+ $this->assertEquals('ok', (string) $xml->status);
101
+ $this->assertGreaterThan(0, (int) $xml->id);
102
+ }
103
+ }
104
+
105
+ public function testGetById()
106
+ {
107
+ $dns = static::$_client->dns()->create([
108
+ 'site-id' => static::$webspace->id,
109
+ 'type' => 'TXT',
110
+ 'host' => '',
111
+ 'value' => 'value',
112
+ ]);
113
+
114
+ $dnsInfo = static::$_client->dns()->get('id', $dns->id);
115
+ $this->assertEquals('TXT', $dnsInfo->type);
116
+ $this->assertEquals(static::$webspace->id, $dnsInfo->siteId);
117
+ $this->assertEquals('value', $dnsInfo->value);
118
+
119
+ static::$_client->dns()->delete('id', $dns->id);
120
+ }
121
+
122
+ public function testGetAllByWebspaceId()
123
+ {
124
+ $dns = static::$_client->dns()->create([
125
+ 'site-id' => static::$webspace->id,
126
+ 'type' => 'DS',
127
+ 'host' => '',
128
+ 'value' => '60485 5 1 2BB183AF5F22588179A53B0A98631FAD1A292118',
129
+ ]);
130
+ $dns2 = static::$_client->dns()->create([
131
+ 'site-id' => static::$webspace->id,
132
+ 'type' => 'DS',
133
+ 'host' => '',
134
+ 'value' => '60485 5 1 2BB183AF5F22588179A53B0A98631FAD1A292119',
135
+ ]);
136
+ $dnsInfo = static::$_client->dns()->getAll('site-id', static::$webspace->id);
137
+ $dsRecords = [];
138
+ foreach ($dnsInfo as $dnsRec) {
139
+ if ('DS' == $dnsRec->type) {
140
+ $dsRecords[] = $dnsRec;
141
+ }
142
+ }
143
+ $this->assertEquals(2, count($dsRecords));
144
+ foreach ($dsRecords as $dsRecord) {
145
+ $this->assertEquals(static::$webspace->id, $dsRecord->siteId);
146
+ }
147
+
148
+ static::$_client->dns()->delete('id', $dns->id);
149
+ static::$_client->dns()->delete('id', $dns2->id);
150
+ }
151
+
152
+ public function testDelete()
153
+ {
154
+ $dns = static::$_client->dns()->create([
155
+ 'site-id' => static::$webspace->id,
156
+ 'type' => 'TXT',
157
+ 'host' => 'host',
158
+ 'value' => 'value',
159
+ ]);
160
+ $result = static::$_client->dns()->delete('id', $dns->id);
161
+ $this->assertTrue($result);
162
+ }
163
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/EventLogTest.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class EventLogTest extends TestCase
7
+ {
8
+ public function testGet()
9
+ {
10
+ $events = static::$_client->eventLog()->get();
11
+ $this->assertGreaterThan(0, $events);
12
+
13
+ $event = reset($events);
14
+ $this->assertGreaterThan(0, $event->time);
15
+ }
16
+
17
+ public function testGetDetailedLog()
18
+ {
19
+ $events = static::$_client->eventLog()->getDetailedLog();
20
+ $this->assertGreaterThan(0, $events);
21
+
22
+ $event = reset($events);
23
+ $this->assertGreaterThan(0, $event->time);
24
+ }
25
+
26
+ public function testGetLastId()
27
+ {
28
+ $lastId = static::$_client->eventLog()->getLastId();
29
+ $this->assertGreaterThan(0, $lastId);
30
+ }
31
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/IpTest.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class IpTest extends TestCase
7
+ {
8
+ public function testGet()
9
+ {
10
+ $ips = static::$_client->ip()->get();
11
+ $this->assertGreaterThan(0, count($ips));
12
+
13
+ $ip = reset($ips);
14
+ $this->assertMatchesRegularExpression('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $ip->ipAddress);
15
+ }
16
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/LocaleTest.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class LocaleTest extends TestCase
7
+ {
8
+ public function testGet()
9
+ {
10
+ $locales = static::$_client->locale()->get();
11
+ $this->assertGreaterThan(0, count($locales));
12
+
13
+ $locale = $locales['en-US'];
14
+ $this->assertEquals('en-US', $locale->id);
15
+ }
16
+
17
+ public function testGetById()
18
+ {
19
+ $locale = static::$_client->locale()->get('en-US');
20
+ $this->assertEquals('en-US', $locale->id);
21
+ }
22
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/MailTest.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskXTest\Utility\PasswordProvider;
7
+
8
+ class MailTest extends TestCase
9
+ {
10
+ /** @var \PleskX\Api\Struct\Webspace\Info */
11
+ private static $webspace;
12
+
13
+ /**
14
+ * @var bool
15
+ */
16
+ private static $isMailSupported;
17
+
18
+ public static function setUpBeforeClass(): void
19
+ {
20
+ parent::setUpBeforeClass();
21
+
22
+ $serviceStates = static::$_client->server()->getServiceStates();
23
+ static::$isMailSupported = isset($serviceStates['smtp']) && ('running' == $serviceStates['smtp']['state']);
24
+
25
+ if (static::$isMailSupported) {
26
+ static::$webspace = static::_createWebspace();
27
+ }
28
+ }
29
+
30
+ protected function setUp(): void
31
+ {
32
+ parent::setUp();
33
+
34
+ if (!static::$isMailSupported) {
35
+ $this->markTestSkipped('Mail system is not supported.');
36
+ }
37
+ }
38
+
39
+ public function testCreate()
40
+ {
41
+ $mailname = static::$_client->mail()->create('test', static::$webspace->id, true, PasswordProvider::STRONG_PASSWORD);
42
+
43
+ $this->assertIsInt($mailname->id);
44
+ $this->assertGreaterThan(0, $mailname->id);
45
+ $this->assertEquals('test', $mailname->name);
46
+
47
+ static::$_client->mail()->delete('name', $mailname->name, static::$webspace->id);
48
+ }
49
+
50
+ public function testDelete()
51
+ {
52
+ $mailname = static::$_client->mail()->create('test', static::$webspace->id);
53
+
54
+ $result = static::$_client->mail()->delete('name', $mailname->name, static::$webspace->id);
55
+ $this->assertTrue($result);
56
+ }
57
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/PhpHandlerTest.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class PhpHandlerTest extends TestCase
7
+ {
8
+ public function testGet()
9
+ {
10
+ $handler = static::$_client->phpHandler()->get(null, null);
11
+
12
+ $this->assertIsObject($handler);
13
+ $this->assertObjectHasAttribute('type', $handler);
14
+ }
15
+
16
+ public function testGetAll()
17
+ {
18
+ $handlers = static::$_client->phpHandler()->getAll();
19
+
20
+ $this->assertIsArray($handlers);
21
+ $this->assertNotEmpty($handlers);
22
+
23
+ $handler = current($handlers);
24
+
25
+ $this->assertIsObject($handler);
26
+ $this->assertObjectHasAttribute('type', $handler);
27
+ }
28
+
29
+ public function testGetUnknownHandlerThrowsException()
30
+ {
31
+ $this->expectException(\PleskX\Api\Exception::class);
32
+ $this->expectExceptionMessage('Php handler does not exists');
33
+
34
+ static::$_client->phpHandler()->get('id', 'this-handler-does-not-exist');
35
+ }
36
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/ProtectedDirectoryTest.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskXTest\Utility\PasswordProvider;
7
+
8
+ class ProtectedDirectoryTest extends TestCase
9
+ {
10
+ /** @var \PleskX\Api\Struct\Webspace\Info */
11
+ private static $webspace;
12
+
13
+ public static function setUpBeforeClass(): void
14
+ {
15
+ parent::setUpBeforeClass();
16
+ static::$webspace = static::_createWebspace();
17
+ }
18
+
19
+ public function testAdd()
20
+ {
21
+ $protectedDirectory = static::$_client->protectedDirectory()->add('/', static::$webspace->id);
22
+
23
+ $this->assertIsObject($protectedDirectory);
24
+ $this->assertGreaterThan(0, $protectedDirectory->id);
25
+
26
+ static::$_client->protectedDirectory()->delete('id', $protectedDirectory->id);
27
+ }
28
+
29
+ public function testAddInvalidDirectory()
30
+ {
31
+ $this->expectException(\PleskX\Api\Exception::class);
32
+ $this->expectExceptionCode(1019);
33
+
34
+ static::$_client->protectedDirectory()->add('', static::$webspace->id);
35
+ }
36
+
37
+ public function testDelete()
38
+ {
39
+ $protectedDirectory = static::$_client->protectedDirectory()->add('/', static::$webspace->id);
40
+
41
+ $result = static::$_client->protectedDirectory()->delete('id', $protectedDirectory->id);
42
+ $this->assertTrue($result);
43
+ }
44
+
45
+ public function testGetById()
46
+ {
47
+ $protectedDirectory = static::$_client->protectedDirectory()->add('test', static::$webspace->id);
48
+
49
+ $foundDirectory = static::$_client->protectedDirectory()->get('id', $protectedDirectory->id);
50
+ $this->assertEquals('test', $foundDirectory->name);
51
+
52
+ static::$_client->protectedDirectory()->delete('id', $protectedDirectory->id);
53
+ }
54
+
55
+ public function testGetUnknownDirectory()
56
+ {
57
+ $this->expectException(\PleskX\Api\Exception::class);
58
+ $this->expectExceptionCode(1013);
59
+
60
+ $nonExistentDirectoryId = 99999999;
61
+ static::$_client->protectedDirectory()->get('id', $nonExistentDirectoryId);
62
+ }
63
+
64
+ public function testAddUser()
65
+ {
66
+ $protectedDirectory = static::$_client->protectedDirectory()->add('/', static::$webspace->id);
67
+
68
+ $user = static::$_client->protectedDirectory()->addUser($protectedDirectory, 'john', PasswordProvider::STRONG_PASSWORD);
69
+ $this->assertGreaterThan(0, $user->id);
70
+
71
+ static::$_client->protectedDirectory()->delete('id', $protectedDirectory->id);
72
+ }
73
+
74
+ public function testDeleteUser()
75
+ {
76
+ $protectedDirectory = static::$_client->protectedDirectory()->add('/', static::$webspace->id);
77
+
78
+ $user = static::$_client->protectedDirectory()->addUser($protectedDirectory, 'john', PasswordProvider::STRONG_PASSWORD);
79
+ $result = static::$_client->protectedDirectory()->deleteUser('id', $user->id);
80
+ $this->assertTrue($result);
81
+
82
+ static::$_client->protectedDirectory()->delete('id', $protectedDirectory->id);
83
+ }
84
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/ResellerTest.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskXTest\Utility\KeyLimitChecker;
7
+ use PleskXTest\Utility\PasswordProvider;
8
+
9
+ class ResellerTest extends TestCase
10
+ {
11
+ private $_resellerProperties;
12
+
13
+ public function setUp(): void
14
+ {
15
+ $this->_resellerProperties = [
16
+ 'pname' => 'John Reseller',
17
+ 'login' => 'reseller-unit-test',
18
+ 'passwd' => PasswordProvider::STRONG_PASSWORD,
19
+ ];
20
+ }
21
+
22
+ public function testCreate()
23
+ {
24
+ $reseller = static::$_client->reseller()->create($this->_resellerProperties);
25
+ $this->assertIsInt($reseller->id);
26
+ $this->assertGreaterThan(0, $reseller->id);
27
+
28
+ static::$_client->reseller()->delete('id', $reseller->id);
29
+ }
30
+
31
+ public function testDelete()
32
+ {
33
+ $reseller = static::$_client->reseller()->create($this->_resellerProperties);
34
+ $result = static::$_client->reseller()->delete('id', $reseller->id);
35
+ $this->assertTrue($result);
36
+ }
37
+
38
+ public function testGet()
39
+ {
40
+ $reseller = static::$_client->reseller()->create($this->_resellerProperties);
41
+ $resellerInfo = static::$_client->reseller()->get('id', $reseller->id);
42
+ $this->assertEquals('John Reseller', $resellerInfo->personalName);
43
+ $this->assertEquals('reseller-unit-test', $resellerInfo->login);
44
+ $this->assertGreaterThan(0, count($resellerInfo->permissions));
45
+
46
+ static::$_client->reseller()->delete('id', $reseller->id);
47
+ }
48
+
49
+ public function testGetAll()
50
+ {
51
+ $keyInfo = static::$_client->server()->getKeyInfo();
52
+
53
+ if (!KeyLimitChecker::checkByType($keyInfo, KeyLimitChecker::LIMIT_RESELLERS, 2)) {
54
+ $this->markTestSkipped('License does not allow to create more than 1 reseller.');
55
+ }
56
+
57
+ static::$_client->reseller()->create([
58
+ 'pname' => 'John Reseller',
59
+ 'login' => 'reseller-a',
60
+ 'passwd' => PasswordProvider::STRONG_PASSWORD,
61
+ ]);
62
+ static::$_client->reseller()->create([
63
+ 'pname' => 'Mike Reseller',
64
+ 'login' => 'reseller-b',
65
+ 'passwd' => PasswordProvider::STRONG_PASSWORD,
66
+ ]);
67
+
68
+ $resellersInfo = static::$_client->reseller()->getAll();
69
+ $this->assertCount(2, $resellersInfo);
70
+ $this->assertEquals('John Reseller', $resellersInfo[0]->personalName);
71
+ $this->assertEquals('reseller-a', $resellersInfo[0]->login);
72
+
73
+ static::$_client->reseller()->delete('login', 'reseller-a');
74
+ static::$_client->reseller()->delete('login', 'reseller-b');
75
+ }
76
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/SecretKeyTest.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskX\Api\Exception;
7
+
8
+ class SecretKeyTest extends TestCase
9
+ {
10
+ public function testCreate()
11
+ {
12
+ $keyId = static::$_client->secretKey()->create('192.168.0.1');
13
+ $this->assertMatchesRegularExpression('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/', $keyId);
14
+ static::$_client->secretKey()->delete($keyId);
15
+ }
16
+
17
+ public function testGet()
18
+ {
19
+ $keyId = static::$_client->secretKey()->create('192.168.0.1');
20
+ $keyInfo = static::$_client->secretKey()->get($keyId);
21
+
22
+ $this->assertNotEmpty($keyInfo->key);
23
+ $this->assertEquals('192.168.0.1', $keyInfo->ipAddress);
24
+ $this->assertEquals('admin', $keyInfo->login);
25
+
26
+ static::$_client->secretKey()->delete($keyId);
27
+ }
28
+
29
+ public function testGetAll()
30
+ {
31
+ $keyIds = [];
32
+ $keyIds[] = static::$_client->secretKey()->create('192.168.0.1');
33
+ $keyIds[] = static::$_client->secretKey()->create('192.168.0.2');
34
+
35
+ $keys = static::$_client->secretKey()->getAll();
36
+ $this->assertGreaterThanOrEqual(2, count($keys));
37
+
38
+ $keyIpAddresses = array_map(function ($key) {
39
+ return $key->ipAddress;
40
+ }, $keys);
41
+ $this->assertContains('192.168.0.1', $keyIpAddresses);
42
+ $this->assertContains('192.168.0.2', $keyIpAddresses);
43
+
44
+ foreach ($keyIds as $keyId) {
45
+ static::$_client->secretKey()->delete($keyId);
46
+ }
47
+ }
48
+
49
+ public function testDelete()
50
+ {
51
+ $keyId = static::$_client->secretKey()->create('192.168.0.1');
52
+ static::$_client->secretKey()->delete($keyId);
53
+
54
+ try {
55
+ static::$_client->secretKey()->get($keyId);
56
+ $this->fail("Secret key $keyId was not deleted.");
57
+ } catch (Exception $exception) {
58
+ $this->assertEquals(1013, $exception->getCode());
59
+ }
60
+ }
61
+
62
+ public function testListEmpty()
63
+ {
64
+ $keys = static::$_client->secretKey()->getAll();
65
+ foreach ($keys as $key) {
66
+ static::$_client->secretKey()->delete($key->key);
67
+ }
68
+
69
+ $keys = static::$_client->secretKey()->getAll();
70
+ $this->assertEquals(0, count($keys));
71
+ }
72
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/ServerTest.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class ServerTest extends TestCase
7
+ {
8
+ public function testGetProtos()
9
+ {
10
+ $protos = static::$_client->server()->getProtos();
11
+ $this->assertIsArray($protos);
12
+ $this->assertContains('1.6.3.0', $protos);
13
+ }
14
+
15
+ public function testGetGenInfo()
16
+ {
17
+ $generalInfo = static::$_client->server()->getGeneralInfo();
18
+ $this->assertGreaterThan(0, strlen($generalInfo->serverName));
19
+ $this->assertMatchesRegularExpression('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/', strtolower($generalInfo->serverGuid));
20
+ $this->assertEquals('standard', $generalInfo->mode);
21
+ }
22
+
23
+ public function testGetPreferences()
24
+ {
25
+ $preferences = static::$_client->server()->getPreferences();
26
+ $this->assertIsNumeric($preferences->statTtl);
27
+ $this->assertGreaterThan(0, $preferences->statTtl);
28
+ $this->assertEquals(0, $preferences->restartApacheInterval);
29
+ }
30
+
31
+ public function testGetAdmin()
32
+ {
33
+ $admin = static::$_client->server()->getAdmin();
34
+ $this->assertGreaterThan(0, strlen($admin->name));
35
+ $this->assertStringContainsString('@', $admin->email);
36
+ }
37
+
38
+ public function testGetKeyInfo()
39
+ {
40
+ $keyInfo = static::$_client->server()->getKeyInfo();
41
+ $this->assertIsArray($keyInfo);
42
+ $this->assertGreaterThan(0, count($keyInfo));
43
+ $this->assertArrayHasKey('plesk_key_id', $keyInfo);
44
+ $this->assertArrayHasKey('lim_date', $keyInfo);
45
+ }
46
+
47
+ public function testGetComponents()
48
+ {
49
+ $components = static::$_client->server()->getComponents();
50
+ $this->assertIsArray($components);
51
+ $this->assertGreaterThan(0, count($components));
52
+ $this->assertArrayHasKey('psa', $components);
53
+ }
54
+
55
+ public function testGetServiceStates()
56
+ {
57
+ $serviceStates = static::$_client->server()->getServiceStates();
58
+
59
+ $this->assertIsArray($serviceStates);
60
+ $this->assertGreaterThan(0, count($serviceStates));
61
+
62
+ $service = current($serviceStates);
63
+ $this->assertIsArray($service);
64
+ $this->assertArrayHasKey('id', $service);
65
+ $this->assertArrayHasKey('title', $service);
66
+ $this->assertArrayHasKey('state', $service);
67
+ }
68
+
69
+ public function testGetSessionPreferences()
70
+ {
71
+ $preferences = static::$_client->server()->getSessionPreferences();
72
+ $this->assertIsNumeric($preferences->loginTimeout);
73
+ $this->assertGreaterThan(0, $preferences->loginTimeout);
74
+ }
75
+
76
+ public function testGetShells()
77
+ {
78
+ $shells = static::$_client->server()->getShells();
79
+
80
+ $this->assertIsArray($shells);
81
+ $this->assertGreaterThan(0, count($shells));
82
+ }
83
+
84
+ public function testGetNetworkInterfaces()
85
+ {
86
+ $netInterfaces = static::$_client->server()->getNetworkInterfaces();
87
+ $this->assertIsArray($netInterfaces);
88
+ $this->assertGreaterThan(0, count($netInterfaces));
89
+ }
90
+
91
+ public function testGetStatistics()
92
+ {
93
+ $stats = static::$_client->server()->getStatistics();
94
+ $this->assertIsNumeric($stats->objects->clients);
95
+ $this->assertEquals('psa', $stats->version->internalName);
96
+ }
97
+
98
+ public function testGetSiteIsolationConfig()
99
+ {
100
+ $config = static::$_client->server()->getSiteIsolationConfig();
101
+ $this->assertIsArray($config);
102
+ $this->assertGreaterThan(0, count($config));
103
+ $this->assertArrayHasKey('php', $config);
104
+ }
105
+
106
+ public function testGetUpdatesInfo()
107
+ {
108
+ $updatesInfo = static::$_client->server()->getUpdatesInfo();
109
+ $this->assertIsBool($updatesInfo->installUpdatesAutomatically);
110
+ }
111
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/ServicePlanTest.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class ServicePlanTest extends TestCase
7
+ {
8
+ public function testGet()
9
+ {
10
+ $servicePlan = static::$_client->servicePlan()->get('name', 'Default Domain');
11
+ $this->assertEquals('Default Domain', $servicePlan->name);
12
+ $this->assertGreaterThan(0, $servicePlan->id);
13
+ }
14
+
15
+ public function testGetAll()
16
+ {
17
+ $servicePlans = static::$_client->servicePlan()->getAll();
18
+ $this->assertIsArray($servicePlans);
19
+ $this->assertGreaterThan(0, count($servicePlans));
20
+ $this->assertNotEmpty($servicePlans[0]->name);
21
+ }
22
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/SessionTest.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class SessionTest extends TestCase
7
+ {
8
+ public function testGet()
9
+ {
10
+ $sessionId = static::$_client->server()->createSession('admin', '127.0.0.1');
11
+ $sessions = static::$_client->session()->get();
12
+ $this->assertArrayHasKey($sessionId, $sessions);
13
+
14
+ $sessionInfo = $sessions[$sessionId];
15
+ $this->assertEquals('admin', $sessionInfo->login);
16
+ $this->assertEquals('127.0.0.1', $sessionInfo->ipAddress);
17
+ $this->assertEquals($sessionId, $sessionInfo->id);
18
+ }
19
+
20
+ public function testTerminate()
21
+ {
22
+ $sessionId = static::$_client->server()->createSession('admin', '127.0.0.1');
23
+ static::$_client->session()->terminate($sessionId);
24
+ $sessions = static::$_client->session()->get();
25
+ $this->assertArrayNotHasKey($sessionId, $sessions);
26
+ }
27
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/SiteTest.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskXTest\Utility\KeyLimitChecker;
7
+
8
+ class SiteTest extends TestCase
9
+ {
10
+ /** @var \PleskX\Api\Struct\Webspace\Info */
11
+ private static $webspace;
12
+
13
+ public static function setUpBeforeClass(): void
14
+ {
15
+ parent::setUpBeforeClass();
16
+ static::$webspace = static::_createWebspace();
17
+ }
18
+
19
+ protected function setUp(): void
20
+ {
21
+ parent::setUp();
22
+
23
+ $keyInfo = static::$_client->server()->getKeyInfo();
24
+
25
+ if (!KeyLimitChecker::checkByType($keyInfo, KeyLimitChecker::LIMIT_DOMAINS, 2)) {
26
+ $this->markTestSkipped('License does not allow to create more than 1 domain.');
27
+ }
28
+ }
29
+
30
+ private function _createSite($name, array $properties = [])
31
+ {
32
+ $properties = array_merge([
33
+ 'name' => $name,
34
+ 'webspace-id' => static::$webspace->id,
35
+ ], $properties);
36
+
37
+ return static::$_client->site()->create($properties);
38
+ }
39
+
40
+ public function testCreate()
41
+ {
42
+ $site = $this->_createSite('addon.dom');
43
+
44
+ $this->assertIsNumeric($site->id);
45
+ $this->assertGreaterThan(0, $site->id);
46
+
47
+ static::$_client->site()->delete('id', $site->id);
48
+ }
49
+
50
+ public function testDelete()
51
+ {
52
+ $site = $this->_createSite('addon.dom');
53
+
54
+ $result = static::$_client->site()->delete('id', $site->id);
55
+ $this->assertTrue($result);
56
+ }
57
+
58
+ public function testGet()
59
+ {
60
+ $site = $this->_createSite('addon.dom');
61
+
62
+ $siteInfo = static::$_client->site()->get('id', $site->id);
63
+ $this->assertEquals('addon.dom', $siteInfo->name);
64
+
65
+ static::$_client->site()->delete('id', $site->id);
66
+ }
67
+
68
+ public function testGetHostingWoHosting()
69
+ {
70
+ $site = $this->_createSite('addon.dom');
71
+
72
+ $siteHosting = static::$_client->site()->getHosting('id', $site->id);
73
+ $this->assertNull($siteHosting);
74
+
75
+ static::$_client->site()->delete('id', $site->id);
76
+ }
77
+
78
+ public function testGetHostingWithHosting()
79
+ {
80
+ $properties = [
81
+ 'hosting' => [
82
+ 'www_root' => 'addon.dom',
83
+ ],
84
+ ];
85
+ $site = $this->_createSite('addon.dom', $properties);
86
+
87
+ $siteHosting = static::$_client->site()->getHosting('id', $site->id);
88
+ $this->assertArrayHasKey('www_root', $siteHosting->properties);
89
+ $this->assertStringEndsWith('addon.dom', $siteHosting->properties['www_root']);
90
+
91
+ static::$_client->site()->delete('id', $site->id);
92
+ }
93
+
94
+ public function testGetAll()
95
+ {
96
+ $site = $this->_createSite('addon.dom');
97
+ $site2 = $this->_createSite('addon2.dom');
98
+
99
+ $sitesInfo = static::$_client->site()->getAll();
100
+ $this->assertCount(2, $sitesInfo);
101
+ $this->assertEquals('addon.dom', $sitesInfo[0]->name);
102
+ $this->assertEquals('addon.dom', $sitesInfo[0]->asciiName);
103
+
104
+ static::$_client->site()->delete('id', $site->id);
105
+ static::$_client->site()->delete('id', $site2->id);
106
+ }
107
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/SubdomainTest.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class SubdomainTest extends TestCase
7
+ {
8
+ /** @var \PleskX\Api\Struct\Webspace\Info */
9
+ private static $webspace;
10
+
11
+ /** @var string */
12
+ private static $webspaceName;
13
+
14
+ public static function setUpBeforeClass(): void
15
+ {
16
+ parent::setUpBeforeClass();
17
+ static::$webspace = static::_createWebspace();
18
+ $webspaceInfo = static::$_client->webspace()->get('id', static::$webspace->id);
19
+ static::$webspaceName = $webspaceInfo->name;
20
+ }
21
+
22
+ /**
23
+ * @param string $name
24
+ *
25
+ * @return \PleskX\Api\Struct\Subdomain\Info
26
+ */
27
+ private function _createSubdomain($name)
28
+ {
29
+ return static::$_client->subdomain()->create([
30
+ 'parent' => static::$webspaceName,
31
+ 'name' => $name,
32
+ 'property' => [
33
+ 'www_root' => $name,
34
+ ],
35
+ ]);
36
+ }
37
+
38
+ public function testCreate()
39
+ {
40
+ $subdomain = $this->_createSubdomain('sub');
41
+
42
+ $this->assertIsInt($subdomain->id);
43
+ $this->assertGreaterThan(0, $subdomain->id);
44
+
45
+ static::$_client->subdomain()->delete('id', $subdomain->id);
46
+ }
47
+
48
+ public function testDelete()
49
+ {
50
+ $subdomain = $this->_createSubdomain('sub');
51
+
52
+ $result = static::$_client->subdomain()->delete('id', $subdomain->id);
53
+ $this->assertTrue($result);
54
+ }
55
+
56
+ public function testGet()
57
+ {
58
+ $name = 'sub';
59
+ $subdomain = $this->_createSubdomain($name);
60
+
61
+ $subdomainInfo = static::$_client->subdomain()->get('id', $subdomain->id);
62
+ $this->assertEquals($name.'.'.$subdomainInfo->parent, $subdomainInfo->name);
63
+ $this->assertTrue(false !== strpos($subdomainInfo->properties['www_root'], $name));
64
+
65
+ static::$_client->subdomain()->delete('id', $subdomain->id);
66
+ }
67
+
68
+ public function testGetAll()
69
+ {
70
+ $name = 'sub';
71
+ $name2 = 'sub2';
72
+ $subdomain = $this->_createSubdomain($name);
73
+ $subdomain2 = $this->_createSubdomain($name2);
74
+
75
+ $subdomainsInfo = static::$_client->subdomain()->getAll();
76
+ $this->assertCount(2, $subdomainsInfo);
77
+ $this->assertEquals($name.'.'.$subdomainsInfo[0]->parent, $subdomainsInfo[0]->name);
78
+ $this->assertTrue(false !== strpos($subdomainsInfo[0]->properties['www_root'], $name));
79
+ $this->assertEquals($name2.'.'.$subdomainsInfo[1]->parent, $subdomainsInfo[1]->name);
80
+ $this->assertTrue(false !== strpos($subdomainsInfo[1]->properties['www_root'], $name2));
81
+
82
+ static::$_client->subdomain()->delete('id', $subdomain->id);
83
+ static::$_client->subdomain()->delete('id', $subdomain2->id);
84
+
85
+ $subdomainsInfo = static::$_client->subdomain()->getAll();
86
+ $this->assertEmpty($subdomainsInfo);
87
+ }
88
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/TestCase.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskXTest\Utility\PasswordProvider;
7
+
8
+ abstract class TestCase extends \PHPUnit\Framework\TestCase
9
+ {
10
+ /** @var \PleskX\Api\Client */
11
+ protected static $_client;
12
+
13
+ private static $webspaces = [];
14
+
15
+ public static function setUpBeforeClass(): void
16
+ {
17
+ $login = getenv('REMOTE_LOGIN');
18
+ $password = getenv('REMOTE_PASSWORD');
19
+ $host = getenv('REMOTE_HOST');
20
+ $port = 8443;
21
+ $scheme = 'https';
22
+
23
+ if ($url = getenv('REMOTE_URL')) {
24
+ $parsedUrl = parse_url($url);
25
+ list($host, $port, $scheme) = [$parsedUrl['host'], $parsedUrl['port'], $parsedUrl['scheme']];
26
+ }
27
+
28
+ static::$_client = new \PleskX\Api\Client($host, $port, $scheme);
29
+ static::$_client->setCredentials($login, $password);
30
+ }
31
+
32
+ public static function tearDownAfterClass(): void
33
+ {
34
+ foreach (self::$webspaces as $webspace) {
35
+ try {
36
+ static::$_client->webspace()->delete('id', $webspace->id);
37
+ } catch (\Exception $e) {
38
+ }
39
+ }
40
+ }
41
+
42
+ /**
43
+ * @return string
44
+ */
45
+ protected static function _getIpAddress()
46
+ {
47
+ $ips = static::$_client->ip()->get();
48
+ $ipInfo = reset($ips);
49
+
50
+ return $ipInfo->ipAddress;
51
+ }
52
+
53
+ /**
54
+ * @return \PleskX\Api\Struct\Webspace\Info
55
+ */
56
+ protected static function _createWebspace()
57
+ {
58
+ $id = uniqid();
59
+ $webspace = static::$_client->webspace()->create(
60
+ [
61
+ 'name' => "test{$id}.test",
62
+ 'ip_address' => static::_getIpAddress(),
63
+ ],
64
+ [
65
+ 'ftp_login' => "u{$id}",
66
+ 'ftp_password' => PasswordProvider::STRONG_PASSWORD,
67
+ ]
68
+ );
69
+ self::$webspaces[] = $webspace;
70
+
71
+ return $webspace;
72
+ }
73
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/UiTest.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ class UiTest extends TestCase
7
+ {
8
+ private $_customButtonProperties = [
9
+ 'place' => 'admin',
10
+ 'url' => 'http://example.com',
11
+ 'text' => 'Example site',
12
+ ];
13
+
14
+ public function testGetNavigation()
15
+ {
16
+ $navigation = static::$_client->ui()->getNavigation();
17
+ $this->assertIsArray($navigation);
18
+ $this->assertGreaterThan(0, count($navigation));
19
+ $this->assertArrayHasKey('general', $navigation);
20
+ $this->assertArrayHasKey('hosting', $navigation);
21
+
22
+ $hostingSection = $navigation['hosting'];
23
+ $this->assertArrayHasKey('name', $hostingSection);
24
+ $this->assertArrayHasKey('nodes', $hostingSection);
25
+ $this->assertGreaterThan(0, count($hostingSection['nodes']));
26
+ }
27
+
28
+ public function testCreateCustomButton()
29
+ {
30
+ $buttonId = static::$_client->ui()->createCustomButton('admin', $this->_customButtonProperties);
31
+ $this->assertGreaterThan(0, $buttonId);
32
+
33
+ static::$_client->ui()->deleteCustomButton($buttonId);
34
+ }
35
+
36
+ public function testGetCustomButton()
37
+ {
38
+ $buttonId = static::$_client->ui()->createCustomButton('admin', $this->_customButtonProperties);
39
+ $customButtonInfo = static::$_client->ui()->getCustomButton($buttonId);
40
+ $this->assertEquals('http://example.com', $customButtonInfo->url);
41
+ $this->assertEquals('Example site', $customButtonInfo->text);
42
+
43
+ static::$_client->ui()->deleteCustomButton($buttonId);
44
+ }
45
+
46
+ public function testDeleteCustomButton()
47
+ {
48
+ $buttonId = static::$_client->ui()->createCustomButton('admin', $this->_customButtonProperties);
49
+ $result = static::$_client->ui()->deleteCustomButton($buttonId);
50
+ $this->assertTrue($result);
51
+ }
52
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/Utility/KeyLimitChecker.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest\Utility;
5
+
6
+ class KeyLimitChecker
7
+ {
8
+ const LIMIT_CLIENTS = 'limit_clients';
9
+ const LIMIT_RESELLERS = 'limit_resellers';
10
+ const LIMIT_DOMAINS = 'limit_domains';
11
+
12
+ /**
13
+ * Checks whether limit is within the required constraint.
14
+ *
15
+ * @param (string|int)[] $keyInfo Structure returned by the getKeyInfo call
16
+ * @param string $type Type of the object that should be checked
17
+ * @param int $minimalRequirement Minimal value that should satisfy the limit
18
+ *
19
+ * @return bool if license satisfies set limits
20
+ */
21
+ public static function checkByType(array $keyInfo, $type, $minimalRequirement)
22
+ {
23
+ $field = null;
24
+ switch ($type) {
25
+ case self::LIMIT_CLIENTS:
26
+ if (intval($keyInfo['can-manage-customers']) === 0) {
27
+ return false;
28
+ }
29
+ $field = 'lim_cl';
30
+ break;
31
+ case self::LIMIT_RESELLERS:
32
+ if (intval($keyInfo['can-manage-resellers']) === 0) {
33
+ return false;
34
+ }
35
+ $field = 'lim_cl';
36
+ break;
37
+ case self::LIMIT_DOMAINS:
38
+ $field = 'lim_dom';
39
+ break;
40
+ default:
41
+ return false;
42
+ }
43
+
44
+ return intval($keyInfo[$field]) === -1 || intval($keyInfo[$field]) > $minimalRequirement;
45
+ }
46
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/Utility/PasswordProvider.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest\Utility;
5
+
6
+ class PasswordProvider
7
+ {
8
+ const STRONG_PASSWORD = 'test-PWD*1@42!13#';
9
+ }
lets-encrypt/vendor/plesk/api-php-lib/tests/WebspaceTest.php ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ namespace PleskXTest;
5
+
6
+ use PleskXTest\Utility\PasswordProvider;
7
+
8
+ class WebspaceTest extends TestCase
9
+ {
10
+ public function testGetPermissionDescriptor()
11
+ {
12
+ $descriptor = static::$_client->webspace()->getPermissionDescriptor();
13
+ $this->assertIsArray($descriptor->permissions);
14
+ $this->assertNotEmpty($descriptor->permissions);
15
+ }
16
+
17
+ public function testGetLimitDescriptor()
18
+ {
19
+ $descriptor = static::$_client->webspace()->getLimitDescriptor();
20
+ $this->assertIsArray($descriptor->limits);
21
+ $this->assertNotEmpty($descriptor->limits);
22
+ }
23
+
24
+ public function testGetDiskUsage()
25
+ {
26
+ $webspace = static::_createWebspace();
27
+ $diskusage = static::$_client->webspace()->getDiskUsage('id', $webspace->id);
28
+
29
+ $this->assertObjectHasAttribute('httpdocs', $diskusage);
30
+
31
+ static::$_client->webspace()->delete('id', $webspace->id);
32
+ }
33
+
34
+ public function testGetPhysicalHostingDescriptor()
35
+ {
36
+ $descriptor = static::$_client->webspace()->getPhysicalHostingDescriptor();
37
+ $this->assertIsArray($descriptor->properties);
38
+ $this->assertNotEmpty($descriptor->properties);
39
+
40
+ $ftpLoginProperty = $descriptor->properties['ftp_login'];
41
+ $this->assertEquals('ftp_login', $ftpLoginProperty->name);
42
+ $this->assertEquals('string', $ftpLoginProperty->type);
43
+ }
44
+
45
+ public function testGetPhpSettings()
46
+ {
47
+ $webspace = static::_createWebspace();
48
+ $info = static::$_client->webspace()->getPhpSettings('id', $webspace->id);
49
+
50
+ $this->assertArrayHasKey('open_basedir', $info->properties);
51
+
52
+ static::$_client->webspace()->delete('id', $webspace->id);
53
+ }
54
+
55
+ public function testGetLimits()
56
+ {
57
+ $webspace = static::_createWebspace();
58
+ $limits = static::$_client->webspace()->getLimits('id', $webspace->id);
59
+
60
+ $this->assertIsArray($limits->limits);
61
+ $this->assertNotEmpty($limits->limits);
62
+
63
+ static::$_client->webspace()->delete('id', $webspace->id);
64
+ }
65
+
66
+ public function testCreateWebspace()
67
+ {
68
+ $webspace = static::_createWebspace();
69
+
70
+ $this->assertGreaterThan(0, $webspace->id);
71
+
72
+ static::$_client->webspace()->delete('id', $webspace->id);
73
+ }
74
+
75
+ public function testDelete()
76
+ {
77
+ $webspace = static::_createWebspace();
78
+ $result = static::$_client->webspace()->delete('id', $webspace->id);
79
+
80
+ $this->assertTrue($result);
81
+ }
82
+
83
+ public function testRequestCreateWebspace()
84
+ {
85
+ $handlers = static::$_client->phpHandler()->getAll();
86
+ $enabledHandlers = array_filter($handlers, function ($handler) {
87
+ return $handler->handlerStatus !== 'disabled';
88
+ });
89
+ $this->assertGreaterThan(0, count($enabledHandlers));
90
+ $handler = current($enabledHandlers);
91
+
92
+ $request = [
93
+ 'add' => [
94
+ 'gen_setup' => [
95
+ 'name' => 'webspace-test-full.test',
96
+ 'htype' => 'vrt_hst',
97
+ 'status' => '0',
98
+ 'ip_address' => [static::_getIpAddress()],
99
+ ],
100
+ 'hosting' => [
101
+ 'vrt_hst' => [
102
+ 'property' => [
103
+ [
104
+ 'name' => 'php_handler_id',
105
+ 'value' => $handler->id,
106
+ ],
107
+ [
108
+ 'name' => 'ftp_login',
109
+ 'value' => 'testuser',
110
+ ],
111
+ [
112
+ 'name' => 'ftp_password',
113
+ 'value' => PasswordProvider::STRONG_PASSWORD,
114
+ ],
115
+ ],
116
+ 'ip_address' => static::_getIpAddress(),
117
+ ],
118
+ ],
119
+ 'limits' => [
120
+ 'overuse' => 'block',
121
+ 'limit' => [
122
+ [
123
+ 'name' => 'mbox_quota',
124
+ 'value' => 100,
125
+ ],
126
+ ],
127
+ ],
128
+ 'prefs' => [
129
+ 'www' => 'false',
130
+ 'stat_ttl' => 6,
131
+ ],
132
+ 'performance' => [
133
+ 'bandwidth' => 120,
134
+ 'max_connections' => 10000,
135
+ ],
136
+ 'permissions' => [
137
+ 'permission' => [
138
+ [
139
+ 'name' => 'manage_sh_access',
140
+ 'value' => 'true',
141
+ ],
142
+ ],
143
+ ],
144
+ 'php-settings' => [
145
+ 'setting' => [
146
+ [
147
+ 'name' => 'memory_limit',
148
+ 'value' => '128M',
149
+ ],
150
+ [
151
+ 'name' => 'safe_mode',
152
+ 'value' => 'false',
153
+ ],
154
+ ],
155
+ ],
156
+ 'plan-name' => 'Unlimited',
157
+ ],
158
+ ];
159
+
160
+ $webspace = static::$_client->webspace()->request($request);
161
+
162
+ $this->assertGreaterThan(0, $webspace->id);
163
+
164
+ static::$_client->webspace()->delete('id', $webspace->id);
165
+ }
166
+
167
+ public function testGet()
168
+ {
169
+ $webspace = static::_createWebspace();
170
+ $webspaceInfo = static::$_client->webspace()->get('id', $webspace->id);
171
+
172
+ $this->assertNotEmpty($webspaceInfo->name);
173
+ $this->assertEquals(0, $webspaceInfo->realSize);
174
+
175
+ static::$_client->webspace()->delete('id', $webspace->id);
176
+ }
177
+ }
lets-encrypt/vendor/plesk/api-php-lib/wait-for-plesk.sh ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ ### Copyright 1999-2020. Plesk International GmbH.
3
+
4
+ while : ; do
5
+ curl -ksL https://plesk:8443/ | grep "<title>Plesk" > /dev/null
6
+ [ $? -eq 0 ] && break
7
+ sleep 5
8
+ done
lets-encrypt/wizard/assets/css/admin.css ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .rsssl_letsencrypt_container {
2
+ margin-top: 30px;
3
+ background-color: #fafafa;
4
+ }
5
+ .rsssl_letsencrypt_container.rsssl-progress-container {
6
+ margin: 20px 0 0;
7
+ padding: 10px 0;
8
+ border-radius: 5px;
9
+ }
10
+ .rsssl-dns-field {
11
+ width: 45%;
12
+ border: 1px solid #dedede;
13
+ padding: 5px;
14
+ float: left;
15
+ margin-left: 25px;
16
+ margin-bottom: 10px;
17
+ }
18
+ #rsssl-lets-encrypt ul {
19
+ margin-left: 50px;
20
+ }
21
+ #rsssl-lets-encrypt ul li {
22
+ padding-right: 10px;
23
+ /*Nested li */
24
+ }
25
+ #rsssl-lets-encrypt ul li:before {
26
+ background-color: #eeeeee;
27
+ color: #fff;
28
+ height: 10px;
29
+ width: 10px;
30
+ border-radius: 50%;
31
+ content: '';
32
+ position: absolute;
33
+ margin-top: 5px;
34
+ margin-left: -30px;
35
+ }
36
+ #rsssl-lets-encrypt ul li.rsssl-warning:before {
37
+ background-color: #f8be2e;
38
+ }
39
+ #rsssl-lets-encrypt ul li.rsssl-error:before {
40
+ background-color: #D7263D;
41
+ }
42
+ #rsssl-lets-encrypt ul li.rsssl-success:before {
43
+ background-color: #61ce70;
44
+ }
45
+ #rsssl-lets-encrypt ul li ul li:before {
46
+ background-color: #888;
47
+ color: #fff;
48
+ height: 6px;
49
+ width: 6px;
50
+ border-radius: 50%;
51
+ content: '';
52
+ position: absolute;
53
+ margin-top: 7px;
54
+ margin-left: -19px;
55
+ }
56
+ .rsssl-notice-hook-element {
57
+ display: none;
58
+ }
59
+ /*
60
+ Hide nags from other plugins
61
+ */
62
+ .error:not(.really-simple-plugins),
63
+ .notice:not(.really-simple-plugins),
64
+ .update-nag:not(.really-simple-plugins),
65
+ .notice-info:not(.really-simple-plugins) {
66
+ display: none !important;
67
+ }
68
+ #rsssl-wizard {
69
+ /**
70
+ icons
71
+ */
72
+ }
73
+ #rsssl-wizard .rsssl-selectable {
74
+ -webkit-touch-callout: all;
75
+ /* iOS Safari */
76
+ -webkit-user-select: all;
77
+ /* Safari */
78
+ -khtml-user-select: all;
79
+ /* Konqueror HTML */
80
+ -moz-user-select: all;
81
+ /* Firefox */
82
+ -ms-user-select: all;
83
+ /* Internet Explorer/Edge */
84
+ user-select: all;
85
+ /* Chrome and Opera */
86
+ }
87
+ #rsssl-wizard #rsssl-header {
88
+ display: flex;
89
+ justify-content: space-between;
90
+ padding: 20px;
91
+ background-color: #fff;
92
+ }
93
+ #rsssl-wizard #rsssl-header img {
94
+ margin-left: 15px;
95
+ width: 120px;
96
+ height: 28px;
97
+ }
98
+ #rsssl-wizard #rsssl-header .rsssl-header-right {
99
+ display: flex;
100
+ align-items: center;
101
+ }
102
+ #rsssl-wizard #rsssl-header .rsssl-header-right a {
103
+ margin-right: 15px;
104
+ }
105
+ #rsssl-wizard #rsssl-content-area {
106
+ margin: 10px;
107
+ }
108
+ #rsssl-wizard .rsssl-section .rsssl-success.check {
109
+ margin-left: 5px;
110
+ }
111
+ #rsssl-wizard .rsssl-icon {
112
+ height: initial;
113
+ }
114
+ #rsssl-wizard .rsssl-icon.rsssl-success {
115
+ color: #61ce70;
116
+ }
117
+ #rsssl-wizard .rsssl-icon.rsssl-success svg {
118
+ stroke: #61ce70;
119
+ fill: #61ce70;
120
+ }
121
+ #rsssl-wizard .rsssl-icon.rsssl-success.documents-shortcode {
122
+ color: #000;
123
+ }
124
+ #rsssl-wizard .rsssl-icon.rsssl-disabled {
125
+ color: #d7d7d7;
126
+ }
127
+ #rsssl-wizard .rsssl-icon.rsssl-disabled svg {
128
+ stroke: #d7d7d7;
129
+ fill: #d7d7d7;
130
+ }
131
+ #rsssl-wizard .rsssl-icon:hover {
132
+ color: #000;
133
+ }
134
+ #rsssl-wizard .rsssl-icon.rsssl-bullet {
135
+ height: 11px;
136
+ width: 11px;
137
+ margin-top: 2px;
138
+ }
139
+ #rsssl-wizard .rsssl-icon.rsssl-bullet.rsssl-disabled {
140
+ background-color: #d7d7d7;
141
+ }
142
+ #rsssl-wizard .rsssl-icon.rsssl-bullet.rsssl-success {
143
+ background-color: #27ADEA;
144
+ }
145
+ /*# sourceMappingURL=admin.css.map */
lets-encrypt/wizard/assets/css/admin.css.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["admin.less"],"names":[],"mappings":"AAKA;EACE,gBAAA;EACA,yBAAA;;AACA,4BAAC;EACC,gBAAA;EACA,eAAA;EACA,kBAAA;;AAGJ;EACE,UAAA;EACA,yBAAA;EACA,YAAA;EACA,WAAA;EACA,iBAAA;EACA,mBAAA;;AAEF,mBAAoB;EAClB,iBAAA;;AADF,mBAAoB,GAElB;EACE,mBAAA;;;AACA,mBAJgB,GAElB,GAEG;EACC,yBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,SAAS,EAAT;EACA,kBAAA;EACA,eAAA;EACA,kBAAA;;AAGF,mBAhBgB,GAElB,GAcG,cAAc;EACb,yBAAA;;AAGF,mBApBgB,GAElB,GAkBG,YAAY;EACX,yBAAA;;AAGF,mBAxBgB,GAElB,GAsBG,cAAc;EACb,yBAAA;;AAzBN,mBAAoB,GAElB,GA2BE,GAAG,GAAE;EACH,sBAAA;EACA,WAAA;EACA,WAAA;EACA,UAAA;EACA,kBAAA;EACA,SAAS,EAAT;EACA,kBAAA;EACA,eAAA;EACA,kBAAA;;AAMN;EACE,aAAA;;;;;AAOA,MAAC,IAAI;AAAL,OAAC,IAAI;AAAL,WAAC,IAAI;AAAL,YAAC,IAAI;EACH,wBAAA;;AAIJ;;;;;AAAA,aACE;EACE,0BAAA;;EACA,wBAAA;;EACA,uBAAA;;EACA,qBAAA;;EACA,oBAAA;;EACA,gBAAA;;;AAPJ,aAUE;EACE,aAAA;EACA,8BAAA;EAQA,aAAA;EACA,sBAAA;;AArBJ,aAUE,cAIE;EACE,iBAAA;EACA,YAAA;EACA,YAAA;;AAjBN,aAUE,cAaE;EACE,aAAA;EACA,mBAAA;;AAzBN,aAUE,cAaE,oBAGE;EACE,kBAAA;;AA3BR,aAgCE;EACE,YAAA;;AAII,aAFN,eACE,eACK;EACC,gBAAA;;AAtCV,aA6CE;EACE,eAAA;;AACA,aAFF,YAEG;EACC,cAAA;;AADF,aAFF,YAEG,cAEC;EACE,eAAA;EACA,aAAA;;AAEF,aARJ,YAEG,cAME;EACC,WAAA;;AAGJ,aAZF,YAYG;EACC,cAAA;;AADF,aAZF,YAYG,eAEC;EACE,eAAA;EACA,aAAA;;AAIJ,aApBF,YAoBG;EACC,WAAA;;AAGF,aAxBF,YAwBG;EACC,YAAA;EACA,WAAA;EACA,eAAA;;AACA,aA5BJ,YAwBG,aAIE;EACC,yBAAA;;AAGF,aAhCJ,YAwBG,aAQE;EACC,yBAAA","file":"admin.css"}
lets-encrypt/wizard/assets/css/admin.less ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import 'variables.less';
2
+ @brand-primary: @rsp-yellow;
3
+ @color-success:@rsp-green;
4
+ @color-disabled: #d7d7d7;
5
+ @light-grey:#eeeeee;
6
+ .rsssl_letsencrypt_container {
7
+ margin-top:@big-margin;
8
+ background-color: @grey-lighter;
9
+ &.rsssl-progress-container {
10
+ margin: 20px 0 0;
11
+ padding: 10px 0;
12
+ border-radius: 5px;
13
+ }
14
+ }
15
+ .rsssl-dns-field {
16
+ width:45%;
17
+ border: 1px solid @input-border-color;
18
+ padding: 5px;
19
+ float: left;
20
+ margin-left: 25px;
21
+ margin-bottom: 10px;
22
+ }
23
+ #rsssl-lets-encrypt ul {
24
+ margin-left:50px;
25
+ li {
26
+ padding-right:10px;
27
+ &:before {
28
+ background-color: @grey-light;
29
+ color: #fff;
30
+ height: 10px;
31
+ width: 10px;
32
+ border-radius: 50%;
33
+ content: '';
34
+ position: absolute;
35
+ margin-top: 5px;
36
+ margin-left: -30px;
37
+ }
38
+
39
+ &.rsssl-warning:before {
40
+ background-color: @brand-primary;
41
+ }
42
+
43
+ &.rsssl-error:before {
44
+ background-color: @color-warning;
45
+ }
46
+
47
+ &.rsssl-success:before {
48
+ background-color: @color-success;
49
+ }
50
+
51
+ /*Nested li */
52
+ ul li:before {
53
+ background-color: @grey-dark;
54
+ color: #fff;
55
+ height: 6px;
56
+ width: 6px;
57
+ border-radius: 50%;
58
+ content: '';
59
+ position: absolute;
60
+ margin-top: 7px;
61
+ margin-left: -19px;
62
+ }
63
+ }
64
+ }
65
+
66
+ //wordpress inserts notices after the first h1 or h2. To prevent breaking layout we insert an empty h1 tag at the start of our page, where WP can insert the notice.
67
+ .rsssl-notice-hook-element {
68
+ display:none;
69
+ }
70
+
71
+ /*
72
+ Hide nags from other plugins
73
+ */
74
+ .error, .notice, .update-nag, .notice-info {
75
+ &:not(.really-simple-plugins) {
76
+ display: none !important;
77
+ }
78
+ }
79
+
80
+ #rsssl-wizard {
81
+ .rsssl-selectable {
82
+ -webkit-touch-callout: all; /* iOS Safari */
83
+ -webkit-user-select: all; /* Safari */
84
+ -khtml-user-select: all; /* Konqueror HTML */
85
+ -moz-user-select: all; /* Firefox */
86
+ -ms-user-select: all; /* Internet Explorer/Edge */
87
+ user-select: all; /* Chrome and Opera */
88
+ }
89
+
90
+ #rsssl-header {
91
+ display: flex;
92
+ justify-content: space-between;
93
+
94
+ img {
95
+ margin-left:@default-margin;
96
+ width: 120px;
97
+ height:28px;
98
+ }
99
+
100
+ padding: @default-padding;
101
+ background-color: #fff;
102
+
103
+ .rsssl-header-right {
104
+ display: flex;
105
+ align-items: center;
106
+ a {
107
+ margin-right: @default-margin;
108
+ }
109
+ }
110
+ }
111
+
112
+ #rsssl-content-area {
113
+ margin: 10px;
114
+ }
115
+ .rsssl-section {
116
+ .rsssl-success {
117
+ &.check{
118
+ margin-left:5px;
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ icons
124
+ */
125
+ .rsssl-icon {
126
+ height:initial;
127
+ &.rsssl-success {
128
+ color:@color-success;
129
+ svg {
130
+ stroke:@color-success;;
131
+ fill:@color-success;;
132
+ }
133
+ &.documents-shortcode {
134
+ color:#000;
135
+ }
136
+ }
137
+ &.rsssl-disabled {
138
+ color:@color-disabled;
139
+ svg {
140
+ stroke:@color-disabled;;
141
+ fill:@color-disabled;;
142
+ }
143
+ }
144
+
145
+ &:hover {
146
+ color: #000;
147
+ }
148
+
149
+ &.rsssl-bullet {
150
+ height: 11px;
151
+ width: 11px;
152
+ margin-top:2px;
153
+ &.rsssl-disabled {
154
+ background-color: @color-disabled;
155
+ }
156
+
157
+ &.rsssl-success {
158
+ background-color: #27ADEA;
159
+ }
160
+
161
+ }
162
+
163
+ }
164
+
165
+ }
lets-encrypt/wizard/assets/css/admin.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .rsssl_letsencrypt_container{margin-top:30px;background-color:#fafafa}.rsssl_letsencrypt_container.rsssl-progress-container{margin:20px 0 0;padding:10px 0;border-radius:5px}.rsssl-dns-field{width:45%;border:1px solid #dedede;padding:5px;float:left;margin-left:25px;margin-bottom:10px}#rsssl-lets-encrypt ul{margin-left:50px}#rsssl-lets-encrypt ul li{padding-right:10px}#rsssl-lets-encrypt ul li:before{background-color:#eee;color:#fff;height:10px;width:10px;border-radius:50%;content:'';position:absolute;margin-top:5px;margin-left:-30px}#rsssl-lets-encrypt ul li.rsssl-warning:before{background-color:#f8be2e}#rsssl-lets-encrypt ul li.rsssl-error:before{background-color:#d7263d}#rsssl-lets-encrypt ul li.rsssl-success:before{background-color:#61ce70}#rsssl-lets-encrypt ul li ul li:before{background-color:#888;color:#fff;height:6px;width:6px;border-radius:50%;content:'';position:absolute;margin-top:7px;margin-left:-19px}.rsssl-notice-hook-element{display:none}.error:not(.really-simple-plugins),.notice:not(.really-simple-plugins),.update-nag:not(.really-simple-plugins),.notice-info:not(.really-simple-plugins){display:none !important}#rsssl-wizard .rsssl-selectable{-webkit-touch-callout:all;-webkit-user-select:all;-khtml-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}#rsssl-wizard #rsssl-header{display:flex;justify-content:space-between;padding:20px;background-color:#fff}#rsssl-wizard #rsssl-header img{margin-left:15px;width:120px;height:28px}#rsssl-wizard #rsssl-header .rsssl-header-right{display:flex;align-items:center}#rsssl-wizard #rsssl-header .rsssl-header-right a{margin-right:15px}#rsssl-wizard #rsssl-content-area{margin:10px}#rsssl-wizard .rsssl-section .rsssl-success.check{margin-left:5px}#rsssl-wizard .rsssl-icon{height:initial}#rsssl-wizard .rsssl-icon.rsssl-success{color:#61ce70}#rsssl-wizard .rsssl-icon.rsssl-success svg{stroke:#61ce70;fill:#61ce70}#rsssl-wizard .rsssl-icon.rsssl-success.documents-shortcode{color:#000}#rsssl-wizard .rsssl-icon.rsssl-disabled{color:#d7d7d7}#rsssl-wizard .rsssl-icon.rsssl-disabled svg{stroke:#d7d7d7;fill:#d7d7d7}#rsssl-wizard .rsssl-icon:hover{color:#000}#rsssl-wizard .rsssl-icon.rsssl-bullet{height:11px;width:11px;margin-top:2px}#rsssl-wizard .rsssl-icon.rsssl-bullet.rsssl-disabled{background-color:#d7d7d7}#rsssl-wizard .rsssl-icon.rsssl-bullet.rsssl-success{background-color:#27adea}
lets-encrypt/wizard/assets/css/variables.css ADDED
File without changes
lets-encrypt/wizard/assets/css/variables.css.map ADDED
File without changes
lets-encrypt/wizard/assets/css/variables.less ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ // Margins, Paddings and Border Radius
3
+ @small-margin: 10px;
4
+ @default-margin: 15px;
5
+ @big-margin: 30px;
6
+ @grid-margin:10px;
7
+
8
+ @default-padding: 20px;
9
+ @border-radius: 25px;
10
+
11
+ // RSP Brand Colors
12
+ @rsp-black: #333;
13
+ @rsp-yellow: #f8be2e;
14
+ @rsp-blue: #29b6f6;
15
+ @rsp-green: #61ce70;
16
+ @rsp-red: #D7263D;
17
+ @rsp-pink: #E366A1;
18
+ @rsp-orange: #f39c12;
19
+ @box_shadow_color: #dedede;
20
+ @light-text-color: #3c3c3c;
21
+
22
+ // Colors
23
+ @brand-primary: @rsp-blue;
24
+ @brand-secondary: @color-success;
25
+
26
+ // Notification colors
27
+ @color-success: #61ce70;
28
+ @color-disabled: #d7d7d7;
29
+ @color-warning: @rsp-red;
30
+ @color-open: @rsp-yellow; //#f8be2e; //#FBC43D
31
+
32
+ //Input colors
33
+ @input-background-color: #F1F1F1;
34
+ @input-border-color: #dedede;
35
+
36
+ @grey: #c6c6c6;
37
+ @grey-light: #eeeeee;
38
+ @grey-dark: #888;
39
+ @grey-lighter: #fafafa;
40
+
lets-encrypt/wizard/assets/css/wizard.css ADDED
@@ -0,0 +1,1939 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .rsssl-certificate-data {
2
+ right: 10000px;
3
+ position: absolute;
4
+ background-color: #fff;
5
+ padding: 0;
6
+ white-space: nowrap;
7
+ }
8
+ .rsssl-copied-feedback-container {
9
+ padding: 20px;
10
+ color: #61ce70;
11
+ }
12
+ .rsssl-section .rsssl_letsencrypt_container a.button {
13
+ margin-top: 15px;
14
+ }
15
+ /**
16
+ * class to add a triangle pointer to each div
17
+ */
18
+ .rsssl-pointer {
19
+ position: relative;
20
+ }
21
+ .rsssl-pointer:after {
22
+ content: " ";
23
+ position: absolute;
24
+ left: -15px;
25
+ top: 15px;
26
+ border-top: 15px solid transparent;
27
+ border-right: 15px solid black;
28
+ border-left: none;
29
+ border-bottom: 15px solid transparent;
30
+ }
31
+ #rsssl-content-area {
32
+ display: grid;
33
+ grid-template-columns: 225px auto;
34
+ }
35
+ #rsssl-content-area h1 {
36
+ padding: 0;
37
+ }
38
+ #rsssl-content-area .rsssl-wizard-title {
39
+ padding: 20px;
40
+ border-bottom: 1px solid #eeeeee;
41
+ display: flex;
42
+ justify-content: space-between;
43
+ align-content: center;
44
+ }
45
+ #rsssl-content-area .rsssl-wizard-title h1 {
46
+ font-size: 18px;
47
+ }
48
+ #rsssl-content-area .rsssl-wizard-title.rsssl-section-content-notifications-header {
49
+ border-bottom: 1px solid #e6e6e6;
50
+ }
51
+ #rsssl-content-area .rsssl-wizard-title.rsssl-section-content-notifications-header h1 {
52
+ font-weight: normal;
53
+ }
54
+ #rsssl-content-area .rsssl-wizard-subtitle h2 {
55
+ margin: 20px 20px 0 20px;
56
+ font-size: 14px;
57
+ }
58
+ #rsssl-content-area .rsssl-wizard-progress-bar {
59
+ background: #eeeeee;
60
+ height: 15px;
61
+ margin: 20px 0 0 0;
62
+ }
63
+ #rsssl-content-area .rsssl-wizard-progress-bar .rsssl-wizard-progress-bar-value {
64
+ transition: width 0.5s;
65
+ -webkit-transition: width 0.5s;
66
+ height: 100%;
67
+ background: #61ce70;
68
+ border-radius: 4px;
69
+ }
70
+ #rsssl-content-area .rsssl-wizard-progress-bar .rsssl-wizard-progress-bar-value.rsssl-error {
71
+ background-color: #D7263D;
72
+ }
73
+ #rsssl-content-area .rsssl-priority {
74
+ background-color: #000;
75
+ color: #fff;
76
+ border-color: #000;
77
+ margin-top: 10px;
78
+ }
79
+ #rsssl-content-area .rsssl-wizard-menu {
80
+ background-color: white;
81
+ margin: 10px;
82
+ margin-bottom: 0;
83
+ padding-bottom: 20px;
84
+ box-shadow: 0 0 5px 5px rgba(222, 222, 222, 0.2);
85
+ }
86
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-wizard-menu h1 {
87
+ font-weight: bold;
88
+ }
89
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-wizard-progress-bar {
90
+ margin: 20px;
91
+ }
92
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header {
93
+ text-decoration: none;
94
+ }
95
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.incomplete a h2 {
96
+ color: #c6c6c6;
97
+ }
98
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header a {
99
+ display: inline-block;
100
+ padding: 5px 20px;
101
+ text-decoration: none;
102
+ width: calc(100% - (20px + 20px));
103
+ }
104
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header a h2 {
105
+ font-size: 15px;
106
+ margin: 0;
107
+ }
108
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.active a h2 {
109
+ color: #c6c6c6 !important;
110
+ }
111
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header:hover a h2 {
112
+ text-decoration: underline;
113
+ }
114
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.active:hover a {
115
+ background: white;
116
+ pointer-events: none;
117
+ }
118
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section {
119
+ display: grid;
120
+ grid-template-columns: 20px 1fr;
121
+ margin: 0 20px;
122
+ }
123
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section span {
124
+ align-self: center;
125
+ justify-self: center;
126
+ }
127
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a {
128
+ display: inline-block;
129
+ text-decoration: none;
130
+ padding: 3px 5px;
131
+ }
132
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a h3 {
133
+ color: #c6c6c6;
134
+ }
135
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a:visited h3 {
136
+ color: initial;
137
+ }
138
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a h3 {
139
+ font-size: 12px;
140
+ font-weight: normal;
141
+ margin: 0;
142
+ }
143
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section.active a h3 {
144
+ color: grey;
145
+ }
146
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section:hover a h3 {
147
+ text-decoration: underline;
148
+ }
149
+ #rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section.active:hover a {
150
+ background: white;
151
+ pointer-events: none;
152
+ }
153
+ #rsssl-content-area .rsssl-section-content {
154
+ margin: 10px;
155
+ }
156
+ #rsssl-content-area .rsssl-section-content p {
157
+ margin: 0;
158
+ }
159
+ #rsssl-content-area .rsssl-section-content p:not(:first-child) {
160
+ margin-top: 1em;
161
+ }
162
+ #rsssl-content-area .rsssl-section-content form {
163
+ display: grid;
164
+ grid-template-columns: auto 325px;
165
+ grid-column-gap: 15px;
166
+ }
167
+ #rsssl-content-area .rsssl-section-content form .rsssl-section-content-title-header {
168
+ background-color: white;
169
+ }
170
+ #rsssl-content-area .rsssl-section-content form .rsssl-wizard-intro,
171
+ #rsssl-content-area .rsssl-section-content form .rsssl-template-intro .rsssl-master-label {
172
+ grid-column-start: 1;
173
+ background-color: white;
174
+ padding: 20px 20px 0 20px;
175
+ }
176
+ #rsssl-content-area .rsssl-section-content form .rsssl-field .rsssl-wizard-intro {
177
+ padding: 0 0 20px 0;
178
+ }
179
+ #rsssl-content-area .rsssl-section-content form .rsssl-button {
180
+ background-color: white;
181
+ grid-column-start: 1;
182
+ padding: 20px 20px 0 20px;
183
+ }
184
+ #rsssl-content-area .rsssl-section-content form .field-group {
185
+ grid-column: span 2;
186
+ display: grid;
187
+ grid-template-columns: auto 325px;
188
+ grid-column-gap: 15px;
189
+ }
190
+ #rsssl-content-area .rsssl-section-content form .field-group .rsssl-field {
191
+ grid-column-start: 1;
192
+ }
193
+ #rsssl-content-area .rsssl-section-content form .field-group .rsssl-help-warning-wrap {
194
+ margin-top: 20px;
195
+ }
196
+ #rsssl-content-area .rsssl-section-content form .rsssl-section-footer {
197
+ grid-column-start: 1;
198
+ background-color: white;
199
+ padding: 20px;
200
+ display: grid;
201
+ align-items: center;
202
+ grid-template-columns: 1fr auto;
203
+ }
204
+ #rsssl-content-area .rsssl-section-content form .rsssl-section-footer .rsssl-buttons-container {
205
+ grid-column-start: 2;
206
+ }
207
+ #rsssl-content-area .rsssl-section-content form .rsssl-section-footer .rsssl-buttons-container input + input {
208
+ margin-left: 20px;
209
+ }
210
+ #rsssl-content-area .rsssl-add-pages-table {
211
+ display: grid;
212
+ grid-template-columns: auto auto auto;
213
+ grid-gap: 5px;
214
+ align-items: center;
215
+ margin-bottom: 20px;
216
+ }
217
+ #rsssl-content-area .rsssl-add-pages-table span {
218
+ justify-self: end;
219
+ text-align: justify;
220
+ }
221
+ #rsssl-content-area .rsssl-link-to-menu-table {
222
+ display: grid;
223
+ grid-template-columns: 30% 30%;
224
+ grid-gap: 5px;
225
+ align-items: center;
226
+ }
227
+ #rsssl-content-area .rsssl-link-to-menu-table h3 {
228
+ grid-column: span 2;
229
+ margin-top: 20px;
230
+ margin-bottom: 5px;
231
+ }
232
+ #rsssl-content-area .rsssl-link-to-menu-table h3:first-child {
233
+ margin-top: 0;
234
+ }
235
+ #rsssl-content-area .rsssl-link-to-menu-table select {
236
+ grid-column-start: 2;
237
+ }
238
+ #rsssl-content-area .rsssl-cookies-table h2 {
239
+ font-weight: normal;
240
+ font-size: 15px;
241
+ }
242
+ #rsssl-content-area .rsssl-cookies-table .rsssl-cookies-table-body {
243
+ border-radius: 5px;
244
+ display: grid;
245
+ grid-template-columns: 1fr;
246
+ padding: 10px;
247
+ background-color: #f0f2f8;
248
+ }
249
+ #rsssl-wizard {
250
+ /* ----------- Icons ----------- */
251
+ /* ----------- Fields ----------- */
252
+ /* Checkbox */
253
+ /* Disabled option */
254
+ /* Customize the label (the container) */
255
+ /* Radio */
256
+ /* Customize the label (the container) */
257
+ /* Text & Email Validation */
258
+ /* Text, Email, Select(2), Textarea Style */
259
+ /* Placeholders */
260
+ /* Labels */
261
+ /* Firefox */
262
+ }
263
+ #rsssl-wizard .rsssl-icon {
264
+ margin: 0 5px;
265
+ width: initial;
266
+ border-radius: 50%;
267
+ }
268
+ #rsssl-wizard .rsssl-icon.rsssl-empty {
269
+ visibility: hidden;
270
+ }
271
+ #rsssl-wizard .rsssl-icon.rsssl-success {
272
+ color: #f8be2e;
273
+ }
274
+ #rsssl-wizard .rsssl-icon.rsssl-success svg {
275
+ fill: #f8be2e;
276
+ stroke: #f8be2e;
277
+ }
278
+ #rsssl-wizard .rsssl-icon.rsssl-green {
279
+ color: #61ce70;
280
+ }
281
+ #rsssl-wizard .rsssl-icon.rsssl-green svg {
282
+ fill: #61ce70;
283
+ stroke: #61ce70;
284
+ }
285
+ #rsssl-wizard .rsssl-icon.rsssl-disabled {
286
+ color: #ababab;
287
+ }
288
+ #rsssl-wizard .rsssl-icon.rsssl-disabled svg {
289
+ fill: #ababab;
290
+ stroke: #ababab;
291
+ }
292
+ #rsssl-wizard .rsssl-icon.rsssl-error {
293
+ color: #d7263d;
294
+ }
295
+ #rsssl-wizard .rsssl-icon.rsssl-error svg {
296
+ fill: #d7263d;
297
+ stroke: #d7263d;
298
+ }
299
+ #rsssl-wizard .rsssl-icon.arrow-right-alt2::before {
300
+ font-size: 14px;
301
+ }
302
+ #rsssl-wizard .rsssl-circle-green {
303
+ height: 12px;
304
+ width: 12px;
305
+ border-radius: 12px;
306
+ background-color: #61ce70;
307
+ }
308
+ #rsssl-wizard .rsssl-circle-red {
309
+ height: 12px;
310
+ width: 12px;
311
+ border-radius: 12px;
312
+ background-color: #d7263d;
313
+ }
314
+ #rsssl-wizard .rsssl-not-allowed {
315
+ cursor: not-allowed;
316
+ }
317
+ #rsssl-wizard .rsssl-checkbox .rsssl-field {
318
+ display: flex;
319
+ align-items: center;
320
+ }
321
+ #rsssl-wizard .rsssl-checkbox .rsssl-field .rsssl-wizard-settings-text {
322
+ margin-left: 20px;
323
+ margin-top: 5px;
324
+ }
325
+ #rsssl-wizard .rsssl-checkbox-container {
326
+ display: block;
327
+ position: relative;
328
+ padding-left: 35px;
329
+ /* Hide the browser's default checkbox */
330
+ /* Create a custom checkbox */
331
+ /* Checkmark (hidden when not checked) */
332
+ /* Show the checkmark when checked */
333
+ /* Style the checkmark/indicator */
334
+ /* Show the default checkmark when default */
335
+ /* Disabled option */
336
+ }
337
+ #rsssl-wizard .rsssl-checkbox-container input {
338
+ position: absolute;
339
+ opacity: 0;
340
+ cursor: pointer;
341
+ height: 0;
342
+ width: 0;
343
+ }
344
+ #rsssl-wizard .rsssl-checkbox-container .checkmark {
345
+ position: absolute;
346
+ top: -2px;
347
+ left: 0;
348
+ height: 20px;
349
+ width: 20px;
350
+ border-radius: 5px;
351
+ border: 1px solid #dadada;
352
+ }
353
+ #rsssl-wizard .rsssl-checkbox-container .checkmark svg {
354
+ content: "";
355
+ position: absolute;
356
+ display: none;
357
+ }
358
+ #rsssl-wizard .rsssl-checkbox-container input:checked ~ .checkmark svg {
359
+ display: block;
360
+ fill: #f8be2e;
361
+ stroke: #f8be2e;
362
+ }
363
+ #rsssl-wizard .rsssl-checkbox-container .checkmark svg {
364
+ left: 2.5px;
365
+ top: 2px;
366
+ width: 15px;
367
+ height: 15px;
368
+ }
369
+ #rsssl-wizard .rsssl-checkbox-container .checkmark.rsssl-default svg {
370
+ display: block;
371
+ fill: #eee;
372
+ stroke: #eee;
373
+ }
374
+ #rsssl-wizard .rsssl-checkbox-container.rsssl-disabled {
375
+ pointer-events: none;
376
+ }
377
+ #rsssl-wizard .rsssl-checkbox-container.rsssl-disabled .checkmark {
378
+ background-color: #eee;
379
+ }
380
+ #rsssl-wizard .rsssl-checkbox-container.rsssl-disabled .checkmark svg {
381
+ stroke: #eee !important;
382
+ fill: #eee !important;
383
+ }
384
+ #rsssl-wizard .rsssl-radio-container {
385
+ display: block;
386
+ position: relative;
387
+ padding-left: 35px;
388
+ /* Hide the browser's default checkbox */
389
+ /* Create a custom radio */
390
+ /* Check icon (hidden when not checked) */
391
+ /* Show check icon when checked */
392
+ /* Style the check icon */
393
+ /* Show the default checkmark when default */
394
+ /* Disabled option */
395
+ }
396
+ #rsssl-wizard .rsssl-radio-container input {
397
+ position: absolute;
398
+ opacity: 0;
399
+ cursor: pointer;
400
+ height: 0;
401
+ width: 0;
402
+ }
403
+ #rsssl-wizard .rsssl-radio-container .radiobtn {
404
+ position: absolute;
405
+ top: -2px;
406
+ left: 0;
407
+ height: 20px;
408
+ width: 20px;
409
+ border-radius: 20px;
410
+ border: 1px solid #dadada;
411
+ }
412
+ #rsssl-wizard .rsssl-radio-container .radiobtn div {
413
+ content: "";
414
+ position: absolute;
415
+ display: none;
416
+ }
417
+ #rsssl-wizard .rsssl-radio-container input:checked ~ .radiobtn .rsssl-icon {
418
+ display: block;
419
+ background-color: #f8be2e;
420
+ }
421
+ #rsssl-wizard .rsssl-radio-container .radiobtn .rsssl-icon {
422
+ left: 5px;
423
+ top: 3px;
424
+ width: 10px;
425
+ height: 10px;
426
+ }
427
+ #rsssl-wizard .rsssl-radio-container .radiobtn.rsssl-default .rsssl-icon {
428
+ display: block;
429
+ background-color: #eee;
430
+ }
431
+ #rsssl-wizard .rsssl-radio-container.rsssl-disabled {
432
+ pointer-events: none;
433
+ }
434
+ #rsssl-wizard .rsssl-radio-container.rsssl-disabled .radiobtn {
435
+ background-color: #eee;
436
+ }
437
+ #rsssl-wizard .rsssl-radio-container.rsssl-disabled .radiobtn .rsssl-icon {
438
+ background-color: #eee !important;
439
+ }
440
+ #rsssl-wizard textarea.validation,
441
+ #rsssl-wizard input[type="text"].validation,
442
+ #rsssl-wizard input[type="password"].validation,
443
+ #rsssl-wizard input[type="email"].validation,
444
+ #rsssl-wizard input[type="text"].rsssl-valid-page,
445
+ #rsssl-wizard input[type="text"].rsssl-deleted-page {
446
+ position: relative;
447
+ padding-left: 30px;
448
+ }
449
+ #rsssl-wizard textarea.validation ~ span .rsssl-icon,
450
+ #rsssl-wizard input[type="text"].validation ~ span .rsssl-icon,
451
+ #rsssl-wizard input[type="password"].validation ~ span .rsssl-icon,
452
+ #rsssl-wizard input[type="email"].validation ~ span .rsssl-icon,
453
+ #rsssl-wizard input[type="text"].rsssl-valid-page ~ span .rsssl-icon,
454
+ #rsssl-wizard input[type="text"].rsssl-deleted-page ~ span .rsssl-icon {
455
+ display: block;
456
+ position: absolute;
457
+ padding-left: 7px;
458
+ margin-top: -25px;
459
+ z-index: 1;
460
+ }
461
+ #rsssl-wizard textarea.validation ~ span .rsssl-icon svg,
462
+ #rsssl-wizard input[type="text"].validation ~ span .rsssl-icon svg,
463
+ #rsssl-wizard input[type="password"].validation ~ span .rsssl-icon svg,
464
+ #rsssl-wizard input[type="email"].validation ~ span .rsssl-icon svg,
465
+ #rsssl-wizard input[type="text"].rsssl-valid-page ~ span .rsssl-icon svg,
466
+ #rsssl-wizard input[type="text"].rsssl-deleted-page ~ span .rsssl-icon svg {
467
+ width: 15px;
468
+ height: 15px;
469
+ }
470
+ #rsssl-wizard textarea.validation:invalid ~ span .rsssl-icon,
471
+ #rsssl-wizard textarea.validation:valid ~ span .rsssl-icon {
472
+ margin-top: -143px;
473
+ }
474
+ #rsssl-wizard textarea.validation:valid ~ span .rsssl-failed,
475
+ #rsssl-wizard input[type="text"].validation:valid ~ span .rsssl-failed,
476
+ #rsssl-wizard input[type="password"].validation:valid ~ span .rsssl-failed,
477
+ #rsssl-wizard input[type="email"].validation:valid ~ span .rsssl-failed {
478
+ display: none;
479
+ }
480
+ #rsssl-wizard textarea.validation:invalid ~ span .rsssl-success,
481
+ #rsssl-wizard input[type="text"].validation:invalid ~ span .rsssl-success,
482
+ #rsssl-wizard input[type="password"].validation:invalid ~ span .rsssl-success,
483
+ #rsssl-wizard input[type="email"].validation:invalid ~ span .rsssl-success {
484
+ display: none;
485
+ }
486
+ #rsssl-wizard input:disabled {
487
+ background-color: #F2F2F2;
488
+ }
489
+ #rsssl-wizard input[type="text"],
490
+ #rsssl-wizard input[type="password"],
491
+ #rsssl-wizard input[type="email"],
492
+ #rsssl-wizard select,
493
+ #rsssl-wizard .select2,
494
+ #rsssl-wizard textarea,
495
+ #rsssl-wizard input[type="number"] {
496
+ margin-bottom: 2px;
497
+ }
498
+ #rsssl-wizard textarea {
499
+ padding: 10px;
500
+ width: 100%;
501
+ height: 100px;
502
+ margin: 20px 0;
503
+ }
504
+ #rsssl-wizard ::placeholder {
505
+ color: #dadada;
506
+ }
507
+ #rsssl-wizard ::placeholder {
508
+ color: #dadada;
509
+ }
510
+ #rsssl-wizard ::-moz-placeholder {
511
+ color: #dadada;
512
+ }
513
+ #rsssl-wizard :-ms-input-placeholder {
514
+ color: #dadada;
515
+ }
516
+ #rsssl-wizard :-moz-placeholder {
517
+ color: #dadada;
518
+ }
519
+ #rsssl-wizard .rsssl-master-label h2 {
520
+ padding: 20px 20px 0 20px !important;
521
+ }
522
+ #rsssl-wizard .rsssl-footer-contents {
523
+ border-top: none;
524
+ }
525
+ #rsssl-wizard .rsssl-grid.rsssl-gridless {
526
+ display: flex;
527
+ flex-wrap: wrap;
528
+ height: inherit !important;
529
+ }
530
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item {
531
+ position: relative;
532
+ }
533
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-help-warning-wrap {
534
+ display: none;
535
+ }
536
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-comment {
537
+ display: none;
538
+ }
539
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header {
540
+ height: initial;
541
+ }
542
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header-container {
543
+ display: flex;
544
+ justify-content: space-between;
545
+ align-content: center;
546
+ }
547
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header-container .rsssl-grid-controls {
548
+ margin: auto 0;
549
+ }
550
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-container {
551
+ height: calc(100% - 20px);
552
+ width: calc(100% - 20px);
553
+ margin-left: 10px;
554
+ display: grid;
555
+ grid-template-rows: auto 1fr auto;
556
+ background-color: white;
557
+ }
558
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-container .item-content {
559
+ padding: 10px 0 0 0;
560
+ margin: 0;
561
+ clear: none;
562
+ }
563
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-footer {
564
+ background-color: white;
565
+ height: initial;
566
+ }
567
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-checkbox .rsssl-field {
568
+ display: flex;
569
+ justify-content: space-between;
570
+ align-content: center;
571
+ padding: 20px 20px 0 20px;
572
+ }
573
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item.big .item-container .item-content {
574
+ display: grid;
575
+ grid-auto-flow: row dense;
576
+ grid-template-columns: 50% 50%;
577
+ grid-auto-rows: minmax(min-content, max-content);
578
+ }
579
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item.big.rsssl-customization .item-container .item-content {
580
+ grid-auto-flow: row;
581
+ }
582
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-2 .rsssl-field {
583
+ grid-column: span 2;
584
+ display: grid;
585
+ grid-template-columns: 100px 100px;
586
+ grid-column-gap: 20px;
587
+ }
588
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-2 .rsssl-field .rsssl-label {
589
+ grid-column: span 2;
590
+ }
591
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-3 .rsssl-field {
592
+ grid-column: span 2;
593
+ display: grid;
594
+ grid-template-columns: 100px 100px 100px;
595
+ grid-column-gap: 20px;
596
+ }
597
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-3 .rsssl-field .rsssl-label {
598
+ grid-column: span 3;
599
+ }
600
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius.rsssl-cols-5 .rsssl-field,
601
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth.rsssl-cols-5 .rsssl-field {
602
+ display: grid;
603
+ grid-template-columns: 50px 50px 50px 50px 50px;
604
+ grid-column-gap: 10px;
605
+ }
606
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius.rsssl-cols-5 .rsssl-field .rsssl-label,
607
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth.rsssl-cols-5 .rsssl-field .rsssl-label {
608
+ grid-column: span 5;
609
+ }
610
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap {
611
+ display: grid;
612
+ grid-template-rows: 16px 16px;
613
+ padding-top: 16px;
614
+ }
615
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap .rsssl-grey {
616
+ color: darkgrey;
617
+ }
618
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap span {
619
+ cursor: pointer;
620
+ }
621
+ #rsssl-wizard .rsssl-grid.rsssl-gridless select {
622
+ width: 100%;
623
+ }
624
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group {
625
+ grid-column: span 2;
626
+ }
627
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-field {
628
+ padding: 10px 20px 0 20px;
629
+ }
630
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius,
631
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth {
632
+ grid-column: span 1;
633
+ }
634
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-colspan-1 {
635
+ grid-column: span 1;
636
+ }
637
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-colspan-2 {
638
+ grid-column: span 2;
639
+ }
640
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-col-1 {
641
+ grid-column-start: 1;
642
+ }
643
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-col-2 {
644
+ grid-column-start: 2;
645
+ }
646
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-master-label h2 {
647
+ grid-column: span 2;
648
+ margin: 0;
649
+ padding: 20px 20px 0 20px;
650
+ font-size: 18px;
651
+ }
652
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-sublabel label {
653
+ color: darkgrey;
654
+ font-size: 13px;
655
+ }
656
+ #rsssl-wizard .rsssl-grid.rsssl-gridless label .rsssl-icon {
657
+ display: inline;
658
+ }
659
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-switch {
660
+ margin-top: 0;
661
+ }
662
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-input-wrap:not(.hidden) {
663
+ display: block;
664
+ position: absolute;
665
+ z-index: 10;
666
+ }
667
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-holder {
668
+ position: absolute;
669
+ top: 132px;
670
+ z-index: 10;
671
+ }
672
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-clear {
673
+ position: absolute;
674
+ }
675
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-controls .rsssl-field {
676
+ padding: 0;
677
+ }
678
+ #rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-controls .rsssl-field .rsssl-label {
679
+ margin: 0;
680
+ }
681
+ #rsssl-wizard input::-webkit-outer-spin-button,
682
+ #rsssl-wizard input::-webkit-inner-spin-button {
683
+ -webkit-appearance: none;
684
+ margin: 0;
685
+ }
686
+ #rsssl-wizard input[type=number] {
687
+ -moz-appearance: textfield;
688
+ }
689
+ .rsssl-multiple-field-button-footer {
690
+ display: flex;
691
+ align-items: center;
692
+ }
693
+ .rsssl-multiple-field-button-footer .rsssl-edit-item {
694
+ margin-right: 5px;
695
+ }
696
+ .rsssl-hidden {
697
+ display: none !important;
698
+ }
699
+ /* START TOOLTIP STYLES */
700
+ [rsssl-tooltip] {
701
+ position: relative;
702
+ /* opinion 1 */
703
+ margin-left: 5px;
704
+ }
705
+ /* Applies to all tooltips */
706
+ [rsssl-tooltip]::before,
707
+ [rsssl-tooltip]::after {
708
+ text-transform: none;
709
+ /* opinion 2 */
710
+ font-size: 1em;
711
+ /* opinion 3 */
712
+ line-height: 1;
713
+ user-select: none;
714
+ pointer-events: none;
715
+ position: absolute;
716
+ display: none;
717
+ opacity: 0;
718
+ }
719
+ [rsssl-tooltip]::before {
720
+ content: '';
721
+ border: 5px solid transparent;
722
+ /* opinion 4 */
723
+ z-index: 1001;
724
+ /* absurdity 1 */
725
+ }
726
+ [rsssl-tooltip]::after {
727
+ content: attr(rsssl-tooltip);
728
+ /* magic! */
729
+ min-width: 3em;
730
+ font-weight: normal;
731
+ overflow: hidden;
732
+ text-overflow: ellipsis;
733
+ padding: 1ch 1.5ch;
734
+ border-radius: 0.3ch;
735
+ box-shadow: 0 1em 2em -0.5em rgba(0, 0, 0, 0.35);
736
+ background: #333;
737
+ color: #fff;
738
+ z-index: 1000;
739
+ /* absurdity 2 */
740
+ }
741
+ /* Make the tooltips respond to hover */
742
+ [rsssl-tooltip]:hover::before,
743
+ [rsssl-tooltip]:hover::after {
744
+ display: block;
745
+ }
746
+ /* don't show empty tooltips */
747
+ [rsssl-tooltip='']::before,
748
+ [rsssl-tooltip='']::after {
749
+ display: none !important;
750
+ }
751
+ /* FLOW: UP */
752
+ [rsssl-tooltip]:not([flow])::before,
753
+ [rsssl-tooltip][flow^="up"]::before {
754
+ bottom: 100%;
755
+ border-bottom-width: 0;
756
+ border-top-color: #333;
757
+ }
758
+ [rsssl-tooltip]:not([flow])::after,
759
+ [rsssl-tooltip][flow^="up"]::after {
760
+ bottom: calc(100% + 5px);
761
+ }
762
+ [rsssl-tooltip]:not([flow])::before,
763
+ [rsssl-tooltip]:not([flow])::after,
764
+ [rsssl-tooltip][flow^="up"]::before,
765
+ [rsssl-tooltip][flow^="up"]::after {
766
+ left: 50%;
767
+ transform: translate(-50%, -0.5em);
768
+ }
769
+ /* FLOW: DOWN */
770
+ [rsssl-tooltip][flow^="down"]::before {
771
+ top: 100%;
772
+ border-top-width: 0;
773
+ border-bottom-color: #333;
774
+ }
775
+ [rsssl-tooltip][flow^="down"]::after {
776
+ top: calc(100% + 5px);
777
+ }
778
+ [rsssl-tooltip][flow^="down"]::before,
779
+ [rsssl-tooltip][flow^="down"]::after {
780
+ left: 50%;
781
+ transform: translate(-50%, 0.5em);
782
+ }
783
+ /* FLOW: LEFT */
784
+ [rsssl-tooltip][flow^="left"]::before {
785
+ top: 50%;
786
+ border-right-width: 0;
787
+ border-left-color: #333;
788
+ left: calc(0em - 5px);
789
+ transform: translate(-0.5em, -50%);
790
+ }
791
+ [rsssl-tooltip][flow^="left"]::after {
792
+ top: 50%;
793
+ right: calc(100% + 5px);
794
+ transform: translate(-0.5em, -50%);
795
+ }
796
+ /* FLOW: RIGHT */
797
+ [rsssl-tooltip][flow^="right"]::before {
798
+ top: 50%;
799
+ border-left-width: 0;
800
+ border-right-color: #333;
801
+ right: calc(0em - 19px);
802
+ transform: translate(0.5em, -50%);
803
+ }
804
+ [rsssl-tooltip][flow^="right"]::after {
805
+ top: 50%;
806
+ left: calc(100% + 19px);
807
+ transform: translate(0.5em, -50%);
808
+ min-width: 300px;
809
+ }
810
+ /* KEYFRAMES */
811
+ @keyframes tooltips-vert {
812
+ to {
813
+ opacity: 0.9;
814
+ transform: translate(-50%, 0);
815
+ }
816
+ }
817
+ @keyframes tooltips-horz {
818
+ to {
819
+ opacity: 0.9;
820
+ transform: translate(0, -50%);
821
+ }
822
+ }
823
+ /* FX All The Things */
824
+ [rsssl-tooltip]:not([flow]):hover::before,
825
+ [rsssl-tooltip]:not([flow]):hover::after,
826
+ [rsssl-tooltip][flow^="up"]:hover::before,
827
+ [rsssl-tooltip][flow^="up"]:hover::after,
828
+ [rsssl-tooltip][flow^="down"]:hover::before,
829
+ [rsssl-tooltip][flow^="down"]:hover::after {
830
+ animation: tooltips-vert 300ms ease-out forwards;
831
+ }
832
+ [rsssl-tooltip][flow^="left"]:hover::before,
833
+ [rsssl-tooltip][flow^="left"]:hover::after,
834
+ [rsssl-tooltip][flow^="right"]:hover::before,
835
+ [rsssl-tooltip][flow^="right"]:hover::after {
836
+ animation: tooltips-horz 300ms ease-out forwards;
837
+ }
838
+ #rsssl-header {
839
+ font-size: 16px;
840
+ }
841
+ #rsssl-header .button-black {
842
+ background-color: black;
843
+ color: white;
844
+ border-color: black;
845
+ padding: 0 25px;
846
+ }
847
+ #rsssl-header .link-black {
848
+ color: black;
849
+ padding: 5px 5px;
850
+ }
851
+ .wp-editor-wrap iframe {
852
+ height: initial !important;
853
+ }
854
+ .rsssl-help-warning-wrap .rsssl-help-modal {
855
+ position: relative;
856
+ position: absolute;
857
+ z-index: 99;
858
+ margin: 0 0 0 20px;
859
+ padding: 10px 15px;
860
+ color: #fff;
861
+ background-color: #f8be2e;
862
+ text-align: left;
863
+ }
864
+ .rsssl-help-warning-wrap .rsssl-help-modal h2 {
865
+ margin-top: -5px;
866
+ }
867
+ .rsssl-help-warning-wrap .rsssl-help-modal:after {
868
+ content: " ";
869
+ position: absolute;
870
+ left: -15px;
871
+ top: 15px;
872
+ border-top: 15px solid transparent;
873
+ border-right: 15px solid black;
874
+ border-left: none;
875
+ border-bottom: 15px solid transparent;
876
+ }
877
+ .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-notice {
878
+ background-color: #f8be2e;
879
+ color: black;
880
+ padding: 20px;
881
+ }
882
+ .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-notice:after {
883
+ border-right: 15px solid #f8be2e;
884
+ top: calc(50% - 15px);
885
+ }
886
+ .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-success {
887
+ background-color: white;
888
+ color: #61ce70;
889
+ border: none;
890
+ padding: 0;
891
+ }
892
+ .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-warning {
893
+ color: #333333;
894
+ background-color: #f8be2e;
895
+ border-color: #f8be2e;
896
+ }
897
+ .rsssl-help-warning-wrap .rsssl-help-modal.rsssl-warning:after {
898
+ border-right: 15px solid #f8be2e;
899
+ }
900
+ .rsssl-help-warning-wrap .rsssl-help-modal:empty {
901
+ background-color: #f1f1f1;
902
+ }
903
+ .rsssl-help-warning-wrap .rsssl-help-modal a {
904
+ color: #333;
905
+ }
906
+ a:active,
907
+ a:hover {
908
+ color: #333;
909
+ }
910
+ a.button.rsssl-open-modal {
911
+ font-size: 9px;
912
+ line-height: 13px;
913
+ height: 15px;
914
+ min-height: 15px;
915
+ padding: 1px 3px;
916
+ margin-left: 10px;
917
+ }
918
+ .rsssl-panel-link {
919
+ text-decoration: none;
920
+ display: inline-block;
921
+ width: 80%;
922
+ }
923
+ #rsssl_language {
924
+ font-size: 15px;
925
+ }
926
+ #rsssl_language.rsssl_cookie_language_selector {
927
+ margin-bottom: 0;
928
+ }
929
+ .multiple-field div {
930
+ margin-top: 8px;
931
+ }
932
+ .multiple-field div:last-child {
933
+ margin-bottom: 8px;
934
+ }
935
+ .rsssl-list-container {
936
+ margin-bottom: 25px;
937
+ }
938
+ .rsssl-list-container .rsssl-cookie-field > div,
939
+ .rsssl-list-container .rsssl-service-field > div {
940
+ margin-top: 8px;
941
+ }
942
+ .rsssl-list-container .rsssl-cookie-field > div:last-child,
943
+ .rsssl-list-container .rsssl-service-field > div:last-child {
944
+ margin-bottom: 8px;
945
+ }
946
+ .rsssl-list-container .rsssl-disabled label,
947
+ .rsssl-list-container .rsssl-disabled span {
948
+ color: #ababab !important;
949
+ }
950
+ .rsssl-list-container .rsssl-service-cookie-list {
951
+ margin-bottom: 20px;
952
+ }
953
+ .rsssl-list-container .rsssl-service-cookie-list:last-child {
954
+ margin-bottom: 0px;
955
+ }
956
+ .rsssl-list-container .rsssl-service-divider {
957
+ font-size: 15px;
958
+ margin-bottom: 10px;
959
+ }
960
+ .rsssl-legenda {
961
+ padding: 10px 10px 0 10px;
962
+ display: grid;
963
+ grid-template-columns: 25px 200px 25px 300px;
964
+ grid-column-gap: 10px;
965
+ align-items: center;
966
+ }
967
+ .rsssl-panel {
968
+ font-size: 13px !important;
969
+ color: #383d41;
970
+ background-color: #F2F2F2;
971
+ border: 1px solid #d6d8db;
972
+ padding: 10px 15px;
973
+ border-radius: 0px;
974
+ margin: 0;
975
+ }
976
+ .rsssl-panel.rsssl-toggle-disabled {
977
+ color: #aca5a5;
978
+ }
979
+ .rsssl-panel.rsssl-deleted {
980
+ background-color: #FFa5aa;
981
+ }
982
+ .rsssl-panel .rsssl-panel-title {
983
+ cursor: pointer;
984
+ }
985
+ .rsssl-panel .rsssl-field > div {
986
+ margin: 10px 0;
987
+ }
988
+ .rsssl-panel .rsssl-multiple-field-validation {
989
+ float: right;
990
+ }
991
+ .rsssl-panel.rsssl-slide-panel,
992
+ .rsssl-panel.rsssl-link-panel {
993
+ padding: 0;
994
+ }
995
+ .rsssl-panel.rsssl-slide-panel .rsssl-panel-toggle,
996
+ .rsssl-panel.rsssl-link-panel .rsssl-panel-toggle {
997
+ display: flex;
998
+ align-items: center;
999
+ }
1000
+ .rsssl-panel.rsssl-slide-panel .rsssl-panel-toggle span,
1001
+ .rsssl-panel.rsssl-link-panel .rsssl-panel-toggle span {
1002
+ padding-left: 10px;
1003
+ }
1004
+ .rsssl-panel.rsssl-slide-panel .rsssl-panel-title,
1005
+ .rsssl-panel.rsssl-link-panel .rsssl-panel-title {
1006
+ display: grid;
1007
+ grid-template-columns: 50% 10% 40%;
1008
+ align-items: center;
1009
+ padding: 10px 15px 8px 0;
1010
+ }
1011
+ .rsssl-panel.rsssl-slide-panel .rsssl-panel-title span.rsssl-panel-toggle,
1012
+ .rsssl-panel.rsssl-link-panel .rsssl-panel-title span.rsssl-panel-toggle {
1013
+ overflow: hidden;
1014
+ white-space: nowrap;
1015
+ text-overflow: ellipsis;
1016
+ }
1017
+ .rsssl-panel.rsssl-slide-panel .rsssl-panel-title span:last-of-type,
1018
+ .rsssl-panel.rsssl-link-panel .rsssl-panel-title span:last-of-type {
1019
+ display: flex;
1020
+ align-content: center;
1021
+ justify-content: flex-end;
1022
+ }
1023
+ .rsssl-panel.rsssl-slide-panel .rsssl-panel-title span:last-of-type svg,
1024
+ .rsssl-panel.rsssl-link-panel .rsssl-panel-title span:last-of-type svg {
1025
+ width: 18px;
1026
+ height: 18px;
1027
+ padding-top: 1px;
1028
+ }
1029
+ .rsssl-panel.rsssl-slide-panel .rsssl-add-to-policy,
1030
+ .rsssl-panel.rsssl-link-panel .rsssl-add-to-policy {
1031
+ text-decoration: underline;
1032
+ }
1033
+ .rsssl-panel.rsssl-link-panel.selected,
1034
+ .rsssl-panel.rsssl-link-panel:hover {
1035
+ box-shadow: 0 5px 5px rgba(0, 0, 0, 0.2), 0 3px 5px rgba(0, 0, 0, 0.13);
1036
+ }
1037
+ .rsssl-panel .rsssl-panel-content {
1038
+ display: none;
1039
+ background-color: #fff;
1040
+ border: 1px solid #d6d8db;
1041
+ border-top: 0;
1042
+ border-bottom-left-radius: 5px;
1043
+ border-bottom-right-radius: 5px;
1044
+ padding: 10px 15px;
1045
+ }
1046
+ .rsssl-panel h1 {
1047
+ font-size: 22px;
1048
+ }
1049
+ .rsssl-panel p {
1050
+ font-size: 13px !important;
1051
+ }
1052
+ .rsssl-panel.rsssl-notice {
1053
+ background-color: #fff;
1054
+ border: 0;
1055
+ color: black;
1056
+ padding: 20px 20px 0 20px;
1057
+ }
1058
+ .rsssl-panel.rsssl-success {
1059
+ background-color: white;
1060
+ color: #61ce70;
1061
+ border: none;
1062
+ padding: 0;
1063
+ }
1064
+ .rsssl-panel.rsssl-warning {
1065
+ position: relative;
1066
+ color: #333333;
1067
+ background-color: #f8be2e;
1068
+ border-color: #f8be2e;
1069
+ margin: 10px 0 10px 0;
1070
+ }
1071
+ .rsssl-panel.rsssl-warning:after {
1072
+ content: " ";
1073
+ position: absolute;
1074
+ left: -15px;
1075
+ top: 15px;
1076
+ border-top: 15px solid transparent;
1077
+ border-right: 15px solid black;
1078
+ border-left: none;
1079
+ border-bottom: 15px solid transparent;
1080
+ }
1081
+ .rsssl-panel.rsssl-warning:after {
1082
+ border-right: 15px solid #f8be2e;
1083
+ }
1084
+ .rsssl-panel ul {
1085
+ list-style-type: disc;
1086
+ margin-left: 22px;
1087
+ }
1088
+ input[type="text"],
1089
+ input[type="password"],
1090
+ input[type="email"],
1091
+ input[type="number"] {
1092
+ width: 100%;
1093
+ }
1094
+ /*
1095
+ cool checkbox sliders
1096
+ */
1097
+ .rsssl-switch {
1098
+ position: relative;
1099
+ display: inline-block;
1100
+ width: 40px;
1101
+ height: 21px;
1102
+ }
1103
+ .rsssl-switch input {
1104
+ display: none !important;
1105
+ }
1106
+ .rsssl-slider {
1107
+ position: absolute;
1108
+ cursor: pointer;
1109
+ top: 0;
1110
+ left: 0;
1111
+ right: 0;
1112
+ bottom: 0;
1113
+ background-color: #ccc;
1114
+ -webkit-transition: 0.4s;
1115
+ transition: 0.4s;
1116
+ }
1117
+ .rsssl-slider:before {
1118
+ position: absolute;
1119
+ content: "";
1120
+ height: 15px;
1121
+ width: 15px;
1122
+ left: 4px;
1123
+ bottom: 3px;
1124
+ background-color: white;
1125
+ -webkit-transition: 0.4s;
1126
+ transition: 0.4s;
1127
+ }
1128
+ .rsssl-slider.rsssl-round {
1129
+ border-radius: 20px;
1130
+ }
1131
+ .rsssl-slider.rsssl-round:before {
1132
+ border-radius: 50%;
1133
+ }
1134
+ .rsssl-slider-na {
1135
+ padding: 2px 8px;
1136
+ position: absolute;
1137
+ top: 0;
1138
+ left: 0;
1139
+ right: 0;
1140
+ bottom: 0;
1141
+ background-color: #ccc;
1142
+ -webkit-transition: 0.4s;
1143
+ transition: 0.4s;
1144
+ }
1145
+ .rsssl-slider-na:before {
1146
+ position: absolute;
1147
+ content: "N/A";
1148
+ color: white;
1149
+ }
1150
+ .rsssl-slider-na.rsssl-round {
1151
+ border-radius: 20px;
1152
+ }
1153
+ input:checked + .rsssl-slider {
1154
+ background-color: #f8be2e;
1155
+ }
1156
+ input:checked + .rsssl-slider:before {
1157
+ -webkit-transform: translateX(17px);
1158
+ -ms-transform: translateX(17px);
1159
+ transform: translateX(17px);
1160
+ }
1161
+ input:checked:disabled + .rsssl-slider {
1162
+ background-color: #fffbf3;
1163
+ }
1164
+ input:focus + .rsssl-slider {
1165
+ box-shadow: 0 0 1px #f8be2e;
1166
+ }
1167
+ #complete_wizard_first_notice {
1168
+ position: fixed;
1169
+ /* Sit on top of the page content */
1170
+ width: 100%;
1171
+ /* Full width (cover the whole page) */
1172
+ height: 100%;
1173
+ /* Full height (cover the whole page) */
1174
+ top: 0;
1175
+ left: 0;
1176
+ right: 0;
1177
+ bottom: 0;
1178
+ background-color: rgba(0, 0, 0, 0.7);
1179
+ /* Black background with opacity */
1180
+ z-index: 99;
1181
+ }
1182
+ #complete_wizard_first_notice p {
1183
+ border-radius: 0px;
1184
+ font-size: 16px;
1185
+ background-color: #f8be2e;
1186
+ color: white;
1187
+ position: relative;
1188
+ /* height: 100px; */
1189
+ top: 150px;
1190
+ padding: 30px;
1191
+ width: 300px;
1192
+ text-align: center;
1193
+ margin: auto;
1194
+ }
1195
+ html .mceContentBody {
1196
+ max-width: 100% !important;
1197
+ }
1198
+ .cookie-warning textarea {
1199
+ width: 100%;
1200
+ height: 100px;
1201
+ }
1202
+ .rsssl-comment {
1203
+ font-size: 11px;
1204
+ margin-top: 10px;
1205
+ }
1206
+ .rsssl-cookie-field .rsssl-cookie-header {
1207
+ border-bottom: 1px solid #b6b7b8;
1208
+ margin-bottom: 25px;
1209
+ }
1210
+ #rsssl-send-data input[type=text] {
1211
+ width: 60%;
1212
+ }
1213
+ #rsssl-start-mail,
1214
+ #rsssl_close_tb_window {
1215
+ margin-right: 15px;
1216
+ margin-top: 15px;
1217
+ }
1218
+ #rsssl-wizard {
1219
+ /*body */
1220
+ }
1221
+ #rsssl-wizard h1,
1222
+ #rsssl-wizard h2,
1223
+ #rsssl-wizard h3,
1224
+ #rsssl-wizard h4,
1225
+ #rsssl-wizard .rsssl-menu-item,
1226
+ #rsssl-wizard .rsssl-step-title,
1227
+ #rsssl-wizard .rsssl-button {
1228
+ font-variant: normal;
1229
+ }
1230
+ #rsssl-wizard h2,
1231
+ #rsssl-wizard h3 {
1232
+ font-size: 15px;
1233
+ }
1234
+ #rsssl-wizard h3 {
1235
+ font-weight: 400;
1236
+ }
1237
+ #rsssl-wizard label {
1238
+ font-size: 13px;
1239
+ }
1240
+ #rsssl-wizard .field-group {
1241
+ position: relative;
1242
+ }
1243
+ #rsssl-wizard .field-group .rsssl-field {
1244
+ padding: 0 20px 0 20px;
1245
+ background-color: white;
1246
+ }
1247
+ #rsssl-wizard .field-group .rsssl-field .rsssl-template-intro {
1248
+ margin-top: 15px;
1249
+ }
1250
+ #rsssl-wizard .field-group .rsssl-title-wrap {
1251
+ font-size: 15px;
1252
+ font-weight: 700;
1253
+ padding-top: 15px;
1254
+ }
1255
+ #rsssl-wizard .field-group .rsssl-label {
1256
+ margin-bottom: 10px;
1257
+ }
1258
+ #rsssl-wizard .field-group .rsssl-label label {
1259
+ display: flex;
1260
+ flex-direction: column;
1261
+ font-size: 15px;
1262
+ cursor: default;
1263
+ }
1264
+ #rsssl-wizard .field-group .rsssl-label label .rsssl-label-wrap {
1265
+ display: flex;
1266
+ margin-top: 15px;
1267
+ font-weight: 700;
1268
+ }
1269
+ #rsssl-wizard .field-group .rsssl-label label .rsssl-subtitle-wrap {
1270
+ font-size: 0.9em;
1271
+ margin: 5px 5px 0 0;
1272
+ }
1273
+ #rsssl-wizard .field-group.rsssl-editor .rsssl-label {
1274
+ margin-bottom: 0;
1275
+ }
1276
+ #rsssl-wizard .field-group .rsssl-field .field-group {
1277
+ grid-column: 1;
1278
+ display: block;
1279
+ }
1280
+ #rsssl-wizard .field-group .rsssl-field .rsssl-field {
1281
+ padding: 0;
1282
+ }
1283
+ #rsssl-wizard .rsssl-body,
1284
+ #rsssl-wizard #rsssl-content-area {
1285
+ /* Styling for the previous and next buttons */
1286
+ /* CSS for the sections menu */
1287
+ }
1288
+ #rsssl-wizard .rsssl-body input[type="text"].rsssl-document-custom-url,
1289
+ #rsssl-wizard #rsssl-content-area input[type="text"].rsssl-document-custom-url {
1290
+ width: 250px;
1291
+ }
1292
+ #rsssl-wizard .rsssl-body .rsssl-document-custom-url,
1293
+ #rsssl-wizard #rsssl-content-area .rsssl-document-custom-url,
1294
+ #rsssl-wizard .rsssl-body .rsssl-document-custom-page,
1295
+ #rsssl-wizard #rsssl-content-area .rsssl-document-custom-page {
1296
+ margin-top: 5px;
1297
+ }
1298
+ #rsssl-wizard .rsssl-body input.button,
1299
+ #rsssl-wizard #rsssl-content-area input.button {
1300
+ min-width: 100px;
1301
+ }
1302
+ #rsssl-wizard .rsssl-body input.button.button-red,
1303
+ #rsssl-wizard #rsssl-content-area input.button.button-red {
1304
+ background-color: red;
1305
+ color: white;
1306
+ border-color: red;
1307
+ }
1308
+ #rsssl-wizard .rsssl-body input.button.button-black,
1309
+ #rsssl-wizard #rsssl-content-area input.button.button-black {
1310
+ background-color: black;
1311
+ color: white;
1312
+ border-color: black;
1313
+ }
1314
+ #rsssl-wizard .rsssl-body input.button.button-link,
1315
+ #rsssl-wizard #rsssl-content-area input.button.button-link {
1316
+ text-align: center;
1317
+ min-width: initial;
1318
+ }
1319
+ #rsssl-wizard .rsssl-body input.button.button-link:hover,
1320
+ #rsssl-wizard #rsssl-content-area input.button.button-link:hover {
1321
+ background-color: initial;
1322
+ text-decoration: none;
1323
+ }
1324
+ #rsssl-wizard .rsssl-body button.button-red,
1325
+ #rsssl-wizard #rsssl-content-area button.button-red {
1326
+ background-color: red;
1327
+ color: white;
1328
+ border-color: red;
1329
+ }
1330
+ #rsssl-wizard .rsssl-body .rsssl-master-label h2,
1331
+ #rsssl-wizard #rsssl-content-area .rsssl-master-label h2 {
1332
+ margin: 0;
1333
+ padding: 20px 20px 0 0;
1334
+ font-size: 18px;
1335
+ background-color: white;
1336
+ }
1337
+ #rsssl-wizard .rsssl-body .rsssl-remove,
1338
+ #rsssl-wizard #rsssl-content-area .rsssl-remove {
1339
+ margin-bottom: 12px;
1340
+ }
1341
+ #rsssl-wizard .rsssl-body .rsssl-rescan,
1342
+ #rsssl-wizard #rsssl-content-area .rsssl-rescan {
1343
+ padding: 0 10px 0 10px;
1344
+ }
1345
+ #rsssl-wizard .rsssl-body .rsssl-menu-item.active i,
1346
+ #rsssl-wizard #rsssl-content-area .rsssl-menu-item.active i {
1347
+ color: black;
1348
+ font-size: 1.35em;
1349
+ float: left;
1350
+ }
1351
+ #rsssl-wizard .rsssl-body .rsssl-menu-item.active a,
1352
+ #rsssl-wizard #rsssl-content-area .rsssl-menu-item.active a {
1353
+ color: #000;
1354
+ font-weight: 900;
1355
+ padding-left: 7px;
1356
+ text-decoration: underline;
1357
+ }
1358
+ #rsssl-wizard .rsssl-body .rsssl-done a,
1359
+ #rsssl-wizard #rsssl-content-area .rsssl-done a {
1360
+ text-decoration: none;
1361
+ color: white;
1362
+ font-size: 15px;
1363
+ }
1364
+ #rsssl-wizard .rsssl-body .rsssl-to-do a,
1365
+ #rsssl-wizard #rsssl-content-area .rsssl-to-do a {
1366
+ color: white;
1367
+ font-size: 15px;
1368
+ text-decoration: none;
1369
+ opacity: 0.6;
1370
+ }
1371
+ @media screen and (max-width: 782px) {
1372
+ #rsssl-wizard .rsssl-body input,
1373
+ #rsssl-wizard #rsssl-content-area input {
1374
+ vertical-align: top !important;
1375
+ }
1376
+ }
1377
+ .rsssl-field {
1378
+ /* Define the styling of the text input fields */
1379
+ }
1380
+ .rsssl-field label {
1381
+ font-weight: normal;
1382
+ margin: 10px 0 2px;
1383
+ }
1384
+ .rsssl-field .rsssl-color-picker.wp-color-picker {
1385
+ margin-top: -11px !important;
1386
+ }
1387
+ .rsssl-field input[type="text"],
1388
+ .rsssl-field input[type="email"],
1389
+ .rsssl-field input[type="number"] {
1390
+ border-color: #dadada;
1391
+ }
1392
+ .rsssl-field select {
1393
+ border-color: #F1F1F1;
1394
+ vertical-align: initial;
1395
+ }
1396
+ .rsssl-field textarea.validation:invalid,
1397
+ .rsssl-field textarea.validation:valid {
1398
+ background-position: 0.5% 1.5%;
1399
+ border-color: #dadada;
1400
+ }
1401
+ .rsssl-field textarea {
1402
+ min-height: 150px;
1403
+ width: 100%;
1404
+ }
1405
+ .rsssl-field input[type=radio]:checked:before {
1406
+ content: "\2022";
1407
+ text-indent: -9999px;
1408
+ border-radius: 50px;
1409
+ font-size: 24px;
1410
+ width: 6px;
1411
+ height: 6px;
1412
+ margin: 4px;
1413
+ line-height: 16px;
1414
+ background-color: #1e8cbe;
1415
+ }
1416
+ .rsssl-field .rsssl-panel.rsssl-notice {
1417
+ padding: 0 0 10px 0;
1418
+ }
1419
+ .rsssl-field .rsssl-buttons-row-left {
1420
+ display: flex;
1421
+ align-items: center;
1422
+ height: auto;
1423
+ margin-bottom: 10px;
1424
+ }
1425
+ .rsssl-field .rsssl-buttons-row-left input,
1426
+ .rsssl-field .rsssl-buttons-row-left select,
1427
+ .rsssl-field .rsssl-buttons-row-left div {
1428
+ margin-right: 20px;
1429
+ }
1430
+ .rsssl-field button[name=rsssl_add_multiple] {
1431
+ margin-top: 20px;
1432
+ }
1433
+ a.rsssl.button,
1434
+ button.rsssl.button,
1435
+ input.rsssl.button {
1436
+ margin-left: 15px;
1437
+ box-shadow: 0 0 0 #fff;
1438
+ background-color: #f8be2e;
1439
+ color: #fff;
1440
+ padding-right: 20px;
1441
+ border: 0;
1442
+ border-radius: 50px;
1443
+ padding-top: 2px;
1444
+ }
1445
+ a.rsssl.button:hover,
1446
+ button.rsssl.button:hover,
1447
+ input.rsssl.button:hover {
1448
+ background-color: #facd5f;
1449
+ color: white;
1450
+ }
1451
+ a.rsssl.button .fa-angle-right,
1452
+ button.rsssl.button .fa-angle-right,
1453
+ input.rsssl.button .fa-angle-right {
1454
+ font-weight: 900;
1455
+ position: absolute;
1456
+ font-size: 1.8em;
1457
+ margin-top: 1px;
1458
+ margin-left: 5px;
1459
+ }
1460
+ #rsssl-wizard .dashboard .fa-times {
1461
+ color: black;
1462
+ }
1463
+ #rsssl-wizard .dashboard .fa-check {
1464
+ color: #f8be2e;
1465
+ }
1466
+ /* building our new structured css here */
1467
+ .rsssl-dashboard-container .rsssl-dashboard-title {
1468
+ padding-top: 22px;
1469
+ font-weight: 600;
1470
+ font-size: 24px;
1471
+ line-height: 30px;
1472
+ margin-bottom: 20px;
1473
+ }
1474
+ @media screen and (max-width: 720px) {
1475
+ .rsssl-dashboard-container .rsssl-dashboard-title {
1476
+ padding-bottom: 0px;
1477
+ }
1478
+ }
1479
+ .rsssl-dashboard-header .rsssl-header-top {
1480
+ min-height: 60px;
1481
+ }
1482
+ .rsssl-header-top {
1483
+ grid-area: header-top;
1484
+ background-color: #F2F2F2;
1485
+ min-height: 30px;
1486
+ padding-top: 25px;
1487
+ }
1488
+ .rsssl-header-top .rsssl-premium-cta {
1489
+ width: 150px;
1490
+ float: right;
1491
+ border-color: #f8be2e;
1492
+ color: #f8be2e;
1493
+ text-transform: uppercase;
1494
+ display: flex;
1495
+ }
1496
+ .rsssl-dashboard-container {
1497
+ background-color: white;
1498
+ display: flex;
1499
+ flex-wrap: wrap;
1500
+ }
1501
+ .rsssl-dashboard-container .rsssl-dashboard-header {
1502
+ margin-bottom: -270px;
1503
+ width: 100%;
1504
+ min-height: 220px;
1505
+ background-color: #f8be2e;
1506
+ background-repeat: no-repeat;
1507
+ background-attachment: scroll;
1508
+ background-position: bottom center;
1509
+ }
1510
+ .rsssl-dashboard-container .rsssl-dashboard-header .rsssl-header-text {
1511
+ display: flex;
1512
+ align-items: center;
1513
+ }
1514
+ .rsssl-dashboard-container .rsssl-dashboard-item {
1515
+ background-color: #fff;
1516
+ width: 450px;
1517
+ margin-top: 10px;
1518
+ border: 2px solid;
1519
+ flex: 0 0 450px;
1520
+ flex-shrink: 1;
1521
+ -webkit-border-radius: 5px;
1522
+ -moz-border-radius: 5px;
1523
+ border-radius: 0px;
1524
+ border-color: #f2f2f2;
1525
+ overflow: hidden;
1526
+ }
1527
+ .rsssl-dashboard-container .rsssl-dashboard-item .rsssl-top h1 {
1528
+ font-weight: 600;
1529
+ font-size: 2.5em;
1530
+ padding: 25px;
1531
+ }
1532
+ .rsssl-dashboard-container .rsssl-dashboard-content-container {
1533
+ margin: 0 auto;
1534
+ display: grid;
1535
+ grid-template-areas: 'header-top header-top header-top header-top' 'text-completed text-completed text-completed text-completed' 'progress progress support support' 'progress progress documents documents' 'footer footer footer footer';
1536
+ grid-gap: 10px;
1537
+ padding: 10px;
1538
+ }
1539
+ @media screen and (max-width: 1210px) {
1540
+ .rsssl-dashboard-container .rsssl-dashboard-content-container {
1541
+ grid-template-areas: 'header-top header-top' 'text-completed text-completed' 'progress progress' 'support support' 'documents documents' 'footer footer' 'footer footer';
1542
+ }
1543
+ }
1544
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-logo {
1545
+ display: flex;
1546
+ align-items: center;
1547
+ font-size: 1.5em;
1548
+ font-weight: 600;
1549
+ }
1550
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-header-text {
1551
+ display: flex;
1552
+ align-items: center;
1553
+ }
1554
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-completed-text {
1555
+ display: flex;
1556
+ align-items: center;
1557
+ margin-top: 35px;
1558
+ grid-area: text-completed;
1559
+ font-size: 24px;
1560
+ color: white;
1561
+ }
1562
+ @media screen and (max-width: 720px) {
1563
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-completed-text button {
1564
+ width: 100px;
1565
+ }
1566
+ }
1567
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-info {
1568
+ font-size: 19px;
1569
+ font-weight: bold;
1570
+ padding-top: 20px;
1571
+ padding-bottom: 10px;
1572
+ }
1573
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text {
1574
+ color: black;
1575
+ font-weight: 400;
1576
+ padding: 15px;
1577
+ }
1578
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text li {
1579
+ border-bottom: 1px solid;
1580
+ }
1581
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text .fa-plus {
1582
+ margin-right: 8px;
1583
+ }
1584
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text.free {
1585
+ background-color: #000;
1586
+ color: #fff;
1587
+ min-height: 40px;
1588
+ }
1589
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress {
1590
+ grid-area: progress;
1591
+ }
1592
+ @media screen and (max-width: 1210px) {
1593
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress {
1594
+ margin: 0 auto;
1595
+ }
1596
+ }
1597
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top {
1598
+ background-color: #F2F2F2;
1599
+ min-height: 170px;
1600
+ }
1601
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top .rsssl-dashboard-top-text {
1602
+ display: inline-grid;
1603
+ font-size: 18px;
1604
+ line-height: 22px;
1605
+ max-width: 60%;
1606
+ float: left;
1607
+ }
1608
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top .rsssl-dashboard-top-text .rsssl-dashboard-top-text-subtitle {
1609
+ color: #f8be2e;
1610
+ }
1611
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-continue-wizard-btn {
1612
+ padding-top: 125px;
1613
+ }
1614
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-continue-wizard-btn button {
1615
+ text-align: -webkit-left;
1616
+ border-radius: 50px;
1617
+ }
1618
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-percentage-complete {
1619
+ margin-top: 20px;
1620
+ float: right;
1621
+ }
1622
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table {
1623
+ padding-top: 10px;
1624
+ }
1625
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .i.fa.fa-check {
1626
+ color: black;
1627
+ }
1628
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .rsssl-success,
1629
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .rsssl-error {
1630
+ color: black;
1631
+ }
1632
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support {
1633
+ width: 450px;
1634
+ grid-area: support;
1635
+ }
1636
+ @media screen and (max-width: 1210px) {
1637
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support {
1638
+ margin: 0 auto;
1639
+ }
1640
+ }
1641
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=text],
1642
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=email],
1643
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support textarea,
1644
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=submit] {
1645
+ width: 425px;
1646
+ margin-bottom: 5px;
1647
+ margin-top: 5px;
1648
+ }
1649
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support textarea {
1650
+ min-height: 100px;
1651
+ }
1652
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=submit] {
1653
+ margin: auto;
1654
+ }
1655
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents {
1656
+ grid-area: documents;
1657
+ margin-top: 10px;
1658
+ }
1659
+ @media screen and (max-width: 1210px) {
1660
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents {
1661
+ margin: 0 auto;
1662
+ }
1663
+ }
1664
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table {
1665
+ padding-bottom: 15px;
1666
+ }
1667
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table .fas {
1668
+ margin-right: 8px;
1669
+ }
1670
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table ul {
1671
+ margin: 5px;
1672
+ }
1673
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table li {
1674
+ border-bottom: 2px solid;
1675
+ margin-bottom: 5px;
1676
+ text-indent: 5px;
1677
+ display: flex;
1678
+ vertical-align: middle;
1679
+ margin-left: 8px;
1680
+ }
1681
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table .fa-plus {
1682
+ color: #f8be2e;
1683
+ font-size: 1.5em;
1684
+ }
1685
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-documents-bottom {
1686
+ color: white;
1687
+ background-color: black;
1688
+ min-height: 70px;
1689
+ font-size: 14px;
1690
+ }
1691
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-documents-bottom div {
1692
+ margin-bottom: 10px;
1693
+ }
1694
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer {
1695
+ grid-area: footer;
1696
+ display: flex;
1697
+ flex-shrink: 1;
1698
+ flex-grow: 1;
1699
+ margin-top: 20px;
1700
+ flex-wrap: wrap;
1701
+ justify-content: center;
1702
+ padding-bottom: 20px;
1703
+ }
1704
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block {
1705
+ position: relative;
1706
+ -webkit-border-radius: 10px;
1707
+ -moz-border-radius: 10px;
1708
+ border-radius: 0px;
1709
+ background-color: #F2F2F2;
1710
+ width: 205px;
1711
+ min-height: 70px;
1712
+ margin: 5px auto;
1713
+ }
1714
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block a {
1715
+ position: absolute;
1716
+ top: 5px;
1717
+ right: 5px;
1718
+ }
1719
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-footer-title {
1720
+ margin-top: 9px;
1721
+ margin-left: 9px;
1722
+ font-weight: 900;
1723
+ font-size: 1.2em;
1724
+ margin-right: 35px;
1725
+ }
1726
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-footer-description {
1727
+ width: 70%;
1728
+ margin-left: 9px;
1729
+ font-size: 0.8em;
1730
+ display: flex;
1731
+ }
1732
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-external-btn {
1733
+ text-align: center;
1734
+ border-radius: 7px;
1735
+ color: #f8be2e;
1736
+ width: 25px;
1737
+ height: 20px;
1738
+ float: right;
1739
+ }
1740
+ .rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-external-btn .fa-angle-right {
1741
+ font-size: 1.5em;
1742
+ vertical-align: middle;
1743
+ margin-left: 2px;
1744
+ }
1745
+ /*skeleton*/
1746
+ .rsssl-skeleton:empty {
1747
+ margin: auto;
1748
+ margin-bottom: 25px;
1749
+ width: 100%;
1750
+ height: 235px;
1751
+ /* change height to see repeat-y behavior */
1752
+ background-image: linear-gradient(100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.5) 70%, rgba(255, 255, 255, 0.5) 15%), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0);
1753
+ background-repeat: repeat-y;
1754
+ background-size: 50px 200px, /* highlight */ 100% 117px, 100% 117px, 100% 117px, 100% 117px;
1755
+ background-position: 0 0, /* highlight */ 1px 1px, 1px 40px, 1px 79px, 1px 118px;
1756
+ background-color: #d6d8db;
1757
+ animation: shine 2.5s infinite;
1758
+ }
1759
+ @keyframes shine {
1760
+ to {
1761
+ background-position: 100% 0, /* move highlight to right */ 1px 1px, 1px 40px, 1px 79px, 1px 118px;
1762
+ }
1763
+ }
1764
+ @-webkit-keyframes sk-stretchdelay {
1765
+ 0%,
1766
+ 40%,
1767
+ 100% {
1768
+ -webkit-transform: scaleY(0.4);
1769
+ }
1770
+ 20% {
1771
+ -webkit-transform: scaleY(1);
1772
+ }
1773
+ }
1774
+ @keyframes sk-stretchdelay {
1775
+ 0%,
1776
+ 40%,
1777
+ 100% {
1778
+ transform: scaleY(0.4);
1779
+ -webkit-transform: scaleY(0.4);
1780
+ }
1781
+ 20% {
1782
+ transform: scaleY(1);
1783
+ -webkit-transform: scaleY(1);
1784
+ }
1785
+ }
1786
+ .rsssl-wizard-menu-menus {
1787
+ padding-top: 10px;
1788
+ }
1789
+ .rsssl-scroll {
1790
+ overflow: scroll;
1791
+ scroll-behavior: smooth;
1792
+ overflow-x: hidden;
1793
+ }
1794
+ #wpbody-content {
1795
+ padding-bottom: 0;
1796
+ }
1797
+ #customization {
1798
+ z-index: 10;
1799
+ }
1800
+ .cc-window {
1801
+ right: 1em;
1802
+ }
1803
+ .cc-window.cc-center {
1804
+ transform: translate(0%, -50%);
1805
+ left: initial;
1806
+ }
1807
+ .cc-window.cc-left {
1808
+ left: initial;
1809
+ }
1810
+ @keyframes slideInUpCenter {
1811
+ from {
1812
+ -webkit-transform: translate3d(0, 150%, 0);
1813
+ transform: translate3d(0, 150%, 0);
1814
+ }
1815
+ to {
1816
+ -webkit-transform: translate3d(0, -50%, 0);
1817
+ transform: translate3d(0, -50%, 0);
1818
+ }
1819
+ }
1820
+ @keyframes slideOutUpCenter {
1821
+ to {
1822
+ -webkit-transform: translate3d(0, 150%, 0);
1823
+ transform: translate3d(0, 150%, 0);
1824
+ opacity: 1;
1825
+ }
1826
+ from {
1827
+ -webkit-transform: translate3d(0, -50%, 0);
1828
+ transform: translate3d(0, -50%, 0);
1829
+ opacity: 1;
1830
+ }
1831
+ }
1832
+ .rsssl-wizard-wrap {
1833
+ margin: 0;
1834
+ }
1835
+ #rsssl-proof-of-consent #rsssl-content-area,
1836
+ #rsssl-cookie-banner #rsssl-content-area {
1837
+ display: block;
1838
+ }
1839
+ #rsssl-proof-of-consent #rsssl-content-area h1,
1840
+ #rsssl-cookie-banner #rsssl-content-area h1 {
1841
+ background-color: white;
1842
+ padding: 20px;
1843
+ border-bottom: 1px solid #eeeeee;
1844
+ }
1845
+ #rsssl-proof-of-consent #rsssl-content-area .rsssl-panel,
1846
+ #rsssl-cookie-banner #rsssl-content-area .rsssl-panel {
1847
+ padding: 20px;
1848
+ margin-bottom: 20px;
1849
+ }
1850
+ #rsssl-proof-of-consent #rsssl-content-area .rsssl-notice,
1851
+ #rsssl-cookie-banner #rsssl-content-area .rsssl-notice {
1852
+ background-color: white;
1853
+ }
1854
+ #rsssl-proof-of-consent #rsssl-content-area input[name=rsssl_generate_snapshot],
1855
+ #rsssl-cookie-banner #rsssl-content-area input[name=rsssl_generate_snapshot] {
1856
+ width: 120px;
1857
+ }
1858
+ #rsssl-proof-of-consent #rsssl-content-area .rsssl-month-select,
1859
+ #rsssl-cookie-banner #rsssl-content-area .rsssl-month-select,
1860
+ #rsssl-proof-of-consent #rsssl-content-area .rsssl-year-select,
1861
+ #rsssl-cookie-banner #rsssl-content-area .rsssl-year-select,
1862
+ #rsssl-proof-of-consent #rsssl-content-area #post-query-submit,
1863
+ #rsssl-cookie-banner #rsssl-content-area #post-query-submit {
1864
+ float: right;
1865
+ margin-top: -50px;
1866
+ width: 120px;
1867
+ }
1868
+ #rsssl-proof-of-consent #rsssl-content-area #post-query-submit,
1869
+ #rsssl-cookie-banner #rsssl-content-area #post-query-submit {
1870
+ margin-right: 0;
1871
+ }
1872
+ #rsssl-proof-of-consent #rsssl-content-area .rsssl-month-select,
1873
+ #rsssl-cookie-banner #rsssl-content-area .rsssl-month-select {
1874
+ margin-right: 290px;
1875
+ }
1876
+ #rsssl-proof-of-consent #rsssl-content-area .rsssl-year-select,
1877
+ #rsssl-cookie-banner #rsssl-content-area .rsssl-year-select {
1878
+ margin-right: 145px;
1879
+ }
1880
+ #rsssl-proof-of-consent #rsssl-content-area .tablenav,
1881
+ #rsssl-cookie-banner #rsssl-content-area .tablenav {
1882
+ display: none;
1883
+ }
1884
+ #rsssl-proof-of-consent #rsssl-content-area #rsssl-cookiestatement-snapshot-filter,
1885
+ #rsssl-cookie-banner #rsssl-content-area #rsssl-cookiestatement-snapshot-filter {
1886
+ padding-top: 20px;
1887
+ }
1888
+ #rsssl-proof-of-consent #rsssl-content-area .wp-list-table,
1889
+ #rsssl-cookie-banner #rsssl-content-area .wp-list-table {
1890
+ font-weight: bold;
1891
+ }
1892
+ #rsssl-proof-of-consent #rsssl-content-area .wp-list-table th,
1893
+ #rsssl-cookie-banner #rsssl-content-area .wp-list-table th {
1894
+ font-weight: bold;
1895
+ }
1896
+ #rsssl-proof-of-consent #rsssl-content-area .wp-list-table th a,
1897
+ #rsssl-cookie-banner #rsssl-content-area .wp-list-table th a {
1898
+ padding: 15px;
1899
+ }
1900
+ #wpbody-content .update-nag {
1901
+ display: none;
1902
+ }
1903
+ #wpbody-content .subsubsub {
1904
+ display: none;
1905
+ }
1906
+ #wpbody-content .wp-heading-inline {
1907
+ padding: 20px 0;
1908
+ }
1909
+ #wpbody-content .rsssl-document-button {
1910
+ margin-top: 22px;
1911
+ margin-left: 15px;
1912
+ }
1913
+ #wpbody-content .cookie-warning .rsssl-document-button {
1914
+ margin-top: 0;
1915
+ }
1916
+ #wpbody-content #rsssl-region-select {
1917
+ margin-top: -6px;
1918
+ margin-left: 15px;
1919
+ width: 100px;
1920
+ }
1921
+ #posts-filter .bulkactions,
1922
+ #posts-filter .tablenav-pages,
1923
+ #posts-filter .search-box {
1924
+ display: none;
1925
+ }
1926
+ #posts-filter .tablenav.top {
1927
+ margin-top: 0;
1928
+ padding-top: 0;
1929
+ }
1930
+ #posts-filter .wp-list-table {
1931
+ font-weight: bold;
1932
+ }
1933
+ #posts-filter .wp-list-table th {
1934
+ font-weight: bold;
1935
+ }
1936
+ #posts-filter .wp-list-table th a {
1937
+ padding: 15px;
1938
+ }
1939
+ /*# sourceMappingURL=wizard.css.map */
lets-encrypt/wizard/assets/css/wizard.css.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["wizard.less"],"names":[],"mappings":"AAeA;EACE,cAAA;EACA,kBAAA;EACA,sBAAA;EACA,UAAA;EACA,mBAAA;;AAEF;EACE,aAAA;EACA,cAAA;;AAEF,cAAe,6BACb,EAAC;EACC,gBAAA;;;;;AAMJ;EACE,kBAAA;;AACA,cAAC;EACC,SAAS,GAAT;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,kCAAA;EACA,8BAAA;EACA,iBAAA;EACA,qCAAA;;AAGJ;EACM,aAAA;EACA,iCAAA;;AAFN,mBAKM;EACE,UAAA;;AANR,mBASM;EACE,aAAA;EACA,gCAAA;EACA,aAAA;EAMA,8BAAA;EACA,qBAAA;;AAnBR,mBASM,oBAKE;EACE,eAAA;;AAMF,mBAZF,oBAYG;EACC,gCAAA;;AADF,mBAZF,oBAYG,2CAGC;EACE,mBAAA;;AAzBZ,mBA8BM,uBAAuB;EACrB,wBAAA;EACA,eAAA;;AAhCR,mBAmCM;EACE,mBAAA;EACA,YAAA;EACA,kBAAA;;AAtCR,mBAmCM,2BAKE;EACE,sBAAA;EACA,8BAAA;EACA,YAAA;EACA,mBAAA;EACA,kBAAA;;AACA,mBAXJ,2BAKE,iCAMG;EACC,yBAAA;;AA/CZ,mBAoDM;EACE,sBAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;;AAxDR,mBA2DM;EACE,uBAAA;EACA,YAAA;EACA,gBAAA;EACA,oBAAA;EACA,gDAAA;;AAhER,mBA2DM,mBAOE,mBAAmB;EACjB,iBAAA;;AAnEV,mBA2DM,mBAUE;EACE,YAAA;;AAtEV,mBA2DM,mBAeE,YACE;EAKE,qBAAA;;AAJA,mBAjBN,mBAeE,YACE,mBACG,WAAY,EAAE;EACb,cAAA;;AA7Ed,mBA2DM,mBAeE,YACE,mBAOE;EACE,qBAAA;EACA,iBAAA;EACA,qBAAA;EACA,OAAO,0BAAP;;AAtFd,mBA2DM,mBAeE,YACE,mBAOE,EAME;EACE,eAAA;EACA,SAAA;;AAIJ,mBAnCN,mBAeE,YACE,mBAmBG,OAAQ,EAAE;EACT,cAAA;;AAGF,mBAvCN,mBAeE,YACE,mBAuBG,MAAO,EACN;EACE,0BAAA;;AAIJ,mBA7CN,mBAeE,YACE,mBA6BG,OAAO,MAAO;EACb,iBAAA;EACA,oBAAA;;AA1Gd,mBA2DM,mBAeE,YAoCE;EACE,aAAA;EACA,+BAAA;EAOA,cAAA;;AAvHZ,mBA2DM,mBAeE,YAoCE,eAIE;EACE,kBAAA;EACA,oBAAA;;AApHd,mBA2DM,mBAeE,YAoCE,eAWE;EASE,qBAAA;EACA,qBAAA;EACA,gBAAA;;AApId,mBA2DM,mBAeE,YAoCE,eAWE,EACE;EACE,cAAA;;AAGF,mBAnER,mBAeE,YAoCE,eAWE,EAKG,QAAS;EACR,cAAA;;AA/HhB,mBA2DM,mBAeE,YAoCE,eAWE,EAaE;EACE,eAAA;EACA,mBAAA;EACA,SAAA;;AAIJ,mBAlFN,mBAeE,YAoCE,eA+BG,OAAQ,EAAE;EACT,WAAA;;AAGF,mBAtFN,mBAeE,YAoCE,eAmCG,MAAO,EACN;EACE,0BAAA;;AAIJ,mBA5FN,mBAeE,YAoCE,eAyCG,OAAO,MAAO;EACb,iBAAA;EACA,oBAAA;;AAzJd,mBAgKM;EACE,YAAA;;AAjKR,mBAgKM,uBAGE;EACE,SAAA;;AApKV,mBAgKM,uBAOE,EAAC,IAAI;EACH,eAAA;;AAxKV,mBAgKM,uBAWE;EACE,aAAA;EACA,iCAAA;EACA,qBAAA;;AA9KV,mBAgKM,uBAWE,KAKE;EACE,uBAAA;;AAjLZ,mBAgKM,uBAWE,KASE;AApLV,mBAgKM,uBAWE,KASuB,sBACrB;EACE,oBAAA;EACA,uBAAA;EACA,yBAAA;;AAxLZ,mBAgKM,uBAWE,KAiBE,aAAa;EACX,mBAAA;;AA7LZ,mBAgKM,uBAWE,KAqBE;EACE,uBAAA;EACA,oBAAA;EACA,yBAAA;;AAnMZ,mBAgKM,uBAWE,KA2BE;EACE,mBAAA;EACA,aAAA;EACA,iCAAA;EACA,qBAAA;;AA1MZ,mBAgKM,uBAWE,KA2BE,aAME;EACE,oBAAA;;AA7Md,mBAgKM,uBAWE,KA2BE,aAUE;EACE,gBAAA;;AAjNd,mBAgKM,uBAWE,KA0CE;EACE,oBAAA;EACA,uBAAA;EACA,aAAA;EACA,aAAA;EACA,mBAAA;EACA,+BAAA;;AA3NZ,mBAgKM,uBAWE,KA0CE,sBAQE;EACE,oBAAA;;AA9Nd,mBAgKM,uBAWE,KA0CE,sBAQE,yBAGE,MAAM;EACJ,iBAAA;;AAjOhB,mBAwOM;EACE,aAAA;EACA,qCAAA;EACA,aAAA;EACA,mBAAA;EACA,mBAAA;;AA7OR,mBAwOM,uBAOE;EACE,iBAAA;EACA,mBAAA;;AAjPV,mBAqPM;EACE,aAAA;EACA,8BAAA;EACA,aAAA;EACA,mBAAA;;AAzPR,mBAqPM,0BAME;EACE,mBAAA;EACA,gBAAA;EACA,kBAAA;;AAEA,mBAXJ,0BAME,GAKG;EACC,aAAA;;AAjQZ,mBAqPM,0BAgBE;EACE,oBAAA;;AAtQV,mBA0QM,qBACE;EACE,mBAAA;EACA,eAAA;;AA7QV,mBA0QM,qBAME;EACE,kBAAA;EACA,aAAA;EACA,0BAAA;EACA,aAAA;EACA,yBAAA;;AAOV;;;;;;;;;;;;;;AAAA,aAIE;EACE,aAAA;EACA,cAAA;EACA,kBAAA;;AACA,aAJF,YAIG;EACC,kBAAA;;AAEF,aAPF,YAOG;EACC,cAAA;;AADF,aAPF,YAOG,cAEC;EACE,aAAA;EACA,eAAA;;AAIJ,aAfF,YAeG;EACC,cAAA;;AADF,aAfF,YAeG,YAEC;EACE,aAAA;EACA,eAAA;;AAIJ,aAvBF,YAuBG;EACC,cAAA;;AADF,aAvBF,YAuBG,eAEC;EACE,aAAA;EACA,eAAA;;AAIJ,aA/BF,YA+BG;EACC,cAAA;;AADF,aA/BF,YA+BG,YAEC;EACE,aAAA;EACA,eAAA;;AAIJ,aAvCF,YAuCG,iBAAiB;EAChB,eAAA;;AA5CN,aAgDE;EACE,YAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;;AApDJ,aAsDE;EACE,YAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;;AA1DJ,aAkEE;EACE,mBAAA;;AAnEJ,aAsEE,gBACE;EACE,aAAA;EACA,mBAAA;;AAzEN,aAsEE,gBACE,aAGE;EACE,iBAAA;EACA,eAAA;;AA5ER,aAkFE;EACE,cAAA;EACA,kBAAA;EACA,kBAAA;;;;;;;;;AArFJ,aAkFE,0BAME;EACE,kBAAA;EACA,UAAA;EACA,eAAA;EACA,SAAA;EACA,QAAA;;AA7FN,aAkFE,0BAeE;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,yBAAA;;AAxGN,aAkFE,0BA0BE,WAAW;EACT,SAAS,EAAT;EACA,kBAAA;EACA,aAAA;;AA/GN,aAkFE,0BAiCE,MAAK,QAAS,aAAa;EACzB,cAAA;EACA,aAAA;EACA,eAAA;;AAtHN,aAkFE,0BAwCE,WAAW;EACT,WAAA;EACA,QAAA;EACA,WAAA;EACA,YAAA;;AA9HN,aAkFE,0BAgDE,WAAU,cAAe;EACvB,cAAA;EACA,UAAA;EACA,YAAA;;AAIF,aAvDF,0BAuDG;EACC,oBAAA;;AADF,aAvDF,0BAuDG,eAEC;EACE,sBAAA;;AAHJ,aAvDF,0BAuDG,eAEC,WAEE;EACE,YAAA;EACA,UAAA;;AA/IV,aAyJE;EACE,cAAA;EACA,kBAAA;EACA,kBAAA;;;;;;;;;AA5JJ,aAyJE,uBAME;EACE,kBAAA;EACA,UAAA;EACA,eAAA;EACA,SAAA;EACA,QAAA;;AApKN,aAyJE,uBAeE;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,YAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;;AA/KN,aAyJE,uBA0BE,UAAU;EACR,SAAS,EAAT;EACA,kBAAA;EACA,aAAA;;AAtLN,aAyJE,uBAiCE,MAAK,QAAS,YAAY;EACxB,cAAA;EACA,yBAAA;;AA5LN,aAyJE,uBAuCE,UAAU;EACR,SAAA;EACA,QAAA;EACA,WAAA;EACA,YAAA;;AApMN,aAyJE,uBA+CE,UAAS,cAAe;EACtB,cAAA;EACA,sBAAA;;AAIF,aArDF,uBAqDG;EACC,oBAAA;;AADF,aArDF,uBAqDG,eAEC;EACE,sBAAA;;AAHJ,aArDF,uBAqDG,eAEC,UAEE;EACE,sBAAA;;AAnNV,aA0NE,SAAQ;AA1NV,aA2NE,MAAK,aAAa;AA3NpB,aA4NE,MAAK,iBAAiB;AA5NxB,aA6NE,MAAK,cAAc;AA7NrB,aA8NE,MAAK,aAAa;AA9NpB,aA+NE,MAAK,aAAa;EAChB,kBAAA;EACA,kBAAA;;AAjOJ,aA0NE,SAAQ,WAQN,OAAO;AAlOX,aA2NE,MAAK,aAAa,WAOhB,OAAO;AAlOX,aA4NE,MAAK,iBAAiB,WAMpB,OAAO;AAlOX,aA6NE,MAAK,cAAc,WAKjB,OAAO;AAlOX,aA8NE,MAAK,aAAa,iBAIhB,OAAO;AAlOX,aA+NE,MAAK,aAAa,mBAGhB,OAAO;EACL,cAAA;EACA,kBAAA;EACA,iBAAA;EACA,iBAAA;EACA,UAAA;;AAvON,aA0NE,SAAQ,WAQN,OAAO,YAML;AAxON,aA2NE,MAAK,aAAa,WAOhB,OAAO,YAML;AAxON,aA4NE,MAAK,iBAAiB,WAMpB,OAAO,YAML;AAxON,aA6NE,MAAK,cAAc,WAKjB,OAAO,YAML;AAxON,aA8NE,MAAK,aAAa,iBAIhB,OAAO,YAML;AAxON,aA+NE,MAAK,aAAa,mBAGhB,OAAO,YAML;EACE,WAAA;EACA,YAAA;;AAMJ,aADF,SAAQ,WACL,QAAS,OAAO;AACjB,aAFF,SAAQ,WAEL,MAAO,OAAO;EACb,kBAAA;;AAQF,aAJF,SAAQ,WAIL,MAAO,OAAO;AAAf,aAHF,MAAK,aAAa,WAGf,MAAO,OAAO;AAAf,aAFF,MAAK,iBAAiB,WAEnB,MAAO,OAAO;AAAf,aADF,MAAK,cAAc,WAChB,MAAO,OAAO;EACb,aAAA;;AAEF,aAPF,SAAQ,WAOL,QAAS,OAAO;AAAjB,aANF,MAAK,aAAa,WAMf,QAAS,OAAO;AAAjB,aALF,MAAK,iBAAiB,WAKnB,QAAS,OAAO;AAAjB,aAJF,MAAK,cAAc,WAIhB,QAAS,OAAO;EACf,aAAA;;AA9PN,aAkQE,MAAK;EACH,yBAAA;;AAnQJ,aAwQE,MAAK;AAxQP,aAwQsB,MAAK;AAxQ3B,aAwQ8C,MAAK;AAxQnD,aAwQmE;AAxQnE,aAwQ2E;AAxQ3E,aAwQqF;AAxQrF,aAwQ+F,MAAK;EAIhG,kBAAA;;AA5QJ,aA8QE;EACE,aAAA;EACA,WAAA;EACA,aAAA;EACA,cAAA;;AAlRJ,aAsRE;EACE,cAAA;;AAvRJ,aAyRE;EACE,cAAA;;AA1RJ,aA6RE;EACE,cAAA;;AA9RJ,aAiSE;EACE,cAAA;;AAlSJ,aAoSE;EACE,cAAA;;AArSJ,aA0SE,oBAAoB;EAClB,yBAAA;;AA3SJ,aA8SE;EACE,gBAAA;;AA/SJ,aAkTE,YAAW;EACT,aAAA;EACA,eAAA;EACA,0BAAA;;AArTJ,aAkTE,YAAW,eAIT;EACE,kBAAA;;AAvTN,aAkTE,YAAW,eAIT,iBAIE;EACE,aAAA;;AA3TR,aAkTE,YAAW,eAIT,iBAOE;EACE,aAAA;;AA9TR,aAkTE,YAAW,eAIT,iBAWE;EACE,eAAA;;AAlUR,aAkTE,YAAW,eAIT,iBAeE;EACE,aAAA;EACA,8BAAA;EACA,qBAAA;;AAxUR,aAkTE,YAAW,eAIT,iBAeE,6BAKE;EACE,cAAA;;AA3UV,aAkTE,YAAW,eAIT,iBAyBE;EACE,QAAQ,iBAAR;EACA,OAAO,iBAAP;EACA,iBAAA;EAEA,aAAA;EACA,iCAAA;EACA,uBAAA;;AAtVR,aAkTE,YAAW,eAIT,iBAmCE,gBAAgB;EACd,mBAAA;EACA,SAAA;EACA,WAAA;;AA5VR,aAkTE,YAAW,eAIT,iBAyCE;EACE,uBAAA;EACA,eAAA;;AAjWR,aAkTE,YAAW,eAIT,iBA8CE,gBAAgB;EACd,aAAA;EACA,8BAAA;EACA,qBAAA;EACA,yBAAA;;AAxWR,aAkTE,YAAW,eA0DT,iBAAgB,IACd,gBAAgB;EACd,aAAA;EACA,yBAAA;EACA,8BAAA;EACA,gBAAgB,gCAAhB;;AAGF,aAlEJ,YAAW,eA0DT,iBAAgB,IAQb,oBAAqB,gBAAgB;EACpC,mBAAA;;AArXR,aAkTE,YAAW,eAwET,cAAc;EACZ,mBAAA;EACA,aAAA;EACA,kCAAA;EACA,qBAAA;;AA9XN,aAkTE,YAAW,eAwET,cAAc,aAMZ;EACE,mBAAA;;AAjYR,aAkTE,YAAW,eAmFT,cAAc;EACZ,mBAAA;EACA,aAAA;EACA,wCAAA;EACA,qBAAA;;AAzYN,aAkTE,YAAW,eAmFT,cAAc,aAMZ;EACE,mBAAA;;AA5YR,aAkTE,YAAW,eA8FT,oBAAmB,aAAc;AAhZrC,aAkTE,YAAW,eA8FsC,mBAAkB,aAAc;EAC7E,aAAA;EACA,+CAAA;EACA,qBAAA;;AAnZN,aAkTE,YAAW,eA8FT,oBAAmB,aAAc,aAK/B;AArZN,aAkTE,YAAW,eA8FsC,mBAAkB,aAAc,aAK7E;EACE,mBAAA;;AAtZR,aAkTE,YAAW,eAwGT;EACE,aAAA;EACA,6BAAA;EACA,iBAAA;;AA7ZN,aAkTE,YAAW,eAwGT,8BAKE;EACE,eAAA;;AAhaR,aAkTE,YAAW,eAwGT,8BAQE;EACE,eAAA;;AAnaR,aAkTE,YAAW,eAqHT;EACE,WAAA;;AAxaN,aAkTE,YAAW,eAyHT;EACE,mBAAA;;AA5aN,aAkTE,YAAW,eA6HT;EACE,yBAAA;;AAhbN,aAkTE,YAAW,eAiIT;AAnbJ,aAkTE,YAAW,eAkIT;EACE,mBAAA;;AArbN,aAkTE,YAAW,eAsIT,aAAY;EACV,mBAAA;;AAzbN,aAkTE,YAAW,eA0IT,aAAY;EACV,mBAAA;;AA7bN,aAkTE,YAAW,eA8IT,aAAY;EACV,oBAAA;;AAjcN,aAkTE,YAAW,eAkJT,aAAY;EACV,oBAAA;;AArcN,aAkTE,YAAW,eAsJT,oBAAoB;EAClB,mBAAA;EACA,SAAA;EACA,yBAAA;EACA,eAAA;;AA5cN,aAkTE,YAAW,eA6JT,gBAAgB;EACd,eAAA;EACA,eAAA;;AAjdN,aAkTE,YAAW,eAkKT,MAAM;EACJ,eAAA;;AArdN,aAkTE,YAAW,eAsKT;EACE,aAAA;;AAzdN,aAkTE,YAAW,eA0KT,sBAAqB,IAAI;EACvB,cAAA;EACA,kBAAA;EACA,WAAA;;AA/dN,aAkTE,YAAW,eAgLT;EACE,kBAAA;EACA,UAAA;EACA,WAAA;;AAreN,aAkTE,YAAW,eAsLT;EACE,kBAAA;;AAzeN,aAkTE,YAAW,eA0LT,qBAAqB;EACnB,UAAA;;AA7eN,aAkTE,YAAW,eA0LT,qBAAqB,aAEnB;EACE,SAAA;;AA/eR,aAqfE,MAAK;AArfP,aAsfE,MAAK;EACH,wBAAA;EACA,SAAA;;AAxfJ,aA4fE,MAAK;EACH,0BAAA;;AAKJ;EACE,aAAA;EACA,mBAAA;;AAFF,mCAGE;EACE,iBAAA;;AAIJ;EACE,wBAAA;;;AAIF;EACE,kBAAA;;EACA,gBAAA;;;AAIF,eAAe;AACf,eAAe;EACb,oBAAA;;EACA,cAAA;;EACA,cAAA;EACA,iBAAA;EACA,oBAAA;EACA,kBAAA;EACA,aAAA;EACA,UAAA;;AAGF,eAAe;EACb,SAAS,EAAT;EACA,6BAAA;;EACA,aAAA;;;AAGF,eAAe;EACb,SAAS,mBAAT;;EACA,cAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,kBAAA;EACA,oBAAA;EACA,gDAAA;EACA,gBAAA;EACA,WAAA;EACA,aAAA;;;;AAIF,eAAe,MAAM;AACrB,eAAe,MAAM;EACnB,cAAA;;;AAIF,kBAAkB;AAClB,kBAAkB;EAChB,wBAAA;;;AAIF,eAAe,IAAI,QAAQ;AAC3B,eAAe,YAAY;EACzB,YAAA;EACA,sBAAA;EACA,sBAAA;;AAGF,eAAe,IAAI,QAAQ;AAC3B,eAAe,YAAY;EACzB,QAAQ,gBAAR;;AAGF,eAAe,IAAI,QAAQ;AAC3B,eAAe,IAAI,QAAQ;AAC3B,eAAe,YAAY;AAC3B,eAAe,YAAY;EACzB,SAAA;EACA,WAAW,uBAAX;;;AAIF,eAAe,cAAc;EAC3B,SAAA;EACA,mBAAA;EACA,yBAAA;;AAGF,eAAe,cAAc;EAC3B,KAAK,gBAAL;;AAGF,eAAe,cAAc;AAC7B,eAAe,cAAc;EAC3B,SAAA;EACA,WAAW,sBAAX;;;AAIF,eAAe,cAAc;EAC3B,QAAA;EACA,qBAAA;EACA,uBAAA;EACA,MAAM,eAAN;EACA,WAAW,uBAAX;;AAGF,eAAe,cAAc;EAC3B,QAAA;EACA,OAAO,gBAAP;EACA,WAAW,uBAAX;;;AAIF,eAAe,eAAe;EAC5B,QAAA;EACA,oBAAA;EACA,wBAAA;EACA,OAAO,gBAAP;EACA,WAAW,sBAAX;;AAGF,eAAe,eAAe;EAC5B,QAAA;EACA,MAAM,iBAAN;EACA,WAAW,sBAAX;EACA,gBAAA;;;AAIF;EACE;IACE,YAAA;IACA,WAAW,kBAAX;;;AAIJ;EACE;IACE,YAAA;IACA,WAAW,kBAAX;;;;AAKJ,eAAe,IAAI,QAAQ,MAAM;AACjC,eAAe,IAAI,QAAQ,MAAM;AACjC,eAAe,YAAY,MAAM;AACjC,eAAe,YAAY,MAAM;AACjC,eAAe,cAAc,MAAM;AACnC,eAAe,cAAc,MAAM;EACjC,gDAAA;;AAGF,eAAe,cAAc,MAAM;AACnC,eAAe,cAAc,MAAM;AACnC,eAAe,eAAe,MAAM;AACpC,eAAe,eAAe,MAAM;EAClC,gDAAA;;AAGF;EACE,eAAA;;AADF,aAEE;EACE,uBAAA;EACA,YAAA;EACA,mBAAA;EACA,eAAA;;AANJ,aAQE;EACE,YAAA;EACA,gBAAA;;AAIJ,eAAgB;EACd,0BAAA;;AAGF,wBACE;EAj+BA,kBAAA;EAs+BE,kBAAA;EACA,WAAA;EA4BA,kBAAA;EACA,kBAAA;EACA,WAAA;EACA,yBAAA;EACA,gBAAA;;AAvCJ,wBACE,kBACE;EACE,gBAAA;;AAl+BJ,wBAg+BA,kBAh+BC;EACC,SAAS,GAAT;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,kCAAA;EACA,8BAAA;EACA,iBAAA;EACA,qCAAA;;AAg+BA,wBARF,kBAQG;EACC,yBAAA;EAKA,YAAA;EACA,aAAA;;AALA,wBAVJ,kBAQG,aAEE;EACC,gCAAA;EACA,KAAK,gBAAL;;AAMJ,wBAlBF,kBAkBG;EACC,uBAAA;EACA,cAAA;EACA,YAAA;EACA,UAAA;;AAGF,wBAzBF,kBAyBG;EAIC,cAAA;EACA,yBAAA;EACA,qBAAA;;AALA,wBA1BJ,kBAyBG,cACE;EACC,gCAAA;;AAaJ,wBAxCF,kBAwCG;EACC,yBAAA;;AA1CN,wBACE,kBA4CE;EACE,WAAA;;AAKN,CAAC;AAAS,CAAC;EACT,WAAA;;AAGF,CAAC,OAAO;EACN,cAAA;EACA,iBAAA;EACA,YAAA;EACA,gBAAA;EACA,gBAAA;EACA,iBAAA;;AAGF;EACE,qBAAA;EACA,qBAAA;EACA,UAAA;;AAGF;EACE,eAAA;;AAEA,eAAC;EACC,gBAAA;;AAMJ,eACE;EACE,eAAA;;AACA,eAFF,IAEG;EACC,kBAAA;;AAKN;EAEE,mBAAA;;AAFF,qBAIE,oBAAoB;AAJtB,qBAKE,qBAAqB;EACnB,eAAA;;AACA,qBAHF,oBAAoB,MAGjB;AAAD,qBAFF,qBAAqB,MAElB;EACC,kBAAA;;AARN,qBAYE,gBAAgB;AAZlB,qBAaE,gBAAgB;EACd,cAAA;;AAdJ,qBAiBE;EACE,mBAAA;;AACA,qBAFF,2BAEG;EACC,kBAAA;;AApBN,qBAwBE;EACE,eAAA;EACA,mBAAA;;AAKJ;EACE,yBAAA;EACA,aAAA;EACA,4CAAA;EACA,qBAAA;EACA,mBAAA;;AAGF;EAqFE,0BAAA;EAMA,cAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;EACA,kBAAA;EACA,SAAA;;AA/FA,YAAC;EACC,cAAA;;AAGF,YAAC;EACC,yBAAA;;AANJ,YASE;EACE,eAAA;;AAVJ,YAaE,aAAa;EACX,cAAA;;AAdJ,YAiBE;EACE,YAAA;;AAGF,YAAC;AACD,YAAC;EACC,UAAA;;AAFF,YAAC,kBAIC;AAHF,YAAC,iBAGC;EACE,aAAA;EACA,mBAAA;;AANJ,YAAC,kBAIC,oBAGE;AANJ,YAAC,iBAGC,oBAGE;EACE,kBAAA;;AARN,YAAC,kBAYC;AAXF,YAAC,iBAWC;EACE,aAAA;EACA,kCAAA;EACA,mBAAA;EAoBA,wBAAA;;AAjBE,YAlBL,kBAYC,mBAKE,KACG;AAAD,YAjBL,iBAWC,mBAKE,KACG;EACC,gBAAA;EACA,mBAAA;EACA,uBAAA;;AAEF,YAvBL,kBAYC,mBAKE,KAMG;AAAD,YAtBL,iBAWC,mBAKE,KAMG;EACC,aAAA;EACA,qBAAA;EACA,yBAAA;;AAHF,YAvBL,kBAYC,mBAKE,KAMG,aAIC;AAJF,YAtBL,iBAWC,mBAKE,KAMG,aAIC;EACE,WAAA;EACA,YAAA;EACA,gBAAA;;AA9BV,YAAC,kBAsCC;AArCF,YAAC,iBAqCC;EACE,0BAAA;;AAMF,YADD,iBACE;AAAW,YADb,iBACc;EACX,uEAAA;;AAnEN,YAuEE;EACE,aAAA;EACA,sBAAA;EACA,yBAAA;EACA,aAAA;EACA,8BAAA;EACA,+BAAA;EACA,kBAAA;;AA9EJ,YAiFE;EACE,eAAA;;AAlFJ,YAuFE;EACE,0BAAA;;AAUF,YAAC;EACC,sBAAA;EACA,SAAA;EACA,YAAA;EACA,yBAAA;;AAGF,YAAC;EACC,uBAAA;EACA,cAAA;EACA,YAAA;EACA,UAAA;;AAGF,YAAC;EAhtCD,kBAAA;EAqtCE,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,qBAAA;;AAvtCF,YA+sCC,cA/sCA;EACC,SAAS,GAAT;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,kCAAA;EACA,8BAAA;EACA,iBAAA;EACA,qCAAA;;AAysCA,YAFD,cAEE;EACC,gCAAA;;AAnHN,YA2HE;EACE,qBAAA;EACA,iBAAA;;AAMJ,KAAK;AAAe,KAAK;AAAmB,KAAK;AAAgB,KAAK;EACpE,WAAA;;;;;AAOF;EAKE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,YAAA;;AARF,aACE;EACE,wBAAA;;AASJ;EACE,kBAAA;EACA,eAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,sBAAA;EACA,wBAAA;EACA,gBAAA;;AAEA,aAAC;EACC,kBAAA;EACA,SAAS,EAAT;EACA,YAAA;EACA,WAAA;EACA,SAAA;EACA,WAAA;EACA,uBAAA;EACA,wBAAA;EACA,gBAAA;;AAGF,aAAC;EACC,mBAAA;;AAGF,aAAC,YAAY;EACX,kBAAA;;AAIJ;EACE,gBAAA;EACA,kBAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,sBAAA;EACA,wBAAA;EACA,gBAAA;;AAEA,gBAAC;EACC,kBAAA;EACA,SAAS,KAAT;EACA,YAAA;;AAGF,gBAAC;EACC,mBAAA;;AAKJ,KAAK,QAAS;EACZ,yBAAA;;AAEA,KAHG,QAAS,gBAGX;EACC,mBAAmB,gBAAnB;EACA,eAAe,gBAAf;EACA,WAAW,gBAAX;;AAWJ,KAAK,QAAQ,SAAU;EACrB,yBAAA;;AAQF,KAAK,MAAO;EACV,2BAAA;;AAIF;EACE,eAAA;;EACA,WAAA;;EACA,YAAA;;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,oCAAA;;EACA,WAAA;;AATF,6BAWE;EACE,kBAAA;EACA,eAAA;EACA,yBAAA;EACA,YAAA;EACA,kBAAA;;EAEA,UAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,YAAA;;AAMJ,IAAK;EACH,0BAAA;;AAGF,eACE;EACE,WAAA;EACA,aAAA;;AAIJ;EACE,eAAA;EACA,gBAAA;;AAGF,mBACE;EACE,gCAAA;EACA,mBAAA;;AAKJ,gBACE,MAAK;EACH,UAAA;;AAIJ;AAAmB;EACjB,kBAAA;EACA,gBAAA;;AAGF;;;AAAA,aACE;AADF,aACM;AADN,aACU;AADV,aACc;AADd,aACkB;AADlB,aACoC;AADpC,aACuD;EACnD,oBAAA;;AAFJ,aAIE;AAJF,aAIM;EACF,eAAA;;AALJ,aAOE;EACE,gBAAA;;AARJ,aAWE;EACE,eAAA;;AAZJ,aAeE;EACE,kBAAA;;AAhBJ,aAeE,aAGE;EACE,sBAAA;EACA,uBAAA;;AApBN,aAeE,aAGE,aAGE;EACE,gBAAA;;AAtBR,aAeE,aAWE;EACE,eAAA;EACA,gBAAA;EACA,iBAAA;;AA7BN,aAeE,aAiBE;EACE,mBAAA;;AAjCN,aAeE,aAiBE,aAEE;EACE,aAAA;EACA,sBAAA;EACA,eAAA;EACA,eAAA;;AAtCR,aAeE,aAiBE,aAEE,MAKE;EACE,aAAA;EACA,gBAAA;EACA,gBAAA;;AA1CV,aAeE,aAiBE,aAEE,MAUE;EACE,gBAAA;EACA,mBAAA;;AAMN,aArCF,aAqCG,aAAc;EACb,gBAAA;;AArDN,aAeE,aAyCE,aACE;EACE,cAAA;EACA,cAAA;;AA3DR,aAeE,aAyCE,aAKE;EACE,UAAA;;AA9DR,aAqEE;AArEF,aAqEe;;;;AArEf,aAqEE,YACE,MAAK,aAAa;AAtEtB,aAqEe,oBACX,MAAK,aAAa;EAChB,YAAA;;AAvEN,aAqEE,YAKE;AA1EJ,aAqEe,oBAKX;AA1EJ,aAqEE,YAK8B;AA1EhC,aAqEe,oBAKiB;EAC1B,eAAA;;AA3EN,aAqEE,YASE,MAAK;AA9ET,aAqEe,oBASX,MAAK;EACH,gBAAA;;AACA,aAXJ,YASE,MAAK,OAEF;AAAD,aAXS,oBASX,MAAK,OAEF;EACC,qBAAA;EACA,YAAA;EACA,iBAAA;;AAEF,aAhBJ,YASE,MAAK,OAOF;AAAD,aAhBS,oBASX,MAAK,OAOF;EACC,uBAAA;EACA,YAAA;EACA,mBAAA;;AAEF,aArBJ,YASE,MAAK,OAYF;AAAD,aArBS,oBASX,MAAK,OAYF;EACC,kBAAA;EACA,kBAAA;;AACA,aAxBN,YASE,MAAK,OAYF,YAGE;AAAD,aAxBO,oBASX,MAAK,OAYF,YAGE;EACC,yBAAA;EACA,qBAAA;;AAOJ,aAjCJ,YAgCE,OACG;AAAD,aAjCS,oBAgCX,OACG;EACC,qBAAA;EACA,YAAA;EACA,iBAAA;;AAzGR,aAqEE,YAyCE,oBAAoB;AA9GxB,aAqEe,oBAyCX,oBAAoB;EAClB,SAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;;AAlHN,aAqEE,YAiDE;AAtHJ,aAqEe,oBAiDX;EACE,mBAAA;;AAvHN,aAqEE,YAqDE;AA1HJ,aAqEe,oBAqDX;EACE,sBAAA;;AA3HN,aAqEE,YA2DE,iBAAgB,OACd;AAjIN,aAqEe,oBA2DX,iBAAgB,OACd;EACE,YAAA;EACA,iBAAA;EACA,WAAA;;AApIR,aAqEE,YA2DE,iBAAgB,OAOd;AAvIN,aAqEe,oBA2DX,iBAAgB,OAOd;EACE,WAAA;EACA,gBAAA;EACA,iBAAA;EACA,0BAAA;;AA3IR,aAqEE,YA0EE,YAAY;AA/IhB,aAqEe,oBA0EX,YAAY;EACV,qBAAA;EACA,YAAA;EACA,eAAA;;AAlJN,aAqEE,YAgFE,aAAa;AArJjB,aAqEe,oBAgFX,aAAa;EACX,YAAA;EACA,eAAA;EACA,qBAAA;EACA,YAAA;;AAIF,mBAAqC;EAArC,aAxFF,YAyFI;EADF,aAxFW,oBAyFT;IACE,8BAAA;;;AAUR;;;AAAA,YAGE;EACE,mBAAA;EACA,kBAAA;;AALJ,YAOE,oBAAmB;EACjB,iBAAA;;AARJ,YAUE,MAAK;AAVP,YAUsB,MAAK;AAV3B,YAU2C,MAAK;EAE5C,qBAAA;;AAZJ,YAeE;EACE,qBAAA;EACA,uBAAA;;AAjBJ,YAoBE,SAAQ,WAAW;AApBrB,YAoB+B,SAAQ,WAAW;EAC9C,8BAAA;EACA,qBAAA;;AAtBJ,YAyBE;EACE,iBAAA;EACA,WAAA;;AA3BJ,YA8BE,MAAK,YAAY,QAAQ;EACvB,SAAS,OAAT;EACA,oBAAA;EACA,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,WAAA;EACA,iBAAA;EACA,yBAAA;;AAIA,YADF,aACG;EACC,mBAAA;;AA5CN,YAgDE;EACE,aAAA;EACA,mBAAA;EACA,YAAA;EAIA,mBAAA;;AAvDJ,YAgDE,wBAIE;AApDJ,YAgDE,wBAIS;AApDX,YAgDE,wBAIiB;EACb,kBAAA;;AArDN,YA0DE,OAAM;EACJ,gBAAA;;AAMJ,CAAC,MAAM;AAAS,MAAM,MAAM;AAAS,KAAK,MAAM;EAC9C,iBAAA;EACA,sBAAA;EACA,yBAAA;EACA,WAAA;EACA,mBAAA;EACA,SAAA;EACA,mBAAA;EACA,gBAAA;;AAEA,CAVD,MAAM,OAUJ;AAAD,MAVoB,MAAM,OAUzB;AAAD,KAVwC,MAAM,OAU7C;EACC,yBAAA;EACA,YAAA;;AAZJ,CAAC,MAAM,OAeL;AAfc,MAAM,MAAM,OAe1B;AAfmC,KAAK,MAAM,OAe9C;EACE,gBAAA;EACA,kBAAA;EACA,gBAAA;EACA,eAAA;EACA,gBAAA;;AAKJ,aAAc,WAAW;EACvB,YAAA;;AAGF,aAAc,WAAW;EACvB,cAAA;;;AAKF,0BACE;EACE,iBAAA;EACA,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;;AACA,mBAAqC;EAArC,0BANF;IAOI,mBAAA;;;AAMN,uBAAwB;EACtB,gBAAA;;AAGF;EACE,qBAAA;EACA,yBAAA;EACA,gBAAA;EACA,iBAAA;;AAJF,iBAME;EACE,YAAA;EACA,YAAA;EACA,qBAAA;EACA,cAAA;EACA,yBAAA;EACA,aAAA;;AAIJ;EACE,uBAAA;EACA,aAAA;EACA,eAAA;;AAHF,0BAKE;EACE,qBAAA;EACA,WAAA;EACA,iBAAA;EACA,yBAAA;EACA,4BAAA;EAEA,6BAAA;EACA,kCAAA;;AAbJ,0BAKE,wBAUE;EACE,aAAA;EACA,mBAAA;;AAjBN,0BAqBE;EACE,sBAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;EACA,eAAA;EACA,cAAA;EACA,0BAAA;EACA,uBAAA;EACA,kBAAA;EACA,qBAAA;EACA,gBAAA;;AAhCJ,0BAmCE,sBAAsB,WAAW;EAC/B,gBAAA;EACA,gBAAA;EACA,aAAA;;AAtCJ,0BAyCE;EACE,cAAA;EACA,aAAA;EACA,qBAAqB,8CAA8C,8DAA8D,oCAAoC,wCAAwC,6BAA7M;EA+BA,cAAA;EACA,aAAA;;AA/BA,mBAAsC;EAAtC,0BAJF;IAKI,qBAAqB,wBAAwB,gCAAgC,oBAAoB,kBAAkB,sBAAsB,gBAAgB,eAAzJ;;;AA9CN,0BAyCE,mCAQE;EACE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;;AArDN,0BAyCE,mCAeE;EACE,aAAA;EACA,mBAAA;;AA1DN,0BAyCE,mCAoBE;EACE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,yBAAA;EACA,eAAA;EACA,YAAA;;AACA,mBAAqC;EAArC,0BA3BJ,mCAoBE,sBAQI;IACE,YAAA;;;AAtEV,0BAyCE,mCAqCE;EACE,eAAA;EACA,iBAAA;EACA,iBAAA;EACA,oBAAA;;AAlFN,0BAyCE,mCA4CE;EACE,YAAA;EACA,gBAAA;EACA,aAAA;;AAxFN,0BAyCE,mCA4CE,sBAKE;EACE,wBAAA;;AA3FR,0BAyCE,mCA4CE,sBASE;EACE,iBAAA;;AAGF,0BAzDJ,mCA4CE,sBAaG;EACC,sBAAA;EACA,WAAA;EACA,gBAAA;;AArGR,0BAyCE,mCAgEE;EAIE,mBAAA;;AAHA,mBAAsC;EAAtC,0BAjEJ,mCAgEE;IAEI,cAAA;;;AA3GR,0BAyCE,mCAgEE,0BAME;EACE,yBAAA;EACA,iBAAA;;AAjHR,0BAyCE,mCAgEE,0BAME,8BAIE;EACE,oBAAA;EACA,eAAA;EACA,iBAAA;EACA,cAAA;EACA,WAAA;;AAxHV,0BAyCE,mCAgEE,0BAME,8BAIE,0BAOE;EACE,cAAA;;AA3HZ,0BAyCE,mCAgEE,0BAuBE;EACE,kBAAA;;AAjIR,0BAyCE,mCAgEE,0BAuBE,2BAGE;EACE,wBAAA;EACA,mBAAA;;AArIV,0BAyCE,mCAgEE,0BAgCE;EACE,gBAAA;EACA,YAAA;;AA3IR,0BAyCE,mCAgEE,0BAqCE;EACE,iBAAA;;AA/IR,0BAyCE,mCAgEE,0BAqCE,mBAGE,GAAE,GAAG;EACH,YAAA;;AAlJV,0BAyCE,mCAgEE,0BAqCE,mBAOE;AArJR,0BAyCE,mCAgEE,0BAqCE,mBAQE;EACE,YAAA;;AAvJV,0BAyCE,mCAmHE;EAEE,YAAA;EAmBA,kBAAA;;AAlBA,mBAAsC;EAAtC,0BAtHJ,mCAmHE;IAII,cAAA;;;AAhKR,0BAyCE,mCAmHE,yBAOE,MAAK;AAnKX,0BAyCE,mCAmHE,yBAOoB,MAAK;AAnK7B,0BAyCE,mCAmHE,yBAOuC;AAnK3C,0BAyCE,mCAmHE,yBAOiD,MAAK;EAClD,YAAA;EACA,kBAAA;EACA,eAAA;;AAtKR,0BAyCE,mCAmHE,yBAaE;EACE,iBAAA;;AA1KR,0BAyCE,mCAmHE,yBAiBE,MAAK;EACH,YAAA;;AA9KR,0BAyCE,mCA2IE;EAIE,oBAAA;EACA,gBAAA;;AAJA,mBAAsC;EAAtC,0BA5IJ,mCA2IE;IAEI,cAAA;;;AAtLR,0BAyCE,mCA2IE,2BAOE;EACE,oBAAA;;AA5LR,0BAyCE,mCA2IE,2BAOE,qBAGE;EACE,iBAAA;;AA/LV,0BAyCE,mCA2IE,2BAOE,qBAOE;EACE,WAAA;;AAnMV,0BAyCE,mCA2IE,2BAOE,qBAWE;EACE,wBAAA;EACA,kBAAA;EACA,gBAAA;EACA,aAAA;EACA,sBAAA;EACA,gBAAA;;AA5MV,0BAyCE,mCA2IE,2BAOE,qBAoBE;EACE,cAAA;EACA,gBAAA;;AAjNV,0BAyCE,mCA2IE,2BAiCE;EACE,YAAA;EACA,uBAAA;EACA,gBAAA;EACA,eAAA;;AAzNR,0BAyCE,mCA2IE,2BAiCE,wBAME;EACE,mBAAA;;AA5NV,0BAyCE,mCA0LE;EACE,iBAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,gBAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;;AA3ON,0BAyCE,mCA0LE,wBAUE;EACE,kBAAA;EACA,2BAAA;EACA,wBAAA;EACA,kBAAA;EACA,yBAAA;EACA,YAAA;EACA,gBAAA;EAEA,gBAAA;;AAtPR,0BAyCE,mCA0LE,wBAUE,oBAWE;EACE,kBAAA;EACA,QAAA;EACA,UAAA;;AA3PV,0BAyCE,mCA0LE,wBAUE,oBAiBE;EACE,eAAA;EACA,gBAAA;EACA,gBAAA;EACA,gBAAA;EACA,kBAAA;;AAnQV,0BAyCE,mCA0LE,wBAUE,oBAyBE;EACE,UAAA;EACA,gBAAA;EACA,gBAAA;EACA,aAAA;;AA1QV,0BAyCE,mCA0LE,wBAUE,oBAgCE;EACE,kBAAA;EACA,kBAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;EACA,YAAA;;AAnRV,0BAyCE,mCA0LE,wBAUE,oBAgCE,oBAQE;EACE,gBAAA;EACA,sBAAA;EACA,gBAAA;;;AAeZ,eAAe;EACb,YAAA;EACA,mBAAA;EACA,WAAA;EACA,aAAA;;EAEA,kBACQ,6GACA,8CACA,8CACA,8CACA,4CALR;EAOA,2BAAA;EAEA,2FAAA;EAOA,gFAAA;EAOA,yBAAA;EACA,8BAAA;;AAEF;EACE;IACE,iGAAA;;;AAWJ;EACE;EAAI;EAAK;IAAO,mBAAmB,WAAnB;;EAChB;IAAM,mBAAmB,SAAnB;;;AAGR;EACE;EAAI;EAAK;IACP,WAAW,WAAX;IACA,mBAAmB,WAAnB;;EACC;IACE,WAAW,SAAX;IACA,mBAAmB,SAAnB;;;AAKP;EACE,iBAAA;;AAUF;EACE,gBAAA;EACA,uBAAA;EACA,kBAAA;;AAIF;EACE,iBAAA;;AAIF;EACE,WAAA;;AAGF;EACE,UAAA;;AAGF,UAAU;EACR,WAAW,mBAAX;EACA,aAAA;;AAGF,UAAU;EACR,aAAA;;AAIF;EACE;IACE,mBAAmB,uBAAnB;IACA,WAAW,uBAAX;;EAEF;IACE,mBAAmB,uBAAnB;IACA,WAAW,uBAAX;;;AAGJ;EACE;IACE,mBAAmB,uBAAnB;IACA,WAAW,uBAAX;IACA,UAAA;;EAEF;IACE,mBAAmB,uBAAnB;IACA,WAAW,uBAAX;IACA,UAAA;;;AAIJ;EACE,SAAA;;AAGF,uBAGE;AAFF,oBAEE;EACE,cAAA;;AAJJ,uBAGE,oBAGE;AALJ,oBAEE,oBAGE;EACE,uBAAA;EACA,aAAA;EAEA,gCAAA;;AAVN,uBAGE,oBAUE;AAZJ,oBAEE,oBAUE;EACE,aAAA;EACA,mBAAA;;AAfN,uBAGE,oBAeE;AAjBJ,oBAEE,oBAeE;EACE,uBAAA;;AAnBN,uBAGE,oBAmBE,MAAK;AArBT,oBAEE,oBAmBE,MAAK;EACH,YAAA;;AAvBN,uBAGE,oBAuBE;AAzBJ,oBAEE,oBAuBE;AA1BJ,uBAGE,oBAwBE;AA1BJ,oBAEE,oBAwBE;AA3BJ,uBAGE,oBAyBE;AA3BJ,oBAEE,oBAyBE;EACE,YAAA;EACA,iBAAA;EACA,YAAA;;AA/BN,uBAGE,oBA+BE;AAjCJ,oBAEE,oBA+BE;EACE,eAAA;;AAnCN,uBAGE,oBAmCE;AArCJ,oBAEE,oBAmCE;EACE,mBAAA;;AAvCN,uBAGE,oBAuCE;AAzCJ,oBAEE,oBAuCE;EACE,mBAAA;;AA3CN,uBAGE,oBA2CE;AA7CJ,oBAEE,oBA2CE;EACE,aAAA;;AA/CN,uBAGE,oBA+CE;AAjDJ,oBAEE,oBA+CE;EACE,iBAAA;;AAnDN,uBAGE,oBAmDE;AArDJ,oBAEE,oBAmDE;EACE,iBAAA;;AAvDN,uBAGE,oBAmDE,eAEE;AAvDN,oBAEE,oBAmDE,eAEE;EACE,iBAAA;;AAzDR,uBAGE,oBAmDE,eAEE,GAEE;AAzDR,oBAEE,oBAmDE,eAEE,GAEE;EACE,aAAA;;AAOV,eACE;EACE,aAAA;;AAFJ,eAIE;EACE,aAAA;;AALJ,eAQE;EACE,eAAA;;AATJ,eAYE;EACE,gBAAA;EACA,iBAAA;;AAdJ,eAgBE,gBAAgB;EACd,aAAA;;AAjBJ,eAoBE;EACE,gBAAA;EACA,iBAAA;EACA,YAAA;;AAIJ,aACE;AADF,aAEE;AAFF,aAGE;EACE,aAAA;;AAJJ,aAOE,UAAS;EACP,aAAA;EACA,cAAA;;AATJ,aAYE;EACE,iBAAA;;AAbJ,aAYE,eAEE;EACE,iBAAA;;AAfN,aAYE,eAEE,GAEE;EACE,aAAA","file":"wizard.css"}
lets-encrypt/wizard/assets/css/wizard.less ADDED
@@ -0,0 +1,2296 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // out: wizard.css, sourcemap: false, compress: false
2
+ @import 'variables.less';
3
+ @brand-primary: @rsp-yellow;
4
+ @brand-secondary: #61ce70;
5
+ @brand-tertiary: #29B6F6;
6
+ @border-radius: 25px;
7
+ @input-background-color: #F1F1F1;
8
+ @input-border-color: #dadada;
9
+ @gray-light: #dadada;
10
+ @gray: #c6c6c6;
11
+ @gray-dark: #888;
12
+ @red-gap: 15px;
13
+ @green-gap: 20px;
14
+ @color-disabled: #F2F2F2;
15
+
16
+ .rsssl-certificate-data {
17
+ right:10000px;
18
+ position:absolute;
19
+ background-color:#fff;
20
+ padding: 0;
21
+ white-space: nowrap;
22
+ }
23
+ .rsssl-copied-feedback-container{
24
+ padding:@default-padding;
25
+ color:@rsp-green;
26
+ }
27
+ .rsssl-section .rsssl_letsencrypt_container {
28
+ a.button {
29
+ margin-top:15px;
30
+ }
31
+ }
32
+ /**
33
+ * class to add a triangle pointer to each div
34
+ */
35
+ .rsssl-pointer {
36
+ position:relative;
37
+ &:after {
38
+ content: " ";
39
+ position: absolute;
40
+ left: -15px;
41
+ top: 15px;
42
+ border-top: 15px solid transparent;
43
+ border-right: 15px solid black;
44
+ border-left: none;
45
+ border-bottom: 15px solid transparent;
46
+ }
47
+ }
48
+ #rsssl-content-area {
49
+ display: grid;
50
+ grid-template-columns: 225px auto;
51
+ //grid-gap: @red-gap;
52
+
53
+ h1 {
54
+ padding: 0;
55
+ }
56
+
57
+ .rsssl-wizard-title {
58
+ padding: @green-gap;
59
+ border-bottom: 1px solid #eeeeee;
60
+ display: flex;
61
+
62
+ h1 {
63
+ font-size: 18px;
64
+ }
65
+
66
+ justify-content: space-between;
67
+ align-content: center;
68
+
69
+ &.rsssl-section-content-notifications-header {
70
+ border-bottom: 1px solid #e6e6e6;
71
+
72
+ h1 {
73
+ font-weight: normal;
74
+ }
75
+ }
76
+ }
77
+
78
+ .rsssl-wizard-subtitle h2 {
79
+ margin: @green-gap @green-gap 0 @green-gap;
80
+ font-size: 14px;
81
+ }
82
+
83
+ .rsssl-wizard-progress-bar {
84
+ background: #eeeeee;
85
+ height: 15px;
86
+ margin: @green-gap 0 0 0;
87
+
88
+ .rsssl-wizard-progress-bar-value {
89
+ transition: width 0.5s;
90
+ -webkit-transition: width 0.5s;
91
+ height: 100%;
92
+ background: @rsp-green;
93
+ border-radius: 4px;
94
+ &.rsssl-error {
95
+ background-color: @rsp-red;
96
+ }
97
+ }
98
+ }
99
+
100
+ .rsssl-priority {
101
+ background-color: #000;
102
+ color:#fff;
103
+ border-color:#000;
104
+ margin-top:10px;
105
+ }
106
+
107
+ .rsssl-wizard-menu {
108
+ background-color: white;
109
+ margin: 0.5 * @green-gap;
110
+ margin-bottom: 0;
111
+ padding-bottom: @green-gap;
112
+ box-shadow: 0 0 5px 5px rgba(222, 222, 222, 0.2);
113
+
114
+ .rsssl-wizard-menu h1 {
115
+ font-weight: bold;
116
+ }
117
+ .rsssl-wizard-progress-bar {
118
+ margin: @green-gap;
119
+ }
120
+
121
+
122
+ .rsssl-step {
123
+ .rsssl-step-header {
124
+ &.incomplete a h2 {
125
+ color: @gray;
126
+ }
127
+
128
+ text-decoration: none;
129
+
130
+ a {
131
+ display: inline-block;
132
+ padding: 5px @green-gap;
133
+ text-decoration: none;
134
+ width: calc(100% - (@green-gap + @green-gap));
135
+
136
+ h2 {
137
+ font-size: 15px;
138
+ margin: 0;
139
+ }
140
+ }
141
+
142
+ &.active a h2 {
143
+ color: @gray !important;
144
+ }
145
+
146
+ &:hover a {
147
+ h2 {
148
+ text-decoration: underline;
149
+ }
150
+ }
151
+
152
+ &.active:hover a {
153
+ background: white;
154
+ pointer-events: none;
155
+ }
156
+ }
157
+
158
+ .rsssl-section {
159
+ display: grid;
160
+ grid-template-columns: @green-gap 1fr;
161
+
162
+ span {
163
+ align-self: center;
164
+ justify-self: center;
165
+ }
166
+
167
+ margin: 0 @green-gap;
168
+
169
+ a {
170
+ h3 {
171
+ color: @gray;
172
+ }
173
+
174
+ &:visited h3 {
175
+ color: initial;
176
+ }
177
+
178
+ display: inline-block;
179
+ text-decoration: none;
180
+ padding: 3px 5px;
181
+
182
+ h3 {
183
+ font-size: 12px;
184
+ font-weight: normal;
185
+ margin: 0;
186
+ }
187
+ }
188
+
189
+ &.active a h3 {
190
+ color: grey;
191
+ }
192
+
193
+ &:hover a {
194
+ h3 {
195
+ text-decoration: underline;
196
+ }
197
+ }
198
+
199
+ &.active:hover a {
200
+ background: white;
201
+ pointer-events: none;
202
+ }
203
+ }
204
+ }
205
+
206
+ }
207
+
208
+ .rsssl-section-content {
209
+ margin: 0.5 * @green-gap;
210
+
211
+ p {
212
+ margin: 0;
213
+ }
214
+
215
+ p:not(:first-child) {
216
+ margin-top: 1em;
217
+ }
218
+
219
+ form {
220
+ display: grid;
221
+ grid-template-columns: auto 325px;
222
+ grid-column-gap: @red-gap;
223
+
224
+ .rsssl-section-content-title-header {
225
+ background-color: white;
226
+ }
227
+
228
+ .rsssl-wizard-intro, .rsssl-template-intro
229
+ .rsssl-master-label {
230
+ grid-column-start: 1;
231
+ background-color: white;
232
+ padding: @green-gap @green-gap 0 @green-gap;
233
+ }
234
+
235
+ //if an intro is nested in a field, we don't need the padding, as the field already has padding
236
+ .rsssl-field .rsssl-wizard-intro {
237
+ padding: 0 0 @green-gap 0;
238
+ }
239
+
240
+ .rsssl-button {
241
+ background-color: white;
242
+ grid-column-start: 1;
243
+ padding: @green-gap @green-gap 0 @green-gap;
244
+ }
245
+
246
+ .field-group {
247
+ grid-column: span 2;
248
+ display: grid;
249
+ grid-template-columns: auto 325px;
250
+ grid-column-gap: @red-gap;
251
+
252
+ .rsssl-field {
253
+ grid-column-start: 1;
254
+ }
255
+
256
+ .rsssl-help-warning-wrap {
257
+ margin-top: @green-gap;
258
+ }
259
+ }
260
+
261
+ .rsssl-section-footer {
262
+ grid-column-start: 1;
263
+ background-color: white;
264
+ padding: @green-gap;
265
+ display: grid;
266
+ align-items: center;
267
+ grid-template-columns: 1fr auto;
268
+
269
+ .rsssl-buttons-container {
270
+ grid-column-start: 2;
271
+
272
+ input +input {
273
+ margin-left: @green-gap;
274
+ }
275
+ }
276
+ }
277
+ }
278
+ }
279
+
280
+ .rsssl-add-pages-table {
281
+ display: grid;
282
+ grid-template-columns: auto auto auto;
283
+ grid-gap: 5px;
284
+ align-items: center;
285
+ margin-bottom: @green-gap;
286
+
287
+ span {
288
+ justify-self: end;
289
+ text-align: justify;
290
+ }
291
+ }
292
+
293
+ .rsssl-link-to-menu-table {
294
+ display: grid;
295
+ grid-template-columns: 30% 30%;
296
+ grid-gap: 5px;
297
+ align-items: center;
298
+
299
+ h3 {
300
+ grid-column: span 2;
301
+ margin-top: @green-gap;
302
+ margin-bottom: 5px;
303
+
304
+ &:first-child {
305
+ margin-top: 0;
306
+ }
307
+ }
308
+
309
+ select {
310
+ grid-column-start: 2;
311
+ }
312
+ }
313
+
314
+ .rsssl-cookies-table {
315
+ h2 {
316
+ font-weight: normal;
317
+ font-size: 15px;
318
+ }
319
+
320
+ .rsssl-cookies-table-body {
321
+ border-radius: 5px;
322
+ display: grid;
323
+ grid-template-columns: 1fr;
324
+ padding: 10px;
325
+ background-color: #f0f2f8;
326
+ }
327
+ }
328
+
329
+
330
+ }
331
+
332
+ #rsssl-wizard {
333
+
334
+ /* ----------- Icons ----------- */
335
+
336
+ .rsssl-icon {
337
+ margin:0 5px;
338
+ width:initial;
339
+ border-radius: 50%;
340
+ &.rsssl-empty {
341
+ visibility:hidden;
342
+ }
343
+ &.rsssl-success {
344
+ color: @brand-primary;
345
+ svg {
346
+ fill: @brand-primary;
347
+ stroke: @brand-primary;
348
+ }
349
+ }
350
+
351
+ &.rsssl-green {
352
+ color: #61ce70;
353
+ svg {
354
+ fill: #61ce70;
355
+ stroke: #61ce70;
356
+ }
357
+ }
358
+
359
+ &.rsssl-disabled {
360
+ color: #ababab;
361
+ svg {
362
+ fill: #ababab;
363
+ stroke: #ababab;
364
+ }
365
+ }
366
+
367
+ &.rsssl-error {
368
+ color: #d7263d;
369
+ svg {
370
+ fill: #d7263d;
371
+ stroke: #d7263d;
372
+ }
373
+ }
374
+
375
+ &.arrow-right-alt2::before {
376
+ font-size: 14px;
377
+ }
378
+ }
379
+
380
+ .rsssl-circle-green {
381
+ height: 12px;
382
+ width: 12px;
383
+ border-radius: 12px;
384
+ background-color: #61ce70;
385
+ }
386
+ .rsssl-circle-red {
387
+ height: 12px;
388
+ width: 12px;
389
+ border-radius: 12px;
390
+ background-color: #d7263d;
391
+ }
392
+
393
+ /* ----------- Fields ----------- */
394
+
395
+ /* Checkbox */
396
+
397
+ /* Disabled option */
398
+ .rsssl-not-allowed {
399
+ cursor: not-allowed;
400
+ }
401
+
402
+ .rsssl-checkbox {
403
+ .rsssl-field {
404
+ display: flex;
405
+ align-items: center;
406
+ .rsssl-wizard-settings-text {
407
+ margin-left: 20px;
408
+ margin-top:5px;
409
+ }
410
+ }
411
+ }
412
+
413
+ /* Customize the label (the container) */
414
+ .rsssl-checkbox-container {
415
+ display: block;
416
+ position: relative;
417
+ padding-left: 35px;
418
+
419
+ /* Hide the browser's default checkbox */
420
+ input {
421
+ position: absolute;
422
+ opacity: 0;
423
+ cursor: pointer;
424
+ height: 0;
425
+ width: 0;
426
+ }
427
+
428
+ /* Create a custom checkbox */
429
+ .checkmark {
430
+ position: absolute;
431
+ top: -2px;
432
+ left: 0;
433
+ height: 20px;
434
+ width: 20px;
435
+ border-radius: 5px;
436
+ border: 1px solid @gray-light;
437
+ }
438
+
439
+ /* Checkmark (hidden when not checked) */
440
+ .checkmark svg {
441
+ content: "";
442
+ position: absolute;
443
+ display: none;
444
+ }
445
+
446
+ /* Show the checkmark when checked */
447
+ input:checked ~ .checkmark svg {
448
+ display: block;
449
+ fill: @brand-primary;
450
+ stroke: @brand-primary;
451
+ }
452
+
453
+ /* Style the checkmark/indicator */
454
+ .checkmark svg {
455
+ left: 2.5px;
456
+ top: 2px;
457
+ width: 15px;
458
+ height: 15px;
459
+ }
460
+
461
+ /* Show the default checkmark when default */
462
+ .checkmark.rsssl-default svg {
463
+ display: block;
464
+ fill: #eee;
465
+ stroke: #eee;
466
+ }
467
+
468
+ /* Disabled option */
469
+ &.rsssl-disabled {
470
+ pointer-events: none;
471
+ .checkmark {
472
+ background-color: #eee;
473
+ svg {
474
+ stroke: #eee !important;
475
+ fill: #eee !important;
476
+ }
477
+ }
478
+ }
479
+ }
480
+
481
+
482
+ /* Radio */
483
+
484
+ /* Customize the label (the container) */
485
+ .rsssl-radio-container {
486
+ display: block;
487
+ position: relative;
488
+ padding-left: 35px;
489
+
490
+ /* Hide the browser's default checkbox */
491
+ input {
492
+ position: absolute;
493
+ opacity: 0;
494
+ cursor: pointer;
495
+ height: 0;
496
+ width: 0;
497
+ }
498
+
499
+ /* Create a custom radio */
500
+ .radiobtn {
501
+ position: absolute;
502
+ top: -2px;
503
+ left: 0;
504
+ height: 20px;
505
+ width: 20px;
506
+ border-radius: 20px;
507
+ border: 1px solid @input-border-color;
508
+ }
509
+
510
+ /* Check icon (hidden when not checked) */
511
+ .radiobtn div {
512
+ content: "";
513
+ position: absolute;
514
+ display: none;
515
+ }
516
+
517
+ /* Show check icon when checked */
518
+ input:checked ~ .radiobtn .rsssl-icon {
519
+ display: block;
520
+ background-color: @brand-primary;
521
+ }
522
+
523
+ /* Style the check icon */
524
+ .radiobtn .rsssl-icon {
525
+ left: 5px;
526
+ top: 3px;
527
+ width: 10px;
528
+ height: 10px;
529
+ }
530
+
531
+ /* Show the default checkmark when default */
532
+ .radiobtn.rsssl-default .rsssl-icon {
533
+ display: block;
534
+ background-color: #eee;
535
+ }
536
+
537
+ /* Disabled option */
538
+ &.rsssl-disabled {
539
+ pointer-events: none;
540
+ .radiobtn {
541
+ background-color: #eee;
542
+ .rsssl-icon {
543
+ background-color: #eee !important;
544
+ }
545
+ }
546
+ }
547
+ }
548
+
549
+ /* Text & Email Validation */
550
+ textarea.validation,
551
+ input[type="text"].validation,
552
+ input[type="password"].validation,
553
+ input[type="email"].validation,
554
+ input[type="text"].rsssl-valid-page,
555
+ input[type="text"].rsssl-deleted-page {
556
+ position: relative;
557
+ padding-left: 30px;
558
+ ~ span .rsssl-icon {
559
+ display: block;
560
+ position: absolute;
561
+ padding-left: 7px;
562
+ margin-top: -25px;
563
+ z-index: 1;
564
+ svg {
565
+ width: 15px;
566
+ height: 15px;
567
+ }
568
+ }
569
+ }
570
+
571
+ textarea.validation {
572
+ &:invalid ~ span .rsssl-icon,
573
+ &:valid ~ span .rsssl-icon {
574
+ margin-top:-143px;
575
+ }
576
+ }
577
+
578
+ textarea.validation,
579
+ input[type="text"].validation,
580
+ input[type="password"].validation,
581
+ input[type="email"].validation {
582
+ &:valid ~ span .rsssl-failed {
583
+ display: none;
584
+ }
585
+ &:invalid ~ span .rsssl-success {
586
+ display: none;
587
+ }
588
+ }
589
+
590
+ input:disabled {
591
+ background-color: @color-disabled;
592
+ }
593
+
594
+ /* Text, Email, Select(2), Textarea Style */
595
+
596
+ input[type="text"], input[type="password"], input[type="email"], select, .select2, textarea, input[type="number"] {
597
+ // box-shadow:
598
+ // 0 1px 1px rgba(0,0,0,0.06),
599
+ // 0 2px 2px rgba(0,0,0,0.06);
600
+ margin-bottom: 2px;
601
+ }
602
+ textarea {
603
+ padding:10px;
604
+ width:100%;
605
+ height: 100px;
606
+ margin: 20px 0; }
607
+
608
+ /* Placeholders */
609
+
610
+ ::placeholder {
611
+ color: @gray-light;
612
+ }
613
+ ::placeholder/* Chrome/Opera/Safari */ {
614
+ color: @gray-light;
615
+ }
616
+
617
+ ::-moz-placeholder /* Firefox 19+ */ {
618
+ color: @gray-light;
619
+ }
620
+
621
+ :-ms-input-placeholder /* IE 10+ */ {
622
+ color: @gray-light;
623
+ }
624
+ :-moz-placeholder /* Firefox 18- */ {
625
+ color: @gray-light;
626
+ }
627
+
628
+
629
+ /* Labels */
630
+ .rsssl-master-label h2 {
631
+ padding: @green-gap @green-gap 0 @green-gap !important;
632
+ }
633
+
634
+ .rsssl-footer-contents {
635
+ border-top: none;
636
+ }
637
+
638
+ .rsssl-grid.rsssl-gridless {
639
+ display: flex;
640
+ flex-wrap: wrap;
641
+ height: inherit !important;
642
+ .rsssl-grid-item {
643
+ position: relative;
644
+ //padding: 0 20px 20px 0;
645
+
646
+ .rsssl-help-warning-wrap {
647
+ display: none;
648
+ }
649
+ .rsssl-comment {
650
+ display: none;
651
+ }
652
+
653
+ .rsssl-grid-header {
654
+ height: initial;
655
+ }
656
+
657
+ .rsssl-grid-header-container {
658
+ display: flex;
659
+ justify-content: space-between;
660
+ align-content: center;
661
+
662
+ .rsssl-grid-controls {
663
+ margin: auto 0;
664
+ }
665
+ }
666
+
667
+ .item-container {
668
+ height: calc(100% - 20px);
669
+ width: calc(100% - 20px);
670
+ margin-left: 10px;
671
+ //margin-top: 10px;
672
+ display: grid;
673
+ grid-template-rows: auto 1fr auto;
674
+ background-color: white;
675
+ }
676
+
677
+ .item-container .item-content {
678
+ padding: 10px 0 0 0;
679
+ margin: 0;
680
+ clear: none;
681
+ }
682
+
683
+ .item-footer {
684
+ background-color: white;
685
+ height: initial;
686
+ }
687
+
688
+ .rsssl-checkbox .rsssl-field {
689
+ display: flex;
690
+ justify-content: space-between;
691
+ align-content: center;
692
+ padding: @green-gap @green-gap 0 @green-gap;
693
+ }
694
+ }
695
+
696
+ .rsssl-grid-item.big {
697
+ .item-container .item-content {
698
+ display: grid;
699
+ grid-auto-flow: row dense;
700
+ grid-template-columns: 50% 50%;
701
+ grid-auto-rows: minmax(min-content, max-content);
702
+ }
703
+
704
+ &.rsssl-customization .item-container .item-content {
705
+ grid-auto-flow: row;
706
+ }
707
+
708
+ }
709
+
710
+ .rsssl-cols-2 .rsssl-field {
711
+ grid-column: span 2;
712
+ display: grid;
713
+ grid-template-columns: 100px 100px;
714
+ grid-column-gap: 20px;
715
+
716
+ .rsssl-label {
717
+ grid-column: span 2;
718
+ }
719
+ }
720
+
721
+ .rsssl-cols-3 .rsssl-field {
722
+ grid-column: span 2;
723
+ display: grid;
724
+ grid-template-columns: 100px 100px 100px;
725
+ grid-column-gap: 20px;
726
+
727
+ .rsssl-label {
728
+ grid-column: span 3;
729
+ }
730
+ }
731
+
732
+ .rsssl-borderradius.rsssl-cols-5 .rsssl-field, .rsssl-borderwidth.rsssl-cols-5 .rsssl-field {
733
+ display: grid;
734
+ grid-template-columns: 50px 50px 50px 50px 50px;
735
+ grid-column-gap: 10px;
736
+
737
+ .rsssl-label {
738
+ grid-column: span 5;
739
+ }
740
+ }
741
+
742
+ .rsssl-border-input-type-wrap {
743
+ display: grid;
744
+ grid-template-rows: 16px 16px;
745
+ padding-top: 16px;
746
+
747
+ .rsssl-grey {
748
+ color: darkgrey;
749
+ }
750
+ span {
751
+ cursor: pointer;
752
+ }
753
+ }
754
+
755
+ select {
756
+ width: 100%;
757
+ }
758
+
759
+ .field-group {
760
+ grid-column: span 2;
761
+ }
762
+
763
+ .rsssl-field {
764
+ padding: 10px @green-gap 0 @green-gap;
765
+ }
766
+
767
+ .rsssl-borderradius,
768
+ .rsssl-borderwidth {
769
+ grid-column: span 1;
770
+ }
771
+
772
+ .field-group.rsssl-colspan-1 {
773
+ grid-column: span 1;
774
+ }
775
+
776
+ .field-group.rsssl-colspan-2 {
777
+ grid-column: span 2;
778
+ }
779
+
780
+ .field-group.rsssl-col-1 {
781
+ grid-column-start: 1;
782
+ }
783
+
784
+ .field-group.rsssl-col-2 {
785
+ grid-column-start: 2;
786
+ }
787
+
788
+ .rsssl-master-label h2 {
789
+ grid-column: span 2;
790
+ margin: 0;
791
+ padding: @green-gap @green-gap 0 @green-gap;
792
+ font-size: 18px;
793
+ }
794
+
795
+ .rsssl-sublabel label {
796
+ color: darkgrey;
797
+ font-size: 13px;
798
+ }
799
+
800
+ label .rsssl-icon {
801
+ display: inline;
802
+ }
803
+
804
+ .rsssl-switch {
805
+ margin-top: 0;
806
+ }
807
+
808
+ .wp-picker-input-wrap:not(.hidden) {
809
+ display: block;
810
+ position: absolute;
811
+ z-index: 10;
812
+ }
813
+
814
+ .wp-picker-holder {
815
+ position: absolute;
816
+ top: 132px;
817
+ z-index: 10;
818
+ }
819
+
820
+ .wp-picker-clear {
821
+ position: absolute;
822
+ }
823
+
824
+ .rsssl-grid-controls .rsssl-field {
825
+ padding: 0;
826
+ .rsssl-label {
827
+ margin: 0;
828
+ }
829
+ }
830
+
831
+ }
832
+
833
+ input::-webkit-outer-spin-button,
834
+ input::-webkit-inner-spin-button {
835
+ -webkit-appearance: none;
836
+ margin: 0;
837
+ }
838
+
839
+ /* Firefox */
840
+ input[type=number] {
841
+ -moz-appearance: textfield;
842
+ }
843
+
844
+ }
845
+
846
+ .rsssl-multiple-field-button-footer {
847
+ display: flex;
848
+ align-items: center;
849
+ .rsssl-edit-item {
850
+ margin-right: 5px;
851
+ }
852
+ }
853
+
854
+ .rsssl-hidden {
855
+ display: none !important;
856
+ }
857
+
858
+ /* START TOOLTIP STYLES */
859
+ [rsssl-tooltip] {
860
+ position: relative; /* opinion 1 */
861
+ margin-left: 5px;
862
+ }
863
+
864
+ /* Applies to all tooltips */
865
+ [rsssl-tooltip]::before,
866
+ [rsssl-tooltip]::after {
867
+ text-transform: none; /* opinion 2 */
868
+ font-size: 1em; /* opinion 3 */
869
+ line-height: 1;
870
+ user-select: none;
871
+ pointer-events: none;
872
+ position: absolute;
873
+ display: none;
874
+ opacity: 0;
875
+ }
876
+
877
+ [rsssl-tooltip]::before {
878
+ content: '';
879
+ border: 5px solid transparent; /* opinion 4 */
880
+ z-index: 1001; /* absurdity 1 */
881
+ }
882
+
883
+ [rsssl-tooltip]::after {
884
+ content: attr(rsssl-tooltip); /* magic! */
885
+ min-width: 3em;
886
+ font-weight:normal;
887
+ overflow: hidden;
888
+ text-overflow: ellipsis;
889
+ padding: 1ch 1.5ch;
890
+ border-radius: .3ch;
891
+ box-shadow: 0 1em 2em -.5em rgba(0, 0, 0, 0.35);
892
+ background: #333;
893
+ color: #fff;
894
+ z-index: 1000; /* absurdity 2 */
895
+ }
896
+
897
+ /* Make the tooltips respond to hover */
898
+ [rsssl-tooltip]:hover::before,
899
+ [rsssl-tooltip]:hover::after {
900
+ display: block;
901
+ }
902
+
903
+ /* don't show empty tooltips */
904
+ [rsssl-tooltip='']::before,
905
+ [rsssl-tooltip='']::after {
906
+ display: none !important;
907
+ }
908
+
909
+ /* FLOW: UP */
910
+ [rsssl-tooltip]:not([flow])::before,
911
+ [rsssl-tooltip][flow^="up"]::before {
912
+ bottom: 100%;
913
+ border-bottom-width: 0;
914
+ border-top-color: #333;
915
+ }
916
+
917
+ [rsssl-tooltip]:not([flow])::after,
918
+ [rsssl-tooltip][flow^="up"]::after {
919
+ bottom: calc(100% + 5px);
920
+ }
921
+
922
+ [rsssl-tooltip]:not([flow])::before,
923
+ [rsssl-tooltip]:not([flow])::after,
924
+ [rsssl-tooltip][flow^="up"]::before,
925
+ [rsssl-tooltip][flow^="up"]::after {
926
+ left: 50%;
927
+ transform: translate(-50%, -.5em);
928
+ }
929
+
930
+ /* FLOW: DOWN */
931
+ [rsssl-tooltip][flow^="down"]::before {
932
+ top: 100%;
933
+ border-top-width: 0;
934
+ border-bottom-color: #333;
935
+ }
936
+
937
+ [rsssl-tooltip][flow^="down"]::after {
938
+ top: calc(100% + 5px);
939
+ }
940
+
941
+ [rsssl-tooltip][flow^="down"]::before,
942
+ [rsssl-tooltip][flow^="down"]::after {
943
+ left: 50%;
944
+ transform: translate(-50%, .5em);
945
+ }
946
+
947
+ /* FLOW: LEFT */
948
+ [rsssl-tooltip][flow^="left"]::before {
949
+ top: 50%;
950
+ border-right-width: 0;
951
+ border-left-color: #333;
952
+ left: calc(0em - 5px);
953
+ transform: translate(-.5em, -50%);
954
+ }
955
+
956
+ [rsssl-tooltip][flow^="left"]::after {
957
+ top: 50%;
958
+ right: calc(100% + 5px);
959
+ transform: translate(-.5em, -50%);
960
+ }
961
+
962
+ /* FLOW: RIGHT */
963
+ [rsssl-tooltip][flow^="right"]::before {
964
+ top: 50%;
965
+ border-left-width: 0;
966
+ border-right-color: #333;
967
+ right: calc(0em - 19px);
968
+ transform: translate(.5em, -50%);
969
+ }
970
+
971
+ [rsssl-tooltip][flow^="right"]::after {
972
+ top: 50%;
973
+ left: calc(100% + 19px);
974
+ transform: translate(.5em, -50%);
975
+ min-width:300px;
976
+ }
977
+
978
+ /* KEYFRAMES */
979
+ @keyframes tooltips-vert {
980
+ to {
981
+ opacity: .9;
982
+ transform: translate(-50%, 0);
983
+ }
984
+ }
985
+
986
+ @keyframes tooltips-horz {
987
+ to {
988
+ opacity: .9;
989
+ transform: translate(0, -50%);
990
+ }
991
+ }
992
+
993
+ /* FX All The Things */
994
+ [rsssl-tooltip]:not([flow]):hover::before,
995
+ [rsssl-tooltip]:not([flow]):hover::after,
996
+ [rsssl-tooltip][flow^="up"]:hover::before,
997
+ [rsssl-tooltip][flow^="up"]:hover::after,
998
+ [rsssl-tooltip][flow^="down"]:hover::before,
999
+ [rsssl-tooltip][flow^="down"]:hover::after {
1000
+ animation: tooltips-vert 300ms ease-out forwards;
1001
+ }
1002
+
1003
+ [rsssl-tooltip][flow^="left"]:hover::before,
1004
+ [rsssl-tooltip][flow^="left"]:hover::after,
1005
+ [rsssl-tooltip][flow^="right"]:hover::before,
1006
+ [rsssl-tooltip][flow^="right"]:hover::after {
1007
+ animation: tooltips-horz 300ms ease-out forwards;
1008
+ }
1009
+
1010
+ #rsssl-header {
1011
+ font-size:16px;
1012
+ .button-black {
1013
+ background-color: black;
1014
+ color: white;
1015
+ border-color: black;
1016
+ padding: 0 25px;
1017
+ }
1018
+ .link-black {
1019
+ color: black;
1020
+ padding: 5px 5px;
1021
+ }
1022
+ }
1023
+
1024
+ .wp-editor-wrap iframe {
1025
+ height: initial !important;
1026
+ }
1027
+
1028
+ .rsssl-help-warning-wrap {
1029
+ .rsssl-help-modal {
1030
+ h2 {
1031
+ margin-top:-5px;
1032
+ }
1033
+ .rsssl-pointer;
1034
+ position:absolute;
1035
+ z-index:99;
1036
+
1037
+ &.rsssl-notice {
1038
+ background-color: @brand-primary;
1039
+ &:after {
1040
+ border-right: 15px solid @brand-primary;
1041
+ top: calc(50% - 15px);
1042
+ }
1043
+ color: black;
1044
+ padding: @green-gap;
1045
+ }
1046
+
1047
+ &.rsssl-success {
1048
+ background-color: white;
1049
+ color: #61ce70;
1050
+ border: none;
1051
+ padding: 0;
1052
+ }
1053
+
1054
+ &.rsssl-warning {
1055
+ &:after {
1056
+ border-right: 15px solid #f8be2e;
1057
+ }
1058
+ color: #333333;
1059
+ background-color: #f8be2e;
1060
+ border-color: #f8be2e;
1061
+ }
1062
+
1063
+ margin: 0 0 0 @green-gap;
1064
+ padding: 10px 15px;
1065
+ color: #fff;
1066
+ background-color: @brand-primary;
1067
+ text-align: left;
1068
+
1069
+ &:empty {
1070
+ background-color: #f1f1f1;
1071
+ }
1072
+
1073
+ a {
1074
+ color: #333;
1075
+ }
1076
+ }
1077
+ }
1078
+
1079
+ a:active, a:hover {
1080
+ color: #333;
1081
+ }
1082
+
1083
+ a.button.rsssl-open-modal {
1084
+ font-size: 9px;
1085
+ line-height: 13px;
1086
+ height: 15px;
1087
+ min-height: 15px;
1088
+ padding: 1px 3px;
1089
+ margin-left: 10px;
1090
+ }
1091
+
1092
+ .rsssl-panel-link {
1093
+ text-decoration: none;
1094
+ display: inline-block;
1095
+ width: 80%;
1096
+ }
1097
+
1098
+ #rsssl_language {
1099
+ font-size: 15px;
1100
+
1101
+ &.rsssl_cookie_language_selector {
1102
+ margin-bottom: 0;
1103
+
1104
+ }
1105
+ }
1106
+
1107
+
1108
+ .multiple-field {
1109
+ div {
1110
+ margin-top: 8px;
1111
+ &:last-child {
1112
+ margin-bottom: 8px;
1113
+ }
1114
+ }
1115
+ }
1116
+
1117
+ .rsssl-list-container {
1118
+
1119
+ margin-bottom: 25px;
1120
+
1121
+ .rsssl-cookie-field > div,
1122
+ .rsssl-service-field > div {
1123
+ margin-top: 8px;
1124
+ &:last-child {
1125
+ margin-bottom: 8px;
1126
+ }
1127
+ }
1128
+
1129
+ .rsssl-disabled label,
1130
+ .rsssl-disabled span {
1131
+ color: #ababab !important;
1132
+ }
1133
+
1134
+ .rsssl-service-cookie-list {
1135
+ margin-bottom: @green-gap;
1136
+ &:last-child {
1137
+ margin-bottom: 0px;
1138
+ }
1139
+ }
1140
+
1141
+ .rsssl-service-divider {
1142
+ font-size: 15px;
1143
+ margin-bottom: 10px;
1144
+ }
1145
+
1146
+ }
1147
+
1148
+ .rsssl-legenda {
1149
+ padding: 10px 10px 0 10px;
1150
+ display: grid;
1151
+ grid-template-columns: 25px 200px 25px 300px;
1152
+ grid-column-gap: 10px;
1153
+ align-items: center;
1154
+ }
1155
+
1156
+ .rsssl-panel {
1157
+ &.rsssl-toggle-disabled {
1158
+ color: #aca5a5;
1159
+ }
1160
+
1161
+ &.rsssl-deleted {
1162
+ background-color: #FFa5aa;
1163
+ }
1164
+
1165
+ .rsssl-panel-title {
1166
+ cursor: pointer;
1167
+ }
1168
+
1169
+ .rsssl-field > div {
1170
+ margin: 10px 0;
1171
+ }
1172
+
1173
+ .rsssl-multiple-field-validation {
1174
+ float: right;
1175
+ }
1176
+
1177
+ &.rsssl-slide-panel,
1178
+ &.rsssl-link-panel {
1179
+ padding: 0;
1180
+
1181
+ .rsssl-panel-toggle {
1182
+ display: flex;
1183
+ align-items: center;
1184
+ span {
1185
+ padding-left: 10px;
1186
+ }
1187
+ }
1188
+
1189
+ .rsssl-panel-title {
1190
+ display: grid;
1191
+ grid-template-columns: 50% 10% 40%;
1192
+ align-items: center;
1193
+
1194
+ span {
1195
+ &.rsssl-panel-toggle {
1196
+ overflow: hidden;
1197
+ white-space: nowrap;
1198
+ text-overflow: ellipsis;
1199
+ }
1200
+ &:last-of-type {
1201
+ display: flex;
1202
+ align-content: center;
1203
+ justify-content: flex-end;
1204
+ svg {
1205
+ width: 18px;
1206
+ height: 18px;
1207
+ padding-top: 1px;
1208
+ }
1209
+ }
1210
+ }
1211
+
1212
+ padding: 10px 15px 8px 0;
1213
+ }
1214
+
1215
+ .rsssl-add-to-policy {
1216
+ text-decoration: underline;
1217
+ }
1218
+
1219
+ }
1220
+
1221
+ &.rsssl-link-panel {
1222
+ &.selected, &:hover {
1223
+ box-shadow: 0 5px 5px rgba(0, 0, 0, 0.2), 0 3px 5px rgba(0, 0, 0, 0.13);
1224
+ }
1225
+ }
1226
+
1227
+ .rsssl-panel-content {
1228
+ display: none;
1229
+ background-color: #fff;
1230
+ border: 1px solid #d6d8db;
1231
+ border-top: 0;
1232
+ border-bottom-left-radius: 5px;
1233
+ border-bottom-right-radius: 5px;
1234
+ padding: 10px 15px;
1235
+ }
1236
+
1237
+ h1 {
1238
+ font-size: 22px;
1239
+ }
1240
+
1241
+ font-size: 13px !important;
1242
+
1243
+ p {
1244
+ font-size: 13px !important;
1245
+ }
1246
+
1247
+ color: #383d41;
1248
+ background-color: #F2F2F2;
1249
+ border: 1px solid #d6d8db;
1250
+ padding: 10px 15px;
1251
+ border-radius: 0px;
1252
+ margin: 0;
1253
+
1254
+ &.rsssl-notice {
1255
+ background-color: #fff;
1256
+ border: 0;
1257
+ color: black;
1258
+ padding: @green-gap @green-gap 0 @green-gap;
1259
+ }
1260
+
1261
+ &.rsssl-success {
1262
+ background-color: white;
1263
+ color: #61ce70;
1264
+ border: none;
1265
+ padding: 0;
1266
+ }
1267
+
1268
+ &.rsssl-warning {
1269
+ .rsssl-pointer;
1270
+ &:after {
1271
+ border-right: 15px solid #f8be2e;
1272
+ }
1273
+ color: #333333;
1274
+ background-color: #f8be2e;
1275
+ border-color: #f8be2e;
1276
+ margin: 10px 0 10px 0;
1277
+ }
1278
+
1279
+ ul {
1280
+ list-style-type: disc;
1281
+ margin-left: 22px;
1282
+ }
1283
+
1284
+ }
1285
+
1286
+
1287
+ input[type="text"], input[type="password"], input[type="email"], input[type="number"] {
1288
+ width: 100%;
1289
+ }
1290
+
1291
+ /*
1292
+ cool checkbox sliders
1293
+ */
1294
+
1295
+ .rsssl-switch {
1296
+ input {
1297
+ display: none !important;
1298
+ }
1299
+
1300
+ position: relative;
1301
+ display: inline-block;
1302
+ width: 40px;
1303
+ height: 21px;
1304
+ }
1305
+
1306
+ .rsssl-slider {
1307
+ position: absolute;
1308
+ cursor: pointer;
1309
+ top: 0;
1310
+ left: 0;
1311
+ right: 0;
1312
+ bottom: 0;
1313
+ background-color: #ccc;
1314
+ -webkit-transition: .4s;
1315
+ transition: .4s;
1316
+
1317
+ &:before {
1318
+ position: absolute;
1319
+ content: "";
1320
+ height: 15px;
1321
+ width: 15px;
1322
+ left: 4px;
1323
+ bottom: 3px;
1324
+ background-color: white;
1325
+ -webkit-transition: .4s;
1326
+ transition: .4s;
1327
+ }
1328
+
1329
+ &.rsssl-round {
1330
+ border-radius: 20px;
1331
+ }
1332
+
1333
+ &.rsssl-round:before {
1334
+ border-radius: 50%;
1335
+ }
1336
+ }
1337
+
1338
+ .rsssl-slider-na {
1339
+ padding: 2px 8px;
1340
+ position: absolute;
1341
+ top: 0;
1342
+ left: 0;
1343
+ right: 0;
1344
+ bottom: 0;
1345
+ background-color: #ccc;
1346
+ -webkit-transition: .4s;
1347
+ transition: .4s;
1348
+
1349
+ &:before {
1350
+ position: absolute;
1351
+ content: "N/A";
1352
+ color: white;
1353
+ }
1354
+
1355
+ &.rsssl-round {
1356
+ border-radius: 20px;
1357
+ }
1358
+ }
1359
+
1360
+
1361
+ input:checked + .rsssl-slider {
1362
+ background-color: @brand-primary;
1363
+
1364
+ &:before {
1365
+ -webkit-transform: translateX(17px);
1366
+ -ms-transform: translateX(17px);
1367
+ transform: translateX(17px);
1368
+ }
1369
+ }
1370
+
1371
+ //input:disabled + .rsssl-slider {
1372
+ // background-color: lighten(#ccc, 40%);
1373
+ // &:before{
1374
+ // //background-color:#c6c6c6;
1375
+ // }
1376
+ //}
1377
+
1378
+ input:checked:disabled + .rsssl-slider {
1379
+ background-color: lighten(@brand-primary, 40%);
1380
+
1381
+ &:before {
1382
+ //background-color:#c6c6c6;
1383
+ }
1384
+ }
1385
+
1386
+
1387
+ input:focus + .rsssl-slider {
1388
+ box-shadow: 0 0 1px @brand-primary;
1389
+ }
1390
+
1391
+
1392
+ #complete_wizard_first_notice {
1393
+ position: fixed; /* Sit on top of the page content */
1394
+ width: 100%; /* Full width (cover the whole page) */
1395
+ height: 100%; /* Full height (cover the whole page) */
1396
+ top: 0;
1397
+ left: 0;
1398
+ right: 0;
1399
+ bottom: 0;
1400
+ background-color: rgba(0, 0, 0, 0.7); /* Black background with opacity */
1401
+ z-index: 99;
1402
+
1403
+ p {
1404
+ border-radius: 0px;
1405
+ font-size: 16px;
1406
+ background-color: @brand-primary;
1407
+ color: white;
1408
+ position: relative;
1409
+ /* height: 100px; */
1410
+ top: 150px;
1411
+ padding: 30px;
1412
+ width: 300px;
1413
+ text-align: center;
1414
+ margin: auto;
1415
+ }
1416
+
1417
+ }
1418
+
1419
+ //prevent a too small editor width
1420
+ html .mceContentBody {
1421
+ max-width: 100% !important;
1422
+ }
1423
+
1424
+ .cookie-warning {
1425
+ textarea {
1426
+ width: 100%;
1427
+ height: 100px;
1428
+ }
1429
+ }
1430
+
1431
+ .rsssl-comment {
1432
+ font-size:11px;
1433
+ margin-top: 10px;
1434
+ }
1435
+
1436
+ .rsssl-cookie-field {
1437
+ .rsssl-cookie-header {
1438
+ border-bottom: 1px solid #b6b7b8;
1439
+ margin-bottom: 25px;
1440
+ }
1441
+
1442
+ }
1443
+
1444
+ #rsssl-send-data {
1445
+ input[type=text] {
1446
+ width: 60%;
1447
+ }
1448
+ }
1449
+
1450
+ #rsssl-start-mail, #rsssl_close_tb_window {
1451
+ margin-right: 15px;
1452
+ margin-top: 15px;
1453
+ }
1454
+
1455
+ #rsssl-wizard {
1456
+ h1, h2, h3, h4, .rsssl-menu-item, .rsssl-step-title, .rsssl-button {
1457
+ font-variant: normal;
1458
+ }
1459
+ h2, h3 {
1460
+ font-size:15px;
1461
+ }
1462
+ h3 {
1463
+ font-weight: 400;
1464
+ }
1465
+
1466
+ label {
1467
+ font-size: 13px;
1468
+ }
1469
+
1470
+ .field-group {
1471
+ position: relative;
1472
+
1473
+ .rsssl-field {
1474
+ padding: 0 @green-gap 0 @green-gap;
1475
+ background-color: white;
1476
+ .rsssl-template-intro {
1477
+ margin-top: @red-gap;
1478
+ }
1479
+ }
1480
+
1481
+ .rsssl-title-wrap {
1482
+ font-size: 15px;
1483
+ font-weight: 700;
1484
+ padding-top: @red-gap;
1485
+ }
1486
+
1487
+ .rsssl-label {
1488
+ margin-bottom: 10px;
1489
+ label {
1490
+ display:flex;
1491
+ flex-direction: column;
1492
+ font-size:15px;
1493
+ cursor: default;
1494
+ .rsssl-label-wrap {
1495
+ display: flex;
1496
+ margin-top: @red-gap;
1497
+ font-weight: 700;
1498
+ }
1499
+ .rsssl-subtitle-wrap {
1500
+ font-size: 0.9em;
1501
+ margin: 5px 5px 0 0;
1502
+ }
1503
+ }
1504
+ }
1505
+
1506
+ //less margin when it's the editor
1507
+ &.rsssl-editor .rsssl-label {
1508
+ margin-bottom:0;
1509
+ }
1510
+
1511
+ .rsssl-field {
1512
+ .field-group {
1513
+ grid-column:1;
1514
+ display:block;
1515
+ }
1516
+ .rsssl-field {
1517
+ padding:0;
1518
+ }
1519
+ }
1520
+
1521
+ }
1522
+
1523
+ /*body */
1524
+ .rsssl-body, #rsssl-content-area {
1525
+ input[type="text"].rsssl-document-custom-url {
1526
+ width: 250px;
1527
+ }
1528
+
1529
+ .rsssl-document-custom-url, .rsssl-document-custom-page {
1530
+ margin-top: 5px;
1531
+ }
1532
+
1533
+ input.button {
1534
+ min-width: 100px;
1535
+ &.button-red {
1536
+ background-color: red;
1537
+ color: white;
1538
+ border-color: red;
1539
+ }
1540
+ &.button-black {
1541
+ background-color: black;
1542
+ color: white;
1543
+ border-color: black;
1544
+ }
1545
+ &.button-link {
1546
+ text-align: center;
1547
+ min-width:initial;
1548
+ &:hover {
1549
+ background-color:initial;
1550
+ text-decoration: none;
1551
+ }
1552
+
1553
+ }
1554
+ }
1555
+
1556
+ button {
1557
+ &.button-red {
1558
+ background-color: red;
1559
+ color: white;
1560
+ border-color: red;
1561
+ }
1562
+ }
1563
+
1564
+ /* Styling for the previous and next buttons */
1565
+ .rsssl-master-label h2 {
1566
+ margin: 0;
1567
+ padding: @green-gap @green-gap 0 0;
1568
+ font-size: 18px;
1569
+ background-color: white;
1570
+ }
1571
+
1572
+ //Add some styling to the remove, rescan and add new cookie buttons to override the default WordPress button styling
1573
+ .rsssl-remove {
1574
+ margin-bottom: 12px;
1575
+ }
1576
+
1577
+ .rsssl-rescan {
1578
+ padding: 0 10px 0 10px;
1579
+ }
1580
+
1581
+ /* CSS for the sections menu */
1582
+
1583
+ .rsssl-menu-item.active {
1584
+ i {
1585
+ color: black;
1586
+ font-size: 1.35em;
1587
+ float: left;
1588
+ }
1589
+
1590
+ a {
1591
+ color: #000;
1592
+ font-weight: 900;
1593
+ padding-left: 7px;
1594
+ text-decoration: underline;
1595
+ }
1596
+ }
1597
+
1598
+ .rsssl-done a {
1599
+ text-decoration: none;
1600
+ color: white;
1601
+ font-size: 15px;
1602
+ }
1603
+
1604
+ .rsssl-to-do a {
1605
+ color: white;
1606
+ font-size: 15px;
1607
+ text-decoration: none;
1608
+ opacity: 0.6;
1609
+ }
1610
+
1611
+ //Reset the vertical-align: middle that WordPress applies. The vertical-align middle presses the next and previous icons downwards
1612
+ @media screen and (max-width: 782px) {
1613
+ input {
1614
+ vertical-align: top !important;
1615
+ }
1616
+ }
1617
+ }
1618
+
1619
+
1620
+ }
1621
+
1622
+ //Dashboard
1623
+
1624
+ .rsssl-field {
1625
+ /* Define the styling of the text input fields */
1626
+
1627
+ label {
1628
+ font-weight: normal;
1629
+ margin: 10px 0 2px;
1630
+ }
1631
+ .rsssl-color-picker.wp-color-picker {
1632
+ margin-top: -11px !important;
1633
+ }
1634
+ input[type="text"], input[type="email"], input[type="number"] {
1635
+ //max-width: 500px;
1636
+ border-color: @input-border-color;
1637
+ }
1638
+
1639
+ select {
1640
+ border-color: @input-background-color;
1641
+ vertical-align: initial;
1642
+ }
1643
+
1644
+ textarea.validation:invalid, textarea.validation:valid {
1645
+ background-position: 0.5% 1.5%;
1646
+ border-color: @input-border-color;
1647
+ }
1648
+
1649
+ textarea {
1650
+ min-height: 150px;
1651
+ width:100%;
1652
+ }
1653
+
1654
+ input[type=radio]:checked:before {
1655
+ content: "\2022";
1656
+ text-indent: -9999px;
1657
+ border-radius: 50px;
1658
+ font-size: 24px;
1659
+ width: 6px;
1660
+ height: 6px;
1661
+ margin: 4px;
1662
+ line-height: 16px;
1663
+ background-color: #1e8cbe;
1664
+ }
1665
+
1666
+ .rsssl-panel {
1667
+ &.rsssl-notice {
1668
+ padding: 0 0 10px 0;
1669
+ }
1670
+ }
1671
+
1672
+ .rsssl-buttons-row-left {
1673
+ display: flex;
1674
+ align-items: center;
1675
+ height: auto;
1676
+ input, select, div {
1677
+ margin-right: 20px;
1678
+ }
1679
+ margin-bottom: 10px;
1680
+ }
1681
+
1682
+ button[name=rsssl_add_multiple] {
1683
+ margin-top: @green-gap;
1684
+ }
1685
+
1686
+ }
1687
+
1688
+ //Button styling
1689
+ a.rsssl.button, button.rsssl.button, input.rsssl.button {
1690
+ margin-left:15px;
1691
+ box-shadow: 0 0 0 #fff;
1692
+ background-color: @brand-primary;
1693
+ color: #fff;
1694
+ padding-right: 20px;
1695
+ border: 0;
1696
+ border-radius: 50px;
1697
+ padding-top: 2px;
1698
+
1699
+ &:hover {
1700
+ background-color: lighten(@brand-primary, 10%);
1701
+ color: white;
1702
+ }
1703
+
1704
+ .fa-angle-right {
1705
+ font-weight: 900;
1706
+ position: absolute;
1707
+ font-size: 1.8em;
1708
+ margin-top: 1px;
1709
+ margin-left: 5px;
1710
+ }
1711
+ }
1712
+
1713
+ //Icon override
1714
+ #rsssl-wizard .dashboard .fa-times {
1715
+ color: black;
1716
+ }
1717
+
1718
+ #rsssl-wizard .dashboard .fa-check {
1719
+ color: @brand-primary;
1720
+ }
1721
+
1722
+ /* building our new structured css here */
1723
+
1724
+ .rsssl-dashboard-container {
1725
+ .rsssl-dashboard-title {
1726
+ padding-top: 22px;
1727
+ font-weight: 600;
1728
+ font-size: 24px;
1729
+ line-height: 30px;
1730
+ margin-bottom: 20px;
1731
+ @media screen and (max-width: 720px) {
1732
+ padding-bottom: 0px;
1733
+ }
1734
+
1735
+ }
1736
+ }
1737
+
1738
+ .rsssl-dashboard-header .rsssl-header-top {
1739
+ min-height: 60px;
1740
+ }
1741
+
1742
+ .rsssl-header-top {
1743
+ grid-area: header-top;
1744
+ background-color: #F2F2F2;
1745
+ min-height: 30px;
1746
+ padding-top: 25px;
1747
+
1748
+ .rsssl-premium-cta {
1749
+ width: 150px;
1750
+ float: right;
1751
+ border-color: @brand-primary;
1752
+ color: @brand-primary;
1753
+ text-transform: uppercase;
1754
+ display: flex;
1755
+ }
1756
+ }
1757
+
1758
+ .rsssl-dashboard-container {
1759
+ background-color: white;
1760
+ display: flex;
1761
+ flex-wrap: wrap;
1762
+
1763
+ .rsssl-dashboard-header {
1764
+ margin-bottom: -270px;
1765
+ width: 100%;
1766
+ min-height: 220px;
1767
+ background-color: @brand-primary;
1768
+ background-repeat: no-repeat;
1769
+ //background-image: url(../images/rsssl-header.png);
1770
+ background-attachment: scroll;
1771
+ background-position: bottom center;
1772
+
1773
+ .rsssl-header-text {
1774
+ display: flex;
1775
+ align-items: center;
1776
+ }
1777
+ }
1778
+
1779
+ .rsssl-dashboard-item {
1780
+ background-color: #fff;
1781
+ width: 450px;
1782
+ margin-top: 10px;
1783
+ border: 2px solid;
1784
+ flex: 0 0 450px;
1785
+ flex-shrink: 1;
1786
+ -webkit-border-radius: 5px;
1787
+ -moz-border-radius: 5px;
1788
+ border-radius: 0px;
1789
+ border-color: #f2f2f2;
1790
+ overflow: hidden;
1791
+ }
1792
+
1793
+ .rsssl-dashboard-item .rsssl-top h1 {
1794
+ font-weight: 600;
1795
+ font-size: 2.5em;
1796
+ padding: 25px;
1797
+ }
1798
+
1799
+ .rsssl-dashboard-content-container {
1800
+ margin: 0 auto;
1801
+ display: grid;
1802
+ grid-template-areas: 'header-top header-top header-top header-top' 'text-completed text-completed text-completed text-completed' 'progress progress support support' 'progress progress documents documents' 'footer footer footer footer';
1803
+ @media screen and (max-width: 1210px) {
1804
+ grid-template-areas: 'header-top header-top' 'text-completed text-completed' 'progress progress' 'support support' 'documents documents' 'footer footer' 'footer footer';
1805
+ }
1806
+
1807
+ .rsssl-logo {
1808
+ display: flex;
1809
+ align-items: center;
1810
+ font-size: 1.5em;
1811
+ font-weight: 600;
1812
+ }
1813
+
1814
+ .rsssl-header-text {
1815
+ display: flex;
1816
+ align-items: center;
1817
+ }
1818
+
1819
+ .rsssl-completed-text {
1820
+ display: flex;
1821
+ align-items: center;
1822
+ margin-top: 35px;
1823
+ grid-area: text-completed;
1824
+ font-size: 24px;
1825
+ color: white;
1826
+ @media screen and (max-width: 720px) {
1827
+ button {
1828
+ width: 100px;
1829
+ }
1830
+ }
1831
+ }
1832
+
1833
+ grid-gap: 10px;
1834
+ padding: 10px;
1835
+
1836
+ .rsssl-dashboard-info {
1837
+ font-size: 19px;
1838
+ font-weight: bold;
1839
+ padding-top: 20px;
1840
+ padding-bottom: 10px;
1841
+ }
1842
+
1843
+ .rsssl-dashboard-text {
1844
+ color: black;
1845
+ font-weight: 400;
1846
+ padding: 15px;
1847
+
1848
+ li {
1849
+ border-bottom: 1px solid;
1850
+ }
1851
+
1852
+ .fa-plus {
1853
+ margin-right: 8px;
1854
+ }
1855
+
1856
+ &.free {
1857
+ background-color: #000;
1858
+ color: #fff;
1859
+ min-height: 40px;
1860
+ }
1861
+ }
1862
+
1863
+ .rsssl-dashboard-progress {
1864
+ @media screen and (max-width: 1210px) {
1865
+ margin: 0 auto;
1866
+ }
1867
+ grid-area: progress;
1868
+
1869
+ .rsssl-dashboard-progress-top {
1870
+ background-color: #F2F2F2;
1871
+ min-height: 170px;
1872
+
1873
+ .rsssl-dashboard-top-text {
1874
+ display: inline-grid;
1875
+ font-size: 18px;
1876
+ line-height: 22px;
1877
+ max-width: 60%;
1878
+ float: left;
1879
+
1880
+ .rsssl-dashboard-top-text-subtitle {
1881
+ color: @brand-primary;
1882
+ }
1883
+ }
1884
+ }
1885
+
1886
+ .rsssl-continue-wizard-btn {
1887
+ padding-top: 125px;
1888
+
1889
+ button {
1890
+ text-align: -webkit-left;
1891
+ border-radius: 50px;
1892
+ }
1893
+ }
1894
+
1895
+ .rsssl-percentage-complete {
1896
+ margin-top: 20px;
1897
+ float: right;
1898
+ }
1899
+
1900
+ .rsssl-steps-table {
1901
+ padding-top: 10px;
1902
+
1903
+ .i.fa.fa-check {
1904
+ color: black;
1905
+ }
1906
+
1907
+ .rsssl-success,
1908
+ .rsssl-error {
1909
+ color: black;
1910
+ }
1911
+ }
1912
+ }
1913
+
1914
+ .rsssl-dashboard-support {
1915
+
1916
+ width: 450px;
1917
+ @media screen and (max-width: 1210px) {
1918
+ margin: 0 auto;
1919
+ }
1920
+
1921
+ input[type=text], input[type=email], textarea, input[type=submit] {
1922
+ width: 425px;
1923
+ margin-bottom: 5px;
1924
+ margin-top: 5px;
1925
+ }
1926
+
1927
+ textarea {
1928
+ min-height: 100px;
1929
+ }
1930
+
1931
+ input[type=submit] {
1932
+ margin: auto;
1933
+ }
1934
+
1935
+ grid-area: support;
1936
+ }
1937
+
1938
+ .rsssl-dashboard-documents {
1939
+ @media screen and (max-width: 1210px) {
1940
+ margin: 0 auto;
1941
+ }
1942
+ grid-area: documents;
1943
+ margin-top: 10px;
1944
+
1945
+ .rsssl-upgrade-table {
1946
+ padding-bottom: 15px;
1947
+
1948
+ .fas {
1949
+ margin-right: 8px;
1950
+ }
1951
+
1952
+ ul {
1953
+ margin: 5px;
1954
+ }
1955
+
1956
+ li {
1957
+ border-bottom: 2px solid;
1958
+ margin-bottom: 5px;
1959
+ text-indent: 5px;
1960
+ display: flex;
1961
+ vertical-align: middle;
1962
+ margin-left: 8px;
1963
+ }
1964
+
1965
+ .fa-plus {
1966
+ color: @brand-primary;
1967
+ font-size: 1.5em;
1968
+ }
1969
+ }
1970
+
1971
+ .rsssl-documents-bottom {
1972
+ color: white;
1973
+ background-color: black;
1974
+ min-height: 70px;
1975
+ font-size: 14px;
1976
+
1977
+ div {
1978
+ margin-bottom: 10px;
1979
+ }
1980
+
1981
+ //display: flex;
1982
+ }
1983
+ }
1984
+
1985
+ .rsssl-dashboard-footer {
1986
+ grid-area: footer;
1987
+ display: flex;
1988
+ flex-shrink: 1;
1989
+ flex-grow: 1;
1990
+ margin-top: 20px;
1991
+ flex-wrap: wrap;
1992
+ justify-content: center;
1993
+ padding-bottom: 20px;
1994
+
1995
+ .rsssl-footer-block {
1996
+ position: relative;
1997
+ -webkit-border-radius: 10px;
1998
+ -moz-border-radius: 10px;
1999
+ border-radius: 0px;
2000
+ background-color: #F2F2F2;
2001
+ width: 205px;
2002
+ min-height: 70px;
2003
+ //margin-top: 10px;
2004
+ margin: 5px auto;
2005
+
2006
+ a {
2007
+ position: absolute;
2008
+ top: 5px;
2009
+ right: 5px;
2010
+ }
2011
+
2012
+ .rsssl-footer-title {
2013
+ margin-top: 9px;
2014
+ margin-left: 9px;
2015
+ font-weight: 900;
2016
+ font-size: 1.2em;
2017
+ margin-right: 35px;
2018
+ }
2019
+
2020
+ .rsssl-footer-description {
2021
+ width: 70%;
2022
+ margin-left: 9px;
2023
+ font-size: 0.8em;
2024
+ display: flex;
2025
+ }
2026
+
2027
+ .rsssl-external-btn {
2028
+ text-align: center;
2029
+ border-radius: 7px;
2030
+ color: @brand-primary;
2031
+ width: 25px;
2032
+ height: 20px;
2033
+ float: right;
2034
+
2035
+ .fa-angle-right {
2036
+ font-size: 1.5em;
2037
+ vertical-align: middle;
2038
+ margin-left: 2px;
2039
+ }
2040
+ }
2041
+ }
2042
+ }
2043
+ }
2044
+ }
2045
+
2046
+
2047
+
2048
+ /*skeleton*/
2049
+ @panelheight : 38px;
2050
+ @panelborder : 1px;
2051
+ @paneloffset : 3*(@panelborder+@panelheight);
2052
+ @rows : 6;
2053
+ .rsssl-skeleton:empty {
2054
+ margin: auto;
2055
+ margin-bottom: 25px;
2056
+ width: 100%;
2057
+ height: (@rows*@panelheight)+(@rows+1)*@panelborder; /* change height to see repeat-y behavior */
2058
+
2059
+ background-image:
2060
+ linear-gradient( 100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.5) 70%, rgba(255, 255, 255, 0.5) 15% ),
2061
+ linear-gradient( #f2f2f2 @panelheight, transparent 0 ),
2062
+ linear-gradient( #f2f2f2 @panelheight, transparent 0 ),
2063
+ linear-gradient( #f2f2f2 @panelheight, transparent 0 ),
2064
+ linear-gradient( #f2f2f2 @panelheight, transparent 0 );
2065
+
2066
+ background-repeat: repeat-y;
2067
+
2068
+ background-size:
2069
+ 50px 200px, /* highlight */
2070
+ 100% @paneloffset,
2071
+ 100% @paneloffset,
2072
+ 100% @paneloffset,
2073
+ 100% @paneloffset;
2074
+
2075
+ background-position:
2076
+ 0 0, /* highlight */
2077
+ @panelborder @panelborder,
2078
+ @panelborder @panelheight+(2*@panelborder),
2079
+ @panelborder (2*@panelheight)+(3*@panelborder),
2080
+ @panelborder (3*@panelheight)+(4*@panelborder);
2081
+
2082
+ background-color:#d6d8db;
2083
+ animation: shine 2.5s infinite;
2084
+ }
2085
+ @keyframes shine {
2086
+ to {
2087
+ background-position:
2088
+ 100% 0, /* move highlight to right */
2089
+ @panelborder @panelborder,
2090
+ @panelborder @panelheight+(2*@panelborder),
2091
+ @panelborder (2*@panelheight)+(3*@panelborder),
2092
+ @panelborder (3*@panelheight)+(4*@panelborder);
2093
+ }
2094
+ }
2095
+
2096
+
2097
+
2098
+ @-webkit-keyframes sk-stretchdelay {
2099
+ 0%, 40%, 100% { -webkit-transform: scaleY(0.4) }
2100
+ 20% { -webkit-transform: scaleY(1.0) }
2101
+ }
2102
+
2103
+ @keyframes sk-stretchdelay {
2104
+ 0%, 40%, 100% {
2105
+ transform: scaleY(0.4);
2106
+ -webkit-transform: scaleY(0.4);
2107
+ } 20% {
2108
+ transform: scaleY(1.0);
2109
+ -webkit-transform: scaleY(1.0);
2110
+ }
2111
+ }
2112
+
2113
+
2114
+ .rsssl-wizard-menu-menus {
2115
+ padding-top: 10px;
2116
+ }
2117
+
2118
+ //.rsssl-cookie-settings-content {
2119
+ // padding-top: 10px;
2120
+ // display: grid;
2121
+ // grid-template-columns: 815px 1fr;
2122
+ // grid-template-rows: calc(100vh - 160px);
2123
+ //}
2124
+
2125
+ .rsssl-scroll {
2126
+ overflow: scroll;
2127
+ scroll-behavior: smooth;
2128
+ overflow-x: hidden;
2129
+ }
2130
+
2131
+
2132
+ #wpbody-content {
2133
+ padding-bottom: 0;
2134
+ }
2135
+
2136
+ // This will make color pickers overlap
2137
+ #customization {
2138
+ z-index: 10;
2139
+ }
2140
+
2141
+ .cc-window {
2142
+ right: 1em;
2143
+ }
2144
+
2145
+ .cc-window.cc-center {
2146
+ transform: translate(0%, -50%);
2147
+ left: initial;
2148
+ }
2149
+
2150
+ .cc-window.cc-left {
2151
+ left: initial;
2152
+ }
2153
+
2154
+ // At cookie settings, banner center is to the right
2155
+ @keyframes slideInUpCenter {
2156
+ from {
2157
+ -webkit-transform: translate3d(0, 150%, 0);
2158
+ transform: translate3d(0, 150%, 0);
2159
+ }
2160
+ to {
2161
+ -webkit-transform: translate3d(0, -50%, 0);
2162
+ transform: translate3d(0, -50%, 0);
2163
+ }
2164
+ }
2165
+ @keyframes slideOutUpCenter {
2166
+ to {
2167
+ -webkit-transform: translate3d(0, 150%, 0);
2168
+ transform: translate3d(0, 150%, 0);
2169
+ opacity: 1;
2170
+ }
2171
+ from {
2172
+ -webkit-transform: translate3d(0, -50%, 0);
2173
+ transform: translate3d(0, -50%, 0);
2174
+ opacity: 1;
2175
+ }
2176
+ }
2177
+
2178
+ .rsssl-wizard-wrap {
2179
+ margin: 0;
2180
+ }
2181
+
2182
+ #rsssl-proof-of-consent,
2183
+ #rsssl-cookie-banner {
2184
+
2185
+ #rsssl-content-area {
2186
+ display: block;
2187
+
2188
+ h1 {
2189
+ background-color: white;
2190
+ padding: @green-gap;
2191
+ //margin: @red-gap;
2192
+ border-bottom: 1px solid #eeeeee;
2193
+ }
2194
+
2195
+ .rsssl-panel {
2196
+ padding: @green-gap;
2197
+ margin-bottom: @green-gap;
2198
+ }
2199
+
2200
+ .rsssl-notice {
2201
+ background-color: white;
2202
+ }
2203
+
2204
+ input[name=rsssl_generate_snapshot] {
2205
+ width: 120px;
2206
+ }
2207
+
2208
+ .rsssl-month-select,
2209
+ .rsssl-year-select,
2210
+ #post-query-submit {
2211
+ float: right;
2212
+ margin-top: -50px;
2213
+ width: 120px;
2214
+ }
2215
+
2216
+ #post-query-submit {
2217
+ margin-right: 0;
2218
+ }
2219
+
2220
+ .rsssl-month-select {
2221
+ margin-right: 290px;
2222
+ }
2223
+
2224
+ .rsssl-year-select {
2225
+ margin-right: 145px;
2226
+ }
2227
+
2228
+ .tablenav {
2229
+ display: none;
2230
+ }
2231
+
2232
+ #rsssl-cookiestatement-snapshot-filter {
2233
+ padding-top: @green-gap;
2234
+ }
2235
+
2236
+ .wp-list-table {
2237
+ font-weight: bold;
2238
+ th {
2239
+ font-weight: bold;
2240
+ a {
2241
+ padding: @red-gap;
2242
+ }
2243
+ }
2244
+ }
2245
+ }
2246
+ }
2247
+
2248
+ #wpbody-content {
2249
+ .update-nag {
2250
+ display: none;
2251
+ }
2252
+ .subsubsub {
2253
+ display: none;
2254
+ }
2255
+
2256
+ .wp-heading-inline {
2257
+ padding: @green-gap 0;
2258
+ }
2259
+
2260
+ .rsssl-document-button {
2261
+ margin-top: 22px;
2262
+ margin-left: 15px;
2263
+ }
2264
+ .cookie-warning .rsssl-document-button{
2265
+ margin-top: 0;
2266
+ }
2267
+
2268
+ #rsssl-region-select {
2269
+ margin-top: -6px;
2270
+ margin-left: 15px;
2271
+ width: 100px;
2272
+ }
2273
+ }
2274
+
2275
+ #posts-filter {
2276
+ .bulkactions,
2277
+ .tablenav-pages,
2278
+ .search-box {
2279
+ display: none;
2280
+ }
2281
+
2282
+ .tablenav.top {
2283
+ margin-top: 0;
2284
+ padding-top: 0;
2285
+ }
2286
+
2287
+ .wp-list-table {
2288
+ font-weight: bold;
2289
+ th {
2290
+ font-weight: bold;
2291
+ a {
2292
+ padding: @red-gap;
2293
+ }
2294
+ }
2295
+ }
2296
+ }
lets-encrypt/wizard/assets/css/wizard.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .rsssl-certificate-data{right:10000px;position:absolute;background-color:#fff;padding:0;white-space:nowrap}.rsssl-copied-feedback-container{padding:20px;color:#61ce70}.rsssl-section .rsssl_letsencrypt_container a.button{margin-top:15px}.rsssl-pointer{position:relative}.rsssl-pointer:after{content:" ";position:absolute;left:-15px;top:15px;border-top:15px solid transparent;border-right:15px solid black;border-left:0;border-bottom:15px solid transparent}#rsssl-content-area{display:grid;grid-template-columns:225px auto}#rsssl-content-area h1{padding:0}#rsssl-content-area .rsssl-wizard-title{padding:20px;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-content:center}#rsssl-content-area .rsssl-wizard-title h1{font-size:18px}#rsssl-content-area .rsssl-wizard-title.rsssl-section-content-notifications-header{border-bottom:1px solid #e6e6e6}#rsssl-content-area .rsssl-wizard-title.rsssl-section-content-notifications-header h1{font-weight:normal}#rsssl-content-area .rsssl-wizard-subtitle h2{margin:20px 20px 0 20px;font-size:14px}#rsssl-content-area .rsssl-wizard-progress-bar{background:#eee;height:15px;margin:20px 0 0 0}#rsssl-content-area .rsssl-wizard-progress-bar .rsssl-wizard-progress-bar-value{transition:width .5s;-webkit-transition:width .5s;height:100%;background:#61ce70;border-radius:4px}#rsssl-content-area .rsssl-wizard-progress-bar .rsssl-wizard-progress-bar-value.rsssl-error{background-color:#d7263d}#rsssl-content-area .rsssl-priority{background-color:#000;color:#fff;border-color:#000;margin-top:10px}#rsssl-content-area .rsssl-wizard-menu{background-color:white;margin:10px;margin-bottom:0;padding-bottom:20px;box-shadow:0 0 5px 5px rgba(222,222,222,0.2)}#rsssl-content-area .rsssl-wizard-menu .rsssl-wizard-menu h1{font-weight:bold}#rsssl-content-area .rsssl-wizard-menu .rsssl-wizard-progress-bar{margin:20px}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header{text-decoration:none}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.incomplete a h2{color:#c6c6c6}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header a{display:inline-block;padding:5px 20px;text-decoration:none;width:calc(100% -(20px+20px))}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header a h2{font-size:15px;margin:0}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.active a h2{color:#c6c6c6 !important}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header:hover a h2{text-decoration:underline}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-step-header.active:hover a{background:white;pointer-events:none}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section{display:grid;grid-template-columns:20px 1fr;margin:0 20px}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section span{align-self:center;justify-self:center}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a{display:inline-block;text-decoration:none;padding:3px 5px}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a h3{color:#c6c6c6}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a:visited h3{color:initial}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section a h3{font-size:12px;font-weight:normal;margin:0}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section.active a h3{color:grey}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section:hover a h3{text-decoration:underline}#rsssl-content-area .rsssl-wizard-menu .rsssl-step .rsssl-section.active:hover a{background:white;pointer-events:none}#rsssl-content-area .rsssl-section-content{margin:10px}#rsssl-content-area .rsssl-section-content p{margin:0}#rsssl-content-area .rsssl-section-content p:not(:first-child){margin-top:1em}#rsssl-content-area .rsssl-section-content form{display:grid;grid-template-columns:auto 325px;grid-column-gap:15px}#rsssl-content-area .rsssl-section-content form .rsssl-section-content-title-header{background-color:white}#rsssl-content-area .rsssl-section-content form .rsssl-wizard-intro,#rsssl-content-area .rsssl-section-content form .rsssl-template-intro .rsssl-master-label{grid-column-start:1;background-color:white;padding:20px 20px 0 20px}#rsssl-content-area .rsssl-section-content form .rsssl-field .rsssl-wizard-intro{padding:0 0 20px 0}#rsssl-content-area .rsssl-section-content form .rsssl-button{background-color:white;grid-column-start:1;padding:20px 20px 0 20px}#rsssl-content-area .rsssl-section-content form .field-group{grid-column:span 2;display:grid;grid-template-columns:auto 325px;grid-column-gap:15px}#rsssl-content-area .rsssl-section-content form .field-group .rsssl-field{grid-column-start:1}#rsssl-content-area .rsssl-section-content form .field-group .rsssl-help-warning-wrap{margin-top:20px}#rsssl-content-area .rsssl-section-content form .rsssl-section-footer{grid-column-start:1;background-color:white;padding:20px;display:grid;align-items:center;grid-template-columns:1fr auto}#rsssl-content-area .rsssl-section-content form .rsssl-section-footer .rsssl-buttons-container{grid-column-start:2}#rsssl-content-area .rsssl-section-content form .rsssl-section-footer .rsssl-buttons-container input+input{margin-left:20px}#rsssl-content-area .rsssl-add-pages-table{display:grid;grid-template-columns:auto auto auto;grid-gap:5px;align-items:center;margin-bottom:20px}#rsssl-content-area .rsssl-add-pages-table span{justify-self:end;text-align:justify}#rsssl-content-area .rsssl-link-to-menu-table{display:grid;grid-template-columns:30% 30%;grid-gap:5px;align-items:center}#rsssl-content-area .rsssl-link-to-menu-table h3{grid-column:span 2;margin-top:20px;margin-bottom:5px}#rsssl-content-area .rsssl-link-to-menu-table h3:first-child{margin-top:0}#rsssl-content-area .rsssl-link-to-menu-table select{grid-column-start:2}#rsssl-content-area .rsssl-cookies-table h2{font-weight:normal;font-size:15px}#rsssl-content-area .rsssl-cookies-table .rsssl-cookies-table-body{border-radius:5px;display:grid;grid-template-columns:1fr;padding:10px;background-color:#f0f2f8}#rsssl-wizard .rsssl-icon{margin:0 5px;width:initial;border-radius:50%}#rsssl-wizard .rsssl-icon.rsssl-empty{visibility:hidden}#rsssl-wizard .rsssl-icon.rsssl-success{color:#f8be2e}#rsssl-wizard .rsssl-icon.rsssl-success svg{fill:#f8be2e;stroke:#f8be2e}#rsssl-wizard .rsssl-icon.rsssl-green{color:#61ce70}#rsssl-wizard .rsssl-icon.rsssl-green svg{fill:#61ce70;stroke:#61ce70}#rsssl-wizard .rsssl-icon.rsssl-disabled{color:#ababab}#rsssl-wizard .rsssl-icon.rsssl-disabled svg{fill:#ababab;stroke:#ababab}#rsssl-wizard .rsssl-icon.rsssl-error{color:#d7263d}#rsssl-wizard .rsssl-icon.rsssl-error svg{fill:#d7263d;stroke:#d7263d}#rsssl-wizard .rsssl-icon.arrow-right-alt2::before{font-size:14px}#rsssl-wizard .rsssl-circle-green{height:12px;width:12px;border-radius:12px;background-color:#61ce70}#rsssl-wizard .rsssl-circle-red{height:12px;width:12px;border-radius:12px;background-color:#d7263d}#rsssl-wizard .rsssl-not-allowed{cursor:not-allowed}#rsssl-wizard .rsssl-checkbox .rsssl-field{display:flex;align-items:center}#rsssl-wizard .rsssl-checkbox .rsssl-field .rsssl-wizard-settings-text{margin-left:20px;margin-top:5px}#rsssl-wizard .rsssl-checkbox-container{display:block;position:relative;padding-left:35px}#rsssl-wizard .rsssl-checkbox-container input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}#rsssl-wizard .rsssl-checkbox-container .checkmark{position:absolute;top:-2px;left:0;height:20px;width:20px;border-radius:5px;border:1px solid #dadada}#rsssl-wizard .rsssl-checkbox-container .checkmark svg{content:"";position:absolute;display:none}#rsssl-wizard .rsssl-checkbox-container input:checked ~ .checkmark svg{display:block;fill:#f8be2e;stroke:#f8be2e}#rsssl-wizard .rsssl-checkbox-container .checkmark svg{left:2.5px;top:2px;width:15px;height:15px}#rsssl-wizard .rsssl-checkbox-container .checkmark.rsssl-default svg{display:block;fill:#eee;stroke:#eee}#rsssl-wizard .rsssl-checkbox-container.rsssl-disabled{pointer-events:none}#rsssl-wizard .rsssl-checkbox-container.rsssl-disabled .checkmark{background-color:#eee}#rsssl-wizard .rsssl-checkbox-container.rsssl-disabled .checkmark svg{stroke:#eee !important;fill:#eee !important}#rsssl-wizard .rsssl-radio-container{display:block;position:relative;padding-left:35px}#rsssl-wizard .rsssl-radio-container input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}#rsssl-wizard .rsssl-radio-container .radiobtn{position:absolute;top:-2px;left:0;height:20px;width:20px;border-radius:20px;border:1px solid #dadada}#rsssl-wizard .rsssl-radio-container .radiobtn div{content:"";position:absolute;display:none}#rsssl-wizard .rsssl-radio-container input:checked ~ .radiobtn .rsssl-icon{display:block;background-color:#f8be2e}#rsssl-wizard .rsssl-radio-container .radiobtn .rsssl-icon{left:5px;top:3px;width:10px;height:10px}#rsssl-wizard .rsssl-radio-container .radiobtn.rsssl-default .rsssl-icon{display:block;background-color:#eee}#rsssl-wizard .rsssl-radio-container.rsssl-disabled{pointer-events:none}#rsssl-wizard .rsssl-radio-container.rsssl-disabled .radiobtn{background-color:#eee}#rsssl-wizard .rsssl-radio-container.rsssl-disabled .radiobtn .rsssl-icon{background-color:#eee !important}#rsssl-wizard textarea.validation,#rsssl-wizard input[type="text"].validation,#rsssl-wizard input[type="password"].validation,#rsssl-wizard input[type="email"].validation,#rsssl-wizard input[type="text"].rsssl-valid-page,#rsssl-wizard input[type="text"].rsssl-deleted-page{position:relative;padding-left:30px}#rsssl-wizard textarea.validation ~ span .rsssl-icon,#rsssl-wizard input[type="text"].validation ~ span .rsssl-icon,#rsssl-wizard input[type="password"].validation ~ span .rsssl-icon,#rsssl-wizard input[type="email"].validation ~ span .rsssl-icon,#rsssl-wizard input[type="text"].rsssl-valid-page ~ span .rsssl-icon,#rsssl-wizard input[type="text"].rsssl-deleted-page ~ span .rsssl-icon{display:block;position:absolute;padding-left:7px;margin-top:-25px;z-index:1}#rsssl-wizard textarea.validation ~ span .rsssl-icon svg,#rsssl-wizard input[type="text"].validation ~ span .rsssl-icon svg,#rsssl-wizard input[type="password"].validation ~ span .rsssl-icon svg,#rsssl-wizard input[type="email"].validation ~ span .rsssl-icon svg,#rsssl-wizard input[type="text"].rsssl-valid-page ~ span .rsssl-icon svg,#rsssl-wizard input[type="text"].rsssl-deleted-page ~ span .rsssl-icon svg{width:15px;height:15px}#rsssl-wizard textarea.validation:invalid ~ span .rsssl-icon,#rsssl-wizard textarea.validation:valid ~ span .rsssl-icon{margin-top:-143px}#rsssl-wizard textarea.validation:valid ~ span .rsssl-failed,#rsssl-wizard input[type="text"].validation:valid ~ span .rsssl-failed,#rsssl-wizard input[type="password"].validation:valid ~ span .rsssl-failed,#rsssl-wizard input[type="email"].validation:valid ~ span .rsssl-failed{display:none}#rsssl-wizard textarea.validation:invalid ~ span .rsssl-success,#rsssl-wizard input[type="text"].validation:invalid ~ span .rsssl-success,#rsssl-wizard input[type="password"].validation:invalid ~ span .rsssl-success,#rsssl-wizard input[type="email"].validation:invalid ~ span .rsssl-success{display:none}#rsssl-wizard input:disabled{background-color:#f2f2f2}#rsssl-wizard input[type="text"],#rsssl-wizard input[type="password"],#rsssl-wizard input[type="email"],#rsssl-wizard select,#rsssl-wizard .select2,#rsssl-wizard textarea,#rsssl-wizard input[type="number"]{margin-bottom:2px}#rsssl-wizard textarea{padding:10px;width:100%;height:100px;margin:20px 0}#rsssl-wizard ::placeholder{color:#dadada}#rsssl-wizard ::placeholder{color:#dadada}#rsssl-wizard ::-moz-placeholder{color:#dadada}#rsssl-wizard :-ms-input-placeholder{color:#dadada}#rsssl-wizard :-moz-placeholder{color:#dadada}#rsssl-wizard .rsssl-master-label h2{padding:20px 20px 0 20px !important}#rsssl-wizard .rsssl-footer-contents{border-top:0}#rsssl-wizard .rsssl-grid.rsssl-gridless{display:flex;flex-wrap:wrap;height:inherit !important}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item{position:relative}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-help-warning-wrap{display:none}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-comment{display:none}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header{height:initial}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header-container{display:flex;justify-content:space-between;align-content:center}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-grid-header-container .rsssl-grid-controls{margin:auto 0}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-container{height:calc(100% - 20px);width:calc(100% - 20px);margin-left:10px;display:grid;grid-template-rows:auto 1fr auto;background-color:white}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-container .item-content{padding:10px 0 0 0;margin:0;clear:none}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .item-footer{background-color:white;height:initial}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item .rsssl-checkbox .rsssl-field{display:flex;justify-content:space-between;align-content:center;padding:20px 20px 0 20px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item.big .item-container .item-content{display:grid;grid-auto-flow:row dense;grid-template-columns:50% 50%;grid-auto-rows:minmax(min-content,max-content)}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-item.big.rsssl-customization .item-container .item-content{grid-auto-flow:row}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-2 .rsssl-field{grid-column:span 2;display:grid;grid-template-columns:100px 100px;grid-column-gap:20px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-2 .rsssl-field .rsssl-label{grid-column:span 2}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-3 .rsssl-field{grid-column:span 2;display:grid;grid-template-columns:100px 100px 100px;grid-column-gap:20px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-cols-3 .rsssl-field .rsssl-label{grid-column:span 3}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius.rsssl-cols-5 .rsssl-field,#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth.rsssl-cols-5 .rsssl-field{display:grid;grid-template-columns:50px 50px 50px 50px 50px;grid-column-gap:10px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius.rsssl-cols-5 .rsssl-field .rsssl-label,#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth.rsssl-cols-5 .rsssl-field .rsssl-label{grid-column:span 5}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap{display:grid;grid-template-rows:16px 16px;padding-top:16px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap .rsssl-grey{color:darkgrey}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-border-input-type-wrap span{cursor:pointer}#rsssl-wizard .rsssl-grid.rsssl-gridless select{width:100%}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group{grid-column:span 2}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-field{padding:10px 20px 0 20px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderradius,#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-borderwidth{grid-column:span 1}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-colspan-1{grid-column:span 1}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-colspan-2{grid-column:span 2}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-col-1{grid-column-start:1}#rsssl-wizard .rsssl-grid.rsssl-gridless .field-group.rsssl-col-2{grid-column-start:2}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-master-label h2{grid-column:span 2;margin:0;padding:20px 20px 0 20px;font-size:18px}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-sublabel label{color:darkgrey;font-size:13px}#rsssl-wizard .rsssl-grid.rsssl-gridless label .rsssl-icon{display:inline}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-switch{margin-top:0}#rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-input-wrap:not(.hidden){display:block;position:absolute;z-index:10}#rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-holder{position:absolute;top:132px;z-index:10}#rsssl-wizard .rsssl-grid.rsssl-gridless .wp-picker-clear{position:absolute}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-controls .rsssl-field{padding:0}#rsssl-wizard .rsssl-grid.rsssl-gridless .rsssl-grid-controls .rsssl-field .rsssl-label{margin:0}#rsssl-wizard input::-webkit-outer-spin-button,#rsssl-wizard input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}#rsssl-wizard input[type=number]{-moz-appearance:textfield}.rsssl-multiple-field-button-footer{display:flex;align-items:center}.rsssl-multiple-field-button-footer .rsssl-edit-item{margin-right:5px}.rsssl-hidden{display:none !important}[rsssl-tooltip]{position:relative;margin-left:5px}[rsssl-tooltip]::before,[rsssl-tooltip]::after{text-transform:none;font-size:1em;line-height:1;user-select:none;pointer-events:none;position:absolute;display:none;opacity:0}[rsssl-tooltip]::before{content:'';border:5px solid transparent;z-index:1001}[rsssl-tooltip]::after{content:attr(rsssl-tooltip);min-width:3em;font-weight:normal;overflow:hidden;text-overflow:ellipsis;padding:1ch 1.5ch;border-radius:.3ch;box-shadow:0 1em 2em -0.5em rgba(0,0,0,0.35);background:#333;color:#fff;z-index:1000}[rsssl-tooltip]:hover::before,[rsssl-tooltip]:hover::after{display:block}[rsssl-tooltip='']::before,[rsssl-tooltip='']::after{display:none !important}[rsssl-tooltip]:not([flow])::before,[rsssl-tooltip][flow^="up"]::before{bottom:100%;border-bottom-width:0;border-top-color:#333}[rsssl-tooltip]:not([flow])::after,[rsssl-tooltip][flow^="up"]::after{bottom:calc(100%+5px)}[rsssl-tooltip]:not([flow])::before,[rsssl-tooltip]:not([flow])::after,[rsssl-tooltip][flow^="up"]::before,[rsssl-tooltip][flow^="up"]::after{left:50%;transform:translate(-50%,-0.5em)}[rsssl-tooltip][flow^="down"]::before{top:100%;border-top-width:0;border-bottom-color:#333}[rsssl-tooltip][flow^="down"]::after{top:calc(100%+5px)}[rsssl-tooltip][flow^="down"]::before,[rsssl-tooltip][flow^="down"]::after{left:50%;transform:translate(-50%,0.5em)}[rsssl-tooltip][flow^="left"]::before{top:50%;border-right-width:0;border-left-color:#333;left:calc(0 - 5px);transform:translate(-0.5em,-50%)}[rsssl-tooltip][flow^="left"]::after{top:50%;right:calc(100%+5px);transform:translate(-0.5em,-50%)}[rsssl-tooltip][flow^="right"]::before{top:50%;border-left-width:0;border-right-color:#333;right:calc(0 - 19px);transform:translate(0.5em,-50%)}[rsssl-tooltip][flow^="right"]::after{top:50%;left:calc(100%+19px);transform:translate(0.5em,-50%);min-width:300px}@keyframes tooltips-vert{to{opacity:.9;transform:translate(-50%,0)}}@keyframes tooltips-horz{to{opacity:.9;transform:translate(0,-50%)}}[rsssl-tooltip]:not([flow]):hover::before,[rsssl-tooltip]:not([flow]):hover::after,[rsssl-tooltip][flow^="up"]:hover::before,[rsssl-tooltip][flow^="up"]:hover::after,[rsssl-tooltip][flow^="down"]:hover::before,[rsssl-tooltip][flow^="down"]:hover::after{animation:tooltips-vert 300ms ease-out forwards}[rsssl-tooltip][flow^="left"]:hover::before,[rsssl-tooltip][flow^="left"]:hover::after,[rsssl-tooltip][flow^="right"]:hover::before,[rsssl-tooltip][flow^="right"]:hover::after{animation:tooltips-horz 300ms ease-out forwards}#rsssl-header{font-size:16px}#rsssl-header .button-black{background-color:black;color:white;border-color:black;padding:0 25px}#rsssl-header .link-black{color:black;padding:5px 5px}.wp-editor-wrap iframe{height:initial !important}.rsssl-help-warning-wrap .rsssl-help-modal{position:relative;position:absolute;z-index:99;margin:0 0 0 20px;padding:10px 15px;color:#fff;background-color:#f8be2e;text-align:left}.rsssl-help-warning-wrap .rsssl-help-modal h2{margin-top:-5px}.rsssl-help-warning-wrap .rsssl-help-modal:after{content:" ";position:absolute;left:-15px;top:15px;border-top:15px solid transparent;border-right:15px solid black;border-left:0;border-bottom:15px solid transparent}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-notice{background-color:#f8be2e;color:black;padding:20px}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-notice:after{border-right:15px solid #f8be2e;top:calc(50% - 15px)}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-success{background-color:white;color:#61ce70;border:0;padding:0}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-warning{color:#333;background-color:#f8be2e;border-color:#f8be2e}.rsssl-help-warning-wrap .rsssl-help-modal.rsssl-warning:after{border-right:15px solid #f8be2e}.rsssl-help-warning-wrap .rsssl-help-modal:empty{background-color:#f1f1f1}.rsssl-help-warning-wrap .rsssl-help-modal a{color:#333}a:active,a:hover{color:#333}a.button.rsssl-open-modal{font-size:9px;line-height:13px;height:15px;min-height:15px;padding:1px 3px;margin-left:10px}.rsssl-panel-link{text-decoration:none;display:inline-block;width:80%}#rsssl_language{font-size:15px}#rsssl_language.rsssl_cookie_language_selector{margin-bottom:0}.multiple-field div{margin-top:8px}.multiple-field div:last-child{margin-bottom:8px}.rsssl-list-container{margin-bottom:25px}.rsssl-list-container .rsssl-cookie-field>div,.rsssl-list-container .rsssl-service-field>div{margin-top:8px}.rsssl-list-container .rsssl-cookie-field>div:last-child,.rsssl-list-container .rsssl-service-field>div:last-child{margin-bottom:8px}.rsssl-list-container .rsssl-disabled label,.rsssl-list-container .rsssl-disabled span{color:#ababab !important}.rsssl-list-container .rsssl-service-cookie-list{margin-bottom:20px}.rsssl-list-container .rsssl-service-cookie-list:last-child{margin-bottom:0}.rsssl-list-container .rsssl-service-divider{font-size:15px;margin-bottom:10px}.rsssl-legenda{padding:10px 10px 0 10px;display:grid;grid-template-columns:25px 200px 25px 300px;grid-column-gap:10px;align-items:center}.rsssl-panel{font-size:13px !important;color:#383d41;background-color:#f2f2f2;border:1px solid #d6d8db;padding:10px 15px;border-radius:0;margin:0}.rsssl-panel.rsssl-toggle-disabled{color:#aca5a5}.rsssl-panel.rsssl-deleted{background-color:#ffa5aa}.rsssl-panel .rsssl-panel-title{cursor:pointer}.rsssl-panel .rsssl-field>div{margin:10px 0}.rsssl-panel .rsssl-multiple-field-validation{float:right}.rsssl-panel.rsssl-slide-panel,.rsssl-panel.rsssl-link-panel{padding:0}.rsssl-panel.rsssl-slide-panel .rsssl-panel-toggle,.rsssl-panel.rsssl-link-panel .rsssl-panel-toggle{display:flex;align-items:center}.rsssl-panel.rsssl-slide-panel .rsssl-panel-toggle span,.rsssl-panel.rsssl-link-panel .rsssl-panel-toggle span{padding-left:10px}.rsssl-panel.rsssl-slide-panel .rsssl-panel-title,.rsssl-panel.rsssl-link-panel .rsssl-panel-title{display:grid;grid-template-columns:50% 10% 40%;align-items:center;padding:10px 15px 8px 0}.rsssl-panel.rsssl-slide-panel .rsssl-panel-title span.rsssl-panel-toggle,.rsssl-panel.rsssl-link-panel .rsssl-panel-title span.rsssl-panel-toggle{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.rsssl-panel.rsssl-slide-panel .rsssl-panel-title span:last-of-type,.rsssl-panel.rsssl-link-panel .rsssl-panel-title span:last-of-type{display:flex;align-content:center;justify-content:flex-end}.rsssl-panel.rsssl-slide-panel .rsssl-panel-title span:last-of-type svg,.rsssl-panel.rsssl-link-panel .rsssl-panel-title span:last-of-type svg{width:18px;height:18px;padding-top:1px}.rsssl-panel.rsssl-slide-panel .rsssl-add-to-policy,.rsssl-panel.rsssl-link-panel .rsssl-add-to-policy{text-decoration:underline}.rsssl-panel.rsssl-link-panel.selected,.rsssl-panel.rsssl-link-panel:hover{box-shadow:0 5px 5px rgba(0,0,0,0.2),0 3px 5px rgba(0,0,0,0.13)}.rsssl-panel .rsssl-panel-content{display:none;background-color:#fff;border:1px solid #d6d8db;border-top:0;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:10px 15px}.rsssl-panel h1{font-size:22px}.rsssl-panel p{font-size:13px !important}.rsssl-panel.rsssl-notice{background-color:#fff;border:0;color:black;padding:20px 20px 0 20px}.rsssl-panel.rsssl-success{background-color:white;color:#61ce70;border:0;padding:0}.rsssl-panel.rsssl-warning{position:relative;color:#333;background-color:#f8be2e;border-color:#f8be2e;margin:10px 0 10px 0}.rsssl-panel.rsssl-warning:after{content:" ";position:absolute;left:-15px;top:15px;border-top:15px solid transparent;border-right:15px solid black;border-left:0;border-bottom:15px solid transparent}.rsssl-panel.rsssl-warning:after{border-right:15px solid #f8be2e}.rsssl-panel ul{list-style-type:disc;margin-left:22px}input[type="text"],input[type="password"],input[type="email"],input[type="number"]{width:100%}.rsssl-switch{position:relative;display:inline-block;width:40px;height:21px}.rsssl-switch input{display:none !important}.rsssl-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.rsssl-slider:before{position:absolute;content:"";height:15px;width:15px;left:4px;bottom:3px;background-color:white;-webkit-transition:.4s;transition:.4s}.rsssl-slider.rsssl-round{border-radius:20px}.rsssl-slider.rsssl-round:before{border-radius:50%}.rsssl-slider-na{padding:2px 8px;position:absolute;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.rsssl-slider-na:before{position:absolute;content:"N/A";color:white}.rsssl-slider-na.rsssl-round{border-radius:20px}input:checked+.rsssl-slider{background-color:#f8be2e}input:checked+.rsssl-slider:before{-webkit-transform:translateX(17px);-ms-transform:translateX(17px);transform:translateX(17px)}input:checked:disabled+.rsssl-slider{background-color:#fffbf3}input:focus+.rsssl-slider{box-shadow:0 0 1px #f8be2e}#complete_wizard_first_notice{position:fixed;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.7);z-index:99}#complete_wizard_first_notice p{border-radius:0;font-size:16px;background-color:#f8be2e;color:white;position:relative;top:150px;padding:30px;width:300px;text-align:center;margin:auto}html .mceContentBody{max-width:100% !important}.cookie-warning textarea{width:100%;height:100px}.rsssl-comment{font-size:11px;margin-top:10px}.rsssl-cookie-field .rsssl-cookie-header{border-bottom:1px solid #b6b7b8;margin-bottom:25px}#rsssl-send-data input[type=text]{width:60%}#rsssl-start-mail,#rsssl_close_tb_window{margin-right:15px;margin-top:15px}#rsssl-wizard h1,#rsssl-wizard h2,#rsssl-wizard h3,#rsssl-wizard h4,#rsssl-wizard .rsssl-menu-item,#rsssl-wizard .rsssl-step-title,#rsssl-wizard .rsssl-button{font-variant:normal}#rsssl-wizard h2,#rsssl-wizard h3{font-size:15px}#rsssl-wizard h3{font-weight:400}#rsssl-wizard label{font-size:13px}#rsssl-wizard .field-group{position:relative}#rsssl-wizard .field-group .rsssl-field{padding:0 20px 0 20px;background-color:white}#rsssl-wizard .field-group .rsssl-field .rsssl-template-intro{margin-top:15px}#rsssl-wizard .field-group .rsssl-title-wrap{font-size:15px;font-weight:700;padding-top:15px}#rsssl-wizard .field-group .rsssl-label{margin-bottom:10px}#rsssl-wizard .field-group .rsssl-label label{display:flex;flex-direction:column;font-size:15px;cursor:default}#rsssl-wizard .field-group .rsssl-label label .rsssl-label-wrap{display:flex;margin-top:15px;font-weight:700}#rsssl-wizard .field-group .rsssl-label label .rsssl-subtitle-wrap{font-size:.9em;margin:5px 5px 0 0}#rsssl-wizard .field-group.rsssl-editor .rsssl-label{margin-bottom:0}#rsssl-wizard .field-group .rsssl-field .field-group{grid-column:1;display:block}#rsssl-wizard .field-group .rsssl-field .rsssl-field{padding:0}#rsssl-wizard .rsssl-body input[type="text"].rsssl-document-custom-url,#rsssl-wizard #rsssl-content-area input[type="text"].rsssl-document-custom-url{width:250px}#rsssl-wizard .rsssl-body .rsssl-document-custom-url,#rsssl-wizard #rsssl-content-area .rsssl-document-custom-url,#rsssl-wizard .rsssl-body .rsssl-document-custom-page,#rsssl-wizard #rsssl-content-area .rsssl-document-custom-page{margin-top:5px}#rsssl-wizard .rsssl-body input.button,#rsssl-wizard #rsssl-content-area input.button{min-width:100px}#rsssl-wizard .rsssl-body input.button.button-red,#rsssl-wizard #rsssl-content-area input.button.button-red{background-color:red;color:white;border-color:red}#rsssl-wizard .rsssl-body input.button.button-black,#rsssl-wizard #rsssl-content-area input.button.button-black{background-color:black;color:white;border-color:black}#rsssl-wizard .rsssl-body input.button.button-link,#rsssl-wizard #rsssl-content-area input.button.button-link{text-align:center;min-width:initial}#rsssl-wizard .rsssl-body input.button.button-link:hover,#rsssl-wizard #rsssl-content-area input.button.button-link:hover{background-color:initial;text-decoration:none}#rsssl-wizard .rsssl-body button.button-red,#rsssl-wizard #rsssl-content-area button.button-red{background-color:red;color:white;border-color:red}#rsssl-wizard .rsssl-body .rsssl-master-label h2,#rsssl-wizard #rsssl-content-area .rsssl-master-label h2{margin:0;padding:20px 20px 0 0;font-size:18px;background-color:white}#rsssl-wizard .rsssl-body .rsssl-remove,#rsssl-wizard #rsssl-content-area .rsssl-remove{margin-bottom:12px}#rsssl-wizard .rsssl-body .rsssl-rescan,#rsssl-wizard #rsssl-content-area .rsssl-rescan{padding:0 10px 0 10px}#rsssl-wizard .rsssl-body .rsssl-menu-item.active i,#rsssl-wizard #rsssl-content-area .rsssl-menu-item.active i{color:black;font-size:1.35em;float:left}#rsssl-wizard .rsssl-body .rsssl-menu-item.active a,#rsssl-wizard #rsssl-content-area .rsssl-menu-item.active a{color:#000;font-weight:900;padding-left:7px;text-decoration:underline}#rsssl-wizard .rsssl-body .rsssl-done a,#rsssl-wizard #rsssl-content-area .rsssl-done a{text-decoration:none;color:white;font-size:15px}#rsssl-wizard .rsssl-body .rsssl-to-do a,#rsssl-wizard #rsssl-content-area .rsssl-to-do a{color:white;font-size:15px;text-decoration:none;opacity:.6}@media screen and (max-width:782px){#rsssl-wizard .rsssl-body input,#rsssl-wizard #rsssl-content-area input{vertical-align:top !important}}.rsssl-field label{font-weight:normal;margin:10px 0 2px}.rsssl-field .rsssl-color-picker.wp-color-picker{margin-top:-11px !important}.rsssl-field input[type="text"],.rsssl-field input[type="email"],.rsssl-field input[type="number"]{border-color:#dadada}.rsssl-field select{border-color:#f1f1f1;vertical-align:initial}.rsssl-field textarea.validation:invalid,.rsssl-field textarea.validation:valid{background-position:.5% 1.5%;border-color:#dadada}.rsssl-field textarea{min-height:150px;width:100%}.rsssl-field input[type=radio]:checked:before{content:"\2022";text-indent:-9999px;border-radius:50px;font-size:24px;width:6px;height:6px;margin:4px;line-height:16px;background-color:#1e8cbe}.rsssl-field .rsssl-panel.rsssl-notice{padding:0 0 10px 0}.rsssl-field .rsssl-buttons-row-left{display:flex;align-items:center;height:auto;margin-bottom:10px}.rsssl-field .rsssl-buttons-row-left input,.rsssl-field .rsssl-buttons-row-left select,.rsssl-field .rsssl-buttons-row-left div{margin-right:20px}.rsssl-field button[name=rsssl_add_multiple]{margin-top:20px}a.rsssl.button,button.rsssl.button,input.rsssl.button{margin-left:15px;box-shadow:0 0 0 #fff;background-color:#f8be2e;color:#fff;padding-right:20px;border:0;border-radius:50px;padding-top:2px}a.rsssl.button:hover,button.rsssl.button:hover,input.rsssl.button:hover{background-color:#facd5f;color:white}a.rsssl.button .fa-angle-right,button.rsssl.button .fa-angle-right,input.rsssl.button .fa-angle-right{font-weight:900;position:absolute;font-size:1.8em;margin-top:1px;margin-left:5px}#rsssl-wizard .dashboard .fa-times{color:black}#rsssl-wizard .dashboard .fa-check{color:#f8be2e}.rsssl-dashboard-container .rsssl-dashboard-title{padding-top:22px;font-weight:600;font-size:24px;line-height:30px;margin-bottom:20px}@media screen and (max-width:720px){.rsssl-dashboard-container .rsssl-dashboard-title{padding-bottom:0}}.rsssl-dashboard-header .rsssl-header-top{min-height:60px}.rsssl-header-top{grid-area:header-top;background-color:#f2f2f2;min-height:30px;padding-top:25px}.rsssl-header-top .rsssl-premium-cta{width:150px;float:right;border-color:#f8be2e;color:#f8be2e;text-transform:uppercase;display:flex}.rsssl-dashboard-container{background-color:white;display:flex;flex-wrap:wrap}.rsssl-dashboard-container .rsssl-dashboard-header{margin-bottom:-270px;width:100%;min-height:220px;background-color:#f8be2e;background-repeat:no-repeat;background-attachment:scroll;background-position:bottom center}.rsssl-dashboard-container .rsssl-dashboard-header .rsssl-header-text{display:flex;align-items:center}.rsssl-dashboard-container .rsssl-dashboard-item{background-color:#fff;width:450px;margin-top:10px;border:2px solid;flex:0 0 450px;flex-shrink:1;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:0;border-color:#f2f2f2;overflow:hidden}.rsssl-dashboard-container .rsssl-dashboard-item .rsssl-top h1{font-weight:600;font-size:2.5em;padding:25px}.rsssl-dashboard-container .rsssl-dashboard-content-container{margin:0 auto;display:grid;grid-template-areas:'header-top header-top header-top header-top' 'text-completed text-completed text-completed text-completed' 'progress progress support support' 'progress progress documents documents' 'footer footer footer footer';grid-gap:10px;padding:10px}@media screen and (max-width:1210px){.rsssl-dashboard-container .rsssl-dashboard-content-container{grid-template-areas:'header-top header-top' 'text-completed text-completed' 'progress progress' 'support support' 'documents documents' 'footer footer' 'footer footer'}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-logo{display:flex;align-items:center;font-size:1.5em;font-weight:600}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-header-text{display:flex;align-items:center}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-completed-text{display:flex;align-items:center;margin-top:35px;grid-area:text-completed;font-size:24px;color:white}@media screen and (max-width:720px){.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-completed-text button{width:100px}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-info{font-size:19px;font-weight:bold;padding-top:20px;padding-bottom:10px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text{color:black;font-weight:400;padding:15px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text li{border-bottom:1px solid}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text .fa-plus{margin-right:8px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-text.free{background-color:#000;color:#fff;min-height:40px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress{grid-area:progress}@media screen and (max-width:1210px){.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress{margin:0 auto}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top{background-color:#f2f2f2;min-height:170px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top .rsssl-dashboard-top-text{display:inline-grid;font-size:18px;line-height:22px;max-width:60%;float:left}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-dashboard-progress-top .rsssl-dashboard-top-text .rsssl-dashboard-top-text-subtitle{color:#f8be2e}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-continue-wizard-btn{padding-top:125px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-continue-wizard-btn button{text-align:-webkit-left;border-radius:50px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-percentage-complete{margin-top:20px;float:right}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table{padding-top:10px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .i.fa.fa-check{color:black}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .rsssl-success,.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-progress .rsssl-steps-table .rsssl-error{color:black}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support{width:450px;grid-area:support}@media screen and (max-width:1210px){.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support{margin:0 auto}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=text],.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=email],.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support textarea,.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=submit]{width:425px;margin-bottom:5px;margin-top:5px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support textarea{min-height:100px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-support input[type=submit]{margin:auto}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents{grid-area:documents;margin-top:10px}@media screen and (max-width:1210px){.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents{margin:0 auto}}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table{padding-bottom:15px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table .fas{margin-right:8px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table ul{margin:5px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table li{border-bottom:2px solid;margin-bottom:5px;text-indent:5px;display:flex;vertical-align:middle;margin-left:8px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-upgrade-table .fa-plus{color:#f8be2e;font-size:1.5em}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-documents-bottom{color:white;background-color:black;min-height:70px;font-size:14px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-documents .rsssl-documents-bottom div{margin-bottom:10px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer{grid-area:footer;display:flex;flex-shrink:1;flex-grow:1;margin-top:20px;flex-wrap:wrap;justify-content:center;padding-bottom:20px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block{position:relative;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:0;background-color:#f2f2f2;width:205px;min-height:70px;margin:5px auto}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block a{position:absolute;top:5px;right:5px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-footer-title{margin-top:9px;margin-left:9px;font-weight:900;font-size:1.2em;margin-right:35px}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-footer-description{width:70%;margin-left:9px;font-size:.8em;display:flex}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-external-btn{text-align:center;border-radius:7px;color:#f8be2e;width:25px;height:20px;float:right}.rsssl-dashboard-container .rsssl-dashboard-content-container .rsssl-dashboard-footer .rsssl-footer-block .rsssl-external-btn .fa-angle-right{font-size:1.5em;vertical-align:middle;margin-left:2px}.rsssl-skeleton:empty{margin:auto;margin-bottom:25px;width:100%;height:235px;background-image:linear-gradient(100deg,rgba(255,255,255,0),rgba(255,255,255,0.5) 70%,rgba(255,255,255,0.5) 15%),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0);background-repeat:repeat-y;background-size:50px 200px,100% 117px,100% 117px,100% 117px,100% 117px;background-position:0 0,1px 1px,1px 40px,1px 79px,1px 118px;background-color:#d6d8db;animation:shine 2.5s infinite}@keyframes shine{to{background-position:100% 0,1px 1px,1px 40px,1px 79px,1px 118px}}@-webkit-keyframes sk-stretchdelay{0,40%,100%{-webkit-transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0,40%,100%{transform:scaleY(0.4);-webkit-transform:scaleY(0.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}.rsssl-wizard-menu-menus{padding-top:10px}.rsssl-scroll{overflow:scroll;scroll-behavior:smooth;overflow-x:hidden}#wpbody-content{padding-bottom:0}#customization{z-index:10}.cc-window{right:1em}.cc-window.cc-center{transform:translate(0,-50%);left:initial}.cc-window.cc-left{left:initial}@keyframes slideInUpCenter{from{-webkit-transform:translate3d(0,150%,0);transform:translate3d(0,150%,0)}to{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}}@keyframes slideOutUpCenter{to{-webkit-transform:translate3d(0,150%,0);transform:translate3d(0,150%,0);opacity:1}from{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0);opacity:1}}.rsssl-wizard-wrap{margin:0}#rsssl-proof-of-consent #rsssl-content-area,#rsssl-cookie-banner #rsssl-content-area{display:block}#rsssl-proof-of-consent #rsssl-content-area h1,#rsssl-cookie-banner #rsssl-content-area h1{background-color:white;padding:20px;border-bottom:1px solid #eee}#rsssl-proof-of-consent #rsssl-content-area .rsssl-panel,#rsssl-cookie-banner #rsssl-content-area .rsssl-panel{padding:20px;margin-bottom:20px}#rsssl-proof-of-consent #rsssl-content-area .rsssl-notice,#rsssl-cookie-banner #rsssl-content-area .rsssl-notice{background-color:white}#rsssl-proof-of-consent #rsssl-content-area input[name=rsssl_generate_snapshot],#rsssl-cookie-banner #rsssl-content-area input[name=rsssl_generate_snapshot]{width:120px}#rsssl-proof-of-consent #rsssl-content-area .rsssl-month-select,#rsssl-cookie-banner #rsssl-content-area .rsssl-month-select,#rsssl-proof-of-consent #rsssl-content-area .rsssl-year-select,#rsssl-cookie-banner #rsssl-content-area .rsssl-year-select,#rsssl-proof-of-consent #rsssl-content-area #post-query-submit,#rsssl-cookie-banner #rsssl-content-area #post-query-submit{float:right;margin-top:-50px;width:120px}#rsssl-proof-of-consent #rsssl-content-area #post-query-submit,#rsssl-cookie-banner #rsssl-content-area #post-query-submit{margin-right:0}#rsssl-proof-of-consent #rsssl-content-area .rsssl-month-select,#rsssl-cookie-banner #rsssl-content-area .rsssl-month-select{margin-right:290px}#rsssl-proof-of-consent #rsssl-content-area .rsssl-year-select,#rsssl-cookie-banner #rsssl-content-area .rsssl-year-select{margin-right:145px}#rsssl-proof-of-consent #rsssl-content-area .tablenav,#rsssl-cookie-banner #rsssl-content-area .tablenav{display:none}#rsssl-proof-of-consent #rsssl-content-area #rsssl-cookiestatement-snapshot-filter,#rsssl-cookie-banner #rsssl-content-area #rsssl-cookiestatement-snapshot-filter{padding-top:20px}#rsssl-proof-of-consent #rsssl-content-area .wp-list-table,#rsssl-cookie-banner #rsssl-content-area .wp-list-table{font-weight:bold}#rsssl-proof-of-consent #rsssl-content-area .wp-list-table th,#rsssl-cookie-banner #rsssl-content-area .wp-list-table th{font-weight:bold}#rsssl-proof-of-consent #rsssl-content-area .wp-list-table th a,#rsssl-cookie-banner #rsssl-content-area .wp-list-table th a{padding:15px}#wpbody-content .update-nag{display:none}#wpbody-content .subsubsub{display:none}#wpbody-content .wp-heading-inline{padding:20px 0}#wpbody-content .rsssl-document-button{margin-top:22px;margin-left:15px}#wpb