From 264b5761713e8bc589ab462fcbc0a684c8732574 Mon Sep 17 00:00:00 2001 From: io42630 Date: Sat, 20 Jan 2024 22:26:23 +0100 Subject: [PATCH] migration complete - working! --- .gitignore | 5 + .tool-versions | 1 + README.md | 26 ++ build-all.sh | 19 + build-install-all.sh | 13 - docker-compose.yaml | 30 ++ down.sh | 3 + dup.sh | 3 + embedded/README.md | 5 - embedded/pom.xml | 208 ----------- .../com/olexyn/misp/embedded/EmbeddedR.java | 28 -- .../java/com/olexyn/misp/embedded/RunAll.java | 23 -- forward/Dockerfile | 4 +- forward/README.md | 9 - .../com/olexyn/misp/forward/web/Forward.java | 4 +- forward/src/test/resources/get-smoke.http | 6 + legacy/copy-restart.sh | 26 -- legacy/threads-in-mock.png | Bin 26372 -> 0 bytes legacy/threads-in-mock.uxf | 340 ------------------ mirror/Dockerfile | 4 +- reverse/Dockerfile | 4 +- .../java/com/olexyn/misp/reverse/Reverse.java | 4 +- .../java/com/olexyn/misp/reverse/Tools.java | 3 +- .../misp/reverse/runnable/CheckSuppyR.java | 4 +- 24 files changed, 108 insertions(+), 664 deletions(-) create mode 100644 .gitignore create mode 100644 .tool-versions create mode 100644 build-all.sh delete mode 100755 build-install-all.sh create mode 100644 docker-compose.yaml create mode 100644 down.sh create mode 100644 dup.sh delete mode 100644 embedded/README.md delete mode 100644 embedded/pom.xml delete mode 100644 embedded/src/main/java/com/olexyn/misp/embedded/EmbeddedR.java delete mode 100644 embedded/src/main/java/com/olexyn/misp/embedded/RunAll.java delete mode 100644 forward/README.md create mode 100644 forward/src/test/resources/get-smoke.http delete mode 100755 legacy/copy-restart.sh delete mode 100644 legacy/threads-in-mock.png delete mode 100644 legacy/threads-in-mock.uxf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..50f4ceb --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.iml +**/.idea/ +**/target/ +**/config.properties +*.env diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..ff21b5a --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +java temurin-17.0.9+9 diff --git a/README.md b/README.md index 66103d2..ed9b959 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,16 @@ The `Ride` object is then sent back to `reverse`. Upon recieving a reply with data from `app`, `reverse` will forward this data to `forward`, which in turn will finally forward it to the `user`. +#### Control +##### Routing / Access Control +* currently, there is a 1:1 mapping between `forward` and `reverse`. + * thus any `Ride` "submitted" to `forward` will + naturally be selected, and circle back to `reverse`. +* thus `forward` and `Ride` can both be stateless. +* if any access control, name resolution, port forwarding were to happen, + it would be done in `reverse`. + +
### Overview @@ -41,3 +51,19 @@ which in turn will finally forward it to the `user`. * Build (e.g. with `build-install-all.sh`) * Put the generated `forward-0.1.war` in a servlet container (e.g. Jetty). * Launch the `reverse-0.1.jar` on your host. + + +### Migration (WIP) + +#### How would we even test this? +* one instance of `foward` +* one instance of `reverse` +* one instance of `mirror` +* `reverse` uses `mirror` as app +* we call `forward` and see `mirror` + +#### Steps TODO +* migrate `forward` to Spring ✅ +* parametrize URLs +* check if `mirror` works +* diff --git a/build-all.sh b/build-all.sh new file mode 100644 index 0000000..05bbc75 --- /dev/null +++ b/build-all.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +cd ./helper && +mvn clean install && + +cd ../mirror && +./build.sh && + +cd ../reverse && +./build.sh && + +cd ../forward && +./build.sh & + + + + + + diff --git a/build-install-all.sh b/build-install-all.sh deleted file mode 100755 index dfaebf8..0000000 --- a/build-install-all.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -cd ./forward -./install-locally.sh -cd .. -cd ./helper -./install-locally.sh -cd .. -cd ./mirror -./install-locally.sh -cd .. -cd ./reverse -./install-locally.sh -cd .. \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..1bda3b4 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,30 @@ +version: '3' +services: + + + forward: + container_name: forward + image: io42630/forward:0.1 + ports: + - "42001:8080" + - "42002:5005" + + + # See .env for vars. + reverse: + container_name: reverse + image: io42630/reverse:0.1 + ports: + - "42005:8090" + - "42006:5005" + environment: + - forward.url=${FORWARD_URL} + - app.url=${APP_URL} + + + mirror: + container_name: mirror + image: io42630/mirror:0.1 + ports: + - "42003:8080" + - "42004:5005" diff --git a/down.sh b/down.sh new file mode 100644 index 0000000..2c7f2aa --- /dev/null +++ b/down.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker compose down & \ No newline at end of file diff --git a/dup.sh b/dup.sh new file mode 100644 index 0000000..31a3530 --- /dev/null +++ b/dup.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker compose up --force-recreate & \ No newline at end of file diff --git a/embedded/README.md b/embedded/README.md deleted file mode 100644 index c53cf7a..0000000 --- a/embedded/README.md +++ /dev/null @@ -1,5 +0,0 @@ -#### About -* Uses `com.olexyn.min.http.server.MinJettyServer` to host the servlets. -* Where to adjust the parameters: - * for `forward` -> `EmbeddedR` - * for `reverse` -> `RunAll` \ No newline at end of file diff --git a/embedded/pom.xml b/embedded/pom.xml deleted file mode 100644 index 187fddf..0000000 --- a/embedded/pom.xml +++ /dev/null @@ -1,208 +0,0 @@ - - - - 4.0.0 - - com.olexyn.misp.embedded - embedded - 0.1 - - embedded - - http://www.example.com - - - UTF-8 - 1.11 - 1.11 - - - - - - junit - junit - 4.11 - test - - - com.olexyn.min.http.server - min-http-server - 0.1 - compile - - - javax.servlet - javax.servlet-api - 4.0.1 - compile - - - com.olexyn.misp.helper - misp-helper - 0.1 - compile - - - commons-io - commons-io - 2.6 - compile - - - org.eclipse.jetty - jetty-server - 9.4.28.v20200408 - - - org.eclipse.jetty - jetty-webapp - 9.4.28.v20200408 - - - org.eclipse.jetty - jetty-servlets - 9.4.28.v20200408 - - - org.eclipse.jetty - jetty-servlet - 9.4.28.v20200408 - - - org.eclipse.jetty - jetty-util - 9.4.28.v20200408 - - - org.eclipse.jetty - jetty-http - 9.4.28.v20200408 - - - org.eclipse.jetty - jetty-io - 9.4.28.v20200408 - - - org.eclipse.jetty - jetty-client - 9.4.28.v20200408 - - - org.eclipse.jetty.websocket - websocket-server - 9.4.28.v20200408 - - - org.eclipse.jetty.websocket - websocket-client - 9.4.28.v20200408 - - - org.eclipse.jetty.websocket - websocket-servlet - 9.4.28.v20200408 - - - org.eclipse.jetty.websocket - websocket-api - 9.4.28.v20200408 - - - org.eclipse.jetty.aggregate - jetty-all - 9.4.28.v20200408 - pom - test - - - com.olexyn.misp.mirror - misp-mirror - 0.1 - compile - - - com.olexyn.misp.rev - misp-rev - 0.1 - compile - - - com.olexyn.misp.reverse - reverse - 0.1 - compile - - - com.olexyn.misp.fwd - misp-fwd - 0.1 - compile - - - com.olexyn.misp.forward - forward - 0.1 - compile - - - com.olexyn.misp.mirror - mirror - 0.1 - compile - - - org.json - json - 20190722 - - - - - - - - - maven-clean-plugin - 3.1.0 - - - - maven-resources-plugin - 3.0.2 - - - maven-compiler-plugin - 3.8.0 - - - maven-surefire-plugin - 2.22.1 - - - maven-jar-plugin - 3.0.2 - - - maven-install-plugin - 2.5.2 - - - maven-deploy-plugin - 2.8.2 - - - - maven-site-plugin - 3.7.1 - - - maven-project-info-reports-plugin - 3.0.0 - - - - - diff --git a/embedded/src/main/java/com/olexyn/misp/embedded/EmbeddedR.java b/embedded/src/main/java/com/olexyn/misp/embedded/EmbeddedR.java deleted file mode 100644 index f09eef8..0000000 --- a/embedded/src/main/java/com/olexyn/misp/embedded/EmbeddedR.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.olexyn.misp.embedded; - -import com.olexyn.min.http.server.MinJettyServer; -import com.olexyn.misp.forward.Forward; -import com.olexyn.misp.mirror.Mirror; - - -public class EmbeddedR implements Runnable { - - - @Override - public void run() { - MinJettyServer server = new MinJettyServer(); - - server.PORT = 8090; - server.MAX_THREADS = 100; - server.MIN_THREADS = 10; - server.IDLE_TIMEOUT = 120; - - - server.addServletWithMapping("/mirror", Mirror.class); - server.addServletWithMapping("/app", Mirror.class); - server.addServletWithMapping("/forward", Forward.class); - - - server.start(); - } -} diff --git a/embedded/src/main/java/com/olexyn/misp/embedded/RunAll.java b/embedded/src/main/java/com/olexyn/misp/embedded/RunAll.java deleted file mode 100644 index 6571286..0000000 --- a/embedded/src/main/java/com/olexyn/misp/embedded/RunAll.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.olexyn.misp.embedded; - -import com.olexyn.misp.reverse.Reverse; - -public class RunAll { - - public static void main(String... args) throws InterruptedException { - - Thread embeddedT = new Thread(new EmbeddedR()); - embeddedT.start(); - - Thread.sleep(2000); - - Reverse reverse = new Reverse(); - reverse.FORWARD_URL = "http://localhost:8090/forward"; - reverse.APP_URL = "http://localhost:8090/app"; - //reverse.APP_URL = "https://olexyn.com/wp/"; - - - Thread reverseT = new Thread(reverse); - reverseT.start(); - } -} diff --git a/forward/Dockerfile b/forward/Dockerfile index 5e77c5d..9fdef20 100644 --- a/forward/Dockerfile +++ b/forward/Dockerfile @@ -1,4 +1,4 @@ FROM eclipse-temurin:17-alpine COPY /target/forward-0.1.jar /usr/local/lib/forward.jar -EXPOSE 8080 -ENTRYPOINT ["java","-jar","/usr/local/lib/forward.jar"] +EXPOSE 8080 5005 +ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar","/usr/local/lib/forward.jar"] diff --git a/forward/README.md b/forward/README.md deleted file mode 100644 index 1f3348e..0000000 --- a/forward/README.md +++ /dev/null @@ -1,9 +0,0 @@ -#### About -The `forward` servlet. - -#### Deploy (TODO) -* Run `install-locally.sh` -* Find the `forward-0.1.war` in `./target` -* Copy it to `tomcat/webapps`. -* Assuming tomcat runs at `http://localhost:9090` - * Then the servlet will be at `http://localhost:9090/forward-0.1/mirror` \ No newline at end of file diff --git a/forward/src/main/java/com/olexyn/misp/forward/web/Forward.java b/forward/src/main/java/com/olexyn/misp/forward/web/Forward.java index 610e1f8..e88558c 100644 --- a/forward/src/main/java/com/olexyn/misp/forward/web/Forward.java +++ b/forward/src/main/java/com/olexyn/misp/forward/web/Forward.java @@ -26,7 +26,7 @@ public class Forward { private final Map loaded = new HashMap<>(); - @GetMapping + @GetMapping("/") public void doGet(HttpServletRequest request, HttpServletResponse response) { Thread handleGetRequestThread = new Thread(() -> handleGetRequest(request, response)); @@ -102,7 +102,7 @@ public class Forward { } - @PostMapping + @PostMapping("/") public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { String payload = IOUtils.toString(request.getReader()); diff --git a/forward/src/test/resources/get-smoke.http b/forward/src/test/resources/get-smoke.http new file mode 100644 index 0000000..6530c90 --- /dev/null +++ b/forward/src/test/resources/get-smoke.http @@ -0,0 +1,6 @@ +POST http://localhost:42001 +Content-Type: application/json + +{ + "hello": "world" +} diff --git a/legacy/copy-restart.sh b/legacy/copy-restart.sh deleted file mode 100755 index 618fa08..0000000 --- a/legacy/copy-restart.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -tomcat_webapps="${HOME}/app/tomcat/webapps" -jetty_webapps="${HOME}/app/jetty9.4/webapps" -webapps=$jetty_webapps -cwd=$(pwd) - -/home/user/app/tomcat/bin/shutdown.sh - -echo "================" -echo "END TOMCAT STOP " -echo "================" - -cp -v "${cwd}/misp-mirror/target/misp-mirror-0.1.war" "${webapps}" -cp -v "${cwd}/misp-rev/target/misp-rev-0.1.war" "${webapps}" -cp -v "${cwd}/test-proxy/target/test-proxy-0.1.war" "${webapps}" - -echo "================" -echo "END COPY" -echo "================" - -# /home/user/app/tomcat/bin/startup.sh - -echo "================" -echo "END TOMCAT START " -echo "================" \ No newline at end of file diff --git a/legacy/threads-in-mock.png b/legacy/threads-in-mock.png deleted file mode 100644 index af9ac6ef9745a8ac3cc392304d0e9c55c1c55e2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26372 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

