itsi-server 0.1.1 → 0.2.2

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 (457) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +4487 -0
  3. data/Cargo.toml +7 -0
  4. data/README.md +6 -0
  5. data/Rakefile +7 -4
  6. data/exe/itsi +152 -46
  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.toml +3 -0
  30. data/ext/itsi_error/src/lib.rs +98 -24
  31. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
  32. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
  33. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
  34. data/ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
  35. data/ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock +0 -0
  36. data/ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock +0 -0
  37. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock +0 -0
  38. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock +0 -0
  39. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock +0 -0
  40. data/ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock +0 -0
  41. data/ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock +0 -0
  42. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock +0 -0
  43. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock +0 -0
  44. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock +0 -0
  45. data/ext/itsi_instrument_entry/Cargo.toml +15 -0
  46. data/ext/itsi_instrument_entry/src/lib.rs +31 -0
  47. data/ext/itsi_rb_helpers/Cargo.toml +3 -0
  48. data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
  49. data/ext/itsi_rb_helpers/src/lib.rs +141 -10
  50. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
  51. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
  52. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
  53. data/ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
  54. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock +0 -0
  55. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock +0 -0
  56. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock +0 -0
  57. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock +0 -0
  58. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock +0 -0
  59. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock +0 -0
  60. data/ext/itsi_scheduler/Cargo.toml +24 -0
  61. data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
  62. data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
  63. data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
  64. data/ext/itsi_scheduler/src/itsi_scheduler.rs +314 -0
  65. data/ext/itsi_scheduler/src/lib.rs +39 -0
  66. data/ext/itsi_server/Cargo.lock +2956 -0
  67. data/ext/itsi_server/Cargo.toml +75 -14
  68. data/ext/itsi_server/extconf.rb +1 -1
  69. data/ext/itsi_server/src/default_responses/html/401.html +68 -0
  70. data/ext/itsi_server/src/default_responses/html/403.html +68 -0
  71. data/ext/itsi_server/src/default_responses/html/404.html +68 -0
  72. data/ext/itsi_server/src/default_responses/html/413.html +71 -0
  73. data/ext/itsi_server/src/default_responses/html/429.html +68 -0
  74. data/ext/itsi_server/src/default_responses/html/500.html +71 -0
  75. data/ext/itsi_server/src/default_responses/html/502.html +71 -0
  76. data/ext/itsi_server/src/default_responses/html/503.html +68 -0
  77. data/ext/itsi_server/src/default_responses/html/504.html +69 -0
  78. data/ext/itsi_server/src/default_responses/html/index.html +238 -0
  79. data/ext/itsi_server/src/default_responses/json/401.json +6 -0
  80. data/ext/itsi_server/src/default_responses/json/403.json +6 -0
  81. data/ext/itsi_server/src/default_responses/json/404.json +6 -0
  82. data/ext/itsi_server/src/default_responses/json/413.json +6 -0
  83. data/ext/itsi_server/src/default_responses/json/429.json +6 -0
  84. data/ext/itsi_server/src/default_responses/json/500.json +6 -0
  85. data/ext/itsi_server/src/default_responses/json/502.json +6 -0
  86. data/ext/itsi_server/src/default_responses/json/503.json +6 -0
  87. data/ext/itsi_server/src/default_responses/json/504.json +6 -0
  88. data/ext/itsi_server/src/default_responses/mod.rs +11 -0
  89. data/ext/itsi_server/src/env.rs +43 -0
  90. data/ext/itsi_server/src/lib.rs +133 -40
  91. data/ext/itsi_server/src/prelude.rs +2 -0
  92. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +109 -0
  93. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +143 -0
  94. data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
  95. data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +264 -0
  96. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +362 -0
  97. data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +391 -0
  98. data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +233 -0
  99. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +565 -0
  100. data/ext/itsi_server/src/ruby_types/itsi_server.rs +86 -0
  101. data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
  102. data/ext/itsi_server/src/server/binds/bind.rs +204 -0
  103. data/ext/itsi_server/src/server/binds/bind_protocol.rs +37 -0
  104. data/ext/itsi_server/src/server/binds/listener.rs +444 -0
  105. data/ext/itsi_server/src/server/binds/mod.rs +4 -0
  106. data/ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs +132 -0
  107. data/ext/itsi_server/src/server/binds/tls.rs +278 -0
  108. data/ext/itsi_server/src/server/byte_frame.rs +32 -0
  109. data/ext/itsi_server/src/server/http_message_types.rs +97 -0
  110. data/ext/itsi_server/src/server/io_stream.rs +105 -0
  111. data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
  112. data/ext/itsi_server/src/server/middleware_stack/middleware.rs +170 -0
  113. data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +63 -0
  114. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +94 -0
  115. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +94 -0
  116. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +343 -0
  117. data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +151 -0
  118. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +316 -0
  119. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +301 -0
  120. data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +193 -0
  121. data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +64 -0
  122. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +192 -0
  123. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +171 -0
  124. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +198 -0
  125. data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +82 -0
  126. data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +209 -0
  127. data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +82 -0
  128. data/ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  129. data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +116 -0
  130. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +411 -0
  131. data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +142 -0
  132. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +55 -0
  133. data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +54 -0
  134. data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +51 -0
  135. data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +126 -0
  136. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +187 -0
  137. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
  138. data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +173 -0
  139. data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +31 -0
  140. data/ext/itsi_server/src/server/middleware_stack/mod.rs +381 -0
  141. data/ext/itsi_server/src/server/mod.rs +13 -5
  142. data/ext/itsi_server/src/server/process_worker.rs +247 -0
  143. data/ext/itsi_server/src/server/redirect_type.rs +26 -0
  144. data/ext/itsi_server/src/server/request_job.rs +11 -0
  145. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +354 -0
  146. data/ext/itsi_server/src/server/serve_strategy/mod.rs +30 -0
  147. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +481 -0
  148. data/ext/itsi_server/src/server/signal.rs +77 -0
  149. data/ext/itsi_server/src/server/size_limited_incoming.rs +107 -0
  150. data/ext/itsi_server/src/server/thread_worker.rs +479 -0
  151. data/ext/itsi_server/src/services/cache_store.rs +74 -0
  152. data/ext/itsi_server/src/services/itsi_http_service.rs +257 -0
  153. data/ext/itsi_server/src/services/mime_types.rs +1416 -0
  154. data/ext/itsi_server/src/services/mod.rs +6 -0
  155. data/ext/itsi_server/src/services/password_hasher.rs +83 -0
  156. data/ext/itsi_server/src/services/rate_limiter.rs +580 -0
  157. data/ext/itsi_server/src/services/static_file_server.rs +1340 -0
  158. data/ext/itsi_tracing/Cargo.toml +5 -0
  159. data/ext/itsi_tracing/src/lib.rs +366 -7
  160. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock +0 -0
  161. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock +0 -0
  162. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock +0 -0
  163. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock +0 -0
  164. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock +0 -0
  165. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock +0 -0
  166. data/lib/itsi/http_request/response_status_shortcodes.rb +76 -0
  167. data/lib/itsi/http_request.rb +218 -0
  168. data/lib/itsi/http_response.rb +42 -0
  169. data/lib/itsi/passfile.rb +108 -0
  170. data/lib/itsi/server/config/config_helpers.rb +105 -0
  171. data/lib/itsi/server/config/dsl.rb +211 -0
  172. data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
  173. data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
  174. data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
  175. data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
  176. data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
  177. data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
  178. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
  179. data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
  180. data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
  181. data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
  182. data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
  183. data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
  184. data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
  185. data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
  186. data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
  187. data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
  188. data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
  189. data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
  190. data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
  191. data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
  192. data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
  193. data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
  194. data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
  195. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
  196. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
  197. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
  198. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
  199. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
  200. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
  201. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
  202. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
  203. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
  204. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
  205. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
  206. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
  207. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
  208. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
  209. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
  210. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
  211. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
  212. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
  213. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
  214. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
  215. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
  216. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
  217. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
  218. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
  219. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
  220. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
  221. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
  222. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
  223. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
  224. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
  225. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
  226. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
  227. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
  228. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
  229. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
  230. data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
  231. data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
  232. data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
  233. data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
  234. data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
  235. data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
  236. data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
  237. data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
  238. data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
  239. data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
  240. data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
  241. data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
  242. data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
  243. data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
  244. data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
  245. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
  246. data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
  247. data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
  248. data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
  249. data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
  250. data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
  251. data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
  252. data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
  253. data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
  254. data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
  255. data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
  256. data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
  257. data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
  258. data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
  259. data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
  260. data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
  261. data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
  262. data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
  263. data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
  264. data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
  265. data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
  266. data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
  267. data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
  268. data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
  269. data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
  270. data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
  271. data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
  272. data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
  273. data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
  274. data/lib/itsi/server/config/known_paths.rb +20 -0
  275. data/lib/itsi/server/config/middleware/_index.md +56 -0
  276. data/lib/itsi/server/config/middleware/allow_list.md +46 -0
  277. data/lib/itsi/server/config/middleware/allow_list.rb +42 -0
  278. data/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
  279. data/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
  280. data/lib/itsi/server/config/middleware/auth_basic.md +45 -0
  281. data/lib/itsi/server/config/middleware/auth_basic.rb +44 -0
  282. data/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
  283. data/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
  284. data/lib/itsi/server/config/middleware/cache_control.md +78 -0
  285. data/lib/itsi/server/config/middleware/cache_control.rb +45 -0
  286. data/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
  287. data/lib/itsi/server/config/middleware/compression.md +50 -0
  288. data/lib/itsi/server/config/middleware/compression.rb +37 -0
  289. data/lib/itsi/server/config/middleware/cors.md +93 -0
  290. data/lib/itsi/server/config/middleware/cors.rb +32 -0
  291. data/lib/itsi/server/config/middleware/csp.md +37 -0
  292. data/lib/itsi/server/config/middleware/csp.rb +44 -0
  293. data/lib/itsi/server/config/middleware/deny_list.md +45 -0
  294. data/lib/itsi/server/config/middleware/deny_list.rb +42 -0
  295. data/lib/itsi/server/config/middleware/endpoint/_index.md +159 -0
  296. data/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
  297. data/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
  298. data/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
  299. data/lib/itsi/server/config/middleware/endpoint/delete.rb +42 -0
  300. data/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
  301. data/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
  302. data/lib/itsi/server/config/middleware/endpoint/get.rb +42 -0
  303. data/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
  304. data/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
  305. data/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
  306. data/lib/itsi/server/config/middleware/endpoint/patch.rb +42 -0
  307. data/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
  308. data/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
  309. data/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
  310. data/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
  311. data/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
  312. data/lib/itsi/server/config/middleware/error_response.md +61 -0
  313. data/lib/itsi/server/config/middleware/error_response.rb +36 -0
  314. data/lib/itsi/server/config/middleware/etag.md +59 -0
  315. data/lib/itsi/server/config/middleware/etag.rb +27 -0
  316. data/lib/itsi/server/config/middleware/grpc.md +172 -0
  317. data/lib/itsi/server/config/middleware/grpc.rb +54 -0
  318. data/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
  319. data/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
  320. data/lib/itsi/server/config/middleware/location.md +107 -0
  321. data/lib/itsi/server/config/middleware/location.rb +99 -0
  322. data/lib/itsi/server/config/middleware/log_requests.md +65 -0
  323. data/lib/itsi/server/config/middleware/log_requests.rb +31 -0
  324. data/lib/itsi/server/config/middleware/max_body.md +18 -0
  325. data/lib/itsi/server/config/middleware/max_body.rb +21 -0
  326. data/lib/itsi/server/config/middleware/proxy.md +62 -0
  327. data/lib/itsi/server/config/middleware/proxy.rb +41 -0
  328. data/lib/itsi/server/config/middleware/rackup_file.md +54 -0
  329. data/lib/itsi/server/config/middleware/rackup_file.rb +44 -0
  330. data/lib/itsi/server/config/middleware/rate_limit.md +126 -0
  331. data/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
  332. data/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
  333. data/lib/itsi/server/config/middleware/redirect.md +55 -0
  334. data/lib/itsi/server/config/middleware/redirect.rb +25 -0
  335. data/lib/itsi/server/config/middleware/request_headers.md +34 -0
  336. data/lib/itsi/server/config/middleware/request_headers.rb +24 -0
  337. data/lib/itsi/server/config/middleware/response_headers.md +33 -0
  338. data/lib/itsi/server/config/middleware/response_headers.rb +25 -0
  339. data/lib/itsi/server/config/middleware/run.md +60 -0
  340. data/lib/itsi/server/config/middleware/run.rb +43 -0
  341. data/lib/itsi/server/config/middleware/static_assets.md +73 -0
  342. data/lib/itsi/server/config/middleware/static_assets.rb +87 -0
  343. data/lib/itsi/server/config/middleware/static_response.md +44 -0
  344. data/lib/itsi/server/config/middleware/static_response.rb +29 -0
  345. data/lib/itsi/server/config/middleware/string_rewrite.md +67 -0
  346. data/lib/itsi/server/config/middleware/token_source.rb +32 -0
  347. data/lib/itsi/server/config/middleware.rb +13 -0
  348. data/lib/itsi/server/config/option.rb +14 -0
  349. data/lib/itsi/server/config/options/_index.md +37 -0
  350. data/lib/itsi/server/config/options/auto_reload_config.md +13 -0
  351. data/lib/itsi/server/config/options/auto_reload_config.rb +41 -0
  352. data/lib/itsi/server/config/options/bind.md +71 -0
  353. data/lib/itsi/server/config/options/bind.rb +26 -0
  354. data/lib/itsi/server/config/options/certificates.md +65 -0
  355. data/lib/itsi/server/config/options/daemonize.md +14 -0
  356. data/lib/itsi/server/config/options/daemonize.rb +19 -0
  357. data/lib/itsi/server/config/options/fiber_scheduler.md +34 -0
  358. data/lib/itsi/server/config/options/fiber_scheduler.rb +21 -0
  359. data/lib/itsi/server/config/options/header_read_timeout.md +17 -0
  360. data/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
  361. data/lib/itsi/server/config/options/hooks/_index.md +11 -0
  362. data/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
  363. data/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
  364. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
  365. data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
  366. data/lib/itsi/server/config/options/hooks/after_start.md +12 -0
  367. data/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
  368. data/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
  369. data/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
  370. data/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
  371. data/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
  372. data/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
  373. data/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
  374. data/lib/itsi/server/config/options/include.md +20 -0
  375. data/lib/itsi/server/config/options/include.rb +36 -0
  376. data/lib/itsi/server/config/options/listen_backlog.md +11 -0
  377. data/lib/itsi/server/config/options/listen_backlog.rb +19 -0
  378. data/lib/itsi/server/config/options/log_format.md +18 -0
  379. data/lib/itsi/server/config/options/log_format.rb +19 -0
  380. data/lib/itsi/server/config/options/log_level.md +34 -0
  381. data/lib/itsi/server/config/options/log_level.rb +20 -0
  382. data/lib/itsi/server/config/options/log_target.md +38 -0
  383. data/lib/itsi/server/config/options/log_target.rb +19 -0
  384. data/lib/itsi/server/config/options/log_target_filters.md +17 -0
  385. data/lib/itsi/server/config/options/log_target_filters.rb +19 -0
  386. data/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
  387. data/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
  388. data/lib/itsi/server/config/options/nodelay.md +16 -0
  389. data/lib/itsi/server/config/options/nodelay.rb +19 -0
  390. data/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
  391. data/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
  392. data/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
  393. data/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
  394. data/lib/itsi/server/config/options/preload.md +21 -0
  395. data/lib/itsi/server/config/options/preload.rb +18 -0
  396. data/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
  397. data/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
  398. data/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
  399. data/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
  400. data/lib/itsi/server/config/options/request_timeout.md +23 -0
  401. data/lib/itsi/server/config/options/request_timeout.rb +19 -0
  402. data/lib/itsi/server/config/options/reuse_address.md +16 -0
  403. data/lib/itsi/server/config/options/reuse_address.rb +19 -0
  404. data/lib/itsi/server/config/options/reuse_port.md +16 -0
  405. data/lib/itsi/server/config/options/reuse_port.rb +19 -0
  406. data/lib/itsi/server/config/options/scheduler_threads.md +34 -0
  407. data/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
  408. data/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
  409. data/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
  410. data/lib/itsi/server/config/options/stream_body.md +32 -0
  411. data/lib/itsi/server/config/options/stream_body.rb +18 -0
  412. data/lib/itsi/server/config/options/threads.md +44 -0
  413. data/lib/itsi/server/config/options/threads.rb +17 -0
  414. data/lib/itsi/server/config/options/watch.md +16 -0
  415. data/lib/itsi/server/config/options/watch.rb +28 -0
  416. data/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
  417. data/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
  418. data/lib/itsi/server/config/options/workers.md +42 -0
  419. data/lib/itsi/server/config/options/workers.rb +17 -0
  420. data/lib/itsi/server/config/typed_struct.rb +242 -0
  421. data/lib/itsi/server/config.rb +289 -0
  422. data/lib/itsi/server/default_app/default_app.rb +34 -0
  423. data/lib/itsi/server/default_app/index.html +115 -0
  424. data/lib/itsi/server/default_config/Itsi.rb +107 -0
  425. data/lib/itsi/server/grpc/grpc_call.rb +246 -0
  426. data/lib/itsi/server/grpc/grpc_interface.rb +107 -0
  427. data/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  428. data/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  429. data/lib/itsi/server/rack/handler/itsi.rb +27 -0
  430. data/lib/itsi/server/rack_interface.rb +94 -0
  431. data/lib/itsi/server/route_tester.rb +157 -0
  432. data/lib/itsi/server/scheduler_interface.rb +21 -0
  433. data/lib/itsi/server/scheduler_mode.rb +10 -0
  434. data/lib/itsi/server/signal_trap.rb +33 -0
  435. data/lib/itsi/server/typed_handlers/param_parser.rb +196 -0
  436. data/lib/itsi/server/typed_handlers/source_parser.rb +56 -0
  437. data/lib/itsi/server/typed_handlers.rb +25 -0
  438. data/lib/itsi/server/version.rb +1 -1
  439. data/lib/itsi/server.rb +265 -9
  440. data/lib/itsi/standard_headers.rb +86 -0
  441. data/lib/ruby_lsp/itsi/addon.rb +129 -0
  442. data/lib/shell_completions/completions.rb +26 -0
  443. metadata +454 -28
  444. data/CHANGELOG.md +0 -5
  445. data/CODE_OF_CONDUCT.md +0 -132
  446. data/LICENSE.txt +0 -21
  447. data/ext/itsi_server/src/request/itsi_request.rs +0 -143
  448. data/ext/itsi_server/src/request/mod.rs +0 -1
  449. data/ext/itsi_server/src/server/bind.rs +0 -138
  450. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.crt +0 -32
  451. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.key +0 -52
  452. data/ext/itsi_server/src/server/itsi_server.rs +0 -182
  453. data/ext/itsi_server/src/server/listener.rs +0 -218
  454. data/ext/itsi_server/src/server/tls.rs +0 -138
  455. data/ext/itsi_server/src/server/transfer_protocol.rs +0 -23
  456. data/ext/itsi_server/src/stream_writer/mod.rs +0 -21
  457. data/lib/itsi/request.rb +0 -39
