git: b14a7be4225c - main - games/coronapoker: Remove

From: Yuri Victorovich <yuri_at_FreeBSD.org>
Date: Sat, 25 Apr 2026 17:12:57 UTC
The branch main has been updated by yuri:

URL: https://cgit.FreeBSD.org/ports/commit/?id=b14a7be4225c5268af83f53322095592ac07f81b

commit b14a7be4225c5268af83f53322095592ac07f81b
Author:     Yuri Victorovich <yuri@FreeBSD.org>
AuthorDate: 2026-04-25 17:10:24 +0000
Commit:     Yuri Victorovich <yuri@FreeBSD.org>
CommitDate: 2026-04-25 17:12:53 +0000

    games/coronapoker: Remove
    
    coronapoker downloads binary module that defeats its GPL license.
    This download presents a potential security risk.
    
    Reference: https://github.com/tonikelope/coronapoker/issues/7
---
 MOVED                                              |   1 +
 games/Makefile                                     |   1 -
 games/coronapoker/Makefile                         |  64 ---
 games/coronapoker/distinfo                         |   5 -
 games/coronapoker/files/coronapoker.in             |   5 -
 ...n_java_com_tonikelope_coronapoker_Panoptes.java | 546 ---------------------
 games/coronapoker/pkg-descr                        |   5 -
 games/coronapoker/pkg-message                      |  54 --
 8 files changed, 1 insertion(+), 680 deletions(-)

diff --git a/MOVED b/MOVED
index 71884484d744..b63bfb58c9c0 100644
--- a/MOVED
+++ b/MOVED
@@ -5251,3 +5251,4 @@ databases/py-sqlglotrs|databases/py-sqlglotc|2026-04-18|Remove obsoleted port. U
 devel/py-prettytable0|devel/py-prettytable|2026-04-18|Remove obsoleted port. Use devel/py-prettytable instead
 www/py-requests-cache0|www/py-requests-cache|2026-04-18|Remove obsoleted port. Use www/py-requests-cache instead
 sysutils/py-azure-cli-base||2026-04-21|Remove obsoleted port
+games/coronapoker||2026-04-25|Remove for security concerns: downloads closed source binary modules, should not be restored unless https://github.com/tonikelope/coronapoker/issues/7 is addressed
diff --git a/games/Makefile b/games/Makefile
index 5855c139832c..963274b9958b 100644
--- a/games/Makefile
+++ b/games/Makefile
@@ -161,7 +161,6 @@
     SUBDIR += connectagram
     SUBDIR += connectfive
     SUBDIR += construo
-    SUBDIR += coronapoker
     SUBDIR += corsix-th
     SUBDIR += cosmosmash
     SUBDIR += cowsay
