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.
- checksums.yaml +4 -4
- data/Cargo.lock +4487 -0
- data/Cargo.toml +7 -0
- data/README.md +6 -0
- data/Rakefile +7 -4
- data/exe/itsi +152 -46
- data/ext/itsi_acme/Cargo.toml +86 -0
- data/ext/itsi_acme/examples/high_level.rs +63 -0
- data/ext/itsi_acme/examples/high_level_warp.rs +52 -0
- data/ext/itsi_acme/examples/low_level.rs +87 -0
- data/ext/itsi_acme/examples/low_level_axum.rs +66 -0
- data/ext/itsi_acme/src/acceptor.rs +81 -0
- data/ext/itsi_acme/src/acme.rs +354 -0
- data/ext/itsi_acme/src/axum.rs +86 -0
- data/ext/itsi_acme/src/cache.rs +39 -0
- data/ext/itsi_acme/src/caches/boxed.rs +80 -0
- data/ext/itsi_acme/src/caches/composite.rs +69 -0
- data/ext/itsi_acme/src/caches/dir.rs +106 -0
- data/ext/itsi_acme/src/caches/mod.rs +11 -0
- data/ext/itsi_acme/src/caches/no.rs +78 -0
- data/ext/itsi_acme/src/caches/test.rs +136 -0
- data/ext/itsi_acme/src/config.rs +172 -0
- data/ext/itsi_acme/src/https_helper.rs +69 -0
- data/ext/itsi_acme/src/incoming.rs +142 -0
- data/ext/itsi_acme/src/jose.rs +161 -0
- data/ext/itsi_acme/src/lib.rs +142 -0
- data/ext/itsi_acme/src/resolver.rs +59 -0
- data/ext/itsi_acme/src/state.rs +424 -0
- data/ext/itsi_error/Cargo.toml +3 -0
- data/ext/itsi_error/src/lib.rs +98 -24
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
- data/ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock +0 -0
- data/ext/itsi_instrument_entry/Cargo.toml +15 -0
- data/ext/itsi_instrument_entry/src/lib.rs +31 -0
- data/ext/itsi_rb_helpers/Cargo.toml +3 -0
- data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
- data/ext/itsi_rb_helpers/src/lib.rs +141 -10
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
- 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
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock +0 -0
- data/ext/itsi_scheduler/Cargo.toml +24 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
- data/ext/itsi_scheduler/src/itsi_scheduler.rs +314 -0
- data/ext/itsi_scheduler/src/lib.rs +39 -0
- data/ext/itsi_server/Cargo.lock +2956 -0
- data/ext/itsi_server/Cargo.toml +75 -14
- data/ext/itsi_server/extconf.rb +1 -1
- data/ext/itsi_server/src/default_responses/html/401.html +68 -0
- data/ext/itsi_server/src/default_responses/html/403.html +68 -0
- data/ext/itsi_server/src/default_responses/html/404.html +68 -0
- data/ext/itsi_server/src/default_responses/html/413.html +71 -0
- data/ext/itsi_server/src/default_responses/html/429.html +68 -0
- data/ext/itsi_server/src/default_responses/html/500.html +71 -0
- data/ext/itsi_server/src/default_responses/html/502.html +71 -0
- data/ext/itsi_server/src/default_responses/html/503.html +68 -0
- data/ext/itsi_server/src/default_responses/html/504.html +69 -0
- data/ext/itsi_server/src/default_responses/html/index.html +238 -0
- data/ext/itsi_server/src/default_responses/json/401.json +6 -0
- data/ext/itsi_server/src/default_responses/json/403.json +6 -0
- data/ext/itsi_server/src/default_responses/json/404.json +6 -0
- data/ext/itsi_server/src/default_responses/json/413.json +6 -0
- data/ext/itsi_server/src/default_responses/json/429.json +6 -0
- data/ext/itsi_server/src/default_responses/json/500.json +6 -0
- data/ext/itsi_server/src/default_responses/json/502.json +6 -0
- data/ext/itsi_server/src/default_responses/json/503.json +6 -0
- data/ext/itsi_server/src/default_responses/json/504.json +6 -0
- data/ext/itsi_server/src/default_responses/mod.rs +11 -0
- data/ext/itsi_server/src/env.rs +43 -0
- data/ext/itsi_server/src/lib.rs +133 -40
- data/ext/itsi_server/src/prelude.rs +2 -0
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +109 -0
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +143 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +264 -0
- data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +362 -0
- data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +391 -0
- data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +233 -0
- data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +565 -0
- data/ext/itsi_server/src/ruby_types/itsi_server.rs +86 -0
- data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
- data/ext/itsi_server/src/server/binds/bind.rs +204 -0
- data/ext/itsi_server/src/server/binds/bind_protocol.rs +37 -0
- data/ext/itsi_server/src/server/binds/listener.rs +444 -0
- data/ext/itsi_server/src/server/binds/mod.rs +4 -0
- data/ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs +132 -0
- data/ext/itsi_server/src/server/binds/tls.rs +278 -0
- data/ext/itsi_server/src/server/byte_frame.rs +32 -0
- data/ext/itsi_server/src/server/http_message_types.rs +97 -0
- data/ext/itsi_server/src/server/io_stream.rs +105 -0
- data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
- data/ext/itsi_server/src/server/middleware_stack/middleware.rs +170 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +63 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +94 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +94 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +343 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +151 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +316 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +301 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +193 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +64 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +192 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +171 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +198 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +82 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +209 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +82 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +116 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +411 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +142 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +55 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +54 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +51 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +126 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +187 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +173 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +31 -0
- data/ext/itsi_server/src/server/middleware_stack/mod.rs +381 -0
- data/ext/itsi_server/src/server/mod.rs +13 -5
- data/ext/itsi_server/src/server/process_worker.rs +247 -0
- data/ext/itsi_server/src/server/redirect_type.rs +26 -0
- data/ext/itsi_server/src/server/request_job.rs +11 -0
- data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +354 -0
- data/ext/itsi_server/src/server/serve_strategy/mod.rs +30 -0
- data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +481 -0
- data/ext/itsi_server/src/server/signal.rs +77 -0
- data/ext/itsi_server/src/server/size_limited_incoming.rs +107 -0
- data/ext/itsi_server/src/server/thread_worker.rs +479 -0
- data/ext/itsi_server/src/services/cache_store.rs +74 -0
- data/ext/itsi_server/src/services/itsi_http_service.rs +257 -0
- data/ext/itsi_server/src/services/mime_types.rs +1416 -0
- data/ext/itsi_server/src/services/mod.rs +6 -0
- data/ext/itsi_server/src/services/password_hasher.rs +83 -0
- data/ext/itsi_server/src/services/rate_limiter.rs +580 -0
- data/ext/itsi_server/src/services/static_file_server.rs +1340 -0
- data/ext/itsi_tracing/Cargo.toml +5 -0
- data/ext/itsi_tracing/src/lib.rs +366 -7
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock +0 -0
- data/lib/itsi/http_request/response_status_shortcodes.rb +76 -0
- data/lib/itsi/http_request.rb +218 -0
- data/lib/itsi/http_response.rb +42 -0
- data/lib/itsi/passfile.rb +108 -0
- data/lib/itsi/server/config/config_helpers.rb +105 -0
- data/lib/itsi/server/config/dsl.rb +211 -0
- data/lib/itsi/server/config/known_paths/KitchensinkDirectories.txt +2346 -0
- data/lib/itsi/server/config/known_paths/Randomfiles.txt +24 -0
- data/lib/itsi/server/config/known_paths/UnixDotfiles.txt +52 -0
- data/lib/itsi/server/config/known_paths/backdoors/ASP_CommonBackdoors.txt +29 -0
- data/lib/itsi/server/config/known_paths/backdoors/bot_control_panels.txt +1668 -0
- data/lib/itsi/server/config/known_paths/backdoors/shells.txt +1167 -0
- data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST.txt +7 -0
- data/lib/itsi/server/config/known_paths/cgi/CGI_HTTP_POST_Windows.txt +6 -0
- data/lib/itsi/server/config/known_paths/cgi/CGI_Microsoft.txt +79 -0
- data/lib/itsi/server/config/known_paths/cgi/CGI_XPlatform.txt +3948 -0
- data/lib/itsi/server/config/known_paths/cms/README.md +5 -0
- data/lib/itsi/server/config/known_paths/cms/drupal_plugins.txt +6320 -0
- data/lib/itsi/server/config/known_paths/cms/drupal_themes.txt +828 -0
- data/lib/itsi/server/config/known_paths/cms/joomla_plugins.txt +224 -0
- data/lib/itsi/server/config/known_paths/cms/joomla_themes.txt +30 -0
- data/lib/itsi/server/config/known_paths/cms/php-nuke.txt +2142 -0
- data/lib/itsi/server/config/known_paths/cms/wordpress.txt +1566 -0
- data/lib/itsi/server/config/known_paths/cms/wp_common_theme_files.txt +46 -0
- data/lib/itsi/server/config/known_paths/cms/wp_plugins.txt +13366 -0
- data/lib/itsi/server/config/known_paths/cms/wp_plugins_full.txt +68662 -0
- data/lib/itsi/server/config/known_paths/cms/wp_plugins_top225.txt +225 -0
- data/lib/itsi/server/config/known_paths/cms/wp_themes.readme +12 -0
- data/lib/itsi/server/config/known_paths/cms/wp_themes.txt +7336 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/3CharExtBrute.txt +17576 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/CommonWebExtensions.txt +80 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Backup.txt +14 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Common.txt +865 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Compressed.txt +186 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Mostcommon.txt +30 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/Extensions.Skipfish.txt +93 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/WordlistSkipfish.txt +1918 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/copy_of.txt +8 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories-lowercase.txt +56180 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-directories.txt +62290 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions-lowercase.txt +2367 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-extensions.txt +2450 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files-lowercase.txt +35323 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-files.txt +37037 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words-lowercase.txt +107982 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-large-words.txt +119600 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories-lowercase.txt +26593 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-directories.txt +30009 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions-lowercase.txt +1233 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-extensions.txt +1289 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files-lowercase.txt +16243 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-files.txt +17128 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words-lowercase.txt +56293 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-medium-words.txt +63087 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories-lowercase.txt +17776 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-directories.txt +20122 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions-lowercase.txt +914 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-extensions.txt +963 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files-lowercase.txt +10848 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-files.txt +11424 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words-lowercase.txt +38267 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/raft-small-words.txt +43003 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/spanish.txt +445 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/test_demo.txt +36 -0
- data/lib/itsi/server/config/known_paths/filename-dirname-bruteforce/upload_variants.txt +44 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/Logins.txt +71 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/cfm.txt +294 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/html.txt +295 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/jsp.txt +294 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/php.txt +294 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/windows-asp.txt +294 -0
- data/lib/itsi/server/config/known_paths/login-file-locations/windows-aspx.txt +294 -0
- data/lib/itsi/server/config/known_paths/password-file-locations/Passwords.txt +47 -0
- data/lib/itsi/server/config/known_paths/php/PHP.txt +30 -0
- data/lib/itsi/server/config/known_paths/php/PHP_CommonBackdoors.txt +5 -0
- data/lib/itsi/server/config/known_paths/proxy-conf.txt +31 -0
- data/lib/itsi/server/config/known_paths/tftp.txt +79 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/ADFS.txt +86 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/AdobeXML.txt +16 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Apache.txt +101 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/ApacheTomcat.txt +47 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Apache_Axis.txt +16 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/ColdFusion.txt +111 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/FatwireCMS.txt +390 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Frontpage.txt +38 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/HP_System_Mgmt_Homepage.txt +239 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/HTTP_POST_Microsoft.txt +2 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Hyperion.txt +578 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/IIS.txt +187 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/JBoss.txt +5 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/JRun.txt +13 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/JavaServlets_Common.txt +3 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Joomla_exploitable.txt +1937 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/LotusNotes.txt +206 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Netware.txt +18 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Oracle9i.txt +60 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/OracleAppServer.txt +192 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/README.md +6 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Ruby_Rails.txt +121 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/SAP.txt +463 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Sharepoint.txt +1707 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/SiteMinder.txt +19 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/SunAppServerGlassfish.txt +51 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/SuniPlanet.txt +35 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Vignette.txt +73 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Weblogic.txt +160 -0
- data/lib/itsi/server/config/known_paths/webservers-appservers/Websphere.txt +366 -0
- data/lib/itsi/server/config/known_paths/wellknown-rfc5785.txt +30 -0
- data/lib/itsi/server/config/known_paths.rb +20 -0
- data/lib/itsi/server/config/middleware/_index.md +56 -0
- data/lib/itsi/server/config/middleware/allow_list.md +46 -0
- data/lib/itsi/server/config/middleware/allow_list.rb +42 -0
- data/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
- data/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
- data/lib/itsi/server/config/middleware/auth_basic.md +45 -0
- data/lib/itsi/server/config/middleware/auth_basic.rb +44 -0
- data/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
- data/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
- data/lib/itsi/server/config/middleware/cache_control.md +78 -0
- data/lib/itsi/server/config/middleware/cache_control.rb +45 -0
- data/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
- data/lib/itsi/server/config/middleware/compression.md +50 -0
- data/lib/itsi/server/config/middleware/compression.rb +37 -0
- data/lib/itsi/server/config/middleware/cors.md +93 -0
- data/lib/itsi/server/config/middleware/cors.rb +32 -0
- data/lib/itsi/server/config/middleware/csp.md +37 -0
- data/lib/itsi/server/config/middleware/csp.rb +44 -0
- data/lib/itsi/server/config/middleware/deny_list.md +45 -0
- data/lib/itsi/server/config/middleware/deny_list.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/_index.md +159 -0
- data/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
- data/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
- data/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/delete.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
- data/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/get.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
- data/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
- data/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/patch.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
- data/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
- data/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
- data/lib/itsi/server/config/middleware/error_response.md +61 -0
- data/lib/itsi/server/config/middleware/error_response.rb +36 -0
- data/lib/itsi/server/config/middleware/etag.md +59 -0
- data/lib/itsi/server/config/middleware/etag.rb +27 -0
- data/lib/itsi/server/config/middleware/grpc.md +172 -0
- data/lib/itsi/server/config/middleware/grpc.rb +54 -0
- data/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
- data/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
- data/lib/itsi/server/config/middleware/location.md +107 -0
- data/lib/itsi/server/config/middleware/location.rb +99 -0
- data/lib/itsi/server/config/middleware/log_requests.md +65 -0
- data/lib/itsi/server/config/middleware/log_requests.rb +31 -0
- data/lib/itsi/server/config/middleware/max_body.md +18 -0
- data/lib/itsi/server/config/middleware/max_body.rb +21 -0
- data/lib/itsi/server/config/middleware/proxy.md +62 -0
- data/lib/itsi/server/config/middleware/proxy.rb +41 -0
- data/lib/itsi/server/config/middleware/rackup_file.md +54 -0
- data/lib/itsi/server/config/middleware/rackup_file.rb +44 -0
- data/lib/itsi/server/config/middleware/rate_limit.md +126 -0
- data/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
- data/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
- data/lib/itsi/server/config/middleware/redirect.md +55 -0
- data/lib/itsi/server/config/middleware/redirect.rb +25 -0
- data/lib/itsi/server/config/middleware/request_headers.md +34 -0
- data/lib/itsi/server/config/middleware/request_headers.rb +24 -0
- data/lib/itsi/server/config/middleware/response_headers.md +33 -0
- data/lib/itsi/server/config/middleware/response_headers.rb +25 -0
- data/lib/itsi/server/config/middleware/run.md +60 -0
- data/lib/itsi/server/config/middleware/run.rb +43 -0
- data/lib/itsi/server/config/middleware/static_assets.md +73 -0
- data/lib/itsi/server/config/middleware/static_assets.rb +87 -0
- data/lib/itsi/server/config/middleware/static_response.md +44 -0
- data/lib/itsi/server/config/middleware/static_response.rb +29 -0
- data/lib/itsi/server/config/middleware/string_rewrite.md +67 -0
- data/lib/itsi/server/config/middleware/token_source.rb +32 -0
- data/lib/itsi/server/config/middleware.rb +13 -0
- data/lib/itsi/server/config/option.rb +14 -0
- data/lib/itsi/server/config/options/_index.md +37 -0
- data/lib/itsi/server/config/options/auto_reload_config.md +13 -0
- data/lib/itsi/server/config/options/auto_reload_config.rb +41 -0
- data/lib/itsi/server/config/options/bind.md +71 -0
- data/lib/itsi/server/config/options/bind.rb +26 -0
- data/lib/itsi/server/config/options/certificates.md +65 -0
- data/lib/itsi/server/config/options/daemonize.md +14 -0
- data/lib/itsi/server/config/options/daemonize.rb +19 -0
- data/lib/itsi/server/config/options/fiber_scheduler.md +34 -0
- data/lib/itsi/server/config/options/fiber_scheduler.rb +21 -0
- data/lib/itsi/server/config/options/header_read_timeout.md +17 -0
- data/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
- data/lib/itsi/server/config/options/hooks/_index.md +11 -0
- data/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
- data/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
- data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
- data/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
- data/lib/itsi/server/config/options/hooks/after_start.md +12 -0
- data/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
- data/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
- data/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
- data/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
- data/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
- data/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
- data/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
- data/lib/itsi/server/config/options/include.md +20 -0
- data/lib/itsi/server/config/options/include.rb +36 -0
- data/lib/itsi/server/config/options/listen_backlog.md +11 -0
- data/lib/itsi/server/config/options/listen_backlog.rb +19 -0
- data/lib/itsi/server/config/options/log_format.md +18 -0
- data/lib/itsi/server/config/options/log_format.rb +19 -0
- data/lib/itsi/server/config/options/log_level.md +34 -0
- data/lib/itsi/server/config/options/log_level.rb +20 -0
- data/lib/itsi/server/config/options/log_target.md +38 -0
- data/lib/itsi/server/config/options/log_target.rb +19 -0
- data/lib/itsi/server/config/options/log_target_filters.md +17 -0
- data/lib/itsi/server/config/options/log_target_filters.rb +19 -0
- data/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
- data/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
- data/lib/itsi/server/config/options/nodelay.md +16 -0
- data/lib/itsi/server/config/options/nodelay.rb +19 -0
- data/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
- data/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
- data/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
- data/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
- data/lib/itsi/server/config/options/preload.md +21 -0
- data/lib/itsi/server/config/options/preload.rb +18 -0
- data/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
- data/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
- data/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
- data/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
- data/lib/itsi/server/config/options/request_timeout.md +23 -0
- data/lib/itsi/server/config/options/request_timeout.rb +19 -0
- data/lib/itsi/server/config/options/reuse_address.md +16 -0
- data/lib/itsi/server/config/options/reuse_address.rb +19 -0
- data/lib/itsi/server/config/options/reuse_port.md +16 -0
- data/lib/itsi/server/config/options/reuse_port.rb +19 -0
- data/lib/itsi/server/config/options/scheduler_threads.md +34 -0
- data/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
- data/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
- data/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
- data/lib/itsi/server/config/options/stream_body.md +32 -0
- data/lib/itsi/server/config/options/stream_body.rb +18 -0
- data/lib/itsi/server/config/options/threads.md +44 -0
- data/lib/itsi/server/config/options/threads.rb +17 -0
- data/lib/itsi/server/config/options/watch.md +16 -0
- data/lib/itsi/server/config/options/watch.rb +28 -0
- data/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
- data/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
- data/lib/itsi/server/config/options/workers.md +42 -0
- data/lib/itsi/server/config/options/workers.rb +17 -0
- data/lib/itsi/server/config/typed_struct.rb +242 -0
- data/lib/itsi/server/config.rb +289 -0
- data/lib/itsi/server/default_app/default_app.rb +34 -0
- data/lib/itsi/server/default_app/index.html +115 -0
- data/lib/itsi/server/default_config/Itsi.rb +107 -0
- data/lib/itsi/server/grpc/grpc_call.rb +246 -0
- data/lib/itsi/server/grpc/grpc_interface.rb +107 -0
- data/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
- data/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
- data/lib/itsi/server/rack/handler/itsi.rb +27 -0
- data/lib/itsi/server/rack_interface.rb +94 -0
- data/lib/itsi/server/route_tester.rb +157 -0
- data/lib/itsi/server/scheduler_interface.rb +21 -0
- data/lib/itsi/server/scheduler_mode.rb +10 -0
- data/lib/itsi/server/signal_trap.rb +33 -0
- data/lib/itsi/server/typed_handlers/param_parser.rb +196 -0
- data/lib/itsi/server/typed_handlers/source_parser.rb +56 -0
- data/lib/itsi/server/typed_handlers.rb +25 -0
- data/lib/itsi/server/version.rb +1 -1
- data/lib/itsi/server.rb +265 -9
- data/lib/itsi/standard_headers.rb +86 -0
- data/lib/ruby_lsp/itsi/addon.rb +129 -0
- data/lib/shell_completions/completions.rb +26 -0
- metadata +454 -28
- data/CHANGELOG.md +0 -5
- data/CODE_OF_CONDUCT.md +0 -132
- data/LICENSE.txt +0 -21
- data/ext/itsi_server/src/request/itsi_request.rs +0 -143
- data/ext/itsi_server/src/request/mod.rs +0 -1
- data/ext/itsi_server/src/server/bind.rs +0 -138
- data/ext/itsi_server/src/server/itsi_ca/itsi_ca.crt +0 -32
- data/ext/itsi_server/src/server/itsi_ca/itsi_ca.key +0 -52
- data/ext/itsi_server/src/server/itsi_server.rs +0 -182
- data/ext/itsi_server/src/server/listener.rs +0 -218
- data/ext/itsi_server/src/server/tls.rs +0 -138
- data/ext/itsi_server/src/server/transfer_protocol.rs +0 -23
- data/ext/itsi_server/src/stream_writer/mod.rs +0 -21
- 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
|