From be39abdeac981b36674cf56dfcb5eb0e84ba731a Mon Sep 17 00:00:00 2001 From: Radek Davidek Date: Sat, 28 Mar 2026 20:40:42 +0100 Subject: [PATCH] initial commit --- .gitignore | 25 +++++ bcrema/Dockerfile | 7 ++ bcrema/pom.xml | 50 +++++++++ .../main/java/cz/kamma/bcrema/DBHelper.java | 71 ++++++++++++ .../src/main/java/cz/kamma/bcrema/Main.java | 64 +++++++++++ cukrarna-fiala/Dockerfile | 8 ++ cukrarna-fiala/pom.xml | 55 +++++++++ .../main/java/cz/kamma/cukrarnafiala/App.java | 105 ++++++++++++++++++ .../java/cz/kamma/cukrarnafiala/DBHelper.java | 75 +++++++++++++ 9 files changed, 460 insertions(+) create mode 100644 .gitignore create mode 100644 bcrema/Dockerfile create mode 100755 bcrema/pom.xml create mode 100755 bcrema/src/main/java/cz/kamma/bcrema/DBHelper.java create mode 100644 bcrema/src/main/java/cz/kamma/bcrema/Main.java create mode 100644 cukrarna-fiala/Dockerfile create mode 100755 cukrarna-fiala/pom.xml create mode 100644 cukrarna-fiala/src/main/java/cz/kamma/cukrarnafiala/App.java create mode 100755 cukrarna-fiala/src/main/java/cz/kamma/cukrarnafiala/DBHelper.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb54cae --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar + +# IDE +.idea/ +*.iml +*.iws +*.ipr +.vscode/ +.classpath +.project +.settings/ + +# OS +.DS_Store +Thumbs.db diff --git a/bcrema/Dockerfile b/bcrema/Dockerfile new file mode 100644 index 0000000..67a1677 --- /dev/null +++ b/bcrema/Dockerfile @@ -0,0 +1,7 @@ +FROM eclipse-temurin:11-jre-alpine +WORKDIR /app + +COPY target/bcrema.jar /app/bcrema.jar + +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "/app/bcrema.jar"] diff --git a/bcrema/pom.xml b/bcrema/pom.xml new file mode 100755 index 0000000..f0d1cfe --- /dev/null +++ b/bcrema/pom.xml @@ -0,0 +1,50 @@ + + 4.0.0 + cz.kamma.bcrema + bcrema-standalone + jar + 1.0-SNAPSHOT + BCRema standalone server + http://maven.apache.org + + + 11 + UTF-8 + + + + + com.mysql + mysql-connector-j + 8.0.33 + + + + + bcrema + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.1 + + + package + + shade + + + false + + + cz.kamma.bcrema.Main + + + + + + + + + diff --git a/bcrema/src/main/java/cz/kamma/bcrema/DBHelper.java b/bcrema/src/main/java/cz/kamma/bcrema/DBHelper.java new file mode 100755 index 0000000..5e26c71 --- /dev/null +++ b/bcrema/src/main/java/cz/kamma/bcrema/DBHelper.java @@ -0,0 +1,71 @@ +package cz.kamma.bcrema; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class DBHelper { + + private static final String DEFAULT_DB_URL = "jdbc:mysql://10.0.0.147:3306/bcrema?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true"; + private static final String DEFAULT_DB_USER = "root"; + private static final String DEFAULT_DB_PASSWORD = "dns8990tcpip"; + + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DEFAULT_DB_URL, DEFAULT_DB_USER, DEFAULT_DB_PASSWORD); + } + + public static void closeConnection(Connection conn) { + try { + if (conn != null) + conn.close(); + } catch (Exception e) { + } + } + + public static void closeConnectionAndStatement(Connection conn, Statement stmt) { + try { + if (conn != null) + conn.close(); + } catch (Exception e) { + } + try { + if (stmt != null) + stmt.close(); + } catch (Exception e) { + } + } + + public static String getSettingStringValue(String key, String defaultValue) { + Connection conn = null; + try { + conn = getConnection(); + PreparedStatement prst = conn.prepareStatement("select value from config where name=?"); + prst.setString(1, key); + ResultSet rs = prst.executeQuery(); + String value = defaultValue; + if (rs.next()) + value = rs.getString(1); + rs.close(); + prst.close(); + return value; + } catch (Exception ex) { + } finally { + closeConnection(conn); + } + return defaultValue; + } + + public static int log(String address) throws SQLException { + try (Connection conn = getConnection(); + PreparedStatement prst = conn.prepareStatement("insert into log (address) values (?)")) { + prst.setString(1, address); + int res = prst.executeUpdate(); + return res; + } catch (Exception ex) { + throw new SQLException("Error in method log.", ex); + } + } +} diff --git a/bcrema/src/main/java/cz/kamma/bcrema/Main.java b/bcrema/src/main/java/cz/kamma/bcrema/Main.java new file mode 100644 index 0000000..d70d79c --- /dev/null +++ b/bcrema/src/main/java/cz/kamma/bcrema/Main.java @@ -0,0 +1,64 @@ +package cz.kamma.bcrema; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.sql.SQLException; +import java.util.concurrent.Executors; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpServer; + +public class Main { + + public static void main(String[] args) throws IOException { + int port = Integer.parseInt(readConfig("BCREMA_PORT", "bcrema.port", "8080")); + HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); + server.createContext("/", Main::handleRoot); + server.setExecutor(Executors.newCachedThreadPool()); + server.start(); + + System.out.println("BC Rema standalone server running on http://localhost:" + port + "/"); + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + server.stop(0); + System.out.println("BC Rema server stopped."); + })); + } + + private static void handleRoot(HttpExchange exchange) throws IOException { + String remoteAddress = exchange.getRemoteAddress() != null && exchange.getRemoteAddress().getAddress() != null + ? exchange.getRemoteAddress().getAddress().getHostAddress() + : "unknown"; + try { + DBHelper.log(remoteAddress); + } catch (SQLException ex) { + System.err.println("Failed to log visitor address: " + ex.getMessage()); + } + + String html = "BC Rema" + + "

