itsi-server 0.2.22-aarch64-linux

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +8 -0
  3. data/Cargo.lock +4452 -0
  4. data/Cargo.toml +11 -0
  5. data/Rakefile +57 -0
  6. data/exe/itsi +193 -0
  7. data/ext/itsi_acme/Cargo.toml +86 -0
  8. data/ext/itsi_acme/examples/high_level.rs +63 -0
  9. data/ext/itsi_acme/examples/high_level_warp.rs +52 -0
  10. data/ext/itsi_acme/examples/low_level.rs +87 -0
  11. data/ext/itsi_acme/examples/low_level_axum.rs +66 -0
  12. data/ext/itsi_acme/src/acceptor.rs +81 -0
  13. data/ext/itsi_acme/src/acme.rs +354 -0
  14. data/ext/itsi_acme/src/axum.rs +86 -0
  15. data/ext/itsi_acme/src/cache.rs +39 -0
  16. data/ext/itsi_acme/src/caches/boxed.rs +80 -0
  17. data/ext/itsi_acme/src/caches/composite.rs +69 -0
  18. data/ext/itsi_acme/src/caches/dir.rs +106 -0
  19. data/ext/itsi_acme/src/caches/mod.rs +11 -0
  20. data/ext/itsi_acme/src/caches/no.rs +78 -0
  21. data/ext/itsi_acme/src/caches/test.rs +136 -0
  22. data/ext/itsi_acme/src/config.rs +172 -0
  23. data/ext/itsi_acme/src/https_helper.rs +69 -0
  24. data/ext/itsi_acme/src/incoming.rs +142 -0
  25. data/ext/itsi_acme/src/jose.rs +161 -0
  26. data/ext/itsi_acme/src/lib.rs +142 -0
  27. data/ext/itsi_acme/src/resolver.rs +59 -0
  28. data/ext/itsi_acme/src/state.rs +424 -0
  29. data/ext/itsi_error/Cargo.lock +368 -0
  30. data/ext/itsi_error/Cargo.toml +12 -0
  31. data/ext/itsi_error/src/lib.rs +140 -0
  32. data/ext/itsi_instrument_entry/Cargo.toml +15 -0
  33. data/ext/itsi_instrument_entry/src/lib.rs +31 -0
  34. data/ext/itsi_rb_helpers/Cargo.lock +355 -0
  35. data/ext/itsi_rb_helpers/Cargo.toml +11 -0
  36. data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
  37. data/ext/itsi_rb_helpers/src/lib.rs +232 -0
  38. data/ext/itsi_scheduler/Cargo.toml +24 -0
  39. data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
  40. data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
  41. data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
  42. data/ext/itsi_scheduler/src/itsi_scheduler.rs +320 -0
  43. data/ext/itsi_scheduler/src/lib.rs +39 -0
  44. data/ext/itsi_server/Cargo.lock +2956 -0
  45. data/ext/itsi_server/Cargo.toml +94 -0
  46. data/ext/itsi_server/extconf.rb +11 -0
  47. data/ext/itsi_server/src/default_responses/html/401.html +68 -0
  48. data/ext/itsi_server/src/default_responses/html/403.html +68 -0
  49. data/ext/itsi_server/src/default_responses/html/404.html +68 -0
  50. data/ext/itsi_server/src/default_responses/html/413.html +71 -0
  51. data/ext/itsi_server/src/default_responses/html/429.html +68 -0
  52. data/ext/itsi_server/src/default_responses/html/500.html +71 -0
  53. data/ext/itsi_server/src/default_responses/html/502.html +71 -0
  54. data/ext/itsi_server/src/default_responses/html/503.html +68 -0
  55. data/ext/itsi_server/src/default_responses/html/504.html +69 -0
  56. data/ext/itsi_server/src/default_responses/html/index.html +238 -0
  57. data/ext/itsi_server/src/default_responses/json/401.json +6 -0
  58. data/ext/itsi_server/src/default_responses/json/403.json +6 -0
  59. data/ext/itsi_server/src/default_responses/json/404.json +6 -0
  60. data/ext/itsi_server/src/default_responses/json/413.json +6 -0
  61. data/ext/itsi_server/src/default_responses/json/429.json +6 -0
  62. data/ext/itsi_server/src/default_responses/json/500.json +6 -0
  63. data/ext/itsi_server/src/default_responses/json/502.json +6 -0
  64. data/ext/itsi_server/src/default_responses/json/503.json +6 -0
  65. data/ext/itsi_server/src/default_responses/json/504.json +6 -0
  66. data/ext/itsi_server/src/default_responses/mod.rs +14 -0
  67. data/ext/itsi_server/src/env.rs +43 -0
  68. data/ext/itsi_server/src/lib.rs +154 -0
  69. data/ext/itsi_server/src/prelude.rs +2 -0
  70. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +116 -0
  71. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +149 -0
  72. data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +346 -0
  73. data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +265 -0
  74. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +399 -0
  75. data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +447 -0
  76. data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +545 -0
  77. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +650 -0
  78. data/ext/itsi_server/src/ruby_types/itsi_server.rs +102 -0
  79. data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
  80. data/ext/itsi_server/src/server/binds/bind.rs +204 -0
  81. data/ext/itsi_server/src/server/binds/bind_protocol.rs +37 -0
  82. data/ext/itsi_server/src/server/binds/listener.rs +485 -0
  83. data/ext/itsi_server/src/server/binds/mod.rs +4 -0
  84. data/ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs +132 -0
  85. data/ext/itsi_server/src/server/binds/tls.rs +278 -0
  86. data/ext/itsi_server/src/server/byte_frame.rs +32 -0
  87. data/ext/itsi_server/src/server/frame_stream.rs +143 -0
  88. data/ext/itsi_server/src/server/http_message_types.rs +230 -0
  89. data/ext/itsi_server/src/server/io_stream.rs +128 -0
  90. data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
  91. data/ext/itsi_server/src/server/middleware_stack/middleware.rs +170 -0
  92. data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +63 -0
  93. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +94 -0
  94. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +93 -0
  95. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +343 -0
  96. data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +151 -0
  97. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +329 -0
  98. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +300 -0
  99. data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +193 -0
  100. data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +64 -0
  101. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +188 -0
  102. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +168 -0
  103. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +183 -0
  104. data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +82 -0
  105. data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +209 -0
  106. data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +133 -0
  107. data/ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  108. data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +122 -0
  109. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +407 -0
  110. data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +155 -0
  111. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +54 -0
  112. data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +54 -0
  113. data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +51 -0
  114. data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +138 -0
  115. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +269 -0
  116. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +62 -0
  117. data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +218 -0
  118. data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +31 -0
  119. data/ext/itsi_server/src/server/middleware_stack/mod.rs +381 -0
  120. data/ext/itsi_server/src/server/mod.rs +14 -0
  121. data/ext/itsi_server/src/server/process_worker.rs +247 -0
  122. data/ext/itsi_server/src/server/redirect_type.rs +26 -0
  123. data/ext/itsi_server/src/server/request_job.rs +11 -0
  124. data/ext/itsi_server/src/server/serve_strategy/acceptor.rs +100 -0
  125. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +411 -0
  126. data/ext/itsi_server/src/server/serve_strategy/mod.rs +31 -0
  127. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +449 -0
  128. data/ext/itsi_server/src/server/signal.rs +129 -0
  129. data/ext/itsi_server/src/server/size_limited_incoming.rs +107 -0
  130. data/ext/itsi_server/src/server/thread_worker.rs +504 -0
  131. data/ext/itsi_server/src/services/cache_store.rs +74 -0
  132. data/ext/itsi_server/src/services/itsi_http_service.rs +270 -0
  133. data/ext/itsi_server/src/services/mime_types.rs +2896 -0
  134. data/ext/itsi_server/src/services/mod.rs +6 -0
  135. data/ext/itsi_server/src/services/password_hasher.rs +89 -0
  136. data/ext/itsi_server/src/services/rate_limiter.rs +609 -0
  137. data/ext/itsi_server/src/services/static_file_server.rs +1400 -0
  138. data/ext/itsi_tracing/Cargo.lock +274 -0
  139. data/ext/itsi_tracing/Cargo.toml +17 -0
  140. data/ext/itsi_tracing/src/lib.rs +370 -0
  141. data/lib/itsi/http_request/response_status_shortcodes.rb +76 -0
  142. data/lib/itsi/http_request.rb +228 -0
  143. data/lib/itsi/http_response.rb +49 -0
  144. data/lib/itsi/passfile.rb +108 -0
  145. data/lib/itsi/rack_env_pool.rb +49 -0
  146. data/lib/itsi/server/3.1/itsi_server.so +0 -0
  147. data/lib/itsi/server/3.2/itsi_server.so +0 -0
  148. data/lib/itsi/server/3.3/itsi_server.so +0 -0
  149. data/lib/itsi/server/3.4/itsi_server.so +0 -0
  150. data/lib/itsi/server/4.0/itsi_server.so +0 -0
  151. data/lib/itsi/server/config/config_helpers.rb +116 -0
  152. data/lib/itsi/server/config/dsl.rb +208 -0
  153. data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  154. data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  155. data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  156. data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  157. data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  158. data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  159. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  160. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  161. data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  162. data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  163. data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  164. data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  165. data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  166. data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  167. data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  168. data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  169. data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  170. data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  171. data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  172. data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  173. data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  174. data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  175. data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  176. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  177. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  178. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  179. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  180. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  181. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  182. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  183. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  184. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  185. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  186. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  187. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  188. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  189. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  190. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  191. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  192. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  193. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  194. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  195. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  196. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  197. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  198. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  199. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  200. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  201. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  202. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  203. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  204. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  205. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  206. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  207. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  208. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  209. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  210. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  211. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  212. data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  213. data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  214. data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  215. data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  216. data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  217. data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  218. data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  219. data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  220. data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  221. data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  222. data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  223. data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  224. data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  225. data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  226. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  227. data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  228. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  229. data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  230. data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  231. data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  232. data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  233. data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  234. data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  235. data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  236. data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  237. data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  238. data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  239. data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  240. data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  241. data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  242. data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  243. data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  244. data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  245. data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  246. data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  247. data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  248. data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  249. data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  250. data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  251. data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  252. data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  253. data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  254. data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  255. data/lib/itsi/server/config/known_paths.rb +24 -0
  256. data/lib/itsi/server/config/middleware/_index.md +56 -0
  257. data/lib/itsi/server/config/middleware/allow_list.md +46 -0
  258. data/lib/itsi/server/config/middleware/allow_list.rb +42 -0
  259. data/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
  260. data/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
  261. data/lib/itsi/server/config/middleware/auth_basic.md +45 -0
  262. data/lib/itsi/server/config/middleware/auth_basic.rb +46 -0
  263. data/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
  264. data/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
  265. data/lib/itsi/server/config/middleware/cache_control.md +78 -0
  266. data/lib/itsi/server/config/middleware/cache_control.rb +45 -0
  267. data/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
  268. data/lib/itsi/server/config/middleware/compression.md +50 -0
  269. data/lib/itsi/server/config/middleware/compression.rb +37 -0
  270. data/lib/itsi/server/config/middleware/cors.md +93 -0
  271. data/lib/itsi/server/config/middleware/cors.rb +32 -0
  272. data/lib/itsi/server/config/middleware/csp.md +37 -0
  273. data/lib/itsi/server/config/middleware/csp.rb +44 -0
  274. data/lib/itsi/server/config/middleware/deny_list.md +45 -0
  275. data/lib/itsi/server/config/middleware/deny_list.rb +42 -0
  276. data/lib/itsi/server/config/middleware/endpoint/_index.md +160 -0
  277. data/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
  278. data/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
  279. data/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
  280. data/lib/itsi/server/config/middleware/endpoint/delete.rb +43 -0
  281. data/lib/itsi/server/config/middleware/endpoint/endpoint.rb +106 -0
  282. data/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
  283. data/lib/itsi/server/config/middleware/endpoint/get.rb +43 -0
  284. data/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
  285. data/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
  286. data/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
  287. data/lib/itsi/server/config/middleware/endpoint/patch.rb +43 -0
  288. data/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
  289. data/lib/itsi/server/config/middleware/endpoint/post.rb +43 -0
  290. data/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
  291. data/lib/itsi/server/config/middleware/endpoint/put.rb +43 -0
  292. data/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
  293. data/lib/itsi/server/config/middleware/error_response.md +74 -0
  294. data/lib/itsi/server/config/middleware/error_response.rb +36 -0
  295. data/lib/itsi/server/config/middleware/etag.md +55 -0
  296. data/lib/itsi/server/config/middleware/etag.rb +25 -0
  297. data/lib/itsi/server/config/middleware/grpc.md +170 -0
  298. data/lib/itsi/server/config/middleware/grpc.rb +54 -0
  299. data/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
  300. data/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
  301. data/lib/itsi/server/config/middleware/location.md +107 -0
  302. data/lib/itsi/server/config/middleware/location.rb +103 -0
  303. data/lib/itsi/server/config/middleware/log_requests.md +67 -0
  304. data/lib/itsi/server/config/middleware/log_requests.rb +31 -0
  305. data/lib/itsi/server/config/middleware/max_body.md +18 -0
  306. data/lib/itsi/server/config/middleware/max_body.rb +21 -0
  307. data/lib/itsi/server/config/middleware/proxy.md +62 -0
  308. data/lib/itsi/server/config/middleware/proxy.rb +42 -0
  309. data/lib/itsi/server/config/middleware/rackup_file.md +72 -0
  310. data/lib/itsi/server/config/middleware/rackup_file.rb +43 -0
  311. data/lib/itsi/server/config/middleware/rate_limit.md +126 -0
  312. data/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
  313. data/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
  314. data/lib/itsi/server/config/middleware/redirect.md +55 -0
  315. data/lib/itsi/server/config/middleware/redirect.rb +25 -0
  316. data/lib/itsi/server/config/middleware/request_headers.md +34 -0
  317. data/lib/itsi/server/config/middleware/request_headers.rb +24 -0
  318. data/lib/itsi/server/config/middleware/response_headers.md +33 -0
  319. data/lib/itsi/server/config/middleware/response_headers.rb +25 -0
  320. data/lib/itsi/server/config/middleware/run.md +79 -0
  321. data/lib/itsi/server/config/middleware/run.rb +45 -0
  322. data/lib/itsi/server/config/middleware/static_assets.md +113 -0
  323. data/lib/itsi/server/config/middleware/static_assets.rb +99 -0
  324. data/lib/itsi/server/config/middleware/static_response.md +44 -0
  325. data/lib/itsi/server/config/middleware/static_response.rb +30 -0
  326. data/lib/itsi/server/config/middleware/string_rewrite.md +81 -0
  327. data/lib/itsi/server/config/middleware/token_source.rb +32 -0
  328. data/lib/itsi/server/config/middleware.rb +13 -0
  329. data/lib/itsi/server/config/option.rb +13 -0
  330. data/lib/itsi/server/config/options/_index.md +41 -0
  331. data/lib/itsi/server/config/options/auto_reload_config.md +13 -0
  332. data/lib/itsi/server/config/options/auto_reload_config.rb +46 -0
  333. data/lib/itsi/server/config/options/bind.md +71 -0
  334. data/lib/itsi/server/config/options/bind.rb +26 -0
  335. data/lib/itsi/server/config/options/certificates.md +65 -0
  336. data/lib/itsi/server/config/options/daemonize.md +14 -0
  337. data/lib/itsi/server/config/options/daemonize.rb +19 -0
  338. data/lib/itsi/server/config/options/fiber_scheduler.md +34 -0
  339. data/lib/itsi/server/config/options/fiber_scheduler.rb +21 -0
  340. data/lib/itsi/server/config/options/header_read_timeout.md +17 -0
  341. data/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
  342. data/lib/itsi/server/config/options/hooks/_index.md +11 -0
  343. data/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
  344. data/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
  345. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
  346. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
  347. data/lib/itsi/server/config/options/hooks/after_start.md +12 -0
  348. data/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
  349. data/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
  350. data/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
  351. data/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
  352. data/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
  353. data/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
  354. data/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
  355. data/lib/itsi/server/config/options/include.md +21 -0
  356. data/lib/itsi/server/config/options/include.rb +41 -0
  357. data/lib/itsi/server/config/options/listen_backlog.md +11 -0
  358. data/lib/itsi/server/config/options/listen_backlog.rb +19 -0
  359. data/lib/itsi/server/config/options/log_format.md +18 -0
  360. data/lib/itsi/server/config/options/log_format.rb +19 -0
  361. data/lib/itsi/server/config/options/log_level.md +34 -0
  362. data/lib/itsi/server/config/options/log_level.rb +20 -0
  363. data/lib/itsi/server/config/options/log_target.md +38 -0
  364. data/lib/itsi/server/config/options/log_target.rb +19 -0
  365. data/lib/itsi/server/config/options/log_target_filters.md +17 -0
  366. data/lib/itsi/server/config/options/log_target_filters.rb +19 -0
  367. data/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
  368. data/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
  369. data/lib/itsi/server/config/options/nodelay.md +16 -0
  370. data/lib/itsi/server/config/options/nodelay.rb +19 -0
  371. data/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
  372. data/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
  373. data/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
  374. data/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
  375. data/lib/itsi/server/config/options/pipeline_flush.md +16 -0
  376. data/lib/itsi/server/config/options/pipeline_flush.rb +19 -0
  377. data/lib/itsi/server/config/options/preload.md +21 -0
  378. data/lib/itsi/server/config/options/preload.rb +18 -0
  379. data/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
  380. data/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
  381. data/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
  382. data/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
  383. data/lib/itsi/server/config/options/request_timeout.md +23 -0
  384. data/lib/itsi/server/config/options/request_timeout.rb +19 -0
  385. data/lib/itsi/server/config/options/reuse_address.md +18 -0
  386. data/lib/itsi/server/config/options/reuse_address.rb +19 -0
  387. data/lib/itsi/server/config/options/reuse_port.md +18 -0
  388. data/lib/itsi/server/config/options/reuse_port.rb +17 -0
  389. data/lib/itsi/server/config/options/ruby_thread_request_backlog_size.md +18 -0
  390. data/lib/itsi/server/config/options/ruby_thread_request_backlog_size.rb +19 -0
  391. data/lib/itsi/server/config/options/scheduler_threads.md +41 -0
  392. data/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
  393. data/lib/itsi/server/config/options/send_buffer_size.md +15 -0
  394. data/lib/itsi/server/config/options/send_buffer_size.rb +19 -0
  395. data/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
  396. data/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
  397. data/lib/itsi/server/config/options/stream_body.md +32 -0
  398. data/lib/itsi/server/config/options/stream_body.rb +18 -0
  399. data/lib/itsi/server/config/options/threads.md +44 -0
  400. data/lib/itsi/server/config/options/threads.rb +17 -0
  401. data/lib/itsi/server/config/options/watch.md +16 -0
  402. data/lib/itsi/server/config/options/watch.rb +28 -0
  403. data/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
  404. data/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
  405. data/lib/itsi/server/config/options/workers.md +42 -0
  406. data/lib/itsi/server/config/options/workers.rb +17 -0
  407. data/lib/itsi/server/config/options/writev.md +25 -0
  408. data/lib/itsi/server/config/options/writev.rb +19 -0
  409. data/lib/itsi/server/config/typed_struct.rb +239 -0
  410. data/lib/itsi/server/config.rb +321 -0
  411. data/lib/itsi/server/default_app/default_app.rb +34 -0
  412. data/lib/itsi/server/default_app/index.html +115 -0
  413. data/lib/itsi/server/default_config/Itsi.rb +108 -0
  414. data/lib/itsi/server/grpc/grpc_call.rb +247 -0
  415. data/lib/itsi/server/grpc/grpc_interface.rb +106 -0
  416. data/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  417. data/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  418. data/lib/itsi/server/native_extension.rb +34 -0
  419. data/lib/itsi/server/rack/handler/itsi.rb +29 -0
  420. data/lib/itsi/server/rack_interface.rb +109 -0
  421. data/lib/itsi/server/route_tester.rb +159 -0
  422. data/lib/itsi/server/scheduler_interface.rb +23 -0
  423. data/lib/itsi/server/scheduler_mode.rb +10 -0
  424. data/lib/itsi/server/signal_trap.rb +33 -0
  425. data/lib/itsi/server/typed_handlers/param_parser.rb +221 -0
  426. data/lib/itsi/server/typed_handlers/source_parser.rb +58 -0
  427. data/lib/itsi/server/typed_handlers.rb +25 -0
  428. data/lib/itsi/server/version.rb +7 -0
  429. data/lib/itsi/server.rb +288 -0
  430. data/lib/itsi/standard_headers.rb +86 -0
  431. data/lib/ruby_lsp/itsi/addon.rb +128 -0
  432. data/lib/shell_completions/completions.rb +26 -0
  433. data/vendor/rb-sys-build/.cargo-ok +1 -0
  434. data/vendor/rb-sys-build/.cargo_vcs_info.json +6 -0
  435. data/vendor/rb-sys-build/Cargo.lock +294 -0
  436. data/vendor/rb-sys-build/Cargo.toml +71 -0
  437. data/vendor/rb-sys-build/Cargo.toml.orig +32 -0
  438. data/vendor/rb-sys-build/LICENSE-APACHE +190 -0
  439. data/vendor/rb-sys-build/LICENSE-MIT +21 -0
  440. data/vendor/rb-sys-build/src/bindings/sanitizer.rs +185 -0
  441. data/vendor/rb-sys-build/src/bindings/stable_api.rs +247 -0
  442. data/vendor/rb-sys-build/src/bindings/wrapper.h +71 -0
  443. data/vendor/rb-sys-build/src/bindings.rs +280 -0
  444. data/vendor/rb-sys-build/src/cc.rs +421 -0
  445. data/vendor/rb-sys-build/src/lib.rs +12 -0
  446. data/vendor/rb-sys-build/src/rb_config/flags.rs +101 -0
  447. data/vendor/rb-sys-build/src/rb_config/library.rs +132 -0
  448. data/vendor/rb-sys-build/src/rb_config/search_path.rs +57 -0
  449. data/vendor/rb-sys-build/src/rb_config.rs +906 -0
  450. data/vendor/rb-sys-build/src/utils.rs +53 -0
  451. metadata +569 -0
