Add custom QZ Tray fork with pairing key authentication

- Custom fork of QZ Tray 2.2.x with certificate validation bypassed
- Implemented pairing key (HMAC) authentication as replacement
- Modified files: PrintSocketClient.java (certificate check disabled)
- New files: PairingAuth.java, PairingConfigDialog.java
- Excluded build artifacts (out/, lib/javafx*) from repository
- Library JARs included for dependency management
This commit is contained in:
2025-10-02 02:27:45 +03:00
parent 755400a269
commit c7266c32ee
444 changed files with 63195 additions and 1 deletions

View File

@@ -0,0 +1,100 @@
package qz.communication;
import org.apache.commons.lang3.ArrayUtils;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import qz.utils.DeviceUtilities;
import qz.utils.NetworkUtilities;
import qz.ws.SocketConnection;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.nio.charset.Charset;
import java.util.ArrayList;
public class SocketIO implements DeviceListener {
private static final Logger log = LogManager.getLogger(SocketIO.class);
private String host;
private int port;
private Charset encoding;
private Socket socket;
private DataOutputStream dataOut;
private DataInputStream dataIn;
private SocketConnection websocket;
public SocketIO(String host, int port, Charset encoding, SocketConnection websocket) {
this.host = host;
this.port = port;
this.encoding = encoding;
this.websocket = websocket;
}
public boolean open() throws IOException {
socket = new Socket(host, port);
socket.setSoTimeout(NetworkUtilities.SOCKET_TIMEOUT);
dataOut = new DataOutputStream(socket.getOutputStream());
dataIn = new DataInputStream(socket.getInputStream());
return socket.isConnected();
}
public boolean isOpen() {
return socket.isConnected();
}
public void sendData(JSONObject params) throws JSONException, IOException {
log.debug("Sending data over [{}:{}]", host, port);
dataOut.write(DeviceUtilities.getDataBytes(params, encoding));
dataOut.flush();
}
public String processSocketResponse() throws IOException {
byte[] response = new byte[1024];
ArrayList<Byte> fullResponse = new ArrayList<>();
do {
int size = dataIn.read(response);
for(int i = 0; i < size; i++) {
fullResponse.add(response[i]);
}
}
while(dataIn.available() > 0);
if(fullResponse.size() > 0) {
return new String(ArrayUtils.toPrimitive(fullResponse.toArray(new Byte[0])), encoding);
}
return null;
}
@Override
public void close() {
// Remove orphaned reference
websocket.removeNetworkSocket(String.format("%s:%s", host, port));
try {
dataOut.close();
} catch(IOException e) {
log.warn("Could not close socket output stream", e);
}
try {
socket.close();
} catch(IOException e) {
log.warn("Could not close socket", e);
}
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
}