Vitejte na strankach legendarniho nymburskeho streetballoveho teamu

" + + "

Pozor, tento web nema nic spolecneho s oddilem BC Real Rema, ktery pouze parazituje na slave naseho teamu

" + + ""; + byte[] body = html.getBytes(StandardCharsets.UTF_8); + + exchange.getResponseHeaders().add("Content-Type", "text/html; charset=UTF-8"); + exchange.sendResponseHeaders(200, body.length); + try (OutputStream os = exchange.getResponseBody()) { + os.write(body); + } + } + + private static String readConfig(String envName, String propName, String defaultValue) { + String fromProperty = System.getProperty(propName); + if (fromProperty != null && !fromProperty.trim().isEmpty()) { + return fromProperty; + } + String fromEnv = System.getenv(envName); + if (fromEnv != null && !fromEnv.trim().isEmpty()) { + return fromEnv; + } + return defaultValue; + } +} diff --git a/cukrarna-fiala/Dockerfile b/cukrarna-fiala/Dockerfile new file mode 100644 index 0000000..0de5c3c --- /dev/null +++ b/cukrarna-fiala/Dockerfile @@ -0,0 +1,8 @@ +FROM eclipse-temurin:11-jre-alpine +WORKDIR /app + +COPY target/cukrarna-fiala.jar /app/cukrarna-fiala.jar + +EXPOSE 8080 + +ENTRYPOINT ["java", "-jar", "/app/cukrarna-fiala.jar"] diff --git a/cukrarna-fiala/pom.xml b/cukrarna-fiala/pom.xml new file mode 100755 index 0000000..451ffcb --- /dev/null +++ b/cukrarna-fiala/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + cz.kamma.cukrarnafiala + cukrarna-fiala + jar + 1.0-SNAPSHOT + cukrarna-fiala + http://maven.apache.org + + + 11 + 11 + UTF-8 + + + + + com.mysql + mysql-connector-j + 8.0.33 + + + + cukrarna-fiala + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.1 + + + package + + shade + + + false + + + cz.kamma.cukrarnafiala.App + + + + + + + + + diff --git a/cukrarna-fiala/src/main/java/cz/kamma/cukrarnafiala/App.java b/cukrarna-fiala/src/main/java/cz/kamma/cukrarnafiala/App.java new file mode 100644 index 0000000..0f69d1e --- /dev/null +++ b/cukrarna-fiala/src/main/java/cz/kamma/cukrarnafiala/App.java @@ -0,0 +1,105 @@ +package cz.kamma.cukrarnafiala; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.sql.SQLException; +import java.util.List; +import java.util.concurrent.Executors; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; + +public final class App { + + private App() { + } + + public static void main(String[] args) throws IOException { + int port = parsePort(); + HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); + server.createContext("/", new RedirectHandler()); + server.setExecutor(Executors.newFixedThreadPool(10)); + server.start(); + } + + private static int parsePort() { + String rawPort = System.getProperty("app.port"); + if (rawPort == null || rawPort.trim().isEmpty()) { + rawPort = System.getenv("PORT"); + } + if (rawPort == null || rawPort.trim().isEmpty()) { + rawPort = "8080"; + } + return Integer.parseInt(rawPort); + } + + private static final class RedirectHandler implements HttpHandler { + @Override + public void handle(HttpExchange exchange) throws IOException { + String address = resolveClientIp(exchange); + + try { + DBHelper.log(address); + String forwardUrl = DBHelper.getSettingStringValue("FORWARD_URL", ""); + if (forwardUrl == null || forwardUrl.trim().isEmpty()) { + sendText(exchange, 500, "FORWARD_URL is not configured."); + return; + } + exchange.getResponseHeaders().set("Location", forwardUrl); + exchange.sendResponseHeaders(302, -1); + exchange.close(); + } catch (SQLException ex) { + sendText(exchange, 500, "Database error: " + ex.getMessage()); + } + } + } + + private static String resolveClientIp(HttpExchange exchange) { + String ip = firstHeaderIp(exchange, "X-Forwarded-For"); + if (ip != null) { + return ip; + } + + ip = firstHeaderIp(exchange, "X-Real-IP"); + if (ip != null) { + return ip; + } + + ip = firstHeaderIp(exchange, "CF-Connecting-IP"); + if (ip != null) { + return ip; + } + + return exchange.getRemoteAddress().getAddress() != null + ? exchange.getRemoteAddress().getAddress().getHostAddress() + : exchange.getRemoteAddress().toString(); + } + + private static String firstHeaderIp(HttpExchange exchange, String headerName) { + List values = exchange.getRequestHeaders().get(headerName); + if (values == null || values.isEmpty()) { + return null; + } + + String raw = values.get(0); + if (raw == null || raw.trim().isEmpty()) { + return null; + } + + // X-Forwarded-For may contain multiple values: client, proxy1, proxy2 + String first = raw.split(",")[0].trim(); + return first.isEmpty() ? null : first; + } + + private static void sendText(HttpExchange exchange, int status, String text) throws IOException { + byte[] body = text.getBytes(StandardCharsets.UTF_8); + exchange.getResponseHeaders().set("Content-Type", "text/plain; charset=UTF-8"); + exchange.sendResponseHeaders(status, body.length); + try (OutputStream os = exchange.getResponseBody()) { + os.write(body); + } + } +} diff --git a/cukrarna-fiala/src/main/java/cz/kamma/cukrarnafiala/DBHelper.java b/cukrarna-fiala/src/main/java/cz/kamma/cukrarnafiala/DBHelper.java new file mode 100755 index 0000000..293342f --- /dev/null +++ b/cukrarna-fiala/src/main/java/cz/kamma/cukrarnafiala/DBHelper.java @@ -0,0 +1,75 @@ +package cz.kamma.cukrarnafiala; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class DBHelper { + + private static final String DEFAULT_DB_URL = "jdbc:mysql://10.0.0.147:3306/cukrarnafiala?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true"; + private static final String DEFAULT_DB_USER = "root"; + private static final String DEFAULT_DB_PASSWORD = "dns8990tcpip"; + + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DEFAULT_DB_URL, DEFAULT_DB_USER, DEFAULT_DB_PASSWORD); + } + + public static void closeConnection(Connection conn) { + try { + if (conn != null) + conn.close(); + } catch (Exception e) { + } + } + + public static void closeConnectionAndStatement(Connection conn, Statement stmt) { + try { + if (conn != null) + conn.close(); + } catch (Exception e) { + } + try { + if (stmt != null) + stmt.close(); + } catch (Exception e) { + } + } + + public static String getSettingStringValue(String key, String defaultValue) { + Connection conn = null; + try { + conn = getConnection(); + PreparedStatement prst = conn.prepareStatement("select value from config where name=?"); + prst.setString(1, key); + ResultSet rs = prst.executeQuery(); + String value = defaultValue; + if (rs.next()) + value = rs.getString(1); + rs.close(); + prst.close(); + return value; + } catch (Exception ex) { + } finally { + closeConnection(conn); + } + return defaultValue; + } + + public static int log(String address) throws SQLException { + Connection conn = null; + try { + conn = getConnection(); + PreparedStatement prst = conn.prepareStatement("insert into log (address) values (?)"); + prst.setString(1, address); + int res = prst.executeUpdate(); + return res; + } catch (Exception ex) { + throw new SQLException("Error in method log.", ex); + } finally { + closeConnection(conn); + } + } +}