diff --git a/games/coronapoker/Makefile b/games/coronapoker/Makefile
deleted file mode 100644
index c740e2db8ff4..000000000000
--- a/games/coronapoker/Makefile
+++ /dev/null
@@ -1,64 +0,0 @@
-PORTNAME=	coronapoker
-DISTVERSIONPREFIX=	v
-DISTVERSION=	20.28
-CATEGORIES=	games java
-
-MAINTAINER=	yuri@FreeBSD.org
-COMMENT=	Texas Holdem poker game
-WWW=		https://tonikelope.github.io/coronapoker/ \
-		https://github.com/tonikelope/coronapoker
-
-LICENSE=	GPLv3
-LICENSE_FILE=	${WRKSRC}/LICENSE
-
-BUILD_DEPENDS=	maven>0:devel/maven
-
-USES=		java
-JAVA_VERSION=	11+
-USE_GITHUB=	yes
-GH_ACCOUNT=	tonikelope
-
-NO_ARCH=	yes
-
-SUB_FILES=	${PORTNAME}
-SUB_LIST=	JAVA=${JAVA} PORTNAME=${PORTNAME} PORTVERSION=${PORTVERSION}
-
-PLIST_FILES=	bin/${PORTNAME} \
-		${JAVAJARDIR}/${PORTNAME}-${PORTVERSION}-jar-with-dependencies.jar
-
-# to rebuild the deps archive:
-#   1. set DEV_UPDATE_MODE=yes
-#   2. make makesum build
-#   3. upload the *-deps archive
-#   4. set DEV_UPDATE_MODE=no
-#   5. make clean makesum
-
-DEV_UPDATE_MODE=	no
-
-.if (${DEV_UPDATE_MODE} == "yes")
-MVN_ARGS=
-.else
-MASTER_SITES+=	LOCAL/yuri/:deps
-DISTFILES+=	${PORTNAME}-${DISTVERSION}-deps${EXTRACT_SUFX}:deps
-MVN_ARGS=	--offline
-.endif
-
-do-build:
-	@cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} \
-		JAVA_HOME=${JAVA_HOME} ${LOCALBASE}/bin/mvn ${MVN_ARGS} \
-		-fae install \
-		-Dmaven.test.skip=true \
-		-Duser.home=${WRKDIR} \
-		package
-
-do-install:
-	${INSTALL_SCRIPT} ${WRKDIR}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
-	${INSTALL_DATA} ${WRKSRC}/target/CoronaPoker-*-jar-with-dependencies.jar ${STAGEDIR}${JAVAJARDIR}/${PORTNAME}-${PORTVERSION}-jar-with-dependencies.jar
-
-.if (${DEV_UPDATE_MODE} == "yes")
-post-build:
-	@cd ${WRKDIR} && ${TAR} czf ${DISTDIR}/${PORTNAME}-${DISTVERSION}-deps${EXTRACT_SUFX} .m2
-	@${ECHO} "(!!!) Please upload the deps archive: ${DISTDIR}/${PORTNAME}-${DISTVERSION}-deps${EXTRACT_SUFX}"
-.endif
-
-.include <bsd.port.mk>
diff --git a/games/coronapoker/distinfo b/games/coronapoker/distinfo
deleted file mode 100644
index 61d610367431..000000000000
--- a/games/coronapoker/distinfo
+++ /dev/null
@@ -1,5 +0,0 @@
-TIMESTAMP = 1777020355
-SHA256 (coronapoker-20.28-deps.tar.gz) = 949de6838af398109813d5ce7f9e6b86a18a4b2355aa810d20eeb1ddaa738ca0
-SIZE (coronapoker-20.28-deps.tar.gz) = 30402541
-SHA256 (tonikelope-coronapoker-v20.28_GH0.tar.gz) = 9f527058639abb3f342b34abcd068418a2d85f017bc4e90a841457e1b9434d0b
-SIZE (tonikelope-coronapoker-v20.28_GH0.tar.gz) = 312524801
diff --git a/games/coronapoker/files/coronapoker.in b/games/coronapoker/files/coronapoker.in
deleted file mode 100644
index 18c1f4238265..000000000000
--- a/games/coronapoker/files/coronapoker.in
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-export LC_ALL=en_US.UTF-8
-
-%%JAVA%% -jar %%JAVAJARDIR%%/%%PORTNAME%%-%%PORTVERSION%%-jar-with-dependencies.jar "$@"
diff --git a/games/coronapoker/files/patch-src_main_java_com_tonikelope_coronapoker_Panoptes.java b/games/coronapoker/files/patch-src_main_java_com_tonikelope_coronapoker_Panoptes.java
deleted file mode 100644
index 557b3ab59fca..000000000000
--- a/games/coronapoker/files/patch-src_main_java_com_tonikelope_coronapoker_Panoptes.java
+++ /dev/null
@@ -1,546 +0,0 @@
--- Disable binary downloads and native library loading for GPL compliance
--- 
--- This port is licensed under GPLv3, but the Panoptes native library is:
--- 1. Closed-source (violates GPL requirement for source availability)
--- 2. Downloaded from GitHub at runtime (security risk from untrusted binaries)
--- 3. Not available for FreeBSD
---
--- This patch:
--- - Disables verifyAndDownloadNativeLib() to prevent binary downloads
--- - Disables WAKEUP_PANOPTES() to prevent System.loadLibrary() call
--- - Replaces all 40+ native JNI method declarations with safe no-op stubs
---   that return sensible defaults (empty arrays, false, 0, etc.)
--- - Allows the game to run in pure-Java mode with reduced functionality
---
--- See: https://github.com/tonikelope/coronapoker/issues/7
-
--- Disable binary downloads and native library loading for GPL compliance
--- 
--- This port is licensed under GPLv3, but the Panoptes native library is:
--- 1. Closed-source (violates GPL requirement for source availability)
--- 2. Downloaded from GitHub at runtime (security risk from untrusted binaries)
--- 3. Not available for FreeBSD
---
--- This patch:
--- - Disables verifyAndDownloadNativeLib() to prevent binary downloads
--- - Disables WAKEUP_PANOPTES() to prevent System.loadLibrary() call
--- - Replaces all 40+ native JNI method declarations with safe no-op stubs
---   that return sensible defaults (empty arrays, false, 0, etc.)
--- - Allows the game to run in pure-Java mode with reduced functionality
---
--- See: https://github.com/tonikelope/coronapoker/issues/7
-
--- Disable binary downloads and native library loading for GPL compliance
--- 
--- This port is licensed under GPLv3, but the Panoptes native library is:
--- 1. Closed-source (violates GPL requirement for source availability)
--- 2. Downloaded from GitHub at runtime (security risk from untrusted binaries)
--- 3. Not available for FreeBSD
---
--- This patch:
--- - Disables verifyAndDownloadNativeLib() to prevent binary downloads
--- - Disables WAKEUP_PANOPTES() to prevent library loading
--- - Replaces all 40+ native JNI method declarations with safe no-op stubs
---   that return sensible defaults (empty arrays, false, 0, etc.)
--- - Allows the game to run in pure-Java mode with reduced functionality
---
--- See: https://github.com/tonikelope/coronapoker/issues/7
-
--- Disable binary downloads and native library loading for GPL compliance
--- 
--- This port is licensed under GPLv3, but the Panoptes native library is:
--- 1. Closed-source (violates GPL requirement for source availability)
--- 2. Downloaded from GitHub at runtime (security risk from untrusted binaries)
--- 3. Not available for FreeBSD
---
--- This patch disables the download and native library mechanisms entirely,
--- allowing the game to run in pure-Java mode with reduced functionality.
---
--- See: https://github.com/tonikelope/coronapoker/issues/7
-
---- src/main/java/com/tonikelope/coronapoker/Panoptes.java.orig	2026-04-25 16:30:30 UTC
-+++ src/main/java/com/tonikelope/coronapoker/Panoptes.java
-@@ -72,95 +72,8 @@ public class Panoptes {
-      * tampered with.
-      */
-     private static void verifyAndDownloadNativeLib(String targetDir) {
--        String os = System.getProperty("os.name").toLowerCase();
--        String libName;
--
--        // 1. Resolve OS-specific binary extension
--        if (os.contains("win")) {
--            libName = "panoptes.dll";
--        } else if (os.contains("mac")) {
--            libName = "libpanoptes.dylib";
--        } else {
--            libName = "libpanoptes.so";
--        }
--
--        File localLib = new File(targetDir + File.separator + libName);
--        File localKey = new File(targetDir + File.separator + MANIFEST_KEY);
--
--        try {
--            LOGGER.log(Level.INFO, "[PANOPTES] Checking engine integrity...");
--
--            // 2. Fetch official manifest from remote repository
--            URL manifestUrl = new URL(REPO_RAW_URL + CHECKSUM_FILE);
--            String manifestContent = downloadText(manifestUrl);
--
--            String expectedLibHash = parseHashFromManifest(manifestContent, libName);
--            String expectedKeyHash = parseHashFromManifest(manifestContent, MANIFEST_KEY);
--
--            if (expectedLibHash == null || expectedKeyHash == null) {
--                throw new Exception("Target hashes not found in the remote manifest.");
--            }
--
--            boolean needsLibUpdate = false;
--            boolean needsKeyUpdate = false;
--
--            // 3. Verify Library Integrity
--            if (!localLib.exists()) {
--                LOGGER.log(Level.INFO, "[PANOPTES] Local library not found. Forcing download...");
--                needsLibUpdate = true;
--            } else {
--                String localHash = calculateFileSHA1(localLib);
--                if (!expectedLibHash.equalsIgnoreCase(localHash)) {
--                    LOGGER.log(Level.SEVERE, "[PANOPTES-SHIELD] Library hash mismatch! Local: {0} | Remote: {1}", new Object[]{localHash, expectedLibHash});
--                    needsLibUpdate = true;
--                }
--            }
--
--            // 4. Verify Consensus Key Integrity
--            if (!localKey.exists()) {
--                LOGGER.log(Level.INFO, "[PANOPTES] Consensus key not found. Forcing download...");
--                needsKeyUpdate = true;
--            } else {
--                String localHash = calculateFileSHA1(localKey);
--                if (!expectedKeyHash.equalsIgnoreCase(localHash)) {
--                    LOGGER.log(Level.SEVERE, "[PANOPTES-SHIELD] Key hash mismatch! Local: {0} | Remote: {1}", new Object[]{localHash, expectedKeyHash});
--                    needsKeyUpdate = true;
--                }
--            }
--
--            // 5. Download and Patch if necessary
--            if (needsLibUpdate) {
--                LOGGER.log(Level.INFO, "[PANOPTES] Downloading official binary from repository...");
--                downloadBinary(new URL(REPO_RAW_URL + libName), localLib);
--
--                // macOS requires explicit code signing and extended attribute clearing to allow execution
--                if (os.contains("mac")) {
--                    try {
--                        LOGGER.log(Level.INFO, "[PANOPTES] Applying macOS security patches...");
--                        new ProcessBuilder("xattr", "-cr", localLib.getAbsolutePath()).start().waitFor();
--                        new ProcessBuilder("codesign", "--force", "-s", "-", localLib.getAbsolutePath()).start().waitFor();
--                        LOGGER.log(Level.INFO, "[PANOPTES] macOS patches applied successfully.");
--                    } catch (Exception macEx) {
--                        LOGGER.log(Level.WARNING, "[PANOPTES] Failed to apply macOS patch: {0}", macEx.getMessage());
--                    }
--                }
--            }
--
--            if (needsKeyUpdate) {
--                LOGGER.log(Level.INFO, "[PANOPTES] Downloading official consensus key...");
--                downloadBinary(new URL(REPO_RAW_URL + MANIFEST_KEY), localKey);
--            }
--
--            if (needsLibUpdate || needsKeyUpdate) {
--                Helpers.cleanAllOldTempCrupierFiles();
--                LOGGER.log(Level.INFO, "[PANOPTES] UPDATE COMPLETED");
--            } else {
--                LOGGER.log(Level.INFO, "[PANOPTES] Integrity verified. Native engine is up to date.");
--            }
--
--        } catch (Exception e) {
--            LOGGER.log(Level.SEVERE, "[PANOPTES] CRITICAL ERROR: Unable to verify native engine integrity.", e);
--        }
-+        LOGGER.log(Level.WARNING, "[PANOPTES] Binary downloads disabled for GPL compliance");
-+        LOGGER.log(Level.INFO, "[PANOPTES] UPDATE COMPLETED");
-     }
- 
-     /**
-@@ -168,20 +81,7 @@ public class Panoptes {
-      * and securely imports the cryptographic manifest.
-      */
-     public static void WAKEUP_PANOPTES() {
--        verifyAndDownloadNativeLib(PANOPTES_DIR);
--        try {
--            System.loadLibrary("panoptes");
--            File keyFile = new File(PANOPTES_DIR + File.separator + "panoptes_key.bin");
--            if (keyFile.exists()) {
--                byte[] manifestBytes = java.nio.file.Files.readAllBytes(keyFile.toPath());
--                getInstance().utilsLoadManifest(manifestBytes);
--            } else {
--                throw new RuntimeException("panoptes_key.bin not found after download sequence.");
--            }
--        } catch (Throwable e) {
--            LOGGER.log(Level.SEVERE, "[PANOPTES] Initialization failed. Aborting execution.", e);
--            System.exit(1);
--        }
-+        LOGGER.log(Level.WARNING, "[PANOPTES] Native engine disabled for GPL compliance");
-     }
- 
-     private Panoptes() {
-@@ -204,7 +104,7 @@ public class Panoptes {
-      * @return An 80-byte array: [0-31: Public Key] + [32-79: Encrypted Private
-      * Key Blob].
-      */
--    public native byte[] sessionInitialize();
-+    public byte[] sessionInitialize() { return new byte[0]; }
- 
-     /**
-      * Loads a previously generated encrypted session into the Vault.
-@@ -213,7 +113,7 @@ public class Panoptes {
-      * @return true if successfully loaded and verified; false if MAC validation
-      * fails.
-      */
--    public native boolean sessionLoad(byte[] sessionBlob);
-+    public boolean sessionLoad(byte[] sessionBlob) { return false; }
- 
-     /**
-      * Executes a secure "Lobotomy" on the Vault, wiping session keys and
-@@ -222,7 +122,7 @@ public class Panoptes {
-      * @return A variable-length Cryptographic Testament (80 + N*16 bytes) to be
-      * distributed to peers upon legitimate exit. Includes the N-MAC swarm.
-      */
--    public native byte[] sessionGenerateExitTestament();
-+    public byte[] sessionGenerateExitTestament() { return new byte[0]; }
- 
-     /**
-      * Exports the local entropy seed state from the Vault for persistent
-@@ -230,7 +130,7 @@ public class Panoptes {
-      *
-      * @return Exactly 48 bytes representing the encrypted local entropy blob.
-      */
--    public native byte[] stateExportLocalEntropy();
-+    public byte[] stateExportLocalEntropy() { return new byte[0]; }
- 
-     /**
-      * Imports and restores the local entropy seed state into the Vault.
-@@ -239,7 +139,7 @@ public class Panoptes {
-      * @return true if successfully loaded and verified; false if MAC validation
-      * fails.
-      */
--    public native boolean stateImportLocalEntropy(byte[] entropyBlob);
-+    public boolean stateImportLocalEntropy(byte[] entropyBlob) { return false; }
- 
-     // --- NETWORK ATTESTATION DOMAIN (LAYER 1: SERVER ↔ CLIENT) ---
-     /**
-@@ -249,7 +149,7 @@ public class Panoptes {
-      * @param port Target network port.
-      * @return A 58-byte encrypted challenge payload.
-      */
--    public native byte[] attestationGenerateChallenge(byte[] sessionKey, short port);
-+    public byte[] attestationGenerateChallenge(byte[] sessionKey, short port) { return new byte[0]; }
- 
-     /**
-      * Solves an incoming attestation challenge, executing Ring-0 system
-@@ -258,7 +158,7 @@ public class Panoptes {
-      * @param encryptedChallenge Exactly 58 bytes.
-      * @return A 73-byte encrypted response containing the system audit MAC.
-      */
--    public native byte[] attestationSolveChallenge(byte[] encryptedChallenge);
-+    public byte[] attestationSolveChallenge(byte[] encryptedChallenge) { return new byte[0]; }
- 
-     /**
-      * Verifies the solved attestation response from a remote peer.
-@@ -268,7 +168,7 @@ public class Panoptes {
-      * @param encryptedResponse Exactly 73 bytes.
-      * @return 0 (FAILED), 1 (CLEAN), or 2 (VM_DETECTED).
-      */
--    public native int attestationVerifyResponse(byte[] sessionKey, byte[] encryptedResponse);
-+    public int attestationVerifyResponse(byte[] sessionKey, byte[] encryptedResponse) { return 0; }
- 
-     // --- NETWORK ATTESTATION DOMAIN (LAYER 2: P2P MESH) ---
-     /**
-@@ -278,7 +178,7 @@ public class Panoptes {
-      * @param targetPubKey Exactly 32 bytes (Opponent's Public Key).
-      * @return An 80-byte encrypted payload containing the KEM Nonce.
-      */
--    public native byte[] p2pGenerateChallenge(byte[] targetPubKey);
-+    public byte[] p2pGenerateChallenge(byte[] targetPubKey) { return new byte[0]; }
- 
-     /**
-      * Solves an incoming P2P challenge by mathematically injecting the local
-@@ -290,7 +190,7 @@ public class Panoptes {
-      * @param senderPubKey Exactly 32 bytes (The challenger's Public Key).
-      * @return A 17-byte encrypted response (16 byte MAC + 1 byte VM Flag).
-      */
--    public native byte[] p2pSolveChallenge(byte[] encryptedChallenge, byte[] senderPubKey);
-+    public byte[] p2pSolveChallenge(byte[] encryptedChallenge, byte[] senderPubKey) { return new byte[0]; }
- 
-     /**
-      * Verifies a solved P2P response from an opponent. If valid, the opponent
-@@ -303,7 +203,7 @@ public class Panoptes {
-      * @param encryptedResponse Exactly 17 bytes (The opponent's response).
-      * @return true if clean; false if cheating, tampered, or desynchronized.
-      */
--    public native boolean p2pVerifyResponse(byte[] targetPubKey, byte[] originalNonce, byte[] encryptedResponse);
-+    public boolean p2pVerifyResponse(byte[] targetPubKey, byte[] originalNonce, byte[] encryptedResponse) { return false; }
- 
-     /**
-      * Solves an incoming P2P challenge ON BEHALF OF A BOT. The server acts as a
-@@ -315,7 +215,7 @@ public class Panoptes {
-      * @param botPrivKey Exactly 32 bytes (The Bot's Private Key).
-      * @return A 17-byte encrypted response.
-      */
--    public native byte[] p2pSolveBotChallenge(byte[] encryptedChallenge, byte[] senderPubKey, byte[] botPrivKey);
-+    public byte[] p2pSolveBotChallenge(byte[] encryptedChallenge, byte[] senderPubKey, byte[] botPrivKey) { return new byte[0]; }
- 
-     // --- UTILITIES & CRYPTO HELPERS ---
-     /**
-@@ -324,7 +224,7 @@ public class Panoptes {
-      *
-      * @param manifest Exactly 48 bytes containing expected DLL/SO/DYLIB hashes.
-      */
--    public native void utilsLoadManifest(byte[] manifest);
-+    public void utilsLoadManifest(byte[] manifest) {}
- 
-     /**
-      * Derives an X25519 Public Key from a raw Private Key.
-@@ -332,7 +232,7 @@ public class Panoptes {
-      * @param privateKey Exactly 32 bytes.
-      * @return Exactly 32 bytes (Public Key).
-      */
--    public native byte[] utilsGetPublicKey(byte[] privateKey);
-+    public byte[] utilsGetPublicKey(byte[] privateKey) { return new byte[0]; }
- 
-     /**
-      * Performs a deterministic Fisher-Yates shuffle on a standard 52-card deck.
-@@ -340,7 +240,7 @@ public class Panoptes {
-      * @param seed Exactly 32 bytes (Master Seed).
-      * @return Exactly 52 bytes representing the shuffled deck (values 0-51).
-      */
--    public native byte[] utilsShuffleDeck(byte[] seed);
-+    public byte[] utilsShuffleDeck(byte[] seed) { return new byte[0]; }
- 
-     /**
-      * PHASE 1: Executes a local forensic audit of a completed hand.
-@@ -352,7 +252,7 @@ public class Panoptes {
-      * @return A variable length array: [0-X: Dynamic Swarm AEAD Receipt] +
-      * [Last Byte: Boolean 1=OK, 0=FAILED].
-      */
--    public native byte[] utilsVerifyHandHistory(byte[] dealPacket, byte[] masterKey, int myPos);
-+    public byte[] utilsVerifyHandHistory(byte[] dealPacket, byte[] masterKey, int myPos) { return new byte[0]; }
- 
-     /**
-      * PHASE 2: Executes global table consensus verification. Absorbs all P2P
-@@ -365,7 +265,7 @@ public class Panoptes {
-      * @return true if consensus is mathematically sound; false if
-      * spoofing/desync detected.
-      */
--    public native boolean utilsVerifyHandConsensus(byte[] dealPacket, byte[][] allReceipts);
-+    public boolean utilsVerifyHandConsensus(byte[] dealPacket, byte[][] allReceipts) { return false; }
- 
-     /**
-      * Verifies a Poly1305 Chaos MAC signature.
-@@ -374,7 +274,7 @@ public class Panoptes {
-      * @param mac Exactly 16 bytes.
-      * @return true if the signature is valid; false otherwise.
-      */
--    public native boolean utilsVerifyChaosMAC(byte[] data, byte[] mac);
-+    public boolean utilsVerifyChaosMAC(byte[] data, byte[] mac) { return false; }
- 
-     /**
-      * Decrypts a Key Encapsulation Mechanism (KEM) envelope directed to a bot.
-@@ -384,7 +284,7 @@ public class Panoptes {
-      * @param enc Exactly 114 bytes (Encrypted payload).
-      * @return Exactly 98 bytes (Decrypted clear payload), or null on failure.
-      */
--    public native byte[] utilsDecryptBotEnvelope(byte[] priv, byte[] epub, byte[] enc);
-+    public byte[] utilsDecryptBotEnvelope(byte[] priv, byte[] epub, byte[] enc) { return new byte[0]; }
- 
-     /**
-      * [V134 ZERO-DAY FIX] Generates a Sponge hash commitment for a given seed.
-@@ -392,7 +292,7 @@ public class Panoptes {
-      * @param seed Exactly 32 bytes.
-      * @return Exactly 32 bytes representing the commitment hash.
-      */
--    public native byte[] utilsGenerateCommitment(byte[] seed);
-+    public byte[] utilsGenerateCommitment(byte[] seed) { return new byte[0]; }
- 
-     // --- CONSENSUS & GAME STATE DOMAIN ---
-     /**
-@@ -402,14 +302,14 @@ public class Panoptes {
-      * @param hashesFlat Flattened array of all player commitments (numPlayers *
-      * 32 bytes).
-      */
--    public native void stateRegisterCommitments(byte[] hashesFlat);
-+    public void stateRegisterCommitments(byte[] hashesFlat) {}
- 
-     /**
-      * Initializes a new hand, generating a random 16-byte HAND_ID.
-      *
-      * @return Exactly 16 bytes (HAND_ID).
-      */
--    public native byte[] stateInitializeHand();
-+    public byte[] stateInitializeHand() { return new byte[0]; }
- 
-     /**
-      * Generates the immutable genesis Megapacket for a new hand (Server/Host
-@@ -422,7 +322,7 @@ public class Panoptes {
-      * (numPlayers * 32 bytes).
-      * @return The variable-length Megapacket byte array.
-      */
--    public native byte[] stateGenerateMegapacket(byte[] playerSeedsFlat, int numPlayers, byte[] playerPubKeysFlat);
-+    public byte[] stateGenerateMegapacket(byte[] playerSeedsFlat, int numPlayers, byte[] playerPubKeysFlat) { return new byte[0]; }
- 
-     /**
-      * Ingests the Megapacket into the client Vault, verifying structure and
-@@ -432,14 +332,14 @@ public class Panoptes {
-      * @param myPos The client's physical seat index.
-      * @return true on successful ingestion; false on tampering or OOB errors.
-      */
--    public native boolean stateIngestMegapacket(byte[] megapacket, int myPos);
-+    public boolean stateIngestMegapacket(byte[] megapacket, int myPos) { return false; }
- 
-     /**
-      * Retrieves the decrypted pocket cards for the local player.
-      *
-      * @return Exactly 2 bytes representing card IDs (0-51).
-      */
--    public native byte[] stateGetLocalPocketCards();
-+    public byte[] stateGetLocalPocketCards() { return new byte[0]; }
- 
-     /**
-      * Retrieves the local fragment of the Master Shuffle Key. WARNING: Calling
-@@ -447,28 +347,28 @@ public class Panoptes {
-      *
-      * @return Exactly 32 bytes.
-      */
--    public native byte[] stateGetShuffleKeyShare();
-+    public byte[] stateGetShuffleKeyShare() { return new byte[0]; }
- 
-     /**
-      * Retrieves the cryptographic token required to unlock the Flop.
-      *
-      * @return Exactly 16 bytes.
-      */
--    public native byte[] stateGetFlopToken();
-+    public byte[] stateGetFlopToken() { return new byte[0]; }
- 
-     /**
-      * Retrieves the cryptographic token required to unlock the Turn.
-      *
-      * @return Exactly 16 bytes.
-      */
--    public native byte[] stateGetTurnToken();
-+    public byte[] stateGetTurnToken() { return new byte[0]; }
- 
-     /**
-      * Retrieves the cryptographic token required to unlock the River.
-      *
-      * @return Exactly 16 bytes.
-      */
--    public native byte[] stateGetRiverToken();
-+    public byte[] stateGetRiverToken() { return new byte[0]; }
- 
-     /**
-      * Evolves the community cards by applying the aggregated consensus key.
-@@ -478,7 +378,7 @@ public class Panoptes {
-      * tokens).
-      * @return 3 bytes for Flop, 1 byte for Turn/River.
-      */
--    public native byte[] stateEvolveStreet(int nextStreet, byte[] consensusKey);
-+    public byte[] stateEvolveStreet(int nextStreet, byte[] consensusKey) { return new byte[0]; }
- 
-     // --- ACTION CHAIN DOMAIN ---
-     /**
-@@ -489,7 +389,7 @@ public class Panoptes {
-      * @return Variable length (68 + N*16 bytes) containing the signed action
-      * packet.
-      */
--    public native byte[] chainCommitLocalAction(int type, float amount);
-+    public byte[] chainCommitLocalAction(int type, float amount) { return new byte[0]; }
- 
-     /**
-      * Commits and signs an action on behalf of a server-side bot.
-@@ -500,7 +400,7 @@ public class Panoptes {
-      * @return Variable length (68 + N*16 bytes) containing the signed action
-      * packet.
-      */
--    public native byte[] chainCommitBotAction(int type, float amount, byte[] botPrivKey);
-+    public byte[] chainCommitBotAction(int type, float amount, byte[] botPrivKey) { return new byte[0]; }
- 
-     /**
-      * Verifies and absorbs a remote action packet into the local Sponge state.
-@@ -509,7 +409,7 @@ public class Panoptes {
-      * @return true if signature and sequence are valid; false on
-      * desynchronization or tampering.
-      */
--    public native boolean chainVerifyRemoteAction(byte[] actionPacket);
-+    public boolean chainVerifyRemoteAction(byte[] actionPacket) { return false; }
- 
-     /**
-      * Closes the state machine and returns the final AEAD receipt for P2P
-@@ -517,7 +417,7 @@ public class Panoptes {
-      *
-      * @return Variable length (64 + N*16 bytes) Final State AEAD Receipt.
-      */
--    public native byte[] chainCloseStateAndGetReceipt();
-+    public byte[] chainCloseStateAndGetReceipt() { return new byte[0]; }
- 
-     /**
-      * Closes the state machine and returns the final AEAD receipt on behalf of
-@@ -526,7 +426,7 @@ public class Panoptes {
-      * @param botPrivKey Exactly 32 bytes (Bot's private key).
-      * @return Variable length (64 + N*16 bytes) Final State AEAD Receipt.
-      */
--    public native byte[] chainCloseBotStateAndGetReceipt(byte[] botPrivKey);
-+    public byte[] chainCloseBotStateAndGetReceipt(byte[] botPrivKey) { return new byte[0]; }
- 
-     /**
-      * Generates or retrieves the 32-byte local entropy seed for the current
-@@ -536,7 +436,7 @@ public class Panoptes {
-      * null).
-      * @return Exactly 32 bytes.
-      */
--    public native byte[] stateGenerateLocalSeed(byte[] external_entropy);
-+    public byte[] stateGenerateLocalSeed(byte[] external_entropy) { return new byte[0]; }
- 
-     // --- TELEMETRY & RADAR DOMAIN ---
-     /**
-@@ -548,7 +448,7 @@ public class Panoptes {
-      * @return A variable-length encrypted KEM envelope containing the radar
-      * data.
-      */
--    public native byte[] telemetryGetSystemRadar(byte[] targetPubKey);
-+    public byte[] telemetryGetSystemRadar(byte[] targetPubKey) { return new byte[0]; }
- 
-     /**
-      * Decrypts an incoming system radar telemetry packet.
-@@ -557,7 +457,7 @@ public class Panoptes {
-      * @return The plaintext UTF-8 string bytes of the radar report, or null if
-      * tampered.
-      */
--    public native byte[] telemetryDecryptRadarData(byte[] encryptedRadarPacket);
-+    public byte[] telemetryDecryptRadarData(byte[] encryptedRadarPacket) { return new byte[0]; }
- 
-     /**
-      * Captures a visual context representation of the host's screen.
-@@ -567,7 +467,7 @@ public class Panoptes {
-      * @return A variable-length byte array representing a valid JPEG image, or
-      * null on failure/cooldown.
-      */
--    public native byte[] telemetryCaptureScreenContext(int mode);
-+    public byte[] telemetryCaptureScreenContext(int mode) { return new byte[0]; }
- 
-     /**
-      * Diagnostics: Retrieves the path to the JAR file currently locked by the C
-@@ -575,7 +475,7 @@ public class Panoptes {
-      *
-      * @return String representation of the absolute file path.
-      */
--    public native String telemetryGetDiagnosticJarPathC();
-+    public String telemetryGetDiagnosticJarPathC() { return ""; }
- 
-     // =========================================================================
-     // JAVA COMPATIBILITY WRAPPERS
-@@ -703,7 +603,7 @@ public class Panoptes {
-         return telemetryCaptureScreenContext(mode);
-     }
- 
--    public native int utilsAreHashesReady();
-+    public int utilsAreHashesReady() { return 0; }
- 
-     // =========================================================================
-     // HASHING UTILS
diff --git a/games/coronapoker/pkg-descr b/games/coronapoker/pkg-descr
deleted file mode 100644
index f41a31b82709..000000000000
--- a/games/coronapoker/pkg-descr
+++ /dev/null
@@ -1,5 +0,0 @@
-Texas Holdem poker game written in Java.
-
-CoronaPoker is a free Texas Holdem poker game with a modern interface and
-various features including online play against other players, customizable
-tables, and multiple game modes.
diff --git a/games/coronapoker/pkg-message b/games/coronapoker/pkg-message
deleted file mode 100644
index 605eced119bf..000000000000
--- a/games/coronapoker/pkg-message
+++ /dev/null
@@ -1,54 +0,0 @@
-[
-{ type: install
-  message: <<EOM
-You installed coronapoker: Poker game implemented in Java.
-
-================================================================
-
-  GPL COMPLIANCE AND SECURITY NOTICE
-  
-  This port has been patched for GPL compliance and security.
-
-  ISSUE: Binary Downloads Disabled
-  ================================
-  CoronaPoker includes Panoptes, a closed-source cryptographic
-  anti-cheat engine, which this port previously attempted to:
-  
-    • Download at runtime from GitHub (untrusted binary source)
-    • Cache locally to ~/.coronapoker/Panoptes/
-    • Load via JNI as native code
-
-  This violates the GPLv3 license under which CoronaPoker is
-  licensed, as it requires source code availability.
-
-  APPLIED FIX
-  ===========
-  This port has been patched to:
-  
-    • DISABLE remote binary downloads
-    • PREVENT native library loading on all platforms
-    • RUN in pure-Java mode without cryptographic anti-cheat
-
-  FUNCTIONAL LIMITATIONS
-  ======================
-  Without the Panoptes engine, the game will:
-  
-    • Have NO tamper detection
-    • Have NO action blockchain verification
-    • Have NO post-game auditing capabilities
-    • Rely solely on Java-level game logic enforcement
-
-  SECURITY IMPLICATIONS
-  ======================
-  • No untrusted binaries will be downloaded
-  • No closed-source libraries will be executed
-  • Game integrity depends on player honesty
-  • Suitable for casual/trusted gameplay only
-
-  For more information about this issue:
-  https://github.com/tonikelope/coronapoker/issues/7
-
-================================================================
-EOM
-}
-]