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:
100
tray/src/qz/communication/SocketIO.java
Normal file
100
tray/src/qz/communication/SocketIO.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user