84 lines
2.9 KiB
Java
84 lines
2.9 KiB
Java
package eu.siacs.conversations.xmpp.jingle;
|
|
|
|
import com.google.common.base.MoreObjects;
|
|
import com.google.common.base.Preconditions;
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
import eu.siacs.conversations.crypto.axolotl.AxolotlService;
|
|
|
|
public class OmemoVerification {
|
|
|
|
private final AtomicBoolean deviceIdWritten = new AtomicBoolean(false);
|
|
private final AtomicBoolean sessionFingerprintWritten = new AtomicBoolean(false);
|
|
private Integer deviceId;
|
|
private String sessionFingerprint;
|
|
|
|
public void setDeviceId(final Integer id) {
|
|
if (deviceIdWritten.compareAndSet(false, true)) {
|
|
this.deviceId = id;
|
|
return;
|
|
}
|
|
throw new IllegalStateException("Device Id has already been set");
|
|
}
|
|
|
|
public int getDeviceId() {
|
|
Preconditions.checkNotNull(this.deviceId, "Device ID is null");
|
|
return this.deviceId;
|
|
}
|
|
|
|
public boolean hasDeviceId() {
|
|
return this.deviceId != null;
|
|
}
|
|
|
|
public void setSessionFingerprint(final String fingerprint) {
|
|
Preconditions.checkNotNull(fingerprint, "Session fingerprint must not be null");
|
|
if (sessionFingerprintWritten.compareAndSet(false, true)) {
|
|
this.sessionFingerprint = fingerprint;
|
|
return;
|
|
}
|
|
throw new IllegalStateException("Session fingerprint has already been set");
|
|
}
|
|
|
|
public String getFingerprint() {
|
|
return this.sessionFingerprint;
|
|
}
|
|
|
|
public void setOrEnsureEqual(AxolotlService.OmemoVerifiedPayload<?> omemoVerifiedPayload) {
|
|
setOrEnsureEqual(omemoVerifiedPayload.getDeviceId(), omemoVerifiedPayload.getFingerprint());
|
|
}
|
|
|
|
public void setOrEnsureEqual(final int deviceId, final String sessionFingerprint) {
|
|
Preconditions.checkNotNull(sessionFingerprint, "Session fingerprint must not be null");
|
|
if (this.deviceIdWritten.get() || this.sessionFingerprintWritten.get()) {
|
|
if (this.sessionFingerprint == null) {
|
|
throw new IllegalStateException("No session fingerprint has been previously provided");
|
|
}
|
|
if (!sessionFingerprint.equals(this.sessionFingerprint)) {
|
|
throw new IllegalStateException("Session Fingerprints did not match");
|
|
}
|
|
if (this.deviceId == null) {
|
|
throw new IllegalStateException("No Device Id has been previously provided");
|
|
}
|
|
if (this.deviceId != deviceId) {
|
|
throw new IllegalStateException("Device Ids did not match");
|
|
}
|
|
} else {
|
|
this.setSessionFingerprint(sessionFingerprint);
|
|
this.setDeviceId(deviceId);
|
|
}
|
|
}
|
|
|
|
public boolean hasFingerprint() {
|
|
return this.sessionFingerprint != null;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return MoreObjects.toStringHelper(this)
|
|
.add("deviceId", deviceId)
|
|
.add("fingerprint", sessionFingerprint)
|
|
.toString();
|
|
}
|
|
}
|