data/Cargo.toml ADDED
@@ -0,0 +1,11 @@
1
+ # This Cargo.toml is here to let externals tools (IDEs, etc.) know that this is
2
+ # a Rust project. Your extensions dependencies should be added to the Cargo.toml
3
+ # in the ext/ directory.
4
+
5
+ [workspace]
6
+ members = ["./ext/itsi_server"]
7
+ resolver = "2"
8
+
9
+ [patch.crates-io]
10
+ magnus = { git = "https://github.com/matsadler/magnus.git", rev = "1ed232edb2b75a2eed9b1def34ad57e55c411a5c" }
11
+ rb-sys-build = { path = "vendor/rb-sys-build" }
data/Rakefile ADDED
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "minitest/test_task"
5
+
6
+ SMOKE_TEST_GLOBS = %w[
7
+ test/options/bind.rb
8
+ test/options/header_read_timeout.rb
9
+ test/options/test_request_timeout.rb
10
+ test/options/test_threads.rb
11
+ test/rack/test_rack_server.rb
12
+ test/middleware/allow_list.rb
13
+ test/middleware/auth_api_key.rb
14
+ test/middleware/auth_basic.rb
15
+ test/middleware/cache_control.rb
16
+ test/middleware/cidr_to_regex.rb
17
+ test/middleware/compression.rb
18
+ test/middleware/cors.rb
19
+ test/middleware/csp.rb
20
+ test/middleware/deny_list.rb
21
+ test/middleware/etag.rb
22
+ test/middleware/header_interpolation.rb
23
+ test/middleware/location.rb
24
+ test/middleware/max_body.rb
25
+ test/middleware/request_headers.rb
26
+ test/middleware/response_headers.rb
27
+ test/middleware/static_assets.rb
28
+ test/middleware/static_response.rb
29
+ test/middleware/string_rewrite.rb
30
+ ].freeze
31
+
32
+ def configure_test_task(task_name, test_globs)
33
+ Minitest::TestTask.create(task_name) do |t|
34
+ t.libs << "test"
35
+ t.libs << "lib"
36
+ t.warning = false
37
+ t.test_globs = test_globs
38
+ t.test_prelude = 'require "helpers/test_helper.rb"'
39
+ end
40
+ end
41
+
42
+ configure_test_task(:test, ["test/**/*.rb"])
43
+ configure_test_task("test:smoke", SMOKE_TEST_GLOBS)
44
+
45
+ task "test:full" => :test
46
+
47
+ require "rb_sys/extensiontask"
48
+
49
+ task build: :compile
50
+
51
+ GEMSPEC = Gem::Specification.load("itsi-server.gemspec")
52
+
53
+ RbSys::ExtensionTask.new("itsi-server", GEMSPEC) do |ext|
54
+ ext.lib_dir = "lib/itsi/server"
55
+ end
56
+
57
+ task default: %i[compile test rubocop]
data/exe/itsi ADDED
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "itsi/server"
5
+ require "optparse"
6
+
7
+ COMMANDS = {
8
+ "init" => "Initialize a new Itsi.rb server configuration file",
9
+ "status" => "Show the status of the server",
10
+ "start" => "Start the Itsi server",
11
+ "serve" => "Start the Itsi server",
12
+ "stop" => "Stop the server",
13
+ "reload" => "Reload the server",
14
+ "restart" => "Restart the server",
15
+ "test" => "Test config file validity",
16
+ "add_worker" => "Add a new worker to the server cluster",
17
+ "remove_worker" => "Remove a worker from the server cluster",
18
+ "routes" => "Print the routes of the server",
19
+ "passfile" => "Manage hashed users and passwords in a passfile (like .htpasswd). [add, echo, remove, list]",
20
+ "secret" => "Generate a new secret for use in a JWT verifier",
21
+ "test_route" => "Test which route a request will be routed to",
22
+ "static" => "Serve static assets in the given directory"
23
+ }
24
+
25
+ Itsi::Server::Config.prep_reexec!
26
+
27
+ options = {}
28
+
29
+ parser = OptionParser.new do |opts|
30
+ opts.banner = "Usage: itsi [COMMAND] [options]"
31
+
32
+ opts.on("-C", "--config CONFIG_FILE", String, "Itsi Configuration file to use (default: Itsi.rb)") do |config_file|
33
+ options[:config_file] = config_file
34
+ end
35
+
36
+ opts.on("-w", "--workers WORKERS", Integer, "Number of workers") do |w|
37
+ options[:workers] = w
38
+ end
39
+
40
+ opts.on("-d", "--daemonize", "Run the process as a daemon") do
41
+ options[:daemonize] = true
42
+ end
43
+
44
+ opts.on("-t", "--threads THREADS", Integer, "Number of threads (default: 1)") do |t|
45
+ options[:threads] = t
46
+ end
47
+
48
+ opts.on("--[no-]multithreaded-reactor", "Use a multithreaded reactor") do |mtr|
49
+ options[:multithreaded_reactor] = mtr
50
+ end
51
+
52
+ opts.on("-r", "--rackup_file FILE", String, "Rackup file to use (default: config.ru)") do |rf|
53
+ options[:rackup_file] = rf
54
+ end
55
+
56
+ opts.on("--worker-memory-limit MEMORY_LIMIT", Integer,
57
+ "Memory limit for each worker (default: None). If this limit is breached the worker is gracefully restarted") do |ml|
58
+ options[:worker_memory_limit] = ml
59
+ end
60
+
61
+ opts.on("-f", "--fiber_scheduler [CLASS_NAME]", String,
62
+ "Scheduler class to use (default: nil). Provide blank or true to use Itsi::Scheduler, or a classname to use an alternative scheduler") do |scheduler_class|
63
+ if scheduler_class.nil? || scheduler_class == "true"
64
+ options[:scheduler_class] = "Itsi::Scheduler"
65
+ elsif scheduler_class == "false"
66
+ options.delete(:scheduler_class)
67
+ else
68
+ options[:scheduler_class] = scheduler_class
69
+ end
70
+ end
71
+
72
+ opts.on("--preload [true, false, :bundle_group_name]", String, " Toggle preloading the application") do |preload|
73
+ if preload == "true"
74
+ options[:preload] = true
75
+ elsif preload == "false"
76
+ options[:preload] = false
77
+ else
78
+ # Not supported yet
79
+ end
80
+ end
81
+
82
+ opts.on("-b", "--bind BIND", String,
83
+ "Bind address (default: http://0.0.0.0:3000). You can specify this flag multiple times to bind to multiple addresses.") do |bind|
84
+ options[:binds] ||= []
85
+ options[:binds] << bind
86
+ end
87
+
88
+ opts.on("-c", "--cert_path CERT_PATH", String,
89
+ "Path to the SSL certificate file (must follow a --bind option). You can specify this flag multiple times.") do |cp|
90
+ raise OptionParser::InvalidOption, "--cert_path must follow a --bind" if options[:binds].empty?
91
+
92
+ require "uri"
93
+
94
+ # Modify the last bind entry to add/update the cert query parameter
95
+ uri = URI.parse("http://#{options[:binds].last}") # Ensure valid URI parsing
96
+ params = URI.decode_www_form(uri.query.to_s).to_h
97
+ params["cert"] = cp
98
+ query_string = params.map { |k, v| "#{k}=#{v}" }.join("&")
99
+ options[:binds][-1] = "#{uri.host}?#{query_string}"
100
+ end
101
+
102
+ opts.on("-k", "--key_path KEY_PATH", String,
103
+ "Path to the SSL key file (must follow a --bind option). You can specify this flag multiple times.") do |kp|
104
+ raise OptionParser::InvalidOption, "--key_path must follow a --bind" if options[:binds].empty?
105
+
106
+ require "uri"
107
+
108
+ # Modify the last bind entry to add/update the key query parameter
109
+ uri = URI.parse("http://#{options[:binds].last}") # Ensure valid URI parsing
110
+ params = URI.decode_www_form(uri.query.to_s).to_h
111
+ params["key"] = kp
112
+ query_string = params.map { |k, v| "#{k}=#{v}" }.join("&")
113
+ options[:binds][-1] = "#{uri.host}?#{query_string}"
114
+ end
115
+
116
+ opts.on("--shutdown_timeout SHUTDOWN_TIMEOUT", String,
117
+ "Graceful timeout period before forcing workers to shutdown") do |shutdown_timeout|
118
+ options[:shutdown_timeout] = shutdown_timeout
119
+ end
120
+
121
+ opts.on("--stream-body", TrueClass, "Stream body frames (default: false for best compatibility)") do |stream_body|
122
+ options[:stream_body] = stream_body
123
+ end
124
+
125
+ opts.on("-h", "--help", "Show this help message") do
126
+ puts opts
127
+ puts "COMMAND: "
128
+ COMMANDS.each do |command, description|
129
+ puts " #{command} - #{description}"
130
+ end
131
+ exit
132
+ end
133
+
134
+ opts.on("--reexec PARAMS", String, "Reexec the server with the given parameters") do |params|
135
+ options[:reexec] = params
136
+ end
137
+
138
+ opts.on("--listeners LISTENERS", String, "Listeners for reexec") do |listeners|
139
+ options[:listeners] = listeners
140
+ end
141
+
142
+ opts.on("--passfile PASSFILE", String, "Passfile") do |passfile|
143
+ options[:passfile] = passfile
144
+ end
145
+
146
+ opts.on("--algorithm ALGORITHM", String, "Algorithm for password hashing") do |algorithm|
147
+ options[:algorithm] = algorithm
148
+ end
149
+
150
+ opts.on("-dDIR", "--dir=DIR", "(For use with secret) Save keys/secret to DIR instead of printing") do |d|
151
+ options[:save_dir] = d
152
+ end
153
+
154
+ opts.on("-v", "--version", "Show version") do
155
+ puts "Itsi version #{Itsi::Server::VERSION}"
156
+ exit(0)
157
+ end
158
+ end
159
+
160
+ if ENV["COMP_LINE"] || ARGV.include?("--completion")
161
+ puts COMMANDS.keys
162
+ exit
163
+ end
164
+
165
+ begin
166
+ parser.parse!
167
+ rescue StandardError => e
168
+ puts e.message
169
+ exit
170
+ end
171
+
172
+ case (command = ARGV.shift)
173
+ when *COMMANDS.keys
174
+ required_arity = Itsi::Server.method(command).parameters&.select { |c| c.first == :req }&.length&.succ || 2
175
+ case required_arity
176
+ when 1 then Itsi::Server.send(command)
177
+ when 2 then Itsi::Server.send(command, options)
178
+ else
179
+ if ARGV.length != required_arity - 2
180
+ puts "Command #{command} requires #{required_arity - 2} subcommands. "
181
+ exit(0)
182
+ end
183
+ Itsi::Server.send(command, options, *ARGV)
184
+ end
185
+ when nil
186
+ Itsi::Server.start(options)
187
+ else
188
+ puts "Invalid command #{command}.\n"
189
+ puts "COMMAND: "
190
+ COMMANDS.each do |command, description|
191
+ puts " #{command} - #{description}"
192
+ end
193
+ end
@@ -0,0 +1,86 @@
1
+ [package]
2
+ name = "itsi_acme"
3
+ version = "0.1.0"
4
+ authors = [
5
+ "wouterken <wc@pico.net.nz>",
6
+ "dignifiedquire <me@dignifiedquire.com>",
7
+ "Florian Uekermann <florian@uekermann.me>",
8
+ ]
9
+ edition = "2018"
10
+ description = "Automatic TLS certificate management using rustls, specifically for itsi"
11
+ license = "Apache-2.0 OR MIT"
12
+ repository = "https://github.com/n0-computer/tokio-rustls-acme"
13
+ documentation = "https://docs.rs/tokio-rustls-acme"
14
+ keywords = ["acme", "rustls", "tls", "letsencrypt"]
15
+ categories = ["asynchronous", "cryptography", "network-programming"]
16
+
17
+ [dependencies]
18
+ futures = "0.3.21"
19
+ rcgen = "0.13"
20
+ serde_json = "1.0.81"
21
+ serde = { version = "1.0.137", features = ["derive"] }
22
+ ring = { version = "0.17.0", features = ["std"] }
23
+ base64 = "0.22"
24
+ log = "0.4.17"
25
+ webpki-roots = "0.26"
26
+ pem = "3.0"
27
+ thiserror = "2.0"
28
+ x509-parser = "0.16"
29
+ chrono = { version = "0.4.24", default-features = false, features = ["clock"] }
30
+ async-trait = "0.1.53"
31
+ rustls = { version = "0.23", default-features = false, features = ["ring"] }
32
+ time = "0.3.36" # force the transitive dependency to a more recent minimal version. The build fails with 0.3.20
33
+
34
+ tokio = { version = "1.20.1", default-features = false }
35
+ tokio-rustls = { version = "0.26", default-features = false, features = [
36
+ "tls12",
37
+ ] }
38
+ reqwest = { version = "0.12", default-features = false, features = [
39
+ "rustls-tls",
40
+ ] }
41
+
42
+ # Axum
43
+ axum-server = { version = "0.7", features = ["tokio-rustls"], optional = true }
44
+
45
+ [dependencies.proc-macro2]
46
+ # This is a transitive dependency, we specify it to make sure we have
47
+ # a recent-enough version so that -Z minimal-versions crate resolution
48
+ # works.
49
+ version = "1.0.78"
50
+
51
+ [dependencies.num-bigint]
52
+ # This is a transitive dependency, we specify it to make sure we have
53
+ # a recent-enough version so that -Z minimal-versions crate resolution
54
+ # works.
55
+ version = "0.4.4"
56
+
57
+ [dev-dependencies]
58
+ simple_logger = "5.0"
59
+ structopt = "0.3.26"
60
+ clap = { version = "4", features = ["derive"] }
61
+ axum = "0.7"
62
+ tokio = { version = "1.19.2", features = ["full"] }
63
+ tokio-stream = { version = "0.1.9", features = ["net"] }
64
+ tokio-util = { version = "0.7.3", features = ["compat"] }
65
+ warp = "0.3"
66
+
67
+ [package.metadata.docs.rs]
68
+ all-features = true
69
+ rustdoc-args = ["--cfg", "doc_auto_cfg"]
70
+
71
+ [features]
72
+ default = []
73
+ axum = ["dep:axum-server"]
74
+
75
+ [[example]]
76
+ name = "low_level_axum"
77
+ required-features = ["axum"]
78
+
79
+ [[example]]
80
+ name = "high_level_warp"
81
+
82
+ [[example]]
83
+ name = "high_level"
84
+
85
+ [[example]]
86
+ name = "low_level"
@@ -0,0 +1,63 @@
1
+ use clap::Parser;
2
+ use itsi_acme::caches::DirCache;
3
+ use itsi_acme::AcmeConfig;
4
+ use std::net::Ipv6Addr;
5
+ use std::path::PathBuf;
6
+ use tokio::io::AsyncWriteExt;
7
+ use tokio_stream::wrappers::TcpListenerStream;
8
+ use tokio_stream::StreamExt;
9
+
10
+ #[derive(Parser, Debug)]
11
+ struct Args {
12
+ /// Domains
13
+ #[clap(short, required = true)]
14
+ domains: Vec<String>,
15
+
16
+ /// Contact info
17
+ #[clap(short)]
18
+ email: Vec<String>,
19
+
20
+ /// Cache directory
21
+ #[clap(short)]
22
+ cache: Option<PathBuf>,
23
+
24
+ /// Use Let's Encrypt production environment
25
+ /// (see https://letsencrypt.org/docs/staging-environment/)
26
+ #[clap(long)]
27
+ prod: bool,
28
+
29
+ #[clap(short, long, default_value = "443")]
30
+ port: u16,
31
+ }
32
+
33
+ #[tokio::main]
34
+ async fn main() {
35
+ simple_logger::init_with_level(log::Level::Info).unwrap();
36
+ let args = Args::parse();
37
+
38
+ let tcp_listener = tokio::net::TcpListener::bind((Ipv6Addr::UNSPECIFIED, args.port))
39
+ .await
40
+ .unwrap();
41
+ let tcp_incoming = TcpListenerStream::new(tcp_listener);
42
+
43
+ let mut tls_incoming = AcmeConfig::new(args.domains)
44
+ .contact(args.email.iter().map(|e| format!("mailto:{}", e)))
45
+ .cache_option(args.cache.clone().map(DirCache::new))
46
+ .directory_lets_encrypt(args.prod)
47
+ .incoming(tcp_incoming, Vec::new());
48
+
49
+ while let Some(tls) = tls_incoming.next().await {
50
+ let mut tls = tls.unwrap();
51
+ tokio::spawn(async move {
52
+ tls.write_all(HELLO).await.unwrap();
53
+ tls.shutdown().await.unwrap();
54
+ });
55
+ }
56
+ unreachable!()
57
+ }
58
+
59
+ const HELLO: &[u8] = br#"HTTP/1.1 200 OK
60
+ Content-Length: 10
61
+ Content-Type: text/plain; charset=utf-8
62
+
63
+ Hello Tls!"#;
@@ -0,0 +1,52 @@
1
+ use clap::Parser;
2
+ use itsi_acme::caches::DirCache;
3
+ use itsi_acme::AcmeConfig;
4
+ use std::net::Ipv6Addr;
5
+ use std::path::PathBuf;
6
+ use tokio_stream::wrappers::TcpListenerStream;
7
+ use warp::Filter;
8
+
9
+ #[derive(Parser, Debug)]
10
+ struct Args {
11
+ /// Domains
12
+ #[clap(short, required = true)]
13
+ domains: Vec<String>,
14
+
15
+ /// Contact info
16
+ #[clap(short)]
17
+ email: Vec<String>,
18
+
19
+ /// Cache directory
20
+ #[clap(short)]
21
+ cache: Option<PathBuf>,
22
+
23
+ /// Use Let's Encrypt production environment
24
+ /// (see https://letsencrypt.org/docs/staging-environment/)
25
+ #[clap(long)]
26
+ prod: bool,
27
+
28
+ #[clap(short, long, default_value = "443")]
29
+ port: u16,
30
+ }
31
+
32
+ #[tokio::main]
33
+ async fn main() {
34
+ simple_logger::init_with_level(log::Level::Info).unwrap();
35
+ let args = Args::parse();
36
+
37
+ let tcp_listener = tokio::net::TcpListener::bind((Ipv6Addr::UNSPECIFIED, args.port))
38
+ .await
39
+ .unwrap();
40
+ let tcp_incoming = TcpListenerStream::new(tcp_listener);
41
+
42
+ let tls_incoming = AcmeConfig::new(args.domains)
43
+ .contact(args.email.iter().map(|e| format!("mailto:{}", e)))
44
+ .cache_option(args.cache.clone().map(DirCache::new))
45
+ .directory_lets_encrypt(args.prod)
46
+ .incoming(tcp_incoming, Vec::new());
47
+
48
+ let route = warp::any().map(|| "Hello Tls!");
49
+ warp::serve(route).run_incoming(tls_incoming).await;
50
+
51
+ unreachable!()
52
+ }
@@ -0,0 +1,87 @@
1
+ use clap::Parser;
2
+ use itsi_acme::caches::DirCache;
3
+ use itsi_acme::{AcmeAcceptor, AcmeConfig};
4
+ use rustls::ServerConfig;
5
+ use std::net::Ipv6Addr;
6
+ use std::path::PathBuf;
7
+ use std::sync::Arc;
8
+ use tokio::io::AsyncWriteExt;
9
+ use tokio_stream::StreamExt;
10
+
11
+ #[derive(Parser, Debug)]
12
+ struct Args {
13
+ /// Domains
14
+ #[clap(short, required = true)]
15
+ domains: Vec<String>,
16
+
17
+ /// Contact info
18
+ #[clap(short)]
19
+ email: Vec<String>,
20
+
21
+ /// Cache directory
22
+ #[clap(short)]
23
+ cache: Option<PathBuf>,
24
+
25
+ /// Use Let's Encrypt production environment
26
+ /// (see https://letsencrypt.org/docs/staging-environment/)
27
+ #[clap(long)]
28
+ prod: bool,
29
+
30
+ #[clap(short, long, default_value = "443")]
31
+ port: u16,
32
+ }
33
+
34
+ #[tokio::main]
35
+ async fn main() {
36
+ simple_logger::init_with_level(log::Level::Info).unwrap();
37
+ let args = Args::parse();
38
+
39
+ let mut state = AcmeConfig::new(args.domains)
40
+ .contact(args.email.iter().map(|e| format!("mailto:{}", e)))
41
+ .cache_option(args.cache.clone().map(DirCache::new))
42
+ .directory_lets_encrypt(args.prod)
43
+ .state();
44
+ let rustls_config = ServerConfig::builder()
45
+ .with_no_client_auth()
46
+ .with_cert_resolver(state.resolver());
47
+ let acceptor = state.acceptor();
48
+
49
+ tokio::spawn(async move {
50
+ loop {
51
+ match state.next().await.unwrap() {
52
+ Ok(ok) => log::info!("event: {:?}", ok),
53
+ Err(err) => log::error!("error: {:?}", err),
54
+ }
55
+ }
56
+ });
57
+
58
+ serve(acceptor, Arc::new(rustls_config), args.port).await;
59
+ }
60
+
61
+ async fn serve(acceptor: AcmeAcceptor, rustls_config: Arc<ServerConfig>, port: u16) {
62
+ let listener = tokio::net::TcpListener::bind((Ipv6Addr::UNSPECIFIED, port))
63
+ .await
64
+ .unwrap();
65
+ loop {
66
+ let tcp = listener.accept().await.unwrap().0;
67
+ let rustls_config = rustls_config.clone();
68
+ let accept_future = acceptor.accept(tcp);
69
+
70
+ tokio::spawn(async move {
71
+ match accept_future.await.unwrap() {
72
+ None => log::info!("received TLS-ALPN-01 validation request"),
73
+ Some(start_handshake) => {
74
+ let mut tls = start_handshake.into_stream(rustls_config).await.unwrap();
75
+ tls.write_all(HELLO).await.unwrap();
76
+ tls.shutdown().await.unwrap();
77
+ }
78
+ }
79
+ });
80
+ }
81
+ }
82
+
83
+ const HELLO: &[u8] = br#"HTTP/1.1 200 OK
84
+ Content-Length: 10
85
+ Content-Type: text/plain; charset=utf-8
86
+
87
+ Hello Tls!"#;
@@ -0,0 +1,66 @@
1
+ use axum::{routing::get, Router};
2
+ use clap::Parser;
3
+ use itsi_acme::caches::DirCache;
4
+ use itsi_acme::AcmeConfig;
5
+ use rustls::ServerConfig;
6
+ use std::net::{Ipv6Addr, SocketAddr};
7
+ use std::path::PathBuf;
8
+ use std::sync::Arc;
9
+ use tokio_stream::StreamExt;
10
+
11
+ #[derive(Parser, Debug)]
12
+ struct Args {
13
+ /// Domains
14
+ #[clap(short, required = true)]
15
+ domains: Vec<String>,
16
+
17
+ /// Contact info
18
+ #[clap(short)]
19
+ email: Vec<String>,
20
+
21
+ /// Cache directory
22
+ #[clap(short)]
23
+ cache: Option<PathBuf>,
24
+
25
+ /// Use Let's Encrypt production environment
26
+ /// (see https://letsencrypt.org/docs/staging-environment/)
27
+ #[clap(long)]
28
+ prod: bool,
29
+
30
+ #[clap(short, long, default_value = "443")]
31
+ port: u16,
32
+ }
33
+
34
+ #[tokio::main]
35
+ async fn main() {
36
+ simple_logger::init_with_level(log::Level::Info).unwrap();
37
+ let args = Args::parse();
38
+
39
+ let mut state = AcmeConfig::new(args.domains)
40
+ .contact(args.email.iter().map(|e| format!("mailto:{}", e)))
41
+ .cache_option(args.cache.clone().map(DirCache::new))
42
+ .directory_lets_encrypt(args.prod)
43
+ .state();
44
+ let rustls_config = ServerConfig::builder()
45
+ .with_no_client_auth()
46
+ .with_cert_resolver(state.resolver());
47
+ let acceptor = state.axum_acceptor(Arc::new(rustls_config));
48
+
49
+ tokio::spawn(async move {
50
+ loop {
51
+ match state.next().await.unwrap() {
52
+ Ok(ok) => log::info!("event: {:?}", ok),
53
+ Err(err) => log::error!("error: {:?}", err),
54
+ }
55
+ }
56
+ });
57
+
58
+ let app = Router::new().route("/", get(|| async { "Hello Tls!" }));
59
+
60
+ let addr = SocketAddr::from((Ipv6Addr::UNSPECIFIED, args.port));
61
+ axum_server::bind(addr)
62
+ .acceptor(acceptor)
63
+ .serve(app.into_make_service())
64
+ .await
65
+ .unwrap();
66
+ }
@@ -0,0 +1,81 @@
1
+ use crate::acme::ACME_TLS_ALPN_NAME;
2
+ use crate::ResolvesServerCertAcme;
3
+ use rustls::server::Acceptor;
4
+ use rustls::ServerConfig;
5
+ use std::future::Future;
6
+ use std::io;
7
+ use std::pin::Pin;
8
+ use std::sync::Arc;
9
+ use std::task::{Context, Poll};
10
+ use tokio::io::{AsyncRead, AsyncWrite};
11
+ use tokio_rustls::{Accept, LazyConfigAcceptor, StartHandshake};
12
+
13
+ #[derive(Clone)]
14
+ pub struct AcmeAcceptor {
15
+ config: Arc<ServerConfig>,
16
+ }
17
+
18
+ impl AcmeAcceptor {
19
+ pub(crate) fn new(resolver: Arc<ResolvesServerCertAcme>) -> Self {
20
+ let mut config = ServerConfig::builder()
21
+ .with_no_client_auth()
22
+ .with_cert_resolver(resolver);
23
+ config.alpn_protocols.push(ACME_TLS_ALPN_NAME.to_vec());
24
+ Self {
25
+ config: Arc::new(config),
26
+ }
27
+ }
28
+ pub fn accept<IO: AsyncRead + AsyncWrite + Unpin>(&self, io: IO) -> AcmeAccept<IO> {
29
+ AcmeAccept::new(io, self.config.clone())
30
+ }
31
+ }
32
+
33
+ pub struct AcmeAccept<IO: AsyncRead + AsyncWrite + Unpin> {
34
+ acceptor: LazyConfigAcceptor<IO>,
35
+ config: Arc<ServerConfig>,
36
+ validation_accept: Option<Accept<IO>>,
37
+ }
38
+
39
+ impl<IO: AsyncRead + AsyncWrite + Unpin> AcmeAccept<IO> {
40
+ pub(crate) fn new(io: IO, config: Arc<ServerConfig>) -> Self {
41
+ Self {
42
+ acceptor: LazyConfigAcceptor::new(Acceptor::default(), io),
43
+ config,
44
+ validation_accept: None,
45
+ }
46
+ }
47
+ }
48
+
49
+ impl<IO: AsyncRead + AsyncWrite + Unpin> Future for AcmeAccept<IO> {
50
+ type Output = io::Result<Option<StartHandshake<IO>>>;
51
+
52
+ fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
53
+ loop {
54
+ if let Some(validation_accept) = &mut self.validation_accept {
55
+ return match Pin::new(validation_accept).poll(cx) {
56
+ Poll::Ready(Ok(_)) => Poll::Ready(Ok(None)),
57
+ Poll::Ready(Err(err)) => Poll::Ready(Err(err)),
58
+ Poll::Pending => Poll::Pending,
59
+ };
60
+ }
61
+
62
+ return match Pin::new(&mut self.acceptor).poll(cx) {
63
+ Poll::Ready(Ok(handshake)) => {
64
+ let is_validation = handshake
65
+ .client_hello()
66
+ .alpn()
67
+ .into_iter()
68
+ .flatten()
69
+ .eq([ACME_TLS_ALPN_NAME]);
70
+ if is_validation {
71
+ self.validation_accept = Some(handshake.into_stream(self.config.clone()));
72
+ continue;
73
+ }
74
+ Poll::Ready(Ok(Some(handshake)))
75
+ }
76
+ Poll::Ready(Err(err)) => Poll::Ready(Err(err)),
77
+ Poll::Pending => Poll::Pending,
78
+ };
79
+ }
80
+ }
81
+ }