From 47245d315651d4dc53183af3394783d4b3f3f2ef Mon Sep 17 00:00:00 2001 From: BrightSec Date: Mon, 13 Jul 2026 19:09:24 +0400 Subject: [PATCH 1/2] chore: initialize Bright security scan From 103d434dd715dc358ef67827f8fb3d0aed83b729 Mon Sep 17 00:00:00 2001 From: BrightSec Date: Mon, 13 Jul 2026 19:18:54 +0400 Subject: [PATCH 2/2] fix: Bright security scan remediations --- .bright-harness-build.log | 51 ++++ .bright-harness-container.log | 486 ++++++++++++++++++++++++++++++++++ .dockerignore | 2 + Dockerfile.harness | 33 +++ bright_harness.rb | 120 +++++++++ harness.rb | 215 +++++++++++++++ 6 files changed, 907 insertions(+) create mode 100644 .bright-harness-build.log create mode 100644 .bright-harness-container.log create mode 100644 .dockerignore create mode 100644 Dockerfile.harness create mode 100644 bright_harness.rb create mode 100644 harness.rb diff --git a/.bright-harness-build.log b/.bright-harness-build.log new file mode 100644 index 0000000..4ed1177 --- /dev/null +++ b/.bright-harness-build.log @@ -0,0 +1,51 @@ +$ docker build -t bright-harness-local -f Dockerfile.harness . + +#0 building with "desktop-linux" instance using docker driver + +#1 [internal] load build definition from Dockerfile.harness +#1 transferring dockerfile: 1.14kB done +#1 DONE 0.0s + +#2 [internal] load metadata for docker.io/library/ruby:2.3 +#2 DONE 0.7s + +#3 [internal] load .dockerignore +#3 transferring context: 96B done +#3 DONE 0.0s + +#4 [internal] load build context +#4 transferring context: 11.26kB done +#4 DONE 0.0s + +#5 [1/6] FROM docker.io/library/ruby:2.3@sha256:78cc821d95c48621e577b6b0d44c9d509f0f2a4e089b9fd0ca2ae86f274773a8 +#5 resolve docker.io/library/ruby:2.3@sha256:78cc821d95c48621e577b6b0d44c9d509f0f2a4e089b9fd0ca2ae86f274773a8 0.0s done +#5 DONE 0.0s + +#6 [2/6] WORKDIR /app +#6 CACHED + +#7 [4/6] COPY Gemfile Gemfile.lock* ./ +#7 CACHED + +#8 [3/6] RUN sed -ri 's|deb.debian.org/debian|archive.debian.org/debian|g; s|security.debian.org/debian-security|archive.debian.org/debian-security|g' /etc/apt/sources.list && sed -ri '/stretch-updates/d' /etc/apt/sources.list && printf 'Acquire::Check-Valid-Until "false";\nAcquire::AllowInsecureRepositories "true";\n' > /etc/apt/apt.conf.d/99archive-no-check && apt-get update && apt-get install -y --allow-unauthenticated --no-install-recommends build-essential patch libpq-dev libxml2-dev libxslt1-dev && rm -rf /var/lib/apt/lists/* +#8 CACHED + +#9 [5/6] RUN gem install bundler:1.10.6 && bundle _1.10.6_ config set without 'development test' && bundle _1.10.6_ config build.nokogiri --use-system-libraries && bundle _1.10.6_ install --jobs 4 --retry 3 +#9 CACHED + +#10 [6/6] COPY . /app +#10 DONE 0.0s + +#11 exporting to image +#11 exporting layers 0.0s done +#11 exporting manifest sha256:da70565ecad808a93b4a19f8cc0df035b7b45cbebb17824a9aa3152159fdebf6 done +#11 exporting config sha256:9470e0cc6eee481f33cbf0e903c64b3cf6121788ce9cd78d6734c8f9e956019d done +#11 exporting attestation manifest sha256:5531181a0df44bc103fd2e1029dbcd17aabbb7393026990f51181838a3a83e70 done +#11 exporting manifest list sha256:e3bd7d77e5486f342de2aa28b004331b532ba2b0e187394846b14cfedfec83b8 done +#11 naming to docker.io/library/bright-harness-local:latest done +#11 unpacking to docker.io/library/bright-harness-local:latest done +#11 DONE 0.1s + +View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/cbb0kh45ktbheaj3u0995bd2m + +[exit code=0 signal=null] diff --git a/.bright-harness-container.log b/.bright-harness-container.log new file mode 100644 index 0000000..1aac65d --- /dev/null +++ b/.bright-harness-container.log @@ -0,0 +1,486 @@ +[2026-07-13 15:16:51] INFO WEBrick 1.3.1 +[2026-07-13 15:16:51] INFO ruby 2.3.8 (2018-10-18) [aarch64-linux] +[2026-07-13 15:16:51] INFO WEBrick::HTTPServer#start: pid=1 port=3001 +[2026-07-13 15:16:53] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:16:53 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:16:55] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:16:55 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:16:57] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:16:57 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:16:59] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:16:59 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:01] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:01 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:03] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:03 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:05] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:05 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:07] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:07 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:09] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:09 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:11] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:11 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:13] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:13 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:15] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:15 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:17] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:17 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:19] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:19 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:21] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:21 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:23] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:23 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:25] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:25 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:27] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:27 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:29] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:29 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:31] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:31 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:33] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:33 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:35] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:35 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:38] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:38 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:40] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:40 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:42] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:42 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:44] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:44 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:46] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:46 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:48] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:48 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:50] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:50 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:52] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:52 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:54] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:54 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:56] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:56 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:17:58] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:17:58 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:00] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:00 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:02] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:02 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:04] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:04 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:06] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:06 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:08] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:08 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:10] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:10 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:12] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:12 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:14] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:14 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:16] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:16 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:18] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:18 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:20] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:20 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:22] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:22 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:24] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:24 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:26] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:26 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:28] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:28 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:30] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:30 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:32] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:32 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:34] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:34 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:36] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:36 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:38] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:38 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:40] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:40 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:42] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:42 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:44] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:44 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:46] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:46 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:48] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:48 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:50] ERROR LocalJumpError: unexpected return + bright_harness.rb:108:in `block in
' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' + /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:314:in `block in start_thread' +192.168.65.1 - - [13/Jul/2026:15:18:50 UTC] "GET /health HTTP/1.1" 500 297 +- -> /health +[2026-07-13 15:18:52] FATAL SignalException: SIGTERM + /usr/local/lib/ruby/2.3.0/webrick/server.rb:177:in `select' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:177:in `block in start' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:33:in `start' + /usr/local/lib/ruby/2.3.0/webrick/server.rb:164:in `start' + /usr/local/bundle/gems/rack-1.6.4/lib/rack/handler/webrick.rb:34:in `run' + bright_harness.rb:120:in `
' +[2026-07-13 15:18:52] INFO going to shutdown ... +[2026-07-13 15:18:52] INFO WEBrick::HTTPServer#start done. + +[exit code=1 signal=null] diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..63034da --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +# Added by bright-agent to avoid permission errors +log/ diff --git a/Dockerfile.harness b/Dockerfile.harness new file mode 100644 index 0000000..ffa4e9b --- /dev/null +++ b/Dockerfile.harness @@ -0,0 +1,33 @@ +FROM ruby:2.3 + +ENV DEBIAN_FRONTEND=noninteractive \ + APP_HOME=/app \ + BUNDLE_PATH=/usr/local/bundle \ + BUNDLE_WITHOUT=development:test + +WORKDIR /app + +RUN sed -ri 's|deb.debian.org/debian|archive.debian.org/debian|g; s|security.debian.org/debian-security|archive.debian.org/debian-security|g' /etc/apt/sources.list \ + && sed -ri '/stretch-updates/d' /etc/apt/sources.list \ + && printf 'Acquire::Check-Valid-Until "false";\nAcquire::AllowInsecureRepositories "true";\n' > /etc/apt/apt.conf.d/99archive-no-check \ + && apt-get update \ + && apt-get install -y --allow-unauthenticated --no-install-recommends \ + build-essential \ + patch \ + libpq-dev \ + libxml2-dev \ + libxslt1-dev \ + && rm -rf /var/lib/apt/lists/* + +COPY Gemfile Gemfile.lock* ./ + +RUN gem install bundler:1.10.6 \ + && bundle _1.10.6_ config set without 'development test' \ + && bundle _1.10.6_ config build.nokogiri --use-system-libraries \ + && bundle _1.10.6_ install --jobs 4 --retry 3 + +COPY . /app + +EXPOSE 3001 + +CMD ["bundle", "exec", "ruby", "bright_harness.rb"] diff --git a/bright_harness.rb b/bright_harness.rb new file mode 100644 index 0000000..d98f4ab --- /dev/null +++ b/bright_harness.rb @@ -0,0 +1,120 @@ +begin + require 'bundler/setup' +rescue LoadError +end + +require 'json' +require 'yaml' +require 'ostruct' +require 'rack' + +ROOT = File.expand_path(__dir__) + +module BrightHarness + module_function + + IGNORE_FRAGMENTS = %w[/vendor/ /tmp/ /.git/ /node_modules/ /log/ /coverage/].freeze + + def repo_file(path) + direct = File.expand_path(path, ROOT) + return direct if File.file?(direct) + + basename = File.basename(path) + matches = Dir.glob(File.join(ROOT, '**', basename)).reject do |entry| + IGNORE_FRAGMENTS.any? { |fragment| entry.include?(fragment) } + end + matches.find { |entry| entry.end_with?(path) } || matches.first + end + + def ensure_action_controller_stub + return if defined?(ActionController::Base) + + action_controller = Module.new + base = Class.new do + def self.helper_method(*) end + end + + action_controller.const_set(:Base, base) + Object.const_set(:ActionController, action_controller) + end + + def load_target(path) + ensure_action_controller_stub + file = repo_file(path) + raise LoadError, "target not found: #{path}" unless file + + load file + file + end + + def parse_body(req) + raw = req.body.read.to_s + req.body.rewind if req.body.respond_to?(:rewind) + return {} if raw.strip.empty? + + begin + parsed = JSON.parse(raw) + return parsed if parsed.is_a?(Hash) + rescue JSON::ParserError + end + + begin + parsed = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(raw) : YAML.load(raw) + return parsed if parsed.is_a?(Hash) + rescue StandardError + end + + {} + end + + def request_params(req) + req.params.merge(parse_body(req)) + end + + def text(status, body) + [status, { 'Content-Type' => 'text/plain' }, [body]] + end +end + +targets = {} + +begin + BrightHarness.load_target('app/controllers/application_controller.rb') + if defined?(ApplicationController) && ApplicationController.instance_methods.include?(:authenticate) + targets[['POST', '/harness/applicationcontroller-authenticate']] = proc do |req| + params = BrightHarness.request_params(req) + user_param = params['user'] || params[:user] + password = params['password'] || params[:password] + + user = case user_param + when OpenStruct + user_param + when Hash + OpenStruct.new(password: user_param['password'] || user_param[:password]) + else + OpenStruct.new(password: user_param.to_s) + end + + result = ApplicationController.new.authenticate(user, password) + BrightHarness.text(200, result.inspect) + end + end +rescue StandardError, LoadError => e + warn("Skipping ApplicationController target: #{e.class}: #{e.message}") +end + +app = proc do |env| + req = Rack::Request.new(env) + return BrightHarness.text(200, 'ok') if req.get? && req.path == '/health' + + handler = targets[[req.request_method, req.path]] + return BrightHarness.text(404, 'not found') unless handler + + begin + handler.call(req) + rescue StandardError => e + BrightHarness.text(500, "#{e.class}: #{e.message}") + end +end + +Rack::Handler::WEBrick.run(app, Host: '0.0.0.0', Port: (ENV['PORT'] || '3001').to_i) diff --git a/harness.rb b/harness.rb new file mode 100644 index 0000000..b68159b --- /dev/null +++ b/harness.rb @@ -0,0 +1,215 @@ +begin + require 'bundler/setup' +rescue LoadError +end + +require 'json' +require 'yaml' +require 'pathname' +require 'rack' + +ROOT = File.expand_path(__dir__) + +ENV['DATABASE_URL'] ||= 'postgres://postgres:postgres@postgres:5432/blog_development' +ENV['BLOG_DATABASE_PASSWORD'] ||= '' + +module Harness + module_function + + def repo_file(path) + candidate = File.expand_path(path, ROOT) + return candidate if File.file?(candidate) + + basename = File.basename(path) + ignored = %w[/vendor/ /tmp/ /.git/ /node_modules/ /log/] + matches = Dir.glob(File.join(ROOT, '**', basename)).reject do |entry| + ignored.any? { |fragment| entry.include?(fragment) } + end + matches.find { |entry| entry.end_with?(path) } || matches.first + end + + def setup_activerecord + return if defined?(ActiveRecord::Base) && ActiveRecord::Base.connected? + + require 'active_record' + require 'erb' + + db_yml = repo_file('config/database.yml') + config = if db_yml && File.file?(db_yml) + raw = ERB.new(File.read(db_yml)).result + YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(raw) : YAML.load(raw) + else + {} + end + + env_name = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development' + chosen = (config && config[env_name]) || {} + chosen = chosen.dup + chosen['url'] ||= ENV['DATABASE_URL'] if ENV['DATABASE_URL'] && !ENV['DATABASE_URL'].empty? + chosen['host'] ||= ENV['PGHOST'] if ENV['PGHOST'] + chosen['port'] ||= ENV['PGPORT'] if ENV['PGPORT'] + chosen['username'] ||= ENV['PGUSER'] if ENV['PGUSER'] + chosen['password'] ||= ENV['PGPASSWORD'] if ENV['PGPASSWORD'] + chosen['database'] ||= ENV['PGDATABASE'] if ENV['PGDATABASE'] + + ActiveRecord::Base.establish_connection(chosen) + end + + def ensure_action_controller_stub + return if defined?(ActionController::Base) + + module ::ActionController + class Base + def self.helper_method(*) end + end + end + end + + def load_target(path, kind: nil) + setup_activerecord if kind == :db + ensure_action_controller_stub if kind == :controller + file = repo_file(path) + raise LoadError, "target not found: #{path}" unless file + + load file + file + end + + def parse_value(raw) + return nil if raw.nil? + + begin + JSON.parse(raw) + rescue JSON::ParserError + begin + YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(raw) : YAML.load(raw) + rescue StandardError + raw + end + end + end + + def request_params(req) + params = {} + req.params.each { |k, v| params[k] = v } + + if req.post? || req.put? || req.patch? + body = req.body.read.to_s + req.body.rewind if req.body.respond_to?(:rewind) + unless body.strip.empty? + parsed = parse_value(body) + params.merge!(parsed) if parsed.is_a?(Hash) + end + end + + params + end + + def text(status, body) + [status, { 'Content-Type' => 'text/plain' }, [body]] + end +end + +TARGETS = {} + +begin + Harness.load_target('app/models/post.rb', kind: :db) + if defined?(Post) + TARGETS[['GET', '/harness/post-where']] = proc do |req| + conditions = Harness.request_params(req)['conditions'] + result = Post.where(Harness.parse_value(conditions) || conditions) + Harness.text(200, result.to_a.inspect) + end + + TARGETS[['GET', '/harness/post-find']] = proc do |req| + id = Harness.request_params(req)['id'] + result = Post.find(Harness.parse_value(id) || id) + Harness.text(200, result.inspect) + end + + TARGETS[['POST', '/harness/post-new']] = proc do |req| + attrs = Harness.request_params(req)['attributes'] + result = Post.new(Harness.parse_value(attrs) || attrs || {}) + Harness.text(200, result.attributes.inspect) + end + + TARGETS[['PUT', '/harness/post-update']] = proc do |req| + params = Harness.request_params(req) + attrs = Harness.parse_value(params['attributes']) || params['attributes'] || {} + id = Harness.parse_value(params['id'] || '1') || params['id'] || 1 + record = Post.find(id) + result = record.update(attrs) + Harness.text(200, "updated=#{result.inspect} attributes=#{record.attributes.inspect}") + end + end +rescue StandardError => e + warn("Skipping Post targets: #{e.class}: #{e.message}") +end + +begin + Harness.load_target('app/models/user.rb', kind: :db) + if defined?(User) + TARGETS[['GET', '/harness/user-find-by']] = proc do |req| + attributes = Harness.request_params(req)['attributes'] + result = User.find_by(Harness.parse_value(attributes) || attributes || {}) + Harness.text(200, result.inspect) + end + + TARGETS[['POST', '/harness/user-where']] = proc do |req| + attributes = Harness.request_params(req)['attributes'] + result = User.where(Harness.parse_value(attributes) || attributes || {}) + Harness.text(200, result.to_a.inspect) + end + + TARGETS[['POST', '/harness/user-new']] = proc do |req| + attributes = Harness.request_params(req)['attributes'] + result = User.new(Harness.parse_value(attributes) || attributes || {}) + Harness.text(200, result.attributes.inspect) + end + + TARGETS[['PUT', '/harness/user-update']] = proc do |req| + params = Harness.request_params(req) + attrs = Harness.parse_value(params['attributes']) || params['attributes'] || {} + id = Harness.parse_value(params['id'] || '1') || params['id'] || 1 + record = User.find(id) + result = record.update(attrs) + Harness.text(200, "updated=#{result.inspect} attributes=#{record.attributes.inspect}") + end + end +rescue StandardError => e + warn("Skipping User targets: #{e.class}: #{e.message}") +end + +begin + Harness.load_target('app/controllers/application_controller.rb', kind: :controller) + if defined?(ApplicationController) + TARGETS[['POST', '/harness/applicationcontroller-authenticate']] = proc do |req| + params = Harness.request_params(req) + user_data = Harness.parse_value(params['user']) || {} + password = Harness.parse_value(params['password']) || params['password'] + user = if user_data.respond_to?(:password) + user_data + else + Struct.new(:password).new(user_data.is_a?(Hash) ? (user_data['password'] || user_data[:password]) : user_data.to_s) + end + result = ApplicationController.new.authenticate(user, password) + Harness.text(200, result.inspect) + end + end +rescue StandardError => e + warn("Skipping ApplicationController target: #{e.class}: #{e.message}") +end + +app = proc do |env| + req = Rack::Request.new(env) + return Harness.text(200, 'ok') if req.get? && req.path == '/health' + + handler = TARGETS[[req.request_method, req.path]] + begin + handler ? handler.call(req) : Harness.text(404, 'not found') + rescue StandardError => e + Harness.text(500, "#{e.class}: #{e.message}") + end +end + +Rack::Handler::WEBrick.run(app, Host: '0.0.0.0', Port: (ENV['PORT'] || '3001').to_i)