@@ -0,0 +1,30 @@
1
+ .well-known/
2
+ .well-known/acme-challenge
3
+ .well-known/apple-app-site-association
4
+ .well-known/apple-developer-merchant-domain-association
5
+ .well-known/ashrae
6
+ .well-known/assetlinks.json
7
+ .well-known/browserid
8
+ .well-known/caldav
9
+ .well-known/carddav
10
+ .well-known/core
11
+ .well-known/csvm
12
+ .well-known/dnt
13
+ .well-known/dnt-policy.txt
14
+ .well-known/est
15
+ .well-known/genid
16
+ .well-known/hoba
17
+ .well-known/host-meta
18
+ .well-known/host-meta.json
19
+ .well-known/keybase.txt
20
+ .well-known/ni
21
+ .well-known/openid-configuration
22
+ .well-known/openorg
23
+ .well-known/posh
24
+ .well-known/reload-config
25
+ .well-known/repute-template
26
+ .well-known/stun-key
27
+ .well-known/time
28
+ .well-known/timezone
29
+ .well-known/void
30
+ .well-known/webfinger
@@ -0,0 +1,20 @@
1
+ module Itsi
2
+ class Server
3
+ module KnownPaths
4
+ ALL = []
5
+ Dir.glob(File.join(__dir__, 'known_paths', '**', '*.txt')).each do |file|
6
+ method_name = file[/known_paths\/(.*?)\.txt/,1].gsub(/([a-z])([A-Z])/, "\\1_\\2")
7
+ .gsub(/-|\.|\//, "_")
8
+ .gsub(/(^|\/)[0-9]/){|match| "FO"}.downcase.to_sym
9
+
10
+ ALL << method_name
11
+ self.define_singleton_method(method_name) do
12
+ File.readlines(file).map do |s|
13
+ s.force_encoding('UTF-8')
14
+ s.valid_encoding? ? s.strip : s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '').strip
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,56 @@
1
+ ---
2
+ title: Middleware
3
+ type: docs
4
+ next: allow_list/
5
+ url: /middleware
6
+ prev: options/
7
+ cascade:
8
+ type: docs
9
+ weight: 2
10
+ ---
11
+
12
+ Itsi Middleware stacks are modular in nature.
13
+ You can pick and choose **just** the features that make sense for you,
14
+ and apply these on a *location-by-location* basis.
15
+
16
+ {{% details title="What's a location?" closed="false" %}}
17
+
18
+ > A location in Itsi is similar to a Location in NGINX. It's a logical container for all requests matching some combination of:
19
+ * Routes/Route expressions
20
+ * Request Methods
21
+ * Content Types
22
+ * Accept Headers
23
+ * File types
24
+ * Host/port/scheme.
25
+
26
+ For example:
27
+
28
+ ```ruby
29
+ location "/admin/*" do
30
+
31
+ etag \
32
+ type: 'strong',
33
+ algorithm: 'md5',
34
+ min_body_size: 1024 * 1024
35
+ # ...
36
+
37
+ location "/public/images", extensions: %w[jpg png] do
38
+ compress \
39
+ min_size: 1024 * 1024,
40
+ level: 'fastest',
41
+ algorithms: %w[zstd gzip br deflate],
42
+ mime_types: %w[all],
43
+ compress_streams: true
44
+ # ...
45
+ end
46
+ end
47
+ ```
48
+
49
+
50
+
51
+ When a route matches a location block, it recursively inherits *all* middleware that is defined within outer ancestor blocks.
52
+ Where a child and an ancestor define the same middleware, the child's middleware takes precedence.
53
+
54
+ {{% /details %}}
55
+
56
+ See [location](/middleware/location) for a detailed description of the `location` function.
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: Allow List
3
+ url: /middleware/allow_list
4
+ ---
5
+ The **allow_list** middleware restricts access to only those clients whose IP address matches one of a set of approved patterns. All other requests receive a configurable forbidden response.
6
+
7
+ ## Configuration
8
+
9
+ ```ruby
10
+ allow_list \
11
+ allowed_patterns: [
12
+ /127\.0\.0\.1/, # only localhost
13
+ /10\.0\.\d+\.\d+/, # any 10.0.x.x
14
+ "192.168.1.0/24" # CIDR range for 192.168.1.x
15
+ ],
16
+ error_response: "forbidden"
17
+ ```
18
+
19
+ * `allowed_patterns` (required):
20
+ An array of Ruby‑style regexp strings. Each incoming client IP (from req.addr) is tested against this set; if none match, the request is blocked.
21
+ * `error_response` (optional):
22
+ A built‑in or custom error response (default is forbidden / HTTP 403).
23
+
24
+
25
+ ## Trusted Proxies
26
+
27
+ By default, an allow-list uses the IP address from the underlying socket (remote_addr). However, if your server is behind a reverse proxy, all requests will appear to come from the proxy’s IP address. This can break IP-based rules or cause rate-limiting to group all users together.
28
+
29
+ To address this, you can declare trusted proxies and instruct the server to extract the original client IP from forwarded headers only if the request came from one of these proxies.
30
+
31
+
32
+ ### Configuring trusted_proxies
33
+
34
+ To trust one or more upstream proxies, provide a trusted_proxies map in the middleware configuration.
35
+ E.g.
36
+ ```ruby {filename=Itsi.rb}
37
+ allow_list \
38
+ allowed_patterns: [
39
+ /127\.0\.0\.1/, # only localhost
40
+ /10\.0\.\d+\.\d+/, # any 10.0.x.x
41
+ "192.168.1.0/24" # CIDR range for 192.168.1.x
42
+ ],
43
+ trusted_proxies: {
44
+ "192.168.1.1" => { header: { name: "X-Forwarded-For" } }
45
+ }
46
+ ```
@@ -0,0 +1,42 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class AllowList < Middleware
5
+ require_relative "error_response"
6
+ require_relative "cidr_to_regex"
7
+ require_relative "token_source"
8
+
9
+ include CidrToRegex
10
+
11
+ insert_text <<~SNIPPET
12
+ allow_list \\
13
+ allowed_patterns: [${1|"127.0.0.1","127.*", /127\.0\.*/|}],
14
+ error_response: ${2|"forbidden",{ code: 403\\, plaintext: { inline: "<h1>Forbidden</h1>" } }|}
15
+ SNIPPET
16
+
17
+ detail "Allow only clients whose IP matches one of the given regex patterns."
18
+
19
+ schema do
20
+ {
21
+ allowed_patterns: Array(Type(String)) & Required(),
22
+ error_response: Type(ErrorResponseDef).default("forbidden"),
23
+ trusted_proxies: (Hash(Type(String), Type(TokenSource)) & Required()).default({}),
24
+ }
25
+ end
26
+
27
+ def initialize(location, params={})
28
+ params[:allowed_patterns] = Array(params[:allowed_patterns]).map do |pattern|
29
+ if pattern.is_a?(Regexp)
30
+ pattern.source
31
+ elsif pattern =~ /\A\d{1,3}(?:\.\d{1,3}){3}\/\d{1,2}\z/
32
+ cidr_to_regex(pattern).source
33
+ else
34
+ pattern
35
+ end
36
+ end
37
+ super
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,90 @@
1
+ ---
2
+ title: API Key
3
+ url: /middleware/auth_api_key
4
+ ---
5
+ The API key middleware allows you to protect any set of endpoints with an API Key requirement.
6
+
7
+ Valid API keys can be loaded from a credentials file (using Itsi’s built‑in [passfile generator](/utilities/passfile_generator)), or defined inline (for example via environment variables).
8
+
9
+ Keys are required to be hashed using one of the supported [hashing algorithms](/utilities/passfile_generator/#supported-hashing-algorithms).
10
+
11
+ {{< callout type="info" >}}
12
+ API keys may be **anonymous** (no ID; any valid secret will do), or **identified** (each secret is paired with a Key ID, and both must be supplied on each request).
13
+ {{< /callout >}}
14
+
15
+ ## Configuration
16
+
17
+ ### 1. Load from credentials file
18
+
19
+ ```ruby {filename=Itsi.rb}
20
+ # Look for .itsi-credentials in the project root (format: key_id:secret per line)
21
+ auth_api_key credentials_file: ".itsi-credentials"
22
+
23
+ # Default behavior. Looks for credentials file at .itsi-credentials
24
+ auth_api_key
25
+
26
+ ```
27
+
28
+ ### 2. Inline anonymous keys
29
+
30
+ ```ruby {filename=Itsi.rb}
31
+ # Only the secret values matter (no IDs)
32
+ auth_api_key valid_keys: [
33
+ ENV["API_KEY_1"],
34
+ ENV["API_KEY_2"]
35
+ ]
36
+ ```
37
+
38
+ ### 3. Inline identified keys
39
+
40
+ ```ruby {filename=Itsi.rb}
41
+ # Each key pair is identified by an ID
42
+ auth_api_key valid_keys: {
43
+ "consumer_1" => ENV["API_KEY_1"],
44
+ "consumer_2" => ENV["API_KEY_2"]
45
+ }
46
+ ```
47
+
48
+ ### 4. Apply API Key Auth to specific endpoints
49
+
50
+ > See [location](/middleware/location)
51
+
52
+ ```ruby {filename=Itsi.rb}
53
+ # Apply Basic Authentication to specific endpoints
54
+ location "/admin/*" do
55
+ auth_api_key valid_keys: {
56
+ "consumer_1" => ENV["API_KEY_1"],
57
+ "consumer_2" => ENV["API_KEY_2"]
58
+ }
59
+ end
60
+ ```
61
+
62
+
63
+ ## Customized Key-ID and Secret sources
64
+ * By default, the secret is expected inside an `Authorization` header, as a Bearer token.
65
+ * By default, the Key-ID (*if not using anonymous auth*) is expected inside an `X-Api-Key-Id` header.
66
+ Both of these sources can be configured using the `key_id_source` and `token_source` options.
67
+ The source can be either a named `header` (with optional prefix) or `query` parameter,
68
+ {{< callout >}}
69
+ Note: Using a query source for the *Secret* is not recommended, as full URLs are readily leaked and recorded via logs and browser history. You should reserve use of a query token-source for non-sensitive information or test cases.
70
+ {{< /callout >}}
71
+
72
+ ```ruby {filename=Itsi.rb}
73
+ auth_api_key \
74
+ valid_keys: {.. },
75
+ key_id_source: { query: 'api_key_id' },
76
+ token_source: { header: 'Authorization', prefix: 'Bearer ' }
77
+ ```
78
+
79
+ ## Customized Error Responses
80
+ This middleware will return a default `unauthorized` response if the API key is missing or invalid.
81
+ However you can override this behaviour, by providing a custom [error response](/middleware/error_response).
82
+ E.g.
83
+ ```ruby {filename=Itsi.rb}
84
+ auth_api_key valid_keys: {.. }, error_response: "unauthenticated"
85
+ ```
86
+
87
+ ```ruby {filename=Itsi.rb}
88
+ auth_api_key valid_keys: {.. }, error_response: {code: 403, plaintext: {inline: "unauthenticated"} , default: 'plaintext'}
89
+
90
+ ```
@@ -0,0 +1,51 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class AuthApiKey < Middleware
5
+ require_relative "token_source"
6
+ require_relative "error_response"
7
+
8
+ insert_text <<~SNIPPET
9
+ auth_api_key \\
10
+ token_source: ${1:{header: {name: 'Authorization', prefix: 'Bearer '}}},
11
+ key_id_source: ${2|nil,{header: {name: 'X-API-Key'}}|},
12
+ error_response: ${3|"Unauthorized", "unauthenticated", { code: 408\\, default_format: "html"\\, html: { inline: "<h1>Unauthorized</h1>" } }|},
13
+ credentials_file: ${4|nil, ".itsi-credentials"|},
14
+ valid_keys: ${5|nil, [ENV['API_KEY_1']]|}
15
+ SNIPPET
16
+
17
+ detail "Require API Key Auth"
18
+
19
+ schema do
20
+ {
21
+ valid_keys: Or(Array(Type(String)), Hash(Type(String), Type(String))),
22
+ credentials_file: Type(String),
23
+ token_source: (Type(TokenSource) & Required()).default({header: { name: 'Authorization', prefix: 'Bearer ' }}),
24
+ key_id_source: Type(TokenSource).default({header: { name: 'X-Api-Key-Id' }}),
25
+ error_response: Type(ErrorResponseDef).default("unauthorized"),
26
+ }
27
+ end
28
+
29
+ def initialize(location, params)
30
+ super
31
+ if @params[:valid_keys] && @params[:valid_keys].is_a?(Array)
32
+ @params[:valid_keys] = @params[:valid_keys].each_with_index.map { |key, index| [index, key] }.to_h
33
+ @params[:key_id_source] = nil
34
+ end
35
+
36
+ if File.exist?(".itsi-credentials") && !@params[:credential_file]
37
+ @params[:credential_file] = ".itsi-credentials"
38
+ end
39
+
40
+ if @params[:credential_file] && File.exist?(@params[:credential_file])
41
+ @params[:valid_keys] = Passfile.load(@params[:credential_file])
42
+ end
43
+
44
+ unless @params[:valid_keys]&.any?
45
+ raise "No credentials provided"
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: Basic Authentication
3
+ url: /middleware/auth_basic
4
+ ---
5
+ The Basic Auth middleware allows you to require Basic Authentication on any set of endpoints.
6
+
7
+ Valid credentials can be loaded from a credentials file (using Itsi’s built‑in [passfile generator](/utilities/passfile_generator)), or defined inline (for example via environment variables).
8
+
9
+ Keys are required to be hashed using one of the supported [hashing algorithms](/utilities/passfile_generator/#supported-hashing-algorithms).
10
+
11
+ ## Configuration
12
+
13
+ ### 1. Load from credentials file
14
+
15
+ ```ruby {filename=Itsi.rb}
16
+ # Look for .itsi-credentials in the project root (format: key_id:secret per line)
17
+ auth_basic realm: "Admin Area", credentials_file: ".itsi-credentials"
18
+
19
+ # Default behavior. Looks for credentials file at .itsi-credentials
20
+ auth_basic
21
+
22
+ ```
23
+
24
+ ### 2. Inline credentials
25
+ ```ruby {filename=Itsi.rb}
26
+ # Each key pair is identified by an ID
27
+ auth_basic realm: "Admin Area", credentials_pairs: {
28
+ "user_1" => ENV["BASIC_AUTH_PASSWORD_1"],
29
+ "user_2" => ENV["BASIC_AUTH_PASSWORD_2"]
30
+ }
31
+ ```
32
+
33
+ ### 3. Apply Basic Authentication to specific endpoints
34
+
35
+ > See [location](/middleware/location)
36
+
37
+ ```ruby {filename=Itsi.rb}
38
+ # Apply Basic Authentication to specific endpoints
39
+ location "/admin/*" do
40
+ auth_basic realm: "Admin Area", credentials_pairs: {
41
+ "user_1" => ENV["BASIC_AUTH_PASSWORD_1"],
42
+ "user_2" => ENV["BASIC_AUTH_PASSWORD_2"]
43
+ }
44
+ end
45
+ ```
@@ -0,0 +1,44 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class AuthBasic < Middleware
5
+
6
+ insert_text <<~SNIPPET
7
+ auth_basic \\
8
+ realm: ${1:"Admin Area"},
9
+ credential_pairs: ${2|{ "admin": ENV['ADMIN_PASSWORD'] }|}
10
+ SNIPPET
11
+
12
+ detail "Require Basic Auth"
13
+
14
+ schema do
15
+ {
16
+ credential_pairs: Hash(Type(String), Type(String)),
17
+ credentials_file: Type(String),
18
+ realm: (Type(String) & Required()).default("Admin Area")
19
+ }
20
+ end
21
+
22
+ def initialize(location, params={})
23
+ super
24
+ unless @params[:credential_pairs]&.any?
25
+ if File.exist?(".itsi-credentials") && !@params[:credential_file]
26
+ @params[:credential_file] = ".itsi-credentials"
27
+ end
28
+
29
+ if @params[:credential_file] && File.exist?(@params[:credential_file])
30
+ @params[:credential_pairs] = Passfile.load(@params[:credential_file])
31
+ end
32
+ end
33
+
34
+ @params[:credential_pairs].compact!
35
+
36
+ unless @params[:credential_pairs]&.any?
37
+ raise "No credentials provided"
38
+ end
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,82 @@
1
+ ---
2
+ title: JWT Auth
3
+ url: /middleware/auth_jwt
4
+ ---
5
+ The JWT authentication middleware allows you to require valid JWT Authentication for any set of endpoints.
6
+
7
+ Itsi supports verifying JWTs signed using each of the following algorithms: `HS256`, `HS384`, `HS512`, `RS256`, `RS384`, `RS512`, `ES256`, `ES384`, `ES512`, `PS256`, `PS384`, `PS512`.
8
+
9
+ ## Configuration
10
+
11
+ ### 1. Supporting multiple verifiers simultaneously
12
+ You can configure multiple verifiers for each algorithm, allowing you to rotate keys without downtime.
13
+
14
+ ```ruby {filename=Itsi.rb}
15
+ auth_jwt verifiers: {
16
+ "HS256" => [ENV['HS256_SECRET_1'], ENV['HS256_SECRET_2']],
17
+ "RS512" => [ENV['RS512_SECRET_1'], ENV['RS512_SECRET_2']],
18
+ }
19
+ ```
20
+
21
+ ### 2. Further restrictions based on claims
22
+ You can further restrict access based on claims in the JWT payload. For example, you can require a specific role or scope. If claim restrictions are present and unmet, the request will be rejected.
23
+
24
+ ```ruby {filename=Itsi.rb}
25
+ auth_jwt verifiers: {..},
26
+ audiences: ["aud1", "aud2"],
27
+ subjects: ["sub1", "sub2"],
28
+ issuers: ["iss1", "iss2"]
29
+ ```
30
+
31
+ ### 3. Apply JWT Authentication to specific endpoints
32
+
33
+ > See [location](/middleware/location)
34
+
35
+ ```ruby {filename=Itsi.rb}
36
+ # Apply Basic Authentication to specific endpoints
37
+ location "/admin/*" do
38
+ auth_jwt verifiers: {..}
39
+ end
40
+ ```
41
+
42
+ ### 4. Leeway
43
+ You can optionally specify a leeway in seconds to account for clock skew between the client and server.
44
+
45
+ ```ruby {filename=Itsi.rb}
46
+ auth_jwt verifiers: {..},
47
+ leeway: 60
48
+ ```
49
+
50
+ ## Customized Token Source
51
+ * The JWT is expected inside an `Authorization` header, as a Bearer token.
52
+ This source can be overridden using the `token_source` options.
53
+ A token source can be either a named `header` (with optional prefix) or `query` parameter,
54
+ {{< callout >}}
55
+ Note: Using a query source for the *Secret* is not recommended, as full URLs are readily leaked and recorded via logs and browser history. You should reserve use of a query token-source for non-sensitive information or test cases.
56
+ {{< /callout >}}
57
+
58
+ ```ruby {filename=Itsi.rb}
59
+ auth_jwt \
60
+ verifiers: {.. },
61
+ token_source: { header: 'Authorization', prefix: 'Bearer ' }
62
+ ```
63
+
64
+ ## Verifier Secrets
65
+ * For `HMAC` algorithms, Itsi expects a `base64` encoded secret.
66
+ * For `RSA` (and `PS`) algorithms, Itsi expects a `PEM`-formatted key.
67
+ * For `ECDSA` algorithms, Itsi expects a `PEM`-formatted key.
68
+
69
+ Itsi's built-in [secrets management](/utilities/secrets_management) can be used to generate secrets for all supported algorithms.
70
+
71
+ ## Customized Error Responses
72
+ This middleware will return a default `unauthorized` response if the API key is missing or invalid.
73
+ However you can override this behaviour, by providing a custom [error response](/middleware/error_response).
74
+ E.g.
75
+ ```ruby {filename=Itsi.rb}
76
+ auth_jwt verifiers: {.. }, error_response: "unauthenticated"
77
+ ```
78
+
79
+ ```ruby {filename=Itsi.rb}
80
+ auth_jwt verifiers: {.. }, error_response: {code: 403, plaintext: {inline: "unauthenticated"} , default: 'plaintext'}
81
+
82
+ ```
@@ -0,0 +1,38 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class AuthJwt < Middleware
5
+ require_relative "token_source"
6
+
7
+ insert_text <<~SNIPPET
8
+ auth_jwt \\
9
+ token_source: ${1:{header: {name: 'Authorization', prefix: 'Bearer '}}},
10
+ verifiers: ${2:{"HS256": [ENV['JWT_HS_SECRET_1'], ENV['JWT_HS_SECRET_2']]}},
11
+ audiences: ${3:[]},
12
+ subjects: ${4:[]},
13
+ issuers: ${5:[]},
14
+ leeway: ${6:60}
15
+ SNIPPET
16
+
17
+ detail "Require Basic Auth"
18
+
19
+ schema do
20
+ {
21
+ token_source: (Type(TokenSource) & Required()).default({header: {name: 'Authorization', prefix: 'Bearer '}}),
22
+ verifiers: (Hash(Type(String), Array(Type(String)) & Length(1..1024))) & Required() & Length(1..32),
23
+ audiences: Array(Type(String)),
24
+ subjects: Array(Type(String)),
25
+ issuers: Array(Type(String)),
26
+ leeway: Type(Integer)
27
+ }
28
+ end
29
+
30
+ def initialize(location, params)
31
+ super
32
+ @params[:verifiers].transform_keys!{|k| k.to_s.downcase }
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,78 @@
1
+ ---
2
+ title: Cache-Control
3
+ url: /middleware/cache_control
4
+ ---
5
+
6
+ The Cache-Control middleware allows you to configure HTTP caching headers for your application. It creates a standard `Cache-Control` header based on a set of directives and, optionally, an `Expires` header when a maximum age is specified. The middleware also supports setting a `Vary` header and any additional custom headers.
7
+
8
+ ## Cache-Control configuration
9
+
10
+ ```ruby
11
+ cache_control \
12
+ max_age: 3600,
13
+ s_max_age: 1800,
14
+ stale_while_revalidate: 30,
15
+ stale_if_error: 60,
16
+ public: true,
17
+ private: false,
18
+ no_cache: false,
19
+ no_store: false,
20
+ must_revalidate: false,
21
+ proxy_revalidate: false,
22
+ immutable: false,
23
+ vary: ["Accept-Encoding"],
24
+ additional_headers: { "X-Custom-Header" => "HIT" }
25
+ ```
26
+
27
+ ## Cache-Control Applied to a sub-location
28
+
29
+ ```ruby
30
+ location "/static" do
31
+ cache_control \
32
+ max_age: 86400,
33
+ public: true,
34
+ vary: ["Accept-Encoding", "User-Agent"]
35
+ get("/assets") { |r| r.ok "static content" }
36
+ end
37
+ ```
38
+
39
+ ## Configuration Options
40
+
41
+ - **max_age**:
42
+ An optional integer that sets the maximum time (in seconds) the response should be considered fresh. When specified, it also triggers the generation of an `Expires` header with the correct HTTP date.
43
+
44
+ - **s_max_age**:
45
+ An optional integer for shared (proxy) cache time. It is set as `s-maxage=<value>` in the header.
46
+
47
+ - **stale_while_revalidate**:
48
+ An optional integer that indicates how long (in seconds) a stale response may be served while revalidation occurs.
49
+
50
+ - **stale_if_error**:
51
+ An optional integer that allows serving stale content if an error occurs during revalidation.
52
+
53
+ - **public**:
54
+ A boolean flag. When `true` (and if `private` is not enabled), adds the `public` directive to the header.
55
+
56
+ - **private**:
57
+ A boolean flag. When `true` (and if `public` is not enabled), adds the `private` directive to the header.
58
+
59
+ - **no_cache**:
60
+ When `true`, the `no-cache` directive is added, instructing caches to validate the response with the origin server before reuse.
61
+
62
+ - **no_store**:
63
+ When `true`, adds the `no-store` directive to completely disable caching.
64
+
65
+ - **must_revalidate**:
66
+ When `true`, adds the `must-revalidate` directive ensuring stale responses are not used.
67
+
68
+ - **proxy_revalidate**:
69
+ When `true`, the `proxy-revalidate` directive is added, which is similar to `must-revalidate` but for shared caches.
70
+
71
+ - **immutable**:
72
+ When `true`, adds the `immutable` directive indicating that the response body will not change over time.
73
+
74
+ - **vary**:
75
+ An array of header names as strings; these are concatenated and sent as the `Vary` header to inform caches which request headers might influence the response.
76
+
77
+ - **additional_headers**:
78
+ A hash for any extra headers you wish to include in the response. Both keys and values are strings.
@@ -0,0 +1,45 @@
1
+ module Itsi
2
+ class Server
3
+ module Config
4
+ class CacheControl < Middleware
5
+
6
+ insert_text <<~SNIPPET
7
+ cache_control \\
8
+ max_age: ${1|3600,7200|},
9
+ s_max_age: ${2|1800,3600|},
10
+ stale_while_revalidate: ${3|30,60|},
11
+ stale_if_error: ${4|60,120|},
12
+ public: ${5|true,false|},
13
+ private: ${6|true,false|},
14
+ no_cache: ${7|true,false|},
15
+ no_store: ${8|true,false|},
16
+ must_revalidate: ${9|true,false|},
17
+ proxy_revalidate: ${10|true,false|},
18
+ immutable: ${11|true,false|},
19
+ vary: [\"${12:Accept-Encoding}\"],
20
+ additional_headers: { \"${13:X-Custom-Header}\" => \"${14:value}\" }
21
+ SNIPPET
22
+
23
+ detail "Sets Cache-Control, Expires, Vary and additional HTTP caching headers."
24
+
25
+ schema do
26
+ {
27
+ max_age: (Type(Integer)),
28
+ s_max_age: (Type(Integer)),
29
+ stale_while_revalidate: (Type(Integer)),
30
+ stale_if_error: (Type(Integer)),
31
+ public: Bool().default(false),
32
+ private: Bool().default(false),
33
+ no_cache: Bool().default(false),
34
+ no_store: Bool().default(false),
35
+ must_revalidate: Bool().default(false),
36
+ proxy_revalidate: Bool().default(false),
37
+ immutable: Bool().default(false),
38
+ vary: Array(Type(String)).default([]),
39
+ additional_headers: Hash(Type(String), Type(String)).default({}),
40
+ }
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end