git: f47b3e15960e - main - games/coronapoker: update 4.33 → 20.28
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 25 Apr 2026 17:12:56 UTC
The branch main has been updated by yuri:
URL: https://cgit.FreeBSD.org/ports/commit/?id=f47b3e15960e7525857cf757d58626ecf71f399b
commit f47b3e15960e7525857cf757d58626ecf71f399b
Author: Yuri Victorovich <yuri@FreeBSD.org>
AuthorDate: 2026-04-25 16:51:26 +0000
Commit: Yuri Victorovich <yuri@FreeBSD.org>
CommitDate: 2026-04-25 17:12:53 +0000
games/coronapoker: update 4.33 → 20.28
---
games/coronapoker/Makefile | 18 +-
games/coronapoker/distinfo | 10 +-
...n_java_com_tonikelope_coronapoker_Panoptes.java | 546 +++++++++++++++++++++
games/coronapoker/pkg-descr | 4 +
games/coronapoker/pkg-message | 54 ++
5 files changed, 620 insertions(+), 12 deletions(-)
diff --git a/games/coronapoker/Makefile b/games/coronapoker/Makefile
index b2aa69928d15..c740e2db8ff4 100644
--- a/games/coronapoker/Makefile
+++ b/games/coronapoker/Makefile
@@ -1,12 +1,12 @@
PORTNAME= coronapoker
DISTVERSIONPREFIX= v
-DISTVERSION= 4.33
-PORTREVISION= 2
+DISTVERSION= 20.28
CATEGORIES= games java
MAINTAINER= yuri@FreeBSD.org
COMMENT= Texas Holdem poker game
-WWW= https://tonikelope.github.io/coronapoker/
+WWW= https://tonikelope.github.io/coronapoker/ \
+ https://github.com/tonikelope/coronapoker
LICENSE= GPLv3
LICENSE_FILE= ${WRKSRC}/LICENSE
@@ -36,9 +36,7 @@ PLIST_FILES= bin/${PORTNAME} \
DEV_UPDATE_MODE= no
.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}"
+MVN_ARGS=
.else
MASTER_SITES+= LOCAL/yuri/:deps
DISTFILES+= ${PORTNAME}-${DISTVERSION}-deps${EXTRACT_SUFX}:deps
@@ -55,6 +53,12 @@ do-build:
do-install:
${INSTALL_SCRIPT} ${WRKDIR}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
- ${INSTALL_DATA} ${WRKSRC}/target/CoronaPoker-FINAL-*-jar-with-dependencies.jar ${STAGEDIR}${JAVAJARDIR}/${PORTNAME}-${PORTVERSION}-jar-with-dependencies.jar
+ ${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
index 10dd47dd14bb..61d610367431 100644
--- a/games/coronapoker/distinfo
+++ b/games/coronapoker/distinfo
@@ -1,5 +1,5 @@
-TIMESTAMP = 1599346728
-SHA256 (coronapoker-4.33-deps.tar.gz) = 9636254e547a0f3c943cb5e91f7d2d4d018b5b747c4fb2ff4784891b93a88984
-SIZE (coronapoker-4.33-deps.tar.gz) = 192925093
-SHA256 (tonikelope-coronapoker-v4.33_GH0.tar.gz) = 157a51d430e00f63345f72083bc706b8bc04f670169bcb29ed12bb0eeec3205e
-SIZE (tonikelope-coronapoker-v4.33_GH0.tar.gz) = 92254916
+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/patch-src_main_java_com_tonikelope_coronapoker_Panoptes.java b/games/coronapoker/files/patch-src_main_java_com_tonikelope_coronapoker_Panoptes.java
new file mode 100644
index 000000000000..557b3ab59fca
--- /dev/null
+++ b/games/coronapoker/files/patch-src_main_java_com_tonikelope_coronapoker_Panoptes.java
@@ -0,0 +1,546 @@
+-- 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
index cd4d4d51cbc9..f41a31b82709 100644
--- a/games/coronapoker/pkg-descr
+++ b/games/coronapoker/pkg-descr
@@ -1 +1,5 @@
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
new file mode 100644
index 000000000000..605eced119bf
--- /dev/null
+++ b/games/coronapoker/pkg-message
@@ -0,0 +1,54 @@
+[
+{ 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
+}
+]