b 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]H^F5N?S*+kkvrz^+#WVZWmC1xpXyduE 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 ho_8Ym|9vy5y~JX0zWOCY7jA*?H+>Vm+ - - 10 - - UMLClass - - 910 - 50 - 90 - 30 - - inet -lt=- - - - - UMLClass - - 680 - 50 - 100 - 30 - - webhost -lt=- -layer=-1 - - - - UMLClass - - 910 - 90 - 90 - 30 - - user -bg=#90CAF9 - - - - UMLClass - - 680 - 90 - 100 - 30 - - mispbridge -bg=#B39DDB -layer=-1 - - - - Relation - - 410 - 140 - 300 - 50 - - lt=<<<- -POST (Ride) -Generated by Loop - 280.0;20.0;10.0;20.0 - - - Relation - - 760 - 180 - 200 - 40 - - lt=<<<- -GET (Request) -fg=#1E88E5 - 10.0;20.0;180.0;20.0 - - - UMLClass - - 350 - 90 - 100 - 30 - - mispclient -bg=#B39DDB -layer=-1 - - - - Relation - - 410 - 290 - 300 - 50 - - lt=<<<- -GET (Ride)(Request) -(Data) - 280.0;20.0;10.0;20.0 - - - Relation - - 760 - 310 - 190 - 40 - - lt=<<<. -OK (Data) -fg=#1E88E5 - 170.0;20.0;10.0;20.0 - - - Relation - - 410 - 350 - 300 - 40 - - lt=<<<. -OK (Ride) - 10.0;20.0;280.0;20.0 - - - UMLClass - - 150 - 90 - 80 - 30 - - app -bg=#90CAF9 - - - - Relation - - 200 - 220 - 200 - 40 - - lt=<<<- -GET (Request) -fg=#1E88E5 - 10.0;20.0;180.0;20.0 - - - Relation - - 200 - 270 - 200 - 40 - - lt=<<<. -OK (Data) -fg=#1E88E5 - 180.0;20.0;10.0;20.0 - - - Relation - - 410 - 200 - 300 - 40 - - lt=<<<. -OK (Ride)(Request) - 10.0;20.0;280.0;20.0 - - - UMLClass - - 150 - 50 - 300 - 30 - - localhost -lt=- - - - - UMLClass - - 120 - 20 - 910 - 400 - - -lt=.. -layer=-10 - - - - Relation - - 940 - 110 - 30 - 310 - - lt=- -fg=#1E88E5 - 10.0;10.0;10.0;290.0 - - - Relation - - 180 - 110 - 30 - 310 - - lt=- -fg=#1E88E5 - 10.0;10.0;10.0;290.0 - - - UMLClass - - 930 - 200 - 40 - 130 - - -bg=#F6F6F6 -transparency=0 -layer=4 - - - - UMLClass - - 170 - 240 - 40 - 50 - - -bg=#F6F6F6 -transparency=0 -layer=4 - - - - Relation - - 720 - 110 - 30 - 310 - - lt=- -fg=#5E35B1 -layer=-4 - 10.0;10.0;10.0;290.0 - - - Relation - - 390 - 110 - 30 - 310 - - lt=- -fg=#5E35B1 -layer=-4 - 10.0;10.0;10.0;290.0 - - - UMLClass - - 380 - 160 - 40 - 210 - - -bg=#F6F6F6 -transparency=0 -layer=4 - - - - UMLClass - - 690 - 160 - 40 - 60 - - -bg=#F6F6F6 -transparency=0 -layer=4 - - - - UMLClass - - 690 - 310 - 40 - 60 - - -bg=#F6F6F6 -transparency=0 -layer=4 - - - - UMLClass - - 730 - 200 - 40 - 130 - - -bg=#F6F6F6 -transparency=0 -layer=4 - - - diff --git a/mirror/Dockerfile b/mirror/Dockerfile index d56189a..fe77416 100644 --- a/mirror/Dockerfile +++ b/mirror/Dockerfile @@ -1,4 +1,4 @@ FROM eclipse-temurin:17-alpine COPY /target/mirror-0.1.jar /usr/local/lib/mirror-0.1.jar -EXPOSE 8080 -ENTRYPOINT ["java","-jar","/usr/local/lib/mirror-0.1.jar"] +EXPOSE 8080 5005 +ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar","/usr/local/lib/mirror-0.1.jar"] diff --git a/reverse/Dockerfile b/reverse/Dockerfile index 5fa23f4..6c33e7e 100755 --- a/reverse/Dockerfile +++ b/reverse/Dockerfile @@ -1,4 +1,4 @@ FROM eclipse-temurin:17-alpine COPY /target/reverse-0.1-jar-with-dependencies.jar /usr/local/lib/reverse-0.1-jar-with-dependencies.jar -EXPOSE 8090 -ENTRYPOINT ["java","-jar","/usr/local/lib/reverse-0.1-jar-with-dependencies.jar"] +EXPOSE 8090 5005 +ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar","/usr/local/lib/reverse-0.1-jar-with-dependencies.jar"] diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java b/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java index 11d19b6..2c1f9b5 100644 --- a/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java +++ b/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java @@ -6,8 +6,8 @@ import com.olexyn.misp.reverse.runnable.JourneyGeneratorR; public class Reverse implements Runnable { - public String FORWARD_URL = "http://localhost:8090/forward"; - public String APP_URL = "http://localhost:8090/app"; + public static final String FORWARD_URL = System.getenv("forward.url"); + public static final String APP_URL = System.getenv("app.url"); public void start() { diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/Tools.java b/reverse/src/main/java/com/olexyn/misp/reverse/Tools.java index 62faa08..5042f78 100644 --- a/reverse/src/main/java/com/olexyn/misp/reverse/Tools.java +++ b/reverse/src/main/java/com/olexyn/misp/reverse/Tools.java @@ -5,6 +5,7 @@ import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; +import java.net.URI; import java.net.URL; @@ -13,7 +14,7 @@ public class Tools { public static String send(String method, String urlString, String body) throws IOException { - URL url = new URL(urlString); + URL url = URI.create(urlString).toURL(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(method); diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/runnable/CheckSuppyR.java b/reverse/src/main/java/com/olexyn/misp/reverse/runnable/CheckSuppyR.java index 3451feb..d9658b4 100644 --- a/reverse/src/main/java/com/olexyn/misp/reverse/runnable/CheckSuppyR.java +++ b/reverse/src/main/java/com/olexyn/misp/reverse/runnable/CheckSuppyR.java @@ -5,6 +5,8 @@ import com.olexyn.misp.reverse.Tools; import lombok.Getter; import org.json.JSONObject; +import static com.olexyn.misp.reverse.Reverse.FORWARD_URL; + public class CheckSuppyR implements Runnable { @Getter @@ -25,7 +27,7 @@ public class CheckSuppyR implements Runnable { JSONObject obj = new JSONObject().put("available", 0); try { - String result = Tools.send("POST", reverse.FORWARD_URL, obj.toString()); + String result = Tools.send("POST", FORWARD_URL, obj.toString()); JSONObject resultObj = new JSONObject(result);