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,130 @@
package qz.communication;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.codehaus.jettison.json.JSONObject;
import qz.utils.UsbUtilities;
public class DeviceOptions {
public enum DeviceMode {
HID,
USB,
UNKNOWN;
public static DeviceMode parse(String callName) {
if (callName != null) {
if (callName.startsWith("usb")) {
return USB;
} else if (callName.startsWith("hid")) {
return HID;
}
}
return UNKNOWN;
}
}
private DeviceMode deviceMode;
private Integer vendorId;
private Integer productId;
//usb specific
private Byte interfaceId;
private Byte endpoint;
private int interval;
private int responseSize;
//hid specific
private Integer usagePage;
private String serial;
public DeviceOptions(JSONObject parameters, DeviceMode deviceMode) {
this.deviceMode = deviceMode;
vendorId = UsbUtilities.hexToInt(parameters.optString("vendorId"));
productId = UsbUtilities.hexToInt(parameters.optString("productId"));
if (!parameters.isNull("interface")) {
interfaceId = UsbUtilities.hexToByte(parameters.optString("interface"));
}
if (!parameters.isNull("endpoint")) {
endpoint = UsbUtilities.hexToByte(parameters.optString("endpoint"));
} else if (!parameters.isNull("reportId")) {
endpoint = UsbUtilities.hexToByte(parameters.optString("reportId"));
}
interval = parameters.optInt("interval", 100);
responseSize = parameters.optInt("responseSize");
if (!parameters.isNull("usagePage")) {
usagePage = UsbUtilities.hexToInt(parameters.optString("usagePage"));
}
if (!parameters.isNull("serial")) {
serial = parameters.optString("serial", "");
serial = serial.isEmpty() ? null : serial;
}
}
public Integer getVendorId() {
return vendorId;
}
public Integer getProductId() {
return productId;
}
public Byte getInterfaceId() {
return interfaceId;
}
public Byte getEndpoint() {
return endpoint;
}
public int getInterval() {
return interval;
}
public int getResponseSize() {
return responseSize;
}
public Integer getUsagePage() {
return usagePage;
}
public String getSerial() {
return serial;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof DeviceOptions)) { return false; }
DeviceOptions that = (DeviceOptions)obj;
if (this.getVendorId().equals(that.getVendorId()) && this.getProductId().equals(that.getProductId())) {
if (deviceMode == DeviceMode.USB
&& (this.getInterfaceId() == null || that.getInterfaceId() == null || this.getInterfaceId().equals(that.getInterfaceId()))
&& (this.getEndpoint() == null || that.getEndpoint() == null || this.getEndpoint().equals(that.getEndpoint()))) {
return true;
}
if (deviceMode == DeviceMode.HID
&& (this.getUsagePage() == null || that.getUsagePage() == null || this.getUsagePage().equals(that.getUsagePage()))
&& (this.getSerial() == null || that.getSerial() == null || this.getSerial().equals(that.getSerial()))) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(deviceMode)
.append(vendorId)
.append(productId)
.toHashCode();
}
}